Switch to Distube's ytdl-core fork (resolves playback issue) (#1042)

This commit is contained in:
MarcoCoreDuo 2024-07-18 06:32:16 +02:00 committed by GitHub
parent 29b61cc0b6
commit fcc8d8881a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
9 changed files with 100 additions and 195 deletions

View file

@ -10,7 +10,7 @@ jobs:
- uses: actions/checkout@v1 - uses: actions/checkout@v1
- uses: actions/setup-node@v2 - uses: actions/setup-node@v2
with: with:
node-version: '16' node-version: '18'
cache: 'yarn' cache: 'yarn'
- name: Install dependencies - name: Install dependencies
run: yarn install run: yarn install

View file

@ -10,7 +10,7 @@ jobs:
- uses: actions/checkout@v1 - uses: actions/checkout@v1
- uses: actions/setup-node@v2 - uses: actions/setup-node@v2
with: with:
node-version: '16' node-version: '18'
cache: 'yarn' cache: 'yarn'
- name: Install dependencies - name: Install dependencies
run: yarn install run: yarn install

View file

@ -7,6 +7,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased] ## [Unreleased]
### Fixed ### Fixed
- Fixed playback issue
- Audioplayer not stopping properly - Audioplayer not stopping properly
## [2.8.1] - 2024-04-28 ## [2.8.1] - 2024-04-28

View file

@ -1,4 +1,4 @@
FROM node:18.7.0-slim AS base FROM node:18-bullseye-slim AS base
# openssl will be a required package if base is updated to 18.16+ due to node:*-slim base distro change # openssl will be a required package if base is updated to 18.16+ due to node:*-slim base distro change
# https://github.com/prisma/prisma/issues/19729#issuecomment-1591270599 # https://github.com/prisma/prisma/issues/19729#issuecomment-1591270599
@ -19,7 +19,6 @@ FROM base AS dependencies
WORKDIR /usr/app WORKDIR /usr/app
COPY package.json . COPY package.json .
COPY patches ./patches
COPY yarn.lock . COPY yarn.lock .
RUN yarn install --prod RUN yarn install --prod

View file

@ -82,7 +82,7 @@ services:
### Node.js ### Node.js
**Prerequisites**: **Prerequisites**:
* Node.js (16.x is recommended because it's the current LTS version) * Node.js (18.17.0 or later is required and latest 18.x.x LTS is recommended)
* ffmpeg (4.1 or later) * ffmpeg (4.1 or later)
1. `git clone https://github.com/codetheweb/muse.git && cd muse` 1. `git clone https://github.com/codetheweb/muse.git && cd muse`

View file

@ -9,7 +9,7 @@
"types": "dts/types", "types": "dts/types",
"type": "module", "type": "module",
"engines": { "engines": {
"node": ">=16.0.0" "node": ">=18.17.0"
}, },
"files": [ "files": [
"src" "src"
@ -89,6 +89,7 @@
"@discordjs/opus": "^0.8.0", "@discordjs/opus": "^0.8.0",
"@discordjs/rest": "1.0.1", "@discordjs/rest": "1.0.1",
"@discordjs/voice": "0.11.0", "@discordjs/voice": "0.11.0",
"@distube/ytdl-core": "^4.13.5",
"@prisma/client": "4.16.0", "@prisma/client": "4.16.0",
"@types/libsodium-wrappers": "^0.7.9", "@types/libsodium-wrappers": "^0.7.9",
"array-shuffle": "^3.0.0", "array-shuffle": "^3.0.0",
@ -126,7 +127,6 @@
"sync-fetch": "^0.3.1", "sync-fetch": "^0.3.1",
"tsx": "3.8.2", "tsx": "3.8.2",
"xbytes": "^1.7.0", "xbytes": "^1.7.0",
"ytdl-core": "^4.11.5",
"ytsr": "^3.8.4" "ytsr": "^3.8.4"
}, },
"resolutions": { "resolutions": {

View file

@ -1,172 +0,0 @@
diff --git a/node_modules/ytdl-core/lib/sig.js b/node_modules/ytdl-core/lib/sig.js
index eb7bfaa..b2eee87 100644
--- a/node_modules/ytdl-core/lib/sig.js
+++ b/node_modules/ytdl-core/lib/sig.js
@@ -3,6 +3,9 @@ const Cache = require('./cache');
const utils = require('./utils');
const vm = require('vm');
+
+let nTransformWarning = false;
+
// A shared cache to keep track of html5player js functions.
exports.cache = new Cache();
@@ -23,6 +26,49 @@ exports.getFunctions = (html5playerfile, options) => exports.cache.getOrSet(html
return functions;
});
+// eslint-disable-next-line max-len
+// https://github.com/TeamNewPipe/NewPipeExtractor/blob/41c8dce452aad278420715c00810b1fed0109adf/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeStreamExtractor.java#L816
+const DECIPHER_REGEXPS = [
+ '(?:\\b|[^a-zA-Z0-9$])([a-zA-Z0-9$]{2,})\\s*=\\s*function\\(\\s*a\\s*\\)' +
+ '\\s*\\{\\s*a\\s*=\\s*a\\.split\\(\\s*""\\s*\\)',
+ '\\bm=([a-zA-Z0-9$]{2,})\\(decodeURIComponent\\(h\\.s\\)\\)',
+ '\\bc&&\\(c=([a-zA-Z0-9$]{2,})\\(decodeURIComponent\\(c\\)\\)',
+ '([\\w$]+)\\s*=\\s*function\\((\\w+)\\)\\{\\s*\\2=\\s*\\2\\.split\\(""\\)\\s*;',
+ '\\b([\\w$]{2,})\\s*=\\s*function\\((\\w+)\\)\\{\\s*\\2=\\s*\\2\\.split\\(""\\)\\s*;',
+ '\\bc\\s*&&\\s*d\\.set\\([^,]+\\s*,\\s*(:encodeURIComponent\\s*\\()([a-zA-Z0-9$]+)\\(',
+];
+
+const DECIPHER_ARGUMENT = 'sig';
+const N_ARGUMENT = 'ncode';
+
+const matchGroup1 = (regex, str) => {
+ const match = str.match(new RegExp(regex));
+ if (!match) throw new Error(`Could not match ${regex}`);
+ return match[1];
+};
+
+const getFuncName = (body, regexps) => {
+ try {
+ let fn;
+ for (const regex of regexps) {
+ try {
+ fn = matchGroup1(regex, body);
+ const idx = fn.indexOf('[0]');
+ if (idx > -1) fn = matchGroup1(`${fn.slice(0, 3)}=\\[([a-zA-Z0-9$\\[\\]]{2,})\\]`, body);
+ } catch (err) {
+ continue;
+ }
+ }
+ if (!fn || fn.includes('[')) throw Error("Couldn't find fn name");
+ return fn;
+ } catch (e) {
+ throw Error(`Please open an issue on ytdl-core GitHub: ${e.message}`);
+ }
+};
+
+const getDecipherFuncName = body => getFuncName(body, DECIPHER_REGEXPS);
+
+
/**
* Extracts the actions that should be taken to decipher a signature
* and tranform the n parameter
@@ -31,44 +77,45 @@ exports.getFunctions = (html5playerfile, options) => exports.cache.getOrSet(html
* @returns {Array.<string>}
*/
exports.extractFunctions = body => {
+ body = body.replace(/\n|\r/g, '');
const functions = [];
- const extractManipulations = caller => {
- const functionName = utils.between(caller, `a=a.split("");`, `.`);
- if (!functionName) return '';
- const functionStart = `var ${functionName}={`;
- const ndx = body.indexOf(functionStart);
- if (ndx < 0) return '';
- const subBody = body.slice(ndx + functionStart.length - 1);
- return `var ${functionName}=${utils.cutAfterJS(subBody)}`;
- };
+ // This is required function, so we can't continue if it's not found.
const extractDecipher = () => {
- const functionName = utils.between(body, `a.set("alr","yes");c&&(c=`, `(decodeURIC`);
- if (functionName && functionName.length) {
- const functionStart = `${functionName}=function(a)`;
- const ndx = body.indexOf(functionStart);
- if (ndx >= 0) {
- const subBody = body.slice(ndx + functionStart.length);
- let functionBody = `var ${functionStart}${utils.cutAfterJS(subBody)}`;
- functionBody = `${extractManipulations(functionBody)};${functionBody};${functionName}(sig);`;
- functions.push(functionBody);
- }
+ const decipherFuncName = getDecipherFuncName(body);
+ try {
+ const functionPattern = `(${decipherFuncName.replace(/\$/g, '\\$')}=function\\([a-zA-Z0-9_]+\\)\\{.+?\\})`;
+ const decipherFunction = `var ${matchGroup1(functionPattern, body)};`;
+ const helperObjectName = matchGroup1(';([A-Za-z0-9_\\$]{2,})\\.\\w+\\(', decipherFunction)
+ .replace(/\$/g, '\\$');
+ const helperPattern = `(var ${helperObjectName}=\\{[\\s\\S]+?\\}\\};)`;
+ const helperObject = matchGroup1(helperPattern, body);
+ const callerFunction = `${decipherFuncName}(${DECIPHER_ARGUMENT});`;
+ const resultFunction = helperObject + decipherFunction + callerFunction;
+ functions.push(resultFunction);
+ } catch (err) {
+ throw Error(`Could not parse decipher function: ${err}`);
}
};
- const extractNCode = () => {
- let functionName = utils.between(body, `&&(b=a.get("n"))&&(b=`, `(b)`);
- if (functionName.includes('[')) functionName = utils.between(body, `var ${functionName.split('[')[0]}=[`, `]`);
- if (functionName && functionName.length) {
- const functionStart = `${functionName}=function(a)`;
- const ndx = body.indexOf(functionStart);
- if (ndx >= 0) {
- const subBody = body.slice(ndx + functionStart.length);
- const functionBody = `var ${functionStart}${utils.cutAfterJS(subBody)};${functionName}(ncode);`;
- functions.push(functionBody);
+ // This is optional, so we can continue if it's not found, but it will bottleneck the download.
+ const extractNTransform = () => {
+ let nFuncName = utils.between(body, `(b=a.get("n"))&&(b=`, `(b)`);
+ if (nFuncName.includes('[')) nFuncName = utils.between(body, `${nFuncName.split('[')[0]}=[`, `]`);
+ if (nFuncName && nFuncName.length) {
+ const nBegin = `${nFuncName}=function(a)`;
+ const nEnd = '.join("")};';
+ const nFunction = utils.between(body, nBegin, nEnd);
+ if (nFunction) {
+ const callerFunction = `${nFuncName}(${N_ARGUMENT});`;
+ const resultFunction = nBegin + nFunction + nEnd + callerFunction;
+ functions.push(resultFunction);
+ } else if (!nTransformWarning) {
+ console.warn('Could not parse n transform function, please report it on @distube/ytdl-core GitHub.');
+ nTransformWarning = true;
}
}
};
extractDecipher();
- extractNCode();
+ extractNTransform();
return functions;
};
@@ -82,22 +129,25 @@ exports.extractFunctions = body => {
exports.setDownloadURL = (format, decipherScript, nTransformScript) => {
const decipher = url => {
const args = querystring.parse(url);
- if (!args.s || !decipherScript) return args.url;
+ if (!args.s) return args.url;
const components = new URL(decodeURIComponent(args.url));
- components.searchParams.set(args.sp ? args.sp : 'signature',
- decipherScript.runInNewContext({ sig: decodeURIComponent(args.s) }));
+ const context = {};
+ context[DECIPHER_ARGUMENT] = decodeURIComponent(args.s);
+ components.searchParams.set(args.sp || 'sig', decipherScript.runInNewContext(context));
return components.toString();
};
- const ncode = url => {
+ const nTransform = url => {
const components = new URL(decodeURIComponent(url));
const n = components.searchParams.get('n');
if (!n || !nTransformScript) return url;
- components.searchParams.set('n', nTransformScript.runInNewContext({ ncode: n }));
+ const context = {};
+ context[N_ARGUMENT] = n;
+ components.searchParams.set('n', nTransformScript.runInNewContext(context));
return components.toString();
};
const cipher = !format.url;
const url = format.url || format.signatureCipher || format.cipher;
- format.url = cipher ? ncode(decipher(url)) : ncode(url);
+ format.url = cipher ? nTransform(decipher(url)) : nTransform(url);
delete format.signatureCipher;
delete format.cipher;
};

View file

@ -1,7 +1,7 @@
import {VoiceChannel, Snowflake} from 'discord.js'; import {VoiceChannel, Snowflake} from 'discord.js';
import {Readable} from 'stream'; import {Readable} from 'stream';
import hasha from 'hasha'; import hasha from 'hasha';
import ytdl, {videoFormat} from 'ytdl-core'; import ytdl, {videoFormat} from '@distube/ytdl-core';
import {WriteStream} from 'fs-capacitor'; import {WriteStream} from 'fs-capacitor';
import ffmpeg from 'fluent-ffmpeg'; import ffmpeg from 'fluent-ffmpeg';
import shuffle from 'array-shuffle'; import shuffle from 'array-shuffle';
@ -280,8 +280,8 @@ export default class {
if (this.getCurrent() && this.status !== STATUS.PAUSED) { if (this.getCurrent() && this.status !== STATUS.PAUSED) {
await this.play(); await this.play();
} else { } else {
this.audioPlayer?.stop(true);
this.status = STATUS.IDLE; this.status = STATUS.IDLE;
this.audioPlayer?.stop(true);
const settings = await getGuildSettings(this.guildId); const settings = await getGuildSettings(this.guildId);

105
yarn.lock
View file

@ -152,6 +152,18 @@
tslib "^2.5.0" tslib "^2.5.0"
ws "^8.13.0" ws "^8.13.0"
"@distube/ytdl-core@^4.13.5":
version "4.13.5"
resolved "https://registry.yarnpkg.com/@distube/ytdl-core/-/ytdl-core-4.13.5.tgz#f9bacaa43225953d0ccd2a682a31d9dbbc378973"
integrity sha512-g+4UJIR/auAJbia7iB0aWvaJDbs22P53NySWa47b1NT4xMTDJYguxHFArPrvRkcJrb/AgKjv/XoSZGghpL0CJA==
dependencies:
http-cookie-agent "^6.0.5"
m3u8stream "^0.8.6"
miniget "^4.2.3"
sax "^1.4.1"
tough-cookie "^4.1.4"
undici "^6.19.2"
"@esbuild-kit/cjs-loader@^2.3.3": "@esbuild-kit/cjs-loader@^2.3.3":
version "2.3.3" version "2.3.3"
resolved "https://registry.npmjs.org/@esbuild-kit/cjs-loader/-/cjs-loader-2.3.3.tgz" resolved "https://registry.npmjs.org/@esbuild-kit/cjs-loader/-/cjs-loader-2.3.3.tgz"
@ -673,6 +685,13 @@ agent-base@6, agent-base@^6.0.0, agent-base@^6.0.2:
dependencies: dependencies:
debug "4" debug "4"
agent-base@^7.1.1:
version "7.1.1"
resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.1.tgz#bdbded7dfb096b751a2a087eeeb9664725b2e317"
integrity sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==
dependencies:
debug "^4.3.4"
ajv@^6.10.0, ajv@^6.12.4: ajv@^6.10.0, ajv@^6.12.4:
version "6.12.6" version "6.12.6"
resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz"
@ -1290,6 +1309,13 @@ debug@^3.2.7:
dependencies: dependencies:
ms "^2.1.1" ms "^2.1.1"
debug@^4.3.4:
version "4.3.5"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.5.tgz#e83444eceb9fedd4a1da56d671ae2446a01a6e1e"
integrity sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==
dependencies:
ms "2.1.2"
decode-uri-component@^0.2.0: decode-uri-component@^0.2.0:
version "0.2.0" version "0.2.0"
resolved "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz" resolved "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz"
@ -2584,6 +2610,13 @@ http-cache-semantics@^4.0.0:
resolved "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz" resolved "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz"
integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==
http-cookie-agent@^6.0.5:
version "6.0.5"
resolved "https://registry.yarnpkg.com/http-cookie-agent/-/http-cookie-agent-6.0.5.tgz#23b490439464424a689d80ea7f3a560a4a893ab8"
integrity sha512-sfZ8fDgDP3B1YB+teqSnAK1aPgBu8reUUGxSsndP2XnYN6cM29EURXWXZqQQiaRdor3B4QjpkUNfv21syaO4DA==
dependencies:
agent-base "^7.1.1"
http-errors@2.0.0: http-errors@2.0.0:
version "2.0.0" version "2.0.0"
resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz" resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz"
@ -3310,7 +3343,7 @@ lru-cache@^6.0.0:
m3u8stream@^0.8.6: m3u8stream@^0.8.6:
version "0.8.6" version "0.8.6"
resolved "https://registry.npmjs.org/m3u8stream/-/m3u8stream-0.8.6.tgz" resolved "https://registry.yarnpkg.com/m3u8stream/-/m3u8stream-0.8.6.tgz#0d6de4ce8ee69731734e6b616e7b05dd9d9a55b1"
integrity sha512-LZj8kIVf9KCphiHmH7sbFQTVe4tOemb202fWwvJwR9W5ENW/1hxJN6ksAWGhQgSBSa3jyWhnjKU1Fw1GaOdbyA== integrity sha512-LZj8kIVf9KCphiHmH7sbFQTVe4tOemb202fWwvJwR9W5ENW/1hxJN6ksAWGhQgSBSa3jyWhnjKU1Fw1GaOdbyA==
dependencies: dependencies:
miniget "^4.2.2" miniget "^4.2.2"
@ -3393,6 +3426,11 @@ miniget@^4.2.2:
resolved "https://registry.npmjs.org/miniget/-/miniget-4.2.2.tgz" resolved "https://registry.npmjs.org/miniget/-/miniget-4.2.2.tgz"
integrity sha512-a7voNL1N5lDMxvTMExOkg+Fq89jM2vY8pAi9ZEWzZtfNmdfP6RXkvUtFnCAXoCv2T9k1v/fUJVaAEuepGcvLYA== integrity sha512-a7voNL1N5lDMxvTMExOkg+Fq89jM2vY8pAi9ZEWzZtfNmdfP6RXkvUtFnCAXoCv2T9k1v/fUJVaAEuepGcvLYA==
miniget@^4.2.3:
version "4.2.3"
resolved "https://registry.yarnpkg.com/miniget/-/miniget-4.2.3.tgz#3707a24c7c11c25d359473291638ab28aab349bd"
integrity sha512-SjbDPDICJ1zT+ZvQwK0hUcRY4wxlhhNpHL9nJOB2MEAXRGagTljsO8MEDzQMTFf0Q8g4QNi8P9lEm/g7e+qgzA==
minimatch@^3.0.4, minimatch@^3.1.2: minimatch@^3.0.4, minimatch@^3.1.2:
version "3.1.2" version "3.1.2"
resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz"
@ -3996,6 +4034,11 @@ proxy-from-env@^1.0.0, proxy-from-env@^1.1.0:
resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz"
integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==
psl@^1.1.33:
version "1.9.0"
resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7"
integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==
pump@^3.0.0: pump@^3.0.0:
version "3.0.0" version "3.0.0"
resolved "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz" resolved "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz"
@ -4009,6 +4052,11 @@ punycode@^2.1.0:
resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz" resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz"
integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
punycode@^2.1.1:
version "2.3.1"
resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5"
integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==
pupa@^2.1.1: pupa@^2.1.1:
version "2.1.1" version "2.1.1"
resolved "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz" resolved "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz"
@ -4033,6 +4081,11 @@ query-string@^6.13.8:
split-on-first "^1.0.0" split-on-first "^1.0.0"
strict-uri-encode "^2.0.0" strict-uri-encode "^2.0.0"
querystringify@^2.1.1:
version "2.2.0"
resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6"
integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==
queue-microtask@^1.2.2: queue-microtask@^1.2.2:
version "1.2.3" version "1.2.3"
resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz"
@ -4182,6 +4235,11 @@ require-from-string@^2.0.2:
resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz"
integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==
requires-port@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==
resolve-alpn@^1.2.0: resolve-alpn@^1.2.0:
version "1.2.1" version "1.2.1"
resolved "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz" resolved "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz"
@ -4317,10 +4375,10 @@ safe-regex-test@^1.0.3:
resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz"
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
sax@^1.1.3, sax@^1.2.4: sax@^1.2.4, sax@^1.4.1:
version "1.2.4" version "1.4.1"
resolved "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz" resolved "https://registry.yarnpkg.com/sax/-/sax-1.4.1.tgz#44cc8988377f126304d3b3fc1010c733b929ef0f"
integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== integrity sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==
semver-compare@^1.0.0: semver-compare@^1.0.0:
version "1.0.0" version "1.0.0"
@ -4780,6 +4838,16 @@ token-types@^5.0.0-alpha.2, token-types@^5.0.1:
"@tokenizer/token" "^0.3.0" "@tokenizer/token" "^0.3.0"
ieee754 "^1.2.1" ieee754 "^1.2.1"
tough-cookie@^4.1.4:
version "4.1.4"
resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.4.tgz#945f1461b45b5a8c76821c33ea49c3ac192c1b36"
integrity sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==
dependencies:
psl "^1.1.33"
punycode "^2.1.1"
universalify "^0.2.0"
url-parse "^1.5.3"
tr46@~0.0.3: tr46@~0.0.3:
version "0.0.3" version "0.0.3"
resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz"
@ -4955,6 +5023,11 @@ undici@^5.8.0:
resolved "https://registry.npmjs.org/undici/-/undici-5.8.1.tgz" resolved "https://registry.npmjs.org/undici/-/undici-5.8.1.tgz"
integrity sha512-iDRmWX4Zar/4A/t+1LrKQRm102zw2l9Wgat3LtTlTn8ykvMZmAmpq9tjyHEigx18FsY7IfATvyN3xSw9BDz0eA== integrity sha512-iDRmWX4Zar/4A/t+1LrKQRm102zw2l9Wgat3LtTlTn8ykvMZmAmpq9tjyHEigx18FsY7IfATvyN3xSw9BDz0eA==
undici@^6.19.2:
version "6.19.2"
resolved "https://registry.yarnpkg.com/undici/-/undici-6.19.2.tgz#231bc5de78d0dafb6260cf454b294576c2f3cd31"
integrity sha512-JfjKqIauur3Q6biAtHJ564e3bWa8VvT+7cSiOJHFbX4Erv6CLGDpg8z+Fmg/1OI/47RA+GI2QZaF48SSaLvyBA==
unique-string@^2.0.0: unique-string@^2.0.0:
version "2.0.0" version "2.0.0"
resolved "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz" resolved "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz"
@ -4972,6 +5045,11 @@ universalify@^0.1.0:
resolved "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz" resolved "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz"
integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==
universalify@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0"
integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==
universalify@^2.0.0: universalify@^2.0.0:
version "2.0.1" version "2.0.1"
resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz" resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz"
@ -5021,6 +5099,14 @@ url-parse-lax@^3.0.0:
dependencies: dependencies:
prepend-http "^2.0.0" prepend-http "^2.0.0"
url-parse@^1.5.3:
version "1.5.10"
resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1"
integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==
dependencies:
querystringify "^2.1.1"
requires-port "^1.0.0"
util-deprecate@^1.0.1: util-deprecate@^1.0.1:
version "1.0.2" version "1.0.2"
resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz"
@ -5228,15 +5314,6 @@ yocto-queue@^1.0.0:
resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz" resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz"
integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g== integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==
ytdl-core@^4.11.5:
version "4.11.5"
resolved "https://registry.npmjs.org/ytdl-core/-/ytdl-core-4.11.5.tgz"
integrity sha512-27LwsW4n4nyNviRCO1hmr8Wr5J1wLLMawHCQvH8Fk0hiRqrxuIu028WzbJetiYH28K8XDbeinYW4/wcHQD1EXA==
dependencies:
m3u8stream "^0.8.6"
miniget "^4.2.2"
sax "^1.1.3"
ytsr@^3.8.4: ytsr@^3.8.4:
version "3.8.4" version "3.8.4"
resolved "https://registry.npmjs.org/ytsr/-/ytsr-3.8.4.tgz" resolved "https://registry.npmjs.org/ytsr/-/ytsr-3.8.4.tgz"