Skip to content

Commit 717fc09

Browse files
committed
Merge branch 'master' into mk/cz
2 parents 564a103 + a75399d commit 717fc09

File tree

12 files changed

+99
-27
lines changed

12 files changed

+99
-27
lines changed

.github/workflows/build.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -536,7 +536,7 @@ jobs:
536536
runs-on: ubuntu-latest
537537
steps:
538538
- name: Download artifacts
539-
uses: actions/download-artifact@v4
539+
uses: actions/download-artifact@v5
540540
with:
541541
path: artifact
542542
pattern: build-bin-*

.github/workflows/release-master.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ jobs:
3838
id-token: write # mandatory for trusted publishing
3939
steps:
4040
- name: Download artifacts
41-
uses: actions/download-artifact@v4
41+
uses: actions/download-artifact@v5
4242
with:
4343
path: dist
4444
name: build-pypi

.github/workflows/release-nightly.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ jobs:
5353
id-token: write # mandatory for trusted publishing
5454
steps:
5555
- name: Download artifacts
56-
uses: actions/download-artifact@v4
56+
uses: actions/download-artifact@v5
5757
with:
5858
path: dist
5959
name: build-pypi

.github/workflows/release.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,7 @@ jobs:
236236
- uses: actions/checkout@v5
237237
with:
238238
fetch-depth: 0
239-
- uses: actions/download-artifact@v4
239+
- uses: actions/download-artifact@v5
240240
with:
241241
path: artifact
242242
pattern: build-*

Changelog.md

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,30 @@
44
# To create a release, dispatch the https://github.com/yt-dlp/yt-dlp/actions/workflows/release.yml workflow on master
55
-->
66

7+
### 2025.10.22
8+
9+
#### Important changes
10+
- **A stopgap release with a *TEMPORARY partial* fix for YouTube support**
11+
Some formats may still be unavailable, especially if cookies are passed to yt-dlp. The ***NEXT*** release, expected very soon, **will require an external JS runtime (e.g. Deno)** in order for YouTube downloads to work properly. [Read more](https://github.com/yt-dlp/yt-dlp/issues/14404)
12+
- **The minimum *required* Python version has been raised to 3.10**
13+
Python 3.9 has reached its end-of-life as of October 2025, and yt-dlp has now removed support for it. [Read more](https://github.com/yt-dlp/yt-dlp/issues/13858)
14+
15+
#### Core changes
16+
- [Remove Python 3.9 support](https://github.com/yt-dlp/yt-dlp/commit/4e6a693057cfaf1ce1f07b019ed3bfce2bf936f6) ([#13861](https://github.com/yt-dlp/yt-dlp/issues/13861)) by [bashonly](https://github.com/bashonly)
17+
18+
#### Extractor changes
19+
- **appleconnect**: [Rework extractor](https://github.com/yt-dlp/yt-dlp/commit/78748b506f0dca8236ac0045ed7f72f7cf334b62) ([#13229](https://github.com/yt-dlp/yt-dlp/issues/13229)) by [doe1080](https://github.com/doe1080)
20+
- **idagio**: [Support URLs with country codes](https://github.com/yt-dlp/yt-dlp/commit/c9356f308dd3c5f9f494cb40ed14c5df017b4fe0) ([#14655](https://github.com/yt-dlp/yt-dlp/issues/14655)) by [robin-mu](https://github.com/robin-mu)
21+
- **tvnoe**: [Rework Extractor](https://github.com/yt-dlp/yt-dlp/commit/fe5ae54a7b08ebe679f03afdeafbe1cee5784d5b) ([#13369](https://github.com/yt-dlp/yt-dlp/issues/13369)) by [doe1080](https://github.com/doe1080)
22+
- **youtube**: [Use temporary player client workaround](https://github.com/yt-dlp/yt-dlp/commit/2c9091e355a7ba5d1edb69796ecdca48199b77fb) ([#14693](https://github.com/yt-dlp/yt-dlp/issues/14693)) by [gamer191](https://github.com/gamer191)
23+
24+
#### Misc. changes
25+
- **cleanup**
26+
- Miscellaneous
27+
- [c7bda21](https://github.com/yt-dlp/yt-dlp/commit/c7bda2192aa24afce40fdbbbe056d269aa3b2872) by [bashonly](https://github.com/bashonly), [seproDev](https://github.com/seproDev)
28+
- [de7b3c0](https://github.com/yt-dlp/yt-dlp/commit/de7b3c0705022cb777c5b4b7f0c69c59ad6ff538) by [bashonly](https://github.com/bashonly)
29+
- **docs**: [Update list of maintainers](https://github.com/yt-dlp/yt-dlp/commit/dfc0a84c192a7357dd1768cc345d590253a14fe5) ([#14148](https://github.com/yt-dlp/yt-dlp/issues/14148)) by [bashonly](https://github.com/bashonly), [coletdjnz](https://github.com/coletdjnz), [seproDev](https://github.com/seproDev)
30+
731
### 2025.10.14
832

933
#### Core changes

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1814,12 +1814,12 @@ The following extractors use this feature:
18141814
#### youtube
18151815
* `lang`: Prefer translated metadata (`title`, `description` etc) of this language code (case-sensitive). By default, the video primary language metadata is preferred, with a fallback to `en` translated. See [youtube/_base.py](https://github.com/yt-dlp/yt-dlp/blob/415b4c9f955b1a0391204bd24a7132590e7b3bdb/yt_dlp/extractor/youtube/_base.py#L402-L409) for the list of supported content language codes
18161816
* `skip`: One or more of `hls`, `dash` or `translated_subs` to skip extraction of the m3u8 manifests, dash manifests and [auto-translated subtitles](https://github.com/yt-dlp/yt-dlp/issues/4090#issuecomment-1158102032) respectively
1817-
* `player_client`: Clients to extract video data from. The currently available clients are `web`, `web_safari`, `web_embedded`, `web_music`, `web_creator`, `mweb`, `ios`, `android`, `android_vr`, `tv`, `tv_simply` and `tv_embedded`. By default, `tv,web_safari,web` is used, and `tv,web_creator,web` is used with premium accounts. The `web_music` client is added for `music.youtube.com` URLs when logged-in cookies are used. The `web_embedded` client is added for age-restricted videos but only works if the video is embeddable. The `tv_embedded` and `web_creator` clients are added for age-restricted videos if account age-verification is required. Some clients, such as `web` and `web_music`, require a `po_token` for their formats to be downloadable. Some clients, such as `web_creator`, will only work with authentication. Not all clients support authentication via cookies. You can use `default` for the default clients, or you can use `all` for all clients (not recommended). You can prefix a client with `-` to exclude it, e.g. `youtube:player_client=default,-ios`
1817+
* `player_client`: Clients to extract video data from. The currently available clients are `web`, `web_safari`, `web_embedded`, `web_music`, `web_creator`, `mweb`, `ios`, `android`, `android_sdkless`, `android_vr`, `tv`, `tv_simply` and `tv_embedded`. By default, `android_sdkless,tv,web_safari,web` is used. `android_sdkless` is omitted if cookies are passed. If premium cookies are passed, `tv,web_creator,web_safari,web` is used instead. The `web_music` client is added for `music.youtube.com` URLs when logged-in cookies are used. The `web_embedded` client is added for age-restricted videos but only works if the video is embeddable. The `tv_embedded` and `web_creator` clients are added for age-restricted videos if account age-verification is required. Some clients, such as `web` and `web_music`, require a `po_token` for their formats to be downloadable. Some clients, such as `web_creator`, will only work with authentication. Not all clients support authentication via cookies. You can use `default` for the default clients, or you can use `all` for all clients (not recommended). You can prefix a client with `-` to exclude it, e.g. `youtube:player_client=default,-ios`
18181818
* `player_skip`: Skip some network requests that are generally needed for robust extraction. One or more of `configs` (skip client configs), `webpage` (skip initial webpage), `js` (skip js player), `initial_data` (skip initial data/next ep request). While these options can help reduce the number of requests needed or avoid some rate-limiting, they could cause issues such as missing formats or metadata. See [#860](https://github.com/yt-dlp/yt-dlp/pull/860) and [#12826](https://github.com/yt-dlp/yt-dlp/issues/12826) for more details
18191819
* `webpage_skip`: Skip extraction of embedded webpage data. One or both of `player_response`, `initial_data`. These options are for testing purposes and don't skip any network requests
18201820
* `player_params`: YouTube player parameters to use for player requests. Will overwrite any default ones set by yt-dlp.
18211821
* `player_js_variant`: The player javascript variant to use for n/sig deciphering. The known variants are: `main`, `tcc`, `tce`, `es5`, `es6`, `tv`, `tv_es6`, `phone`, `tablet`. The default is `main`, and the others are for debugging purposes. You can use `actual` to go with what is prescribed by the site
1822-
* `player_js_version`: The player javascript version to use for n/sig deciphering, in the format of `signature_timestamp@hash`. Currently, the default is to force `20348@0004de42`. You can use `actual` to go with what is prescribed by the site
1822+
* `player_js_version`: The player javascript version to use for n/sig deciphering, in the format of `signature_timestamp@hash` (e.g. `20348@0004de42`). The default is to use what is prescribed by the site, and can be selected with `actual`
18231823
* `comment_sort`: `top` or `new` (default) - choose comment sorting mode (on YouTube's side)
18241824
* `max_comments`: Limit the amount of comments to gather. Comma-separated list of integers representing `max-comments,max-parents,max-replies,max-replies-per-thread`. Default is `all,all,all,all`
18251825
* E.g. `all,all,1000,10` will get a maximum of 1000 replies total, with up to 10 replies per thread. `1000,all,100` will get a maximum of 1000 comments, with a maximum of 100 replies total

devscripts/changelog_override.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -303,5 +303,10 @@
303303
"action": "add",
304304
"when": "4e6a693057cfaf1ce1f07b019ed3bfce2bf936f6",
305305
"short": "[priority] **The minimum *required* Python version has been raised to 3.10**\nPython 3.9 has reached its end-of-life as of October 2025, and yt-dlp has now removed support for it. [Read more](https://github.com/yt-dlp/yt-dlp/issues/13858)"
306+
},
307+
{
308+
"action": "add",
309+
"when": "2c9091e355a7ba5d1edb69796ecdca48199b77fb",
310+
"short": "[priority] **A stopgap release with a *TEMPORARY partial* fix for YouTube support**\nSome formats may still be unavailable, especially if cookies are passed to yt-dlp. The ***NEXT*** release, expected very soon, **will require an external JS runtime (e.g. Deno)** in order for YouTube downloads to work properly. [Read more](https://github.com/yt-dlp/yt-dlp/issues/14404)"
306311
}
307312
]

supportedsites.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ The only reliable way to check if a site is supported is to try it.
8585
- **aol.com**: Yahoo screen and movies (**Currently broken**)
8686
- **APA**
8787
- **Aparat**
88-
- **AppleConnect**
88+
- **apple:​music:connect**: Apple Music Connect
8989
- **AppleDaily**: 臺灣蘋果日報
9090
- **ApplePodcasts**
9191
- **appletrailers**
@@ -1541,7 +1541,7 @@ The only reliable way to check if a site is supported is to try it.
15411541
- **tvigle**: Интернет-телевидение Tvigle.ru
15421542
- **TVIPlayer**
15431543
- **TVN24**: (**Currently broken**)
1544-
- **TVNoe**: (**Currently broken**)
1544+
- **tvnoe**: Televize Noe
15451545
- **tvopengr:embed**: tvopen.gr embedded videos
15461546
- **tvopengr:watch**: tvopen.gr (and ethnos.gr) videos
15471547
- **tvp**: Telewizja Polska

yt_dlp/extractor/idagio.py

Lines changed: 42 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55

66
class IdagioTrackIE(InfoExtractor):
7-
_VALID_URL = r'https?://(?:www\.)?app\.idagio\.com/recordings/\d+\?(?:[^#]+&)?trackId=(?P<id>\d+)'
7+
_VALID_URL = r'https?://(?:www\.)?app\.idagio\.com(?:/[a-z]{2})?/recordings/\d+\?(?:[^#]+&)?trackId=(?P<id>\d+)'
88
_TESTS = [{
99
'url': 'https://app.idagio.com/recordings/30576934?trackId=30576943',
1010
'md5': '15148bd71804b2450a2508931a116b56',
@@ -29,12 +29,14 @@ class IdagioTrackIE(InfoExtractor):
2929
'title': 'I. Adagio sostenuto',
3030
'duration': 316,
3131
'composers': ['Ludwig van Beethoven'],
32-
'artists': [],
3332
'genres': ['Keyboard', 'Sonata (Keyboard)'],
3433
'track': 'I. Adagio sostenuto',
3534
'timestamp': 1518076337,
3635
'upload_date': '20180208',
3736
},
37+
}, {
38+
'url': 'https://app.idagio.com/de/recordings/20514467?trackId=20514478&utm_source=pcl',
39+
'only_matching': True,
3840
}]
3941

4042
def _real_extract(self, url):
@@ -97,7 +99,7 @@ def _real_extract(self, url):
9799

98100

99101
class IdagioRecordingIE(IdagioPlaylistBaseIE):
100-
_VALID_URL = r'https?://(?:www\.)?app\.idagio\.com/recordings/(?P<id>\d+)(?![^#]*[&?]trackId=\d+)'
102+
_VALID_URL = r'https?://(?:www\.)?app\.idagio\.com(?:/[a-z]{2})?/recordings/(?P<id>\d+)(?![^#]*[&?]trackId=\d+)'
101103
_TESTS = [{
102104
'url': 'https://app.idagio.com/recordings/30576934',
103105
'info_dict': {
@@ -112,6 +114,19 @@ class IdagioRecordingIE(IdagioPlaylistBaseIE):
112114
'upload_date': '20190405',
113115
},
114116
'playlist_count': 15,
117+
}, {
118+
'url': 'https://app.idagio.com/de/recordings/20514467',
119+
'info_dict': {
120+
'id': '20514467',
121+
'title': 'Sonata for Piano No. 14 in C sharp minor op. 27/2',
122+
'composers': ['Ludwig van Beethoven'],
123+
'genres': ['Keyboard', 'Sonata (Keyboard)'],
124+
'timestamp': 1518076337,
125+
'upload_date': '20180208',
126+
'modified_timestamp': 1518076337,
127+
'modified_date': '20180208',
128+
},
129+
'playlist_count': 3,
115130
}]
116131
_API_URL_TMPL = 'https://api.idagio.com/v2.0/metadata/recordings/{}'
117132

@@ -129,15 +144,15 @@ def _parse_playlist_metadata(self, playlist_info):
129144

130145

131146
class IdagioAlbumIE(IdagioPlaylistBaseIE):
132-
_VALID_URL = r'https?://(?:www\.)?app\.idagio\.com/albums/(?P<id>[\w-]+)'
147+
_VALID_URL = r'https?://(?:www\.)?app\.idagio\.com(?:/[a-z]{2})?/albums/(?P<id>[\w-]+)'
133148
_TESTS = [{
134149
'url': 'https://app.idagio.com/albums/elgar-enigma-variations-in-the-south-serenade-for-strings',
135150
'info_dict': {
136151
'id': 'a9f139b8-f70d-4b8a-a9a4-5fe8d35eaf9c',
137152
'display_id': 'elgar-enigma-variations-in-the-south-serenade-for-strings',
138153
'title': 'Elgar: Enigma Variations, In the South, Serenade for Strings',
139154
'description': '',
140-
'thumbnail': 'https://idagio-images.global.ssl.fastly.net/albums/880040420521/main.jpg',
155+
'thumbnail': r're:https://.+/albums/880040420521/main\.jpg',
141156
'artists': ['Vasily Petrenko', 'Royal Liverpool Philharmonic Orchestra', 'Edward Elgar'],
142157
'timestamp': 1553817600,
143158
'upload_date': '20190329',
@@ -146,19 +161,19 @@ class IdagioAlbumIE(IdagioPlaylistBaseIE):
146161
},
147162
'playlist_count': 19,
148163
}, {
149-
'url': 'https://app.idagio.com/albums/brahms-ein-deutsches-requiem-3B403DF6-62D7-4A42-807B-47173F3E0192',
164+
'url': 'https://app.idagio.com/de/albums/brahms-ein-deutsches-requiem-3B403DF6-62D7-4A42-807B-47173F3E0192',
150165
'info_dict': {
151166
'id': '2862ad4e-4a61-45ad-9ce4-7fcf0c2626fe',
152167
'display_id': 'brahms-ein-deutsches-requiem-3B403DF6-62D7-4A42-807B-47173F3E0192',
153168
'title': 'Brahms: Ein deutsches Requiem',
154-
'description': '',
155-
'thumbnail': 'https://idagio-images.global.ssl.fastly.net/albums/3149020954522/main.jpg',
156-
'tags': ['recent-release'],
169+
'description': 'GRAMOPHONE CLASSICAL MUSIC AWARDS 2025 Recording of the Year & Choral',
170+
'thumbnail': r're:https://.+/albums/3149020954522/main\.jpg',
157171
'artists': ['Sabine Devieilhe', 'Stéphane Degout', 'Raphaël Pichon', 'Pygmalion', 'Johannes Brahms'],
158172
'timestamp': 1760054400,
159173
'upload_date': '20251010',
160-
'modified_timestamp': 1760101611,
161-
'modified_date': '20251010',
174+
'modified_timestamp': 1760624868,
175+
'modified_date': '20251016',
176+
'tags': ['recommended', 'recent-release'],
162177
},
163178
'playlist_count': 7,
164179
}]
@@ -179,7 +194,7 @@ def _parse_playlist_metadata(self, playlist_info):
179194

180195

181196
class IdagioPlaylistIE(IdagioPlaylistBaseIE):
182-
_VALID_URL = r'https?://(?:www\.)?app\.idagio\.com/playlists/(?!personal/)(?P<id>[\w-]+)'
197+
_VALID_URL = r'https?://(?:www\.)?app\.idagio\.com(?:/[a-z]{2})?/playlists/(?!personal/)(?P<id>[\w-]+)'
183198
_TESTS = [{
184199
'url': 'https://app.idagio.com/playlists/beethoven-the-most-beautiful-piano-music',
185200
'info_dict': {
@@ -191,6 +206,17 @@ class IdagioPlaylistIE(IdagioPlaylistBaseIE):
191206
'creators': ['IDAGIO'],
192207
},
193208
'playlist_mincount': 16, # one entry is geo-restricted
209+
}, {
210+
'url': 'https://app.idagio.com/de/playlists/piano-music-for-an-autumn-day',
211+
'info_dict': {
212+
'id': 'd70e9c7f-7080-4308-ae0f-f890dddeda82',
213+
'display_id': 'piano-music-for-an-autumn-day',
214+
'title': 'Piano Music for an Autumn Day',
215+
'description': 'Get ready to snuggle up and enjoy all the musical colours of this cosy, autumnal playlist.',
216+
'thumbnail': r're:https://.+/playlists/d70e9c7f-7080-4308-ae0f-f890dddeda82/main\.jpg',
217+
'creators': ['IDAGIO'],
218+
},
219+
'playlist_count': 35,
194220
}]
195221
_API_URL_TMPL = 'https://api.idagio.com/v2.0/playlists/{}'
196222
_PLAYLIST_ID_KEY = 'display_id'
@@ -206,7 +232,7 @@ def _parse_playlist_metadata(self, playlist_info):
206232

207233

208234
class IdagioPersonalPlaylistIE(IdagioPlaylistBaseIE):
209-
_VALID_URL = r'https?://(?:www\.)?app\.idagio\.com/playlists/personal/(?P<id>[\da-f-]+)'
235+
_VALID_URL = r'https?://(?:www\.)?app\.idagio\.com(?:/[a-z]{2})?/playlists/personal/(?P<id>[\da-f-]+)'
210236
_TESTS = [{
211237
'url': 'https://app.idagio.com/playlists/personal/99dad72e-7b3a-45a4-b216-867c08046ed8',
212238
'info_dict': {
@@ -220,6 +246,9 @@ class IdagioPersonalPlaylistIE(IdagioPlaylistBaseIE):
220246
'modified_date': '20250819',
221247
},
222248
'playlist_count': 100,
249+
}, {
250+
'url': 'https://app.idagio.com/de/playlists/personal/99dad72e-7b3a-45a4-b216-867c08046ed8',
251+
'only_matching': True,
223252
}]
224253
_API_URL_TMPL = 'https://api.idagio.com/v1.0/personal-playlists/{}'
225254

yt_dlp/extractor/youtube/_base.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,20 @@ class SubsPoTokenPolicy(BasePoTokenPolicy):
220220
},
221221
'PLAYER_PO_TOKEN_POLICY': PlayerPoTokenPolicy(required=False, recommended=True),
222222
},
223+
# Doesn't require a PoToken for some reason
224+
'android_sdkless': {
225+
'INNERTUBE_CONTEXT': {
226+
'client': {
227+
'clientName': 'ANDROID',
228+
'clientVersion': '20.10.38',
229+
'userAgent': 'com.google.android.youtube/20.10.38 (Linux; U; Android 11) gzip',
230+
'osName': 'Android',
231+
'osVersion': '11',
232+
},
233+
},
234+
'INNERTUBE_CONTEXT_CLIENT_NAME': 3,
235+
'REQUIRE_JS_PLAYER': False,
236+
},
223237
# YouTube Kids videos aren't returned on this client for some reason
224238
'android_vr': {
225239
'INNERTUBE_CONTEXT': {

0 commit comments

Comments
 (0)