{"_id":"spike-player","_rev":"64-839099db1e9509fe1d9307233d00b663","name":"spike-player","dist-tags":{"latest":"1.4.5","dev":"1.4.6-8"},"versions":{"1.0.0":{"name":"spike-player","version":"1.0.0","description":"Complete framework to facilitate music commands using discord.js v13","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","test":"jest test/test.js","docs:test":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml","docs":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml --output docs/docs.json"},"keywords":["music","player","bot","framework","discord","youtube","spotify","v13"],"dependencies":{"@discordjs/opus":"^0.6.0","@discordjs/voice":"^0.6.0","axios":"^0.22.0","axios-retry":"^3.2.0","discord-ytdl-core":"^5.0.4","domhandler":"^4.2.2","ffmpeg-static":"^4.4.0","htmlparser2":"^7.1.2","libsodium-wrappers":"^0.7.9","spotify-url-info":"^2.2.3","youtubei":"^0.0.1-rc.34","ytdl-core":"^4.9.1","ytsr":"^3.5.3"},"devDependencies":{"@babel/cli":"^7.14.8","@babel/core":"^7.15.0","@babel/preset-env":"^7.15.0","@babel/preset-typescript":"^7.15.0","@types/node":"^16.6.1","@typescript-eslint/eslint-plugin":"^4.29.1","@typescript-eslint/parser":"^4.29.1","assert-diff":"^3.0.2","discord.js":"^14.0.0-dev.1654776344-94bdcac","discord.js-docgen":"github:discordjs/docgen#ts-patch","eslint":"^7.32.0","jest":"^27.0.6","jsdoc-babel":"^0.5.0","ts-node":"^10.2.0","typescript":"^4.3.5"},"directories":{"doc":"docs","test":"test"},"gitHead":"07d67d5c36cff03b4dad03c2bf0cfce128fd846a","_id":"spike-player@1.0.0","_nodeVersion":"18.3.0","_npmVersion":"8.11.0","dist":{"integrity":"sha512-aD0SUJ3aEOT2RCsveUV4MjobVoSp5F9bODHL01wGZCEZTVRXz+fYu/9S4/IZneVzLvalVPtgEM7T618SCZ99JQ==","shasum":"5f7bf3d49e7083ee26790fb477bfd1b8e521e5b2","tarball":"https://registry.npmjs.org/spike-player/-/spike-player-1.0.0.tgz","fileCount":26,"unpackedSize":97447,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAnZ3WS9qd0a8bHtLjSaIZry3EyKo/wDnXKfLT67yTT+AiEA/hOZKrMIRv84ReQ6/v/0DGchiiKvGiX/h9oy9s/B9yY="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJitJV2ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmonPBAAhsVnnxIsijJ0rtKhOhduFh4ydjrLXf5m3OZ79OXbP1UAwBqU\r\nrVhVPYXSzwX3TVbsdabt4++DI63O2Ia50ieFwrq7WUfVBudrgVRJRe83Vwzz\r\nDmZoe06U6vTpasqPvLiFh85b7uj5utX2F5O8TpYfTkPyJcKzrc3eU13tI6tO\r\nrEwHoDakfPqbwqIOUuzpAzTD9AaxXJfM+npvQhcMaeKuTqr2ZBP139igOL6+\r\nHIlbsn/LT+/BmqfRm839JFGbT+1LIxIbzxzOlhYl5j9Pe/sqUXjyesRecBzj\r\nBi+RWx4/itGp8eOlUh7nWU11FUNHOje7chiKR1WgdAyDgUmciof4ozMTDsGW\r\nDW2ieLkY6tDI/FZ25D9wMxSdXLaDj+lOhWt4enc3+kdSBJc9aCqj6x5dHTqE\r\n9w2rZvkeuWoz9oKEPwIAcRbH86WMVTvwQVK718n9jJMeDe6BTLU0ilDckiZR\r\nD7hL+nctyCFdPK/cJ3YTMOnNDybMDzhrVyGKUc2+XZobb7jAnmtI+skVzP7a\r\nWcPdsdq6Sd1bL2FMLAGWmJDQaNSiIyk/YrLpRXW4Z1eYYlh/xPHvPqAnShCS\r\nlwXRHEDWyRjnRCGj0erPObFv6Jl9D8dPNzElLM1E8KK/DH75kmL1El729pa5\r\nvUazbsJNaCcD9YEke2IF4IUKTvMHYQZrq6w=\r\n=3M6q\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"spikebot","email":"abatallah1214@gmail.com"},"maintainers":[{"name":"spikebot","email":"abatallah1214@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spike-player_1.0.0_1656001910440_0.15708843635462855"},"_hasShrinkwrap":false},"1.0.1":{"name":"spike-player","version":"1.0.1","description":"Complete framework to facilitate music commands using discord.js v13","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","test":"jest test/test.js","docs:test":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml","docs":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml --output docs/docs.json"},"keywords":["music","player","bot","framework","discord","youtube","spotify","v13"],"dependencies":{"@discordjs/opus":"^0.6.0","@discordjs/voice":"^0.6.0","axios":"^0.22.0","axios-retry":"^3.2.0","discord-ytdl-core":"^5.0.4","domhandler":"^4.2.2","ffmpeg-static":"^4.4.0","htmlparser2":"^7.1.2","libsodium-wrappers":"^0.7.9","spotify-url-info":"^2.2.3","youtubei":"^0.0.1-rc.34","ytdl-core":"^4.9.1","ytsr":"^3.5.3"},"devDependencies":{"@babel/cli":"^7.14.8","@babel/core":"^7.15.0","@babel/preset-env":"^7.15.0","@babel/preset-typescript":"^7.15.0","@types/node":"^16.6.1","@typescript-eslint/eslint-plugin":"^4.29.1","@typescript-eslint/parser":"^4.29.1","assert-diff":"^3.0.2","discord.js":"^14.0.0-dev.1654776344-94bdcac","discord.js-docgen":"github:discordjs/docgen#ts-patch","eslint":"^7.32.0","jest":"^27.0.6","jsdoc-babel":"^0.5.0","ts-node":"^10.2.0","typescript":"^4.3.5"},"directories":{"doc":"docs","test":"test"},"gitHead":"0c21efa8d9de6f2549a0b578ecfb3639061a7aa4","_id":"spike-player@1.0.1","_nodeVersion":"18.3.0","_npmVersion":"8.11.0","dist":{"integrity":"sha512-zGWB4E7V7Zrf8MNTpHBdG3qk85/nTiGEPEEZqMHfWNgZzGDY5O+8tST98xtYVFhkCkVQmOa/GtuMdvbk9MwztQ==","shasum":"64d9497e591607c6cf8e71f14d306efb418db8ff","tarball":"https://registry.npmjs.org/spike-player/-/spike-player-1.0.1.tgz","fileCount":26,"unpackedSize":97447,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCnUEQAuYcnU3sxVABAwAEd/yqsB+Q4DdfXYQ1zzk2n6QIgDaRvwEC5Ax905fVPOz6VOCHpqsUqPvEplNbx9Skqbz0="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJitL3wACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqM0RAAiO6mMeQcPYBr8hxKI5DQvzIVbjV4cRLi6BDpFVYiI0PoCmFg\r\ngjVRp7C+nwxe5FQiJJ2rYDl7HNM251dXOnjTr6LYlXUgmbDOMNFuHS78gNq3\r\np/0w6v1SIbzaNmTe3pqPo/vMSgHprPXsdzMFijIGIe3QTINSeNfFAbyrOp57\r\nodpBTvZjiPJ7aKacIxviexXnQmm7Fqo52FZ/Y05uc3/c4PNm7Lss6GsxYjYJ\r\nTEzR7USgdrr5dOYNsP+G5brmothdk6QoWQrPw1vhpaOGazBTu63PRfq+ftox\r\nd2fR1hny1u0zZNV0bJMmMuuYFriNCEGB+7K2zY/ItB0Ursgy0GZjDr98ZhZQ\r\n0yoyLFX8INXhcqHWAJpVc+nZ+wSK+rnRRmfanrYUN5F1QaVVBtlZgIZbz7Qp\r\nkVh8PdWQkO1byW+hgZk0HT72iouxgL/4ynUMJRxTl90YePM2fo6BwxbxTE/A\r\n6j2DYQuxbIj5rq1GAnUnYqBxryfz1jTlbaI1nsbWjKAs+8NJwkjtTUnHAh4Z\r\n0zdJsEPP2QasttnVHhLA9oBycIuFWKluL0ZquctOLbHtWKWRHSQARofYkEof\r\nsYDSMMesow/foRYfO1eFHVwfl2GcGgZBjpsy5ia7Tg16lLnSGP/puFvlNrYc\r\nWNvCm39QrrgjcoOHKb7nJYL6+3o+I4hfkHo=\r\n=b8wC\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"spikebot","email":"abatallah1214@gmail.com"},"maintainers":[{"name":"spikebot","email":"abatallah1214@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spike-player_1.0.1_1656012272160_0.9863433043398437"},"_hasShrinkwrap":false},"1.1.0":{"name":"spike-player","version":"1.1.0","description":"Complete framework to facilitate music commands using discord.js v13","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","test":"jest test/test.js","docs:test":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml","docs":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml --output docs/docs.json"},"keywords":["music","player","bot","framework","discord","youtube","spotify","v13"],"dependencies":{"@discordjs/opus":"^0.6.0","@discordjs/voice":"^0.6.0","axios":"^0.22.0","axios-retry":"^3.2.0","discord-ytdl-core":"^5.0.4","domhandler":"^4.2.2","ffmpeg-static":"^4.4.0","htmlparser2":"^7.1.2","libsodium-wrappers":"^0.7.9","spotify-url-info":"^2.2.3","youtubei":"^0.0.1-rc.34","ytdl-core":"^4.9.1","ytsr":"^3.5.3"},"devDependencies":{"@babel/cli":"^7.14.8","@babel/core":"^7.15.0","@babel/preset-env":"^7.15.0","@babel/preset-typescript":"^7.15.0","@types/node":"^16.6.1","@typescript-eslint/eslint-plugin":"^4.29.1","@typescript-eslint/parser":"^4.29.1","assert-diff":"^3.0.2","discord.js":"^14.0.0-dev.1654776344-94bdcac","discord.js-docgen":"github:discordjs/docgen#ts-patch","eslint":"^7.32.0","jest":"^27.0.6","jsdoc-babel":"^0.5.0","ts-node":"^10.2.0","typescript":"^4.3.5"},"directories":{"doc":"docs","test":"test"},"gitHead":"1302e5061b42d30d3a38e91beae6d6e2edb4fb09","_id":"spike-player@1.1.0","_nodeVersion":"18.3.0","_npmVersion":"8.11.0","dist":{"integrity":"sha512-ohmMtD+jk6WsD9HooVe1XSv85oAP25Vu+sKZ3fWOij3x+xNaludorO4Cm9q6pc0/+HCHHhi4lySaedGGTUfNrQ==","shasum":"5cb913a8fcc0ec0d873ea4627ad3883824365394","tarball":"https://registry.npmjs.org/spike-player/-/spike-player-1.1.0.tgz","fileCount":26,"unpackedSize":97447,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEtTmIyxM+g04XWEKOfButghulkFkZ/rhyWqcXTtPvbIAiEAi8GLgY9dl16K5xLzeTML8OfVM8QsdRff+yW1dz9Vji4="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJivBFHACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrblQ/+MJgy9rchFpXSLTghKN1m4IccYbToLXLzKB+B62mPRJBmd+Lb\r\nOMfbfBkXztoa+opME7Es2V1fpXhx3N8njPQz5Ej/VWNgVSql8TSJXBsduNCN\r\nwGZ2sdRI91O1w5K82p6QYPSIryTGnTUglPryQ13vFtFQL5FnGssXXbszgSmE\r\nQ/Zy/KLmsAELL3oRU9vXu+5sKR38c7cl8NesyQS6UAf7+ztTWTsNCj7VKKNB\r\nAwSGuAUV1/TAezW4CkkF8aX8kBw5/MCNBB0VZIsE1Cn7IU93Ok+/FeGu97ev\r\n9JVOug56tsgGWd4XNstIPm5I+JWRtHMWbah0wln7ywk1gUK9UpC4m03LV80Q\r\nzcUvwUEzCa6ByQDXqWlPAl5TPw7Edjlyito/JvUAxdvqjq2FHFWJsI8P1wj5\r\nOZcRBZoIbnGwBM/li9NhNJjM5tVBcD3zPL6n+KtXH6vZH/+2PwzqJlH/hsgE\r\nEfnppDU8CC022Kvuu8DnnxIaG5RONOTdQxA5Pgc55QbjV7f/JlRUmKb3P7j2\r\nLO5kOIS4HX68vEsgWZ7MCqGNcHlgOIeQHURUPIHZ8pX5gF2TR2w0pP9oMkny\r\nSH4j8rbFDBUpK/0IueddEveTOYp4alxoFhdSRHR9juHfuKe0LqtjWo5/KlbE\r\nIQ4mgySfaWWQ1aNLl5zncDbXxPWohUzGmfI=\r\n=9GUg\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"spikebot","email":"abatallah1214@gmail.com"},"maintainers":[{"name":"spikebot","email":"abatallah1214@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spike-player_1.1.0_1656492359039_0.34987218455320357"},"_hasShrinkwrap":false},"1.1.1":{"name":"spike-player","version":"1.1.1","description":"Complete framework to facilitate music commands using discord.js v13","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","test":"jest test/test.js","docs:test":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml","docs":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml --output docs/docs.json"},"keywords":["music","player","bot","framework","discord","youtube","spotify","v13"],"dependencies":{"@discordjs/opus":"^0.6.0","@discordjs/voice":"^0.6.0","axios":"^0.22.0","axios-retry":"^3.2.0","discord-ytdl-core":"^5.0.4","domhandler":"^4.2.2","ffmpeg-static":"^4.4.0","htmlparser2":"^7.1.2","libsodium-wrappers":"^0.7.9","spotify-url-info":"^2.2.3","youtubei":"^0.0.1-rc.34","ytdl-core":"^4.9.1","ytsr":"^3.5.3"},"devDependencies":{"@babel/cli":"^7.14.8","@babel/core":"^7.15.0","@babel/preset-env":"^7.15.0","@babel/preset-typescript":"^7.15.0","@types/node":"^16.6.1","@typescript-eslint/eslint-plugin":"^4.29.1","@typescript-eslint/parser":"^4.29.1","assert-diff":"^3.0.2","discord.js":"^14.0.0-dev.1654776344-94bdcac","discord.js-docgen":"github:discordjs/docgen#ts-patch","eslint":"^7.32.0","jest":"^27.0.6","jsdoc-babel":"^0.5.0","ts-node":"^10.2.0","typescript":"^4.3.5"},"directories":{"doc":"docs","test":"test"},"gitHead":"8889eb2ee0dee7573dc5beecd98e37b29e0e858b","_id":"spike-player@1.1.1","_nodeVersion":"18.3.0","_npmVersion":"8.11.0","dist":{"integrity":"sha512-Fg6YwVriF+p7PItvJXCddj94a8wZQQjmv4dv3qV1nf+mPxRFjApnX7Zs/CJbFuhAzRaygauYp3ciexRUpOLrfA==","shasum":"43e9ef0f32194621efb0c42c30c55567300543cf","tarball":"https://registry.npmjs.org/spike-player/-/spike-player-1.1.1.tgz","fileCount":26,"unpackedSize":97447,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDbUGTaBPJ7voNNzMrOg/avBRuw3Grmtn7PEfNN0VlQdQIhAK06NFyWBMF/LJPteKOymsjb1BWwTNcX4X5F2hQghh08"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJivDC+ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr5dA//fVt9/gxlZfM5UOuQ8ZUy35taQAnquQyuvWV+DeEtJ6Q/DTka\r\nt7Fm3T2wz2m1AkkTECBaa7jHUfifquMnWu7s1NMLYT8vlE5NpKvooGhU+6BX\r\nOjUia09XxBPA+mYXNVCuc4lKjHQk6HG53GI1b2icd5oe3frBbOF4hsl5T7Yx\r\nV5hQOMA+n7+bdKs7wV3dWlxwB+06JB46EY9xwcH+jckKmNEgDzQYejkWi6CB\r\njQwDa6YIaIrVHj26qQhEzmHT6CucjiPPRrTyR1OyesYVYlNifyMC+y8uK0Iq\r\nMFQFVw4Kox6/jIoqkmczayi6W93FoacfWebzFmBLUSlBtii2eixUi92nZaWj\r\nFegmx0WItjZN6bYX7MfH4MiF3XGc3AfkhrxQWo3n4PYYwXZbfbD/v4oNybjf\r\nt7Sg6RR0v/fxxkmnG67tW1y7rGExoXAgBNWzcvyO8qvRhmxGIXHBp3zKgndY\r\nBA0jdfwQvAXnlM6XyGDXqg27s0xhhTokfSLVAuc9heJelMuntYWOkTESBst+\r\nIHyRV2D7DFWXsn1n5UwJhE/fIbyyKzDGoQhRgEhYDp4XL6qH7vSJ8KzjHN03\r\nBA1QKOXxzfDYtQcpYs/lvjCOROPJe4raTW+J/HUH8tbyqilsB7C6sGWayOpx\r\nhwZ3QOUvhOdchQ8jhlKZh880fCm1kIE08kE=\r\n=ppRk\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"spikebot","email":"abatallah1214@gmail.com"},"maintainers":[{"name":"spikebot","email":"abatallah1214@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spike-player_1.1.1_1656500414195_0.15454415284964385"},"_hasShrinkwrap":false},"1.1.1-dev":{"name":"spike-player","version":"1.1.1-dev","description":"Complete framework to facilitate music commands using discord.js v13","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","test":"jest test/test.js","docs:test":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml","docs":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml --output docs/docs.json"},"keywords":["music","player","bot","framework","discord","youtube","spotify","v13"],"dependencies":{"@discordjs/opus":"^0.6.0","@discordjs/voice":"^0.6.0","axios":"^0.22.0","axios-retry":"^3.2.0","discord-ytdl-core":"^5.0.4","domhandler":"^4.2.2","ffmpeg-static":"^4.4.0","htmlparser2":"^7.1.2","libsodium-wrappers":"^0.7.9","spotify-url-info":"^2.2.3","youtubei":"^0.0.1-rc.34","ytdl-core":"^4.9.1","ytsr":"^3.5.3"},"devDependencies":{"@babel/cli":"^7.14.8","@babel/core":"^7.15.0","@babel/preset-env":"^7.15.0","@babel/preset-typescript":"^7.15.0","@types/node":"^16.6.1","@typescript-eslint/eslint-plugin":"^4.29.1","@typescript-eslint/parser":"^4.29.1","assert-diff":"^3.0.2","discord.js":"^14.0.0-dev.1654776344-94bdcac","discord.js-docgen":"github:discordjs/docgen#ts-patch","eslint":"^7.32.0","jest":"^27.0.6","jsdoc-babel":"^0.5.0","ts-node":"^10.2.0","typescript":"^4.3.5"},"directories":{"doc":"docs","test":"test"},"gitHead":"4a987ce64bdc8d3fe4e77021661162b32cc110d8","_id":"spike-player@1.1.1-dev","_nodeVersion":"18.3.0","_npmVersion":"8.11.0","dist":{"integrity":"sha512-3C9n8qukFroZsHfFuXvftI/j9S5BFlwHk99DjwlCC65N4fwZB+P4IsnPrO5pJNq76A2hQFv1Jciv+TfhNU4tLQ==","shasum":"f8b313e21b295933b3434ef820615708933131f7","tarball":"https://registry.npmjs.org/spike-player/-/spike-player-1.1.1-dev.tgz","fileCount":26,"unpackedSize":97451,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGsAQqo+ql9kQKhSJgDmpXn9gZbtXf1+EcLQ5vvGqdyUAiAoaKRmV1cJjtfr0o8M5UReSQft0aVSsUYg8dlBpTZl4Q=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJivDyXACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoZ7g/8C0bA//WZDPEVUqXnXKPjm2PmSIHqC7JofRs8BOSqV9qe1xze\r\nUsFPfAuanfi6aAj6bIbPryXW13yqIowXxmzM7s8FLeZtk/L2BPQM/cQBybQs\r\nRLe5mt/FKsLewMOBpMSflxE3Kjd1WPG07V1svvXcl1rLcmgi/Is3JvBNu5sR\r\nc4aM4yzoCDsPtkLkkSew9YaWBUjq5G3RR8NM45l05/Xg0mymnLIcqfGgmvaf\r\nTppatyDq13UTWpHasonSV1tOisM+BgiRXaxu7nqPrnjTx0uHjqnyghhJsud9\r\nk14qOfR/epLiPmV3iplW7kPdU+ee8nSpRiAuN1Et4vceSAshOz7It4djFpxu\r\nxhS/ezlQZDpClfBU2SewLKbawb6AZTIvrKkPtgoKSchGTwzW3epJJbFZl8c7\r\nYXUp/vS7C5ti+Q5A1jgU3OlLG5adq7cA8QFzWR+AhveroXYNRfP3SKMmbSg8\r\nkbn4w0BH/MZ05Mm612TaZdc/dyIlDEOT0LiU1sTQM6PFzh4IwywcOWLi0/5M\r\n8XbH/7THVGx+JOfHts7ilULhJScQSsjpvkMQiW7IZzZLGSWIFPz8euRGClCH\r\nfQk09pZkLEOr+NUQbDSYSiwo/4FSC+DS7hAdfFlMcBbVmLZlhMM11OGdb6ai\r\nw7wEMagcSwDv8NjSVZPChJqtXiHJKlTEG3o=\r\n=4jqS\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"spikebot","email":"abatallah1214@gmail.com"},"maintainers":[{"name":"spikebot","email":"abatallah1214@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spike-player_1.1.1-dev_1656503446890_0.08348916693580488"},"_hasShrinkwrap":false},"1.1.2":{"name":"spike-player","version":"1.1.2","description":"Complete framework to facilitate music commands using discord.js v13","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","test":"jest test/test.js","docs:test":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml","docs":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml --output docs/docs.json"},"keywords":["music","player","bot","framework","discord","youtube","spotify","v13"],"dependencies":{"@discordjs/opus":"^0.6.0","@discordjs/voice":"^0.6.0","apple-music-metadata":"^2.0.0","axios":"^0.22.0","axios-retry":"^3.2.0","discord-ytdl-core":"^5.0.4","domhandler":"^4.2.2","ffmpeg-static":"^4.4.0","htmlparser2":"^7.1.2","libsodium-wrappers":"^0.7.9","spotify-url-info":"^2.2.3","youtubei":"^0.0.1-rc.34","ytdl-core":"^4.9.1","ytsr":"^3.5.3"},"devDependencies":{"@babel/cli":"^7.14.8","@babel/core":"^7.15.0","@babel/preset-env":"^7.15.0","@babel/preset-typescript":"^7.15.0","@types/node":"^16.6.1","@typescript-eslint/eslint-plugin":"^4.29.1","@typescript-eslint/parser":"^4.29.1","assert-diff":"^3.0.2","discord.js":"^14.0.0-dev.1654776344-94bdcac","discord.js-docgen":"github:discordjs/docgen#ts-patch","eslint":"^7.32.0","jest":"^27.0.6","jsdoc-babel":"^0.5.0","ts-node":"^10.2.0","typescript":"^4.3.5"},"directories":{"doc":"docs","test":"test"},"gitHead":"27f7c25153c12781b035b8bd77c25ccbc6ac7dac","_id":"spike-player@1.1.2","_nodeVersion":"18.3.0","_npmVersion":"8.11.0","dist":{"integrity":"sha512-szDA1DKeAk3IfEIxriJfH+WO8GB/5W9T/Lhoz2dKE2zoBmfi2M9tVj6z95Gd3WyncfzK3DLmQaaUTlljAjf1bQ==","shasum":"252d65594990e8984965af7e05ce60a02177e896","tarball":"https://registry.npmjs.org/spike-player/-/spike-player-1.1.2.tgz","fileCount":26,"unpackedSize":97698,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCEW3aVMvxzkJPCTSpJKhoafVP+jLGyQw8IlERtfc6brAIhAP1EQq/r1NndAWsWXAgM8eYdNktGrrYPf80OKtfmyno3"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiv/69ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpZRw//e+nMci0+1CCP/RbaJDZbTvtf9NUjDEaVkcJ9D2EI5eEVZ8FR\r\nANjs0ECG/Ac1A0g/FuUHkl6lodr2WGGwJ3jlPELP5KrWdvUJyd17cAkvIqZI\r\ngJ8283bY8S1njPPfcjQu+4AQHickmpYFkfHSdyI8TBD9G2wo68vQR6K05gwZ\r\nljLnXrcJGAIMoiLbIkmkFLczUF2lJqWPMN+grFChfLK0s7bt1Bg1mgwazHAj\r\njpgZkmK6PSgAmmeFvPO6k8RLb2nxu6ksab9oBKkwg7DLS6yyPiw2RRnJqaEC\r\nMlSUzu/MCtzcy8H0KKjaeSrAKAqCS0ppDOQO6mCdTKwDPCo7DQ2lONrJ6j3K\r\nwDF2VK5urjETB0oasSJJS3LqoxAjfxTJx/ga1WExsi5AJGlfGHyghWIIHwXF\r\nNSCjhALp3tDpb97PzpN9CUvDzOHIFgF6aIrDbKXg67kisse+OCe0noYDKTYV\r\nSHlj6AK82h2Z9DWVm3JWqGsvL9f3T4+42L+G0M7Zoq0kVFwf/w5vvH6eV0vF\r\nTXKV+pvKqgkQgfZe8OebaU2uj28Q5gRaRzsBnT9Grfehs43xuLlnUgEVVmYR\r\n1GbiyqbYmLzmc6MPNvKgR+4A8n2yBQnjRRbVVKs4LNbIuX1lXn8T0DT0WARX\r\nWRJosUvZrAnaTbWfWU7XlNjrAddENfWb57c=\r\n=Z96g\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"spikebot","email":"abatallah1214@gmail.com"},"maintainers":[{"name":"spikebot","email":"abatallah1214@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spike-player_1.1.2_1656749757668_0.2999367035277287"},"_hasShrinkwrap":false,"deprecated":"This version is outdated, a new version handling many new stream connections is up. Run npm i spike-player@latest"},"1.1.3":{"name":"spike-player","version":"1.1.3","description":"Complete framework to facilitate music commands using discord.js v13","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","test":"jest test/test.js","clean":"rimraf dist","prep":"npm run clean && npm run build","pub":"npm version patch --force && npm publish","docs:test":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml","docs":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml --output docs/docs.json"},"keywords":["music","player","bot","framework","discord","youtube","spotify","v13"],"dependencies":{"@discordjs/opus":"^0.8.0","@discordjs/voice":"^0.10.0","apple-music-metadata":"^2.0.0","axios":"^0.27.2","axios-retry":"^3.3.1","discord-ytdl-core":"^5.0.4","domhandler":"^5.0.3","ffmpeg-static":"^5.0.2","htmlparser2":"^8.0.1","libsodium-wrappers":"^0.7.10","rimraf":"^3.0.2","spotify-url-info":"^3.1.2","youtubei":"^0.0.1-rc.36","ytdl-core":"^4.11.0","ytsr":"^3.8.0"},"devDependencies":{"@babel/cli":"^7.18.6","@babel/core":"^7.18.6","@babel/preset-env":"^7.18.6","@babel/preset-typescript":"^7.18.6","@types/node":"^18.0.3","@typescript-eslint/eslint-plugin":"^5.30.5","@typescript-eslint/parser":"^5.30.5","assert-diff":"^3.0.2","discord.js":"^14.0.0-dev.1654776344-94bdcac","discord.js-docgen":"github:discordjs/docgen#ts-patch","eslint":"^8.19.0","jest":"^28.1.2","jsdoc-babel":"^0.5.0","ts-node":"^10.8.2","typescript":"^4.7.4"},"directories":{"doc":"docs","test":"test"},"gitHead":"1a23012ac443a2f950474fc25da3c80c1b512b45","_id":"spike-player@1.1.3","_nodeVersion":"18.3.0","_npmVersion":"8.11.0","dist":{"integrity":"sha512-Ih81cL/ECLnCPMt70urNTcFdXcrEr7oQ3SjKtVwmW8Xk0lzSd3SVUJLQKdWLk6/dy61NECj6UnhbO5kaIYP6gg==","shasum":"76b0dc1b4a53605c7101726fe4fe4d6f1aa19536","tarball":"https://registry.npmjs.org/spike-player/-/spike-player-1.1.3.tgz","fileCount":26,"unpackedSize":98152,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDdE7HrEMxjknqQwfGpEgXe9rccGPTmEXlDGMDhCWsFBgIgGIspkDQQx9gr+U+zWp+5oddqTXgT0sF9N7UmmCZVVoE="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJixy14ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrLEg/+KF2HWKUD/qIZoXB1Ofmh8y4cQl4jegCJOOzc7MaCDTSzCvNL\r\nfMO0qgvyD77Nmh2FBN0gMiMfypHITL7BPUpRHNBuuWM7Xwq4Wun1mWrmF2jI\r\n8gFQmDmzMjtUCgPqcLp/svZKByM9idAJDQaDJaKoMlpqfqvawE80k2SgcPAV\r\nwYkmRqqzyu/OzvekIEzaH9doSj+5pnPvMOJ85AOUOcQOYq6cXX17uD7MyCp9\r\nl05aLu37bvZlHU660XbjY82ZAjhkm2zvviayb2dC+5DIpWvvXbRZ1bAn8DS8\r\n8H39CjrFHCMzI/sJzVnRaYfzwQoxwKXjjQ5kYFLZYXMxv2D0j2NBaCc/4JOY\r\nxNHYHtvzzCxlMbDHLcGvozVlKsadIVPgzkj1tC1nHi0IOYwoKNYkohIysJsM\r\naJfv0oQfaujmJXALvkUZ/oBAoVLK8LNZzKR+fwpS1qBJ1M8/hwjV4SNiRvEk\r\ncl209Bn6ZyVIzGd4Yph1+UFy8Ehz322r9/2u4lXxMeEypHmWZlQ0jKiUraCx\r\n2799XlJm/lPcsy2LnKlnL7Oj8fxodGZeFt0IJQ/VFeO9JA8b8sEm6XXPDn4Q\r\ncLMhOULc9o6Hbx/k6L0wAQyC4dnAzt4xQmUSqwxaxBAeqlRX+5DvpP0CH8Sn\r\neEGEMGiqpI42WorLoD9+CykSALiyiutf+eg=\r\n=jOrl\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"spikebot","email":"abatallah1214@gmail.com"},"maintainers":[{"name":"spikebot","email":"abatallah1214@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spike-player_1.1.3_1657220472311_0.818347945224053"},"_hasShrinkwrap":false},"1.2.0":{"name":"spike-player","version":"1.2.0","description":"Complete framework to facilitate music commands using discord.js v13","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"husky install && tsc","test":"jest test/test.js","clean":"rimraf dist","prep":"npm run clean && npm run build","pub":"standard-version && npm publish","docs:test":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml","docs":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml --output docs/docs.json"},"keywords":["music","player","bot","framework","discord","youtube","spotify","v13"],"dependencies":{"@discordjs/opus":"^0.8.0","@discordjs/voice":"^0.10.0","apple-music-metadata":"^2.0.0","axios":"^0.27.2","axios-retry":"^3.3.1","discord-ytdl-core":"^5.0.4","domhandler":"^5.0.3","ffmpeg-static":"^5.0.2","htmlparser2":"^8.0.1","libsodium-wrappers":"^0.7.10","rimraf":"^3.0.2","spotify-url-info":"^3.1.2","youtubei":"^0.0.1-rc.36","ytdl-core":"^4.11.0","ytsr":"^3.8.0"},"devDependencies":{"@babel/cli":"^7.18.6","@babel/core":"^7.18.6","@babel/preset-env":"^7.18.6","@babel/preset-typescript":"^7.18.6","@types/node":"^18.0.3","@typescript-eslint/eslint-plugin":"^5.30.5","@typescript-eslint/parser":"^5.30.5","assert-diff":"^3.0.2","discord.js":"^14.0.0-dev.1657152699-10ba008","discord.js-docgen":"github:discordjs/docgen#ts-patch","eslint":"^8.19.0","husky":"^8.0.1","jest":"^28.1.2","jsdoc-babel":"^0.5.0","standard-version":"^9.5.0","ts-node":"^10.8.2","typescript":"^4.7.4"},"directories":{"doc":"docs","test":"test"},"gitHead":"66d7aa647771aacca1f0c0c1e0c3cd2d3b95ba57","_id":"spike-player@1.2.0","_nodeVersion":"18.3.0","_npmVersion":"8.11.0","dist":{"integrity":"sha512-mplkwmrv4kDQIYEbjQ/WfhTtEWhGbjmh+wSkqoZbEFwwR0O6uHwA1eSl/y7r8rfceDGKWoCBmrTFS8JVtVj8Kg==","shasum":"10509d9668224ac7d28427c97a8192212c83336c","tarball":"https://registry.npmjs.org/spike-player/-/spike-player-1.2.0.tgz","fileCount":27,"unpackedSize":98895,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCID9edIZ1xR3SBER8Y2W+1dxFOxEZJ8KWQbNNfpcsLYzvAiAuJ9+NPPCT5DI5NbthxIUEJSMf72fbJqdaxLd+9CrSAw=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJixzbGACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmocLxAAgFyHfNwdAOcpMt8hEB7IIWK7MiR5qgghrqD4RSiWTtXPw4Za\r\nmh40JBKB6BRVdknr5lfZXJ9fcpjnTHvTDxINNYUfuReL9ILYLUi42VIbtBo9\r\n1AGsamINsy5BmcXQO6H0nPskM8Uu5RF0S7RwH0zSAlNGcVjlLZTvQTsoyqvJ\r\nDick2Cm9R9DqUadNnohgKTX/AlcxqzKEU1tWkH3aI11U43GVtq+2z/iuShj9\r\nry4dR4s8JEiCFWmym4maGC5UFF2hNnMHfswZw8kzjyo++uA18OEZoEQfTh0G\r\nWKraJpO7ZJt6I8VGIpJOzadcVAoTGhfoPjUzj9R53DTUMRs/R1N07uB/Eo7S\r\nGqvmmra8koqWzms+DQlmz5ujW+SdCFd64+9W5wX7qArI45ftNhOa+oX6+irB\r\nf27U7yAnJ8JeKvcP4cPhbqiuvO/Q6OM956SVWesgP+xSMbWMX/DOqz76bipb\r\n12i8w9O+1D8lsHlT2zhnwKiKH35yy8xC3emjt4UGF1Qvs4yanCwQ6Sa2+Rta\r\n7J1xtYO6gq1LEsCBXZ8J65+EYbeYn2mjmu91bU8PLF+DVGXiqtjAOVEEGjPU\r\nmQ9trgs9sIA94COmhIXgVg0tTQB4YA4X03hW5bR75z7BTXuZf4Ple38Z+aJY\r\nruvYSKXmEOx5FbPvcN5v1uQciNyL8D5LlQ0=\r\n=ke9J\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"spikebot","email":"abatallah1214@gmail.com"},"maintainers":[{"name":"spikebot","email":"abatallah1214@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spike-player_1.2.0_1657222854178_0.9872154955195231"},"_hasShrinkwrap":false},"1.2.1":{"name":"spike-player","version":"1.2.1","description":"Complete framework to facilitate music commands using discord.js v13","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"husky install && tsc","test":"jest test/test.js","clean":"rimraf dist","prep":"npm run clean && npm run build","pub":"standard-version && npm publish","docs:test":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml","docs":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml --output docs/docs.json"},"keywords":["music","player","bot","framework","discord","youtube","spotify","v13"],"dependencies":{"@discordjs/opus":"^0.8.0","@discordjs/voice":"^0.10.0","apple-music-metadata":"^2.0.0","axios":"^0.27.2","axios-retry":"^3.3.1","discord-ytdl-core":"^5.0.4","domhandler":"^5.0.3","ffmpeg-static":"^5.0.2","htmlparser2":"^8.0.1","libsodium-wrappers":"^0.7.10","rimraf":"^3.0.2","spotify-url-info":"^2.2.3","youtubei":"^0.0.1-rc.36","ytdl-core":"^4.11.0","ytsr":"^3.8.0"},"devDependencies":{"@babel/cli":"^7.18.6","@babel/core":"^7.18.6","@babel/preset-env":"^7.18.6","@babel/preset-typescript":"^7.18.6","@types/node":"^18.0.3","@typescript-eslint/eslint-plugin":"^5.30.5","@typescript-eslint/parser":"^5.30.5","assert-diff":"^3.0.2","discord.js":"^14.0.0-dev.1657152699-10ba008","discord.js-docgen":"github:discordjs/docgen#ts-patch","eslint":"^8.19.0","husky":"^8.0.1","jest":"^28.1.2","jsdoc-babel":"^0.5.0","standard-version":"^9.5.0","ts-node":"^10.8.2","typescript":"^4.7.4"},"directories":{"doc":"docs","test":"test"},"gitHead":"ef6acce4cf4aefaa83cfa872151337d3e22cd14e","_id":"spike-player@1.2.1","_nodeVersion":"18.3.0","_npmVersion":"8.11.0","dist":{"integrity":"sha512-9DPzQ0R2pakKwrOZYmClY84riFLF4VtvupDZZHdwJ+Opt3mPeXYckHwH9prbwQ3y95kMpcZWkDl3E9I7d9sRGw==","shasum":"86d91bdb4b5cb34cb1cf6441ebd631c44898e32c","tarball":"https://registry.npmjs.org/spike-player/-/spike-player-1.2.1.tgz","fileCount":27,"unpackedSize":98990,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDaTIR4+9PgHvBVHb7IziHG7eA5CvdsVEhcJv1m8iUtqgIhANfkCxUm3OVNdf2oxF5s+JkUJoA4+HHJfbYmAd2qegE6"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiyVVAACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr4CA/9EfziD4oxfywjgXDn9FsItcSGn82071Aoyk1bmUIEd80eC7j4\r\n70sXjodAM32/z1dKUVI6EgPUxW3rVbTrfc/epZ9ylfSPaEnw33hj1oxqVMON\r\nCF7xEuU40P8T63XTu7y5krSaTuGoxqAqTsiueMcBM7D74IoguE0vXH/thII6\r\noiQ8GY0e+yQfjEhPRnglJkGfQMQOfOg5azsM+pu6+BdICyVakRFbI4nZn7u0\r\nR7TT9GI2N1F9a5/XiicfwBfiZUTzBvIsZMsZElnfAW9v/NvZNRUIK3czdqkK\r\n3nDeduFDoqLDKXPaOxD/SJh5VJqKfyM7K78A/bNNYOlZo6vv0rVoZfs7coGY\r\nC54KeOJZLVfJAT2cQ5x7Uxx1RnXqJc+qZQi7IuB1NYyamzIEYgpEY+ISWWzj\r\nuOfeey4WZovXCvII/GXAKojukZ2lsl/T8TfidBGQ0O8KiIWQC+GODkExTUMk\r\nDDFbHR7r+Sr277Z3gcCnxrzPK0BjcCw0MrI+ljjftEmmrHnCFJBdU7a59PwH\r\nk8sw07LsxArAwkUzVvzAUIlbwqokE1kWZSZWS/bimzeYpSfm9/AEWpFds5FJ\r\nnRWAeUhcGqBA/iBBbJewsZ33EZ5nZ+wJT/1zCoRy1JBccCSYJciUPCfZL3aw\r\ndCZ3lkPnlD781cNmoYRzqyFzGXOTH0ts1lM=\r\n=EW9B\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"spikebot","email":"abatallah1214@gmail.com"},"maintainers":[{"name":"spikebot","email":"abatallah1214@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spike-player_1.2.1_1657361728059_0.3585302902558689"},"_hasShrinkwrap":false},"1.2.2":{"name":"spike-player","version":"1.2.2","description":"Complete framework to facilitate music commands using discord.js v13","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"husky install && tsc","test":"jest test/test.js","clean":"rimraf dist","prep":"npm run clean && npm run build","pub":"standard-version && npm publish","docs:test":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml","docs":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml --output docs/docs.json"},"keywords":["music","player","bot","framework","discord","youtube","spotify","v13"],"dependencies":{"@discordjs/opus":"^0.8.0","@discordjs/voice":"^0.10.0","apple-music-metadata":"^2.0.0","axios":"^0.22.0","axios-retry":"^3.2.0","discord-ytdl-core":"^5.0.4","domhandler":"^4.2.2","ffmpeg-static":"^4.4.0","htmlparser2":"^7.1.2","libsodium-wrappers":"^0.7.9","rimraf":"^3.0.2","spotify-url-info":"^2.2.3","youtubei":"^0.0.1-rc.34","ytdl-core":"^4.9.1","ytsr":"^3.5.3"},"devDependencies":{"@babel/cli":"^7.14.8","@babel/core":"^7.15.0","@babel/preset-env":"^7.15.0","@babel/preset-typescript":"^7.15.0","@types/node":"^16.6.1","@typescript-eslint/eslint-plugin":"^4.29.1","@typescript-eslint/parser":"^4.29.1","assert-diff":"^3.0.2","discord.js":"^14.0.0-dev.1654776344-94bdcac","discord.js-docgen":"github:discordjs/docgen#ts-patch","eslint":"^7.32.0","jest":"^27.0.6","jsdoc-babel":"^0.5.0","ts-node":"^10.2.0","typescript":"^4.3.5"},"directories":{"doc":"docs","test":"test"},"gitHead":"248c90cc45e2874a43b4ae81a9a697677b233f52","_id":"spike-player@1.2.2","_nodeVersion":"18.3.0","_npmVersion":"8.11.0","dist":{"integrity":"sha512-wEiYk1IoyO0q90J2UDgdFvtdFffTTlT3cP9mIkizqfxR9V2Wr2bPYoj35T1OuDLwczcmYG8OJpQ/O1ql3sijPA==","shasum":"8ad1648b48cb1bed03f453f0d4f7209fac5d6f82","tarball":"https://registry.npmjs.org/spike-player/-/spike-player-1.2.2.tgz","fileCount":27,"unpackedSize":99016,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDhfPMI1a0awxBIaziOVMuMzYoDXciPcxIkudAYeYrYwQIhAOrmKOM8E9dnnzNYg7Eepqm4bU/LKIqjZsCl3LKuHF98"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiyVb9ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpAaQ//QweCZSOzNx512xgqJSIK0tOX3yeQmrBdSKTdVCwkSBikOjBZ\r\nKrVPqQEoCKgFkyesRe3EigZXu462IL3ORJgZCpudWzVpT/MlWB/JCDNKTecT\r\nENAQDwy1Qi2DPHwITTClbMeFvSphTQUJWyYaSH5z/FbHQOv7sb5XGx0qzamq\r\nrSn0dwM3Sc50lNw13obX50hHpu2BZjfDKk9qsG7pwzh3bEa6JdKOY/3Rc3wD\r\nr1thxUAczHFa+XPlJ1W6C/x7iHX+DsPhUpAsivw7/2xvZIL1ygn3d6mcPmtr\r\neo0YsVh2kzpPCSe/ww29MK813uDZq7bXFadlfn2W7CdkO2i8XvD9PJUa4Vgy\r\nPwtC9eEZHqLlJK0ghcbjHMKfAIKqXVULpyr6K4lATJTrlT963qc0OTF7fRXB\r\n+5YF+D9Jibc+x635hZ/R7BKRPOBYQ1WhFayXX/qaON2QCvligYor5ZuYC0r5\r\nMAZpvtZSvd5SzCctfozT8Wx8MDSzRVDsFFihMLpCTnnM78iv1rUdhwdK9Sdk\r\nD/q7TTmR3fNsL1abC0e9mtJy5oiuqLA6kbik2QnjNCwAdPm/9n42j/Vp75fw\r\nNClz3aaUYuUrpxCvjAW1LgdwNU02gA7l5kCKAFU5OBM5T2wvvAm96wo31c+q\r\nRnz6ZYyWTYfRJ0H4/Tdd+o5eHu5MtH6DZJE=\r\n=pgiu\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"spikebot","email":"abatallah1214@gmail.com"},"maintainers":[{"name":"spikebot","email":"abatallah1214@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spike-player_1.2.2_1657362173215_0.05227781048873337"},"_hasShrinkwrap":false},"1.2.3-0":{"name":"spike-player","version":"1.2.3-0","description":"Complete framework to facilitate music commands using discord.js v13","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"husky install && tsc","test":"jest test/test.js","clean":"rimraf dist","pre":"npm publish --tags dev","prep":"npm run clean && npm run build","pub":"standard-version && npm publish","docs:test":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml","docs":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml --output docs/docs.json"},"keywords":["music","player","bot","framework","discord","youtube","spotify","v13"],"dependencies":{"@discordjs/opus":"^0.8.0","@discordjs/voice":"^0.10.0","apple-music-metadata":"^2.0.0","axios":"^0.22.0","axios-retry":"^3.2.0","discord-ytdl-core":"^5.0.4","domhandler":"^4.2.2","ffmpeg-static":"^4.4.0","htmlparser2":"^7.1.2","libsodium-wrappers":"^0.7.9","rimraf":"^3.0.2","spotify-url-info":"^2.2.3","youtubei":"^0.0.1-rc.34","ytdl-core":"^4.9.1","ytsr":"^3.5.3"},"devDependencies":{"@babel/cli":"^7.14.8","@babel/core":"^7.15.0","@babel/preset-env":"^7.15.0","@babel/preset-typescript":"^7.15.0","@types/node":"^16.6.1","@typescript-eslint/eslint-plugin":"^4.29.1","@typescript-eslint/parser":"^4.29.1","assert-diff":"^3.0.2","discord.js":"^14.0.0-dev.1654776344-94bdcac","discord.js-docgen":"github:discordjs/docgen#ts-patch","eslint":"^7.32.0","jest":"^27.0.6","jsdoc-babel":"^0.5.0","ts-node":"^10.2.0","typescript":"^4.3.5"},"directories":{"doc":"docs","test":"test"},"readme":"# Discord Music Player\r\n![npm](https://img.shields.io/npm/dt/discord-music-player?style=for-the-badge)\r\n![npm](https://img.shields.io/npm/v/discord-music-player?style=for-the-badge)\r\n![CodeFactor Grade](https://img.shields.io/codefactor/grade/github/SushiBtw/discord-music-player?color=%2348aaf1&style=for-the-badge)\r\n\r\n### Note: This is the v8 version of Discord Music Player for Discord.JS v13!\r\n\r\nDiscord Music Player is a powerful [Node.js](https://nodejs.org) module that allows you to easily implement music commands.\r\n**Everything** is customizable, and everything can be done using this package - **there are no limitations!**\r\n\r\nThis package supports YouTube Videos & Playlists, Spotify Songs & Playlists, Apple Music Songs & Playlists.\r\nPackage from version v7.0.0 is fully maintained by [SushiBtw](https://github.com/SushiBtw).\r\n\r\n### Requirements:\r\n- [Discord.js v13](https://www.npmjs.com/package/discord.js),\r\n- [Node.JS v16](https://nodejs.org/),\r\n\r\n# Installation\r\n*Node.JS v16 or newer is required to run this module.*\r\n```sh\r\nnpm install --save discord-music-player\r\n```\r\nInstall **@discordjs/opus**:\r\n```sh\r\nnpm install --save @discordjs/opus\r\n```\r\n**Install [FFMPEG](https://www.ffmpeg.org/download.html)!**\r\n\r\n# Documentation\r\n**Discord Music Player documentation: [https://discord-music-player.js.org/](https://discord-music-player.js.org/)**\r\n\r\n### **Need some help?**\r\nFeel free to join [Discord-Music-Player Discord Server](https://discord.gg/6fejZNsmFC) and ask us about DMP.\r\n\r\n# Getting Started\r\n**The code bellow, will show you how to use DMP in your code.**\r\n\r\n*Please define your **Player** after the **client/bot** definition.*\r\n\r\n[!] Remember to include the related voice **Intents** at the client options. [!]\r\n```js\r\nconst Discord = require(\"discord.js\");\r\nconst client = new Discord.Client({\r\n    intents: [Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES, Intents.FLAGS.GUILD_VOICE_STATES]\r\n});\r\nconst settings = {\r\n    prefix: '!',\r\n    token: 'YourBotTokenHere'\r\n};\r\n\r\nconst { Player } = require(\"discord-music-player\");\r\nconst player = new Player(client, {\r\n    leaveOnEmpty: false, // This options are optional.\r\n});\r\n// You can define the Player as *client.player* to easily access it.\r\nclient.player = player;\r\n\r\nclient.on(\"ready\", () => {\r\n    console.log(\"I am ready to Play with DMP 🎶\");\r\n});\r\n\r\nclient.login(settings.token);\r\n```\r\n\r\n# Example Usage\r\n```js\r\nconst { RepeatMode } = require('discord-music-player');\r\n\r\nclient.on('messageCreate', async (message) => {\r\n    const args = message.content.slice(settings.prefix.length).trim().split(/ +/g);\r\n    const command = args.shift();\r\n    let guildQueue = client.player.getQueue(message.guild.id);\r\n\r\n    if(command === 'play') {\r\n        let queue = client.player.createQueue(message.guild.id);\r\n        await queue.join(message.member.voice.channel);\r\n        let song = await queue.play(args.join(' ')).catch(_ => {\r\n            if(!guildQueue)\r\n                queue.stop();\r\n        });\r\n    }\r\n\r\n    if(command === 'playlist') {\r\n        let queue = client.player.createQueue(message.guild.id);\r\n        await queue.join(message.member.voice.channel);\r\n        let song = await queue.playlist(args.join(' ')).catch(_ => {\r\n            if(!guildQueue)\r\n                queue.stop();\r\n        });\r\n    }\r\n\r\n    if(command === 'skip') {\r\n        guildQueue.skip();\r\n    }\r\n\r\n    if(command === 'stop') {\r\n        guildQueue.stop();\r\n    }\r\n\r\n    if(command === 'removeLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.DISABLED); // or 0 instead of RepeatMode.DISABLED\r\n    }\r\n\r\n    if(command === 'toggleLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.SONG); // or 1 instead of RepeatMode.SONG\r\n    }\r\n\r\n    if(command === 'toggleQueueLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.QUEUE); // or 2 instead of RepeatMode.QUEUE\r\n    }\r\n\r\n    if(command === 'setVolume') {\r\n        guildQueue.setVolume(parseInt(args[0]));\r\n    }\r\n\r\n    if(command === 'seek') {\r\n        guildQueue.seek(parseInt(args[0]) * 1000);\r\n    }\r\n\r\n    if(command === 'clearQueue') {\r\n        guildQueue.clearQueue();\r\n    }\r\n\r\n    if(command === 'shuffle') {\r\n        guildQueue.shuffle();\r\n    }\r\n\r\n    if(command === 'getQueue') {\r\n        console.log(guildQueue);\r\n    }\r\n\r\n    if(command === 'getVolume') {\r\n        console.log(guildQueue.volume)\r\n    }\r\n\r\n    if(command === 'nowPlaying') {\r\n        console.log(`Now playing: ${guildQueue.nowPlaying}`);\r\n    }\r\n\r\n    if(command === 'pause') {\r\n        guildQueue.setPaused(true);\r\n    }\r\n\r\n    if(command === 'resume') {\r\n        guildQueue.setPaused(false);\r\n    }\r\n\r\n    if(command === 'remove') {\r\n        guildQueue.remove(parseInt(args[0]));\r\n    }\r\n\r\n    if(command === 'createProgressBar') {\r\n        const ProgressBar = guildQueue.createProgressBar();\r\n        \r\n        // [======>              ][00:35/2:20]\r\n        console.log(ProgressBar.prettier);\r\n    }\r\n})\r\n```\r\n\r\n### Events:\r\n```js\r\n// Init the event listener only once (at the top of your code).\r\nclient.player\r\n    // Emitted when channel was empty.\r\n    .on('channelEmpty',  (queue) =>\r\n        console.log(`Everyone left the Voice Channel, queue ended.`))\r\n    // Emitted when a song was added to the queue.\r\n    .on('songAdd',  (queue, song) =>\r\n        console.log(`Song ${song} was added to the queue.`))\r\n    // Emitted when a playlist was added to the queue.\r\n    .on('playlistAdd',  (queue, playlist) =>\r\n        console.log(`Playlist ${playlist} with ${playlist.songs.length} was added to the queue.`))\r\n    // Emitted when there was no more music to play.\r\n    .on('queueDestroyed',  (queue) =>\r\n        console.log(`The queue was destroyed.`))\r\n    // Emitted when the queue was destroyed (either by ending or stopping).    \r\n    .on('queueEnd',  (queue) =>\r\n        console.log(`The queue has ended.`))\r\n    // Emitted when a song changed.\r\n    .on('songChanged', (queue, newSong, oldSong) =>\r\n        console.log(`${newSong} is now playing.`))\r\n    // Emitted when a first song in the queue started playing.\r\n    .on('songFirst',  (queue, song) =>\r\n        console.log(`Started playing ${song}.`))\r\n    // Emitted when someone disconnected the bot from the channel.\r\n    .on('clientDisconnect', (queue) =>\r\n        console.log(`I was kicked from the Voice Channel, queue ended.`))\r\n    // Emitted when deafenOnJoin is true and the bot was undeafened\r\n    .on('clientUndeafen', (queue) =>\r\n        console.log(`I got undefeanded.`))\r\n    // Emitted when there was an error in runtime\r\n    .on('error', (error, queue) => {\r\n        console.log(`Error: ${error} in ${queue.guild.name}`);\r\n    });\r\n```\r\n\r\n# Passing custom data\r\n\r\n### Queue\r\nWhile running the `Queue#createQueue()` method you can pass a `options#data` object to hold custom data.\r\nThis can be made in two ways:\r\n```js\r\n// Pass custom data\r\nawait player.createQueue(message.guild.id, {\r\n    data: {\r\n        queueInitMessage: message,\r\n        myObject: 'this will stay with the queue :)',\r\n        more: 'add more... there are no limitations...'\r\n    }\r\n});\r\n// Or by using\r\nqueue.setData({\r\n    whatever: 'you want :D'\r\n});\r\n\r\n// Access custom data\r\nlet queue = player.getQueue(message.guild.id);\r\nlet initMessage = queue.data.queueInitMessage;\r\nawait initMessage.channel.send(`This message object is hold in Queue :D`);\r\n```\r\n\r\n### Song or Playlist\r\nWhile running the `Queue#play()`/Queue#playlist() method you can pass a `options#data` object to hold custom data.\r\nThis can be made in two ways:\r\n```js\r\n// Play the song\r\nlet song = await queue.play('Born in the USA!');\r\n// Set song data\r\nsong.setData({\r\n    initMessage: message\r\n});\r\n\r\n// Play the playlist\r\nlet playlist = await queue.playlist('https://www.youtube.com/playlist?list=PLDLGxnP4y2mGKGEqwxWTRkd3HtrrVTMdU');\r\n// Set playlist data (will set data for each song in the playlist)\r\nsong.setData({\r\n    initMessage: message\r\n});\r\n\r\n// Access custom data\r\nlet queue = player.getQueue(message.guild.id);\r\nlet { initMessage } = queue.nowPlaying.data;\r\nawait initMessage.channel.send(`This message object is hold in Song :D`);\r\n```\r\n","readmeFilename":"README.md","gitHead":"b0e27d0854a6689a564b13424ff2ab60dd7b135f","_id":"spike-player@1.2.3-0","_nodeVersion":"18.3.0","_npmVersion":"8.11.0","dist":{"integrity":"sha512-lUJbOhCgnTVmOxpPczTSzABwSb5TG2EOMP4tlNp2mW+uMAzVhl7wz9uUx/rTAsUnPCSCSkA9MNLt2Vdo4qavTA==","shasum":"756dfbaa1b06fc339d27601a34914775d217b833","tarball":"https://registry.npmjs.org/spike-player/-/spike-player-1.2.3-0.tgz","fileCount":27,"unpackedSize":98927,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD+GZDAKiVOMG3cVQ+vvhJSjteKgFg8NSmAwBzIXwXW4QIhAPzqPMjTeGOflD3tUFDmsjGO+iXXyMIdlUlVyWx5+1+y"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiyXysACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmozTQ//Rk3QvyHkolybBTkv+U3GIKsoRncIYr2PmBI/xhRDK+b/vFRu\r\nYOOSangLrC/f/2ViAz2R/xMCq3NjcIWybyy3F4iBIyzDUXgg+MdtLWOap2D2\r\naNh+qsetSPiVG8nPIB/Hfof8VI/jVAYlS5/gi8P7GcU/so+52SRBC4T6svC/\r\noIqFpNpmMfQXir6zUZLuCPPf3KuTF1n9gEH0XuQqOAvRzjgBaA0y1dnQZRal\r\nB35hoiE0TsqP3apD5kIeiXhwoM5sRwEAA0RFGsrRVPcjTn5OjQ1VuBSGXBV5\r\nQiaSTxTRgd8/1ybFEz4TBF24eSlbMDqQWV6QC48oKrTLufuNOwpFlUd0f9vZ\r\ntXpkP+ksYbyF7nrhTtruyUaAUVn6ssBAnQZEHLkqi7mHs7w1ldjwZtFUqwaD\r\ni/iLIRNV/JJbr2ctDIzy2jQi2dRdj8lDcz02SsTFflXkEmKh8p9m5pq5SKXv\r\nGzFsxwBMoZChwwj4sA2WtLHe6PYJKt0vNw8obJ3iK3uEJIWP2a9nC/Yp/0a9\r\nkd3M2lX3UJXJqGXuKPHVS0yP7tgox0rMmaZEcblSp7rgRt+8yXDx3MkLSEET\r\ncJlhG06mOnvBCf2Mb/1DcdIp8X0Cg36lxZ46YuXdWnQsAt8swdxRMYZx4T2O\r\n2/GfztRUxE4IhfeEaphwAfRS9PWA0ZjaNHg=\r\n=qkuL\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"spikebot","email":"abatallah1214@gmail.com"},"maintainers":[{"name":"spikebot","email":"abatallah1214@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spike-player_1.2.3-0_1657371820306_0.7541093393133016"},"_hasShrinkwrap":false},"1.2.4-1":{"name":"spike-player","version":"1.2.4-1","description":"Complete framework to facilitate music commands using discord.js v13","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"husky install && tsc","test":"jest test/test.js","clean":"rimraf dist","pre":"npm version prerelease --force && npm publish --access public --tag dev","prep":"npm run clean && npm run build","pub":"standard-version && npm publish","docs:test":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml","docs":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml --output docs/docs.json"},"keywords":["music","player","bot","framework","discord","youtube","spotify","v13"],"dependencies":{"@discordjs/opus":"^0.8.0","@discordjs/voice":"^0.10.0","apple-music-metadata":"^2.0.0","axios":"^0.22.0","axios-retry":"^3.2.0","discord-ytdl-core":"^5.0.4","domhandler":"^4.2.2","ffmpeg-static":"^4.4.0","htmlparser2":"^7.1.2","libsodium-wrappers":"^0.7.9","rimraf":"^3.0.2","spotify-url-info":"^2.2.3","youtubei":"^0.0.1-rc.34","ytdl-core":"^4.9.1","ytsr":"^3.5.3"},"devDependencies":{"@babel/cli":"^7.14.8","@babel/core":"^7.15.0","@babel/preset-env":"^7.15.0","@babel/preset-typescript":"^7.15.0","@types/node":"^16.6.1","@typescript-eslint/eslint-plugin":"^4.29.1","@typescript-eslint/parser":"^4.29.1","assert-diff":"^3.0.2","discord.js":"^14.0.0-dev.1654776344-94bdcac","discord.js-docgen":"github:discordjs/docgen#ts-patch","eslint":"^7.32.0","jest":"^27.0.6","jsdoc-babel":"^0.5.0","ts-node":"^10.2.0","typescript":"^4.3.5"},"directories":{"doc":"docs","test":"test"},"readme":"# Discord Music Player\r\n![npm](https://img.shields.io/npm/dt/discord-music-player?style=for-the-badge)\r\n![npm](https://img.shields.io/npm/v/discord-music-player?style=for-the-badge)\r\n![CodeFactor Grade](https://img.shields.io/codefactor/grade/github/SushiBtw/discord-music-player?color=%2348aaf1&style=for-the-badge)\r\n\r\n### Note: This is the v8 version of Discord Music Player for Discord.JS v13!\r\n\r\nDiscord Music Player is a powerful [Node.js](https://nodejs.org) module that allows you to easily implement music commands.\r\n**Everything** is customizable, and everything can be done using this package - **there are no limitations!**\r\n\r\nThis package supports YouTube Videos & Playlists, Spotify Songs & Playlists, Apple Music Songs & Playlists.\r\nPackage from version v7.0.0 is fully maintained by [SushiBtw](https://github.com/SushiBtw).\r\n\r\n### Requirements:\r\n- [Discord.js v13](https://www.npmjs.com/package/discord.js),\r\n- [Node.JS v16](https://nodejs.org/),\r\n\r\n# Installation\r\n*Node.JS v16 or newer is required to run this module.*\r\n```sh\r\nnpm install --save discord-music-player\r\n```\r\nInstall **@discordjs/opus**:\r\n```sh\r\nnpm install --save @discordjs/opus\r\n```\r\n**Install [FFMPEG](https://www.ffmpeg.org/download.html)!**\r\n\r\n# Documentation\r\n**Discord Music Player documentation: [https://discord-music-player.js.org/](https://discord-music-player.js.org/)**\r\n\r\n### **Need some help?**\r\nFeel free to join [Discord-Music-Player Discord Server](https://discord.gg/6fejZNsmFC) and ask us about DMP.\r\n\r\n# Getting Started\r\n**The code bellow, will show you how to use DMP in your code.**\r\n\r\n*Please define your **Player** after the **client/bot** definition.*\r\n\r\n[!] Remember to include the related voice **Intents** at the client options. [!]\r\n```js\r\nconst Discord = require(\"discord.js\");\r\nconst client = new Discord.Client({\r\n    intents: [Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES, Intents.FLAGS.GUILD_VOICE_STATES]\r\n});\r\nconst settings = {\r\n    prefix: '!',\r\n    token: 'YourBotTokenHere'\r\n};\r\n\r\nconst { Player } = require(\"discord-music-player\");\r\nconst player = new Player(client, {\r\n    leaveOnEmpty: false, // This options are optional.\r\n});\r\n// You can define the Player as *client.player* to easily access it.\r\nclient.player = player;\r\n\r\nclient.on(\"ready\", () => {\r\n    console.log(\"I am ready to Play with DMP 🎶\");\r\n});\r\n\r\nclient.login(settings.token);\r\n```\r\n\r\n# Example Usage\r\n```js\r\nconst { RepeatMode } = require('discord-music-player');\r\n\r\nclient.on('messageCreate', async (message) => {\r\n    const args = message.content.slice(settings.prefix.length).trim().split(/ +/g);\r\n    const command = args.shift();\r\n    let guildQueue = client.player.getQueue(message.guild.id);\r\n\r\n    if(command === 'play') {\r\n        let queue = client.player.createQueue(message.guild.id);\r\n        await queue.join(message.member.voice.channel);\r\n        let song = await queue.play(args.join(' ')).catch(_ => {\r\n            if(!guildQueue)\r\n                queue.stop();\r\n        });\r\n    }\r\n\r\n    if(command === 'playlist') {\r\n        let queue = client.player.createQueue(message.guild.id);\r\n        await queue.join(message.member.voice.channel);\r\n        let song = await queue.playlist(args.join(' ')).catch(_ => {\r\n            if(!guildQueue)\r\n                queue.stop();\r\n        });\r\n    }\r\n\r\n    if(command === 'skip') {\r\n        guildQueue.skip();\r\n    }\r\n\r\n    if(command === 'stop') {\r\n        guildQueue.stop();\r\n    }\r\n\r\n    if(command === 'removeLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.DISABLED); // or 0 instead of RepeatMode.DISABLED\r\n    }\r\n\r\n    if(command === 'toggleLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.SONG); // or 1 instead of RepeatMode.SONG\r\n    }\r\n\r\n    if(command === 'toggleQueueLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.QUEUE); // or 2 instead of RepeatMode.QUEUE\r\n    }\r\n\r\n    if(command === 'setVolume') {\r\n        guildQueue.setVolume(parseInt(args[0]));\r\n    }\r\n\r\n    if(command === 'seek') {\r\n        guildQueue.seek(parseInt(args[0]) * 1000);\r\n    }\r\n\r\n    if(command === 'clearQueue') {\r\n        guildQueue.clearQueue();\r\n    }\r\n\r\n    if(command === 'shuffle') {\r\n        guildQueue.shuffle();\r\n    }\r\n\r\n    if(command === 'getQueue') {\r\n        console.log(guildQueue);\r\n    }\r\n\r\n    if(command === 'getVolume') {\r\n        console.log(guildQueue.volume)\r\n    }\r\n\r\n    if(command === 'nowPlaying') {\r\n        console.log(`Now playing: ${guildQueue.nowPlaying}`);\r\n    }\r\n\r\n    if(command === 'pause') {\r\n        guildQueue.setPaused(true);\r\n    }\r\n\r\n    if(command === 'resume') {\r\n        guildQueue.setPaused(false);\r\n    }\r\n\r\n    if(command === 'remove') {\r\n        guildQueue.remove(parseInt(args[0]));\r\n    }\r\n\r\n    if(command === 'createProgressBar') {\r\n        const ProgressBar = guildQueue.createProgressBar();\r\n        \r\n        // [======>              ][00:35/2:20]\r\n        console.log(ProgressBar.prettier);\r\n    }\r\n})\r\n```\r\n\r\n### Events:\r\n```js\r\n// Init the event listener only once (at the top of your code).\r\nclient.player\r\n    // Emitted when channel was empty.\r\n    .on('channelEmpty',  (queue) =>\r\n        console.log(`Everyone left the Voice Channel, queue ended.`))\r\n    // Emitted when a song was added to the queue.\r\n    .on('songAdd',  (queue, song) =>\r\n        console.log(`Song ${song} was added to the queue.`))\r\n    // Emitted when a playlist was added to the queue.\r\n    .on('playlistAdd',  (queue, playlist) =>\r\n        console.log(`Playlist ${playlist} with ${playlist.songs.length} was added to the queue.`))\r\n    // Emitted when there was no more music to play.\r\n    .on('queueDestroyed',  (queue) =>\r\n        console.log(`The queue was destroyed.`))\r\n    // Emitted when the queue was destroyed (either by ending or stopping).    \r\n    .on('queueEnd',  (queue) =>\r\n        console.log(`The queue has ended.`))\r\n    // Emitted when a song changed.\r\n    .on('songChanged', (queue, newSong, oldSong) =>\r\n        console.log(`${newSong} is now playing.`))\r\n    // Emitted when a first song in the queue started playing.\r\n    .on('songFirst',  (queue, song) =>\r\n        console.log(`Started playing ${song}.`))\r\n    // Emitted when someone disconnected the bot from the channel.\r\n    .on('clientDisconnect', (queue) =>\r\n        console.log(`I was kicked from the Voice Channel, queue ended.`))\r\n    // Emitted when deafenOnJoin is true and the bot was undeafened\r\n    .on('clientUndeafen', (queue) =>\r\n        console.log(`I got undefeanded.`))\r\n    // Emitted when there was an error in runtime\r\n    .on('error', (error, queue) => {\r\n        console.log(`Error: ${error} in ${queue.guild.name}`);\r\n    });\r\n```\r\n\r\n# Passing custom data\r\n\r\n### Queue\r\nWhile running the `Queue#createQueue()` method you can pass a `options#data` object to hold custom data.\r\nThis can be made in two ways:\r\n```js\r\n// Pass custom data\r\nawait player.createQueue(message.guild.id, {\r\n    data: {\r\n        queueInitMessage: message,\r\n        myObject: 'this will stay with the queue :)',\r\n        more: 'add more... there are no limitations...'\r\n    }\r\n});\r\n// Or by using\r\nqueue.setData({\r\n    whatever: 'you want :D'\r\n});\r\n\r\n// Access custom data\r\nlet queue = player.getQueue(message.guild.id);\r\nlet initMessage = queue.data.queueInitMessage;\r\nawait initMessage.channel.send(`This message object is hold in Queue :D`);\r\n```\r\n\r\n### Song or Playlist\r\nWhile running the `Queue#play()`/Queue#playlist() method you can pass a `options#data` object to hold custom data.\r\nThis can be made in two ways:\r\n```js\r\n// Play the song\r\nlet song = await queue.play('Born in the USA!');\r\n// Set song data\r\nsong.setData({\r\n    initMessage: message\r\n});\r\n\r\n// Play the playlist\r\nlet playlist = await queue.playlist('https://www.youtube.com/playlist?list=PLDLGxnP4y2mGKGEqwxWTRkd3HtrrVTMdU');\r\n// Set playlist data (will set data for each song in the playlist)\r\nsong.setData({\r\n    initMessage: message\r\n});\r\n\r\n// Access custom data\r\nlet queue = player.getQueue(message.guild.id);\r\nlet { initMessage } = queue.nowPlaying.data;\r\nawait initMessage.channel.send(`This message object is hold in Song :D`);\r\n```\r\n","readmeFilename":"README.md","gitHead":"2216b3f82a31ed74ac46879c4150711e20d96bbf","_id":"spike-player@1.2.4-1","_nodeVersion":"18.3.0","_npmVersion":"8.11.0","dist":{"integrity":"sha512-eUMrPuFI1VodEkAwmY/Ky17Cfhf1pclsJ+MNplOAyW68l6OQfsg5L04chATQcVF820YtHXAKZlCXTNAyrkdB5Q==","shasum":"7b2f12b1eca292d867758a066f5cb4a300c39d96","tarball":"https://registry.npmjs.org/spike-player/-/spike-player-1.2.4-1.tgz","fileCount":27,"unpackedSize":98976,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIA8JEC1dqRvMgmWpdJO5w3Fno5cakTJyIRsFfqY3uW6HAiEAzjZAPj/AzVCx3pj9eL/9Cw18VaQP4MpooqJuKH0DICg="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiyX0SACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmobHhAAmEAAJBAzzciAyyP352eZYT4ghdpS3O1KORwhEDzDkmJOx2gg\r\n4X+itMP9WqZWsxAb7TUWhlqz1WKkS66ou/G8Y7Myu/bkXH3HpzfWBt8pP8qc\r\nezGy5Gcm2n5/rJupF24/mv5q+sotpooZRm7VNeDhfu24dbpVUeH7xnxhgeG1\r\nJ41k45JDOu1GVUmy+jMstBjlz+CkE3w2Wd43I/Qkpi10wQCS/YK8uFPMMPRJ\r\nBB+4CvP42VprwQ9GOcXrz+0HHSI1Yywa32cjQUweD0RQnExeVobrp4Qh7jH4\r\n1p+esoAdQ8PWfsPbWn4C1AlaejymYRANa0rP7epy4fs+ggJ9dxXLOTc/8X7O\r\nReiQuSRNajPhIrtKofoiG7I3yHdUDKsFvv/QVd+6ez9Oea9GY28McFPMPAq8\r\nEntbeCy4PDS+2lGSzAjF+6bZ1ooOwh+Rc5lcFbJZJ1vmoWB1yJoSxoqjxh6E\r\nrGGL+CUnWwrKyYBVhfSttlMT994DmSMI1iE4W2dk75XwboHjVqjRGiqsRkHD\r\n2PvPB4A6GH8kc95tKiiRN19rF7ubpTUpnqXOyYSGLh19D3tDMHvG+EMfLm9y\r\n/VSw5qBJK2ccREenlWYbABWE0+FAgN2baC/uODBRzg4wGWDNp3zUeHn/S+vr\r\nAuLr6T1mAcCigtEG5K5UzAo72sqmp0Bmmf8=\r\n=IECJ\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"spikebot","email":"abatallah1214@gmail.com"},"maintainers":[{"name":"spikebot","email":"abatallah1214@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spike-player_1.2.4-1_1657371922252_0.6849695603293993"},"_hasShrinkwrap":false},"1.2.4-2":{"name":"spike-player","version":"1.2.4-2","description":"Complete framework to facilitate music commands using discord.js v13","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"husky install && tsc","test":"jest test/test.js","clean":"rimraf dist","pre":"npm version prerelease --force && npm publish --access public --tag dev","prep":"npm run clean && npm run build","pub":"standard-version && npm publish","docs:test":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml","docs":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml --output docs/docs.json"},"keywords":["music","player","bot","framework","discord","youtube","spotify","v13"],"dependencies":{"@discordjs/opus":"^0.8.0","@discordjs/voice":"^0.10.0","axios":"^0.22.0","axios-retry":"^3.2.0","discord-ytdl-core":"^5.0.4","domhandler":"^4.2.2","ffmpeg-static":"^4.4.0","htmlparser2":"^7.1.2","libsodium-wrappers":"^0.7.9","rimraf":"^3.0.2","spotify-url-info":"^2.2.3","youtubei":"^0.0.1-rc.34","ytdl-core":"^4.9.1","ytsr":"^3.5.3"},"devDependencies":{"@babel/cli":"^7.14.8","@babel/core":"^7.15.0","@babel/preset-env":"^7.15.0","@babel/preset-typescript":"^7.15.0","@types/node":"^16.6.1","@typescript-eslint/eslint-plugin":"^4.29.1","@typescript-eslint/parser":"^4.29.1","assert-diff":"^3.0.2","discord.js":"^14.0.0-dev.1654776344-94bdcac","discord.js-docgen":"github:discordjs/docgen#ts-patch","eslint":"^7.32.0","jest":"^27.0.6","jsdoc-babel":"^0.5.0","ts-node":"^10.2.0","typescript":"^4.3.5"},"directories":{"doc":"docs","test":"test"},"readme":"# Discord Music Player\r\n![npm](https://img.shields.io/npm/dt/discord-music-player?style=for-the-badge)\r\n![npm](https://img.shields.io/npm/v/discord-music-player?style=for-the-badge)\r\n![CodeFactor Grade](https://img.shields.io/codefactor/grade/github/SushiBtw/discord-music-player?color=%2348aaf1&style=for-the-badge)\r\n\r\n### Note: This is the v8 version of Discord Music Player for Discord.JS v13!\r\n\r\nDiscord Music Player is a powerful [Node.js](https://nodejs.org) module that allows you to easily implement music commands.\r\n**Everything** is customizable, and everything can be done using this package - **there are no limitations!**\r\n\r\nThis package supports YouTube Videos & Playlists, Spotify Songs & Playlists, Apple Music Songs & Playlists.\r\nPackage from version v7.0.0 is fully maintained by [SushiBtw](https://github.com/SushiBtw).\r\n\r\n### Requirements:\r\n- [Discord.js v13](https://www.npmjs.com/package/discord.js),\r\n- [Node.JS v16](https://nodejs.org/),\r\n\r\n# Installation\r\n*Node.JS v16 or newer is required to run this module.*\r\n```sh\r\nnpm install --save discord-music-player\r\n```\r\nInstall **@discordjs/opus**:\r\n```sh\r\nnpm install --save @discordjs/opus\r\n```\r\n**Install [FFMPEG](https://www.ffmpeg.org/download.html)!**\r\n\r\n# Documentation\r\n**Discord Music Player documentation: [https://discord-music-player.js.org/](https://discord-music-player.js.org/)**\r\n\r\n### **Need some help?**\r\nFeel free to join [Discord-Music-Player Discord Server](https://discord.gg/6fejZNsmFC) and ask us about DMP.\r\n\r\n# Getting Started\r\n**The code bellow, will show you how to use DMP in your code.**\r\n\r\n*Please define your **Player** after the **client/bot** definition.*\r\n\r\n[!] Remember to include the related voice **Intents** at the client options. [!]\r\n```js\r\nconst Discord = require(\"discord.js\");\r\nconst client = new Discord.Client({\r\n    intents: [Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES, Intents.FLAGS.GUILD_VOICE_STATES]\r\n});\r\nconst settings = {\r\n    prefix: '!',\r\n    token: 'YourBotTokenHere'\r\n};\r\n\r\nconst { Player } = require(\"discord-music-player\");\r\nconst player = new Player(client, {\r\n    leaveOnEmpty: false, // This options are optional.\r\n});\r\n// You can define the Player as *client.player* to easily access it.\r\nclient.player = player;\r\n\r\nclient.on(\"ready\", () => {\r\n    console.log(\"I am ready to Play with DMP 🎶\");\r\n});\r\n\r\nclient.login(settings.token);\r\n```\r\n\r\n# Example Usage\r\n```js\r\nconst { RepeatMode } = require('discord-music-player');\r\n\r\nclient.on('messageCreate', async (message) => {\r\n    const args = message.content.slice(settings.prefix.length).trim().split(/ +/g);\r\n    const command = args.shift();\r\n    let guildQueue = client.player.getQueue(message.guild.id);\r\n\r\n    if(command === 'play') {\r\n        let queue = client.player.createQueue(message.guild.id);\r\n        await queue.join(message.member.voice.channel);\r\n        let song = await queue.play(args.join(' ')).catch(_ => {\r\n            if(!guildQueue)\r\n                queue.stop();\r\n        });\r\n    }\r\n\r\n    if(command === 'playlist') {\r\n        let queue = client.player.createQueue(message.guild.id);\r\n        await queue.join(message.member.voice.channel);\r\n        let song = await queue.playlist(args.join(' ')).catch(_ => {\r\n            if(!guildQueue)\r\n                queue.stop();\r\n        });\r\n    }\r\n\r\n    if(command === 'skip') {\r\n        guildQueue.skip();\r\n    }\r\n\r\n    if(command === 'stop') {\r\n        guildQueue.stop();\r\n    }\r\n\r\n    if(command === 'removeLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.DISABLED); // or 0 instead of RepeatMode.DISABLED\r\n    }\r\n\r\n    if(command === 'toggleLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.SONG); // or 1 instead of RepeatMode.SONG\r\n    }\r\n\r\n    if(command === 'toggleQueueLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.QUEUE); // or 2 instead of RepeatMode.QUEUE\r\n    }\r\n\r\n    if(command === 'setVolume') {\r\n        guildQueue.setVolume(parseInt(args[0]));\r\n    }\r\n\r\n    if(command === 'seek') {\r\n        guildQueue.seek(parseInt(args[0]) * 1000);\r\n    }\r\n\r\n    if(command === 'clearQueue') {\r\n        guildQueue.clearQueue();\r\n    }\r\n\r\n    if(command === 'shuffle') {\r\n        guildQueue.shuffle();\r\n    }\r\n\r\n    if(command === 'getQueue') {\r\n        console.log(guildQueue);\r\n    }\r\n\r\n    if(command === 'getVolume') {\r\n        console.log(guildQueue.volume)\r\n    }\r\n\r\n    if(command === 'nowPlaying') {\r\n        console.log(`Now playing: ${guildQueue.nowPlaying}`);\r\n    }\r\n\r\n    if(command === 'pause') {\r\n        guildQueue.setPaused(true);\r\n    }\r\n\r\n    if(command === 'resume') {\r\n        guildQueue.setPaused(false);\r\n    }\r\n\r\n    if(command === 'remove') {\r\n        guildQueue.remove(parseInt(args[0]));\r\n    }\r\n\r\n    if(command === 'createProgressBar') {\r\n        const ProgressBar = guildQueue.createProgressBar();\r\n        \r\n        // [======>              ][00:35/2:20]\r\n        console.log(ProgressBar.prettier);\r\n    }\r\n})\r\n```\r\n\r\n### Events:\r\n```js\r\n// Init the event listener only once (at the top of your code).\r\nclient.player\r\n    // Emitted when channel was empty.\r\n    .on('channelEmpty',  (queue) =>\r\n        console.log(`Everyone left the Voice Channel, queue ended.`))\r\n    // Emitted when a song was added to the queue.\r\n    .on('songAdd',  (queue, song) =>\r\n        console.log(`Song ${song} was added to the queue.`))\r\n    // Emitted when a playlist was added to the queue.\r\n    .on('playlistAdd',  (queue, playlist) =>\r\n        console.log(`Playlist ${playlist} with ${playlist.songs.length} was added to the queue.`))\r\n    // Emitted when there was no more music to play.\r\n    .on('queueDestroyed',  (queue) =>\r\n        console.log(`The queue was destroyed.`))\r\n    // Emitted when the queue was destroyed (either by ending or stopping).    \r\n    .on('queueEnd',  (queue) =>\r\n        console.log(`The queue has ended.`))\r\n    // Emitted when a song changed.\r\n    .on('songChanged', (queue, newSong, oldSong) =>\r\n        console.log(`${newSong} is now playing.`))\r\n    // Emitted when a first song in the queue started playing.\r\n    .on('songFirst',  (queue, song) =>\r\n        console.log(`Started playing ${song}.`))\r\n    // Emitted when someone disconnected the bot from the channel.\r\n    .on('clientDisconnect', (queue) =>\r\n        console.log(`I was kicked from the Voice Channel, queue ended.`))\r\n    // Emitted when deafenOnJoin is true and the bot was undeafened\r\n    .on('clientUndeafen', (queue) =>\r\n        console.log(`I got undefeanded.`))\r\n    // Emitted when there was an error in runtime\r\n    .on('error', (error, queue) => {\r\n        console.log(`Error: ${error} in ${queue.guild.name}`);\r\n    });\r\n```\r\n\r\n# Passing custom data\r\n\r\n### Queue\r\nWhile running the `Queue#createQueue()` method you can pass a `options#data` object to hold custom data.\r\nThis can be made in two ways:\r\n```js\r\n// Pass custom data\r\nawait player.createQueue(message.guild.id, {\r\n    data: {\r\n        queueInitMessage: message,\r\n        myObject: 'this will stay with the queue :)',\r\n        more: 'add more... there are no limitations...'\r\n    }\r\n});\r\n// Or by using\r\nqueue.setData({\r\n    whatever: 'you want :D'\r\n});\r\n\r\n// Access custom data\r\nlet queue = player.getQueue(message.guild.id);\r\nlet initMessage = queue.data.queueInitMessage;\r\nawait initMessage.channel.send(`This message object is hold in Queue :D`);\r\n```\r\n\r\n### Song or Playlist\r\nWhile running the `Queue#play()`/Queue#playlist() method you can pass a `options#data` object to hold custom data.\r\nThis can be made in two ways:\r\n```js\r\n// Play the song\r\nlet song = await queue.play('Born in the USA!');\r\n// Set song data\r\nsong.setData({\r\n    initMessage: message\r\n});\r\n\r\n// Play the playlist\r\nlet playlist = await queue.playlist('https://www.youtube.com/playlist?list=PLDLGxnP4y2mGKGEqwxWTRkd3HtrrVTMdU');\r\n// Set playlist data (will set data for each song in the playlist)\r\nsong.setData({\r\n    initMessage: message\r\n});\r\n\r\n// Access custom data\r\nlet queue = player.getQueue(message.guild.id);\r\nlet { initMessage } = queue.nowPlaying.data;\r\nawait initMessage.channel.send(`This message object is hold in Song :D`);\r\n```\r\n","readmeFilename":"README.md","gitHead":"14ba727a93e87d2c46d1135ff88e4bc586e8bc12","_id":"spike-player@1.2.4-2","_nodeVersion":"18.3.0","_npmVersion":"8.11.0","dist":{"integrity":"sha512-4c7yMj1Nuy3SN6zWQ6zGXqmOXM9NbxAvqOiDMSYiRJWBTMrl8DNRSGBNTVYEmEXfs6ORf9XcMq+3piubXz2zYw==","shasum":"2e179d6e7a8bef74623be1a0b19569f58e8fd1ee","tarball":"https://registry.npmjs.org/spike-player/-/spike-player-1.2.4-2.tgz","fileCount":27,"unpackedSize":98933,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCOzdjo1i27SW357afOyRuwv6LVfFnRgSFl44Gv/xn01wIhALI3puB5TctK6GltkRdQM2j1GP6wOempGxzn/2Kg/jHk"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiyX5CACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpRtw/+PHnYbGC31tLgpNaDbfZt71oMtwhaqx2vlN01SJ5en8ZDjTSE\r\nRH4ruumFWyWotbTGJxvuF2FM7Xc0Nnwhkj8Xud9mKE++Cu4ZuRs37RNs7aw+\r\nNQC9S7E8/51v+A/LglAu3GA6tpzfJhu7xxST46GuG2vIGsLsC2eersAsPlZq\r\nHWuODtgY/ASvOkP/LbLrKew/WeJ/GlvENn9IdyaK2xOHz+gO62arkhOrdsUY\r\nC8EkhbaVObBr2qJVjCIkiDMeJru3IgSDZCVzvjMUasPwTqJZ1yilOLDNWmTr\r\nFvKumcV67te5cMkBAJB/wFyElFFCsy5mQtn6mnmcJKwklInZDlGLu9QWsbnB\r\n+Oh04p/U9+P0YcbXTGPC9KpPg+CJ6DW++BZtTJP6LVC6c9eEEw9Xrf2vZ3Ma\r\newoB/cqqt01mi0mKIO9ll+3Vkx9sZpO3FIFFdK4l8Io+RBZzKt+l11o7ubQ7\r\njvzaKFeni72cqSjS1HNGqBnjIQv4VrRLuImgAOEv1Sd7CGtDqoOfUVl8VwoN\r\n0rqPjvcWTVlPhZefXiBJjgvdRvQfuB11aev+nU/6Z0L0/jj5Ne/z1jn/FtcX\r\nnCOSagJG1mX5+0wDpuooWBt0g3A1zY0NJ98zc7cXS3mGaLhFGJPMxF0EOIy8\r\nS1h8zcUJGTIu6gAWndK1TQOw9LfcW9Xfuqg=\r\n=trrc\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"spikebot","email":"abatallah1214@gmail.com"},"maintainers":[{"name":"spikebot","email":"abatallah1214@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spike-player_1.2.4-2_1657372226423_0.387416196596319"},"_hasShrinkwrap":false},"1.2.4-3":{"name":"spike-player","version":"1.2.4-3","description":"Complete framework to facilitate music commands using discord.js v13","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"husky install && tsc","test":"jest test/test.js","clean":"rimraf dist","pre":"npm version prerelease --force && npm publish --access public --tag dev","prep":"npm run clean && npm run build","pub":"standard-version && npm publish","docs:test":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml","docs":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml --output docs/docs.json"},"keywords":["music","player","bot","framework","discord","youtube","spotify","v13"],"dependencies":{"@discordjs/opus":"^0.8.0","@discordjs/voice":"^0.10.0","axios":"^0.22.0","axios-retry":"^3.2.0","discord-ytdl-core":"^5.0.4","domhandler":"^4.2.2","ffmpeg-static":"^4.4.0","htmlparser2":"^7.1.2","libsodium-wrappers":"^0.7.9","rimraf":"^3.0.2","spotify-url-info":"^2.2.3","youtubei":"^0.0.1-rc.34","ytdl-core":"^4.11.0","ytsr":"^3.8.0"},"devDependencies":{"@babel/cli":"^7.14.8","@babel/core":"^7.15.0","@babel/preset-env":"^7.15.0","@babel/preset-typescript":"^7.15.0","@types/node":"^16.6.1","@typescript-eslint/eslint-plugin":"^4.29.1","@typescript-eslint/parser":"^4.29.1","assert-diff":"^3.0.2","discord.js":"^14.0.0-dev.1654776344-94bdcac","discord.js-docgen":"github:discordjs/docgen#ts-patch","eslint":"^7.32.0","jest":"^27.0.6","jsdoc-babel":"^0.5.0","ts-node":"^10.2.0","typescript":"^4.3.5"},"directories":{"doc":"docs","test":"test"},"readme":"# Discord Music Player\r\n![npm](https://img.shields.io/npm/dt/discord-music-player?style=for-the-badge)\r\n![npm](https://img.shields.io/npm/v/discord-music-player?style=for-the-badge)\r\n![CodeFactor Grade](https://img.shields.io/codefactor/grade/github/SushiBtw/discord-music-player?color=%2348aaf1&style=for-the-badge)\r\n\r\n### Note: This is the v8 version of Discord Music Player for Discord.JS v13!\r\n\r\nDiscord Music Player is a powerful [Node.js](https://nodejs.org) module that allows you to easily implement music commands.\r\n**Everything** is customizable, and everything can be done using this package - **there are no limitations!**\r\n\r\nThis package supports YouTube Videos & Playlists, Spotify Songs & Playlists, Apple Music Songs & Playlists.\r\nPackage from version v7.0.0 is fully maintained by [SushiBtw](https://github.com/SushiBtw).\r\n\r\n### Requirements:\r\n- [Discord.js v13](https://www.npmjs.com/package/discord.js),\r\n- [Node.JS v16](https://nodejs.org/),\r\n\r\n# Installation\r\n*Node.JS v16 or newer is required to run this module.*\r\n```sh\r\nnpm install --save discord-music-player\r\n```\r\nInstall **@discordjs/opus**:\r\n```sh\r\nnpm install --save @discordjs/opus\r\n```\r\n**Install [FFMPEG](https://www.ffmpeg.org/download.html)!**\r\n\r\n# Documentation\r\n**Discord Music Player documentation: [https://discord-music-player.js.org/](https://discord-music-player.js.org/)**\r\n\r\n### **Need some help?**\r\nFeel free to join [Discord-Music-Player Discord Server](https://discord.gg/6fejZNsmFC) and ask us about DMP.\r\n\r\n# Getting Started\r\n**The code bellow, will show you how to use DMP in your code.**\r\n\r\n*Please define your **Player** after the **client/bot** definition.*\r\n\r\n[!] Remember to include the related voice **Intents** at the client options. [!]\r\n```js\r\nconst Discord = require(\"discord.js\");\r\nconst client = new Discord.Client({\r\n    intents: [Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES, Intents.FLAGS.GUILD_VOICE_STATES]\r\n});\r\nconst settings = {\r\n    prefix: '!',\r\n    token: 'YourBotTokenHere'\r\n};\r\n\r\nconst { Player } = require(\"discord-music-player\");\r\nconst player = new Player(client, {\r\n    leaveOnEmpty: false, // This options are optional.\r\n});\r\n// You can define the Player as *client.player* to easily access it.\r\nclient.player = player;\r\n\r\nclient.on(\"ready\", () => {\r\n    console.log(\"I am ready to Play with DMP 🎶\");\r\n});\r\n\r\nclient.login(settings.token);\r\n```\r\n\r\n# Example Usage\r\n```js\r\nconst { RepeatMode } = require('discord-music-player');\r\n\r\nclient.on('messageCreate', async (message) => {\r\n    const args = message.content.slice(settings.prefix.length).trim().split(/ +/g);\r\n    const command = args.shift();\r\n    let guildQueue = client.player.getQueue(message.guild.id);\r\n\r\n    if(command === 'play') {\r\n        let queue = client.player.createQueue(message.guild.id);\r\n        await queue.join(message.member.voice.channel);\r\n        let song = await queue.play(args.join(' ')).catch(_ => {\r\n            if(!guildQueue)\r\n                queue.stop();\r\n        });\r\n    }\r\n\r\n    if(command === 'playlist') {\r\n        let queue = client.player.createQueue(message.guild.id);\r\n        await queue.join(message.member.voice.channel);\r\n        let song = await queue.playlist(args.join(' ')).catch(_ => {\r\n            if(!guildQueue)\r\n                queue.stop();\r\n        });\r\n    }\r\n\r\n    if(command === 'skip') {\r\n        guildQueue.skip();\r\n    }\r\n\r\n    if(command === 'stop') {\r\n        guildQueue.stop();\r\n    }\r\n\r\n    if(command === 'removeLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.DISABLED); // or 0 instead of RepeatMode.DISABLED\r\n    }\r\n\r\n    if(command === 'toggleLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.SONG); // or 1 instead of RepeatMode.SONG\r\n    }\r\n\r\n    if(command === 'toggleQueueLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.QUEUE); // or 2 instead of RepeatMode.QUEUE\r\n    }\r\n\r\n    if(command === 'setVolume') {\r\n        guildQueue.setVolume(parseInt(args[0]));\r\n    }\r\n\r\n    if(command === 'seek') {\r\n        guildQueue.seek(parseInt(args[0]) * 1000);\r\n    }\r\n\r\n    if(command === 'clearQueue') {\r\n        guildQueue.clearQueue();\r\n    }\r\n\r\n    if(command === 'shuffle') {\r\n        guildQueue.shuffle();\r\n    }\r\n\r\n    if(command === 'getQueue') {\r\n        console.log(guildQueue);\r\n    }\r\n\r\n    if(command === 'getVolume') {\r\n        console.log(guildQueue.volume)\r\n    }\r\n\r\n    if(command === 'nowPlaying') {\r\n        console.log(`Now playing: ${guildQueue.nowPlaying}`);\r\n    }\r\n\r\n    if(command === 'pause') {\r\n        guildQueue.setPaused(true);\r\n    }\r\n\r\n    if(command === 'resume') {\r\n        guildQueue.setPaused(false);\r\n    }\r\n\r\n    if(command === 'remove') {\r\n        guildQueue.remove(parseInt(args[0]));\r\n    }\r\n\r\n    if(command === 'createProgressBar') {\r\n        const ProgressBar = guildQueue.createProgressBar();\r\n        \r\n        // [======>              ][00:35/2:20]\r\n        console.log(ProgressBar.prettier);\r\n    }\r\n})\r\n```\r\n\r\n### Events:\r\n```js\r\n// Init the event listener only once (at the top of your code).\r\nclient.player\r\n    // Emitted when channel was empty.\r\n    .on('channelEmpty',  (queue) =>\r\n        console.log(`Everyone left the Voice Channel, queue ended.`))\r\n    // Emitted when a song was added to the queue.\r\n    .on('songAdd',  (queue, song) =>\r\n        console.log(`Song ${song} was added to the queue.`))\r\n    // Emitted when a playlist was added to the queue.\r\n    .on('playlistAdd',  (queue, playlist) =>\r\n        console.log(`Playlist ${playlist} with ${playlist.songs.length} was added to the queue.`))\r\n    // Emitted when there was no more music to play.\r\n    .on('queueDestroyed',  (queue) =>\r\n        console.log(`The queue was destroyed.`))\r\n    // Emitted when the queue was destroyed (either by ending or stopping).    \r\n    .on('queueEnd',  (queue) =>\r\n        console.log(`The queue has ended.`))\r\n    // Emitted when a song changed.\r\n    .on('songChanged', (queue, newSong, oldSong) =>\r\n        console.log(`${newSong} is now playing.`))\r\n    // Emitted when a first song in the queue started playing.\r\n    .on('songFirst',  (queue, song) =>\r\n        console.log(`Started playing ${song}.`))\r\n    // Emitted when someone disconnected the bot from the channel.\r\n    .on('clientDisconnect', (queue) =>\r\n        console.log(`I was kicked from the Voice Channel, queue ended.`))\r\n    // Emitted when deafenOnJoin is true and the bot was undeafened\r\n    .on('clientUndeafen', (queue) =>\r\n        console.log(`I got undefeanded.`))\r\n    // Emitted when there was an error in runtime\r\n    .on('error', (error, queue) => {\r\n        console.log(`Error: ${error} in ${queue.guild.name}`);\r\n    });\r\n```\r\n\r\n# Passing custom data\r\n\r\n### Queue\r\nWhile running the `Queue#createQueue()` method you can pass a `options#data` object to hold custom data.\r\nThis can be made in two ways:\r\n```js\r\n// Pass custom data\r\nawait player.createQueue(message.guild.id, {\r\n    data: {\r\n        queueInitMessage: message,\r\n        myObject: 'this will stay with the queue :)',\r\n        more: 'add more... there are no limitations...'\r\n    }\r\n});\r\n// Or by using\r\nqueue.setData({\r\n    whatever: 'you want :D'\r\n});\r\n\r\n// Access custom data\r\nlet queue = player.getQueue(message.guild.id);\r\nlet initMessage = queue.data.queueInitMessage;\r\nawait initMessage.channel.send(`This message object is hold in Queue :D`);\r\n```\r\n\r\n### Song or Playlist\r\nWhile running the `Queue#play()`/Queue#playlist() method you can pass a `options#data` object to hold custom data.\r\nThis can be made in two ways:\r\n```js\r\n// Play the song\r\nlet song = await queue.play('Born in the USA!');\r\n// Set song data\r\nsong.setData({\r\n    initMessage: message\r\n});\r\n\r\n// Play the playlist\r\nlet playlist = await queue.playlist('https://www.youtube.com/playlist?list=PLDLGxnP4y2mGKGEqwxWTRkd3HtrrVTMdU');\r\n// Set playlist data (will set data for each song in the playlist)\r\nsong.setData({\r\n    initMessage: message\r\n});\r\n\r\n// Access custom data\r\nlet queue = player.getQueue(message.guild.id);\r\nlet { initMessage } = queue.nowPlaying.data;\r\nawait initMessage.channel.send(`This message object is hold in Song :D`);\r\n```\r\n","readmeFilename":"README.md","gitHead":"57be7ae75bc71a34e80d21e99ca8b2dad1b31a46","_id":"spike-player@1.2.4-3","_nodeVersion":"18.3.0","_npmVersion":"8.11.0","dist":{"integrity":"sha512-QJwJoKMqfByKmZa1LVY8aeR8CKH59hCvcBW7pm+Z0fF29qyDTA7Q48aiMaIukNijDoTLjb9i1S1pPWWl9bu+EQ==","shasum":"13e7dd5040b7a3c9ed4940c9e236e49ad1c01688","tarball":"https://registry.npmjs.org/spike-player/-/spike-player-1.2.4-3.tgz","fileCount":27,"unpackedSize":98934,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCjPycH6ZAzFcrQZIqLIT0QhPev8X855TIF0NOXO58DHwIhANog652N+++B2qFRnEkONy9bsz1x8Mu5RkcQw2PFtWqm"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiznczACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoNNA/9EL1cK1SRXb4DHUCN0gpldGwMooZ/DM+aJrF3tQtwKvK8DdG/\r\nc/bejgoWiM74SraSqvvcHokT7cpWC76vdIC3BOxAgfEcpeQdoMHG3W6dDtxy\r\nmFYmIXkt9gGvKYOkSO4yCcpkeJMkswr/ziqtktMvX/83qSzLbgEvuPMkT04k\r\nNl9PvJTuiGS1htQS+ux5VPKXhVL1oLZPHSY9451Bjj7qTfl4gmFuQqb+UPTF\r\nwLoR2UzW0e5XPwjPzk96sI155bxmAjzjwdQIetQSjuRQPlvG7CkpQ4u/SU8+\r\nSZP138LCmFmhZbvBCJ4nWGVtp8UKYwTJUe8sM+5qZ/ci3QWEYTzIKNxlyjmf\r\n3QGAllPEikJhtQnM9O+Eju3tnKKf//27aUg6N6LPDcCi35g1NJTql1NqjBt4\r\nu84KrrFtEqPVinVzsi7D1v8fIxaE9PnD6Qb+XsyDdPUWsndSHw+rFsaZrmRW\r\nEmmucWRzrsaet/l4zSssZI9d7KFZjJhT9KSvW7BQw3wW5SjXHK/GN8sqjEXt\r\nIEy2toMWcZ/Q09nNJJwk/xJ//cm5hNADZH5XCZ1gd2PN1GKaFLyRgNjfYzbW\r\ngDDmFFiVxQTV1AOLKMiyWndgGFUYP0iNi+KMEvf/cwXBoL5kWjFwF9rawxyP\r\n00BpaRZ923LbkmF2+XU5x4Su3x8pV+IKtRY=\r\n=fMxP\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"spikebot","email":"abatallah1214@gmail.com"},"maintainers":[{"name":"spikebot","email":"abatallah1214@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spike-player_1.2.4-3_1657698099338_0.727887578297818"},"_hasShrinkwrap":false},"1.2.4":{"name":"spike-player","version":"1.2.4","description":"Complete framework to facilitate music commands using discord.js v13","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"husky install && tsc","test":"jest test/test.js","clean":"rimraf dist","pre":"npm version prerelease --force && npm publish --access public --tag dev","prep":"npm run clean && npm run build","pub":"standard-version && npm publish","docs:test":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml","docs":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml --output docs/docs.json"},"keywords":["music","player","bot","framework","discord","youtube","spotify","v13"],"dependencies":{"@discordjs/opus":"^0.8.0","@discordjs/voice":"^0.10.0","axios":"^0.22.0","axios-retry":"^3.2.0","discord-ytdl-core":"^5.0.4","domhandler":"^4.2.2","ffmpeg-static":"^4.4.0","htmlparser2":"^7.1.2","libsodium-wrappers":"^0.7.9","rimraf":"^3.0.2","spotify-url-info":"^2.2.3","youtubei":"^0.0.1-rc.34","ytdl-core":"^4.11.0","ytsr":"^3.8.0"},"devDependencies":{"@babel/cli":"^7.14.8","@babel/core":"^7.15.0","@babel/preset-env":"^7.15.0","@babel/preset-typescript":"^7.15.0","@types/node":"^16.6.1","@typescript-eslint/eslint-plugin":"^4.29.1","@typescript-eslint/parser":"^4.29.1","assert-diff":"^3.0.2","discord.js":"^14.0.0-dev.1654776344-94bdcac","discord.js-docgen":"github:discordjs/docgen#ts-patch","eslint":"^7.32.0","jest":"^27.0.6","jsdoc-babel":"^0.5.0","ts-node":"^10.2.0","typescript":"^4.3.5"},"directories":{"doc":"docs","test":"test"},"gitHead":"1bb81183b17bf810ca44e7b0bc76db6b9d228f65","_id":"spike-player@1.2.4","_nodeVersion":"18.3.0","_npmVersion":"8.11.0","dist":{"integrity":"sha512-LAUbz+cnoeSx/rOt3RbFRzNVGezPdOoPv/zTibPlJtpa0liVyTZ+wjJtDYRN8hkDN2FRQERVwKCHlTB4pgo9jw==","shasum":"58f90eec46cfc9ef80b790288d720fd4113b926c","tarball":"https://registry.npmjs.org/spike-player/-/spike-player-1.2.4.tgz","fileCount":27,"unpackedSize":99029,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDMXdRrrs/6McghFngSMYYGpfAVzfK+oN/xhPFiLE7qnAiEAtqRJsC8zdY9kdx0rm9HuRkKT2nyN7zhczBoW5D43wJk="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJizoRoACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrZTQ//ZQMWJ4AqNKKA06V4oVMhEVS9dYQdG5y0i2KBCICOsC5MTEYM\r\ny+03qSHi46S8moVFarbQvIr+TKd3lHJeYWI8yx56RrAFzcC+dX+qECRnwMhT\r\nBf/PswZjjcYEBu4S9A1Utk0S0w+Fipr3d94oahaR1qAd8Tu1tBGW88JwhFBE\r\neTOSPI60PxvxTQ7WM6m4xMBOnJN7Cy9PEym3wr80yfTKVwNA429W8zHRR+ov\r\nc2iiBJpYhv++QeE4Dxmi7OJBUqxtH3eFC9Np+LGA+Ua0e2zC1K8MPi0025hB\r\n1PWLmqGgYyeljYuvGaciwqzdrVgilNckjKJzfszR/pgkSS0WQlcM6WubTdVC\r\nwaA4EQGhHQ559+m2dsNDqWVZbapUn2e8qICrIZv90oc49N4I6k9WjCNP7Dbd\r\ngYrQs4UmBvRtWeNrFHmYA+lq2LOhzzQmPBXw7kuWhO+NVlD0rjgkoFLdle5j\r\nMX4+UdCFKwPtliR2xc91mWo8dZV1GQJR3BjKLY0OzGOdWUdsi/ahyj1GKzb5\r\n0bNz+KAhuQsVlmMORrxEJCizStGuyj0yyvSMo0u8+aY4ESzwMV+FoA/9M0Q0\r\nyW9E777o0evjKG7vQX1sYZMF21oKX4AhCA+XKsMXl4Io26z8mLTThDpjktWz\r\nQYNH0Pqu/LmBYD6ORSaivSr79cfGwnKRNXc=\r\n=1RXQ\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"spikebot","email":"abatallah1214@gmail.com"},"maintainers":[{"name":"spikebot","email":"abatallah1214@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spike-player_1.2.4_1657701480127_0.8327192611111462"},"_hasShrinkwrap":false},"1.2.5":{"name":"spike-player","version":"1.2.5","description":"Complete framework to facilitate music commands using discord.js v13","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"husky install && tsc","test":"jest test/test.js","clean":"rimraf dist","pre":"npm version prerelease --force && npm publish --access public --tag dev","prep":"npm run clean && npm run build","pub":"standard-version && npm publish","docs:test":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml","docs":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml --output docs/docs.json"},"keywords":["music","player","bot","framework","discord","youtube","spotify","v13"],"dependencies":{"@discordjs/opus":"^0.8.0","@discordjs/voice":"^0.10.0","axios":"^0.22.0","axios-retry":"^3.2.0","discord-ytdl-core":"^5.0.4","domhandler":"^4.2.2","ffmpeg-static":"^4.4.0","htmlparser2":"^7.1.2","libsodium-wrappers":"^0.7.9","rimraf":"^3.0.2","spotify-url-info":"^2.2.3","youtubei":"^0.0.1-rc.34","ytdl-core":"^4.11.0","ytsr":"^3.8.0"},"devDependencies":{"@babel/cli":"^7.14.8","@babel/core":"^7.15.0","@babel/preset-env":"^7.15.0","@babel/preset-typescript":"^7.15.0","@types/node":"^16.6.1","@typescript-eslint/eslint-plugin":"^4.29.1","@typescript-eslint/parser":"^4.29.1","assert-diff":"^3.0.2","discord.js":"^14.0.1","discord.js-docgen":"github:discordjs/docgen#ts-patch","eslint":"^7.32.0","jest":"^27.0.6","jsdoc-babel":"^0.5.0","ts-node":"^10.2.0","typescript":"^4.3.5"},"directories":{"doc":"docs","test":"test"},"gitHead":"19f7e0f032caf1f32c2deb2402fd6d50085fa28d","_id":"spike-player@1.2.5","_nodeVersion":"16.15.1","_npmVersion":"8.11.0","dist":{"integrity":"sha512-pA25+5+vVoEX6ld53NGb9jPdbO8wH8F/h7qkVPOaLNEbTYfR8B7qJahm4pTLRXFmB5YNogp14vLuu8FagJZQgQ==","shasum":"cf8d5c28765962e40317689cd45ae67bcd15221d","tarball":"https://registry.npmjs.org/spike-player/-/spike-player-1.2.5.tgz","fileCount":27,"unpackedSize":99119,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDTxmslTwUGaMD7s9nqaZdUIp2URnfHuyyNuX6M4Ir82gIhALgdiRGB0uHXEAEZNYB/+ISTWIFJXddABpcWIfpwWgUx"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi1HX/ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr5KxAAl8aYsByji83ELerDtat8eL/WfC49hlt0yaQx/XVJlxRFG/Qv\r\nn6RujqHN4eliqqObMg46kPbS1s5dYTo35JAFts18AdgtL5nocwrMi7l67vtl\r\nC1tYxUAOohjfeIVZDphtUqddl59x+zainDt+S1rbz9uBnXMftCYqiuh5P8dn\r\nJjsYSyccgriBMCCJxGzzFynvMcRcqFA7wehnzfrlSWRFqeQuJ5IqkpCI28U7\r\n3qyROE9xdmIA3mvlnuL7CrrO9W6mrS02NywVlWeUrkaPaCu5nvv6ZRa1uaMU\r\nh3CH4fA73JrQbE0cZepgLKkd1QgqQq1jeX+JRlrMcKWg6waIor74UIq7rY3A\r\nLO96eYpK8zrnfJpkt78K8K/vignYxHFTCiP0pXIHD44HFfhkjMHEuJQ7dAcV\r\n2savz/2bG7w+YQwHCMhciX0/rhzZOeK/nm4Gg3nVCW8MKBW4mCPbZgVJjiao\r\n5SQQbIGYcT0KyUNbfsCfWNJG4lg4tWM1fyYyXcO/5G8GKDeP0//JYmmU1HcF\r\niXQL/r4YlYlo7BmR0+LH+p0RDAr1JspnYfpEOcD9GTzN9VO+fPDWK7qY8vcL\r\n2B8gh2oVghoYDvSAVKzRsge1FGiStShsPS0soR37jt2/8NmakZu4QKAKQfur\r\nCnpwA9X5d0qa/i4n9R1RtBnFdtbdTBjxL4M=\r\n=yA2z\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"spikebot","email":"abatallah1214@gmail.com"},"maintainers":[{"name":"spikebot","email":"abatallah1214@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spike-player_1.2.5_1658091007290_0.6790811492352"},"_hasShrinkwrap":false,"deprecated":"new"},"1.2.6":{"name":"spike-player","version":"1.2.6","description":"Complete framework to facilitate music commands using discord.js v13","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","test":"jest test/test.js","clean":"rimraf dist","pre":"npm version prerelease --force && npm publish --access public --tag dev","prep":"npm run clean && npm run build","pub":"standard-version && conventional-changelog -p angular -i CHANGELOG.md -s && npm publish","docs:test":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml","docs":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml --output docs/docs.json"},"keywords":["music","player","bot","framework","discord","youtube","spotify","v13"],"dependencies":{"@discordjs/opus":"^0.8.0","@discordjs/voice":"^0.10.0","axios":"^0.22.0","axios-retry":"^3.2.0","discord-ytdl-core":"^5.0.4","domhandler":"^4.2.2","ffmpeg-static":"^4.4.0","htmlparser2":"^7.1.2","libsodium-wrappers":"^0.7.9","rimraf":"^3.0.2","spotify-url-info":"^2.2.3","youtubei":"^0.0.1-rc.34","ytdl-core":"^4.11.0","ytsr":"^3.8.0"},"devDependencies":{"@babel/cli":"^7.14.8","@babel/core":"^7.15.0","@babel/preset-env":"^7.15.0","@babel/preset-typescript":"^7.15.0","@commitlint/cli":"^17.0.3","@rocketseat/commitlint-config":"^0.0.3","@types/node":"^16.6.1","@typescript-eslint/eslint-plugin":"^4.29.1","@typescript-eslint/parser":"^4.29.1","assert-diff":"^3.0.2","discord.js":"^14.0.1","discord.js-docgen":"github:discordjs/docgen#ts-patch","eslint":"^7.32.0","jest":"^27.0.6","jsdoc-babel":"^0.5.0","ts-node":"^10.2.0","typescript":"^4.3.5"},"directories":{"doc":"docs","test":"test"},"engines":{"node":">=16.9.0"},"workspaces":["packages/*"],"packageManager":"npm@8.11.0","gitHead":"0d84403d7f3db24ac537bc4aa548e0abb54c6f3b","_id":"spike-player@1.2.6","_nodeVersion":"16.15.1","_npmVersion":"8.11.0","dist":{"integrity":"sha512-0lVdmevV1qTXwpmea5yq0eCXUSaxcjQy5xvt2Vx6OBa9mKRO844roeA1fK5RkBo9y+UR/rgBBSvjKrwBSpy/yg==","shasum":"819ca333377a5ab19109144bb254a8694a024ac9","tarball":"https://registry.npmjs.org/spike-player/-/spike-player-1.2.6.tgz","fileCount":29,"unpackedSize":100277,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIB/1eFxr+Hlu28cCnoNt1llOpJ/mTH6iK2ZdvbBvx+Y/AiEAhuMj4lHb1I0TS49yeiIMwag6sT/8RvpaNpRWbEPBmoM="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi1TvCACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmq/BhAAiZV2p1d+S12laCkf62TKyNvlyJj7ue2VcgRc5SsdUU1w5FUb\r\nV9PTOGZklhojtx+MLR63pDnrH+ltyGLknE8etAlO8cVnQIfodatbv06c6Xxt\r\nyljdtHQ3//eplmJAEAxqES924GnZ2zvfrbRzbb3v7ChHfPjNRjFkSBfA9J+7\r\nYAMnTDnfWZLaxxyMVQWYgC0sJChQM1H35Bbnm2a4QmQh2rbCgG0NOUoUdk4c\r\n1aCpZgk71d5477i4+SwVEaBvbMU0qE3HanrptohTroV/D3x3vmUGNxoFoXMo\r\nUP2oMALhZk1PVGPvQ8U6XbqCJ87JOHNBJeIAD26oNxwLA9NGxU4+tl1Oit9D\r\nkNr178tY1QAdpw8qt1iQqXxN27+3obIqKPm7nWtRIpNfQ1IeKJpcnay0X+Cz\r\novEXweUm5KtSh+IQbqxdASOASPuasjazAezY4zmiDZRKQ2MaTOj+QH19RSeY\r\nqQXvYbM6FwX09eL7EHT/sGJ0uPeHA2OnuKz2CL9bFyo5doZOJuSO+Hok693w\r\nemWNP8rd5adeXgDa+XAr2A/pB7eP4EbCpoovxHOuiYywZs+Ty9lvGcM/9fqJ\r\n+O31UopiAZdQPd46IebmZ71/pDAMOaWx/JuzvuoWL0vMHlYUtmlE7PBLQFPk\r\nbs5X4nb/xvQlhoZtKA2dEkIQiYw8Fxt27S4=\r\n=8Mkk\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"spikebot","email":"abatallah1214@gmail.com"},"maintainers":[{"name":"spikebot","email":"abatallah1214@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spike-player_1.2.6_1658141634607_0.08359635419426126"},"_hasShrinkwrap":false},"1.2.6-0":{"name":"spike-player","version":"1.2.6-0","description":"Complete framework to facilitate music commands using discord.js v13","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","test":"jest test/test.js","clean":"rimraf dist","pre":"npm version prerelease --force && npm publish --access public --tag dev","prep":"npm run clean && npm run build","pub":"standard-version && conventional-changelog -p angular -i CHANGELOG.md -s && npm publish","docs:test":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml","docs":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml --output docs/docs.json"},"keywords":["music","player","bot","framework","discord","youtube","spotify","v13"],"dependencies":{"@discordjs/opus":"^0.7.0","@discordjs/voice":"^0.10.0","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.29.0","@typescript-eslint/parser":"^5.29.0","axios":"^0.27.2","axios-retry":"^3.2.0","discord-ytdl-core":"^5.0.4","domhandler":"^5.0.3","eslint":"^8.18.0","ffmpeg-static":"^5.0.0","htmlparser2":"^8.0.1","jest":"^28.1.1","libsodium-wrappers":"^0.7.9","rimraf":"^3.0.2","soundcloud-scraper":"github:AnupKumarPanwar/soundcloud-scraper","spotify-url-info":"^3.1.2","youtubei":"^0.0.1-rc.34","ytdl-core":"^4.11.0","ytsr":"^3.8.0"},"devDependencies":{"@babel/cli":"^7.14.8","@babel/core":"^7.15.0","@babel/preset-env":"^7.15.0","@babel/preset-typescript":"^7.15.0","@commitlint/cli":"^17.0.3","@rocketseat/commitlint-config":"^0.0.3","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.29.0","@typescript-eslint/parser":"^5.29.0","assert-diff":"^3.0.2","discord.js":"^14.0.2","discord.js-docgen":"github:discordjs/docgen#ts-patch","eslint":"^8.18.0","jest":"^28.1.1","jsdoc-babel":"^0.5.0","ts-node":"^10.2.0","typescript":"^4.3.5"},"directories":{"doc":"docs","test":"test"},"engines":{"node":">=16.9.0"},"workspaces":["packages/*"],"packageManager":"npm@8.11.0","readme":"# Discord Music Player\r\n![npm](https://img.shields.io/npm/dt/discord-music-player?style=for-the-badge)\r\n![npm](https://img.shields.io/npm/v/discord-music-player?style=for-the-badge)\r\n![CodeFactor Grade](https://img.shields.io/codefactor/grade/github/SushiBtw/discord-music-player?color=%2348aaf1&style=for-the-badge)\r\n\r\n### Note: This is the v8 version of Discord Music Player for Discord.JS v13!\r\n\r\nDiscord Music Player is a powerful [Node.js](https://nodejs.org) module that allows you to easily implement music commands.\r\n**Everything** is customizable, and everything can be done using this package - **there are no limitations!**\r\n\r\nThis package supports YouTube Videos & Playlists, Spotify Songs & Playlists, Apple Music Songs & Playlists.\r\nPackage from version v7.0.0 is fully maintained by [SushiBtw](https://github.com/SushiBtw).\r\n\r\n### Requirements:\r\n- [Discord.js v13](https://www.npmjs.com/package/discord.js),\r\n- [Node.JS v16](https://nodejs.org/),\r\n\r\n# Installation\r\n*Node.JS v16 or newer is required to run this module.*\r\n```sh\r\nnpm install --save discord-music-player\r\n```\r\nInstall **@discordjs/opus**:\r\n```sh\r\nnpm install --save @discordjs/opus\r\n```\r\n**Install [FFMPEG](https://www.ffmpeg.org/download.html)!**\r\n\r\n# Documentation\r\n**Discord Music Player documentation: [https://discord-music-player.js.org/](https://discord-music-player.js.org/)**\r\n\r\n### **Need some help?**\r\nFeel free to join [Discord-Music-Player Discord Server](https://discord.gg/6fejZNsmFC) and ask us about DMP.\r\n\r\n# Getting Started\r\n**The code bellow, will show you how to use DMP in your code.**\r\n\r\n*Please define your **Player** after the **client/bot** definition.*\r\n\r\n[!] Remember to include the related voice **Intents** at the client options. [!]\r\n```js\r\nconst Discord = require(\"discord.js\");\r\nconst client = new Discord.Client({\r\n    intents: [Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES, Intents.FLAGS.GUILD_VOICE_STATES]\r\n});\r\nconst settings = {\r\n    prefix: '!',\r\n    token: 'YourBotTokenHere'\r\n};\r\n\r\nconst { Player } = require(\"discord-music-player\");\r\nconst player = new Player(client, {\r\n    leaveOnEmpty: false, // This options are optional.\r\n});\r\n// You can define the Player as *client.player* to easily access it.\r\nclient.player = player;\r\n\r\nclient.on(\"ready\", () => {\r\n    console.log(\"I am ready to Play with DMP 🎶\");\r\n});\r\n\r\nclient.login(settings.token);\r\n```\r\n\r\n# Example Usage\r\n```js\r\nconst { RepeatMode } = require('discord-music-player');\r\n\r\nclient.on('messageCreate', async (message) => {\r\n    const args = message.content.slice(settings.prefix.length).trim().split(/ +/g);\r\n    const command = args.shift();\r\n    let guildQueue = client.player.getQueue(message.guild.id);\r\n\r\n    if(command === 'play') {\r\n        let queue = client.player.createQueue(message.guild.id);\r\n        await queue.join(message.member.voice.channel);\r\n        let song = await queue.play(args.join(' ')).catch(_ => {\r\n            if(!guildQueue)\r\n                queue.stop();\r\n        });\r\n    }\r\n\r\n    if(command === 'playlist') {\r\n        let queue = client.player.createQueue(message.guild.id);\r\n        await queue.join(message.member.voice.channel);\r\n        let song = await queue.playlist(args.join(' ')).catch(_ => {\r\n            if(!guildQueue)\r\n                queue.stop();\r\n        });\r\n    }\r\n\r\n    if(command === 'skip') {\r\n        guildQueue.skip();\r\n    }\r\n\r\n    if(command === 'stop') {\r\n        guildQueue.stop();\r\n    }\r\n\r\n    if(command === 'removeLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.DISABLED); // or 0 instead of RepeatMode.DISABLED\r\n    }\r\n\r\n    if(command === 'toggleLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.SONG); // or 1 instead of RepeatMode.SONG\r\n    }\r\n\r\n    if(command === 'toggleQueueLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.QUEUE); // or 2 instead of RepeatMode.QUEUE\r\n    }\r\n\r\n    if(command === 'setVolume') {\r\n        guildQueue.setVolume(parseInt(args[0]));\r\n    }\r\n\r\n    if(command === 'seek') {\r\n        guildQueue.seek(parseInt(args[0]) * 1000);\r\n    }\r\n\r\n    if(command === 'clearQueue') {\r\n        guildQueue.clearQueue();\r\n    }\r\n\r\n    if(command === 'shuffle') {\r\n        guildQueue.shuffle();\r\n    }\r\n\r\n    if(command === 'getQueue') {\r\n        console.log(guildQueue);\r\n    }\r\n\r\n    if(command === 'getVolume') {\r\n        console.log(guildQueue.volume)\r\n    }\r\n\r\n    if(command === 'nowPlaying') {\r\n        console.log(`Now playing: ${guildQueue.nowPlaying}`);\r\n    }\r\n\r\n    if(command === 'pause') {\r\n        guildQueue.setPaused(true);\r\n    }\r\n\r\n    if(command === 'resume') {\r\n        guildQueue.setPaused(false);\r\n    }\r\n\r\n    if(command === 'remove') {\r\n        guildQueue.remove(parseInt(args[0]));\r\n    }\r\n\r\n    if(command === 'createProgressBar') {\r\n        const ProgressBar = guildQueue.createProgressBar();\r\n        \r\n        // [======>              ][00:35/2:20]\r\n        console.log(ProgressBar.prettier);\r\n    }\r\n})\r\n```\r\n\r\n### Events:\r\n```js\r\n// Init the event listener only once (at the top of your code).\r\nclient.player\r\n    // Emitted when channel was empty.\r\n    .on('channelEmpty',  (queue) =>\r\n        console.log(`Everyone left the Voice Channel, queue ended.`))\r\n    // Emitted when a song was added to the queue.\r\n    .on('songAdd',  (queue, song) =>\r\n        console.log(`Song ${song} was added to the queue.`))\r\n    // Emitted when a playlist was added to the queue.\r\n    .on('playlistAdd',  (queue, playlist) =>\r\n        console.log(`Playlist ${playlist} with ${playlist.songs.length} was added to the queue.`))\r\n    // Emitted when there was no more music to play.\r\n    .on('queueDestroyed',  (queue) =>\r\n        console.log(`The queue was destroyed.`))\r\n    // Emitted when the queue was destroyed (either by ending or stopping).    \r\n    .on('queueEnd',  (queue) =>\r\n        console.log(`The queue has ended.`))\r\n    // Emitted when a song changed.\r\n    .on('songChanged', (queue, newSong, oldSong) =>\r\n        console.log(`${newSong} is now playing.`))\r\n    // Emitted when a first song in the queue started playing.\r\n    .on('songFirst',  (queue, song) =>\r\n        console.log(`Started playing ${song}.`))\r\n    // Emitted when someone disconnected the bot from the channel.\r\n    .on('clientDisconnect', (queue) =>\r\n        console.log(`I was kicked from the Voice Channel, queue ended.`))\r\n    // Emitted when deafenOnJoin is true and the bot was undeafened\r\n    .on('clientUndeafen', (queue) =>\r\n        console.log(`I got undefeanded.`))\r\n    // Emitted when there was an error in runtime\r\n    .on('error', (error, queue) => {\r\n        console.log(`Error: ${error} in ${queue.guild.name}`);\r\n    });\r\n```\r\n\r\n# Passing custom data\r\n\r\n### Queue\r\nWhile running the `Queue#createQueue()` method you can pass a `options#data` object to hold custom data.\r\nThis can be made in two ways:\r\n```js\r\n// Pass custom data\r\nawait player.createQueue(message.guild.id, {\r\n    data: {\r\n        queueInitMessage: message,\r\n        myObject: 'this will stay with the queue :)',\r\n        more: 'add more... there are no limitations...'\r\n    }\r\n});\r\n// Or by using\r\nqueue.setData({\r\n    whatever: 'you want :D'\r\n});\r\n\r\n// Access custom data\r\nlet queue = player.getQueue(message.guild.id);\r\nlet initMessage = queue.data.queueInitMessage;\r\nawait initMessage.channel.send(`This message object is hold in Queue :D`);\r\n```\r\n\r\n### Song or Playlist\r\nWhile running the `Queue#play()`/Queue#playlist() method you can pass a `options#data` object to hold custom data.\r\nThis can be made in two ways:\r\n```js\r\n// Play the song\r\nlet song = await queue.play('Born in the USA!');\r\n// Set song data\r\nsong.setData({\r\n    initMessage: message\r\n});\r\n\r\n// Play the playlist\r\nlet playlist = await queue.playlist('https://www.youtube.com/playlist?list=PLDLGxnP4y2mGKGEqwxWTRkd3HtrrVTMdU');\r\n// Set playlist data (will set data for each song in the playlist)\r\nsong.setData({\r\n    initMessage: message\r\n});\r\n\r\n// Access custom data\r\nlet queue = player.getQueue(message.guild.id);\r\nlet { initMessage } = queue.nowPlaying.data;\r\nawait initMessage.channel.send(`This message object is hold in Song :D`);\r\n```\r\n","readmeFilename":"README.md","gitHead":"4b562d8a4808c29ac75b1c476c3e92f379807f98","_id":"spike-player@1.2.6-0","_nodeVersion":"16.15.1","_npmVersion":"8.11.0","dist":{"integrity":"sha512-uCF94lbUg1H7q6NDRnzAnKELVTHjk50alkYWKtbGy0SScaiYwOO7wcShcPVoMnHLy/BjyWjoLn2k/XHFcTmi9Q==","shasum":"47e8d9068f855ff00c825e121e24bf5e0b4de885","tarball":"https://registry.npmjs.org/spike-player/-/spike-player-1.2.6-0.tgz","fileCount":42,"unpackedSize":235653,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIF7ioWNB1KugdfWlLBrwV2+3vCLMqhvmmoR95RNGp/KaAiEAwGzwloSzFyx6q7aKMSgW1IHPf1K8xMYUOiq5ZYslij0="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi1Zf0ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqCOA/+Lp92Ou7HrXt+MHTtqhGdjGWWI8Rf0Bsw+ZgxdrKXrvH+Pamq\r\nYQuvvyU5SDmltQUilhBK1h1/24F9ecYtbusal9J5r6cGOc1/DxL6Lev9SO3M\r\nruLlRVoaPxG4Kf7T41TDdnoIE9Y14Vh50ApykCYP2ciDa4t9uS1H1wZctSX0\r\ndMjhCydtp+1QS2mv3Ce8kqY5FMP6iQtv6LcCVKl3W8BoksnTwh/LvtvUOepi\r\n21TgbCn6KVTRzfs19rxbPstdmUTo+S9nhreVh/MlHwZttD+YZeZPs5TugU9j\r\nJIjc+pgYJ+02pnYs8Z0qenPfpuCPcC8HlAf1xkI1F9A7rzjeSadiqAzuJb0G\r\nQVVKmI/MMW/4sEEVgRDY/WBqTF12uq4wUSByE8lRfwFlZ8HFw37EdBoGNHmB\r\ncDta0iLhWfMBf8s9+f/EsNYHkbf4LqUBXP3hydTCwMKuz9ALFxIvgSTyEehn\r\nyUQ96u6vUbMEqsesSvsavUWKv7tJtDUuijKoxLSji7vnBcnrxgG2tblRoMiQ\r\nBv4fSErjWH7KJmXtxgTKtTSW4VDnVoOvUUXL631D7SDWXXA8d/EYlJ2dgvxk\r\nV5WRIl3YxaohGwHrs+lKO4vgZl0/wUibtq2Pq0PMKqE/vB0OQCyo/eL2FOKY\r\nSBdqLM5fciux4RxCRE4SF/8Dh+8bq1M8HOY=\r\n=qoJA\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"spikebot","email":"abatallah1214@gmail.com"},"maintainers":[{"name":"spikebot","email":"abatallah1214@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spike-player_1.2.6-0_1658165236209_0.29962316597677896"},"_hasShrinkwrap":false},"1.2.6-1":{"name":"spike-player","version":"1.2.6-1","description":"Complete framework to facilitate music commands using discord.js v13","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","test":"jest test/test.js","clean":"rimraf dist","pre":"npm version prerelease --force && npm publish --access public --tag dev","prep":"npm run clean && npm run build","pub":"standard-version && conventional-changelog -p angular -i CHANGELOG.md -s && npm publish","docs:test":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml","docs":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml --output docs/docs.json"},"keywords":["music","player","bot","framework","discord","youtube","spotify","v13"],"dependencies":{"@discordjs/opus":"^0.7.0","@discordjs/voice":"^0.10.0","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.29.0","@typescript-eslint/parser":"^5.29.0","axios":"^0.27.2","axios-retry":"^3.2.0","discord-ytdl-core":"^5.0.4","domhandler":"^5.0.3","eslint":"^8.18.0","ffmpeg-static":"^5.0.0","htmlparser2":"^8.0.1","isomorphic-unfetch":"^3.1.0","jest":"^28.1.1","libsodium-wrappers":"^0.7.9","rimraf":"^3.0.2","soundcloud-scraper":"github:AnupKumarPanwar/soundcloud-scraper","spotify-url-info":"^3.1.2","youtubei":"^0.0.1-rc.34","ytdl-core":"^4.11.0","ytsr":"^3.8.0"},"devDependencies":{"@babel/cli":"^7.14.8","@babel/core":"^7.15.0","@babel/preset-env":"^7.15.0","@babel/preset-typescript":"^7.15.0","@commitlint/cli":"^17.0.3","@rocketseat/commitlint-config":"^0.0.3","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.29.0","@typescript-eslint/parser":"^5.29.0","assert-diff":"^3.0.2","discord.js":"^14.0.2","discord.js-docgen":"github:discordjs/docgen#ts-patch","eslint":"^8.18.0","jest":"^28.1.1","jsdoc-babel":"^0.5.0","ts-node":"^10.2.0","typescript":"^4.3.5"},"directories":{"doc":"docs","test":"test"},"engines":{"node":">=16.9.0"},"workspaces":["packages/*"],"packageManager":"npm@8.11.0","readme":"# Discord Music Player\r\n![npm](https://img.shields.io/npm/dt/discord-music-player?style=for-the-badge)\r\n![npm](https://img.shields.io/npm/v/discord-music-player?style=for-the-badge)\r\n![CodeFactor Grade](https://img.shields.io/codefactor/grade/github/SushiBtw/discord-music-player?color=%2348aaf1&style=for-the-badge)\r\n\r\n### Note: This is the v8 version of Discord Music Player for Discord.JS v13!\r\n\r\nDiscord Music Player is a powerful [Node.js](https://nodejs.org) module that allows you to easily implement music commands.\r\n**Everything** is customizable, and everything can be done using this package - **there are no limitations!**\r\n\r\nThis package supports YouTube Videos & Playlists, Spotify Songs & Playlists, Apple Music Songs & Playlists.\r\nPackage from version v7.0.0 is fully maintained by [SushiBtw](https://github.com/SushiBtw).\r\n\r\n### Requirements:\r\n- [Discord.js v13](https://www.npmjs.com/package/discord.js),\r\n- [Node.JS v16](https://nodejs.org/),\r\n\r\n# Installation\r\n*Node.JS v16 or newer is required to run this module.*\r\n```sh\r\nnpm install --save discord-music-player\r\n```\r\nInstall **@discordjs/opus**:\r\n```sh\r\nnpm install --save @discordjs/opus\r\n```\r\n**Install [FFMPEG](https://www.ffmpeg.org/download.html)!**\r\n\r\n# Documentation\r\n**Discord Music Player documentation: [https://discord-music-player.js.org/](https://discord-music-player.js.org/)**\r\n\r\n### **Need some help?**\r\nFeel free to join [Discord-Music-Player Discord Server](https://discord.gg/6fejZNsmFC) and ask us about DMP.\r\n\r\n# Getting Started\r\n**The code bellow, will show you how to use DMP in your code.**\r\n\r\n*Please define your **Player** after the **client/bot** definition.*\r\n\r\n[!] Remember to include the related voice **Intents** at the client options. [!]\r\n```js\r\nconst Discord = require(\"discord.js\");\r\nconst client = new Discord.Client({\r\n    intents: [Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES, Intents.FLAGS.GUILD_VOICE_STATES]\r\n});\r\nconst settings = {\r\n    prefix: '!',\r\n    token: 'YourBotTokenHere'\r\n};\r\n\r\nconst { Player } = require(\"discord-music-player\");\r\nconst player = new Player(client, {\r\n    leaveOnEmpty: false, // This options are optional.\r\n});\r\n// You can define the Player as *client.player* to easily access it.\r\nclient.player = player;\r\n\r\nclient.on(\"ready\", () => {\r\n    console.log(\"I am ready to Play with DMP 🎶\");\r\n});\r\n\r\nclient.login(settings.token);\r\n```\r\n\r\n# Example Usage\r\n```js\r\nconst { RepeatMode } = require('discord-music-player');\r\n\r\nclient.on('messageCreate', async (message) => {\r\n    const args = message.content.slice(settings.prefix.length).trim().split(/ +/g);\r\n    const command = args.shift();\r\n    let guildQueue = client.player.getQueue(message.guild.id);\r\n\r\n    if(command === 'play') {\r\n        let queue = client.player.createQueue(message.guild.id);\r\n        await queue.join(message.member.voice.channel);\r\n        let song = await queue.play(args.join(' ')).catch(_ => {\r\n            if(!guildQueue)\r\n                queue.stop();\r\n        });\r\n    }\r\n\r\n    if(command === 'playlist') {\r\n        let queue = client.player.createQueue(message.guild.id);\r\n        await queue.join(message.member.voice.channel);\r\n        let song = await queue.playlist(args.join(' ')).catch(_ => {\r\n            if(!guildQueue)\r\n                queue.stop();\r\n        });\r\n    }\r\n\r\n    if(command === 'skip') {\r\n        guildQueue.skip();\r\n    }\r\n\r\n    if(command === 'stop') {\r\n        guildQueue.stop();\r\n    }\r\n\r\n    if(command === 'removeLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.DISABLED); // or 0 instead of RepeatMode.DISABLED\r\n    }\r\n\r\n    if(command === 'toggleLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.SONG); // or 1 instead of RepeatMode.SONG\r\n    }\r\n\r\n    if(command === 'toggleQueueLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.QUEUE); // or 2 instead of RepeatMode.QUEUE\r\n    }\r\n\r\n    if(command === 'setVolume') {\r\n        guildQueue.setVolume(parseInt(args[0]));\r\n    }\r\n\r\n    if(command === 'seek') {\r\n        guildQueue.seek(parseInt(args[0]) * 1000);\r\n    }\r\n\r\n    if(command === 'clearQueue') {\r\n        guildQueue.clearQueue();\r\n    }\r\n\r\n    if(command === 'shuffle') {\r\n        guildQueue.shuffle();\r\n    }\r\n\r\n    if(command === 'getQueue') {\r\n        console.log(guildQueue);\r\n    }\r\n\r\n    if(command === 'getVolume') {\r\n        console.log(guildQueue.volume)\r\n    }\r\n\r\n    if(command === 'nowPlaying') {\r\n        console.log(`Now playing: ${guildQueue.nowPlaying}`);\r\n    }\r\n\r\n    if(command === 'pause') {\r\n        guildQueue.setPaused(true);\r\n    }\r\n\r\n    if(command === 'resume') {\r\n        guildQueue.setPaused(false);\r\n    }\r\n\r\n    if(command === 'remove') {\r\n        guildQueue.remove(parseInt(args[0]));\r\n    }\r\n\r\n    if(command === 'createProgressBar') {\r\n        const ProgressBar = guildQueue.createProgressBar();\r\n        \r\n        // [======>              ][00:35/2:20]\r\n        console.log(ProgressBar.prettier);\r\n    }\r\n})\r\n```\r\n\r\n### Events:\r\n```js\r\n// Init the event listener only once (at the top of your code).\r\nclient.player\r\n    // Emitted when channel was empty.\r\n    .on('channelEmpty',  (queue) =>\r\n        console.log(`Everyone left the Voice Channel, queue ended.`))\r\n    // Emitted when a song was added to the queue.\r\n    .on('songAdd',  (queue, song) =>\r\n        console.log(`Song ${song} was added to the queue.`))\r\n    // Emitted when a playlist was added to the queue.\r\n    .on('playlistAdd',  (queue, playlist) =>\r\n        console.log(`Playlist ${playlist} with ${playlist.songs.length} was added to the queue.`))\r\n    // Emitted when there was no more music to play.\r\n    .on('queueDestroyed',  (queue) =>\r\n        console.log(`The queue was destroyed.`))\r\n    // Emitted when the queue was destroyed (either by ending or stopping).    \r\n    .on('queueEnd',  (queue) =>\r\n        console.log(`The queue has ended.`))\r\n    // Emitted when a song changed.\r\n    .on('songChanged', (queue, newSong, oldSong) =>\r\n        console.log(`${newSong} is now playing.`))\r\n    // Emitted when a first song in the queue started playing.\r\n    .on('songFirst',  (queue, song) =>\r\n        console.log(`Started playing ${song}.`))\r\n    // Emitted when someone disconnected the bot from the channel.\r\n    .on('clientDisconnect', (queue) =>\r\n        console.log(`I was kicked from the Voice Channel, queue ended.`))\r\n    // Emitted when deafenOnJoin is true and the bot was undeafened\r\n    .on('clientUndeafen', (queue) =>\r\n        console.log(`I got undefeanded.`))\r\n    // Emitted when there was an error in runtime\r\n    .on('error', (error, queue) => {\r\n        console.log(`Error: ${error} in ${queue.guild.name}`);\r\n    });\r\n```\r\n\r\n# Passing custom data\r\n\r\n### Queue\r\nWhile running the `Queue#createQueue()` method you can pass a `options#data` object to hold custom data.\r\nThis can be made in two ways:\r\n```js\r\n// Pass custom data\r\nawait player.createQueue(message.guild.id, {\r\n    data: {\r\n        queueInitMessage: message,\r\n        myObject: 'this will stay with the queue :)',\r\n        more: 'add more... there are no limitations...'\r\n    }\r\n});\r\n// Or by using\r\nqueue.setData({\r\n    whatever: 'you want :D'\r\n});\r\n\r\n// Access custom data\r\nlet queue = player.getQueue(message.guild.id);\r\nlet initMessage = queue.data.queueInitMessage;\r\nawait initMessage.channel.send(`This message object is hold in Queue :D`);\r\n```\r\n\r\n### Song or Playlist\r\nWhile running the `Queue#play()`/Queue#playlist() method you can pass a `options#data` object to hold custom data.\r\nThis can be made in two ways:\r\n```js\r\n// Play the song\r\nlet song = await queue.play('Born in the USA!');\r\n// Set song data\r\nsong.setData({\r\n    initMessage: message\r\n});\r\n\r\n// Play the playlist\r\nlet playlist = await queue.playlist('https://www.youtube.com/playlist?list=PLDLGxnP4y2mGKGEqwxWTRkd3HtrrVTMdU');\r\n// Set playlist data (will set data for each song in the playlist)\r\nsong.setData({\r\n    initMessage: message\r\n});\r\n\r\n// Access custom data\r\nlet queue = player.getQueue(message.guild.id);\r\nlet { initMessage } = queue.nowPlaying.data;\r\nawait initMessage.channel.send(`This message object is hold in Song :D`);\r\n```\r\n","readmeFilename":"README.md","gitHead":"25d0e5d96f70c0d56d5056b1d8ede07c9e0a4e1e","_id":"spike-player@1.2.6-1","_nodeVersion":"16.15.1","_npmVersion":"8.11.0","dist":{"integrity":"sha512-PcfmEPnldnP28h3/zP4S2aYlYCavQAiqSW97I5PUGvXEyPpTQcX6c8nvkhEMj8WsPtkXWhkQo/ffdXaH2nglpg==","shasum":"953d9481fd7498c2e8c47a413eb75e6b265620d4","tarball":"https://registry.npmjs.org/spike-player/-/spike-player-1.2.6-1.tgz","fileCount":42,"unpackedSize":235694,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDKJNqzPd9Ya3vxzfPHeC8XQs5QNFzLvso6Dwh7rCrvsAiEAixz1/MmJK1e7FdvWOIpOg90brhIANB17NX9FH9LSnXo="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi1ZodACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpPkg//ariUqBxEzpdAAIh4mn3FyE7IN2adsfws8Gbg+aElWR2X+IDh\r\n1fXc1DymuNeZ2Ox2tHfHd/PsQGdzv4HHV0RcBWvZR6PodPv3iNI57G3Uo5r0\r\ns5iCKxg0uKC5tnfhiYWO6a3X5YQ4CA6p+N/qt08VfaqCF4ap/MKp21xaXtXQ\r\nJSmKoLK+dqUgZb1NjUnInSMSaUClX6KMIvNoPFWazqB73fzUol2EMpZ3UnjC\r\nfNDXul1Ni1/l3fAk2LwkUTdnR+NYPtMPN83UkVBWrjTuszKjknN4q5qmfmrX\r\nEwFcSrxxFJNEy6FrLYXhUFkqJ1Gw7yjZqxxUAAsWG6nKU9Q6d3Pd4bt/VoKT\r\nttG7X1Ustvwf2l0YUUshgrDvHkex1vlbt1MfLvkevhSCIwh9p9LlDPIYhRsZ\r\ngPm/U7cai1SofCrZc3+HfwE9t24NdBsIvVAmtM4QF56qChjfbi1yeN/h29hK\r\nb27pmpA3nkgHDXNBVZBiVc4IzVqhyxsRK/LfUzR8i+o2g/vqi/8Wv3zQ8RIQ\r\nUsBM2CMhbnQKucPfh0dDoBxENRaSf1XB/A2NFBaDhDK9FBDyOrYq79XexHCR\r\n5/33XuCFUx2+frbikiKZEPCHxiVFdW6ke5M8s7U9g/EjiR2QC5cP2A0rO/Ce\r\n0rFxS19ByDjbooxHAwXdJHHrIfag/rBZZBk=\r\n=2jb+\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"spikebot","email":"abatallah1214@gmail.com"},"maintainers":[{"name":"spikebot","email":"abatallah1214@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spike-player_1.2.6-1_1658165789038_0.9154853258327313"},"_hasShrinkwrap":false},"1.2.6-2":{"name":"spike-player","version":"1.2.6-2","description":"Complete framework to facilitate music commands using discord.js v13","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","test":"jest test/test.js","clean":"rimraf dist","pre":"npm version prerelease --force && npm publish --access public --tag dev","prep":"npm run clean && npm run build","pub":"standard-version && conventional-changelog -p angular -i CHANGELOG.md -s && npm publish","docs:test":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml","docs":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml --output docs/docs.json"},"keywords":["music","player","bot","framework","discord","youtube","spotify","v13"],"dependencies":{"@discordjs/opus":"^0.7.0","@discordjs/voice":"^0.10.0","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.29.0","@typescript-eslint/parser":"^5.29.0","axios":"^0.27.2","axios-retry":"^3.2.0","discord-ytdl-core":"^5.0.4","domhandler":"^5.0.3","eslint":"^8.18.0","ffmpeg-static":"^5.0.0","htmlparser2":"^8.0.1","isomorphic-unfetch":"^3.1.0","jest":"^28.1.1","libsodium-wrappers":"^0.7.9","rimraf":"^3.0.2","soundcloud-scraper":"github:AnupKumarPanwar/soundcloud-scraper","spotify-url-info":"^3.1.2","youtubei":"^0.0.1-rc.34","ytdl-core":"^4.11.0","ytsr":"^3.8.0"},"devDependencies":{"@babel/cli":"^7.14.8","@babel/core":"^7.15.0","@babel/preset-env":"^7.15.0","@babel/preset-typescript":"^7.15.0","@commitlint/cli":"^17.0.3","@rocketseat/commitlint-config":"^0.0.3","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.29.0","@typescript-eslint/parser":"^5.29.0","assert-diff":"^3.0.2","discord.js":"^14.0.2","discord.js-docgen":"github:discordjs/docgen#ts-patch","eslint":"^8.18.0","jest":"^28.1.1","jsdoc-babel":"^0.5.0","ts-node":"^10.2.0","typescript":"^4.3.5"},"directories":{"doc":"docs","test":"test"},"engines":{"node":">=16.9.0"},"workspaces":["packages/*"],"packageManager":"npm@8.11.0","readme":"# Discord Music Player\r\n![npm](https://img.shields.io/npm/dt/discord-music-player?style=for-the-badge)\r\n![npm](https://img.shields.io/npm/v/discord-music-player?style=for-the-badge)\r\n![CodeFactor Grade](https://img.shields.io/codefactor/grade/github/SushiBtw/discord-music-player?color=%2348aaf1&style=for-the-badge)\r\n\r\n### Note: This is the v8 version of Discord Music Player for Discord.JS v13!\r\n\r\nDiscord Music Player is a powerful [Node.js](https://nodejs.org) module that allows you to easily implement music commands.\r\n**Everything** is customizable, and everything can be done using this package - **there are no limitations!**\r\n\r\nThis package supports YouTube Videos & Playlists, Spotify Songs & Playlists, Apple Music Songs & Playlists.\r\nPackage from version v7.0.0 is fully maintained by [SushiBtw](https://github.com/SushiBtw).\r\n\r\n### Requirements:\r\n- [Discord.js v13](https://www.npmjs.com/package/discord.js),\r\n- [Node.JS v16](https://nodejs.org/),\r\n\r\n# Installation\r\n*Node.JS v16 or newer is required to run this module.*\r\n```sh\r\nnpm install --save discord-music-player\r\n```\r\nInstall **@discordjs/opus**:\r\n```sh\r\nnpm install --save @discordjs/opus\r\n```\r\n**Install [FFMPEG](https://www.ffmpeg.org/download.html)!**\r\n\r\n# Documentation\r\n**Discord Music Player documentation: [https://discord-music-player.js.org/](https://discord-music-player.js.org/)**\r\n\r\n### **Need some help?**\r\nFeel free to join [Discord-Music-Player Discord Server](https://discord.gg/6fejZNsmFC) and ask us about DMP.\r\n\r\n# Getting Started\r\n**The code bellow, will show you how to use DMP in your code.**\r\n\r\n*Please define your **Player** after the **client/bot** definition.*\r\n\r\n[!] Remember to include the related voice **Intents** at the client options. [!]\r\n```js\r\nconst Discord = require(\"discord.js\");\r\nconst client = new Discord.Client({\r\n    intents: [Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES, Intents.FLAGS.GUILD_VOICE_STATES]\r\n});\r\nconst settings = {\r\n    prefix: '!',\r\n    token: 'YourBotTokenHere'\r\n};\r\n\r\nconst { Player } = require(\"discord-music-player\");\r\nconst player = new Player(client, {\r\n    leaveOnEmpty: false, // This options are optional.\r\n});\r\n// You can define the Player as *client.player* to easily access it.\r\nclient.player = player;\r\n\r\nclient.on(\"ready\", () => {\r\n    console.log(\"I am ready to Play with DMP 🎶\");\r\n});\r\n\r\nclient.login(settings.token);\r\n```\r\n\r\n# Example Usage\r\n```js\r\nconst { RepeatMode } = require('discord-music-player');\r\n\r\nclient.on('messageCreate', async (message) => {\r\n    const args = message.content.slice(settings.prefix.length).trim().split(/ +/g);\r\n    const command = args.shift();\r\n    let guildQueue = client.player.getQueue(message.guild.id);\r\n\r\n    if(command === 'play') {\r\n        let queue = client.player.createQueue(message.guild.id);\r\n        await queue.join(message.member.voice.channel);\r\n        let song = await queue.play(args.join(' ')).catch(_ => {\r\n            if(!guildQueue)\r\n                queue.stop();\r\n        });\r\n    }\r\n\r\n    if(command === 'playlist') {\r\n        let queue = client.player.createQueue(message.guild.id);\r\n        await queue.join(message.member.voice.channel);\r\n        let song = await queue.playlist(args.join(' ')).catch(_ => {\r\n            if(!guildQueue)\r\n                queue.stop();\r\n        });\r\n    }\r\n\r\n    if(command === 'skip') {\r\n        guildQueue.skip();\r\n    }\r\n\r\n    if(command === 'stop') {\r\n        guildQueue.stop();\r\n    }\r\n\r\n    if(command === 'removeLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.DISABLED); // or 0 instead of RepeatMode.DISABLED\r\n    }\r\n\r\n    if(command === 'toggleLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.SONG); // or 1 instead of RepeatMode.SONG\r\n    }\r\n\r\n    if(command === 'toggleQueueLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.QUEUE); // or 2 instead of RepeatMode.QUEUE\r\n    }\r\n\r\n    if(command === 'setVolume') {\r\n        guildQueue.setVolume(parseInt(args[0]));\r\n    }\r\n\r\n    if(command === 'seek') {\r\n        guildQueue.seek(parseInt(args[0]) * 1000);\r\n    }\r\n\r\n    if(command === 'clearQueue') {\r\n        guildQueue.clearQueue();\r\n    }\r\n\r\n    if(command === 'shuffle') {\r\n        guildQueue.shuffle();\r\n    }\r\n\r\n    if(command === 'getQueue') {\r\n        console.log(guildQueue);\r\n    }\r\n\r\n    if(command === 'getVolume') {\r\n        console.log(guildQueue.volume)\r\n    }\r\n\r\n    if(command === 'nowPlaying') {\r\n        console.log(`Now playing: ${guildQueue.nowPlaying}`);\r\n    }\r\n\r\n    if(command === 'pause') {\r\n        guildQueue.setPaused(true);\r\n    }\r\n\r\n    if(command === 'resume') {\r\n        guildQueue.setPaused(false);\r\n    }\r\n\r\n    if(command === 'remove') {\r\n        guildQueue.remove(parseInt(args[0]));\r\n    }\r\n\r\n    if(command === 'createProgressBar') {\r\n        const ProgressBar = guildQueue.createProgressBar();\r\n        \r\n        // [======>              ][00:35/2:20]\r\n        console.log(ProgressBar.prettier);\r\n    }\r\n})\r\n```\r\n\r\n### Events:\r\n```js\r\n// Init the event listener only once (at the top of your code).\r\nclient.player\r\n    // Emitted when channel was empty.\r\n    .on('channelEmpty',  (queue) =>\r\n        console.log(`Everyone left the Voice Channel, queue ended.`))\r\n    // Emitted when a song was added to the queue.\r\n    .on('songAdd',  (queue, song) =>\r\n        console.log(`Song ${song} was added to the queue.`))\r\n    // Emitted when a playlist was added to the queue.\r\n    .on('playlistAdd',  (queue, playlist) =>\r\n        console.log(`Playlist ${playlist} with ${playlist.songs.length} was added to the queue.`))\r\n    // Emitted when there was no more music to play.\r\n    .on('queueDestroyed',  (queue) =>\r\n        console.log(`The queue was destroyed.`))\r\n    // Emitted when the queue was destroyed (either by ending or stopping).    \r\n    .on('queueEnd',  (queue) =>\r\n        console.log(`The queue has ended.`))\r\n    // Emitted when a song changed.\r\n    .on('songChanged', (queue, newSong, oldSong) =>\r\n        console.log(`${newSong} is now playing.`))\r\n    // Emitted when a first song in the queue started playing.\r\n    .on('songFirst',  (queue, song) =>\r\n        console.log(`Started playing ${song}.`))\r\n    // Emitted when someone disconnected the bot from the channel.\r\n    .on('clientDisconnect', (queue) =>\r\n        console.log(`I was kicked from the Voice Channel, queue ended.`))\r\n    // Emitted when deafenOnJoin is true and the bot was undeafened\r\n    .on('clientUndeafen', (queue) =>\r\n        console.log(`I got undefeanded.`))\r\n    // Emitted when there was an error in runtime\r\n    .on('error', (error, queue) => {\r\n        console.log(`Error: ${error} in ${queue.guild.name}`);\r\n    });\r\n```\r\n\r\n# Passing custom data\r\n\r\n### Queue\r\nWhile running the `Queue#createQueue()` method you can pass a `options#data` object to hold custom data.\r\nThis can be made in two ways:\r\n```js\r\n// Pass custom data\r\nawait player.createQueue(message.guild.id, {\r\n    data: {\r\n        queueInitMessage: message,\r\n        myObject: 'this will stay with the queue :)',\r\n        more: 'add more... there are no limitations...'\r\n    }\r\n});\r\n// Or by using\r\nqueue.setData({\r\n    whatever: 'you want :D'\r\n});\r\n\r\n// Access custom data\r\nlet queue = player.getQueue(message.guild.id);\r\nlet initMessage = queue.data.queueInitMessage;\r\nawait initMessage.channel.send(`This message object is hold in Queue :D`);\r\n```\r\n\r\n### Song or Playlist\r\nWhile running the `Queue#play()`/Queue#playlist() method you can pass a `options#data` object to hold custom data.\r\nThis can be made in two ways:\r\n```js\r\n// Play the song\r\nlet song = await queue.play('Born in the USA!');\r\n// Set song data\r\nsong.setData({\r\n    initMessage: message\r\n});\r\n\r\n// Play the playlist\r\nlet playlist = await queue.playlist('https://www.youtube.com/playlist?list=PLDLGxnP4y2mGKGEqwxWTRkd3HtrrVTMdU');\r\n// Set playlist data (will set data for each song in the playlist)\r\nsong.setData({\r\n    initMessage: message\r\n});\r\n\r\n// Access custom data\r\nlet queue = player.getQueue(message.guild.id);\r\nlet { initMessage } = queue.nowPlaying.data;\r\nawait initMessage.channel.send(`This message object is hold in Song :D`);\r\n```\r\n","readmeFilename":"README.md","gitHead":"ca73eaa090c38232a3d10efeb557e96bfba2565e","_id":"spike-player@1.2.6-2","_nodeVersion":"16.15.1","_npmVersion":"8.11.0","dist":{"integrity":"sha512-OgBpHIGvvEfLabmuA7d+YNb2sF94G3R+/bzcnsWdUsh5xhvu7lQwhWU77LRhVYtE/QlV1clTgq6C0DNpqeaEAQ==","shasum":"e8f520036249f7438e926b4c16533dc16169796c","tarball":"https://registry.npmjs.org/spike-player/-/spike-player-1.2.6-2.tgz","fileCount":42,"unpackedSize":235480,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIE5rDEzS3B/pmxFaFprqIJBFW7kDhfGxfRMAX1sZrTauAiBS9ORHdWqMJizJMBW0fkiYDt0b6SS8IdPDolU2v1sKEQ=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi1aBjACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoQNBAAoX+yUy/xtNr4thpimYgn2Uya69lmfkkugBLdhLEbw39CO/hr\r\nbLyZIDubp0wpJnTRwV1axd2sdfgl2tFEDvt/W8+8HcRCIHbmb3Q/m9sGkskb\r\nO7XZraYMiskeEb5xy5BiI/Sc/82XF7Ib8zBvyT5tbMtiiv0mmIbcjjsLyYnB\r\nDMPHVqLDDo/z6ND9iBQrYmXtDQANPJR8gkCldYM5i22raF3dm1IBOF/VsaIg\r\n3IJn7cN641IbOZk7vWzOecK1Q4g+MZiHWlVNiWle9isajzbi2ZwDhYtnoGPE\r\nPgblp3kbQ05APhR2KHQX1ptIoBq26AyzX73z1qaI/gporHm0e7iGlRq3oD92\r\nvazXz8/+0F5nO+O2bWLaimmGNZcZ2Ui+5ODcxcv9I8QmEmJhCCBODfE6KxH4\r\n7F7UOeJg3dIehSR9CKF95Xs8++Y4Jvy9DwGBOnkJK2KA5XYgoz5P/2VRBKUC\r\noLKasz9j8/kKx5VTYb8vvMykkspSXiYp0xGTNwCyrVKMHDSxrq2qLCgUbyO2\r\nhxkLsyjJ4SBu/J+197OiPFNGrEO6b7AuTua3a5jcaUre8GZxR6oTSEEg2scO\r\nvFGrRFakPi0X3oKVLltp4JZ34FvbqHzKZyBtbuV9kyip6yTJwKX2ZOcIlRwC\r\nf3p5AZ+AohkycbM6zlkAwmwScDzzk8jt/iw=\r\n=BREw\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"spikebot","email":"abatallah1214@gmail.com"},"maintainers":[{"name":"spikebot","email":"abatallah1214@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spike-player_1.2.6-2_1658167395546_0.14779045486106623"},"_hasShrinkwrap":false},"1.2.6-3":{"name":"spike-player","version":"1.2.6-3","description":"Complete framework to facilitate music commands using discord.js v13","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","test":"jest test/test.js","clean":"rimraf dist","pre":"npm version prerelease --force && npm publish --access public --tag dev","prep":"npm run clean && npm run build","pub":"standard-version && conventional-changelog -p angular -i CHANGELOG.md -s && npm publish","docs:test":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml","docs":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml --output docs/docs.json"},"keywords":["music","player","bot","framework","discord","youtube","spotify","v13"],"dependencies":{"@discordjs/opus":"^0.7.0","@discordjs/voice":"^0.10.0","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.29.0","@typescript-eslint/parser":"^5.29.0","axios":"^0.27.2","axios-retry":"^3.2.0","discord-ytdl-core":"^5.0.4","domhandler":"^5.0.3","eslint":"^8.18.0","ffmpeg-static":"^5.0.0","htmlparser2":"^8.0.1","isomorphic-unfetch":"^3.1.0","jest":"^28.1.1","libsodium-wrappers":"^0.7.9","rimraf":"^3.0.2","soundcloud-scraper":"github:AnupKumarPanwar/soundcloud-scraper","spotify-url-info":"^3.1.2","youtubei":"^0.0.1-rc.34","ytdl-core":"^4.11.0","ytsr":"^3.8.0"},"devDependencies":{"@babel/cli":"^7.14.8","@babel/core":"^7.15.0","@babel/preset-env":"^7.15.0","@babel/preset-typescript":"^7.15.0","@commitlint/cli":"^17.0.3","@rocketseat/commitlint-config":"^0.0.3","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.29.0","@typescript-eslint/parser":"^5.29.0","assert-diff":"^3.0.2","discord.js":"^14.0.2","discord.js-docgen":"github:discordjs/docgen#ts-patch","eslint":"^8.18.0","jest":"^28.1.1","jsdoc-babel":"^0.5.0","ts-node":"^10.2.0","typescript":"^4.3.5"},"directories":{"doc":"docs","test":"test"},"engines":{"node":">=16.9.0"},"workspaces":["packages/*"],"packageManager":"npm@8.11.0","readme":"# Discord Music Player\r\n![npm](https://img.shields.io/npm/dt/discord-music-player?style=for-the-badge)\r\n![npm](https://img.shields.io/npm/v/discord-music-player?style=for-the-badge)\r\n![CodeFactor Grade](https://img.shields.io/codefactor/grade/github/SushiBtw/discord-music-player?color=%2348aaf1&style=for-the-badge)\r\n\r\n### Note: This is the v8 version of Discord Music Player for Discord.JS v13!\r\n\r\nDiscord Music Player is a powerful [Node.js](https://nodejs.org) module that allows you to easily implement music commands.\r\n**Everything** is customizable, and everything can be done using this package - **there are no limitations!**\r\n\r\nThis package supports YouTube Videos & Playlists, Spotify Songs & Playlists, Apple Music Songs & Playlists.\r\nPackage from version v7.0.0 is fully maintained by [SushiBtw](https://github.com/SushiBtw).\r\n\r\n### Requirements:\r\n- [Discord.js v13](https://www.npmjs.com/package/discord.js),\r\n- [Node.JS v16](https://nodejs.org/),\r\n\r\n# Installation\r\n*Node.JS v16 or newer is required to run this module.*\r\n```sh\r\nnpm install --save discord-music-player\r\n```\r\nInstall **@discordjs/opus**:\r\n```sh\r\nnpm install --save @discordjs/opus\r\n```\r\n**Install [FFMPEG](https://www.ffmpeg.org/download.html)!**\r\n\r\n# Documentation\r\n**Discord Music Player documentation: [https://discord-music-player.js.org/](https://discord-music-player.js.org/)**\r\n\r\n### **Need some help?**\r\nFeel free to join [Discord-Music-Player Discord Server](https://discord.gg/6fejZNsmFC) and ask us about DMP.\r\n\r\n# Getting Started\r\n**The code bellow, will show you how to use DMP in your code.**\r\n\r\n*Please define your **Player** after the **client/bot** definition.*\r\n\r\n[!] Remember to include the related voice **Intents** at the client options. [!]\r\n```js\r\nconst Discord = require(\"discord.js\");\r\nconst client = new Discord.Client({\r\n    intents: [Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES, Intents.FLAGS.GUILD_VOICE_STATES]\r\n});\r\nconst settings = {\r\n    prefix: '!',\r\n    token: 'YourBotTokenHere'\r\n};\r\n\r\nconst { Player } = require(\"discord-music-player\");\r\nconst player = new Player(client, {\r\n    leaveOnEmpty: false, // This options are optional.\r\n});\r\n// You can define the Player as *client.player* to easily access it.\r\nclient.player = player;\r\n\r\nclient.on(\"ready\", () => {\r\n    console.log(\"I am ready to Play with DMP 🎶\");\r\n});\r\n\r\nclient.login(settings.token);\r\n```\r\n\r\n# Example Usage\r\n```js\r\nconst { RepeatMode } = require('discord-music-player');\r\n\r\nclient.on('messageCreate', async (message) => {\r\n    const args = message.content.slice(settings.prefix.length).trim().split(/ +/g);\r\n    const command = args.shift();\r\n    let guildQueue = client.player.getQueue(message.guild.id);\r\n\r\n    if(command === 'play') {\r\n        let queue = client.player.createQueue(message.guild.id);\r\n        await queue.join(message.member.voice.channel);\r\n        let song = await queue.play(args.join(' ')).catch(_ => {\r\n            if(!guildQueue)\r\n                queue.stop();\r\n        });\r\n    }\r\n\r\n    if(command === 'playlist') {\r\n        let queue = client.player.createQueue(message.guild.id);\r\n        await queue.join(message.member.voice.channel);\r\n        let song = await queue.playlist(args.join(' ')).catch(_ => {\r\n            if(!guildQueue)\r\n                queue.stop();\r\n        });\r\n    }\r\n\r\n    if(command === 'skip') {\r\n        guildQueue.skip();\r\n    }\r\n\r\n    if(command === 'stop') {\r\n        guildQueue.stop();\r\n    }\r\n\r\n    if(command === 'removeLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.DISABLED); // or 0 instead of RepeatMode.DISABLED\r\n    }\r\n\r\n    if(command === 'toggleLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.SONG); // or 1 instead of RepeatMode.SONG\r\n    }\r\n\r\n    if(command === 'toggleQueueLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.QUEUE); // or 2 instead of RepeatMode.QUEUE\r\n    }\r\n\r\n    if(command === 'setVolume') {\r\n        guildQueue.setVolume(parseInt(args[0]));\r\n    }\r\n\r\n    if(command === 'seek') {\r\n        guildQueue.seek(parseInt(args[0]) * 1000);\r\n    }\r\n\r\n    if(command === 'clearQueue') {\r\n        guildQueue.clearQueue();\r\n    }\r\n\r\n    if(command === 'shuffle') {\r\n        guildQueue.shuffle();\r\n    }\r\n\r\n    if(command === 'getQueue') {\r\n        console.log(guildQueue);\r\n    }\r\n\r\n    if(command === 'getVolume') {\r\n        console.log(guildQueue.volume)\r\n    }\r\n\r\n    if(command === 'nowPlaying') {\r\n        console.log(`Now playing: ${guildQueue.nowPlaying}`);\r\n    }\r\n\r\n    if(command === 'pause') {\r\n        guildQueue.setPaused(true);\r\n    }\r\n\r\n    if(command === 'resume') {\r\n        guildQueue.setPaused(false);\r\n    }\r\n\r\n    if(command === 'remove') {\r\n        guildQueue.remove(parseInt(args[0]));\r\n    }\r\n\r\n    if(command === 'createProgressBar') {\r\n        const ProgressBar = guildQueue.createProgressBar();\r\n        \r\n        // [======>              ][00:35/2:20]\r\n        console.log(ProgressBar.prettier);\r\n    }\r\n})\r\n```\r\n\r\n### Events:\r\n```js\r\n// Init the event listener only once (at the top of your code).\r\nclient.player\r\n    // Emitted when channel was empty.\r\n    .on('channelEmpty',  (queue) =>\r\n        console.log(`Everyone left the Voice Channel, queue ended.`))\r\n    // Emitted when a song was added to the queue.\r\n    .on('songAdd',  (queue, song) =>\r\n        console.log(`Song ${song} was added to the queue.`))\r\n    // Emitted when a playlist was added to the queue.\r\n    .on('playlistAdd',  (queue, playlist) =>\r\n        console.log(`Playlist ${playlist} with ${playlist.songs.length} was added to the queue.`))\r\n    // Emitted when there was no more music to play.\r\n    .on('queueDestroyed',  (queue) =>\r\n        console.log(`The queue was destroyed.`))\r\n    // Emitted when the queue was destroyed (either by ending or stopping).    \r\n    .on('queueEnd',  (queue) =>\r\n        console.log(`The queue has ended.`))\r\n    // Emitted when a song changed.\r\n    .on('songChanged', (queue, newSong, oldSong) =>\r\n        console.log(`${newSong} is now playing.`))\r\n    // Emitted when a first song in the queue started playing.\r\n    .on('songFirst',  (queue, song) =>\r\n        console.log(`Started playing ${song}.`))\r\n    // Emitted when someone disconnected the bot from the channel.\r\n    .on('clientDisconnect', (queue) =>\r\n        console.log(`I was kicked from the Voice Channel, queue ended.`))\r\n    // Emitted when deafenOnJoin is true and the bot was undeafened\r\n    .on('clientUndeafen', (queue) =>\r\n        console.log(`I got undefeanded.`))\r\n    // Emitted when there was an error in runtime\r\n    .on('error', (error, queue) => {\r\n        console.log(`Error: ${error} in ${queue.guild.name}`);\r\n    });\r\n```\r\n\r\n# Passing custom data\r\n\r\n### Queue\r\nWhile running the `Queue#createQueue()` method you can pass a `options#data` object to hold custom data.\r\nThis can be made in two ways:\r\n```js\r\n// Pass custom data\r\nawait player.createQueue(message.guild.id, {\r\n    data: {\r\n        queueInitMessage: message,\r\n        myObject: 'this will stay with the queue :)',\r\n        more: 'add more... there are no limitations...'\r\n    }\r\n});\r\n// Or by using\r\nqueue.setData({\r\n    whatever: 'you want :D'\r\n});\r\n\r\n// Access custom data\r\nlet queue = player.getQueue(message.guild.id);\r\nlet initMessage = queue.data.queueInitMessage;\r\nawait initMessage.channel.send(`This message object is hold in Queue :D`);\r\n```\r\n\r\n### Song or Playlist\r\nWhile running the `Queue#play()`/Queue#playlist() method you can pass a `options#data` object to hold custom data.\r\nThis can be made in two ways:\r\n```js\r\n// Play the song\r\nlet song = await queue.play('Born in the USA!');\r\n// Set song data\r\nsong.setData({\r\n    initMessage: message\r\n});\r\n\r\n// Play the playlist\r\nlet playlist = await queue.playlist('https://www.youtube.com/playlist?list=PLDLGxnP4y2mGKGEqwxWTRkd3HtrrVTMdU');\r\n// Set playlist data (will set data for each song in the playlist)\r\nsong.setData({\r\n    initMessage: message\r\n});\r\n\r\n// Access custom data\r\nlet queue = player.getQueue(message.guild.id);\r\nlet { initMessage } = queue.nowPlaying.data;\r\nawait initMessage.channel.send(`This message object is hold in Song :D`);\r\n```\r\n","readmeFilename":"README.md","gitHead":"fe1a8b2b1f07991c18f10fb7ecca5bbff9f45800","_id":"spike-player@1.2.6-3","_nodeVersion":"16.15.1","_npmVersion":"8.11.0","dist":{"integrity":"sha512-TEM6Gsd0bq2xCqBZX+anPmY4Kos1cbLHuQJlrxHvd78Jg0cQCuhgrYGDk21hdohjVs6Nbkw6F+h5ZQli0hAjjg==","shasum":"b99973c360ccca299c99bdd5f366ce0497fe8643","tarball":"https://registry.npmjs.org/spike-player/-/spike-player-1.2.6-3.tgz","fileCount":42,"unpackedSize":235502,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICzWuumqSF8WNk7Tx3a1HOyBCBy7nOlkHNd7BT/jcHmyAiARESlHfhEUYNYSfDH/O/MDieqWVESxun1/7OVWf/Q7sQ=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi1aKgACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmohIg/7BeNxcgKaBWZFwSxiA1knFyQeltGXBXjh6vmuH+9i4crukUTs\r\nKdYXACi/N/JBxP56XuEqKaLzU2ES1LIevoSrIYqUCFJe8RvL0erGuQjDrk9j\r\nCL0lHhha/u5pV6y688tHEY3pRjqAaDIZO98IsU6kNsoD+2RldXzJcf5STJh3\r\nCWXzui6i/0z7xHtGK0W5m/DPEOun8wD8In50u8U2sxEhvW91dGGnRrVgpKum\r\nwkSepo/SxuRiMy2sUgP1NhLik+5pvT42jSACc2qHgcVwHvOqDrDJ1x+ja6g5\r\nwieH05+pHLyHgo9VX72qyWIwSvnLULxQ2LAvMNooyPNv+051IW5jq5QiMCp/\r\nuafm7Ee0zcbCSU7UZPIDlYG52pdVxhzwnwWuvq075gIvFfv67C785J5f37aJ\r\nU7G5zURbjuxHqm//cAC0HyAE3NJEKwt1AOg0t9C8Ai9TLa2/tZ4xVvXOuqQX\r\nkKGPbssw5c4I5zgR7tWRqAv/JF9//8oyIm5UvOXBrfWjPorN/9fCe65cKKqZ\r\nuWD3Efs3G6QVwqGmstwZuZ0Vk5EXe49nb38HmTRfcMipoY1QqYu71hmBEq7S\r\nM9i+VZ6/mqQak7HrvQXWY1/gAFU54gzUtsoXqPk35PhDxnnRrkxsEI9nKLdb\r\ngumxVAqE0zOBIHJbUovHMAJxvxkAtEmFWfg=\r\n=RmES\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"spikebot","email":"abatallah1214@gmail.com"},"maintainers":[{"name":"spikebot","email":"abatallah1214@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spike-player_1.2.6-3_1658167968267_0.2061743480989371"},"_hasShrinkwrap":false},"1.2.7-0":{"name":"spike-player","version":"1.2.7-0","description":"Complete framework to facilitate music commands using discord.js v13","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","test":"jest test/test.js","clean":"rimraf dist","pre":"npm version prerelease --force && npm publish --access public --tag dev","prep":"npm run clean && npm run build","pub":"standard-version && conventional-changelog -p angular -i CHANGELOG.md -s && npm publish","docs:test":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml","docs":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml --output docs/docs.json"},"keywords":["music","player","bot","framework","discord","youtube","spotify","v13"],"dependencies":{"@discordjs/opus":"^0.7.0","@discordjs/voice":"^0.10.0","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.29.0","@typescript-eslint/parser":"^5.29.0","axios":"^0.27.2","axios-retry":"^3.2.0","discord-ytdl-core":"^5.0.4","domhandler":"^5.0.3","eslint":"^8.18.0","ffmpeg-static":"^5.0.0","htmlparser2":"^8.0.1","isomorphic-unfetch":"^3.1.0","jest":"^28.1.1","libsodium-wrappers":"^0.7.9","rimraf":"^3.0.2","soundcloud-scraper":"github:AnupKumarPanwar/soundcloud-scraper","spotify-url-info":"^3.1.2","youtubei":"^0.0.1-rc.34","ytdl-core":"^4.11.0","ytsr":"^3.8.0"},"devDependencies":{"@babel/cli":"^7.14.8","@babel/core":"^7.15.0","@babel/preset-env":"^7.15.0","@babel/preset-typescript":"^7.15.0","@commitlint/cli":"^17.0.3","@rocketseat/commitlint-config":"^0.0.3","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.29.0","@typescript-eslint/parser":"^5.29.0","assert-diff":"^3.0.2","discord.js":"^14.0.2","discord.js-docgen":"github:discordjs/docgen#ts-patch","eslint":"^8.18.0","jest":"^28.1.1","jsdoc-babel":"^0.5.0","ts-node":"^10.2.0","typescript":"^4.3.5"},"directories":{"doc":"docs","test":"test"},"engines":{"node":">=16.9.0"},"workspaces":["packages/*"],"packageManager":"npm@8.11.0","readme":"# Discord Music Player\r\n![npm](https://img.shields.io/npm/dt/discord-music-player?style=for-the-badge)\r\n![npm](https://img.shields.io/npm/v/discord-music-player?style=for-the-badge)\r\n![CodeFactor Grade](https://img.shields.io/codefactor/grade/github/SushiBtw/discord-music-player?color=%2348aaf1&style=for-the-badge)\r\n\r\n### Note: This is the v8 version of Discord Music Player for Discord.JS v13!\r\n\r\nDiscord Music Player is a powerful [Node.js](https://nodejs.org) module that allows you to easily implement music commands.\r\n**Everything** is customizable, and everything can be done using this package - **there are no limitations!**\r\n\r\nThis package supports YouTube Videos & Playlists, Spotify Songs & Playlists, Apple Music Songs & Playlists.\r\nPackage from version v7.0.0 is fully maintained by [SushiBtw](https://github.com/SushiBtw).\r\n\r\n### Requirements:\r\n- [Discord.js v13](https://www.npmjs.com/package/discord.js),\r\n- [Node.JS v16](https://nodejs.org/),\r\n\r\n# Installation\r\n*Node.JS v16 or newer is required to run this module.*\r\n```sh\r\nnpm install --save discord-music-player\r\n```\r\nInstall **@discordjs/opus**:\r\n```sh\r\nnpm install --save @discordjs/opus\r\n```\r\n**Install [FFMPEG](https://www.ffmpeg.org/download.html)!**\r\n\r\n# Documentation\r\n**Discord Music Player documentation: [https://discord-music-player.js.org/](https://discord-music-player.js.org/)**\r\n\r\n### **Need some help?**\r\nFeel free to join [Discord-Music-Player Discord Server](https://discord.gg/6fejZNsmFC) and ask us about DMP.\r\n\r\n# Getting Started\r\n**The code bellow, will show you how to use DMP in your code.**\r\n\r\n*Please define your **Player** after the **client/bot** definition.*\r\n\r\n[!] Remember to include the related voice **Intents** at the client options. [!]\r\n```js\r\nconst Discord = require(\"discord.js\");\r\nconst client = new Discord.Client({\r\n    intents: [Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES, Intents.FLAGS.GUILD_VOICE_STATES]\r\n});\r\nconst settings = {\r\n    prefix: '!',\r\n    token: 'YourBotTokenHere'\r\n};\r\n\r\nconst { Player } = require(\"discord-music-player\");\r\nconst player = new Player(client, {\r\n    leaveOnEmpty: false, // This options are optional.\r\n});\r\n// You can define the Player as *client.player* to easily access it.\r\nclient.player = player;\r\n\r\nclient.on(\"ready\", () => {\r\n    console.log(\"I am ready to Play with DMP 🎶\");\r\n});\r\n\r\nclient.login(settings.token);\r\n```\r\n\r\n# Example Usage\r\n```js\r\nconst { RepeatMode } = require('discord-music-player');\r\n\r\nclient.on('messageCreate', async (message) => {\r\n    const args = message.content.slice(settings.prefix.length).trim().split(/ +/g);\r\n    const command = args.shift();\r\n    let guildQueue = client.player.getQueue(message.guild.id);\r\n\r\n    if(command === 'play') {\r\n        let queue = client.player.createQueue(message.guild.id);\r\n        await queue.join(message.member.voice.channel);\r\n        let song = await queue.play(args.join(' ')).catch(_ => {\r\n            if(!guildQueue)\r\n                queue.stop();\r\n        });\r\n    }\r\n\r\n    if(command === 'playlist') {\r\n        let queue = client.player.createQueue(message.guild.id);\r\n        await queue.join(message.member.voice.channel);\r\n        let song = await queue.playlist(args.join(' ')).catch(_ => {\r\n            if(!guildQueue)\r\n                queue.stop();\r\n        });\r\n    }\r\n\r\n    if(command === 'skip') {\r\n        guildQueue.skip();\r\n    }\r\n\r\n    if(command === 'stop') {\r\n        guildQueue.stop();\r\n    }\r\n\r\n    if(command === 'removeLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.DISABLED); // or 0 instead of RepeatMode.DISABLED\r\n    }\r\n\r\n    if(command === 'toggleLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.SONG); // or 1 instead of RepeatMode.SONG\r\n    }\r\n\r\n    if(command === 'toggleQueueLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.QUEUE); // or 2 instead of RepeatMode.QUEUE\r\n    }\r\n\r\n    if(command === 'setVolume') {\r\n        guildQueue.setVolume(parseInt(args[0]));\r\n    }\r\n\r\n    if(command === 'seek') {\r\n        guildQueue.seek(parseInt(args[0]) * 1000);\r\n    }\r\n\r\n    if(command === 'clearQueue') {\r\n        guildQueue.clearQueue();\r\n    }\r\n\r\n    if(command === 'shuffle') {\r\n        guildQueue.shuffle();\r\n    }\r\n\r\n    if(command === 'getQueue') {\r\n        console.log(guildQueue);\r\n    }\r\n\r\n    if(command === 'getVolume') {\r\n        console.log(guildQueue.volume)\r\n    }\r\n\r\n    if(command === 'nowPlaying') {\r\n        console.log(`Now playing: ${guildQueue.nowPlaying}`);\r\n    }\r\n\r\n    if(command === 'pause') {\r\n        guildQueue.setPaused(true);\r\n    }\r\n\r\n    if(command === 'resume') {\r\n        guildQueue.setPaused(false);\r\n    }\r\n\r\n    if(command === 'remove') {\r\n        guildQueue.remove(parseInt(args[0]));\r\n    }\r\n\r\n    if(command === 'createProgressBar') {\r\n        const ProgressBar = guildQueue.createProgressBar();\r\n        \r\n        // [======>              ][00:35/2:20]\r\n        console.log(ProgressBar.prettier);\r\n    }\r\n})\r\n```\r\n\r\n### Events:\r\n```js\r\n// Init the event listener only once (at the top of your code).\r\nclient.player\r\n    // Emitted when channel was empty.\r\n    .on('channelEmpty',  (queue) =>\r\n        console.log(`Everyone left the Voice Channel, queue ended.`))\r\n    // Emitted when a song was added to the queue.\r\n    .on('songAdd',  (queue, song) =>\r\n        console.log(`Song ${song} was added to the queue.`))\r\n    // Emitted when a playlist was added to the queue.\r\n    .on('playlistAdd',  (queue, playlist) =>\r\n        console.log(`Playlist ${playlist} with ${playlist.songs.length} was added to the queue.`))\r\n    // Emitted when there was no more music to play.\r\n    .on('queueDestroyed',  (queue) =>\r\n        console.log(`The queue was destroyed.`))\r\n    // Emitted when the queue was destroyed (either by ending or stopping).    \r\n    .on('queueEnd',  (queue) =>\r\n        console.log(`The queue has ended.`))\r\n    // Emitted when a song changed.\r\n    .on('songChanged', (queue, newSong, oldSong) =>\r\n        console.log(`${newSong} is now playing.`))\r\n    // Emitted when a first song in the queue started playing.\r\n    .on('songFirst',  (queue, song) =>\r\n        console.log(`Started playing ${song}.`))\r\n    // Emitted when someone disconnected the bot from the channel.\r\n    .on('clientDisconnect', (queue) =>\r\n        console.log(`I was kicked from the Voice Channel, queue ended.`))\r\n    // Emitted when deafenOnJoin is true and the bot was undeafened\r\n    .on('clientUndeafen', (queue) =>\r\n        console.log(`I got undefeanded.`))\r\n    // Emitted when there was an error in runtime\r\n    .on('error', (error, queue) => {\r\n        console.log(`Error: ${error} in ${queue.guild.name}`);\r\n    });\r\n```\r\n\r\n# Passing custom data\r\n\r\n### Queue\r\nWhile running the `Queue#createQueue()` method you can pass a `options#data` object to hold custom data.\r\nThis can be made in two ways:\r\n```js\r\n// Pass custom data\r\nawait player.createQueue(message.guild.id, {\r\n    data: {\r\n        queueInitMessage: message,\r\n        myObject: 'this will stay with the queue :)',\r\n        more: 'add more... there are no limitations...'\r\n    }\r\n});\r\n// Or by using\r\nqueue.setData({\r\n    whatever: 'you want :D'\r\n});\r\n\r\n// Access custom data\r\nlet queue = player.getQueue(message.guild.id);\r\nlet initMessage = queue.data.queueInitMessage;\r\nawait initMessage.channel.send(`This message object is hold in Queue :D`);\r\n```\r\n\r\n### Song or Playlist\r\nWhile running the `Queue#play()`/Queue#playlist() method you can pass a `options#data` object to hold custom data.\r\nThis can be made in two ways:\r\n```js\r\n// Play the song\r\nlet song = await queue.play('Born in the USA!');\r\n// Set song data\r\nsong.setData({\r\n    initMessage: message\r\n});\r\n\r\n// Play the playlist\r\nlet playlist = await queue.playlist('https://www.youtube.com/playlist?list=PLDLGxnP4y2mGKGEqwxWTRkd3HtrrVTMdU');\r\n// Set playlist data (will set data for each song in the playlist)\r\nsong.setData({\r\n    initMessage: message\r\n});\r\n\r\n// Access custom data\r\nlet queue = player.getQueue(message.guild.id);\r\nlet { initMessage } = queue.nowPlaying.data;\r\nawait initMessage.channel.send(`This message object is hold in Song :D`);\r\n```\r\n","readmeFilename":"README.md","gitHead":"f14a417e55a28ddbd0223a96acb8d104cc60e50d","_id":"spike-player@1.2.7-0","_nodeVersion":"16.15.1","_npmVersion":"8.11.0","dist":{"integrity":"sha512-2pj5JmNu12LFxDuAOHhxCQDGLFVPI8A8KTk31uIdOrDru4VY1QcIoSjcEWS9Vw8WgAdxcGTpoGrapFOK/k+fFg==","shasum":"8a1f3f91e55d3b3efa11b0a969e4876a950ba3ae","tarball":"https://registry.npmjs.org/spike-player/-/spike-player-1.2.7-0.tgz","fileCount":42,"unpackedSize":235906,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCZKnVypbG3aJPrP5QKU6UBeU/HxdNOghzCpPgWNkPg8wIhAPTuXIeKFjLUwZNHZGxKwfFH43rkK/m1I93d+j0bcvMd"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi1aS1ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoPmA/8Dl90gAfbJG1all2GOqUZarEYjJ974oO/86RRf1gvI6bF4vEA\r\nKEGGn60eZq6nz1xiNRav/i+FhyTW0lz1oo/3ZPtfpmiQeMpFVxraxatXghkS\r\nXRHB2N9igE+ocS/DjAzb6OdpYxsq1T5xY7DcWf5QOx2AZ3XCzEf35zy8SXGY\r\nB66W8Eh9FS6tLWhOf7bYVzp3xCr3nGAFM+CPLd61ZLMUghZ2sc3rgkfialy9\r\n1LJlWlnV/vsTgpj4QOfbuvlA40NExdmTrhZ9BW2w2VkcWwes7hYQZgJKWfER\r\n5sBiyyeWA4k8up+/RWGvhs1do9gZNUtWE3pgsuspIiXQmwmusU0YxY7aNoxs\r\n/yYofZSXoNo23/futM5QAFnskvk5Y/PV8X2cFpIXgezaAQBGnng++OUvFmaz\r\nJRvYR9xDOBQFdyjSxEgn84uNdC8ocNqYJYLFUX97r0ssmkDVIbmkrAoH0b/F\r\ngh/u5GnqDXexEZFn3fon0Fgaf/uPv+6IkjH8d+2B4/wHBCq9iXF9E9w+hE3u\r\nFSilVPpRJ+NW/a/E+2HG2hIkSeT+AXz94ui39Y5cACXoZKfG3HB5eRXQxKiq\r\nkwUu0oC9agLD7BCAL3h8R8dODAH0bfKznOxPejpR5VR4uBTVe0NPj1Va9UUI\r\nKBFHcCUeCRyQBo9Zta5jdoEkZAFs+5q6oiY=\r\n=QwyI\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"spikebot","email":"abatallah1214@gmail.com"},"maintainers":[{"name":"spikebot","email":"abatallah1214@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spike-player_1.2.7-0_1658168501028_0.034366337306882766"},"_hasShrinkwrap":false},"1.2.6-4":{"name":"spike-player","version":"1.2.6-4","description":"Complete framework to facilitate music commands using discord.js v13","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","test":"jest test/test.js","clean":"rimraf dist","pre":"npm version prerelease --force && npm publish --access public --tag dev","prep":"npm run clean && npm run build","pub":"standard-version && conventional-changelog -p angular -i CHANGELOG.md -s && npm publish","docs:test":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml","docs":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml --output docs/docs.json"},"keywords":["music","player","bot","framework","discord","youtube","spotify","v13"],"dependencies":{"@discordjs/opus":"^0.7.0","@discordjs/voice":"^0.10.0","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.29.0","@typescript-eslint/parser":"^5.29.0","axios":"^0.27.2","axios-retry":"^3.2.0","discord-ytdl-core":"^5.0.4","domhandler":"^5.0.3","eslint":"^8.18.0","ffmpeg-static":"^5.0.0","htmlparser2":"^8.0.1","isomorphic-unfetch":"^3.1.0","jest":"^28.1.1","libsodium-wrappers":"^0.7.9","rimraf":"^3.0.2","soundcloud-scraper":"github:AnupKumarPanwar/soundcloud-scraper","spotify-url-info":"^3.1.2","youtubei":"^0.0.1-rc.34","ytdl-core":"^4.11.0","ytsr":"^3.8.0"},"devDependencies":{"@babel/cli":"^7.14.8","@babel/core":"^7.15.0","@babel/preset-env":"^7.15.0","@babel/preset-typescript":"^7.15.0","@commitlint/cli":"^17.0.3","@rocketseat/commitlint-config":"^0.0.3","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.29.0","@typescript-eslint/parser":"^5.29.0","assert-diff":"^3.0.2","discord.js":"^14.0.2","discord.js-docgen":"github:discordjs/docgen#ts-patch","eslint":"^8.18.0","jest":"^28.1.1","jsdoc-babel":"^0.5.0","ts-node":"^10.2.0","typescript":"^4.3.5"},"directories":{"doc":"docs","test":"test"},"engines":{"node":">=16.9.0"},"workspaces":["packages/*"],"packageManager":"npm@8.11.0","readme":"# Discord Music Player\r\n![npm](https://img.shields.io/npm/dt/discord-music-player?style=for-the-badge)\r\n![npm](https://img.shields.io/npm/v/discord-music-player?style=for-the-badge)\r\n![CodeFactor Grade](https://img.shields.io/codefactor/grade/github/SushiBtw/discord-music-player?color=%2348aaf1&style=for-the-badge)\r\n\r\n### Note: This is the v8 version of Discord Music Player for Discord.JS v13!\r\n\r\nDiscord Music Player is a powerful [Node.js](https://nodejs.org) module that allows you to easily implement music commands.\r\n**Everything** is customizable, and everything can be done using this package - **there are no limitations!**\r\n\r\nThis package supports YouTube Videos & Playlists, Spotify Songs & Playlists, Apple Music Songs & Playlists.\r\nPackage from version v7.0.0 is fully maintained by [SushiBtw](https://github.com/SushiBtw).\r\n\r\n### Requirements:\r\n- [Discord.js v13](https://www.npmjs.com/package/discord.js),\r\n- [Node.JS v16](https://nodejs.org/),\r\n\r\n# Installation\r\n*Node.JS v16 or newer is required to run this module.*\r\n```sh\r\nnpm install --save discord-music-player\r\n```\r\nInstall **@discordjs/opus**:\r\n```sh\r\nnpm install --save @discordjs/opus\r\n```\r\n**Install [FFMPEG](https://www.ffmpeg.org/download.html)!**\r\n\r\n# Documentation\r\n**Discord Music Player documentation: [https://discord-music-player.js.org/](https://discord-music-player.js.org/)**\r\n\r\n### **Need some help?**\r\nFeel free to join [Discord-Music-Player Discord Server](https://discord.gg/6fejZNsmFC) and ask us about DMP.\r\n\r\n# Getting Started\r\n**The code bellow, will show you how to use DMP in your code.**\r\n\r\n*Please define your **Player** after the **client/bot** definition.*\r\n\r\n[!] Remember to include the related voice **Intents** at the client options. [!]\r\n```js\r\nconst Discord = require(\"discord.js\");\r\nconst client = new Discord.Client({\r\n    intents: [Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES, Intents.FLAGS.GUILD_VOICE_STATES]\r\n});\r\nconst settings = {\r\n    prefix: '!',\r\n    token: 'YourBotTokenHere'\r\n};\r\n\r\nconst { Player } = require(\"discord-music-player\");\r\nconst player = new Player(client, {\r\n    leaveOnEmpty: false, // This options are optional.\r\n});\r\n// You can define the Player as *client.player* to easily access it.\r\nclient.player = player;\r\n\r\nclient.on(\"ready\", () => {\r\n    console.log(\"I am ready to Play with DMP 🎶\");\r\n});\r\n\r\nclient.login(settings.token);\r\n```\r\n\r\n# Example Usage\r\n```js\r\nconst { RepeatMode } = require('discord-music-player');\r\n\r\nclient.on('messageCreate', async (message) => {\r\n    const args = message.content.slice(settings.prefix.length).trim().split(/ +/g);\r\n    const command = args.shift();\r\n    let guildQueue = client.player.getQueue(message.guild.id);\r\n\r\n    if(command === 'play') {\r\n        let queue = client.player.createQueue(message.guild.id);\r\n        await queue.join(message.member.voice.channel);\r\n        let song = await queue.play(args.join(' ')).catch(_ => {\r\n            if(!guildQueue)\r\n                queue.stop();\r\n        });\r\n    }\r\n\r\n    if(command === 'playlist') {\r\n        let queue = client.player.createQueue(message.guild.id);\r\n        await queue.join(message.member.voice.channel);\r\n        let song = await queue.playlist(args.join(' ')).catch(_ => {\r\n            if(!guildQueue)\r\n                queue.stop();\r\n        });\r\n    }\r\n\r\n    if(command === 'skip') {\r\n        guildQueue.skip();\r\n    }\r\n\r\n    if(command === 'stop') {\r\n        guildQueue.stop();\r\n    }\r\n\r\n    if(command === 'removeLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.DISABLED); // or 0 instead of RepeatMode.DISABLED\r\n    }\r\n\r\n    if(command === 'toggleLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.SONG); // or 1 instead of RepeatMode.SONG\r\n    }\r\n\r\n    if(command === 'toggleQueueLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.QUEUE); // or 2 instead of RepeatMode.QUEUE\r\n    }\r\n\r\n    if(command === 'setVolume') {\r\n        guildQueue.setVolume(parseInt(args[0]));\r\n    }\r\n\r\n    if(command === 'seek') {\r\n        guildQueue.seek(parseInt(args[0]) * 1000);\r\n    }\r\n\r\n    if(command === 'clearQueue') {\r\n        guildQueue.clearQueue();\r\n    }\r\n\r\n    if(command === 'shuffle') {\r\n        guildQueue.shuffle();\r\n    }\r\n\r\n    if(command === 'getQueue') {\r\n        console.log(guildQueue);\r\n    }\r\n\r\n    if(command === 'getVolume') {\r\n        console.log(guildQueue.volume)\r\n    }\r\n\r\n    if(command === 'nowPlaying') {\r\n        console.log(`Now playing: ${guildQueue.nowPlaying}`);\r\n    }\r\n\r\n    if(command === 'pause') {\r\n        guildQueue.setPaused(true);\r\n    }\r\n\r\n    if(command === 'resume') {\r\n        guildQueue.setPaused(false);\r\n    }\r\n\r\n    if(command === 'remove') {\r\n        guildQueue.remove(parseInt(args[0]));\r\n    }\r\n\r\n    if(command === 'createProgressBar') {\r\n        const ProgressBar = guildQueue.createProgressBar();\r\n        \r\n        // [======>              ][00:35/2:20]\r\n        console.log(ProgressBar.prettier);\r\n    }\r\n})\r\n```\r\n\r\n### Events:\r\n```js\r\n// Init the event listener only once (at the top of your code).\r\nclient.player\r\n    // Emitted when channel was empty.\r\n    .on('channelEmpty',  (queue) =>\r\n        console.log(`Everyone left the Voice Channel, queue ended.`))\r\n    // Emitted when a song was added to the queue.\r\n    .on('songAdd',  (queue, song) =>\r\n        console.log(`Song ${song} was added to the queue.`))\r\n    // Emitted when a playlist was added to the queue.\r\n    .on('playlistAdd',  (queue, playlist) =>\r\n        console.log(`Playlist ${playlist} with ${playlist.songs.length} was added to the queue.`))\r\n    // Emitted when there was no more music to play.\r\n    .on('queueDestroyed',  (queue) =>\r\n        console.log(`The queue was destroyed.`))\r\n    // Emitted when the queue was destroyed (either by ending or stopping).    \r\n    .on('queueEnd',  (queue) =>\r\n        console.log(`The queue has ended.`))\r\n    // Emitted when a song changed.\r\n    .on('songChanged', (queue, newSong, oldSong) =>\r\n        console.log(`${newSong} is now playing.`))\r\n    // Emitted when a first song in the queue started playing.\r\n    .on('songFirst',  (queue, song) =>\r\n        console.log(`Started playing ${song}.`))\r\n    // Emitted when someone disconnected the bot from the channel.\r\n    .on('clientDisconnect', (queue) =>\r\n        console.log(`I was kicked from the Voice Channel, queue ended.`))\r\n    // Emitted when deafenOnJoin is true and the bot was undeafened\r\n    .on('clientUndeafen', (queue) =>\r\n        console.log(`I got undefeanded.`))\r\n    // Emitted when there was an error in runtime\r\n    .on('error', (error, queue) => {\r\n        console.log(`Error: ${error} in ${queue.guild.name}`);\r\n    });\r\n```\r\n\r\n# Passing custom data\r\n\r\n### Queue\r\nWhile running the `Queue#createQueue()` method you can pass a `options#data` object to hold custom data.\r\nThis can be made in two ways:\r\n```js\r\n// Pass custom data\r\nawait player.createQueue(message.guild.id, {\r\n    data: {\r\n        queueInitMessage: message,\r\n        myObject: 'this will stay with the queue :)',\r\n        more: 'add more... there are no limitations...'\r\n    }\r\n});\r\n// Or by using\r\nqueue.setData({\r\n    whatever: 'you want :D'\r\n});\r\n\r\n// Access custom data\r\nlet queue = player.getQueue(message.guild.id);\r\nlet initMessage = queue.data.queueInitMessage;\r\nawait initMessage.channel.send(`This message object is hold in Queue :D`);\r\n```\r\n\r\n### Song or Playlist\r\nWhile running the `Queue#play()`/Queue#playlist() method you can pass a `options#data` object to hold custom data.\r\nThis can be made in two ways:\r\n```js\r\n// Play the song\r\nlet song = await queue.play('Born in the USA!');\r\n// Set song data\r\nsong.setData({\r\n    initMessage: message\r\n});\r\n\r\n// Play the playlist\r\nlet playlist = await queue.playlist('https://www.youtube.com/playlist?list=PLDLGxnP4y2mGKGEqwxWTRkd3HtrrVTMdU');\r\n// Set playlist data (will set data for each song in the playlist)\r\nsong.setData({\r\n    initMessage: message\r\n});\r\n\r\n// Access custom data\r\nlet queue = player.getQueue(message.guild.id);\r\nlet { initMessage } = queue.nowPlaying.data;\r\nawait initMessage.channel.send(`This message object is hold in Song :D`);\r\n```\r\n","readmeFilename":"README.md","gitHead":"7be8f5445c0cf8ed47aa934783de3ffa56db9a9b","_id":"spike-player@1.2.6-4","_nodeVersion":"16.15.1","_npmVersion":"8.11.0","dist":{"integrity":"sha512-GHuG0ciOU0EwnFUxhOBFFEruIWWDg38RLe+ZF01XrfnqRPyk9ELQCGSRvPxu2X6aVyzqqC+E7RRfJtCN3ctOHQ==","shasum":"93974c2be83a7e2426d052409756ee4bdf284c89","tarball":"https://registry.npmjs.org/spike-player/-/spike-player-1.2.6-4.tgz","fileCount":42,"unpackedSize":235906,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD2uy9utqMrCzkYR5Q2qLUYkQ87Bi/mr+OWapW9H2iF/AIgPzeH+2HMDOm9/hhWFap/cyR80acGnJyS3G+qiYk3Hys="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi1aTaACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmobzQ/9Gd7fZnnsPZSoo/H5TnazV9+znVGVUuAUFgYIRC/jeyx1Q/ak\r\nZ4TENQ1gcbr08TnLqhHdsTT7y577mWNYGkBqPJMMQrupUNgwhWJZCI7iA2rn\r\nFsoAye1bjQnRKDKfxbZgINmcK9YJK3NQBqXCAT7Z4EKTlzwCBI0EzldTqcRf\r\nKgoyUHX1+c51l2Y6E6NfCKYq6QMj9BnU9VG8sPnRsm4qhXeLpg+4lsDkndhT\r\nv0Nhc/OL2mcZU7IkilTGqbyKbmH97HxgsJERveUTvF4NmrNC0YMgC8aCssz+\r\nrJzPwCTcFrepJkWV05WfHZn4eHyknS11/l2jabTvFfK4qhgP8yRYI6ix3BX1\r\nTcG7t8lIpu5dNyZXFBPCUDSiDqUzeq7/5QZa5tZuCnD2WXy5Oe72iLryaXAr\r\nu4VJ8jXskq1Z0eqXewFxMRnWSb7SykpEvlm/RypwOavBL1VEZT6KwiQAZp4H\r\njKhRDQwRa/eAh5uO3t+pKLs5fBpUCZfv/r4tjtFW7b1JkpSkzLDJB/5x0DJ3\r\n/mZYEmXr2b63j28XC/Hh1Xm7qjlFcm4hKtb7ARTEWUqHD1RvKZOngK18CHFt\r\nA9jQNko0UivNn7KZPiGGcT15bqAQVbGMeRSK35PLATMqkaR8b19kSm3V6UvM\r\n9+g+gF+QoLxYtjq65iscLZC3J/i+sICjwFU=\r\n=WYrt\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"spikebot","email":"abatallah1214@gmail.com"},"maintainers":[{"name":"spikebot","email":"abatallah1214@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spike-player_1.2.6-4_1658168538433_0.6654468283276476"},"_hasShrinkwrap":false},"1.2.6-5":{"name":"spike-player","version":"1.2.6-5","description":"Complete framework to facilitate music commands using discord.js v13","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","test":"jest test/test.js","clean":"rimraf dist","pre":"npm version prerelease --force && npm publish --access public --tag dev","prep":"npm run clean && npm run build","pub":"standard-version && conventional-changelog -p angular -i CHANGELOG.md -s && npm publish","docs:test":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml","docs":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml --output docs/docs.json"},"keywords":["music","player","bot","framework","discord","youtube","spotify","v13"],"dependencies":{"@discordjs/opus":"^0.7.0","@discordjs/voice":"^0.10.0","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.29.0","@typescript-eslint/parser":"^5.29.0","axios":"^0.27.2","axios-retry":"^3.2.0","discord-ytdl-core":"^5.0.4","domhandler":"^5.0.3","eslint":"^8.18.0","ffmpeg-static":"^5.0.0","htmlparser2":"^8.0.1","isomorphic-unfetch":"^3.1.0","jest":"^28.1.1","libsodium-wrappers":"^0.7.9","rimraf":"^3.0.2","soundcloud-scraper":"github:AnupKumarPanwar/soundcloud-scraper","spotify-url-info":"^3.1.2","youtubei":"^0.0.1-rc.34","ytdl-core":"^4.11.0","ytsr":"^3.8.0"},"devDependencies":{"@babel/cli":"^7.14.8","@babel/core":"^7.15.0","@babel/preset-env":"^7.15.0","@babel/preset-typescript":"^7.15.0","@commitlint/cli":"^17.0.3","@rocketseat/commitlint-config":"^0.0.3","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.29.0","@typescript-eslint/parser":"^5.29.0","assert-diff":"^3.0.2","discord.js":"^14.0.2","discord.js-docgen":"github:discordjs/docgen#ts-patch","eslint":"^8.18.0","jest":"^28.1.1","jsdoc-babel":"^0.5.0","ts-node":"^10.2.0","typescript":"^4.3.5"},"directories":{"doc":"docs","test":"test"},"engines":{"node":">=16.9.0"},"workspaces":["packages/*"],"packageManager":"npm@8.11.0","readme":"# Discord Music Player\r\n![npm](https://img.shields.io/npm/dt/discord-music-player?style=for-the-badge)\r\n![npm](https://img.shields.io/npm/v/discord-music-player?style=for-the-badge)\r\n![CodeFactor Grade](https://img.shields.io/codefactor/grade/github/SushiBtw/discord-music-player?color=%2348aaf1&style=for-the-badge)\r\n\r\n### Note: This is the v8 version of Discord Music Player for Discord.JS v13!\r\n\r\nDiscord Music Player is a powerful [Node.js](https://nodejs.org) module that allows you to easily implement music commands.\r\n**Everything** is customizable, and everything can be done using this package - **there are no limitations!**\r\n\r\nThis package supports YouTube Videos & Playlists, Spotify Songs & Playlists, Apple Music Songs & Playlists.\r\nPackage from version v7.0.0 is fully maintained by [SushiBtw](https://github.com/SushiBtw).\r\n\r\n### Requirements:\r\n- [Discord.js v13](https://www.npmjs.com/package/discord.js),\r\n- [Node.JS v16](https://nodejs.org/),\r\n\r\n# Installation\r\n*Node.JS v16 or newer is required to run this module.*\r\n```sh\r\nnpm install --save discord-music-player\r\n```\r\nInstall **@discordjs/opus**:\r\n```sh\r\nnpm install --save @discordjs/opus\r\n```\r\n**Install [FFMPEG](https://www.ffmpeg.org/download.html)!**\r\n\r\n# Documentation\r\n**Discord Music Player documentation: [https://discord-music-player.js.org/](https://discord-music-player.js.org/)**\r\n\r\n### **Need some help?**\r\nFeel free to join [Discord-Music-Player Discord Server](https://discord.gg/6fejZNsmFC) and ask us about DMP.\r\n\r\n# Getting Started\r\n**The code bellow, will show you how to use DMP in your code.**\r\n\r\n*Please define your **Player** after the **client/bot** definition.*\r\n\r\n[!] Remember to include the related voice **Intents** at the client options. [!]\r\n```js\r\nconst Discord = require(\"discord.js\");\r\nconst client = new Discord.Client({\r\n    intents: [Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES, Intents.FLAGS.GUILD_VOICE_STATES]\r\n});\r\nconst settings = {\r\n    prefix: '!',\r\n    token: 'YourBotTokenHere'\r\n};\r\n\r\nconst { Player } = require(\"discord-music-player\");\r\nconst player = new Player(client, {\r\n    leaveOnEmpty: false, // This options are optional.\r\n});\r\n// You can define the Player as *client.player* to easily access it.\r\nclient.player = player;\r\n\r\nclient.on(\"ready\", () => {\r\n    console.log(\"I am ready to Play with DMP 🎶\");\r\n});\r\n\r\nclient.login(settings.token);\r\n```\r\n\r\n# Example Usage\r\n```js\r\nconst { RepeatMode } = require('discord-music-player');\r\n\r\nclient.on('messageCreate', async (message) => {\r\n    const args = message.content.slice(settings.prefix.length).trim().split(/ +/g);\r\n    const command = args.shift();\r\n    let guildQueue = client.player.getQueue(message.guild.id);\r\n\r\n    if(command === 'play') {\r\n        let queue = client.player.createQueue(message.guild.id);\r\n        await queue.join(message.member.voice.channel);\r\n        let song = await queue.play(args.join(' ')).catch(_ => {\r\n            if(!guildQueue)\r\n                queue.stop();\r\n        });\r\n    }\r\n\r\n    if(command === 'playlist') {\r\n        let queue = client.player.createQueue(message.guild.id);\r\n        await queue.join(message.member.voice.channel);\r\n        let song = await queue.playlist(args.join(' ')).catch(_ => {\r\n            if(!guildQueue)\r\n                queue.stop();\r\n        });\r\n    }\r\n\r\n    if(command === 'skip') {\r\n        guildQueue.skip();\r\n    }\r\n\r\n    if(command === 'stop') {\r\n        guildQueue.stop();\r\n    }\r\n\r\n    if(command === 'removeLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.DISABLED); // or 0 instead of RepeatMode.DISABLED\r\n    }\r\n\r\n    if(command === 'toggleLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.SONG); // or 1 instead of RepeatMode.SONG\r\n    }\r\n\r\n    if(command === 'toggleQueueLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.QUEUE); // or 2 instead of RepeatMode.QUEUE\r\n    }\r\n\r\n    if(command === 'setVolume') {\r\n        guildQueue.setVolume(parseInt(args[0]));\r\n    }\r\n\r\n    if(command === 'seek') {\r\n        guildQueue.seek(parseInt(args[0]) * 1000);\r\n    }\r\n\r\n    if(command === 'clearQueue') {\r\n        guildQueue.clearQueue();\r\n    }\r\n\r\n    if(command === 'shuffle') {\r\n        guildQueue.shuffle();\r\n    }\r\n\r\n    if(command === 'getQueue') {\r\n        console.log(guildQueue);\r\n    }\r\n\r\n    if(command === 'getVolume') {\r\n        console.log(guildQueue.volume)\r\n    }\r\n\r\n    if(command === 'nowPlaying') {\r\n        console.log(`Now playing: ${guildQueue.nowPlaying}`);\r\n    }\r\n\r\n    if(command === 'pause') {\r\n        guildQueue.setPaused(true);\r\n    }\r\n\r\n    if(command === 'resume') {\r\n        guildQueue.setPaused(false);\r\n    }\r\n\r\n    if(command === 'remove') {\r\n        guildQueue.remove(parseInt(args[0]));\r\n    }\r\n\r\n    if(command === 'createProgressBar') {\r\n        const ProgressBar = guildQueue.createProgressBar();\r\n        \r\n        // [======>              ][00:35/2:20]\r\n        console.log(ProgressBar.prettier);\r\n    }\r\n})\r\n```\r\n\r\n### Events:\r\n```js\r\n// Init the event listener only once (at the top of your code).\r\nclient.player\r\n    // Emitted when channel was empty.\r\n    .on('channelEmpty',  (queue) =>\r\n        console.log(`Everyone left the Voice Channel, queue ended.`))\r\n    // Emitted when a song was added to the queue.\r\n    .on('songAdd',  (queue, song) =>\r\n        console.log(`Song ${song} was added to the queue.`))\r\n    // Emitted when a playlist was added to the queue.\r\n    .on('playlistAdd',  (queue, playlist) =>\r\n        console.log(`Playlist ${playlist} with ${playlist.songs.length} was added to the queue.`))\r\n    // Emitted when there was no more music to play.\r\n    .on('queueDestroyed',  (queue) =>\r\n        console.log(`The queue was destroyed.`))\r\n    // Emitted when the queue was destroyed (either by ending or stopping).    \r\n    .on('queueEnd',  (queue) =>\r\n        console.log(`The queue has ended.`))\r\n    // Emitted when a song changed.\r\n    .on('songChanged', (queue, newSong, oldSong) =>\r\n        console.log(`${newSong} is now playing.`))\r\n    // Emitted when a first song in the queue started playing.\r\n    .on('songFirst',  (queue, song) =>\r\n        console.log(`Started playing ${song}.`))\r\n    // Emitted when someone disconnected the bot from the channel.\r\n    .on('clientDisconnect', (queue) =>\r\n        console.log(`I was kicked from the Voice Channel, queue ended.`))\r\n    // Emitted when deafenOnJoin is true and the bot was undeafened\r\n    .on('clientUndeafen', (queue) =>\r\n        console.log(`I got undefeanded.`))\r\n    // Emitted when there was an error in runtime\r\n    .on('error', (error, queue) => {\r\n        console.log(`Error: ${error} in ${queue.guild.name}`);\r\n    });\r\n```\r\n\r\n# Passing custom data\r\n\r\n### Queue\r\nWhile running the `Queue#createQueue()` method you can pass a `options#data` object to hold custom data.\r\nThis can be made in two ways:\r\n```js\r\n// Pass custom data\r\nawait player.createQueue(message.guild.id, {\r\n    data: {\r\n        queueInitMessage: message,\r\n        myObject: 'this will stay with the queue :)',\r\n        more: 'add more... there are no limitations...'\r\n    }\r\n});\r\n// Or by using\r\nqueue.setData({\r\n    whatever: 'you want :D'\r\n});\r\n\r\n// Access custom data\r\nlet queue = player.getQueue(message.guild.id);\r\nlet initMessage = queue.data.queueInitMessage;\r\nawait initMessage.channel.send(`This message object is hold in Queue :D`);\r\n```\r\n\r\n### Song or Playlist\r\nWhile running the `Queue#play()`/Queue#playlist() method you can pass a `options#data` object to hold custom data.\r\nThis can be made in two ways:\r\n```js\r\n// Play the song\r\nlet song = await queue.play('Born in the USA!');\r\n// Set song data\r\nsong.setData({\r\n    initMessage: message\r\n});\r\n\r\n// Play the playlist\r\nlet playlist = await queue.playlist('https://www.youtube.com/playlist?list=PLDLGxnP4y2mGKGEqwxWTRkd3HtrrVTMdU');\r\n// Set playlist data (will set data for each song in the playlist)\r\nsong.setData({\r\n    initMessage: message\r\n});\r\n\r\n// Access custom data\r\nlet queue = player.getQueue(message.guild.id);\r\nlet { initMessage } = queue.nowPlaying.data;\r\nawait initMessage.channel.send(`This message object is hold in Song :D`);\r\n```\r\n","readmeFilename":"README.md","gitHead":"c1c57413bb23eb02f25bc2e91ce49db246ab82b6","_id":"spike-player@1.2.6-5","_nodeVersion":"16.15.1","_npmVersion":"8.11.0","dist":{"integrity":"sha512-8iGG6DcR+YxtOnL91ABLctCA/hsQvgQE8rZlI/n/nrpqZk/wBZ+2D0acR8I11n9pFlBLoTGWSnbvIBuhx08lkQ==","shasum":"fda64b42e4ba77f93cd6160da8337576e9e1dac7","tarball":"https://registry.npmjs.org/spike-player/-/spike-player-1.2.6-5.tgz","fileCount":42,"unpackedSize":235770,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCHzCyjRQaNTWfdplmnpz5jv+2EVzQ4D8LuzjbhqnrlmACIQCEKpoXKXIm8v6499+dZMsMCT0VqplQS+06JntwLV3L0w=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi1aZgACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqhGg//YFkTEtzkSbX5JudDGVFP1mDYXlPVV9Rwrw7CcQMZju0bZOyB\r\noCBsOCH64fJFjcqS5XArsPbZ+6bl6v/KeiQIaWcB9t23LpLyOR+dr25nNtuk\r\nmb5Bm0gop6qcx8s6cShg0Q0Y9Y4FrKD6QBiKlK9Wq7fG9Wxhy+YYfWZzI57n\r\nNnCm5ndRFJwBaMAv3nIqbzHJRzV0VBEOaAHQ8XnMoore4/chqSfrkW3XUXmm\r\nSPaeqS5uy433rMEC9G8XyRWs5JYLKeEQFIIxD+GI2RUf/tbobPHhPl9YjPAe\r\nMYO3N3mpsU+uYel9xepTKkkGu9lHgM9g9cL7W1G6tWsOI9Cr4uQ8qtWToHqb\r\nhYHJyY9ccmNPpw5lSC83ipzXnLkqFqVBa+d4p7zsYkLVEj2aKtaixiQYrN/1\r\nG8fpI5yO4lALRKVLqNyioSBrCIsz1E3BHPpMAUhDh0FyXzmrOUYUiK0fVIxj\r\ntw3RxdDKv53nwH/wbJUvNdtaDOIXehAvazvqfDD1bdJfug5jqUcGpAlYmYjw\r\n97/3TQLhcoAvzxXc+2qwuX4nBS4KnBbgD5ZfzKAJ/NXageGcR3G2wozKd0OD\r\nb2lrKVQcIuQXjcpmBtezfDP/U79k7iphrQjAjld35/kN8AA/PXw42rLqz6PO\r\nyexdjYk5auu4VA8jPfVB3OdzuJVWA7+BU1c=\r\n=JLuw\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"spikebot","email":"abatallah1214@gmail.com"},"maintainers":[{"name":"spikebot","email":"abatallah1214@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spike-player_1.2.6-5_1658168928716_0.9248444124029433"},"_hasShrinkwrap":false},"1.2.6-6":{"name":"spike-player","version":"1.2.6-6","description":"Complete framework to facilitate music commands using discord.js v13","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","test":"jest test/test.js","clean":"rimraf dist","pre":"npm version prerelease --force && npm publish --access public --tag dev","prep":"npm run clean && npm run build","pub":"standard-version && conventional-changelog -p angular -i CHANGELOG.md -s && npm publish","docs:test":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml","docs":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml --output docs/docs.json","prepare":"husky install"},"keywords":["music","player","bot","framework","discord","youtube","spotify","v13"],"dependencies":{"@discordjs/opus":"^0.7.0","@discordjs/voice":"^0.10.0","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.29.0","@typescript-eslint/parser":"^5.29.0","axios":"^0.27.2","axios-retry":"^3.2.0","discord-ytdl-core":"^5.0.4","domhandler":"^5.0.3","eslint":"^8.18.0","ffmpeg-static":"^5.0.0","htmlparser2":"^8.0.1","isomorphic-unfetch":"^3.1.0","jest":"^28.1.1","libsodium-wrappers":"^0.7.9","rimraf":"^3.0.2","soundcloud-scraper":"github:AnupKumarPanwar/soundcloud-scraper","spotify-url-info":"^3.1.2","youtubei":"^0.0.1-rc.34","ytdl-core":"^4.11.0","ytsr":"^3.8.0"},"devDependencies":{"@babel/cli":"^7.14.8","@babel/core":"^7.15.0","@babel/preset-env":"^7.15.0","@babel/preset-typescript":"^7.15.0","@commitlint/cli":"^17.0.3","@rocketseat/commitlint-config":"^0.0.3","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.29.0","@typescript-eslint/parser":"^5.29.0","assert-diff":"^3.0.2","discord.js":"^14.0.2","discord.js-docgen":"github:discordjs/docgen#ts-patch","eslint":"^8.18.0","husky":"^8.0.0","jest":"^28.1.1","jsdoc-babel":"^0.5.0","ts-node":"^10.2.0","typescript":"^4.3.5"},"directories":{"doc":"docs","test":"test"},"engines":{"node":">=16.9.0"},"workspaces":["packages/*"],"packageManager":"npm@8.11.0","readme":"# Discord Music Player\r\n![npm](https://img.shields.io/npm/dt/discord-music-player?style=for-the-badge)\r\n![npm](https://img.shields.io/npm/v/discord-music-player?style=for-the-badge)\r\n![CodeFactor Grade](https://img.shields.io/codefactor/grade/github/SushiBtw/discord-music-player?color=%2348aaf1&style=for-the-badge)\r\n\r\n### Note: This is the v8 version of Discord Music Player for Discord.JS v13!\r\n\r\nDiscord Music Player is a powerful [Node.js](https://nodejs.org) module that allows you to easily implement music commands.\r\n**Everything** is customizable, and everything can be done using this package - **there are no limitations!**\r\n\r\nThis package supports YouTube Videos & Playlists, Spotify Songs & Playlists, Apple Music Songs & Playlists.\r\nPackage from version v7.0.0 is fully maintained by [SushiBtw](https://github.com/SushiBtw).\r\n\r\n### Requirements:\r\n- [Discord.js v13](https://www.npmjs.com/package/discord.js),\r\n- [Node.JS v16](https://nodejs.org/),\r\n\r\n# Installation\r\n*Node.JS v16 or newer is required to run this module.*\r\n```sh\r\nnpm install --save discord-music-player\r\n```\r\nInstall **@discordjs/opus**:\r\n```sh\r\nnpm install --save @discordjs/opus\r\n```\r\n**Install [FFMPEG](https://www.ffmpeg.org/download.html)!**\r\n\r\n# Documentation\r\n**Discord Music Player documentation: [https://discord-music-player.js.org/](https://discord-music-player.js.org/)**\r\n\r\n### **Need some help?**\r\nFeel free to join [Discord-Music-Player Discord Server](https://discord.gg/6fejZNsmFC) and ask us about DMP.\r\n\r\n# Getting Started\r\n**The code bellow, will show you how to use DMP in your code.**\r\n\r\n*Please define your **Player** after the **client/bot** definition.*\r\n\r\n[!] Remember to include the related voice **Intents** at the client options. [!]\r\n```js\r\nconst Discord = require(\"discord.js\");\r\nconst client = new Discord.Client({\r\n    intents: [Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES, Intents.FLAGS.GUILD_VOICE_STATES]\r\n});\r\nconst settings = {\r\n    prefix: '!',\r\n    token: 'YourBotTokenHere'\r\n};\r\n\r\nconst { Player } = require(\"discord-music-player\");\r\nconst player = new Player(client, {\r\n    leaveOnEmpty: false, // This options are optional.\r\n});\r\n// You can define the Player as *client.player* to easily access it.\r\nclient.player = player;\r\n\r\nclient.on(\"ready\", () => {\r\n    console.log(\"I am ready to Play with DMP 🎶\");\r\n});\r\n\r\nclient.login(settings.token);\r\n```\r\n\r\n# Example Usage\r\n```js\r\nconst { RepeatMode } = require('discord-music-player');\r\n\r\nclient.on('messageCreate', async (message) => {\r\n    const args = message.content.slice(settings.prefix.length).trim().split(/ +/g);\r\n    const command = args.shift();\r\n    let guildQueue = client.player.getQueue(message.guild.id);\r\n\r\n    if(command === 'play') {\r\n        let queue = client.player.createQueue(message.guild.id);\r\n        await queue.join(message.member.voice.channel);\r\n        let song = await queue.play(args.join(' ')).catch(_ => {\r\n            if(!guildQueue)\r\n                queue.stop();\r\n        });\r\n    }\r\n\r\n    if(command === 'playlist') {\r\n        let queue = client.player.createQueue(message.guild.id);\r\n        await queue.join(message.member.voice.channel);\r\n        let song = await queue.playlist(args.join(' ')).catch(_ => {\r\n            if(!guildQueue)\r\n                queue.stop();\r\n        });\r\n    }\r\n\r\n    if(command === 'skip') {\r\n        guildQueue.skip();\r\n    }\r\n\r\n    if(command === 'stop') {\r\n        guildQueue.stop();\r\n    }\r\n\r\n    if(command === 'removeLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.DISABLED); // or 0 instead of RepeatMode.DISABLED\r\n    }\r\n\r\n    if(command === 'toggleLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.SONG); // or 1 instead of RepeatMode.SONG\r\n    }\r\n\r\n    if(command === 'toggleQueueLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.QUEUE); // or 2 instead of RepeatMode.QUEUE\r\n    }\r\n\r\n    if(command === 'setVolume') {\r\n        guildQueue.setVolume(parseInt(args[0]));\r\n    }\r\n\r\n    if(command === 'seek') {\r\n        guildQueue.seek(parseInt(args[0]) * 1000);\r\n    }\r\n\r\n    if(command === 'clearQueue') {\r\n        guildQueue.clearQueue();\r\n    }\r\n\r\n    if(command === 'shuffle') {\r\n        guildQueue.shuffle();\r\n    }\r\n\r\n    if(command === 'getQueue') {\r\n        console.log(guildQueue);\r\n    }\r\n\r\n    if(command === 'getVolume') {\r\n        console.log(guildQueue.volume)\r\n    }\r\n\r\n    if(command === 'nowPlaying') {\r\n        console.log(`Now playing: ${guildQueue.nowPlaying}`);\r\n    }\r\n\r\n    if(command === 'pause') {\r\n        guildQueue.setPaused(true);\r\n    }\r\n\r\n    if(command === 'resume') {\r\n        guildQueue.setPaused(false);\r\n    }\r\n\r\n    if(command === 'remove') {\r\n        guildQueue.remove(parseInt(args[0]));\r\n    }\r\n\r\n    if(command === 'createProgressBar') {\r\n        const ProgressBar = guildQueue.createProgressBar();\r\n        \r\n        // [======>              ][00:35/2:20]\r\n        console.log(ProgressBar.prettier);\r\n    }\r\n})\r\n```\r\n\r\n### Events:\r\n```js\r\n// Init the event listener only once (at the top of your code).\r\nclient.player\r\n    // Emitted when channel was empty.\r\n    .on('channelEmpty',  (queue) =>\r\n        console.log(`Everyone left the Voice Channel, queue ended.`))\r\n    // Emitted when a song was added to the queue.\r\n    .on('songAdd',  (queue, song) =>\r\n        console.log(`Song ${song} was added to the queue.`))\r\n    // Emitted when a playlist was added to the queue.\r\n    .on('playlistAdd',  (queue, playlist) =>\r\n        console.log(`Playlist ${playlist} with ${playlist.songs.length} was added to the queue.`))\r\n    // Emitted when there was no more music to play.\r\n    .on('queueDestroyed',  (queue) =>\r\n        console.log(`The queue was destroyed.`))\r\n    // Emitted when the queue was destroyed (either by ending or stopping).    \r\n    .on('queueEnd',  (queue) =>\r\n        console.log(`The queue has ended.`))\r\n    // Emitted when a song changed.\r\n    .on('songChanged', (queue, newSong, oldSong) =>\r\n        console.log(`${newSong} is now playing.`))\r\n    // Emitted when a first song in the queue started playing.\r\n    .on('songFirst',  (queue, song) =>\r\n        console.log(`Started playing ${song}.`))\r\n    // Emitted when someone disconnected the bot from the channel.\r\n    .on('clientDisconnect', (queue) =>\r\n        console.log(`I was kicked from the Voice Channel, queue ended.`))\r\n    // Emitted when deafenOnJoin is true and the bot was undeafened\r\n    .on('clientUndeafen', (queue) =>\r\n        console.log(`I got undefeanded.`))\r\n    // Emitted when there was an error in runtime\r\n    .on('error', (error, queue) => {\r\n        console.log(`Error: ${error} in ${queue.guild.name}`);\r\n    });\r\n```\r\n\r\n# Passing custom data\r\n\r\n### Queue\r\nWhile running the `Queue#createQueue()` method you can pass a `options#data` object to hold custom data.\r\nThis can be made in two ways:\r\n```js\r\n// Pass custom data\r\nawait player.createQueue(message.guild.id, {\r\n    data: {\r\n        queueInitMessage: message,\r\n        myObject: 'this will stay with the queue :)',\r\n        more: 'add more... there are no limitations...'\r\n    }\r\n});\r\n// Or by using\r\nqueue.setData({\r\n    whatever: 'you want :D'\r\n});\r\n\r\n// Access custom data\r\nlet queue = player.getQueue(message.guild.id);\r\nlet initMessage = queue.data.queueInitMessage;\r\nawait initMessage.channel.send(`This message object is hold in Queue :D`);\r\n```\r\n\r\n### Song or Playlist\r\nWhile running the `Queue#play()`/Queue#playlist() method you can pass a `options#data` object to hold custom data.\r\nThis can be made in two ways:\r\n```js\r\n// Play the song\r\nlet song = await queue.play('Born in the USA!');\r\n// Set song data\r\nsong.setData({\r\n    initMessage: message\r\n});\r\n\r\n// Play the playlist\r\nlet playlist = await queue.playlist('https://www.youtube.com/playlist?list=PLDLGxnP4y2mGKGEqwxWTRkd3HtrrVTMdU');\r\n// Set playlist data (will set data for each song in the playlist)\r\nsong.setData({\r\n    initMessage: message\r\n});\r\n\r\n// Access custom data\r\nlet queue = player.getQueue(message.guild.id);\r\nlet { initMessage } = queue.nowPlaying.data;\r\nawait initMessage.channel.send(`This message object is hold in Song :D`);\r\n```\r\n","readmeFilename":"README.md","gitHead":"9a6b3f9fbe9c4972bbd258b9212161ebb853fbda","_id":"spike-player@1.2.6-6","_nodeVersion":"16.15.1","_npmVersion":"8.11.0","dist":{"integrity":"sha512-IIzcCbWtmrrfpEIxq+fj5+4lQtYan6xl0FIYmOBm0dmOVxB3uXB7S8bU9TK3ud9Yysph/dSjG+6ZpFhWwd7IJA==","shasum":"ed69e5c7dc37d6dbb0dfdfb0b5b3499257501d0f","tarball":"https://registry.npmjs.org/spike-player/-/spike-player-1.2.6-6.tgz","fileCount":42,"unpackedSize":235756,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD6xJtCK+5vqwOCPuJ6yfM7IP3UEGPUBzOJhncwmFU5sAIgSLy5GWdGLovZSd+YhKJyHv46mco07+CuxnRmHFqjMTQ="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi1qrMACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrO/g/9FkBw/d8E+t1t6h7MkOPp7gssk2UNamhub/6ogSqtNYEaUK8S\r\nmJWm22LWt5NWkrzDYPaBSlE46lVMgaxfFUeuD4yn/xT98FrY8rTdpxstibgY\r\ntrvtrWeQB+QQAyZQEIvtL7SwEx73jwYsB3hfpf83sh8CHBpYk75u2v55n8SX\r\nZ+giC3jPQfVbv+41vkvOps/mKJG7i/oPdx3Pvav7r033a08/llnoGBdVycaM\r\nNrg7P0k/82UChaxeMIuRl1fiL2DUEZKLDDqRCSa0aoCAiTr5TkBd7kwSzBg2\r\nb4l3zjoHc5vpdD1N1vki8d4SR8mRqmhf1qRrj6e3VoQ4zzKczuTbySNUEJ36\r\n7tl1p2jCgE0t2dsEaGlUGluih7Nlh1W5D4Y/W9it3XHC2DNXzritIM0/8V1H\r\nmeo0dYzsiCaOceXlQ+tN+GImnjdRMcRya4sk4/IgKwZDY+zrx+q+E+hMvqEh\r\ncFHH1dWME/2tXB6DaX1GbkijbhUBj9agQA/zaEtKrCruqkI0jeCPBOMxhH9h\r\nmtdZoe48eKLLYw7n53P87tbJJDee9vprAW0xzbRuJRwe7RUKSnT2fNO887tu\r\nzTTS/kOR5X3/itVwZb4Ne6KtS92BEJ37A77CEhmqaCsjhHQIWBdlcZPrjSev\r\nhhFvt1EvTXleAJQrkIYLFAQFANcYwsVLCAQ=\r\n=6nTI\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"spikebot","email":"abatallah1214@gmail.com"},"maintainers":[{"name":"spikebot","email":"abatallah1214@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spike-player_1.2.6-6_1658235596741_0.35128129610287306"},"_hasShrinkwrap":false},"1.2.6-8":{"name":"spike-player","version":"1.2.6-8","description":"Complete framework to facilitate music commands using discord.js v13","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","test":"jest test/test.js","clean":"rimraf dist","pre":"npm version prerelease --force && npm publish --access public --tag dev","prep":"npm run clean && npm run build","pub":"standard-version && conventional-changelog -p angular -i CHANGELOG.md -s && npm publish","docs:test":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml","docs":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml --output docs/docs.json","prepare":"husky install"},"keywords":["music","player","bot","framework","discord","youtube","spotify","v13"],"dependencies":{"@discordjs/opus":"^0.7.0","@discordjs/voice":"^0.10.0","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.29.0","@typescript-eslint/parser":"^5.29.0","axios":"^0.27.2","axios-retry":"^3.2.0","discord-ytdl-core":"^5.0.4","domhandler":"^5.0.3","eslint":"^8.18.0","ffmpeg-static":"^5.0.0","htmlparser2":"^8.0.1","isomorphic-unfetch":"^3.1.0","jest":"^28.1.1","libsodium-wrappers":"^0.7.9","rimraf":"^3.0.2","soundcloud-scraper":"github:AnupKumarPanwar/soundcloud-scraper","spotify-url-info":"^3.1.2","youtubei":"^0.0.1-rc.34","ytdl-core":"^4.11.0","ytsr":"^3.8.0"},"devDependencies":{"@babel/cli":"^7.14.8","@babel/core":"^7.15.0","@babel/preset-env":"^7.15.0","@babel/preset-typescript":"^7.15.0","@commitlint/cli":"^17.0.3","@rocketseat/commitlint-config":"^0.0.3","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.29.0","@typescript-eslint/parser":"^5.29.0","assert-diff":"^3.0.2","discord.js":"^14.0.2","discord.js-docgen":"github:discordjs/docgen#ts-patch","eslint":"^8.18.0","husky":"^8.0.0","jest":"^28.1.1","jsdoc-babel":"^0.5.0","ts-node":"^10.2.0","typescript":"^4.3.5"},"directories":{"doc":"docs","test":"test"},"engines":{"node":">=16.9.0"},"workspaces":["packages/*"],"packageManager":"npm@8.11.0","readme":"# Discord Music Player\r\n![npm](https://img.shields.io/npm/dt/discord-music-player?style=for-the-badge)\r\n![npm](https://img.shields.io/npm/v/discord-music-player?style=for-the-badge)\r\n![CodeFactor Grade](https://img.shields.io/codefactor/grade/github/SushiBtw/discord-music-player?color=%2348aaf1&style=for-the-badge)\r\n\r\n### Note: This is the v8 version of Discord Music Player for Discord.JS v13!\r\n\r\nDiscord Music Player is a powerful [Node.js](https://nodejs.org) module that allows you to easily implement music commands.\r\n**Everything** is customizable, and everything can be done using this package - **there are no limitations!**\r\n\r\nThis package supports YouTube Videos & Playlists, Spotify Songs & Playlists, Apple Music Songs & Playlists.\r\nPackage from version v7.0.0 is fully maintained by [SushiBtw](https://github.com/SushiBtw).\r\n\r\n### Requirements:\r\n- [Discord.js v13](https://www.npmjs.com/package/discord.js),\r\n- [Node.JS v16](https://nodejs.org/),\r\n\r\n# Installation\r\n*Node.JS v16 or newer is required to run this module.*\r\n```sh\r\nnpm install --save discord-music-player\r\n```\r\nInstall **@discordjs/opus**:\r\n```sh\r\nnpm install --save @discordjs/opus\r\n```\r\n**Install [FFMPEG](https://www.ffmpeg.org/download.html)!**\r\n\r\n# Documentation\r\n**Discord Music Player documentation: [https://discord-music-player.js.org/](https://discord-music-player.js.org/)**\r\n\r\n### **Need some help?**\r\nFeel free to join [Discord-Music-Player Discord Server](https://discord.gg/6fejZNsmFC) and ask us about DMP.\r\n\r\n# Getting Started\r\n**The code bellow, will show you how to use DMP in your code.**\r\n\r\n*Please define your **Player** after the **client/bot** definition.*\r\n\r\n[!] Remember to include the related voice **Intents** at the client options. [!]\r\n```js\r\nconst Discord = require(\"discord.js\");\r\nconst client = new Discord.Client({\r\n    intents: [Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES, Intents.FLAGS.GUILD_VOICE_STATES]\r\n});\r\nconst settings = {\r\n    prefix: '!',\r\n    token: 'YourBotTokenHere'\r\n};\r\n\r\nconst { Player } = require(\"discord-music-player\");\r\nconst player = new Player(client, {\r\n    leaveOnEmpty: false, // This options are optional.\r\n});\r\n// You can define the Player as *client.player* to easily access it.\r\nclient.player = player;\r\n\r\nclient.on(\"ready\", () => {\r\n    console.log(\"I am ready to Play with DMP 🎶\");\r\n});\r\n\r\nclient.login(settings.token);\r\n```\r\n\r\n# Example Usage\r\n```js\r\nconst { RepeatMode } = require('discord-music-player');\r\n\r\nclient.on('messageCreate', async (message) => {\r\n    const args = message.content.slice(settings.prefix.length).trim().split(/ +/g);\r\n    const command = args.shift();\r\n    let guildQueue = client.player.getQueue(message.guild.id);\r\n\r\n    if(command === 'play') {\r\n        let queue = client.player.createQueue(message.guild.id);\r\n        await queue.join(message.member.voice.channel);\r\n        let song = await queue.play(args.join(' ')).catch(_ => {\r\n            if(!guildQueue)\r\n                queue.stop();\r\n        });\r\n    }\r\n\r\n    if(command === 'playlist') {\r\n        let queue = client.player.createQueue(message.guild.id);\r\n        await queue.join(message.member.voice.channel);\r\n        let song = await queue.playlist(args.join(' ')).catch(_ => {\r\n            if(!guildQueue)\r\n                queue.stop();\r\n        });\r\n    }\r\n\r\n    if(command === 'skip') {\r\n        guildQueue.skip();\r\n    }\r\n\r\n    if(command === 'stop') {\r\n        guildQueue.stop();\r\n    }\r\n\r\n    if(command === 'removeLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.DISABLED); // or 0 instead of RepeatMode.DISABLED\r\n    }\r\n\r\n    if(command === 'toggleLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.SONG); // or 1 instead of RepeatMode.SONG\r\n    }\r\n\r\n    if(command === 'toggleQueueLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.QUEUE); // or 2 instead of RepeatMode.QUEUE\r\n    }\r\n\r\n    if(command === 'setVolume') {\r\n        guildQueue.setVolume(parseInt(args[0]));\r\n    }\r\n\r\n    if(command === 'seek') {\r\n        guildQueue.seek(parseInt(args[0]) * 1000);\r\n    }\r\n\r\n    if(command === 'clearQueue') {\r\n        guildQueue.clearQueue();\r\n    }\r\n\r\n    if(command === 'shuffle') {\r\n        guildQueue.shuffle();\r\n    }\r\n\r\n    if(command === 'getQueue') {\r\n        console.log(guildQueue);\r\n    }\r\n\r\n    if(command === 'getVolume') {\r\n        console.log(guildQueue.volume)\r\n    }\r\n\r\n    if(command === 'nowPlaying') {\r\n        console.log(`Now playing: ${guildQueue.nowPlaying}`);\r\n    }\r\n\r\n    if(command === 'pause') {\r\n        guildQueue.setPaused(true);\r\n    }\r\n\r\n    if(command === 'resume') {\r\n        guildQueue.setPaused(false);\r\n    }\r\n\r\n    if(command === 'remove') {\r\n        guildQueue.remove(parseInt(args[0]));\r\n    }\r\n\r\n    if(command === 'createProgressBar') {\r\n        const ProgressBar = guildQueue.createProgressBar();\r\n        \r\n        // [======>              ][00:35/2:20]\r\n        console.log(ProgressBar.prettier);\r\n    }\r\n})\r\n```\r\n\r\n### Events:\r\n```js\r\n// Init the event listener only once (at the top of your code).\r\nclient.player\r\n    // Emitted when channel was empty.\r\n    .on('channelEmpty',  (queue) =>\r\n        console.log(`Everyone left the Voice Channel, queue ended.`))\r\n    // Emitted when a song was added to the queue.\r\n    .on('songAdd',  (queue, song) =>\r\n        console.log(`Song ${song} was added to the queue.`))\r\n    // Emitted when a playlist was added to the queue.\r\n    .on('playlistAdd',  (queue, playlist) =>\r\n        console.log(`Playlist ${playlist} with ${playlist.songs.length} was added to the queue.`))\r\n    // Emitted when there was no more music to play.\r\n    .on('queueDestroyed',  (queue) =>\r\n        console.log(`The queue was destroyed.`))\r\n    // Emitted when the queue was destroyed (either by ending or stopping).    \r\n    .on('queueEnd',  (queue) =>\r\n        console.log(`The queue has ended.`))\r\n    // Emitted when a song changed.\r\n    .on('songChanged', (queue, newSong, oldSong) =>\r\n        console.log(`${newSong} is now playing.`))\r\n    // Emitted when a first song in the queue started playing.\r\n    .on('songFirst',  (queue, song) =>\r\n        console.log(`Started playing ${song}.`))\r\n    // Emitted when someone disconnected the bot from the channel.\r\n    .on('clientDisconnect', (queue) =>\r\n        console.log(`I was kicked from the Voice Channel, queue ended.`))\r\n    // Emitted when deafenOnJoin is true and the bot was undeafened\r\n    .on('clientUndeafen', (queue) =>\r\n        console.log(`I got undefeanded.`))\r\n    // Emitted when there was an error in runtime\r\n    .on('error', (error, queue) => {\r\n        console.log(`Error: ${error} in ${queue.guild.name}`);\r\n    });\r\n```\r\n\r\n# Passing custom data\r\n\r\n### Queue\r\nWhile running the `Queue#createQueue()` method you can pass a `options#data` object to hold custom data.\r\nThis can be made in two ways:\r\n```js\r\n// Pass custom data\r\nawait player.createQueue(message.guild.id, {\r\n    data: {\r\n        queueInitMessage: message,\r\n        myObject: 'this will stay with the queue :)',\r\n        more: 'add more... there are no limitations...'\r\n    }\r\n});\r\n// Or by using\r\nqueue.setData({\r\n    whatever: 'you want :D'\r\n});\r\n\r\n// Access custom data\r\nlet queue = player.getQueue(message.guild.id);\r\nlet initMessage = queue.data.queueInitMessage;\r\nawait initMessage.channel.send(`This message object is hold in Queue :D`);\r\n```\r\n\r\n### Song or Playlist\r\nWhile running the `Queue#play()`/Queue#playlist() method you can pass a `options#data` object to hold custom data.\r\nThis can be made in two ways:\r\n```js\r\n// Play the song\r\nlet song = await queue.play('Born in the USA!');\r\n// Set song data\r\nsong.setData({\r\n    initMessage: message\r\n});\r\n\r\n// Play the playlist\r\nlet playlist = await queue.playlist('https://www.youtube.com/playlist?list=PLDLGxnP4y2mGKGEqwxWTRkd3HtrrVTMdU');\r\n// Set playlist data (will set data for each song in the playlist)\r\nsong.setData({\r\n    initMessage: message\r\n});\r\n\r\n// Access custom data\r\nlet queue = player.getQueue(message.guild.id);\r\nlet { initMessage } = queue.nowPlaying.data;\r\nawait initMessage.channel.send(`This message object is hold in Song :D`);\r\n```\r\n","readmeFilename":"README.md","gitHead":"76aa5892cda1d0cc17b6de9d8e19e26973301193","_id":"spike-player@1.2.6-8","_nodeVersion":"16.15.1","_npmVersion":"8.11.0","dist":{"integrity":"sha512-PebGM5W1hAUoC7Fc2zLgb3fRVoUQ2/r2GS2SJ7eExRe8ebXAZZ2OX9JKkFRBMddiM0GKbVx5t3Nozzv3qpXOBg==","shasum":"6e86a1a4ce42c3529d7545b481784ac448c260f0","tarball":"https://registry.npmjs.org/spike-player/-/spike-player-1.2.6-8.tgz","fileCount":42,"unpackedSize":235978,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCwh7I3obAshJZit5dSM+66Lz3VnnUgoPBjXXk49TCDrwIgWGf2ucoN+wHsVJYr5VNMTmj4wbSHvcoQx4p1Psa9PmY="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi2QIDACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpMsQ/9EFti012Q1ObAkbDvVwcPl7kVuaRiLmlIoCoHxaWRnsavukKs\r\nGsFvmv43vZIsu6r6v9hsaGulIL/VyhW6n1M22yHRXelg8XT91pJDAfBDhd+4\r\no2NykPKLhS9fZhVve/+XLCN/R/smHrTMSZs7mTgK2S4XDoY6xpGkqCg8Y0iL\r\nh8o0GMRoISNATTl5O3ImywBl0pR7duYLGA5t2yh0d8LLvsIr+s8f7wfTjbHu\r\nezsW4Ll7WtQW0boQj+7bYuJ/edopw6Uq+06hwhpIW6Fq4U9Xnn83rfhQpevw\r\nkvUZ64y/TMxjDdCOGRYedeMwKRYCMYaz8PKOghSA6vU3bN+ALRbgtGGoDl9a\r\n73iY5Zzkgj0s6vA6kcLMO01vK7Cay/oU18lNuPRMH3eKFIcEkyJ60NMUd0OA\r\nVWpcxUggeGg/yky174igWpP4GkjdNToi6Wr7uZxNOoSqqbHAZl+XNlma/9Gn\r\nDU/PG+60x02WSP5rX9/eOhFYlOQTGz18rRDIi8mZlWdAARVMCvavYcf22SUr\r\ngN0NmjgPBL5cc6QdKiXPEE20CK8/cCXdXZ9wKIophFh03KleUstptmPAbrD6\r\nXe0w18TeG9N2fw+GHTl+hlQwZhVJiECEbZaEF5ehvapgbezQWBFyCwkwrihk\r\nbCaKIm8R5kBTVUNMYqCtN5w0I3qJoriBSOM=\r\n=EtbZ\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"spikebot","email":"abatallah1214@gmail.com"},"maintainers":[{"name":"spikebot","email":"abatallah1214@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spike-player_1.2.6-8_1658388995030_0.5520846987686141"},"_hasShrinkwrap":false},"1.2.10-0":{"name":"spike-player","version":"1.2.10-0","description":"Complete framework to facilitate music commands using discord.js v13 & v14","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","test":"jest test/test.js","clean":"rimraf dist","pre":"npm version prerelease --force && npm publish --access public --tag dev","prep":"npm run clean && npm run build","pub":"standard-version && conventional-changelog -p angular -i CHANGELOG.md -s && npm publish","docs:test":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml","docs":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml --output docs/docs.json","prepare":"husky install"},"keywords":["music","player","bot","framework","discord","youtube","spotify","v13","v14"],"dependencies":{"@discordjs/opus":"^0.8.0","@discordjs/voice":"^0.11.0","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.29.0","@typescript-eslint/parser":"^5.29.0","axios":"^0.27.2","axios-retry":"^3.2.0","discord-ytdl-core":"^5.0.4","domhandler":"^5.0.3","eslint":"^8.18.0","ffmpeg-static":"^5.0.2","htmlparser2":"^8.0.1","isomorphic-unfetch":"^3.1.0","jest":"^28.1.1","libsodium-wrappers":"^0.7.9","rimraf":"^3.0.2","soundcloud-scraper":"github:AnupKumarPanwar/soundcloud-scraper","spotify-url-info":"^3.1.2","youtubei":"^0.0.1-rc.34","ytdl-core":"^4.11.0","ytsr":"^3.8.0"},"devDependencies":{"@babel/cli":"^7.14.8","@babel/core":"^7.15.0","@babel/preset-env":"^7.15.0","@babel/preset-typescript":"^7.15.0","@commitlint/cli":"^17.0.3","@rocketseat/commitlint-config":"^0.0.3","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.29.0","@typescript-eslint/parser":"^5.29.0","assert-diff":"^3.0.2","discord.js":"^14.0.2","discord.js-docgen":"github:discordjs/docgen#ts-patch","eslint":"^8.18.0","husky":"^8.0.0","jest":"^28.1.1","jsdoc-babel":"^0.5.0","ts-node":"^10.2.0","typescript":"^4.3.5"},"directories":{"doc":"docs","test":"test"},"engines":{"node":">=16.9.0"},"workspaces":["packages/*"],"packageManager":"npm@8.11.0","readme":"# Discord Music Player\r\n![npm](https://img.shields.io/npm/dt/discord-music-player?style=for-the-badge)\r\n![npm](https://img.shields.io/npm/v/discord-music-player?style=for-the-badge)\r\n![CodeFactor Grade](https://img.shields.io/codefactor/grade/github/SushiBtw/discord-music-player?color=%2348aaf1&style=for-the-badge)\r\n\r\n### Note: This is the v8 version of Discord Music Player for Discord.JS v13!\r\n\r\nDiscord Music Player is a powerful [Node.js](https://nodejs.org) module that allows you to easily implement music commands.\r\n**Everything** is customizable, and everything can be done using this package - **there are no limitations!**\r\n\r\nThis package supports YouTube Videos & Playlists, Spotify Songs & Playlists, Apple Music Songs & Playlists.\r\nPackage from version v7.0.0 is fully maintained by [SushiBtw](https://github.com/SushiBtw).\r\n\r\n### Requirements:\r\n- [Discord.js v13](https://www.npmjs.com/package/discord.js),\r\n- [Node.JS v16](https://nodejs.org/),\r\n\r\n# Installation\r\n*Node.JS v16 or newer is required to run this module.*\r\n```sh\r\nnpm install --save discord-music-player\r\n```\r\nInstall **@discordjs/opus**:\r\n```sh\r\nnpm install --save @discordjs/opus\r\n```\r\n**Install [FFMPEG](https://www.ffmpeg.org/download.html)!**\r\n\r\n# Documentation\r\n**Discord Music Player documentation: [https://discord-music-player.js.org/](https://discord-music-player.js.org/)**\r\n\r\n### **Need some help?**\r\nFeel free to join [Discord-Music-Player Discord Server](https://discord.gg/6fejZNsmFC) and ask us about DMP.\r\n\r\n# Getting Started\r\n**The code bellow, will show you how to use DMP in your code.**\r\n\r\n*Please define your **Player** after the **client/bot** definition.*\r\n\r\n[!] Remember to include the related voice **Intents** at the client options. [!]\r\n```js\r\nconst Discord = require(\"discord.js\");\r\nconst client = new Discord.Client({\r\n    intents: [Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES, Intents.FLAGS.GUILD_VOICE_STATES]\r\n});\r\nconst settings = {\r\n    prefix: '!',\r\n    token: 'YourBotTokenHere'\r\n};\r\n\r\nconst { Player } = require(\"discord-music-player\");\r\nconst player = new Player(client, {\r\n    leaveOnEmpty: false, // This options are optional.\r\n});\r\n// You can define the Player as *client.player* to easily access it.\r\nclient.player = player;\r\n\r\nclient.on(\"ready\", () => {\r\n    console.log(\"I am ready to Play with DMP 🎶\");\r\n});\r\n\r\nclient.login(settings.token);\r\n```\r\n\r\n# Example Usage\r\n```js\r\nconst { RepeatMode } = require('discord-music-player');\r\n\r\nclient.on('messageCreate', async (message) => {\r\n    const args = message.content.slice(settings.prefix.length).trim().split(/ +/g);\r\n    const command = args.shift();\r\n    let guildQueue = client.player.getQueue(message.guild.id);\r\n\r\n    if(command === 'play') {\r\n        let queue = client.player.createQueue(message.guild.id);\r\n        await queue.join(message.member.voice.channel);\r\n        let song = await queue.play(args.join(' ')).catch(_ => {\r\n            if(!guildQueue)\r\n                queue.stop();\r\n        });\r\n    }\r\n\r\n    if(command === 'playlist') {\r\n        let queue = client.player.createQueue(message.guild.id);\r\n        await queue.join(message.member.voice.channel);\r\n        let song = await queue.playlist(args.join(' ')).catch(_ => {\r\n            if(!guildQueue)\r\n                queue.stop();\r\n        });\r\n    }\r\n\r\n    if(command === 'skip') {\r\n        guildQueue.skip();\r\n    }\r\n\r\n    if(command === 'stop') {\r\n        guildQueue.stop();\r\n    }\r\n\r\n    if(command === 'removeLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.DISABLED); // or 0 instead of RepeatMode.DISABLED\r\n    }\r\n\r\n    if(command === 'toggleLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.SONG); // or 1 instead of RepeatMode.SONG\r\n    }\r\n\r\n    if(command === 'toggleQueueLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.QUEUE); // or 2 instead of RepeatMode.QUEUE\r\n    }\r\n\r\n    if(command === 'setVolume') {\r\n        guildQueue.setVolume(parseInt(args[0]));\r\n    }\r\n\r\n    if(command === 'seek') {\r\n        guildQueue.seek(parseInt(args[0]) * 1000);\r\n    }\r\n\r\n    if(command === 'clearQueue') {\r\n        guildQueue.clearQueue();\r\n    }\r\n\r\n    if(command === 'shuffle') {\r\n        guildQueue.shuffle();\r\n    }\r\n\r\n    if(command === 'getQueue') {\r\n        console.log(guildQueue);\r\n    }\r\n\r\n    if(command === 'getVolume') {\r\n        console.log(guildQueue.volume)\r\n    }\r\n\r\n    if(command === 'nowPlaying') {\r\n        console.log(`Now playing: ${guildQueue.nowPlaying}`);\r\n    }\r\n\r\n    if(command === 'pause') {\r\n        guildQueue.setPaused(true);\r\n    }\r\n\r\n    if(command === 'resume') {\r\n        guildQueue.setPaused(false);\r\n    }\r\n\r\n    if(command === 'remove') {\r\n        guildQueue.remove(parseInt(args[0]));\r\n    }\r\n\r\n    if(command === 'createProgressBar') {\r\n        const ProgressBar = guildQueue.createProgressBar();\r\n        \r\n        // [======>              ][00:35/2:20]\r\n        console.log(ProgressBar.prettier);\r\n    }\r\n})\r\n```\r\n\r\n### Events:\r\n```js\r\n// Init the event listener only once (at the top of your code).\r\nclient.player\r\n    // Emitted when channel was empty.\r\n    .on('channelEmpty',  (queue) =>\r\n        console.log(`Everyone left the Voice Channel, queue ended.`))\r\n    // Emitted when a song was added to the queue.\r\n    .on('songAdd',  (queue, song) =>\r\n        console.log(`Song ${song} was added to the queue.`))\r\n    // Emitted when a playlist was added to the queue.\r\n    .on('playlistAdd',  (queue, playlist) =>\r\n        console.log(`Playlist ${playlist} with ${playlist.songs.length} was added to the queue.`))\r\n    // Emitted when there was no more music to play.\r\n    .on('queueDestroyed',  (queue) =>\r\n        console.log(`The queue was destroyed.`))\r\n    // Emitted when the queue was destroyed (either by ending or stopping).    \r\n    .on('queueEnd',  (queue) =>\r\n        console.log(`The queue has ended.`))\r\n    // Emitted when a song changed.\r\n    .on('songChanged', (queue, newSong, oldSong) =>\r\n        console.log(`${newSong} is now playing.`))\r\n    // Emitted when a first song in the queue started playing.\r\n    .on('songFirst',  (queue, song) =>\r\n        console.log(`Started playing ${song}.`))\r\n    // Emitted when someone disconnected the bot from the channel.\r\n    .on('clientDisconnect', (queue) =>\r\n        console.log(`I was kicked from the Voice Channel, queue ended.`))\r\n    // Emitted when deafenOnJoin is true and the bot was undeafened\r\n    .on('clientUndeafen', (queue) =>\r\n        console.log(`I got undefeanded.`))\r\n    // Emitted when there was an error in runtime\r\n    .on('error', (error, queue) => {\r\n        console.log(`Error: ${error} in ${queue.guild.name}`);\r\n    });\r\n```\r\n\r\n# Passing custom data\r\n\r\n### Queue\r\nWhile running the `Queue#createQueue()` method you can pass a `options#data` object to hold custom data.\r\nThis can be made in two ways:\r\n```js\r\n// Pass custom data\r\nawait player.createQueue(message.guild.id, {\r\n    data: {\r\n        queueInitMessage: message,\r\n        myObject: 'this will stay with the queue :)',\r\n        more: 'add more... there are no limitations...'\r\n    }\r\n});\r\n// Or by using\r\nqueue.setData({\r\n    whatever: 'you want :D'\r\n});\r\n\r\n// Access custom data\r\nlet queue = player.getQueue(message.guild.id);\r\nlet initMessage = queue.data.queueInitMessage;\r\nawait initMessage.channel.send(`This message object is hold in Queue :D`);\r\n```\r\n\r\n### Song or Playlist\r\nWhile running the `Queue#play()`/Queue#playlist() method you can pass a `options#data` object to hold custom data.\r\nThis can be made in two ways:\r\n```js\r\n// Play the song\r\nlet song = await queue.play('Born in the USA!');\r\n// Set song data\r\nsong.setData({\r\n    initMessage: message\r\n});\r\n\r\n// Play the playlist\r\nlet playlist = await queue.playlist('https://www.youtube.com/playlist?list=PLDLGxnP4y2mGKGEqwxWTRkd3HtrrVTMdU');\r\n// Set playlist data (will set data for each song in the playlist)\r\nsong.setData({\r\n    initMessage: message\r\n});\r\n\r\n// Access custom data\r\nlet queue = player.getQueue(message.guild.id);\r\nlet { initMessage } = queue.nowPlaying.data;\r\nawait initMessage.channel.send(`This message object is hold in Song :D`);\r\n```\r\n","readmeFilename":"README.md","gitHead":"a79eaced2e3c050d00262ed3f6e1687d53ceed16","_id":"spike-player@1.2.10-0","_nodeVersion":"16.15.1","_npmVersion":"8.11.0","dist":{"integrity":"sha512-Lnbac71OcLSV/+mguH13izBTTt9DKEhCtyLMrXKlbLuyPcjCz0ux3qUIZenG9fLntTvLFj0XBu+yPUOCMX7/Zw==","shasum":"2da92a7639edf7ffcce8b75c27c1d183438d83fa","tarball":"https://registry.npmjs.org/spike-player/-/spike-player-1.2.10-0.tgz","fileCount":40,"unpackedSize":235995,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDB9LidkHzoxsFSPUqEpoC34tZYKcjGXhxfqdfimkFC7gIhAPb+7/u8+6shPGnyutPuJqySPNCzfxvZw0bHFXeuDQyH"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi2sr4ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpjlRAAo41aljt1WMOQoPqyP25GuzuFJwWnXobsE4spxTkF1cE21f+G\r\nR+6hdNTI6IKSJ6mrFdCNVfZdCVgHTdiQ2PQArqNBpnsofQmkDohKtR9xRH2z\r\nxxqwl0utv3J8jb8vfYvKyG3ka6fqpNclqXn8c1j5iWUqU0RcIyoYaAxUk2up\r\nCfiUCvFI7CQsXc+fDg1A4zLeZQsTQ4n9dwWmMxf6hZS9XjGZhGzUeK55581i\r\ne5G/LYPKoAQhy0ZukEPPfpkz97cspNRkS1fbVsGOPy8bpuz+5JQtUAqFawGI\r\nRLHAB+vq07z+PSoPttFnvqtk5uniEdWzFPLm1Gnmmbv++KulJFbqltuVF6d4\r\n9WLEsRzSVcY+oOwlNZ8kcwQJnV6LymnzmGk1kpz+GIIPxkIybyXrMjXf23oD\r\neGQQFJoQ+oBhfOCMLtj7Wir5miyUgBUs1H/zevgwIveOnNa7/5zB4aZfQwFR\r\nagiG/Cx3od+tZYYb1PzpLArbrumZuSMK+/Zyd/Zlp3PdeOClgYw0RvehJ5F2\r\nxiRr8jQ8Vx9f+Sktqno0Bz+KWsCLJe/8u0CQrzMQwYfeAv/BOY+/mWDC4mX0\r\nIk0/dfzeaUlfhgFgjmxLUcL37TQYHq57HtfKHSU9bpmCKCJ9KXF6flG1+T8z\r\nqTPVrj53yBOWdxfvlgRuz43jukkYwsEcq48=\r\n=3NCN\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"spikebot","email":"abatallah1214@gmail.com"},"maintainers":[{"name":"spikebot","email":"abatallah1214@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spike-player_1.2.10-0_1658505976549_0.3670626115375961"},"_hasShrinkwrap":false},"1.3.0-1":{"name":"spike-player","version":"1.3.0-1","description":"Complete framework to facilitate music commands using discord.js v13 & v14","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","test":"jest test/test.js","clean":"rimraf dist","pre":"npm version prerelease --force && npm publish --access public --tag dev","prep":"npm run clean && npm run build","pub":"standard-version && conventional-changelog -p angular -i CHANGELOG.md -s && npm publish","docs:test":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml","docs":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml --output docs/docs.json","prepare":"husky install"},"keywords":["music","player","bot","framework","discord","youtube","spotify","v13","v14"],"dependencies":{"@discordjs/opus":"^0.8.0","@discordjs/voice":"^0.11.0","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.29.0","@typescript-eslint/parser":"^5.29.0","axios":"^0.27.2","axios-retry":"^3.2.0","discord-ytdl-core":"^5.0.4","domhandler":"^5.0.3","eslint":"^8.18.0","ffmpeg-static":"^5.0.2","htmlparser2":"^8.0.1","isomorphic-unfetch":"^3.1.0","jest":"^28.1.1","libsodium-wrappers":"^0.7.9","rimraf":"^3.0.2","soundcloud-scraper":"github:AnupKumarPanwar/soundcloud-scraper","spotify-url-info":"^3.1.2","youtubei":"^0.0.1-rc.34","ytdl-core":"^4.11.0","ytsr":"^3.8.0"},"devDependencies":{"@babel/cli":"^7.14.8","@babel/core":"^7.15.0","@babel/preset-env":"^7.15.0","@babel/preset-typescript":"^7.15.0","@commitlint/cli":"^17.0.3","@rocketseat/commitlint-config":"^0.0.3","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.29.0","@typescript-eslint/parser":"^5.29.0","assert-diff":"^3.0.2","discord.js":"^14.0.2","discord.js-docgen":"github:discordjs/docgen#ts-patch","eslint":"^8.18.0","husky":"^8.0.0","jest":"^28.1.1","jsdoc-babel":"^0.5.0","ts-node":"^10.2.0","typescript":"^4.3.5"},"directories":{"doc":"docs","test":"test"},"engines":{"node":">=16.9.0"},"workspaces":["packages/*"],"packageManager":"npm@8.11.0","readme":"# Discord Music Player\r\n![npm](https://img.shields.io/npm/dt/discord-music-player?style=for-the-badge)\r\n![npm](https://img.shields.io/npm/v/discord-music-player?style=for-the-badge)\r\n![CodeFactor Grade](https://img.shields.io/codefactor/grade/github/SushiBtw/discord-music-player?color=%2348aaf1&style=for-the-badge)\r\n\r\n### Note: This is the v8 version of Discord Music Player for Discord.JS v13!\r\n\r\nDiscord Music Player is a powerful [Node.js](https://nodejs.org) module that allows you to easily implement music commands.\r\n**Everything** is customizable, and everything can be done using this package - **there are no limitations!**\r\n\r\nThis package supports YouTube Videos & Playlists, Spotify Songs & Playlists, Apple Music Songs & Playlists.\r\nPackage from version v7.0.0 is fully maintained by [SushiBtw](https://github.com/SushiBtw).\r\n\r\n### Requirements:\r\n- [Discord.js v13](https://www.npmjs.com/package/discord.js),\r\n- [Node.JS v16](https://nodejs.org/),\r\n\r\n# Installation\r\n*Node.JS v16 or newer is required to run this module.*\r\n```sh\r\nnpm install --save discord-music-player\r\n```\r\nInstall **@discordjs/opus**:\r\n```sh\r\nnpm install --save @discordjs/opus\r\n```\r\n**Install [FFMPEG](https://www.ffmpeg.org/download.html)!**\r\n\r\n# Documentation\r\n**Discord Music Player documentation: [https://discord-music-player.js.org/](https://discord-music-player.js.org/)**\r\n\r\n### **Need some help?**\r\nFeel free to join [Discord-Music-Player Discord Server](https://discord.gg/6fejZNsmFC) and ask us about DMP.\r\n\r\n# Getting Started\r\n**The code bellow, will show you how to use DMP in your code.**\r\n\r\n*Please define your **Player** after the **client/bot** definition.*\r\n\r\n[!] Remember to include the related voice **Intents** at the client options. [!]\r\n```js\r\nconst Discord = require(\"discord.js\");\r\nconst client = new Discord.Client({\r\n    intents: [Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES, Intents.FLAGS.GUILD_VOICE_STATES]\r\n});\r\nconst settings = {\r\n    prefix: '!',\r\n    token: 'YourBotTokenHere'\r\n};\r\n\r\nconst { Player } = require(\"discord-music-player\");\r\nconst player = new Player(client, {\r\n    leaveOnEmpty: false, // This options are optional.\r\n});\r\n// You can define the Player as *client.player* to easily access it.\r\nclient.player = player;\r\n\r\nclient.on(\"ready\", () => {\r\n    console.log(\"I am ready to Play with DMP 🎶\");\r\n});\r\n\r\nclient.login(settings.token);\r\n```\r\n\r\n# Example Usage\r\n```js\r\nconst { RepeatMode } = require('discord-music-player');\r\n\r\nclient.on('messageCreate', async (message) => {\r\n    const args = message.content.slice(settings.prefix.length).trim().split(/ +/g);\r\n    const command = args.shift();\r\n    let guildQueue = client.player.getQueue(message.guild.id);\r\n\r\n    if(command === 'play') {\r\n        let queue = client.player.createQueue(message.guild.id);\r\n        await queue.join(message.member.voice.channel);\r\n        let song = await queue.play(args.join(' ')).catch(_ => {\r\n            if(!guildQueue)\r\n                queue.stop();\r\n        });\r\n    }\r\n\r\n    if(command === 'playlist') {\r\n        let queue = client.player.createQueue(message.guild.id);\r\n        await queue.join(message.member.voice.channel);\r\n        let song = await queue.playlist(args.join(' ')).catch(_ => {\r\n            if(!guildQueue)\r\n                queue.stop();\r\n        });\r\n    }\r\n\r\n    if(command === 'skip') {\r\n        guildQueue.skip();\r\n    }\r\n\r\n    if(command === 'stop') {\r\n        guildQueue.stop();\r\n    }\r\n\r\n    if(command === 'removeLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.DISABLED); // or 0 instead of RepeatMode.DISABLED\r\n    }\r\n\r\n    if(command === 'toggleLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.SONG); // or 1 instead of RepeatMode.SONG\r\n    }\r\n\r\n    if(command === 'toggleQueueLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.QUEUE); // or 2 instead of RepeatMode.QUEUE\r\n    }\r\n\r\n    if(command === 'setVolume') {\r\n        guildQueue.setVolume(parseInt(args[0]));\r\n    }\r\n\r\n    if(command === 'seek') {\r\n        guildQueue.seek(parseInt(args[0]) * 1000);\r\n    }\r\n\r\n    if(command === 'clearQueue') {\r\n        guildQueue.clearQueue();\r\n    }\r\n\r\n    if(command === 'shuffle') {\r\n        guildQueue.shuffle();\r\n    }\r\n\r\n    if(command === 'getQueue') {\r\n        console.log(guildQueue);\r\n    }\r\n\r\n    if(command === 'getVolume') {\r\n        console.log(guildQueue.volume)\r\n    }\r\n\r\n    if(command === 'nowPlaying') {\r\n        console.log(`Now playing: ${guildQueue.nowPlaying}`);\r\n    }\r\n\r\n    if(command === 'pause') {\r\n        guildQueue.setPaused(true);\r\n    }\r\n\r\n    if(command === 'resume') {\r\n        guildQueue.setPaused(false);\r\n    }\r\n\r\n    if(command === 'remove') {\r\n        guildQueue.remove(parseInt(args[0]));\r\n    }\r\n\r\n    if(command === 'createProgressBar') {\r\n        const ProgressBar = guildQueue.createProgressBar();\r\n        \r\n        // [======>              ][00:35/2:20]\r\n        console.log(ProgressBar.prettier);\r\n    }\r\n})\r\n```\r\n\r\n### Events:\r\n```js\r\n// Init the event listener only once (at the top of your code).\r\nclient.player\r\n    // Emitted when channel was empty.\r\n    .on('channelEmpty',  (queue) =>\r\n        console.log(`Everyone left the Voice Channel, queue ended.`))\r\n    // Emitted when a song was added to the queue.\r\n    .on('songAdd',  (queue, song) =>\r\n        console.log(`Song ${song} was added to the queue.`))\r\n    // Emitted when a playlist was added to the queue.\r\n    .on('playlistAdd',  (queue, playlist) =>\r\n        console.log(`Playlist ${playlist} with ${playlist.songs.length} was added to the queue.`))\r\n    // Emitted when there was no more music to play.\r\n    .on('queueDestroyed',  (queue) =>\r\n        console.log(`The queue was destroyed.`))\r\n    // Emitted when the queue was destroyed (either by ending or stopping).    \r\n    .on('queueEnd',  (queue) =>\r\n        console.log(`The queue has ended.`))\r\n    // Emitted when a song changed.\r\n    .on('songChanged', (queue, newSong, oldSong) =>\r\n        console.log(`${newSong} is now playing.`))\r\n    // Emitted when a first song in the queue started playing.\r\n    .on('songFirst',  (queue, song) =>\r\n        console.log(`Started playing ${song}.`))\r\n    // Emitted when someone disconnected the bot from the channel.\r\n    .on('clientDisconnect', (queue) =>\r\n        console.log(`I was kicked from the Voice Channel, queue ended.`))\r\n    // Emitted when deafenOnJoin is true and the bot was undeafened\r\n    .on('clientUndeafen', (queue) =>\r\n        console.log(`I got undefeanded.`))\r\n    // Emitted when there was an error in runtime\r\n    .on('error', (error, queue) => {\r\n        console.log(`Error: ${error} in ${queue.guild.name}`);\r\n    });\r\n```\r\n\r\n# Passing custom data\r\n\r\n### Queue\r\nWhile running the `Queue#createQueue()` method you can pass a `options#data` object to hold custom data.\r\nThis can be made in two ways:\r\n```js\r\n// Pass custom data\r\nawait player.createQueue(message.guild.id, {\r\n    data: {\r\n        queueInitMessage: message,\r\n        myObject: 'this will stay with the queue :)',\r\n        more: 'add more... there are no limitations...'\r\n    }\r\n});\r\n// Or by using\r\nqueue.setData({\r\n    whatever: 'you want :D'\r\n});\r\n\r\n// Access custom data\r\nlet queue = player.getQueue(message.guild.id);\r\nlet initMessage = queue.data.queueInitMessage;\r\nawait initMessage.channel.send(`This message object is hold in Queue :D`);\r\n```\r\n\r\n### Song or Playlist\r\nWhile running the `Queue#play()`/Queue#playlist() method you can pass a `options#data` object to hold custom data.\r\nThis can be made in two ways:\r\n```js\r\n// Play the song\r\nlet song = await queue.play('Born in the USA!');\r\n// Set song data\r\nsong.setData({\r\n    initMessage: message\r\n});\r\n\r\n// Play the playlist\r\nlet playlist = await queue.playlist('https://www.youtube.com/playlist?list=PLDLGxnP4y2mGKGEqwxWTRkd3HtrrVTMdU');\r\n// Set playlist data (will set data for each song in the playlist)\r\nsong.setData({\r\n    initMessage: message\r\n});\r\n\r\n// Access custom data\r\nlet queue = player.getQueue(message.guild.id);\r\nlet { initMessage } = queue.nowPlaying.data;\r\nawait initMessage.channel.send(`This message object is hold in Song :D`);\r\n```\r\n","readmeFilename":"README.md","gitHead":"ed09478664f46b1430de9bbd4821db9e43cf08bd","_id":"spike-player@1.3.0-1","_nodeVersion":"16.15.1","_npmVersion":"8.11.0","dist":{"integrity":"sha512-XkmGo6eLv9U/oNKSkZ5fmzpG3x7TYuLQApzpOZqY+tqH6KUlMpCyMPIaARDlYmk6RDdKjiiPsaH/Zn5jxy6uGA==","shasum":"90e2d035713fbbb1d216348a0fc6cee890c92b10","tarball":"https://registry.npmjs.org/spike-player/-/spike-player-1.3.0-1.tgz","fileCount":40,"unpackedSize":235994,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDttO+pae0GCYNGUHumZrrWamA3fEEF+h2tgn11dKbo1QIgBA1b3qPJ6I9mfGwyxfXzffcroxnw6WXR2k+IbaUbcYA="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi2ssoACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpDng//Uhn1XFYUdoxfzZaGNHcmPRsuK9CAbcp1twK6Casau1j3J9FH\r\nOWeYE2zlCdxcP4C/feOl5KeLAsyrMe9Ayub7U/Y1wKTvOZ9QiE9at8sdFJIr\r\n7VVplE6KKPzfVGP0pHvmXM9WX3s7bP4e6UsgfNzahgLMla1/juekV8PxrtLp\r\nQl9oNHJvI2TO1b9AxPnkA2X/wVrbmaOJ/I9FVvY922ZYEDTDWXS5v3zRQM/z\r\ndaY7EbM34sF2ro6L/Au5b7v9vo7mZtiyZPlgJJ3qiMm8qZGT4sk/+ajtsoAK\r\ngCpU8bVAoPGbvjZrn9N5tl2GmyG9f8A2RM6jBHkIoqwyDKZxfUvwXaVp8h7H\r\nEuB8Hok0ZCLVCKvf5dS/j+f8oqLIyANKLOj1og87JTFsgMkyfkAuE4n9AkcT\r\nqN0hevXDpR1nAUM3pRw4Leaqf5S+WOFiGx18BZ/Lfp1e8b/V5mG0bUjQZme0\r\n9WMNfmPyvT/wBSqpG+x1trXR6LbYU3N6BDUNECbhJja0BULo24/joVrCcihB\r\nWrieyy1hcobSo2knkZabfdLXWCLjl+yJgwVaNqFqCqMJPtV70stqcx3CWIN9\r\ndsCWzut2YaKeFyxkjEnJZUQq3tFtcfwxI6wabpJ3/wLrlbcBXmz4wBvTPh/9\r\nhfJCZXv3kZD+mrFIhzpQjRIvqRO3KcafcRU=\r\n=FPNM\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"spikebot","email":"abatallah1214@gmail.com"},"maintainers":[{"name":"spikebot","email":"abatallah1214@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spike-player_1.3.0-1_1658506024262_0.6135535104157357"},"_hasShrinkwrap":false},"1.3.0-2":{"name":"spike-player","version":"1.3.0-2","description":"Complete framework to facilitate music commands using discord.js v13 & v14","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","test":"jest test/test.js","clean":"rimraf dist","pre":"npm version prerelease --force && npm publish --access public --tag dev","prep":"npm run clean && npm run build","pub":"standard-version && conventional-changelog -p angular -i CHANGELOG.md -s && npm publish","docs:test":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml","docs":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml --output docs/docs.json","prepare":"husky install"},"keywords":["music","player","bot","framework","discord","youtube","spotify","v13","v14"],"dependencies":{"@discordjs/opus":"^0.8.0","@discordjs/voice":"^0.11.0","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.29.0","@typescript-eslint/parser":"^5.29.0","axios":"^0.27.2","axios-retry":"^3.2.0","discord-ytdl-core":"^5.0.4","domhandler":"^5.0.3","eslint":"^8.18.0","ffmpeg-static":"^5.0.2","htmlparser2":"^8.0.1","isomorphic-unfetch":"^3.1.0","jest":"^28.1.1","libsodium-wrappers":"^0.7.9","rimraf":"^3.0.2","soundcloud-scraper":"github:AnupKumarPanwar/soundcloud-scraper","spotify-url-info":"^3.1.2","youtubei":"^0.0.1-rc.34","ytdl-core":"^4.11.0","ytsr":"^3.8.0"},"devDependencies":{"@babel/cli":"^7.14.8","@babel/core":"^7.15.0","@babel/preset-env":"^7.15.0","@babel/preset-typescript":"^7.15.0","@commitlint/cli":"^17.0.3","@rocketseat/commitlint-config":"^0.0.3","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.29.0","@typescript-eslint/parser":"^5.29.0","assert-diff":"^3.0.2","discord.js":"^14.0.2","discord.js-docgen":"github:discordjs/docgen#ts-patch","eslint":"^8.18.0","husky":"^8.0.0","jest":"^28.1.1","jsdoc-babel":"^0.5.0","ts-node":"^10.2.0","typescript":"^4.3.5"},"directories":{"doc":"docs","test":"test"},"engines":{"node":">=16.9.0"},"workspaces":["packages/*"],"packageManager":"npm@8.11.0","readme":"# Discord Music Player\r\n![npm](https://img.shields.io/npm/dt/discord-music-player?style=for-the-badge)\r\n![npm](https://img.shields.io/npm/v/discord-music-player?style=for-the-badge)\r\n![CodeFactor Grade](https://img.shields.io/codefactor/grade/github/SushiBtw/discord-music-player?color=%2348aaf1&style=for-the-badge)\r\n\r\n### Note: This is the v8 version of Discord Music Player for Discord.JS v13!\r\n\r\nDiscord Music Player is a powerful [Node.js](https://nodejs.org) module that allows you to easily implement music commands.\r\n**Everything** is customizable, and everything can be done using this package - **there are no limitations!**\r\n\r\nThis package supports YouTube Videos & Playlists, Spotify Songs & Playlists, Apple Music Songs & Playlists.\r\nPackage from version v7.0.0 is fully maintained by [SushiBtw](https://github.com/SushiBtw).\r\n\r\n### Requirements:\r\n- [Discord.js v13](https://www.npmjs.com/package/discord.js),\r\n- [Node.JS v16](https://nodejs.org/),\r\n\r\n# Installation\r\n*Node.JS v16 or newer is required to run this module.*\r\n```sh\r\nnpm install --save discord-music-player\r\n```\r\nInstall **@discordjs/opus**:\r\n```sh\r\nnpm install --save @discordjs/opus\r\n```\r\n**Install [FFMPEG](https://www.ffmpeg.org/download.html)!**\r\n\r\n# Documentation\r\n**Discord Music Player documentation: [https://discord-music-player.js.org/](https://discord-music-player.js.org/)**\r\n\r\n### **Need some help?**\r\nFeel free to join [Discord-Music-Player Discord Server](https://discord.gg/6fejZNsmFC) and ask us about DMP.\r\n\r\n# Getting Started\r\n**The code bellow, will show you how to use DMP in your code.**\r\n\r\n*Please define your **Player** after the **client/bot** definition.*\r\n\r\n[!] Remember to include the related voice **Intents** at the client options. [!]\r\n```js\r\nconst Discord = require(\"discord.js\");\r\nconst client = new Discord.Client({\r\n    intents: [Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES, Intents.FLAGS.GUILD_VOICE_STATES]\r\n});\r\nconst settings = {\r\n    prefix: '!',\r\n    token: 'YourBotTokenHere'\r\n};\r\n\r\nconst { Player } = require(\"discord-music-player\");\r\nconst player = new Player(client, {\r\n    leaveOnEmpty: false, // This options are optional.\r\n});\r\n// You can define the Player as *client.player* to easily access it.\r\nclient.player = player;\r\n\r\nclient.on(\"ready\", () => {\r\n    console.log(\"I am ready to Play with DMP 🎶\");\r\n});\r\n\r\nclient.login(settings.token);\r\n```\r\n\r\n# Example Usage\r\n```js\r\nconst { RepeatMode } = require('discord-music-player');\r\n\r\nclient.on('messageCreate', async (message) => {\r\n    const args = message.content.slice(settings.prefix.length).trim().split(/ +/g);\r\n    const command = args.shift();\r\n    let guildQueue = client.player.getQueue(message.guild.id);\r\n\r\n    if(command === 'play') {\r\n        let queue = client.player.createQueue(message.guild.id);\r\n        await queue.join(message.member.voice.channel);\r\n        let song = await queue.play(args.join(' ')).catch(_ => {\r\n            if(!guildQueue)\r\n                queue.stop();\r\n        });\r\n    }\r\n\r\n    if(command === 'playlist') {\r\n        let queue = client.player.createQueue(message.guild.id);\r\n        await queue.join(message.member.voice.channel);\r\n        let song = await queue.playlist(args.join(' ')).catch(_ => {\r\n            if(!guildQueue)\r\n                queue.stop();\r\n        });\r\n    }\r\n\r\n    if(command === 'skip') {\r\n        guildQueue.skip();\r\n    }\r\n\r\n    if(command === 'stop') {\r\n        guildQueue.stop();\r\n    }\r\n\r\n    if(command === 'removeLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.DISABLED); // or 0 instead of RepeatMode.DISABLED\r\n    }\r\n\r\n    if(command === 'toggleLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.SONG); // or 1 instead of RepeatMode.SONG\r\n    }\r\n\r\n    if(command === 'toggleQueueLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.QUEUE); // or 2 instead of RepeatMode.QUEUE\r\n    }\r\n\r\n    if(command === 'setVolume') {\r\n        guildQueue.setVolume(parseInt(args[0]));\r\n    }\r\n\r\n    if(command === 'seek') {\r\n        guildQueue.seek(parseInt(args[0]) * 1000);\r\n    }\r\n\r\n    if(command === 'clearQueue') {\r\n        guildQueue.clearQueue();\r\n    }\r\n\r\n    if(command === 'shuffle') {\r\n        guildQueue.shuffle();\r\n    }\r\n\r\n    if(command === 'getQueue') {\r\n        console.log(guildQueue);\r\n    }\r\n\r\n    if(command === 'getVolume') {\r\n        console.log(guildQueue.volume)\r\n    }\r\n\r\n    if(command === 'nowPlaying') {\r\n        console.log(`Now playing: ${guildQueue.nowPlaying}`);\r\n    }\r\n\r\n    if(command === 'pause') {\r\n        guildQueue.setPaused(true);\r\n    }\r\n\r\n    if(command === 'resume') {\r\n        guildQueue.setPaused(false);\r\n    }\r\n\r\n    if(command === 'remove') {\r\n        guildQueue.remove(parseInt(args[0]));\r\n    }\r\n\r\n    if(command === 'createProgressBar') {\r\n        const ProgressBar = guildQueue.createProgressBar();\r\n        \r\n        // [======>              ][00:35/2:20]\r\n        console.log(ProgressBar.prettier);\r\n    }\r\n})\r\n```\r\n\r\n### Events:\r\n```js\r\n// Init the event listener only once (at the top of your code).\r\nclient.player\r\n    // Emitted when channel was empty.\r\n    .on('channelEmpty',  (queue) =>\r\n        console.log(`Everyone left the Voice Channel, queue ended.`))\r\n    // Emitted when a song was added to the queue.\r\n    .on('songAdd',  (queue, song) =>\r\n        console.log(`Song ${song} was added to the queue.`))\r\n    // Emitted when a playlist was added to the queue.\r\n    .on('playlistAdd',  (queue, playlist) =>\r\n        console.log(`Playlist ${playlist} with ${playlist.songs.length} was added to the queue.`))\r\n    // Emitted when there was no more music to play.\r\n    .on('queueDestroyed',  (queue) =>\r\n        console.log(`The queue was destroyed.`))\r\n    // Emitted when the queue was destroyed (either by ending or stopping).    \r\n    .on('queueEnd',  (queue) =>\r\n        console.log(`The queue has ended.`))\r\n    // Emitted when a song changed.\r\n    .on('songChanged', (queue, newSong, oldSong) =>\r\n        console.log(`${newSong} is now playing.`))\r\n    // Emitted when a first song in the queue started playing.\r\n    .on('songFirst',  (queue, song) =>\r\n        console.log(`Started playing ${song}.`))\r\n    // Emitted when someone disconnected the bot from the channel.\r\n    .on('clientDisconnect', (queue) =>\r\n        console.log(`I was kicked from the Voice Channel, queue ended.`))\r\n    // Emitted when deafenOnJoin is true and the bot was undeafened\r\n    .on('clientUndeafen', (queue) =>\r\n        console.log(`I got undefeanded.`))\r\n    // Emitted when there was an error in runtime\r\n    .on('error', (error, queue) => {\r\n        console.log(`Error: ${error} in ${queue.guild.name}`);\r\n    });\r\n```\r\n\r\n# Passing custom data\r\n\r\n### Queue\r\nWhile running the `Queue#createQueue()` method you can pass a `options#data` object to hold custom data.\r\nThis can be made in two ways:\r\n```js\r\n// Pass custom data\r\nawait player.createQueue(message.guild.id, {\r\n    data: {\r\n        queueInitMessage: message,\r\n        myObject: 'this will stay with the queue :)',\r\n        more: 'add more... there are no limitations...'\r\n    }\r\n});\r\n// Or by using\r\nqueue.setData({\r\n    whatever: 'you want :D'\r\n});\r\n\r\n// Access custom data\r\nlet queue = player.getQueue(message.guild.id);\r\nlet initMessage = queue.data.queueInitMessage;\r\nawait initMessage.channel.send(`This message object is hold in Queue :D`);\r\n```\r\n\r\n### Song or Playlist\r\nWhile running the `Queue#play()`/Queue#playlist() method you can pass a `options#data` object to hold custom data.\r\nThis can be made in two ways:\r\n```js\r\n// Play the song\r\nlet song = await queue.play('Born in the USA!');\r\n// Set song data\r\nsong.setData({\r\n    initMessage: message\r\n});\r\n\r\n// Play the playlist\r\nlet playlist = await queue.playlist('https://www.youtube.com/playlist?list=PLDLGxnP4y2mGKGEqwxWTRkd3HtrrVTMdU');\r\n// Set playlist data (will set data for each song in the playlist)\r\nsong.setData({\r\n    initMessage: message\r\n});\r\n\r\n// Access custom data\r\nlet queue = player.getQueue(message.guild.id);\r\nlet { initMessage } = queue.nowPlaying.data;\r\nawait initMessage.channel.send(`This message object is hold in Song :D`);\r\n```\r\n","readmeFilename":"README.md","gitHead":"b47a31b27c07045296fcdd0f00749f963011195a","_id":"spike-player@1.3.0-2","_nodeVersion":"16.15.1","_npmVersion":"8.11.0","dist":{"integrity":"sha512-h84uN8l4AVn9rsbLwL+PsXO2pd2xHUlcZFokTFlHg2fMbBOvuHYOUEVWE1F6YT3uIZpZUia9J5ulr04nz/cppA==","shasum":"95e40822767ee1b760456e1d474b9e7ba53ee612","tarball":"https://registry.npmjs.org/spike-player/-/spike-player-1.3.0-2.tgz","fileCount":40,"unpackedSize":236704,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGWWSAN+4VE3jSlHzBNm1dpoEDggUAzmLz5xfg/SI1gOAiAQBc1yHLlT86/JKbJXy9kdt4ialTW9YjR0MLd80+8//w=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi2wCPACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrJMw/+IgQOsTH27gpdosUQMSBzOI3bpIYmOT3SmocBSc9eIGxI8Dtc\r\nOuxzLbVJ4HKpcAz3bxn3cRlqHuKndwtsLaHW/IRlSMmy8ZUcVTpE7l0tFyzJ\r\n2BBieLKaGagl0OgRs8eyAuPBLcmiWaInArbj+Gj8du9B7pP7MwiJZm0HBg4R\r\n/PVuedZcf3nlMEAIEsJicQmnXtYMMjC/KSn0F/fRVj+XKUC1EINeIL54g2UA\r\nl45oiWb5uUwZVk5wXJrwz4v8yfezyLUMskeaK8FRPqsc1hUPmcT4VlakQF1j\r\nkllwNZHoNY44ZNCKighi6oURr6+1zhqwT2j7s3d/wtTc1QnK997XRD1RwIby\r\ni7INTJ3uznbRCTBCMKCTLKBfm3cNCzFbjzYcge+5EwmwjIMgWkdE4Ug0IFlz\r\noD2LTUZ8FnSw+WTRR/qwWhysfswb0Sf98sHfolR5zK9RE2QO35surLFJuz7N\r\nCYLzgAh4nu8HkY3o3Mbj4ZW2iM9E7Au/0vn9mh2wIROPs7b1dU4I2eZZxfbz\r\nfmkGi6QGZvySmFB3gW0CF4PZvkgBBRQ3HV5HZWmJ7qj7LAgzMI4W4bEvqA17\r\nG7OqINGk0I9eqkStuX7Uz7PchyA3e2Ek0fviUrI14Ah986+hZMKc9X5SIWdY\r\n4GgVZw7tkDAOFOaUqt5BD7mgMdjT5JkHaMU=\r\n=Ehq+\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"spikebot","email":"abatallah1214@gmail.com"},"maintainers":[{"name":"spikebot","email":"abatallah1214@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spike-player_1.3.0-2_1658519695116_0.5253088951585216"},"_hasShrinkwrap":false},"1.3.0":{"name":"spike-player","version":"1.3.0","description":"Complete framework to facilitate music commands using discord.js v13 & v14","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","test":"jest test/test.js","clean":"rimraf dist","pre":"npm version prerelease --force && npm publish --access public --tag dev","prep":"npm run clean && npm run build","pub":"standard-version && conventional-changelog -p angular -i CHANGELOG.md -s && npm publish","docs:test":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml","docs":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml --output docs/docs.json","prepare":"husky install"},"keywords":["music","player","bot","framework","discord","youtube","spotify","v13","v14"],"dependencies":{"@discordjs/opus":"^0.8.0","@discordjs/voice":"^0.11.0","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.29.0","@typescript-eslint/parser":"^5.29.0","axios":"^0.27.2","axios-retry":"^3.2.0","discord-ytdl-core":"^5.0.4","domhandler":"^5.0.3","eslint":"^8.18.0","ffmpeg-static":"^5.0.2","htmlparser2":"^8.0.1","isomorphic-unfetch":"^3.1.0","jest":"^28.1.1","libsodium-wrappers":"^0.7.9","rimraf":"^3.0.2","soundcloud-scraper":"github:AnupKumarPanwar/soundcloud-scraper","spotify-url-info":"^3.1.2","youtubei":"^0.0.1-rc.34","ytdl-core":"^4.11.0","ytsr":"^3.8.0"},"devDependencies":{"@babel/cli":"^7.14.8","@babel/core":"^7.15.0","@babel/preset-env":"^7.15.0","@babel/preset-typescript":"^7.15.0","@commitlint/cli":"^17.0.3","@rocketseat/commitlint-config":"^0.0.3","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.29.0","@typescript-eslint/parser":"^5.29.0","assert-diff":"^3.0.2","discord.js":"^14.0.2","discord.js-docgen":"github:discordjs/docgen#ts-patch","eslint":"^8.18.0","husky":"^8.0.0","jest":"^28.1.1","jsdoc-babel":"^0.5.0","ts-node":"^10.2.0","typescript":"^4.3.5"},"directories":{"doc":"docs","test":"test"},"engines":{"node":">=16.9.0"},"workspaces":["packages/*"],"packageManager":"npm@8.11.0","gitHead":"6fd051295b7e5c0bc49711ae3607081f3bd69f49","_id":"spike-player@1.3.0","_nodeVersion":"16.15.1","_npmVersion":"8.11.0","dist":{"integrity":"sha512-jJaJFrY7whEiBcaKmuBqmCYbqL+BCALQN2cwY82kVAPsqcdH1Vi/GoUWu8shRFwRuzq3D6MvSRL8cXULXVrjKw==","shasum":"0ae2825a6e8922eb88eb0221480c2bcf2c6608da","tarball":"https://registry.npmjs.org/spike-player/-/spike-player-1.3.0.tgz","fileCount":40,"unpackedSize":236798,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDHKBqdmyz1xF8AV5S4Z5eHGfMjA/zxv3Ook/9cQ13rGgIhANDG6bDXfDjpTQCmTfi3Qlz3Tzz0aeeIv28hXEzOvDUw"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi2wEgACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrQIg//XYwNsEUwmwKKvQTG2GGYACantOg9k5dIBja2MiksMDoX0M3o\r\nfDQ2slXMAyXoPj0I4/3aBlqZXdlsefqJo5PMiFSC6T5HoMCoH1vphx1sj3jR\r\nlm3HEyIY5XhTqIjDmwJw9uJb1uApLHagKNqouHQIYBv99a8RQbAlSqEBcjLO\r\nriL1ZrdF9SKL9F5Hko6phqQ91ldk6Y3IB+NonfgzmBKlfY4VWZLEN4d44g4x\r\nh2mQRXMaqnmxT6OQNNfcQJe+rv+9VLWUy4Jrzctn9IFA5Y1gqh1yNVgnmsRT\r\nMeCvLPIX517ICv7qJ9IrBATNIkgFNT8aAR3vGlOByAaOTzm8pjXVyxPYTLbh\r\nOCEXd0ORmm0oymY+//1p86sOyqJOBwaFEDdflhRwm/CoAWwKccLtjfTPc8d9\r\nYkyEJSa7zLOmWgK8VUAT7hZ6olV9SiSFWV23QKIQKubgbzr+NOdotQNDQCNJ\r\nHV0IM3dX6gGQCDiUnkqdREzhcSmqXHEbcB9UUFBYxyHrbdrrCaJZ4LiXBzOU\r\nxlTRjV/5cuas0ZCP13B14yKw1qwNgjtKYp2ikcptsmFfXdCzJ3m6EZXNx+Uw\r\nHDty4SsbWAR+dxFLR67xWG1hMTGhEt0WbQbuxP7TcU8MdM0sT36mfQrwJixV\r\nZ/SPl0p2vdBHvKrzAk9OD3XHaipY4JGUoHY=\r\n=IuDV\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"spikebot","email":"abatallah1214@gmail.com"},"maintainers":[{"name":"spikebot","email":"abatallah1214@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spike-player_1.3.0_1658519840217_0.10754328649011624"},"_hasShrinkwrap":false},"1.3.1":{"name":"spike-player","version":"1.3.1","description":"Complete framework to facilitate music commands using discord.js v13 & v14","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","test":"jest test/test.js","clean":"rimraf dist","pre":"npm version prerelease --force && npm publish --access public --tag dev","prep":"npm run clean && npm run build","pub":"conventional-changelog -p angular -i CHANGELOG.md -s && npm publish","docs:test":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml","docs":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml --output docs/docs.json","prepare":"husky install"},"keywords":["music","player","bot","framework","discord","youtube","spotify","v13","v14"],"dependencies":{"@discordjs/opus":"^0.8.0","@discordjs/voice":"^0.11.0","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.29.0","@typescript-eslint/parser":"^5.29.0","axios":"^0.27.2","axios-retry":"^3.2.0","discord-ytdl-core":"^5.0.4","domhandler":"^5.0.3","eslint":"^8.18.0","ffmpeg-static":"^5.0.2","htmlparser2":"^8.0.1","isomorphic-unfetch":"^3.1.0","jest":"^28.1.1","libsodium-wrappers":"^0.7.9","rimraf":"^3.0.2","soundcloud-scraper":"github:AnupKumarPanwar/soundcloud-scraper","spotify-url-info":"^3.1.2","youtubei":"^0.0.1-rc.34","ytdl-core":"^4.11.0","ytsr":"^3.8.0"},"devDependencies":{"@babel/cli":"^7.14.8","@babel/core":"^7.15.0","@babel/preset-env":"^7.15.0","@babel/preset-typescript":"^7.15.0","@commitlint/cli":"^17.0.3","@rocketseat/commitlint-config":"^0.0.3","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.29.0","@typescript-eslint/parser":"^5.29.0","assert-diff":"^3.0.2","discord.js":"^14.0.2","discord.js-docgen":"github:discordjs/docgen#ts-patch","eslint":"^8.18.0","husky":"^8.0.0","jest":"^28.1.1","jsdoc-babel":"^0.5.0","ts-node":"^10.2.0","typescript":"^4.3.5"},"directories":{"doc":"docs","test":"test"},"engines":{"node":">=16.9.0"},"workspaces":["packages/*"],"packageManager":"npm@8.11.0","gitHead":"6fd051295b7e5c0bc49711ae3607081f3bd69f49","_id":"spike-player@1.3.1","_nodeVersion":"16.15.1","_npmVersion":"8.11.0","dist":{"integrity":"sha512-s/QqrUPz8XNBwSh3V/9Gav1rLDdfGhFh5lmQW6hcSeHlOdRNgbGp47EaS4VpcVa/4hOUgChWUBegYRR2ZxNYig==","shasum":"6337d31c0027ee6061ed4a37a55145a54fcb7f89","tarball":"https://registry.npmjs.org/spike-player/-/spike-player-1.3.1.tgz","fileCount":40,"unpackedSize":236969,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC1g2wH3V5JpXp64+TzRKeQeFZzATdxexmB5OdAi4ABwAIhAInV0fmA3Iik0Jc/f4YhVB3x2N2CL3Lgga/QwaTzuVum"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi2+phACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmp7vQ//RdLYpFBltuMahn8Zt6K5/2FZTmREywEupDEgqRxzp9QyCpVF\r\nwPJT9w6fK8uVtLPeh1YNNdTzCLh/bqFb9JAvQE7/zqnqSg9vyEVNmf/acLGq\r\nlA8TIodcQysUy7tFzutczu4wt6HRefISbBjG/DXLvOrkoLbkpBeDm7I10TE/\r\nEfb0ztYhNV6wmbP6WLN5aMnpTnU4WXF1cuLE1zv0h5aNG7JSbvNmILn8XJ/3\r\nE5+H0FvbQ+GUEKXhc1Hy5ufVGvYSxPvwsPt27Rkv5cjOyl+ue6NhpaW2F8Jx\r\ny/qbazR/+NCe42H4FWC8H0yHZV7guM+7c7UksAOxfAzCqpE6wclnPpR385yK\r\n1R5WpHeHc465pqQvZynqQMUXu+fpAseD5D5zCOycFugD4l8v7YfMH4I1uft5\r\npNKb0TZ51U8W1YES/dVZwRdYUcdxQ8vZSkdZt2zkH9pJYg7hpyt3sPzh4Z5H\r\nctqZ2tEphN++NLLiPaXgqUEDXiXyro9UIQPivjc0A7mFFX1uOYpFYPjoCami\r\nWWavyjRZSisTdx446hETLFbQWlQ+REq4bkKUV1eGzFF3ydLEyf4w3wsyRiAV\r\n/KXD1SWBdiQ+OtuZ4EtzFtyy9g+D9NOaqazdIfrvzs0MyMrb5PumMBSxj2dT\r\niDfX3zbk7HsH7BAdaQz5RFOkOYGd6kAr4VA=\r\n=Qczt\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"spikebot","email":"abatallah1214@gmail.com"},"maintainers":[{"name":"spikebot","email":"abatallah1214@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spike-player_1.3.1_1658579552979_0.31703914845186865"},"_hasShrinkwrap":false},"1.3.2-0":{"name":"spike-player","version":"1.3.2-0","description":"Complete framework to facilitate music commands using discord.js v13 & v14","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","test":"jest test/test.js","clean":"rimraf dist","pre":"npm version prerelease --force && npm publish --access public --tag dev","prep":"npm run clean && npm run build","pub":"conventional-changelog -p angular -i CHANGELOG.md -s && npm publish","docs:test":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml","docs":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml --output docs/docs.json","prepare":"husky install"},"keywords":["music","player","bot","framework","discord","youtube","spotify","v13","v14"],"dependencies":{"@discordjs/opus":"^0.8.0","@discordjs/voice":"^0.11.0","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.29.0","@typescript-eslint/parser":"^5.29.0","axios":"^0.27.2","axios-retry":"^3.2.0","discord-ytdl-core":"^5.0.4","domhandler":"^5.0.3","eslint":"^8.18.0","ffmpeg-static":"^5.0.2","htmlparser2":"^8.0.1","isomorphic-unfetch":"^3.1.0","jest":"^28.1.1","libsodium-wrappers":"^0.7.9","rimraf":"^3.0.2","soundcloud-scraper":"github:AnupKumarPanwar/soundcloud-scraper","spotify-url-info":"^3.1.2","youtubei":"^0.0.1-rc.34","ytdl-core":"^4.11.0","ytsr":"^3.8.0"},"devDependencies":{"@babel/cli":"^7.14.8","@babel/core":"^7.15.0","@babel/preset-env":"^7.15.0","@babel/preset-typescript":"^7.15.0","@commitlint/cli":"^17.0.3","@rocketseat/commitlint-config":"^0.0.3","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.29.0","@typescript-eslint/parser":"^5.29.0","assert-diff":"^3.0.2","discord.js":"^14.0.2","discord.js-docgen":"github:discordjs/docgen#ts-patch","eslint":"^8.18.0","husky":"^8.0.0","jest":"^28.1.1","jsdoc-babel":"^0.5.0","ts-node":"^10.2.0","typescript":"^4.3.5"},"directories":{"doc":"docs","test":"test"},"engines":{"node":">=16.9.0"},"workspaces":["packages/*"],"packageManager":"npm@8.11.0","readme":"# Discord Music Player\r\n![npm](https://img.shields.io/npm/dt/discord-music-player?style=for-the-badge)\r\n![npm](https://img.shields.io/npm/v/discord-music-player?style=for-the-badge)\r\n![CodeFactor Grade](https://img.shields.io/codefactor/grade/github/SushiBtw/discord-music-player?color=%2348aaf1&style=for-the-badge)\r\n\r\n### Note: This is the v8 version of Discord Music Player for Discord.JS v13!\r\n\r\nDiscord Music Player is a powerful [Node.js](https://nodejs.org) module that allows you to easily implement music commands.\r\n**Everything** is customizable, and everything can be done using this package - **there are no limitations!**\r\n\r\nThis package supports YouTube Videos & Playlists, Spotify Songs & Playlists, Apple Music Songs & Playlists.\r\nPackage from version v7.0.0 is fully maintained by [SushiBtw](https://github.com/SushiBtw).\r\n\r\n### Requirements:\r\n- [Discord.js v13](https://www.npmjs.com/package/discord.js),\r\n- [Node.JS v16](https://nodejs.org/),\r\n\r\n# Installation\r\n*Node.JS v16 or newer is required to run this module.*\r\n```sh\r\nnpm install --save discord-music-player\r\n```\r\nInstall **@discordjs/opus**:\r\n```sh\r\nnpm install --save @discordjs/opus\r\n```\r\n**Install [FFMPEG](https://www.ffmpeg.org/download.html)!**\r\n\r\n# Documentation\r\n**Discord Music Player documentation: [https://discord-music-player.js.org/](https://discord-music-player.js.org/)**\r\n\r\n### **Need some help?**\r\nFeel free to join [Discord-Music-Player Discord Server](https://discord.gg/6fejZNsmFC) and ask us about DMP.\r\n\r\n# Getting Started\r\n**The code bellow, will show you how to use DMP in your code.**\r\n\r\n*Please define your **Player** after the **client/bot** definition.*\r\n\r\n[!] Remember to include the related voice **Intents** at the client options. [!]\r\n```js\r\nconst Discord = require(\"discord.js\");\r\nconst client = new Discord.Client({\r\n    intents: [Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES, Intents.FLAGS.GUILD_VOICE_STATES]\r\n});\r\nconst settings = {\r\n    prefix: '!',\r\n    token: 'YourBotTokenHere'\r\n};\r\n\r\nconst { Player } = require(\"discord-music-player\");\r\nconst player = new Player(client, {\r\n    leaveOnEmpty: false, // This options are optional.\r\n});\r\n// You can define the Player as *client.player* to easily access it.\r\nclient.player = player;\r\n\r\nclient.on(\"ready\", () => {\r\n    console.log(\"I am ready to Play with DMP 🎶\");\r\n});\r\n\r\nclient.login(settings.token);\r\n```\r\n\r\n# Example Usage\r\n```js\r\nconst { RepeatMode } = require('discord-music-player');\r\n\r\nclient.on('messageCreate', async (message) => {\r\n    const args = message.content.slice(settings.prefix.length).trim().split(/ +/g);\r\n    const command = args.shift();\r\n    let guildQueue = client.player.getQueue(message.guild.id);\r\n\r\n    if(command === 'play') {\r\n        let queue = client.player.createQueue(message.guild.id);\r\n        await queue.join(message.member.voice.channel);\r\n        let song = await queue.play(args.join(' ')).catch(_ => {\r\n            if(!guildQueue)\r\n                queue.stop();\r\n        });\r\n    }\r\n\r\n    if(command === 'playlist') {\r\n        let queue = client.player.createQueue(message.guild.id);\r\n        await queue.join(message.member.voice.channel);\r\n        let song = await queue.playlist(args.join(' ')).catch(_ => {\r\n            if(!guildQueue)\r\n                queue.stop();\r\n        });\r\n    }\r\n\r\n    if(command === 'skip') {\r\n        guildQueue.skip();\r\n    }\r\n\r\n    if(command === 'stop') {\r\n        guildQueue.stop();\r\n    }\r\n\r\n    if(command === 'removeLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.DISABLED); // or 0 instead of RepeatMode.DISABLED\r\n    }\r\n\r\n    if(command === 'toggleLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.SONG); // or 1 instead of RepeatMode.SONG\r\n    }\r\n\r\n    if(command === 'toggleQueueLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.QUEUE); // or 2 instead of RepeatMode.QUEUE\r\n    }\r\n\r\n    if(command === 'setVolume') {\r\n        guildQueue.setVolume(parseInt(args[0]));\r\n    }\r\n\r\n    if(command === 'seek') {\r\n        guildQueue.seek(parseInt(args[0]) * 1000);\r\n    }\r\n\r\n    if(command === 'clearQueue') {\r\n        guildQueue.clearQueue();\r\n    }\r\n\r\n    if(command === 'shuffle') {\r\n        guildQueue.shuffle();\r\n    }\r\n\r\n    if(command === 'getQueue') {\r\n        console.log(guildQueue);\r\n    }\r\n\r\n    if(command === 'getVolume') {\r\n        console.log(guildQueue.volume)\r\n    }\r\n\r\n    if(command === 'nowPlaying') {\r\n        console.log(`Now playing: ${guildQueue.nowPlaying}`);\r\n    }\r\n\r\n    if(command === 'pause') {\r\n        guildQueue.setPaused(true);\r\n    }\r\n\r\n    if(command === 'resume') {\r\n        guildQueue.setPaused(false);\r\n    }\r\n\r\n    if(command === 'remove') {\r\n        guildQueue.remove(parseInt(args[0]));\r\n    }\r\n\r\n    if(command === 'createProgressBar') {\r\n        const ProgressBar = guildQueue.createProgressBar();\r\n        \r\n        // [======>              ][00:35/2:20]\r\n        console.log(ProgressBar.prettier);\r\n    }\r\n})\r\n```\r\n\r\n### Events:\r\n```js\r\n// Init the event listener only once (at the top of your code).\r\nclient.player\r\n    // Emitted when channel was empty.\r\n    .on('channelEmpty',  (queue) =>\r\n        console.log(`Everyone left the Voice Channel, queue ended.`))\r\n    // Emitted when a song was added to the queue.\r\n    .on('songAdd',  (queue, song) =>\r\n        console.log(`Song ${song} was added to the queue.`))\r\n    // Emitted when a playlist was added to the queue.\r\n    .on('playlistAdd',  (queue, playlist) =>\r\n        console.log(`Playlist ${playlist} with ${playlist.songs.length} was added to the queue.`))\r\n    // Emitted when there was no more music to play.\r\n    .on('queueDestroyed',  (queue) =>\r\n        console.log(`The queue was destroyed.`))\r\n    // Emitted when the queue was destroyed (either by ending or stopping).    \r\n    .on('queueEnd',  (queue) =>\r\n        console.log(`The queue has ended.`))\r\n    // Emitted when a song changed.\r\n    .on('songChanged', (queue, newSong, oldSong) =>\r\n        console.log(`${newSong} is now playing.`))\r\n    // Emitted when a first song in the queue started playing.\r\n    .on('songFirst',  (queue, song) =>\r\n        console.log(`Started playing ${song}.`))\r\n    // Emitted when someone disconnected the bot from the channel.\r\n    .on('clientDisconnect', (queue) =>\r\n        console.log(`I was kicked from the Voice Channel, queue ended.`))\r\n    // Emitted when deafenOnJoin is true and the bot was undeafened\r\n    .on('clientUndeafen', (queue) =>\r\n        console.log(`I got undefeanded.`))\r\n    // Emitted when there was an error in runtime\r\n    .on('error', (error, queue) => {\r\n        console.log(`Error: ${error} in ${queue.guild.name}`);\r\n    });\r\n```\r\n\r\n# Passing custom data\r\n\r\n### Queue\r\nWhile running the `Queue#createQueue()` method you can pass a `options#data` object to hold custom data.\r\nThis can be made in two ways:\r\n```js\r\n// Pass custom data\r\nawait player.createQueue(message.guild.id, {\r\n    data: {\r\n        queueInitMessage: message,\r\n        myObject: 'this will stay with the queue :)',\r\n        more: 'add more... there are no limitations...'\r\n    }\r\n});\r\n// Or by using\r\nqueue.setData({\r\n    whatever: 'you want :D'\r\n});\r\n\r\n// Access custom data\r\nlet queue = player.getQueue(message.guild.id);\r\nlet initMessage = queue.data.queueInitMessage;\r\nawait initMessage.channel.send(`This message object is hold in Queue :D`);\r\n```\r\n\r\n### Song or Playlist\r\nWhile running the `Queue#play()`/Queue#playlist() method you can pass a `options#data` object to hold custom data.\r\nThis can be made in two ways:\r\n```js\r\n// Play the song\r\nlet song = await queue.play('Born in the USA!');\r\n// Set song data\r\nsong.setData({\r\n    initMessage: message\r\n});\r\n\r\n// Play the playlist\r\nlet playlist = await queue.playlist('https://www.youtube.com/playlist?list=PLDLGxnP4y2mGKGEqwxWTRkd3HtrrVTMdU');\r\n// Set playlist data (will set data for each song in the playlist)\r\nsong.setData({\r\n    initMessage: message\r\n});\r\n\r\n// Access custom data\r\nlet queue = player.getQueue(message.guild.id);\r\nlet { initMessage } = queue.nowPlaying.data;\r\nawait initMessage.channel.send(`This message object is hold in Song :D`);\r\n```\r\n","readmeFilename":"README.md","gitHead":"89fb197aed4771fdd69fe74674a2bcd510ff32f3","_id":"spike-player@1.3.2-0","_nodeVersion":"16.15.1","_npmVersion":"8.11.0","dist":{"integrity":"sha512-C5RoKmy5MYlfsTK/gYcxbcCyKvMWEg0TNv2N45tvfc5+z9bnZQ/TNR/YLDgy+pqyWleW/F5O0Pq+CWqFfYktzg==","shasum":"e26df61d7c709c57547aa2e94b34fae9ca744363","tarball":"https://registry.npmjs.org/spike-player/-/spike-player-1.3.2-0.tgz","fileCount":42,"unpackedSize":237094,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIG750UKQs159BXU64VNH3ToA4s3TD2cixqE7T28oeQ0uAiBMtbnWcuyBKQ3fHz8np2SE85boMzq5BMBjfRoCg6CJRQ=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi3CinACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrRvw/+OV103RId2gmBx0rTXD+dxW4wy6x6ijQuWoqUe+YamKn58f4d\r\naFcmzCeQivwxXdfobSGWP0ocvYKpivB0DAGeiOW+7Sr6gjguVkM5RysHmHa/\r\nOY5WuqiL6OkT/cYU8VnItss7UJhkHwTPxr+iGzeZ0U4pj97ruJ5lxH5NEjfK\r\n4ePjexuU/sn+Ghp7AMgbVSsonEAO7Bq+2inQcaxlQpe/XEMFI03eMjAVWGLV\r\nRAbSyKW+KosPh6RYo406U1tuXDHjEwkqLdb6cmlz/qRywQM2nPL/CPWycVaD\r\nwZROn9fz3ws711IiyJouQs+grR9ZRJw+SA63gBj/T16ar8QEHVeiDOpE/cQE\r\n/OJrQ+0IF+YzyGPGaoViCE+OmdsDwUE4SJrxS6dRPGEegVWh7tfROn8HHyAz\r\nOaI7afDE7pQtib35nEU4SjyQTmdDKEpTgpbcMLneUSz2jVpbZrfGb6Or+ija\r\ny7XgnhpGBDyuXImk/EA/fRUDu3MwRHxiso95hl2OkYyeiwcOHqWYE//Ndl8k\r\nfXUekhD2SyHIjxDUDQqoI/LqnhfYSrSZ4NGlgdTFUz8c9BNbGGKgINXqzAGD\r\nu7bUMs1KRdTu3/cvofW6QMzLzeGysEDRANUrByVp2a38h2dz4c3Pg1DFVCaT\r\nGCorQam44C7mMb2URhGFB9O7FjlEYXdU+Lg=\r\n=+o/Y\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"spikebot","email":"abatallah1214@gmail.com"},"maintainers":[{"name":"spikebot","email":"abatallah1214@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spike-player_1.3.2-0_1658595494785_0.05718255885648138"},"_hasShrinkwrap":false},"1.3.2-2":{"name":"spike-player","version":"1.3.2-2","description":"Complete framework to facilitate music commands using discord.js v13 & v14","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","test":"jest test/test.js","clean":"rimraf dist","pre":"npm version prerelease --force && npm publish --access public --tag dev","prep":"npm run clean && npm run build","pub":"conventional-changelog -p angular -i CHANGELOG.md -s && npm publish","docs:test":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml","docs":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml --output docs/docs.json"},"keywords":["music","player","bot","framework","discord","youtube","spotify","v13","v14"],"dependencies":{"@discordjs/opus":"^0.8.0","@discordjs/voice":"^0.11.0","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.29.0","@typescript-eslint/parser":"^5.29.0","axios":"^0.27.2","axios-retry":"^3.2.0","discord-ytdl-core":"^5.0.4","domhandler":"^5.0.3","eslint":"^8.18.0","ffmpeg-static":"^5.0.2","htmlparser2":"^8.0.1","isomorphic-unfetch":"^3.1.0","jest":"^28.1.1","libsodium-wrappers":"^0.7.9","rimraf":"^3.0.2","soundcloud-scraper":"github:AnupKumarPanwar/soundcloud-scraper","spotify-url-info":"^3.1.2","youtubei":"^0.0.1-rc.34","ytdl-core":"^4.11.0","ytsr":"^3.8.0"},"devDependencies":{"@babel/cli":"^7.14.8","@babel/core":"^7.15.0","@babel/preset-env":"^7.15.0","@babel/preset-typescript":"^7.15.0","@commitlint/cli":"^17.0.3","@rocketseat/commitlint-config":"^0.0.3","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.29.0","@typescript-eslint/parser":"^5.29.0","assert-diff":"^3.0.2","discord.js":"^14.0.2","discord.js-docgen":"github:discordjs/docgen#ts-patch","eslint":"^8.18.0","jest":"^28.1.1","jsdoc-babel":"^0.5.0","ts-node":"^10.2.0","typescript":"^4.3.5"},"directories":{"doc":"docs","test":"test"},"engines":{"node":">=16.9.0"},"workspaces":["packages/*"],"packageManager":"npm@8.11.0","readme":"# Discord Music Player\r\n![npm](https://img.shields.io/npm/dt/discord-music-player?style=for-the-badge)\r\n![npm](https://img.shields.io/npm/v/discord-music-player?style=for-the-badge)\r\n![CodeFactor Grade](https://img.shields.io/codefactor/grade/github/SushiBtw/discord-music-player?color=%2348aaf1&style=for-the-badge)\r\n\r\n### Note: This is the v8 version of Discord Music Player for Discord.JS v13!\r\n\r\nDiscord Music Player is a powerful [Node.js](https://nodejs.org) module that allows you to easily implement music commands.\r\n**Everything** is customizable, and everything can be done using this package - **there are no limitations!**\r\n\r\nThis package supports YouTube Videos & Playlists, Spotify Songs & Playlists, Apple Music Songs & Playlists.\r\nPackage from version v7.0.0 is fully maintained by [SushiBtw](https://github.com/SushiBtw).\r\n\r\n### Requirements:\r\n- [Discord.js v13](https://www.npmjs.com/package/discord.js),\r\n- [Node.JS v16](https://nodejs.org/),\r\n\r\n# Installation\r\n*Node.JS v16 or newer is required to run this module.*\r\n```sh\r\nnpm install --save discord-music-player\r\n```\r\nInstall **@discordjs/opus**:\r\n```sh\r\nnpm install --save @discordjs/opus\r\n```\r\n**Install [FFMPEG](https://www.ffmpeg.org/download.html)!**\r\n\r\n# Documentation\r\n**Discord Music Player documentation: [https://discord-music-player.js.org/](https://discord-music-player.js.org/)**\r\n\r\n### **Need some help?**\r\nFeel free to join [Discord-Music-Player Discord Server](https://discord.gg/6fejZNsmFC) and ask us about DMP.\r\n\r\n# Getting Started\r\n**The code bellow, will show you how to use DMP in your code.**\r\n\r\n*Please define your **Player** after the **client/bot** definition.*\r\n\r\n[!] Remember to include the related voice **Intents** at the client options. [!]\r\n```js\r\nconst Discord = require(\"discord.js\");\r\nconst client = new Discord.Client({\r\n    intents: [Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES, Intents.FLAGS.GUILD_VOICE_STATES]\r\n});\r\nconst settings = {\r\n    prefix: '!',\r\n    token: 'YourBotTokenHere'\r\n};\r\n\r\nconst { Player } = require(\"discord-music-player\");\r\nconst player = new Player(client, {\r\n    leaveOnEmpty: false, // This options are optional.\r\n});\r\n// You can define the Player as *client.player* to easily access it.\r\nclient.player = player;\r\n\r\nclient.on(\"ready\", () => {\r\n    console.log(\"I am ready to Play with DMP 🎶\");\r\n});\r\n\r\nclient.login(settings.token);\r\n```\r\n\r\n# Example Usage\r\n```js\r\nconst { RepeatMode } = require('discord-music-player');\r\n\r\nclient.on('messageCreate', async (message) => {\r\n    const args = message.content.slice(settings.prefix.length).trim().split(/ +/g);\r\n    const command = args.shift();\r\n    let guildQueue = client.player.getQueue(message.guild.id);\r\n\r\n    if(command === 'play') {\r\n        let queue = client.player.createQueue(message.guild.id);\r\n        await queue.join(message.member.voice.channel);\r\n        let song = await queue.play(args.join(' ')).catch(_ => {\r\n            if(!guildQueue)\r\n                queue.stop();\r\n        });\r\n    }\r\n\r\n    if(command === 'playlist') {\r\n        let queue = client.player.createQueue(message.guild.id);\r\n        await queue.join(message.member.voice.channel);\r\n        let song = await queue.playlist(args.join(' ')).catch(_ => {\r\n            if(!guildQueue)\r\n                queue.stop();\r\n        });\r\n    }\r\n\r\n    if(command === 'skip') {\r\n        guildQueue.skip();\r\n    }\r\n\r\n    if(command === 'stop') {\r\n        guildQueue.stop();\r\n    }\r\n\r\n    if(command === 'removeLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.DISABLED); // or 0 instead of RepeatMode.DISABLED\r\n    }\r\n\r\n    if(command === 'toggleLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.SONG); // or 1 instead of RepeatMode.SONG\r\n    }\r\n\r\n    if(command === 'toggleQueueLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.QUEUE); // or 2 instead of RepeatMode.QUEUE\r\n    }\r\n\r\n    if(command === 'setVolume') {\r\n        guildQueue.setVolume(parseInt(args[0]));\r\n    }\r\n\r\n    if(command === 'seek') {\r\n        guildQueue.seek(parseInt(args[0]) * 1000);\r\n    }\r\n\r\n    if(command === 'clearQueue') {\r\n        guildQueue.clearQueue();\r\n    }\r\n\r\n    if(command === 'shuffle') {\r\n        guildQueue.shuffle();\r\n    }\r\n\r\n    if(command === 'getQueue') {\r\n        console.log(guildQueue);\r\n    }\r\n\r\n    if(command === 'getVolume') {\r\n        console.log(guildQueue.volume)\r\n    }\r\n\r\n    if(command === 'nowPlaying') {\r\n        console.log(`Now playing: ${guildQueue.nowPlaying}`);\r\n    }\r\n\r\n    if(command === 'pause') {\r\n        guildQueue.setPaused(true);\r\n    }\r\n\r\n    if(command === 'resume') {\r\n        guildQueue.setPaused(false);\r\n    }\r\n\r\n    if(command === 'remove') {\r\n        guildQueue.remove(parseInt(args[0]));\r\n    }\r\n\r\n    if(command === 'createProgressBar') {\r\n        const ProgressBar = guildQueue.createProgressBar();\r\n        \r\n        // [======>              ][00:35/2:20]\r\n        console.log(ProgressBar.prettier);\r\n    }\r\n})\r\n```\r\n\r\n### Events:\r\n```js\r\n// Init the event listener only once (at the top of your code).\r\nclient.player\r\n    // Emitted when channel was empty.\r\n    .on('channelEmpty',  (queue) =>\r\n        console.log(`Everyone left the Voice Channel, queue ended.`))\r\n    // Emitted when a song was added to the queue.\r\n    .on('songAdd',  (queue, song) =>\r\n        console.log(`Song ${song} was added to the queue.`))\r\n    // Emitted when a playlist was added to the queue.\r\n    .on('playlistAdd',  (queue, playlist) =>\r\n        console.log(`Playlist ${playlist} with ${playlist.songs.length} was added to the queue.`))\r\n    // Emitted when there was no more music to play.\r\n    .on('queueDestroyed',  (queue) =>\r\n        console.log(`The queue was destroyed.`))\r\n    // Emitted when the queue was destroyed (either by ending or stopping).    \r\n    .on('queueEnd',  (queue) =>\r\n        console.log(`The queue has ended.`))\r\n    // Emitted when a song changed.\r\n    .on('songChanged', (queue, newSong, oldSong) =>\r\n        console.log(`${newSong} is now playing.`))\r\n    // Emitted when a first song in the queue started playing.\r\n    .on('songFirst',  (queue, song) =>\r\n        console.log(`Started playing ${song}.`))\r\n    // Emitted when someone disconnected the bot from the channel.\r\n    .on('clientDisconnect', (queue) =>\r\n        console.log(`I was kicked from the Voice Channel, queue ended.`))\r\n    // Emitted when deafenOnJoin is true and the bot was undeafened\r\n    .on('clientUndeafen', (queue) =>\r\n        console.log(`I got undefeanded.`))\r\n    // Emitted when there was an error in runtime\r\n    .on('error', (error, queue) => {\r\n        console.log(`Error: ${error} in ${queue.guild.name}`);\r\n    });\r\n```\r\n\r\n# Passing custom data\r\n\r\n### Queue\r\nWhile running the `Queue#createQueue()` method you can pass a `options#data` object to hold custom data.\r\nThis can be made in two ways:\r\n```js\r\n// Pass custom data\r\nawait player.createQueue(message.guild.id, {\r\n    data: {\r\n        queueInitMessage: message,\r\n        myObject: 'this will stay with the queue :)',\r\n        more: 'add more... there are no limitations...'\r\n    }\r\n});\r\n// Or by using\r\nqueue.setData({\r\n    whatever: 'you want :D'\r\n});\r\n\r\n// Access custom data\r\nlet queue = player.getQueue(message.guild.id);\r\nlet initMessage = queue.data.queueInitMessage;\r\nawait initMessage.channel.send(`This message object is hold in Queue :D`);\r\n```\r\n\r\n### Song or Playlist\r\nWhile running the `Queue#play()`/Queue#playlist() method you can pass a `options#data` object to hold custom data.\r\nThis can be made in two ways:\r\n```js\r\n// Play the song\r\nlet song = await queue.play('Born in the USA!');\r\n// Set song data\r\nsong.setData({\r\n    initMessage: message\r\n});\r\n\r\n// Play the playlist\r\nlet playlist = await queue.playlist('https://www.youtube.com/playlist?list=PLDLGxnP4y2mGKGEqwxWTRkd3HtrrVTMdU');\r\n// Set playlist data (will set data for each song in the playlist)\r\nsong.setData({\r\n    initMessage: message\r\n});\r\n\r\n// Access custom data\r\nlet queue = player.getQueue(message.guild.id);\r\nlet { initMessage } = queue.nowPlaying.data;\r\nawait initMessage.channel.send(`This message object is hold in Song :D`);\r\n```\r\n","readmeFilename":"README.md","gitHead":"0ed889e248158642370d45acff0b23fd0a930555","_id":"spike-player@1.3.2-2","_nodeVersion":"16.15.1","_npmVersion":"8.11.0","dist":{"integrity":"sha512-TAiEuHFexpWd9eHmZlwFeDWKhrMUA6TeSWE0AEwQb+1hgeEDtsNVWnPXdHxWtDxCMJ0TLxJlHx5Z6GqAtYrxzQ==","shasum":"9001b920d2fbf41f16c9ef88a195edf1d5effa97","tarball":"https://registry.npmjs.org/spike-player/-/spike-player-1.3.2-2.tgz","fileCount":40,"unpackedSize":236543,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIC9JaOQE7vbmR1oIXiwCik6z/9XA45QoGZi4TncSv49XAiA8rWF6aTbiJF6dYQSxVU9lILxe+/EJz7DtfN1iE8Ujlw=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi3CqpACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmpffw/+PNdKk8msfYO2yhWbIT5zgZe2eTGdXFJy/XtKwrxx2sd6CXI2\r\n6ahfPMpfHKp4s1O24M9/tAFd4Uwt3qKaK/NdALX+R4gSKJggYhv0SHI1yO2c\r\nAoXZiC6Hn2TG29y+fN7Vdior8Qq2FjwCW/0ZegWz5JCVWJdSKsocGh0ppx6U\r\ntRGHyNBVXhoagpKwewVmMO2OhTtMw71tdg7k4pXbZF2oQNugXDnoL0kDWBSg\r\nUb5++bhSLwa7lhYQLSVqhda0M1MWJfekzBQ2ib+IaJj5vsi7kH907I2kDJ65\r\n+o1PIuiW6bXJeeGYieIOz50Sdkb+S1oTwgOA7GW86E2qVRb3Wx5RREzMnDLl\r\nwhaVvJ0vwPyf6xVFWSNRDavavmuwXFixuVuD6HXp5+iuKN9dvDrKi21ajmlK\r\no0102H43mc4HeoiPiV2LTSQTqZiYxOQnfNd5ykjulie50iNZAJIgb8EQSZO3\r\nyLFIca+PkWCVcEdLmyd2ERCpdZnrKh8/rWx0Nb/KxvDWCyN+nY4MSVMd+0TK\r\n2meSiIYxAmX8wM8ajUGLIPxi5Ytg7ml//tW4BZ281DgWLbAjg/mncy6EzZLT\r\nat80N5UYd3K0wI+Xh6MBU0/vy17HuX5RR3vBqocNKx0I3NqshGVRXtpYJy4n\r\ndsZywegUaI6hMRjQ8dCeSpsXsTqrQSrJjqs=\r\n=bnxY\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"spikebot","email":"abatallah1214@gmail.com"},"maintainers":[{"name":"spikebot","email":"abatallah1214@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spike-player_1.3.2-2_1658596008728_0.8108590581177042"},"_hasShrinkwrap":false},"1.3.2-1":{"name":"spike-player","version":"1.3.2-1","description":"Complete framework to facilitate music commands using discord.js v13 & v14","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","test":"jest test/test.js","clean":"rimraf dist","pre":"npm version prerelease --force && npm publish --access public --tag dev","prep":"npm run clean && npm run build","pub":"conventional-changelog -p angular -i CHANGELOG.md -s && npm publish","docs:test":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml","docs":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml --output docs/docs.json","prepare":"husky install"},"keywords":["music","player","bot","framework","discord","youtube","spotify","v13","v14"],"dependencies":{"@discordjs/opus":"^0.8.0","@discordjs/voice":"^0.11.0","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.29.0","@typescript-eslint/parser":"^5.29.0","axios":"^0.27.2","axios-retry":"^3.2.0","discord-ytdl-core":"^5.0.4","domhandler":"^5.0.3","eslint":"^8.18.0","ffmpeg-static":"^5.0.2","htmlparser2":"^8.0.1","isomorphic-unfetch":"^3.1.0","jest":"^28.1.1","libsodium-wrappers":"^0.7.9","rimraf":"^3.0.2","soundcloud-scraper":"github:AnupKumarPanwar/soundcloud-scraper","spotify-url-info":"^3.1.2","youtubei":"^0.0.1-rc.34","ytdl-core":"^4.11.0","ytsr":"^3.8.0"},"devDependencies":{"@babel/cli":"^7.14.8","@babel/core":"^7.15.0","@babel/preset-env":"^7.15.0","@babel/preset-typescript":"^7.15.0","@commitlint/cli":"^17.0.3","@rocketseat/commitlint-config":"^0.0.3","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.29.0","@typescript-eslint/parser":"^5.29.0","assert-diff":"^3.0.2","discord.js":"^14.0.2","discord.js-docgen":"github:discordjs/docgen#ts-patch","eslint":"^8.18.0","husky":"^8.0.0","jest":"^28.1.1","jsdoc-babel":"^0.5.0","ts-node":"^10.2.0","typescript":"^4.3.5"},"directories":{"doc":"docs","test":"test"},"engines":{"node":">=16.9.0"},"workspaces":["packages/*"],"packageManager":"npm@8.11.0","readme":"# Discord Music Player\r\n![npm](https://img.shields.io/npm/dt/discord-music-player?style=for-the-badge)\r\n![npm](https://img.shields.io/npm/v/discord-music-player?style=for-the-badge)\r\n![CodeFactor Grade](https://img.shields.io/codefactor/grade/github/SushiBtw/discord-music-player?color=%2348aaf1&style=for-the-badge)\r\n\r\n### Note: This is the v8 version of Discord Music Player for Discord.JS v13!\r\n\r\nDiscord Music Player is a powerful [Node.js](https://nodejs.org) module that allows you to easily implement music commands.\r\n**Everything** is customizable, and everything can be done using this package - **there are no limitations!**\r\n\r\nThis package supports YouTube Videos & Playlists, Spotify Songs & Playlists, Apple Music Songs & Playlists.\r\nPackage from version v7.0.0 is fully maintained by [SushiBtw](https://github.com/SushiBtw).\r\n\r\n### Requirements:\r\n- [Discord.js v13](https://www.npmjs.com/package/discord.js),\r\n- [Node.JS v16](https://nodejs.org/),\r\n\r\n# Installation\r\n*Node.JS v16 or newer is required to run this module.*\r\n```sh\r\nnpm install --save discord-music-player\r\n```\r\nInstall **@discordjs/opus**:\r\n```sh\r\nnpm install --save @discordjs/opus\r\n```\r\n**Install [FFMPEG](https://www.ffmpeg.org/download.html)!**\r\n\r\n# Documentation\r\n**Discord Music Player documentation: [https://discord-music-player.js.org/](https://discord-music-player.js.org/)**\r\n\r\n### **Need some help?**\r\nFeel free to join [Discord-Music-Player Discord Server](https://discord.gg/6fejZNsmFC) and ask us about DMP.\r\n\r\n# Getting Started\r\n**The code bellow, will show you how to use DMP in your code.**\r\n\r\n*Please define your **Player** after the **client/bot** definition.*\r\n\r\n[!] Remember to include the related voice **Intents** at the client options. [!]\r\n```js\r\nconst Discord = require(\"discord.js\");\r\nconst client = new Discord.Client({\r\n    intents: [Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES, Intents.FLAGS.GUILD_VOICE_STATES]\r\n});\r\nconst settings = {\r\n    prefix: '!',\r\n    token: 'YourBotTokenHere'\r\n};\r\n\r\nconst { Player } = require(\"discord-music-player\");\r\nconst player = new Player(client, {\r\n    leaveOnEmpty: false, // This options are optional.\r\n});\r\n// You can define the Player as *client.player* to easily access it.\r\nclient.player = player;\r\n\r\nclient.on(\"ready\", () => {\r\n    console.log(\"I am ready to Play with DMP 🎶\");\r\n});\r\n\r\nclient.login(settings.token);\r\n```\r\n\r\n# Example Usage\r\n```js\r\nconst { RepeatMode } = require('discord-music-player');\r\n\r\nclient.on('messageCreate', async (message) => {\r\n    const args = message.content.slice(settings.prefix.length).trim().split(/ +/g);\r\n    const command = args.shift();\r\n    let guildQueue = client.player.getQueue(message.guild.id);\r\n\r\n    if(command === 'play') {\r\n        let queue = client.player.createQueue(message.guild.id);\r\n        await queue.join(message.member.voice.channel);\r\n        let song = await queue.play(args.join(' ')).catch(_ => {\r\n            if(!guildQueue)\r\n                queue.stop();\r\n        });\r\n    }\r\n\r\n    if(command === 'playlist') {\r\n        let queue = client.player.createQueue(message.guild.id);\r\n        await queue.join(message.member.voice.channel);\r\n        let song = await queue.playlist(args.join(' ')).catch(_ => {\r\n            if(!guildQueue)\r\n                queue.stop();\r\n        });\r\n    }\r\n\r\n    if(command === 'skip') {\r\n        guildQueue.skip();\r\n    }\r\n\r\n    if(command === 'stop') {\r\n        guildQueue.stop();\r\n    }\r\n\r\n    if(command === 'removeLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.DISABLED); // or 0 instead of RepeatMode.DISABLED\r\n    }\r\n\r\n    if(command === 'toggleLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.SONG); // or 1 instead of RepeatMode.SONG\r\n    }\r\n\r\n    if(command === 'toggleQueueLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.QUEUE); // or 2 instead of RepeatMode.QUEUE\r\n    }\r\n\r\n    if(command === 'setVolume') {\r\n        guildQueue.setVolume(parseInt(args[0]));\r\n    }\r\n\r\n    if(command === 'seek') {\r\n        guildQueue.seek(parseInt(args[0]) * 1000);\r\n    }\r\n\r\n    if(command === 'clearQueue') {\r\n        guildQueue.clearQueue();\r\n    }\r\n\r\n    if(command === 'shuffle') {\r\n        guildQueue.shuffle();\r\n    }\r\n\r\n    if(command === 'getQueue') {\r\n        console.log(guildQueue);\r\n    }\r\n\r\n    if(command === 'getVolume') {\r\n        console.log(guildQueue.volume)\r\n    }\r\n\r\n    if(command === 'nowPlaying') {\r\n        console.log(`Now playing: ${guildQueue.nowPlaying}`);\r\n    }\r\n\r\n    if(command === 'pause') {\r\n        guildQueue.setPaused(true);\r\n    }\r\n\r\n    if(command === 'resume') {\r\n        guildQueue.setPaused(false);\r\n    }\r\n\r\n    if(command === 'remove') {\r\n        guildQueue.remove(parseInt(args[0]));\r\n    }\r\n\r\n    if(command === 'createProgressBar') {\r\n        const ProgressBar = guildQueue.createProgressBar();\r\n        \r\n        // [======>              ][00:35/2:20]\r\n        console.log(ProgressBar.prettier);\r\n    }\r\n})\r\n```\r\n\r\n### Events:\r\n```js\r\n// Init the event listener only once (at the top of your code).\r\nclient.player\r\n    // Emitted when channel was empty.\r\n    .on('channelEmpty',  (queue) =>\r\n        console.log(`Everyone left the Voice Channel, queue ended.`))\r\n    // Emitted when a song was added to the queue.\r\n    .on('songAdd',  (queue, song) =>\r\n        console.log(`Song ${song} was added to the queue.`))\r\n    // Emitted when a playlist was added to the queue.\r\n    .on('playlistAdd',  (queue, playlist) =>\r\n        console.log(`Playlist ${playlist} with ${playlist.songs.length} was added to the queue.`))\r\n    // Emitted when there was no more music to play.\r\n    .on('queueDestroyed',  (queue) =>\r\n        console.log(`The queue was destroyed.`))\r\n    // Emitted when the queue was destroyed (either by ending or stopping).    \r\n    .on('queueEnd',  (queue) =>\r\n        console.log(`The queue has ended.`))\r\n    // Emitted when a song changed.\r\n    .on('songChanged', (queue, newSong, oldSong) =>\r\n        console.log(`${newSong} is now playing.`))\r\n    // Emitted when a first song in the queue started playing.\r\n    .on('songFirst',  (queue, song) =>\r\n        console.log(`Started playing ${song}.`))\r\n    // Emitted when someone disconnected the bot from the channel.\r\n    .on('clientDisconnect', (queue) =>\r\n        console.log(`I was kicked from the Voice Channel, queue ended.`))\r\n    // Emitted when deafenOnJoin is true and the bot was undeafened\r\n    .on('clientUndeafen', (queue) =>\r\n        console.log(`I got undefeanded.`))\r\n    // Emitted when there was an error in runtime\r\n    .on('error', (error, queue) => {\r\n        console.log(`Error: ${error} in ${queue.guild.name}`);\r\n    });\r\n```\r\n\r\n# Passing custom data\r\n\r\n### Queue\r\nWhile running the `Queue#createQueue()` method you can pass a `options#data` object to hold custom data.\r\nThis can be made in two ways:\r\n```js\r\n// Pass custom data\r\nawait player.createQueue(message.guild.id, {\r\n    data: {\r\n        queueInitMessage: message,\r\n        myObject: 'this will stay with the queue :)',\r\n        more: 'add more... there are no limitations...'\r\n    }\r\n});\r\n// Or by using\r\nqueue.setData({\r\n    whatever: 'you want :D'\r\n});\r\n\r\n// Access custom data\r\nlet queue = player.getQueue(message.guild.id);\r\nlet initMessage = queue.data.queueInitMessage;\r\nawait initMessage.channel.send(`This message object is hold in Queue :D`);\r\n```\r\n\r\n### Song or Playlist\r\nWhile running the `Queue#play()`/Queue#playlist() method you can pass a `options#data` object to hold custom data.\r\nThis can be made in two ways:\r\n```js\r\n// Play the song\r\nlet song = await queue.play('Born in the USA!');\r\n// Set song data\r\nsong.setData({\r\n    initMessage: message\r\n});\r\n\r\n// Play the playlist\r\nlet playlist = await queue.playlist('https://www.youtube.com/playlist?list=PLDLGxnP4y2mGKGEqwxWTRkd3HtrrVTMdU');\r\n// Set playlist data (will set data for each song in the playlist)\r\nsong.setData({\r\n    initMessage: message\r\n});\r\n\r\n// Access custom data\r\nlet queue = player.getQueue(message.guild.id);\r\nlet { initMessage } = queue.nowPlaying.data;\r\nawait initMessage.channel.send(`This message object is hold in Song :D`);\r\n```\r\n","readmeFilename":"README.md","gitHead":"d7f45116b7d83e1f55153661232200fd02bde903","_id":"spike-player@1.3.2-1","_nodeVersion":"16.15.1","_npmVersion":"8.11.0","dist":{"integrity":"sha512-rKATnUB2CPaM/+Mk0tjZiJM+K6GCsuNRX5DVU2jFF2jKNIYcw7HJBsdaDwWHzG3WpsvYYJxDGM/jweuKLwxSAg==","shasum":"0132e31b8d72c3c9806256251b1f614c2838105a","tarball":"https://registry.npmjs.org/spike-player/-/spike-player-1.3.2-1.tgz","fileCount":40,"unpackedSize":236610,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGXw0vaeQbu6BRZDN6SjitQzySbpSp6qaBv/2u8A7suVAiEAvRPLYdwlFX0iRYqaCu/FNJWXi3CvAJIahDDGVr0tvWs="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi3XTqACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmp6nw/+LV2uZoiFuagGKVQnGYrYvb8oKcpX4GnJUlh0mFq7xLzm4281\r\nMmiRkbPgkwBQqoCD3nFY+cNyLw+YR1C7v6mBspcbu1Gg1zitZfD21T/C2YAh\r\nuqzIkxRSGpvY/46nGdGKZ/BtqRTfpwjnOOORZXK3KgS9Uy1dUfFmCJrKQF3b\r\nlcfGWdiDwBciOjNLzweUb1mQaPdh53bexNFAoDF/xYtxUA9I1VpwqG/bfwpJ\r\n/JScS8TEeZzDDmL5LtIS7HSguJuv3+VJjECF6we5Zr1cGGnhelVIufpyOlNs\r\nU/iGNR2t7dGGkxfkTnr97jyLI2BVihwLaS/3HA45Uy0NbBkdG/BujFGSXbM/\r\nwIAR0sm9Rbb0njqQDrjZhQ7o5XujxeR2ngEYoeJVyJ8CCE50nNXfjsHFazEr\r\nfj+/LUVzcNZAOSGaZu9iQsEiw0Nn1iqXbfhZF7GTBebZO6eYY4V37dx+fXCc\r\nCUoUyQUDDw3qeeFR/E8UDcNCPsRAuypRdXqkIJpaQByhZTh+Yshj2VnNwi6r\r\n/Vt+nuEH0DWy4RXUWZRVIiMj5b2Z38ieoEfW5K8+DtLPC61L9MnOCXMdocdD\r\ntH7+jwRFUr2C/0rdxkEJlb2qRYdDEzO0ggt6y9isgm9FPCG1qEFNrVIXzD+E\r\ndUuuA8PdRz2fo35U9QUN4KFNufIH1LQfDoU=\r\n=ZB2k\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"spikebot","email":"abatallah1214@gmail.com"},"maintainers":[{"name":"spikebot","email":"abatallah1214@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spike-player_1.3.2-1_1658680553974_0.47864526455821843"},"_hasShrinkwrap":false},"1.3.4":{"name":"spike-player","version":"1.3.4","description":"Complete framework to facilitate music commands using discord.js v13 & v14","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","test":"jest test/test.js","clean":"rimraf dist","pre":"npm version prerelease --force && npm publish --access public --tag dev","prep":"npm run clean && npm run build","pub":"conventional-changelog -p angular -i CHANGELOG.md -s && npm publish","docs:test":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml","docs":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml --output docs/docs.json","prepare":"husky install"},"keywords":["music","player","bot","framework","discord","youtube","spotify","v13","v14"],"dependencies":{"@discordjs/opus":"^0.8.0","@discordjs/voice":"^0.11.0","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.29.0","@typescript-eslint/parser":"^5.29.0","axios":"^0.27.2","axios-retry":"^3.2.0","discord-ytdl-core":"^5.0.4","domhandler":"^5.0.3","eslint":"^8.18.0","ffmpeg-static":"^5.0.2","htmlparser2":"^8.0.1","isomorphic-unfetch":"^3.1.0","jest":"^28.1.1","libsodium-wrappers":"^0.7.9","rimraf":"^3.0.2","soundcloud-scraper":"github:AnupKumarPanwar/soundcloud-scraper","spotify-url-info":"^3.1.2","youtubei":"^0.0.1-rc.34","ytdl-core":"^4.11.0","ytsr":"^3.8.0"},"devDependencies":{"@babel/cli":"^7.14.8","@babel/core":"^7.15.0","@babel/preset-env":"^7.15.0","@babel/preset-typescript":"^7.15.0","@commitlint/cli":"^17.0.3","@rocketseat/commitlint-config":"^0.0.3","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.29.0","@typescript-eslint/parser":"^5.29.0","assert-diff":"^3.0.2","discord.js":"^14.0.2","discord.js-docgen":"github:discordjs/docgen#ts-patch","eslint":"^8.18.0","husky":"^8.0.0","jest":"^28.1.1","jsdoc-babel":"^0.5.0","ts-node":"^10.2.0","typescript":"^4.3.5"},"directories":{"doc":"docs","test":"test"},"engines":{"node":">=16.9.0"},"workspaces":["packages/*"],"packageManager":"npm@8.11.0","gitHead":"4ba6ddfbfc00d4d28640585faa9db5c53f32e8cf","_id":"spike-player@1.3.4","_nodeVersion":"16.15.1","_npmVersion":"8.11.0","dist":{"integrity":"sha512-04KflEgouURa3bCRwzMRwBGKO7lXuytx0GvmOz5H0mzOxowpVj1wfTu1XN9kro2PWu5GKheI2SKyXQt0nG9QEA==","shasum":"a48f191c00a23ddbf9040af32c94a0f6904560cc","tarball":"https://registry.npmjs.org/spike-player/-/spike-player-1.3.4.tgz","fileCount":40,"unpackedSize":236753,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDRxpXRQ6v6ByGnC7/glQvEwkxmi3+KiPB/gmacbCZUBwIhAI6Hrw6/SPissvA9O5BBsLO1hc5KhzfYM9BMIekgLB3v"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi3XcLACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoQcxAAnuDXqKyWt8T0hGpvqC5Ge1clGz+pshvGwm1kgqUDU2emadpz\r\nVHtKM79dkwoy4H6KjuFFWZJ9sqEO3eTDwq80trja9Vqzj65P2n0cTGspogo3\r\n7ZLEXqXeURUc1ElgEe9XCo7+5WEpJ8SD2PktS0bDxP7N+mC1VPocysYnZAgV\r\n8sB2P9zIAw+flsDB0+V7B5A30qXTRBS/WrJWn+5Anxl2n6DYRYCE1x2lpgdw\r\nnHFyd4I8Oplxh1cC93xfOXDDj2AGdjB9DMANYDQaW09CUoyYvnrKYnQac/Wm\r\nxKW567u8YYOedbqg2sjN6qUAkxRcAZ5UDFh6iGyjul6zSIBTFYb3Z3X9vDG7\r\n5zY89Bw9ZlUSWiNl6CtVnz3VUwDcDY4yP9hSmPn+mgqq5oJq9ECdvgWn/ems\r\nXYYJLLNz/jVnlTQvR8DfNe3kgVMpcEBIi5+9zIC88N5gXeTBGYJj/DLJq+4r\r\n5J1VQrHoA7ZIxQtqmVIojiANSPCQfz1iz4jilSzKd5+7nqOZrFr3IS18sT9O\r\nSg+elop7OsICASGJMIcQtC4FHCDDg2/kp7sF0B/LwgRjdEn4ZCp1s/kfRRMK\r\n9Se3ebZGInH29gFUba3TU0zBnr0Yjv+lcCe8bnJqHk9rJh32hhCvbtttv9l0\r\n0qBspRtT3uMTjgpHV1rlurLgvntSgGWEiEw=\r\n=V1bl\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"spikebot","email":"abatallah1214@gmail.com"},"maintainers":[{"name":"spikebot","email":"abatallah1214@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spike-player_1.3.4_1658681098928_0.34102091170468607"},"_hasShrinkwrap":false},"1.3.5":{"name":"spike-player","version":"1.3.5","description":"Complete framework to facilitate music commands using discord.js v13 & v14","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","test":"jest test/test.js","clean":"rimraf dist","pre":"npm version prerelease --force && npm publish --access public --tag dev","prep":"npm run clean && npm run build","pub":"conventional-changelog -p angular -i CHANGELOG.md -s && npm publish","docs:test":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml","docs":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml --output docs/docs.json","prepare":"husky install"},"keywords":["music","player","bot","framework","discord","youtube","spotify","v13","v14"],"dependencies":{"@discordjs/opus":"^0.8.0","@discordjs/voice":"^0.11.0","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.29.0","@typescript-eslint/parser":"^5.29.0","axios":"^0.27.2","axios-retry":"^3.2.0","discord-ytdl-core":"^5.0.4","domhandler":"^5.0.3","eslint":"^8.18.0","ffmpeg-static":"^5.0.2","htmlparser2":"^8.0.1","isomorphic-unfetch":"^3.1.0","jest":"^28.1.1","libsodium-wrappers":"^0.7.9","rimraf":"^3.0.2","soundcloud-scraper":"github:AnupKumarPanwar/soundcloud-scraper","spotify-url-info":"^3.1.2","youtubei":"^0.0.1-rc.34","ytdl-core":"^4.11.0","ytsr":"^3.8.0"},"devDependencies":{"@babel/cli":"^7.14.8","@babel/core":"^7.15.0","@babel/preset-env":"^7.15.0","@babel/preset-typescript":"^7.15.0","@commitlint/cli":"^17.0.3","@rocketseat/commitlint-config":"^0.0.3","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.29.0","@typescript-eslint/parser":"^5.29.0","assert-diff":"^3.0.2","discord.js":"^14.0.2","discord.js-docgen":"github:discordjs/docgen#ts-patch","eslint":"^8.18.0","husky":"^8.0.0","jest":"^28.1.1","jsdoc-babel":"^0.5.0","ts-node":"^10.2.0","typescript":"^4.3.5"},"directories":{"doc":"docs","test":"test"},"engines":{"node":">=16.9.0"},"workspaces":["packages/*"],"packageManager":"npm@8.11.0","gitHead":"8150d7b79cd412694ae08f4f4312ee683c903d76","_id":"spike-player@1.3.5","_nodeVersion":"16.15.1","_npmVersion":"8.11.0","dist":{"integrity":"sha512-ZVKPYS3jAjFqp/FttxSjdLNFDFJA8YKfCzJFN369il1YnA3Ms28vjJltGspBmrOn7TDDJNDcL/hTchEb0qWkGg==","shasum":"99c2b3be28cad75a38fd538a0fe457cecac43281","tarball":"https://registry.npmjs.org/spike-player/-/spike-player-1.3.5.tgz","fileCount":40,"unpackedSize":234825,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQClD0muBryZkZJe4njMadCJdPv9f2zhTzEcnHrf8J1gUQIhALHFXmAb4vs8mf4dc6KJVSkwjQl4YB7SHeSPBm8TRqza"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi5roQACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmoc4hAAnkbh1hbrH+JPKOubTEpmFi6A0VSQil/DpMkHCZZD99/p929G\r\nAWEb5F7ojweCCHNsGfNA384zOuBKLqYokalN97QK/1XeT7G5DObH7+c09Q0O\r\nfhxAk4sVWInAxFCaYhbudN9g/UfGC0LQkDdb2RhD1+cVZ7m8aUZmssRwt9rt\r\npXf8jphBcF1tEL1yN6sx4DhL9QNp1D0aY8KjtyIK9xeNEJVDYcg4q+0aMPZY\r\nhA3gnmTMiHkuUq30dZmHoZEVFkRgyhvaV/FxvBL5QZkTb83Paktv9WOIsPKd\r\n4jF3hHpUnw27FjQ44tcoIoVEN7VnXjqmkBe4QOQ5QjARE/6NBHoXolSc38X3\r\nrm+HJw7h5Bopn1NXhhTH3cYjF9CtnCYZxKSSNkTKEVb65GAV9td0t1mMYHh3\r\na5fWwtTY/mpDssvwx8sdSjtIOYMYznDk7yoUCrspZ3yX8QFfeXXfXElBBeM+\r\nx88hWdFW5oL3jr3JkAX6RPHBi05Z56Te5/wMiqbbcHUm2DhMZzTZhF9bFHBT\r\n3om2/jl1LavxTg1mKKznXTftXvJPPZZDKaYWLbQSAKaR8/gEV/VR2amD4mY2\r\nvWAFwWzbCOVT/gw9aKPsocU8eF+XSEclFglj8EPdb924aQLIUPsdlZOSh4bE\r\nljR9rxMQIJVp1UTMK78jCOyaIxtSP0LLBZ4=\r\n=8aZR\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"spikebot","email":"abatallah1214@gmail.com"},"maintainers":[{"name":"spikebot","email":"abatallah1214@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spike-player_1.3.5_1659288080214_0.41413710685829797"},"_hasShrinkwrap":false},"1.4.1-0":{"name":"spike-player","version":"1.4.1-0","description":"Complete framework to facilitate music commands using discord.js v13 & v14","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","test":"jest test/test.js","clean":"rimraf dist","pre":"npm version prerelease --force && npm publish --access public --tag dev","prep":"npm run clean && npm run build","pub":"conventional-changelog -p angular -i CHANGELOG.md -s && npm publish","docs:test":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml","docs":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml --output docs/docs.json","prepare":"husky install"},"keywords":["music","player","bot","framework","discord","youtube","spotify","v13","v14"],"dependencies":{"@discordjs/opus":"^0.8.0","@discordjs/voice":"^0.11.0","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.29.0","@typescript-eslint/parser":"^5.29.0","axios":"^0.27.2","axios-retry":"^3.2.0","discord-ytdl-core":"^5.0.4","domhandler":"^5.0.3","eslint":"^8.18.0","ffmpeg-static":"^5.0.2","htmlparser2":"^8.0.1","isomorphic-unfetch":"^3.1.0","jest":"^28.1.1","libsodium-wrappers":"^0.7.9","rimraf":"^3.0.2","soundcloud-scraper":"github:AnupKumarPanwar/soundcloud-scraper","spotify-url-info":"^3.1.2","youtubei":"^0.0.1-rc.34","ytdl-core":"^4.11.0","ytsr":"^3.8.0"},"devDependencies":{"@babel/cli":"^7.14.8","@babel/core":"^7.15.0","@babel/preset-env":"^7.15.0","@babel/preset-typescript":"^7.15.0","@commitlint/cli":"^17.0.3","@rocketseat/commitlint-config":"^0.0.3","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.29.0","@typescript-eslint/parser":"^5.29.0","assert-diff":"^3.0.2","discord.js":"^14.0.2","discord.js-docgen":"github:discordjs/docgen#ts-patch","eslint":"^8.18.0","husky":"^8.0.0","jest":"^28.1.1","jsdoc-babel":"^0.5.0","ts-node":"^10.2.0","typescript":"^4.3.5"},"directories":{"doc":"docs","test":"test"},"engines":{"node":">=16.9.0"},"workspaces":["packages/*"],"packageManager":"npm@8.11.0","readme":"# Discord Music Player\r\n![npm](https://img.shields.io/npm/dt/discord-music-player?style=for-the-badge)\r\n![npm](https://img.shields.io/npm/v/discord-music-player?style=for-the-badge)\r\n![CodeFactor Grade](https://img.shields.io/codefactor/grade/github/SushiBtw/discord-music-player?color=%2348aaf1&style=for-the-badge)\r\n\r\n### Note: This is the v8 version of Discord Music Player for Discord.JS v13!\r\n\r\nDiscord Music Player is a powerful [Node.js](https://nodejs.org) module that allows you to easily implement music commands.\r\n**Everything** is customizable, and everything can be done using this package - **there are no limitations!**\r\n\r\nThis package supports YouTube Videos & Playlists, Spotify Songs & Playlists, Apple Music Songs & Playlists.\r\nPackage from version v7.0.0 is fully maintained by [SushiBtw](https://github.com/SushiBtw).\r\n\r\n### Requirements:\r\n- [Discord.js v13](https://www.npmjs.com/package/discord.js),\r\n- [Node.JS v16](https://nodejs.org/),\r\n\r\n# Installation\r\n*Node.JS v16 or newer is required to run this module.*\r\n```sh\r\nnpm install --save discord-music-player\r\n```\r\nInstall **@discordjs/opus**:\r\n```sh\r\nnpm install --save @discordjs/opus\r\n```\r\n**Install [FFMPEG](https://www.ffmpeg.org/download.html)!**\r\n\r\n# Documentation\r\n**Discord Music Player documentation: [https://discord-music-player.js.org/](https://discord-music-player.js.org/)**\r\n\r\n### **Need some help?**\r\nFeel free to join [Discord-Music-Player Discord Server](https://discord.gg/6fejZNsmFC) and ask us about DMP.\r\n\r\n# Getting Started\r\n**The code bellow, will show you how to use DMP in your code.**\r\n\r\n*Please define your **Player** after the **client/bot** definition.*\r\n\r\n[!] Remember to include the related voice **Intents** at the client options. [!]\r\n```js\r\nconst Discord = require(\"discord.js\");\r\nconst client = new Discord.Client({\r\n    intents: [Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES, Intents.FLAGS.GUILD_VOICE_STATES]\r\n});\r\nconst settings = {\r\n    prefix: '!',\r\n    token: 'YourBotTokenHere'\r\n};\r\n\r\nconst { Player } = require(\"discord-music-player\");\r\nconst player = new Player(client, {\r\n    leaveOnEmpty: false, // This options are optional.\r\n});\r\n// You can define the Player as *client.player* to easily access it.\r\nclient.player = player;\r\n\r\nclient.on(\"ready\", () => {\r\n    console.log(\"I am ready to Play with DMP 🎶\");\r\n});\r\n\r\nclient.login(settings.token);\r\n```\r\n\r\n# Example Usage\r\n```js\r\nconst { RepeatMode } = require('discord-music-player');\r\n\r\nclient.on('messageCreate', async (message) => {\r\n    const args = message.content.slice(settings.prefix.length).trim().split(/ +/g);\r\n    const command = args.shift();\r\n    let guildQueue = client.player.getQueue(message.guild.id);\r\n\r\n    if(command === 'play') {\r\n        let queue = client.player.createQueue(message.guild.id);\r\n        await queue.join(message.member.voice.channel);\r\n        let song = await queue.play(args.join(' ')).catch(_ => {\r\n            if(!guildQueue)\r\n                queue.stop();\r\n        });\r\n    }\r\n\r\n    if(command === 'playlist') {\r\n        let queue = client.player.createQueue(message.guild.id);\r\n        await queue.join(message.member.voice.channel);\r\n        let song = await queue.playlist(args.join(' ')).catch(_ => {\r\n            if(!guildQueue)\r\n                queue.stop();\r\n        });\r\n    }\r\n\r\n    if(command === 'skip') {\r\n        guildQueue.skip();\r\n    }\r\n\r\n    if(command === 'stop') {\r\n        guildQueue.stop();\r\n    }\r\n\r\n    if(command === 'removeLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.DISABLED); // or 0 instead of RepeatMode.DISABLED\r\n    }\r\n\r\n    if(command === 'toggleLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.SONG); // or 1 instead of RepeatMode.SONG\r\n    }\r\n\r\n    if(command === 'toggleQueueLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.QUEUE); // or 2 instead of RepeatMode.QUEUE\r\n    }\r\n\r\n    if(command === 'setVolume') {\r\n        guildQueue.setVolume(parseInt(args[0]));\r\n    }\r\n\r\n    if(command === 'seek') {\r\n        guildQueue.seek(parseInt(args[0]) * 1000);\r\n    }\r\n\r\n    if(command === 'clearQueue') {\r\n        guildQueue.clearQueue();\r\n    }\r\n\r\n    if(command === 'shuffle') {\r\n        guildQueue.shuffle();\r\n    }\r\n\r\n    if(command === 'getQueue') {\r\n        console.log(guildQueue);\r\n    }\r\n\r\n    if(command === 'getVolume') {\r\n        console.log(guildQueue.volume)\r\n    }\r\n\r\n    if(command === 'nowPlaying') {\r\n        console.log(`Now playing: ${guildQueue.nowPlaying}`);\r\n    }\r\n\r\n    if(command === 'pause') {\r\n        guildQueue.setPaused(true);\r\n    }\r\n\r\n    if(command === 'resume') {\r\n        guildQueue.setPaused(false);\r\n    }\r\n\r\n    if(command === 'remove') {\r\n        guildQueue.remove(parseInt(args[0]));\r\n    }\r\n\r\n    if(command === 'createProgressBar') {\r\n        const ProgressBar = guildQueue.createProgressBar();\r\n        \r\n        // [======>              ][00:35/2:20]\r\n        console.log(ProgressBar.prettier);\r\n    }\r\n})\r\n```\r\n\r\n### Events:\r\n```js\r\n// Init the event listener only once (at the top of your code).\r\nclient.player\r\n    // Emitted when channel was empty.\r\n    .on('channelEmpty',  (queue) =>\r\n        console.log(`Everyone left the Voice Channel, queue ended.`))\r\n    // Emitted when a song was added to the queue.\r\n    .on('songAdd',  (queue, song) =>\r\n        console.log(`Song ${song} was added to the queue.`))\r\n    // Emitted when a playlist was added to the queue.\r\n    .on('playlistAdd',  (queue, playlist) =>\r\n        console.log(`Playlist ${playlist} with ${playlist.songs.length} was added to the queue.`))\r\n    // Emitted when there was no more music to play.\r\n    .on('queueDestroyed',  (queue) =>\r\n        console.log(`The queue was destroyed.`))\r\n    // Emitted when the queue was destroyed (either by ending or stopping).    \r\n    .on('queueEnd',  (queue) =>\r\n        console.log(`The queue has ended.`))\r\n    // Emitted when a song changed.\r\n    .on('songChanged', (queue, newSong, oldSong) =>\r\n        console.log(`${newSong} is now playing.`))\r\n    // Emitted when a first song in the queue started playing.\r\n    .on('songFirst',  (queue, song) =>\r\n        console.log(`Started playing ${song}.`))\r\n    // Emitted when someone disconnected the bot from the channel.\r\n    .on('clientDisconnect', (queue) =>\r\n        console.log(`I was kicked from the Voice Channel, queue ended.`))\r\n    // Emitted when deafenOnJoin is true and the bot was undeafened\r\n    .on('clientUndeafen', (queue) =>\r\n        console.log(`I got undefeanded.`))\r\n    // Emitted when there was an error in runtime\r\n    .on('error', (error, queue) => {\r\n        console.log(`Error: ${error} in ${queue.guild.name}`);\r\n    });\r\n```\r\n\r\n# Passing custom data\r\n\r\n### Queue\r\nWhile running the `Queue#createQueue()` method you can pass a `options#data` object to hold custom data.\r\nThis can be made in two ways:\r\n```js\r\n// Pass custom data\r\nawait player.createQueue(message.guild.id, {\r\n    data: {\r\n        queueInitMessage: message,\r\n        myObject: 'this will stay with the queue :)',\r\n        more: 'add more... there are no limitations...'\r\n    }\r\n});\r\n// Or by using\r\nqueue.setData({\r\n    whatever: 'you want :D'\r\n});\r\n\r\n// Access custom data\r\nlet queue = player.getQueue(message.guild.id);\r\nlet initMessage = queue.data.queueInitMessage;\r\nawait initMessage.channel.send(`This message object is hold in Queue :D`);\r\n```\r\n\r\n### Song or Playlist\r\nWhile running the `Queue#play()`/Queue#playlist() method you can pass a `options#data` object to hold custom data.\r\nThis can be made in two ways:\r\n```js\r\n// Play the song\r\nlet song = await queue.play('Born in the USA!');\r\n// Set song data\r\nsong.setData({\r\n    initMessage: message\r\n});\r\n\r\n// Play the playlist\r\nlet playlist = await queue.playlist('https://www.youtube.com/playlist?list=PLDLGxnP4y2mGKGEqwxWTRkd3HtrrVTMdU');\r\n// Set playlist data (will set data for each song in the playlist)\r\nsong.setData({\r\n    initMessage: message\r\n});\r\n\r\n// Access custom data\r\nlet queue = player.getQueue(message.guild.id);\r\nlet { initMessage } = queue.nowPlaying.data;\r\nawait initMessage.channel.send(`This message object is hold in Song :D`);\r\n```\r\n","readmeFilename":"README.md","gitHead":"e2abac588de1105272d93903db020886cb85e2d1","_id":"spike-player@1.4.1-0","_nodeVersion":"16.15.1","_npmVersion":"8.11.0","dist":{"integrity":"sha512-xQ6EkTmLvHGqCL7p5bYto3c2+jdlC+gJf8mIFYs2c2q/gBj62UmTNe+SJxx8F7/e5Uc2mLru72MP3fDhh/hm1A==","shasum":"3c9f3fac1be3d1741e35e4846cc5b21c8c3ed253","tarball":"https://registry.npmjs.org/spike-player/-/spike-player-1.4.1-0.tgz","fileCount":42,"unpackedSize":238132,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCRvZZaFS/1osujg4c+aprBOARbzD8qVqPFzbf1HDj06wIhAMB/C5N3W8PZDBYG8yifEO14hPy+y7Wi9YJSSEHVeT7o"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi66dKACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqXPQ/+K2r/9pQQd65aStkS6TWwTVMfsiPBxvheaHngrtgChJpf+5kj\r\nCTJR4Qw/aGJZ3qxLI4irWGsJ2FkFvwFC9nKb4dTSUvu2mD1v77DXExTE4XRU\r\nQb7BTu4/0Sf1lO6OEGoo01Z+d4HwoEndVkNSRDWIbl6zqkZbOwdaLMTM4Tek\r\nTsFOXmE95iZECGui5QhHo1eTykmeTfzCGvKwTDfwDn1Qz32neEDTuS448Q/8\r\nUaG/fybbROES79ZbJa54sHkie+kb6nVEJyMrY0hymKRufLix2RwZ2p5N5dQy\r\nPGTNJ87vfuLcGEcvYQ79u6HKGhn48RRcV4beiOzSvuKF0n0wHGDLcusQQIRt\r\nVn1zXH4/khEf+LK+H2v1lX8DcfEpnZge9DV3QtWZ11Nvxp3b3qjfGdg5MmsB\r\ngPVtJ2okQr2ASgQ0QcJWCHVlfhPQwPTna2+SifzDFrYy0FO7aXrcoPDqln8c\r\nj63G2mfu6BQpnFp4KMFSe7xd1Msc/6hogfYqeXqzU2PGh6sCdNpUg6NTvy5X\r\nUFIPtiQDx6dFvIxCTTv1NBjk7DZfSMQ2EtPw+K4M8rL1d0VaIxhHRJ3uqpnS\r\nInXXdeCwEViRNK9XnkVC2neqHKyvws8j+ajDkIQwh0FH+DKOr9xuBUWKdun0\r\nwOL0Y5KxdV6OdpEzAjdd+HhrvKkFAAWfDtQ=\r\n=XIN+\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"spikebot","email":"abatallah1214@gmail.com"},"maintainers":[{"name":"spikebot","email":"abatallah1214@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spike-player_1.4.1-0_1659610953922_0.6836382094934672"},"_hasShrinkwrap":false},"1.4.1-1":{"name":"spike-player","version":"1.4.1-1","description":"Complete framework to facilitate music commands using discord.js v13 & v14","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","test":"jest test/test.js","clean":"rimraf dist","pre":"npm version prerelease --force && npm publish --access public --tag dev","prep":"npm run clean && npm run build","pub":"conventional-changelog -p angular -i CHANGELOG.md -s && npm publish","docs:test":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml","docs":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml --output docs/docs.json","prepare":"husky install"},"keywords":["music","player","bot","framework","discord","youtube","spotify","v13","v14"],"dependencies":{"@discordjs/opus":"^0.8.0","@discordjs/voice":"^0.11.0","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.29.0","@typescript-eslint/parser":"^5.29.0","axios":"^0.27.2","axios-retry":"^3.2.0","discord-ytdl-core":"^5.0.4","domhandler":"^5.0.3","eslint":"^8.18.0","ffmpeg-static":"^5.0.2","htmlparser2":"^8.0.1","isomorphic-unfetch":"^3.1.0","jest":"^28.1.1","libsodium-wrappers":"^0.7.9","rimraf":"^3.0.2","soundcloud-scraper":"github:AnupKumarPanwar/soundcloud-scraper","spotify-url-info":"^3.1.2","youtubei":"^0.0.1-rc.34","ytdl-core":"^4.11.0","ytsr":"^3.8.0"},"devDependencies":{"@babel/cli":"^7.14.8","@babel/core":"^7.15.0","@babel/preset-env":"^7.15.0","@babel/preset-typescript":"^7.15.0","@commitlint/cli":"^17.0.3","@rocketseat/commitlint-config":"^0.0.3","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.29.0","@typescript-eslint/parser":"^5.29.0","assert-diff":"^3.0.2","discord.js":"^14.0.2","discord.js-docgen":"github:discordjs/docgen#ts-patch","eslint":"^8.18.0","husky":"^8.0.0","jest":"^28.1.1","jsdoc-babel":"^0.5.0","ts-node":"^10.2.0","typescript":"^4.3.5"},"directories":{"doc":"docs","test":"test"},"engines":{"node":">=16.9.0"},"workspaces":["packages/*"],"packageManager":"npm@8.11.0","readme":"# Discord Music Player\r\n![npm](https://img.shields.io/npm/dt/discord-music-player?style=for-the-badge)\r\n![npm](https://img.shields.io/npm/v/discord-music-player?style=for-the-badge)\r\n![CodeFactor Grade](https://img.shields.io/codefactor/grade/github/SushiBtw/discord-music-player?color=%2348aaf1&style=for-the-badge)\r\n\r\n### Note: This is the v8 version of Discord Music Player for Discord.JS v13!\r\n\r\nDiscord Music Player is a powerful [Node.js](https://nodejs.org) module that allows you to easily implement music commands.\r\n**Everything** is customizable, and everything can be done using this package - **there are no limitations!**\r\n\r\nThis package supports YouTube Videos & Playlists, Spotify Songs & Playlists, Apple Music Songs & Playlists.\r\nPackage from version v7.0.0 is fully maintained by [SushiBtw](https://github.com/SushiBtw).\r\n\r\n### Requirements:\r\n- [Discord.js v13](https://www.npmjs.com/package/discord.js),\r\n- [Node.JS v16](https://nodejs.org/),\r\n\r\n# Installation\r\n*Node.JS v16 or newer is required to run this module.*\r\n```sh\r\nnpm install --save discord-music-player\r\n```\r\nInstall **@discordjs/opus**:\r\n```sh\r\nnpm install --save @discordjs/opus\r\n```\r\n**Install [FFMPEG](https://www.ffmpeg.org/download.html)!**\r\n\r\n# Documentation\r\n**Discord Music Player documentation: [https://discord-music-player.js.org/](https://discord-music-player.js.org/)**\r\n\r\n### **Need some help?**\r\nFeel free to join [Discord-Music-Player Discord Server](https://discord.gg/6fejZNsmFC) and ask us about DMP.\r\n\r\n# Getting Started\r\n**The code bellow, will show you how to use DMP in your code.**\r\n\r\n*Please define your **Player** after the **client/bot** definition.*\r\n\r\n[!] Remember to include the related voice **Intents** at the client options. [!]\r\n```js\r\nconst Discord = require(\"discord.js\");\r\nconst client = new Discord.Client({\r\n    intents: [Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES, Intents.FLAGS.GUILD_VOICE_STATES]\r\n});\r\nconst settings = {\r\n    prefix: '!',\r\n    token: 'YourBotTokenHere'\r\n};\r\n\r\nconst { Player } = require(\"discord-music-player\");\r\nconst player = new Player(client, {\r\n    leaveOnEmpty: false, // This options are optional.\r\n});\r\n// You can define the Player as *client.player* to easily access it.\r\nclient.player = player;\r\n\r\nclient.on(\"ready\", () => {\r\n    console.log(\"I am ready to Play with DMP 🎶\");\r\n});\r\n\r\nclient.login(settings.token);\r\n```\r\n\r\n# Example Usage\r\n```js\r\nconst { RepeatMode } = require('discord-music-player');\r\n\r\nclient.on('messageCreate', async (message) => {\r\n    const args = message.content.slice(settings.prefix.length).trim().split(/ +/g);\r\n    const command = args.shift();\r\n    let guildQueue = client.player.getQueue(message.guild.id);\r\n\r\n    if(command === 'play') {\r\n        let queue = client.player.createQueue(message.guild.id);\r\n        await queue.join(message.member.voice.channel);\r\n        let song = await queue.play(args.join(' ')).catch(_ => {\r\n            if(!guildQueue)\r\n                queue.stop();\r\n        });\r\n    }\r\n\r\n    if(command === 'playlist') {\r\n        let queue = client.player.createQueue(message.guild.id);\r\n        await queue.join(message.member.voice.channel);\r\n        let song = await queue.playlist(args.join(' ')).catch(_ => {\r\n            if(!guildQueue)\r\n                queue.stop();\r\n        });\r\n    }\r\n\r\n    if(command === 'skip') {\r\n        guildQueue.skip();\r\n    }\r\n\r\n    if(command === 'stop') {\r\n        guildQueue.stop();\r\n    }\r\n\r\n    if(command === 'removeLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.DISABLED); // or 0 instead of RepeatMode.DISABLED\r\n    }\r\n\r\n    if(command === 'toggleLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.SONG); // or 1 instead of RepeatMode.SONG\r\n    }\r\n\r\n    if(command === 'toggleQueueLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.QUEUE); // or 2 instead of RepeatMode.QUEUE\r\n    }\r\n\r\n    if(command === 'setVolume') {\r\n        guildQueue.setVolume(parseInt(args[0]));\r\n    }\r\n\r\n    if(command === 'seek') {\r\n        guildQueue.seek(parseInt(args[0]) * 1000);\r\n    }\r\n\r\n    if(command === 'clearQueue') {\r\n        guildQueue.clearQueue();\r\n    }\r\n\r\n    if(command === 'shuffle') {\r\n        guildQueue.shuffle();\r\n    }\r\n\r\n    if(command === 'getQueue') {\r\n        console.log(guildQueue);\r\n    }\r\n\r\n    if(command === 'getVolume') {\r\n        console.log(guildQueue.volume)\r\n    }\r\n\r\n    if(command === 'nowPlaying') {\r\n        console.log(`Now playing: ${guildQueue.nowPlaying}`);\r\n    }\r\n\r\n    if(command === 'pause') {\r\n        guildQueue.setPaused(true);\r\n    }\r\n\r\n    if(command === 'resume') {\r\n        guildQueue.setPaused(false);\r\n    }\r\n\r\n    if(command === 'remove') {\r\n        guildQueue.remove(parseInt(args[0]));\r\n    }\r\n\r\n    if(command === 'createProgressBar') {\r\n        const ProgressBar = guildQueue.createProgressBar();\r\n        \r\n        // [======>              ][00:35/2:20]\r\n        console.log(ProgressBar.prettier);\r\n    }\r\n})\r\n```\r\n\r\n### Events:\r\n```js\r\n// Init the event listener only once (at the top of your code).\r\nclient.player\r\n    // Emitted when channel was empty.\r\n    .on('channelEmpty',  (queue) =>\r\n        console.log(`Everyone left the Voice Channel, queue ended.`))\r\n    // Emitted when a song was added to the queue.\r\n    .on('songAdd',  (queue, song) =>\r\n        console.log(`Song ${song} was added to the queue.`))\r\n    // Emitted when a playlist was added to the queue.\r\n    .on('playlistAdd',  (queue, playlist) =>\r\n        console.log(`Playlist ${playlist} with ${playlist.songs.length} was added to the queue.`))\r\n    // Emitted when there was no more music to play.\r\n    .on('queueDestroyed',  (queue) =>\r\n        console.log(`The queue was destroyed.`))\r\n    // Emitted when the queue was destroyed (either by ending or stopping).    \r\n    .on('queueEnd',  (queue) =>\r\n        console.log(`The queue has ended.`))\r\n    // Emitted when a song changed.\r\n    .on('songChanged', (queue, newSong, oldSong) =>\r\n        console.log(`${newSong} is now playing.`))\r\n    // Emitted when a first song in the queue started playing.\r\n    .on('songFirst',  (queue, song) =>\r\n        console.log(`Started playing ${song}.`))\r\n    // Emitted when someone disconnected the bot from the channel.\r\n    .on('clientDisconnect', (queue) =>\r\n        console.log(`I was kicked from the Voice Channel, queue ended.`))\r\n    // Emitted when deafenOnJoin is true and the bot was undeafened\r\n    .on('clientUndeafen', (queue) =>\r\n        console.log(`I got undefeanded.`))\r\n    // Emitted when there was an error in runtime\r\n    .on('error', (error, queue) => {\r\n        console.log(`Error: ${error} in ${queue.guild.name}`);\r\n    });\r\n```\r\n\r\n# Passing custom data\r\n\r\n### Queue\r\nWhile running the `Queue#createQueue()` method you can pass a `options#data` object to hold custom data.\r\nThis can be made in two ways:\r\n```js\r\n// Pass custom data\r\nawait player.createQueue(message.guild.id, {\r\n    data: {\r\n        queueInitMessage: message,\r\n        myObject: 'this will stay with the queue :)',\r\n        more: 'add more... there are no limitations...'\r\n    }\r\n});\r\n// Or by using\r\nqueue.setData({\r\n    whatever: 'you want :D'\r\n});\r\n\r\n// Access custom data\r\nlet queue = player.getQueue(message.guild.id);\r\nlet initMessage = queue.data.queueInitMessage;\r\nawait initMessage.channel.send(`This message object is hold in Queue :D`);\r\n```\r\n\r\n### Song or Playlist\r\nWhile running the `Queue#play()`/Queue#playlist() method you can pass a `options#data` object to hold custom data.\r\nThis can be made in two ways:\r\n```js\r\n// Play the song\r\nlet song = await queue.play('Born in the USA!');\r\n// Set song data\r\nsong.setData({\r\n    initMessage: message\r\n});\r\n\r\n// Play the playlist\r\nlet playlist = await queue.playlist('https://www.youtube.com/playlist?list=PLDLGxnP4y2mGKGEqwxWTRkd3HtrrVTMdU');\r\n// Set playlist data (will set data for each song in the playlist)\r\nsong.setData({\r\n    initMessage: message\r\n});\r\n\r\n// Access custom data\r\nlet queue = player.getQueue(message.guild.id);\r\nlet { initMessage } = queue.nowPlaying.data;\r\nawait initMessage.channel.send(`This message object is hold in Song :D`);\r\n```\r\n","readmeFilename":"README.md","gitHead":"9cba291e0b4fd74aefd40634592c5ee88d91b225","_id":"spike-player@1.4.1-1","_nodeVersion":"16.15.1","_npmVersion":"8.11.0","dist":{"integrity":"sha512-xQ+2JxfsTomR99p/i77pXetW5/2W0M9qZAU0Mxt3k0ZJVoTu1pqws/gUeczHspFBAx3BP0LGv/gZXFtwdduj1g==","shasum":"21e73619fd8610bc2af40970aa8ed8ce18ab9254","tarball":"https://registry.npmjs.org/spike-player/-/spike-player-1.4.1-1.tgz","fileCount":42,"unpackedSize":238132,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCYy+lr9cG8+EPdzxGYBdtea+FLMcnfXQMHVKgp6uy7RwIgDnMRaa45tb7c0Mden5YpYew+MGplK3j5NEAilQUZVao="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi66dbACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqzOw/+ME6YHXznQ4rSBqXuBwrnHwFkuXUgr6HhcWKKpQdr1Ra2n/oo\r\nbAQ5WG3dLM5ThE/Ippjx+c1AX6rEezOP1dlPu8U1Wxb1+okZlYngy7u2R9UI\r\nI3wAnJpLipFSDD+nHBrDIlWfB1vOONBM52+i+YrgCFwt8TM/IH8VdpB2hRha\r\nGOs5eQIY9dvoBy8Tut+SUlW53sKeGbHSZgoD9Jiyc/ICxBUQO/G7PqCnfJ/x\r\nFWFrfHiuLc8cfqgIF2r3aKVnSFcDlGoUGyhZDfJoQ+w10B7jnUPaeOBbPEBE\r\nf9KSrgK36j6xVeiiXlfOhzscJVHa2ZBKGt4BMv/HYrZA3y08plEjnznbxN15\r\nZFZ2fCuqeojghX/HN5WGFythGbAL7mmpl8bZEMC6RyDptQKSiGHmA15LQrSO\r\nnAnT1GhclJ27fowV1lfVg6p/Kvpm8uYXefF9Pc46lpOvReU/z8PbAHHQDQ7a\r\nFdAwEodeAwFFq6OK4y0CoFy4+CbwG4V4Pyg4SDu4clTnKYjw7QccJd2Gp7iX\r\nb4VUm51cIhQkn8CVPeu4G9VsEGlFveooY9EAnI5tk2jszdSIPGswteHby/OM\r\ny+KMYm4dRIa4zkpU+qxKlWcOMp2qxUCF9jmWRuPvFA17OwJyS0UTyzfyX9n4\r\na8R1sumlNZ4nu30fh4pfmxhkrfEI1lW7AKo=\r\n=33xd\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"spikebot","email":"abatallah1214@gmail.com"},"maintainers":[{"name":"spikebot","email":"abatallah1214@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spike-player_1.4.1-1_1659610971163_0.10646351170713642"},"_hasShrinkwrap":false},"1.4.0-0":{"name":"spike-player","version":"1.4.0-0","description":"Complete framework to facilitate music commands using discord.js v13 & v14","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","test":"jest test/test.js","clean":"rimraf dist","pre":"npm version prerelease --force && npm publish --access public --tag dev","prep":"npm run clean && npm run build","pub":"conventional-changelog -p angular -i CHANGELOG.md -s && npm publish","docs:test":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml","docs":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml --output docs/docs.json","prepare":"husky install"},"keywords":["music","player","bot","framework","discord","youtube","spotify","v13","v14"],"dependencies":{"@discordjs/opus":"^0.8.0","@discordjs/voice":"^0.11.0","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.29.0","@typescript-eslint/parser":"^5.29.0","axios":"^0.27.2","axios-retry":"^3.2.0","discord-ytdl-core":"^5.0.4","domhandler":"^5.0.3","eslint":"^8.18.0","ffmpeg-static":"^5.0.2","htmlparser2":"^8.0.1","isomorphic-unfetch":"^3.1.0","jest":"^28.1.1","libsodium-wrappers":"^0.7.9","rimraf":"^3.0.2","soundcloud-scraper":"github:AnupKumarPanwar/soundcloud-scraper","spotify-url-info":"^3.1.2","youtubei":"^0.0.1-rc.34","ytdl-core":"^4.11.0","ytsr":"^3.8.0"},"devDependencies":{"@babel/cli":"^7.14.8","@babel/core":"^7.15.0","@babel/preset-env":"^7.15.0","@babel/preset-typescript":"^7.15.0","@commitlint/cli":"^17.0.3","@rocketseat/commitlint-config":"^0.0.3","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.29.0","@typescript-eslint/parser":"^5.29.0","assert-diff":"^3.0.2","discord.js":"^14.0.2","discord.js-docgen":"github:discordjs/docgen#ts-patch","eslint":"^8.18.0","husky":"^8.0.0","jest":"^28.1.1","jsdoc-babel":"^0.5.0","ts-node":"^10.2.0","typescript":"^4.3.5"},"directories":{"doc":"docs","test":"test"},"engines":{"node":">=16.9.0"},"workspaces":["packages/*"],"packageManager":"npm@8.11.0","gitHead":"ff4a345b9ffee66fe6c68b73eccf078ba753e19b","_id":"spike-player@1.4.0-0","_nodeVersion":"16.16.0","_npmVersion":"8.11.0","dist":{"integrity":"sha512-4y78fpmxBl1+qlCSNPc/4QnrDSpe6G1zM7B123UfrXO7VNUNR+juA9JWW2phBPUUwSjFtqPdfQksA2tXhRGeXA==","shasum":"ccadc6297368c9b6f892247822d041c4b54fa7f0","tarball":"https://registry.npmjs.org/spike-player/-/spike-player-1.4.0-0.tgz","fileCount":30,"unpackedSize":102799,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBsYRR2LAWLYUo7BYybSMx66mdSNHeO2kIcDcO6OwxINAiBO1KMO66BDKJ/oAPK/ELhhOaBrQvyUWe4ABYn/CHiakQ=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi666GACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqH5Q//TR2d6icmjrtv4lbarAF5PI4rP/EkgI5HUnEjdGtChqWfr3ky\r\n6cnVIef52YbGIyWG+Qfp2azUaFDk0uLs28mmQux4ObjIHtxgpxcFqBxtyVlm\r\n0fwva4mnpwl6dMfdBCNVlX6hNOR9Y5r4ezWZkltBPERihjhlKJ0FfJK6oyCi\r\niFLwdScu8kUfOWkVSUSxZKWPyQ0SNoYTNnJJQTXPS+4gj2PPU+iKqRRLIWwY\r\nlAMgmTkd2rAxp0wvvYVSKtH9TVlgiDINTech4p7qhCGfpMGrhuBVjeFPoFTf\r\npCuMQdAQnUucycx9FssNStSpT3MsFZRKZG1EphuQyFTcUwNAJk6au9/dSsTk\r\nqSaiODQ5wZN9ke/j9Nv38JD/c6PmiBiIBj0jV9AluWguR9USk0HmySKjQ9hT\r\nLhlX3Lcg1CTsdklUZsp0/A3butH/2fl9x8JU79m3P3pVPT8GuKS2F2zKbPrL\r\nG66c/iIP3ar/lb5ydwmjViGbmJQiDKeE35c5ySG+d8cadQuVUJKl+/G1BF5+\r\nTai4Ref+eP5vCjpGtffAAG70efyRO79WGAWHnftO+K1CLsAVeqidHetIGwXB\r\nlsbRifMN/yyrznsImH3x1uGXE0mDsatpfbW+eX+JPFRt9I7z+6Yh64GxYwia\r\nqjJ0CuiL4ZD8pAvuukzYAuNgZ88Uk/vVsRU=\r\n=9aLK\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"spikebot","email":"abatallah1214@gmail.com"},"maintainers":[{"name":"spikebot","email":"abatallah1214@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spike-player_1.4.0-0_1659612805861_0.3526146698685253"},"_hasShrinkwrap":false},"1.4.0":{"name":"spike-player","version":"1.4.0","description":"Complete framework to facilitate music commands using discord.js v13 & v14","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","test":"jest test/test.js","clean":"rimraf dist","pre":"npm version prerelease --force && npm publish --access public --tag dev","prep":"npm run clean && npm run build","pub":"conventional-changelog -p angular -i CHANGELOG.md -s && npm publish","docs:test":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml","docs":"docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/custom.yml --output docs/docs.json","prepare":"husky install"},"keywords":["music","player","bot","framework","discord","youtube","spotify","v13","v14"],"dependencies":{"@discordjs/opus":"^0.8.0","@discordjs/voice":"^0.11.0","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.29.0","@typescript-eslint/parser":"^5.29.0","axios":"^0.27.2","axios-retry":"^3.2.0","discord-ytdl-core":"^5.0.4","domhandler":"^5.0.3","eslint":"^8.18.0","ffmpeg-static":"^5.0.2","htmlparser2":"^8.0.1","isomorphic-unfetch":"^3.1.0","jest":"^28.1.1","libsodium-wrappers":"^0.7.9","rimraf":"^3.0.2","soundcloud-scraper":"github:AnupKumarPanwar/soundcloud-scraper","spotify-url-info":"^3.1.2","youtubei":"^0.0.1-rc.34","ytdl-core":"^4.11.0","ytsr":"^3.8.0"},"devDependencies":{"@babel/cli":"^7.14.8","@babel/core":"^7.15.0","@babel/preset-env":"^7.15.0","@babel/preset-typescript":"^7.15.0","@commitlint/cli":"^17.0.3","@rocketseat/commitlint-config":"^0.0.3","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.29.0","@typescript-eslint/parser":"^5.29.0","assert-diff":"^3.0.2","discord.js":"^14.0.2","discord.js-docgen":"github:discordjs/docgen#ts-patch","eslint":"^8.18.0","husky":"^8.0.0","jest":"^28.1.1","jsdoc-babel":"^0.5.0","ts-node":"^10.2.0","typescript":"^4.3.5"},"directories":{"doc":"docs","test":"test"},"engines":{"node":">=16.9.0"},"workspaces":["packages/*"],"packageManager":"npm@8.11.0","gitHead":"ff4a345b9ffee66fe6c68b73eccf078ba753e19b","_id":"spike-player@1.4.0","_nodeVersion":"16.15.1","_npmVersion":"8.11.0","dist":{"integrity":"sha512-VZ9vXNPNDDDtWGTfwKsI0z7p4cL3HS/TYA9nVz7XpcoHQNu+fEsqgJ/autfVO2aVfDpM1ZT92+rxgja6BAcb2w==","shasum":"fd2cf915848128f2ee0a799e4ffe980e1c9adf1a","tarball":"https://registry.npmjs.org/spike-player/-/spike-player-1.4.0.tgz","fileCount":42,"unpackedSize":238227,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAvmjaep2ODks9YRQQeUb72LCNLJ4Uat8GX6n54N9aYgAiACIIfdtXquEu0GK/KOUWOKVDHFwMnLIJuOb4LSsvJVyg=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi668RACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoZ3w/7B5DQJv4+coWR23V9CcEO+WT2ZtHyHaPiVYltx98bj0YPDibu\r\nu/cpivKnemAnsRENQ0A9Vt6mZEha1BJz8L32kMprHjc7n0MHtqLdgkfwPRa4\r\nBA67fMC8tyEAz78Z/ttlm3vW8sOj8bNyjEXIvXI9ZivGPVv34up7J258QmZm\r\nu3l8JYOJNBEfAsJ79cSTUHCqhC6x/P2pFPZIJrjcKrU+cd0X1LU4ZmfYvDGA\r\n8w8FiW2fPdgUsxrzeTk2DX1//fuwS+SZGG2/TNYkBEXyoSAsw541bZR2i4Wx\r\nfiI9YNuHDDk2NZpDyxil+4xn14onQsJVKEaCG9mnENu25uyuxYcBFu3XlLAl\r\nrc0ui3Mni464Fdk4UHqUUn3J8uXasdtgjGv6ytQP+ob6JDOvoVL7/kVjy8oa\r\nAjFQ04OeXTGOskSfpn9B/fpYxtGOVI+4/DgLJcsXd8u3XR52z6jlDnCFmwB6\r\nJY2CmGHtKwWcXPTHtYK2tfVls/ug7OcCnuDyqbeXNhwEuc2/E3hlXVmh6kaX\r\nvoREXga8sRq/5+rlskweXuAUE3z7a+kNhXr8jB0Uzr48dSC0alOSit12q+3N\r\nohP+WYjdxHZcCwySoJq/rTF4gEhYiOAv4j1gd8uK5s7R7lF8CS1BfBQbKIuO\r\n3BPjO5FHIGSj2Mp5yOmlWUppGjIkhBKMxes=\r\n=RrZu\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"spikebot","email":"abatallah1214@gmail.com"},"maintainers":[{"name":"spikebot","email":"abatallah1214@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spike-player_1.4.0_1659612944995_0.5249584716241964"},"_hasShrinkwrap":false},"1.4.1":{"name":"spike-player","version":"1.4.1","description":"Complete framework to facilitate music commands using discord.js v13 & v14","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","test":"jest test/test.js","clean":"rimraf dist","pre":"npm version prerelease --force && npm publish --access public --tag dev","prep":"npm run clean && npm run build","pub":"conventional-changelog -p angular -i CHANGELOG.md -s && npm publish"},"keywords":["music","player","bot","framework","discord","youtube","spotify","v13","v14"],"dependencies":{"@discordjs/opus":"^0.8.0","@discordjs/voice":"^0.11.0","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.29.0","@typescript-eslint/parser":"^5.29.0","axios":"^0.27.2","axios-retry":"^3.2.0","discord-ytdl-core":"^5.0.4","domhandler":"^5.0.3","eslint":"^8.18.0","ffmpeg-static":"^5.0.2","htmlparser2":"^8.0.1","isomorphic-unfetch":"^3.1.0","jest":"^28.1.1","libsodium-wrappers":"^0.7.9","rimraf":"^3.0.2","soundcloud-scraper":"github:AnupKumarPanwar/soundcloud-scraper","spotify-url-info":"^3.1.2","youtubei":"^0.0.1-rc.34","ytdl-core":"^4.9.1","ytsr":"^3.8.0"},"devDependencies":{"@babel/cli":"^7.14.8","@babel/core":"^7.15.0","@babel/preset-env":"^7.15.0","@babel/preset-typescript":"^7.15.0","@commitlint/cli":"^17.0.3","@rocketseat/commitlint-config":"^0.0.3","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.29.0","@typescript-eslint/parser":"^5.29.0","assert-diff":"^3.0.2","discord.js":"^14.0.2","discord.js-docgen":"github:discordjs/docgen#ts-patch","eslint":"^8.18.0","husky":"^8.0.0","jest":"^28.1.1","jsdoc-babel":"^0.5.0","ts-node":"^10.2.0","typescript":"^4.3.5"},"directories":{"doc":"docs","test":"test"},"engines":{"node":">=16.9.0"},"workspaces":["packages/*"],"packageManager":"npm@8.11.0","gitHead":"72e5deef45bfbbd52980f37b82c77d2c9182b3d5","_id":"spike-player@1.4.1","_nodeVersion":"16.15.1","_npmVersion":"8.11.0","dist":{"integrity":"sha512-vZAS7vZu5qliy8t4HheDZwnixJwYemhuiO45GUl2tuxStv2hW6KyfOYCwTfK0cbgiVn7bTU9YBsXRYWDuq98EQ==","shasum":"2b45874790f37b073429101f396c4dff4f3ae21d","tarball":"https://registry.npmjs.org/spike-player/-/spike-player-1.4.1.tgz","fileCount":42,"unpackedSize":238087,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDlJtmCqoJa7IITGNsVqImgKKe20jivPJIgkulbiCg8vAiBIvRAv09UuVxPHOKP3F+uyj32YSXRBGZM0ldKYrxW2nQ=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi9gKcACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo7Mw/+OfZjOSPmeIeFyACZNd25kYt9yITJfifWuqgE+o3pF8UF7jiT\r\nwnOV5oGYoU603J9SwRHwGC7L1Tn55UL7nIKlnnzeCn74KKtsJAxNor7BXuTZ\r\nkBWWNSon1P9VI4MUF/yDq/6XUpOuhPtnB675gLvDQoZ1vdyjmmslYkdVoY59\r\nW30u/oMmNVea0Yi7e5ghlOnAzD2HRddbr87V+dp3NWDsN2XCZkYCY5sFhMWH\r\nTe9uPwFwBleY/Jm0naBnZXemp2hOltMiEPoewNsomt0Qn1Pl1R7V1slXI0Tz\r\nFYwQnIkJBNbmLvmAJut7bjsqz/8wJhgFwCl/KfiY5GBu61M6HYV+aTgZV515\r\nIOUo1CbkEem4TJ/8E5UcLJ0J1bKoou0oc6pAg0p+vGFgiSE0pgm32O96e+Rk\r\nmzE9wMOMw5oxRDYhqJ29Ic3oDrxZF0Il8hKRekMX5dt4ayD64jWf/tDGyzLJ\r\niCdfaLHoXNRGMdTuY6aOqRX50BT0qKAVGbPRm4UM8NfQ6xDOyeohGTWWn51y\r\nmzbAgQabb0mk/EaPusitD9jbQYvB1Tul1ESU6B4B/5gVjc23iH7dyUDGX0Aj\r\nM5ckQ61aRzW6Wdlsu8c2gS7imjP/qnp3K7CmgR6ksoOOSkbR+pC4C5mI8cra\r\npfEsxUqzqm6YXeYamkcEspTwZw1csru3ESc=\r\n=tWgE\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"spikebot","email":"abatallah1214@gmail.com"},"maintainers":[{"name":"spikebot","email":"abatallah1214@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spike-player_1.4.1_1660289692109_0.8045892423225278"},"_hasShrinkwrap":false},"1.4.2-0":{"name":"spike-player","version":"1.4.2-0","description":"Complete framework to facilitate music commands using discord.js v13 & v14","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","test":"jest test/test.js","clean":"rimraf dist","pre":"npm version prerelease --force && npm publish --access public --tag dev","prep":"npm run clean && npm run build","pub":"conventional-changelog -p angular -i CHANGELOG.md -s && npm publish"},"keywords":["music","player","bot","framework","discord","youtube","spotify","v13","v14"],"dependencies":{"@discordjs/opus":"^0.8.0","@discordjs/voice":"^0.11.0","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.29.0","@typescript-eslint/parser":"^5.29.0","axios":"^0.27.2","axios-retry":"^3.2.0","discord-ytdl-core":"^5.0.4","domhandler":"^5.0.3","eslint":"^8.18.0","ffmpeg-static":"^5.0.2","htmlparser2":"^8.0.1","isomorphic-unfetch":"^3.1.0","jest":"^28.1.1","libsodium-wrappers":"^0.7.9","rimraf":"^3.0.2","soundcloud-scraper":"github:AnupKumarPanwar/soundcloud-scraper","spotify-url-info":"^3.1.2","youtubei":"^0.0.1-rc.34","ytdl-core":"file:./packages/ytdl","ytsr":"^3.8.0"},"devDependencies":{"@babel/cli":"^7.14.8","@babel/core":"^7.15.0","@babel/preset-env":"^7.15.0","@babel/preset-typescript":"^7.15.0","@commitlint/cli":"^17.0.3","@rocketseat/commitlint-config":"^0.0.3","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.29.0","@typescript-eslint/parser":"^5.29.0","assert-diff":"^3.0.2","discord.js":"^14.0.2","discord.js-docgen":"github:discordjs/docgen#ts-patch","eslint":"^8.18.0","husky":"^8.0.0","jest":"^28.1.1","jsdoc-babel":"^0.5.0","ts-node":"^10.2.0","typescript":"^4.3.5"},"directories":{"doc":"docs","test":"test"},"engines":{"node":">=16.9.0"},"workspaces":["packages/*"],"packageManager":"npm@8.11.0","readme":"# Discord Music Player\r\n![npm](https://img.shields.io/npm/dt/discord-music-player?style=for-the-badge)\r\n![npm](https://img.shields.io/npm/v/discord-music-player?style=for-the-badge)\r\n![CodeFactor Grade](https://img.shields.io/codefactor/grade/github/SushiBtw/discord-music-player?color=%2348aaf1&style=for-the-badge)\r\n\r\n### Note: This is the v8 version of Discord Music Player for Discord.JS v13!\r\n\r\nDiscord Music Player is a powerful [Node.js](https://nodejs.org) module that allows you to easily implement music commands.\r\n**Everything** is customizable, and everything can be done using this package - **there are no limitations!**\r\n\r\nThis package supports YouTube Videos & Playlists, Spotify Songs & Playlists, Apple Music Songs & Playlists.\r\nPackage from version v7.0.0 is fully maintained by [SushiBtw](https://github.com/SushiBtw).\r\n\r\n### Requirements:\r\n- [Discord.js v13](https://www.npmjs.com/package/discord.js),\r\n- [Node.JS v16](https://nodejs.org/),\r\n\r\n# Installation\r\n*Node.JS v16 or newer is required to run this module.*\r\n```sh\r\nnpm install --save discord-music-player\r\n```\r\nInstall **@discordjs/opus**:\r\n```sh\r\nnpm install --save @discordjs/opus\r\n```\r\n**Install [FFMPEG](https://www.ffmpeg.org/download.html)!**\r\n\r\n# Documentation\r\n**Discord Music Player documentation: [https://discord-music-player.js.org/](https://discord-music-player.js.org/)**\r\n\r\n### **Need some help?**\r\nFeel free to join [Discord-Music-Player Discord Server](https://discord.gg/6fejZNsmFC) and ask us about DMP.\r\n\r\n# Getting Started\r\n**The code bellow, will show you how to use DMP in your code.**\r\n\r\n*Please define your **Player** after the **client/bot** definition.*\r\n\r\n[!] Remember to include the related voice **Intents** at the client options. [!]\r\n```js\r\nconst Discord = require(\"discord.js\");\r\nconst client = new Discord.Client({\r\n    intents: [Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES, Intents.FLAGS.GUILD_VOICE_STATES]\r\n});\r\nconst settings = {\r\n    prefix: '!',\r\n    token: 'YourBotTokenHere'\r\n};\r\n\r\nconst { Player } = require(\"discord-music-player\");\r\nconst player = new Player(client, {\r\n    leaveOnEmpty: false, // This options are optional.\r\n});\r\n// You can define the Player as *client.player* to easily access it.\r\nclient.player = player;\r\n\r\nclient.on(\"ready\", () => {\r\n    console.log(\"I am ready to Play with DMP 🎶\");\r\n});\r\n\r\nclient.login(settings.token);\r\n```\r\n\r\n# Example Usage\r\n```js\r\nconst { RepeatMode } = require('discord-music-player');\r\n\r\nclient.on('messageCreate', async (message) => {\r\n    const args = message.content.slice(settings.prefix.length).trim().split(/ +/g);\r\n    const command = args.shift();\r\n    let guildQueue = client.player.getQueue(message.guild.id);\r\n\r\n    if(command === 'play') {\r\n        let queue = client.player.createQueue(message.guild.id);\r\n        await queue.join(message.member.voice.channel);\r\n        let song = await queue.play(args.join(' ')).catch(_ => {\r\n            if(!guildQueue)\r\n                queue.stop();\r\n        });\r\n    }\r\n\r\n    if(command === 'playlist') {\r\n        let queue = client.player.createQueue(message.guild.id);\r\n        await queue.join(message.member.voice.channel);\r\n        let song = await queue.playlist(args.join(' ')).catch(_ => {\r\n            if(!guildQueue)\r\n                queue.stop();\r\n        });\r\n    }\r\n\r\n    if(command === 'skip') {\r\n        guildQueue.skip();\r\n    }\r\n\r\n    if(command === 'stop') {\r\n        guildQueue.stop();\r\n    }\r\n\r\n    if(command === 'removeLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.DISABLED); // or 0 instead of RepeatMode.DISABLED\r\n    }\r\n\r\n    if(command === 'toggleLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.SONG); // or 1 instead of RepeatMode.SONG\r\n    }\r\n\r\n    if(command === 'toggleQueueLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.QUEUE); // or 2 instead of RepeatMode.QUEUE\r\n    }\r\n\r\n    if(command === 'setVolume') {\r\n        guildQueue.setVolume(parseInt(args[0]));\r\n    }\r\n\r\n    if(command === 'seek') {\r\n        guildQueue.seek(parseInt(args[0]) * 1000);\r\n    }\r\n\r\n    if(command === 'clearQueue') {\r\n        guildQueue.clearQueue();\r\n    }\r\n\r\n    if(command === 'shuffle') {\r\n        guildQueue.shuffle();\r\n    }\r\n\r\n    if(command === 'getQueue') {\r\n        console.log(guildQueue);\r\n    }\r\n\r\n    if(command === 'getVolume') {\r\n        console.log(guildQueue.volume)\r\n    }\r\n\r\n    if(command === 'nowPlaying') {\r\n        console.log(`Now playing: ${guildQueue.nowPlaying}`);\r\n    }\r\n\r\n    if(command === 'pause') {\r\n        guildQueue.setPaused(true);\r\n    }\r\n\r\n    if(command === 'resume') {\r\n        guildQueue.setPaused(false);\r\n    }\r\n\r\n    if(command === 'remove') {\r\n        guildQueue.remove(parseInt(args[0]));\r\n    }\r\n\r\n    if(command === 'createProgressBar') {\r\n        const ProgressBar = guildQueue.createProgressBar();\r\n        \r\n        // [======>              ][00:35/2:20]\r\n        console.log(ProgressBar.prettier);\r\n    }\r\n})\r\n```\r\n\r\n### Events:\r\n```js\r\n// Init the event listener only once (at the top of your code).\r\nclient.player\r\n    // Emitted when channel was empty.\r\n    .on('channelEmpty',  (queue) =>\r\n        console.log(`Everyone left the Voice Channel, queue ended.`))\r\n    // Emitted when a song was added to the queue.\r\n    .on('songAdd',  (queue, song) =>\r\n        console.log(`Song ${song} was added to the queue.`))\r\n    // Emitted when a playlist was added to the queue.\r\n    .on('playlistAdd',  (queue, playlist) =>\r\n        console.log(`Playlist ${playlist} with ${playlist.songs.length} was added to the queue.`))\r\n    // Emitted when there was no more music to play.\r\n    .on('queueDestroyed',  (queue) =>\r\n        console.log(`The queue was destroyed.`))\r\n    // Emitted when the queue was destroyed (either by ending or stopping).    \r\n    .on('queueEnd',  (queue) =>\r\n        console.log(`The queue has ended.`))\r\n    // Emitted when a song changed.\r\n    .on('songChanged', (queue, newSong, oldSong) =>\r\n        console.log(`${newSong} is now playing.`))\r\n    // Emitted when a first song in the queue started playing.\r\n    .on('songFirst',  (queue, song) =>\r\n        console.log(`Started playing ${song}.`))\r\n    // Emitted when someone disconnected the bot from the channel.\r\n    .on('clientDisconnect', (queue) =>\r\n        console.log(`I was kicked from the Voice Channel, queue ended.`))\r\n    // Emitted when deafenOnJoin is true and the bot was undeafened\r\n    .on('clientUndeafen', (queue) =>\r\n        console.log(`I got undefeanded.`))\r\n    // Emitted when there was an error in runtime\r\n    .on('error', (error, queue) => {\r\n        console.log(`Error: ${error} in ${queue.guild.name}`);\r\n    });\r\n```\r\n\r\n# Passing custom data\r\n\r\n### Queue\r\nWhile running the `Queue#createQueue()` method you can pass a `options#data` object to hold custom data.\r\nThis can be made in two ways:\r\n```js\r\n// Pass custom data\r\nawait player.createQueue(message.guild.id, {\r\n    data: {\r\n        queueInitMessage: message,\r\n        myObject: 'this will stay with the queue :)',\r\n        more: 'add more... there are no limitations...'\r\n    }\r\n});\r\n// Or by using\r\nqueue.setData({\r\n    whatever: 'you want :D'\r\n});\r\n\r\n// Access custom data\r\nlet queue = player.getQueue(message.guild.id);\r\nlet initMessage = queue.data.queueInitMessage;\r\nawait initMessage.channel.send(`This message object is hold in Queue :D`);\r\n```\r\n\r\n### Song or Playlist\r\nWhile running the `Queue#play()`/Queue#playlist() method you can pass a `options#data` object to hold custom data.\r\nThis can be made in two ways:\r\n```js\r\n// Play the song\r\nlet song = await queue.play('Born in the USA!');\r\n// Set song data\r\nsong.setData({\r\n    initMessage: message\r\n});\r\n\r\n// Play the playlist\r\nlet playlist = await queue.playlist('https://www.youtube.com/playlist?list=PLDLGxnP4y2mGKGEqwxWTRkd3HtrrVTMdU');\r\n// Set playlist data (will set data for each song in the playlist)\r\nsong.setData({\r\n    initMessage: message\r\n});\r\n\r\n// Access custom data\r\nlet queue = player.getQueue(message.guild.id);\r\nlet { initMessage } = queue.nowPlaying.data;\r\nawait initMessage.channel.send(`This message object is hold in Song :D`);\r\n```\r\n","readmeFilename":"README.md","gitHead":"c3c8120928441a6015d35726825d0647c505b279","_id":"spike-player@1.4.2-0","_nodeVersion":"16.15.1","_npmVersion":"8.11.0","dist":{"integrity":"sha512-wfwMSQGhrnMJqapNOYgbII1UGNmxgxcoDsX9YCYBTZXYdaNCCZrM7NCPnZlJAcoxTlpEzBMush6QLTep9YVc+A==","shasum":"ba2fa3985c84958cfde2eaa182a2e95ab76e55eb","tarball":"https://registry.npmjs.org/spike-player/-/spike-player-1.4.2-0.tgz","fileCount":146,"unpackedSize":39229332,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHs8yF+SjONON7Mp105/b9xYVnBQN5IRdHLsUi61zSMIAiEAlIs8npeYDzTPmkmmWbYPBOsYRb2335FsrtiEy/DZTJY="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi9gfDACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoeCRAAm3U7givcvNQvBcevntvok0jfRZPzLf7NpoR4ymC/PWqQHH/E\r\nTn6sl9bdq5nhefcetpdvn/zVw3MZaorxsnofDczFGk+aFE8m646GuIEZm1cP\r\nZn0onZiSAhepT1KA/20dBv+zDRUh644rh5saA6mPIMxpWSJdmUmYL5u0zwmR\r\nX3uqWD2WUGTqW3X8siPr+bHmJTUpm0UDfcA8ew9hbuX10QEobnAddVFvbljJ\r\n+1/W79dg+EFD5Q79oHW/KkMNzdr/zOO15wwNRtVu8zMHAgRNJxd+opMW4igI\r\nAzil3xwlM038JWGP3vo7STWQcQype7ntbeR2NS4wk0pyycMOEumgyeTUe4zM\r\nVt2rTO9K5hbLVWFk334BlUgCcHdyJuHMUjDMm3yYzW8YGQwPzOrQlpV8Z3zx\r\naRNC3tmP23Wp4jAfxieCF6uvk1dxJLyKsbiz5YVQbjXGXIBdGzyCbzVAqATf\r\n4IxeWjuI8ugnj2Fty2FN319H/FjL+7PqBHdx/1qILUAExff7jxDdFRBfcruu\r\n1cAHnqrWmEunrCwaGGrM/4g++k7pUH6K75e06vG9NvE9qPhnvhlqK+QjiEJo\r\nxno9uXA1qDGT6HMy8iZtugoP4j4TsNYs/DO9BKX/PugXQEvFnF9gDx0fCSEj\r\nBlBGKmZbX5e77wEhjy3+/ZHjEVVjbsJushw=\r\n=Szar\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"spikebot","email":"abatallah1214@gmail.com"},"maintainers":[{"name":"spikebot","email":"abatallah1214@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spike-player_1.4.2-0_1660291011048_0.5006856007959566"},"_hasShrinkwrap":false},"1.4.2":{"name":"spike-player","version":"1.4.2","description":"Complete framework to facilitate music commands using discord.js v13 & v14","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","test":"jest test/test.js","clean":"rimraf dist","pre":"npm version prerelease --force && npm publish --access public --tag dev","prep":"npm run clean && npm run build","pub":"conventional-changelog -p angular -i CHANGELOG.md -s && npm publish"},"keywords":["music","player","bot","framework","discord","youtube","spotify","v13","v14"],"dependencies":{"@discordjs/opus":"^0.8.0","@discordjs/voice":"^0.11.0","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.29.0","@typescript-eslint/parser":"^5.29.0","axios":"^0.27.2","axios-retry":"^3.2.0","discord-ytdl-core":"^5.0.4","domhandler":"^5.0.3","eslint":"^8.18.0","ffmpeg-static":"^5.0.2","htmlparser2":"^8.0.1","isomorphic-unfetch":"^3.1.0","jest":"^28.1.1","libsodium-wrappers":"^0.7.9","rimraf":"^3.0.2","soundcloud-scraper":"github:AnupKumarPanwar/soundcloud-scraper","spotify-url-info":"^3.1.2","youtubei":"^0.0.1-rc.34","ytdl-core":"file:./packages/ytdl","ytsr":"^3.8.0"},"devDependencies":{"@babel/cli":"^7.14.8","@babel/core":"^7.15.0","@babel/preset-env":"^7.15.0","@babel/preset-typescript":"^7.15.0","@commitlint/cli":"^17.0.3","@rocketseat/commitlint-config":"^0.0.3","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.29.0","@typescript-eslint/parser":"^5.29.0","assert-diff":"^3.0.2","discord.js":"^14.0.2","discord.js-docgen":"github:discordjs/docgen#ts-patch","eslint":"^8.18.0","husky":"^8.0.0","jest":"^28.1.1","jsdoc-babel":"^0.5.0","ts-node":"^10.2.0","typescript":"^4.3.5"},"directories":{"doc":"docs","test":"test"},"engines":{"node":">=16.9.0"},"workspaces":["packages/*"],"packageManager":"npm@8.11.0","gitHead":"bc99bfbab1cf4b9ed71cf5c0daa138ec91ed7017","_id":"spike-player@1.4.2","_nodeVersion":"16.15.1","_npmVersion":"8.11.0","dist":{"integrity":"sha512-K/jV3mJ3iIpxaV7hozOHTkDtqUGYZyeWw4iZlrTvDOljyVhrdYRFbZFVbM4dRdUj4AjVUSuImmFd/olAHwEuvg==","shasum":"295345fe959d88bb0c30915cb2e44891b65d17bb","tarball":"https://registry.npmjs.org/spike-player/-/spike-player-1.4.2.tgz","fileCount":146,"unpackedSize":39468493,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD+ONU7pKlm/VIea49/Pv4ekNveYOk1yThl+h+N78thiwIgGrAVoflqkElzOBiM1skwAgyfkK4OjKpLGRwqCT56lIc="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi9gjpACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmp8IRAAiRjTFzwfty4M68Lj9x9lttC0tJpLJt16NUu7dyDueIVAN6eE\r\n+MDC+wwRznV6InLrhzfC2jqfX2w90RhB4BV0B7izLs4T4OtDYReHOCnSRDbk\r\nxQGN1SV9dewiR/llInZMzM/ZRepGmcne3ouinAnsxwof1jrN0n5/v6ytmIDN\r\nd0RkxO0Clvs+3OyK7/mrEmjCuEW2deU/eM0jjwe/To5xfaY3n7uVeEEf6z79\r\n2K6Bdu/3LM8Dk6MzejCBs7bvV9oXkeEGng+siwcYTIsX4w1sO89J3N63KxR8\r\nHJ6A3Fas5ARRuo7O0Ae+n/tCbEwEjiKjKypzNRiSTapOtOFr6RgJaqeplkro\r\njfAJNOKRAyWNsCdbf7Jf7I7xcr4JhDqU7bZWMIeiDHak+i9iEuxuFEC8qWcv\r\n8B1xCMy5IiM1KbqR+rDOZLs5AtgK2gMYaCIjeng6WxxbXoXUhf4mBN5BN62I\r\nCh3v0D8xybCYRjComhZ3TGDO1feszKcIGz7XT7TsPPlFUApweg1BmRtvY3G9\r\nOe1I6z+h5RKjLBcTcRBsl447FjInVV1JCs/t9Bp0kjhxSco70yczTO+c8a/d\r\nAcFogGMJ1K0hHJf3I+WtFsQf7xmnEeZXNzI8AwUJ+rwcN5hHYlD+/xUR4zdb\r\n8GagL96J5Uu/W8vVyXpTt2BKo93rswdlWKw=\r\n=tvdk\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"spikebot","email":"abatallah1214@gmail.com"},"maintainers":[{"name":"spikebot","email":"abatallah1214@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spike-player_1.4.2_1660291305280_0.12614035458729522"},"_hasShrinkwrap":false},"1.4.3":{"name":"spike-player","version":"1.4.3","description":"Complete framework to facilitate music commands using discord.js v13 & v14","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","test":"jest test/test.js","clean":"rimraf dist","pre":"npm version prerelease --force && npm publish --access public --tag dev","prep":"npm run clean && npm run build","pub":"conventional-changelog -p angular -i CHANGELOG.md -s && npm publish"},"keywords":["music","player","bot","framework","discord","youtube","spotify","v13","v14"],"dependencies":{"@discordjs/opus":"^0.8.0","@discordjs/voice":"^0.11.0","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.29.0","@typescript-eslint/parser":"^5.29.0","axios":"^0.27.2","axios-retry":"^3.2.0","discord-ytdl-core":"^5.0.4","domhandler":"^5.0.3","ffmpeg-static":"^5.0.2","htmlparser2":"^8.0.1","isomorphic-unfetch":"^3.1.0","jest":"^28.1.1","libsodium-wrappers":"^0.7.9","rimraf":"^3.0.2","soundcloud-scraper":"github:AnupKumarPanwar/soundcloud-scraper","spotify-url-info":"^3.1.2","youtubei":"^0.0.1-rc.34","ytdl-core":"file:./packages/ytdl","ytsr":"^3.8.0"},"devDependencies":{"@babel/cli":"^7.14.8","@babel/core":"^7.15.0","@babel/preset-env":"^7.15.0","@babel/preset-typescript":"^7.15.0","@commitlint/cli":"^17.0.3","@rocketseat/commitlint-config":"^0.0.3","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.29.0","@typescript-eslint/parser":"^5.29.0","assert-diff":"^3.0.2","discord.js":"^14.0.2","discord.js-docgen":"github:discordjs/docgen#ts-patch","jest":"^28.1.1","jsdoc-babel":"^0.5.0","ts-node":"^10.2.0","typescript":"^4.3.5"},"directories":{"doc":"docs","test":"test"},"engines":{"node":">=16.9.0"},"workspaces":["packages/*"],"packageManager":"npm@8.11.0","gitHead":"8e99af3fd24844d11276894d49e21d01ab36a8a9","_id":"spike-player@1.4.3","_nodeVersion":"16.15.1","_npmVersion":"8.11.0","dist":{"integrity":"sha512-LxaoD7i4GAKNAZXTiaPwMq7G6Y1oneGRbMMylgwrpkn9bROrzea6nk6P13hzbgpaC0On85AEE1WzFSZ6ViafhA==","shasum":"8452721eaef59a86b4c5e18b11f6ef303991b77c","tarball":"https://registry.npmjs.org/spike-player/-/spike-player-1.4.3.tgz","fileCount":146,"unpackedSize":46241408,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCdfiJGWGaM+fQcfWXZK6OVFXIxP1vSJryud+xPfxauQgIhAMPHc5d2p52m9a7Xt6dAPD/G8OmxbYHMA0cNfhFXWDfB"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi+UESACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoD9g/+NzM9KlD1m+GxGov4x19TZTFonurYpVux83HCnElc3NcGw/qe\r\nQUsCxaVfErBrT+x2fILusSi/g606W6lXoRaewfaTk/jjGsVJlUoHGMcEIR59\r\nhf+aBRsrfdCMxSGKMba2zgiRdVkXnxTo/l4xmRSFOV7/trrNUD1AnnhIl9V0\r\nnaxb4s7BGJ+/0fU1b6oh4g+5l9i6cV3zpjUcOQTjcaiGttLM2+2MyJPeHnOd\r\nv2ZYuWZrBw9pmv4P4sjv2KTvaEluXngyo9kyEmbZibxUNKaY/9H+H6KEcK68\r\nOyR06Ckh56k3cEEShV/qIMR1wV9dLcunimsdxK/Z2ay77B3Oh/3HOY4mlay1\r\nmqXCLvpAi0HRU5/MFdiwD7ciYHkkn35N2ROg4UDWp/ectbx7FetUtoQWkDIc\r\n8inetENGZymCUnGmgzv/vkbusP5/6bLgnQ58F2f1S3VcOKxtUK6VKzPqZ8RQ\r\nIOJL/9rJGKbE5IJakULrRZzVm2fWHT9T6Vz2q3VBOPzFj6wKzScVV1me01v9\r\nKm+pP2yAp5PUmbqdOMNzC+wn6YKq0qvfpbcba+mafFypX7GLh2VgwnaGBIWr\r\nfcDYb7DlWdc51WAh+LDM6gBLVRy47rXu9u/xVZtQp2ExXEt50DCTWX+jQ/hS\r\n1scIjVfsrtR+RxDOWbgq9t2MkMt8v72KgOI=\r\n=98a9\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"spikebot","email":"abatallah1214@gmail.com"},"maintainers":[{"name":"spikebot","email":"abatallah1214@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spike-player_1.4.3_1660502289859_0.7145695034695718"},"_hasShrinkwrap":false},"1.4.4-0":{"name":"spike-player","version":"1.4.4-0","description":"Complete framework to facilitate music commands using discord.js v13 & v14","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","test":"jest test/test.js","clean":"rimraf dist","pre":"npm version prerelease --force && npm publish --access public --tag dev","prep":"npm run clean && npm run build","pub":"conventional-changelog -p angular -i CHANGELOG.md -s && npm publish"},"keywords":["music","player","bot","framework","discord","youtube","spotify","v13","v14"],"dependencies":{"@discordjs/opus":"^0.8.0","@discordjs/voice":"^0.11.0","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.29.0","@typescript-eslint/parser":"^5.29.0","axios":"^0.27.2","axios-retry":"^3.2.0","discord-ytdl-core":"^5.0.4","domhandler":"^5.0.3","eslint":"^8.18.0","ffmpeg-static":"^5.0.2","htmlparser2":"^8.0.1","isomorphic-unfetch":"^3.1.0","jest":"^28.1.1","libsodium-wrappers":"^0.7.9","rimraf":"^3.0.2","soundcloud-scraper":"github:AnupKumarPanwar/soundcloud-scraper","spotify-url-info":"^3.1.2","youtubei":"^0.0.1-rc.34","ytdl-core":"file:./packages/ytdl","ytsr":"^3.8.0"},"devDependencies":{"@babel/cli":"^7.14.8","@babel/core":"^7.15.0","@babel/preset-env":"^7.15.0","@babel/preset-typescript":"^7.15.0","@commitlint/cli":"^17.0.3","@rocketseat/commitlint-config":"^0.0.3","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.29.0","@typescript-eslint/parser":"^5.29.0","assert-diff":"^3.0.2","discord.js":"^14.0.2","discord.js-docgen":"github:discordjs/docgen#ts-patch","eslint":"^8.18.0","husky":"^8.0.0","jest":"^28.1.1","jsdoc-babel":"^0.5.0","ts-node":"^10.2.0","typescript":"^4.3.5"},"directories":{"doc":"docs","test":"test"},"engines":{"node":">=16.9.0"},"workspaces":["packages/*"],"packageManager":"npm@8.11.0","readme":"# Discord Music Player\r\n![npm](https://img.shields.io/npm/dt/discord-music-player?style=for-the-badge)\r\n![npm](https://img.shields.io/npm/v/discord-music-player?style=for-the-badge)\r\n![CodeFactor Grade](https://img.shields.io/codefactor/grade/github/SushiBtw/discord-music-player?color=%2348aaf1&style=for-the-badge)\r\n\r\n### Note: This is the v8 version of Discord Music Player for Discord.JS v13!\r\n\r\nDiscord Music Player is a powerful [Node.js](https://nodejs.org) module that allows you to easily implement music commands.\r\n**Everything** is customizable, and everything can be done using this package - **there are no limitations!**\r\n\r\nThis package supports YouTube Videos & Playlists, Spotify Songs & Playlists, Apple Music Songs & Playlists.\r\nPackage from version v7.0.0 is fully maintained by [SushiBtw](https://github.com/SushiBtw).\r\n\r\n### Requirements:\r\n- [Discord.js v13](https://www.npmjs.com/package/discord.js),\r\n- [Node.JS v16](https://nodejs.org/),\r\n\r\n# Installation\r\n*Node.JS v16 or newer is required to run this module.*\r\n```sh\r\nnpm install --save discord-music-player\r\n```\r\nInstall **@discordjs/opus**:\r\n```sh\r\nnpm install --save @discordjs/opus\r\n```\r\n**Install [FFMPEG](https://www.ffmpeg.org/download.html)!**\r\n\r\n# Documentation\r\n**Discord Music Player documentation: [https://discord-music-player.js.org/](https://discord-music-player.js.org/)**\r\n\r\n### **Need some help?**\r\nFeel free to join [Discord-Music-Player Discord Server](https://discord.gg/6fejZNsmFC) and ask us about DMP.\r\n\r\n# Getting Started\r\n**The code bellow, will show you how to use DMP in your code.**\r\n\r\n*Please define your **Player** after the **client/bot** definition.*\r\n\r\n[!] Remember to include the related voice **Intents** at the client options. [!]\r\n```js\r\nconst Discord = require(\"discord.js\");\r\nconst client = new Discord.Client({\r\n    intents: [Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES, Intents.FLAGS.GUILD_VOICE_STATES]\r\n});\r\nconst settings = {\r\n    prefix: '!',\r\n    token: 'YourBotTokenHere'\r\n};\r\n\r\nconst { Player } = require(\"discord-music-player\");\r\nconst player = new Player(client, {\r\n    leaveOnEmpty: false, // This options are optional.\r\n});\r\n// You can define the Player as *client.player* to easily access it.\r\nclient.player = player;\r\n\r\nclient.on(\"ready\", () => {\r\n    console.log(\"I am ready to Play with DMP 🎶\");\r\n});\r\n\r\nclient.login(settings.token);\r\n```\r\n\r\n# Example Usage\r\n```js\r\nconst { RepeatMode } = require('discord-music-player');\r\n\r\nclient.on('messageCreate', async (message) => {\r\n    const args = message.content.slice(settings.prefix.length).trim().split(/ +/g);\r\n    const command = args.shift();\r\n    let guildQueue = client.player.getQueue(message.guild.id);\r\n\r\n    if(command === 'play') {\r\n        let queue = client.player.createQueue(message.guild.id);\r\n        await queue.join(message.member.voice.channel);\r\n        let song = await queue.play(args.join(' ')).catch(_ => {\r\n            if(!guildQueue)\r\n                queue.stop();\r\n        });\r\n    }\r\n\r\n    if(command === 'playlist') {\r\n        let queue = client.player.createQueue(message.guild.id);\r\n        await queue.join(message.member.voice.channel);\r\n        let song = await queue.playlist(args.join(' ')).catch(_ => {\r\n            if(!guildQueue)\r\n                queue.stop();\r\n        });\r\n    }\r\n\r\n    if(command === 'skip') {\r\n        guildQueue.skip();\r\n    }\r\n\r\n    if(command === 'stop') {\r\n        guildQueue.stop();\r\n    }\r\n\r\n    if(command === 'removeLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.DISABLED); // or 0 instead of RepeatMode.DISABLED\r\n    }\r\n\r\n    if(command === 'toggleLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.SONG); // or 1 instead of RepeatMode.SONG\r\n    }\r\n\r\n    if(command === 'toggleQueueLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.QUEUE); // or 2 instead of RepeatMode.QUEUE\r\n    }\r\n\r\n    if(command === 'setVolume') {\r\n        guildQueue.setVolume(parseInt(args[0]));\r\n    }\r\n\r\n    if(command === 'seek') {\r\n        guildQueue.seek(parseInt(args[0]) * 1000);\r\n    }\r\n\r\n    if(command === 'clearQueue') {\r\n        guildQueue.clearQueue();\r\n    }\r\n\r\n    if(command === 'shuffle') {\r\n        guildQueue.shuffle();\r\n    }\r\n\r\n    if(command === 'getQueue') {\r\n        console.log(guildQueue);\r\n    }\r\n\r\n    if(command === 'getVolume') {\r\n        console.log(guildQueue.volume)\r\n    }\r\n\r\n    if(command === 'nowPlaying') {\r\n        console.log(`Now playing: ${guildQueue.nowPlaying}`);\r\n    }\r\n\r\n    if(command === 'pause') {\r\n        guildQueue.setPaused(true);\r\n    }\r\n\r\n    if(command === 'resume') {\r\n        guildQueue.setPaused(false);\r\n    }\r\n\r\n    if(command === 'remove') {\r\n        guildQueue.remove(parseInt(args[0]));\r\n    }\r\n\r\n    if(command === 'createProgressBar') {\r\n        const ProgressBar = guildQueue.createProgressBar();\r\n        \r\n        // [======>              ][00:35/2:20]\r\n        console.log(ProgressBar.prettier);\r\n    }\r\n})\r\n```\r\n\r\n### Events:\r\n```js\r\n// Init the event listener only once (at the top of your code).\r\nclient.player\r\n    // Emitted when channel was empty.\r\n    .on('channelEmpty',  (queue) =>\r\n        console.log(`Everyone left the Voice Channel, queue ended.`))\r\n    // Emitted when a song was added to the queue.\r\n    .on('songAdd',  (queue, song) =>\r\n        console.log(`Song ${song} was added to the queue.`))\r\n    // Emitted when a playlist was added to the queue.\r\n    .on('playlistAdd',  (queue, playlist) =>\r\n        console.log(`Playlist ${playlist} with ${playlist.songs.length} was added to the queue.`))\r\n    // Emitted when there was no more music to play.\r\n    .on('queueDestroyed',  (queue) =>\r\n        console.log(`The queue was destroyed.`))\r\n    // Emitted when the queue was destroyed (either by ending or stopping).    \r\n    .on('queueEnd',  (queue) =>\r\n        console.log(`The queue has ended.`))\r\n    // Emitted when a song changed.\r\n    .on('songChanged', (queue, newSong, oldSong) =>\r\n        console.log(`${newSong} is now playing.`))\r\n    // Emitted when a first song in the queue started playing.\r\n    .on('songFirst',  (queue, song) =>\r\n        console.log(`Started playing ${song}.`))\r\n    // Emitted when someone disconnected the bot from the channel.\r\n    .on('clientDisconnect', (queue) =>\r\n        console.log(`I was kicked from the Voice Channel, queue ended.`))\r\n    // Emitted when deafenOnJoin is true and the bot was undeafened\r\n    .on('clientUndeafen', (queue) =>\r\n        console.log(`I got undefeanded.`))\r\n    // Emitted when there was an error in runtime\r\n    .on('error', (error, queue) => {\r\n        console.log(`Error: ${error} in ${queue.guild.name}`);\r\n    });\r\n```\r\n\r\n# Passing custom data\r\n\r\n### Queue\r\nWhile running the `Queue#createQueue()` method you can pass a `options#data` object to hold custom data.\r\nThis can be made in two ways:\r\n```js\r\n// Pass custom data\r\nawait player.createQueue(message.guild.id, {\r\n    data: {\r\n        queueInitMessage: message,\r\n        myObject: 'this will stay with the queue :)',\r\n        more: 'add more... there are no limitations...'\r\n    }\r\n});\r\n// Or by using\r\nqueue.setData({\r\n    whatever: 'you want :D'\r\n});\r\n\r\n// Access custom data\r\nlet queue = player.getQueue(message.guild.id);\r\nlet initMessage = queue.data.queueInitMessage;\r\nawait initMessage.channel.send(`This message object is hold in Queue :D`);\r\n```\r\n\r\n### Song or Playlist\r\nWhile running the `Queue#play()`/Queue#playlist() method you can pass a `options#data` object to hold custom data.\r\nThis can be made in two ways:\r\n```js\r\n// Play the song\r\nlet song = await queue.play('Born in the USA!');\r\n// Set song data\r\nsong.setData({\r\n    initMessage: message\r\n});\r\n\r\n// Play the playlist\r\nlet playlist = await queue.playlist('https://www.youtube.com/playlist?list=PLDLGxnP4y2mGKGEqwxWTRkd3HtrrVTMdU');\r\n// Set playlist data (will set data for each song in the playlist)\r\nsong.setData({\r\n    initMessage: message\r\n});\r\n\r\n// Access custom data\r\nlet queue = player.getQueue(message.guild.id);\r\nlet { initMessage } = queue.nowPlaying.data;\r\nawait initMessage.channel.send(`This message object is hold in Song :D`);\r\n```\r\n","readmeFilename":"README.md","gitHead":"ac94b7c931fbddf49a2fe132fc3227af72d6f68c","_id":"spike-player@1.4.4-0","_nodeVersion":"16.15.1","_npmVersion":"8.11.0","dist":{"integrity":"sha512-j+A+1t5V1z8amtPRYPBIOMedYCoFmRDVKbiLS2ySDDVnH+XiRTYuHrHhaNUjZAilNvInytMB/9Brm7JfMiuV+Q==","shasum":"13a6cff9096b6c6c91fb545e891957ccfef198da","tarball":"https://registry.npmjs.org/spike-player/-/spike-player-1.4.4-0.tgz","fileCount":146,"unpackedSize":46250911,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICPo6h4y0q0JO69S/1Tkfe/KrGdfhmQsjemH28ke8+kbAiB4a4n3cfj9kcTSzGGohkGJVSb4asblt627dmc/gYsW6g=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi+3ITACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoXFA/9FFExflk07oxLOdfz1rrjFDdGsamY+GLY0XZ4zZbdNulEzbvW\r\nqMyMlhDMTMqAOyFjt3zFSJEXMieAgOtekY8dD/SyPaQQFeRfGAqFO2e7+n6x\r\nbLbPlPqPhN2mA6tzpk+1oWr4i1P5+nq9ELSOLU2T3D5fk5sCC07qBu7fc7B4\r\nEs7PAd5DfIGuqf8ix/ts+CMzKeRIL1LVOXO5jwuMWAZqfSQXjOsbGgX28md6\r\nfPGmgI0n1YFk4EFObd0J3+gALXgMJhPqu7BJ3vp3RNI6fwfTNvapHDQWYp0T\r\nPvxuW3ta1vuk+TsObkwcX95KCOXtD/r89MApB5ho6HTk7Gr2OcPFnukw/q3B\r\nYyquLQ7ohK1JcgNZ4th8AZ1hJlgYv003CHoNogs+HrAH8zfArIdq5c7kPnMf\r\naAEiS020+EIVLSECtyw5ZEaaxwkpjPr0825yySOLeSKoFt9ZbkAeqvg73mQo\r\nT5pVSkrc+wY5sPYVubiHphQk3RVXAibszO+3rNSdbtMRBU7yIsUj9LgdTe3l\r\nD2DTZZAJik0ZF2FqAIV4dk6guM1W2/w7HlrOWIQjArLofYn0AAGYWY4IRhjl\r\nAP29jvpa+v1GT6KT1sAZVnvaq04G9u1YyfqJaLhGwxAVXxGtq0t9NjkTfnie\r\nIo/IhDL3+EQNF7wU/inBPZPGHTiFevj+rWc=\r\n=K7ER\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"spikebot","email":"abatallah1214@gmail.com"},"maintainers":[{"name":"spikebot","email":"abatallah1214@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spike-player_1.4.4-0_1660645903927_0.6818840015358518"},"_hasShrinkwrap":false},"1.4.4-1":{"name":"spike-player","version":"1.4.4-1","description":"Complete framework to facilitate music commands using discord.js v13 & v14","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","test":"jest test/test.js","clean":"rimraf dist","pre":"npm version prerelease --force && npm publish --access public --tag dev","prep":"npm run clean && npm run build","pub":"conventional-changelog -p angular -i CHANGELOG.md -s && npm publish"},"keywords":["music","player","bot","framework","discord","youtube","spotify","v13","v14"],"dependencies":{"@discordjs/opus":"^0.8.0","@discordjs/voice":"^0.11.0","@spikebot/discord-ytdl-core":"^1.0.4","@spikebot/ytdl-core":"^1.0.2","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.29.0","@typescript-eslint/parser":"^5.29.0","axios":"^0.27.2","axios-retry":"^3.2.0","domhandler":"^5.0.3","eslint":"^8.18.0","ffmpeg-static":"^5.0.2","htmlparser2":"^8.0.1","isomorphic-unfetch":"^3.1.0","jest":"^28.1.1","libsodium-wrappers":"^0.7.9","rimraf":"^3.0.2","soundcloud-scraper":"github:AnupKumarPanwar/soundcloud-scraper","spotify-url-info":"^3.1.2","youtubei":"^0.0.1-rc.34","ytsr":"^3.8.0"},"devDependencies":{"@babel/cli":"^7.14.8","@babel/core":"^7.15.0","@babel/preset-env":"^7.15.0","@babel/preset-typescript":"^7.15.0","@commitlint/cli":"^17.0.3","@rocketseat/commitlint-config":"^0.0.3","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.29.0","@typescript-eslint/parser":"^5.29.0","assert-diff":"^3.0.2","discord.js":"^14.0.2","discord.js-docgen":"github:discordjs/docgen#ts-patch","eslint":"^8.18.0","husky":"^8.0.0","jest":"^28.1.1","jsdoc-babel":"^0.5.0","ts-node":"^10.2.0","typescript":"^4.3.5"},"directories":{"doc":"docs","test":"test"},"engines":{"node":">=16.9.0"},"workspaces":["packages/*"],"packageManager":"npm@8.11.0","readme":"# Discord Music Player\r\n![npm](https://img.shields.io/npm/dt/discord-music-player?style=for-the-badge)\r\n![npm](https://img.shields.io/npm/v/discord-music-player?style=for-the-badge)\r\n![CodeFactor Grade](https://img.shields.io/codefactor/grade/github/SushiBtw/discord-music-player?color=%2348aaf1&style=for-the-badge)\r\n\r\n### Note: This is the v8 version of Discord Music Player for Discord.JS v13!\r\n\r\nDiscord Music Player is a powerful [Node.js](https://nodejs.org) module that allows you to easily implement music commands.\r\n**Everything** is customizable, and everything can be done using this package - **there are no limitations!**\r\n\r\nThis package supports YouTube Videos & Playlists, Spotify Songs & Playlists, Apple Music Songs & Playlists.\r\nPackage from version v7.0.0 is fully maintained by [SushiBtw](https://github.com/SushiBtw).\r\n\r\n### Requirements:\r\n- [Discord.js v13](https://www.npmjs.com/package/discord.js),\r\n- [Node.JS v16](https://nodejs.org/),\r\n\r\n# Installation\r\n*Node.JS v16 or newer is required to run this module.*\r\n```sh\r\nnpm install --save discord-music-player\r\n```\r\nInstall **@discordjs/opus**:\r\n```sh\r\nnpm install --save @discordjs/opus\r\n```\r\n**Install [FFMPEG](https://www.ffmpeg.org/download.html)!**\r\n\r\n# Documentation\r\n**Discord Music Player documentation: [https://discord-music-player.js.org/](https://discord-music-player.js.org/)**\r\n\r\n### **Need some help?**\r\nFeel free to join [Discord-Music-Player Discord Server](https://discord.gg/6fejZNsmFC) and ask us about DMP.\r\n\r\n# Getting Started\r\n**The code bellow, will show you how to use DMP in your code.**\r\n\r\n*Please define your **Player** after the **client/bot** definition.*\r\n\r\n[!] Remember to include the related voice **Intents** at the client options. [!]\r\n```js\r\nconst Discord = require(\"discord.js\");\r\nconst client = new Discord.Client({\r\n    intents: [Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES, Intents.FLAGS.GUILD_VOICE_STATES]\r\n});\r\nconst settings = {\r\n    prefix: '!',\r\n    token: 'YourBotTokenHere'\r\n};\r\n\r\nconst { Player } = require(\"discord-music-player\");\r\nconst player = new Player(client, {\r\n    leaveOnEmpty: false, // This options are optional.\r\n});\r\n// You can define the Player as *client.player* to easily access it.\r\nclient.player = player;\r\n\r\nclient.on(\"ready\", () => {\r\n    console.log(\"I am ready to Play with DMP 🎶\");\r\n});\r\n\r\nclient.login(settings.token);\r\n```\r\n\r\n# Example Usage\r\n```js\r\nconst { RepeatMode } = require('discord-music-player');\r\n\r\nclient.on('messageCreate', async (message) => {\r\n    const args = message.content.slice(settings.prefix.length).trim().split(/ +/g);\r\n    const command = args.shift();\r\n    let guildQueue = client.player.getQueue(message.guild.id);\r\n\r\n    if(command === 'play') {\r\n        let queue = client.player.createQueue(message.guild.id);\r\n        await queue.join(message.member.voice.channel);\r\n        let song = await queue.play(args.join(' ')).catch(_ => {\r\n            if(!guildQueue)\r\n                queue.stop();\r\n        });\r\n    }\r\n\r\n    if(command === 'playlist') {\r\n        let queue = client.player.createQueue(message.guild.id);\r\n        await queue.join(message.member.voice.channel);\r\n        let song = await queue.playlist(args.join(' ')).catch(_ => {\r\n            if(!guildQueue)\r\n                queue.stop();\r\n        });\r\n    }\r\n\r\n    if(command === 'skip') {\r\n        guildQueue.skip();\r\n    }\r\n\r\n    if(command === 'stop') {\r\n        guildQueue.stop();\r\n    }\r\n\r\n    if(command === 'removeLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.DISABLED); // or 0 instead of RepeatMode.DISABLED\r\n    }\r\n\r\n    if(command === 'toggleLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.SONG); // or 1 instead of RepeatMode.SONG\r\n    }\r\n\r\n    if(command === 'toggleQueueLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.QUEUE); // or 2 instead of RepeatMode.QUEUE\r\n    }\r\n\r\n    if(command === 'setVolume') {\r\n        guildQueue.setVolume(parseInt(args[0]));\r\n    }\r\n\r\n    if(command === 'seek') {\r\n        guildQueue.seek(parseInt(args[0]) * 1000);\r\n    }\r\n\r\n    if(command === 'clearQueue') {\r\n        guildQueue.clearQueue();\r\n    }\r\n\r\n    if(command === 'shuffle') {\r\n        guildQueue.shuffle();\r\n    }\r\n\r\n    if(command === 'getQueue') {\r\n        console.log(guildQueue);\r\n    }\r\n\r\n    if(command === 'getVolume') {\r\n        console.log(guildQueue.volume)\r\n    }\r\n\r\n    if(command === 'nowPlaying') {\r\n        console.log(`Now playing: ${guildQueue.nowPlaying}`);\r\n    }\r\n\r\n    if(command === 'pause') {\r\n        guildQueue.setPaused(true);\r\n    }\r\n\r\n    if(command === 'resume') {\r\n        guildQueue.setPaused(false);\r\n    }\r\n\r\n    if(command === 'remove') {\r\n        guildQueue.remove(parseInt(args[0]));\r\n    }\r\n\r\n    if(command === 'createProgressBar') {\r\n        const ProgressBar = guildQueue.createProgressBar();\r\n        \r\n        // [======>              ][00:35/2:20]\r\n        console.log(ProgressBar.prettier);\r\n    }\r\n})\r\n```\r\n\r\n### Events:\r\n```js\r\n// Init the event listener only once (at the top of your code).\r\nclient.player\r\n    // Emitted when channel was empty.\r\n    .on('channelEmpty',  (queue) =>\r\n        console.log(`Everyone left the Voice Channel, queue ended.`))\r\n    // Emitted when a song was added to the queue.\r\n    .on('songAdd',  (queue, song) =>\r\n        console.log(`Song ${song} was added to the queue.`))\r\n    // Emitted when a playlist was added to the queue.\r\n    .on('playlistAdd',  (queue, playlist) =>\r\n        console.log(`Playlist ${playlist} with ${playlist.songs.length} was added to the queue.`))\r\n    // Emitted when there was no more music to play.\r\n    .on('queueDestroyed',  (queue) =>\r\n        console.log(`The queue was destroyed.`))\r\n    // Emitted when the queue was destroyed (either by ending or stopping).    \r\n    .on('queueEnd',  (queue) =>\r\n        console.log(`The queue has ended.`))\r\n    // Emitted when a song changed.\r\n    .on('songChanged', (queue, newSong, oldSong) =>\r\n        console.log(`${newSong} is now playing.`))\r\n    // Emitted when a first song in the queue started playing.\r\n    .on('songFirst',  (queue, song) =>\r\n        console.log(`Started playing ${song}.`))\r\n    // Emitted when someone disconnected the bot from the channel.\r\n    .on('clientDisconnect', (queue) =>\r\n        console.log(`I was kicked from the Voice Channel, queue ended.`))\r\n    // Emitted when deafenOnJoin is true and the bot was undeafened\r\n    .on('clientUndeafen', (queue) =>\r\n        console.log(`I got undefeanded.`))\r\n    // Emitted when there was an error in runtime\r\n    .on('error', (error, queue) => {\r\n        console.log(`Error: ${error} in ${queue.guild.name}`);\r\n    });\r\n```\r\n\r\n# Passing custom data\r\n\r\n### Queue\r\nWhile running the `Queue#createQueue()` method you can pass a `options#data` object to hold custom data.\r\nThis can be made in two ways:\r\n```js\r\n// Pass custom data\r\nawait player.createQueue(message.guild.id, {\r\n    data: {\r\n        queueInitMessage: message,\r\n        myObject: 'this will stay with the queue :)',\r\n        more: 'add more... there are no limitations...'\r\n    }\r\n});\r\n// Or by using\r\nqueue.setData({\r\n    whatever: 'you want :D'\r\n});\r\n\r\n// Access custom data\r\nlet queue = player.getQueue(message.guild.id);\r\nlet initMessage = queue.data.queueInitMessage;\r\nawait initMessage.channel.send(`This message object is hold in Queue :D`);\r\n```\r\n\r\n### Song or Playlist\r\nWhile running the `Queue#play()`/Queue#playlist() method you can pass a `options#data` object to hold custom data.\r\nThis can be made in two ways:\r\n```js\r\n// Play the song\r\nlet song = await queue.play('Born in the USA!');\r\n// Set song data\r\nsong.setData({\r\n    initMessage: message\r\n});\r\n\r\n// Play the playlist\r\nlet playlist = await queue.playlist('https://www.youtube.com/playlist?list=PLDLGxnP4y2mGKGEqwxWTRkd3HtrrVTMdU');\r\n// Set playlist data (will set data for each song in the playlist)\r\nsong.setData({\r\n    initMessage: message\r\n});\r\n\r\n// Access custom data\r\nlet queue = player.getQueue(message.guild.id);\r\nlet { initMessage } = queue.nowPlaying.data;\r\nawait initMessage.channel.send(`This message object is hold in Song :D`);\r\n```\r\n","readmeFilename":"README.md","gitHead":"f6372cfbf530cf524b745e0822c6868609afdb8c","_id":"spike-player@1.4.4-1","_nodeVersion":"16.17.0","_npmVersion":"8.18.0","dist":{"integrity":"sha512-WAJrbpy04/Mo0oIVdom3XrA6RpFQRqIoNqfM0UxPUdKjid7RHXN+HUZwSH9okNUgSHr3ZRsjNr7Gxi8vopjioQ==","shasum":"ae00eab6c3d70d53bf125c2638e0f362bb23ea92","tarball":"https://registry.npmjs.org/spike-player/-/spike-player-1.4.4-1.tgz","fileCount":146,"unpackedSize":47028965,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCM84HpAfnKXAFGtiDbMnsa4EBugsyIFcJ4Qh7pDYFCKQIgCh/CmwYVT6Mqas8/2h4hEXQR9RQQpg54CNHYkpYFrHY="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjA67EACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo4gRAAoWsDag59QIjAXiWbOe6fM2WbDcbbfRPpnFawk5QQuQyshHKK\r\nh+VhWif8zVd4MjXOxXrB+GLdi9HY/G4Q8lHy4J1qoH5rYIdUvETNSrV+UveD\r\nrR3PqUY8MM89HLuS4HWiodN0+CQpzzNs3tgqWr/O3UkmupHwFsU109aMImuc\r\nAN9XqogEC+3PHpNpAtaQTO2Na3S+MH89XwaNwIB7CPhncGS2xWXMdVVrvJB6\r\nATcxIY1NryFvUAYK9t6+ugIWsJhHD8djCxxkQXRMmg+xeFFNnUfjo9+mLoRn\r\nrOcKl1rxoXRbqahYIDT33wT1F+jNAyXJD+OAHabLkai2VEKhkrPAKdTKb8Vs\r\nRFC/2cSaSzhVbqbQpLAHV1Y/BVc3QoMP1t8Uh7Vn/Wbe9qBsvttKrPD7/+g1\r\nqCacdHgvViTKrn/XB3CxpVV7OtMccPj/hCi5tzCbkhOT5LJb9AK1WEpdyhRM\r\nVV5OCXP+UESjBbyV3DgmvMyYbOV8lcV6bFTGWekKs8Mrs1DJj6YLDvFf3ogh\r\nXLK96zkry5VB9vyZwnqEYYxdDtW/mKKkqyF+YaKZL0KmERC0qxbMbhmC6mSG\r\npH6fGY7xwM2Oqu6Wdo0MqQE0rZeqX04Y8z0EQvs7dvkxHEt4khbtLJMEL0qw\r\nRvDkK9TWVZ2MDb68+zzJBRx0m3pWAe7snvE=\r\n=4MKW\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"spikebot","email":"abatallah1214@gmail.com"},"maintainers":[{"name":"spikebot","email":"abatallah1214@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spike-player_1.4.4-1_1661185732231_0.1265945077291215"},"_hasShrinkwrap":false},"1.4.4-2":{"name":"spike-player","version":"1.4.4-2","description":"Complete framework to facilitate music commands using discord.js v13 & v14","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","test":"jest test/test.js","clean":"rimraf dist","pre":"npm version prerelease --force && npm publish --access public --tag dev","prep":"npm run clean && npm run build","pub":"conventional-changelog -p angular -i CHANGELOG.md -s && npm publish"},"keywords":["music","player","bot","framework","discord","youtube","spotify","v13","v14"],"dependencies":{"@discordjs/opus":"^0.8.0","@discordjs/voice":"^0.11.0","@spikebot/discord-ytdl-core":"^1.0.4","@spikebot/ytdl-core":"^1.0.2","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.29.0","@typescript-eslint/parser":"^5.29.0","axios":"^0.27.2","axios-retry":"^3.2.0","domhandler":"^5.0.3","eslint":"^8.18.0","ffmpeg-static":"^5.0.2","htmlparser2":"^8.0.1","isomorphic-unfetch":"^3.1.0","jest":"^28.1.1","libsodium-wrappers":"^0.7.9","rimraf":"^3.0.2","soundcloud-scraper":"github:AnupKumarPanwar/soundcloud-scraper","spotify-url-info":"^3.1.7","youtubei":"^0.0.1-rc.34","ytsr":"^3.8.0"},"devDependencies":{"@babel/cli":"^7.14.8","@babel/core":"^7.15.0","@babel/preset-env":"^7.15.0","@babel/preset-typescript":"^7.15.0","@commitlint/cli":"^17.0.3","@rocketseat/commitlint-config":"^0.0.3","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.29.0","@typescript-eslint/parser":"^5.29.0","assert-diff":"^3.0.2","discord.js":"^14.0.2","discord.js-docgen":"github:discordjs/docgen#ts-patch","eslint":"^8.18.0","husky":"^8.0.0","jest":"^28.1.1","jsdoc-babel":"^0.5.0","ts-node":"^10.2.0","typescript":"^4.3.5"},"directories":{"doc":"docs","test":"test"},"engines":{"node":">=16.9.0"},"workspaces":["packages/*"],"packageManager":"npm@8.11.0","readme":"# Discord Music Player\r\n![npm](https://img.shields.io/npm/dt/discord-music-player?style=for-the-badge)\r\n![npm](https://img.shields.io/npm/v/discord-music-player?style=for-the-badge)\r\n![CodeFactor Grade](https://img.shields.io/codefactor/grade/github/SushiBtw/discord-music-player?color=%2348aaf1&style=for-the-badge)\r\n\r\n### Note: This is the v8 version of Discord Music Player for Discord.JS v13!\r\n\r\nDiscord Music Player is a powerful [Node.js](https://nodejs.org) module that allows you to easily implement music commands.\r\n**Everything** is customizable, and everything can be done using this package - **there are no limitations!**\r\n\r\nThis package supports YouTube Videos & Playlists, Spotify Songs & Playlists, Apple Music Songs & Playlists.\r\nPackage from version v7.0.0 is fully maintained by [SushiBtw](https://github.com/SushiBtw).\r\n\r\n### Requirements:\r\n- [Discord.js v13](https://www.npmjs.com/package/discord.js),\r\n- [Node.JS v16](https://nodejs.org/),\r\n\r\n# Installation\r\n*Node.JS v16 or newer is required to run this module.*\r\n```sh\r\nnpm install --save discord-music-player\r\n```\r\nInstall **@discordjs/opus**:\r\n```sh\r\nnpm install --save @discordjs/opus\r\n```\r\n**Install [FFMPEG](https://www.ffmpeg.org/download.html)!**\r\n\r\n# Documentation\r\n**Discord Music Player documentation: [https://discord-music-player.js.org/](https://discord-music-player.js.org/)**\r\n\r\n### **Need some help?**\r\nFeel free to join [Discord-Music-Player Discord Server](https://discord.gg/6fejZNsmFC) and ask us about DMP.\r\n\r\n# Getting Started\r\n**The code bellow, will show you how to use DMP in your code.**\r\n\r\n*Please define your **Player** after the **client/bot** definition.*\r\n\r\n[!] Remember to include the related voice **Intents** at the client options. [!]\r\n```js\r\nconst Discord = require(\"discord.js\");\r\nconst client = new Discord.Client({\r\n    intents: [Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES, Intents.FLAGS.GUILD_VOICE_STATES]\r\n});\r\nconst settings = {\r\n    prefix: '!',\r\n    token: 'YourBotTokenHere'\r\n};\r\n\r\nconst { Player } = require(\"discord-music-player\");\r\nconst player = new Player(client, {\r\n    leaveOnEmpty: false, // This options are optional.\r\n});\r\n// You can define the Player as *client.player* to easily access it.\r\nclient.player = player;\r\n\r\nclient.on(\"ready\", () => {\r\n    console.log(\"I am ready to Play with DMP 🎶\");\r\n});\r\n\r\nclient.login(settings.token);\r\n```\r\n\r\n# Example Usage\r\n```js\r\nconst { RepeatMode } = require('discord-music-player');\r\n\r\nclient.on('messageCreate', async (message) => {\r\n    const args = message.content.slice(settings.prefix.length).trim().split(/ +/g);\r\n    const command = args.shift();\r\n    let guildQueue = client.player.getQueue(message.guild.id);\r\n\r\n    if(command === 'play') {\r\n        let queue = client.player.createQueue(message.guild.id);\r\n        await queue.join(message.member.voice.channel);\r\n        let song = await queue.play(args.join(' ')).catch(_ => {\r\n            if(!guildQueue)\r\n                queue.stop();\r\n        });\r\n    }\r\n\r\n    if(command === 'playlist') {\r\n        let queue = client.player.createQueue(message.guild.id);\r\n        await queue.join(message.member.voice.channel);\r\n        let song = await queue.playlist(args.join(' ')).catch(_ => {\r\n            if(!guildQueue)\r\n                queue.stop();\r\n        });\r\n    }\r\n\r\n    if(command === 'skip') {\r\n        guildQueue.skip();\r\n    }\r\n\r\n    if(command === 'stop') {\r\n        guildQueue.stop();\r\n    }\r\n\r\n    if(command === 'removeLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.DISABLED); // or 0 instead of RepeatMode.DISABLED\r\n    }\r\n\r\n    if(command === 'toggleLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.SONG); // or 1 instead of RepeatMode.SONG\r\n    }\r\n\r\n    if(command === 'toggleQueueLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.QUEUE); // or 2 instead of RepeatMode.QUEUE\r\n    }\r\n\r\n    if(command === 'setVolume') {\r\n        guildQueue.setVolume(parseInt(args[0]));\r\n    }\r\n\r\n    if(command === 'seek') {\r\n        guildQueue.seek(parseInt(args[0]) * 1000);\r\n    }\r\n\r\n    if(command === 'clearQueue') {\r\n        guildQueue.clearQueue();\r\n    }\r\n\r\n    if(command === 'shuffle') {\r\n        guildQueue.shuffle();\r\n    }\r\n\r\n    if(command === 'getQueue') {\r\n        console.log(guildQueue);\r\n    }\r\n\r\n    if(command === 'getVolume') {\r\n        console.log(guildQueue.volume)\r\n    }\r\n\r\n    if(command === 'nowPlaying') {\r\n        console.log(`Now playing: ${guildQueue.nowPlaying}`);\r\n    }\r\n\r\n    if(command === 'pause') {\r\n        guildQueue.setPaused(true);\r\n    }\r\n\r\n    if(command === 'resume') {\r\n        guildQueue.setPaused(false);\r\n    }\r\n\r\n    if(command === 'remove') {\r\n        guildQueue.remove(parseInt(args[0]));\r\n    }\r\n\r\n    if(command === 'createProgressBar') {\r\n        const ProgressBar = guildQueue.createProgressBar();\r\n        \r\n        // [======>              ][00:35/2:20]\r\n        console.log(ProgressBar.prettier);\r\n    }\r\n})\r\n```\r\n\r\n### Events:\r\n```js\r\n// Init the event listener only once (at the top of your code).\r\nclient.player\r\n    // Emitted when channel was empty.\r\n    .on('channelEmpty',  (queue) =>\r\n        console.log(`Everyone left the Voice Channel, queue ended.`))\r\n    // Emitted when a song was added to the queue.\r\n    .on('songAdd',  (queue, song) =>\r\n        console.log(`Song ${song} was added to the queue.`))\r\n    // Emitted when a playlist was added to the queue.\r\n    .on('playlistAdd',  (queue, playlist) =>\r\n        console.log(`Playlist ${playlist} with ${playlist.songs.length} was added to the queue.`))\r\n    // Emitted when there was no more music to play.\r\n    .on('queueDestroyed',  (queue) =>\r\n        console.log(`The queue was destroyed.`))\r\n    // Emitted when the queue was destroyed (either by ending or stopping).    \r\n    .on('queueEnd',  (queue) =>\r\n        console.log(`The queue has ended.`))\r\n    // Emitted when a song changed.\r\n    .on('songChanged', (queue, newSong, oldSong) =>\r\n        console.log(`${newSong} is now playing.`))\r\n    // Emitted when a first song in the queue started playing.\r\n    .on('songFirst',  (queue, song) =>\r\n        console.log(`Started playing ${song}.`))\r\n    // Emitted when someone disconnected the bot from the channel.\r\n    .on('clientDisconnect', (queue) =>\r\n        console.log(`I was kicked from the Voice Channel, queue ended.`))\r\n    // Emitted when deafenOnJoin is true and the bot was undeafened\r\n    .on('clientUndeafen', (queue) =>\r\n        console.log(`I got undefeanded.`))\r\n    // Emitted when there was an error in runtime\r\n    .on('error', (error, queue) => {\r\n        console.log(`Error: ${error} in ${queue.guild.name}`);\r\n    });\r\n```\r\n\r\n# Passing custom data\r\n\r\n### Queue\r\nWhile running the `Queue#createQueue()` method you can pass a `options#data` object to hold custom data.\r\nThis can be made in two ways:\r\n```js\r\n// Pass custom data\r\nawait player.createQueue(message.guild.id, {\r\n    data: {\r\n        queueInitMessage: message,\r\n        myObject: 'this will stay with the queue :)',\r\n        more: 'add more... there are no limitations...'\r\n    }\r\n});\r\n// Or by using\r\nqueue.setData({\r\n    whatever: 'you want :D'\r\n});\r\n\r\n// Access custom data\r\nlet queue = player.getQueue(message.guild.id);\r\nlet initMessage = queue.data.queueInitMessage;\r\nawait initMessage.channel.send(`This message object is hold in Queue :D`);\r\n```\r\n\r\n### Song or Playlist\r\nWhile running the `Queue#play()`/Queue#playlist() method you can pass a `options#data` object to hold custom data.\r\nThis can be made in two ways:\r\n```js\r\n// Play the song\r\nlet song = await queue.play('Born in the USA!');\r\n// Set song data\r\nsong.setData({\r\n    initMessage: message\r\n});\r\n\r\n// Play the playlist\r\nlet playlist = await queue.playlist('https://www.youtube.com/playlist?list=PLDLGxnP4y2mGKGEqwxWTRkd3HtrrVTMdU');\r\n// Set playlist data (will set data for each song in the playlist)\r\nsong.setData({\r\n    initMessage: message\r\n});\r\n\r\n// Access custom data\r\nlet queue = player.getQueue(message.guild.id);\r\nlet { initMessage } = queue.nowPlaying.data;\r\nawait initMessage.channel.send(`This message object is hold in Song :D`);\r\n```\r\n","readmeFilename":"README.md","gitHead":"39ff48a50dcee14b4233542bc39d8271488f42f7","_id":"spike-player@1.4.4-2","_nodeVersion":"16.17.0","_npmVersion":"8.18.0","dist":{"integrity":"sha512-l9GPQ4vxvXeSF5+RyVF6ayX3UvP368eZ2DvAMrog4ea1BWM8sXnYSGjs/Ql+pZNXxFZVJ9f5xGTfUjpBymwFjA==","shasum":"28335ef7e9bd385fdf6fdc16ad998bddf554211f","tarball":"https://registry.npmjs.org/spike-player/-/spike-player-1.4.4-2.tgz","fileCount":146,"unpackedSize":47028965,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFCZb748/EdGQP5stkzCGYjo03dGKDDpnn7+6n9AEgoZAiEA+kA93fgHqTPjS/GizT+l4ZOGOPVoWXsfwBXom9dCqZg="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjFM/DACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmp3ZBAAm9Ss4j8tD3iw2Wre83R/GParCK9HRfH1fVAse4YqJ/FRFUm5\r\n5gPfAi3jdjbN12BjgCN11unqWa94zLMSoIaOX3+9xHzY731yk0cwjneerHEi\r\n1GbK1U5+77cwqHE6O4n39rjdqUtvResyG1rbeHVCwJfBp3RdFEVXNxar4dbx\r\ns8ZPwM4dSxfviJHdDUJdJygF3krmtUG3Jw+YHJTLgK/xuHvOlV+WH6h3SMD2\r\nSV9/ZrzhYQ9pNATfll7GHI15rXCKTsF7CtAiUEAdmOjUBmXnCBEom6KsBS+G\r\nqi2kDnm4saDYvCvywuQf5VvL1rwb8RsE4jgeCdjUffFqcqwH193nI1hG+uib\r\n1HM3h5CVK2+lwVEUP6aMt03pX8qPgFxWGE61ZlcCqNdz55peXHLMGY/gUX4H\r\n7+s05jHj0eWX8fhcN33XvuBzxlrqq2qKEMOMzl93Ma4cusS1xt11NfghVkLg\r\nCKm7ae+hrVNDZrFBaXCQDa7VlR0HCgj+ckwfHbDYT+AHvomYvAlkP4BLAI3z\r\nbVL+U1pRPDoyeKWoEZru5q1sfRRd+W/pKzlkqKv4adyXCpZceALz2K+w7AO3\r\nLZmLiJQkG0Hb1ff7IpJTIJvH8l+pvtXlNomD2xR7MwJtY+sa1evew6GxrPvj\r\n8oaI/Zz07y8EDKTgo4blcm0+kmcsDxZMwYA=\r\n=oZ7e\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"spikebot","email":"abatallah1214@gmail.com"},"maintainers":[{"name":"spikebot","email":"abatallah1214@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spike-player_1.4.4-2_1662308290608_0.2898002028092266"},"_hasShrinkwrap":false},"1.4.4":{"name":"spike-player","version":"1.4.4","description":"Complete framework to facilitate music commands using discord.js v13 & v14","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","test":"jest test/test.js","clean":"rimraf dist","pre":"npm version prerelease --force && npm publish --access public --tag dev","prep":"npm run clean && npm run build","pub":"conventional-changelog -p angular -i CHANGELOG.md -s && npm publish"},"keywords":["music","player","bot","framework","discord","youtube","spotify","v13","v14"],"dependencies":{"@discordjs/opus":"^0.8.0","@discordjs/voice":"^0.11.0","@spikebot/discord-ytdl-core":"^1.0.4","@spikebot/ytdl-core":"^1.0.2","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.29.0","@typescript-eslint/parser":"^5.29.0","axios":"^0.27.2","axios-retry":"^3.2.0","domhandler":"^5.0.3","eslint":"^8.18.0","ffmpeg-static":"^5.0.2","htmlparser2":"^8.0.1","isomorphic-unfetch":"^3.1.0","jest":"^28.1.1","libsodium-wrappers":"^0.7.9","rimraf":"^3.0.2","soundcloud-scraper":"github:AnupKumarPanwar/soundcloud-scraper","spotify-url-info":"^3.1.7","youtubei":"^0.0.1-rc.34","ytsr":"^3.8.0"},"devDependencies":{"@babel/cli":"^7.14.8","@babel/core":"^7.15.0","@babel/preset-env":"^7.15.0","@babel/preset-typescript":"^7.15.0","@commitlint/cli":"^17.0.3","@rocketseat/commitlint-config":"^0.0.3","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.29.0","@typescript-eslint/parser":"^5.29.0","assert-diff":"^3.0.2","discord.js":"^14.0.2","discord.js-docgen":"github:discordjs/docgen#ts-patch","eslint":"^8.18.0","husky":"^8.0.0","jest":"^28.1.1","jsdoc-babel":"^0.5.0","ts-node":"^10.2.0","typescript":"^4.3.5"},"directories":{"doc":"docs","test":"test"},"engines":{"node":">=16.9.0"},"workspaces":["packages/*"],"packageManager":"npm@8.11.0","gitHead":"62374465515cfde6ebbe809dc5a4b7c0b2674f30","_id":"spike-player@1.4.4","_nodeVersion":"16.17.0","_npmVersion":"8.18.0","dist":{"integrity":"sha512-7FCHezGfiRbBmhqnXK/tq5q+4O17r7cyvJf9wMKQq/HzJQ1fPFwhLMg7yWORmHtU5FKE05My5L3qfuknvhf9Fg==","shasum":"0157808b866da61597d1bdb9d7cf7329975993e3","tarball":"https://registry.npmjs.org/spike-player/-/spike-player-1.4.4.tgz","fileCount":134,"unpackedSize":46896888,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDHxCTvZMvMZteEFn4Wf2bYUkLivhITw/7+8A5PissQ5wIhANVPEczNNky7wWS8030XYcK5s/N1DcA7eDT02lAePKoE"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjFNa5ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmrf+Q//TKcbhf73v8rYMIQXicUrdypk3PF9SOSKBmd+K8adawSa9XJF\r\nXwPp97k19f2yVfQJJqZ5NfUIqWxlwV3jD1wPpww7py/Yu1BgF7RsSwwGa1dV\r\nIWXjfjSy+sZR0AiZXurqt4xi3CMiYacK6KqT8MD7KV53a6jel6nDU5RdWHVF\r\nTIZ7SX4v2/t4pvPYMP/dblKPfFqOSD/1plcuNCVpft2n6N1gHZiv9F73vaQ+\r\nPz4alWWkMb7YK2z1XDrdDfKcWae8H/ZohbLCcVJM5ADjpXKCh+J9SHSDVfME\r\nTPexhJ8nVZ+4cyH+q+a4l+PWgzyopZw8mmdr7tskNEf/RnYR3FRSWWZeuhdJ\r\ncBUYiwLiASPoJSKPF4hVycuxeKYK3xnV4s84w476KotvDx1PVgZS7alHr326\r\ncsKr/ES5T+JuG8+x0l/Wk4+F80qw9HI/9xEk6mWrWPRfjrxVqzbsCFM5o7Dz\r\nBB40XXKul03bTTYhO2UIO5TYkOoBubOeBwxv4cAZb6GEo+L58PMg8BXBGX5N\r\nfC653UnbltcBJavB+pqCCNGGlLBY4xFyEUzwxpDF9I0U95OqdHbjnNyRyOiw\r\nXCjRorHWAIYQbXd/LRp6Je7bavdnrt466pP3rF1yLFyVZ/kD9/Xes4iYZWqb\r\nuTZH+6yq9WYd9oTekyxPIYEKIPaeWHfaEjU=\r\n=aRlz\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"spikebot","email":"abatallah1214@gmail.com"},"maintainers":[{"name":"spikebot","email":"abatallah1214@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spike-player_1.4.4_1662310072732_0.16582629956675166"},"_hasShrinkwrap":false},"1.4.4-3":{"name":"spike-player","version":"1.4.4-3","description":"Complete framework to facilitate music commands using discord.js v13 & v14","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","test":"jest test/test.js","clean":"rimraf dist","pre":"npm version prerelease --force && npm publish --access public --tag dev","prep":"npm run clean && npm run build","pub":"conventional-changelog -p angular -i CHANGELOG.md -s && npm publish"},"keywords":["music","player","bot","framework","discord","youtube","spotify","v13","v14"],"dependencies":{"@discordjs/opus":"^0.8.0","@discordjs/voice":"^0.11.0","@spikebot/discord-ytdl-core":"^1.0.4","@spikebot/ytdl-core":"^1.0.2","@types/node":"^18.7.23","@typescript-eslint/eslint-plugin":"^5.38.1","@typescript-eslint/parser":"^5.38.1","axios":"^0.27.2","axios-retry":"^3.3.1","domhandler":"^5.0.3","eslint":"^8.24.0","ffmpeg-static":"^5.1.0","htmlparser2":"^8.0.1","isomorphic-unfetch":"^3.1.0","jest":"^29.1.2","libsodium-wrappers":"^0.7.10","rimraf":"^3.0.2","soundcloud-scraper":"github:AnupKumarPanwar/soundcloud-scraper","spotify-url-info":"^3.1.8","youtubei":"^1.0.0-rc.5","ytsr":"^3.8.0"},"devDependencies":{"@babel/cli":"^7.19.3","@babel/core":"^7.19.3","@babel/preset-env":"^7.19.3","@babel/preset-typescript":"^7.18.6","@commitlint/cli":"^17.1.2","@rocketseat/commitlint-config":"^0.0.3","@types/node":"^18.7.23","@typescript-eslint/eslint-plugin":"^5.38.1","@typescript-eslint/parser":"^5.38.1","assert-diff":"^3.0.2","discord.js":"^14.5.0","discord.js-docgen":"github:discordjs/docgen#ts-patch","eslint":"^8.24.0","husky":"^8.0.1","jest":"^29.1.2","jsdoc-babel":"^0.5.0","ts-node":"^10.9.1","typescript":"^4.8.4"},"directories":{"doc":"docs","test":"test"},"engines":{"node":">=16.9.0"},"workspaces":["packages/*"],"packageManager":"npm@8.11.0","readme":"# Discord Music Player\r\n![npm](https://img.shields.io/npm/dt/discord-music-player?style=for-the-badge)\r\n![npm](https://img.shields.io/npm/v/discord-music-player?style=for-the-badge)\r\n![CodeFactor Grade](https://img.shields.io/codefactor/grade/github/SushiBtw/discord-music-player?color=%2348aaf1&style=for-the-badge)\r\n\r\n### Note: This is the v8 version of Discord Music Player for Discord.JS v13!\r\n\r\nDiscord Music Player is a powerful [Node.js](https://nodejs.org) module that allows you to easily implement music commands.\r\n**Everything** is customizable, and everything can be done using this package - **there are no limitations!**\r\n\r\nThis package supports YouTube Videos & Playlists, Spotify Songs & Playlists, Apple Music Songs & Playlists.\r\nPackage from version v7.0.0 is fully maintained by [SushiBtw](https://github.com/SushiBtw).\r\n\r\n### Requirements:\r\n- [Discord.js v13](https://www.npmjs.com/package/discord.js),\r\n- [Node.JS v16](https://nodejs.org/),\r\n\r\n# Installation\r\n*Node.JS v16 or newer is required to run this module.*\r\n```sh\r\nnpm install --save discord-music-player\r\n```\r\nInstall **@discordjs/opus**:\r\n```sh\r\nnpm install --save @discordjs/opus\r\n```\r\n**Install [FFMPEG](https://www.ffmpeg.org/download.html)!**\r\n\r\n# Documentation\r\n**Discord Music Player documentation: [https://discord-music-player.js.org/](https://discord-music-player.js.org/)**\r\n\r\n### **Need some help?**\r\nFeel free to join [Discord-Music-Player Discord Server](https://discord.gg/6fejZNsmFC) and ask us about DMP.\r\n\r\n# Getting Started\r\n**The code bellow, will show you how to use DMP in your code.**\r\n\r\n*Please define your **Player** after the **client/bot** definition.*\r\n\r\n[!] Remember to include the related voice **Intents** at the client options. [!]\r\n```js\r\nconst Discord = require(\"discord.js\");\r\nconst client = new Discord.Client({\r\n    intents: [Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES, Intents.FLAGS.GUILD_VOICE_STATES]\r\n});\r\nconst settings = {\r\n    prefix: '!',\r\n    token: 'YourBotTokenHere'\r\n};\r\n\r\nconst { Player } = require(\"discord-music-player\");\r\nconst player = new Player(client, {\r\n    leaveOnEmpty: false, // This options are optional.\r\n});\r\n// You can define the Player as *client.player* to easily access it.\r\nclient.player = player;\r\n\r\nclient.on(\"ready\", () => {\r\n    console.log(\"I am ready to Play with DMP 🎶\");\r\n});\r\n\r\nclient.login(settings.token);\r\n```\r\n\r\n# Example Usage\r\n```js\r\nconst { RepeatMode } = require('discord-music-player');\r\n\r\nclient.on('messageCreate', async (message) => {\r\n    const args = message.content.slice(settings.prefix.length).trim().split(/ +/g);\r\n    const command = args.shift();\r\n    let guildQueue = client.player.getQueue(message.guild.id);\r\n\r\n    if(command === 'play') {\r\n        let queue = client.player.createQueue(message.guild.id);\r\n        await queue.join(message.member.voice.channel);\r\n        let song = await queue.play(args.join(' ')).catch(_ => {\r\n            if(!guildQueue)\r\n                queue.stop();\r\n        });\r\n    }\r\n\r\n    if(command === 'playlist') {\r\n        let queue = client.player.createQueue(message.guild.id);\r\n        await queue.join(message.member.voice.channel);\r\n        let song = await queue.playlist(args.join(' ')).catch(_ => {\r\n            if(!guildQueue)\r\n                queue.stop();\r\n        });\r\n    }\r\n\r\n    if(command === 'skip') {\r\n        guildQueue.skip();\r\n    }\r\n\r\n    if(command === 'stop') {\r\n        guildQueue.stop();\r\n    }\r\n\r\n    if(command === 'removeLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.DISABLED); // or 0 instead of RepeatMode.DISABLED\r\n    }\r\n\r\n    if(command === 'toggleLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.SONG); // or 1 instead of RepeatMode.SONG\r\n    }\r\n\r\n    if(command === 'toggleQueueLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.QUEUE); // or 2 instead of RepeatMode.QUEUE\r\n    }\r\n\r\n    if(command === 'setVolume') {\r\n        guildQueue.setVolume(parseInt(args[0]));\r\n    }\r\n\r\n    if(command === 'seek') {\r\n        guildQueue.seek(parseInt(args[0]) * 1000);\r\n    }\r\n\r\n    if(command === 'clearQueue') {\r\n        guildQueue.clearQueue();\r\n    }\r\n\r\n    if(command === 'shuffle') {\r\n        guildQueue.shuffle();\r\n    }\r\n\r\n    if(command === 'getQueue') {\r\n        console.log(guildQueue);\r\n    }\r\n\r\n    if(command === 'getVolume') {\r\n        console.log(guildQueue.volume)\r\n    }\r\n\r\n    if(command === 'nowPlaying') {\r\n        console.log(`Now playing: ${guildQueue.nowPlaying}`);\r\n    }\r\n\r\n    if(command === 'pause') {\r\n        guildQueue.setPaused(true);\r\n    }\r\n\r\n    if(command === 'resume') {\r\n        guildQueue.setPaused(false);\r\n    }\r\n\r\n    if(command === 'remove') {\r\n        guildQueue.remove(parseInt(args[0]));\r\n    }\r\n\r\n    if(command === 'createProgressBar') {\r\n        const ProgressBar = guildQueue.createProgressBar();\r\n        \r\n        // [======>              ][00:35/2:20]\r\n        console.log(ProgressBar.prettier);\r\n    }\r\n})\r\n```\r\n\r\n### Events:\r\n```js\r\n// Init the event listener only once (at the top of your code).\r\nclient.player\r\n    // Emitted when channel was empty.\r\n    .on('channelEmpty',  (queue) =>\r\n        console.log(`Everyone left the Voice Channel, queue ended.`))\r\n    // Emitted when a song was added to the queue.\r\n    .on('songAdd',  (queue, song) =>\r\n        console.log(`Song ${song} was added to the queue.`))\r\n    // Emitted when a playlist was added to the queue.\r\n    .on('playlistAdd',  (queue, playlist) =>\r\n        console.log(`Playlist ${playlist} with ${playlist.songs.length} was added to the queue.`))\r\n    // Emitted when there was no more music to play.\r\n    .on('queueDestroyed',  (queue) =>\r\n        console.log(`The queue was destroyed.`))\r\n    // Emitted when the queue was destroyed (either by ending or stopping).    \r\n    .on('queueEnd',  (queue) =>\r\n        console.log(`The queue has ended.`))\r\n    // Emitted when a song changed.\r\n    .on('songChanged', (queue, newSong, oldSong) =>\r\n        console.log(`${newSong} is now playing.`))\r\n    // Emitted when a first song in the queue started playing.\r\n    .on('songFirst',  (queue, song) =>\r\n        console.log(`Started playing ${song}.`))\r\n    // Emitted when someone disconnected the bot from the channel.\r\n    .on('clientDisconnect', (queue) =>\r\n        console.log(`I was kicked from the Voice Channel, queue ended.`))\r\n    // Emitted when deafenOnJoin is true and the bot was undeafened\r\n    .on('clientUndeafen', (queue) =>\r\n        console.log(`I got undefeanded.`))\r\n    // Emitted when there was an error in runtime\r\n    .on('error', (error, queue) => {\r\n        console.log(`Error: ${error} in ${queue.guild.name}`);\r\n    });\r\n```\r\n\r\n# Passing custom data\r\n\r\n### Queue\r\nWhile running the `Queue#createQueue()` method you can pass a `options#data` object to hold custom data.\r\nThis can be made in two ways:\r\n```js\r\n// Pass custom data\r\nawait player.createQueue(message.guild.id, {\r\n    data: {\r\n        queueInitMessage: message,\r\n        myObject: 'this will stay with the queue :)',\r\n        more: 'add more... there are no limitations...'\r\n    }\r\n});\r\n// Or by using\r\nqueue.setData({\r\n    whatever: 'you want :D'\r\n});\r\n\r\n// Access custom data\r\nlet queue = player.getQueue(message.guild.id);\r\nlet initMessage = queue.data.queueInitMessage;\r\nawait initMessage.channel.send(`This message object is hold in Queue :D`);\r\n```\r\n\r\n### Song or Playlist\r\nWhile running the `Queue#play()`/Queue#playlist() method you can pass a `options#data` object to hold custom data.\r\nThis can be made in two ways:\r\n```js\r\n// Play the song\r\nlet song = await queue.play('Born in the USA!');\r\n// Set song data\r\nsong.setData({\r\n    initMessage: message\r\n});\r\n\r\n// Play the playlist\r\nlet playlist = await queue.playlist('https://www.youtube.com/playlist?list=PLDLGxnP4y2mGKGEqwxWTRkd3HtrrVTMdU');\r\n// Set playlist data (will set data for each song in the playlist)\r\nsong.setData({\r\n    initMessage: message\r\n});\r\n\r\n// Access custom data\r\nlet queue = player.getQueue(message.guild.id);\r\nlet { initMessage } = queue.nowPlaying.data;\r\nawait initMessage.channel.send(`This message object is hold in Song :D`);\r\n```\r\n","readmeFilename":"README.md","gitHead":"cba166878a9693f1093d0e039d74eb2f48f93c93","_id":"spike-player@1.4.4-3","_nodeVersion":"16.17.0","_npmVersion":"8.18.0","dist":{"integrity":"sha512-Q9IdSbvoSCJMcHRjqhCGUsIeL2LV3N57xIV57G3S4+X9qWMgUMpLfVf/LjEJzSkM/JRx3zwbkjjTdyd/UoIw7w==","shasum":"b9918c0e0d533f332bcd755cc020065d833834b2","tarball":"https://registry.npmjs.org/spike-player/-/spike-player-1.4.4-3.tgz","fileCount":30,"unpackedSize":106069,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGgvCC0itnxly44iVQGCcSB7Ua+ggoZtwDGTvCm14BDWAiEApy0zrD/3AayWZeHCpxRFEwEE+Pc7jjvL8a4Tk4GSWCU="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjN/X0ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqMBA/7BR4xqqGq46PpljQ39FxkwhOPcMbsgb2UVmJDAJJyDvirGDz8\r\nVK+tbqq+auPIwqkoBuPJgkNgVuG0l7dAQ7mBj6uX3RZttDjHXc3zdRLyZB/g\r\ngDwaaRwhH4iYSlfLulfSIlIm0VMPKQ3BNRMzF76jqWehkrI6gKr3aIh+Y9wi\r\nMu5m9hGbwpg6HF5OKGTsp8RhqY03FjnshEFiI+wVDrfIVq6X3b/x8WsCuCIX\r\n07NJjH1Zy4TKJJUaXScZkL2MSkDuFowZ44e5SSSR5Ic462HG2l3oMVaCMeEf\r\n7RldJZMT27tBV97NQRtuy2cRC3gMGx50i8IiZ6HiFW2y3dHGmadB9hlKX+bO\r\nndjl3vhBrUndVQXG4h9OwpRnO2DIcsQerpOvwPp8k07Plr9ttffX8vTvBM/q\r\n9Ye4tZGdyELF03A0x3yo1NYF2+PgoqH7VNRbtev5ECtC/yOBRZD+EgCdIx84\r\nMlz0fgvjhiMTFB2GBErf4mTUvz4IwRIVkPYwtPmVcV0SHIVYlYrNO8cTlO8v\r\nW2xNTP0szDdnIAqCvrGRaMgxl9Yin8j3KT+F889OwpJVtB0Z7ZOom0Q2Cz9I\r\nHZXOVYKO15f0PmOlNU6TA12YPDNcYjittE8bVJRwPFwNWdTUQJEXcBCrDoa/\r\nJpYElGgesLnciBBhe2SIgV6Dbvudd+HNgU8=\r\n=/XSi\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"spikebot","email":"abatallah1214@gmail.com"},"maintainers":[{"name":"spikebot","email":"abatallah1214@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spike-player_1.4.4-3_1664611828392_0.015253686072098205"},"_hasShrinkwrap":false},"1.4.4-4":{"name":"spike-player","version":"1.4.4-4","description":"Complete framework to facilitate music commands using discord.js v13 & v14","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","test":"jest test/test.js","clean":"rimraf dist","pre":"npm version prerelease --force && npm publish --access public --tag dev","prep":"npm run clean && npm run build","pub":"conventional-changelog -p angular -i CHANGELOG.md -s && npm publish"},"keywords":["music","player","bot","framework","discord","youtube","spotify","v13","v14"],"dependencies":{"@discordjs/opus":"^0.8.0","@discordjs/voice":"^0.11.0","@spikebot/discord-ytdl-core":"^1.0.4","@spikebot/ytdl-core":"^1.0.2","@types/node":"^18.7.23","@typescript-eslint/eslint-plugin":"^5.38.1","@typescript-eslint/parser":"^5.38.1","axios":"^0.27.2","axios-retry":"^3.3.1","domhandler":"^5.0.3","eslint":"^8.24.0","ffmpeg-static":"^5.1.0","htmlparser2":"^8.0.1","isomorphic-unfetch":"^3.1.0","jest":"^29.1.2","libsodium-wrappers":"^0.7.10","rimraf":"^3.0.2","soundcloud-scraper":"github:AnupKumarPanwar/soundcloud-scraper","spotify-url-info":"^3.1.8","youtubei":"^1.0.0-rc.5","ytsr":"^3.8.0"},"devDependencies":{"@babel/cli":"^7.19.3","@babel/core":"^7.19.3","@babel/preset-env":"^7.19.3","@babel/preset-typescript":"^7.18.6","@commitlint/cli":"^17.1.2","@rocketseat/commitlint-config":"^0.0.3","@types/node":"^18.7.23","@typescript-eslint/eslint-plugin":"^5.38.1","@typescript-eslint/parser":"^5.38.1","assert-diff":"^3.0.2","discord.js":"^14.5.0","discord.js-docgen":"github:discordjs/docgen#ts-patch","eslint":"^8.24.0","husky":"^8.0.1","jest":"^29.1.2","jsdoc-babel":"^0.5.0","ts-node":"^10.9.1","typescript":"^4.8.4"},"directories":{"doc":"docs","test":"test"},"engines":{"node":">=16.9.0"},"workspaces":["packages/*"],"packageManager":"npm@8.11.0","readme":"# Discord Music Player\r\n![npm](https://img.shields.io/npm/dt/discord-music-player?style=for-the-badge)\r\n![npm](https://img.shields.io/npm/v/discord-music-player?style=for-the-badge)\r\n![CodeFactor Grade](https://img.shields.io/codefactor/grade/github/SushiBtw/discord-music-player?color=%2348aaf1&style=for-the-badge)\r\n\r\n### Note: This is the v8 version of Discord Music Player for Discord.JS v13!\r\n\r\nDiscord Music Player is a powerful [Node.js](https://nodejs.org) module that allows you to easily implement music commands.\r\n**Everything** is customizable, and everything can be done using this package - **there are no limitations!**\r\n\r\nThis package supports YouTube Videos & Playlists, Spotify Songs & Playlists, Apple Music Songs & Playlists.\r\nPackage from version v7.0.0 is fully maintained by [SushiBtw](https://github.com/SushiBtw).\r\n\r\n### Requirements:\r\n- [Discord.js v13](https://www.npmjs.com/package/discord.js),\r\n- [Node.JS v16](https://nodejs.org/),\r\n\r\n# Installation\r\n*Node.JS v16 or newer is required to run this module.*\r\n```sh\r\nnpm install --save discord-music-player\r\n```\r\nInstall **@discordjs/opus**:\r\n```sh\r\nnpm install --save @discordjs/opus\r\n```\r\n**Install [FFMPEG](https://www.ffmpeg.org/download.html)!**\r\n\r\n# Documentation\r\n**Discord Music Player documentation: [https://discord-music-player.js.org/](https://discord-music-player.js.org/)**\r\n\r\n### **Need some help?**\r\nFeel free to join [Discord-Music-Player Discord Server](https://discord.gg/6fejZNsmFC) and ask us about DMP.\r\n\r\n# Getting Started\r\n**The code bellow, will show you how to use DMP in your code.**\r\n\r\n*Please define your **Player** after the **client/bot** definition.*\r\n\r\n[!] Remember to include the related voice **Intents** at the client options. [!]\r\n```js\r\nconst Discord = require(\"discord.js\");\r\nconst client = new Discord.Client({\r\n    intents: [Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES, Intents.FLAGS.GUILD_VOICE_STATES]\r\n});\r\nconst settings = {\r\n    prefix: '!',\r\n    token: 'YourBotTokenHere'\r\n};\r\n\r\nconst { Player } = require(\"discord-music-player\");\r\nconst player = new Player(client, {\r\n    leaveOnEmpty: false, // This options are optional.\r\n});\r\n// You can define the Player as *client.player* to easily access it.\r\nclient.player = player;\r\n\r\nclient.on(\"ready\", () => {\r\n    console.log(\"I am ready to Play with DMP 🎶\");\r\n});\r\n\r\nclient.login(settings.token);\r\n```\r\n\r\n# Example Usage\r\n```js\r\nconst { RepeatMode } = require('discord-music-player');\r\n\r\nclient.on('messageCreate', async (message) => {\r\n    const args = message.content.slice(settings.prefix.length).trim().split(/ +/g);\r\n    const command = args.shift();\r\n    let guildQueue = client.player.getQueue(message.guild.id);\r\n\r\n    if(command === 'play') {\r\n        let queue = client.player.createQueue(message.guild.id);\r\n        await queue.join(message.member.voice.channel);\r\n        let song = await queue.play(args.join(' ')).catch(_ => {\r\n            if(!guildQueue)\r\n                queue.stop();\r\n        });\r\n    }\r\n\r\n    if(command === 'playlist') {\r\n        let queue = client.player.createQueue(message.guild.id);\r\n        await queue.join(message.member.voice.channel);\r\n        let song = await queue.playlist(args.join(' ')).catch(_ => {\r\n            if(!guildQueue)\r\n                queue.stop();\r\n        });\r\n    }\r\n\r\n    if(command === 'skip') {\r\n        guildQueue.skip();\r\n    }\r\n\r\n    if(command === 'stop') {\r\n        guildQueue.stop();\r\n    }\r\n\r\n    if(command === 'removeLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.DISABLED); // or 0 instead of RepeatMode.DISABLED\r\n    }\r\n\r\n    if(command === 'toggleLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.SONG); // or 1 instead of RepeatMode.SONG\r\n    }\r\n\r\n    if(command === 'toggleQueueLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.QUEUE); // or 2 instead of RepeatMode.QUEUE\r\n    }\r\n\r\n    if(command === 'setVolume') {\r\n        guildQueue.setVolume(parseInt(args[0]));\r\n    }\r\n\r\n    if(command === 'seek') {\r\n        guildQueue.seek(parseInt(args[0]) * 1000);\r\n    }\r\n\r\n    if(command === 'clearQueue') {\r\n        guildQueue.clearQueue();\r\n    }\r\n\r\n    if(command === 'shuffle') {\r\n        guildQueue.shuffle();\r\n    }\r\n\r\n    if(command === 'getQueue') {\r\n        console.log(guildQueue);\r\n    }\r\n\r\n    if(command === 'getVolume') {\r\n        console.log(guildQueue.volume)\r\n    }\r\n\r\n    if(command === 'nowPlaying') {\r\n        console.log(`Now playing: ${guildQueue.nowPlaying}`);\r\n    }\r\n\r\n    if(command === 'pause') {\r\n        guildQueue.setPaused(true);\r\n    }\r\n\r\n    if(command === 'resume') {\r\n        guildQueue.setPaused(false);\r\n    }\r\n\r\n    if(command === 'remove') {\r\n        guildQueue.remove(parseInt(args[0]));\r\n    }\r\n\r\n    if(command === 'createProgressBar') {\r\n        const ProgressBar = guildQueue.createProgressBar();\r\n        \r\n        // [======>              ][00:35/2:20]\r\n        console.log(ProgressBar.prettier);\r\n    }\r\n})\r\n```\r\n\r\n### Events:\r\n```js\r\n// Init the event listener only once (at the top of your code).\r\nclient.player\r\n    // Emitted when channel was empty.\r\n    .on('channelEmpty',  (queue) =>\r\n        console.log(`Everyone left the Voice Channel, queue ended.`))\r\n    // Emitted when a song was added to the queue.\r\n    .on('songAdd',  (queue, song) =>\r\n        console.log(`Song ${song} was added to the queue.`))\r\n    // Emitted when a playlist was added to the queue.\r\n    .on('playlistAdd',  (queue, playlist) =>\r\n        console.log(`Playlist ${playlist} with ${playlist.songs.length} was added to the queue.`))\r\n    // Emitted when there was no more music to play.\r\n    .on('queueDestroyed',  (queue) =>\r\n        console.log(`The queue was destroyed.`))\r\n    // Emitted when the queue was destroyed (either by ending or stopping).    \r\n    .on('queueEnd',  (queue) =>\r\n        console.log(`The queue has ended.`))\r\n    // Emitted when a song changed.\r\n    .on('songChanged', (queue, newSong, oldSong) =>\r\n        console.log(`${newSong} is now playing.`))\r\n    // Emitted when a first song in the queue started playing.\r\n    .on('songFirst',  (queue, song) =>\r\n        console.log(`Started playing ${song}.`))\r\n    // Emitted when someone disconnected the bot from the channel.\r\n    .on('clientDisconnect', (queue) =>\r\n        console.log(`I was kicked from the Voice Channel, queue ended.`))\r\n    // Emitted when deafenOnJoin is true and the bot was undeafened\r\n    .on('clientUndeafen', (queue) =>\r\n        console.log(`I got undefeanded.`))\r\n    // Emitted when there was an error in runtime\r\n    .on('error', (error, queue) => {\r\n        console.log(`Error: ${error} in ${queue.guild.name}`);\r\n    });\r\n```\r\n\r\n# Passing custom data\r\n\r\n### Queue\r\nWhile running the `Queue#createQueue()` method you can pass a `options#data` object to hold custom data.\r\nThis can be made in two ways:\r\n```js\r\n// Pass custom data\r\nawait player.createQueue(message.guild.id, {\r\n    data: {\r\n        queueInitMessage: message,\r\n        myObject: 'this will stay with the queue :)',\r\n        more: 'add more... there are no limitations...'\r\n    }\r\n});\r\n// Or by using\r\nqueue.setData({\r\n    whatever: 'you want :D'\r\n});\r\n\r\n// Access custom data\r\nlet queue = player.getQueue(message.guild.id);\r\nlet initMessage = queue.data.queueInitMessage;\r\nawait initMessage.channel.send(`This message object is hold in Queue :D`);\r\n```\r\n\r\n### Song or Playlist\r\nWhile running the `Queue#play()`/Queue#playlist() method you can pass a `options#data` object to hold custom data.\r\nThis can be made in two ways:\r\n```js\r\n// Play the song\r\nlet song = await queue.play('Born in the USA!');\r\n// Set song data\r\nsong.setData({\r\n    initMessage: message\r\n});\r\n\r\n// Play the playlist\r\nlet playlist = await queue.playlist('https://www.youtube.com/playlist?list=PLDLGxnP4y2mGKGEqwxWTRkd3HtrrVTMdU');\r\n// Set playlist data (will set data for each song in the playlist)\r\nsong.setData({\r\n    initMessage: message\r\n});\r\n\r\n// Access custom data\r\nlet queue = player.getQueue(message.guild.id);\r\nlet { initMessage } = queue.nowPlaying.data;\r\nawait initMessage.channel.send(`This message object is hold in Song :D`);\r\n```\r\n","readmeFilename":"README.md","gitHead":"1b59674e83eccb0a2968263e1043d7a2a29238cb","_id":"spike-player@1.4.4-4","_nodeVersion":"16.17.0","_npmVersion":"8.18.0","dist":{"integrity":"sha512-tVCRnI2+ZYX8loJ73EpxPkrIEFTscV6se1e0m7ZU1ZrpxirhLqNHvaBRPgRK/0J8dm1hKj5NUZZ/gLEklxuEhQ==","shasum":"d8c4cf01725a126c0fe3900e742c5093b56852f0","tarball":"https://registry.npmjs.org/spike-player/-/spike-player-1.4.4-4.tgz","fileCount":30,"unpackedSize":106105,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDDEh09Cjs6hfG/1msU93wMa3L1lmpAPoxxrOUKGS5+GAiBgT23C+S/8DkHNFBfZv1ZuMH1+g4rx7C8nN0mWpx2NvQ=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjN/deACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmpvbg/+LNbhH9+hl67knTGc6m/uCtEKMlBUCRUNRABrsAObCuiIKGM3\r\nETazTzLUVVzN++l3a1JfsnhcKoDJzE/uCTWPs9Hk5Fa4NZdpVlYJHS8zfhVv\r\nz3PWINkfjAj9kjH3RcjjUDfY+1UX90q0J4NsM9xMnMqdqbFiVzkbpzkwGLMO\r\n7hvzg61m2/QZ4FNMFFvZ4UPM5DL0blbggHILz8e/fOm7/JV6rp2Q5yEn4Xnh\r\nSpO5fzTllyiSIaKvDYvOyV7UMY9fhFBas+0ndmBxPqhpds435/OAwSzU0gUh\r\nO3nKpe9BHtUkpkLblin4Liab90SgOfcXvff8GcWZDStpUGuyVSROLaQ6kHxz\r\ne4zKLzAnGEItj6OxgvNfRgB58GuNCNlk/ecVtzc2jKoOMG25r7n+jks1sR14\r\nk5CcVwmMcVEpPJQMBrasV5/iL5UbHZQN8iU5zsndjgjgLQI/pimBOgannUja\r\niOlTIiJaXUeNMdXnNyTW9d3BdQ5plshBUgk9fjZIODl5oS52Sr99b3LCivKP\r\n71LneRZjeFHVbTRkX9gXt71k/sHpi8tzQ73dHM2DgNcZr+O5zM3MLEHFlYH0\r\nNrZn66qfzmz0H+Caayawtnx3defrRXbVz8XWxmZae3KSK5q2rOPkF5Bti+ow\r\nrSfEuXNZrx9W0cpNWBBgcwxUhozQ8srekcA=\r\n=Z/Xh\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"spikebot","email":"abatallah1214@gmail.com"},"maintainers":[{"name":"spikebot","email":"abatallah1214@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spike-player_1.4.4-4_1664612190690_0.22698689842116337"},"_hasShrinkwrap":false},"1.4.4-5":{"name":"spike-player","version":"1.4.4-5","description":"Complete framework to facilitate music commands using discord.js v13 & v14","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","test":"jest test/test.js","clean":"rimraf dist","pre":"npm version prerelease --force && npm publish --access public --tag dev","prep":"npm run clean && npm run build","pub":"conventional-changelog -p angular -i CHANGELOG.md -s && npm publish"},"keywords":["music","player","bot","framework","discord","youtube","spotify","v13","v14"],"dependencies":{"@discordjs/opus":"^0.8.0","@discordjs/voice":"^0.11.0","@spikebot/discord-ytdl-core":"^1.0.4","@spikebot/ytdl-core":"^1.0.2","@types/node":"^18.7.23","@typescript-eslint/eslint-plugin":"^5.38.1","@typescript-eslint/parser":"^5.38.1","axios":"^0.27.2","axios-retry":"^3.3.1","domhandler":"^5.0.3","eslint":"^8.24.0","ffmpeg-static":"^5.1.0","htmlparser2":"^8.0.1","isomorphic-unfetch":"^3.1.0","jest":"^29.1.2","libsodium-wrappers":"^0.7.10","rimraf":"^3.0.2","soundcloud-scraper":"github:AnupKumarPanwar/soundcloud-scraper","spotify-url-info":"^3.1.8","youtubei":"^1.0.0-rc.5","ytsr":"^3.8.0"},"devDependencies":{"@babel/cli":"^7.19.3","@babel/core":"^7.19.3","@babel/preset-env":"^7.19.3","@babel/preset-typescript":"^7.18.6","@commitlint/cli":"^17.1.2","@rocketseat/commitlint-config":"^0.0.3","@types/node":"^18.7.23","@typescript-eslint/eslint-plugin":"^5.38.1","@typescript-eslint/parser":"^5.38.1","assert-diff":"^3.0.2","discord.js":"^14.5.0","discord.js-docgen":"github:discordjs/docgen#ts-patch","eslint":"^8.24.0","husky":"^8.0.1","jest":"^29.1.2","jsdoc-babel":"^0.5.0","ts-node":"^10.9.1","typescript":"^4.8.4"},"directories":{"doc":"docs","test":"test"},"engines":{"node":">=16.9.0"},"workspaces":["packages/*"],"packageManager":"npm@8.11.0","readme":"# Discord Music Player\r\n![npm](https://img.shields.io/npm/dt/discord-music-player?style=for-the-badge)\r\n![npm](https://img.shields.io/npm/v/discord-music-player?style=for-the-badge)\r\n![CodeFactor Grade](https://img.shields.io/codefactor/grade/github/SushiBtw/discord-music-player?color=%2348aaf1&style=for-the-badge)\r\n\r\n### Note: This is the v8 version of Discord Music Player for Discord.JS v13!\r\n\r\nDiscord Music Player is a powerful [Node.js](https://nodejs.org) module that allows you to easily implement music commands.\r\n**Everything** is customizable, and everything can be done using this package - **there are no limitations!**\r\n\r\nThis package supports YouTube Videos & Playlists, Spotify Songs & Playlists, Apple Music Songs & Playlists.\r\nPackage from version v7.0.0 is fully maintained by [SushiBtw](https://github.com/SushiBtw).\r\n\r\n### Requirements:\r\n- [Discord.js v13](https://www.npmjs.com/package/discord.js),\r\n- [Node.JS v16](https://nodejs.org/),\r\n\r\n# Installation\r\n*Node.JS v16 or newer is required to run this module.*\r\n```sh\r\nnpm install --save discord-music-player\r\n```\r\nInstall **@discordjs/opus**:\r\n```sh\r\nnpm install --save @discordjs/opus\r\n```\r\n**Install [FFMPEG](https://www.ffmpeg.org/download.html)!**\r\n\r\n# Documentation\r\n**Discord Music Player documentation: [https://discord-music-player.js.org/](https://discord-music-player.js.org/)**\r\n\r\n### **Need some help?**\r\nFeel free to join [Discord-Music-Player Discord Server](https://discord.gg/6fejZNsmFC) and ask us about DMP.\r\n\r\n# Getting Started\r\n**The code bellow, will show you how to use DMP in your code.**\r\n\r\n*Please define your **Player** after the **client/bot** definition.*\r\n\r\n[!] Remember to include the related voice **Intents** at the client options. [!]\r\n```js\r\nconst Discord = require(\"discord.js\");\r\nconst client = new Discord.Client({\r\n    intents: [Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES, Intents.FLAGS.GUILD_VOICE_STATES]\r\n});\r\nconst settings = {\r\n    prefix: '!',\r\n    token: 'YourBotTokenHere'\r\n};\r\n\r\nconst { Player } = require(\"discord-music-player\");\r\nconst player = new Player(client, {\r\n    leaveOnEmpty: false, // This options are optional.\r\n});\r\n// You can define the Player as *client.player* to easily access it.\r\nclient.player = player;\r\n\r\nclient.on(\"ready\", () => {\r\n    console.log(\"I am ready to Play with DMP 🎶\");\r\n});\r\n\r\nclient.login(settings.token);\r\n```\r\n\r\n# Example Usage\r\n```js\r\nconst { RepeatMode } = require('discord-music-player');\r\n\r\nclient.on('messageCreate', async (message) => {\r\n    const args = message.content.slice(settings.prefix.length).trim().split(/ +/g);\r\n    const command = args.shift();\r\n    let guildQueue = client.player.getQueue(message.guild.id);\r\n\r\n    if(command === 'play') {\r\n        let queue = client.player.createQueue(message.guild.id);\r\n        await queue.join(message.member.voice.channel);\r\n        let song = await queue.play(args.join(' ')).catch(_ => {\r\n            if(!guildQueue)\r\n                queue.stop();\r\n        });\r\n    }\r\n\r\n    if(command === 'playlist') {\r\n        let queue = client.player.createQueue(message.guild.id);\r\n        await queue.join(message.member.voice.channel);\r\n        let song = await queue.playlist(args.join(' ')).catch(_ => {\r\n            if(!guildQueue)\r\n                queue.stop();\r\n        });\r\n    }\r\n\r\n    if(command === 'skip') {\r\n        guildQueue.skip();\r\n    }\r\n\r\n    if(command === 'stop') {\r\n        guildQueue.stop();\r\n    }\r\n\r\n    if(command === 'removeLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.DISABLED); // or 0 instead of RepeatMode.DISABLED\r\n    }\r\n\r\n    if(command === 'toggleLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.SONG); // or 1 instead of RepeatMode.SONG\r\n    }\r\n\r\n    if(command === 'toggleQueueLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.QUEUE); // or 2 instead of RepeatMode.QUEUE\r\n    }\r\n\r\n    if(command === 'setVolume') {\r\n        guildQueue.setVolume(parseInt(args[0]));\r\n    }\r\n\r\n    if(command === 'seek') {\r\n        guildQueue.seek(parseInt(args[0]) * 1000);\r\n    }\r\n\r\n    if(command === 'clearQueue') {\r\n        guildQueue.clearQueue();\r\n    }\r\n\r\n    if(command === 'shuffle') {\r\n        guildQueue.shuffle();\r\n    }\r\n\r\n    if(command === 'getQueue') {\r\n        console.log(guildQueue);\r\n    }\r\n\r\n    if(command === 'getVolume') {\r\n        console.log(guildQueue.volume)\r\n    }\r\n\r\n    if(command === 'nowPlaying') {\r\n        console.log(`Now playing: ${guildQueue.nowPlaying}`);\r\n    }\r\n\r\n    if(command === 'pause') {\r\n        guildQueue.setPaused(true);\r\n    }\r\n\r\n    if(command === 'resume') {\r\n        guildQueue.setPaused(false);\r\n    }\r\n\r\n    if(command === 'remove') {\r\n        guildQueue.remove(parseInt(args[0]));\r\n    }\r\n\r\n    if(command === 'createProgressBar') {\r\n        const ProgressBar = guildQueue.createProgressBar();\r\n        \r\n        // [======>              ][00:35/2:20]\r\n        console.log(ProgressBar.prettier);\r\n    }\r\n})\r\n```\r\n\r\n### Events:\r\n```js\r\n// Init the event listener only once (at the top of your code).\r\nclient.player\r\n    // Emitted when channel was empty.\r\n    .on('channelEmpty',  (queue) =>\r\n        console.log(`Everyone left the Voice Channel, queue ended.`))\r\n    // Emitted when a song was added to the queue.\r\n    .on('songAdd',  (queue, song) =>\r\n        console.log(`Song ${song} was added to the queue.`))\r\n    // Emitted when a playlist was added to the queue.\r\n    .on('playlistAdd',  (queue, playlist) =>\r\n        console.log(`Playlist ${playlist} with ${playlist.songs.length} was added to the queue.`))\r\n    // Emitted when there was no more music to play.\r\n    .on('queueDestroyed',  (queue) =>\r\n        console.log(`The queue was destroyed.`))\r\n    // Emitted when the queue was destroyed (either by ending or stopping).    \r\n    .on('queueEnd',  (queue) =>\r\n        console.log(`The queue has ended.`))\r\n    // Emitted when a song changed.\r\n    .on('songChanged', (queue, newSong, oldSong) =>\r\n        console.log(`${newSong} is now playing.`))\r\n    // Emitted when a first song in the queue started playing.\r\n    .on('songFirst',  (queue, song) =>\r\n        console.log(`Started playing ${song}.`))\r\n    // Emitted when someone disconnected the bot from the channel.\r\n    .on('clientDisconnect', (queue) =>\r\n        console.log(`I was kicked from the Voice Channel, queue ended.`))\r\n    // Emitted when deafenOnJoin is true and the bot was undeafened\r\n    .on('clientUndeafen', (queue) =>\r\n        console.log(`I got undefeanded.`))\r\n    // Emitted when there was an error in runtime\r\n    .on('error', (error, queue) => {\r\n        console.log(`Error: ${error} in ${queue.guild.name}`);\r\n    });\r\n```\r\n\r\n# Passing custom data\r\n\r\n### Queue\r\nWhile running the `Queue#createQueue()` method you can pass a `options#data` object to hold custom data.\r\nThis can be made in two ways:\r\n```js\r\n// Pass custom data\r\nawait player.createQueue(message.guild.id, {\r\n    data: {\r\n        queueInitMessage: message,\r\n        myObject: 'this will stay with the queue :)',\r\n        more: 'add more... there are no limitations...'\r\n    }\r\n});\r\n// Or by using\r\nqueue.setData({\r\n    whatever: 'you want :D'\r\n});\r\n\r\n// Access custom data\r\nlet queue = player.getQueue(message.guild.id);\r\nlet initMessage = queue.data.queueInitMessage;\r\nawait initMessage.channel.send(`This message object is hold in Queue :D`);\r\n```\r\n\r\n### Song or Playlist\r\nWhile running the `Queue#play()`/Queue#playlist() method you can pass a `options#data` object to hold custom data.\r\nThis can be made in two ways:\r\n```js\r\n// Play the song\r\nlet song = await queue.play('Born in the USA!');\r\n// Set song data\r\nsong.setData({\r\n    initMessage: message\r\n});\r\n\r\n// Play the playlist\r\nlet playlist = await queue.playlist('https://www.youtube.com/playlist?list=PLDLGxnP4y2mGKGEqwxWTRkd3HtrrVTMdU');\r\n// Set playlist data (will set data for each song in the playlist)\r\nsong.setData({\r\n    initMessage: message\r\n});\r\n\r\n// Access custom data\r\nlet queue = player.getQueue(message.guild.id);\r\nlet { initMessage } = queue.nowPlaying.data;\r\nawait initMessage.channel.send(`This message object is hold in Song :D`);\r\n```\r\n","readmeFilename":"README.md","gitHead":"537f252c374eab84d83164cede3403e712deb1dd","_id":"spike-player@1.4.4-5","_nodeVersion":"16.17.0","_npmVersion":"8.18.0","dist":{"integrity":"sha512-Vapc7aAECg7c//3t18ewEwgO5ywYrSWtGbt9gA6fmgVqdiz1a5o46CV56aWY2zO+86JH0kHh3tbi+9qCntEvtQ==","shasum":"3aea50230574461a1f1af6b4156a8249f35f71c3","tarball":"https://registry.npmjs.org/spike-player/-/spike-player-1.4.4-5.tgz","fileCount":30,"unpackedSize":106107,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD+VhXm2/3HvHOcxAZyMPi3O1WVA0GDMUHKuPTfaQpMfAIhAOnU0M0OioAl/pciW6jJLYGSVpoWQpX/99QfPkyO+pYI"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjN/g/ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoQCw//cMobRu1dgzu/RE4hp9zl7sYYLZMGAw9+L56tqQDht9m9mqop\r\n6c+L1m61PBVsPrdsHQL68PPyuCtzknlqw4V01x8uwIUVPvlYiZZ0e1l/ixwd\r\ngVDhOoeP02MmiIzW/EOweMFaQkS2bfpVYG1NeyK13tL65wYbSGRrEzYU4JFO\r\nT3QZMubYEECqRFry5itJHibjmkRxW0GcqcZJcGOiYC28rAHgfyzGC0GVRfWL\r\nn0dNvjKHAEyA9Bl5IX6ufVZdWrzaYWPiMctBx1l9WkoW2o46aMopqK9NdC7G\r\nyLa3Q8yV3zR/8tQy2rP/3qzsjRjkH3nRmn3TkfOrq7isaZgQPpfX9OyEln1v\r\ndRfejX1vD+5aafLJ7WzCcBOVO/TUFT2I8ydPenSdq489oQrw3nDFa0ju+ECm\r\nL0mQLEFe3p7V7QOD7DAd5pysBPTvgtyHQCZlQeuKcYoGmHMS6KVD/pGutWtW\r\nnEeBQz+TQ6WwzS4Xq7+sFVyiGpDrfn9hfN2SP3p38RKqhGnan6Yn4Md1mAX/\r\nWrmLiISGz8Sws/5UVIrQo/I3cTJHJbMU4cZE3ndYA46S8pdWmUnEsd1TVdb1\r\nw8hL2ckmvnmXQ41yvm58PEjYiavxOHqozari1tTGuX7sRQx1L0Y0MO+G6l0F\r\nLb+xntyfj3DPJMPyNd48GH4J/sXu6LDpPFo=\r\n=X7y/\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"spikebot","email":"abatallah1214@gmail.com"},"maintainers":[{"name":"spikebot","email":"abatallah1214@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spike-player_1.4.4-5_1664612415512_0.16882966493934304"},"_hasShrinkwrap":false},"1.4.4-6":{"name":"spike-player","version":"1.4.4-6","description":"Complete framework to facilitate music commands using discord.js v13 & v14","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","test":"jest test/test.js","clean":"rimraf dist","pre":"npm version prerelease --force && npm publish --access public --tag dev","prep":"npm run clean && npm run build","pub":"conventional-changelog -p angular -i CHANGELOG.md -s && npm publish"},"keywords":["music","player","bot","framework","discord","youtube","spotify","v13","v14"],"dependencies":{"@discordjs/opus":"^0.8.0","@discordjs/voice":"^0.11.0","@spikebot/discord-ytdl-core":"^1.0.4","@spikebot/ytdl-core":"^1.0.2","@types/node":"^18.7.23","@typescript-eslint/eslint-plugin":"^5.38.1","@typescript-eslint/parser":"^5.38.1","axios":"^0.27.2","axios-retry":"^3.3.1","domhandler":"^5.0.3","eslint":"^8.24.0","ffmpeg-static":"^5.1.0","htmlparser2":"^8.0.1","isomorphic-unfetch":"^3.1.0","jest":"^29.1.2","libsodium-wrappers":"^0.7.10","rimraf":"^3.0.2","soundcloud-scraper":"github:AnupKumarPanwar/soundcloud-scraper","spotify-url-info":"^3.1.8","youtubei":"^1.0.0-rc.5","ytsr":"^3.8.0"},"devDependencies":{"@babel/cli":"^7.19.3","@babel/core":"^7.19.3","@babel/preset-env":"^7.19.3","@babel/preset-typescript":"^7.18.6","@commitlint/cli":"^17.1.2","@rocketseat/commitlint-config":"^0.0.3","@types/node":"^18.7.23","@typescript-eslint/eslint-plugin":"^5.38.1","@typescript-eslint/parser":"^5.38.1","assert-diff":"^3.0.2","discord.js":"^14.5.0","discord.js-docgen":"github:discordjs/docgen#ts-patch","eslint":"^8.24.0","husky":"^8.0.1","jest":"^29.1.2","jsdoc-babel":"^0.5.0","ts-node":"^10.9.1","typescript":"^4.8.4"},"directories":{"doc":"docs","test":"test"},"engines":{"node":">=16.9.0"},"workspaces":["packages/*"],"packageManager":"npm@8.11.0","readme":"# Discord Music Player\n\n![npm](https://img.shields.io/npm/dt/discord-music-player?style=for-the-badge)\n![npm](https://img.shields.io/npm/v/discord-music-player?style=for-the-badge)\n![CodeFactor Grade](https://img.shields.io/codefactor/grade/github/SushiBtw/discord-music-player?color=%2348aaf1&style=for-the-badge)\n\n### Note: This is the v8 version of Discord Music Player for Discord.JS v13!\n\nDiscord Music Player is a powerful [Node.js](https://nodejs.org) module that allows you to easily implement music commands.\n**Everything** is customizable, and everything can be done using this package - **there are no limitations!**\n\nThis package supports YouTube Videos & Playlists, Spotify Songs & Playlists, Apple Music Songs & Playlists.\nPackage from version v7.0.0 is fully maintained by [SushiBtw](https://github.com/SushiBtw).\n\n### Requirements:\n\n- [Discord.js v13](https://www.npmjs.com/package/discord.js),\n- [Node.JS v16](https://nodejs.org/),\n\n# Installation\n\n_Node.JS v16 or newer is required to run this module._\n\n```sh\nnpm install --save discord-music-player\n```\n\nInstall **@discordjs/opus**:\n\n```sh\nnpm install --save @discordjs/opus\n```\n\n**Install [FFMPEG](https://www.ffmpeg.org/download.html)!**\n\n# Documentation\n\n**Discord Music Player documentation: [https://discord-music-player.js.org/](https://discord-music-player.js.org/)**\n\n### **Need some help?**\n\nFeel free to join [Discord-Music-Player Discord Server](https://discord.gg/6fejZNsmFC) and ask us about DMP.\n\n# Getting Started\n\n**The code bellow, will show you how to use DMP in your code.**\n\n_Please define your **Player** after the **client/bot** definition._\n\n[!] Remember to include the related voice **Intents** at the client options. [!]\n\n```js\nconst Discord = require(\"discord.js\");\nconst client = new Discord.Client({\n  intents: [\n    Intents.FLAGS.GUILDS,\n    Intents.FLAGS.GUILD_MESSAGES,\n    Intents.FLAGS.GUILD_VOICE_STATES,\n  ],\n});\nconst settings = {\n  prefix: \"!\",\n  token: \"YourBotTokenHere\",\n};\n\nconst { Player } = require(\"discord-music-player\");\nconst player = new Player(client, {\n  leaveOnEmpty: false, // This options are optional.\n});\n// You can define the Player as *client.player* to easily access it.\nclient.player = player;\n\nclient.on(\"ready\", () => {\n  console.log(\"I am ready to Play with DMP 🎶\");\n});\n\nclient.login(settings.token);\n```\n\n# Example Usage\n\n```js\nconst { RepeatMode } = require(\"discord-music-player\");\n\nclient.on(\"messageCreate\", async (message) => {\n  const args = message.content\n    .slice(settings.prefix.length)\n    .trim()\n    .split(/ +/g);\n  const command = args.shift();\n  let guildQueue = client.player.getQueue(message.guild.id);\n\n  if (command === \"play\") {\n    let queue = client.player.createQueue(message.guild.id);\n    await queue.join(message.member.voice.channel);\n    let song = await queue.play(args.join(\" \")).catch((_) => {\n      if (!guildQueue) queue.stop();\n    });\n  }\n\n  if (command === \"playlist\") {\n    let queue = client.player.createQueue(message.guild.id);\n    await queue.join(message.member.voice.channel);\n    let song = await queue.playlist(args.join(\" \")).catch((_) => {\n      if (!guildQueue) queue.stop();\n    });\n  }\n\n  if (command === \"skip\") {\n    guildQueue.skip();\n  }\n\n  if (command === \"stop\") {\n    guildQueue.stop();\n  }\n\n  if (command === \"removeLoop\") {\n    guildQueue.setRepeatMode(RepeatMode.DISABLED); // or 0 instead of RepeatMode.DISABLED\n  }\n\n  if (command === \"toggleLoop\") {\n    guildQueue.setRepeatMode(RepeatMode.SONG); // or 1 instead of RepeatMode.SONG\n  }\n\n  if (command === \"toggleQueueLoop\") {\n    guildQueue.setRepeatMode(RepeatMode.QUEUE); // or 2 instead of RepeatMode.QUEUE\n  }\n\n  if (command === \"setVolume\") {\n    guildQueue.setVolume(parseInt(args[0]));\n  }\n\n  if (command === \"seek\") {\n    guildQueue.seek(parseInt(args[0]) * 1000);\n  }\n\n  if (command === \"clearQueue\") {\n    guildQueue.clearQueue();\n  }\n\n  if (command === \"shuffle\") {\n    guildQueue.shuffle();\n  }\n\n  if (command === \"getQueue\") {\n    console.log(guildQueue);\n  }\n\n  if (command === \"getVolume\") {\n    console.log(guildQueue.volume);\n  }\n\n  if (command === \"nowPlaying\") {\n    console.log(`Now playing: ${guildQueue.nowPlaying}`);\n  }\n\n  if (command === \"pause\") {\n    guildQueue.setPaused(true);\n  }\n\n  if (command === \"resume\") {\n    guildQueue.setPaused(false);\n  }\n\n  if (command === \"remove\") {\n    guildQueue.remove(parseInt(args[0]));\n  }\n\n  if (command === \"createProgressBar\") {\n    const ProgressBar = guildQueue.createProgressBar();\n\n    // [======>              ][00:35/2:20]\n    console.log(ProgressBar.prettier);\n  }\n});\n```\n\n### Events:\n\n```js\n// Init the event listener only once (at the top of your code).\nclient.player\n  // Emitted when channel was empty.\n  .on(\"channelEmpty\", (queue) =>\n    console.log(`Everyone left the Voice Channel, queue ended.`)\n  )\n  // Emitted when a song was added to the queue.\n  .on(\"songAdd\", (queue, song) =>\n    console.log(`Song ${song} was added to the queue.`)\n  )\n  // Emitted when a playlist was added to the queue.\n  .on(\"playlistAdd\", (queue, playlist) =>\n    console.log(\n      `Playlist ${playlist} with ${playlist.songs.length} was added to the queue.`\n    )\n  )\n  // Emitted when there was no more music to play.\n  .on(\"queueDestroyed\", (queue) => console.log(`The queue was destroyed.`))\n  // Emitted when the queue was destroyed (either by ending or stopping).\n  .on(\"queueEnd\", (queue) => console.log(`The queue has ended.`))\n  // Emitted when a song changed.\n  .on(\"songChanged\", (queue, newSong, oldSong) =>\n    console.log(`${newSong} is now playing.`)\n  )\n  // Emitted when a first song in the queue started playing.\n  .on(\"songFirst\", (queue, song) => console.log(`Started playing ${song}.`))\n  // Emitted when someone disconnected the bot from the channel.\n  .on(\"clientDisconnect\", (queue) =>\n    console.log(`I was kicked from the Voice Channel, queue ended.`)\n  )\n  // Emitted when deafenOnJoin is true and the bot was undeafened\n  .on(\"clientUndeafen\", (queue) => console.log(`I got undefeanded.`))\n  // Emitted when there was an error in runtime\n  .on(\"error\", (error, queue) => {\n    console.log(`Error: ${error} in ${queue.guild.name}`);\n  });\n```\n\n# Passing custom data\n\n### Queue\n\nWhile running the `Queue#createQueue()` method you can pass a `options#data` object to hold custom data.\nThis can be made in two ways:\n\n```js\n// Pass custom data\nawait player.createQueue(message.guild.id, {\n  data: {\n    queueInitMessage: message,\n    myObject: \"this will stay with the queue :)\",\n    more: \"add more... there are no limitations...\",\n  },\n});\n// Or by using\nqueue.setData({\n  whatever: \"you want :D\",\n});\n\n// Access custom data\nlet queue = player.getQueue(message.guild.id);\nlet initMessage = queue.data.queueInitMessage;\nawait initMessage.channel.send(`This message object is hold in Queue :D`);\n```\n\n### Song or Playlist\n\nWhile running the `Queue#play()`/Queue#playlist() method you can pass a `options#data` object to hold custom data.\nThis can be made in two ways:\n\n```js\n// Play the song\nlet song = await queue.play(\"Born in the USA!\");\n// Set song data\nsong.setData({\n  initMessage: message,\n});\n\n// Play the playlist\nlet playlist = await queue.playlist(\n  \"https://www.youtube.com/playlist?list=PLDLGxnP4y2mGKGEqwxWTRkd3HtrrVTMdU\"\n);\n// Set playlist data (will set data for each song in the playlist)\nsong.setData({\n  initMessage: message,\n});\n\n// Access custom data\nlet queue = player.getQueue(message.guild.id);\nlet { initMessage } = queue.nowPlaying.data;\nawait initMessage.channel.send(`This message object is hold in Song :D`);\n```\n","readmeFilename":"README.md","gitHead":"82cb16520d2b119b894909bb4e645916f3347644","_id":"spike-player@1.4.4-6","_nodeVersion":"16.17.0","_npmVersion":"8.18.0","dist":{"integrity":"sha512-Tuwmii1QBxzOoiXibbW3k4d7VuOkTAI72jYCqFQLrp72TvNCNFGGrpCclo2NyENtSd/jQF6RgHtwjmuiYFmHXA==","shasum":"3ba070f99aadd1f5946c9b3fc9c730d212f14657","tarball":"https://registry.npmjs.org/spike-player/-/spike-player-1.4.4-6.tgz","fileCount":30,"unpackedSize":101922,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC4jIyB1S64leeWRVfcb3gXCrBkfofO0IhvOh668aDDAwIgUMb+V4T3A9+w5o135mZLEVJXozftwZIcG1yvclCvNCI="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjQ+90ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoCog/9Fbj+/pNd92bhaH2YvlKP0EJS+tx3NB7MwIrICAg93Ym0rCAi\r\nFFicbmuO1CpixLcBhf1fRt1nwE0iodrPyM/5T7E3yPJa130Ij4Dd4aUiX+hi\r\nmAHFXugtuX3ZhLkcs9E9XeskHr5sSwyHPi60QgT7ZtZ4IFX1V6qfP9kIKYwp\r\nQ3hRb2F7GBTpC7ypdv8onETH1zg3kL2KTDf+omwBCo7hnTdiryvf0ui/r+vd\r\nKUUsFAtE7rqPo+urK5ME81IUmBWxvSD7RRZRFOmLIh3mp7vnOT/CgWoLOJvh\r\npk1XX6FqbvDbi4pmh3K8XuCAcode8NCBrwMZzz3VQU/+sQRqfVxclQoTVytv\r\nWdeNIcVEW6j2tfp/tav2EsK5yOZE2RxP3t1HIithskrVvE4rf7WRFpBbyXF8\r\nSbIOYh75OD9z3L7ZBcQoMQmWz5rC130+2Vn9YgxoN52uG+aIEKJ4vks1XrGI\r\nfxape1We4DoT3XajAYnWEHgKmfeLh3anVnchez7aBiCrB4LDopp46L/UqGA8\r\nd2dYQPPPcW0ncpFT2/mDoNQ0lZKczsP2SH62eFM0SIxpz8HsipgTGIWOlnG8\r\nvhCGF/NeXudnLH0MsbBPMfJcR0TCwaGTZYXETLP5+HsLj1t2rDSBRtVo9nLi\r\nGAe+cpF//W5gtC0PFDxkoLHs2Wbsq/+ALys=\r\n=eF6K\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"spikebot","email":"abatallah1214@gmail.com"},"maintainers":[{"name":"spikebot","email":"abatallah1214@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spike-player_1.4.4-6_1665396596155_0.5689576044367384"},"_hasShrinkwrap":false},"1.4.4-7":{"name":"spike-player","version":"1.4.4-7","description":"Complete framework to facilitate music commands using discord.js v13 & v14","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","test":"jest test/test.js","clean":"rimraf dist","pre":"npm version prerelease --force && npm publish --access public --tag dev","prep":"npm run clean && npm run build","pub":"conventional-changelog -p angular -i CHANGELOG.md -s && npm publish"},"keywords":["music","player","bot","framework","discord","youtube","spotify","v13","v14"],"dependencies":{"@discordjs/opus":"^0.8.0","@discordjs/voice":"^0.11.0","@spikebot/discord-ytdl-core":"^1.0.4","@spikebot/ytdl-core":"^1.0.2","@types/node":"^18.7.23","@typescript-eslint/eslint-plugin":"^5.38.1","@typescript-eslint/parser":"^5.38.1","apple-music-metadata":"^2.0.1","axios":"^0.27.2","axios-retry":"^3.3.1","discord-ytdl-core":"^5.0.4","domhandler":"^5.0.3","eslint":"^8.24.0","ffmpeg-static":"^5.1.0","htmlparser2":"^8.0.1","isomorphic-unfetch":"^3.1.0","jest":"^29.1.2","libsodium-wrappers":"^0.7.10","rimraf":"^3.0.2","soundcloud-scraper":"github:AnupKumarPanwar/soundcloud-scraper","spotify-url-info":"^3.1.8","youtubei":"^1.0.0-rc.5","ytdl-core":"^4.11.2","ytsr":"^3.8.0"},"devDependencies":{"@babel/cli":"^7.19.3","@babel/core":"^7.19.3","@babel/preset-env":"^7.19.3","@babel/preset-typescript":"^7.18.6","@commitlint/cli":"^17.1.2","@rocketseat/commitlint-config":"^0.0.3","@types/node":"^18.7.23","@typescript-eslint/eslint-plugin":"^5.38.1","@typescript-eslint/parser":"^5.38.1","assert-diff":"^3.0.2","discord.js":"^14.5.0","discord.js-docgen":"github:discordjs/docgen#ts-patch","eslint":"^8.24.0","husky":"^8.0.1","jest":"^29.1.2","jsdoc-babel":"^0.5.0","ts-node":"^10.9.1","typescript":"^4.8.4"},"directories":{"doc":"docs","test":"test"},"engines":{"node":">=16.9.0"},"workspaces":["packages/*"],"packageManager":"npm@8.11.0","readme":"# Discord Music Player\n\n![npm](https://img.shields.io/npm/dt/discord-music-player?style=for-the-badge)\n![npm](https://img.shields.io/npm/v/discord-music-player?style=for-the-badge)\n![CodeFactor Grade](https://img.shields.io/codefactor/grade/github/SushiBtw/discord-music-player?color=%2348aaf1&style=for-the-badge)\n\n### Note: This is the v8 version of Discord Music Player for Discord.JS v13!\n\nDiscord Music Player is a powerful [Node.js](https://nodejs.org) module that allows you to easily implement music commands.\n**Everything** is customizable, and everything can be done using this package - **there are no limitations!**\n\nThis package supports YouTube Videos & Playlists, Spotify Songs & Playlists, Apple Music Songs & Playlists.\nPackage from version v7.0.0 is fully maintained by [SushiBtw](https://github.com/SushiBtw).\n\n### Requirements:\n\n- [Discord.js v13](https://www.npmjs.com/package/discord.js),\n- [Node.JS v16](https://nodejs.org/),\n\n# Installation\n\n_Node.JS v16 or newer is required to run this module._\n\n```sh\nnpm install --save discord-music-player\n```\n\nInstall **@discordjs/opus**:\n\n```sh\nnpm install --save @discordjs/opus\n```\n\n**Install [FFMPEG](https://www.ffmpeg.org/download.html)!**\n\n# Documentation\n\n**Discord Music Player documentation: [https://discord-music-player.js.org/](https://discord-music-player.js.org/)**\n\n### **Need some help?**\n\nFeel free to join [Discord-Music-Player Discord Server](https://discord.gg/6fejZNsmFC) and ask us about DMP.\n\n# Getting Started\n\n**The code bellow, will show you how to use DMP in your code.**\n\n_Please define your **Player** after the **client/bot** definition._\n\n[!] Remember to include the related voice **Intents** at the client options. [!]\n\n```js\nconst Discord = require(\"discord.js\");\nconst client = new Discord.Client({\n  intents: [\n    Intents.FLAGS.GUILDS,\n    Intents.FLAGS.GUILD_MESSAGES,\n    Intents.FLAGS.GUILD_VOICE_STATES,\n  ],\n});\nconst settings = {\n  prefix: \"!\",\n  token: \"YourBotTokenHere\",\n};\n\nconst { Player } = require(\"discord-music-player\");\nconst player = new Player(client, {\n  leaveOnEmpty: false, // This options are optional.\n});\n// You can define the Player as *client.player* to easily access it.\nclient.player = player;\n\nclient.on(\"ready\", () => {\n  console.log(\"I am ready to Play with DMP 🎶\");\n});\n\nclient.login(settings.token);\n```\n\n# Example Usage\n\n```js\nconst { RepeatMode } = require(\"discord-music-player\");\n\nclient.on(\"messageCreate\", async (message) => {\n  const args = message.content\n    .slice(settings.prefix.length)\n    .trim()\n    .split(/ +/g);\n  const command = args.shift();\n  let guildQueue = client.player.getQueue(message.guild.id);\n\n  if (command === \"play\") {\n    let queue = client.player.createQueue(message.guild.id);\n    await queue.join(message.member.voice.channel);\n    let song = await queue.play(args.join(\" \")).catch((_) => {\n      if (!guildQueue) queue.stop();\n    });\n  }\n\n  if (command === \"playlist\") {\n    let queue = client.player.createQueue(message.guild.id);\n    await queue.join(message.member.voice.channel);\n    let song = await queue.playlist(args.join(\" \")).catch((_) => {\n      if (!guildQueue) queue.stop();\n    });\n  }\n\n  if (command === \"skip\") {\n    guildQueue.skip();\n  }\n\n  if (command === \"stop\") {\n    guildQueue.stop();\n  }\n\n  if (command === \"removeLoop\") {\n    guildQueue.setRepeatMode(RepeatMode.DISABLED); // or 0 instead of RepeatMode.DISABLED\n  }\n\n  if (command === \"toggleLoop\") {\n    guildQueue.setRepeatMode(RepeatMode.SONG); // or 1 instead of RepeatMode.SONG\n  }\n\n  if (command === \"toggleQueueLoop\") {\n    guildQueue.setRepeatMode(RepeatMode.QUEUE); // or 2 instead of RepeatMode.QUEUE\n  }\n\n  if (command === \"setVolume\") {\n    guildQueue.setVolume(parseInt(args[0]));\n  }\n\n  if (command === \"seek\") {\n    guildQueue.seek(parseInt(args[0]) * 1000);\n  }\n\n  if (command === \"clearQueue\") {\n    guildQueue.clearQueue();\n  }\n\n  if (command === \"shuffle\") {\n    guildQueue.shuffle();\n  }\n\n  if (command === \"getQueue\") {\n    console.log(guildQueue);\n  }\n\n  if (command === \"getVolume\") {\n    console.log(guildQueue.volume);\n  }\n\n  if (command === \"nowPlaying\") {\n    console.log(`Now playing: ${guildQueue.nowPlaying}`);\n  }\n\n  if (command === \"pause\") {\n    guildQueue.setPaused(true);\n  }\n\n  if (command === \"resume\") {\n    guildQueue.setPaused(false);\n  }\n\n  if (command === \"remove\") {\n    guildQueue.remove(parseInt(args[0]));\n  }\n\n  if (command === \"createProgressBar\") {\n    const ProgressBar = guildQueue.createProgressBar();\n\n    // [======>              ][00:35/2:20]\n    console.log(ProgressBar.prettier);\n  }\n});\n```\n\n### Events:\n\n```js\n// Init the event listener only once (at the top of your code).\nclient.player\n  // Emitted when channel was empty.\n  .on(\"channelEmpty\", (queue) =>\n    console.log(`Everyone left the Voice Channel, queue ended.`)\n  )\n  // Emitted when a song was added to the queue.\n  .on(\"songAdd\", (queue, song) =>\n    console.log(`Song ${song} was added to the queue.`)\n  )\n  // Emitted when a playlist was added to the queue.\n  .on(\"playlistAdd\", (queue, playlist) =>\n    console.log(\n      `Playlist ${playlist} with ${playlist.songs.length} was added to the queue.`\n    )\n  )\n  // Emitted when there was no more music to play.\n  .on(\"queueDestroyed\", (queue) => console.log(`The queue was destroyed.`))\n  // Emitted when the queue was destroyed (either by ending or stopping).\n  .on(\"queueEnd\", (queue) => console.log(`The queue has ended.`))\n  // Emitted when a song changed.\n  .on(\"songChanged\", (queue, newSong, oldSong) =>\n    console.log(`${newSong} is now playing.`)\n  )\n  // Emitted when a first song in the queue started playing.\n  .on(\"songFirst\", (queue, song) => console.log(`Started playing ${song}.`))\n  // Emitted when someone disconnected the bot from the channel.\n  .on(\"clientDisconnect\", (queue) =>\n    console.log(`I was kicked from the Voice Channel, queue ended.`)\n  )\n  // Emitted when deafenOnJoin is true and the bot was undeafened\n  .on(\"clientUndeafen\", (queue) => console.log(`I got undefeanded.`))\n  // Emitted when there was an error in runtime\n  .on(\"error\", (error, queue) => {\n    console.log(`Error: ${error} in ${queue.guild.name}`);\n  });\n```\n\n# Passing custom data\n\n### Queue\n\nWhile running the `Queue#createQueue()` method you can pass a `options#data` object to hold custom data.\nThis can be made in two ways:\n\n```js\n// Pass custom data\nawait player.createQueue(message.guild.id, {\n  data: {\n    queueInitMessage: message,\n    myObject: \"this will stay with the queue :)\",\n    more: \"add more... there are no limitations...\",\n  },\n});\n// Or by using\nqueue.setData({\n  whatever: \"you want :D\",\n});\n\n// Access custom data\nlet queue = player.getQueue(message.guild.id);\nlet initMessage = queue.data.queueInitMessage;\nawait initMessage.channel.send(`This message object is hold in Queue :D`);\n```\n\n### Song or Playlist\n\nWhile running the `Queue#play()`/Queue#playlist() method you can pass a `options#data` object to hold custom data.\nThis can be made in two ways:\n\n```js\n// Play the song\nlet song = await queue.play(\"Born in the USA!\");\n// Set song data\nsong.setData({\n  initMessage: message,\n});\n\n// Play the playlist\nlet playlist = await queue.playlist(\n  \"https://www.youtube.com/playlist?list=PLDLGxnP4y2mGKGEqwxWTRkd3HtrrVTMdU\"\n);\n// Set playlist data (will set data for each song in the playlist)\nsong.setData({\n  initMessage: message,\n});\n\n// Access custom data\nlet queue = player.getQueue(message.guild.id);\nlet { initMessage } = queue.nowPlaying.data;\nawait initMessage.channel.send(`This message object is hold in Song :D`);\n```\n","readmeFilename":"README.md","gitHead":"fd59e3352b4df416dcb1177a8c3a178c04245982","_id":"spike-player@1.4.4-7","_nodeVersion":"16.17.0","_npmVersion":"8.18.0","dist":{"integrity":"sha512-7lDHU0eygjwz2OzaWE9L2iBOH5NFpdZ3JY0L3P/xoopnTcp1PedgaIop5zXAdvS8amE8Rg57AqM1qPY8/UoMeg==","shasum":"8e787ccfda8d076d1ceb5bdc2890e7731e242a26","tarball":"https://registry.npmjs.org/spike-player/-/spike-player-1.4.4-7.tgz","fileCount":30,"unpackedSize":102023,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIE4fqF1vw3wfxbGegpheTy7uw0zld9C8MmttK2QDiNgAAiEA69E97Fx4/xXQ8eGtXvJh5i3zT3uLVLKllnpyXQmaPQM="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjQ/BQACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpPLw/9GwS+GJAngy56QWTCg4PoGXT1DOfuGm2zT/OGQo49pzJt1Ru6\r\nEKbA689giMkQ2dWDiw1kLqQVO83L6kPx92fEDM33S/SiMN/7myQ6muIXX2ji\r\nc5p3MnO1qp/ejYYygDoMgFF763W9I9qlAePdxGrnGMTDDPgf98+ACKL6/2Qd\r\nFfAUFg7snQOUy98UkcVAYIzM1o3xjUtAa9pbapD/SWqKhFBuVmOhkN7HIJGa\r\n5mpsLjIAaxrPIqzqyyIq1xYtt5Igu96YNaV0MHUSNjiKRmBOrBYRFMtl/vKA\r\nxnVGPmbOhSuHrOFtvn35R3FoxS0rYQ8986IoPVBOdHeATrxtgeRK+XRaFu2p\r\nCmpbkzZnK4kD8Jjp7cg14pbbcR23zNW/xNmDdGL705M5kKCeLJnIJXG0UUOI\r\n+JByavT05qhAuvg4eBF4+oWnWdtP+YDHSQIZk1w3eDexuSZg7Rc3+nSElP+R\r\nBSDunuRDl6gDJEIN0uw4TdeQrnluAoOgUp1VVfUnMI+bUZ8K8BspsKalhwj3\r\nt/dbi7mji9PiQEZxeH5aAVAzqcsDtGh71unHzH+MzQU804eh4492o57lXNhP\r\nHqE8y5ViuWP4BocsJP+Fc+3KDJ+eU4MtoFv450UdoxiGiZWjK5j2BPEb0UaS\r\n6LQxNmMNJ6MYfdiTUvBmCMXRmnhyepnFBhQ=\r\n=x3eH\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"spikebot","email":"abatallah1214@gmail.com"},"maintainers":[{"name":"spikebot","email":"abatallah1214@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spike-player_1.4.4-7_1665396815834_0.5114841426345269"},"_hasShrinkwrap":false},"1.4.4-9":{"name":"spike-player","version":"1.4.4-9","description":"Complete framework to facilitate music commands using discord.js v13 & v14","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","test":"jest test/test.js","clean":"rimraf dist","pre":"npm version prerelease --force && npm publish --access public --tag dev","prep":"npm run clean && npm run build","pub":"conventional-changelog -p angular -i CHANGELOG.md -s && npm publish"},"keywords":["music","player","bot","framework","discord","youtube","spotify","v13","v14"],"dependencies":{"@discordjs/opus":"^0.8.0","@discordjs/voice":"^0.11.0","@spikebot/discord-ytdl-core":"^1.0.4","@spikebot/ytdl-core":"^1.0.2","@types/node":"^18.7.23","@typescript-eslint/eslint-plugin":"^5.38.1","@typescript-eslint/parser":"^5.38.1","axios":"^0.27.2","axios-retry":"^3.3.1","domhandler":"^5.0.3","eslint":"^8.24.0","ffmpeg-static":"^5.1.0","htmlparser2":"^8.0.1","isomorphic-unfetch":"^3.1.0","jest":"^29.1.2","libsodium-wrappers":"^0.7.10","rimraf":"^3.0.2","soundcloud-scraper":"github:AnupKumarPanwar/soundcloud-scraper","spotify-url-info":"^3.1.8","youtubei":"^1.0.0-rc.5","ytsr":"^3.8.0"},"devDependencies":{"@babel/cli":"^7.19.3","@babel/core":"^7.19.3","@babel/preset-env":"^7.19.3","@babel/preset-typescript":"^7.18.6","@commitlint/cli":"^17.1.2","@rocketseat/commitlint-config":"^0.0.3","@types/node":"^18.7.23","@typescript-eslint/eslint-plugin":"^5.38.1","@typescript-eslint/parser":"^5.38.1","assert-diff":"^3.0.2","discord.js":"^14.5.0","discord.js-docgen":"github:discordjs/docgen#ts-patch","eslint":"^8.24.0","husky":"^8.0.1","jest":"^29.1.2","jsdoc-babel":"^0.5.0","ts-node":"^10.9.1","typescript":"^4.8.4"},"directories":{"doc":"docs","test":"test"},"engines":{"node":">=16.9.0"},"workspaces":["packages/*"],"packageManager":"npm@8.11.0","readme":"# Discord Music Player\r\n![npm](https://img.shields.io/npm/dt/discord-music-player?style=for-the-badge)\r\n![npm](https://img.shields.io/npm/v/discord-music-player?style=for-the-badge)\r\n![CodeFactor Grade](https://img.shields.io/codefactor/grade/github/SushiBtw/discord-music-player?color=%2348aaf1&style=for-the-badge)\r\n\r\n### Note: This is the v8 version of Discord Music Player for Discord.JS v13!\r\n\r\nDiscord Music Player is a powerful [Node.js](https://nodejs.org) module that allows you to easily implement music commands.\r\n**Everything** is customizable, and everything can be done using this package - **there are no limitations!**\r\n\r\nThis package supports YouTube Videos & Playlists, Spotify Songs & Playlists, Apple Music Songs & Playlists.\r\nPackage from version v7.0.0 is fully maintained by [SushiBtw](https://github.com/SushiBtw).\r\n\r\n### Requirements:\r\n- [Discord.js v13](https://www.npmjs.com/package/discord.js),\r\n- [Node.JS v16](https://nodejs.org/),\r\n\r\n# Installation\r\n*Node.JS v16 or newer is required to run this module.*\r\n```sh\r\nnpm install --save discord-music-player\r\n```\r\nInstall **@discordjs/opus**:\r\n```sh\r\nnpm install --save @discordjs/opus\r\n```\r\n**Install [FFMPEG](https://www.ffmpeg.org/download.html)!**\r\n\r\n# Documentation\r\n**Discord Music Player documentation: [https://discord-music-player.js.org/](https://discord-music-player.js.org/)**\r\n\r\n### **Need some help?**\r\nFeel free to join [Discord-Music-Player Discord Server](https://discord.gg/6fejZNsmFC) and ask us about DMP.\r\n\r\n# Getting Started\r\n**The code bellow, will show you how to use DMP in your code.**\r\n\r\n*Please define your **Player** after the **client/bot** definition.*\r\n\r\n[!] Remember to include the related voice **Intents** at the client options. [!]\r\n```js\r\nconst Discord = require(\"discord.js\");\r\nconst client = new Discord.Client({\r\n    intents: [Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES, Intents.FLAGS.GUILD_VOICE_STATES]\r\n});\r\nconst settings = {\r\n    prefix: '!',\r\n    token: 'YourBotTokenHere'\r\n};\r\n\r\nconst { Player } = require(\"discord-music-player\");\r\nconst player = new Player(client, {\r\n    leaveOnEmpty: false, // This options are optional.\r\n});\r\n// You can define the Player as *client.player* to easily access it.\r\nclient.player = player;\r\n\r\nclient.on(\"ready\", () => {\r\n    console.log(\"I am ready to Play with DMP 🎶\");\r\n});\r\n\r\nclient.login(settings.token);\r\n```\r\n\r\n# Example Usage\r\n```js\r\nconst { RepeatMode } = require('discord-music-player');\r\n\r\nclient.on('messageCreate', async (message) => {\r\n    const args = message.content.slice(settings.prefix.length).trim().split(/ +/g);\r\n    const command = args.shift();\r\n    let guildQueue = client.player.getQueue(message.guild.id);\r\n\r\n    if(command === 'play') {\r\n        let queue = client.player.createQueue(message.guild.id);\r\n        await queue.join(message.member.voice.channel);\r\n        let song = await queue.play(args.join(' ')).catch(_ => {\r\n            if(!guildQueue)\r\n                queue.stop();\r\n        });\r\n    }\r\n\r\n    if(command === 'playlist') {\r\n        let queue = client.player.createQueue(message.guild.id);\r\n        await queue.join(message.member.voice.channel);\r\n        let song = await queue.playlist(args.join(' ')).catch(_ => {\r\n            if(!guildQueue)\r\n                queue.stop();\r\n        });\r\n    }\r\n\r\n    if(command === 'skip') {\r\n        guildQueue.skip();\r\n    }\r\n\r\n    if(command === 'stop') {\r\n        guildQueue.stop();\r\n    }\r\n\r\n    if(command === 'removeLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.DISABLED); // or 0 instead of RepeatMode.DISABLED\r\n    }\r\n\r\n    if(command === 'toggleLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.SONG); // or 1 instead of RepeatMode.SONG\r\n    }\r\n\r\n    if(command === 'toggleQueueLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.QUEUE); // or 2 instead of RepeatMode.QUEUE\r\n    }\r\n\r\n    if(command === 'setVolume') {\r\n        guildQueue.setVolume(parseInt(args[0]));\r\n    }\r\n\r\n    if(command === 'seek') {\r\n        guildQueue.seek(parseInt(args[0]) * 1000);\r\n    }\r\n\r\n    if(command === 'clearQueue') {\r\n        guildQueue.clearQueue();\r\n    }\r\n\r\n    if(command === 'shuffle') {\r\n        guildQueue.shuffle();\r\n    }\r\n\r\n    if(command === 'getQueue') {\r\n        console.log(guildQueue);\r\n    }\r\n\r\n    if(command === 'getVolume') {\r\n        console.log(guildQueue.volume)\r\n    }\r\n\r\n    if(command === 'nowPlaying') {\r\n        console.log(`Now playing: ${guildQueue.nowPlaying}`);\r\n    }\r\n\r\n    if(command === 'pause') {\r\n        guildQueue.setPaused(true);\r\n    }\r\n\r\n    if(command === 'resume') {\r\n        guildQueue.setPaused(false);\r\n    }\r\n\r\n    if(command === 'remove') {\r\n        guildQueue.remove(parseInt(args[0]));\r\n    }\r\n\r\n    if(command === 'createProgressBar') {\r\n        const ProgressBar = guildQueue.createProgressBar();\r\n        \r\n        // [======>              ][00:35/2:20]\r\n        console.log(ProgressBar.prettier);\r\n    }\r\n})\r\n```\r\n\r\n### Events:\r\n```js\r\n// Init the event listener only once (at the top of your code).\r\nclient.player\r\n    // Emitted when channel was empty.\r\n    .on('channelEmpty',  (queue) =>\r\n        console.log(`Everyone left the Voice Channel, queue ended.`))\r\n    // Emitted when a song was added to the queue.\r\n    .on('songAdd',  (queue, song) =>\r\n        console.log(`Song ${song} was added to the queue.`))\r\n    // Emitted when a playlist was added to the queue.\r\n    .on('playlistAdd',  (queue, playlist) =>\r\n        console.log(`Playlist ${playlist} with ${playlist.songs.length} was added to the queue.`))\r\n    // Emitted when there was no more music to play.\r\n    .on('queueDestroyed',  (queue) =>\r\n        console.log(`The queue was destroyed.`))\r\n    // Emitted when the queue was destroyed (either by ending or stopping).    \r\n    .on('queueEnd',  (queue) =>\r\n        console.log(`The queue has ended.`))\r\n    // Emitted when a song changed.\r\n    .on('songChanged', (queue, newSong, oldSong) =>\r\n        console.log(`${newSong} is now playing.`))\r\n    // Emitted when a first song in the queue started playing.\r\n    .on('songFirst',  (queue, song) =>\r\n        console.log(`Started playing ${song}.`))\r\n    // Emitted when someone disconnected the bot from the channel.\r\n    .on('clientDisconnect', (queue) =>\r\n        console.log(`I was kicked from the Voice Channel, queue ended.`))\r\n    // Emitted when deafenOnJoin is true and the bot was undeafened\r\n    .on('clientUndeafen', (queue) =>\r\n        console.log(`I got undefeanded.`))\r\n    // Emitted when there was an error in runtime\r\n    .on('error', (error, queue) => {\r\n        console.log(`Error: ${error} in ${queue.guild.name}`);\r\n    });\r\n```\r\n\r\n# Passing custom data\r\n\r\n### Queue\r\nWhile running the `Queue#createQueue()` method you can pass a `options#data` object to hold custom data.\r\nThis can be made in two ways:\r\n```js\r\n// Pass custom data\r\nawait player.createQueue(message.guild.id, {\r\n    data: {\r\n        queueInitMessage: message,\r\n        myObject: 'this will stay with the queue :)',\r\n        more: 'add more... there are no limitations...'\r\n    }\r\n});\r\n// Or by using\r\nqueue.setData({\r\n    whatever: 'you want :D'\r\n});\r\n\r\n// Access custom data\r\nlet queue = player.getQueue(message.guild.id);\r\nlet initMessage = queue.data.queueInitMessage;\r\nawait initMessage.channel.send(`This message object is hold in Queue :D`);\r\n```\r\n\r\n### Song or Playlist\r\nWhile running the `Queue#play()`/Queue#playlist() method you can pass a `options#data` object to hold custom data.\r\nThis can be made in two ways:\r\n```js\r\n// Play the song\r\nlet song = await queue.play('Born in the USA!');\r\n// Set song data\r\nsong.setData({\r\n    initMessage: message\r\n});\r\n\r\n// Play the playlist\r\nlet playlist = await queue.playlist('https://www.youtube.com/playlist?list=PLDLGxnP4y2mGKGEqwxWTRkd3HtrrVTMdU');\r\n// Set playlist data (will set data for each song in the playlist)\r\nsong.setData({\r\n    initMessage: message\r\n});\r\n\r\n// Access custom data\r\nlet queue = player.getQueue(message.guild.id);\r\nlet { initMessage } = queue.nowPlaying.data;\r\nawait initMessage.channel.send(`This message object is hold in Song :D`);\r\n```\r\n","readmeFilename":"README.md","gitHead":"53d03e7aec1f71cfcda277e64604cd44117a16d9","_id":"spike-player@1.4.4-9","_nodeVersion":"16.17.0","_npmVersion":"8.18.0","dist":{"integrity":"sha512-nPVb0CkbGT1m6nV+dFw92+IOWnQfx9iNBoAaZoOWYcWHh3oWWTM4TPeXoFFFWlzVOx+brJVigeyER7YUImTyQg==","shasum":"2758fab087aa3be8fdfdaa6dde9ca96cc01a6cf7","tarball":"https://registry.npmjs.org/spike-player/-/spike-player-1.4.4-9.tgz","fileCount":30,"unpackedSize":106109,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCID6B6t0hc5+nVwtWQOLQfgf8sfoayuFb/lCnQCO9pIalAiBJbqOK5uRr2Ef7ARr4CU7IftZEMORsaV4FnwXg7fM8Ew=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjQ/MSACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmokRg/8D3BfcV5avSP0a57uS/tMYnIRtoW4KBrf/PljNKiqMUfm8H2b\r\nVmbnLYdV9rvn5KZ82u/imeMrOWO/IVKhoIGnfverSGBV6Ex1A8HkynBKo03J\r\n0TU6/wLk9XrUicYBuGkUOeGaLl29raMekZREk+I51we5lGRlXtGA4ODzaEkP\r\npgIfvsAED89em44Ef80p4cH1nKUEjZbOo6NoEc/a2ElWzQg1Sq2cv0MbLwlb\r\nYPp9xAlBBFV32rINeOIvYRzcVy0yjx098XtDS5XkErGjS6Gmz/jXYYK07Jy4\r\nDmbZiZNYOBeM06+lNC9Hq07IgpiTE67wXFNnIsXKSRknD+S0fvTSv6iuznEh\r\nIAKj6OoBhCU/BRmiVBm9G8dx2BD+eu7jlV7o3y5fDPm/kLmKj3mMuuYfKv+N\r\nakL+/hBpC5aAOyXvTFLwgDCf+vkEtb2sfZMKE9L5LBX7H3KLFoeIRrpKNTjF\r\nWMwbphpXGl2oqisDeGz7Z8yyEWHYAyL9Qsg3G9aeD1rJgz29jf76BHU2RcrH\r\n69So27T8jEmqrrN8klEKxqfNnDNg2sQHrB988eCYVeSvd0kdndtqsHI4g0zp\r\nNzD2HPgFjg2H1Zf1PTJ+dhw68iEYSR++fRufO60wb5vD3mQ69ofKCEiF7fzl\r\nPccsNJR0xzfdNRGmUcqMIE/KBmNbetrnxDE=\r\n=FBJq\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"spikebot","email":"abatallah1214@gmail.com"},"maintainers":[{"name":"spikebot","email":"abatallah1214@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spike-player_1.4.4-9_1665397522775_0.2828712689346773"},"_hasShrinkwrap":false},"1.4.5":{"name":"spike-player","version":"1.4.5","description":"Complete framework to facilitate music commands using discord.js v13 & v14","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","test":"jest test/test.js","clean":"rimraf dist","pre":"npm version prerelease --force && npm publish --access public --tag dev","prep":"npm run clean && npm run build","pub":"conventional-changelog -p angular -i CHANGELOG.md -s && npm publish"},"keywords":["music","player","bot","framework","discord","youtube","spotify","v13","v14"],"dependencies":{"@discordjs/opus":"^0.8.0","@discordjs/voice":"^0.11.0","@spikebot/discord-ytdl-core":"^1.0.4","@spikebot/ytdl-core":"^1.0.2","@types/node":"^18.7.23","@typescript-eslint/eslint-plugin":"^5.38.1","@typescript-eslint/parser":"^5.38.1","axios":"^0.27.2","axios-retry":"^3.3.1","domhandler":"^5.0.3","eslint":"^8.24.0","ffmpeg-static":"^5.1.0","htmlparser2":"^8.0.1","isomorphic-unfetch":"^3.1.0","jest":"^29.1.2","libsodium-wrappers":"^0.7.10","rimraf":"^3.0.2","soundcloud-scraper":"github:AnupKumarPanwar/soundcloud-scraper","spotify-url-info":"^3.1.8","youtubei":"^1.0.0-rc.5","ytsr":"^3.8.0"},"devDependencies":{"@babel/cli":"^7.19.3","@babel/core":"^7.19.3","@babel/preset-env":"^7.19.3","@babel/preset-typescript":"^7.18.6","@commitlint/cli":"^17.1.2","@rocketseat/commitlint-config":"^0.0.3","@types/node":"^18.7.23","@typescript-eslint/eslint-plugin":"^5.38.1","@typescript-eslint/parser":"^5.38.1","assert-diff":"^3.0.2","discord.js":"^14.5.0","discord.js-docgen":"github:discordjs/docgen#ts-patch","eslint":"^8.24.0","husky":"^8.0.1","jest":"^29.1.2","jsdoc-babel":"^0.5.0","ts-node":"^10.9.1","typescript":"^4.8.4"},"directories":{"doc":"docs","test":"test"},"engines":{"node":">=16.9.0"},"workspaces":["packages/*"],"packageManager":"npm@8.11.0","gitHead":"0952dc4d78be5686bf665e4fd6621c6aae6a73bc","_id":"spike-player@1.4.5","_nodeVersion":"16.17.0","_npmVersion":"8.18.0","dist":{"integrity":"sha512-oQ9rOnw9bUxrRJioiHlwzBjvy+YJEW8PsaF5vBvX5mPXlR3mdvC2A2gosjSyeYyhRVAQegv6m27Yo0EYAIUZNw==","shasum":"0aaf7dd8e367f08129fcb2f593b4589b46a66ebb","tarball":"https://registry.npmjs.org/spike-player/-/spike-player-1.4.5.tgz","fileCount":30,"unpackedSize":105971,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDUnvlLxwF9hXpfa3IXYQYjILugLrSSmqCN739pU9MkUQIhAKsA76DTmwd+L4zzVAR94W4PiWxqsFn08xW8TYGRc4vh"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjYSzrACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmowWw//dI1AVJcm3OiBRRiVkka72lZ5GGvNNOuPimoBhsCi7cXUYTX4\r\n+SwSOtW79QrXNFyOx27adEZJND5MFz0RT0gKJTnYM2p00DON/5gqZ3dLs5Zy\r\nKNn8zw1oQ2vKw/dQyMhRqOyhAJsCFTntNRby6dOmLuFmT5zxHPSLZExp9FPW\r\nhGe2at3Bj4L3UJM2yDyGWe/tZQUUEpVzS4D6b7YKUnIgOyGxLXdxzqimcZhB\r\n5l96XOy5+mtZpmmpDpbKpgOrQ+Z5uhLqWs4GPch3S/DjF3X7CfVmDXMray89\r\n2U2e/UJy0pwdOAbeK49DKbV6cWcXZOsiLaxzIimTms+WBQOMsHifeAk5Rtpr\r\n9DxhoKEANRVmLW3giXHqDGCbbX5o6h8xEnDaR8yDsTqBuPg3ZfeEmEgWGPmL\r\n/nhkgT9JZq1iuB5B1+Je/aGVj7DSXxHpeuADo8ZlAAjM7/yDu8q7AS00/Y0X\r\nCNcfkyVJAkKTiTFtS++pwhK0fAhWp4cWuGIxPYJex8057w+V8RhbwnczHFTf\r\nREEb3Eq+KKOdIcufzmewcSPNf0cFX5pesMpx6NLh6uM5Nsz7NveYpkfaSLvZ\r\nEXpsole3YwE9O1o/U5FmsqitHaW0nNawc0FeTump3kjvzE9tpimHN6LVI4vq\r\n10whttqxCibxlxZJatO80cr39domJdP8g1w=\r\n=jY0D\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"spikebot","email":"abatallah1214@gmail.com"},"maintainers":[{"name":"spikebot","email":"abatallah1214@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spike-player_1.4.5_1667312874891_0.009134995974127591"},"_hasShrinkwrap":false},"1.4.6-1":{"name":"spike-player","version":"1.4.6-1","description":"Complete framework to facilitate music commands using discord.js v13 & v14","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","test":"jest test/test.js","clean":"rimraf dist","pre":"npm version prerelease --force && npm publish --access public --tag dev","prep":"npm run clean && npm run build","pub":"conventional-changelog -p angular -i CHANGELOG.md -s && npm publish"},"keywords":["music","player","bot","framework","discord","youtube","spotify","v13","v14"],"dependencies":{"@discordjs/opus":"^0.9.0","@discordjs/voice":"^0.14.0","@spikebot/discord-ytdl-core":"^1.0.4","@spikebot/ytdl-core":"^1.0.2","@types/node":"^18.11.17","@typescript-eslint/eslint-plugin":"^5.47.0","@typescript-eslint/parser":"^5.47.0","axios":"^1.2.1","axios-retry":"^3.3.1","domhandler":"^5.0.3","eslint":"^8.30.0","ffmpeg-static":"^5.1.0","htmlparser2":"^8.0.1","isomorphic-unfetch":"^3.1.0","jest":"^29.3.1","libsodium-wrappers":"^0.7.10","rimraf":"^3.0.2","soundcloud-scraper":"github:AnupKumarPanwar/soundcloud-scraper","spotify-url-info":"^3.1.10","youtubei":"^1.0.0-rc.8","ytsr":"^3.8.0"},"devDependencies":{"@babel/cli":"^7.20.7","@babel/core":"^7.20.7","@babel/preset-env":"^7.20.2","@babel/preset-typescript":"^7.18.6","@commitlint/cli":"^17.3.0","@rocketseat/commitlint-config":"^0.0.3","@types/node":"^18.11.17","@typescript-eslint/eslint-plugin":"^5.47.0","@typescript-eslint/parser":"^5.47.0","assert-diff":"^3.0.2","discord.js":"^14.7.1","discord.js-docgen":"github:discordjs/docgen#ts-patch","eslint":"^8.30.0","husky":"^8.0.2","jest":"^29.3.1","jsdoc-babel":"^0.5.0","ts-node":"^10.9.1","typescript":"^4.9.4"},"directories":{"doc":"docs","test":"test"},"engines":{"node":">=16.9.0"},"workspaces":["packages/*"],"packageManager":"npm@8.11.0","readme":"# Discord Music Player\r\n![npm](https://img.shields.io/npm/dt/discord-music-player?style=for-the-badge)\r\n![npm](https://img.shields.io/npm/v/discord-music-player?style=for-the-badge)\r\n![CodeFactor Grade](https://img.shields.io/codefactor/grade/github/SushiBtw/discord-music-player?color=%2348aaf1&style=for-the-badge)\r\n\r\n### Note: This is the v8 version of Discord Music Player for Discord.JS v13!\r\n\r\nDiscord Music Player is a powerful [Node.js](https://nodejs.org) module that allows you to easily implement music commands.\r\n**Everything** is customizable, and everything can be done using this package - **there are no limitations!**\r\n\r\nThis package supports YouTube Videos & Playlists, Spotify Songs & Playlists, Apple Music Songs & Playlists.\r\nPackage from version v7.0.0 is fully maintained by [SushiBtw](https://github.com/SushiBtw).\r\n\r\n### Requirements:\r\n- [Discord.js v13](https://www.npmjs.com/package/discord.js),\r\n- [Node.JS v16](https://nodejs.org/),\r\n\r\n# Installation\r\n*Node.JS v16 or newer is required to run this module.*\r\n```sh\r\nnpm install --save discord-music-player\r\n```\r\nInstall **@discordjs/opus**:\r\n```sh\r\nnpm install --save @discordjs/opus\r\n```\r\n**Install [FFMPEG](https://www.ffmpeg.org/download.html)!**\r\n\r\n# Documentation\r\n**Discord Music Player documentation: [https://discord-music-player.js.org/](https://discord-music-player.js.org/)**\r\n\r\n### **Need some help?**\r\nFeel free to join [Discord-Music-Player Discord Server](https://discord.gg/6fejZNsmFC) and ask us about DMP.\r\n\r\n# Getting Started\r\n**The code bellow, will show you how to use DMP in your code.**\r\n\r\n*Please define your **Player** after the **client/bot** definition.*\r\n\r\n[!] Remember to include the related voice **Intents** at the client options. [!]\r\n```js\r\nconst Discord = require(\"discord.js\");\r\nconst client = new Discord.Client({\r\n    intents: [Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES, Intents.FLAGS.GUILD_VOICE_STATES]\r\n});\r\nconst settings = {\r\n    prefix: '!',\r\n    token: 'YourBotTokenHere'\r\n};\r\n\r\nconst { Player } = require(\"discord-music-player\");\r\nconst player = new Player(client, {\r\n    leaveOnEmpty: false, // This options are optional.\r\n});\r\n// You can define the Player as *client.player* to easily access it.\r\nclient.player = player;\r\n\r\nclient.on(\"ready\", () => {\r\n    console.log(\"I am ready to Play with DMP 🎶\");\r\n});\r\n\r\nclient.login(settings.token);\r\n```\r\n\r\n# Example Usage\r\n```js\r\nconst { RepeatMode } = require('discord-music-player');\r\n\r\nclient.on('messageCreate', async (message) => {\r\n    const args = message.content.slice(settings.prefix.length).trim().split(/ +/g);\r\n    const command = args.shift();\r\n    let guildQueue = client.player.getQueue(message.guild.id);\r\n\r\n    if(command === 'play') {\r\n        let queue = client.player.createQueue(message.guild.id);\r\n        await queue.join(message.member.voice.channel);\r\n        let song = await queue.play(args.join(' ')).catch(_ => {\r\n            if(!guildQueue)\r\n                queue.stop();\r\n        });\r\n    }\r\n\r\n    if(command === 'playlist') {\r\n        let queue = client.player.createQueue(message.guild.id);\r\n        await queue.join(message.member.voice.channel);\r\n        let song = await queue.playlist(args.join(' ')).catch(_ => {\r\n            if(!guildQueue)\r\n                queue.stop();\r\n        });\r\n    }\r\n\r\n    if(command === 'skip') {\r\n        guildQueue.skip();\r\n    }\r\n\r\n    if(command === 'stop') {\r\n        guildQueue.stop();\r\n    }\r\n\r\n    if(command === 'removeLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.DISABLED); // or 0 instead of RepeatMode.DISABLED\r\n    }\r\n\r\n    if(command === 'toggleLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.SONG); // or 1 instead of RepeatMode.SONG\r\n    }\r\n\r\n    if(command === 'toggleQueueLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.QUEUE); // or 2 instead of RepeatMode.QUEUE\r\n    }\r\n\r\n    if(command === 'setVolume') {\r\n        guildQueue.setVolume(parseInt(args[0]));\r\n    }\r\n\r\n    if(command === 'seek') {\r\n        guildQueue.seek(parseInt(args[0]) * 1000);\r\n    }\r\n\r\n    if(command === 'clearQueue') {\r\n        guildQueue.clearQueue();\r\n    }\r\n\r\n    if(command === 'shuffle') {\r\n        guildQueue.shuffle();\r\n    }\r\n\r\n    if(command === 'getQueue') {\r\n        console.log(guildQueue);\r\n    }\r\n\r\n    if(command === 'getVolume') {\r\n        console.log(guildQueue.volume)\r\n    }\r\n\r\n    if(command === 'nowPlaying') {\r\n        console.log(`Now playing: ${guildQueue.nowPlaying}`);\r\n    }\r\n\r\n    if(command === 'pause') {\r\n        guildQueue.setPaused(true);\r\n    }\r\n\r\n    if(command === 'resume') {\r\n        guildQueue.setPaused(false);\r\n    }\r\n\r\n    if(command === 'remove') {\r\n        guildQueue.remove(parseInt(args[0]));\r\n    }\r\n\r\n    if(command === 'createProgressBar') {\r\n        const ProgressBar = guildQueue.createProgressBar();\r\n        \r\n        // [======>              ][00:35/2:20]\r\n        console.log(ProgressBar.prettier);\r\n    }\r\n})\r\n```\r\n\r\n### Events:\r\n```js\r\n// Init the event listener only once (at the top of your code).\r\nclient.player\r\n    // Emitted when channel was empty.\r\n    .on('channelEmpty',  (queue) =>\r\n        console.log(`Everyone left the Voice Channel, queue ended.`))\r\n    // Emitted when a song was added to the queue.\r\n    .on('songAdd',  (queue, song) =>\r\n        console.log(`Song ${song} was added to the queue.`))\r\n    // Emitted when a playlist was added to the queue.\r\n    .on('playlistAdd',  (queue, playlist) =>\r\n        console.log(`Playlist ${playlist} with ${playlist.songs.length} was added to the queue.`))\r\n    // Emitted when there was no more music to play.\r\n    .on('queueDestroyed',  (queue) =>\r\n        console.log(`The queue was destroyed.`))\r\n    // Emitted when the queue was destroyed (either by ending or stopping).    \r\n    .on('queueEnd',  (queue) =>\r\n        console.log(`The queue has ended.`))\r\n    // Emitted when a song changed.\r\n    .on('songChanged', (queue, newSong, oldSong) =>\r\n        console.log(`${newSong} is now playing.`))\r\n    // Emitted when a first song in the queue started playing.\r\n    .on('songFirst',  (queue, song) =>\r\n        console.log(`Started playing ${song}.`))\r\n    // Emitted when someone disconnected the bot from the channel.\r\n    .on('clientDisconnect', (queue) =>\r\n        console.log(`I was kicked from the Voice Channel, queue ended.`))\r\n    // Emitted when deafenOnJoin is true and the bot was undeafened\r\n    .on('clientUndeafen', (queue) =>\r\n        console.log(`I got undefeanded.`))\r\n    // Emitted when there was an error in runtime\r\n    .on('error', (error, queue) => {\r\n        console.log(`Error: ${error} in ${queue.guild.name}`);\r\n    });\r\n```\r\n\r\n# Passing custom data\r\n\r\n### Queue\r\nWhile running the `Queue#createQueue()` method you can pass a `options#data` object to hold custom data.\r\nThis can be made in two ways:\r\n```js\r\n// Pass custom data\r\nawait player.createQueue(message.guild.id, {\r\n    data: {\r\n        queueInitMessage: message,\r\n        myObject: 'this will stay with the queue :)',\r\n        more: 'add more... there are no limitations...'\r\n    }\r\n});\r\n// Or by using\r\nqueue.setData({\r\n    whatever: 'you want :D'\r\n});\r\n\r\n// Access custom data\r\nlet queue = player.getQueue(message.guild.id);\r\nlet initMessage = queue.data.queueInitMessage;\r\nawait initMessage.channel.send(`This message object is hold in Queue :D`);\r\n```\r\n\r\n### Song or Playlist\r\nWhile running the `Queue#play()`/Queue#playlist() method you can pass a `options#data` object to hold custom data.\r\nThis can be made in two ways:\r\n```js\r\n// Play the song\r\nlet song = await queue.play('Born in the USA!');\r\n// Set song data\r\nsong.setData({\r\n    initMessage: message\r\n});\r\n\r\n// Play the playlist\r\nlet playlist = await queue.playlist('https://www.youtube.com/playlist?list=PLDLGxnP4y2mGKGEqwxWTRkd3HtrrVTMdU');\r\n// Set playlist data (will set data for each song in the playlist)\r\nsong.setData({\r\n    initMessage: message\r\n});\r\n\r\n// Access custom data\r\nlet queue = player.getQueue(message.guild.id);\r\nlet { initMessage } = queue.nowPlaying.data;\r\nawait initMessage.channel.send(`This message object is hold in Song :D`);\r\n```\r\n","readmeFilename":"README.md","gitHead":"d067d955a0b2073434dc8a453bb4db53d4fae90d","_id":"spike-player@1.4.6-1","_nodeVersion":"16.17.0","_npmVersion":"8.18.0","dist":{"integrity":"sha512-AJ014bolbuvsKP8Px+UcNVIBfgXxpd+Q8I5JtGTNRgc49Skb0WPiYVmBlF6kyy2sFFPhXcozYTrk8eYo1XHm4g==","shasum":"070e23143c91498e084268cc8218b81e69e83146","tarball":"https://registry.npmjs.org/spike-player/-/spike-player-1.4.6-1.tgz","fileCount":30,"unpackedSize":107242,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHPy6h6kaRjxitMwyJJC/wmoJabKPc2FbseYVTDomeSzAiA9ABvOXJJcstroS36YKuXpvhMJYfxgIq8zYSpZh000SA=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjpYjjACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmrrlg//XGtNUQXvgoBYcuvubiBFJbTO/sFFNxMnOGElHp18sA6WPUgD\r\nFUZrfarc41TJ91RBzJK3bqlNZi0AW6tNVQmyTDiSgdIid/+HZc1XJtVc3wK+\r\nHCZoUjOWqb5Sb4VP9khmFyY8r23PDAx8nsCR7HodjycnpjF6OUvAoJEne6XB\r\nSNx0SRHkhvc+Fqy1Et/gsbYYOQ54XKze9L6LWgWIWI/a9X55/yy4xcNXITBH\r\njUq/wCv0PSHC16dmDKwbNOg5Df60AD3fkAnl90yso7PdiiUnCts94KWGuQ4f\r\nWdc66XjWVspclfu26B8p9HRPEu8NAe8q23Y1DAwfgyCmd+4BWMnpaaOgElFN\r\nKhY8DqkS4YIH5JW08ZEI5bo3IPH8aEmSLibfaZoaoFxWa5hbpCqSfA7ZBtb3\r\na9p8uG9eiI0i4sa9UGUTdLK6Obog7bgcaCv1kstu5vUVEU1zZEXTNwJoy2DE\r\n/UqwKpPlIoRSmBOa+ef+e+eGlOIL7F0npipge2/VL7vS7WSU7MBkn0Nfzj9P\r\nFUNE7k+9UjW+u7WVkuP9z7sE4hJ3x/1M1cCU5h2S0L0HYhsFoxVqgvNsVbHX\r\nxtWJ4u9hT4ORgVqK67tFTmtXgXa38kBP5cBQw4ZUQKpOdOKekO7mVmEo+N8q\r\nuOzAa3DxksXVv0gaT6q+d1SegnW3O2LIa5E=\r\n=yo9J\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"spikebot","email":"abatallah1214@gmail.com"},"maintainers":[{"name":"spikebot","email":"abatallah1214@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spike-player_1.4.6-1_1671792867513_0.029241803391545362"},"_hasShrinkwrap":false},"1.4.6-2":{"name":"spike-player","version":"1.4.6-2","description":"Complete framework to facilitate music commands using discord.js v13 & v14","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","test":"jest test/test.js","clean":"rimraf dist","pre":"npm version prerelease --force && npm publish --access public --tag dev","prep":"npm run clean && npm run build","pub":"conventional-changelog -p angular -i CHANGELOG.md -s && npm publish"},"keywords":["music","player","bot","framework","discord","youtube","spotify","v13","v14"],"dependencies":{"@discordjs/opus":"^0.9.0","@discordjs/voice":"^0.14.0","@spikebot/discord-ytdl-core":"^1.0.4","@spikebot/ytdl-core":"^1.0.2","@types/node":"^18.11.17","@typescript-eslint/eslint-plugin":"^5.47.0","@typescript-eslint/parser":"^5.47.0","axios":"^1.2.1","axios-retry":"^3.3.1","domhandler":"^5.0.3","eslint":"^8.30.0","ffmpeg-static":"^5.1.0","htmlparser2":"^8.0.1","isomorphic-unfetch":"^3.1.0","jest":"^29.3.1","libsodium-wrappers":"^0.7.10","rimraf":"^3.0.2","soundcloud-scraper":"github:AnupKumarPanwar/soundcloud-scraper","spotify-url-info":"^3.1.8","youtubei":"^1.0.0-rc.8","ytsr":"^3.8.0"},"devDependencies":{"@babel/cli":"^7.20.7","@babel/core":"^7.20.7","@babel/preset-env":"^7.20.2","@babel/preset-typescript":"^7.18.6","@commitlint/cli":"^17.3.0","@rocketseat/commitlint-config":"^0.0.3","@types/node":"^18.11.17","@typescript-eslint/eslint-plugin":"^5.47.0","@typescript-eslint/parser":"^5.47.0","assert-diff":"^3.0.2","discord.js":"^14.7.1","discord.js-docgen":"github:discordjs/docgen#ts-patch","eslint":"^8.30.0","husky":"^8.0.2","jest":"^29.3.1","jsdoc-babel":"^0.5.0","ts-node":"^10.9.1","typescript":"^4.9.4"},"directories":{"doc":"docs","test":"test"},"engines":{"node":">=16.9.0"},"workspaces":["packages/*"],"packageManager":"npm@8.11.0","readme":"# Discord Music Player\r\n![npm](https://img.shields.io/npm/dt/discord-music-player?style=for-the-badge)\r\n![npm](https://img.shields.io/npm/v/discord-music-player?style=for-the-badge)\r\n![CodeFactor Grade](https://img.shields.io/codefactor/grade/github/SushiBtw/discord-music-player?color=%2348aaf1&style=for-the-badge)\r\n\r\n### Note: This is the v8 version of Discord Music Player for Discord.JS v13!\r\n\r\nDiscord Music Player is a powerful [Node.js](https://nodejs.org) module that allows you to easily implement music commands.\r\n**Everything** is customizable, and everything can be done using this package - **there are no limitations!**\r\n\r\nThis package supports YouTube Videos & Playlists, Spotify Songs & Playlists, Apple Music Songs & Playlists.\r\nPackage from version v7.0.0 is fully maintained by [SushiBtw](https://github.com/SushiBtw).\r\n\r\n### Requirements:\r\n- [Discord.js v13](https://www.npmjs.com/package/discord.js),\r\n- [Node.JS v16](https://nodejs.org/),\r\n\r\n# Installation\r\n*Node.JS v16 or newer is required to run this module.*\r\n```sh\r\nnpm install --save discord-music-player\r\n```\r\nInstall **@discordjs/opus**:\r\n```sh\r\nnpm install --save @discordjs/opus\r\n```\r\n**Install [FFMPEG](https://www.ffmpeg.org/download.html)!**\r\n\r\n# Documentation\r\n**Discord Music Player documentation: [https://discord-music-player.js.org/](https://discord-music-player.js.org/)**\r\n\r\n### **Need some help?**\r\nFeel free to join [Discord-Music-Player Discord Server](https://discord.gg/6fejZNsmFC) and ask us about DMP.\r\n\r\n# Getting Started\r\n**The code bellow, will show you how to use DMP in your code.**\r\n\r\n*Please define your **Player** after the **client/bot** definition.*\r\n\r\n[!] Remember to include the related voice **Intents** at the client options. [!]\r\n```js\r\nconst Discord = require(\"discord.js\");\r\nconst client = new Discord.Client({\r\n    intents: [Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES, Intents.FLAGS.GUILD_VOICE_STATES]\r\n});\r\nconst settings = {\r\n    prefix: '!',\r\n    token: 'YourBotTokenHere'\r\n};\r\n\r\nconst { Player } = require(\"discord-music-player\");\r\nconst player = new Player(client, {\r\n    leaveOnEmpty: false, // This options are optional.\r\n});\r\n// You can define the Player as *client.player* to easily access it.\r\nclient.player = player;\r\n\r\nclient.on(\"ready\", () => {\r\n    console.log(\"I am ready to Play with DMP 🎶\");\r\n});\r\n\r\nclient.login(settings.token);\r\n```\r\n\r\n# Example Usage\r\n```js\r\nconst { RepeatMode } = require('discord-music-player');\r\n\r\nclient.on('messageCreate', async (message) => {\r\n    const args = message.content.slice(settings.prefix.length).trim().split(/ +/g);\r\n    const command = args.shift();\r\n    let guildQueue = client.player.getQueue(message.guild.id);\r\n\r\n    if(command === 'play') {\r\n        let queue = client.player.createQueue(message.guild.id);\r\n        await queue.join(message.member.voice.channel);\r\n        let song = await queue.play(args.join(' ')).catch(_ => {\r\n            if(!guildQueue)\r\n                queue.stop();\r\n        });\r\n    }\r\n\r\n    if(command === 'playlist') {\r\n        let queue = client.player.createQueue(message.guild.id);\r\n        await queue.join(message.member.voice.channel);\r\n        let song = await queue.playlist(args.join(' ')).catch(_ => {\r\n            if(!guildQueue)\r\n                queue.stop();\r\n        });\r\n    }\r\n\r\n    if(command === 'skip') {\r\n        guildQueue.skip();\r\n    }\r\n\r\n    if(command === 'stop') {\r\n        guildQueue.stop();\r\n    }\r\n\r\n    if(command === 'removeLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.DISABLED); // or 0 instead of RepeatMode.DISABLED\r\n    }\r\n\r\n    if(command === 'toggleLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.SONG); // or 1 instead of RepeatMode.SONG\r\n    }\r\n\r\n    if(command === 'toggleQueueLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.QUEUE); // or 2 instead of RepeatMode.QUEUE\r\n    }\r\n\r\n    if(command === 'setVolume') {\r\n        guildQueue.setVolume(parseInt(args[0]));\r\n    }\r\n\r\n    if(command === 'seek') {\r\n        guildQueue.seek(parseInt(args[0]) * 1000);\r\n    }\r\n\r\n    if(command === 'clearQueue') {\r\n        guildQueue.clearQueue();\r\n    }\r\n\r\n    if(command === 'shuffle') {\r\n        guildQueue.shuffle();\r\n    }\r\n\r\n    if(command === 'getQueue') {\r\n        console.log(guildQueue);\r\n    }\r\n\r\n    if(command === 'getVolume') {\r\n        console.log(guildQueue.volume)\r\n    }\r\n\r\n    if(command === 'nowPlaying') {\r\n        console.log(`Now playing: ${guildQueue.nowPlaying}`);\r\n    }\r\n\r\n    if(command === 'pause') {\r\n        guildQueue.setPaused(true);\r\n    }\r\n\r\n    if(command === 'resume') {\r\n        guildQueue.setPaused(false);\r\n    }\r\n\r\n    if(command === 'remove') {\r\n        guildQueue.remove(parseInt(args[0]));\r\n    }\r\n\r\n    if(command === 'createProgressBar') {\r\n        const ProgressBar = guildQueue.createProgressBar();\r\n        \r\n        // [======>              ][00:35/2:20]\r\n        console.log(ProgressBar.prettier);\r\n    }\r\n})\r\n```\r\n\r\n### Events:\r\n```js\r\n// Init the event listener only once (at the top of your code).\r\nclient.player\r\n    // Emitted when channel was empty.\r\n    .on('channelEmpty',  (queue) =>\r\n        console.log(`Everyone left the Voice Channel, queue ended.`))\r\n    // Emitted when a song was added to the queue.\r\n    .on('songAdd',  (queue, song) =>\r\n        console.log(`Song ${song} was added to the queue.`))\r\n    // Emitted when a playlist was added to the queue.\r\n    .on('playlistAdd',  (queue, playlist) =>\r\n        console.log(`Playlist ${playlist} with ${playlist.songs.length} was added to the queue.`))\r\n    // Emitted when there was no more music to play.\r\n    .on('queueDestroyed',  (queue) =>\r\n        console.log(`The queue was destroyed.`))\r\n    // Emitted when the queue was destroyed (either by ending or stopping).    \r\n    .on('queueEnd',  (queue) =>\r\n        console.log(`The queue has ended.`))\r\n    // Emitted when a song changed.\r\n    .on('songChanged', (queue, newSong, oldSong) =>\r\n        console.log(`${newSong} is now playing.`))\r\n    // Emitted when a first song in the queue started playing.\r\n    .on('songFirst',  (queue, song) =>\r\n        console.log(`Started playing ${song}.`))\r\n    // Emitted when someone disconnected the bot from the channel.\r\n    .on('clientDisconnect', (queue) =>\r\n        console.log(`I was kicked from the Voice Channel, queue ended.`))\r\n    // Emitted when deafenOnJoin is true and the bot was undeafened\r\n    .on('clientUndeafen', (queue) =>\r\n        console.log(`I got undefeanded.`))\r\n    // Emitted when there was an error in runtime\r\n    .on('error', (error, queue) => {\r\n        console.log(`Error: ${error} in ${queue.guild.name}`);\r\n    });\r\n```\r\n\r\n# Passing custom data\r\n\r\n### Queue\r\nWhile running the `Queue#createQueue()` method you can pass a `options#data` object to hold custom data.\r\nThis can be made in two ways:\r\n```js\r\n// Pass custom data\r\nawait player.createQueue(message.guild.id, {\r\n    data: {\r\n        queueInitMessage: message,\r\n        myObject: 'this will stay with the queue :)',\r\n        more: 'add more... there are no limitations...'\r\n    }\r\n});\r\n// Or by using\r\nqueue.setData({\r\n    whatever: 'you want :D'\r\n});\r\n\r\n// Access custom data\r\nlet queue = player.getQueue(message.guild.id);\r\nlet initMessage = queue.data.queueInitMessage;\r\nawait initMessage.channel.send(`This message object is hold in Queue :D`);\r\n```\r\n\r\n### Song or Playlist\r\nWhile running the `Queue#play()`/Queue#playlist() method you can pass a `options#data` object to hold custom data.\r\nThis can be made in two ways:\r\n```js\r\n// Play the song\r\nlet song = await queue.play('Born in the USA!');\r\n// Set song data\r\nsong.setData({\r\n    initMessage: message\r\n});\r\n\r\n// Play the playlist\r\nlet playlist = await queue.playlist('https://www.youtube.com/playlist?list=PLDLGxnP4y2mGKGEqwxWTRkd3HtrrVTMdU');\r\n// Set playlist data (will set data for each song in the playlist)\r\nsong.setData({\r\n    initMessage: message\r\n});\r\n\r\n// Access custom data\r\nlet queue = player.getQueue(message.guild.id);\r\nlet { initMessage } = queue.nowPlaying.data;\r\nawait initMessage.channel.send(`This message object is hold in Song :D`);\r\n```\r\n","readmeFilename":"README.md","gitHead":"c67c8caf717645f10582379119fec2590e3d7bfb","_id":"spike-player@1.4.6-2","_nodeVersion":"16.17.0","_npmVersion":"8.18.0","dist":{"integrity":"sha512-+RMUNha7H6SY8nQAYDbHdteEjGl9u+9oth2j09I2L3SQEoN08dl1v9X5+5wiBmOSn9MmEfsHtzEpkqCoDCSkLA==","shasum":"2188cd4d200f716b06a19b579fa7ce64d91f436c","tarball":"https://registry.npmjs.org/spike-player/-/spike-player-1.4.6-2.tgz","fileCount":30,"unpackedSize":107241,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBrrgC7Xg/yJ9MlomBUn2y6kFiSQrqUK1Zn3lFV1t6YgAiBAMhymLt/wc+8bKi4bHZsEEgxeq3mFLoOFTmqU0n6QgQ=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjpYpxACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmp0iw//XXstPcPD0kke76xzsHSoHfiPPbZRU0rJDUMJzko99tWwfTkq\r\nVnyKY1xIYWa8t+7K1pOqYXFoWUdA+urSDDdguo7uCn156i0QP1IbX5l4cPCC\r\n6QNV8Z13mc1WATYOP8xG1QjKay5mkoaWMNs1PRvUyHPH//N29mwCA15tGq4L\r\njaXBxa873oZGbI4tgmPMldYngQXghEfcJXgoQuWIkn9/z0ImiqE19BK9obUt\r\nF7FD+zZNUBU+C92WALcNe+v0VIHrJmAld3EX/SPJT4+PutFgUEmoJJQ3bWgd\r\nqcnXS+u488CGpjdDSlIlFXtjLDRpVff8txlHKsf8WpSDrUxqjegOpJ6ectq8\r\nm+sEiS43dhyJBOf5Lnvnx96GrtG5L7VdbWKw4JUMO5bkiZHI/uv3PFALxUsK\r\nQ19tC8NJpBAVrTrC+2OOPChv7cT3g/wh20cSrCv7eH/+CpNfAzYYgPFicehK\r\nHk4S3Ic9G13k+2mQ+K0pBXQ9LWopoKgCcQA1x7c1t4foNDq/VX1BF/c+kLZW\r\nG1GesNSfx8o4akPXPJhn6AP+BzyoAEYLMCRzXx4IiJlsJ92E2HKTUxAZuhGt\r\na6Ed1CXhCPIWCx7DATn+lkBiCAif29sz/lDJd3gA37tY2zOQOlKcEYluQL/v\r\nV9mW9h70Ii0YzEXLj0QMNL5R5C8pe400H5w=\r\n=hzUW\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"spikebot","email":"abatallah1214@gmail.com"},"maintainers":[{"name":"spikebot","email":"abatallah1214@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spike-player_1.4.6-2_1671793264804_0.31927153089161786"},"_hasShrinkwrap":false},"1.4.6-3":{"name":"spike-player","version":"1.4.6-3","description":"Complete framework to facilitate music commands using discord.js v13 & v14","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","test":"jest test/test.js","clean":"rimraf dist","pre":"npm version prerelease --force && npm publish --access public --tag dev","prep":"npm run clean && npm run build","pub":"conventional-changelog -p angular -i CHANGELOG.md -s && npm publish"},"keywords":["music","player","bot","framework","discord","youtube","spotify","v13","v14"],"dependencies":{"@discordjs/opus":"^0.9.0","@discordjs/voice":"^0.14.0","@spikebot/discord-ytdl-core":"^1.0.4","@spikebot/ytdl-core":"^1.0.2","@types/node":"^18.11.17","@typescript-eslint/eslint-plugin":"^5.47.0","@typescript-eslint/parser":"^5.47.0","axios":"^1.2.1","axios-retry":"^3.3.1","domhandler":"^5.0.3","eslint":"^8.30.0","ffmpeg-static":"^5.1.0","htmlparser2":"^8.0.1","isomorphic-unfetch":"^3.1.0","jest":"^29.3.1","libsodium-wrappers":"^0.7.10","rimraf":"^3.0.2","soundcloud-scraper":"github:AnupKumarPanwar/soundcloud-scraper","spotify-url-info":"^3.1.8","youtubei":"^1.0.0-rc.8","ytsr":"^3.8.0"},"devDependencies":{"@babel/cli":"^7.20.7","@babel/core":"^7.20.7","@babel/preset-env":"^7.20.2","@babel/preset-typescript":"^7.18.6","@commitlint/cli":"^17.3.0","@rocketseat/commitlint-config":"^0.0.3","@types/node":"^18.11.17","@typescript-eslint/eslint-plugin":"^5.47.0","@typescript-eslint/parser":"^5.47.0","assert-diff":"^3.0.2","discord.js":"^14.7.1","discord.js-docgen":"github:discordjs/docgen#ts-patch","eslint":"^8.30.0","husky":"^8.0.2","jest":"^29.3.1","jsdoc-babel":"^0.5.0","ts-node":"^10.9.1","typescript":"^4.9.4"},"directories":{"doc":"docs","test":"test"},"engines":{"node":">=16.9.0"},"workspaces":["packages/*"],"packageManager":"npm@8.11.0","readme":"# Discord Music Player\r\n![npm](https://img.shields.io/npm/dt/discord-music-player?style=for-the-badge)\r\n![npm](https://img.shields.io/npm/v/discord-music-player?style=for-the-badge)\r\n![CodeFactor Grade](https://img.shields.io/codefactor/grade/github/SushiBtw/discord-music-player?color=%2348aaf1&style=for-the-badge)\r\n\r\n### Note: This is the v8 version of Discord Music Player for Discord.JS v13!\r\n\r\nDiscord Music Player is a powerful [Node.js](https://nodejs.org) module that allows you to easily implement music commands.\r\n**Everything** is customizable, and everything can be done using this package - **there are no limitations!**\r\n\r\nThis package supports YouTube Videos & Playlists, Spotify Songs & Playlists, Apple Music Songs & Playlists.\r\nPackage from version v7.0.0 is fully maintained by [SushiBtw](https://github.com/SushiBtw).\r\n\r\n### Requirements:\r\n- [Discord.js v13](https://www.npmjs.com/package/discord.js),\r\n- [Node.JS v16](https://nodejs.org/),\r\n\r\n# Installation\r\n*Node.JS v16 or newer is required to run this module.*\r\n```sh\r\nnpm install --save discord-music-player\r\n```\r\nInstall **@discordjs/opus**:\r\n```sh\r\nnpm install --save @discordjs/opus\r\n```\r\n**Install [FFMPEG](https://www.ffmpeg.org/download.html)!**\r\n\r\n# Documentation\r\n**Discord Music Player documentation: [https://discord-music-player.js.org/](https://discord-music-player.js.org/)**\r\n\r\n### **Need some help?**\r\nFeel free to join [Discord-Music-Player Discord Server](https://discord.gg/6fejZNsmFC) and ask us about DMP.\r\n\r\n# Getting Started\r\n**The code bellow, will show you how to use DMP in your code.**\r\n\r\n*Please define your **Player** after the **client/bot** definition.*\r\n\r\n[!] Remember to include the related voice **Intents** at the client options. [!]\r\n```js\r\nconst Discord = require(\"discord.js\");\r\nconst client = new Discord.Client({\r\n    intents: [Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES, Intents.FLAGS.GUILD_VOICE_STATES]\r\n});\r\nconst settings = {\r\n    prefix: '!',\r\n    token: 'YourBotTokenHere'\r\n};\r\n\r\nconst { Player } = require(\"discord-music-player\");\r\nconst player = new Player(client, {\r\n    leaveOnEmpty: false, // This options are optional.\r\n});\r\n// You can define the Player as *client.player* to easily access it.\r\nclient.player = player;\r\n\r\nclient.on(\"ready\", () => {\r\n    console.log(\"I am ready to Play with DMP 🎶\");\r\n});\r\n\r\nclient.login(settings.token);\r\n```\r\n\r\n# Example Usage\r\n```js\r\nconst { RepeatMode } = require('discord-music-player');\r\n\r\nclient.on('messageCreate', async (message) => {\r\n    const args = message.content.slice(settings.prefix.length).trim().split(/ +/g);\r\n    const command = args.shift();\r\n    let guildQueue = client.player.getQueue(message.guild.id);\r\n\r\n    if(command === 'play') {\r\n        let queue = client.player.createQueue(message.guild.id);\r\n        await queue.join(message.member.voice.channel);\r\n        let song = await queue.play(args.join(' ')).catch(_ => {\r\n            if(!guildQueue)\r\n                queue.stop();\r\n        });\r\n    }\r\n\r\n    if(command === 'playlist') {\r\n        let queue = client.player.createQueue(message.guild.id);\r\n        await queue.join(message.member.voice.channel);\r\n        let song = await queue.playlist(args.join(' ')).catch(_ => {\r\n            if(!guildQueue)\r\n                queue.stop();\r\n        });\r\n    }\r\n\r\n    if(command === 'skip') {\r\n        guildQueue.skip();\r\n    }\r\n\r\n    if(command === 'stop') {\r\n        guildQueue.stop();\r\n    }\r\n\r\n    if(command === 'removeLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.DISABLED); // or 0 instead of RepeatMode.DISABLED\r\n    }\r\n\r\n    if(command === 'toggleLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.SONG); // or 1 instead of RepeatMode.SONG\r\n    }\r\n\r\n    if(command === 'toggleQueueLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.QUEUE); // or 2 instead of RepeatMode.QUEUE\r\n    }\r\n\r\n    if(command === 'setVolume') {\r\n        guildQueue.setVolume(parseInt(args[0]));\r\n    }\r\n\r\n    if(command === 'seek') {\r\n        guildQueue.seek(parseInt(args[0]) * 1000);\r\n    }\r\n\r\n    if(command === 'clearQueue') {\r\n        guildQueue.clearQueue();\r\n    }\r\n\r\n    if(command === 'shuffle') {\r\n        guildQueue.shuffle();\r\n    }\r\n\r\n    if(command === 'getQueue') {\r\n        console.log(guildQueue);\r\n    }\r\n\r\n    if(command === 'getVolume') {\r\n        console.log(guildQueue.volume)\r\n    }\r\n\r\n    if(command === 'nowPlaying') {\r\n        console.log(`Now playing: ${guildQueue.nowPlaying}`);\r\n    }\r\n\r\n    if(command === 'pause') {\r\n        guildQueue.setPaused(true);\r\n    }\r\n\r\n    if(command === 'resume') {\r\n        guildQueue.setPaused(false);\r\n    }\r\n\r\n    if(command === 'remove') {\r\n        guildQueue.remove(parseInt(args[0]));\r\n    }\r\n\r\n    if(command === 'createProgressBar') {\r\n        const ProgressBar = guildQueue.createProgressBar();\r\n        \r\n        // [======>              ][00:35/2:20]\r\n        console.log(ProgressBar.prettier);\r\n    }\r\n})\r\n```\r\n\r\n### Events:\r\n```js\r\n// Init the event listener only once (at the top of your code).\r\nclient.player\r\n    // Emitted when channel was empty.\r\n    .on('channelEmpty',  (queue) =>\r\n        console.log(`Everyone left the Voice Channel, queue ended.`))\r\n    // Emitted when a song was added to the queue.\r\n    .on('songAdd',  (queue, song) =>\r\n        console.log(`Song ${song} was added to the queue.`))\r\n    // Emitted when a playlist was added to the queue.\r\n    .on('playlistAdd',  (queue, playlist) =>\r\n        console.log(`Playlist ${playlist} with ${playlist.songs.length} was added to the queue.`))\r\n    // Emitted when there was no more music to play.\r\n    .on('queueDestroyed',  (queue) =>\r\n        console.log(`The queue was destroyed.`))\r\n    // Emitted when the queue was destroyed (either by ending or stopping).    \r\n    .on('queueEnd',  (queue) =>\r\n        console.log(`The queue has ended.`))\r\n    // Emitted when a song changed.\r\n    .on('songChanged', (queue, newSong, oldSong) =>\r\n        console.log(`${newSong} is now playing.`))\r\n    // Emitted when a first song in the queue started playing.\r\n    .on('songFirst',  (queue, song) =>\r\n        console.log(`Started playing ${song}.`))\r\n    // Emitted when someone disconnected the bot from the channel.\r\n    .on('clientDisconnect', (queue) =>\r\n        console.log(`I was kicked from the Voice Channel, queue ended.`))\r\n    // Emitted when deafenOnJoin is true and the bot was undeafened\r\n    .on('clientUndeafen', (queue) =>\r\n        console.log(`I got undefeanded.`))\r\n    // Emitted when there was an error in runtime\r\n    .on('error', (error, queue) => {\r\n        console.log(`Error: ${error} in ${queue.guild.name}`);\r\n    });\r\n```\r\n\r\n# Passing custom data\r\n\r\n### Queue\r\nWhile running the `Queue#createQueue()` method you can pass a `options#data` object to hold custom data.\r\nThis can be made in two ways:\r\n```js\r\n// Pass custom data\r\nawait player.createQueue(message.guild.id, {\r\n    data: {\r\n        queueInitMessage: message,\r\n        myObject: 'this will stay with the queue :)',\r\n        more: 'add more... there are no limitations...'\r\n    }\r\n});\r\n// Or by using\r\nqueue.setData({\r\n    whatever: 'you want :D'\r\n});\r\n\r\n// Access custom data\r\nlet queue = player.getQueue(message.guild.id);\r\nlet initMessage = queue.data.queueInitMessage;\r\nawait initMessage.channel.send(`This message object is hold in Queue :D`);\r\n```\r\n\r\n### Song or Playlist\r\nWhile running the `Queue#play()`/Queue#playlist() method you can pass a `options#data` object to hold custom data.\r\nThis can be made in two ways:\r\n```js\r\n// Play the song\r\nlet song = await queue.play('Born in the USA!');\r\n// Set song data\r\nsong.setData({\r\n    initMessage: message\r\n});\r\n\r\n// Play the playlist\r\nlet playlist = await queue.playlist('https://www.youtube.com/playlist?list=PLDLGxnP4y2mGKGEqwxWTRkd3HtrrVTMdU');\r\n// Set playlist data (will set data for each song in the playlist)\r\nsong.setData({\r\n    initMessage: message\r\n});\r\n\r\n// Access custom data\r\nlet queue = player.getQueue(message.guild.id);\r\nlet { initMessage } = queue.nowPlaying.data;\r\nawait initMessage.channel.send(`This message object is hold in Song :D`);\r\n```\r\n","readmeFilename":"README.md","gitHead":"632ee1047512e3a366fcc4292d8cf96503c5f898","_id":"spike-player@1.4.6-3","_nodeVersion":"16.17.0","_npmVersion":"8.18.0","dist":{"integrity":"sha512-uNJPJ8CYXXa7wPU7RxUCS0qC5mPQLIRXWbNA8+eVu5LCoKvQ3l0DhvR3u0C2gd3fBmne1FT1D61L3q3us2y5Tw==","shasum":"b3572e316c72ad03bb041159fcb24f0c5b51ef1e","tarball":"https://registry.npmjs.org/spike-player/-/spike-player-1.4.6-3.tgz","fileCount":30,"unpackedSize":105848,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCEwz8It6dSNlSSxbwdeb+XVW+gflNF4KV8CFIYd+6W/gIhAPLvPGc9ygml9ephfzguV3cxAVwF9BfLt25wTaEj0SEX"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjqKVmACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrbbQ/8D7+YvxeqBkhMxWs7mPmQhsib0mbexuhjkK6JpjugEmc1t1Qz\r\nVvl7EpvHMe493IEkyU92M4A5hYYS4jgz8W4/3wAX57oTZpuOR2/JpuMS+H5a\r\n8bJoBCXw5tdbhYSmAUdiAXob4rRBRDorXMcon64pg8nISmI/Mx11KTRGCGnV\r\noo3NoU59SNR6nLnGtD/JbT74lShLT9kzNAOVH4e3z8P1qqlJUUYQ9hUhW8PN\r\nZMDdjbirGHfWTkUuyga68vPXAROQRIBR2K4LwsYBEgsz2KDBOZj/OVCVSfhd\r\ncmHtT3jMiB5vAQTudaYmH9USCt3hJBU/watfksCxmUcKgZ7sad2i4lEHI365\r\nKpXEvtK9iHScfr4U4Duu4s/5JwiNyI9qtund2vr6DxjuUkkhA+gwJnIMqwlK\r\nTS+xC3I/jpQKnwNIFp1LqCGOjCHuTqFzGNJ1aM4LUyKxf8lBq2Rvg9XNNUUs\r\nPiCliARgMiwMYCcu02sMFF6jciJkvpBOijWN61kmQIZnHTFP+nUH/jpsj9EV\r\nKkQHN6jz2A7RnaiAk3Mn0vXHodMIMYeVgHm/4f2/smL54gACTKGJ5qzQOkIb\r\n+HG12hO/vwPvzQsut1euVf9ISzt4SdaHltFJ4Xi2x4efycji9HBnfV+CVj6o\r\n2h/y/vaQQIbM+viY2rteLbg5MTjDCNLy0YM=\r\n=lnhe\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"spikebot","email":"abatallah1214@gmail.com"},"maintainers":[{"name":"spikebot","email":"abatallah1214@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spike-player_1.4.6-3_1671996774300_0.6188467303080325"},"_hasShrinkwrap":false},"1.4.6-4":{"name":"spike-player","version":"1.4.6-4","description":"Complete framework to facilitate music commands using discord.js v13 & v14","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","test":"jest test/test.js","clean":"rimraf dist","pre":"npm version prerelease --force && npm publish --access public --tag dev","prep":"npm run clean && npm run build","pub":"conventional-changelog -p angular -i CHANGELOG.md -s && npm publish"},"keywords":["music","player","bot","framework","discord","youtube","spotify","v13","v14"],"dependencies":{"@discordjs/opus":"^0.9.0","@discordjs/voice":"^0.14.0","@spikebot/discord-ytdl-core":"^1.0.4","@spikebot/ytdl-core":"^1.0.2","@types/node":"^18.11.17","@typescript-eslint/eslint-plugin":"^5.47.0","@typescript-eslint/parser":"^5.47.0","axios":"^1.2.1","axios-retry":"^3.3.1","domhandler":"^5.0.3","eslint":"^8.30.0","ffmpeg-static":"^5.1.0","htmlparser2":"^8.0.1","isomorphic-unfetch":"^3.1.0","jest":"^29.3.1","libsodium-wrappers":"^0.7.10","rimraf":"^3.0.2","soundcloud-scraper":"github:AnupKumarPanwar/soundcloud-scraper","spotify-url-info":"^3.1.8","youtubei":"^1.0.0-rc.8","ytsr":"^3.8.0"},"devDependencies":{"@babel/cli":"^7.20.7","@babel/core":"^7.20.7","@babel/preset-env":"^7.20.2","@babel/preset-typescript":"^7.18.6","@commitlint/cli":"^17.3.0","@rocketseat/commitlint-config":"^0.0.3","@types/node":"^18.11.17","@typescript-eslint/eslint-plugin":"^5.47.0","@typescript-eslint/parser":"^5.47.0","assert-diff":"^3.0.2","discord.js":"^14.7.1","discord.js-docgen":"github:discordjs/docgen#ts-patch","eslint":"^8.30.0","husky":"^8.0.2","jest":"^29.3.1","jsdoc-babel":"^0.5.0","ts-node":"^10.9.1","typescript":"^4.9.4"},"directories":{"doc":"docs","test":"test"},"engines":{"node":">=16.9.0"},"workspaces":["packages/*"],"packageManager":"npm@8.11.0","readme":"# Discord Music Player\r\n![npm](https://img.shields.io/npm/dt/discord-music-player?style=for-the-badge)\r\n![npm](https://img.shields.io/npm/v/discord-music-player?style=for-the-badge)\r\n![CodeFactor Grade](https://img.shields.io/codefactor/grade/github/SushiBtw/discord-music-player?color=%2348aaf1&style=for-the-badge)\r\n\r\n### Note: This is the v8 version of Discord Music Player for Discord.JS v13!\r\n\r\nDiscord Music Player is a powerful [Node.js](https://nodejs.org) module that allows you to easily implement music commands.\r\n**Everything** is customizable, and everything can be done using this package - **there are no limitations!**\r\n\r\nThis package supports YouTube Videos & Playlists, Spotify Songs & Playlists, Apple Music Songs & Playlists.\r\nPackage from version v7.0.0 is fully maintained by [SushiBtw](https://github.com/SushiBtw).\r\n\r\n### Requirements:\r\n- [Discord.js v13](https://www.npmjs.com/package/discord.js),\r\n- [Node.JS v16](https://nodejs.org/),\r\n\r\n# Installation\r\n*Node.JS v16 or newer is required to run this module.*\r\n```sh\r\nnpm install --save discord-music-player\r\n```\r\nInstall **@discordjs/opus**:\r\n```sh\r\nnpm install --save @discordjs/opus\r\n```\r\n**Install [FFMPEG](https://www.ffmpeg.org/download.html)!**\r\n\r\n# Documentation\r\n**Discord Music Player documentation: [https://discord-music-player.js.org/](https://discord-music-player.js.org/)**\r\n\r\n### **Need some help?**\r\nFeel free to join [Discord-Music-Player Discord Server](https://discord.gg/6fejZNsmFC) and ask us about DMP.\r\n\r\n# Getting Started\r\n**The code bellow, will show you how to use DMP in your code.**\r\n\r\n*Please define your **Player** after the **client/bot** definition.*\r\n\r\n[!] Remember to include the related voice **Intents** at the client options. [!]\r\n```js\r\nconst Discord = require(\"discord.js\");\r\nconst client = new Discord.Client({\r\n    intents: [Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES, Intents.FLAGS.GUILD_VOICE_STATES]\r\n});\r\nconst settings = {\r\n    prefix: '!',\r\n    token: 'YourBotTokenHere'\r\n};\r\n\r\nconst { Player } = require(\"discord-music-player\");\r\nconst player = new Player(client, {\r\n    leaveOnEmpty: false, // This options are optional.\r\n});\r\n// You can define the Player as *client.player* to easily access it.\r\nclient.player = player;\r\n\r\nclient.on(\"ready\", () => {\r\n    console.log(\"I am ready to Play with DMP 🎶\");\r\n});\r\n\r\nclient.login(settings.token);\r\n```\r\n\r\n# Example Usage\r\n```js\r\nconst { RepeatMode } = require('discord-music-player');\r\n\r\nclient.on('messageCreate', async (message) => {\r\n    const args = message.content.slice(settings.prefix.length).trim().split(/ +/g);\r\n    const command = args.shift();\r\n    let guildQueue = client.player.getQueue(message.guild.id);\r\n\r\n    if(command === 'play') {\r\n        let queue = client.player.createQueue(message.guild.id);\r\n        await queue.join(message.member.voice.channel);\r\n        let song = await queue.play(args.join(' ')).catch(_ => {\r\n            if(!guildQueue)\r\n                queue.stop();\r\n        });\r\n    }\r\n\r\n    if(command === 'playlist') {\r\n        let queue = client.player.createQueue(message.guild.id);\r\n        await queue.join(message.member.voice.channel);\r\n        let song = await queue.playlist(args.join(' ')).catch(_ => {\r\n            if(!guildQueue)\r\n                queue.stop();\r\n        });\r\n    }\r\n\r\n    if(command === 'skip') {\r\n        guildQueue.skip();\r\n    }\r\n\r\n    if(command === 'stop') {\r\n        guildQueue.stop();\r\n    }\r\n\r\n    if(command === 'removeLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.DISABLED); // or 0 instead of RepeatMode.DISABLED\r\n    }\r\n\r\n    if(command === 'toggleLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.SONG); // or 1 instead of RepeatMode.SONG\r\n    }\r\n\r\n    if(command === 'toggleQueueLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.QUEUE); // or 2 instead of RepeatMode.QUEUE\r\n    }\r\n\r\n    if(command === 'setVolume') {\r\n        guildQueue.setVolume(parseInt(args[0]));\r\n    }\r\n\r\n    if(command === 'seek') {\r\n        guildQueue.seek(parseInt(args[0]) * 1000);\r\n    }\r\n\r\n    if(command === 'clearQueue') {\r\n        guildQueue.clearQueue();\r\n    }\r\n\r\n    if(command === 'shuffle') {\r\n        guildQueue.shuffle();\r\n    }\r\n\r\n    if(command === 'getQueue') {\r\n        console.log(guildQueue);\r\n    }\r\n\r\n    if(command === 'getVolume') {\r\n        console.log(guildQueue.volume)\r\n    }\r\n\r\n    if(command === 'nowPlaying') {\r\n        console.log(`Now playing: ${guildQueue.nowPlaying}`);\r\n    }\r\n\r\n    if(command === 'pause') {\r\n        guildQueue.setPaused(true);\r\n    }\r\n\r\n    if(command === 'resume') {\r\n        guildQueue.setPaused(false);\r\n    }\r\n\r\n    if(command === 'remove') {\r\n        guildQueue.remove(parseInt(args[0]));\r\n    }\r\n\r\n    if(command === 'createProgressBar') {\r\n        const ProgressBar = guildQueue.createProgressBar();\r\n        \r\n        // [======>              ][00:35/2:20]\r\n        console.log(ProgressBar.prettier);\r\n    }\r\n})\r\n```\r\n\r\n### Events:\r\n```js\r\n// Init the event listener only once (at the top of your code).\r\nclient.player\r\n    // Emitted when channel was empty.\r\n    .on('channelEmpty',  (queue) =>\r\n        console.log(`Everyone left the Voice Channel, queue ended.`))\r\n    // Emitted when a song was added to the queue.\r\n    .on('songAdd',  (queue, song) =>\r\n        console.log(`Song ${song} was added to the queue.`))\r\n    // Emitted when a playlist was added to the queue.\r\n    .on('playlistAdd',  (queue, playlist) =>\r\n        console.log(`Playlist ${playlist} with ${playlist.songs.length} was added to the queue.`))\r\n    // Emitted when there was no more music to play.\r\n    .on('queueDestroyed',  (queue) =>\r\n        console.log(`The queue was destroyed.`))\r\n    // Emitted when the queue was destroyed (either by ending or stopping).    \r\n    .on('queueEnd',  (queue) =>\r\n        console.log(`The queue has ended.`))\r\n    // Emitted when a song changed.\r\n    .on('songChanged', (queue, newSong, oldSong) =>\r\n        console.log(`${newSong} is now playing.`))\r\n    // Emitted when a first song in the queue started playing.\r\n    .on('songFirst',  (queue, song) =>\r\n        console.log(`Started playing ${song}.`))\r\n    // Emitted when someone disconnected the bot from the channel.\r\n    .on('clientDisconnect', (queue) =>\r\n        console.log(`I was kicked from the Voice Channel, queue ended.`))\r\n    // Emitted when deafenOnJoin is true and the bot was undeafened\r\n    .on('clientUndeafen', (queue) =>\r\n        console.log(`I got undefeanded.`))\r\n    // Emitted when there was an error in runtime\r\n    .on('error', (error, queue) => {\r\n        console.log(`Error: ${error} in ${queue.guild.name}`);\r\n    });\r\n```\r\n\r\n# Passing custom data\r\n\r\n### Queue\r\nWhile running the `Queue#createQueue()` method you can pass a `options#data` object to hold custom data.\r\nThis can be made in two ways:\r\n```js\r\n// Pass custom data\r\nawait player.createQueue(message.guild.id, {\r\n    data: {\r\n        queueInitMessage: message,\r\n        myObject: 'this will stay with the queue :)',\r\n        more: 'add more... there are no limitations...'\r\n    }\r\n});\r\n// Or by using\r\nqueue.setData({\r\n    whatever: 'you want :D'\r\n});\r\n\r\n// Access custom data\r\nlet queue = player.getQueue(message.guild.id);\r\nlet initMessage = queue.data.queueInitMessage;\r\nawait initMessage.channel.send(`This message object is hold in Queue :D`);\r\n```\r\n\r\n### Song or Playlist\r\nWhile running the `Queue#play()`/Queue#playlist() method you can pass a `options#data` object to hold custom data.\r\nThis can be made in two ways:\r\n```js\r\n// Play the song\r\nlet song = await queue.play('Born in the USA!');\r\n// Set song data\r\nsong.setData({\r\n    initMessage: message\r\n});\r\n\r\n// Play the playlist\r\nlet playlist = await queue.playlist('https://www.youtube.com/playlist?list=PLDLGxnP4y2mGKGEqwxWTRkd3HtrrVTMdU');\r\n// Set playlist data (will set data for each song in the playlist)\r\nsong.setData({\r\n    initMessage: message\r\n});\r\n\r\n// Access custom data\r\nlet queue = player.getQueue(message.guild.id);\r\nlet { initMessage } = queue.nowPlaying.data;\r\nawait initMessage.channel.send(`This message object is hold in Song :D`);\r\n```\r\n","readmeFilename":"README.md","gitHead":"c2c93bd041bcc37c8250e8c2db153d47451dc285","_id":"spike-player@1.4.6-4","_nodeVersion":"16.17.0","_npmVersion":"8.18.0","dist":{"integrity":"sha512-v6xEdLO8CYAKUPxYyxhTYvlWpsHtBRs7PJDEAPo0tMCjipUaZri1s4QMIC/XtJPNNz85dsFTK+QNPBpNcpoYpg==","shasum":"14748966114391a20cf089e40b2b36d0011052ea","tarball":"https://registry.npmjs.org/spike-player/-/spike-player-1.4.6-4.tgz","fileCount":30,"unpackedSize":105834,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHQ5lzkVTsPbd2poNBz9B6SP9SlxWPmfvWI62l+esLi2AiArk4C/sjnUK3B9W1t0uuYySeIs3ogJPFYJ2lZwVYni3Q=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjqKeNACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoBLw//dFmp3J76I1P0NMK592HXSmmxkz90RoTOnZQbv1f6GBkLK4MB\r\n9bP60hfPH3Eu7zaXsHUzhXlYYi9CGuqMwMk9BmPtwWfJVZdOmOGyHj1y0YbX\r\nVZE2mMiiL7JHjvRXkLFFI2vp4mg6EL4GiI6i27KETZw7E96gLK5mxdne/GGx\r\nIzGEcKmreyrfdHmN9rdyxc9iIzzpI9cMMUNDHP+VibgCkWL72r6KhwJmeWHW\r\nqBktdsIbKDUpHegiAXvWsmhpspebiwuMbZNhMeB8TmzHJGnkBFNdAip99TNB\r\nuhzt1N1PRTdqG7J+qUYEKnN/T6zrNlwpy2vF6ENkM/UaoXpSv8dQVRqYc+Rp\r\ntw55fRh9dpWIdI5pyKL8z0CQH8AtzXX1u0g9rN48v4MEsj2DnMHCBbnuORxE\r\nFf3d8xMwh0r5UdRsgPpz2lu1wgIozYYGYqYb99ozcLwYNm9vwm4RnF3Ij/Iv\r\nHuFuKoMCiS4xkBMyTFH1nSTUlCh5+8dFxTJcuwW+yVQexE+iA0ES0YIQvwwi\r\n1XPraaSa5mYR0asg6JLZbu1WC+18xsrdRxdUJOnvGIcbUWu5o1iBmwvKakVB\r\nV6he96d66I3A8IiAGAR9zKgCtd2L/xKz4Pm9KimuxwXAcMzdhtqpliSD+we5\r\nhZzS7NrUSu0iH8gZUFwTBh3O5brsN7kvn4Y=\r\n=mws1\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"spikebot","email":"abatallah1214@gmail.com"},"maintainers":[{"name":"spikebot","email":"abatallah1214@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spike-player_1.4.6-4_1671997324750_0.5069825965557073"},"_hasShrinkwrap":false},"1.4.6-5":{"name":"spike-player","version":"1.4.6-5","description":"Complete framework to facilitate music commands using discord.js v13 & v14","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","test":"jest test/test.js","clean":"rimraf dist","pre":"npm version prerelease --force && npm publish --access public --tag dev","prep":"npm run clean && npm run build","pub":"conventional-changelog -p angular -i CHANGELOG.md -s && npm publish"},"keywords":["music","player","bot","framework","discord","youtube","spotify","v13","v14"],"dependencies":{"@discordjs/opus":"^0.9.0","@discordjs/voice":"^0.14.0","@spikebot/discord-ytdl-core":"^1.0.4","@spikebot/ytdl-core":"^1.0.2","@types/node":"^18.11.17","@typescript-eslint/eslint-plugin":"^5.47.0","@typescript-eslint/parser":"^5.47.0","axios":"^1.2.1","axios-retry":"^3.3.1","domhandler":"^5.0.3","eslint":"^8.30.0","ffmpeg-static":"^5.1.0","htmlparser2":"^8.0.1","isomorphic-unfetch":"^3.1.0","jest":"^29.3.1","libsodium-wrappers":"^0.7.10","rimraf":"^3.0.2","soundcloud-scraper":"github:AnupKumarPanwar/soundcloud-scraper","spotify-url-info":"^3.1.8","youtubei":"^1.0.0-rc.8","ytsr":"^3.8.0"},"devDependencies":{"@babel/cli":"^7.20.7","@babel/core":"^7.20.7","@babel/preset-env":"^7.20.2","@babel/preset-typescript":"^7.18.6","@commitlint/cli":"^17.3.0","@rocketseat/commitlint-config":"^0.0.3","@types/node":"^18.11.17","@typescript-eslint/eslint-plugin":"^5.47.0","@typescript-eslint/parser":"^5.47.0","assert-diff":"^3.0.2","discord.js":"^14.7.1","discord.js-docgen":"github:discordjs/docgen#ts-patch","eslint":"^8.30.0","husky":"^8.0.2","jest":"^29.3.1","jsdoc-babel":"^0.5.0","ts-node":"^10.9.1","typescript":"^4.9.4"},"directories":{"doc":"docs","test":"test"},"engines":{"node":">=16.9.0"},"workspaces":["packages/*"],"packageManager":"npm@8.11.0","readme":"# Discord Music Player\r\n![npm](https://img.shields.io/npm/dt/discord-music-player?style=for-the-badge)\r\n![npm](https://img.shields.io/npm/v/discord-music-player?style=for-the-badge)\r\n![CodeFactor Grade](https://img.shields.io/codefactor/grade/github/SushiBtw/discord-music-player?color=%2348aaf1&style=for-the-badge)\r\n\r\n### Note: This is the v8 version of Discord Music Player for Discord.JS v13!\r\n\r\nDiscord Music Player is a powerful [Node.js](https://nodejs.org) module that allows you to easily implement music commands.\r\n**Everything** is customizable, and everything can be done using this package - **there are no limitations!**\r\n\r\nThis package supports YouTube Videos & Playlists, Spotify Songs & Playlists, Apple Music Songs & Playlists.\r\nPackage from version v7.0.0 is fully maintained by [SushiBtw](https://github.com/SushiBtw).\r\n\r\n### Requirements:\r\n- [Discord.js v13](https://www.npmjs.com/package/discord.js),\r\n- [Node.JS v16](https://nodejs.org/),\r\n\r\n# Installation\r\n*Node.JS v16 or newer is required to run this module.*\r\n```sh\r\nnpm install --save discord-music-player\r\n```\r\nInstall **@discordjs/opus**:\r\n```sh\r\nnpm install --save @discordjs/opus\r\n```\r\n**Install [FFMPEG](https://www.ffmpeg.org/download.html)!**\r\n\r\n# Documentation\r\n**Discord Music Player documentation: [https://discord-music-player.js.org/](https://discord-music-player.js.org/)**\r\n\r\n### **Need some help?**\r\nFeel free to join [Discord-Music-Player Discord Server](https://discord.gg/6fejZNsmFC) and ask us about DMP.\r\n\r\n# Getting Started\r\n**The code bellow, will show you how to use DMP in your code.**\r\n\r\n*Please define your **Player** after the **client/bot** definition.*\r\n\r\n[!] Remember to include the related voice **Intents** at the client options. [!]\r\n```js\r\nconst Discord = require(\"discord.js\");\r\nconst client = new Discord.Client({\r\n    intents: [Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES, Intents.FLAGS.GUILD_VOICE_STATES]\r\n});\r\nconst settings = {\r\n    prefix: '!',\r\n    token: 'YourBotTokenHere'\r\n};\r\n\r\nconst { Player } = require(\"discord-music-player\");\r\nconst player = new Player(client, {\r\n    leaveOnEmpty: false, // This options are optional.\r\n});\r\n// You can define the Player as *client.player* to easily access it.\r\nclient.player = player;\r\n\r\nclient.on(\"ready\", () => {\r\n    console.log(\"I am ready to Play with DMP 🎶\");\r\n});\r\n\r\nclient.login(settings.token);\r\n```\r\n\r\n# Example Usage\r\n```js\r\nconst { RepeatMode } = require('discord-music-player');\r\n\r\nclient.on('messageCreate', async (message) => {\r\n    const args = message.content.slice(settings.prefix.length).trim().split(/ +/g);\r\n    const command = args.shift();\r\n    let guildQueue = client.player.getQueue(message.guild.id);\r\n\r\n    if(command === 'play') {\r\n        let queue = client.player.createQueue(message.guild.id);\r\n        await queue.join(message.member.voice.channel);\r\n        let song = await queue.play(args.join(' ')).catch(_ => {\r\n            if(!guildQueue)\r\n                queue.stop();\r\n        });\r\n    }\r\n\r\n    if(command === 'playlist') {\r\n        let queue = client.player.createQueue(message.guild.id);\r\n        await queue.join(message.member.voice.channel);\r\n        let song = await queue.playlist(args.join(' ')).catch(_ => {\r\n            if(!guildQueue)\r\n                queue.stop();\r\n        });\r\n    }\r\n\r\n    if(command === 'skip') {\r\n        guildQueue.skip();\r\n    }\r\n\r\n    if(command === 'stop') {\r\n        guildQueue.stop();\r\n    }\r\n\r\n    if(command === 'removeLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.DISABLED); // or 0 instead of RepeatMode.DISABLED\r\n    }\r\n\r\n    if(command === 'toggleLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.SONG); // or 1 instead of RepeatMode.SONG\r\n    }\r\n\r\n    if(command === 'toggleQueueLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.QUEUE); // or 2 instead of RepeatMode.QUEUE\r\n    }\r\n\r\n    if(command === 'setVolume') {\r\n        guildQueue.setVolume(parseInt(args[0]));\r\n    }\r\n\r\n    if(command === 'seek') {\r\n        guildQueue.seek(parseInt(args[0]) * 1000);\r\n    }\r\n\r\n    if(command === 'clearQueue') {\r\n        guildQueue.clearQueue();\r\n    }\r\n\r\n    if(command === 'shuffle') {\r\n        guildQueue.shuffle();\r\n    }\r\n\r\n    if(command === 'getQueue') {\r\n        console.log(guildQueue);\r\n    }\r\n\r\n    if(command === 'getVolume') {\r\n        console.log(guildQueue.volume)\r\n    }\r\n\r\n    if(command === 'nowPlaying') {\r\n        console.log(`Now playing: ${guildQueue.nowPlaying}`);\r\n    }\r\n\r\n    if(command === 'pause') {\r\n        guildQueue.setPaused(true);\r\n    }\r\n\r\n    if(command === 'resume') {\r\n        guildQueue.setPaused(false);\r\n    }\r\n\r\n    if(command === 'remove') {\r\n        guildQueue.remove(parseInt(args[0]));\r\n    }\r\n\r\n    if(command === 'createProgressBar') {\r\n        const ProgressBar = guildQueue.createProgressBar();\r\n        \r\n        // [======>              ][00:35/2:20]\r\n        console.log(ProgressBar.prettier);\r\n    }\r\n})\r\n```\r\n\r\n### Events:\r\n```js\r\n// Init the event listener only once (at the top of your code).\r\nclient.player\r\n    // Emitted when channel was empty.\r\n    .on('channelEmpty',  (queue) =>\r\n        console.log(`Everyone left the Voice Channel, queue ended.`))\r\n    // Emitted when a song was added to the queue.\r\n    .on('songAdd',  (queue, song) =>\r\n        console.log(`Song ${song} was added to the queue.`))\r\n    // Emitted when a playlist was added to the queue.\r\n    .on('playlistAdd',  (queue, playlist) =>\r\n        console.log(`Playlist ${playlist} with ${playlist.songs.length} was added to the queue.`))\r\n    // Emitted when there was no more music to play.\r\n    .on('queueDestroyed',  (queue) =>\r\n        console.log(`The queue was destroyed.`))\r\n    // Emitted when the queue was destroyed (either by ending or stopping).    \r\n    .on('queueEnd',  (queue) =>\r\n        console.log(`The queue has ended.`))\r\n    // Emitted when a song changed.\r\n    .on('songChanged', (queue, newSong, oldSong) =>\r\n        console.log(`${newSong} is now playing.`))\r\n    // Emitted when a first song in the queue started playing.\r\n    .on('songFirst',  (queue, song) =>\r\n        console.log(`Started playing ${song}.`))\r\n    // Emitted when someone disconnected the bot from the channel.\r\n    .on('clientDisconnect', (queue) =>\r\n        console.log(`I was kicked from the Voice Channel, queue ended.`))\r\n    // Emitted when deafenOnJoin is true and the bot was undeafened\r\n    .on('clientUndeafen', (queue) =>\r\n        console.log(`I got undefeanded.`))\r\n    // Emitted when there was an error in runtime\r\n    .on('error', (error, queue) => {\r\n        console.log(`Error: ${error} in ${queue.guild.name}`);\r\n    });\r\n```\r\n\r\n# Passing custom data\r\n\r\n### Queue\r\nWhile running the `Queue#createQueue()` method you can pass a `options#data` object to hold custom data.\r\nThis can be made in two ways:\r\n```js\r\n// Pass custom data\r\nawait player.createQueue(message.guild.id, {\r\n    data: {\r\n        queueInitMessage: message,\r\n        myObject: 'this will stay with the queue :)',\r\n        more: 'add more... there are no limitations...'\r\n    }\r\n});\r\n// Or by using\r\nqueue.setData({\r\n    whatever: 'you want :D'\r\n});\r\n\r\n// Access custom data\r\nlet queue = player.getQueue(message.guild.id);\r\nlet initMessage = queue.data.queueInitMessage;\r\nawait initMessage.channel.send(`This message object is hold in Queue :D`);\r\n```\r\n\r\n### Song or Playlist\r\nWhile running the `Queue#play()`/Queue#playlist() method you can pass a `options#data` object to hold custom data.\r\nThis can be made in two ways:\r\n```js\r\n// Play the song\r\nlet song = await queue.play('Born in the USA!');\r\n// Set song data\r\nsong.setData({\r\n    initMessage: message\r\n});\r\n\r\n// Play the playlist\r\nlet playlist = await queue.playlist('https://www.youtube.com/playlist?list=PLDLGxnP4y2mGKGEqwxWTRkd3HtrrVTMdU');\r\n// Set playlist data (will set data for each song in the playlist)\r\nsong.setData({\r\n    initMessage: message\r\n});\r\n\r\n// Access custom data\r\nlet queue = player.getQueue(message.guild.id);\r\nlet { initMessage } = queue.nowPlaying.data;\r\nawait initMessage.channel.send(`This message object is hold in Song :D`);\r\n```\r\n","readmeFilename":"README.md","gitHead":"b801cf1f62de677b7f0deff9f75494ef3d1573f6","_id":"spike-player@1.4.6-5","_nodeVersion":"16.17.0","_npmVersion":"8.18.0","dist":{"integrity":"sha512-Dhbirwypj4Y3c58C8TGrWZ7xWSk63nqjmECMfTstWGq3jFZo8L5ar7oxPxGrtHTzGky+10FKWeAMInJqqpBqnQ==","shasum":"8cc29a5877609bc2a109c4d8015e78e8022df334","tarball":"https://registry.npmjs.org/spike-player/-/spike-player-1.4.6-5.tgz","fileCount":30,"unpackedSize":105835,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIF0I7gjRwluuG4ljK/x883QE+0F6MQV3C/QUuZzyJW5SAiEAxmp1bqV/k5zmXFerxLlYKEs9v7tPqITq4ubHM87p+D4="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjqKgOACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpqzQ//ZMmwTLfH5mbk4pyWj4l9nLZnUJYtApJd3UWk+PaVubpwvOLi\r\nJDhqeWLzfpwf1sejkQVz8jQf51Dm6DQ/ySMBN47Vka8S3aB3XaPw21Uez48W\r\neWd+qoxId3AAXAfs6GxnHz8Y11T4+AMmR+ixjYzs+GaO06Xw8r6aNjDOYXQN\r\nEl5jOZu+ZeAdhD4LVFRcvhOOp7NhmcPm8mYqaAZpQnfnjlF/sCZUxBp+zfTJ\r\nwNmxqK84R0aEmu0ThoQ1u3Ue4T/PCZS48zr0DJJxxZjj+7Vc04NZxK85/Fj5\r\nH33YSsIc4DUm42hOsc5Oe0vxJIGuZmkGsk0zYY73wNh9Lq0p8M02VYIwwFqt\r\nhRpZM5eilVP8vs4QGqCUict3YZ8VUzoe/ENsV1NxBYUnhiZvtwLSbuKkmExV\r\nDl5nUQd2CmRZmbUI31Yir19yU2zfI/rGk0b4SMXLestK6LVvEl6mjKRVtK5T\r\ncWLXOrmvQhXpGmV/PJa3EOc16dsRf/fuOBRj6Iz/9C4r3MWnGLZhH+46u8My\r\nYP5dvh487uSV0Abji0vULAuVWw3gKGqlnHzs1FFSqSmYFN68Ia2XKZ/9fLmr\r\nwCdW2mr8d9aVwfveWh/HAWz6HOU8sjUD4Tk+lWDkBpiwg41NB22d+7SPLGMa\r\nsaNsa6X4XY7jC3VsB0eBEvDTH3yo+fYmCh8=\r\n=/dpN\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"spikebot","email":"abatallah1214@gmail.com"},"maintainers":[{"name":"spikebot","email":"abatallah1214@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spike-player_1.4.6-5_1671997454774_0.01841989015276413"},"_hasShrinkwrap":false},"1.4.6-6":{"name":"spike-player","version":"1.4.6-6","description":"Complete framework to facilitate music commands using discord.js v13 & v14","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","test":"jest test/test.js","clean":"rimraf dist","pre":"npm version prerelease --force && npm publish --access public --tag dev","prep":"npm run clean && npm run build","pub":"conventional-changelog -p angular -i CHANGELOG.md -s && npm publish"},"keywords":["music","player","bot","framework","discord","youtube","spotify","v13","v14"],"dependencies":{"@discordjs/opus":"^0.9.0","@discordjs/voice":"^0.14.0","@spikebot/discord-ytdl-core":"^1.0.4","@spikebot/ytdl-core":"^1.0.2","@types/node":"^18.11.17","@typescript-eslint/eslint-plugin":"^5.47.0","@typescript-eslint/parser":"^5.47.0","axios":"^1.2.1","axios-retry":"^3.3.1","domhandler":"^5.0.3","eslint":"^8.30.0","ffmpeg-static":"^5.1.0","htmlparser2":"^8.0.1","isomorphic-unfetch":"^3.1.0","jest":"^29.3.1","libsodium-wrappers":"^0.7.10","rimraf":"^3.0.2","soundcloud-scraper":"github:AnupKumarPanwar/soundcloud-scraper","spotify-url-info":"^3.1.8","youtubei":"^1.0.0-rc.8","ytsr":"^3.8.0"},"devDependencies":{"@babel/cli":"^7.20.7","@babel/core":"^7.20.7","@babel/preset-env":"^7.20.2","@babel/preset-typescript":"^7.18.6","@commitlint/cli":"^17.3.0","@rocketseat/commitlint-config":"^0.0.3","@types/node":"^18.11.17","@typescript-eslint/eslint-plugin":"^5.47.0","@typescript-eslint/parser":"^5.47.0","assert-diff":"^3.0.2","discord.js":"^14.7.1","discord.js-docgen":"github:discordjs/docgen#ts-patch","eslint":"^8.30.0","husky":"^8.0.2","jest":"^29.3.1","jsdoc-babel":"^0.5.0","ts-node":"^10.9.1","typescript":"^4.9.4"},"directories":{"doc":"docs","test":"test"},"engines":{"node":">=16.9.0"},"workspaces":["packages/*"],"packageManager":"npm@8.11.0","readme":"# Discord Music Player\r\n![npm](https://img.shields.io/npm/dt/discord-music-player?style=for-the-badge)\r\n![npm](https://img.shields.io/npm/v/discord-music-player?style=for-the-badge)\r\n![CodeFactor Grade](https://img.shields.io/codefactor/grade/github/SushiBtw/discord-music-player?color=%2348aaf1&style=for-the-badge)\r\n\r\n### Note: This is the v8 version of Discord Music Player for Discord.JS v13!\r\n\r\nDiscord Music Player is a powerful [Node.js](https://nodejs.org) module that allows you to easily implement music commands.\r\n**Everything** is customizable, and everything can be done using this package - **there are no limitations!**\r\n\r\nThis package supports YouTube Videos & Playlists, Spotify Songs & Playlists, Apple Music Songs & Playlists.\r\nPackage from version v7.0.0 is fully maintained by [SushiBtw](https://github.com/SushiBtw).\r\n\r\n### Requirements:\r\n- [Discord.js v13](https://www.npmjs.com/package/discord.js),\r\n- [Node.JS v16](https://nodejs.org/),\r\n\r\n# Installation\r\n*Node.JS v16 or newer is required to run this module.*\r\n```sh\r\nnpm install --save discord-music-player\r\n```\r\nInstall **@discordjs/opus**:\r\n```sh\r\nnpm install --save @discordjs/opus\r\n```\r\n**Install [FFMPEG](https://www.ffmpeg.org/download.html)!**\r\n\r\n# Documentation\r\n**Discord Music Player documentation: [https://discord-music-player.js.org/](https://discord-music-player.js.org/)**\r\n\r\n### **Need some help?**\r\nFeel free to join [Discord-Music-Player Discord Server](https://discord.gg/6fejZNsmFC) and ask us about DMP.\r\n\r\n# Getting Started\r\n**The code bellow, will show you how to use DMP in your code.**\r\n\r\n*Please define your **Player** after the **client/bot** definition.*\r\n\r\n[!] Remember to include the related voice **Intents** at the client options. [!]\r\n```js\r\nconst Discord = require(\"discord.js\");\r\nconst client = new Discord.Client({\r\n    intents: [Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES, Intents.FLAGS.GUILD_VOICE_STATES]\r\n});\r\nconst settings = {\r\n    prefix: '!',\r\n    token: 'YourBotTokenHere'\r\n};\r\n\r\nconst { Player } = require(\"discord-music-player\");\r\nconst player = new Player(client, {\r\n    leaveOnEmpty: false, // This options are optional.\r\n});\r\n// You can define the Player as *client.player* to easily access it.\r\nclient.player = player;\r\n\r\nclient.on(\"ready\", () => {\r\n    console.log(\"I am ready to Play with DMP 🎶\");\r\n});\r\n\r\nclient.login(settings.token);\r\n```\r\n\r\n# Example Usage\r\n```js\r\nconst { RepeatMode } = require('discord-music-player');\r\n\r\nclient.on('messageCreate', async (message) => {\r\n    const args = message.content.slice(settings.prefix.length).trim().split(/ +/g);\r\n    const command = args.shift();\r\n    let guildQueue = client.player.getQueue(message.guild.id);\r\n\r\n    if(command === 'play') {\r\n        let queue = client.player.createQueue(message.guild.id);\r\n        await queue.join(message.member.voice.channel);\r\n        let song = await queue.play(args.join(' ')).catch(_ => {\r\n            if(!guildQueue)\r\n                queue.stop();\r\n        });\r\n    }\r\n\r\n    if(command === 'playlist') {\r\n        let queue = client.player.createQueue(message.guild.id);\r\n        await queue.join(message.member.voice.channel);\r\n        let song = await queue.playlist(args.join(' ')).catch(_ => {\r\n            if(!guildQueue)\r\n                queue.stop();\r\n        });\r\n    }\r\n\r\n    if(command === 'skip') {\r\n        guildQueue.skip();\r\n    }\r\n\r\n    if(command === 'stop') {\r\n        guildQueue.stop();\r\n    }\r\n\r\n    if(command === 'removeLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.DISABLED); // or 0 instead of RepeatMode.DISABLED\r\n    }\r\n\r\n    if(command === 'toggleLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.SONG); // or 1 instead of RepeatMode.SONG\r\n    }\r\n\r\n    if(command === 'toggleQueueLoop') {\r\n        guildQueue.setRepeatMode(RepeatMode.QUEUE); // or 2 instead of RepeatMode.QUEUE\r\n    }\r\n\r\n    if(command === 'setVolume') {\r\n        guildQueue.setVolume(parseInt(args[0]));\r\n    }\r\n\r\n    if(command === 'seek') {\r\n        guildQueue.seek(parseInt(args[0]) * 1000);\r\n    }\r\n\r\n    if(command === 'clearQueue') {\r\n        guildQueue.clearQueue();\r\n    }\r\n\r\n    if(command === 'shuffle') {\r\n        guildQueue.shuffle();\r\n    }\r\n\r\n    if(command === 'getQueue') {\r\n        console.log(guildQueue);\r\n    }\r\n\r\n    if(command === 'getVolume') {\r\n        console.log(guildQueue.volume)\r\n    }\r\n\r\n    if(command === 'nowPlaying') {\r\n        console.log(`Now playing: ${guildQueue.nowPlaying}`);\r\n    }\r\n\r\n    if(command === 'pause') {\r\n        guildQueue.setPaused(true);\r\n    }\r\n\r\n    if(command === 'resume') {\r\n        guildQueue.setPaused(false);\r\n    }\r\n\r\n    if(command === 'remove') {\r\n        guildQueue.remove(parseInt(args[0]));\r\n    }\r\n\r\n    if(command === 'createProgressBar') {\r\n        const ProgressBar = guildQueue.createProgressBar();\r\n        \r\n        // [======>              ][00:35/2:20]\r\n        console.log(ProgressBar.prettier);\r\n    }\r\n})\r\n```\r\n\r\n### Events:\r\n```js\r\n// Init the event listener only once (at the top of your code).\r\nclient.player\r\n    // Emitted when channel was empty.\r\n    .on('channelEmpty',  (queue) =>\r\n        console.log(`Everyone left the Voice Channel, queue ended.`))\r\n    // Emitted when a song was added to the queue.\r\n    .on('songAdd',  (queue, song) =>\r\n        console.log(`Song ${song} was added to the queue.`))\r\n    // Emitted when a playlist was added to the queue.\r\n    .on('playlistAdd',  (queue, playlist) =>\r\n        console.log(`Playlist ${playlist} with ${playlist.songs.length} was added to the queue.`))\r\n    // Emitted when there was no more music to play.\r\n    .on('queueDestroyed',  (queue) =>\r\n        console.log(`The queue was destroyed.`))\r\n    // Emitted when the queue was destroyed (either by ending or stopping).    \r\n    .on('queueEnd',  (queue) =>\r\n        console.log(`The queue has ended.`))\r\n    // Emitted when a song changed.\r\n    .on('songChanged', (queue, newSong, oldSong) =>\r\n        console.log(`${newSong} is now playing.`))\r\n    // Emitted when a first song in the queue started playing.\r\n    .on('songFirst',  (queue, song) =>\r\n        console.log(`Started playing ${song}.`))\r\n    // Emitted when someone disconnected the bot from the channel.\r\n    .on('clientDisconnect', (queue) =>\r\n        console.log(`I was kicked from the Voice Channel, queue ended.`))\r\n    // Emitted when deafenOnJoin is true and the bot was undeafened\r\n    .on('clientUndeafen', (queue) =>\r\n        console.log(`I got undefeanded.`))\r\n    // Emitted when there was an error in runtime\r\n    .on('error', (error, queue) => {\r\n        console.log(`Error: ${error} in ${queue.guild.name}`);\r\n    });\r\n```\r\n\r\n# Passing custom data\r\n\r\n### Queue\r\nWhile running the `Queue#createQueue()` method you can pass a `options#data` object to hold custom data.\r\nThis can be made in two ways:\r\n```js\r\n// Pass custom data\r\nawait player.createQueue(message.guild.id, {\r\n    data: {\r\n        queueInitMessage: message,\r\n        myObject: 'this will stay with the queue :)',\r\n        more: 'add more... there are no limitations...'\r\n    }\r\n});\r\n// Or by using\r\nqueue.setData({\r\n    whatever: 'you want :D'\r\n});\r\n\r\n// Access custom data\r\nlet queue = player.getQueue(message.guild.id);\r\nlet initMessage = queue.data.queueInitMessage;\r\nawait initMessage.channel.send(`This message object is hold in Queue :D`);\r\n```\r\n\r\n### Song or Playlist\r\nWhile running the `Queue#play()`/Queue#playlist() method you can pass a `options#data` object to hold custom data.\r\nThis can be made in two ways:\r\n```js\r\n// Play the song\r\nlet song = await queue.play('Born in the USA!');\r\n// Set song data\r\nsong.setData({\r\n    initMessage: message\r\n});\r\n\r\n// Play the playlist\r\nlet playlist = await queue.playlist('https://www.youtube.com/playlist?list=PLDLGxnP4y2mGKGEqwxWTRkd3HtrrVTMdU');\r\n// Set playlist data (will set data for each song in the playlist)\r\nsong.setData({\r\n    initMessage: message\r\n});\r\n\r\n// Access custom data\r\nlet queue = player.getQueue(message.guild.id);\r\nlet { initMessage } = queue.nowPlaying.data;\r\nawait initMessage.channel.send(`This message object is hold in Song :D`);\r\n```\r\n","readmeFilename":"README.md","gitHead":"770240fc23e0e7d08add857ca4e22529a4153851","_id":"spike-player@1.4.6-6","_nodeVersion":"16.17.0","_npmVersion":"8.18.0","dist":{"integrity":"sha512-9G+xU7jXGbX5Oy4O7RbGfs0+UkmIiX7CwJAmRMpwWqjqr0f7Y2f9EHXg7vL+WqRIv6ClZNqRDNYMB3wPJ5me/w==","shasum":"bf596924d0ba66fa6b8377acc93a2888faf64335","tarball":"https://registry.npmjs.org/spike-player/-/spike-player-1.4.6-6.tgz","fileCount":30,"unpackedSize":105835,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCZKaT01M88wCseuAT1+hkjK4OvYK4/PzLqPEmr4uwQqwIgYpIwcKnQlRJQ+L4lw2+MByuzORBJBffnUHiTE7x/EOU="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjqKgyACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrENhAAj2/e0qcNAigEzchCKhDQvk+y5CuONhywPWl8yDjud9gGEpGW\r\neJYWD4I1QiwklXbUrFC62FokuqmipUbQMmZcPntB7Ziv13XGSQdkFti6VFSm\r\nacdpnbspsZOhai326hVUXVTq5pZa+wDSIyds3I53cmPK8J4aMjbTQS13H9yd\r\n17XHBIfS3OddrW19yg5peXdRBjVOyvNtKeyxafdtfoauTXvenHnBDaVj8B12\r\n4MD7rOzNDcTaDbaNc/N7oyEdwUtNMY1gTnLRz7K5n/zb7aFkOZ4AgYwWTQTF\r\nQIPLH5mPqaCKfzo+31UpXCdmYuZxzDRBId8oSdf3PesdpXwpatJ7Mgt+DAHA\r\n2u/fNPTd4oOCLfJ5ZFksEulSn5l8K4Ilz5RHuEA4xB9XRvwmSZMCfwc7vp27\r\nbUY1q0neoWbXvkH6yztVVFNUC23H5/zdAXoVjU2KB6CWbOa7/NqHLp8sdDU1\r\nTWhLk3aa7wkmLWxFmKLZY1QKY0DIlrzXW2dhPz0Eb+8X6Md6zQFCwahEHxIn\r\nzk/1CiZAMvJpU06RIku92AUNAPllAuqyw/gb7tUOYh/T+pHk4I3A0rH++VRt\r\n//I9ESB5Lko3+1Ea5MydUpc7llbYXmTnCzzyhcqHEm+d8ZndmsSgLKKQF+Yl\r\nofN4FmgXuAV9THJG0G85LljFNILlFDA/eB8=\r\n=/kpr\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"spikebot","email":"abatallah1214@gmail.com"},"maintainers":[{"name":"spikebot","email":"abatallah1214@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spike-player_1.4.6-6_1671997490014_0.07024062432232414"},"_hasShrinkwrap":false},"1.4.6-7":{"name":"spike-player","version":"1.4.6-7","description":"Complete framework to facilitate music commands using discord.js v13 & v14","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","test":"jest test/test.js","clean":"rimraf dist","pre":"npm version prerelease --force && npm publish --access public --tag dev","prep":"npm run clean && npm run build","pub":"conventional-changelog -p angular -i CHANGELOG.md -s && npm publish"},"keywords":["music","player","bot","framework","discord","youtube","spotify","v13","v14"],"dependencies":{"@discordjs/opus":"^0.8.0","@discordjs/voice":"^0.11.0","apple-music-metadata":"^1.0.10","axios":"^0.22.0","axios-retry":"^3.2.0","discord-ytdl-core":"^5.0.4","domhandler":"^4.2.2","ffmpeg-static":"^5.0.2","htmlparser2":"^7.1.2","isomorphic-unfetch":"^3.1.0","libsodium-wrappers":"^0.7.9","spotify-url-info":"^3.1.7","youtubei":"^0.0.1-rc.34","ytdl-core":"^4.11.2","ytsr":"^3.6.0"},"devDependencies":{"@babel/cli":"^7.14.8","@babel/core":"^7.15.0","@babel/preset-env":"^7.15.0","@babel/preset-typescript":"^7.15.0","@types/node":"^16.6.1","@typescript-eslint/eslint-plugin":"^4.29.1","@typescript-eslint/parser":"^4.29.1","assert-diff":"^3.0.2","discord.js":"^14.3.0","discord.js-docgen":"github:discordjs/docgen#ts-patch","eslint":"^7.32.0","jest":"^27.0.6","jsdoc-babel":"^0.5.0","ts-node":"^10.2.0","typescript":"^4.3.5"},"directories":{"doc":"docs","test":"test"},"engines":{"node":">=16.9.0"},"workspaces":["packages/*"],"packageManager":"npm@8.11.0","readme":"# Discord Music Player\n\n![npm](https://img.shields.io/npm/dt/discord-music-player?style=for-the-badge)\n![npm](https://img.shields.io/npm/v/discord-music-player?style=for-the-badge)\n![CodeFactor Grade](https://img.shields.io/codefactor/grade/github/SushiBtw/discord-music-player?color=%2348aaf1&style=for-the-badge)\n\n### Note: This is the v8 version of Discord Music Player for Discord.JS v13!\n\nDiscord Music Player is a powerful [Node.js](https://nodejs.org) module that allows you to easily implement music commands.\n**Everything** is customizable, and everything can be done using this package - **there are no limitations!**\n\nThis package supports YouTube Videos & Playlists, Spotify Songs & Playlists, Apple Music Songs & Playlists.\nPackage from version v7.0.0 is fully maintained by [SushiBtw](https://github.com/SushiBtw).\n\n### Requirements:\n\n- [Discord.js v13](https://www.npmjs.com/package/discord.js),\n- [Node.JS v16](https://nodejs.org/),\n\n# Installation\n\n_Node.JS v16 or newer is required to run this module._\n\n```sh\nnpm install --save discord-music-player\n```\n\nInstall **@discordjs/opus**:\n\n```sh\nnpm install --save @discordjs/opus\n```\n\n**Install [FFMPEG](https://www.ffmpeg.org/download.html)!**\n\n# Documentation\n\n**Discord Music Player documentation: [https://discord-music-player.js.org/](https://discord-music-player.js.org/)**\n\n### **Need some help?**\n\nFeel free to join [Discord-Music-Player Discord Server](https://discord.gg/6fejZNsmFC) and ask us about DMP.\n\n# Getting Started\n\n**The code bellow, will show you how to use DMP in your code.**\n\n_Please define your **Player** after the **client/bot** definition._\n\n[!] Remember to include the related voice **Intents** at the client options. [!]\n\n```js\nconst Discord = require(\"discord.js\");\nconst client = new Discord.Client({\n  intents: [\n    Intents.FLAGS.GUILDS,\n    Intents.FLAGS.GUILD_MESSAGES,\n    Intents.FLAGS.GUILD_VOICE_STATES,\n  ],\n});\nconst settings = {\n  prefix: \"!\",\n  token: \"YourBotTokenHere\",\n};\n\nconst { Player } = require(\"discord-music-player\");\nconst player = new Player(client, {\n  leaveOnEmpty: false, // This options are optional.\n});\n// You can define the Player as *client.player* to easily access it.\nclient.player = player;\n\nclient.on(\"ready\", () => {\n  console.log(\"I am ready to Play with DMP 🎶\");\n});\n\nclient.login(settings.token);\n```\n\n# Example Usage\n\n```js\nconst { RepeatMode } = require(\"discord-music-player\");\n\nclient.on(\"messageCreate\", async (message) => {\n  const args = message.content\n    .slice(settings.prefix.length)\n    .trim()\n    .split(/ +/g);\n  const command = args.shift();\n  let guildQueue = client.player.getQueue(message.guild.id);\n\n  if (command === \"play\") {\n    let queue = client.player.createQueue(message.guild.id);\n    await queue.join(message.member.voice.channel);\n    let song = await queue.play(args.join(\" \")).catch((_) => {\n      if (!guildQueue) queue.stop();\n    });\n  }\n\n  if (command === \"playlist\") {\n    let queue = client.player.createQueue(message.guild.id);\n    await queue.join(message.member.voice.channel);\n    let song = await queue.playlist(args.join(\" \")).catch((_) => {\n      if (!guildQueue) queue.stop();\n    });\n  }\n\n  if (command === \"skip\") {\n    guildQueue.skip();\n  }\n\n  if (command === \"stop\") {\n    guildQueue.stop();\n  }\n\n  if (command === \"removeLoop\") {\n    guildQueue.setRepeatMode(RepeatMode.DISABLED); // or 0 instead of RepeatMode.DISABLED\n  }\n\n  if (command === \"toggleLoop\") {\n    guildQueue.setRepeatMode(RepeatMode.SONG); // or 1 instead of RepeatMode.SONG\n  }\n\n  if (command === \"toggleQueueLoop\") {\n    guildQueue.setRepeatMode(RepeatMode.QUEUE); // or 2 instead of RepeatMode.QUEUE\n  }\n\n  if (command === \"setVolume\") {\n    guildQueue.setVolume(parseInt(args[0]));\n  }\n\n  if (command === \"seek\") {\n    guildQueue.seek(parseInt(args[0]) * 1000);\n  }\n\n  if (command === \"clearQueue\") {\n    guildQueue.clearQueue();\n  }\n\n  if (command === \"shuffle\") {\n    guildQueue.shuffle();\n  }\n\n  if (command === \"getQueue\") {\n    console.log(guildQueue);\n  }\n\n  if (command === \"getVolume\") {\n    console.log(guildQueue.volume);\n  }\n\n  if (command === \"nowPlaying\") {\n    console.log(`Now playing: ${guildQueue.nowPlaying}`);\n  }\n\n  if (command === \"pause\") {\n    guildQueue.setPaused(true);\n  }\n\n  if (command === \"resume\") {\n    guildQueue.setPaused(false);\n  }\n\n  if (command === \"remove\") {\n    guildQueue.remove(parseInt(args[0]));\n  }\n\n  if (command === \"createProgressBar\") {\n    const ProgressBar = guildQueue.createProgressBar();\n\n    // [======>              ][00:35/2:20]\n    console.log(ProgressBar.prettier);\n  }\n});\n```\n\n### Events:\n\n```js\n// Init the event listener only once (at the top of your code).\nclient.player\n  // Emitted when channel was empty.\n  .on(\"channelEmpty\", (queue) =>\n    console.log(`Everyone left the Voice Channel, queue ended.`)\n  )\n  // Emitted when a song was added to the queue.\n  .on(\"songAdd\", (queue, song) =>\n    console.log(`Song ${song} was added to the queue.`)\n  )\n  // Emitted when a playlist was added to the queue.\n  .on(\"playlistAdd\", (queue, playlist) =>\n    console.log(\n      `Playlist ${playlist} with ${playlist.songs.length} was added to the queue.`\n    )\n  )\n  // Emitted when there was no more music to play.\n  .on(\"queueDestroyed\", (queue) => console.log(`The queue was destroyed.`))\n  // Emitted when the queue was destroyed (either by ending or stopping).\n  .on(\"queueEnd\", (queue) => console.log(`The queue has ended.`))\n  // Emitted when a song changed.\n  .on(\"songChanged\", (queue, newSong, oldSong) =>\n    console.log(`${newSong} is now playing.`)\n  )\n  // Emitted when a first song in the queue started playing.\n  .on(\"songFirst\", (queue, song) => console.log(`Started playing ${song}.`))\n  // Emitted when someone disconnected the bot from the channel.\n  .on(\"clientDisconnect\", (queue) =>\n    console.log(`I was kicked from the Voice Channel, queue ended.`)\n  )\n  // Emitted when deafenOnJoin is true and the bot was undeafened\n  .on(\"clientUndeafen\", (queue) => console.log(`I got undefeanded.`))\n  // Emitted when there was an error in runtime\n  .on(\"error\", (error, queue) => {\n    console.log(`Error: ${error} in ${queue.guild.name}`);\n  });\n```\n\n# Passing custom data\n\n### Queue\n\nWhile running the `Queue#createQueue()` method you can pass a `options#data` object to hold custom data.\nThis can be made in two ways:\n\n```js\n// Pass custom data\nawait player.createQueue(message.guild.id, {\n  data: {\n    queueInitMessage: message,\n    myObject: \"this will stay with the queue :)\",\n    more: \"add more... there are no limitations...\",\n  },\n});\n// Or by using\nqueue.setData({\n  whatever: \"you want :D\",\n});\n\n// Access custom data\nlet queue = player.getQueue(message.guild.id);\nlet initMessage = queue.data.queueInitMessage;\nawait initMessage.channel.send(`This message object is hold in Queue :D`);\n```\n\n### Song or Playlist\n\nWhile running the `Queue#play()`/Queue#playlist() method you can pass a `options#data` object to hold custom data.\nThis can be made in two ways:\n\n```js\n// Play the song\nlet song = await queue.play(\"Born in the USA!\");\n// Set song data\nsong.setData({\n  initMessage: message,\n});\n\n// Play the playlist\nlet playlist = await queue.playlist(\n  \"https://www.youtube.com/playlist?list=PLDLGxnP4y2mGKGEqwxWTRkd3HtrrVTMdU\"\n);\n// Set playlist data (will set data for each song in the playlist)\nsong.setData({\n  initMessage: message,\n});\n\n// Access custom data\nlet queue = player.getQueue(message.guild.id);\nlet { initMessage } = queue.nowPlaying.data;\nawait initMessage.channel.send(`This message object is hold in Song :D`);\n```\n","readmeFilename":"README.md","gitHead":"7221ab7667553b4b382c23cfb793827f33ca4679","_id":"spike-player@1.4.6-7","_nodeVersion":"16.17.0","_npmVersion":"8.18.0","dist":{"integrity":"sha512-WQWCjMFfBVwvk8JxdgxQ6N8T3tVjvgUutrA+cmJ24/ipx+h13qrWML9WXuVlYv3aaYLcvKeW//oiW2wrkP2IIQ==","shasum":"62bfcbcfed4a61aedecc9e7431ec67f170981a73","tarball":"https://registry.npmjs.org/spike-player/-/spike-player-1.4.6-7.tgz","fileCount":28,"unpackedSize":92152,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDOXlLugIUP2U0rICGeZrzPxsw06xdGawtnwt5kbm6PdAIgAgi01DznwZz/IX3VXvdToLBagqLiOeJtQ7UT/kJh9ug="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjqKx3ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmrm3w/+Oby6EHMNbXHLxYuYbGij0kDx1gwUJOtg9cGDcMWZvkVhDGdn\r\nFChGn14yASvpF/zzsl9dgvm1pO0RbNGtIoKlIS6fn8k0YjmFyXanKVZwpzba\r\n07qtvRSOvXyr+EN4l+n+2J9BagyOUHobcOmjtZd1F+8dCP0w3geQ/n5/6PIO\r\nECkmorH/HNGn1bNrBkVxCftIe1r7hbM9lDPSCG+EgXyabl4ifRkmO74la3cS\r\nyBR0yQps//X6Af5svg4if1rn9SMN2/B5+NGQeMVCh4Jl8i/AwclVlADn69tD\r\n7qAmc75Hf75KoGFH5uSoUD8ZnEZgxpVadCZoOsO783cCFzWrbaEBoME0WiLO\r\nzL4Z/MtsNRxmvWZTnfNXwblhnQAbTWOvua9Wo5UbaeRb+JGiGLAPxZEHqMQX\r\nI0rncMvR0ffORHjvKNRbaEIKwmzfUFrRbz2stKGT4H1zmExF9gTZgqnij5D9\r\nYtS/ATK9mJShxmQW570CHk7cmBR95TWW5XtRukKpR4/+VkJqlfP9RQI0MRFe\r\nCmWxzaEplhZbz5U8CYG4tkXdGuyVWijP1iNYhwdgB9LoRmCwkPi8K2ukwuBg\r\n5xk1OqHZkOZJ5Fe0xuosqflPvCUPaW+T8P2Q165+9DhoCd/IrDattODQR3Ye\r\nelIm9sDq8L7p96Zz8XjxHM7VgRQwgGgqZpY=\r\n=dHWh\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"spikebot","email":"abatallah1214@gmail.com"},"maintainers":[{"name":"spikebot","email":"abatallah1214@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spike-player_1.4.6-7_1671998583609_0.36156275655148606"},"_hasShrinkwrap":false},"1.4.6-8":{"name":"spike-player","version":"1.4.6-8","description":"Complete framework to facilitate music commands using discord.js v13 & v14","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","test":"jest test/test.js","clean":"rimraf dist","pre":"npm version prerelease --force && npm publish --access public --tag dev","prep":"npm run clean && npm run build","pub":"conventional-changelog -p angular -i CHANGELOG.md -s && npm publish"},"keywords":["music","player","bot","framework","discord","youtube","spotify","v13","v14"],"dependencies":{"@discordjs/opus":"^0.8.0","@discordjs/voice":"^0.11.0","@spikebot/discord-ytdl-core":"^1.0.4","@spikebot/ytdl-core":"^1.0.2","apple-music-metadata":"^1.0.10","axios":"^0.22.0","axios-retry":"^3.2.0","discord-ytdl-core":"^5.0.4","domhandler":"^4.2.2","ffmpeg-static":"^5.0.2","htmlparser2":"^7.1.2","isomorphic-unfetch":"^3.1.0","libsodium-wrappers":"^0.7.9","spotify-url-info":"^3.1.7","youtubei":"^0.0.1-rc.34","ytdl-core":"^4.11.2","ytsr":"^3.6.0"},"devDependencies":{"@babel/cli":"^7.14.8","@babel/core":"^7.15.0","@babel/preset-env":"^7.15.0","@babel/preset-typescript":"^7.15.0","@types/node":"^16.6.1","@typescript-eslint/eslint-plugin":"^4.29.1","@typescript-eslint/parser":"^4.29.1","assert-diff":"^3.0.2","discord.js":"^14.3.0","discord.js-docgen":"github:discordjs/docgen#ts-patch","eslint":"^7.32.0","jest":"^27.0.6","jsdoc-babel":"^0.5.0","ts-node":"^10.2.0","typescript":"^4.3.5"},"directories":{"doc":"docs","test":"test"},"engines":{"node":">=16.9.0"},"workspaces":["packages/*"],"packageManager":"npm@8.11.0","readme":"# Discord Music Player\n\n![npm](https://img.shields.io/npm/dt/discord-music-player?style=for-the-badge)\n![npm](https://img.shields.io/npm/v/discord-music-player?style=for-the-badge)\n![CodeFactor Grade](https://img.shields.io/codefactor/grade/github/SushiBtw/discord-music-player?color=%2348aaf1&style=for-the-badge)\n\n### Note: This is the v8 version of Discord Music Player for Discord.JS v13!\n\nDiscord Music Player is a powerful [Node.js](https://nodejs.org) module that allows you to easily implement music commands.\n**Everything** is customizable, and everything can be done using this package - **there are no limitations!**\n\nThis package supports YouTube Videos & Playlists, Spotify Songs & Playlists, Apple Music Songs & Playlists.\nPackage from version v7.0.0 is fully maintained by [SushiBtw](https://github.com/SushiBtw).\n\n### Requirements:\n\n- [Discord.js v13](https://www.npmjs.com/package/discord.js),\n- [Node.JS v16](https://nodejs.org/),\n\n# Installation\n\n_Node.JS v16 or newer is required to run this module._\n\n```sh\nnpm install --save discord-music-player\n```\n\nInstall **@discordjs/opus**:\n\n```sh\nnpm install --save @discordjs/opus\n```\n\n**Install [FFMPEG](https://www.ffmpeg.org/download.html)!**\n\n# Documentation\n\n**Discord Music Player documentation: [https://discord-music-player.js.org/](https://discord-music-player.js.org/)**\n\n### **Need some help?**\n\nFeel free to join [Discord-Music-Player Discord Server](https://discord.gg/6fejZNsmFC) and ask us about DMP.\n\n# Getting Started\n\n**The code bellow, will show you how to use DMP in your code.**\n\n_Please define your **Player** after the **client/bot** definition._\n\n[!] Remember to include the related voice **Intents** at the client options. [!]\n\n```js\nconst Discord = require(\"discord.js\");\nconst client = new Discord.Client({\n  intents: [\n    Intents.FLAGS.GUILDS,\n    Intents.FLAGS.GUILD_MESSAGES,\n    Intents.FLAGS.GUILD_VOICE_STATES,\n  ],\n});\nconst settings = {\n  prefix: \"!\",\n  token: \"YourBotTokenHere\",\n};\n\nconst { Player } = require(\"discord-music-player\");\nconst player = new Player(client, {\n  leaveOnEmpty: false, // This options are optional.\n});\n// You can define the Player as *client.player* to easily access it.\nclient.player = player;\n\nclient.on(\"ready\", () => {\n  console.log(\"I am ready to Play with DMP 🎶\");\n});\n\nclient.login(settings.token);\n```\n\n# Example Usage\n\n```js\nconst { RepeatMode } = require(\"discord-music-player\");\n\nclient.on(\"messageCreate\", async (message) => {\n  const args = message.content\n    .slice(settings.prefix.length)\n    .trim()\n    .split(/ +/g);\n  const command = args.shift();\n  let guildQueue = client.player.getQueue(message.guild.id);\n\n  if (command === \"play\") {\n    let queue = client.player.createQueue(message.guild.id);\n    await queue.join(message.member.voice.channel);\n    let song = await queue.play(args.join(\" \")).catch((_) => {\n      if (!guildQueue) queue.stop();\n    });\n  }\n\n  if (command === \"playlist\") {\n    let queue = client.player.createQueue(message.guild.id);\n    await queue.join(message.member.voice.channel);\n    let song = await queue.playlist(args.join(\" \")).catch((_) => {\n      if (!guildQueue) queue.stop();\n    });\n  }\n\n  if (command === \"skip\") {\n    guildQueue.skip();\n  }\n\n  if (command === \"stop\") {\n    guildQueue.stop();\n  }\n\n  if (command === \"removeLoop\") {\n    guildQueue.setRepeatMode(RepeatMode.DISABLED); // or 0 instead of RepeatMode.DISABLED\n  }\n\n  if (command === \"toggleLoop\") {\n    guildQueue.setRepeatMode(RepeatMode.SONG); // or 1 instead of RepeatMode.SONG\n  }\n\n  if (command === \"toggleQueueLoop\") {\n    guildQueue.setRepeatMode(RepeatMode.QUEUE); // or 2 instead of RepeatMode.QUEUE\n  }\n\n  if (command === \"setVolume\") {\n    guildQueue.setVolume(parseInt(args[0]));\n  }\n\n  if (command === \"seek\") {\n    guildQueue.seek(parseInt(args[0]) * 1000);\n  }\n\n  if (command === \"clearQueue\") {\n    guildQueue.clearQueue();\n  }\n\n  if (command === \"shuffle\") {\n    guildQueue.shuffle();\n  }\n\n  if (command === \"getQueue\") {\n    console.log(guildQueue);\n  }\n\n  if (command === \"getVolume\") {\n    console.log(guildQueue.volume);\n  }\n\n  if (command === \"nowPlaying\") {\n    console.log(`Now playing: ${guildQueue.nowPlaying}`);\n  }\n\n  if (command === \"pause\") {\n    guildQueue.setPaused(true);\n  }\n\n  if (command === \"resume\") {\n    guildQueue.setPaused(false);\n  }\n\n  if (command === \"remove\") {\n    guildQueue.remove(parseInt(args[0]));\n  }\n\n  if (command === \"createProgressBar\") {\n    const ProgressBar = guildQueue.createProgressBar();\n\n    // [======>              ][00:35/2:20]\n    console.log(ProgressBar.prettier);\n  }\n});\n```\n\n### Events:\n\n```js\n// Init the event listener only once (at the top of your code).\nclient.player\n  // Emitted when channel was empty.\n  .on(\"channelEmpty\", (queue) =>\n    console.log(`Everyone left the Voice Channel, queue ended.`)\n  )\n  // Emitted when a song was added to the queue.\n  .on(\"songAdd\", (queue, song) =>\n    console.log(`Song ${song} was added to the queue.`)\n  )\n  // Emitted when a playlist was added to the queue.\n  .on(\"playlistAdd\", (queue, playlist) =>\n    console.log(\n      `Playlist ${playlist} with ${playlist.songs.length} was added to the queue.`\n    )\n  )\n  // Emitted when there was no more music to play.\n  .on(\"queueDestroyed\", (queue) => console.log(`The queue was destroyed.`))\n  // Emitted when the queue was destroyed (either by ending or stopping).\n  .on(\"queueEnd\", (queue) => console.log(`The queue has ended.`))\n  // Emitted when a song changed.\n  .on(\"songChanged\", (queue, newSong, oldSong) =>\n    console.log(`${newSong} is now playing.`)\n  )\n  // Emitted when a first song in the queue started playing.\n  .on(\"songFirst\", (queue, song) => console.log(`Started playing ${song}.`))\n  // Emitted when someone disconnected the bot from the channel.\n  .on(\"clientDisconnect\", (queue) =>\n    console.log(`I was kicked from the Voice Channel, queue ended.`)\n  )\n  // Emitted when deafenOnJoin is true and the bot was undeafened\n  .on(\"clientUndeafen\", (queue) => console.log(`I got undefeanded.`))\n  // Emitted when there was an error in runtime\n  .on(\"error\", (error, queue) => {\n    console.log(`Error: ${error} in ${queue.guild.name}`);\n  });\n```\n\n# Passing custom data\n\n### Queue\n\nWhile running the `Queue#createQueue()` method you can pass a `options#data` object to hold custom data.\nThis can be made in two ways:\n\n```js\n// Pass custom data\nawait player.createQueue(message.guild.id, {\n  data: {\n    queueInitMessage: message,\n    myObject: \"this will stay with the queue :)\",\n    more: \"add more... there are no limitations...\",\n  },\n});\n// Or by using\nqueue.setData({\n  whatever: \"you want :D\",\n});\n\n// Access custom data\nlet queue = player.getQueue(message.guild.id);\nlet initMessage = queue.data.queueInitMessage;\nawait initMessage.channel.send(`This message object is hold in Queue :D`);\n```\n\n### Song or Playlist\n\nWhile running the `Queue#play()`/Queue#playlist() method you can pass a `options#data` object to hold custom data.\nThis can be made in two ways:\n\n```js\n// Play the song\nlet song = await queue.play(\"Born in the USA!\");\n// Set song data\nsong.setData({\n  initMessage: message,\n});\n\n// Play the playlist\nlet playlist = await queue.playlist(\n  \"https://www.youtube.com/playlist?list=PLDLGxnP4y2mGKGEqwxWTRkd3HtrrVTMdU\"\n);\n// Set playlist data (will set data for each song in the playlist)\nsong.setData({\n  initMessage: message,\n});\n\n// Access custom data\nlet queue = player.getQueue(message.guild.id);\nlet { initMessage } = queue.nowPlaying.data;\nawait initMessage.channel.send(`This message object is hold in Song :D`);\n```\n","readmeFilename":"README.md","gitHead":"50d0615b75b0c059b55a16a235553b91b915b52f","_id":"spike-player@1.4.6-8","_nodeVersion":"16.17.0","_npmVersion":"8.18.0","dist":{"integrity":"sha512-zIDzGe3vMQs5Hiwr0EtrKCdpcnV7fzqZEAS/u6SJC4Y1CRtOsI3UWkK7WlVYd1IH+a+2migIUx49AwvaiEQK2w==","shasum":"c1e2e9ca3df3e6b9a04f6a9ef5aa16809f335023","tarball":"https://registry.npmjs.org/spike-player/-/spike-player-1.4.6-8.tgz","fileCount":28,"unpackedSize":92234,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIC4c9If9pxLYf7EugoAIlSLCbfC28Troaeb9XcWUehPOAiEApoZHAQsLXI/i5VtGBZ1Yck4tY/yj/JGc68DqWNGhpTI="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjqK6eACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoDgA/9GGJbJ+4J0d1Rh+VCusAA3X9AgTDIIba1T9Mj2cqVVQrnFoMw\r\nzntR6ryVbMruaVzi35JjKonIUIgniWMyVMFKagnYTT65I7dyg0wcnRCiW1ET\r\nztN9Z33Sdb1aZWbHRi31izPY1pX0OLVeI76UhrBX6K+iCzkYkO2mr/4SRa8S\r\npwmCUvZhlD0aubYb8jeBUjEd8lBEhOTdiGZRQedbIMBfce1euVDjAeMxQdZL\r\niSX5u2PC2T850rbRBfarPifUslZPLHAFmEVnWJzliQxmkohDTwtSG4cKp8r5\r\nE+EwP4nj5V9GHb9DGIx/4RcbZpr++jMTCoU3396dALtgZ54tbiLPHKI7qluf\r\nSAM+HOPIdnPkZYuEd+FFP3NhxkDgvS8kPbjm4s9AU7ruoQD3aksFQjhzLi5d\r\nrGnh2dNGApWUv/cyaK6pxH3BsM5cB3wuCvmdP8bg9IA9z1VjW4pGcOAL0p79\r\nw2hxLQQB+EokLqnqIHaAykXpvw0llHQnjTm0KMIwLA6nZyCPCy/uozwte+nx\r\ntTkjwDKf7QNkYmBjU7AYH0vdN4QowvW09JQEcJCfKPJQ1z2+cZhJywCvHnqe\r\n2bDJA/GuKSRK3jfd1JpWN6hq0oJEfYWAYB1oZiU5AeA/hHBuR+CdD2edtngt\r\nf+NR44OSmpsrONDGSAStEj1N4SrwxRZzfi4=\r\n=4RqX\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"spikebot","email":"abatallah1214@gmail.com"},"maintainers":[{"name":"spikebot","email":"abatallah1214@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spike-player_1.4.6-8_1671999134349_0.5717284064990815"},"_hasShrinkwrap":false}},"time":{"created":"2022-06-23T16:31:50.439Z","1.0.0":"2022-06-23T16:31:50.585Z","modified":"2022-12-25T20:12:14.637Z","1.0.1":"2022-06-23T19:24:32.381Z","1.1.0":"2022-06-29T08:45:59.267Z","1.1.1":"2022-06-29T11:00:14.344Z","1.1.1-dev":"2022-06-29T11:50:47.077Z","1.1.2":"2022-07-02T08:15:57.828Z","1.1.3":"2022-07-07T19:01:12.521Z","1.2.0":"2022-07-07T19:40:54.422Z","1.2.1":"2022-07-09T10:15:28.280Z","1.2.2":"2022-07-09T10:22:53.362Z","1.2.3-0":"2022-07-09T13:03:40.465Z","1.2.4-1":"2022-07-09T13:05:22.487Z","1.2.4-2":"2022-07-09T13:10:26.576Z","1.2.4-3":"2022-07-13T07:41:39.565Z","1.2.4":"2022-07-13T08:38:00.342Z","1.2.5":"2022-07-17T20:50:07.505Z","1.2.6":"2022-07-18T10:53:54.777Z","1.2.6-0":"2022-07-18T17:27:16.451Z","1.2.6-1":"2022-07-18T17:36:29.280Z","1.2.6-2":"2022-07-18T18:03:15.741Z","1.2.6-3":"2022-07-18T18:12:48.491Z","1.2.7-0":"2022-07-18T18:21:41.251Z","1.2.6-4":"2022-07-18T18:22:18.605Z","1.2.6-5":"2022-07-18T18:28:48.955Z","1.2.6-6":"2022-07-19T12:59:56.959Z","1.2.6-8":"2022-07-21T07:36:35.240Z","1.2.10-0":"2022-07-22T16:06:16.778Z","1.3.0-1":"2022-07-22T16:07:04.497Z","1.3.0-2":"2022-07-22T19:54:55.323Z","1.3.0":"2022-07-22T19:57:20.458Z","1.3.1":"2022-07-23T12:32:33.230Z","1.3.2-0":"2022-07-23T16:58:14.984Z","1.3.2-2":"2022-07-23T17:06:49.009Z","1.3.2-1":"2022-07-24T16:35:54.135Z","1.3.4":"2022-07-24T16:44:59.221Z","1.3.5":"2022-07-31T17:21:20.404Z","1.4.1-0":"2022-08-04T11:02:34.159Z","1.4.1-1":"2022-08-04T11:02:51.334Z","1.4.0-0":"2022-08-04T11:33:26.020Z","1.4.0":"2022-08-04T11:35:45.268Z","1.4.1":"2022-08-12T07:34:52.435Z","1.4.2-0":"2022-08-12T07:56:51.459Z","1.4.2":"2022-08-12T08:01:45.686Z","1.4.3":"2022-08-14T18:38:10.287Z","1.4.4-0":"2022-08-16T10:31:47.586Z","1.4.4-1":"2022-08-22T16:28:52.752Z","1.4.4-2":"2022-09-04T16:18:11.037Z","1.4.4":"2022-09-04T16:47:53.237Z","1.4.4-3":"2022-10-01T08:10:28.572Z","1.4.4-4":"2022-10-01T08:16:30.851Z","1.4.4-5":"2022-10-01T08:20:15.740Z","1.4.4-6":"2022-10-10T10:09:56.365Z","1.4.4-7":"2022-10-10T10:13:35.989Z","1.4.4-9":"2022-10-10T10:25:22.942Z","1.4.5":"2022-11-01T14:27:55.083Z","1.4.6-1":"2022-12-23T10:54:27.670Z","1.4.6-2":"2022-12-23T11:01:04.995Z","1.4.6-3":"2022-12-25T19:32:54.500Z","1.4.6-4":"2022-12-25T19:42:05.004Z","1.4.6-5":"2022-12-25T19:44:14.952Z","1.4.6-6":"2022-12-25T19:44:50.172Z","1.4.6-7":"2022-12-25T20:03:03.797Z","1.4.6-8":"2022-12-25T20:12:14.523Z"},"maintainers":[{"name":"spikebot","email":"abatallah1214@gmail.com"}],"description":"Complete framework to facilitate music commands using discord.js v13 & v14","keywords":["music","player","bot","framework","discord","youtube","spotify","v13","v14"],"readme":"","readmeFilename":""}