Date: Sun, 01 Mar 2026 22:06:51 +0000 From: Yuri Victorovich <yuri@FreeBSD.org> To: ports-committers@FreeBSD.org, dev-commits-ports-all@FreeBSD.org, dev-commits-ports-main@FreeBSD.org Subject: git: 1e0296f94306 - main - www/py-yt-dlp-ejs: New port: JavaScript challenge solver for yt-dlp Message-ID: <69a4b87b.35c86.490e25a1@gitrepo.freebsd.org>
index | next in thread | raw e-mail
The branch main has been updated by yuri: URL: https://cgit.FreeBSD.org/ports/commit/?id=1e0296f943062559f148ca8eebc9b472874dd9c1 commit 1e0296f943062559f148ca8eebc9b472874dd9c1 Author: Yuri Victorovich <yuri@FreeBSD.org> AuthorDate: 2026-03-01 21:41:34 +0000 Commit: Yuri Victorovich <yuri@FreeBSD.org> CommitDate: 2026-03-01 22:06:47 +0000 www/py-yt-dlp-ejs: New port: JavaScript challenge solver for yt-dlp --- www/Makefile | 1 + www/py-yt-dlp-ejs/Makefile | 78 +++++++++++++++++++++++++++ www/py-yt-dlp-ejs/distinfo | 5 ++ www/py-yt-dlp-ejs/files/patch-hatch__build.py | 20 +++++++ www/py-yt-dlp-ejs/files/patch-pyproject.toml | 12 +++++ www/py-yt-dlp-ejs/pkg-descr | 7 +++ 6 files changed, 123 insertions(+) diff --git a/www/Makefile b/www/Makefile index 36a317ac6002..fc331ea4f1b7 100644 --- a/www/Makefile +++ b/www/Makefile @@ -2007,6 +2007,7 @@ SUBDIR += py-yarl SUBDIR += py-youtube-transcript-api SUBDIR += py-yt-dlp + SUBDIR += py-yt-dlp-ejs SUBDIR += pydio-cells SUBDIR += qdecoder SUBDIR += qhttpengine diff --git a/www/py-yt-dlp-ejs/Makefile b/www/py-yt-dlp-ejs/Makefile new file mode 100644 index 000000000000..92a0b1e992fd --- /dev/null +++ b/www/py-yt-dlp-ejs/Makefile @@ -0,0 +1,78 @@ +PORTNAME= yt-dlp-ejs +DISTVERSION= 0.5.0 +CATEGORIES= www +MASTER_SITES= PYPI +PKGNAMEPREFIX= ${PYTHON_PKGNAMEPREFIX} +DISTNAME= ${PORTNAME:S/-/_/g}-${DISTVERSION} +DISTFILES= ${DISTNAME}${EXTRACT_SUFX} \ + ${PORTNAME}-node-modules-${DISTVERSION}${EXTRACT_SUFX} +DIST_SUBDIR= ${PORTNAME} + +MAINTAINER= yuri@FreeBSD.org +COMMENT= JavaScript challenge solver for yt-dlp +WWW= https://github.com/yt-dlp/yt-dlp-ejs + +LICENSE= UNLICENSE +LICENSE_FILE= ${WRKSRC}/LICENSE + +FETCH_DEPENDS= npm:www/npm +BUILD_DEPENDS= deno:www/deno \ + npm:www/npm \ + ${PYTHON_PKGNAMEPREFIX}hatch-vcs>=0:devel/py-hatch-vcs@${PY_FLAVOR} \ + ${PYTHON_PKGNAMEPREFIX}hatchling>0:devel/py-hatchling@${PY_FLAVOR} +RUN_DEPENDS= deno:www/deno + +USES= python +USE_PYTHON= pep517 autoplist pytest + +SHEBANG_GLOB= *.py + +NO_ARCH= yes + +DD= ${DISTDIR}/${DIST_SUBDIR} + +do-fetch: + @if ! [ -f ${DD}/${DISTNAME}${EXTRACT_SUFX} ] || \ + ! [ -f ${DD}/${PORTNAME}-node-modules-${DISTVERSION}${EXTRACT_SUFX} ]; then \ + ${MKDIR} ${DD} && ${MKDIR} ${WRKDIR} && \ + ${ECHO_MSG} "====> Fetching ${DISTNAME}${EXTRACT_SUFX}" && \ + cd ${DD} && ${FETCH_CMD} https://files.pythonhosted.org/packages/source/y/yt-dlp-ejs/${DISTNAME}${EXTRACT_SUFX} && \ + ${ECHO_MSG} "====> Fetching and packaging node_modules" && \ + ${TAR} -xf ${DD}/${DISTNAME}${EXTRACT_SUFX} -C ${WRKDIR} && \ + cd ${WRKDIR}/${DISTNAME} && \ + ${SETENV} HOME=${WRKDIR} npm ci && \ + ${TAR} -czf ${DD}/${PORTNAME}-node-modules-${DISTVERSION}${EXTRACT_SUFX} \ + -C ${WRKDIR}/${DISTNAME} node_modules && \ + ${RM} -rf ${WRKDIR}; \ + fi + +post-extract: + # Extract pre-downloaded node_modules + @${TAR} -xf ${DD}/${PORTNAME}-node-modules-${DISTVERSION}${EXTRACT_SUFX} -C ${WRKSRC} + +do-build: + # Build JavaScript bundles + @${ECHO_MSG} "====> Building JavaScript bundles with rollup..." + @cd ${WRKSRC} && \ + ${SETENV} HOME=${WRKDIR} npm run bundle + # Verify bundles were created + @if ! [ -f ${WRKSRC}/dist/yt.solver.core.min.js ] || \ + ! [ -f ${WRKSRC}/dist/yt.solver.lib.min.js ]; then \ + ${ECHO_MSG} "ERROR: JavaScript bundles were not created properly"; \ + exit 1; \ + fi + # Build Python wheel + @cd ${WRKSRC} && \ + ${SETENV} ${MAKE_ENV} ${PYTHON_CMD} -m build --no-isolation --wheel --outdir ${WRKSRC}/dist + +pre-test: + # Copy built JavaScript files to test location + @${MKDIR} ${WRKSRC}/yt_dlp_ejs/yt/solver + @${CP} ${WRKSRC}/dist/yt.solver.core.min.js ${WRKSRC}/yt_dlp_ejs/yt/solver/core.min.js + @${CP} ${WRKSRC}/dist/yt.solver.lib.min.js ${WRKSRC}/yt_dlp_ejs/yt/solver/lib.min.js + +# tests as of 0.5.0: +# Results (0.15s): +# 3 passed + +.include <bsd.port.mk> diff --git a/www/py-yt-dlp-ejs/distinfo b/www/py-yt-dlp-ejs/distinfo new file mode 100644 index 000000000000..d2775f331874 --- /dev/null +++ b/www/py-yt-dlp-ejs/distinfo @@ -0,0 +1,5 @@ +TIMESTAMP = 1772400216 +SHA256 (yt-dlp-ejs/yt_dlp_ejs-0.5.0.tar.gz) = 8dfae59e418232f485253dcf8e197fefa232423c3af7824fe19e4517b173293b +SIZE (yt-dlp-ejs/yt_dlp_ejs-0.5.0.tar.gz) = 98925 +SHA256 (yt-dlp-ejs/yt-dlp-ejs-node-modules-0.5.0.tar.gz) = 4a9af07efc91351b86d598f18b75cf377b6b94f57d4e7f13500ce8592eb665f7 +SIZE (yt-dlp-ejs/yt-dlp-ejs-node-modules-0.5.0.tar.gz) = 8069784 diff --git a/www/py-yt-dlp-ejs/files/patch-hatch__build.py b/www/py-yt-dlp-ejs/files/patch-hatch__build.py new file mode 100644 index 000000000000..8e5f9316095c --- /dev/null +++ b/www/py-yt-dlp-ejs/files/patch-hatch__build.py @@ -0,0 +1,20 @@ +--- hatch_build.py.orig 2020-02-02 00:00:00 UTC ++++ hatch_build.py +@@ -11,6 +11,17 @@ class CustomBuildHook(BuildHookInterface): + + class CustomBuildHook(BuildHookInterface): + def initialize(self, version, build_data): ++ # Skip bundling if dist files already exist (FreeBSD pre-builds them) ++ if os.path.exists("dist/yt.solver.core.min.js") and os.path.exists("dist/yt.solver.lib.min.js"): ++ print("Using pre-built JavaScript bundles...") ++ build_data["force_include"].update( ++ { ++ "dist/yt.solver.core.min.js": "yt_dlp_ejs/yt/solver/core.min.js", ++ "dist/yt.solver.lib.min.js": "yt_dlp_ejs/yt/solver/lib.min.js", ++ } ++ ) ++ return ++ + name, cmds, env = build_bundle_cmds() + if cmds is None: + raise RuntimeError( diff --git a/www/py-yt-dlp-ejs/files/patch-pyproject.toml b/www/py-yt-dlp-ejs/files/patch-pyproject.toml new file mode 100644 index 000000000000..d3b8d5938ea3 --- /dev/null +++ b/www/py-yt-dlp-ejs/files/patch-pyproject.toml @@ -0,0 +1,12 @@ +--- pyproject.toml.orig 2020-02-02 00:00:00 UTC ++++ pyproject.toml +@@ -87,3 +87,9 @@ ban-relative-imports = "all" + + [tool.ruff.lint.flake8-tidy-imports] + ban-relative-imports = "all" ++ ++[tool.pytest.ini_options] ++testpaths = ["test"] ++python_files = ["test_*.py"] ++python_classes = ["Test*"] ++python_functions = ["test_*"] diff --git a/www/py-yt-dlp-ejs/pkg-descr b/www/py-yt-dlp-ejs/pkg-descr new file mode 100644 index 000000000000..1039ec0274fd --- /dev/null +++ b/www/py-yt-dlp-ejs/pkg-descr @@ -0,0 +1,7 @@ +yt-dlp-ejs provides the external JavaScript (EJS) scripts that yt-dlp +uses to interact with YouTube's player logic. These scripts enable +full support for YouTube by solving JavaScript-based challenges, +such as signature and throttle parameter decryption. + +A JavaScript runtime is required at runtime to execute these scripts. +Supported runtimes include Deno, Node.js, Bun, and QuickJS.home | help
Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?69a4b87b.35c86.490e25a1>
