From 376c1a279f8f0742bcbe1bbfdd10954cb1602205 Mon Sep 17 00:00:00 2001 From: bashonly Date: Mon, 11 Aug 2025 13:55:53 -0500 Subject: [PATCH 01/31] Discontinue `darwin_legacy_exe` support (#13860) Authored by: bashonly --- .github/workflows/build.yml | 64 +++---------------------------------- README.md | 1 - yt_dlp/update.py | 43 +++++++++++-------------- 3 files changed, 23 insertions(+), 85 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 810490f735..c505fbf594 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -21,9 +21,6 @@ on: macos: default: true type: boolean - macos_legacy: - default: true - type: boolean windows: default: true type: boolean @@ -67,10 +64,6 @@ on: description: yt-dlp_macos, yt-dlp_macos.zip default: true type: boolean - macos_legacy: - description: yt-dlp_macos_legacy - default: true - type: boolean windows: description: yt-dlp.exe, yt-dlp_win.zip default: true @@ -344,58 +337,6 @@ jobs: ~/yt-dlp-build-venv key: cache-reqs-${{ github.job }}-${{ github.ref }} - macos_legacy: - needs: process - if: inputs.macos_legacy - runs-on: macos-13 - - steps: - - uses: actions/checkout@v4 - - name: Install Python - # We need the official Python, because the GA ones only support newer macOS versions - env: - PYTHON_VERSION: 3.10.5 - MACOSX_DEPLOYMENT_TARGET: 10.9 # Used up by the Python build tools - run: | - # Hack to get the latest patch version. Uncomment if needed - #brew install python@3.10 - #export PYTHON_VERSION=$( $(brew --prefix)/opt/python@3.10/bin/python3 --version | cut -d ' ' -f 2 ) - curl "https://www.python.org/ftp/python/${PYTHON_VERSION}/python-${PYTHON_VERSION}-macos11.pkg" -o "python.pkg" - sudo installer -pkg python.pkg -target / - python3 --version - - name: Install Requirements - run: | - brew install coreutils - python3 devscripts/install_deps.py --user -o --include build - python3 devscripts/install_deps.py --user --include pyinstaller - - - name: Prepare - run: | - python3 devscripts/update-version.py -c "${{ inputs.channel }}" -r "${{ needs.process.outputs.origin }}" "${{ inputs.version }}" - python3 devscripts/make_lazy_extractors.py - - name: Build - run: | - python3 -m bundle.pyinstaller - mv dist/yt-dlp_macos dist/yt-dlp_macos_legacy - - - name: Verify --update-to - if: vars.UPDATE_TO_VERIFICATION - run: | - chmod +x ./dist/yt-dlp_macos_legacy - cp ./dist/yt-dlp_macos_legacy ./dist/yt-dlp_macos_legacy_downgraded - version="$(./dist/yt-dlp_macos_legacy --version)" - ./dist/yt-dlp_macos_legacy_downgraded -v --update-to yt-dlp/yt-dlp@2023.03.04 - downgraded_version="$(./dist/yt-dlp_macos_legacy_downgraded --version)" - [[ "$version" != "$downgraded_version" ]] - - - name: Upload artifacts - uses: actions/upload-artifact@v4 - with: - name: build-bin-${{ github.job }} - path: | - dist/yt-dlp_macos_legacy - compression-level: 0 - windows: needs: process if: inputs.windows @@ -498,7 +439,6 @@ jobs: - linux_static - linux_arm - macos - - macos_legacy - windows - windows32 runs-on: ubuntu-latest @@ -532,6 +472,7 @@ jobs: lock 2024.10.22 linux_(?:armv7l|aarch64)_exe .+-glibc2\.(?:[12]?\d|30)\b lock 2024.10.22 (?!\w+_exe).+ Python 3\.8 lock 2024.10.22 win(?:_x86)?_exe Python 3\.[78].+ Windows-(?:7-|2008ServerR2) + lock 2025.09.01 darwin_legacy_exe .+ lockV2 yt-dlp/yt-dlp 2022.08.18.36 .+ Python 3\.6 lockV2 yt-dlp/yt-dlp 2023.11.16 (?!win_x86_exe).+ Python 3\.7 lockV2 yt-dlp/yt-dlp 2023.11.16 win_x86_exe .+ Windows-(?:Vista|2008Server) @@ -539,18 +480,21 @@ jobs: lockV2 yt-dlp/yt-dlp 2024.10.22 linux_(?:armv7l|aarch64)_exe .+-glibc2\.(?:[12]?\d|30)\b lockV2 yt-dlp/yt-dlp 2024.10.22 (?!\w+_exe).+ Python 3\.8 lockV2 yt-dlp/yt-dlp 2024.10.22 win(?:_x86)?_exe Python 3\.[78].+ Windows-(?:7-|2008ServerR2) + lockV2 yt-dlp/yt-dlp 2025.09.01 darwin_legacy_exe .+ lockV2 yt-dlp/yt-dlp-nightly-builds 2023.11.15.232826 (?!win_x86_exe).+ Python 3\.7 lockV2 yt-dlp/yt-dlp-nightly-builds 2023.11.15.232826 win_x86_exe .+ Windows-(?:Vista|2008Server) lockV2 yt-dlp/yt-dlp-nightly-builds 2024.10.22.051025 py2exe .+ lockV2 yt-dlp/yt-dlp-nightly-builds 2024.10.22.051025 linux_(?:armv7l|aarch64)_exe .+-glibc2\.(?:[12]?\d|30)\b lockV2 yt-dlp/yt-dlp-nightly-builds 2024.10.22.051025 (?!\w+_exe).+ Python 3\.8 lockV2 yt-dlp/yt-dlp-nightly-builds 2024.10.22.051025 win(?:_x86)?_exe Python 3\.[78].+ Windows-(?:7-|2008ServerR2) + lockV2 yt-dlp/yt-dlp-nightly-builds 2025.09.01.234000 darwin_legacy_exe .+ lockV2 yt-dlp/yt-dlp-master-builds 2023.11.15.232812 (?!win_x86_exe).+ Python 3\.7 lockV2 yt-dlp/yt-dlp-master-builds 2023.11.15.232812 win_x86_exe .+ Windows-(?:Vista|2008Server) lockV2 yt-dlp/yt-dlp-master-builds 2024.10.22.045052 py2exe .+ lockV2 yt-dlp/yt-dlp-master-builds 2024.10.22.060347 linux_(?:armv7l|aarch64)_exe .+-glibc2\.(?:[12]?\d|30)\b lockV2 yt-dlp/yt-dlp-master-builds 2024.10.22.060347 (?!\w+_exe).+ Python 3\.8 lockV2 yt-dlp/yt-dlp-master-builds 2024.10.22.060347 win(?:_x86)?_exe Python 3\.[78].+ Windows-(?:7-|2008ServerR2) + lockV2 yt-dlp/yt-dlp-master-builds 2025.09.01.000000 darwin_legacy_exe .+ EOF - name: Sign checksum files diff --git a/README.md b/README.md index 9b28147f2c..aa8b1d4f24 100644 --- a/README.md +++ b/README.md @@ -111,7 +111,6 @@ File|Description [yt-dlp_linux_aarch64](https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp_linux_aarch64)|Linux standalone aarch64 (64-bit) binary [yt-dlp_win.zip](https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp_win.zip)|Unpackaged Windows executable (no auto-update) [yt-dlp_macos.zip](https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp_macos.zip)|Unpackaged MacOS (10.15+) executable (no auto-update) -[yt-dlp_macos_legacy](https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp_macos_legacy)|MacOS (10.9+) standalone x64 executable #### Misc diff --git a/yt_dlp/update.py b/yt_dlp/update.py index ca69fbbada..ee3df8790e 100644 --- a/yt_dlp/update.py +++ b/yt_dlp/update.py @@ -58,26 +58,28 @@ def _get_variant_and_executable_path(): """@returns (variant, executable_path)""" if getattr(sys, 'frozen', False): path = sys.executable + # py2exe is unsupported but we should still correctly identify it for debugging purposes if not hasattr(sys, '_MEIPASS'): return 'py2exe', path - elif sys._MEIPASS == os.path.dirname(path): + if sys._MEIPASS == os.path.dirname(path): return f'{sys.platform}_dir', path - elif sys.platform == 'darwin': - machine = '_legacy' if version_tuple(platform.mac_ver()[0]) < (10, 15) else '' - else: - machine = f'_{platform.machine().lower()}' - is_64bits = sys.maxsize > 2**32 - # Ref: https://en.wikipedia.org/wiki/Uname#Examples - if machine[1:] in ('x86', 'x86_64', 'amd64', 'i386', 'i686'): - machine = '_x86' if not is_64bits else '' - # platform.machine() on 32-bit raspbian OS may return 'aarch64', so check "64-bitness" - # See: https://github.com/yt-dlp/yt-dlp/issues/11813 - elif machine[1:] == 'aarch64' and not is_64bits: - machine = '_armv7l' - # sys.executable returns a /tmp/ path for staticx builds (linux_static) - # Ref: https://staticx.readthedocs.io/en/latest/usage.html#run-time-information - if static_exe_path := os.getenv('STATICX_PROG_PATH'): - path = static_exe_path + if sys.platform == 'darwin': + return 'darwin_exe', path + + machine = f'_{platform.machine().lower()}' + is_64bits = sys.maxsize > 2**32 + # Ref: https://en.wikipedia.org/wiki/Uname#Examples + if machine[1:] in ('x86', 'x86_64', 'amd64', 'i386', 'i686'): + machine = '_x86' if not is_64bits else '' + # platform.machine() on 32-bit raspbian OS may return 'aarch64', so check "64-bitness" + # See: https://github.com/yt-dlp/yt-dlp/issues/11813 + elif machine[1:] == 'aarch64' and not is_64bits: + machine = '_armv7l' + # sys.executable returns a /tmp/ path for staticx builds (linux_static) + # Ref: https://staticx.readthedocs.io/en/latest/usage.html#run-time-information + if static_exe_path := os.getenv('STATICX_PROG_PATH'): + path = static_exe_path + return f'{remove_end(sys.platform, "32")}{machine}_exe', path path = os.path.dirname(__file__) @@ -111,7 +113,6 @@ _FILE_SUFFIXES = { 'win_exe': '.exe', 'win_x86_exe': '_x86.exe', 'darwin_exe': '_macos', - 'darwin_legacy_exe': '_macos_legacy', 'linux_exe': '_linux', 'linux_aarch64_exe': '_linux_aarch64', 'linux_armv7l_exe': '_linux_armv7l', @@ -147,12 +148,6 @@ def _get_system_deprecation(): STOP_MSG = 'You may stop receiving updates on this version at any time!' variant = detect_variant() - # Temporary until macos_legacy executable builds are discontinued - if variant == 'darwin_legacy_exe': - return EXE_MSG_TMPL.format( - f'{variant} (the PyInstaller-bundled executable for macOS versions older than 10.15)', - 'issues/13856', STOP_MSG) - # Temporary until linux_armv7l executable builds are discontinued if variant == 'linux_armv7l_exe': return EXE_MSG_TMPL.format( From 5503e2eecb73cdd092782e5450833b2760fc6a36 Mon Sep 17 00:00:00 2001 From: bashonly Date: Sat, 9 Aug 2025 20:08:34 -0500 Subject: [PATCH 02/31] [build] Discontinue `yt-dlp_linux_armv7l`, use manylinux build strategy Authored by: bashonly --- .github/workflows/build.yml | 116 ++++++++--------------------- bundle/docker/compose.yml | 23 +++++- bundle/docker/linux/Dockerfile | 7 ++ bundle/docker/linux/entrypoint.sh | 11 +++ bundle/docker/static/Dockerfile | 21 ------ bundle/docker/static/entrypoint.sh | 14 ---- 6 files changed, 68 insertions(+), 124 deletions(-) create mode 100644 bundle/docker/linux/Dockerfile create mode 100755 bundle/docker/linux/entrypoint.sh delete mode 100644 bundle/docker/static/Dockerfile delete mode 100755 bundle/docker/static/entrypoint.sh diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c505fbf594..efdcd44d98 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -12,10 +12,7 @@ on: unix: default: true type: boolean - linux_static: - default: true - type: boolean - linux_arm: + linux: default: true type: boolean macos: @@ -52,12 +49,8 @@ on: description: yt-dlp, yt-dlp.tar.gz default: true type: boolean - linux_static: - description: yt-dlp_linux - default: true - type: boolean - linux_arm: - description: yt-dlp_linux_aarch64, yt-dlp_linux_armv7l + linux: + description: yt-dlp_linux, yt-dlp_linux_aarch64 default: true type: boolean macos: @@ -134,13 +127,23 @@ jobs: yt-dlp.tar.gz compression-level: 0 - linux_static: + linux: needs: process - if: inputs.linux_static - runs-on: ubuntu-latest + if: inputs.linux + runs-on: ${{ matrix.runner }} + strategy: + fail-fast: false + matrix: + include: + - exe: yt-dlp_linux + platform: x86_64 + runner: ubuntu-24.04 + - exe: yt-dlp_linux_aarch64 + platform: aarch64 + runner: ubuntu-24.04-arm steps: - uses: actions/checkout@v4 - - name: Build static executable + - name: Build executable env: channel: ${{ inputs.channel }} origin: ${{ needs.process.outputs.origin }} @@ -148,85 +151,25 @@ jobs: run: | mkdir ~/build cd bundle/docker - docker compose up --build static - sudo chown "${USER}:docker" ~/build/yt-dlp_linux + docker compose up --build linux_${{ matrix.platform }} + sudo chown "${USER}:docker" ~/build/${{ matrix.exe }} + chmod +x ~/build/${{ matrix.exe }} + # docker compose can fail with exit code 0, so we need to check the exe here + ~/build/${{ matrix.exe }} --version - name: Verify --update-to if: vars.UPDATE_TO_VERIFICATION run: | - chmod +x ~/build/yt-dlp_linux - cp ~/build/yt-dlp_linux ~/build/yt-dlp_linux_downgraded - version="$(~/build/yt-dlp_linux --version)" - ~/build/yt-dlp_linux_downgraded -v --update-to yt-dlp/yt-dlp@2023.03.04 - downgraded_version="$(~/build/yt-dlp_linux_downgraded --version)" + cp ~/build/${{ matrix.exe }} ~/build/${{ matrix.exe }}_downgraded + version="$(~/build/${{ matrix.exe }} --version)" + ~/build/${{ matrix.exe }}_downgraded -v --update-to yt-dlp/yt-dlp@2023.03.04 + downgraded_version="$(~/build/${{ matrix.exe }}_downgraded --version)" [[ "$version" != "$downgraded_version" ]] - name: Upload artifacts uses: actions/upload-artifact@v4 with: - name: build-bin-${{ github.job }} + name: build-bin-${{ github.job }}_${{ matrix.platform }} path: | - ~/build/yt-dlp_linux - compression-level: 0 - - linux_arm: - needs: process - if: inputs.linux_arm - permissions: - contents: read - packages: write # for creating cache - runs-on: ubuntu-latest - strategy: - matrix: - architecture: - - armv7 - - aarch64 - - steps: - - uses: actions/checkout@v4 - with: - path: ./repo - - name: Virtualized Install, Prepare & Build - uses: yt-dlp/run-on-arch-action@v3 - with: - # Ref: https://github.com/uraimo/run-on-arch-action/issues/55 - env: | - GITHUB_WORKFLOW: build - githubToken: ${{ github.token }} # To cache image - arch: ${{ matrix.architecture }} - distro: ubuntu20.04 # Standalone executable should be built on minimum supported OS - dockerRunArgs: --volume "${PWD}/repo:/repo" - install: | # Installing Python 3.10 from the Deadsnakes repo raises errors - apt update - apt -y install zlib1g-dev libffi-dev python3.9 python3.9-dev python3.9-distutils python3-pip \ - python3-secretstorage # Cannot build cryptography wheel in virtual armv7 environment - python3.9 -m pip install -U pip wheel 'setuptools>=71.0.2' - # XXX: Keep this in sync with pyproject.toml (it can't be accessed at this stage) and exclude secretstorage - python3.9 -m pip install -U Pyinstaller mutagen pycryptodomex brotli certifi cffi \ - 'requests>=2.32.2,<3' 'urllib3>=2.0.2,<3' 'websockets>=13.0' - - run: | - cd repo - python3.9 devscripts/install_deps.py -o --include build - python3.9 devscripts/install_deps.py --include pyinstaller # Cached versions may be out of date - python3.9 devscripts/update-version.py -c "${{ inputs.channel }}" -r "${{ needs.process.outputs.origin }}" "${{ inputs.version }}" - python3.9 devscripts/make_lazy_extractors.py - python3.9 -m bundle.pyinstaller - - if ${{ vars.UPDATE_TO_VERIFICATION && 'true' || 'false' }}; then - arch="${{ (matrix.architecture == 'armv7' && 'armv7l') || matrix.architecture }}" - chmod +x ./dist/yt-dlp_linux_${arch} - cp ./dist/yt-dlp_linux_${arch} ./dist/yt-dlp_linux_${arch}_downgraded - version="$(./dist/yt-dlp_linux_${arch} --version)" - ./dist/yt-dlp_linux_${arch}_downgraded -v --update-to yt-dlp/yt-dlp@2023.03.04 - downgraded_version="$(./dist/yt-dlp_linux_${arch}_downgraded --version)" - [[ "$version" != "$downgraded_version" ]] - fi - - - name: Upload artifacts - uses: actions/upload-artifact@v4 - with: - name: build-bin-linux_${{ matrix.architecture }} - path: | # run-on-arch-action designates armv7l as armv7 - repo/dist/yt-dlp_linux_${{ (matrix.architecture == 'armv7' && 'armv7l') || matrix.architecture }} + ~/build/${{ matrix.exe }} compression-level: 0 macos: @@ -436,8 +379,7 @@ jobs: needs: - process - unix - - linux_static - - linux_arm + - linux - macos - windows - windows32 diff --git a/bundle/docker/compose.yml b/bundle/docker/compose.yml index 5f89ca6d09..7677f00bea 100644 --- a/bundle/docker/compose.yml +++ b/bundle/docker/compose.yml @@ -1,6 +1,25 @@ services: - static: - build: static + linux_x86_64: + build: + context: linux + platforms: + - "linux/amd64" + args: + BASEIMAGE: ghcr.io/bashonly/manylinux2014_x86_64_builds:latest + environment: + channel: ${channel} + origin: ${origin} + version: ${version} + volumes: + - ~/build:/build + - ../..:/yt-dlp + linux_aarch64: + build: + context: linux + platforms: + - "linux/arm64" + args: + BASEIMAGE: ghcr.io/bashonly/manylinux2014_aarch64_builds:latest environment: channel: ${channel} origin: ${origin} diff --git a/bundle/docker/linux/Dockerfile b/bundle/docker/linux/Dockerfile new file mode 100644 index 0000000000..d989390b05 --- /dev/null +++ b/bundle/docker/linux/Dockerfile @@ -0,0 +1,7 @@ +ARG BASEIMAGE=ghcr.io/bashonly/manylinux2014_x86_64_builds:latest + +FROM $BASEIMAGE AS base + +WORKDIR /yt-dlp +COPY entrypoint.sh /entrypoint.sh +ENTRYPOINT /entrypoint.sh diff --git a/bundle/docker/linux/entrypoint.sh b/bundle/docker/linux/entrypoint.sh new file mode 100755 index 0000000000..d82f326ff5 --- /dev/null +++ b/bundle/docker/linux/entrypoint.sh @@ -0,0 +1,11 @@ +#!/bin/bash +set -e + +python3.13 -m venv ~/yt-dlp-build-venv +source ~/yt-dlp-build-venv/bin/activate +python3.13 -m devscripts.install_deps -o --include build +python3.13 -m devscripts.install_deps --include secretstorage --include curl-cffi --include pyinstaller +python3.13 -m devscripts.make_lazy_extractors +python3.13 devscripts/update-version.py -c "${channel}" -r "${origin}" "${version}" +python3.13 -m bundle.pyinstaller +mv dist/* /build/ diff --git a/bundle/docker/static/Dockerfile b/bundle/docker/static/Dockerfile deleted file mode 100644 index dae2dff3d8..0000000000 --- a/bundle/docker/static/Dockerfile +++ /dev/null @@ -1,21 +0,0 @@ -FROM alpine:3.19 as base - -RUN apk --update add --no-cache \ - build-base \ - python3 \ - pipx \ - ; - -RUN pipx install pyinstaller -# Requires above step to prepare the shared venv -RUN ~/.local/share/pipx/shared/bin/python -m pip install -U wheel -RUN apk --update add --no-cache \ - scons \ - patchelf \ - binutils \ - ; -RUN pipx install staticx - -WORKDIR /yt-dlp -COPY entrypoint.sh /entrypoint.sh -ENTRYPOINT /entrypoint.sh diff --git a/bundle/docker/static/entrypoint.sh b/bundle/docker/static/entrypoint.sh deleted file mode 100755 index 8049e68205..0000000000 --- a/bundle/docker/static/entrypoint.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/ash -set -e - -source ~/.local/share/pipx/venvs/pyinstaller/bin/activate -python -m devscripts.install_deps -o --include build -python -m devscripts.install_deps --include secretstorage --include curl-cffi -python -m devscripts.make_lazy_extractors -python devscripts/update-version.py -c "${channel}" -r "${origin}" "${version}" -python -m bundle.pyinstaller -deactivate - -source ~/.local/share/pipx/venvs/staticx/bin/activate -staticx /yt-dlp/dist/yt-dlp_linux /build/yt-dlp_linux -deactivate From 08f2f1d641704c7095d47aee477ea173d82b9816 Mon Sep 17 00:00:00 2001 From: bashonly Date: Mon, 11 Aug 2025 14:19:56 -0500 Subject: [PATCH 03/31] [build] entrypoint script fixes Authored by: bashonly --- .github/workflows/build.yml | 1 - bundle/docker/linux/entrypoint.sh | 14 +++++++------- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index efdcd44d98..e13bc0a50b 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -154,7 +154,6 @@ jobs: docker compose up --build linux_${{ matrix.platform }} sudo chown "${USER}:docker" ~/build/${{ matrix.exe }} chmod +x ~/build/${{ matrix.exe }} - # docker compose can fail with exit code 0, so we need to check the exe here ~/build/${{ matrix.exe }} --version - name: Verify --update-to if: vars.UPDATE_TO_VERIFICATION diff --git a/bundle/docker/linux/entrypoint.sh b/bundle/docker/linux/entrypoint.sh index d82f326ff5..d18c49c364 100755 --- a/bundle/docker/linux/entrypoint.sh +++ b/bundle/docker/linux/entrypoint.sh @@ -1,11 +1,11 @@ #!/bin/bash -set -e +set -exuo pipefail -python3.13 -m venv ~/yt-dlp-build-venv +python3 -m venv ~/yt-dlp-build-venv source ~/yt-dlp-build-venv/bin/activate -python3.13 -m devscripts.install_deps -o --include build -python3.13 -m devscripts.install_deps --include secretstorage --include curl-cffi --include pyinstaller -python3.13 -m devscripts.make_lazy_extractors -python3.13 devscripts/update-version.py -c "${channel}" -r "${origin}" "${version}" -python3.13 -m bundle.pyinstaller +python3 -m devscripts.install_deps -o --include build +python3 -m devscripts.install_deps --include secretstorage --include curl-cffi --include pyinstaller +python3 -m devscripts.make_lazy_extractors +python3 devscripts/update-version.py -c "${channel}" -r "${origin}" "${version}" +python3 -m bundle.pyinstaller mv dist/* /build/ From 60fc70676f56d8ba99867cdd11f67bf868318f3f Mon Sep 17 00:00:00 2001 From: bashonly Date: Mon, 11 Aug 2025 14:48:07 -0500 Subject: [PATCH 04/31] [build] Add `linux_dir` builds Authored by: bashonly --- .github/workflows/build.yml | 11 +++++++---- bundle/docker/compose.yml | 14 ++++++++------ bundle/docker/linux/entrypoint.sh | 8 ++++++-- 3 files changed, 21 insertions(+), 12 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e13bc0a50b..1b9d901c34 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -50,7 +50,7 @@ on: default: true type: boolean linux: - description: yt-dlp_linux, yt-dlp_linux_aarch64 + description: yt-dlp_linux, yt-dlp_linux.zip, yt-dlp_linux_aarch64, yt-dlp_linux_aarch64.zip default: true type: boolean macos: @@ -145,14 +145,16 @@ jobs: - uses: actions/checkout@v4 - name: Build executable env: - channel: ${{ inputs.channel }} - origin: ${{ needs.process.outputs.origin }} - version: ${{ inputs.version }} + EXE_NAME: ${{ matrix.exe }} + CHANNEL: ${{ inputs.channel }} + ORIGIN: ${{ needs.process.outputs.origin }} + VERSION: ${{ inputs.version }} run: | mkdir ~/build cd bundle/docker docker compose up --build linux_${{ matrix.platform }} sudo chown "${USER}:docker" ~/build/${{ matrix.exe }} + sudo chown "${USER}:docker" ~/build/${{ matrix.exe }}.zip chmod +x ~/build/${{ matrix.exe }} ~/build/${{ matrix.exe }} --version - name: Verify --update-to @@ -169,6 +171,7 @@ jobs: name: build-bin-${{ github.job }}_${{ matrix.platform }} path: | ~/build/${{ matrix.exe }} + ~/build/${{ matrix.exe }}.zip compression-level: 0 macos: diff --git a/bundle/docker/compose.yml b/bundle/docker/compose.yml index 7677f00bea..30a28d6664 100644 --- a/bundle/docker/compose.yml +++ b/bundle/docker/compose.yml @@ -7,9 +7,10 @@ services: args: BASEIMAGE: ghcr.io/bashonly/manylinux2014_x86_64_builds:latest environment: - channel: ${channel} - origin: ${origin} - version: ${version} + EXE_NAME: ${EXE_NAME} + CHANNEL: ${CHANNEL} + ORIGIN: ${ORIGIN} + VERSION: ${VERSION} volumes: - ~/build:/build - ../..:/yt-dlp @@ -21,9 +22,10 @@ services: args: BASEIMAGE: ghcr.io/bashonly/manylinux2014_aarch64_builds:latest environment: - channel: ${channel} - origin: ${origin} - version: ${version} + EXE_NAME: ${EXE_NAME} + CHANNEL: ${CHANNEL} + ORIGIN: ${ORIGIN} + VERSION: ${VERSION} volumes: - ~/build:/build - ../..:/yt-dlp diff --git a/bundle/docker/linux/entrypoint.sh b/bundle/docker/linux/entrypoint.sh index d18c49c364..dba214801b 100755 --- a/bundle/docker/linux/entrypoint.sh +++ b/bundle/docker/linux/entrypoint.sh @@ -6,6 +6,10 @@ source ~/yt-dlp-build-venv/bin/activate python3 -m devscripts.install_deps -o --include build python3 -m devscripts.install_deps --include secretstorage --include curl-cffi --include pyinstaller python3 -m devscripts.make_lazy_extractors -python3 devscripts/update-version.py -c "${channel}" -r "${origin}" "${version}" +python3 devscripts/update-version.py -c "${CHANNEL}" -r "${ORIGIN}" "${VERSION}" +python3 -m bundle.pyinstaller --onedir +pushd "./dist/${EXE_NAME}" +zip -r "/build/${EXE_NAME}.zip" . +popd python3 -m bundle.pyinstaller -mv dist/* /build/ +mv "./dist/${EXE_NAME}" /build/ From f0cb0550a9730ae358fcbe48e804f59e1c2a54b7 Mon Sep 17 00:00:00 2001 From: bashonly Date: Mon, 11 Aug 2025 14:50:59 -0500 Subject: [PATCH 05/31] [update] remove `linux_armv7l_exe` from `_FILE_SUFFIXES` Authored by: bashonly --- yt_dlp/update.py | 1 - 1 file changed, 1 deletion(-) diff --git a/yt_dlp/update.py b/yt_dlp/update.py index ee3df8790e..c53be00cff 100644 --- a/yt_dlp/update.py +++ b/yt_dlp/update.py @@ -115,7 +115,6 @@ _FILE_SUFFIXES = { 'darwin_exe': '_macos', 'linux_exe': '_linux', 'linux_aarch64_exe': '_linux_aarch64', - 'linux_armv7l_exe': '_linux_armv7l', } _NON_UPDATEABLE_REASONS = { From 87722b6cc806fa1ea52026e058f7508ea3d8a315 Mon Sep 17 00:00:00 2001 From: bashonly Date: Mon, 11 Aug 2025 14:55:40 -0500 Subject: [PATCH 06/31] [update] remove temporary deprecation code Authored by: bashonly --- yt_dlp/update.py | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/yt_dlp/update.py b/yt_dlp/update.py index c53be00cff..cc6e70012e 100644 --- a/yt_dlp/update.py +++ b/yt_dlp/update.py @@ -142,21 +142,6 @@ def _get_binary_name(): def _get_system_deprecation(): MIN_SUPPORTED, MIN_RECOMMENDED = (3, 9), (3, 10) - EXE_MSG_TMPL = ('Support for {} has been deprecated. ' - 'See https://github.com/yt-dlp/yt-dlp/{} for details.\n{}') - STOP_MSG = 'You may stop receiving updates on this version at any time!' - variant = detect_variant() - - # Temporary until linux_armv7l executable builds are discontinued - if variant == 'linux_armv7l_exe': - return EXE_MSG_TMPL.format( - f'{variant} (the PyInstaller-bundled executable for the Linux armv7l platform)', - 'issues/13976', STOP_MSG) - - # Temporary until linux_aarch64_exe is built with Python >=3.10 instead of Python 3.9 - if variant == 'linux_aarch64_exe': - return None - if sys.version_info > MIN_RECOMMENDED: return None From aa0d28531aa77b9d1e8e2b616401a4e216cfc85f Mon Sep 17 00:00:00 2001 From: bashonly Date: Mon, 11 Aug 2025 15:12:59 -0500 Subject: [PATCH 07/31] [update] fix onedir variant names Authored by: bashonly --- yt_dlp/update.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/yt_dlp/update.py b/yt_dlp/update.py index cc6e70012e..5d38baecc6 100644 --- a/yt_dlp/update.py +++ b/yt_dlp/update.py @@ -61,10 +61,10 @@ def _get_variant_and_executable_path(): # py2exe is unsupported but we should still correctly identify it for debugging purposes if not hasattr(sys, '_MEIPASS'): return 'py2exe', path - if sys._MEIPASS == os.path.dirname(path): - return f'{sys.platform}_dir', path + # We know it's a PyInstaller bundle, but is it "onedir" or "onefile"? + suffix = 'dir' if sys._MEIPASS == os.path.dirname(path) else 'exe' if sys.platform == 'darwin': - return 'darwin_exe', path + return f'darwin_{suffix}', path machine = f'_{platform.machine().lower()}' is_64bits = sys.maxsize > 2**32 @@ -80,7 +80,7 @@ def _get_variant_and_executable_path(): if static_exe_path := os.getenv('STATICX_PROG_PATH'): path = static_exe_path - return f'{remove_end(sys.platform, "32")}{machine}_exe', path + return f'{remove_end(sys.platform, "32")}{machine}_{suffix}', path path = os.path.dirname(__file__) if isinstance(__loader__, zipimporter): From 580bb60b8734316b8b16dbf0cc89738b9f9f8dfa Mon Sep 17 00:00:00 2001 From: bashonly Date: Mon, 11 Aug 2025 15:18:29 -0500 Subject: [PATCH 08/31] [update] still identify `darwin_legacy_exe` Authored by: bashonly --- yt_dlp/update.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/yt_dlp/update.py b/yt_dlp/update.py index 5d38baecc6..6d66256e3b 100644 --- a/yt_dlp/update.py +++ b/yt_dlp/update.py @@ -64,7 +64,9 @@ def _get_variant_and_executable_path(): # We know it's a PyInstaller bundle, but is it "onedir" or "onefile"? suffix = 'dir' if sys._MEIPASS == os.path.dirname(path) else 'exe' if sys.platform == 'darwin': - return f'darwin_{suffix}', path + # darwin_legacy_exe is no longer supported, but still identify it to block updates + machine = '_legacy' if version_tuple(platform.mac_ver()[0]) < (10, 15) else '' + return f'darwin{machine}_{suffix}', path machine = f'_{platform.machine().lower()}' is_64bits = sys.maxsize > 2**32 From 8d129c869ad8fb707d0eb59a309f8dccc21c3dcc Mon Sep 17 00:00:00 2001 From: bashonly Date: Mon, 11 Aug 2025 15:36:36 -0500 Subject: [PATCH 09/31] [docs] Update "Release Files" in README Authored by: bashonly --- README.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index aa8b1d4f24..624ea19934 100644 --- a/README.md +++ b/README.md @@ -106,10 +106,11 @@ File|Description File|Description :---|:--- [yt-dlp_x86.exe](https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp_x86.exe)|Windows (Win8+) standalone x86 (32-bit) binary -[yt-dlp_linux](https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp_linux)|Linux standalone x64 binary -[yt-dlp_linux_armv7l](https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp_linux_armv7l)|Linux standalone armv7l (32-bit) binary -[yt-dlp_linux_aarch64](https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp_linux_aarch64)|Linux standalone aarch64 (64-bit) binary -[yt-dlp_win.zip](https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp_win.zip)|Unpackaged Windows executable (no auto-update) +[yt-dlp_linux](https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp_linux)|Linux (glibc 2.17+) standalone x86_64 binary +[yt-dlp_linux.zip](https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp_linux.zip)|Unpackaged Linux (glibc 2.17+) x86_64 executable (no auto-update) +[yt-dlp_linux_aarch64](https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp_linux_aarch64)|Linux (glibc 2.17+) standalone aarch64 binary +[yt-dlp_linux_aarch64.zip](https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp_linux_aarch64.zip)|Unpackaged Linux (glibc 2.17+) aarch64 executable (no auto-update) +[yt-dlp_win.zip](https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp_win.zip)|Unpackaged Windows (Win8+) executable (no auto-update) [yt-dlp_macos.zip](https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp_macos.zip)|Unpackaged MacOS (10.15+) executable (no auto-update) #### Misc From 47922adf9e954e0f00708def043da09165923b9b Mon Sep 17 00:00:00 2001 From: bashonly Date: Tue, 12 Aug 2025 02:48:50 -0500 Subject: [PATCH 10/31] use python zipfile instead of `zip` Authored by: bashonly --- bundle/docker/linux/entrypoint.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bundle/docker/linux/entrypoint.sh b/bundle/docker/linux/entrypoint.sh index dba214801b..e230c5f8b1 100755 --- a/bundle/docker/linux/entrypoint.sh +++ b/bundle/docker/linux/entrypoint.sh @@ -9,7 +9,7 @@ python3 -m devscripts.make_lazy_extractors python3 devscripts/update-version.py -c "${CHANNEL}" -r "${ORIGIN}" "${VERSION}" python3 -m bundle.pyinstaller --onedir pushd "./dist/${EXE_NAME}" -zip -r "/build/${EXE_NAME}.zip" . +python3 -m zipfile -c "/build/${EXE_NAME}.zip" ./ popd python3 -m bundle.pyinstaller mv "./dist/${EXE_NAME}" /build/ From b4c7dadad6305759757d2c9635a40a2d1c329710 Mon Sep 17 00:00:00 2001 From: bashonly Date: Tue, 12 Aug 2025 06:00:13 -0500 Subject: [PATCH 11/31] Try armv7l and musllinux builds Authored by: bashonly --- .github/workflows/build.yml | 73 ++++++++++++++++++++++++++++--- README.md | 7 ++- bundle/docker/compose.yml | 54 +++++++++++++++++++++++ bundle/docker/linux/entrypoint.sh | 32 +++++++++----- bundle/pyinstaller.py | 2 + yt_dlp/update.py | 9 +++- 6 files changed, 158 insertions(+), 19 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1b9d901c34..6901aff009 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -15,6 +15,9 @@ on: linux: default: true type: boolean + musllinux: + default: true + type: boolean macos: default: true type: boolean @@ -50,7 +53,11 @@ on: default: true type: boolean linux: - description: yt-dlp_linux, yt-dlp_linux.zip, yt-dlp_linux_aarch64, yt-dlp_linux_aarch64.zip + description: yt-dlp_linux, yt-dlp_linux.zip, yt-dlp_linux_aarch64, yt-dlp_linux_aarch64.zip, yt-dlp_linux_armv7l + default: true + type: boolean + musllinux: + description: yt-dlp_musllinux, yt-dlp_musllinux.zip, yt-dlp_musllinux_aarch64, yt-dlp_musllinux_aarch64.zip default: true type: boolean macos: @@ -141,8 +148,16 @@ jobs: - exe: yt-dlp_linux_aarch64 platform: aarch64 runner: ubuntu-24.04-arm + - exe: yt-dlp_linux_armv7l + platform: armv7l + runner: ubuntu-24.04-arm steps: - uses: actions/checkout@v4 + - name: Set up QEMU + if: matrix.platform == 'armv7l' + uses: docker/setup-qemu-action@v3 + with: + platforms: linux/arm/v7 - name: Build executable env: EXE_NAME: ${{ matrix.exe }} @@ -154,24 +169,67 @@ jobs: cd bundle/docker docker compose up --build linux_${{ matrix.platform }} sudo chown "${USER}:docker" ~/build/${{ matrix.exe }} - sudo chown "${USER}:docker" ~/build/${{ matrix.exe }}.zip - chmod +x ~/build/${{ matrix.exe }} - ~/build/${{ matrix.exe }} --version - name: Verify --update-to - if: vars.UPDATE_TO_VERIFICATION + if: vars.UPDATE_TO_VERIFICATION && matrix.platform != 'armv7l' run: | + chmod +x ~/build/${{ matrix.exe }} cp ~/build/${{ matrix.exe }} ~/build/${{ matrix.exe }}_downgraded version="$(~/build/${{ matrix.exe }} --version)" ~/build/${{ matrix.exe }}_downgraded -v --update-to yt-dlp/yt-dlp@2023.03.04 downgraded_version="$(~/build/${{ matrix.exe }}_downgraded --version)" + rm -f "${{ matrix.exe }}_downgraded" [[ "$version" != "$downgraded_version" ]] - name: Upload artifacts uses: actions/upload-artifact@v4 with: name: build-bin-${{ github.job }}_${{ matrix.platform }} path: | - ~/build/${{ matrix.exe }} - ~/build/${{ matrix.exe }}.zip + ~/build/${{ matrix.exe }}* + compression-level: 0 + + musllinux: + needs: process + if: inputs.musllinux + runs-on: ${{ matrix.runner }} + strategy: + fail-fast: false + matrix: + include: + - exe: yt-dlp_musllinux + platform: x86_64 + runner: ubuntu-24.04 + - exe: yt-dlp_musllinux_aarch64 + platform: aarch64 + runner: ubuntu-24.04-arm + steps: + - uses: actions/checkout@v4 + - name: Build executable + env: + EXE_NAME: ${{ matrix.exe }} + CHANNEL: ${{ inputs.channel }} + ORIGIN: ${{ needs.process.outputs.origin }} + VERSION: ${{ inputs.version }} + run: | + mkdir ~/build + cd bundle/docker + docker compose up --build musllinux_${{ matrix.platform }} + sudo chown "${USER}:docker" ~/build/${{ matrix.exe }} + # - name: Verify --update-to + # if: vars.UPDATE_TO_VERIFICATION + # run: | + # chmod +x ~/build/${{ matrix.exe }} + # cp ~/build/${{ matrix.exe }} ~/build/${{ matrix.exe }}_downgraded + # version="$(~/build/${{ matrix.exe }} --version)" + # ~/build/${{ matrix.exe }}_downgraded -v --update-to yt-dlp/yt-dlp@2023.03.04 + # downgraded_version="$(~/build/${{ matrix.exe }}_downgraded --version)" + # rm -f "${{ matrix.exe }}_downgraded" + # [[ "$version" != "$downgraded_version" ]] + - name: Upload artifacts + uses: actions/upload-artifact@v4 + with: + name: build-bin-${{ github.job }}_${{ matrix.platform }} + path: | + ~/build/${{ matrix.exe }}* compression-level: 0 macos: @@ -382,6 +440,7 @@ jobs: - process - unix - linux + - musllinux - macos - windows - windows32 diff --git a/README.md b/README.md index 624ea19934..37514bf546 100644 --- a/README.md +++ b/README.md @@ -110,6 +110,11 @@ File|Description [yt-dlp_linux.zip](https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp_linux.zip)|Unpackaged Linux (glibc 2.17+) x86_64 executable (no auto-update) [yt-dlp_linux_aarch64](https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp_linux_aarch64)|Linux (glibc 2.17+) standalone aarch64 binary [yt-dlp_linux_aarch64.zip](https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp_linux_aarch64.zip)|Unpackaged Linux (glibc 2.17+) aarch64 executable (no auto-update) +[yt-dlp_linux_armv7l](https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp_linux_armv7l)|Linux (glibc 2.31+) standalone armv7l binary +[yt-dlp_musllinux](https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp_musllinux)|Linux (musl 1.2+) standalone x86_64 binary +[yt-dlp_musllinux.zip](https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp_musllinux.zip)|Unpackaged Linux (musl 1.2+) x86_64 executable (no auto-update) +[yt-dlp_musllinux_aarch64](https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp_musllinux_aarch64)|Linux (musl 1.2+) standalone aarch64 binary +[yt-dlp_musllinux_aarch64.zip](https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp_musllinux_aarch64.zip)|Unpackaged Linux (musl 1.2+) aarch64 executable (no auto-update) [yt-dlp_win.zip](https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp_win.zip)|Unpackaged Windows (Win8+) executable (no auto-update) [yt-dlp_macos.zip](https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp_macos.zip)|Unpackaged MacOS (10.15+) executable (no auto-update) @@ -204,7 +209,7 @@ The following provide support for impersonating browser requests. This may be re * [**curl_cffi**](https://github.com/lexiforest/curl_cffi) (recommended) - Python binding for [curl-impersonate](https://github.com/lexiforest/curl-impersonate). Provides impersonation targets for Chrome, Edge and Safari. Licensed under [MIT](https://github.com/lexiforest/curl_cffi/blob/main/LICENSE) * Can be installed with the `curl-cffi` group, e.g. `pip install "yt-dlp[default,curl-cffi]"` - * Currently included in `yt-dlp.exe`, `yt-dlp_linux` and `yt-dlp_macos` builds + * Currently included in all builds *except* `yt-dlp_x86` (Windows 32-bit) and `yt-dlp` (Unix zipimport binary) ### Metadata diff --git a/bundle/docker/compose.yml b/bundle/docker/compose.yml index 30a28d6664..7b116b22e0 100644 --- a/bundle/docker/compose.yml +++ b/bundle/docker/compose.yml @@ -1,4 +1,5 @@ services: + linux_x86_64: build: context: linux @@ -14,6 +15,7 @@ services: volumes: - ~/build:/build - ../..:/yt-dlp + linux_aarch64: build: context: linux @@ -29,3 +31,55 @@ services: volumes: - ~/build:/build - ../..:/yt-dlp + + linux_armv7l: + build: + context: linux + platforms: + - "linux/arm/v7" + args: + BASEIMAGE: ghcr.io/bashonly/manylinux_2_31_armv7l_builds:latest + environment: + EXE_NAME: ${EXE_NAME} + CHANNEL: ${CHANNEL} + ORIGIN: ${ORIGIN} + VERSION: ${VERSION} + PIP_EXTRA_INDEX_URL: https://www.piwheels.org/simple + PIP_PREFER_BINARY: "1" + USE_PYTHON_VERSION: "3.11" + SKIP_ONEDIR_BUILD: "1" + volumes: + - ~/build:/build + - ../..:/yt-dlp + + musllinux_x86_64: + build: + context: linux + platforms: + - "linux/amd64" + args: + BASEIMAGE: ghcr.io/bashonly/musllinux_1_2_x86_64_builds:latest + environment: + EXE_NAME: ${EXE_NAME} + CHANNEL: ${CHANNEL} + ORIGIN: ${ORIGIN} + VERSION: ${VERSION} + volumes: + - ~/build:/build + - ../..:/yt-dlp + + musllinux_aarch64: + build: + context: linux + platforms: + - "linux/arm64" + args: + BASEIMAGE: ghcr.io/bashonly/musllinux_1_2_aarch64_builds:latest + environment: + EXE_NAME: ${EXE_NAME} + CHANNEL: ${CHANNEL} + ORIGIN: ${ORIGIN} + VERSION: ${VERSION} + volumes: + - ~/build:/build + - ../..:/yt-dlp diff --git a/bundle/docker/linux/entrypoint.sh b/bundle/docker/linux/entrypoint.sh index e230c5f8b1..5e314cb2ae 100755 --- a/bundle/docker/linux/entrypoint.sh +++ b/bundle/docker/linux/entrypoint.sh @@ -1,15 +1,27 @@ #!/bin/bash set -exuo pipefail -python3 -m venv ~/yt-dlp-build-venv +function runpy { + case ${USE_PYTHON_VERSION:-} in + "3.11") python3.11 "$@";; + "3.13") python3.13 "$@";; + *) python3 "$@";; + esac +} + +runpy -m venv ~/yt-dlp-build-venv source ~/yt-dlp-build-venv/bin/activate -python3 -m devscripts.install_deps -o --include build -python3 -m devscripts.install_deps --include secretstorage --include curl-cffi --include pyinstaller -python3 -m devscripts.make_lazy_extractors -python3 devscripts/update-version.py -c "${CHANNEL}" -r "${ORIGIN}" "${VERSION}" -python3 -m bundle.pyinstaller --onedir -pushd "./dist/${EXE_NAME}" -python3 -m zipfile -c "/build/${EXE_NAME}.zip" ./ -popd -python3 -m bundle.pyinstaller +runpy -m devscripts.install_deps -o --include build +runpy -m devscripts.install_deps --include secretstorage --include curl-cffi --include pyinstaller +runpy -m devscripts.make_lazy_extractors +runpy devscripts/update-version.py -c "${CHANNEL}" -r "${ORIGIN}" "${VERSION}" + +if [[ -z "${SKIP_ONEDIR_BUILD:-}" ]]; then + runpy -m bundle.pyinstaller --onedir + pushd "./dist/${EXE_NAME}" + runpy -m zipfile -c "/build/${EXE_NAME}.zip" ./ + popd +fi + +runpy -m bundle.pyinstaller mv "./dist/${EXE_NAME}" /build/ diff --git a/bundle/pyinstaller.py b/bundle/pyinstaller.py index 0597f602d0..8286f077ab 100755 --- a/bundle/pyinstaller.py +++ b/bundle/pyinstaller.py @@ -13,6 +13,8 @@ from PyInstaller.__main__ import run as run_pyinstaller from devscripts.utils import read_version OS_NAME, MACHINE, ARCH = sys.platform, platform.machine().lower(), platform.architecture()[0][:2] +if OS_NAME == 'linux' and platform.libc_ver()[0] != 'glibc': + OS_NAME = 'musllinux' if MACHINE in ('x86', 'x86_64', 'amd64', 'i386', 'i686'): MACHINE = 'x86' if ARCH == '32' else '' diff --git a/yt_dlp/update.py b/yt_dlp/update.py index 6d66256e3b..e5ca596bb3 100644 --- a/yt_dlp/update.py +++ b/yt_dlp/update.py @@ -68,6 +68,10 @@ def _get_variant_and_executable_path(): machine = '_legacy' if version_tuple(platform.mac_ver()[0]) < (10, 15) else '' return f'darwin{machine}_{suffix}', path + system_platform = remove_end(sys.platform, '32') + if system_platform == 'linux' and platform.libc_ver()[0] != 'glibc': + system_platform = 'musllinux' + machine = f'_{platform.machine().lower()}' is_64bits = sys.maxsize > 2**32 # Ref: https://en.wikipedia.org/wiki/Uname#Examples @@ -82,7 +86,7 @@ def _get_variant_and_executable_path(): if static_exe_path := os.getenv('STATICX_PROG_PATH'): path = static_exe_path - return f'{remove_end(sys.platform, "32")}{machine}_{suffix}', path + return f'{system_platform}{machine}_{suffix}', path path = os.path.dirname(__file__) if isinstance(__loader__, zipimporter): @@ -117,6 +121,9 @@ _FILE_SUFFIXES = { 'darwin_exe': '_macos', 'linux_exe': '_linux', 'linux_aarch64_exe': '_linux_aarch64', + 'linux_armv7l_exe': '_linux_armv7l', + 'musllinux_exe': '_musllinux', + 'musllinux_aarch64_exe': '_musllinux_aarch64', } _NON_UPDATEABLE_REASONS = { From b6030e71ae13b6fb4f16139ef243079b1f3acb7b Mon Sep 17 00:00:00 2001 From: bashonly Date: Wed, 13 Aug 2025 04:34:24 -0500 Subject: [PATCH 12/31] Verify armv7l and musllinux exes, do not use piwheels Authored by: bashonly --- .github/workflows/build.yml | 55 ++++++++++++++++++--------- bundle/docker/compose.yml | 44 +++++++++++++++++++-- bundle/docker/linux/verify.Dockerfile | 7 ++++ bundle/docker/linux/verify.sh | 22 +++++++++++ 4 files changed, 107 insertions(+), 21 deletions(-) create mode 100644 bundle/docker/linux/verify.Dockerfile create mode 100755 bundle/docker/linux/verify.sh diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 6901aff009..4f2c2db9b4 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -164,21 +164,37 @@ jobs: CHANNEL: ${{ inputs.channel }} ORIGIN: ${{ needs.process.outputs.origin }} VERSION: ${{ inputs.version }} + SERVICE: linux_${{ matrix.platform }} run: | - mkdir ~/build + mkdir -p ~/build cd bundle/docker - docker compose up --build linux_${{ matrix.platform }} + docker compose up --build --exit-code-from "${SERVICE}" "${SERVICE}" + docker compose down sudo chown "${USER}:docker" ~/build/${{ matrix.exe }} - name: Verify --update-to if: vars.UPDATE_TO_VERIFICATION && matrix.platform != 'armv7l' run: | chmod +x ~/build/${{ matrix.exe }} - cp ~/build/${{ matrix.exe }} ~/build/${{ matrix.exe }}_downgraded + mkdir -p ~/testing + cp ~/build/${{ matrix.exe }} ~/testing/${{ matrix.exe }}_downgraded version="$(~/build/${{ matrix.exe }} --version)" - ~/build/${{ matrix.exe }}_downgraded -v --update-to yt-dlp/yt-dlp@2023.03.04 - downgraded_version="$(~/build/${{ matrix.exe }}_downgraded --version)" - rm -f "${{ matrix.exe }}_downgraded" + ~/testing/${{ matrix.exe }}_downgraded -v --update-to yt-dlp/yt-dlp@2023.03.04 + downgraded_version="$(~/testing/${{ matrix.exe }}_downgraded --version)" [[ "$version" != "$downgraded_version" ]] + # TEMPORARY: + ~/build/${{ matrix.exe }} -v --print-traffic -o- --impersonate chrome "https://tls.browserleaks.com/json" | cat + - name: Verify --update-to for armv7l + if: vars.UPDATE_TO_VERIFICATION && matrix.platform == 'armv7l' + env: + EXE_NAME: ${{ matrix.exe }} + CHANNEL: ${{ inputs.channel }} + ORIGIN: ${{ needs.process.outputs.origin }} + VERSION: ${{ inputs.version }} + SERVICE: linux_${{ matrix.platform }}_verify + run: | + cd bundle/docker + docker compose up --build --exit-code-from "${SERVICE}" "${SERVICE}" + docker compose down - name: Upload artifacts uses: actions/upload-artifact@v4 with: @@ -209,21 +225,24 @@ jobs: CHANNEL: ${{ inputs.channel }} ORIGIN: ${{ needs.process.outputs.origin }} VERSION: ${{ inputs.version }} + SERVICE: musllinux_${{ matrix.platform }} run: | - mkdir ~/build + mkdir -p ~/build cd bundle/docker - docker compose up --build musllinux_${{ matrix.platform }} + docker compose up --build --exit-code-from "${SERVICE}" "${SERVICE}" + docker compose down sudo chown "${USER}:docker" ~/build/${{ matrix.exe }} - # - name: Verify --update-to - # if: vars.UPDATE_TO_VERIFICATION - # run: | - # chmod +x ~/build/${{ matrix.exe }} - # cp ~/build/${{ matrix.exe }} ~/build/${{ matrix.exe }}_downgraded - # version="$(~/build/${{ matrix.exe }} --version)" - # ~/build/${{ matrix.exe }}_downgraded -v --update-to yt-dlp/yt-dlp@2023.03.04 - # downgraded_version="$(~/build/${{ matrix.exe }}_downgraded --version)" - # rm -f "${{ matrix.exe }}_downgraded" - # [[ "$version" != "$downgraded_version" ]] + - name: Verify --update-to + env: + EXE_NAME: ${{ matrix.exe }} + CHANNEL: ${{ inputs.channel }} + ORIGIN: ${{ needs.process.outputs.origin }} + VERSION: ${{ inputs.version }} + SERVICE: musllinux_${{ matrix.platform }}_verify + run: | + cd bundle/docker + docker compose up --build --exit-code-from "${SERVICE}" "${SERVICE}" + docker compose down - name: Upload artifacts uses: actions/upload-artifact@v4 with: diff --git a/bundle/docker/compose.yml b/bundle/docker/compose.yml index 7b116b22e0..3f94ff0f3a 100644 --- a/bundle/docker/compose.yml +++ b/bundle/docker/compose.yml @@ -44,14 +44,24 @@ services: CHANNEL: ${CHANNEL} ORIGIN: ${ORIGIN} VERSION: ${VERSION} - PIP_EXTRA_INDEX_URL: https://www.piwheels.org/simple - PIP_PREFER_BINARY: "1" - USE_PYTHON_VERSION: "3.11" SKIP_ONEDIR_BUILD: "1" volumes: - ~/build:/build - ../..:/yt-dlp + linux_armv7l_verify: + build: + context: linux + dockerfile: verify.Dockerfile + platforms: + - "linux/arm/v7" + args: + IMAGE: arm32v7/debian:bullseye + environment: + EXE_NAME: ${EXE_NAME} + volumes: + - ~/build:/build + musllinux_x86_64: build: context: linux @@ -68,6 +78,20 @@ services: - ~/build:/build - ../..:/yt-dlp + musllinux_x86_64_verify: + build: + context: linux + dockerfile: verify.Dockerfile + platforms: + - "linux/amd64" + args: + IMAGE: alpine:3.22 + environment: + EXE_NAME: ${EXE_NAME} + SKIP_UPDATE_TO: "1" + volumes: + - ~/build:/build + musllinux_aarch64: build: context: linux @@ -83,3 +107,17 @@ services: volumes: - ~/build:/build - ../..:/yt-dlp + + musllinux_aarch64_verify: + build: + context: linux + dockerfile: verify.Dockerfile + platforms: + - "linux/arm64" + args: + IMAGE: alpine:3.22 + environment: + EXE_NAME: ${EXE_NAME} + SKIP_UPDATE_TO: "1" + volumes: + - ~/build:/build diff --git a/bundle/docker/linux/verify.Dockerfile b/bundle/docker/linux/verify.Dockerfile new file mode 100644 index 0000000000..82c1e34db9 --- /dev/null +++ b/bundle/docker/linux/verify.Dockerfile @@ -0,0 +1,7 @@ +ARG IMAGE=alpine:3.22 + +FROM $IMAGE AS image + +WORKDIR /testing +COPY verify.sh /verify.sh +ENTRYPOINT /verify.sh diff --git a/bundle/docker/linux/verify.sh b/bundle/docker/linux/verify.sh new file mode 100755 index 0000000000..02ef651714 --- /dev/null +++ b/bundle/docker/linux/verify.sh @@ -0,0 +1,22 @@ +#!/bin/sh +set -exuo + +chmod +x /build/${EXE_NAME} + +if [ -n "${SKIP_UPDATE_TO:-}" ]; then + /build/${EXE_NAME} -v || true + /build/${EXE_NAME} --version + + # TEMPORARY: + /build/${EXE_NAME} -v --print-traffic -o- --impersonate chrome "https://tls.browserleaks.com/json" | cat + + exit 0 +fi + +cp /build/${EXE_NAME} ./${EXE_NAME}_downgraded +version="$(/build/${EXE_NAME} --version)" +./${EXE_NAME}_downgraded -v --update-to yt-dlp/yt-dlp@2023.03.04 +downgraded_version="$(./${EXE_NAME}_downgraded --version)" +if [ "${version}" = "${downgraded_version}" ]; then + exit 1 +fi From 7585f1699674417f89751934f9ec708e65ead8b7 Mon Sep 17 00:00:00 2001 From: bashonly Date: Wed, 13 Aug 2025 06:53:02 -0500 Subject: [PATCH 13/31] Cache armv7l requirements and move to its own job Authored by: bashonly --- .github/workflows/build.yml | 95 +++++++++++++++++++++++++------ bundle/docker/compose.yml | 1 + bundle/docker/linux/entrypoint.sh | 4 +- bundle/docker/linux/verify.sh | 7 +-- 4 files changed, 83 insertions(+), 24 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 4f2c2db9b4..1f152f9de5 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -15,6 +15,9 @@ on: linux: default: true type: boolean + linux_armv7l: + default: true + type: boolean musllinux: default: true type: boolean @@ -53,7 +56,11 @@ on: default: true type: boolean linux: - description: yt-dlp_linux, yt-dlp_linux.zip, yt-dlp_linux_aarch64, yt-dlp_linux_aarch64.zip, yt-dlp_linux_armv7l + description: yt-dlp_linux, yt-dlp_linux.zip, yt-dlp_linux_aarch64, yt-dlp_linux_aarch64.zip + default: true + type: boolean + linux_armv7l: + description: yt-dlp_linux_armv7l default: true type: boolean musllinux: @@ -148,16 +155,8 @@ jobs: - exe: yt-dlp_linux_aarch64 platform: aarch64 runner: ubuntu-24.04-arm - - exe: yt-dlp_linux_armv7l - platform: armv7l - runner: ubuntu-24.04-arm steps: - uses: actions/checkout@v4 - - name: Set up QEMU - if: matrix.platform == 'armv7l' - uses: docker/setup-qemu-action@v3 - with: - platforms: linux/arm/v7 - name: Build executable env: EXE_NAME: ${{ matrix.exe }} @@ -172,7 +171,7 @@ jobs: docker compose down sudo chown "${USER}:docker" ~/build/${{ matrix.exe }} - name: Verify --update-to - if: vars.UPDATE_TO_VERIFICATION && matrix.platform != 'armv7l' + if: vars.UPDATE_TO_VERIFICATION run: | chmod +x ~/build/${{ matrix.exe }} mkdir -p ~/testing @@ -181,28 +180,87 @@ jobs: ~/testing/${{ matrix.exe }}_downgraded -v --update-to yt-dlp/yt-dlp@2023.03.04 downgraded_version="$(~/testing/${{ matrix.exe }}_downgraded --version)" [[ "$version" != "$downgraded_version" ]] - # TEMPORARY: - ~/build/${{ matrix.exe }} -v --print-traffic -o- --impersonate chrome "https://tls.browserleaks.com/json" | cat - - name: Verify --update-to for armv7l - if: vars.UPDATE_TO_VERIFICATION && matrix.platform == 'armv7l' + - name: Upload artifacts + uses: actions/upload-artifact@v4 + with: + name: build-bin-${{ github.job }}_${{ matrix.platform }} + path: | + ~/build/${{ matrix.exe }}* + compression-level: 0 + + linux_armv7l: + needs: process + if: inputs.linux_armv7l + runs-on: ubuntu-24.04-arm + steps: + - uses: actions/checkout@v4 + + - name: Restore cached requirements + id: restore-cache + uses: actions/cache/restore@v4 env: - EXE_NAME: ${{ matrix.exe }} + SEGMENT_DOWNLOAD_TIMEOUT_MINS: 1 + with: + path: | + ~/yt-dlp-build-venv + key: cache-reqs-${{ github.job }} + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + with: + platforms: linux/arm/v7 + + - name: Build executable + env: + EXE_NAME: yt-dlp_linux_armv7l CHANNEL: ${{ inputs.channel }} ORIGIN: ${{ needs.process.outputs.origin }} VERSION: ${{ inputs.version }} - SERVICE: linux_${{ matrix.platform }}_verify + SERVICE: linux_armv7l run: | + mkdir -p ~/build + mkdir -p ~/yt-dlp-build-venv cd bundle/docker docker compose up --build --exit-code-from "${SERVICE}" "${SERVICE}" docker compose down + sudo chown "${USER}:docker" ~/build/${EXE_NAME} + + - name: Verify --update-to + if: vars.UPDATE_TO_VERIFICATION + env: + EXE_NAME: yt-dlp_linux_armv7l + CHANNEL: ${{ inputs.channel }} + ORIGIN: ${{ needs.process.outputs.origin }} + VERSION: ${{ inputs.version }} + SERVICE: linux_armv7l_verify + run: | + cd bundle/docker + docker compose up --build --exit-code-from "${SERVICE}" "${SERVICE}" + docker compose down + - name: Upload artifacts uses: actions/upload-artifact@v4 with: - name: build-bin-${{ github.job }}_${{ matrix.platform }} + name: build-bin-${{ github.job }} path: | - ~/build/${{ matrix.exe }}* + ~/build/yt-dlp_linux_armv7l compression-level: 0 + - name: Cleanup cache + if: steps.restore-cache.outputs.cache-hit == 'true' + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + cache_key: cache-reqs-${{ github.job }} + run: | + gh cache delete "${cache_key}" + + - name: Cache requirements + uses: actions/cache/save@v4 + with: + path: | + ~/yt-dlp-build-venv + key: cache-reqs-${{ github.job }} + musllinux: needs: process if: inputs.musllinux @@ -459,6 +517,7 @@ jobs: - process - unix - linux + - linux_armv7l - musllinux - macos - windows diff --git a/bundle/docker/compose.yml b/bundle/docker/compose.yml index 3f94ff0f3a..706025b624 100644 --- a/bundle/docker/compose.yml +++ b/bundle/docker/compose.yml @@ -48,6 +48,7 @@ services: volumes: - ~/build:/build - ../..:/yt-dlp + - ~/yt-dlp-build-venv:/yt-dlp-build-venv linux_armv7l_verify: build: diff --git a/bundle/docker/linux/entrypoint.sh b/bundle/docker/linux/entrypoint.sh index 5e314cb2ae..82a29f48c9 100755 --- a/bundle/docker/linux/entrypoint.sh +++ b/bundle/docker/linux/entrypoint.sh @@ -9,8 +9,8 @@ function runpy { esac } -runpy -m venv ~/yt-dlp-build-venv -source ~/yt-dlp-build-venv/bin/activate +runpy -m venv /yt-dlp-build-venv +source /yt-dlp-build-venv/bin/activate runpy -m devscripts.install_deps -o --include build runpy -m devscripts.install_deps --include secretstorage --include curl-cffi --include pyinstaller runpy -m devscripts.make_lazy_extractors diff --git a/bundle/docker/linux/verify.sh b/bundle/docker/linux/verify.sh index 02ef651714..e547d059be 100755 --- a/bundle/docker/linux/verify.sh +++ b/bundle/docker/linux/verify.sh @@ -3,13 +3,12 @@ set -exuo chmod +x /build/${EXE_NAME} +# TEMPORARY: +/build/${EXE_NAME} -v --print-traffic -o- --impersonate chrome "https://tls.browserleaks.com/json" | cat + if [ -n "${SKIP_UPDATE_TO:-}" ]; then /build/${EXE_NAME} -v || true /build/${EXE_NAME} --version - - # TEMPORARY: - /build/${EXE_NAME} -v --print-traffic -o- --impersonate chrome "https://tls.browserleaks.com/json" | cat - exit 0 fi From 606f3e8c708100782bfd65ad0eef2a72c66d63d7 Mon Sep 17 00:00:00 2001 From: bashonly Date: Wed, 13 Aug 2025 07:12:21 -0500 Subject: [PATCH 14/31] Exclude curl-cffi from musllinux_aarch64 Authored by: bashonly --- README.md | 2 +- bundle/docker/compose.yml | 2 ++ bundle/docker/linux/entrypoint.sh | 11 ++++++++++- bundle/docker/linux/verify.sh | 5 +++-- 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 37514bf546..7e250ee23e 100644 --- a/README.md +++ b/README.md @@ -209,7 +209,7 @@ The following provide support for impersonating browser requests. This may be re * [**curl_cffi**](https://github.com/lexiforest/curl_cffi) (recommended) - Python binding for [curl-impersonate](https://github.com/lexiforest/curl-impersonate). Provides impersonation targets for Chrome, Edge and Safari. Licensed under [MIT](https://github.com/lexiforest/curl_cffi/blob/main/LICENSE) * Can be installed with the `curl-cffi` group, e.g. `pip install "yt-dlp[default,curl-cffi]"` - * Currently included in all builds *except* `yt-dlp_x86` (Windows 32-bit) and `yt-dlp` (Unix zipimport binary) + * Currently included in most builds *except* `yt-dlp` (Unix zipimport binary), `yt-dlp_x86` (Windows 32-bit) and `yt-dlp_musllinux_aarch64` ### Metadata diff --git a/bundle/docker/compose.yml b/bundle/docker/compose.yml index 706025b624..5f979e423d 100644 --- a/bundle/docker/compose.yml +++ b/bundle/docker/compose.yml @@ -105,6 +105,7 @@ services: CHANNEL: ${CHANNEL} ORIGIN: ${ORIGIN} VERSION: ${VERSION} + EXCLUDE_CURL_CFFI: "1" volumes: - ~/build:/build - ../..:/yt-dlp @@ -120,5 +121,6 @@ services: environment: EXE_NAME: ${EXE_NAME} SKIP_UPDATE_TO: "1" + EXCLUDE_CURL_CFFI: "1" volumes: - ~/build:/build diff --git a/bundle/docker/linux/entrypoint.sh b/bundle/docker/linux/entrypoint.sh index 82a29f48c9..e7a6a2e5bf 100755 --- a/bundle/docker/linux/entrypoint.sh +++ b/bundle/docker/linux/entrypoint.sh @@ -9,10 +9,19 @@ function runpy { esac } +INCLUDES=( + --include pyinstaller + --include secretstorage +) + +if [[ -z "${EXCLUDE_CURL_CFFI:-}" ]]; then + INCLUDES+=(--include curl-cffi) +fi + runpy -m venv /yt-dlp-build-venv source /yt-dlp-build-venv/bin/activate runpy -m devscripts.install_deps -o --include build -runpy -m devscripts.install_deps --include secretstorage --include curl-cffi --include pyinstaller +runpy -m devscripts.install_deps "${INCLUDES[@]}" runpy -m devscripts.make_lazy_extractors runpy devscripts/update-version.py -c "${CHANNEL}" -r "${ORIGIN}" "${VERSION}" diff --git a/bundle/docker/linux/verify.sh b/bundle/docker/linux/verify.sh index e547d059be..3fabcefa2a 100755 --- a/bundle/docker/linux/verify.sh +++ b/bundle/docker/linux/verify.sh @@ -3,8 +3,9 @@ set -exuo chmod +x /build/${EXE_NAME} -# TEMPORARY: -/build/${EXE_NAME} -v --print-traffic -o- --impersonate chrome "https://tls.browserleaks.com/json" | cat +if [ -n "${EXCLUDE_CURL_CFFI:-}" ]; then + /build/${EXE_NAME} -v --print-traffic -o- --impersonate chrome "https://tls.browserleaks.com/json" | cat +fi if [ -n "${SKIP_UPDATE_TO:-}" ]; then /build/${EXE_NAME} -v || true From 28171227d0cd3438cdd880098afd65271690d975 Mon Sep 17 00:00:00 2001 From: bashonly Date: Wed, 13 Aug 2025 07:31:45 -0500 Subject: [PATCH 15/31] give `linux_armv7l` permission to cleanup cache Authored by: bashonly --- .github/workflows/build.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1f152f9de5..0312bcd4b9 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -191,6 +191,9 @@ jobs: linux_armv7l: needs: process if: inputs.linux_armv7l + permissions: + contents: read + actions: write # For cleaning up cache runs-on: ubuntu-24.04-arm steps: - uses: actions/checkout@v4 From 340b25acfadd58faa8a5c3b031e0a09810db3da7 Mon Sep 17 00:00:00 2001 From: bashonly Date: Wed, 13 Aug 2025 07:34:15 -0500 Subject: [PATCH 16/31] Fix verify script Authored by: bashonly --- bundle/docker/linux/verify.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bundle/docker/linux/verify.sh b/bundle/docker/linux/verify.sh index 3fabcefa2a..11d0439dac 100755 --- a/bundle/docker/linux/verify.sh +++ b/bundle/docker/linux/verify.sh @@ -3,7 +3,7 @@ set -exuo chmod +x /build/${EXE_NAME} -if [ -n "${EXCLUDE_CURL_CFFI:-}" ]; then +if [ -z "${EXCLUDE_CURL_CFFI:-}" ]; then /build/${EXE_NAME} -v --print-traffic -o- --impersonate chrome "https://tls.browserleaks.com/json" | cat fi From 324df654e8a7c7a202811017504cf88bf9fbf105 Mon Sep 17 00:00:00 2001 From: bashonly Date: Wed, 13 Aug 2025 08:57:55 -0500 Subject: [PATCH 17/31] discontinue `linux_armv7l` master builds Authored by: bashonly --- .github/workflows/build.yml | 1 + .github/workflows/release.yml | 1 + 2 files changed, 2 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 0312bcd4b9..66f9697eaf 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -579,6 +579,7 @@ jobs: lockV2 yt-dlp/yt-dlp-master-builds 2024.10.22.060347 (?!\w+_exe).+ Python 3\.8 lockV2 yt-dlp/yt-dlp-master-builds 2024.10.22.060347 win(?:_x86)?_exe Python 3\.[78].+ Windows-(?:7-|2008ServerR2) lockV2 yt-dlp/yt-dlp-master-builds 2025.09.01.000000 darwin_legacy_exe .+ + lockV2 yt-dlp/yt-dlp-master-builds 2025.09.01.000000 linux_armv7l_exe .+ EOF - name: Sign checksum files diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 26b93e429c..a3686c4470 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -226,6 +226,7 @@ jobs: version: ${{ needs.prepare.outputs.version }} channel: ${{ needs.prepare.outputs.channel }} origin: ${{ needs.prepare.outputs.target_repo }} + linux_armv7l: ${{ inputs.source != 'master' }} # Skip for 'master' channel (push) releases permissions: contents: read packages: write # For package cache From 4be0b7f16c7b02ccbcaab41a7a9abd319a944f0f Mon Sep 17 00:00:00 2001 From: bashonly Date: Wed, 13 Aug 2025 09:56:15 -0500 Subject: [PATCH 18/31] verify linux exes in container too Authored by: bashonly --- .github/workflows/build.yml | 12 ++++++++++++ bundle/docker/compose.yml | 31 +++++++++++++++++++++++++++++-- 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 66f9697eaf..8a5ef1aac2 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -170,6 +170,18 @@ jobs: docker compose up --build --exit-code-from "${SERVICE}" "${SERVICE}" docker compose down sudo chown "${USER}:docker" ~/build/${{ matrix.exe }} + - name: Verify --update-to in container + if: vars.UPDATE_TO_VERIFICATION + env: + EXE_NAME: ${{ matrix.exe }} + CHANNEL: ${{ inputs.channel }} + ORIGIN: ${{ needs.process.outputs.origin }} + VERSION: ${{ inputs.version }} + SERVICE: linux_${{ matrix.platform }}_verify + run: | + cd bundle/docker + docker compose up --build --exit-code-from "${SERVICE}" "${SERVICE}" + docker compose down - name: Verify --update-to if: vars.UPDATE_TO_VERIFICATION run: | diff --git a/bundle/docker/compose.yml b/bundle/docker/compose.yml index 5f979e423d..438e751ceb 100644 --- a/bundle/docker/compose.yml +++ b/bundle/docker/compose.yml @@ -16,6 +16,19 @@ services: - ~/build:/build - ../..:/yt-dlp + linux_x86_64_verify: + build: + context: linux + dockerfile: verify.Dockerfile + platforms: + - "linux/amd64" + args: + IMAGE: quay.io/pypa/manylinux2014_x86_64:latest + environment: + EXE_NAME: ${EXE_NAME} + volumes: + - ~/build:/build + linux_aarch64: build: context: linux @@ -32,6 +45,20 @@ services: - ~/build:/build - ../..:/yt-dlp + linux_aarch64_verify: + build: + context: linux + dockerfile: verify.Dockerfile + platforms: + - "linux/arm64" + args: + IMAGE: quay.io/pypa/manylinux2014_aarch64:latest + environment: + EXE_NAME: ${EXE_NAME} + SKIP_UPDATE_TO: "1" # TODO: remove when there is a glibc2.17 aarch64 release to --update-to + volumes: + - ~/build:/build + linux_armv7l: build: context: linux @@ -89,7 +116,7 @@ services: IMAGE: alpine:3.22 environment: EXE_NAME: ${EXE_NAME} - SKIP_UPDATE_TO: "1" + SKIP_UPDATE_TO: "1" # TODO: remove when there is a musllinux_aarch64 release to --update-to volumes: - ~/build:/build @@ -120,7 +147,7 @@ services: IMAGE: alpine:3.22 environment: EXE_NAME: ${EXE_NAME} - SKIP_UPDATE_TO: "1" + SKIP_UPDATE_TO: "1" # TODO: remove when there is a musllinux_aarch64 release to --update-to EXCLUDE_CURL_CFFI: "1" volumes: - ~/build:/build From 36cd6919e025bb62751db28b06f24b99d0c3cd49 Mon Sep 17 00:00:00 2001 From: bashonly Date: Wed, 13 Aug 2025 11:35:20 -0500 Subject: [PATCH 19/31] script improvements Authored by: bashonly --- .github/workflows/build.yml | 4 ++-- bundle/docker/linux/entrypoint.sh | 6 ++++-- bundle/docker/linux/verify.sh | 5 +++-- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8a5ef1aac2..9aa189ce16 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -240,7 +240,7 @@ jobs: docker compose down sudo chown "${USER}:docker" ~/build/${EXE_NAME} - - name: Verify --update-to + - name: Verify --update-to in container if: vars.UPDATE_TO_VERIFICATION env: EXE_NAME: yt-dlp_linux_armv7l @@ -305,7 +305,7 @@ jobs: docker compose up --build --exit-code-from "${SERVICE}" "${SERVICE}" docker compose down sudo chown "${USER}:docker" ~/build/${{ matrix.exe }} - - name: Verify --update-to + - name: Verify --update-to in container env: EXE_NAME: ${{ matrix.exe }} CHANNEL: ${{ inputs.channel }} diff --git a/bundle/docker/linux/entrypoint.sh b/bundle/docker/linux/entrypoint.sh index e7a6a2e5bf..e6e8710f85 100755 --- a/bundle/docker/linux/entrypoint.sh +++ b/bundle/docker/linux/entrypoint.sh @@ -32,5 +32,7 @@ if [[ -z "${SKIP_ONEDIR_BUILD:-}" ]]; then popd fi -runpy -m bundle.pyinstaller -mv "./dist/${EXE_NAME}" /build/ +if [[ -z "${SKIP_ONEFILE_BUILD:-}" ]]; then + runpy -m bundle.pyinstaller + mv "./dist/${EXE_NAME}" /build/ +fi diff --git a/bundle/docker/linux/verify.sh b/bundle/docker/linux/verify.sh index 11d0439dac..1cb051ecf0 100755 --- a/bundle/docker/linux/verify.sh +++ b/bundle/docker/linux/verify.sh @@ -1,10 +1,11 @@ #!/bin/sh -set -exuo +set -eu chmod +x /build/${EXE_NAME} if [ -z "${EXCLUDE_CURL_CFFI:-}" ]; then - /build/${EXE_NAME} -v --print-traffic -o- --impersonate chrome "https://tls.browserleaks.com/json" | cat + /build/${EXE_NAME} -v --print-traffic --impersonate chrome "https://tls.browserleaks.com/json" -o ./resp.json + cat ./resp.json fi if [ -n "${SKIP_UPDATE_TO:-}" ]; then From e338074934da1bba9e21a6bcbbcb83845642decc Mon Sep 17 00:00:00 2001 From: bashonly Date: Wed, 13 Aug 2025 17:31:29 -0500 Subject: [PATCH 20/31] identify staticx builds as `linux_static_exe` Authored by: bashonly --- yt_dlp/update.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/yt_dlp/update.py b/yt_dlp/update.py index 073c80ae57..8b30b0dbcd 100644 --- a/yt_dlp/update.py +++ b/yt_dlp/update.py @@ -58,11 +58,20 @@ def _get_variant_and_executable_path(): """@returns (variant, executable_path)""" if getattr(sys, 'frozen', False): path = sys.executable - # py2exe is unsupported but we should still correctly identify it for debugging purposes + + # py2exe: No longer officially supported, but still identify it to block updates if not hasattr(sys, '_MEIPASS'): return 'py2exe', path + + # staticx builds: sys.executable returns a /tmp/ path + # No longer officially supported, but still identify them to block updates + # Ref: https://staticx.readthedocs.io/en/latest/usage.html#run-time-information + if static_exe_path := os.getenv('STATICX_PROG_PATH'): + return 'linux_static_exe', static_exe_path + # We know it's a PyInstaller bundle, but is it "onedir" or "onefile"? suffix = 'dir' if sys._MEIPASS == os.path.dirname(path) else 'exe' + if sys.platform == 'darwin': # darwin_legacy_exe is no longer supported, but still identify it to block updates machine = '_legacy' if version_tuple(platform.mac_ver()[0]) < (10, 15) else '' @@ -81,10 +90,6 @@ def _get_variant_and_executable_path(): # See: https://github.com/yt-dlp/yt-dlp/issues/11813 elif machine[1:] == 'aarch64' and not is_64bits: machine = '_armv7l' - # sys.executable returns a /tmp/ path for staticx builds (linux_static) - # Ref: https://staticx.readthedocs.io/en/latest/usage.html#run-time-information - if static_exe_path := os.getenv('STATICX_PROG_PATH'): - path = static_exe_path return f'{system_platform}{machine}_{suffix}', path From 9f350f3b1cc53690ae5cb0e06632d02ed18509e9 Mon Sep 17 00:00:00 2001 From: bashonly Date: Thu, 14 Aug 2025 23:30:46 -0500 Subject: [PATCH 21/31] Remove `linux_armv7l_exe`, add `linux_armv7l_dir` Authored by: bashonly --- .github/workflows/build.yml | 8 +++++--- .github/workflows/release-master.yml | 1 - .github/workflows/release-nightly.yml | 1 - .github/workflows/release.yml | 11 +++++++++-- README.md | 2 +- bundle/docker/compose.yml | 3 ++- bundle/docker/linux/verify.sh | 26 +++++++++++++++++--------- yt_dlp/update.py | 13 ------------- 8 files changed, 34 insertions(+), 31 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 425d8b793a..2a33683590 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -60,7 +60,7 @@ on: default: true type: boolean linux_armv7l: - description: yt-dlp_linux_armv7l + description: yt-dlp_linux_armv7l.zip default: true type: boolean musllinux: @@ -238,7 +238,6 @@ jobs: cd bundle/docker docker compose up --build --exit-code-from "${SERVICE}" "${SERVICE}" docker compose down - sudo chown "${USER}:docker" ~/build/${EXE_NAME} - name: Verify --update-to in container if: vars.UPDATE_TO_VERIFICATION @@ -258,7 +257,7 @@ jobs: with: name: build-bin-${{ github.job }} path: | - ~/build/yt-dlp_linux_armv7l + ~/build/yt-dlp_linux_armv7l.zip compression-level: 0 - name: Cleanup cache @@ -569,6 +568,7 @@ jobs: lock 2024.10.22 zip Python 3\.8 lock 2024.10.22 win(?:_x86)?_exe Python 3\.[78].+ Windows-(?:7-|2008ServerR2) lock 2025.08.11 darwin_legacy_exe .+ + lock 2025.09.01 linux_armv7l_exe .+ lockV2 yt-dlp/yt-dlp 2022.08.18.36 .+ Python 3\.6 lockV2 yt-dlp/yt-dlp 2023.11.16 (?!win_x86_exe).+ Python 3\.7 lockV2 yt-dlp/yt-dlp 2023.11.16 win_x86_exe .+ Windows-(?:Vista|2008Server) @@ -577,6 +577,7 @@ jobs: lockV2 yt-dlp/yt-dlp 2024.10.22 zip Python 3\.8 lockV2 yt-dlp/yt-dlp 2024.10.22 win(?:_x86)?_exe Python 3\.[78].+ Windows-(?:7-|2008ServerR2) lockV2 yt-dlp/yt-dlp 2025.08.11 darwin_legacy_exe .+ + lockV2 yt-dlp/yt-dlp 2025.09.01 linux_armv7l_exe .+ lockV2 yt-dlp/yt-dlp-nightly-builds 2023.11.15.232826 (?!win_x86_exe).+ Python 3\.7 lockV2 yt-dlp/yt-dlp-nightly-builds 2023.11.15.232826 win_x86_exe .+ Windows-(?:Vista|2008Server) lockV2 yt-dlp/yt-dlp-nightly-builds 2024.10.22.051025 py2exe .+ @@ -584,6 +585,7 @@ jobs: lockV2 yt-dlp/yt-dlp-nightly-builds 2024.10.22.051025 zip Python 3\.8 lockV2 yt-dlp/yt-dlp-nightly-builds 2024.10.22.051025 win(?:_x86)?_exe Python 3\.[78].+ Windows-(?:7-|2008ServerR2) lockV2 yt-dlp/yt-dlp-nightly-builds 2025.08.12.233030 darwin_legacy_exe .+ + lockV2 yt-dlp/yt-dlp-nightly-builds 2025.09.01.000000 linux_armv7l_exe .+ lockV2 yt-dlp/yt-dlp-master-builds 2023.11.15.232812 (?!win_x86_exe).+ Python 3\.7 lockV2 yt-dlp/yt-dlp-master-builds 2023.11.15.232812 win_x86_exe .+ Windows-(?:Vista|2008Server) lockV2 yt-dlp/yt-dlp-master-builds 2024.10.22.045052 py2exe .+ diff --git a/.github/workflows/release-master.yml b/.github/workflows/release-master.yml index 78445e417e..132fc4a928 100644 --- a/.github/workflows/release-master.yml +++ b/.github/workflows/release-master.yml @@ -24,7 +24,6 @@ jobs: source: master permissions: contents: write - packages: write # For package cache actions: write # For cleaning up cache id-token: write # mandatory for trusted publishing secrets: inherit diff --git a/.github/workflows/release-nightly.yml b/.github/workflows/release-nightly.yml index 8f72844058..d35e4ef077 100644 --- a/.github/workflows/release-nightly.yml +++ b/.github/workflows/release-nightly.yml @@ -37,7 +37,6 @@ jobs: source: nightly permissions: contents: write - packages: write # For package cache actions: write # For cleaning up cache id-token: write # mandatory for trusted publishing secrets: inherit diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a3686c4470..662f641dce 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -14,6 +14,10 @@ on: required: false default: '' type: string + linux_armv7l: + required: false + default: false + type: boolean prerelease: required: false default: true @@ -43,6 +47,10 @@ on: required: false default: '' type: string + linux_armv7l: + description: Include linux_armv7l + default: true + type: boolean prerelease: description: Pre-release default: false @@ -226,10 +234,9 @@ jobs: version: ${{ needs.prepare.outputs.version }} channel: ${{ needs.prepare.outputs.channel }} origin: ${{ needs.prepare.outputs.target_repo }} - linux_armv7l: ${{ inputs.source != 'master' }} # Skip for 'master' channel (push) releases + linux_armv7l: ${{ inputs.linux_armv7l }} permissions: contents: read - packages: write # For package cache actions: write # For cleaning up cache secrets: GPG_SIGNING_KEY: ${{ secrets.GPG_SIGNING_KEY }} diff --git a/README.md b/README.md index 7e250ee23e..6b3831e87e 100644 --- a/README.md +++ b/README.md @@ -110,13 +110,13 @@ File|Description [yt-dlp_linux.zip](https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp_linux.zip)|Unpackaged Linux (glibc 2.17+) x86_64 executable (no auto-update) [yt-dlp_linux_aarch64](https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp_linux_aarch64)|Linux (glibc 2.17+) standalone aarch64 binary [yt-dlp_linux_aarch64.zip](https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp_linux_aarch64.zip)|Unpackaged Linux (glibc 2.17+) aarch64 executable (no auto-update) -[yt-dlp_linux_armv7l](https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp_linux_armv7l)|Linux (glibc 2.31+) standalone armv7l binary [yt-dlp_musllinux](https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp_musllinux)|Linux (musl 1.2+) standalone x86_64 binary [yt-dlp_musllinux.zip](https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp_musllinux.zip)|Unpackaged Linux (musl 1.2+) x86_64 executable (no auto-update) [yt-dlp_musllinux_aarch64](https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp_musllinux_aarch64)|Linux (musl 1.2+) standalone aarch64 binary [yt-dlp_musllinux_aarch64.zip](https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp_musllinux_aarch64.zip)|Unpackaged Linux (musl 1.2+) aarch64 executable (no auto-update) [yt-dlp_win.zip](https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp_win.zip)|Unpackaged Windows (Win8+) executable (no auto-update) [yt-dlp_macos.zip](https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp_macos.zip)|Unpackaged MacOS (10.15+) executable (no auto-update) +[yt-dlp_linux_armv7l.zip](https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp_linux_armv7l.zip)|Unpackaged Linux (glibc 2.31+) armv7l executable (no auto-update) #### Misc diff --git a/bundle/docker/compose.yml b/bundle/docker/compose.yml index 438e751ceb..b2db7e1895 100644 --- a/bundle/docker/compose.yml +++ b/bundle/docker/compose.yml @@ -71,7 +71,7 @@ services: CHANNEL: ${CHANNEL} ORIGIN: ${ORIGIN} VERSION: ${VERSION} - SKIP_ONEDIR_BUILD: "1" + SKIP_ONEFILE_BUILD: "1" volumes: - ~/build:/build - ../..:/yt-dlp @@ -87,6 +87,7 @@ services: IMAGE: arm32v7/debian:bullseye environment: EXE_NAME: ${EXE_NAME} + TEST_ONEDIR_BUILD: "1" volumes: - ~/build:/build diff --git a/bundle/docker/linux/verify.sh b/bundle/docker/linux/verify.sh index 1cb051ecf0..a76894de19 100755 --- a/bundle/docker/linux/verify.sh +++ b/bundle/docker/linux/verify.sh @@ -1,23 +1,31 @@ #!/bin/sh set -eu -chmod +x /build/${EXE_NAME} +if [ -n "${TEST_ONEDIR_BUILD:-}" ]; then + echo "Extracting zip to verify onedir build" + python3 -m zipfile -e "/build/${EXE_NAME}.zip" ./ +else + echo "Verifying onefile build" + cp "/build/${EXENAME}" ./ +fi + +chmod +x "./${EXE_NAME}" if [ -z "${EXCLUDE_CURL_CFFI:-}" ]; then - /build/${EXE_NAME} -v --print-traffic --impersonate chrome "https://tls.browserleaks.com/json" -o ./resp.json + "./${EXE_NAME}" -v --print-traffic --impersonate chrome "https://tls.browserleaks.com/json" -o ./resp.json cat ./resp.json fi -if [ -n "${SKIP_UPDATE_TO:-}" ]; then - /build/${EXE_NAME} -v || true - /build/${EXE_NAME} --version +if [ -n "${SKIP_UPDATE_TO:-}" ] || [ -n "${TEST_ONEDIR_BUILD:-}" ]; then + "./${EXE_NAME}" -v || true + "./${EXE_NAME}" --version exit 0 fi -cp /build/${EXE_NAME} ./${EXE_NAME}_downgraded -version="$(/build/${EXE_NAME} --version)" -./${EXE_NAME}_downgraded -v --update-to yt-dlp/yt-dlp@2023.03.04 -downgraded_version="$(./${EXE_NAME}_downgraded --version)" +cp "./${EXE_NAME}" "./${EXE_NAME}_downgraded" +version="$("./${EXE_NAME}" --version)" +"./${EXE_NAME}_downgraded" -v --update-to yt-dlp/yt-dlp@2023.03.04 +downgraded_version="$("./${EXE_NAME}_downgraded" --version)" if [ "${version}" = "${downgraded_version}" ]; then exit 1 fi diff --git a/yt_dlp/update.py b/yt_dlp/update.py index 8b30b0dbcd..35c06f8f59 100644 --- a/yt_dlp/update.py +++ b/yt_dlp/update.py @@ -126,7 +126,6 @@ _FILE_SUFFIXES = { 'darwin_exe': '_macos', 'linux_exe': '_linux', 'linux_aarch64_exe': '_linux_aarch64', - 'linux_armv7l_exe': '_linux_armv7l', 'musllinux_exe': '_musllinux', 'musllinux_aarch64_exe': '_musllinux_aarch64', } @@ -156,18 +155,6 @@ def _get_binary_name(): def _get_system_deprecation(): MIN_SUPPORTED, MIN_RECOMMENDED = (3, 9), (3, 10) - EXE_MSG_TMPL = ('Support for {} has been deprecated. ' - 'See https://github.com/yt-dlp/yt-dlp/{} for details.\n{}') - STOP_MSG = 'You may stop receiving updates on this version at any time!' - variant = detect_variant() - - # TODO: update message and remove after making one final release? - # Temporary until linux_armv7l executable builds are discontinued - if variant == 'linux_armv7l_exe': - return EXE_MSG_TMPL.format( - f'{variant} (the PyInstaller-bundled executable for the Linux armv7l platform)', - 'issues/13976', STOP_MSG) - if sys.version_info > MIN_RECOMMENDED: return None From 900fd9e2317a8aedcc99f948f99ba727f2d128b5 Mon Sep 17 00:00:00 2001 From: bashonly Date: Fri, 15 Aug 2025 00:02:06 -0500 Subject: [PATCH 22/31] Add cache warmer action Authored by: bashonly --- .github/workflows/cache-warmer.yml | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 .github/workflows/cache-warmer.yml diff --git a/.github/workflows/cache-warmer.yml b/.github/workflows/cache-warmer.yml new file mode 100644 index 0000000000..38195b766a --- /dev/null +++ b/.github/workflows/cache-warmer.yml @@ -0,0 +1,22 @@ +name: Keep cache warm +on: + workflow_dispatch: + schedule: + - cron: '0 22 1,6,11,16,21,27 * *' + + build: + if: | + vars.KEEP_CACHE_WARM != '' || github.event_name == 'workflow_dispatch' + uses: ./.github/workflows/build.yml + with: + version: '123456' + unix: false + linux: false + linux_armv7l: true + musllinux: false + macos: true + windows: false + windows32: false + permissions: + contents: read + actions: write # For cleaning up cache From 7e8b1fc3a742512e8288f13be9ce2ba05dccd1f7 Mon Sep 17 00:00:00 2001 From: bashonly Date: Fri, 15 Aug 2025 00:04:19 -0500 Subject: [PATCH 23/31] Fix typo Authored by: bashonly --- .github/workflows/cache-warmer.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/cache-warmer.yml b/.github/workflows/cache-warmer.yml index 38195b766a..44253eefb6 100644 --- a/.github/workflows/cache-warmer.yml +++ b/.github/workflows/cache-warmer.yml @@ -4,6 +4,7 @@ on: schedule: - cron: '0 22 1,6,11,16,21,27 * *' +jobs: build: if: | vars.KEEP_CACHE_WARM != '' || github.event_name == 'workflow_dispatch' From 9473ed31fe333cfbba6049015a377cbefeb893cb Mon Sep 17 00:00:00 2001 From: bashonly Date: Fri, 15 Aug 2025 00:20:42 -0500 Subject: [PATCH 24/31] python in verify container Authored by: bashonly --- bundle/docker/linux/verify.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bundle/docker/linux/verify.sh b/bundle/docker/linux/verify.sh index a76894de19..fc46ab4ecb 100755 --- a/bundle/docker/linux/verify.sh +++ b/bundle/docker/linux/verify.sh @@ -3,7 +3,7 @@ set -eu if [ -n "${TEST_ONEDIR_BUILD:-}" ]; then echo "Extracting zip to verify onedir build" - python3 -m zipfile -e "/build/${EXE_NAME}.zip" ./ + "${PYTHON:-python}" -m zipfile -e "/build/${EXE_NAME}.zip" ./ else echo "Verifying onefile build" cp "/build/${EXENAME}" ./ From 842d829e641832a617922168de2e9ff2aa870ac7 Mon Sep 17 00:00:00 2001 From: bashonly Date: Fri, 15 Aug 2025 01:08:59 -0500 Subject: [PATCH 25/31] fix verify script for onedir Authored by: bashonly --- bundle/docker/linux/verify.sh | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/bundle/docker/linux/verify.sh b/bundle/docker/linux/verify.sh index fc46ab4ecb..9263bf7b1c 100755 --- a/bundle/docker/linux/verify.sh +++ b/bundle/docker/linux/verify.sh @@ -3,7 +3,25 @@ set -eu if [ -n "${TEST_ONEDIR_BUILD:-}" ]; then echo "Extracting zip to verify onedir build" - "${PYTHON:-python}" -m zipfile -e "/build/${EXE_NAME}.zip" ./ + if command -v python3 >/dev/null 2>&1; then + python3 -m zipfile -e "/build/${EXE_NAME}.zip" ./ + else + echo "Attempting to install unzip" + if command -v dnf >/dev/null 2>&1; then + dnf -y install --allowerasing unzip + elif command -v yum >/dev/null 2>&1; then + yum -y install unzip + elif command -v apt-get >/dev/null 2>&1; then + DEBIAN_FRONTEND=noninteractive apt-get update -qq + DEBIAN_FRONTEND=noninteractive apt-get install -qq -y --no-install-recommends unzip + elif command -v apk >/dev/null 2>&1; then + apk add --no-cache unzip + else + echo "Unsupported image" + exit 1 + fi + unzip "/build/${EXE_NAME}.zip" -d ./ + fi else echo "Verifying onefile build" cp "/build/${EXENAME}" ./ From f0a6e028e0e5abf161b4ceaedea5419a142a2bb0 Mon Sep 17 00:00:00 2001 From: bashonly Date: Fri, 15 Aug 2025 01:27:28 -0500 Subject: [PATCH 26/31] add channel to cache warmer Authored by: bashonly --- .github/workflows/cache-warmer.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/cache-warmer.yml b/.github/workflows/cache-warmer.yml index 44253eefb6..e51c880a1b 100644 --- a/.github/workflows/cache-warmer.yml +++ b/.github/workflows/cache-warmer.yml @@ -11,6 +11,7 @@ jobs: uses: ./.github/workflows/build.yml with: version: '123456' + channel: stable unix: false linux: false linux_armv7l: true From 8c94ea871ab71b5a64f3e76464c76ed4b8659e56 Mon Sep 17 00:00:00 2001 From: bashonly Date: Fri, 15 Aug 2025 01:30:28 -0500 Subject: [PATCH 27/31] fix build step name Authored by: bashonly --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 2a33683590..e162444936 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -239,7 +239,7 @@ jobs: docker compose up --build --exit-code-from "${SERVICE}" "${SERVICE}" docker compose down - - name: Verify --update-to in container + - name: Verify executable if: vars.UPDATE_TO_VERIFICATION env: EXE_NAME: yt-dlp_linux_armv7l From 68678eb5e6d5b605e6e21db0479c104261c3c8a8 Mon Sep 17 00:00:00 2001 From: bashonly Date: Fri, 15 Aug 2025 01:43:13 -0500 Subject: [PATCH 28/31] step name/condition uniformity Authored by: bashonly --- .github/workflows/build.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e162444936..913e6f1de5 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -170,7 +170,7 @@ jobs: docker compose up --build --exit-code-from "${SERVICE}" "${SERVICE}" docker compose down sudo chown "${USER}:docker" ~/build/${{ matrix.exe }} - - name: Verify --update-to in container + - name: Verify executable in container if: vars.UPDATE_TO_VERIFICATION env: EXE_NAME: ${{ matrix.exe }} @@ -239,7 +239,7 @@ jobs: docker compose up --build --exit-code-from "${SERVICE}" "${SERVICE}" docker compose down - - name: Verify executable + - name: Verify executable in container if: vars.UPDATE_TO_VERIFICATION env: EXE_NAME: yt-dlp_linux_armv7l @@ -304,7 +304,8 @@ jobs: docker compose up --build --exit-code-from "${SERVICE}" "${SERVICE}" docker compose down sudo chown "${USER}:docker" ~/build/${{ matrix.exe }} - - name: Verify --update-to in container + - name: Verify executable in container + if: vars.UPDATE_TO_VERIFICATION env: EXE_NAME: ${{ matrix.exe }} CHANNEL: ${{ inputs.channel }} From 080e56243c9b49ab4ae7a3627c745336a0050111 Mon Sep 17 00:00:00 2001 From: bashonly Date: Fri, 15 Aug 2025 01:47:04 -0500 Subject: [PATCH 29/31] temp: test all onedir builds Authored by: bashonly --- bundle/docker/compose.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/bundle/docker/compose.yml b/bundle/docker/compose.yml index b2db7e1895..c406659705 100644 --- a/bundle/docker/compose.yml +++ b/bundle/docker/compose.yml @@ -26,6 +26,7 @@ services: IMAGE: quay.io/pypa/manylinux2014_x86_64:latest environment: EXE_NAME: ${EXE_NAME} + TEST_ONEDIR_BUILD: "1" # XXX: TEMPORARY volumes: - ~/build:/build @@ -56,6 +57,7 @@ services: environment: EXE_NAME: ${EXE_NAME} SKIP_UPDATE_TO: "1" # TODO: remove when there is a glibc2.17 aarch64 release to --update-to + TEST_ONEDIR_BUILD: "1" # XXX: TEMPORARY volumes: - ~/build:/build @@ -118,6 +120,7 @@ services: environment: EXE_NAME: ${EXE_NAME} SKIP_UPDATE_TO: "1" # TODO: remove when there is a musllinux_aarch64 release to --update-to + TEST_ONEDIR_BUILD: "1" # XXX: TEMPORARY volumes: - ~/build:/build @@ -150,5 +153,6 @@ services: EXE_NAME: ${EXE_NAME} SKIP_UPDATE_TO: "1" # TODO: remove when there is a musllinux_aarch64 release to --update-to EXCLUDE_CURL_CFFI: "1" + TEST_ONEDIR_BUILD: "1" # XXX: TEMPORARY volumes: - ~/build:/build From 8a91d773f74db317c1e09d773a889e8b6728825a Mon Sep 17 00:00:00 2001 From: bashonly Date: Fri, 15 Aug 2025 02:13:20 -0500 Subject: [PATCH 30/31] Revert "temp: test all onedir builds" This reverts commit 080e56243c9b49ab4ae7a3627c745336a0050111. --- bundle/docker/compose.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/bundle/docker/compose.yml b/bundle/docker/compose.yml index c406659705..b2db7e1895 100644 --- a/bundle/docker/compose.yml +++ b/bundle/docker/compose.yml @@ -26,7 +26,6 @@ services: IMAGE: quay.io/pypa/manylinux2014_x86_64:latest environment: EXE_NAME: ${EXE_NAME} - TEST_ONEDIR_BUILD: "1" # XXX: TEMPORARY volumes: - ~/build:/build @@ -57,7 +56,6 @@ services: environment: EXE_NAME: ${EXE_NAME} SKIP_UPDATE_TO: "1" # TODO: remove when there is a glibc2.17 aarch64 release to --update-to - TEST_ONEDIR_BUILD: "1" # XXX: TEMPORARY volumes: - ~/build:/build @@ -120,7 +118,6 @@ services: environment: EXE_NAME: ${EXE_NAME} SKIP_UPDATE_TO: "1" # TODO: remove when there is a musllinux_aarch64 release to --update-to - TEST_ONEDIR_BUILD: "1" # XXX: TEMPORARY volumes: - ~/build:/build @@ -153,6 +150,5 @@ services: EXE_NAME: ${EXE_NAME} SKIP_UPDATE_TO: "1" # TODO: remove when there is a musllinux_aarch64 release to --update-to EXCLUDE_CURL_CFFI: "1" - TEST_ONEDIR_BUILD: "1" # XXX: TEMPORARY volumes: - ~/build:/build From 433d9a5934699f04c35c2b660a727061191f1bb5 Mon Sep 17 00:00:00 2001 From: bashonly Date: Fri, 15 Aug 2025 02:19:58 -0500 Subject: [PATCH 31/31] [update] cleanup Authored by: bashonly --- yt_dlp/update.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/yt_dlp/update.py b/yt_dlp/update.py index 35c06f8f59..9483887a9f 100644 --- a/yt_dlp/update.py +++ b/yt_dlp/update.py @@ -71,13 +71,13 @@ def _get_variant_and_executable_path(): # We know it's a PyInstaller bundle, but is it "onedir" or "onefile"? suffix = 'dir' if sys._MEIPASS == os.path.dirname(path) else 'exe' + system_platform = remove_end(sys.platform, '32') - if sys.platform == 'darwin': + if system_platform == 'darwin': # darwin_legacy_exe is no longer supported, but still identify it to block updates machine = '_legacy' if version_tuple(platform.mac_ver()[0]) < (10, 15) else '' return f'darwin{machine}_{suffix}', path - system_platform = remove_end(sys.platform, '32') if system_platform == 'linux' and platform.libc_ver()[0] != 'glibc': system_platform = 'musllinux'