ytgrab 0.3.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nsig.d.ts","sourceRoot":"","sources":["../../src/extractor/nsig.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAYH;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAiB/D;
|
|
1
|
+
{"version":3,"file":"nsig.d.ts","sourceRoot":"","sources":["../../src/extractor/nsig.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAYH;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAiB/D;AA6GD;;GAEG;AACH,wBAAsB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAkD3F;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAiBpG;AAED,wBAAgB,cAAc,IAAI,IAAI,CAKrC"}
|
package/dist/extractor/nsig.js
CHANGED
|
@@ -95,11 +95,12 @@ async function downloadPlayerJs(playerUrl) {
|
|
|
95
95
|
async function initSolver() {
|
|
96
96
|
if (solverFn)
|
|
97
97
|
return solverFn;
|
|
98
|
-
// Find the core solver script
|
|
98
|
+
// Find the core solver script (bundled in ytgrab/vendor)
|
|
99
99
|
const searchPaths = [
|
|
100
|
-
path.resolve(__dirname, '
|
|
101
|
-
path.resolve(
|
|
100
|
+
path.resolve(__dirname, '../../vendor'),
|
|
101
|
+
path.resolve(__dirname, '../../../vendor'),
|
|
102
102
|
path.resolve(process.cwd(), 'vendor'),
|
|
103
|
+
path.resolve(process.cwd(), 'node_modules/ytgrab/vendor'),
|
|
103
104
|
];
|
|
104
105
|
let coreScript = null;
|
|
105
106
|
for (const dir of searchPaths) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nsig.js","sourceRoot":"","sources":["../../src/extractor/nsig.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAeH,4CAiBC;
|
|
1
|
+
{"version":3,"file":"nsig.js","sourceRoot":"","sources":["../../src/extractor/nsig.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ytgrab",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.1",
|
|
4
4
|
"description": "A Node.js YouTube video downloader ported from yt-dlp",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -9,7 +9,8 @@
|
|
|
9
9
|
},
|
|
10
10
|
"files": [
|
|
11
11
|
"dist",
|
|
12
|
-
"bin"
|
|
12
|
+
"bin",
|
|
13
|
+
"vendor"
|
|
13
14
|
],
|
|
14
15
|
"scripts": {
|
|
15
16
|
"build": "tsc",
|
|
@@ -0,0 +1,368 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* SPDX-License-Identifier: Unlicense
|
|
3
|
+
* This file was automatically generated by https://github.com/yt-dlp/ejs
|
|
4
|
+
*/
|
|
5
|
+
var jsc = (function (meriyah, astring) {
|
|
6
|
+
'use strict';
|
|
7
|
+
function matchesStructure(obj, structure) {
|
|
8
|
+
if (Array.isArray(structure)) {
|
|
9
|
+
if (!Array.isArray(obj)) {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
return (
|
|
13
|
+
structure.length === obj.length &&
|
|
14
|
+
structure.every((value, index) => matchesStructure(obj[index], value))
|
|
15
|
+
);
|
|
16
|
+
}
|
|
17
|
+
if (typeof structure === 'object') {
|
|
18
|
+
if (!obj) {
|
|
19
|
+
return !structure;
|
|
20
|
+
}
|
|
21
|
+
if ('or' in structure) {
|
|
22
|
+
return structure.or.some((node) => matchesStructure(obj, node));
|
|
23
|
+
}
|
|
24
|
+
if ('anykey' in structure && Array.isArray(structure.anykey)) {
|
|
25
|
+
const haystack = Array.isArray(obj) ? obj : Object.values(obj);
|
|
26
|
+
return structure.anykey.every((value) =>
|
|
27
|
+
haystack.some((el) => matchesStructure(el, value)),
|
|
28
|
+
);
|
|
29
|
+
}
|
|
30
|
+
for (const [key, value] of Object.entries(structure)) {
|
|
31
|
+
if (!matchesStructure(obj[key], value)) {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
return structure === obj;
|
|
38
|
+
}
|
|
39
|
+
function isOneOf(value, ...of) {
|
|
40
|
+
return of.includes(value);
|
|
41
|
+
}
|
|
42
|
+
function generateArrowFunction(data) {
|
|
43
|
+
return meriyah.parse(data).body[0].expression;
|
|
44
|
+
}
|
|
45
|
+
function _optionalChain$1(ops) {
|
|
46
|
+
let lastAccessLHS = undefined;
|
|
47
|
+
let value = ops[0];
|
|
48
|
+
let i = 1;
|
|
49
|
+
while (i < ops.length) {
|
|
50
|
+
const op = ops[i];
|
|
51
|
+
const fn = ops[i + 1];
|
|
52
|
+
i += 2;
|
|
53
|
+
if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) {
|
|
54
|
+
return undefined;
|
|
55
|
+
}
|
|
56
|
+
if (op === 'access' || op === 'optionalAccess') {
|
|
57
|
+
lastAccessLHS = value;
|
|
58
|
+
value = fn(value);
|
|
59
|
+
} else if (op === 'call' || op === 'optionalCall') {
|
|
60
|
+
value = fn((...args) => value.call(lastAccessLHS, ...args));
|
|
61
|
+
lastAccessLHS = undefined;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return value;
|
|
65
|
+
}
|
|
66
|
+
const identifier = {
|
|
67
|
+
or: [
|
|
68
|
+
{
|
|
69
|
+
type: 'ExpressionStatement',
|
|
70
|
+
expression: {
|
|
71
|
+
type: 'AssignmentExpression',
|
|
72
|
+
operator: '=',
|
|
73
|
+
left: { or: [{ type: 'Identifier' }, { type: 'MemberExpression' }] },
|
|
74
|
+
right: { type: 'FunctionExpression', async: false },
|
|
75
|
+
},
|
|
76
|
+
},
|
|
77
|
+
{ type: 'FunctionDeclaration', async: false, id: { type: 'Identifier' } },
|
|
78
|
+
{
|
|
79
|
+
type: 'VariableDeclaration',
|
|
80
|
+
declarations: {
|
|
81
|
+
anykey: [
|
|
82
|
+
{
|
|
83
|
+
type: 'VariableDeclarator',
|
|
84
|
+
init: { type: 'FunctionExpression', async: false },
|
|
85
|
+
},
|
|
86
|
+
],
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
],
|
|
90
|
+
};
|
|
91
|
+
const asdasd = {
|
|
92
|
+
type: 'ExpressionStatement',
|
|
93
|
+
expression: {
|
|
94
|
+
type: 'CallExpression',
|
|
95
|
+
callee: {
|
|
96
|
+
type: 'MemberExpression',
|
|
97
|
+
object: { type: 'Identifier' },
|
|
98
|
+
property: {},
|
|
99
|
+
optional: false,
|
|
100
|
+
},
|
|
101
|
+
arguments: [
|
|
102
|
+
{ type: 'Literal', value: 'alr' },
|
|
103
|
+
{ type: 'Literal', value: 'yes' },
|
|
104
|
+
],
|
|
105
|
+
optional: false,
|
|
106
|
+
},
|
|
107
|
+
};
|
|
108
|
+
function extract(node) {
|
|
109
|
+
if (!matchesStructure(node, identifier)) {
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
const options = [];
|
|
113
|
+
if (node.type === 'FunctionDeclaration') {
|
|
114
|
+
if (
|
|
115
|
+
node.id &&
|
|
116
|
+
_optionalChain$1([
|
|
117
|
+
node,
|
|
118
|
+
'access',
|
|
119
|
+
(_) => _.body,
|
|
120
|
+
'optionalAccess',
|
|
121
|
+
(_2) => _2.body,
|
|
122
|
+
])
|
|
123
|
+
) {
|
|
124
|
+
options.push({
|
|
125
|
+
name: node.id,
|
|
126
|
+
statements: _optionalChain$1([
|
|
127
|
+
node,
|
|
128
|
+
'access',
|
|
129
|
+
(_3) => _3.body,
|
|
130
|
+
'optionalAccess',
|
|
131
|
+
(_4) => _4.body,
|
|
132
|
+
]),
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
} else if (node.type === 'ExpressionStatement') {
|
|
136
|
+
if (node.expression.type !== 'AssignmentExpression') {
|
|
137
|
+
return null;
|
|
138
|
+
}
|
|
139
|
+
const name = node.expression.left;
|
|
140
|
+
const body = _optionalChain$1([
|
|
141
|
+
node.expression.right,
|
|
142
|
+
'optionalAccess',
|
|
143
|
+
(_5) => _5.body,
|
|
144
|
+
'optionalAccess',
|
|
145
|
+
(_6) => _6.body,
|
|
146
|
+
]);
|
|
147
|
+
if (name && body) {
|
|
148
|
+
options.push({ name: name, statements: body });
|
|
149
|
+
}
|
|
150
|
+
} else if (node.type === 'VariableDeclaration') {
|
|
151
|
+
for (const declaration of node.declarations) {
|
|
152
|
+
const name = declaration.id;
|
|
153
|
+
const body = _optionalChain$1([
|
|
154
|
+
declaration.init,
|
|
155
|
+
'optionalAccess',
|
|
156
|
+
(_7) => _7.body,
|
|
157
|
+
'optionalAccess',
|
|
158
|
+
(_8) => _8.body,
|
|
159
|
+
]);
|
|
160
|
+
if (name && body) {
|
|
161
|
+
options.push({ name: name, statements: body });
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
for (const { name: name, statements: statements } of options) {
|
|
166
|
+
if (matchesStructure(statements, { anykey: [asdasd] })) {
|
|
167
|
+
return createSolver(name);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
return null;
|
|
171
|
+
}
|
|
172
|
+
function createSolver(expression) {
|
|
173
|
+
return generateArrowFunction(
|
|
174
|
+
`\n({sig, n}) => {\n const url = (${astring.generate(expression)})("https://youtube.com/watch?v=yt-dlp-wins", "s", sig ? encodeURIComponent(sig) : undefined);\n url.set("n", n);\n const proto = Object.getPrototypeOf(url);\n const keys = Object.keys(proto).concat(Object.getOwnPropertyNames(proto));\n for (const key of keys) {\n if (!["constructor", "set", "get", "clone"].includes(key)) {\n url[key]();\n break;\n }\n }\n const s = url.get("s");\n return {\n sig: s ? decodeURIComponent(s) : null,\n n: url.get("n") ?? null,\n };\n}\n`,
|
|
175
|
+
);
|
|
176
|
+
}
|
|
177
|
+
const setupNodes = meriyah.parse(
|
|
178
|
+
`\nif (typeof globalThis.XMLHttpRequest === "undefined") {\n globalThis.XMLHttpRequest = { prototype: {} };\n}\nif (typeof URL === "undefined") {\n globalThis.location = {\n hash: "",\n host: "www.youtube.com",\n hostname: "www.youtube.com",\n href: "https://www.youtube.com/watch?v=yt-dlp-wins",\n origin: "https://www.youtube.com",\n password: "",\n pathname: "/watch",\n port: "",\n protocol: "https:",\n search: "?v=yt-dlp-wins",\n username: "",\n };\n} else {\n globalThis.location = new URL("https://www.youtube.com/watch?v=yt-dlp-wins");\n}\nif (typeof globalThis.document === "undefined") {\n globalThis.document = Object.create(null);\n}\nif (typeof globalThis.navigator === "undefined") {\n globalThis.navigator = Object.create(null);\n}\nif (typeof globalThis.self === "undefined") {\n globalThis.self = globalThis;\n}\nif (typeof globalThis.window === "undefined") {\n globalThis.window = globalThis;\n}\n`,
|
|
179
|
+
).body;
|
|
180
|
+
function _optionalChain(ops) {
|
|
181
|
+
let lastAccessLHS = undefined;
|
|
182
|
+
let value = ops[0];
|
|
183
|
+
let i = 1;
|
|
184
|
+
while (i < ops.length) {
|
|
185
|
+
const op = ops[i];
|
|
186
|
+
const fn = ops[i + 1];
|
|
187
|
+
i += 2;
|
|
188
|
+
if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) {
|
|
189
|
+
return undefined;
|
|
190
|
+
}
|
|
191
|
+
if (op === 'access' || op === 'optionalAccess') {
|
|
192
|
+
lastAccessLHS = value;
|
|
193
|
+
value = fn(value);
|
|
194
|
+
} else if (op === 'call' || op === 'optionalCall') {
|
|
195
|
+
value = fn((...args) => value.call(lastAccessLHS, ...args));
|
|
196
|
+
lastAccessLHS = undefined;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
return value;
|
|
200
|
+
}
|
|
201
|
+
function preprocessPlayer(data) {
|
|
202
|
+
const program = meriyah.parse(data);
|
|
203
|
+
const plainStatements = modifyPlayer(program);
|
|
204
|
+
const solutions = getSolutions(plainStatements);
|
|
205
|
+
for (const [name, options] of Object.entries(solutions)) {
|
|
206
|
+
plainStatements.push({
|
|
207
|
+
type: 'ExpressionStatement',
|
|
208
|
+
expression: {
|
|
209
|
+
type: 'AssignmentExpression',
|
|
210
|
+
operator: '=',
|
|
211
|
+
left: {
|
|
212
|
+
type: 'MemberExpression',
|
|
213
|
+
computed: false,
|
|
214
|
+
object: { type: 'Identifier', name: '_result' },
|
|
215
|
+
property: { type: 'Identifier', name: name },
|
|
216
|
+
optional: false,
|
|
217
|
+
},
|
|
218
|
+
right: multiTry(options),
|
|
219
|
+
},
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
program.body.splice(0, 0, ...setupNodes);
|
|
223
|
+
return astring.generate(program);
|
|
224
|
+
}
|
|
225
|
+
function modifyPlayer(program) {
|
|
226
|
+
const body = program.body;
|
|
227
|
+
const block = (() => {
|
|
228
|
+
switch (body.length) {
|
|
229
|
+
case 1: {
|
|
230
|
+
const func = body[0];
|
|
231
|
+
if (
|
|
232
|
+
_optionalChain([func, 'optionalAccess', (_) => _.type]) ===
|
|
233
|
+
'ExpressionStatement' &&
|
|
234
|
+
func.expression.type === 'CallExpression' &&
|
|
235
|
+
func.expression.callee.type === 'MemberExpression' &&
|
|
236
|
+
func.expression.callee.object.type === 'FunctionExpression'
|
|
237
|
+
) {
|
|
238
|
+
return func.expression.callee.object.body;
|
|
239
|
+
}
|
|
240
|
+
break;
|
|
241
|
+
}
|
|
242
|
+
case 2: {
|
|
243
|
+
const func = body[1];
|
|
244
|
+
if (
|
|
245
|
+
_optionalChain([func, 'optionalAccess', (_2) => _2.type]) ===
|
|
246
|
+
'ExpressionStatement' &&
|
|
247
|
+
func.expression.type === 'CallExpression' &&
|
|
248
|
+
func.expression.callee.type === 'FunctionExpression'
|
|
249
|
+
) {
|
|
250
|
+
const block = func.expression.callee.body;
|
|
251
|
+
block.body.splice(0, 1);
|
|
252
|
+
return block;
|
|
253
|
+
}
|
|
254
|
+
break;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
throw 'unexpected structure';
|
|
258
|
+
})();
|
|
259
|
+
block.body = block.body.filter((node) => {
|
|
260
|
+
if (node.type === 'ExpressionStatement') {
|
|
261
|
+
if (node.expression.type === 'AssignmentExpression') {
|
|
262
|
+
return true;
|
|
263
|
+
}
|
|
264
|
+
return node.expression.type === 'Literal';
|
|
265
|
+
}
|
|
266
|
+
return true;
|
|
267
|
+
});
|
|
268
|
+
return block.body;
|
|
269
|
+
}
|
|
270
|
+
function getSolutions(statements) {
|
|
271
|
+
const found = { n: [], sig: [] };
|
|
272
|
+
for (const statement of statements) {
|
|
273
|
+
const result = extract(statement);
|
|
274
|
+
if (result) {
|
|
275
|
+
found.n.push(makeSolver(result, { type: 'Identifier', name: 'n' }));
|
|
276
|
+
found.sig.push(makeSolver(result, { type: 'Identifier', name: 'sig' }));
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
return found;
|
|
280
|
+
}
|
|
281
|
+
function makeSolver(result, ident) {
|
|
282
|
+
return {
|
|
283
|
+
type: 'ArrowFunctionExpression',
|
|
284
|
+
params: [ident],
|
|
285
|
+
body: {
|
|
286
|
+
type: 'MemberExpression',
|
|
287
|
+
object: {
|
|
288
|
+
type: 'CallExpression',
|
|
289
|
+
callee: result,
|
|
290
|
+
arguments: [
|
|
291
|
+
{
|
|
292
|
+
type: 'ObjectExpression',
|
|
293
|
+
properties: [
|
|
294
|
+
{
|
|
295
|
+
type: 'Property',
|
|
296
|
+
key: ident,
|
|
297
|
+
value: ident,
|
|
298
|
+
kind: 'init',
|
|
299
|
+
computed: false,
|
|
300
|
+
method: false,
|
|
301
|
+
shorthand: true,
|
|
302
|
+
},
|
|
303
|
+
],
|
|
304
|
+
},
|
|
305
|
+
],
|
|
306
|
+
optional: false,
|
|
307
|
+
},
|
|
308
|
+
computed: false,
|
|
309
|
+
property: ident,
|
|
310
|
+
optional: false,
|
|
311
|
+
},
|
|
312
|
+
async: false,
|
|
313
|
+
expression: true,
|
|
314
|
+
generator: false,
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
function getFromPrepared(code) {
|
|
318
|
+
const resultObj = { n: null, sig: null };
|
|
319
|
+
Function('_result', code)(resultObj);
|
|
320
|
+
return resultObj;
|
|
321
|
+
}
|
|
322
|
+
function multiTry(generators) {
|
|
323
|
+
return generateArrowFunction(
|
|
324
|
+
`\n(_input) => {\n const _results = new Set();\n const errors = [];\n for (const _generator of ${astring.generate({ type: 'ArrayExpression', elements: generators })}) {\n try {\n _results.add(_generator(_input));\n } catch (e) {\n errors.push(e);\n }\n }\n if (!_results.size) {\n throw \`no solutions: \${errors.join(", ")}\`;\n }\n if (_results.size !== 1) {\n throw \`invalid solutions: \${[..._results].map(x => JSON.stringify(x)).join(", ")}\`;\n }\n return _results.values().next().value;\n}\n`,
|
|
325
|
+
);
|
|
326
|
+
}
|
|
327
|
+
function main(input) {
|
|
328
|
+
const preprocessedPlayer =
|
|
329
|
+
input.type === 'player'
|
|
330
|
+
? preprocessPlayer(input.player)
|
|
331
|
+
: input.preprocessed_player;
|
|
332
|
+
const solvers = getFromPrepared(preprocessedPlayer);
|
|
333
|
+
const responses = input.requests.map((input) => {
|
|
334
|
+
if (!isOneOf(input.type, 'n', 'sig')) {
|
|
335
|
+
return { type: 'error', error: `Unknown request type: ${input.type}` };
|
|
336
|
+
}
|
|
337
|
+
const solver = solvers[input.type];
|
|
338
|
+
if (!solver) {
|
|
339
|
+
return {
|
|
340
|
+
type: 'error',
|
|
341
|
+
error: `Failed to extract ${input.type} function`,
|
|
342
|
+
};
|
|
343
|
+
}
|
|
344
|
+
try {
|
|
345
|
+
return {
|
|
346
|
+
type: 'result',
|
|
347
|
+
data: Object.fromEntries(
|
|
348
|
+
input.challenges.map((challenge) => [challenge, solver(challenge)]),
|
|
349
|
+
),
|
|
350
|
+
};
|
|
351
|
+
} catch (error) {
|
|
352
|
+
return {
|
|
353
|
+
type: 'error',
|
|
354
|
+
error:
|
|
355
|
+
error instanceof Error
|
|
356
|
+
? `${error.message}\n${error.stack}`
|
|
357
|
+
: `${error}`,
|
|
358
|
+
};
|
|
359
|
+
}
|
|
360
|
+
});
|
|
361
|
+
const output = { type: 'result', responses: responses };
|
|
362
|
+
if (input.type === 'player' && input.output_preprocessed) {
|
|
363
|
+
output.preprocessed_player = preprocessedPlayer;
|
|
364
|
+
}
|
|
365
|
+
return output;
|
|
366
|
+
}
|
|
367
|
+
return main;
|
|
368
|
+
})(meriyah, astring);
|