Plugin Integrations
Ryanlink integrates with all major Lavalink plugins. Plugin checks use the exact names reported by /v4/info.
Plugin Name Reference
Section titled “Plugin Name Reference”| Plugin | Registered Name | Artifact |
|---|---|---|
| LavaSrc | lavasrc-plugin | com.github.topi314.lavasrc:lavasrc-plugin |
| LavaSearch | lavasearch-plugin | com.github.topi314.lavasearch:lavasearch-plugin |
| LavaLyrics | lavalyrics-plugin | com.github.topi314.lavalyrics:lavalyrics-plugin |
| SponsorBlock | sponsorblock-plugin | com.github.topi314.sponsorblock:sponsorblock-plugin |
| LavaDSPX | LavaDSPX-Plugin | com.github.Devoxin:LavaDSPX-Plugin (jitpack) |
| DuncteBot Skybot | skybot-lavalink-plugin | com.dunctebot:skybot-lavalink-plugin |
| DuncteBot TTS | tts-plugin | com.dunctebot:tts-plugin |
| java-timed-lyrics | java-lyrics-plugin | me.duncte123:java-lyrics-plugin |
| lyrics.kt | lyrics | dev.schlaubi.lyrics:lavalink |
| lava-xm-plugin | lava-xm-plugin | net.esmbot:lava-xm-plugin |
SponsorBlock sponsorblock-plugin
Section titled “SponsorBlock ”Automatically skip sponsor segments, intros, outros, and more in YouTube videos.
Methods
Section titled “Methods”// Set active segments (call before or during playback)await player.setSponsorBlock(['sponsor', 'selfpromo', 'interaction', 'intro', 'outro', 'preview', 'music_offtopic', 'filler']);
// Get currently active segmentsconst categories = await player.getSponsorBlock();
// Disable all segment skippingawait player.deleteSponsorBlock();Valid segment categories: sponsor, selfpromo, interaction, intro, outro, preview, music_offtopic, filler.
Events
Section titled “Events”manager.on('sponsorBlockSegmentsLoaded', (player, track, payload) => { console.log(`Segments loaded: ${payload.segments.map(s => s.category).join(', ')}`);});
manager.on('sponsorBlockSegmentSkipped', (player, track, payload) => { console.log(`Skipped: ${payload.segment.category} (${payload.segment.start}–${payload.segment.end}ms)`);});
manager.on('sponsorBlockChaptersLoaded', (player, track, payload) => { console.log(`${payload.chapters.length} chapters loaded`);});
manager.on('sponsorBlockChapterStarted', (player, track, payload) => { console.log(`Chapter: ${payload.chapter.name}`);});LavaLyrics lavalyrics-plugin
Section titled “LavaLyrics ”Lyrics API hub — aggregates from LavaSrc, java-timed-lyrics, and other sources.
Methods
Section titled “Methods”// Get lyrics for a specific trackconst lyrics = await player.node.lyrics.get(track);const lyrics2 = await player.node.lyrics.get(track, true); // skipTrackSource
// Get lyrics for the currently playing trackconst current = await player.node.lyrics.getCurrent(player.guildId);
// Subscribe to real-time lyrics lines during playbackawait player.node.lyrics.subscribe(player.guildId);await player.node.lyrics.subscribe(player.guildId, true); // skipTrackSourceawait player.node.lyrics.unsubscribe(player.guildId);
// Convenience wrappers on the playerconst lyrics3 = await player.getLyrics(track);const current2 = await player.getCurrentLyrics();player.subscribeLyrics();player.unsubscribeLyrics();Events
Section titled “Events”manager.on('lyricsFound', (player, track, payload) => { console.log(`Lyrics found via ${payload.lyrics?.sourceName}`);});
manager.on('lyricsLine', (player, track, payload) => { console.log(`[${payload.lineIndex}] ${payload.line.line}`);});
manager.on('lyricsNotFound', (player, track, payload) => { console.log('No lyrics available');});java-timed-lyrics / lyrics.kt java-lyrics-plugin / lyrics
Section titled “java-timed-lyrics / lyrics.kt ”These plugins expose a different API from LavaLyrics. Use node.timedLyrics:
// Get lyrics for the current playerconst result = await player.node.timedLyrics.getCurrent(player.guildId);
// Get by YouTube video IDconst result2 = await player.node.timedLyrics.getByVideoId('dQw4w9WgXcQ');
// Search for lyricsconst results = await player.node.timedLyrics.search('never gonna give you up');const genius = await player.node.timedLyrics.search('never gonna give you up', 'genius');LavaSearch lavasearch-plugin
Section titled “LavaSearch ”Advanced search returning albums, artists, playlists, and text results.
const results = await player.audioSearch({ query: 'daft punk', source: 'spsearch', types: ['track', 'album', 'artist', 'playlist'],}, requestUser);
console.log(results.tracks); // Track[]console.log(results.albums); // Album[]console.log(results.artists); // Artist[]console.log(results.playlists); // Playlist[]console.log(results.texts); // TextResult[]NodeLink Gapless Playback NodeLink only
Section titled “NodeLink Gapless Playback ”Pre-load the next track for zero-silence transitions.
const node = player.node as NodeLinkNode;
// Pre-load next track from queueawait node.setNextTrackGapLess(player);
// Or specify a track explicitlyawait node.setNextTrackGapLess(player, nextTrack);
// Remove the preloaded trackawait node.removeNextTrackGapLess(player);NodeLink Audio Mixer NodeLink only
Section titled “NodeLink Audio Mixer ”Overlay TTS, SFX, or background music on top of the main track.
const node = player.node as NodeLinkNode;
// Add a mix layer (volume 0–100)const layer = await node.addMixerLayer(player, ttsTrack, 90);console.log(layer.id); // mixId
// List active layersconst layers = await node.listMixerLayers(player);
// Update volume of a layerawait node.updateMixerLayerVolume(player, layer.id, 50);
// Remove a layerawait node.removeMixerLayer(player, layer.id);Mixer Events
Section titled “Mixer Events”manager.nodeManager.on('nodeRaw', (node, payload) => { if (payload.op === 'event' && payload.type === 'MixStartedEvent') { console.log(`Mix started: ${payload.mixId}`); } if (payload.op === 'event' && payload.type === 'MixEndedEvent') { console.log(`Mix ended: ${payload.mixId} — reason: ${payload.reason}`); }});NodeLink Filters NodeLink only
Section titled “NodeLink Filters ”NodeLink-exclusive audio filters via node.specificFilters:
const node = player.node as NodeLinkNode;
// Echoawait node.specificFilters.echo(player, { delay: 0.5, feedback: 0.3, mix: 0.5 });await node.specificFilters.echo(player, {}, true); // disable
// Chorusawait node.specificFilters.chorus(player, { rate: 1.0, depth: 0.5, delay: 0.02, mix: 0.5, feedback: 0.3 });
// Compressorawait node.specificFilters.compressor(player, { threshold: -20, ratio: 4, attack: 5, release: 50, gain: 0 });
// High-passawait node.specificFilters.highPass(player, { smoothing: 20 });
// Phaserawait node.specificFilters.phaser(player, { stages: 4, rate: 0.5, depth: 0.5, feedback: 0.3, mix: 0.5, minFrequency: 300, maxFrequency: 3000 });
// Spatialawait node.specificFilters.spatial(player, { depth: 0.5, rate: 0.5 });
// Reset all NodeLink filtersawait node.specificFilters.resetNodeLinkFilters(player);Ensure your Lavalink node has the corresponding plugins installed and configured in
application.yml.