diff --git a/CONTRIBUTORS b/CONTRIBUTORS index f20b4ce172..629ef7f74a 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -4,6 +4,7 @@ coletdjnz/colethedj (collaborator) Ashish0804 (collaborator) bashonly (collaborator) Grub4K (collaborator) +seproDev (collaborator) h-h-h-h pauldubois98 nixxo @@ -403,7 +404,6 @@ rebane2001 road-master rohieb sdht0 -seproDev Hill-98 LXYan2333 mushbite @@ -793,3 +793,10 @@ moonshinerd R0hanW ShockedPlot7560 swayll +atsushi2965 +barryvan +injust +iribeirocampos +rolandcrosby +Sojiroh +tchebb diff --git a/Changelog.md b/Changelog.md index 7205b95aa3..61ad25f1eb 100644 --- a/Changelog.md +++ b/Changelog.md @@ -4,6 +4,79 @@ # Changelog # To create a release, dispatch the https://github.com/yt-dlp/yt-dlp/actions/workflows/release.yml workflow on master --> +### 2025.08.11 + +#### Important changes +- **The minimum *recommended* Python version has been raised to 3.10** +Since Python 3.9 will reach end-of-life in October 2025, support for it will be dropped soon. [Read more](https://github.com/yt-dlp/yt-dlp/issues/13858) +- **darwin_legacy_exe builds are being discontinued** +This release's `yt-dlp_macos_legacy` binary will likely be the last one. [Read more](https://github.com/yt-dlp/yt-dlp/issues/13857) +- **linux_armv7l_exe builds are being discontinued** +This release's `yt-dlp_linux_armv7l` binary could be the last one. [Read more](https://github.com/yt-dlp/yt-dlp/issues/13976) + +#### Core changes +- [Deprecate `darwin_legacy_exe` support](https://github.com/yt-dlp/yt-dlp/commit/cc5a5caac5fbc0d605b52bde0778d6fd5f97b5ab) ([#13857](https://github.com/yt-dlp/yt-dlp/issues/13857)) by [bashonly](https://github.com/bashonly) +- [Deprecate `linux_armv7l_exe` support](https://github.com/yt-dlp/yt-dlp/commit/c76ce28e06c816eb5b261dfb6aff6e69dd9b7382) ([#13978](https://github.com/yt-dlp/yt-dlp/issues/13978)) by [bashonly](https://github.com/bashonly) +- [Raise minimum recommended Python version to 3.10](https://github.com/yt-dlp/yt-dlp/commit/23c658b9cbe34a151f8f921ab1320bb5d4e40a4d) ([#13859](https://github.com/yt-dlp/yt-dlp/issues/13859)) by [bashonly](https://github.com/bashonly) +- [Warn when yt-dlp is severely outdated](https://github.com/yt-dlp/yt-dlp/commit/662af5bb8307ec3ff8ab0857f1159922d64792f0) ([#13937](https://github.com/yt-dlp/yt-dlp/issues/13937)) by [seproDev](https://github.com/seproDev) +- **cookies**: [Load cookies with float `expires` timestamps](https://github.com/yt-dlp/yt-dlp/commit/28b68f687561468e0c664dcb430707458970019f) ([#13873](https://github.com/yt-dlp/yt-dlp/issues/13873)) by [bashonly](https://github.com/bashonly) +- **utils** + - [Add `WINDOWS_VT_MODE` to globals](https://github.com/yt-dlp/yt-dlp/commit/eed94c7306d4ecdba53ad8783b1463a9af5c97f1) ([#12460](https://github.com/yt-dlp/yt-dlp/issues/12460)) by [Grub4K](https://github.com/Grub4K) + - `parse_resolution`: [Support width-only pattern](https://github.com/yt-dlp/yt-dlp/commit/4385480795acda35667be008d0bf26b46e9d65b4) ([#13802](https://github.com/yt-dlp/yt-dlp/issues/13802)) by [doe1080](https://github.com/doe1080) + - `random_user_agent`: [Bump versions](https://github.com/yt-dlp/yt-dlp/commit/c59ad2b066bbccd3cc4eed580842f961bce7dd4a) ([#13543](https://github.com/yt-dlp/yt-dlp/issues/13543)) by [bashonly](https://github.com/bashonly) + +#### Extractor changes +- **archive.org**: [Fix metadata extraction](https://github.com/yt-dlp/yt-dlp/commit/42ca3d601ee10cef89d698f72e2b5d44fab4f013) ([#13880](https://github.com/yt-dlp/yt-dlp/issues/13880)) by [bashonly](https://github.com/bashonly) +- **digitalconcerthall**: [Fix formats extraction](https://github.com/yt-dlp/yt-dlp/commit/e8d2807296ccc603e031f5982623a8311f2a5119) ([#13948](https://github.com/yt-dlp/yt-dlp/issues/13948)) by [bashonly](https://github.com/bashonly) +- **eagleplatform**: [Remove extractors](https://github.com/yt-dlp/yt-dlp/commit/1fe83b0111277a6f214c5ec1819cfbf943508baf) ([#13469](https://github.com/yt-dlp/yt-dlp/issues/13469)) by [doe1080](https://github.com/doe1080) +- **fauliolive** + - [Add extractor](https://github.com/yt-dlp/yt-dlp/commit/3e609b2cedd285739bf82c7af7853735092070a4) ([#13421](https://github.com/yt-dlp/yt-dlp/issues/13421)) by [CasperMcFadden95](https://github.com/CasperMcFadden95), [seproDev](https://github.com/seproDev) + - [Support Bahry TV](https://github.com/yt-dlp/yt-dlp/commit/daa1859be1b0e7d123da8b4e0988f2eb7bd47d15) ([#13850](https://github.com/yt-dlp/yt-dlp/issues/13850)) by [CasperMcFadden95](https://github.com/CasperMcFadden95) +- **fc2**: [Fix old video support](https://github.com/yt-dlp/yt-dlp/commit/cd31c319e3142622ec43c49485d196ed2835df05) ([#12633](https://github.com/yt-dlp/yt-dlp/issues/12633)) by [JChris246](https://github.com/JChris246), [seproDev](https://github.com/seproDev) +- **motherless**: [Fix extractor](https://github.com/yt-dlp/yt-dlp/commit/e8d49b1c7f11c7e282319395ca9c2a201304be41) ([#13960](https://github.com/yt-dlp/yt-dlp/issues/13960)) by [Grub4K](https://github.com/Grub4K) +- **n1info**: article: [Fix extractor](https://github.com/yt-dlp/yt-dlp/commit/6539ee1947d7885d3606da6365fd858308435a63) ([#13865](https://github.com/yt-dlp/yt-dlp/issues/13865)) by [u-spec-png](https://github.com/u-spec-png) +- **neteasemusic**: [Support XFF](https://github.com/yt-dlp/yt-dlp/commit/e8c2bf798b6707d27fecde66161172da69c7cd72) ([#11044](https://github.com/yt-dlp/yt-dlp/issues/11044)) by [c-basalt](https://github.com/c-basalt) +- **niconico**: [Fix error handling & improve metadata extraction](https://github.com/yt-dlp/yt-dlp/commit/05e553e9d1f57655d65c9811d05df38261601b85) ([#13240](https://github.com/yt-dlp/yt-dlp/issues/13240)) by [doe1080](https://github.com/doe1080) +- **parlview**: [Rework extractor](https://github.com/yt-dlp/yt-dlp/commit/485de69dbfeb7de7bcf9f7fe16d6c6ba9e81e1a0) ([#13788](https://github.com/yt-dlp/yt-dlp/issues/13788)) by [barryvan](https://github.com/barryvan) +- **plyrembed**: [Add extractor](https://github.com/yt-dlp/yt-dlp/commit/61d4cd0bc01be6ebe11fd53c2d3805d1a2058990) ([#13836](https://github.com/yt-dlp/yt-dlp/issues/13836)) by [seproDev](https://github.com/seproDev) +- **royalive**: [Support `en` URLs](https://github.com/yt-dlp/yt-dlp/commit/43dedbe6394bdd489193b15ee9690a62d1b82d94) ([#13908](https://github.com/yt-dlp/yt-dlp/issues/13908)) by [CasperMcFadden95](https://github.com/CasperMcFadden95) +- **rtve.es**: program: [Add extractor](https://github.com/yt-dlp/yt-dlp/commit/b831406a1d3be34c159835079d12bae624c43610) ([#12955](https://github.com/yt-dlp/yt-dlp/issues/12955)) by [meGAmeS1](https://github.com/meGAmeS1), [seproDev](https://github.com/seproDev) +- **shiey**: [Add extractor](https://github.com/yt-dlp/yt-dlp/commit/6ff135c31914ea8b5545f8d187c60e852cfde9bc) ([#13354](https://github.com/yt-dlp/yt-dlp/issues/13354)) by [iribeirocampos](https://github.com/iribeirocampos) +- **sportdeuschland**: [Support embedded player URLs](https://github.com/yt-dlp/yt-dlp/commit/30302df22b7b431ce920e0f7298cd10be9989967) ([#13833](https://github.com/yt-dlp/yt-dlp/issues/13833)) by [InvalidUsernameException](https://github.com/InvalidUsernameException) +- **sproutvideo**: [Fix extractor](https://github.com/yt-dlp/yt-dlp/commit/59765ecbc08d18005de7143fbb1d1caf90239471) ([#13813](https://github.com/yt-dlp/yt-dlp/issues/13813)) by [bashonly](https://github.com/bashonly) +- **tbs**: [Fix truTV support](https://github.com/yt-dlp/yt-dlp/commit/0adeb1e54b2d7e95cd19999e71013877850f8f41) ([#9683](https://github.com/yt-dlp/yt-dlp/issues/9683)) by [bashonly](https://github.com/bashonly), [ischmidt20](https://github.com/ischmidt20) +- **tbsjp**: [Fix extractor](https://github.com/yt-dlp/yt-dlp/commit/71f30921a2023dbb25c53fd1bb1399cac803116d) ([#13485](https://github.com/yt-dlp/yt-dlp/issues/13485)) by [garret1317](https://github.com/garret1317) +- **tver** + - [Extract Streaks API info](https://github.com/yt-dlp/yt-dlp/commit/70d7687487252a08dbf8b2831743e7833472ba05) ([#13885](https://github.com/yt-dlp/yt-dlp/issues/13885)) by [bashonly](https://github.com/bashonly) + - [Support --ignore-no-formats-error when geo-blocked](https://github.com/yt-dlp/yt-dlp/commit/121647705a2fc6b968278723fe61801007e228a4) ([#13598](https://github.com/yt-dlp/yt-dlp/issues/13598)) by [arabcoders](https://github.com/arabcoders) +- **tvw**: news: [Add extractor](https://github.com/yt-dlp/yt-dlp/commit/682334e4b35112f7a5798decdcb5cb12230ef948) ([#12907](https://github.com/yt-dlp/yt-dlp/issues/12907)) by [fries1234](https://github.com/fries1234) +- **vimeo**: [Fix login support and require authentication](https://github.com/yt-dlp/yt-dlp/commit/afaf60d9fd5a0c7a85aeb1374fd97fbc13cd652c) ([#13823](https://github.com/yt-dlp/yt-dlp/issues/13823)) by [bashonly](https://github.com/bashonly) +- **yandexdisk**: [Support 360 URLs](https://github.com/yt-dlp/yt-dlp/commit/a6df5e8a58d6743dd230011389c986495ec509da) ([#13935](https://github.com/yt-dlp/yt-dlp/issues/13935)) by [Sojiroh](https://github.com/Sojiroh) +- **youtube** + - [Add player params to mweb client](https://github.com/yt-dlp/yt-dlp/commit/38c2bf40260f7788efb5a7f5e8eba8e5cb43f741) ([#13914](https://github.com/yt-dlp/yt-dlp/issues/13914)) by [coletdjnz](https://github.com/coletdjnz) + - [Update player params](https://github.com/yt-dlp/yt-dlp/commit/bf366517ef0b745490ee9e0f929254fa26b69647) ([#13979](https://github.com/yt-dlp/yt-dlp/issues/13979)) by [bashonly](https://github.com/bashonly) + +#### Downloader changes +- **dash**: [Re-extract if using --load-info-json with --live-from-start](https://github.com/yt-dlp/yt-dlp/commit/fe53ebe5b66a03c664708a4d6fd87b8c13a1bc7b) ([#13922](https://github.com/yt-dlp/yt-dlp/issues/13922)) by [bashonly](https://github.com/bashonly) +- **external**: [Work around ffmpeg's `file:` URL handling](https://github.com/yt-dlp/yt-dlp/commit/d399505fdf8292332bdc91d33859a0b0d08104fd) ([#13844](https://github.com/yt-dlp/yt-dlp/issues/13844)) by [bashonly](https://github.com/bashonly) +- **hls**: [Fix `--hls-split-continuity` support](https://github.com/yt-dlp/yt-dlp/commit/57186f958f164daa50203adcbf7ec74d541151cf) ([#13321](https://github.com/yt-dlp/yt-dlp/issues/13321)) by [tchebb](https://github.com/tchebb) + +#### Postprocessor changes +- **embedthumbnail**: [Fix ffmpeg args for embedding in mp3](https://github.com/yt-dlp/yt-dlp/commit/7e3f48d64d237281a97b3df1a61980c78a0302fe) ([#13720](https://github.com/yt-dlp/yt-dlp/issues/13720)) by [atsushi2965](https://github.com/atsushi2965) +- **xattrmetadata**: [Add macOS "Where from" attribute](https://github.com/yt-dlp/yt-dlp/commit/3e918d825d7ff367812658957b281b8cda8f9ebb) ([#12664](https://github.com/yt-dlp/yt-dlp/issues/12664)) by [rolandcrosby](https://github.com/rolandcrosby) (With fixes in [1e0c77d](https://github.com/yt-dlp/yt-dlp/commit/1e0c77ddcce335a1875ecc17d93ed6ff3fabd975) by [seproDev](https://github.com/seproDev)) + +#### Networking changes +- **Request Handler** + - curl_cffi: [Support `curl_cffi` 0.11.x, 0.12.x, 0.13.x](https://github.com/yt-dlp/yt-dlp/commit/e98695549e2eb8ce4a59abe16b5afa8adc075bbe) ([#13989](https://github.com/yt-dlp/yt-dlp/issues/13989)) by [bashonly](https://github.com/bashonly) + - requests: [Bump minimum required version of urllib3 to 2.0.2](https://github.com/yt-dlp/yt-dlp/commit/8175f3738fe4db3bc629d36bb72b927d4286d3f9) ([#13939](https://github.com/yt-dlp/yt-dlp/issues/13939)) by [bashonly](https://github.com/bashonly) + +#### Misc. changes +- **build**: [Use `macos-14` runner for `macos` builds](https://github.com/yt-dlp/yt-dlp/commit/66aa21dc5a3b79059c38f3ad1d05dc9b29187701) ([#13814](https://github.com/yt-dlp/yt-dlp/issues/13814)) by [bashonly](https://github.com/bashonly) +- **ci**: [Bump supported PyPy version to 3.11](https://github.com/yt-dlp/yt-dlp/commit/62e2a9c0d55306906f18da2927e05e1cbc31473c) ([#13877](https://github.com/yt-dlp/yt-dlp/issues/13877)) by [bashonly](https://github.com/bashonly) +- **cleanup** + - [Move embed tests to dedicated extractors](https://github.com/yt-dlp/yt-dlp/commit/1c6068af997cfc0e28061fc00f4d6091e1de57da) ([#13782](https://github.com/yt-dlp/yt-dlp/issues/13782)) by [doe1080](https://github.com/doe1080) + - Miscellaneous: [5e4ceb3](https://github.com/yt-dlp/yt-dlp/commit/5e4ceb35cf997af0dbf100e1de37f4e2bcbaa0b7) by [bashonly](https://github.com/bashonly), [injust](https://github.com/injust), [seproDev](https://github.com/seproDev) + ### 2025.07.21 #### Important changes diff --git a/README.md b/README.md index 5083341408..9b28147f2c 100644 --- a/README.md +++ b/README.md @@ -211,7 +211,7 @@ ### Metadata * [**mutagen**](https://github.com/quodlibet/mutagen)\* - For `--embed-thumbnail` in certain formats. Licensed under [GPLv2+](https://github.com/quodlibet/mutagen/blob/master/COPYING) * [**AtomicParsley**](https://github.com/wez/atomicparsley) - For `--embed-thumbnail` in `mp4`/`m4a` files when `mutagen`/`ffmpeg` cannot. Licensed under [GPLv2+](https://github.com/wez/atomicparsley/blob/master/COPYING) -* [**xattr**](https://github.com/xattr/xattr), [**pyxattr**](https://github.com/iustin/pyxattr) or [**setfattr**](http://savannah.nongnu.org/projects/attr) - For writing xattr metadata (`--xattr`) on **Mac** and **BSD**. Licensed under [MIT](https://github.com/xattr/xattr/blob/master/LICENSE.txt), [LGPL2.1](https://github.com/iustin/pyxattr/blob/master/COPYING) and [GPLv2+](http://git.savannah.nongnu.org/cgit/attr.git/tree/doc/COPYING) respectively +* [**xattr**](https://github.com/xattr/xattr), [**pyxattr**](https://github.com/iustin/pyxattr) or [**setfattr**](http://savannah.nongnu.org/projects/attr) - For writing xattr metadata (`--xattrs`) on **Mac** and **BSD**. Licensed under [MIT](https://github.com/xattr/xattr/blob/master/LICENSE.txt), [LGPL2.1](https://github.com/iustin/pyxattr/blob/master/COPYING) and [GPLv2+](http://git.savannah.nongnu.org/cgit/attr.git/tree/doc/COPYING) respectively ### Misc @@ -2370,7 +2370,6 @@ #### Old aliases --dump-headers --print-traffic --dump-intermediate-pages --dump-pages --force-write-download-archive --force-write-archive - --load-info --load-info-json --no-clean-infojson --no-clean-info-json --no-split-tracks --no-split-chapters --no-write-srt --no-write-subs diff --git a/devscripts/bash-completion.in b/devscripts/bash-completion.in index bb66c20956..994bb4e721 100644 --- a/devscripts/bash-completion.in +++ b/devscripts/bash-completion.in @@ -6,7 +6,7 @@ __yt_dlp() prev="${COMP_WORDS[COMP_CWORD-1]}" opts="{{flags}}" keywords=":ytfavorites :ytrecommended :ytsubscriptions :ytwatchlater :ythistory" - fileopts="-a|--batch-file|--download-archive|--cookies|--load-info" + fileopts="-a|--batch-file|--download-archive|--cookies|--load-info-json" diropts="--cache-dir" if [[ ${prev} =~ ${fileopts} ]]; then diff --git a/devscripts/changelog_override.json b/devscripts/changelog_override.json index c22ea94bfc..9b808a7481 100644 --- a/devscripts/changelog_override.json +++ b/devscripts/changelog_override.json @@ -272,5 +272,26 @@ "action": "add", "when": "959ac99e98c3215437e573c22d64be42d361e863", "short": "[priority] Security: [[CVE-2025-54072](https://nvd.nist.gov/vuln/detail/CVE-2025-54072)] [Fix `--exec` placeholder expansion on Windows](https://github.com/yt-dlp/yt-dlp/security/advisories/GHSA-45hg-7f49-5h56)\n - When `--exec` is used on Windows, the filepath expanded from `{}` (or the default placeholder) is now properly escaped" + }, + { + "action": "change", + "when": "b831406a1d3be34c159835079d12bae624c43610", + "short": "[ie/rtve.es:program] Add extractor (#12955)", + "authors": ["meGAmeS1", "seproDev"] + }, + { + "action": "add", + "when": "23c658b9cbe34a151f8f921ab1320bb5d4e40a4d", + "short": "[priority] **The minimum *recommended* Python version has been raised to 3.10**\nSince Python 3.9 will reach end-of-life in October 2025, support for it will be dropped soon. [Read more](https://github.com/yt-dlp/yt-dlp/issues/13858)" + }, + { + "action": "add", + "when": "cc5a5caac5fbc0d605b52bde0778d6fd5f97b5ab", + "short": "[priority] **darwin_legacy_exe builds are being discontinued**\nThis release's `yt-dlp_macos_legacy` binary will likely be the last one. [Read more](https://github.com/yt-dlp/yt-dlp/issues/13857)" + }, + { + "action": "add", + "when": "c76ce28e06c816eb5b261dfb6aff6e69dd9b7382", + "short": "[priority] **linux_armv7l_exe builds are being discontinued**\nThis release's `yt-dlp_linux_armv7l` binary could be the last one. [Read more](https://github.com/yt-dlp/yt-dlp/issues/13976)" } ] diff --git a/pyproject.toml b/pyproject.toml index 52ff5a895c..d8c3d9e822 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,11 +15,11 @@ description = "A feature-rich command-line audio/video downloader" readme = "README.md" requires-python = ">=3.9" keywords = [ + "cli", + "downloader", "youtube-dl", - "video-downloader", "youtube-downloader", "sponsorblock", - "youtube-dlc", "yt-dlp", ] license = {file = "LICENSE"} @@ -55,7 +55,7 @@ default = [ "websockets>=13.0", ] curl-cffi = [ - "curl-cffi>=0.5.10,!=0.6.*,!=0.7.*,!=0.8.*,!=0.9.*,<0.11; implementation_name=='cpython'", + "curl-cffi>=0.5.10,!=0.6.*,!=0.7.*,!=0.8.*,!=0.9.*,<0.14; implementation_name=='cpython'", ] secretstorage = [ "cffi", diff --git a/setup.cfg b/setup.cfg index 20d40cd303..a556eb29f5 100644 --- a/setup.cfg +++ b/setup.cfg @@ -16,7 +16,7 @@ remove-unused-variables = true [tox:tox] skipsdist = true -envlist = py{39,310,311,312,313},pypy310 +envlist = py{39,310,311,312,313},pypy311 skip_missing_interpreters = true [testenv] # tox diff --git a/supportedsites.md b/supportedsites.md index 3e0bef4bcf..26d5dab42c 100644 --- a/supportedsites.md +++ b/supportedsites.md @@ -12,7 +12,7 @@ # Supported sites - **17live:vod** - **1News**: 1news.co.nz article videos - **1tv**: Первый канал - - **20min** + - **20min**: (**Currently broken**) - **23video** - **247sports**: (**Currently broken**) - **24tv.ua** @@ -44,10 +44,10 @@ # Supported sites - **ADN**: [*animationdigitalnetwork*](## "netrc machine") Animation Digital Network - **ADNSeason**: [*animationdigitalnetwork*](## "netrc machine") Animation Digital Network - **AdobeConnect** - - **adobetv** - - **adobetv:channel** - - **adobetv:embed** - - **adobetv:show** + - **adobetv**: (**Currently broken**) + - **adobetv:channel**: (**Currently broken**) + - **adobetv:embed**: (**Currently broken**) + - **adobetv:show**: (**Currently broken**) - **adobetv:video** - **AdultSwim** - **aenetworks**: A+E Networks: A&E, Lifetime, History.com, FYI Network and History Vault @@ -285,7 +285,6 @@ # Supported sites - **Clipchamp** - **Clippit** - **ClipRs**: (**Currently broken**) - - **ClipYouEmbed** - **CloserToTruth**: (**Currently broken**) - **CloudflareStream** - **CloudyCDN** @@ -396,7 +395,6 @@ # Supported sites - **dw:article**: (**Currently broken**) - **dzen.ru**: Дзен (dzen) formerly Яндекс.Дзен (Yandex Zen) - **dzen.ru:channel** - - **EaglePlatform** - **EbaumsWorld** - **Ebay** - **egghead:course**: egghead.io course @@ -447,6 +445,7 @@ # Supported sites - **fancode:live**: [*fancode*](## "netrc machine") (**Currently broken**) - **fancode:vod**: [*fancode*](## "netrc machine") (**Currently broken**) - **Fathom** + - **FaulioLive** - **faz.net** - **fc2**: [*fc2*](## "netrc machine") - **fc2:embed** @@ -728,7 +727,7 @@ # Supported sites - **Liputan6** - **ListenNotes** - **LiTV** - - **LiveJournal** + - **LiveJournal**: (**Currently broken**) - **livestream** - **livestream:original** - **Livestreamfails** @@ -1056,7 +1055,7 @@ # Supported sites - **ParamountPressExpress** - **Parler**: Posts on parler.com - **parliamentlive.tv**: UK parliament videos - - **Parlview**: (**Currently broken**) + - **Parlview** - **parti:livestream** - **parti:video** - **patreon** @@ -1105,6 +1104,7 @@ # Supported sites - **pluralsight:course** - **PlutoTV**: (**Currently broken**) - **PlVideo**: Платформа + - **PlyrEmbed** - **PodbayFM** - **PodbayFMChannel** - **Podchaser** @@ -1258,6 +1258,7 @@ # Supported sites - **rtve.es:alacarta**: RTVE a la carta and Play - **rtve.es:audio**: RTVE audio - **rtve.es:live**: RTVE.es live streams + - **rtve.es:program**: RTVE.es programs - **rtve.es:television** - **rtvslo.si** - **rtvslo.si:show** @@ -1275,7 +1276,7 @@ # Supported sites - **rutube:playlist**: Rutube playlists - **rutube:tags**: Rutube tags - **RUTV**: RUTV.RU - - **Ruutu** + - **Ruutu**: (**Currently broken**) - **Ruv** - **ruv.is:spila** - **S4C** @@ -1326,6 +1327,7 @@ # Supported sites - **SharePoint** - **ShareVideosEmbed** - **ShemarooMe** + - **Shiey** - **ShowRoomLive** - **ShugiinItvLive**: 衆議院インターネット審議中継 - **ShugiinItvLiveRoom**: 衆議院インターネット審議中継 (中継) @@ -1383,7 +1385,7 @@ # Supported sites - **SpankBangPlaylist** - **Spiegel** - **Sport5** - - **SportBox** + - **SportBox**: (**Currently broken**) - **SportDeutschland** - **spotify**: Spotify episodes (**Currently broken**) - **spotify:show**: Spotify shows (**Currently broken**) @@ -1524,7 +1526,6 @@ # Supported sites - **TrueID** - **TruNews** - **Truth** - - **TruTV** - **Tube8**: (**Currently broken**) - **TubeTuGraz**: [*tubetugraz*](## "netrc machine") tube.tugraz.at - **TubeTuGrazSeries**: [*tubetugraz*](## "netrc machine") @@ -1569,6 +1570,7 @@ # Supported sites - **TVPlayer** - **TVPlayHome** - **tvw** + - **tvw:news** - **tvw:tvchannels** - **Tweakers** - **TwitCasting** @@ -1624,7 +1626,7 @@ # Supported sites - **vice**: (**Currently broken**) - **vice:article**: (**Currently broken**) - **vice:show**: (**Currently broken**) - - **Viddler** + - **Viddler**: (**Currently broken**) - **Videa** - **video.arnes.si**: Arnes Video - **video.google:search**: Google Video search; "gvsearch:" prefix diff --git a/yt_dlp/YoutubeDL.py b/yt_dlp/YoutubeDL.py index 5985d2ec76..5ef2be21e5 100644 --- a/yt_dlp/YoutubeDL.py +++ b/yt_dlp/YoutubeDL.py @@ -615,7 +615,7 @@ class YoutubeDL: 'player_url', 'protocol', 'fragment_base_url', 'fragments', 'is_from_start', 'is_dash_periods', 'request_data', 'preference', 'language', 'language_preference', 'quality', 'source_preference', 'cookies', 'http_headers', 'stretched_ratio', 'no_resume', 'has_drm', 'extra_param_to_segment_url', 'extra_param_to_key_url', - 'hls_aes', 'downloader_options', 'page_url', 'app', 'play_path', 'tc_url', 'flash_version', + 'hls_aes', 'downloader_options', 'impersonate', 'page_url', 'app', 'play_path', 'tc_url', 'flash_version', 'rtmp_live', 'rtmp_conn', 'rtmp_protocol', 'rtmp_real_time', } _deprecated_multivalue_fields = { @@ -754,8 +754,6 @@ def check_deprecated(param, option, suggestion): if self.params.get('geo_verification_proxy') is None: self.params['geo_verification_proxy'] = self.params['cn_verification_proxy'] - check_deprecated('autonumber', '--auto-number', '-o "%(autonumber)s-%(title)s.%(ext)s"') - check_deprecated('usetitle', '--title', '-o "%(title)s-%(id)s.%(ext)s"') check_deprecated('useid', '--id', '-o "%(id)s.%(ext)s"') for msg in self.params.get('_warnings', []): diff --git a/yt_dlp/__init__.py b/yt_dlp/__init__.py index f705bed1bf..bc9384b085 100644 --- a/yt_dlp/__init__.py +++ b/yt_dlp/__init__.py @@ -1031,6 +1031,7 @@ def _real_main(argv=None): (ImpersonateTarget('safari'), 'curl_cffi'), (ImpersonateTarget('firefox'), 'curl_cffi>=0.10'), (ImpersonateTarget('edge'), 'curl_cffi'), + (ImpersonateTarget('tor'), 'curl_cffi>=0.11'), ] available_targets = ydl._get_available_impersonate_targets() diff --git a/yt_dlp/extractor/common.py b/yt_dlp/extractor/common.py index 4a4b5416d0..a2970d0774 100644 --- a/yt_dlp/extractor/common.py +++ b/yt_dlp/extractor/common.py @@ -243,7 +243,7 @@ class InfoExtractor: * extra_param_to_segment_url A query string to append to each fragment's URL, or to update each existing query string with. If it is an HLS stream with an AES-128 decryption key, - the query paramaters will be passed to the key URI as well, + the query parameters will be passed to the key URI as well, unless there is an `extra_param_to_key_url` given, or unless an external key URI is provided via `hls_aes`. Only applied by the native HLS/DASH downloaders. @@ -419,7 +419,7 @@ class InfoExtractor: __post_extractor: A function to be called just before the metadata is written to either disk, logger or console. The function must return a dict which will be added to the info_dict. - This is usefull for additional information that is + This is useful for additional information that is time-consuming to extract. Note that the fields thus extracted will not be available to output template and match_filter. So, only "comments" and "comment_count" are diff --git a/yt_dlp/extractor/n1.py b/yt_dlp/extractor/n1.py index b4371c299e..cc2ea392a7 100644 --- a/yt_dlp/extractor/n1.py +++ b/yt_dlp/extractor/n1.py @@ -145,7 +145,9 @@ def _real_extract(self, url): webpage = self._download_webpage(url, video_id) title = self._og_search_title(webpage) or self._html_extract_title(webpage) - timestamp = unified_timestamp(self._og_search_property('published_time', webpage, default=None) or self._html_search_meta('article:published_time', webpage)) + timestamp = unified_timestamp( + self._og_search_property('published_time', webpage, default=None) + or self._html_search_meta('article:published_time', webpage)) plugin_data = re.findall(r'\$bp\("(?:Brid|TargetVideo)_\d+",\s(.+)\);', webpage) entries = [] if plugin_data: diff --git a/yt_dlp/extractor/youtube/_base.py b/yt_dlp/extractor/youtube/_base.py index f7dadd013d..d28550794a 100644 --- a/yt_dlp/extractor/youtube/_base.py +++ b/yt_dlp/extractor/youtube/_base.py @@ -105,7 +105,7 @@ class SubsPoTokenPolicy(BasePoTokenPolicy): 'INNERTUBE_CONTEXT_CLIENT_NAME': 1, 'SUPPORTS_COOKIES': True, **WEB_PO_TOKEN_POLICIES, - 'PLAYER_PARAMS': '8AEB', + 'PLAYER_PARAMS': '8AEB2AMB', }, # Safari UA returns pre-merged video+audio 144p/240p/360p/720p/1080p HLS formats 'web_safari': { @@ -119,7 +119,7 @@ class SubsPoTokenPolicy(BasePoTokenPolicy): 'INNERTUBE_CONTEXT_CLIENT_NAME': 1, 'SUPPORTS_COOKIES': True, **WEB_PO_TOKEN_POLICIES, - 'PLAYER_PARAMS': '8AEB', + 'PLAYER_PARAMS': '8AEB2AMB', }, 'web_embedded': { 'INNERTUBE_CONTEXT': { @@ -282,7 +282,7 @@ class SubsPoTokenPolicy(BasePoTokenPolicy): 'userAgent': 'Mozilla/5.0 (iPad; CPU OS 16_7_10 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.6 Mobile/15E148 Safari/604.1,gzip(gfe)', }, }, - 'PLAYER_PARAMS': '8AEB', + 'PLAYER_PARAMS': '8AEB2AMB', 'INNERTUBE_CONTEXT_CLIENT_NAME': 2, 'GVS_PO_TOKEN_POLICY': { StreamingProtocol.HTTPS: GvsPoTokenPolicy( @@ -314,7 +314,7 @@ class SubsPoTokenPolicy(BasePoTokenPolicy): }, 'INNERTUBE_CONTEXT_CLIENT_NAME': 7, 'SUPPORTS_COOKIES': True, - 'PLAYER_PARAMS': '8AEB', + 'PLAYER_PARAMS': '8AEB2AMB', }, 'tv_simply': { 'INNERTUBE_CONTEXT': { diff --git a/yt_dlp/networking/_curlcffi.py b/yt_dlp/networking/_curlcffi.py index 747879da87..90570417bd 100644 --- a/yt_dlp/networking/_curlcffi.py +++ b/yt_dlp/networking/_curlcffi.py @@ -33,9 +33,9 @@ curl_cffi_version = tuple(map(int, re.split(r'[^\d]+', curl_cffi.__version__)[:3])) -if curl_cffi_version != (0, 5, 10) and not (0, 10) <= curl_cffi_version: +if curl_cffi_version != (0, 5, 10) and not (0, 10) <= curl_cffi_version < (0, 14): curl_cffi._yt_dlp__version = f'{curl_cffi.__version__} (unsupported)' - raise ImportError('Only curl_cffi versions 0.5.10 and 0.10.x are supported') + raise ImportError('Only curl_cffi versions 0.5.10, 0.10.x, 0.11.x, 0.12.x, 0.13.x are supported') import curl_cffi.requests from curl_cffi.const import CurlECode, CurlOpt @@ -120,8 +120,8 @@ def read(self, amt=None): 'chrome110': ImpersonateTarget('chrome', '110', 'windows', '10'), 'edge99': ImpersonateTarget('edge', '99', 'windows', '10'), 'edge101': ImpersonateTarget('edge', '101', 'windows', '10'), - 'safari15_3': ImpersonateTarget('safari', '15.3', 'macos', '11'), - 'safari15_5': ImpersonateTarget('safari', '15.5', 'macos', '12'), + 'safari153': ImpersonateTarget('safari', '15.3', 'macos', '11'), + 'safari155': ImpersonateTarget('safari', '15.5', 'macos', '12'), }, (0, 7): { 'chrome116': ImpersonateTarget('chrome', '116', 'windows', '10'), @@ -129,12 +129,12 @@ def read(self, amt=None): 'chrome120': ImpersonateTarget('chrome', '120', 'macos', '14'), 'chrome123': ImpersonateTarget('chrome', '123', 'macos', '14'), 'chrome124': ImpersonateTarget('chrome', '124', 'macos', '14'), - 'safari17_0': ImpersonateTarget('safari', '17.0', 'macos', '14'), - 'safari17_2_ios': ImpersonateTarget('safari', '17.2', 'ios', '17.2'), + 'safari170': ImpersonateTarget('safari', '17.0', 'macos', '14'), + 'safari172_ios': ImpersonateTarget('safari', '17.2', 'ios', '17.2'), }, (0, 9): { - 'safari15_3': ImpersonateTarget('safari', '15.3', 'macos', '14'), - 'safari15_5': ImpersonateTarget('safari', '15.5', 'macos', '14'), + 'safari153': ImpersonateTarget('safari', '15.3', 'macos', '14'), + 'safari155': ImpersonateTarget('safari', '15.5', 'macos', '14'), 'chrome119': ImpersonateTarget('chrome', '119', 'macos', '14'), 'chrome120': ImpersonateTarget('chrome', '120', 'macos', '14'), 'chrome123': ImpersonateTarget('chrome', '123', 'macos', '14'), @@ -143,12 +143,33 @@ def read(self, amt=None): 'chrome131_android': ImpersonateTarget('chrome', '131', 'android', '14'), 'chrome133a': ImpersonateTarget('chrome', '133', 'macos', '15'), 'firefox133': ImpersonateTarget('firefox', '133', 'macos', '14'), - 'safari18_0': ImpersonateTarget('safari', '18.0', 'macos', '15'), - 'safari18_0_ios': ImpersonateTarget('safari', '18.0', 'ios', '18.0'), + 'safari180': ImpersonateTarget('safari', '18.0', 'macos', '15'), + 'safari180_ios': ImpersonateTarget('safari', '18.0', 'ios', '18.0'), }, (0, 10): { 'firefox135': ImpersonateTarget('firefox', '135', 'macos', '14'), }, + (0, 11): { + 'tor145': ImpersonateTarget('tor', '14.5', 'macos', '14'), + 'safari184': ImpersonateTarget('safari', '18.4', 'macos', '15'), + 'safari184_ios': ImpersonateTarget('safari', '18.4', 'ios', '18.4'), + 'chrome136': ImpersonateTarget('chrome', '136', 'macos', '15'), + }, + (0, 12): { + 'safari260': ImpersonateTarget('safari', '26.0', 'macos', '26'), + 'safari260_ios': ImpersonateTarget('safari', '26.0', 'ios', '26.0'), + }, +} + +# Needed for curl_cffi < 0.11 +# See: https://github.com/lexiforest/curl_cffi/commit/d2f15c7a31506a08d217fcc04ae7570c39f5f5bb +_TARGETS_COMPAT_LOOKUP = { + 'safari153': 'safari15_3', + 'safari155': 'safari15_5', + 'safari170': 'safari17_0', + 'safari172_ios': 'safari17_2_ios', + 'safari180': 'safari18_0', + 'safari180_ios': 'safari18_0_ios', } @@ -159,16 +180,19 @@ class CurlCFFIRH(ImpersonateRequestHandler, InstanceStoreMixin): _SUPPORTED_FEATURES = (Features.NO_PROXY, Features.ALL_PROXY) _SUPPORTED_PROXY_SCHEMES = ('http', 'https', 'socks4', 'socks4a', 'socks5', 'socks5h') _SUPPORTED_IMPERSONATE_TARGET_MAP = { - target: name if curl_cffi_version >= (0, 9) else curl_cffi.requests.BrowserType[name] - for name, target in dict(sorted(itertools.chain.from_iterable( + target: ( + name if curl_cffi_version >= (0, 11) + else _TARGETS_COMPAT_LOOKUP.get(name, name) if curl_cffi_version >= (0, 9) + else curl_cffi.requests.BrowserType[_TARGETS_COMPAT_LOOKUP.get(name, name)] + ) for name, target in dict(sorted(itertools.chain.from_iterable( targets.items() for version, targets in BROWSER_TARGETS.items() if curl_cffi_version >= version ), key=lambda x: ( # deprioritize mobile targets since they give very different behavior x[1].os not in ('ios', 'android'), - # prioritize edge < firefox < safari < chrome - ('edge', 'firefox', 'safari', 'chrome').index(x[1].client), + # prioritize tor < edge < firefox < safari < chrome + ('tor', 'edge', 'firefox', 'safari', 'chrome').index(x[1].client), # prioritize newest version float(x[1].version) if x[1].version else 0, # group by os name diff --git a/yt_dlp/options.py b/yt_dlp/options.py index 13ba445df3..29b37b4255 100644 --- a/yt_dlp/options.py +++ b/yt_dlp/options.py @@ -1526,7 +1526,7 @@ def _preset_alias_callback(option, opt_str, value, parser): action='store_false', dest='getcomments', help='Do not retrieve video comments unless the extraction is known to be quick (Alias: --no-get-comments)') filesystem.add_option( - '--load-info-json', '--load-info', + '--load-info-json', dest='load_info_filename', metavar='FILE', help='JSON file containing the video information (created with the "--write-info-json" option)') filesystem.add_option( diff --git a/yt_dlp/postprocessor/xattrpp.py b/yt_dlp/postprocessor/xattrpp.py index f879989761..52404b7d7a 100644 --- a/yt_dlp/postprocessor/xattrpp.py +++ b/yt_dlp/postprocessor/xattrpp.py @@ -1,4 +1,5 @@ import os +import sys from .common import PostProcessor from ..utils import ( @@ -54,8 +55,8 @@ def run(self, info): if infoname == 'upload_date': value = hyphenate_date(value) elif xattrname == 'com.apple.metadata:kMDItemWhereFroms': - # NTFS ADS doesn't support colons in names - if os.name == 'nt': + # Colon in xattr name throws errors on Windows/NTFS and Linux + if sys.platform != 'darwin': continue value = self.APPLE_PLIST_TEMPLATE % value write_xattr(info['filepath'], xattrname, value.encode()) diff --git a/yt_dlp/update.py b/yt_dlp/update.py index 045f7ec7f3..ca69fbbada 100644 --- a/yt_dlp/update.py +++ b/yt_dlp/update.py @@ -153,6 +153,16 @@ def _get_system_deprecation(): 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( + 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 @@ -162,13 +172,6 @@ def _get_system_deprecation(): if sys.version_info < MIN_SUPPORTED: return f'Python version {major}.{minor} is no longer supported! {PYTHON_MSG}' - # Temporary until aarch64/armv7l build flow is bumped to Ubuntu 22.04 and Python 3.10 - if variant in ('linux_aarch64_exe', 'linux_armv7l_exe'): - libc_ver = version_tuple(os.confstr('CS_GNU_LIBC_VERSION').partition(' ')[2]) - if libc_ver < (2, 35): - return EXE_MSG_TMPL.format('system glibc version < 2.35', 'issues/13858', STOP_MSG) - return None - return f'Support for Python version {major}.{minor} has been deprecated. {PYTHON_MSG}' diff --git a/yt_dlp/version.py b/yt_dlp/version.py index 868429ffb2..d2d51136e8 100644 --- a/yt_dlp/version.py +++ b/yt_dlp/version.py @@ -1,8 +1,8 @@ # Autogenerated by devscripts/update-version.py -__version__ = '2025.07.21' +__version__ = '2025.08.11' -RELEASE_GIT_HEAD = '9951fdd0d08b655cb1af8cd7f32a3fb7e2b1324e' +RELEASE_GIT_HEAD = '5e4ceb35cf997af0dbf100e1de37f4e2bcbaa0b7' VARIANT = None @@ -12,4 +12,4 @@ ORIGIN = 'yt-dlp/yt-dlp' -_pkg_version = '2025.07.21' +_pkg_version = '2025.08.11'