diff --git a/Maintainers.md b/Maintainers.md index 95feb306c0..cbb831c302 100644 --- a/Maintainers.md +++ b/Maintainers.md @@ -78,6 +78,13 @@ Core Maintainers are responsible for reviewing and merging contributions, publis * Improved/fixed/added ArdMediathek, DRTV, Floatplane, MagentaMusik, Naver, Nebula, OnDemandKorea, Vbox7 etc +## Maintainers + +Maintainers are stewards of the project's codebase who can review and merge pull requests. + +- [doe1080](https://github.com/doe1080) + + ## Triage Maintainers Triage Maintainers are frequent contributors who can manage issues and pull requests. @@ -86,5 +93,4 @@ Triage Maintainers are frequent contributors who can manage issues and pull requ - [garret1317](https://github.com/garret1317) - [pzhlkj6612](https://github.com/pzhlkj6612) - [DTrombett](https://github.com/dtrombett) -- [doe1080](https://github.com/doe1080) - [grqz](https://github.com/grqz) diff --git a/devscripts/changelog_override.json b/devscripts/changelog_override.json index 7ff3a6caa0..a1ff4f0893 100644 --- a/devscripts/changelog_override.json +++ b/devscripts/changelog_override.json @@ -367,5 +367,20 @@ "action": "add", "when": "25056f0d2d47adbd235a8d422fa62d68d0be2bc2", "short": "[priority] Security: [[CVE-2026-50574](https://nvd.nist.gov/vuln/detail/CVE-2026-50574)] [Arbitrary code execution via manifest downloads with aria2c](https://github.com/yt-dlp/yt-dlp/security/advisories/GHSA-vx4q-3cr2-7cg2)\n - Impact is limited to users of `--downloader aria2c`\n - Support for downloading HLS and DASH formats with aria2c has been removed. Users affected by this change should migrate to use `-N` for concurrent fragment downloads via the native downloader" + }, + { + "action": "add", + "when": "7b03011294c0210802ffc901390006c39152b999", + "short": "[priority] **The minimum *recommended* Python version has been raised to 3.11**\n - Since Python 3.10 will reach its end-of-life in October 2026, support for it will be dropped soon. [Read more](https://github.com/yt-dlp/yt-dlp/issues/16916)" + }, + { + "action": "add", + "when": "7b03011294c0210802ffc901390006c39152b999", + "short": "[priority] **The official Windows release binaries will soon require Windows 10 or later.** [Read more](https://github.com/yt-dlp/yt-dlp/issues/16917)" + }, + { + "action": "add", + "when": "b6590aaa1e3808155d69c9a79a797ae484163789", + "short": "[priority] Security: [[CVE-2026-55404](https://nvd.nist.gov/vuln/detail/CVE-2026-55404)] [Downstream command injection via improper sanitization of --write-link output](https://github.com/yt-dlp/yt-dlp/security/advisories/GHSA-6v4j-43gg-vj32)\n - Shortcut file data is now properly validated and sanitized when the `--write-link` options are used" } ] diff --git a/yt_dlp/YoutubeDL.py b/yt_dlp/YoutubeDL.py index 6f244a4666..a2675bd44d 100644 --- a/yt_dlp/YoutubeDL.py +++ b/yt_dlp/YoutubeDL.py @@ -1145,7 +1145,7 @@ class YoutubeDL: self.params['logger'].warning(message) elif self.params.get('no_warnings'): if self.params.get('verbose'): - self.to_stderr(f'[debug:warning] {message}', only_once=only_once) + self.to_stderr(f'[debug] WARNING: {message}', only_once=only_once) else: self.to_stderr(f'{self._format_err("WARNING:", self.Styles.WARNING)} {message}', only_once) diff --git a/yt_dlp/__init__.py b/yt_dlp/__init__.py index ec3d52755d..a78ec64f82 100644 --- a/yt_dlp/__init__.py +++ b/yt_dlp/__init__.py @@ -296,7 +296,7 @@ def validate_options(opts): default_step = start if op or limit else 0 return lambda n: min(float(start) + float(step or default_step) * n, float(limit or 'inf')) - for key, expr in opts.retry_sleep.items(): + for key, expr in list(opts.retry_sleep.items()): if not expr: del opts.retry_sleep[key] continue diff --git a/yt_dlp/extractor/adobeconnect.py b/yt_dlp/extractor/adobeconnect.py index b2934d6f76..2363d4b262 100644 --- a/yt_dlp/extractor/adobeconnect.py +++ b/yt_dlp/extractor/adobeconnect.py @@ -4,6 +4,7 @@ from .common import InfoExtractor class AdobeConnectIE(InfoExtractor): + _WORKING = False _VALID_URL = r'https?://\w+\.adobeconnect\.com/(?P[\w-]+)' def _real_extract(self, url): diff --git a/yt_dlp/extractor/dispeak.py b/yt_dlp/extractor/dispeak.py index 89c27e0b55..5694f66d33 100644 --- a/yt_dlp/extractor/dispeak.py +++ b/yt_dlp/extractor/dispeak.py @@ -11,6 +11,7 @@ from ..utils import ( class DigitallySpeakingIE(InfoExtractor): + _WORKING = False _VALID_URL = r'https?://(?:s?evt\.dispeak|events\.digitallyspeaking)\.com/(?:[^/]+/)+xml/(?P[^.]+)\.xml' _TESTS = [{ diff --git a/yt_dlp/extractor/folketinget.py b/yt_dlp/extractor/folketinget.py index 95095701bc..44d32f442c 100644 --- a/yt_dlp/extractor/folketinget.py +++ b/yt_dlp/extractor/folketinget.py @@ -10,6 +10,7 @@ from ..utils import ( class FolketingetIE(InfoExtractor): + _WORKING = False IE_DESC = 'Folketinget (ft.dk; Danish parliament)' _VALID_URL = r'https?://(?:www\.)?ft\.dk/webtv/video/[^?#]*?\.(?P[0-9]+)\.aspx' _TEST = { diff --git a/yt_dlp/extractor/karaoketv.py b/yt_dlp/extractor/karaoketv.py index 8168b1a492..45a5b816be 100644 --- a/yt_dlp/extractor/karaoketv.py +++ b/yt_dlp/extractor/karaoketv.py @@ -2,6 +2,7 @@ from .common import InfoExtractor class KaraoketvIE(InfoExtractor): + _WORKING = False _VALID_URL = r'https?://(?:www\.)?karaoketv\.co\.il/[^/]+/(?P\d+)' _TEST = { 'url': 'http://www.karaoketv.co.il/%D7%A9%D7%99%D7%A8%D7%99_%D7%A7%D7%A8%D7%99%D7%95%D7%A7%D7%99/58356/%D7%90%D7%99%D7%96%D7%95%D7%9F', diff --git a/yt_dlp/extractor/mangomolo.py b/yt_dlp/extractor/mangomolo.py index de62bef80e..5bf87d70aa 100644 --- a/yt_dlp/extractor/mangomolo.py +++ b/yt_dlp/extractor/mangomolo.py @@ -55,6 +55,18 @@ class MangomoloVideoIE(MangomoloBaseIE): _TYPE = 'video' IE_NAME = 'mangomolo:' + _TYPE _SLUG = r'video\?.*?\bid=(?P\d+)' + _TESTS = [{ + 'url': 'https://player.mangomolo.com/v1/video?id=29431242&user_id=168&signature=b40e58d964532fe09bf81fc08d850752&autoplay=true&fullscreen=yes&base_url=aHR0cHM6Ly9heW4ub20vdmlkZW8vMjk0MzEyNDIvJUQ4JUE3JUQ5JTg0JUQ4JUEzJUQ5JTg1JUQ5JTg2JUQ5JThBJUQ4JUE3JUQ4JUFBLSVEOCVBNyVEOSU4NCVEOCVCMyVEOCVBOCVEOCVCOS0lRDglQTclRDklODQlRDglQUQlRDklODQlRDklODIlRDglQTktOQ%3D%3D&vast=true&app_id=&zone=&filter=DENY&countries=Q0M%3D&language=ar&player_profile=', + 'info_dict': { + 'id': '29431242', + 'ext': 'flv', + 'title': '29431242', + }, + 'expected_warnings': [ + 'Failed to download m3u8 information', + 'Failed to download MPD manifest', + ], + }] _IS_LIVE = False diff --git a/yt_dlp/extractor/oktoberfesttv.py b/yt_dlp/extractor/oktoberfesttv.py index b4bcdc7417..e56cb7ec50 100644 --- a/yt_dlp/extractor/oktoberfesttv.py +++ b/yt_dlp/extractor/oktoberfesttv.py @@ -2,6 +2,7 @@ from .common import InfoExtractor class OktoberfestTVIE(InfoExtractor): + _WORKING = False _VALID_URL = r'https?://(?:www\.)?oktoberfest-tv\.de/[^/]+/[^/]+/video/(?P[^/?#]+)' _TEST = { diff --git a/yt_dlp/extractor/playtvak.py b/yt_dlp/extractor/playtvak.py index 12e2fa255b..89e65e832e 100644 --- a/yt_dlp/extractor/playtvak.py +++ b/yt_dlp/extractor/playtvak.py @@ -10,6 +10,7 @@ from ..utils import ( class PlaytvakIE(InfoExtractor): + _WORKING = False IE_DESC = 'Playtvak.cz, iDNES.cz and Lidovky.cz' _VALID_URL = r'https?://(?:.+?\.)?(?:playtvak|idnes|lidovky|metro)\.cz/.*\?(?:c|idvideo)=(?P[^&]+)' _TESTS = [{ diff --git a/yt_dlp/extractor/rtl2.py b/yt_dlp/extractor/rtl2.py index 86e383a018..53256b3e4b 100644 --- a/yt_dlp/extractor/rtl2.py +++ b/yt_dlp/extractor/rtl2.py @@ -5,6 +5,7 @@ from ..utils import int_or_none class RTL2IE(InfoExtractor): + _WORKING = False IE_NAME = 'rtl2' _VALID_URL = r'https?://(?:www\.)?rtl2\.de/sendung/[^/]+/(?:video/(?P\d+)[^/]+/(?P\d+)-|folge/)(?P[^/?#]+)' _TESTS = [{ diff --git a/yt_dlp/extractor/showroomlive.py b/yt_dlp/extractor/showroomlive.py index 303f0b3cc0..999b1f402c 100644 --- a/yt_dlp/extractor/showroomlive.py +++ b/yt_dlp/extractor/showroomlive.py @@ -7,6 +7,7 @@ from ..utils import ( class ShowRoomLiveIE(InfoExtractor): + _WORKING = False _VALID_URL = r'https?://(?:www\.)?showroom-live\.com/(?!onlive|timetable|event|campaign|news|ranking|room)(?P[^/?#&]+)' _TEST = { 'url': 'https://www.showroom-live.com/48_Nana_Okada', diff --git a/yt_dlp/extractor/unsupported.py b/yt_dlp/extractor/unsupported.py index 5f353c1fde..70c64ee90c 100644 --- a/yt_dlp/extractor/unsupported.py +++ b/yt_dlp/extractor/unsupported.py @@ -331,7 +331,7 @@ class KnownLiabilityIE(UnsupportedInfoExtractor): """ URLS = ( - r'motherless\.com', + r'motherless\.\w+', r'suno\.com', r'udio\.com', ) diff --git a/yt_dlp/extractor/walla.py b/yt_dlp/extractor/walla.py index 442a9bcf9f..45125489ac 100644 --- a/yt_dlp/extractor/walla.py +++ b/yt_dlp/extractor/walla.py @@ -8,6 +8,7 @@ from ..utils import ( class WallaIE(InfoExtractor): + _WORKING = False _VALID_URL = r'https?://vod\.walla\.co\.il/[^/]+/(?P\d+)/(?P.+)' _TEST = { 'url': 'http://vod.walla.co.il/movie/2642630/one-direction-all-for-one', diff --git a/yt_dlp/extractor/whowatch.py b/yt_dlp/extractor/whowatch.py index 9ca5c3b1a8..0a4e82bc54 100644 --- a/yt_dlp/extractor/whowatch.py +++ b/yt_dlp/extractor/whowatch.py @@ -9,6 +9,7 @@ from ..utils import ( class WhoWatchIE(InfoExtractor): + _WORKING = False IE_NAME = 'whowatch' _VALID_URL = r'https?://whowatch\.tv/viewer/(?P\d+)' diff --git a/yt_dlp/update.py b/yt_dlp/update.py index ad0862ab3e..9be6c23345 100644 --- a/yt_dlp/update.py +++ b/yt_dlp/update.py @@ -181,8 +181,7 @@ def _get_system_deprecation(): # Do not inappropriately warn for unofficial/third-party binaries if not ORIGIN.startswith('yt-dlp/'): return None - platform_name = platform.platform() - if any(platform_name.startswith(f'Windows-{name}') for name in ('8', '2012Server')): + if platform.platform().startswith(('Windows-8', 'Windows-2012Server')): return ( 'Support for Windows 8.x and Windows Server 2012 has been deprecated. ' 'See https://github.com/yt-dlp/yt-dlp/issues/16917 for details.\n'