SetMusic is a modular, ultra-featured music bot library for Discord. It gives you a rich API for music playback and control—including basic controls, volume and loop settings, advanced audio effects and filters, queue management, skip voting, playlist handling, search functionality, and more. This library does not enforce any command or embed structure, so you can integrate its functions into your own Discord bot framework as needed.
- Node.js v18.20.7 or higher
- npm v9.x or higher
- A valid Discord bot token with the necessary permissions
All functions expect a Discord Message or VoiceChannel as input (usually your command message).
To begin, require the library (assuming it’s installed via npm as “setmusic”):
const Music = require("setmusic");
const { Client, GatewayIntentBits } = require("discord.js");
const Music = require("setmusic");
const client = new Client({
intents: [
GatewayIntentBits.Guilds,
GatewayIntentBits.GuildVoiceStates,
GatewayIntentBits.GuildMessages,
GatewayIntentBits.MessageContent
]
});
// Create an instance of MusicService with a basic event handler:
client.music = new Music(client, {
onEvent: (event, ...args) => {
// Log events to the console for debugging:
console.log(`Event: ${event}`, args);
}
});
client.once("ready", () => {
console.log(`Logged in as ${client.user.tag}`);
});
client.login("YOUR_DISCORD_BOT_TOKEN");
Play a song, stop playback, skip, pause, resume, and toggle pause.
await client.music.play(message, "https://youtu.be/dQw4w9WgXcQ");
// or use a search query:
await client.music.play(message, "Never Gonna Give You Up");
await client.music.stop(message);
await client.music.skip(message);
await client.music.pause(message);
await client.music.resume(message);
// Alternatively, toggle pause/resume:
await client.music.togglePause(message);
await client.music.seek(message, 60); // Jump to 60 seconds into current track
await client.music.jump(message, 3); // Jump to the 3rd song in the queue (1-indexed)
await client.music.replay(message); // Restart the current song (seek to 0)
Set volume, increase/decrease volume, and manage loop modes.
await client.music.setVolume(message, 75); // Set volume to 75%
await client.music.increaseVolume(message, 10); // Increase by 10 units
await client.music.decreaseVolume(message, 10); // Decrease by 10 units
await client.music.setLoop(message, "off"); // No looping
await client.music.setLoop(message, "song"); // Repeat the current song
await client.music.setLoop(message, "queue"); // Repeat the entire queue
await client.music.toggleAutoplay(message);
Retrieve detailed information about the queue and display a progress bar.
const queueInfo = client.music.getQueueInfo(message);
console.log(queueInfo);
// Expected output: { nowPlaying, queueLength, totalDuration, volume }
const queueJSON = client.music.getQueueJSON(message);
console.log(queueJSON);
const progressBar = client.music.getProgressBar(message);
message.channel.send(`Now Playing Progress:\n${progressBar}`);
Apply single or multiple filters, adjust equalizer settings, and add advanced audio effects.
await client.music.setFilter(message, "bassboost");
await client.music.setFilters(message, ["filter1", "filter2", "filter3"]);
await client.music.removeFilter(message, "bassboost");
await client.music.clearFilter(message);
await client.music.setEqualizer(message, "bass");
// Options include "bass", "treble", and "normal"
await client.music.setPlaybackSpeed(message, 1.5); // 1.5x speed; allowed range is 0.5x to 2x
await client.music.setTransition(message, 3); // 3-second fade-in/out
await client.music.setCrossfade(message, 5); // 5-second crossfade effect
await client.music.normalizeAudio(message);
Enable users to collaboratively vote to skip the current song.
const voteResult = await client.music.voteSkip(message, message.author.id);
console.log(`Vote Skip: ${voteResult.votes} votes out of ${voteResult.members} members`);
Manage your playlist history, save the current queue, or load a saved queue.
const history = client.music.getPlayHistory();
console.log("Play History:", history);
client.music.clearPlayHistory();
const saved = client.music.saveQueueToFile(message, "./queue.json");
if (saved) {
console.log("Queue saved successfully.");
}
const loadedQueue = client.music.loadQueueFromFile(message, "./queue.json");
if (loadedQueue) {
console.log("Queue loaded:", loadedQueue);
}
Search for songs using a query string.
const searchResults = await client.music.search("never gonna give you up");
console.log("Search Results:", searchResults);
Forcefully stop the queue and disconnect the bot from the voice channel.
await client.music.destroy(message);
Capture events to monitor and react to various music actions.
When initializing MusicService, pass an "onEvent" callback:
const musicService = new Music(client, {
onEvent: (event, ...args) => {
switch (event) {
case "playSong":
console.log(`Now playing: ${args[1].name}`);
break;
case "voteSkipUpdate":
console.log(`Skip Vote Update: ${args[1]} votes (${args[2]} members)`);
break;
case "customError":
console.error("Error encountered:", args[0]);
break;
default:
console.log(`Event ${event}:`, args);
}
}
});
Emitted events include: • playSong, addSong, addList, finish, empty, searchResult, searchCancel, disconnect, error • voteSkipUpdate, voteSkipSuccess, queueLoaded, customError
- Basic Playback: play, stop, skip, pause, resume, seek, jump, replay.
- Volume & Loop Controls: setVolume, increaseVolume, decreaseVolume, setLoop, toggleAutoplay.
- Queue Information: getQueueInfo, getQueueJSON, getProgressBar.
- Audio Effects & Filters: setFilter, setFilters, removeFilter, clearFilter, setEqualizer, setPlaybackSpeed, setTransition, setCrossfade, normalizeAudio.
- Skip Vote: voteSkip mechanism for collaborative skipping.
- Playlist Management: getPlayHistory, clearPlayHistory, saveQueueToFile, loadQueueFromFile.
- Search: search for songs using query strings.
- Destruction: destroy to stop playback and disconnect.
- Advanced Event Handling: custom events for all actions.
This project is licensed under the MIT License.