Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package yt-dlp for openSUSE:Factory checked in at 2025-09-29 16:33:04 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/yt-dlp (Old) and /work/SRC/openSUSE:Factory/.yt-dlp.new.11973 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "yt-dlp" Mon Sep 29 16:33:04 2025 rev:77 rq:1307606 version:2025.09.26 Changes: -------- --- /work/SRC/openSUSE:Factory/yt-dlp/yt-dlp.changes 2025-09-23 16:08:42.387175620 +0200 +++ /work/SRC/openSUSE:Factory/.yt-dlp.new.11973/yt-dlp.changes 2025-09-29 16:35:34.554855478 +0200 @@ -1,0 +2,11 @@ +Sat Sep 27 06:53:33 UTC 2025 - Luigi Baldoni <[email protected]> + +- Update to release 2025.09.26 + * twitch: vod: Fix live_status detection + * yt: Fix player JS overrides + * yt: Improve PO token logging + * yt: Player client maintenance + * yt: Replace tv_simply with web_safari in default clients +- Fix Leap 15.6 build + +------------------------------------------------------------------- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ yt-dlp.spec ++++++ --- /var/tmp/diff_new_pack.Y5FM0t/_old 2025-09-29 16:35:35.210883097 +0200 +++ /var/tmp/diff_new_pack.Y5FM0t/_new 2025-09-29 16:35:35.214883265 +0200 @@ -25,7 +25,7 @@ %endif Name: yt-dlp -Version: 2025.09.23 +Version: 2025.09.26 Release: 0 Summary: Enhanced fork of youtube-dl, a video site downloader for offline watching License: CC-BY-SA-3.0 AND SUSE-Public-Domain @@ -82,6 +82,12 @@ %prep %autosetup -p1 -n %name +# remove shebang +find . -type f -name "*.py" -exec sed -i '/^#!/d' {} + + +# fix Leap 15.6 build w.r.t. python-hatchling +sed -e '/3\.14/d' -e '/^license\-files/d' \ + -i pyproject.toml %build rm -f youtube-dl yt-dlp @@ -89,6 +95,9 @@ # A self-decompressing yt-dlp is built only when python_build is not # exercised; else yt-dlp is a loader. # +%if 0%{?suse_version} < 1600 +export PYTHON=%__python312 +%endif %pyproject_wheel %make_build yt-dlp ++++++ _scmsync.obsinfo ++++++ --- /var/tmp/diff_new_pack.Y5FM0t/_old 2025-09-29 16:35:35.246884612 +0200 +++ /var/tmp/diff_new_pack.Y5FM0t/_new 2025-09-29 16:35:35.258885117 +0200 @@ -1,5 +1,5 @@ -mtime: 1758614711 -commit: 73c9a0f63f792d8603ef72649d859a3d955ec4385cb021dc0f80e7e40f1ca228 +mtime: 1758989626 +commit: 406b6d85bbbb0da2aaf00efd8dc22d6aef000a7439266db22b6eb64f98bcc18c url: https://src.opensuse.org/jengelh/yt-dlp revision: master ++++++ build.specials.obscpio ++++++ ++++++ build.specials.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/.gitignore new/.gitignore --- old/.gitignore 1970-01-01 01:00:00.000000000 +0100 +++ new/.gitignore 2025-09-27 18:17:17.000000000 +0200 @@ -0,0 +1 @@ +.osc ++++++ yt-dlp.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yt-dlp/Changelog.md new/yt-dlp/Changelog.md --- old/yt-dlp/Changelog.md 2025-09-23 08:47:12.000000000 +0200 +++ new/yt-dlp/Changelog.md 2025-09-27 00:15:26.000000000 +0200 @@ -4,6 +4,16 @@ # To create a release, dispatch the https://github.com/yt-dlp/yt-dlp/actions/workflows/release.yml workflow on master --> +### 2025.09.26 + +#### Extractor changes +- **twitch**: vod: [Fix `live_status` detection](https://github.com/yt-dlp/yt-dlp/commit/50e452fd7dfb8a648bd3b9aaabc8f94f37ce2051) ([#14457](https://github.com/yt-dlp/yt-dlp/issues/14457)) by [bashonly](https://github.com/bashonly) +- **youtube** + - [Fix player JS overrides](https://github.com/yt-dlp/yt-dlp/commit/b7b7910d96359a539b7997890342ab4a59dd685d) ([#14430](https://github.com/yt-dlp/yt-dlp/issues/14430)) by [bashonly](https://github.com/bashonly), [seproDev](https://github.com/seproDev) + - [Improve PO token logging](https://github.com/yt-dlp/yt-dlp/commit/7df5acc546dccd32213c3a125d721e32b06d71b0) ([#14447](https://github.com/yt-dlp/yt-dlp/issues/14447)) by [seproDev](https://github.com/seproDev) + - [Player client maintenance](https://github.com/yt-dlp/yt-dlp/commit/94c5622be96474ca3c637e52898c4daee4d8fb69) ([#14448](https://github.com/yt-dlp/yt-dlp/issues/14448)) by [seproDev](https://github.com/seproDev) + - [Replace `tv_simply` with `web_safari` in default clients](https://github.com/yt-dlp/yt-dlp/commit/12b57d2858845c0c7fb33bf9aa8ed7be6905535d) ([#14465](https://github.com/yt-dlp/yt-dlp/issues/14465)) by [bashonly](https://github.com/bashonly) + ### 2025.09.23 #### Important changes diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yt-dlp/README.md new/yt-dlp/README.md --- old/yt-dlp/README.md 2025-09-23 08:47:15.000000000 +0200 +++ new/yt-dlp/README.md 2025-09-27 00:15:31.000000000 +0200 @@ -1814,7 +1814,7 @@ #### youtube * `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 * `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 -* `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_simply,tv,web` is used, but `tv,web_safari,web` is used when authenticating with cookies 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 c an use `all` for all clients (not recommended). You can prefix a client with `-` to exclude it, e.g. `youtube:player_client=default,-ios` +* `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` * `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 * `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 * `player_params`: YouTube player parameters to use for player requests. Will overwrite any default ones set by yt-dlp. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yt-dlp/README.txt new/yt-dlp/README.txt --- old/yt-dlp/README.txt 2025-09-23 08:47:16.000000000 +0200 +++ new/yt-dlp/README.txt 2025-09-27 00:15:32.000000000 +0200 @@ -2254,8 +2254,7 @@ - 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_simply,tv,web is used, but - tv,web_safari,web is used when authenticating with cookies 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 Binary files old/yt-dlp/yt-dlp and new/yt-dlp/yt-dlp differ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yt-dlp/yt-dlp.1 new/yt-dlp/yt-dlp.1 --- old/yt-dlp/yt-dlp.1 2025-09-23 08:47:17.000000000 +0200 +++ new/yt-dlp/yt-dlp.1 2025-09-27 00:15:33.000000000 +0200 @@ -2662,8 +2662,7 @@ \f[V]web_embedded\f[R], \f[V]web_music\f[R], \f[V]web_creator\f[R], \f[V]mweb\f[R], \f[V]ios\f[R], \f[V]android\f[R], \f[V]android_vr\f[R], \f[V]tv\f[R], \f[V]tv_simply\f[R] and \f[V]tv_embedded\f[R]. -By default, \f[V]tv_simply,tv,web\f[R] is used, but -\f[V]tv,web_safari,web\f[R] is used when authenticating with cookies and +By default, \f[V]tv,web_safari,web\f[R] is used, and \f[V]tv,web_creator,web\f[R] is used with premium accounts. The \f[V]web_music\f[R] client is added for \f[V]music.youtube.com\f[R] URLs when logged-in cookies are used. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yt-dlp/yt_dlp/extractor/twitch.py new/yt-dlp/yt_dlp/extractor/twitch.py --- old/yt-dlp/yt_dlp/extractor/twitch.py 2025-09-23 08:45:40.000000000 +0200 +++ new/yt-dlp/yt_dlp/extractor/twitch.py 2025-09-27 00:13:22.000000000 +0200 @@ -514,7 +514,10 @@ is_live = None if thumbnail: if re.findall(r'/404_processing_[^.?#]+\.png', thumbnail): - is_live, thumbnail = True, None + # False positive for is_live if info.get('broadcastType') == 'HIGHLIGHT' + # See https://github.com/yt-dlp/yt-dlp/issues/14455 + is_live = info.get('broadcastType') == 'ARCHIVE' + thumbnail = None else: is_live = False diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yt-dlp/yt_dlp/extractor/youtube/_base.py new/yt-dlp/yt_dlp/extractor/youtube/_base.py --- old/yt-dlp/yt_dlp/extractor/youtube/_base.py 2025-09-23 08:45:40.000000000 +0200 +++ new/yt-dlp/yt_dlp/extractor/youtube/_base.py 2025-09-27 00:13:22.000000000 +0200 @@ -99,7 +99,7 @@ 'INNERTUBE_CONTEXT': { 'client': { 'clientName': 'WEB', - 'clientVersion': '2.20250312.04.00', + 'clientVersion': '2.20250925.01.00', }, }, 'INNERTUBE_CONTEXT_CLIENT_NAME': 1, @@ -111,7 +111,7 @@ 'INNERTUBE_CONTEXT': { 'client': { 'clientName': 'WEB', - 'clientVersion': '2.20250312.04.00', + 'clientVersion': '2.20250925.01.00', 'userAgent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.5 Safari/605.1.15,gzip(gfe)', }, }, @@ -123,7 +123,7 @@ 'INNERTUBE_CONTEXT': { 'client': { 'clientName': 'WEB_EMBEDDED_PLAYER', - 'clientVersion': '1.20250310.01.00', + 'clientVersion': '1.20250923.21.00', }, }, 'INNERTUBE_CONTEXT_CLIENT_NAME': 56, @@ -134,7 +134,7 @@ 'INNERTUBE_CONTEXT': { 'client': { 'clientName': 'WEB_REMIX', - 'clientVersion': '1.20250310.01.00', + 'clientVersion': '1.20250922.03.00', }, }, 'INNERTUBE_CONTEXT_CLIENT_NAME': 67, @@ -163,7 +163,7 @@ 'INNERTUBE_CONTEXT': { 'client': { 'clientName': 'WEB_CREATOR', - 'clientVersion': '1.20250312.03.01', + 'clientVersion': '1.20250922.03.00', }, }, 'INNERTUBE_CONTEXT_CLIENT_NAME': 62, @@ -225,11 +225,11 @@ 'INNERTUBE_CONTEXT': { 'client': { 'clientName': 'ANDROID_VR', - 'clientVersion': '1.62.27', + 'clientVersion': '1.65.10', 'deviceMake': 'Oculus', 'deviceModel': 'Quest 3', 'androidSdkVersion': 32, - 'userAgent': 'com.google.android.apps.youtube.vr.oculus/1.62.27 (Linux; U; Android 12L; eureka-user Build/SQ3A.220605.009.A1) gzip', + 'userAgent': 'com.google.android.apps.youtube.vr.oculus/1.65.10 (Linux; U; Android 12L; eureka-user Build/SQ3A.220605.009.A1) gzip', 'osName': 'Android', 'osVersion': '12L', }, @@ -274,7 +274,7 @@ 'INNERTUBE_CONTEXT': { 'client': { 'clientName': 'MWEB', - 'clientVersion': '2.20250311.03.00', + 'clientVersion': '2.20250925.01.00', # mweb previously did not require PO Token with this UA '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)', }, @@ -304,7 +304,7 @@ 'INNERTUBE_CONTEXT': { 'client': { 'clientName': 'TVHTML5', - 'clientVersion': '7.20250312.16.00', + 'clientVersion': '7.20250923.13.00', 'userAgent': 'Mozilla/5.0 (ChromiumStylePlatform) Cobalt/Version', }, }, @@ -320,6 +320,20 @@ 'clientVersion': '1.0', }, }, + 'GVS_PO_TOKEN_POLICY': { + StreamingProtocol.HTTPS: GvsPoTokenPolicy( + required=True, + recommended=True, + ), + StreamingProtocol.DASH: GvsPoTokenPolicy( + required=True, + recommended=True, + ), + StreamingProtocol.HLS: GvsPoTokenPolicy( + required=False, + recommended=True, + ), + }, 'INNERTUBE_CONTEXT_CLIENT_NAME': 75, }, # This client now requires sign-in for every video diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yt-dlp/yt_dlp/extractor/youtube/_video.py new/yt-dlp/yt_dlp/extractor/youtube/_video.py --- old/yt-dlp/yt_dlp/extractor/youtube/_video.py 2025-09-23 08:45:40.000000000 +0200 +++ new/yt-dlp/yt_dlp/extractor/youtube/_video.py 2025-09-27 00:13:22.000000000 +0200 @@ -257,7 +257,7 @@ '401': {'ext': 'mp4', 'height': 2160, 'format_note': 'DASH video', 'vcodec': 'av01.0.12M.08'}, } _SUBTITLE_FORMATS = ('json3', 'srv1', 'srv2', 'srv3', 'ttml', 'srt', 'vtt') - _DEFAULT_CLIENTS = ('tv_simply', 'tv', 'web') + _DEFAULT_CLIENTS = ('tv', 'web_safari', 'web') _DEFAULT_AUTHED_CLIENTS = ('tv', 'web_safari', 'web') # Premium does not require POT (except for subtitles) _DEFAULT_PREMIUM_CLIENTS = ('tv', 'web_creator', 'web') @@ -1815,6 +1815,8 @@ 'params': {'skip_download': True}, }] + _DEFAULT_PLAYER_JS_VERSION = '20348@0004de42' # TODO: revert to 'actual' when n/sig is fixed + _DEFAULT_PLAYER_JS_VARIANT = 'main' _PLAYER_JS_VARIANT_MAP = { 'main': 'player_ias.vflset/en_US/base.js', 'tcc': 'player_ias_tcc.vflset/en_US/base.js', @@ -2016,7 +2018,7 @@ time.sleep(max(0, FETCH_SPAN + fetch_time - time.time())) def _get_player_js_version(self): - player_js_version = self._configuration_arg('player_js_version', [''])[0] or '20348@0004de42' + player_js_version = self._configuration_arg('player_js_version', [''])[0] or self._DEFAULT_PLAYER_JS_VERSION if player_js_version == 'actual': return None, None if not re.fullmatch(r'[0-9]{5,}@[0-9a-f]{8,}', player_js_version): @@ -2026,31 +2028,64 @@ return None, None return player_js_version.split('@') + def _construct_player_url(self, *, player_id=None, player_url=None): + assert player_id or player_url, '_construct_player_url must take one of player_id or player_url' + if not player_id: + player_id = self._extract_player_info(player_url) + + force_player_id = False + player_id_override = self._get_player_js_version()[1] + if player_id_override and player_id_override != player_id: + force_player_id = f'Forcing player {player_id_override} in place of player {player_id}' + player_id = player_id_override + + variant = self._configuration_arg('player_js_variant', [''])[0] or self._DEFAULT_PLAYER_JS_VARIANT + if variant not in (*self._PLAYER_JS_VARIANT_MAP, 'actual'): + self.report_warning( + f'Invalid player JS variant name "{variant}" requested. ' + f'Valid choices are: {", ".join(self._PLAYER_JS_VARIANT_MAP)}', only_once=True) + variant = self._DEFAULT_PLAYER_JS_VARIANT + + if not player_url: + if force_player_id: + self.write_debug(force_player_id, only_once=True) + if variant == 'actual': + # We don't have an actual variant so we always use 'main' & don't need to write debug + variant = 'main' + return urljoin('https://www.youtube.com', f'/s/player/{player_id}/{self._PLAYER_JS_VARIANT_MAP[variant]}') + + actual_variant = self._get_player_id_variant_and_path(player_url)[1] + if not force_player_id and (variant == 'actual' or variant == actual_variant): + return urljoin('https://www.youtube.com', player_url) + + if variant == 'actual': + if actual_variant: + variant = actual_variant + else: + # We need to force player_id but can't determine variant; fall back to 'main' variant + variant = 'main' + + self.write_debug(join_nonempty( + force_player_id, + variant != actual_variant and f'Forcing "{variant}" player JS variant for player {player_id}', + f'original url = {player_url}', + delim='\n '), only_once=True) + + return urljoin('https://www.youtube.com', f'/s/player/{player_id}/{self._PLAYER_JS_VARIANT_MAP[variant]}') + def _extract_player_url(self, *ytcfgs, webpage=None): player_url = traverse_obj( ytcfgs, (..., 'PLAYER_JS_URL'), (..., 'WEB_PLAYER_CONTEXT_CONFIGS', ..., 'jsUrl'), get_all=False, expected_type=str) if not player_url: return - player_id_override = self._get_player_js_version()[1] - - requested_js_variant = self._configuration_arg('player_js_variant', [''])[0] or 'main' - if requested_js_variant in self._PLAYER_JS_VARIANT_MAP: - player_id = player_id_override or self._extract_player_info(player_url) - original_url = player_url - player_url = f'/s/player/{player_id}/{self._PLAYER_JS_VARIANT_MAP[requested_js_variant]}' - if original_url != player_url: - self.write_debug( - f'Forcing "{requested_js_variant}" player JS variant for player {player_id}\n' - f' original url = {original_url}', only_once=True) - elif requested_js_variant != 'actual': - self.report_warning( - f'Invalid player JS variant name "{requested_js_variant}" requested. ' - f'Valid choices are: {", ".join(self._PLAYER_JS_VARIANT_MAP)}', only_once=True) - - return urljoin('https://www.youtube.com', player_url) + return self._construct_player_url(player_url=player_url) def _download_player_url(self, video_id, fatal=False): + if player_id_override := self._get_player_js_version()[1]: + self.write_debug(f'Forcing player {player_id_override}', only_once=True) + return self._construct_player_url(player_id=player_id_override) + iframe_webpage = self._download_webpage_with_retries( 'https://www.youtube.com/iframe_api', note='Downloading iframe API JS', @@ -2060,9 +2095,9 @@ player_version = self._search_regex( r'player\\?/([0-9a-fA-F]{8})\\?/', iframe_webpage, 'player version', fatal=fatal) if player_version: - return f'https://www.youtube.com/s/player/{player_version}/player_ias.vflset/en_US/base.js' + return self._construct_player_url(player_id=player_version) - def _player_js_cache_key(self, player_url): + def _get_player_id_variant_and_path(self, player_url): player_id = self._extract_player_info(player_url) player_path = remove_start(urllib.parse.urlparse(player_url).path, f'/s/player/{player_id}/') variant = self._INVERSE_PLAYER_JS_VARIANT_MAP.get(player_path) or next(( @@ -2072,8 +2107,13 @@ self.write_debug( f'Unable to determine player JS variant\n' f' player = {player_url}', only_once=True) + return player_id, variant, player_path + + def _player_js_cache_key(self, player_url): + player_id, variant, player_path = self._get_player_id_variant_and_path(player_url) + if not variant: variant = re.sub(r'[^a-zA-Z0-9]', '_', remove_end(player_path, '.js')) - return join_nonempty(player_id, variant) + return f'{player_id}-{variant}' def _signature_cache_id(self, example_sig): """ Return a string representation of a signature """ @@ -2920,7 +2960,7 @@ if player_url and context == _PoTokenContext.GVS and not visitor_data and not self.is_authenticated: self.report_warning( f'Unable to fetch GVS PO Token for {client} client: Missing required Visitor Data. ' - f'You may need to pass Visitor Data with --extractor-args "youtube:visitor_data=XXX"') + f'You may need to pass Visitor Data with --extractor-args "youtube:visitor_data=XXX"', only_once=True) return if context == _PoTokenContext.PLAYER and not video_id: @@ -2943,7 +2983,7 @@ if player_url and context == _PoTokenContext.GVS and not data_sync_id and self.is_authenticated: self.report_warning( f'Unable to fetch GVS PO Token for {client} client: Missing required Data Sync ID for account. ' - f'You may need to pass a Data Sync ID with --extractor-args "youtube:data_sync_id=XXX"') + f'You may need to pass a Data Sync ID with --extractor-args "youtube:data_sync_id=XXX"', only_once=True) return po_token = self._fetch_po_token( diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yt-dlp/yt_dlp/version.py new/yt-dlp/yt_dlp/version.py --- old/yt-dlp/yt_dlp/version.py 2025-09-23 08:47:12.000000000 +0200 +++ new/yt-dlp/yt_dlp/version.py 2025-09-27 00:15:26.000000000 +0200 @@ -1,8 +1,8 @@ # Autogenerated by devscripts/update-version.py -__version__ = '2025.09.23' +__version__ = '2025.09.26' -RELEASE_GIT_HEAD = '2e81e298cdce23afadb06a95836284acb38f7018' +RELEASE_GIT_HEAD = '12b57d2858845c0c7fb33bf9aa8ed7be6905535d' VARIANT = None @@ -12,4 +12,4 @@ ORIGIN = 'yt-dlp/yt-dlp' -_pkg_version = '2025.09.23' +_pkg_version = '2025.09.26'
