discord-player-play-dl/README.md
2022-09-13 11:40:21 +05:00

6.7 KiB

Discord Player Play-dl

Complete framework to facilitate music commands using discord.js.

wakatime CodeFactor

Installation

Install discord-player-play-dl

$ npm install git+https://github.com/JonnyBro/discord-player-play-dl

Install @discordjs/opus

$ npm install --save @discordjs/opus

Install FFmpeg or Avconv

Features

  • Simple & easy to use 🤘
  • Beginner friendly 😱
  • Audio filters 🎸
  • Lightweight ☁️
  • Custom extractors support 🌌
  • Multiple sources support ✌
  • Play in multiple servers at the same time 🚗
  • Does not inject anything to discord.js or your discord.js client 💉
  • Allows you to have full control over what is going to be streamed 👑

Documentation

Getting Started

First of all, you will need to register slash commands:

const { REST } = require("@discordjs/rest");
const { Routes, ApplicationCommandOptionType } = require("discord.js");

const commands = [
  {
    name: "play",
    description: "Plays a song!",
    options: [
        {
            name: "query",
            type: ApplicationCommandOptionType.String,
            description: "The song you want to play",
            required: true
        }
    ]
  }
];

const rest = new REST({ version: "10" }).setToken("BOT_TOKEN");

(async () => {
  try {
    console.log("Started refreshing application [/] commands.");

    await rest.put(Routes.applicationGuildCommands(CLIENT_ID, GUILD_ID), { body: commands });

    console.log("Successfully reloaded application [/] commands.");
  } catch(error) {
    console.error(error);
  }
})();

Now you can implement your bot's logic:

const { Client } = require("discord.js");
const client = new Discord.Client({
    intents: [
        "Guilds",
        "GuildVoiceStates"
    ]
});
const { Player } = require("discord-player");

// Create a new Player (you don't need any API Key)
const player = new Player(client);

// add the trackStart event so when a song will be played this message will be sent
player.on("trackStart", (queue, track) => queue.metadata.channel.send(`🎶 | Now playing **${track.title}**!`))

client.once("ready", () => {
    console.log("I'm ready !");
});

client.on("interactionCreate", async (interaction) => {
    if (!interaction.isChatInputCommand()) return;

    // /play track:Despacito
    // will play "Despacito" in the voice channel
    if (interaction.commandName === "play") {
        if (!interaction.member.voice.channelId) return await interaction.reply({ content: "You are not in a voice channel!", ephemeral: true });
        if (interaction.guild.members.me.voice.channelId && interaction.member.voice.channelId !== interaction.guild.members.me.voice.channelId) return await interaction.reply({ content: "You are not in my voice channel!", ephemeral: true });
        const query = interaction.options.getString("query");
        const queue = player.createQueue(interaction.guild, {
            metadata: {
                channel: interaction.channel
            }
        });

        // verify vc connection
        try {
            if (!queue.connection) await queue.connect(interaction.member.voice.channel);
        } catch {
            queue.destroy();
            return await interaction.reply({ content: "Could not join your voice channel!", ephemeral: true });
        }

        await interaction.deferReply();
        const track = await player.search(query, {
            requestedBy: interaction.user
        }).then(x => x.tracks[0]);
        if (!track) return await interaction.followUp({ content: `❌ | Track **${query}** not found!` });

        queue.play(track);

        return await interaction.followUp({ content: `⏱️ | Loading track **${track.title}**!` });
    }
});

client.login("BOT_TOKEN");

Supported websites

By default, discord-player supports YouTube, Spotify and SoundCloud streams only.

Optional dependencies

Discord Player Play-dl provides an Extractor API that enables you to use your custom stream extractor with it. Some packages have been made by the community to add new features using this API.

@discord-player/extractor (optional)

Optional package that adds support for vimeo, reverbnation, facebook, attachment links and lyrics. You just need to install it using npm i --save @discord-player/extractor (discord-player will automatically detect and use it).

@discord-player/downloader (optional)

@discord-player/downloader is an optional package that brings support for +700 websites. The documentation is available here.

Examples of bots made with Discord Player Play-dl

These bots are made by the community, they can help you build your own!

Advanced

Smooth Volume

Discord Player Play-dl will by default try to implement this. If smooth volume does not work, you need to add this line at the top of your main file:

// CJS
require("discord-player/smoothVolume");

// ESM
import "discord-player/smoothVolume"

⚠️ Make sure that line is situated at the TOP of your main file.

Custom stream Engine

Discord Player Play-dl by default uses play-dl for youtube and some other extractors for other sources. If you need to modify this behavior without touching extractors, you need to use onBeforeCreateStream functionality of Discord player Play-dl.

<Queue>.onBeforeCreateStream is called before actually downloading the stream. It is a different concept from extractors, where you are just downloading streams. source here will be a video source. Streams from onBeforeCreateStream are then piped to FFmpeg and finally sent to Discord voice servers.