A bot that constantly streams ClassicFM, a British classical music radio station, into a Discord voice channel of the user's choosing.
Find a file
jaredthomason 3875a6c064 whoops
2024-05-12 12:33:15 -04:00
src Revert "Rather than make a new resource for each player, the bot uses one resource / connection to ClassicFM for each channel." 2024-05-12 12:28:58 -04:00
.DS_Store removed node_modules folder and updated package requirements 2024-05-12 12:08:13 -04:00
LICENSE Initial commit 2024-05-09 14:23:14 -04:00
package.json whoops 2024-05-12 12:33:15 -04:00
README.md Update README.md 2024-05-12 12:01:40 -04:00

ClassicFM Discord Bot

Classic_FM_logo svg

A bot that constantly streams ClassicFM, a British classical music radio station, into a Discord voice channel of the user's choosing.

This bot uses an m3u8 stream as its source and joins a channel of the user's choosing until it is forcefully disconnected. This can be helpful if you want to just make a voice channel for peacefully listening to classical music, and it can be used with any mp3 or m3u8 stream.

Like any other bot, this requires that you make an application (bot) in the Discord Developer Portal.

This mini project quite literally would not have been possible without @ChrisChrome, who basically made the whole fucking thing work and showed me the limitations of both Discord bots and JavaScript as a whole.

How To Use

First, clone this GitHub repository, open it, and install dependencies.

git clone https://github.com/szeremeta1/classicfm-discord-bot.git
cd classicfm-discord-bot
npm i

Next, add your bot token you obtained from the Discord Developer Portal.

cd src
sudo nano config.json

Finally, cd back into classicfm-discord-bot and start the bot.

cd
cd classicfm-discord-bot
pm2 start ./src/bot.js

Troubleshooting

Cannot Play Audio: No Valid Encryption Package is Installed

If you receive an error like this:

Error: Cannot play audio as no valid encryption package is installed.
- Install sodium, libsodium-wrappers, or tweetnacl.
- Use the generateDependencyReport() function for more information.

    at Object.fallbackError (/home/user/classicfm-discord-bot/node_modules/@discordjs/voice/dist/index.js:215:9)
    at Networking.encryptOpusPacket (/home/user/classicfm-discord-bot/node_modules/@discordjs/voice/dist/index.js:885:17)
    at Networking.createAudioPacket (/home/user/classicfm-discord-bot/node_modules/@discordjs/voice/dist/index.js:869:69)
    at Networking.prepareAudioPacket (/home/user/classicfm-discord-bot/node_modules/@discordjs/voice/dist/index.js:793:33)
    at VoiceConnection.prepareAudioPacket (/home/user/classicfm-discord-bot/node_modules/@discordjs/voice/dist/index.js:1933:29)
    at AudioPlayer._preparePacket (/home/user/classicfm-discord-bot/node_modules/@discordjs/voice/dist/index.js:1324:18)
    at AudioPlayer._stepPrepare (/home/user/classicfm-discord-bot/node_modules/@discordjs/voice/dist/index.js:1294:14)
    at prepareNextAudioFrame (/home/user/classicfm-discord-bot/node_modules/@discordjs/voice/dist/index.js:136:29)
    at audioCycleStep (/home/user/classicfm-discord-bot/node_modules/@discordjs/voice/dist/index.js:125:3)
    at Timeout._onTimeout (/home/user/classicfm-discord-bot/node_modules/@discordjs/voice/dist/index.js:132:45)

Then sodium is being a bitch. Despite saying it needs to be installed, it is already in node_modules. This can be fixed by completely deleting sodium from node_modules and reinstalling it.

cd classicfm-discord-bot
cd node_modules
sudo rm -rf sodium
cd
cd classicfm-discord-bot
npm i sodium

This may take a while, as it has for me. Just wait patiently, even if it appears to be frozen. After it's done, cd back into classicfm-discord-bot and start the bot.

cd classicfm-discord-bot
pm2 start ./src/bot.js

Error: Cannot find module 'node-opus' / 'opusscript'

Similarly to the sodium error, in this case, opusscript is being a bitch. The error you may receive looks like this:

Error: Cannot find module 'node-opus'
Require stack:
- /home/user/classicfm-discord-bot/node_modules/prism-media/src/util/loader.js
- /home/user/classicfm-discord-bot/node_modules/prism-media/src/opus/Opus.js
- /home/user/classicfm-discord-bot/node_modules/prism-media/src/opus/index.js
- /home/user/classicfm-discord-bot/node_modules/prism-media/src/index.js
- /home/user/classicfm-discord-bot/node_modules/@discordjs/voice/dist/index.js
- /home/user/classicfm-discord-bot/src/bot.js
Error: Cannot find module 'opusscript'
Require stack:
- /home/user/classicfm-discord-bot/node_modules/prism-media/src/util/loader.js
- /home/user/classicfm-discord-bot/node_modules/prism-media/src/opus/Opus.js
- /home/user/classicfm-discord-bot/node_modules/prism-media/src/opus/index.js
- /home/user/classicfm-discord-bot/node_modules/prism-media/src/index.js
- /home/user/classicfm-discord-bot/node_modules/@discordjs/voice/dist/index.js
- /home/user/classicfm-discord-bot/src/bot.js
    at Object.loader [as require] (/home/user/classicfm-discord-bot/node_modules/prism-media/src/util/loader.js:12:9)
    at loadOpus (/home/user/classicfm-discord-bot/node_modules/prism-media/src/opus/Opus.js:17:17)
    at new OpusStream (/home/user/classicfm-discord-bot/node_modules/prism-media/src/opus/Opus.js:46:10)
    at new Encoder (/home/user/classicfm-discord-bot/node_modules/prism-media/src/opus/Opus.js:149:5)
    at Object.transformer (/home/user/classicfm-discord-bot/node_modules/@discordjs/voice/dist/index.js:2224:24)
    at /home/user/classicfm-discord-bot/node_modules/@discordjs/voice/dist/index.js:2457:58
    at Array.map (<anonymous>)
    at Object.createAudioResource (/home/user/classicfm-discord-bot/node_modules/@discordjs/voice/dist/index.js:2457:39)
    at JoinChannel (/home/user/classicfm-discord-bot/src/bot.js:69:24)
    at /home/user/classicfm-discord-bot/src/bot.js:55:7

To solve this error, simply cd into classicfm-discord-bot and reinstall it. For this module, I didn't need to rm -rf it from node-modules, but your situation may be different.

cd classicfm-discord-bot
npm i opusscript

This shouldn't take long. When it is complete, attempt to start the bot again with pm2 start ./src/bot.js or node ./src/bot.js while in the classicfm-discord-bot folder.