/Frixx

A simple but a beginner friendly module to play music on Discord, using Spotify as the main source.

Primary LanguageTypeScript

accessibility text

Build Status Codecov License

Frixx

Frixx, A simple but a beginner friendly module to play music on discord. Using Spotify and YouTube.

Prerequisites

  • discord.js - (latest)
  • @discordjs/opus
  • opusscript
  • ffmpeg-static

Installation

$ npm install frixx

Import

  • The import is for the latest EcmaScript/ES.

import { Player } from "frixx";
  • This is the default CommonJS import.

const { Player } = require("frixx");

Initialize

import {
  ApplicationCommandOptionType,
  ApplicationCommandPermissionType,
  ApplicationCommandType,
  Client,
  EmbedBuilder,
  GatewayIntentBits,
  Partials,
} from "discord.js";
import { Player } from "frixx";
const client = new Client({
  intents: [
    GatewayIntentBits.Guilds,
    GatewayIntentBits.GuildVoiceStates,
    GatewayIntentBits.GuildMembers,
  ],
  partials: [Partials.GuildMember, Partials.Channel, Partials.GuildMember],
});
const player = new Player(client);
const TOKEN = "YOUR BOT TOKEN";
client.login(TOKEN);

new Player(client)

The player as of now only supports YouTube and Spotify as the main source to play the music. The player requires a client (Mandatory). You have to instantiate a client.

Param Type Description
client Client (Mandatory)

player.toggleLoop(guild)

Toggles the loop mode.

Kind: instance method of Player

Param Description
guild The guild property - (Mandatory)

const loopCheck = player.loopEnabled;
await player.toggleLoop!(interaction.guild!);
interaction.reply({
  content: `The loop is now ${loopCheck === true ? "Enabled" : "Disabled"}`,
});

player.loopAdd(guild)

Deprecated

Turns the loop mode to on.

Kind: instance method of Player

Param Description
guild The guild property - (Mandatory)
// The function is deprecated. Use the toggle loop instead.
await player.loopAdd!(interaction.guild!);
interaction.reply({
  content: "The queue is now on a loop",
});

player.loopRemove(guild)

Deprecated

Turns the loop mode to off.

Kind: instance method of Player

Param Description
guild The guild property - (Mandatory)
// The function is deprecated. Use the toggle loop instead.
await player.loopRemove!(interaction.guild!);
interaction.reply({
  content: "The queue is now no longer on a loop",
});

player.pause(guild)

Pauses the current playing track

Kind: instance method of Player Throws:

  • Error
Param Description
guild The guild property - (Mandatory)
player?.pause!(interaction.guild!);
interaction.reply({
  content: "The music is now paused.",
});

player.seek(guild, secondsToSeek)

Seeks/Forwards the songs to xyz seconds.

Kind: instance method of Player

Param Description
guild The guild property - (Mandatory)
secondsToSeek Seconds to seek - (Mandatory)
await player.seek!(interaction.guild!, seconds!);
interaction.followUp({
  content: `Seeked the track for ${seconds} seconds`,
});

player.resume(guild)

Resumes the paused track.

Kind: instance method of Player Throws:

  • EvalError
Param Description
guild The guild property - (Mandatory)
player?.resume!(interaction.guild!);
interaction.reply({
  content: "The music is now resumed.",
});

player.volume(guild, volumePercentage)

Kind: instance method of Player Throws:

  • EvalError
Param Description
guild The guild property - (Mandatory)
volumePercentage The volume percentage. - (Mandatory)
const volume = interaction.options.getNumber("percentage"); // The volume needs to be a number.
await player?.volume!(interaction.guild!, volume!);

interaction.reply({
  content: `The volume is now **${volume}%**`,
});

player.clearQueue(guild)

Clears the queue. (Doesn't destroys the actual queue. Only clears all of the tracks from the track list.)

Kind: instance method of Player

Param Description
guild The guild property - (Mandatory)
await player?.clearQueue!(interaction.guild!);
interaction.reply({
  content: `The queue is now cleared.`,
});

player.leaveVoiceChannel(guild)

Leaves the current voice channel that the bot is connected to.

Kind: instance method of Player

Param Description
guild The guild property - (Mandatory)
const member = await interaction.guild?.members?.cache.get(interaction.user.id);
await player.leaveVoiceChannel(interaction?.guild!);
interaction.reply({
  content: `${member?.voice.channel} Left.`,
});

player.connect(guild, voiceChannelId)

Connects to the voice channel. That you're connected to..

Kind: instance method of Player

Param Description
guild The guild property - (Mandatory)
voiceChannelId The id of the voice channel. - (Mandatory)
const member = await interaction.guild?.members?.cache.get(interaction.user.id);
await player.connect!(interaction.guild!, member?.voice.channelId!);
interaction.reply({
  content: `Connected to ${member?.voice?.channel}`,
});

player.addRelatedTrack(guild, member)

Adds a similar track to the current one that is playing.

Kind: instance method of Player

Param Description
guild The guild property - (Mandatory)
member The GuildMember property - (Mandatory)
const relatedTrack = await player.addRelatedTrack!(
  interaction.guild!,
  interaction?.user!
);
interaction.reply({
  content: `Added **${relatedTrack.youtubeTitle}** to the queue.`,
});

player.getQueue(guild)

_Get the current queue. _

Kind: instance method of Player

Param Description
guild The guild property - (Mandatory)
const queue = await player.getQueue!(interaction?.guild!);
return interaction.reply({
  content: `There are total ${queue.tracks.length} tracks in the queue`,
});

player.skip(guild, type)

Skips the current playing track.

Kind: instance method of Player

Param Description
guild The guild property - (Mandatory)
type ChatInputCommandInteraction
await player.skip!(interaction.guild!, interaction);

player.playPrevious(guild, type)

Plays the last/previous track again.

Kind: instance method of Player

Param Description
guild The guild property - (Mandatory)
type Message or ChatInputCommandInteraction - (Mandatory)
await interaction.deferReply();
const previousSong = await player.playPrevious!(
  interaction.guild!,
  interaction
);

player.stop(guild, leave)

Stops the current playing track & will left the voice channel (Only if you specify the "leave value to true.")

Kind: instance method of Player

Param Description
guild The guild property - (Mandatory)
leave The boolean value of whether you want the bot to leave the voice channel or not.
await player.stop!(interaction.guild!, true);

interaction.reply({
  content: `Stop playing the track.`,
});

player.shuffle(guild)

Shuffles the current queue.

Kind: instance method of Player

Param Description
guild The guild property - (Mandatory)
const shuffledQueue = player?.shuffle!(interaction.guild!);
interaction.reply({
  content: "The queue is now shuffled.",
});

player.currentTrackInformation(guild)

Shows the current track information.

Kind: instance method of Player

Param Description
guild The guild property - (Mandatory)
const information = await player?.currentTrackInformation!(interaction.guild!);
interaction.reply({
  content: `Name: ${information.spotifyTitle}\nDuration: ${information.spotifyDuration}\nArtists: ${information.author}`,
});

player.getPlaylist()

The function as of now currently only supports the platform YouTube & Spotify as their main source of fetching data. So aside from YouTube & Spotify no platforms will be supported.

  • Kind: instance method of Player
  • Since: Saturday, 10 December 2022
const uri = await interaction.options.getString("uri");
const m = await interaction.guild?.members.cache.get(interaction.user.id);
await interaction.deferReply();
const queue = await player.getQueue!(interaction?.guild!);
const response = await await player.getPlaylist!(
  interaction.guild!,
  `${uri}`,
  m
);
queue.tracks?.push(...response.tracks!);
interaction.followUp({
  content: `Added **${response.list?.name}** to the queue.`,
});

player.tracksAdd()

In order to add tracks to the queue, you have to specify a proper tracks array.

Kind: instance method of Player

        import { Client, ApplicationCommandOptionType } from "discord.js";
        import { Player } from "frixx";

        //Initializing the player.
        const player = new Player(client)


        client.on("interactionCreate", async(interaction) => {
          if (!interaction.isChatInputCommand()) {
          return;
        }
        if(interaction.commandName === "playlist_song_add") {
          await interaction.deferReply();
          const uri = await interaction.options.getString("playlist");
          const response = await player.getPlaylist!(interaction.guild!, uri, interaction?.member!);
          await player.tracksAdd!(interaction?.guild!, response?.tracks!);

          interaction.followUp({
          content: `Added ${response?.list.name} to the current queue.`
          })
        }

        })

        client.on("ready", () => {

            await client.guilds.cache.get("Your guild id here.")?.commands.set(
              [{
              name: "playlist_song_add",
              description: "Adds some songs to the queue.",
              options: [{
              name: "playlist",
              description : "Specify the playlist uri.",
              type: ApplicationCommandOptionType.String,
              required: true
            }]
            )
          }
        ])

        return console.log("The client is now up and ready to go.")
        })

        client.login("Your Bot Token.")

player.play()

The player as of now only supports YouTube and Spotify as the main playing source.

  • Kind: global function

  • Since: Sunday, 11 December 2022

  • Author: TrishCX

Param Description
guild The "Guild" property from the discord.js.
query The query to play. This can be whether a uri/url or a simple search term.
voiceChannelId The voice channel id.
type The type, it can be whether a Message or ChatInputCommandInteraction.
member The GuildMember field from the discord.js itself.

Example

  • TypeScript
        const query = interaction.options.getString("query");
          await interaction.deferReply();
          const member = await interaction.guild?.members.cache.get(
            interaction.user.id
          )!.voice;
          const m = await interaction.guild?.members.cache.get(interaction.user.id);
          const guild = interaction?.guild!;
            interaction.guild!,
            `${query}`,
            `${member?.channel?.id}`,
            m!,
            interaction,
          );
  • JavaScript
const query = interaction.options.getString("query");
await interaction.deferReply();
const member = await interaction.guild?.members.cache.get(interaction.user.id)
  .voice;
const m = await interaction.guild?.members.cache.get(interaction.user.id);
const guild = interaction?.guild;
await player?.play(
  interaction.guild,
  `${query}`,
  `${member?.channel?.id}`,
  interaction,
  m
);