Skip to content

Commands

Every command works two ways: as a text message with the prefix, ! by default (change it with COMMAND_PREFIX), and as a slash command (/play, /next, /playlist save, …). The tables below show the prefix form. /play takes one query option: a link or search text. Slash commands need the bot invited with the applications.commands scope (see Installation); they are published at startup, and Discord can take up to an hour to show them in every server (SLASH_SYNC_GUILD makes it instant on one server). /crossfade offers on and off, and /theme suggests the presets. Commands only work in a server, not in direct messages. On success the bot usually just adds a reaction to your message (a private ✅ for slash commands); slash command errors are only visible to you. Only errors, !list, !reset, usage help and the playlist prompt are text replies.

CommandDescription
!play <link or search text>Join your voice channel and queue a YouTube video or playlist, a SoundCloud or Bandcamp track or set, a Spotify, Deezer or Apple Music playlist, album or track, a YouTube live, a Twitch channel or an internet radio, or the best YouTube match for the text.
!listShow the current queue.
!remove <position>Remove a queued track by its position in !list (1 = next). Autocompletes the queue. Anyone may remove a track they queued themselves.
!move <from> <to>Move a queued track to another position. Autocompletes the queue.
!previousGo back to the previous track, or restart the current one after 5 s of play.
!clearEmpty the upcoming queue; the current track keeps playing.
!nowplaying (!np)Show the playing track as an embed: requester, source, progress bar with elapsed/total, loop, autoplay and volume, and the clip page link.
!history [count]The last tracks played in this session (default 10, max 25), newest first.
!nextSkip to the next track.
!voteskip (!vs), !voteskip threshold <1-100>Vote to skip the current track, open to everyone in the bot’s voice channel (more than 50% of the listeners by default). DJs and the requester skip at once. The threshold is set by DJs, see VOTESKIP_PERCENT.
!pause / !resumePause or resume playback.
!seek <pos>Jump to a position in the track, in seconds or mm:ss, as the clip page shows it.
!crossfade on|offEnable or disable crossfade for this session (off by default).
!loop [off|track|queue]Repeat the current track or the whole queue; with no argument, cycle through the modes (off by default).
!shuffleShuffle the upcoming queue once; the current track keeps playing.
!volume [0-150]Show the server’s volume, or set it in percent (100 is the normal level). Saved across restarts.
!autoplay [on|off]Keep playing related tracks when the queue runs out, or show the current setting (off by default, see AUTOPLAY).
!limits [queue|user|minutes|cooldown] [number|default]Show the queue limits, or change one (Manage Server): queue size, tracks per member, track length, /play cooldown.
!stay [on|off]24/7 mode: the bot never leaves its voice channel (no idle disconnect) and rejoins it after a restart; with no argument, shows the setting. Setting it needs the DJ role or Manage Server. See STAY_247.
!filter [preset]Show or set the session’s audio filter: off, bassboost, nightcore, vaporwave, 8d, karaoke, soft, or eq <low> <mid> <high> (-12 to 12 dB). The track goes on from where it is.
!playlist save|add|load|show|delete|export <name>, !playlist import <name> <link>, !playlist listSaved playlists for the server: links and titles kept across restarts, downloaded again when loaded. Import from a playlist link or a file, export as a file.
!stopStop, clear the queue, delete the downloaded files and leave voice.
!resetForce a clean voice reconnect.
!theme [preset|reset|edit]Show or set the clip page’s default theme for the server. edit DMs you a private editor link. Needs the Manage Server permission.
!weblinkDM you the clip page’s control link and its view-only link. DJs only when control is limited.
!lastfm link|unlink|statusLink, unlink or check your own Last.fm account for scrobbling. Only when Last.fm is configured, see Last.fm.
!djrole [role|off]Show, set or remove the DJ role. Needs the Manage Server permission.
!language [code|reset]Show or set the language of the bot and the clip page for the server (en, fr, es, de). Needs the Manage Server permission.
!help [command]List the commands, or show one, in the server’s language.

You must be in a voice channel. The bot joins it, posts the clip page link and a status message, and downloads the track.

  • A YouTube video link queues that track.
  • A YouTube playlist link queues up to MAX_PLAYLIST_SIZE tracks. They download one at a time while the earlier ones play. A single message shows the progress and is edited at the end.
  • A radio or mix link (a video inside a playlist) makes the bot ask, with buttons, whether to play the single track or the whole list. If nobody answers in time it plays the single track.
  • Plain text (anything that is not a link, e.g. !play daft punk one more time, up to 200 characters) searches YouTube and queues the best match, using the same scoring as Spotify tracks. If nothing scores high enough the bot replies that no match was found.
  • A Spotify link (/playlist/, /album/ or /track/) is matched to YouTube videos. See Spotify.
  • A SoundCloud or Bandcamp link (track, set or album) is downloaded from the platform; a Deezer or Apple Music link is matched to YouTube like Spotify. See More sources.
  • A YouTube live, a Twitch channel or an internet radio is played as a stream, never downloaded. See Live streams.

!play and the clip page’s add box accept only YouTube, SoundCloud, Bandcamp, Twitch, Spotify, Deezer and Apple Music hosts, plus internet radio links (see Live streams). Links are rebuilt in canonical form before use (a YouTube video inside a playlist keeps both ids, for the one-track-or-list prompt); a link from any other host is refused with a “link not accepted” message. Without an argument, the bot answers with a usage message.

Shows the queue. If it is empty the bot says so.

Skips the current track. Going back to the previous track is only available on the clip page.

Pause and resume playback. The clip video pauses with it.

Jumps to a position in seconds (90) or as mm:ss (1:30). The position is relative to the start of the track as the clip page shows it: leading silence trimmed by automix is not counted. An invalid value gives an error message.

Turns crossfade on or off for the current session. When on, tracks fade out for 6 seconds and the next track fades in over the end of the previous one. It only overlaps when both tracks are long enough (at least 15 seconds of music each); otherwise tracks follow each other as usual. Off by default.

Sets the loop mode for the session, or cycles off, track, queue when called without an argument. In track mode the current track replays each time it ends (skipping still moves on). In queue mode each finished or skipped track goes back to the end of the queue, so the list repeats. Each pass counts as one play in the listening stats. It works with crossfade. Off by default.

Shuffles the upcoming queue once. The current track keeps playing and the order is not kept afterwards. It needs at least two queued tracks.

!remove <position>, !move <from> <to>, !previous, !clear

Section titled “!remove <position>, !move <from> <to>, !previous, !clear”

Queue management that used to exist only on the clip page. Positions are the 1-based numbers !list shows (1 is the next track); a position outside the queue gives an “Invalid position” error. As slash commands, /remove and /move suggest the queued tracks (position and title). !previous restarts the current track after 5 s of play (or with no history) and otherwise goes back to the last played one. !clear empties the upcoming queue and keeps the current track playing.

An embed with the track title (linked), who requested it, the source (YouTube, SoundCloud, Bandcamp), the thumbnail, a progress bar with elapsed and total time (as the clip page shows them), the loop, autoplay and volume state, and the clip page link. The link follows the usual rules: the control link when control is open to everyone, otherwise the view-only one.

The last tracks played in the session, newest first, with duration and requester. count defaults to 10 and is capped at 25; the list is cut to fit Discord’s message limit. It is cleared by !stop.

Without an argument, shows the server’s volume. With a number from 0 to 150 (a trailing % is fine), sets it. 100 is the normal level (tracks are normalised to -14 LUFS); 0 is silent and 150 is about 3.5 dB louder, with a soft limiter so loud peaks are squeezed instead of clipping. The change applies to the playing track at once, without restarting it, and glides over a tenth of a second to avoid clicks. The volume belongs to the server, is shared with the clip page and is saved in DATA_DIR/volume.json.

For servers with a DJ role: members who cannot use !next can ask to skip the track instead (the refusal message suggests it). !voteskip (alias !vs, or /voteskip) records your vote for the current track; you must be in the bot’s voice channel. Once more than the threshold share of the listeners have voted (50% by default: 3 of 5, 2 of 3, everyone when there are 2), the track is skipped. DJs and the member who queued the track skip at once, as with !next. Who counts: the humans in the channel who are not deafened (a deafened member does not hear the track, so does not count in the total and cannot vote). Votes are counted again whenever someone joins, leaves or deafens, so members who left no longer count, and the votes start over with each new track. The bot posts one message with the count (“🗳️ Vote to skip: 2/3 votes”), edits it as votes change and finishes it with “Skipped by vote”. The status message shows the count while votes are active, and the clip page shows it in the header (it cannot vote: it has no identity). !voteskip threshold <1-100> sets the server’s share (DJ role or Manage Server; without an argument it shows it) and is saved in DATA_DIR/voteskip.json; VOTESKIP_PERCENT sets the default.

Keeps the music going when the queue runs out. With autoplay on, the bot picks a track related to the last one (from YouTube’s mix for that video), downloads it while the current track is still playing so there is no gap, and plays it. Tracks played in the last 50, live streams, anything over 10 minutes and titles that look like podcasts, interviews or compilations are skipped. If nothing suitable is found or no pick is ready in time, the bot lingers in voice as usual, and it never autoplays into an empty channel. A loop mode, when active, takes precedence over autoplay, and a track you queue always plays before an autoplay pick. Without an argument, shows the current setting. Off by default; AUTOPLAY=1 changes the default. The status message shows ”📻 Autoplay on” and marks autoplay tracks.

24/7 mode. With it on, the bot never leaves its voice channel on its own: the idle linger (IDLE_DISCONNECT_SECONDS, and the 30 seconds after the last human leaves) is skipped, and !stop clears the queue without leaving. It stays silent unless something plays; autoplay, if on, keeps going as usual. If the bot is not in voice, !stay on joins your channel. The setting and the channel are saved in DATA_DIR/stay.json, and after a restart the bot rejoins that channel (nothing starts playing; a deleted channel or a missing Connect permission is skipped). If Discord drops the bot, or someone disconnects it, it rejoins once; dropped again within two minutes, or if the channel is gone, 24/7 turns itself off and the status message says so. Without an argument, shows the setting. Setting it needs the DJ role or Manage Server. Off by default; STAY_247=1 changes the default for servers that never chose. The status message shows ”🌙 24/7” and the clip page a small “24/7” badge in its header.

Without an argument, shows the session’s audio filter. With a preset, sets it for everyone in the channel:

PresetEffect
offNo filter (the default).
bassboostStronger bass, with a limiter so it does not clip.
nightcore1.25× faster, pitch up.
vaporwave0.8× slower, pitch down, slightly darker.
8dThe sound slowly circles from one ear to the other.
karaokeRemoves what is mixed in the centre above 150 Hz, usually the lead vocal; the bass stays. It only works on stereo tracks and is never perfect.
softA gentle low-pass filter, for background listening.
eqA 3-band equaliser: !filter eq <low> <mid> <high>, each from -12 to 12 dB (/filter has one option per band; a band left out keeps its value).

The playing track restarts at the same position with the new filter (a short fade softens the switch) and stays paused if it was; out of voice, the filter applies to the next track. The filter belongs to the session (it survives !reset, not a session expiry) and the status message shows it when it is not off. Setting it needs the DJ role when the server has one; showing it does not.

With nightcore and vaporwave the track really plays faster or slower: the clip page runs the video, the progress bar and the lyrics at the same speed, and positions (!seek, the progress bar) stay in the track’s own time. A 3-minute track takes 2:24 in nightcore. The listening stats count the time actually listened.

Saved playlists belong to the server and survive restarts. Only the YouTube link, title and duration of each track are stored, never the media: loading a playlist downloads its tracks again. Names are case-insensitive, up to 32 characters (letters, digits, spaces and . ' & ! + ( ) -). A server holds up to 50 playlists of up to 200 tracks each.

  • !playlist save <name> saves the current track and the queue. Saving over an existing name replaces it, but only its creator or a member with Manage Server can do that.

  • !playlist add <name> appends the current track to an existing playlist.

  • !playlist load <name> joins your voice channel and queues every track, loading them one at a time like a YouTube playlist.

  • !playlist list shows the server’s playlists, and !playlist show <name> the tracks of one.

  • !playlist delete <name> deletes a playlist. Only its creator or a member with Manage Server can.

  • !playlist export <name> [json|m3u|txt] sends the playlist as a file (JSON by default). !playlist export queue exports the current queue. The JSON file is versioned (schema djsnake.playlist, version 1, name, created_by, entries of url, title, duration), M3U has #EXTINF lines, TXT has one link per line.

  • !playlist import <name> <link> creates or replaces a playlist from a YouTube playlist, a SoundCloud set, a Bandcamp album, or a Spotify, Deezer or Apple Music playlist or album. Replacing follows the same rule as save. Spotify, Deezer and Apple Music tracks are matched on YouTube at import time (with a progress message), so the saved playlist holds ordinary links and loading it later needs no matching; tracks with no match are counted as skipped. At most 200 tracks are kept (the message says so when the list was longer).

  • !playlist import <name> with a JSON, M3U or TXT file attached (a slash command has a file option) imports that file: up to 256 KB, strict schema for JSON, duplicates dropped, and only YouTube, SoundCloud and Bandcamp track links accepted (anything else is skipped and counted, never fetched). A file made by export imports back to the same entries.

In a ! command, put a name with spaces in quotes (!playlist export "Road Trip" m3u). A saved playlist cannot be named queue.

The clip page can also save the queue and load a playlist.

Stops playback, empties the queue, deletes downloaded files and leaves the voice channel at once. The clip page link stays valid until the session expires.

Forces a clean voice reconnect. Use it when the bot is connected but silent, or after a Discord voice error such as close code 4006.

Needs the Manage Server permission.

FormEffect
!themeShows the current theme, whether it is the server’s choice or the fallback, and the available presets.
!theme <preset>Sets the server’s default theme: arcade, minimal, night, vinyl, club, terminal, space, cobalt or custom.
!theme resetGoes back to the WEB_THEME default and drops the custom colors, name and logo.
!theme editSends you a private link to the theme editor by direct message. It is valid for 30 minutes.

See Themes for details. !theme edit needs your DMs open to server members; otherwise the bot tells you so.

!limits (/limits) shows the server’s limits in a small embed. !limits <setting> <number> changes one and !limits <setting> default goes back to the value from .env. Changing needs the Manage Server permission; showing is open to everyone. The settings are saved per server in DATA_DIR/limits.json.

Setting.env defaultMeaning
queueMAX_QUEUE_SIZE (200)Tracks waiting in the queue (at least 1).
userMAX_TRACKS_PER_USER (0)Tracks one member may have waiting; 0 is unlimited.
minutesMAX_TRACK_MINUTES (0)Longest single track; 0 is unlimited.
cooldownPLAY_COOLDOWN_SECONDS (0)Seconds between one member’s /play calls; 0 is off.

The limits apply wherever tracks enter the queue: /play (links, playlists, Spotify, Deezer, Apple Music and text search), the clip page’s add, /playlist load and the page’s playlist load. Autoplay only obeys the queue size. The clip page has no identity, so everything added from it counts as one member (web) for the per-member limit; it is checked against the queue size and the track length like anyone else, and it has no cooldown.

DJs (the DJ role) and members with Manage Server skip the per-member limit and the cooldown, never the queue size or the track length. Without a DJ role only Manage Server members skip them.

The track length is read from the link’s metadata before downloading when the source gives it (playlist entries, Spotify, Deezer and Apple Music tracks), otherwise after the download, and the file is then deleted. A playlist queues as many tracks as the limits allow, and one message at the end says how many were skipped and why, for example “12/30 tracks loaded (18 skipped: queue limit (12))”. The bot only downloads whole files, so there are no live streams to exempt.

Needs the Manage Server permission. The setting is saved per server in DATA_DIR/permissions.json.

FormEffect
!djroleShows the current DJ role, or that everyone controls the music.
!djrole <role>Makes a role (name, ID or mention) the DJ role.
!djrole offRemoves it: everyone controls the music again.

With a DJ role set:

  • !next, !pause, !resume, !seek, !crossfade, !loop, !shuffle, !previous, !move, !clear, !volume, !autoplay, !stay, !filter, !stop and !reset need the DJ role or the Manage Server permission. The member who queued the playing track may still skip it with !next, !remove is open to whoever queued the track being removed, and everyone can use !voteskip. !play, !list, !nowplaying and !history stay open to everyone.
  • !play and !list stay open to everyone: adding a track never interrupts what plays, and DJs can still skip or remove it.
  • The status message shows only the clip page’s view-only link, and the control link posted before stops working (every change of the role gives a live session a new one and retires the server’s !theme edit links). See Who controls the music.

Without a DJ role every command works for everyone, as in earlier versions.

Sends you, by direct message, the clip page’s control link and its view-only link, opening a session (without joining voice) if the server has none. When control is limited (a DJ role is set, or WEB_CONTROL=dj), only DJs and members with Manage Server get it; with WEB_CONTROL=dj and no DJ role, only Manage Server. Your DMs must be open to server members.

Needs the Manage Server permission. Aliases: !lang, !langue.

FormEffect
!languageShows the current language, whether it is the server’s choice or the fallback, and the available languages.
!language <code>Sets the server’s language: en (English), fr (French), es (Spanish) or de (German).
!language resetGoes back to the BOT_LANGUAGE default.

The language applies to command replies, errors, !help, the status message and the clip page’s default language (each viewer can still pick another one in the page’s settings menu). Command names and their arguments stay the same in every language.

If you leave out a required argument the bot says so. Commands that need music playing answer “No music is currently playing.” when there is none, and !theme, !djrole, !language or a !limits change without the permission is refused. A command reserved for DJs answers, for example, “Only DJs can use !stop: you need the DJ role or the Manage Server permission.” Error messages follow the server’s language.