Skip to content

Plugin Integrations

Ryanlink integrates with all major Lavalink plugins. Plugin checks use the exact names reported by /v4/info.

PluginRegistered NameArtifact
LavaSrclavasrc-plugincom.github.topi314.lavasrc:lavasrc-plugin
LavaSearchlavasearch-plugincom.github.topi314.lavasearch:lavasearch-plugin
LavaLyricslavalyrics-plugincom.github.topi314.lavalyrics:lavalyrics-plugin
SponsorBlocksponsorblock-plugincom.github.topi314.sponsorblock:sponsorblock-plugin
LavaDSPXLavaDSPX-Plugincom.github.Devoxin:LavaDSPX-Plugin (jitpack)
DuncteBot Skybotskybot-lavalink-plugincom.dunctebot:skybot-lavalink-plugin
DuncteBot TTStts-plugincom.dunctebot:tts-plugin
java-timed-lyricsjava-lyrics-pluginme.duncte123:java-lyrics-plugin
lyrics.ktlyricsdev.schlaubi.lyrics:lavalink
lava-xm-pluginlava-xm-pluginnet.esmbot:lava-xm-plugin

SponsorBlock sponsorblock-plugin

Section titled “SponsorBlock ”

Automatically skip sponsor segments, intros, outros, and more in YouTube videos.

// Set active segments (call before or during playback)
await player.setSponsorBlock(['sponsor', 'selfpromo', 'interaction', 'intro', 'outro', 'preview', 'music_offtopic', 'filler']);
// Get currently active segments
const categories = await player.getSponsorBlock();
// Disable all segment skipping
await player.deleteSponsorBlock();

Valid segment categories: sponsor, selfpromo, interaction, intro, outro, preview, music_offtopic, filler.

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.

// Get lyrics for a specific track
const lyrics = await player.node.lyrics.get(track);
const lyrics2 = await player.node.lyrics.get(track, true); // skipTrackSource
// Get lyrics for the currently playing track
const current = await player.node.lyrics.getCurrent(player.guildId);
// Subscribe to real-time lyrics lines during playback
await player.node.lyrics.subscribe(player.guildId);
await player.node.lyrics.subscribe(player.guildId, true); // skipTrackSource
await player.node.lyrics.unsubscribe(player.guildId);
// Convenience wrappers on the player
const lyrics3 = await player.getLyrics(track);
const current2 = await player.getCurrentLyrics();
player.subscribeLyrics();
player.unsubscribeLyrics();
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 player
const result = await player.node.timedLyrics.getCurrent(player.guildId);
// Get by YouTube video ID
const result2 = await player.node.timedLyrics.getByVideoId('dQw4w9WgXcQ');
// Search for lyrics
const 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[]

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 queue
await node.setNextTrackGapLess(player);
// Or specify a track explicitly
await node.setNextTrackGapLess(player, nextTrack);
// Remove the preloaded track
await node.removeNextTrackGapLess(player);

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 layers
const layers = await node.listMixerLayers(player);
// Update volume of a layer
await node.updateMixerLayerVolume(player, layer.id, 50);
// Remove a layer
await node.removeMixerLayer(player, layer.id);
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}`);
}
});

Section titled “NodeLink Filters ”

NodeLink-exclusive audio filters via node.specificFilters:

const node = player.node as NodeLinkNode;
// Echo
await node.specificFilters.echo(player, { delay: 0.5, feedback: 0.3, mix: 0.5 });
await node.specificFilters.echo(player, {}, true); // disable
// Chorus
await node.specificFilters.chorus(player, { rate: 1.0, depth: 0.5, delay: 0.02, mix: 0.5, feedback: 0.3 });
// Compressor
await node.specificFilters.compressor(player, { threshold: -20, ratio: 4, attack: 5, release: 50, gain: 0 });
// High-pass
await node.specificFilters.highPass(player, { smoothing: 20 });
// Phaser
await node.specificFilters.phaser(player, { stages: 4, rate: 0.5, depth: 0.5, feedback: 0.3, mix: 0.5, minFrequency: 300, maxFrequency: 3000 });
// Spatial
await node.specificFilters.spatial(player, { depth: 0.5, rate: 0.5 });
// Reset all NodeLink filters
await node.specificFilters.resetNodeLinkFilters(player);

Ensure your Lavalink node has the corresponding plugins installed and configured in application.yml.