git -C taps/ push
+ build_linux_arm:
+ permissions:
+ packages: write # for Creating cache
+ runs-on: ubuntu-latest
+ needs: prepare
+ strategy:
+ matrix:
+ architecture:
+ - armv7
+ - aarch64
+
+ steps:
+ - uses: actions/checkout@v3
+ with:
+ path: ./repo
+ - name: Virtualized Install, Prepare & Build
+ uses: yt-dlp/run-on-arch-action@v2
+ with:
+ githubToken: ${{ github.token }} # To cache image
+ arch: ${{ matrix.architecture }}
+ distro: ubuntu18.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 python3.8 python3.8-dev python3.8-distutils python3-pip
+ python3.8 -m pip install -U pip setuptools wheel
+ # Cannot access requirements.txt from the repo directory at this stage
+ python3.8 -m pip install -U Pyinstaller mutagen pycryptodomex websockets brotli certifi
+
+ run: |
+ cd repo
+ python3.8 -m pip install -U Pyinstaller -r requirements.txt # Cached version may be out of date
+ python3.8 devscripts/update-version.py ${{ needs.prepare.outputs.version_suffix }}
+ python3.8 devscripts/make_lazy_extractors.py
+ python3.8 pyinst.py
+
+ - name: Upload artifacts
+ uses: actions/upload-artifact@v3
+ with:
+ path: | # run-on-arch-action designates armv7l as armv7
+ repo/dist/yt-dlp_linux_${{ (matrix.architecture == 'armv7' && 'armv7l') || matrix.architecture }}
+
+
build_macos:
runs-on: macos-11
needs: prepare
python-version: '3.8'
- name: Install Requirements
run: | # Custom pyinstaller built with https://github.com/yt-dlp/pyinstaller-builds
- python -m pip install --upgrade pip setuptools wheel py2exe
- pip install "https://yt-dlp.github.io/Pyinstaller-Builds/x86_64/pyinstaller-5.3-py3-none-any.whl" -r requirements.txt
+ python -m pip install -U pip setuptools wheel py2exe
+ pip install -U "https://yt-dlp.github.io/Pyinstaller-Builds/x86_64/pyinstaller-5.3-py3-none-any.whl" -r requirements.txt
- name: Prepare
run: |
architecture: 'x86'
- name: Install Requirements
run: |
- python -m pip install --upgrade pip setuptools wheel
- pip install "https://yt-dlp.github.io/Pyinstaller-Builds/i686/pyinstaller-5.3-py3-none-any.whl" -r requirements.txt
+ python -m pip install -U pip setuptools wheel
+ pip install -U "https://yt-dlp.github.io/Pyinstaller-Builds/i686/pyinstaller-5.3-py3-none-any.whl" -r requirements.txt
- name: Prepare
run: |
permissions:
contents: write # for action-gh-release
runs-on: ubuntu-latest
- needs: [prepare, build_unix, build_windows, build_windows32, build_macos, build_macos_legacy]
+ needs: [prepare, build_unix, build_linux_arm, build_windows, build_windows32, build_macos, build_macos_legacy]
steps:
- uses: actions/checkout@v3
sha256sum artifact/yt-dlp_macos | awk '{print $1 " yt-dlp_macos"}' >> SHA2-256SUMS
sha256sum artifact/yt-dlp_macos.zip | awk '{print $1 " yt-dlp_macos.zip"}' >> SHA2-256SUMS
sha256sum artifact/yt-dlp_macos_legacy | awk '{print $1 " yt-dlp_macos_legacy"}' >> SHA2-256SUMS
+ sha256sum artifact/yt-dlp_linux_armv7l | awk '{print $1 " yt-dlp_linux_armv7l"}' >> SHA2-256SUMS
+ sha256sum artifact/yt-dlp_linux_aarch64 | awk '{print $1 " yt-dlp_linux_aarch64"}' >> SHA2-256SUMS
sha256sum artifact/dist/yt-dlp_linux | awk '{print $1 " yt-dlp_linux"}' >> SHA2-256SUMS
sha256sum artifact/dist/yt-dlp_linux.zip | awk '{print $1 " yt-dlp_linux.zip"}' >> SHA2-256SUMS
sha512sum artifact/yt-dlp | awk '{print $1 " yt-dlp"}' >> SHA2-512SUMS
sha512sum artifact/yt-dlp_macos | awk '{print $1 " yt-dlp_macos"}' >> SHA2-512SUMS
sha512sum artifact/yt-dlp_macos.zip | awk '{print $1 " yt-dlp_macos.zip"}' >> SHA2-512SUMS
sha512sum artifact/yt-dlp_macos_legacy | awk '{print $1 " yt-dlp_macos_legacy"}' >> SHA2-512SUMS
+ sha512sum artifact/yt-dlp_linux_armv7l | awk '{print $1 " yt-dlp_linux_armv7l"}' >> SHA2-512SUMS
+ sha512sum artifact/yt-dlp_linux_aarch64 | awk '{print $1 " yt-dlp_linux_aarch64"}' >> SHA2-512SUMS
sha512sum artifact/dist/yt-dlp_linux | awk '{print $1 " yt-dlp_linux"}' >> SHA2-512SUMS
sha512sum artifact/dist/yt-dlp_linux.zip | awk '{print $1 " yt-dlp_linux.zip"}' >> SHA2-512SUMS
artifact/yt-dlp_macos
artifact/yt-dlp_macos.zip
artifact/yt-dlp_macos_legacy
+ artifact/yt-dlp_linux_armv7l
+ artifact/yt-dlp_linux_aarch64
artifact/dist/yt-dlp_linux
artifact/dist/yt-dlp_linux.zip
_update_spec
[yt-dlp_min.exe](https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp_min.exe)|Windows (Win7 SP1+) standalone x64 binary built with `py2exe`<br/> ([Not recommended](#standalone-py2exe-builds-windows))
[yt-dlp_linux](https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp_linux)|Linux standalone x64 binary
[yt-dlp_linux.zip](https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp_linux.zip)|Unpackaged Linux executable (no auto-update)
+[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_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
from devscripts.utils import read_version
-OS_NAME, MACHINE, ARCH = sys.platform, platform.machine(), platform.architecture()[0][:2]
-if MACHINE in ('x86_64', 'AMD64') or ('i' in MACHINE and '86' in MACHINE):
- # NB: Windows x86 has MACHINE = AMD64 irrespective of bitness
+OS_NAME, MACHINE, ARCH = sys.platform, platform.machine().lower(), platform.architecture()[0][:2]
+if MACHINE in ('x86', 'x86_64', 'amd64', 'i386', 'i686'):
MACHINE = 'x86' if ARCH == '32' else ''
name = '_'.join(filter(None, (
'yt-dlp',
{'win32': '', 'darwin': 'macos'}.get(OS_NAME, OS_NAME),
- MACHINE
+ MACHINE,
)))
return name, ''.join(filter(None, (
'dist/',
Popen,
cached_method,
deprecation_warning,
+ remove_end,
shell_quote,
system_identifier,
traverse_obj,
return 'py2exe', path
if sys._MEIPASS == os.path.dirname(path):
return f'{sys.platform}_dir', path
- if sys.platform == 'darwin' and version_tuple(platform.mac_ver()[0]) < (10, 15):
- return 'darwin_legacy_exe', path
- return f'{sys.platform}_exe', path
+ if sys.platform == 'darwin':
+ machine = '_legacy' if version_tuple(platform.mac_ver()[0]) < (10, 15) else ''
+ else:
+ machine = f'_{platform.machine().lower()}'
+ # Ref: https://en.wikipedia.org/wiki/Uname#Examples
+ if machine[1:] in ('x86', 'x86_64', 'amd64', 'i386', 'i686'):
+ machine = '_x86' if platform.architecture()[0][:2] == '32' else ''
+ return f'{remove_end(sys.platform, "32")}{machine}_exe', path
path = os.path.dirname(__file__)
if isinstance(__loader__, zipimporter):
_FILE_SUFFIXES = {
'zip': '',
'py2exe': '_min.exe',
- 'win32_exe': '.exe',
+ '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',
}
_NON_UPDATEABLE_REASONS = {
@functools.cached_property
def release_name(self):
"""The release filename"""
- label = _FILE_SUFFIXES[detect_variant()]
- if label and platform.architecture()[0][:2] == '32':
- label = f'_x86{label}'
- return f'yt-dlp{label}'
+ return f'yt-dlp{_FILE_SUFFIXES[detect_variant()]}'
@functools.cached_property
def release_hash(self):
with contextlib.suppress(OSError): # We may not have access to the executable
libc_ver = platform.libc_ver()
- return 'Python %s (%s %s) - %s (%s%s)' % (
+ return 'Python %s (%s %s %s) - %s (%s%s)' % (
platform.python_version(),
python_implementation,
+ platform.machine(),
platform.architecture()[0],
platform.platform(),
ssl.OPENSSL_VERSION,