2 Commits
0.2.1 ... 0.3.0

Author SHA1 Message Date
sepro
2655b1f55f Fix es6 and tv_es6 n func extraction (#26) 2025-10-28 21:54:48 +01:00
Simon Sawicki
877164a326 Add build time lockfile for deno (#25) 2025-10-28 00:41:18 +01:00
9 changed files with 1367 additions and 49 deletions

View File

@@ -37,7 +37,7 @@ jobs:
compression-level: 0
- name: Build JavaScript artifacts
run: |
deno install
deno install --frozen
deno task bundle
- name: Upload JavaScript artifacts
uses: actions/upload-artifact@v4

1
.gitignore vendored
View File

@@ -3,7 +3,6 @@
/yt_dlp_ejs/_version.py
/node_modules
/bun.lock
/deno.lock
/package-lock.json
/.idea
/.venv

View File

@@ -13,7 +13,7 @@ pip install -U yt-dlp-ejs
## Development
While this project does pin its dependencies,
it does not use lockfiles or enforce a particular package manager.
it only provides a lockfile for building with `deno`.
You may install dependencies using any compatible package manager.
If you notice differences between different runtimes' builds
please open an issue [here](<https://github.com/yt-dlp/ejs/issues/new>).
@@ -27,7 +27,7 @@ Alternatively, to only build the JavaScript files you can run the `bundle` scrip
```bash
# Deno:
deno install
deno install --frozen
deno task bundle
# Bun:
@@ -45,7 +45,7 @@ First, make sure the project's dependencies are installed and download the playe
```bash
# Deno:
deno install
deno install --frozen
deno run src/yt/solver/test/download.ts
# Bun:

1262
deno.lock generated Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -10,7 +10,7 @@ class CustomBuildHook(BuildHookInterface):
if shutil.which("deno"):
print("Building with deno...", flush=True)
os.environ["DENO_NO_UPDATE_CHECK"] = "1"
subprocess.run(["deno", "install"], check=True)
subprocess.run(["deno", "install", "--frozen"], check=True)
subprocess.run(["deno", "task", "bundle"], check=True)
elif shutil.which("bun"):

View File

@@ -1,7 +1,16 @@
export type DeepPartial<T> = T extends object
? Or<{
[P in keyof T]?: DeepPartial<T[P]>;
}>
: Or<T>;
type DP<T> = T extends (infer U)[]
? DeepPartial<U>[]
: T extends object
? { [P in keyof T]?: DeepPartial<T[P]> }
: T;
type Or<T> = T | { or: T[] };
type ValueOf<T> = T extends (infer U)[]
? U
: T extends object
? T[keyof T]
: never;
export type DeepPartial<T> =
| DP<T>
| { or: DP<T>[] }
| { anykey: DP<ValueOf<T>>[] };

View File

@@ -2,26 +2,50 @@ import { type ESTree } from "meriyah";
import { matchesStructure } from "../../utils.ts";
import { type DeepPartial } from "../../types.ts";
const identifier: DeepPartial<ESTree.VariableDeclaration> = {
type: "VariableDeclaration",
kind: "var",
declarations: [
const identifier: DeepPartial<ESTree.Node> = {
or: [
{
type: "VariableDeclarator",
id: {
type: "Identifier",
},
init: {
type: "ArrayExpression",
elements: [
type: "VariableDeclaration",
kind: "var",
declarations: {
anykey: [
{
type: "Identifier",
type: "VariableDeclarator",
id: {
type: "Identifier",
},
init: {
type: "ArrayExpression",
elements: [
{
type: "Identifier",
},
],
},
},
],
},
},
{
type: "ExpressionStatement",
expression: {
type: "AssignmentExpression",
left: {
type: "Identifier",
},
operator: "=",
right: {
type: "ArrayExpression",
elements: [
{
type: "Identifier",
},
],
},
},
},
],
};
} as const;
const catchBlockBody = [
{
@@ -92,23 +116,37 @@ export function extract(
return null;
}
if (node.type !== "VariableDeclaration") {
return null;
if (node.type === "VariableDeclaration") {
for (const declaration of node.declarations) {
if (
declaration.type !== "VariableDeclarator" ||
!declaration.init ||
declaration.init.type !== "ArrayExpression" ||
declaration.init.elements.length !== 1
) {
continue;
}
const [firstElement] = declaration.init.elements;
if (firstElement && firstElement.type === "Identifier") {
return makeSolverFuncFromName(firstElement.name);
}
}
} else if (node.type === "ExpressionStatement") {
const expr = node.expression;
if (
expr.type === "AssignmentExpression" &&
expr.left.type === "Identifier" &&
expr.operator === "=" &&
expr.right.type === "ArrayExpression" &&
expr.right.elements.length === 1
) {
const [firstElement] = expr.right.elements;
if (firstElement && firstElement.type === "Identifier") {
return makeSolverFuncFromName(firstElement.name);
}
}
}
const declaration = node.declarations[0];
if (
declaration.type !== "VariableDeclarator" ||
!declaration.init ||
declaration.init.type !== "ArrayExpression" ||
declaration.init.elements.length !== 1
) {
return null;
}
const [firstElement] = declaration.init.elements;
if (!firstElement || firstElement.type !== "Identifier") {
return null;
}
return makeSolverFuncFromName(firstElement.name);
return null;
}
function makeSolverFuncFromName(name: string): ESTree.ArrowFunctionExpression {

View File

@@ -62,7 +62,7 @@ const logicalExpression: DeepPartial<ESTree.ExpressionStatement> = {
},
};
const identifier = {
const identifier: DeepPartial<ESTree.Node> = {
or: [
{
type: "ExpressionStatement",
@@ -102,9 +102,7 @@ const identifier = {
export function extract(
node: ESTree.Node,
): ESTree.ArrowFunctionExpression | null {
if (
!matchesStructure(node, identifier as unknown as DeepPartial<ESTree.Node>)
) {
if (!matchesStructure(node, identifier)) {
return null;
}
let block: ESTree.BlockStatement | undefined | null;

View File

@@ -236,9 +236,7 @@ export const tests: {
],
},
{
// TODO: es6/tv_es6 variants currently fail
player: "2b83d2e0",
variants: ["main", "tcc", "tce", "es5", "tv", "phone", "tablet"],
n: [
// Synthetic test
{ input: "0eRGgQWJGfT5rFHFj", expected: "euHbygrCMLksxd" },
@@ -254,9 +252,7 @@ export const tests: {
],
},
{
// TODO: es6/tv_es6 variants currently fail
player: "638ec5c6",
variants: ["main", "tcc", "tce", "es5", "tv", "phone", "tablet"],
n: [
// Synthetic test
{ input: "ZdZIqFPQK-Ty8wId", expected: "1qov8-KM-yH" },
@@ -271,6 +267,22 @@ export const tests: {
},
],
},
{
player: "87644c66",
n: [
// Synthetic test
{ input: "ZdZIqFPQK-Ty8wId", expected: "iF5NxEm1BYk" },
],
sig: [
// Synthetic test
{
input:
"gN7a-hudCuAuPH6fByOk1_GNXN0yNMHShjZXS2VOgsEItAJz0tipeavEOmNdYN-wUtcEqD3bCXjc0iyKfAyZxCBGgIARwsSdQfJ2CJtt",
expected:
"atJC2JfQdSswRAtgGBCxZyAfKyi0cjXCb3DqEctUw-NYdNmOEvIepit0zJAtIEsgOV2SXZjhSHMNy0NXNG_1kOyBf6HPuAuCduh-a7Ng",
},
],
},
];
export const players = new Map([