diff --git a/package.json b/package.json index f02ccf2..7675da6 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,7 @@ "homepage": "https://gitdab.com/Cynosphere/HiddenPhox#readme", "dependencies": { "@ctrl/tinycolor": "^3.6.0", + "@distube/ytdl-core": "^4.11.9", "@projectdysnomia/dysnomia": "^0.1.1", "dumpy": "github:Cynosphere/dumpy.js", "google-images": "^2.1.0", @@ -26,8 +27,7 @@ "murmurhash": "^2.0.1", "node-ffprobe": "^3.0.0", "sharp": "^0.32.0", - "sqlite3": "^5.1.6", - "youtubei.js": "^4.3.0" + "sqlite3": "^5.1.6" }, "devDependencies": { "eslint": "^8.39.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1a1696f..595dac0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,6 +4,9 @@ dependencies: '@ctrl/tinycolor': specifier: ^3.6.0 version: 3.6.0 + '@distube/ytdl-core': + specifier: ^4.11.9 + version: 4.11.9 '@projectdysnomia/dysnomia': specifier: ^0.1.1 version: 0.1.1 @@ -28,9 +31,6 @@ dependencies: sqlite3: specifier: ^5.1.6 version: 5.1.6 - youtubei.js: - specifier: ^4.3.0 - version: 4.3.0 devDependencies: eslint: @@ -57,6 +57,16 @@ packages: engines: {node: '>=10'} dev: false + /@distube/ytdl-core@4.11.9: + resolution: {integrity: sha512-wlQu48gG9eV8YCASpra1bw2iXIlc3FuF/WiB8akBGmrp/jd9tGvuxwgOH5oKYQZYSSjzazsW2VX7L5rt+8Fu5Q==} + engines: {node: '>=12'} + dependencies: + m3u8stream: 0.8.6 + miniget: 4.2.2 + sax: 1.2.4 + undici: 5.22.0 + dev: false + /@eslint-community/eslint-utils@4.4.0(eslint@8.39.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -977,6 +987,7 @@ packages: resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} engines: {node: '>=0.4.0'} hasBin: true + dev: true /agent-base@6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} @@ -1076,10 +1087,6 @@ packages: resolution: {integrity: sha512-vHdS19CnY3hwiNdkaqk93DvjVLfbEcI8mys4UjuWrlX1haDmroo8o4xCzh4wD6DGV6HxRCyauwhHRqMTfERtjw==} dev: false - /boolbase@1.0.0: - resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} - dev: false - /brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: @@ -1234,25 +1241,6 @@ packages: which: 2.0.2 dev: true - /css-select@5.1.0: - resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} - dependencies: - boolbase: 1.0.0 - css-what: 6.1.0 - domhandler: 5.0.3 - domutils: 3.0.1 - nth-check: 2.1.1 - dev: false - - /css-what@6.1.0: - resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} - engines: {node: '>= 6'} - dev: false - - /cssom@0.5.0: - resolution: {integrity: sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==} - dev: false - /debug@4.3.4: resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} @@ -1302,37 +1290,10 @@ packages: esutils: 2.0.3 dev: true - /dom-serializer@2.0.0: - resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} - dependencies: - domelementtype: 2.3.0 - domhandler: 5.0.3 - entities: 4.5.0 - dev: false - /dom-walk@0.1.2: resolution: {integrity: sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==} dev: false - /domelementtype@2.3.0: - resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} - dev: false - - /domhandler@5.0.3: - resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} - engines: {node: '>= 4'} - dependencies: - domelementtype: 2.3.0 - dev: false - - /domutils@3.0.1: - resolution: {integrity: sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==} - dependencies: - dom-serializer: 2.0.0 - domelementtype: 2.3.0 - domhandler: 5.0.3 - dev: false - /duplexer3@0.1.5: resolution: {integrity: sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==} dev: false @@ -1355,11 +1316,6 @@ packages: once: 1.4.0 dev: false - /entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} - dev: false - /env-paths@2.2.1: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} @@ -1669,19 +1625,6 @@ packages: resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} dev: false - /html-escaper@3.0.3: - resolution: {integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==} - dev: false - - /htmlparser2@8.0.2: - resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} - dependencies: - domelementtype: 2.3.0 - domhandler: 5.0.3 - domutils: 3.0.1 - entities: 4.5.0 - dev: false - /http-cache-semantics@4.1.1: resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} dev: false @@ -1869,12 +1812,6 @@ packages: - encoding dev: false - /jintr@1.0.0: - resolution: {integrity: sha512-Kbyb5jiIzmTrbhbdjQGt+jjVzn9BPluvL3mZU5ihFQIEGjCHUA4+rsXE2PNDKmg1UlfdTn3947aSwWOVnc5UIw==} - dependencies: - acorn: 8.8.2 - dev: false - /jpeg-js@0.4.4: resolution: {integrity: sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==} dev: false @@ -1906,16 +1843,6 @@ packages: type-check: 0.4.0 dev: true - /linkedom@0.14.25: - resolution: {integrity: sha512-Q5BvQVFzMveMxHvZ9L3E60duxSVPIWQRzY2HJKpCV4pRzY3jS/r/a1upLeo/Nup9mDRJ5MS0FX2hRR+wRo+Hiw==} - dependencies: - css-select: 5.1.0 - cssom: 0.5.0 - html-escaper: 3.0.3 - htmlparser2: 8.0.2 - uhyphen: 0.2.0 - dev: false - /load-bmfont@1.4.1: resolution: {integrity: sha512-8UyQoYmdRDy81Brz6aLAUhfZLwr5zV0L3taTQ4hju7m6biuwiWiJXjPhBJxbUQJA8PrkvJ/7Enqmwk2sM14soA==} dependencies: @@ -1952,6 +1879,14 @@ packages: yallist: 4.0.0 dev: false + /m3u8stream@0.8.6: + resolution: {integrity: sha512-LZj8kIVf9KCphiHmH7sbFQTVe4tOemb202fWwvJwR9W5ENW/1hxJN6ksAWGhQgSBSa3jyWhnjKU1Fw1GaOdbyA==} + engines: {node: '>=12'} + dependencies: + miniget: 4.2.2 + sax: 1.2.4 + dev: false + /make-dir@3.1.0: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} engines: {node: '>=8'} @@ -2002,6 +1937,11 @@ packages: dom-walk: 0.1.2 dev: false + /miniget@4.2.2: + resolution: {integrity: sha512-a7voNL1N5lDMxvTMExOkg+Fq89jM2vY8pAi9ZEWzZtfNmdfP6RXkvUtFnCAXoCv2T9k1v/fUJVaAEuepGcvLYA==} + engines: {node: '>=12'} + dev: false + /minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: @@ -2206,12 +2146,6 @@ packages: dev: false optional: true - /nth-check@2.1.1: - resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} - dependencies: - boolbase: 1.0.0 - dev: false - /object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -2713,10 +2647,6 @@ packages: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} dev: false - /tslib@2.5.0: - resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} - dev: false - /tunnel-agent@0.6.0: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} dependencies: @@ -2741,10 +2671,6 @@ packages: engines: {node: '>=10'} dev: true - /uhyphen@0.2.0: - resolution: {integrity: sha512-qz3o9CHXmJJPGBdqzab7qAYuW8kQGKNEuoHFYrBwV6hWIMcpAmxDLXojcHfFr9US1Pe6zUswEIJIbLI610fuqA==} - dev: false - /undici@5.22.0: resolution: {integrity: sha512-fR9RXCc+6Dxav4P9VV/sp5w3eFiSdOjJYsbtWfd4s5L5C4ogyuVpdKIVHeW0vV1MloM65/f7W45nR9ZxwVdyiA==} engines: {node: '>=14.0'} @@ -2889,15 +2815,6 @@ packages: engines: {node: '>=10'} dev: true - /youtubei.js@4.3.0: - resolution: {integrity: sha512-HdU6Awdr1nUWy0Ph7WdmoYPWL0ovx+S4w40eeTzAENr5xiUENsLuXcvULRc2fRCIxi+n7Q6142VVhmM4yK/g5g==} - dependencies: - jintr: 1.0.0 - linkedom: 0.14.25 - tslib: 2.5.0 - undici: 5.22.0 - dev: false - github.com/Cynosphere/dumpy.js/5fc22353cdcb97084bab572266390e780d9f7a7b: resolution: {tarball: https://codeload.github.com/Cynosphere/dumpy.js/tar.gz/5fc22353cdcb97084bab572266390e780d9f7a7b} name: dumpy diff --git a/src/lib/commandDispatcher.js b/src/lib/commandDispatcher.js index 9681dfa..c32a0e3 100644 --- a/src/lib/commandDispatcher.js +++ b/src/lib/commandDispatcher.js @@ -21,11 +21,11 @@ function removeStartHyphens(val) { // taken from ethanent/gar // modified to make - arguments only be bools unless = -function parseAsArgv(args) { +function parseAsArgv(argv) { const optional = {}; + const args = []; - for (let i = 0; i < args.length; i++) { - const arg = args.shift(); + for (const arg of argv) { const equalsIndex = arg.charAt(0) === "-" ? arg.indexOf("=") : -1; const argName = equalsIndex === -1 @@ -43,9 +43,7 @@ function parseAsArgv(args) { } } } else { - // all optional args must be at the start of the argument string - args.splice(0, 0, arg); - break; + args.push(convertIfApplicable(argName)); } } diff --git a/src/modules/music.js b/src/modules/music.js index 7801c42..25e983d 100644 --- a/src/modules/music.js +++ b/src/modules/music.js @@ -1,10 +1,6 @@ const {Collection} = require("@projectdysnomia/dysnomia"); -const {Innertube} = require("youtubei.js"); -let yt; -Innertube.create({ - generate_session_locally: true, -}).then((x) => (yt = x)); +const ytdl = require("@distube/ytdl-core"); const ffprobe = require("node-ffprobe"); const Command = require("../lib/command.js"); @@ -207,31 +203,26 @@ async function enqueue({ if (type == "yt") { let info; try { - let id = url; - if (/^https?:\/\//.test(url)) { - const uri = new URL(url); - if (uri.hostname == "youtu.be") { - id = uri.pathname.substring(1); - } else if (uri.hostname.indexOf("youtube.com") > -1) { - id = uri.searchParams.get("v"); - } - } - info = await yt.getBasicInfo(id); + info = await ytdl.getInfo(url, {}); } catch (err) { await textChannel.createMessage({ content: `:warning: Failed to get metadata: \`\`\`\n${err}\n\`\`\``, }); } - title = parseHtmlEntities(info?.basic_info?.title); - length = info?.basic_info?.duration * 1000; - thumbnail = info?.basic_info?.thumbnail?.[0].url + title = parseHtmlEntities(info?.videoDetails?.title); + length = info?.videoDetails?.lengthSeconds * 1000; + thumbnail = info?.videoDetails?.thumbnails?.[ + info.videoDetails.thumbnails.length - 1 + ].url .replace("vi_webp", "vi") .replace(".webp", ".jpg"); - media = info - ?.chooseFormat({type: "audio", quality: "best"}) - ?.decipher(yt.session.player); + media = ytdl(url, { + quality: "highestaudio", + filter: "audioonly", + highWaterMark: 1 << 25, + }); } else if (type == "sc") { if (url?.startsWith("sc:")) url = url.replace(/^sc:/, "https://soundcloud.com/");