Skip site navigation (1)Skip section navigation (2)
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>