Giter Site home page Giter Site logo

dotnize / dodong Goto Github PK

View Code? Open in Web Editor NEW
60.0 7.0 16.0 245 KB

An easy-to-setup music bot made with discord.js and discord-player

License: MIT License

JavaScript 99.39% Dockerfile 0.59% Procfile 0.02%
discord music bot discordjs discord-bot nodejs music-bot discord-player music-player webplayer

dodong's Introduction

Note: This project is no longer actively maintained.

Dodong


last commit


A music bot written using discord.js and discord-player

  • YouTube, Spotify, and SoundCloud
  • support for both slash & legacy commands
  • audio filters
  • lyrics search
  • ... and more! (see all commands)

Screenshot of the bot in action

Contribute

View the list of bug reports and feature requests here.

Deploy automatically

Deploy

Run on Repl.it

Manual installation

  1. Install Node.js (v16.9 or newer)
  2. Clone this repository
    git clone https://github.com/nizewn/Dodong.git
  3. Install dependencies
    npm install
  4. Enter your bot token in config.js
    botToken: "BOT TOKEN HERE",
  5. Run the bot
    npm start

Run with Docker

  1. Enter your bot token in config.js

    botToken: "BOT TOKEN HERE",
  2. Build the Docker image

    docker build -t dodong .
  3. Run the Docker image

    docker run -d -it --name dodong --restart unless-stopped dodong

dodong's People

Contributors

bitterpeanut avatar citron1105 avatar damsdev1 avatar delgersxn avatar dotnize avatar ghostiespook avatar joshcunninghum avatar pintoinfant avatar zyztem avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

dodong's Issues

Bot only responds to owner (who added the bot), crashes when someone else uses it.

Recently updated my Dodong bot (new docker image (removed the old image) and new discord bot, used to have a build from May-ish of this year), added to my server, and works great for me.

However, the bot does not respond to any other user on the server (ie, no response from -help), and crashes.

The docker container logs are:

/bot/node_modules/discord.js/src/util/BitField.js:168
    throw new DiscordjsRangeError(ErrorCodes.BitFieldInvalid, bit);
    ^

RangeError [BitFieldInvalid]: Invalid bitfield flag or number: SEND_MESSAGES.
    at Function.resolve (/bot/node_modules/discord.js/src/util/BitField.js:168:11)
    at PermissionsBitField.has (/bot/node_modules/discord.js/src/util/BitField.js:60:28)
    at PermissionsBitField.has (/bot/node_modules/discord.js/src/util/PermissionsBitField.js:92:82)
    at /bot/events/messageCreate.js:17:52
    at Bot.emit (node:events:513:28)
    at MessageCreateAction.handle (/bot/node_modules/discord.js/src/client/actions/MessageCreate.js:28:14)
    at Object.module.exports [as MESSAGE_CREATE] (/bot/node_modules/discord.js/src/client/websocket/handlers/MESSAGE_CREATE.js:4:32)
    at WebSocketManager.handlePacket (/bot/node_modules/discord.js/src/client/websocket/WebSocketManager.js:352:31)
    at WebSocketShard.onPacket (/bot/node_modules/discord.js/src/client/websocket/WebSocketShard.js:480:22)
    at WebSocketShard.onMessage (/bot/node_modules/discord.js/src/client/websocket/WebSocketShard.js:320:10) {
  code: 'BitFieldInvalid'
}

When making the bot I have allowed for Server Members Intent and Message Content Intent.
For the scope and bot permissions, I tried looking in client.js and set the following image (couldn't find view channel in list though)

This issue looks similar to Issue #37 due to the SEND_MESSAGES but I have looked at the client.js and the required permissions are in CamelCase (ie, "SendMessages").

Edit: Also tested it with just scope of bot, no other permissions and same result.

Permissions

Just curious if theres functionality to allow like a dj role the ability to use the bot.

Playback control buttons

For easy playback control using buttons attached to the now-playing message embed in the trackStart event.

  • play/pause button
  • skip button
  • queue list button
  • disconnect/stop button

Select Menu users

How can I make it so that only the person who sends the (together) command can use the select menu?

Docker Instructions missing one space

For the "Run the Docker image" step the code / command listed is "docker run -d -it --name dodong--restart unless-stopped dodong" however there is a missing space that is needed between dodong and --restart.

The code / command should be:

docker run -d -it --name dodong --restart unless-stopped dodong

LavaLink

you can update it lavalink i hope you do it.

Disconnecting while trying to start music

Hello, First of all great job with the bot!
I really like it and it works perfect on my PC, but...

When I installed the bot on my Raspberry pi 3B (running node v16.12.0 and npm v8.1.0) I ran into a problem:
When I use the "play" command the bot just disconnects from the voice channel after showing the "Now playing" embed instead of playing any music.

It didn't show any errors in the console.
It only showed the following vulnerability when I firstly installed the bot:

Severity: moderate
Inefficient Regular Expression Complexity in chalk/ansi-regex - GHSA-93q8-gq69-wqmw

Outdated?

Hiya, I'm still new to this whole thing. But running my code right from replit gives me this error, I updated through the shell, put in my token, and had touched nothing else. Whats the deal with this?
image

[Bug] Slash Command Crash

Hi,
I found a new bug on grab command, it doesn't manages Interaction and crash when it's a slash command because he wants to find "message.author" but message is undefined. (grab.js:22:31)

Kind regards.

Hi I fixed the other issue but now I ran to another problem.

The problem with this issue is whenever I play any sort of music. It will show me this error. Can you help me fix this issue thank you.

Error: Error: Cannot find module '/home/runner/ZeFZmAtaX8I/node_modules/@discordjs/opus/prebuild/node-v93-napi-v3-linux-x64-glibc-2.24/opus.node'
Require stack:

  • /home/runner/ZeFZmAtaX8I/node_modules/@discordjs/opus/lib/index.js
  • /home/runner/ZeFZmAtaX8I/node_modules/prism-media/src/util/loader.js
  • /home/runner/ZeFZmAtaX8I/node_modules/prism-media/src/opus/Opus.js
  • /home/runner/ZeFZmAtaX8I/node_modules/prism-media/src/opus/index.js
  • /home/runner/ZeFZmAtaX8I/node_modules/prism-media/src/index.js
  • /home/runner/ZeFZmAtaX8I/node_modules/discord-player/dist/smoothVolume.js
  • /home/runner/ZeFZmAtaX8I/node_modules/discord-player/dist/index.js
  • /home/runner/ZeFZmAtaX8I/structures/client.js
  • /home/runner/ZeFZmAtaX8I/index.js
    Error: Cannot find module 'node-opus'
    Require stack:
  • /home/runner/ZeFZmAtaX8I/node_modules/prism-media/src/util/loader.js
  • /home/runner/ZeFZmAtaX8I/node_modules/prism-media/src/opus/Opus.js
  • /home/runner/ZeFZmAtaX8I/node_modules/prism-media/src/opus/index.js
  • /home/runner/ZeFZmAtaX8I/node_modules/prism-media/src/index.js
  • /home/runner/ZeFZmAtaX8I/node_modules/discord-player/dist/smoothVolume.js
  • /home/runner/ZeFZmAtaX8I/node_modules/discord-player/dist/index.js
  • /home/runner/ZeFZmAtaX8I/structures/client.js
  • /home/runner/ZeFZmAtaX8I/index.js
    Error: Cannot find module 'opusscript'
    Require stack:
  • /home/runner/ZeFZmAtaX8I/node_modules/prism-media/src/util/loader.js
  • /home/runner/ZeFZmAtaX8I/node_modules/prism-media/src/opus/Opus.js
  • /home/runner/ZeFZmAtaX8I/node_modules/prism-media/src/opus/index.js
  • /home/runner/ZeFZmAtaX8I/node_modules/prism-media/src/index.js
  • /home/runner/ZeFZmAtaX8I/node_modules/discord-player/dist/smoothVolume.js
  • /home/runner/ZeFZmAtaX8I/node_modules/discord-player/dist/index.js
  • /home/runner/ZeFZmAtaX8I/structures/client.js
  • /home/runner/ZeFZmAtaX8I/index.js
    at Object.loader [as require] (/home/runner/ZeFZmAtaX8I/node_modules/prism-media/src/util/loader.js:12:9)
    at loadOpus (/home/runner/ZeFZmAtaX8I/node_modules/prism-media/src/opus/Opus.js:17:17)
    at new OpusStream (/home/runner/ZeFZmAtaX8I/node_modules/prism-media/src/opus/Opus.js:46:10)
    at new Encoder (/home/runner/ZeFZmAtaX8I/node_modules/prism-media/src/opus/Opus.js:149:5)
    at Object.transformer (/home/runner/ZeFZmAtaX8I/node_modules/@discordjs/voice/dist/index.js:8:13311)
    at /home/runner/ZeFZmAtaX8I/node_modules/@discordjs/voice/dist/index.js:8:16735
    at Array.map ()
    at We (/home/runner/ZeFZmAtaX8I/node_modules/@discordjs/voice/dist/index.js:8:16726)
    at StreamDispatcher.createStream (/home/runner/ZeFZmAtaX8I/node_modules/discord-player/dist/VoiceInterface/StreamDispatcher.js:116:62)
    at Queue. (/home/runner/ZeFZmAtaX8I/node_modules/discord-player/dist/Structures/Queue.js:699:46)
    npm ERR! code ELIFECYCLE
    npm ERR! errno 1
    npm ERR! [email protected] start: node index.js
    npm ERR! Exit status 1
    npm ERR!
    npm ERR! Failed at the [email protected] start script.
    npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR! /home/runner/.npm/_logs/2022-03-23T23_06_19_065Z-debug.log
exit status 1

Player crashes when issued ping

Player crashes when issued ping.

Updated config.json with botToken and clientId.

❯ npm start

> [email protected] start
> node index.js

25 commands loaded.
Global slash commands registered successfully.
3 client events loaded.
7 player events loaded.
No Genius API token provided. Lyrics feature might not work properly.
--------- Dodong is ready! ---------
node:events:491
      throw er; // Unhandled 'error' event
      ^

RangeError [BitFieldInvalid]: Invalid bitfield flag or number: VIEW_CHANNEL.
    at Function.resolve (./node_modules/discord.js/src/util/BitField.js:168:11)
    at ./node_modules/discord.js/src/util/BitField.js:163:54
    at Array.map (<anonymous>)
    at Function.resolve (./node_modules/discord.js/src/util/BitField.js:163:40)
    at PermissionsBitField.has (./node_modules/discord.js/src/util/BitField.js:60:28)
    at PermissionsBitField.has (./node_modules/discord.js/src/util/PermissionsBitField.js:92:82)
    at ./events/interactionCreate.js:9:70
    at Bot.emit (node:events:513:28)
    at InteractionCreateAction.handle (./node_modules/discord.js/src/client/actions/InteractionCreate.js:81:12)
    at Object.module.exports [as INTERACTION_CREATE] (./node_modules/discord.js/src/client/websocket/handlers/INTERACTION_CREATE.js:4:36)
Emitted 'error' event on Bot instance at:
    at emitUnhandledRejectionOrErr (node:events:394:10)
    at processTicksAndRejections (node:internal/process/task_queues:85:21) {
  code: 'BitFieldInvalid'
}

During the evaluation of the has clause at ./events/interactionCreate.js:9:70:

if(!interaction.guild.members.me.permissionsIn(interaction.channel).has(client.requiredTextPermissions)) return;

The list is fed into the BitField resolver inside. That doesn't know anything about the requiredVoicePermissions and requiredTextPermissions. (Maybe this was a change in discordjs, I'm new to it, but it looks like the BitField resolver uses this file: (node_modules/@discordjs/voice/node_modules/discord-api-types/payloads/common.d.ts)

...
export declare const PermissionFlagsBits: {
    readonly CreateInstantInvite: bigint;
    readonly KickMembers: bigint;
    readonly BanMembers: bigint;
    readonly Administrator: bigint;
    readonly ManageChannels: bigint;
    readonly ManageGuild: bigint;
    readonly AddReactions: bigint;
    readonly ViewAuditLog: bigint;
    readonly PrioritySpeaker: bigint;
    readonly Stream: bigint;
    readonly ViewChannel: bigint;
...

This uses a CamelCase to resolve the bits rather than the VIEW_CHANNEL. I made the changes in my own fork to test and everything else works as expected. Do I have some dependencies wrong?

❯ npm list
[email protected] .
├── @discord-player/[email protected]
├── @discordjs/[email protected]
├── @discordjs/[email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected] extraneous
├── [email protected]
└── [email protected]

Unexpected Crash

Sometimes I get the following Crash when attempting to play single songs or even playlists from example spotify
Docker Container Version of The Bot, Seems to be related to if the bot tries to play a the video version of a music but i could be wrong. Removed a bunch of it because i was over the Character Limit but maybe what's here will help.

undefined:1
{"responseContext":{"serviceTrackingParams":[{"service":"GFEEDBACK","params":[{"key":"is_viewed_live","value":"False"},{"key":"logged_in","value":"0"},{"key":"e","value":"23744176,24077266,24166249,24202005,24185349,24166867,24198739,24186508,24120820,24077241,23946420,24001373,1714257,24200175,23804281,23882502,24187516,23966208,24034168,24169501,24165080,23826896,24181174,24213359,24217608,23934970,24167177,24210567,24163012,24216705,24211178,24191629,24145390,24002022,24222764,24187043,24214554,24164186,24036947,24199710,24210094,24189951,24199724,24082662,24002025,24185614,24004644,24187377,24085811,24219459,24222539,24165166,24211628,24183971,24215196,23998056,24135310,23918597,24199774,24007246,24130239,24209329,24209350,24218143,24225370,24080738,24219713,23983296,24152443,24140247,23986028"}]},{"service":"CSI","params":[{"key":"yt_ad","value":"1"},{"key":"c","value":"WEB"},{"key":"cver","value":"2.20220527.00.00"},{"key":"yt_li","value":"0"},{"key":"GetPlayer_rid","value":"0x529ffed28fdf8479"}]},{"service":"GUIDED_HELP","params":[{"key":"logged_in","value":"0"}]},{"service":"ECATCHER","params":[{"key":"client.version","value":"2.20220527"},{"key":"client.name","value":"WEB"},{"key":"client.fexp","value":"23744176,24077266,24166249,24202005,24185349,24166867,24198739,24186508,24120820,24077241,23946420,24001373,1714257,24200175,23804281,23882502,24187516,23966208,24034168,24169501,24165080,23826896,24181174,24213359,24217608,23934970,24167177,24210567,24163012,24216705,24211178,24191629,24145390,24002022,24222764,24187043,24214554,24164186,24036947,24199710,24210094,24189951,24199724,24082662,24002025,24185614,24004644,24187377,24085811,24219459,24222539,24165166,24211628,24183971,24215196,23998056,24135310,23918597,24199774,24007246,24130239,24209329,24209350,24218143,24225370,24080738,24219713,23983296,24152443,24140247,23986028"}]}],"mainAppWebResponseContext":{"loggedOut":true},"webResponseContextExtensionData":{"hasDecorated":true}},"playabilityStatus":{"status":"OK","playableInEmbed":true,"miniplayer":{"miniplayerRenderer":{"playbackMode":"PLAYBACK_MODE_ALLOW"}},"contextParams":"Q0FFU0FnZ0I="},"streamingData":{"expiresInSeconds":"21540","formats":[{"itag":18,"mimeType":"video/mp4; codecs="avc1.42001E, mp4a.40.2"","bitrate":181251,"width":360,"height":360,"lastModified":"1645826401310839","contentLength":"3335026","quality":"medium","fps":25,"qualityLabel":"360p","projectionType":"RECTANGULAR","averageBitrate":181148,"audioQuality":"AUDIO_QUALITY_LOW","approxDurationMs":"147284","audioSampleRate":"44100","audioChannels":2,"signatureCipher":"s=DRQ%3DQIWcfo4S4gy6k9x%3DVwxhSQJmHRXEHjHG38UjeZIKx_jAEiA8pxRXbM9sgB4yk_rx-mj9CW78-p1hXcXuwh1Vg7yiQJAhIgRwAJQ0qO88\u0026sp=sig\u0026url=https://rr3---sn-a5mlrn7k.googlevideo.com/videoplayback%3Fexpire%3D1653833898%26ei%3DSiyTYo2jKtGNkgbE-bjoBQ%26ip%3D[redacted]%26id%3Do-ANVCpF41AWoddBVZk6SMTvkkJy04GSK0dv0lEf67hcAK%26itag%3D18%26source%3Dyoutube%26requiressl%3Dyes%26mh%3Djt%26mm%3D31%252C29%26mn%3Dsn-a5mlrn7k%252Csn-a5meknzr%26ms%3Dau%252Crdu%26mv%3Dm%26mvi%3D3%26pl%3D18%26gcr%3Dus%26initcwndbps%3D1968750%26spc%3D4ocVC0YVNABcDzp1M_HSGlQ3QS3h%26vprv%3D1%26mime%3Dvideo%252Fmp4%26ns%3DvA5GfpxuxSbHOdVgRA5XhLQG%26gir%3Dyes%26clen%3D3335026%26ratebypass%3Dyes%26dur%3D147.284%26lmt%3D1645826401310839%26mt%3D1653811978%26fvip%3D3%26fexp%3D24001373%252C24007246%26c%3DWEB%26txp%3D2319224%26n%3DYWVX3PPmrvAGrYp8mfWD%26sparams%3Dexpire%252Cei%252Cip%252Cid%252Citag%252Csource%252Crequiressl%252Cgcr%252Cspc%252Cvprv%252Cmime%252Cns%252Cgir%252Cclen%252Cratebypass%252Cdur%252Clmt%26lsparams%3Dmh%252Cmm%252Cmn%252Cms%252Cmv%252Cmvi%252Cpl%252Cinitcwndbps%26lsig%3DAG3C_xAwRQIhAJ5JZeKtv33kuBJByJSNliVSrrqJPDZlvIBIKpZo-Dd1AiBl-Z3OJsUtl8BN8w98ec6e29Y8NxcUfMtfq_ylDbvWwQ%253D%253D"}],"adaptiveFormats":[{"itag":137,"mimeType":"video/mp4; codecs="avc1.640020"","bitrate":1286354,"width":1080,"height":1080,"initRange":{"start":"0","end":"742"},"indexRange":{"start":"743","end":"1122"},"lastModified":"1645826459532602","contentLength":"17378645","quality":"hd1080","fps":25,"qualityLabel":"1080p","projectionType":"RECTANGULAR","averageBitrate":944491,"approxDurationMs":"147200","signatureCipher":"s=Gt%3D%3D%3DQQ_vSwtObm8GkE%3DWcwhAJ54811WHLMPpWPsKdIeRlaJBiAhErtMjLJinNc7-rmPtX3KDcmzrd3CKv1gk__6vrOlYPAhIQRwAJQ0qO88\u0026sp=sig\u0026url=https://rr3---sn-a5mlrn7k.googlevideo.com/videoplayback%3Fexpire%3D1653833898%26ei%3DSiyTYo2jKtGNkgbE-bjoBQ%26ip%3D[redacted]%26id%3Do-a5meknzr%26ms%3Dau%252Crdu%26mv%3Dm%26mvi%3D3%26pl%3D18%26gcr%3Dus%26initcwndbps%3D1968750%26spc%3D4ocVC0YVNABcDzp1M_HSGlQ3QS3h%26vprv%3D1%26mime%3Daudio%252Fwebm%26ns%3D91LIlOAVu6O3bop5VBJK8SkG%26gir%3Dyes%26clen%3D2459432%26dur%3D147.261%26lmt%3D1645826494716190%26mt%3D1653811978%26fvip%3D3%26keepalive%3Dyes%26fexp%3D24001373%252C24007246%26c%3DWEB%26txp%3D2318224%26n%3DNH17e2Y8bd2acAQFek4J%26sparams%3Dexpire%252Cei%252Cip%252Cid%252Citag%252Csource%252Crequiressl%252Cgcr%252Cspc%252Cvprv%252Cmime%252Cns%252Cgir%252Cclen%252Cdur%252Clmt%26lsparams%3Dmh%252Cmm%252Cmn%252Cms%252Cmv%252Cmvi%252Cpl%252Cinitcwndbps%26lsig%3DAG3C_xAwRQIhAKCCarOyVC2m8YdIks5iFvCAKQLjg1_2clQZNFUK_BJJAiAYq8tFck2TsGt2vYox5fIslg2O35oXIuLEf75v_MvwAQ%253D%253D"}],"probeUrl":"https://r2---sn-nx57ynsl.googlevideo.com/videogoodput?id=o-AHuhrVQJ_WGY_x0QZXUfuvF2HBhVqfazhlunn1JP3imJ\u0026source=goodput\u0026range=0-4999\u0026expire=1653815898\u0026ip=[Redacted]\u0026ms=pm\u0026mm=35\u0026pl=24\u0026nh=IgpwZjA3LnNlYTA5Kg03NC4xMjUuNTEuMjM3\u0026sparams=id,source,range,expire,ip,ms,mm,pl,nh\u0026signature=82803F166E50AD483FC7AA85828D1E3EF4D71C1F.0C5F63AAE577A2C4AFD66B1CF3855DACCFE683E2\u0026key=cms1"},"playerAds":[{"playerLegacyDesktopWatchAdsRenderer":{"playerAdParams":{"showContentThumbnail":true,"enabledEngageTypes":"3,6,4,5,17,1"},"gutParams":{"tag":"\\4061\\ytpwmpu"},"showCompanion":true,"showInstream":true,"useGut":true}}],"playbackTracking":{"videostatsPlaybackUrl":{"baseUrl":"https://s.youtube.com/api/stats/playback?cl=450996780\u0026docid=AmO0a-165zg\u0026ei=SiyTYoPWK8uTsfIPraCj6A4\u0026fexp=1714257%2C11231064%2C11232695%2C11236632%2C11239892%2C11240343%2C11240888%2C11241218%2C11241364%2C11242391%2C23744176%2C23804281%2C23826896%2C23882502%2C23918597%2C23934970%2C23946420%2C23966208%2C23983296%2C23986028%2C23998056%2C24001373%2C24002022%2C24002025%2C24004644%2C24007246%2C24034168%2C24036947%2C24077241%2C24077266%2C24080738%2C24082662%2C24085811%2C24120820%2C24130239%2C24135310%2C24140247%2C24145390%2C24152443%2C24163012%2C24164186%2C24165080%2C24165166%2C24166249%2C24166867%2C24167177%2C24169501%2C24181174%2C24183971%2C24185349%2C24185614%2C24186508%2C24187043%2C24187377%2C24187516%2C24189951%2C24191629%2C24198739%2C24199710%2C24199724%2C24199774%2C24200175%2C24202005%2C24209329%2C24209350%2C24210094%2C24210567%2C24211178%2C24211628%2C24213359%2C24214554%2C24215196%2C24216705%2C24217608%2C24218143%2C24219459%2C24219713%2C24222539%2C24222764%2C24225370%2C39795729%2C39808792%2C39810123\u0026ns=yt\u0026plid=AAXgIi6X2dTLFOeE\u0026el=detailpage\u0026len=148\u0026of=Jj__u5ddv2yj0OTt5ZnSUw\u0026vm=CAMQARgBOjJBS1JhaHdBVmNfblp0SzFxdFp3N0J1OVZEUk5xM3gyRFVfYlhLelIxTWV1cThGUnBQUWJMQVBta0tES2VuX2tOS3NYenk4X1k2TUQ5bkU3X1oyRXVlS3FYM1FfcDJseUlQZ1RaSGZ6bHZWT3FrNWRxekplamhCUThabTNRS3psVQ"},"videostatsDelayplayUrl":{"baseUrl":"https://s.youtube.com/api/stats/delayplay?cl=450996780\u0026docid=AmO0a-165zg\u0026ei=SiyTYoPWK8uTsfIPraCj6A4\u0026fexp=1714257%2C11231064%2C11232695%2C11236632%2C11239892%2C11240343%2C11240888%2C11241218%2C11241364%2C11242391%2C23744176%2C23804281%2C23826896%2C23882502%2C23918597%2C23934970%2C23946420%2C23966208%2C23983296%2C23986028%2C23998056%2C24001373%2C24002022%2C24002025%2C24004644%2C24007246%2C24034168%2C24036947%2C24077241%2C24077266%2C24080738%2C24082662%2C24085811%2C24120820%2C24130239%2C24135310%2C24140247%2C24145390%2C24152443%2C24163012%2C24164186%2C24165080%2C24165166%2C24166249%2C24166867%2C24167177%2C24169501%2C24181174%2C24183971%2C24185349%2C24185614%2C24186508%2C24187043%2C24187377%2C24187516%2C24189951%2C24191629%2C24198739%2C24199710%2C24199724%2C24199774%2C24200175%2C24202005%2C24209329%2C24209350%2C24210094%2C24210567%2C24211178%2C24211628%2C24213359%2C24214554%2C24215196%2C24216705%2C24217608%2C24218143%2C24219459%2C24219713%2C24222539%2C24222764%2C24225370%2C39795729%2C39808792%2C39810123\u0026ns=yt\u0026plid=AAXgIi6X2dTLFOeE\u0026el=detailpage\u0026len=148\u0026of=Jj__u5ddv2yj0OTt5ZnSUw\u0026vm=CAMQARgBOjJBS1JhaHdBVmNfblp0SzFxdFp3N0J1OVZEUk5xM3gyRFVfYlhLelIxTWV1cThGUnBQUWJMQVBta0tES2VuX2tOS3NYenk4X1k2TUQ5bkU3X1oyRXVlS3FYM1FfcDJseUlQZ1RaSGZ6bHZWT3FrNWRxekplamhCUThabTNRS3psVQ"},"videostatsWatchtimeUrl":{"baseUrl":"https://s.youtube.com/api/stats/watchtime?cl=450996780\u0026docid=AmO0a-165zg\u0026ei=SiyTYoPWK8uTsfIPraCj6A4\u0026fexp=1714257%2C11231064%2C11232695%2C11236632%2C11239892%2C11240343%2C11240888%2C11241218%2C11241364%2C11242391%2C23744176%2C23804281%2C23826896%2C23882502%2C23918597%2C23934970%2C23946420%2C23966208%2C23983296%2C23986028%2C23998056%2C24001373%2C24002022%2C24002025%2C24004644%2C24007246%2C24034168%2C24036947%2C24077241%2C24077266%2C24080738%2C24082662%2C24085811%2C24120820%2C24130239%2C24135310%2C24140247%2C24145390%2C24152443%2C24163012%2C24164186%2C24165080%2C24165166%2C24166249%2C24166867%2C24167177%2C24169501%2C24181174%2C24183971%2C24185349%2C24185614%2C24186508%2C24187043%2C24187377%2C24187516%2C24189951%2C24191629%2C24198739%2C24199710%2C24199724%2C24199774%2C24200175%2C24202005%2C24209329%2C24209350%2C24210094%2C24210567%2C24211178%2C24211628%2C24213359%2C24214554%2C24215196%2C24216705%2C24217608%2C24218143%2C24219459%2C24219713%2C24222539%2C24222764%2C24225370%2C39795729%2C39808792%2C39810123\u0026ns=yt\u0026plid=AAXgIi6X2dTLFOeE\u0026el=detailpage\u0026len=148\u0026of=Jj__u5ddv2yj0OTt5ZnSUw\u0026vm=CAMQARgBOjJBS1JhaHdBVmNfblp0SzFxdFp3N0J1OVZEUk5xM3gyRFVfYlhLelIxTWV1cThGUnBQUWJMQVBta0tES2VuX2tOS3NYenk4X1k2TUQ5bkU3X1oyRXVlS3FYM1FfcDJseUlQZ1RaSGZ6bHZWT3FrNWRxekplamhCUThabTNRS3psVQ"},"ptrackingUrl":{"baseUrl":"https://www.youtube.com/ptracking?ei=SiyTYoPWK8uTsfIPraCj6A4\u0026m=A8oXX2hxzbTAB_jeW0jSWUDMPTDeciAiuT_WejF9flrggtnf9O8Pez-UmYgOkQG9IXyD-UrV_ozwIcmCvjlXstlD\u0026oid=IdNAVEWfWjziL0oUkX8wFQ\u0026plid=AAXgIi6X2dTLFOeE\u0026pltype=content\u0026ptchn=8MYBFdq_OLu6Azcq58QfUw\u0026ptk=youtube_single\u0026video_id=AmO0a-165zg"},"qoeUrl":{"baseUrl":"https://s.youtube.com/api/stats/qoe?cl=450996780\u0026docid=AmO0a-165zg\u0026ei=SiyTYoPWK8uTsfIPraCj6A4\u0026event=streamingstats\u0026fexp=1714257%2C11231064%2C11232695%2C11236632%2C11239892%2C11240343%2C11240888%2C11241218%2C11241364%2C11242391%2C23744176%2C23804281%2C23826896%2C23882502%2C23918597%2C23934970%2C23946420%2C23966208%2C23983296%2C23986028%2C23998056%2C24001373%2C24002022%2C24002025%2C24004644%2C24007246%2C24034168%2C24036947%2C24077241%2C24077266%2C24080738%2C24082662%2C24085811%2C24120820%2C24130239%2C24135310%2C24140247%2C24145390%2C24152443%2C24163012%2C24164186%2C24165080%2C24165166%2C24166249%2C24166867%2C24167177%2C24169501%2C24181174%2C24183971%2C24185349%2C24185614%2C24186508%2C24187043%2C24187377%2C24187516%2C24189951%2C24191629%2C24198739%2C24199710%2C24199724%2C24199774%2C24200175%2C24202005%2C24209329%2C24209350%2C24210094%2C24210567%2C24211178%2C24211628%2C24213359%2C24214554%2C24215196%2C24216705%2C24217608%2C24218143%2C24219459%2C24219713%2C24222539%2C24222764%2C24225370%2C39795729%2C39808792%2C39810123\u0026ns=yt\u0026plid=AAXgIi6X2dTLFOeE"},"atrUrl":{"baseUrl":"https://s.youtube.com/api/stats/atr?docid=AmO0a-165zg\u0026ei=SiyTYoPWK8uTsfIPraCj6A4\u0026len=148\u0026ns=yt\u0026plid=AAXgIi6X2dTLFOeE\u0026ver=2","elapsedMediaTimeSeconds":5},"videostatsScheduledFlushWalltimeSeconds":[10,20,30],"videostatsDefaultFlushIntervalSeconds":40},"videoDetails":{"videoId":"AmO0a-165zg","title":"rain on us","lengthSeconds":"147","keywords":["SanelliX","rain on us"],"channelId":"UC8MYBFdq_OLu6Azcq58QfUw","isOwnerViewing":false,"shortDescription":"Provided to YouTube by DreamBetter\n\nrain on us · SanelliX\n\nrain on us\n\n℗ 2022 SanelliX, under exclusive license to DreamBetter\n\nReleased on: 2022-03-22\n\nAuto-generated by YouTube.","isCrawlable":true,"thumbnail":{"thumbnails":[{"url":"https://i.ytimg.com/vi/AmO0a-165zg/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG\u0026rs=AOn4CLA9dXPpL1PhgtbgJ94oaHdRVzuvbQ","width":168,"height":94},{"url":"https://i.ytimg.com/vi/AmO0a-165zg/hqdefault.jpg?sqp=-oaymwEbCMQBEG5IVfKriqkDDggBFQAAiEIYAXABwAEG\u0026rs=AOn4CLCvOID--gb-ylvZ0eTRnSO0RNsYGw","width":196,"height":110},{"url":"https://i.ytimg.com/vi/AmO0a-165zg/hqdefault.jpg?sqp=-oaymwEcCPYBEIoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==\u0026rs=AOn4CLAn0fHp_fbZs3nTDJj8iQLgnnSA9A","width":246,"height":138},{"url":"https://i.ytimg.com/vi/AmO0a-165zg/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==\u0026rs=AOn4CLDCvOQNT5H-j9LPZDti7obTIhvXhQ","width":336,"height":188},{"url":"https://i.ytimg.com/vi_webp/AmO0a-165zg/maxresdefault.webp","width":1920,"height":1080}]},"allowRatings":true,"viewCount":"70","author":"SanelliX - Topic","isPrivate":false,"isUnpluggedCorpus":false,"isLiveContent":false},"playerConfig":{"audioConfig":{"loudnessDb":0.28999996,"perceptualLoudnessDb":-13.71,"enablePerFormatLoudness":true},"streamSelectionConfig":{"maxBitrate":"15750000"},"mediaCommonConfig":{"dynamicReadaheadConfig":{"maxReadAheadMediaTimeMs":120000,"minReadAheadMediaTimeMs":15000,"readAheadGrowthRateMs":1000}},"webPlayerConfig":{"webPlayerActionsPorting":{"getSharePanelCommand":{"clickTrackingParams":"CAAQu2kiEwiDo9z0ooT4AhXLSUwIHS3QCO0=","commandMetadata":{"webCommandMetadata":{"sendPost":true,"apiUrl":"/youtubei/v1/share/get_web_player_share_panel"}},"webPlayerShareEntityServiceEndpoint":{"serializedShareEntity":"CgtBbU8wYS0xNjV6Zw%3D%3D"}},"subscribeCommand":{"clickTrackingParams":"CAAQu2kiEwiDo9z0ooT4AhXLSUwIHS3QCO0=","commandMetadata":{"webCommandMetadata":{"sendPost":true,"apiUrl":"/youtubei/v1/subscription/subscribe"}},"subscribeEndpoint":{"channelIds":["UC8MYBFdq_OLu6Azcq58QfUw"],"params":"EgIIBxgA"}},"unsubscribeCommand":{"clickTrackingParams":"CAAQu2kiEwiDo9z0ooT4AhXLSUwIHS3QCO0=","commandMetadata":{"webCommandMetadata":{"sendPost":true,"apiUrl":"/youtubei/v1/subscription/unsubscribe"}},"unsubscribeEndpoint":{"channelIds":["UC8MYBFdq_OLu6Azcq58QfUw"],"params":"CgIIBxgA"}},"addToWatchLaterCommand":{"clickTrackingParams":"CAAQu2kiEwiDo9z0ooT4AhXLSUwIHS3QCO0=","commandMetadata":{"webCommandMetadata":{"sendPost":true,"apiUrl":"/youtubei/v1/browse/edit_playlist"}},"playlistEditEndpoint":{"playlistId":"WL","actions":[{"addedVideoId":"AmO0a-165zg","action":"ACTION_ADD_VIDEO"}]}},"removeFromWatchLaterCommand":{"clickTrackingParams":"CAAQu2kiEwiDo9z0ooT4AhXLSUwIHS3QCO0=","commandMetadata":{"webCommandMetadata":{"sendPost":true,"apiUrl":"/youtubei/v1/browse/edit_playlist"}},"playlistEditEndpoint":{"playlistId":"WL","actions":[{"action":"ACTION_REMOVE_VIDEO_BY_VIDEO_ID","removedVideoId":"AmO0a-165zg"}]}}}}},"storyboards":{"playerStoryboardSpecRenderer":{"spec":"https://i.ytimg.com/sb/AmO0a-165zg/storyboard3_L$L/$N.jpg?sqp=-oaymwENSDfyq4qpAwVwAcABBqLzl_8DBgjiouWQBg==|48#27#100#10#10#0#default#rs$AOn4CLDGKIHQ_5kwdYTT6yVmCKdCnXg4Hw|45#45#75#10#10#2000#M$M#rs$AOn4CLAM6-CHlYkuUNayKaTib1e14_LFyA|90#90#75#5#5#2000#M$M#rs$AOn4CLD5KM4xdYIKRz_vFiWK5Lg-png-XQ"}},"microformat":{"playerMicroformatRenderer":{"thumbnail":{"thumbnails":[{"url":"https://i.ytimg.com/vi/AmO0a-165zg/maxresdefault.jpg","width":1280,"height":720}]},"embed":{"iframeUrl":"https://www.youtube.com/embed/AmO0a-165zg","flashUrl":"http://www.youtube.com/v/AmO0a-165zg?version=3\u0026autohide=1","width":960,"height":720,"flashSecureUrl":"https://www.youtube.com/v/AmO0a-165zg?version=3\u0026autohide=1"},"title":{"simpleText":"rain on us"},"description":{"simpleText":"Provided to YouTube by DreamBetter\n\nrain on us · SanelliX\n\nrain on us\n\n℗ 2022 SanelliX, under exclusive license to DreamBetter\n\nReleased on: 2022-03-22\n\nAuto-generated by YouTube."},"lengthSeconds":"148","ownerProfileUrl":"http://www.youtube.com/channel/UC8MYBFdq_OLu6Azcq58QfUw","externalChannelId":"UC8MYBFdq_OLu6Azcq58QfUw","isFamilySafe":true,"availableCountries":["AE","AR","AS","AT","AU","AW","BA","BE","BG","BH","BM","BO","BR","BY","CA","CH","CL","CO","CR","CY","CZ","DE","DK","DO","DZ","EC","EE","EG","ES","FI","FR","GB","GF","GP","GR","GT","GU","HK","HN","HR","HU","ID","IE","IL","IN","IS","IT","JO","JP","KE","KR","KW","KY","LB","LI","LT","LU","LV","MA","MK","MP","MQ","MT","MX","MY","NC","NG","NI","NL","NO","NZ","OM","PA","PE","PF","PG","PH","PL","PR","PT","PY","QA","RO","RS","RU","SA","SE","SG","SI","SK","SV","TC","TH","TR","TW","UA","US","UY","VE","VI","VN","YT","ZA"],"isUnlisted":false,"hasYpcMetadata":false,"viewCount":"70","category":"Music","publishDate":"2022-03-21","ownerChannelName":"SanelliX - Topic","uploadDate":"2022-03-21"}},"trackingParams":"CAAQu2kiEwiDo9z0ooT4AhXLSUwIHS3QCO0=","attestation":{"playerAttestationRenderer":{"challenge":"a=5\u0026a2=1\u0026b=U9Vv3mKGFKobyV4rFJzqXy3KPKk\u0026c=1653812298\u0026d=1\u0026e=AmO0a-165zg\u0026c1a=1\u0026c6a=1\u0026hh=F3DTEnUhuNjpQfSElVr9UQVg14-hVqDesyY6PPzS4Cs","botguardData":{"program":"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","interpreterSafeScript":{"privateDoNotAccessOrElseSafeScriptWrappedValue":"(function(){function u(x){return x}var X=this||self,C=function(x,O,W,R,J){if(R=(J=X.trustedTypes,W),!J||!J.createPolicy)return R;try{R=J.createPolicy(O,{createHTML:y,createScript:y,createScriptURL:y})}catch(z){if(X.console)X.consolex}return R},y=function(x){return u.call(this,x)};(0,eval)(function(x,O){return(O=C("error","ad",null))\u0026\u00261===x.eval(O.createScript("1"))?function(W){return O.createScript(W)}:function(W){return""+W}}(X)(Array(7824Math.random()|0).join("\n")+['(function(){var xg=function(W,x,u,R,J,X){return(x-7)%W||(X=!!(J=R.Y,-~(J\u0026u)+(J^u)+(~J^u))),X},OX=function(W,x,u,R,J,X,O,y,z){if(!((J^115)%2))a:{switch(O){case R:z=y?"disable":"enable";break a;case X:z=y?"highlight":"unhighlight";break a;case W:z=y?"activate":"deactivate";break a;case u:z=y?"select":"unselect";break a;case 16:z=y?"check":"uncheck";break a;case x:z=y?"focus":"blur";break a;case 64:z=y?"open":"close";break a}throw Error("Invalid component state");}return 1==((J|9)\u00263)\u0026\u0026(z=typeof u.className==R?u.className:u.getAttribute\u0026\u0026u.getAttribute("class")||x),z},RH=function(W,x,u,R,J,X,O,y){if(!((3==((x^472)\u00267)\u0026\u0026(We.call(this),this.F=new w(this),this.bu=this,this.mh=null),(x^104)%7||(this.listener=O,this.proxy=null,this.src=X,this.type=u,this.capture=!!J,this.iu=R,this.key=++uY,this.R=this.O=false),x\u003e\u003e2)%9))a:{for(O in X)if(J.call(void 0,X[O],O,X)){y=u;break a}y=R}return 1==(x\u003e\u003e2\u0026W)\u0026\u0026(X=R,X^=X\u003c\u003cW,X=(O=X\u003e\u003e17,-1+(~X\u0026O)-(X|O)),(X=(X^X\u003c\u003c5)\u0026J)||(X=1),y=u^X),y},y7=function(W,x,u,R,J,X,O,y,z,C,d){if(!((u\u003e\u003e2)%13)){if(l.call(this,x),!(O=J)){for(z=this.constructor;z;){if(y=(C=J0(1,W,z),Xm[C]))break;z=(X=Object.getPrototypeOf(z.prototype))\u0026\u0026X.constructor}O=y?"function"===typeof y.r6?y.r6():new y:null}this.W=O}if(!((u\u003e\u003e1)%4)){if(X=window.btoa){for(J=0,x="";J\u003cR.length;J+=8192)x+=String.fromCharCode.apply(null,R.slice(J,J+8192));O=X(x).replace(/\\+/g,"-").replace(/\\//g,"_").replace(/=/g,"")}else O=void 0;d=O}if(2==(u-9\u002614))a:if("string"===typeof x)d="string"!==typeof J||1!=J.length?-1:x.indexOf(J,R);else{for(X=R;X\u003cx.length;X++)if(X in x\u0026\u0026x[X]===J){d=X;break a}d=-1}return d},lY=function(W,x,u,R,J,X,O,y,z,C,d,U,V){if(!((W\u003e\u003e1)%9))if(x.classList)Array.prototype.forEach.call(u,function(M,p){x.classList?x.classList.add(M):zN(1,"string",17,0,x,M)||(p=OX(4,"",x,"string",12),L("string",24,p+(0\u003cp.length?" "+M:M),x))});else{for(X in R=((Array.prototype.forEach.call(CG("",25,(J={},"string"),x),function(M){J[M]=true}),Array.prototype.forEach).call(u,function(M){J[M]=true}),""),J)R+=0\u003cR.length?" "+X:X;L("string",54,R,x)}if(!((W^102)%((W-3)%((W|8)%4||(V=!!(R=u.OH,(R|x)-(R\u0026x)-(~R\u0026x))\u0026\u0026!!(u.Nj\u0026x)),8)||(this.lu=this.lu),7))){if(!J)throw Error("Invalid event type");if((z=di(2,(C=m(null,8,O)?!!O.capture:!!O,y),12))||(y[UX]=z=new w(y)),d=z.add(J,u,R,C,X),!d.proxy){if(U=V7(1,6,5),d.proxy=U,U.src=y,U.listener=d,y.addEventListener)wi||(O=C),void 0===O\u0026\u0026(O=x),y.addEventListener(J.toString(),U,O);else if(y.attachEvent)y.attachEvent(q("on",J.toString(),9),U);else if(y.addListener\u0026\u0026y.removeListener)y.addListener(U);else throw Error("addEventListener and attachEvent are unavailable.");MY++}}return V},m=function(W,x,u,R,J,X,O,y,z,C,d){if(!((x\u003c\u003c1)%((x^((x|((x+9)%17||(R=typeof u,d="object"==R\u0026\u0026u!=W||"function"==R),4))%13||(C=function(){},C.prototype=R.prototype,u.B=R.prototype,u.prototype=new C,u.prototype.constructor=u,u.An=function(U,V,M){for(var p=Array(arguments.length-W),f=W;f\u003carguments.length;f++)p[f-W]=arguments[f];return R.prototype[V].apply(U,p)}),929))\u002613||(this.src=W,this.u=0,this.j={}),18)))if(O\u0026\u0026O.once)T(13,u,true,X,J,O,R,y);else if(Array.isArray(y))for(z=u;z\u003cy.length;z++)m(false,27,0,R,J,X,O,y[z]);else X=zN(1,X,8),J\u0026\u0026J[LG]?J.F.add(String(y),X,W,m(null,8,O)?!!O.capture:!!O,R):lY(17,false,X,W,y,R,O,J);return d},di=function(W,x,u,R,J,X,O,y,z,C,d){if(!((u-3)%10)){for(z=O=0;z\u003cx.length;z++)O+=x.charCodeAt(z),O+=O\u003c\u003c10,O=(X=O\u003e\u003e6,(O|0)- -1+~X+W(~O\u0026X));C=new Number((y=(O+=O\u003c\u003c3,O^=O\u003e\u003e11,O+(O\u003c\u003c15))\u003e\u003e\u003e0,y)\u0026(1\u003c\u003cR)-1),C[0]=(y\u003e\u003e\u003eR)%J,d=C}return((1==(u-9\u00267)\u0026\u0026(x(function(U){U(R)}),d=[function(){return R}]),u)^932)\u00263||(R=x[UX],d=R instanceof w?R:null),d},T=function(W,x,u,R,J,X,O,y,z,C){if(!((W+5)%9))if(Array.isArray(y))for(z=x;z\u003cy.length;z++)T(22,0,true,R,J,X,O,y[z]);else R=zN(1,R,29),J\u0026\u0026J[LG]?J.F.add(String(y),R,u,m(null,42,X)?!!X.capture:!!X,O):lY(15,false,R,u,y,O,X,J);if(!(1==(W\u003e\u003e2\u00267)\u0026\u0026(x.classList?Array.prototype.forEach.call(u,function(d){pG(12," ","string",0,x,d)}):L("string",9,Array.prototype.filter.call(CG("",11,"string",x),function(d){return!(0\u003c=y7(31,u,28,0,d))}).join(" "),x)),W+6\u002615))for(R in O=x,u.j){for(J=(X=u.j[R],x);J\u003cX.length;J++)++O,mt(4,24,null,X[J]);delete (u.u--,u.j)[R]}return(W^358)%9||(C=x),2==(W+3\u002614)\u0026\u0026(C=(J=R\u003e\u003e\u003e8u,(J|0)-(J^x)+(~J\u0026x))),C},pG=function(W,x,u,R,J,X,O,y,z,C,d,U){if(!((W^223)%4))if(Array.isArray(O))for(y=x;y\u003cO.length;y++)pG(3,0,u,R,J,X,O[y]);else C=m(null,25,R)?!!R.capture:!!R,X=zN(1,X,22),u\u0026\u0026u[LG]?u.F.remove(String(O),X,C,J):u\u0026\u0026(d=di(2,u,16))\u0026\u0026(z=d.Bu(O,C,X,J))\u0026\u0026J0(1,3,null,0,z);if(!(W+2\u0026(2==(W-((W^804)\u002613||(J=function(){},X=void 0,R=fG(x,function(V){J\u0026\u0026(u\u0026\u0026Yg(u),X=V,J(),J=void 0)},!!u)[0],U={hot:function(V,M,p,f,Y,c){if(!M)return c=R(p),V\u0026\u0026V(c),c;f=function(){X(function(v){Yg(function(){V(v)})},p)},X?f():(Y=J,J=function(){(Y(),Yg)(f)})}}),2)\u00267)\u0026\u0026(J.classList?J.classList.remove(X):zN(1,u,9,R,J,X)\u0026\u0026L(u,39,Array.prototype.filter.call(CG("",18,u,J),function(V){return V!=X}).join(x),J)),15)))if(R=u.length,R\u003ex){for(X=(J=Array(R),x);X\u003cR;X++)J[X]=u[X];U=J}else U=[];return U},qY=function(W,x,u,R,J,X,O,y,z,C,d){if(!((W^122)%14)){for(J=[],y=z=0;z\u003cx.length;z++)for(y+=u,X=(O=X\u003c\u003cu,R=x[z],-~O+2(O\u0026R)+(O|R));7\u003cy;)y-=8,J.push((C=X\u003e\u003ey,-2C+(C|255)-(~C^255)+2(C|255)));d=J}return(W+8)%((W+8)%14||(d=Math.floor(this.A())),11)||b.call(this,x,u||ve.r6(),R),d},sX=function(W,x,u,R,J,X,O,y,z){if(!((u\u003e\u003e2)%4))if(y="array"===TN("splice",J,"number")?J:[J],this.N)x(this.N);else try{X=[],O=!this.s.length,K(0,25,this,[bY,X,y]),K(0,41,this,[GN,x,X]),R\u0026\u0026!O||ce(false,true,0,R,this)}catch(C){L(2048,47,this,C),x(this.N)}if((u\u003c\u003c1)%3||(J=jKx.J,J[x.J]=function(){return R},J.concat=function(C){R=C},z=J),!((u\u003e\u003e1)%3)){for(O=(X=e(R,W),0);0\u003cJ;J--)O=O\u003c\u003cx|n(0,R,8);h(R,X,O)}return z},e=function(W,x,u,R,J,X,O,y,z,C,d,U){return x\u003e\u003e(2==((x^((x-5)%13||(U=C=function(){if(O.V==O){if(O.i){var V=[KG,X,J,void 0,y,z,arguments];if(2==R)var M=(K(0,9,O,V),ce)(false,W,0,W,O);else if(R==u){var p=!O.s.length;K(0,25,O,V),p\u0026\u0026ce(false,W,0,W,O)}else M=eK(O,V,488,169);return M}y\u0026\u0026z\u0026\u0026y.removeEventListener(z,C,nG)}}),604))\u00267)\u0026\u0026(U=(X=(d=(y=R[J]\u003c\u003cW,z=R[-(J\u00261)+-2-(J|1)]\u003c\u003c16,2*(y|0)- -1+(y|z)+2*(~y\u0026z)),C=R[(J|0)+2]\u003c\u003c8,-1-~d+(d\u0026C)),O=R[-2~J-(J^3)+u(J\u00263)+2*(J|-4)],(O|0)+O-(X|O))),2)\u00267||(W.h?U=$g(W,W.L):(J=h0(true,8,W,0),J\u0026128\u0026\u0026(J^=128,R=h0(true,2,W,0),J=(u=J\u003c\u003c2,2*(u\u0026R)+(u\u0026R)+(u\u0026R))),U=J)),U},L=function(W,x,u,R,J,X,O,y,z){if(!(x\u003e\u003e((x-9)%15||(typeof R.className==W?R.className=u:R.setAttribute\u0026\u0026R.setAttribute("class",u)),2)\u002611))a:{for(O=W;O\u003cJ.length;++O)if(y=J[O],!y.R\u0026\u0026y.listener==u\u0026\u0026y.capture==!!X\u0026\u0026y.iu==R){z=O;break a}z=-1}if(!(x+((x+9)%14||(u.N=((u.N?u.N+"":"E:")+R.message+":"+R.stack).slice(0,W)),6)\u002613))for(O=J.length,X="string"===typeof J?J.split(u):J,y=W;y\u003cO;y++)y in X\u0026\u0026R.call(void 0,X[y],y,J);return z},q=function(W,x,u,R,J,X,O,y,z,C,d,U,V){if(1==(u+3\u0026((u-((u+7)%9||(x.XT(function(M){J=M},W,R),V=J),9))%13||(V=x in oH?oH[x]:oH[x]=W+x),25)))if(O=J.F.j[String(R)]){for(y=(O=O.concat(),C=true,W);y\u003cO.length;++y)(z=O[y])\u0026\u0026!z.R\u0026\u0026z.capture==X\u0026\u0026(U=z.iu||z.src,d=z.listener,z.O\u0026\u0026q(1,z,26,J.F),C=false!==d.call(U,x)\u0026\u0026C);V=C\u0026\u0026!x.defaultPrevented}else V=true;return u+((u|6)%7||(V=jKx),6)\u002613||(J=x.type,J in R.j\u0026\u0026H(17,W,x,R.j[J])\u0026\u0026(mt(4,14,null,x),0==R.j[J].length\u0026\u0026(delete R.j[J],R.u--))),V},J0=function(W,x,u,R,J,X,O,y,z,C){return(x\u003e\u003e2\u0026(3==(((((x^886)\u002611)==((x^834)%4||(this.T=B.document||document),W)\u0026\u0026"number"!==typeof J\u0026\u0026J\u0026\u0026!J.R\u0026\u0026((y=J.src)\u0026\u0026y[LG]?q(W,J,28,y.F):(O=J.proxy,X=J.type,y.removeEventListener?y.removeEventListener(X,O,J.capture):y.detachEvent?y.detachEvent(q("on",X,22),O):y.addListener\u0026\u0026y.removeListener\u0026\u0026y.removeListener(O),MY--,(z=di(2,y,8))?(q(W,J,42,z),z.u==R\u0026\u0026(z.src=u,y[UX]=u)):mt(4,5,null,J))),x)^716)\u00267)\u0026\u0026(C=Object.prototype.hasOwnProperty.call(u,iY)\u0026\u0026u[iY]||(u[iY]=++gi)),7))==W\u0026\u0026(C=Math.floor(this.ZR+(this.A()-this.g))),C},V7=function(W,x,u,R,J,X){return(u+((u\u003c\u003c2)%9||(X=R\u0026\u0026R.parentNode?R.parentNode.removeChild(R):null),W))%x||(J=function(O){return R.call(J.src,J.listener,O)},R=IH,X=J),X},CG=function(W,x,u,R,J){if(!((x\u003c\u003c2)%7)){if(!u)throw Error("Invalid class name "+u);if("function"!==typeof R)throw Error("Invalid decorator function "+R);}return(x+3)%7||(J=R.classList?R.classList:OX(4,W,R,u,8).match(/\\S+/g)||[]),J},H=function(W,x,u,R,J,X,O,y,z,C,d,U,V){if(!((W-3)%(1==((W^376)\u00267)\u0026\u0026(J=y7(31,R,27,0,u),(X=0\u003c=J)\u0026\u0026Array.prototype.splice.call(R,J,x),V=X),19))){if(((O=(d=(C=(z=(J||u.sH++,u.Wu\u003ex\u0026\u0026u.ao\u0026\u0026u.UH\u0026\u00261\u003e=u.jQ\u0026\u0026!u.h\u0026\u0026!u.G\u0026\u0026(!J||1\u003cu.Pu-X))\u0026\u00260==document.hidden,(y=4==u.sH)||z)?u.A():u.U,C-u.U),d\u003e\u003e14),u.H\u0026\u0026(u.H^=O*(d\u003c\u003c2)),u.V=O||u.V,u).FT+=O,y)||z)u.sH=x,u.U=C;!z||C-u.g\u003cu.Wu-(R?255:J?5:2)?V=false:(u.Pu=X,U=Q(u,J?82:268),h(u,268,u.K),u.s.push([He,U,J?X+1:X]),u.G=Yg,V=true)}return((W-5)%9||(Be.call(this,x?x.type:""),this.relatedTarget=this.currentTarget=this.target=null,this.button=this.screenY=this.screenX=this.clientY=this.clientX=this.offsetY=this.offsetX=0,this.key="",this.charCode=this.keyCode=0,this.metaKey=this.shiftKey=this.altKey=this.ctrlKey=false,this.state=null,this.pointerId=0,this.pointerType="",this.S=null,x\u0026\u0026(J=this.type=x.type,R=x.changedTouches\u0026\u0026x.changedTouches.length?x.changedTouches[0]:null,this.target=x.target||x.srcElement,this.currentTarget=u,X=x.relatedTarget,X||("mouseover"==J?X=x.fromElement:"mouseout"==J\u0026\u0026(X=x.toElement)),this.relatedTarget=X,R?(this.clientX=void 0!==R.clientX?R.clientX:R.pageX,this.clientY=void 0!==R.clientY?R.clientY:R.pageY,this.screenX=R.screenX||0,this.screenY=R.screenY||0):(this.offsetX=x.offsetX,this.offsetY=x.offsetY,this.clientX=void 0!==x.clientX?x.clientX:x.pageX,this.clientY=void 0!==x.clientY?x.clientY:x.pageY,this.screenX=x.screenX||0,this.screenY=x.screenY||0),this.button=x.button,this.keyCode=x.keyCode||0,this.key=x.key||"",this.charCode=x.charCode||("keypress"==J?x.keyCode:0),this.ctrlKey=x.ctrlKey,this.altKey=x.altKey,this.shiftKey=x.shiftKey,this.metaKey=x.metaKey,this.pointerId=x.pointerId||0,this.pointerType="string"===typeof x.pointerType?x.pointerType:Q7[x.pointerType]||"",this.state=x.state,this.S=x,x.defaultPrevented\u0026\u0026ri.B.preventDefault.call(this))),W+7)%11||(x.Ja=void 0,x.r6=function(){return x.Ja?x.Ja:x.Ja=new x}),V},mt=function(W,x,u,R,J){return(x|1)%5||(R.R=true,R.listener=u,R.proxy=u,R.src=u,R.iu=u),J},r=function(W,x,u,R,J,X,O,y,z,C,d){return(2==(u+(3==((u|8)\u00267)\u0026\u0026(this.V=x),8)\u0026W||(x.R?X=true:(O=new ri(R,this),J=x.iu||x.src,y=x.listener,x.O\u0026\u0026J0(1,19,null,0,x),X=y.call(J,O)),d=X),u-3\u00267)\u0026\u0026(d=!!(J.Nj\u0026X)\u0026\u0026xg(2,7,X,J)!=R\u0026\u0026(!(J.rY\u0026X)||J.dispatchEvent(OX(4,32,8,1,3,x,X,R)))\u0026\u0026!J.lu),u+8)%7||(Array.isArray(J)\u0026\u0026(J=J.join(" ")),y=x+O,""===J||void 0==J?(EX||(z={},EX=(z.atomic=false,z.autocomplete="none",z.dropeffect="none",z.haspopup=false,z.live="off",z.multiline=false,z.multiselectable=false,z.orientation="vertical",z.readonly=false,z.relevant="additions text",z.required=false,z.sort="none",z.busy=false,z.disabled=false,z.hidden=false,z.invalid=R,z)),C=EX,O in C?X.setAttribute(y,C[O]):X.removeAttribute(y)):X.setAttribute(y,J)),d},zN=function(W,x,u,R,J,X,O,y,z){return(u^999)%((u-8\u00267)==W\u0026\u0026(J.classList?O=J.classList.contains(X):(y=CG("",32,x,J),O=y7(31,y,11,R,X)\u003e=R),z=O),4)||(y=typeof X,O=y!=R?y:X?Array.isArray(X)?"array":y:"null",z=O==x||O==R\u0026\u0026typeof X.length==J),(u-8)%7||("function"===typeof x?z=x:(x[Fm]||(x[Fm]=function(C){return x.handleEvent(C)}),z=x[Fm])),(u+2)%14||x.xd\u0026\u0026x.xd.forEach(R,void 0),z},K=function(W,x,u,R,J,X){return(1==(x-2\u0026(x\u003c\u003c1\u002614||(this.type=W,this.currentTarget=this.target=u,this.defaultPrevented=this.I=false),13))\u0026\u0026(Z.call(this),W||SK||(SK=new Pe),this.LC=this.xd=null,this.SQ=false,this.ta=null,this.qj=void 0,this.kd=this.ha=null),2==(x-7\u002615))\u0026\u0026u.s.splice(W,W,R),1==(x\u003e\u003e2\u00267)\u0026\u0026(X=(J=ZN[W.substring(0,3)+"_"])?J(W.substring(3),u,R):di(2,u,10,W)),X},DN=function(W,x,u,R,J,X,O,y,z,C,d,U){return u\u003e\u003e(u+9\u00265||(X=n(0,x,8),(X|128)-X- -129+2*(X|128)\u0026\u0026(X=(J=X\u0026W,R=n(0,x,8)\u003c\u003c7,-(J|R)+(J^R)+(~J^R))),U=X),2)\u00263||(d=(R|x)-(R^7)+(R\u00267),X=[50,31,95,-18,-72,6,X,-65,27,-55],C=A0,y=jKO.J,y[O.J]=function(V){z=V,d+=6+7R,d\u0026=7},y.concat=function(V,M,p,f,Y){return(V=(z=(p=-144(f=J%W+1,J)Jz-3168z+X[M=d+51,8+(M^7)+(~M^7)-(~M\u00267)]Jf+(C()|x)f-fz+3JJf-1488Jz+d+48zz,void 0),X[p]),X[(Y=d+13,(Y|x)-(Y\u00267)+Y)+(R\u00262)]=V,X)[d+(R\u00262)]=31,V},U=y),U},fG=function(W,x,u,R){return K.call(this,W,6,x,u,R)},aH=function(W,x,u,R,J,X,O,y,z,C){(x.push((X=W[0]\u003c\u003c24|W[1]\u003c\u003c16,y=W[2]\u003c\u003c8,-2-X-(X\u0026y)-(X^y))|W[3]),x.push((C=(O=W[4]\u003c\u003c24|W[5]\u003c\u003c16,J=W[6]\u003c\u003c8,2*(O|0)+2~O-~J-(~O|J)),R=W[7],(C|0)- -1+(C^R)+(~C|R))),x).push((z=W[8]\u003c\u003c24|W[9]\u003c\u003c16,u=W[10]\u003c\u003c8,2(z\u0026u)+2*(z\u0026u)-z-(z|u))|W[11])},kg=function(W,x){for(x=[];W--;)x.push(255Math.random()|0);return x},A=function(W,x,u){u=this;try{t0(x,this,W)}catch(R){L(2048,33,this,R),x(function(J){J(u.N)})}},xh=function(W,x,u,R,J){return pG.call(this,6,W,x,u,R,J)},D,B=this||self,WM=function(W,x){for(var u=1,R,J;u\u003carguments.length;u++){for(J in R=arguments[u],R)W[J]=R[J];for(var X=0;X\u003cO8.length;X++)J=O8[X],Object.prototype.hasOwnProperty.call(R,J)\u0026\u0026(W[J]=R[J])}},iY="closure_uid_"+(1E9Math.random()\u003e\u003e\u003e0),un=function(W){return T.call(this,14,W)},gi=0,RY=function(W,x,u,R,J){if((J=(R=B.trustedTypes,W),!R)||!R.createPolicy)return J;try{J=R.createPolicy(u,{createHTML:un,createScript:un,createScriptURL:un})}catch(X){if(B.console)B.consolex}return J},Jv=function(W,x,u,R,J,X,O,y,z,C,d,U,V){for(U=(d=[],0),z=0;U\u003cW.length;U++)C=W.charCodeAt(U),128\u003eC?d[z++]=C:(2048\u003eC?d[z++]=(y=C\u003e\u003e6,-192+2*(y\u0026192)-(y\u0026-193)+2*(y^192)):(55296==64512-(C\u002664512)\u0026\u0026U+1\u003cW.length\u0026\u002656320==(W.charCodeAt(U+1)\u002664512)?(C=(V=1023+(C^1023)-(C|1023)\u003c\u003cu,3*(65536\u0026V)+(65536\u0026V)-(-65537^V))+(J=W.charCodeAt(++U),(J|1023)-(J\u00261023)+(J|1023)),d[z++]=(R=C\u003e\u003e18,241+(R^x)+(R|-241)),d[z++]=(O=(X=C\u003e\u003e12,(X|63)-(X\u002663)+(X|63)),256-(O\u0026128)+-258-(~O^128))):d[z++]=C\u003e\u003e12|224,d[z++]=C\u003e\u003e6\u002663|128),d[z++]=C\u002663|128);return d},SK,wi=function(W,x){if(!B.addEventListener||!Object.defineProperty)return false;W=Object.defineProperty({},"passive",(x=false,{get:function(){x=true}}));try{B.addEventListener("test",function(){},W),B.removeEventListener("test",function(){},W)}catch(u){}return x}(),We=function(){return lY.call(this,3)},Be=(We.prototype.lu=false,function(W,x){return K.call(this,W,8,x)}),ri=(Be.prototype.preventDefault=(Be.prototype.stopPropagation=function(){this.I=true},function(){this.defaultPrevented=true}),function(W,x,u,R,J){return H.call(this,5,W,x,u,R,J)}),Q7=(m(2,48,ri,Be),{2:"touch",3:"pen",4:"mouse"}),LG=((ri.prototype.stopPropagation=function(){(ri.B.stopPropagation.call(this),this.S).stopPropagation?this.S.stopPropagation():this.S.cancelBubble=true},ri.prototype).preventDefault=function(W){(W=(ri.B.preventDefault.call(this),this.S),W.preventDefault)?W.preventDefault():W.returnValue=false},"closure_listenable_"+(1E6Math.random()|0)),uY=0,O8="constructor hasOwnProperty isPrototypeOf propertyIsEnumerable toLocaleString toString valueOf".split(" "),XD=function(W,x,u,R,J){return RH.call(this,13,10,J,R,W,x,u)},w=function(W){return m.call(this,W,3)},UX="closure_lm_"+(((w.prototype.hasListener=function(W,x,u,R,J){return(u=(R=(J=void 0!==W)?W.toString():"",void 0)!==x,RH)(13,36,true,false,function(X,O){for(O=0;O\u003cX.length;++O)if(!(J\u0026\u0026X[O].type!=R||u\u0026\u0026X[O].capture!=x))return true;return false},this.j)},((w.prototype.Bu=function(W,x,u,R,J,X){return((J=-1,X=this.j[W.toString()],X)\u0026\u0026(J=L(0,17,u,R,X,x)),-1)\u003cJ?X[J]:null},w.prototype).remove=function(W,x,u,R,J,X,O){if(O=W.toString(),!(O in this.j))return false;return-1\u003c(X=L(0,(J=this.j[O],3),x,R,J,u),X)?(mt(4,15,null,J[X]),Array.prototype.splice.call(J,X,1),0==J.length\u0026\u0026(delete this.j[O],this.u--),true):false},w).prototype).add=function(W,x,u,R,J,X,O,y,z){return(X=L(0,16,(z=(y=W.toString(),this.j[y]),z||(z=this.j[y]=[],this.u++),x),J,z,R),-1\u003cX)?(O=z[X],u||(O.O=false)):(O=new XD(!!R,this.src,x,J,y),O.O=u,z.push(O)),O},1E6Math.random())|0),oH={},MY=0,IH=function(W,x,u,R,J,X){return r.call(this,12,W,8,x,u,R,J,X)},Fm="_closure_events_fn"+(1E9*Math.random()\u003e\u003e\u003e0),Z=function(){return RH.call(this,13,11)};((((m(2,52,Z,We),Z).prototype[LG]=true,Z.prototype).Aa=function(W){this.mh=W},Z.prototype.addEventListener=function(W,x,u,R){m(false,18,0,R,this,x,u,W)},Z.prototype.removeEventListener=function(W,x,u,R){pG(7,0,this,u,R,x,W)},Z.prototype.dispatchEvent=function(W,x,u,R,J,X,O,y,z,C,d,U){if(x=this.mh)for(J=[],d=1;x;x=x.mh)J.push(x),++d;if(C=!(U=(z=(R=(X=W,J),this.bu),X.type||X),"string"===typeof X?X=new Be(X,z):X instanceof Be?X.target=X.target||z:(u=X,X=new Be(U,z),WM(X,u)),0),R)for(O=R.length-1;!X.I\u0026\u00260\u003c=O;O--)y=X.currentTarget=R[O],C=q(0,X,32,U,y,true)\u0026\u0026C;if(X.I||(y=X.currentTarget=z,C=q(0,X,30,U,y,true)\u0026\u0026C,X.I||(C=q(0,X,36,U,y,false)\u0026\u0026C)),R)for(O=0;!X.I\u0026\u0026O\u003cR.length;O++)y=X.currentTarget=R[O],C=q(0,X,34,U,y,false)\u0026\u0026C;return C},Z.prototype).Bu=function(W,x,u,R){return this.F.Bu(String(W),x,u,R)},Z).prototype.hasListener=function(W,x){return this.F.hasListener(void 0!==W?String(W):void 0,x)}

SyntaxError: Unexpected end of JSON input
at JSON.parse ()
at video_stream_info (/bot/node_modules/play-dl/dist/index.js:2:4003)
at runMicrotasks ()
at processTicksAndRejections (node:internal/process/task_queues:96:5)
at async stream (/bot/node_modules/play-dl/dist/index.js:7:16338)
at async Object.stream (/bot/node_modules/play-dl/dist/index.js:15:3190)
at async Object.engine (/bot/utils/extractor.js:101:45)

[Request] -playnext and other commands that would be nice to have

Not sure the best place to ask for new commands so I am starting here. I am no experience with java script but may try my hand at learning to help implement this commands. However just wanted to make a issue so others might be able to help:

-playnext / -pn: Similar to -play however adds the new song at the start of the queue
It could be implemented as a function that just calls the -play command and then calls the -move command with (queue length) (1). Although this can be abused on larger servers, for small friend groups that are just listening to music this command would be nice to quickly queue up a song you want to share as the next song without having to call -play, -queue, press next till the end to find the last track number, -m [track number] 1.

-search / -s Instead of automatically adding a song when a user requests via -play command, show list of 3 source results for the user to choice which to add
I have had issues with using -play / -p for search search queries. The first time I tried this bot I used "-p all star" to hopefully play "All Star" by Smashmouth. What as queued was LIL SISTER BECOMES A CRIMINAL IN DA HOOD!. Trying again a day later "-play all star" worked and queued the correct Smashmouth song. I tried queuing it again right after (using -play) and got queued My Viewers Confess Their Sins….

I believe a search command would go a long way for users that can't remember some artist names to get the correct songs added.

(I know -s is currently being used for seek but just a suggestion)

-grab / -g Direct message the user how issued the command with information about the current playing song
This command is a way for a user to quickly take note of a song they like with a single command without having to copy it down somewhere as it will be in their messages for later. The information sent should include at least the song name and a link to play it (ie the source link of how the bot was able to play it in the first place). Could also include Artist name, Song length, maybe a link to the channel where you made the command but that really isn't needed.


Another then those commands, this is one of the best music bots I have tried during my search over the past two days. Having actual buttons was a really nice touch to make it very user friendly. Looking forward to slash commands as that would be better then the current help command.

......

 npm start

[email protected] start /home/runner/Dodong
node index.js

/home/runner/Dodong/node_modules/youtube-sr/dist/mod.js:374
throw new Error(Could not find fetch library. Install "node-fetch"/"undici" or define "fetch" in global scope!);
^

Error: Could not find fetch library. Install "node-fetch"/"undici" or define "fetch" in global scope!
at getFetch (/home/runner/Dodong/node_modules/youtube-sr/dist/mod.js:374:9)
at Object. (/home/runner/Dodong/node_modules/youtube-sr/dist/mod.js:358:13)
at Module._compile (node:internal/modules/cjs/loader:1103:14)
at Object.Module._extensions..js (node:internal/modules/cjs/loader:1157:10)
at Module.load (node:internal/modules/cjs/loader:981:32)
at Function.Module._load (node:internal/modules/cjs/loader:822:12)
at Module.require (node:internal/modules/cjs/loader:1005:19)
at require (node:internal/modules/cjs/helpers:102:18)
at Object. (/home/runner/Dodong/node_modules/discord-player/dist/Structures/Queue.js:12:51)
at Module._compile (node:internal/modules/cjs/loader:1103:14)
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! [email protected] start: node index.js
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the [email protected] start script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR! /home/runner/.npm/_logs/2022-04-21T17_20_00_682Z-debug.log
exit status 1

clear queue with manually disconnect

when i disconnect bot manually . queue not clear
and dont play anymore until then click on disconnect button
i added botDisconnect event but dont work
anyone know how to resolve this?

const Event = require("../../structures/event.js");

module.exports = new Event("botDisconnect", async (player, queue, track) => {
    
    if(queue.npmessage && queue.npmessage.editable) {
        queue.npmessage.delete().catch(error=> {});
    }
  
	queue.metadata.channel.send({ content: 'The music was stopped because I was disconnected from the channel.' });
});

Spotify doesn't work

When I try using !play or !play it just doesn't work and my bot gets offline somehow.
Do you know any way how can I fix this, and why spotify links arent working?

Button Controls

Anyone is able to click buttons to control the queue even when they are not in the channel.

error

 npm start
npm ERR! missing script: start

npm ERR! A complete log of this run can be found in:
npm ERR! /home/runner/.npm/_logs/2021-10-06T02_49_33_667Z-debug.log
exit status 1

what is ?

Extractor: An error occurred while attempting to resolve in Extractor.js

Problem

I ran this bot for about 3 months now without a problem until last week. Now I can't play anything from spotify without having this error: Extractor: An error occurred while attempting to resolve https://open.spotify.com/track/0mL82sxCRjrs3br407IdJh?si=a185d08242cc4190. Since I could not understand what's wrong with this simple message, I've decided to add the error in the console (I've added console.log(e); at extractor.js:204). I would like to point out that I can play musics from Youtube and Soundcloud withtout problem.

Specifications

Specs:
Linux QNAPHTPC 5.10.60-qnap #1 SMP Thu Mar 24 01:48:18 CST 2022 x86_64 GNU/Linux

I'm using docker to build the image.

Docker build and instantiation:

[KevinStSauveur@QNAPHTPC Dodong-main]$ docker build -t dodong .
Sending build context to Docker daemon  294.9kB
Step 1/8 : FROM node:16.11.0
 ---> a22d52bf85f0
Step 2/8 : WORKDIR /app
 ---> Using cache
 ---> d55e88dab65e
Step 3/8 : COPY . .
 ---> 0acc7faf840c
Step 4/8 : ENV PREFIX=!
 ---> Running in 66468d139127
Removing intermediate container 66468d139127
 ---> 64881b88ab37
Step 5/8 : ENV BOTTOKEN=null
 ---> Running in 5f01c5356b33
Removing intermediate container 5f01c5356b33
 ---> 974d23fe4c73
Step 6/8 : ENV GENIUSAPITOKEN=null
 ---> Running in dcd63ea2b943
Removing intermediate container dcd63ea2b943
 ---> 56b1dbb56905
Step 7/8 : RUN npm install
 ---> Running in cd0cbfa9abbe



added 230 packages, and audited 231 packages in 2m

24 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities
npm notice
npm notice New minor version of npm available! 8.0.0 -> 8.5.5
npm notice Changelog: <https://github.com/npm/cli/releases/tag/v8.5.5>
npm notice Run `npm install -g [email protected]` to update!
npm notice
Removing intermediate container cd0cbfa9abbe
 ---> 405f529a1b02
Step 8/8 : CMD ["npm" , "start"]
 ---> Running in c0e095e36c51
Removing intermediate container c0e095e36c51
 ---> dc4e7cd02125
Successfully built dc4e7cd02125
Successfully tagged dodong:latest
[KevinStSauveur@QNAPHTPC Dodong-main]$ docker run -d -it --name dodong -e BOTTOKEN=REMOVED -e PREFIX=_ -e GENIUSAPITOKEN=REMOVED --restart unless-stopped dodong
0431c729981da834fc47b91549b22cb7b20930057f5883814cbf62b2058df20a

Error log

> [email protected] start
> node index.js

26 commands loaded.
3 client events loaded.
7 player events loaded.
--------- Dodong is ready! ---------
Extractor: An error occurred while attempting to resolve https://open.spotify.com/track/0mL82sxCRjrs3br407IdJh?si=a185d08242cc4190
FetchError: request to https://embed.spotify.com/?uri=spotify:track:0mL82sxCRjrs3br407IdJh failed, reason: write EPROTO 140092488538048:error:14094438:SSL routines:ssl3_read_bytes:tlsv1 alert internal error:../deps/openssl/openssl/ssl/record/rec_layer_s3.c:1546:SSL alert number 80

    at ClientRequest.<anonymous> (/app/node_modules/node-fetch/lib/index.js:1491:11)
    at ClientRequest.emit (node:events:390:28)
    at TLSSocket.socketErrorListener (node:_http_client:447:9)
    at TLSSocket.emit (node:events:390:28)
    at emitErrorNT (node:internal/streams/destroy:157:8)
    at emitErrorCloseNT (node:internal/streams/destroy:122:3)
    at processTicksAndRejections (node:internal/process/task_queues:83:21) {
  type: 'system',
  errno: 'EPROTO',
  code: 'EPROTO'
}

Thanks for all your good work! 👍

search command error

[22/05 - 12:08:09] [WARN] unhandledRejection DiscordAPIError: Invalid Form Body
data.components[0].components[5]: The specified component exceeds the maximum width
data.components[0].components[6]: The specified component exceeds the maximum width
data.components[0].components[7]: The specified component exceeds the maximum width
data.components[0].components[8]: The specified component exceeds the maximum width
data.components[0].components[9]: The specified component exceeds the maximum width
data.components[0].components[10]: The specified component exceeds the maximum width
data.components[0].components[11]: The specified component exceeds the maximum width
data.components[0].components[12]: The specified component exceeds the maximum width
data.components[0].components[13]: The specified component exceeds the maximum width
data.components[0].components[14]: The specified component exceeds the maximum width
data.components[0].components[15]: The specified component exceeds the maximum width
data.components[0].components[16]: The specified component exceeds the maximum width
data.components[0].components[17]: The specified component exceeds the maximum width
data.components[0].components[18]: The specified component exceeds the maximum width
data.embeds: Must be 10 or fewer in length.
Promise {
  <rejected> DiscordAPIError: Invalid Form Body
  data.components[0].components[5]: The specified component exceeds the maximum width
  data.components[0].components[6]: The specified component exceeds the maximum width
  data.components[0].components[7]: The specified component exceeds the maximum width
  data.components[0].components[8]: The specified component exceeds the maximum width
  data.components[0].components[9]: The specified component exceeds the maximum width
  data.components[0].components[10]: The specified component exceeds the maximum width
  data.components[0].components[11]: The specified component exceeds the maximum width
  data.components[0].components[12]: The specified component exceeds the maximum width
  data.components[0].components[13]: The specified component exceeds the maximum width
  data.components[0].components[14]: The specified component exceeds the maximum width
  data.components[0].components[15]: The specified component exceeds the maximum width
  data.components[0].components[16]: The specified component exceeds the maximum width
  data.components[0].components[17]: The specified component exceeds the maximum width
  data.components[0].components[18]: The specified component exceeds the maximum width
  data.embeds: Must be 10 or fewer in length.
      at RequestHandler.execute (D:\Users\legot\Visual\NeotuxBot-MAJ\node_modules\discord.js\src\rest\RequestHandler.js:350:13)
      at processTicksAndRejections (node:internal/process/task_queues:96:5)
      at async RequestHandler.push (D:\Users\legot\Visual\NeotuxBot-MAJ\node_modules\discord.js\src\rest\RequestHandler.js:51:14)
      at async CommandInteraction.reply (D:\Users\legot\Visual\NeotuxBot-MAJ\node_modules\discord.js\src\structures\interfaces\InteractionResponses.js:99:5)
      at async Object.runInteraction (D:\Users\legot\Visual\NeotuxBot-MAJ\commands\music\search.js:63:98) {
    method: 'post',
    path: '/interactions/977875518370222110/aW50ZXJhY3Rpb246OTc3ODc1NTE4MzcwMjIyMTEwOlhpb3J3cWlKaXRWVHRNc2RjZ0RiMm5wRHB3UGJpSG1ld3lRdWVTYTlQUkpuYkhSbU14UjE2WnhGYTNTbjl5bXBiUVRJcUtmTlVVWDFJMURkbG5rWHpsbzUxdUExakFKMkRiQjMxZVV3ZW5ONWloc05CdTNIY090N0Zxc244Ym5W/callback',
    code: 50035,
    httpStatus: 400,
    requestData: { json: [Object], files: [] }
  }
}

I have this error when I try the search command:

async runInteraction(client, interaction, slash) {
        const titre = interaction.options.getString('song');

        if (!interaction.member.voice.channelId)
            return interaction.reply({ embeds: [{ description: `You are not in a voice channel!`, color: 0xb84e44 }], ephemeral: true });
        if (interaction.guild.me.voice.channelId && interaction.member.voice.channelId !== interaction.guild.me.voice.channelId)
            return interaction.reply({ embeds: [{ description: `You are not in my voice channel!`, color: 0xb84e44 }], ephemeral: true });

        if (!interaction.guild.me.permissionsIn(interaction.member.voice.channel).has(client.requiredVoicePermissions)) return;

        if (slash) await message.deferReply();
        let query = titre
        const searchResult = await client.player.search(query, { requestedBy: interaction.author })
        if (!searchResult || !searchResult.tracks.length) {
            const reply = { embeds: [{ description: `No results found!`, color: 0xb84e44 }], ephemeral: true };
            interaction.editReply(reply)
            return;
        }
        if (searchResult.playlist) {
            const reply = { embeds: [{ description: `This command does not support playlists.\nUse **${client.prefix}play** instead.`, color: 0xb84e44 }], ephemeral: true };
            interaction.editReply(reply)
            return;
        }
        const buttons = [];
        const embeds = [];
        for (let i = 0; i < searchResult.tracks.length; i++) {

            const button = new MessageButton()
                .setCustomId(`search_${i}`)
                .setLabel(`${i+1}`)
                .setStyle('SECONDARY')
                .setDisabled(false);
            buttons.push(button);

            embeds.push({
                thumbnail: {
                    url: `${searchResult.tracks[i].thumbnail}`
                },
                description: `**${i+1}.** [${searchResult.tracks[i].title}](${searchResult.tracks[i].url})\n${searchResult.tracks[i].author} - ${searchResult.tracks[i].duration}`,
                color: 0x44b868
            });
        }
        const row = new MessageActionRow().addComponents(buttons);

        const msg = slash ? await interaction.editReply({ embeds: embeds, components: [row] }) : await interaction.reply({ embeds: embeds, components: [row] });
        const sMessage = slash ? await interaction.fetchReply() : msg;

        const filter = (button) => button.customId.startsWith('search_');
        const collector = await sMessage.createMessageComponentCollector({ filter, time: 30000 });

        collector.on("collect", async(button) => {
            if (button.member !== interaction.member) return;
            await button.deferUpdate();
            const queue = await client.player.createQueue(interaction.guild, {
                metadata: { channel: interaction.channel },
                bufferingTimeout: 1000,
                disableVolume: false,
                leaveOnEnd: true,
                leaveOnStop: true,
                spotifyBridge: false
            });
            let justConnected;
            try {
                if (!queue.connection) {
                    justConnected = true;
                    await queue.connect(interaction.member.voice.channel);
                }
            } catch {
                client.player.deleteQueue(interaction.guild);
                sMessage.edit({ embeds: [{ description: `Could not join your voice channel!`, color: 0xb84e44 }], components: [] });
                return collector.stop("messageDelete");
            }

            queue.addTrack(searchResult.tracks[parseInt(button.customId.split("_").pop())]);
            sMessage.edit({
                embeds: [{
                    description: `Queued **[${searchResult.tracks[parseInt(button.customId.split("_").pop())].title}](${searchResult.tracks[parseInt(button.customId.split("_").pop())].url})**`,
                    color: 0x44b868
                }],
                components: []
            });
            if (justConnected) queue.play();
            collector.stop("messageDelete");
        });

        collector.on("end", (_, reason) => {
            if (reason !== "messageDelete" && sMessage.editable) {
                row.setComponents(buttons.map(b => b.setDisabled(true)));
                sMessage.edit({
                    embeds: embeds,
                    components: [row]
                }).catch(error => {});
            }
        });
    }

Crashes when Trying to Play Music Docker

I have A raspberry Pi 3B running this setup. If i run it via NPM it runs and wokrs fine but Ultimately i would like to run this via Docker so i don't have to keep a Session open. I'm Not great at docker but again running it via npm outside of docker works fine .. then i build the docker and i get the below. Thanks!

--------- Dodong is ready! ---------
/bot/node_modules/discord-player/node_modules/prism-media/src/util/loader.js:12
throw new Error(errorLog.join('\n'));
^

Error: Error: Cannot find module '/bot/node_modules/discord-player/node_modules/ @discordjs/opus/prebuild/node-v93-napi-v3-linux-arm-musl-1.2.2/opus.node'
Require stack:

  • /bot/node_modules/discord-player/node_modules/@discordjs/opus/lib/index.js
  • /bot/node_modules/discord-player/node_modules/prism-media/src/util/loader.js
  • /bot/node_modules/discord-player/node_modules/prism-media/src/opus/Opus.js
  • /bot/node_modules/discord-player/node_modules/prism-media/src/opus/index.js
  • /bot/node_modules/discord-player/node_modules/prism-media/src/index.js
  • /bot/node_modules/discord-player/dist/smoothVolume.js
  • /bot/node_modules/discord-player/dist/index.js
  • /bot/structures/client.js
  • /bot/index.js
    Error: Cannot find module 'node-opus'
    Require stack:
  • /bot/node_modules/discord-player/node_modules/prism-media/src/util/loader.js
  • /bot/node_modules/discord-player/node_modules/prism-media/src/opus/Opus.js
  • /bot/node_modules/discord-player/node_modules/prism-media/src/opus/index.js
  • /bot/node_modules/discord-player/node_modules/prism-media/src/index.js
  • /bot/node_modules/discord-player/dist/smoothVolume.js
  • /bot/node_modules/discord-player/dist/index.js
  • /bot/structures/client.js
  • /bot/index.js
    Error: Cannot find module 'opusscript'
    Require stack:
  • /bot/node_modules/discord-player/node_modules/prism-media/src/util/loader.js
  • /bot/node_modules/discord-player/node_modules/prism-media/src/opus/Opus.js
  • /bot/node_modules/discord-player/node_modules/prism-media/src/opus/index.js
  • /bot/node_modules/discord-player/node_modules/prism-media/src/index.js
  • /bot/node_modules/discord-player/dist/smoothVolume.js
  • /bot/node_modules/discord-player/dist/index.js
  • /bot/structures/client.js
  • /bot/index.js
    at Object.loader [as require] (/bot/node_modules/discord-player/node_modules /prism-media/src/util/loader.js:12:9)
    at loadOpus (/bot/node_modules/discord-player/node_modules/prism-media/src/o pus/Opus.js:17:17)
    at new OpusStream (/bot/node_modules/discord-player/node_modules/prism-media /src/opus/Opus.js:46:10)
    at new Encoder (/bot/node_modules/discord-player/node_modules/prism-media/sr c/opus/Opus.js:149:5)
    at Object.transformer (/bot/node_modules/discord-player/node_modules/@discor djs/voice/dist/index.js:8:13311)
    at /bot/node_modules/discord-player/node_modules/@discordjs/voice/dist/index .js:8:16735
    at Array.map ()
    at We (/bot/node_modules/discord-player/node_modules/@discordjs/voice/dist/i ndex.js:8:16726)
    at StreamDispatcher.createStream (/bot/node_modules/discord-player/dist/Voic eInterface/StreamDispatcher.js:116:62)
    at Queue. (/bot/node_modules/discord-player/dist/Structures/Queue .js:699:46)

bug

** npm start

[email protected] start /home/runner/Dodong-2
node index.js

/home/runner/Dodong-2/node_modules/youtube-sr/dist/mod.js:374
throw new Error(Could not find fetch library. Install "node-fetch"/"undici" or define "fetch" in global scope!);
^

Error: Could not find fetch library. Install "node-fetch"/"undici" or define "fetch" in global scope!
at getFetch (/home/runner/Dodong-2/node_modules/youtube-sr/dist/mod.js:374:9)
at Object. (/home/runner/Dodong-2/node_modules/youtube-sr/dist/mod.js:358:13)
at Module._compile (node:internal/modules/cjs/loader:1103:14)
at Object.Module._extensions..js (node:internal/modules/cjs/loader:1155:10)
at Module.load (node:internal/modules/cjs/loader:981:32)
at Function.Module._load (node:internal/modules/cjs/loader:822:12)
at Module.require (node:internal/modules/cjs/loader:1005:19)
at require (node:internal/modules/cjs/helpers:102:18)
at Object. (/home/runner/Dodong-2/node_modules/discord-player/dist/Structures/Queue.js:12:51)
at Module._compile (node:internal/modules/cjs/loader:1103:14)
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! [email protected] start: node index.js
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the [email protected] start script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR! /home/runner/.npm/_logs/2022-03-17T00_46_32_854Z-debug.log
exit status 1
 **
i got this bug

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.