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-08-28 17:18:27 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/yt-dlp (Old) and /work/SRC/openSUSE:Factory/.yt-dlp.new.1977 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "yt-dlp" Thu Aug 28 17:18:27 2025 rev:74 rq:1301623 version:2025.08.27 Changes: -------- --- /work/SRC/openSUSE:Factory/yt-dlp/yt-dlp.changes 2025-08-25 20:38:31.949182810 +0200 +++ /work/SRC/openSUSE:Factory/.yt-dlp.new.1977/yt-dlp.changes 2025-08-28 17:18:53.187763498 +0200 @@ -1,0 +2,8 @@ +Thu Aug 28 00:09:55 UTC 2025 - Jan Engelhardt <jeng...@inai.de> + +- Update to release 2025.08.27 + * Add tcc player JS variant + * Deprioritize web_safari m3u8 formats + * Use alternative tv user-agent when authenticated + +------------------------------------------------------------------- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ yt-dlp.spec ++++++ --- /var/tmp/diff_new_pack.zxDfgs/_old 2025-08-28 17:18:53.971796356 +0200 +++ /var/tmp/diff_new_pack.zxDfgs/_new 2025-08-28 17:18:53.975796525 +0200 @@ -25,7 +25,7 @@ %endif Name: yt-dlp -Version: 2025.08.22 +Version: 2025.08.27 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 ++++++ _scmsync.obsinfo ++++++ --- /var/tmp/diff_new_pack.zxDfgs/_old 2025-08-28 17:18:54.007797866 +0200 +++ /var/tmp/diff_new_pack.zxDfgs/_new 2025-08-28 17:18:54.011798033 +0200 @@ -1,5 +1,5 @@ -mtime: 1755936051 -commit: a195ba62dcd07eadfce64b43cbbfe3c6246db2762be29758aefb558d310d2286 +mtime: 1756339832 +commit: ef672fc8de8742def49c40c02b33f81b04a334fbe40c38973507a38fdf0b98d5 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-08-28 02:10:41.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-08-23 01:59:38.000000000 +0200 +++ new/yt-dlp/Changelog.md 2025-08-28 01:58:09.000000000 +0200 @@ -4,6 +4,19 @@ # To create a release, dispatch the https://github.com/yt-dlp/yt-dlp/actions/workflows/release.yml workflow on master --> +### 2025.08.27 + +#### Extractor changes +- **generic** + - [Simplify invalid URL error message](https://github.com/yt-dlp/yt-dlp/commit/1ddbd033f0fd65917526b1271cea66913ac8647f) ([#14167](https://github.com/yt-dlp/yt-dlp/issues/14167)) by [seproDev](https://github.com/seproDev) + - [Use https as fallback protocol](https://github.com/yt-dlp/yt-dlp/commit/fec30c56f0e97e573ace659104ff0d72c4cc9809) ([#14160](https://github.com/yt-dlp/yt-dlp/issues/14160)) by [seproDev](https://github.com/seproDev) +- **skeb**: [Support wav files](https://github.com/yt-dlp/yt-dlp/commit/d6950c27af31908363c5c815e3b7eb4f9ff41643) ([#14147](https://github.com/yt-dlp/yt-dlp/issues/14147)) by [seproDev](https://github.com/seproDev) +- **youtube** + - [Add `tcc` player JS variant](https://github.com/yt-dlp/yt-dlp/commit/8f4a908300f55054bc96814bceeaa1034fdf4110) ([#14134](https://github.com/yt-dlp/yt-dlp/issues/14134)) by [bashonly](https://github.com/bashonly) + - [Deprioritize `web_safari` m3u8 formats](https://github.com/yt-dlp/yt-dlp/commit/5c7ad68ff1643ad80d18cef8be9db8fcab05ee6c) ([#14168](https://github.com/yt-dlp/yt-dlp/issues/14168)) by [bashonly](https://github.com/bashonly) + - [Player client maintenance](https://github.com/yt-dlp/yt-dlp/commit/3bd91544122142a87863d79e54e995c26cfd7f92) ([#14135](https://github.com/yt-dlp/yt-dlp/issues/14135)) by [bashonly](https://github.com/bashonly) + - [Use alternative `tv` user-agent when authenticated](https://github.com/yt-dlp/yt-dlp/commit/8cd37b85d492edb56a4f7506ea05527b85a6b02b) ([#14169](https://github.com/yt-dlp/yt-dlp/issues/14169)) by [bashonly](https://github.com/bashonly) + ### 2025.08.22 #### Core 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-08-23 01:59:42.000000000 +0200 +++ new/yt-dlp/README.md 2025-08-28 01:58:14.000000000 +0200 @@ -1802,7 +1802,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,tv_simply,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_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_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-08-23 01:59:43.000000000 +0200 +++ new/yt-dlp/README.txt 2025-08-28 01:58:15.000000000 +0200 @@ -2226,7 +2226,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,tv_simply,web is used, but + 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 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yt-dlp/test/test_youtube_signature.py new/yt-dlp/test/test_youtube_signature.py --- old/yt-dlp/test/test_youtube_signature.py 2025-08-23 01:59:23.000000000 +0200 +++ new/yt-dlp/test/test_youtube_signature.py 2025-08-28 01:56:57.000000000 +0200 @@ -148,6 +148,11 @@ 'gN7a-hudCuAuPH6fByOk1_GNXN0yNMHShjZXS2VOgsEItAJz0tipeavEOmNdYN-wUtcEqD3bCXjc0iyKfAyZxCBGgIARwsSdQfJ2CJtt', 'ttJC2JfQdSswRAIgGBCxZyAfKyi0cjXCb3DqEctUw-NYdNmOEvaepit2zJAsIEggOVaSXZjhSHMNy0NXNG_1kOyBf6HPuAuCduh-', ), + ( + 'https://www.youtube.com/s/player/5ec65609/player_ias_tcc.vflset/en_US/base.js', + 'AAJAJfQdSswRAIgNSN0GDUcHnCIXkKcF61yLBgDHiX1sUhOJdY4_GxunRYCIDeYNYP_16mQTPm5f1OVq3oV1ijUNYPjP4iUSMAjO9bZ', + 'AJfQdSswRAIgNSN0GDUcHnCIXkKcF61ZLBgDHiX1sUhOJdY4_GxunRYCIDyYNYP_16mQTPm5f1OVq3oV1ijUNYPjP4iUSMAjO9be', + ), ] _NSIG_TESTS = [ @@ -395,6 +400,10 @@ 'https://www.youtube.com/s/player/010fbc8d/player_es6.vflset/en_US/base.js', '0hlOAlqjFszVvF4Z', 'R-H23bZGAsRFTg', ), + ( + 'https://www.youtube.com/s/player/5ec65609/player_ias_tcc.vflset/en_US/base.js', + '6l5CTNx4AzIqH4MXM', 'NupToduxHBew1g', + ), ] 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-08-23 01:59:44.000000000 +0200 +++ new/yt-dlp/yt-dlp.1 2025-08-28 01:58:16.000000000 +0200 @@ -2669,7 +2669,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,tv_simply,web\f[R] is used, but +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 \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] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yt-dlp/yt_dlp/extractor/generic.py new/yt-dlp/yt_dlp/extractor/generic.py --- old/yt-dlp/yt_dlp/extractor/generic.py 2025-08-23 01:59:23.000000000 +0200 +++ new/yt-dlp/yt_dlp/extractor/generic.py 2025-08-28 01:56:57.000000000 +0200 @@ -772,8 +772,8 @@ if default_search in ('auto', 'auto_warning', 'fixup_error'): if re.match(r'[^\s/]+\.[^\s/]+/', url): - self.report_warning('The url doesn\'t specify the protocol, trying with http') - return self.url_result('http://' + url) + self.report_warning('The url doesn\'t specify the protocol, trying with https') + return self.url_result('https://' + url) elif default_search != 'fixup_error': if default_search == 'auto_warning': if re.match(r'^(?:url|URL)$', url): @@ -786,9 +786,7 @@ return self.url_result('ytsearch:' + url) if default_search in ('error', 'fixup_error'): - raise ExtractorError( - f'{url!r} is not a valid URL. ' - f'Set --default-search "ytsearch" (or run yt-dlp "ytsearch:{url}" ) to search YouTube', expected=True) + raise ExtractorError(f'{url!r} is not a valid URL', expected=True) else: if ':' not in default_search: default_search += ':' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yt-dlp/yt_dlp/extractor/skeb.py new/yt-dlp/yt_dlp/extractor/skeb.py --- old/yt-dlp/yt_dlp/extractor/skeb.py 2025-08-23 01:59:23.000000000 +0200 +++ new/yt-dlp/yt_dlp/extractor/skeb.py 2025-08-28 01:56:57.000000000 +0200 @@ -51,6 +51,20 @@ }, 'playlist_count': 2, 'expected_warnings': ['Skipping unsupported extension'], + }, { + 'url': 'https://skeb.jp/@Yossshy_Music/works/13', + 'info_dict': { + 'ext': 'wav', + 'id': '5566495', + 'title': '13-1', + 'description': 'md5:1026b8b9ae38c67c2d995970ec196550', + 'uploader': 'Yossshy', + 'uploader_id': 'Yossshy_Music', + 'duration': 336, + 'thumbnail': r're:https?://.+', + 'tags': 'count:59', + 'genres': ['music'], + }, }] def _call_api(self, uploader_id, work_id): @@ -87,7 +101,7 @@ entries = [] for idx, preview in enumerate(traverse_obj(works, ('previews', lambda _, v: url_or_none(v['url']))), 1): ext = traverse_obj(preview, ('information', 'extension', {str})) - if ext not in ('mp3', 'mp4'): + if ext not in ('mp3', 'mp4', 'wav'): self.report_warning(f'Skipping unsupported extension "{ext}"') continue @@ -100,7 +114,7 @@ 'url': preview['vtt_url'], }], } if url_or_none(preview.get('vtt_url')) else None, - 'vcodec': 'none' if ext == 'mp3' else None, + 'vcodec': 'none' if ext in ('mp3', 'wav') else None, **info, **traverse_obj(preview, { 'id': ('id', {str_or_none}), 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-08-23 01:59:23.000000000 +0200 +++ new/yt-dlp/yt_dlp/extractor/youtube/_base.py 2025-08-28 01:56:57.000000000 +0200 @@ -305,12 +305,13 @@ 'client': { 'clientName': 'TVHTML5', 'clientVersion': '7.20250312.16.00', - # See: https://github.com/youtube/cobalt/blob/main/cobalt/browser/user_agent/user_agent_platform_info.cc#L506 - 'userAgent': 'Mozilla/5.0 (ChromiumStylePlatform) Cobalt/25.lts.30.1034943-gold (unlike Gecko), Unknown_TV_Unknown_0/Unknown (Unknown, Unknown)', + 'userAgent': 'Mozilla/5.0 (ChromiumStylePlatform) Cobalt/Version', }, }, 'INNERTUBE_CONTEXT_CLIENT_NAME': 7, 'SUPPORTS_COOKIES': True, + # See: https://github.com/youtube/cobalt/blob/main/cobalt/browser/user_agent/user_agent_platform_info.cc#L506 + 'AUTHENTICATED_USER_AGENT': 'Mozilla/5.0 (ChromiumStylePlatform) Cobalt/25.lts.30.1034943-gold (unlike Gecko), Unknown_TV_Unknown_0/Unknown (Unknown, Unknown)', }, 'tv_simply': { 'INNERTUBE_CONTEXT': { @@ -369,6 +370,7 @@ ytcfg.setdefault('REQUIRE_AUTH', False) ytcfg.setdefault('SUPPORTS_COOKIES', False) ytcfg.setdefault('PLAYER_PARAMS', None) + ytcfg.setdefault('AUTHENTICATED_USER_AGENT', None) ytcfg['INNERTUBE_CONTEXT']['client'].setdefault('hl', 'en') _, base_client, variant = _split_innertube_client(client) @@ -656,7 +658,14 @@ _YT_INITIAL_PLAYER_RESPONSE_RE = r'ytInitialPlayerResponse\s*=' def _get_default_ytcfg(self, client='web'): - return copy.deepcopy(INNERTUBE_CLIENTS[client]) + ytcfg = copy.deepcopy(INNERTUBE_CLIENTS[client]) + + # Currently, only the tv client needs to use an alternative user-agent when logged-in + if ytcfg.get('AUTHENTICATED_USER_AGENT') and self.is_authenticated: + client_context = ytcfg.setdefault('INNERTUBE_CONTEXT', {}).setdefault('client', {}) + client_context['userAgent'] = ytcfg['AUTHENTICATED_USER_AGENT'] + + return ytcfg def _get_innertube_host(self, client='web'): return INNERTUBE_CLIENTS[client]['INNERTUBE_HOST'] @@ -955,7 +964,8 @@ ytcfg = self.extract_ytcfg(video_id, webpage) or {} # Workaround for https://github.com/yt-dlp/yt-dlp/issues/12563 - if client == 'tv': + # But it's not effective when logged-in + if client == 'tv' and not self.is_authenticated: config_info = traverse_obj(ytcfg, ( 'INNERTUBE_CONTEXT', 'client', 'configInfo', {dict})) or {} config_info.pop('appInstallData', None) 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-08-23 01:59:23.000000000 +0200 +++ new/yt-dlp/yt_dlp/extractor/youtube/_video.py 2025-08-28 01:56:57.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', 'tv_simply', 'web') + _DEFAULT_CLIENTS = ('tv_simply', 'tv', 'web') _DEFAULT_AUTHED_CLIENTS = ('tv', 'web_safari', 'web') # Premium does not require POT (except for subtitles) _DEFAULT_PREMIUM_CLIENTS = ('tv', 'web_creator', 'web') @@ -1817,6 +1817,7 @@ _PLAYER_JS_VARIANT_MAP = { 'main': 'player_ias.vflset/en_US/base.js', + 'tcc': 'player_ias_tcc.vflset/en_US/base.js', 'tce': 'player_ias_tce.vflset/en_US/base.js', 'es5': 'player_es5.vflset/en_US/base.js', 'es6': 'player_es6.vflset/en_US/base.js', @@ -3610,6 +3611,10 @@ if f.get('source_preference') is None: f['source_preference'] = -1 + # Deprioritize since its pre-merged m3u8 formats may have lower quality audio streams + if client_name == 'web_safari' and proto == 'hls' and live_status != 'is_live': + f['source_preference'] -= 1 + if missing_pot: f['format_note'] = join_nonempty(f.get('format_note'), 'MISSING POT', delim=' ') f['source_preference'] -= 20 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-08-23 01:59:38.000000000 +0200 +++ new/yt-dlp/yt_dlp/version.py 2025-08-28 01:58:09.000000000 +0200 @@ -1,8 +1,8 @@ # Autogenerated by devscripts/update-version.py -__version__ = '2025.08.22' +__version__ = '2025.08.27' -RELEASE_GIT_HEAD = '5c8bcfdbc638dfde13e93157637d8521413ed774' +RELEASE_GIT_HEAD = '8cd37b85d492edb56a4f7506ea05527b85a6b02b' VARIANT = None @@ -12,4 +12,4 @@ ORIGIN = 'yt-dlp/yt-dlp' -_pkg_version = '2025.08.22' +_pkg_version = '2025.08.27'