diff --git a/src/yt/solver/sig.ts b/src/yt/solver/sig.ts index 9ebbf7b..94e8c81 100644 --- a/src/yt/solver/sig.ts +++ b/src/yt/solver/sig.ts @@ -2,6 +2,34 @@ import { type ESTree } from "meriyah"; import { matchesStructure } from "../../utils.ts"; import { type DeepPartial } from "../../types.ts"; +const nsigExpression: DeepPartial = { + type: "VariableDeclaration", + kind: "var", + declarations: [ + { + type: "VariableDeclarator", + init: { + type: "CallExpression", + callee: { + type: "Identifier", + }, + arguments: [ + { + type: "Literal", + }, + { + type: "CallExpression", + callee: { + type: "Identifier", + name: "decodeURIComponent", + }, + }, + ], + }, + }, + ], +}; + const logicalExpression: DeepPartial = { type: "ExpressionStatement", expression: { @@ -106,9 +134,11 @@ export function extract( return null; } let block: ESTree.BlockStatement | undefined | null; - if (node.type === "ExpressionStatement" && + if ( + node.type === "ExpressionStatement" && node.expression.type === "AssignmentExpression" && - node.expression.right.type === "FunctionExpression") { + node.expression.right.type === "FunctionExpression" + ) { block = node.expression.right.body; } else if (node.type === "VariableDeclaration") { for (const decl of node.declarations) { @@ -127,20 +157,40 @@ export function extract( return null; } const relevantExpression = block?.body.at(-2); - if (!matchesStructure(relevantExpression!, logicalExpression)) { - return null; - } - if ( - relevantExpression?.type !== "ExpressionStatement" || - relevantExpression.expression.type !== "LogicalExpression" || - relevantExpression.expression.right.type !== "SequenceExpression" || - relevantExpression.expression.right.expressions[0].type !== - "AssignmentExpression" + + let call: ESTree.CallExpression | null = null; + if (matchesStructure(relevantExpression!, logicalExpression)) { + if ( + relevantExpression?.type !== "ExpressionStatement" || + relevantExpression.expression.type !== "LogicalExpression" || + relevantExpression.expression.right.type !== "SequenceExpression" || + relevantExpression.expression.right.expressions[0].type !== + "AssignmentExpression" || + relevantExpression.expression.right.expressions[0].right.type !== + "CallExpression" + ) { + return null; + } + call = relevantExpression.expression.right.expressions[0].right; + } else if ( + relevantExpression?.type === "IfStatement" && + relevantExpression.consequent.type === "BlockStatement" ) { - return null; + for (const n of relevantExpression.consequent.body) { + if (!matchesStructure(n, nsigExpression)) { + continue; + } + if ( + n.type !== "VariableDeclaration" || + n.declarations[0].init?.type !== "CallExpression" + ) { + continue; + } + call = n.declarations[0].init; + break; + } } - const call = relevantExpression.expression.right.expressions[0].right; - if (call.type !== "CallExpression" || call.callee.type !== "Identifier") { + if (call === null) { return null; } // TODO: verify identifiers here diff --git a/src/yt/solver/test/tests.ts b/src/yt/solver/test/tests.ts index df2f5e1..7c9293d 100644 --- a/src/yt/solver/test/tests.ts +++ b/src/yt/solver/test/tests.ts @@ -86,7 +86,7 @@ export const tests: { { // tce causes exception even in browser player: "3752a005", - variants: ["main", "tcc", "es5", "es6", "tv", "tv_es6", "phone", "tablet"], + variants: ["main", "tcc", "es5", "es6", "tv", "tv_es6", "phone"], n: [ // Synthetic test { input: "0eRGgQWJGfT5rFHFj", expected: "j22ZtsqVsR0Dn" }, @@ -104,7 +104,7 @@ export const tests: { { // tce causes exception even in browser player: "afc7785b", - variants: ["main", "tcc", "es5", "es6", "tv", "tv_es6", "phone", "tablet"], + variants: ["main", "tcc", "es5", "es6", "tv", "tv_es6", "phone"], n: [ // Synthetic test { input: "0eRGgQWJGfT5rFHFj", expected: "j22ZtsqVsR0Dn" }, @@ -122,7 +122,7 @@ export const tests: { { // tce causes exception even in browser player: "b9645327", - variants: ["main", "tcc", "es5", "es6", "tv", "tv_es6", "phone", "tablet"], + variants: ["main", "tcc", "es5", "es6", "tv", "tv_es6", "phone"], n: [ // Synthetic test { input: "0eRGgQWJGfT5rFHFj", expected: "j22ZtsqVsR0Dn" }, @@ -140,7 +140,7 @@ export const tests: { { // tce causes exception even in browser player: "035b9195", - variants: ["main", "tcc", "es5", "es6", "tv", "tv_es6", "phone", "tablet"], + variants: ["main", "tcc", "es5", "es6", "tv", "tv_es6", "phone"], n: [ // Synthetic test { input: "0eRGgQWJGfT5rFHFj", expected: "j22ZtsqVsR0Dn" }, @@ -283,6 +283,23 @@ export const tests: { }, ], }, + { + // tce variant broke sig solving; n and other variants are added only for regression testing + player: "c1c87fb0", + n: [ + // Synthetic test + { input: "ZdZIqFPQK-Ty8wId", expected: "jCHBK5GuAFNa2" }, + ], + sig: [ + // Synthetic test + { + input: + "gN7a-hudCuAuPH6fByOk1_GNXN0yNMHShjZXS2VOgsEItAJz0tipeavEOmNdYN-wUtcEqD3bCXjc0iyKfAyZxCBGgIARwsSdQfJ2CJtt", + expected: + "ttJC2JfQdSswRAIgGBCxZyAfKyi0cjXCb3DqEctUw-NYdNmOEvaepit0zJAtIEsgOV2SXZjhSHMNy0NXNGa1kOyBf6HPuAuCduh-_", + }, + ], + }, ]; export const players = new Map([ @@ -294,7 +311,6 @@ export const players = new Map([ ["tv", "tv-player-ias.vflset/tv-player-ias.js"], ["tv_es6", "tv-player-es6.vflset/tv-player-es6.js"], ["phone", "player-plasma-ias-phone-en_US.vflset/base.js"], - ["tablet", "player-plasma-ias-tablet-en_US.vflset/base.js"], ] as const); export type Variant = typeof players extends Map ? T : never;