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'

Reply via email to