From 6e7072c53a0c25414b0ad573d91219d7f9f18369 Mon Sep 17 00:00:00 2001 From: Simon Sawicki Date: Fri, 20 Dec 2024 21:44:10 +0100 Subject: [PATCH 1/4] Fix allow-u in core --- README.md | 2 +- yt_dlp/YoutubeDL.py | 23 +++++++++++------------ yt_dlp/__init__.py | 18 +----------------- yt_dlp/downloader/external.py | 1 - yt_dlp/downloader/f4m.py | 15 +++++++-------- yt_dlp/downloader/hls.py | 17 +++++++++-------- 6 files changed, 29 insertions(+), 47 deletions(-) diff --git a/README.md b/README.md index 1db4ed2a5..3605e3978 100644 --- a/README.md +++ b/README.md @@ -2319,7 +2319,7 @@ #### Developer options --test Download only part of video for testing extractors --load-pages Load pages dumped by --write-pages --youtube-print-sig-code For testing youtube signatures - --allow-unplayable-formats List unplayable formats also + --allow-unplayable-formats List unplayable formats also. Implies `--simulate` and `--list-formats`. --no-allow-unplayable-formats Default #### Old aliases diff --git a/yt_dlp/YoutubeDL.py b/yt_dlp/YoutubeDL.py index 65b72e026..b215fc9fe 100644 --- a/yt_dlp/YoutubeDL.py +++ b/yt_dlp/YoutubeDL.py @@ -240,7 +240,7 @@ class YoutubeDL: You can also pass a function. The function takes 'ctx' as argument and returns the formats to download. See "build_format_selector" for an implementation - allow_unplayable_formats: Allow unplayable formats to be extracted and downloaded. + allow_unplayable_formats: Allow unplayable formats to be extracted. ignore_no_formats_error: Ignore "No video formats" error. Usefull for extracting metadata even if the video is not actually available for download (experimental) @@ -683,11 +683,14 @@ def process_color_policy(stream): self.deprecated_feature(system_deprecation.replace('\n', '\n ')) if self.params.get('allow_unplayable_formats'): + from . import _IN_CLI + + switch = '--allow-unplayable-formats' if _IN_CLI else 'allow_unplayable_formats' self.report_warning( - f'You have asked for {self._format_err("UNPLAYABLE", self.Styles.EMPHASIS)} formats to be listed/downloaded. ' - 'This is a developer option intended for debugging. \n' - ' If you experience any issues while using this option, ' - f'{self._format_err("DO NOT", self.Styles.ERROR)} open a bug report') + f'{switch} is a {self._format_err("developer option", self.Styles.EMPHASIS)} intended for {self._format_err("debugging", self.Styles.EMPHASIS)}. \n' + f' If you experience issues {self._format_err("DO NOT", self.Styles.ERROR)} open a bug report.') + self.params['listformats'] = True + self.params['simulate'] = 'list_only' if self.params.get('bidi_workaround', False): try: @@ -2811,6 +2814,7 @@ def sanitize_numeric_fields(info): info_dict['_has_drm'] = any( # or None ensures --clean-infojson removes it f.get('has_drm') and f['has_drm'] != 'maybe' for f in formats) or None if not self.params.get('allow_unplayable_formats'): + # Allow bypassing flaky `has_drm` detection formats = [f for f in formats if not f.get('has_drm') or f['has_drm'] == 'maybe'] if formats and all(f.get('acodec') == f.get('vcodec') == 'none' for f in formats): @@ -3426,12 +3430,7 @@ def correct_ext(filename, ext=new_ext): success, real_download = self.dl(temp_filename, info_dict) info_dict['__real_download'] = real_download else: - if self.params.get('allow_unplayable_formats'): - self.report_warning( - 'You have requested merging of multiple formats ' - 'while also allowing unplayable formats to be downloaded. ' - 'The formats won\'t be merged to prevent data corruption.') - elif not merger.available: + if not merger.available: msg = 'You have requested merging of multiple formats but ffmpeg is not installed' if not self.params.get('ignoreerrors'): self.report_error(f'{msg}. Aborting due to --abort-on-error') @@ -3462,7 +3461,7 @@ def correct_ext(filename, ext=new_ext): info_dict['__real_download'] = info_dict['__real_download'] or real_download success = success and partial_success - if downloaded and merger.available and not self.params.get('allow_unplayable_formats'): + if downloaded and merger.available: info_dict['__postprocessors'].append(merger) info_dict['__files_to_merge'] = downloaded # Even if there were no downloads, it is being merged only now diff --git a/yt_dlp/__init__.py b/yt_dlp/__init__.py index 20111175b..63625115f 100644 --- a/yt_dlp/__init__.py +++ b/yt_dlp/__init__.py @@ -504,8 +504,7 @@ def report_args_compat(name, value, key1, key2=None, where=None): opts.postprocessor_args['default'] = opts.postprocessor_args.pop('default-compat') opts.postprocessor_args.setdefault('sponskrub', []) - def report_conflict(arg1, opt1, arg2='--allow-unplayable-formats', opt2='allow_unplayable_formats', - val1=NO_DEFAULT, val2=NO_DEFAULT, default=False): + def report_conflict(arg1, opt1, arg2, opt2, val1=NO_DEFAULT, val2=NO_DEFAULT, default=False): if val2 is NO_DEFAULT: val2 = getattr(opts, opt2) if not val2: @@ -533,21 +532,6 @@ def report_conflict(arg1, opt1, arg2='--allow-unplayable-formats', opt2='allow_u report_conflict('--sponskrub-cut', 'sponskrub_cut', '--split-chapter', 'split_chapters', val1=opts.sponskrub and opts.sponskrub_cut) - # Conflicts with --allow-unplayable-formats - report_conflict('--embed-metadata', 'addmetadata') - report_conflict('--embed-chapters', 'addchapters') - report_conflict('--embed-info-json', 'embed_infojson') - report_conflict('--embed-subs', 'embedsubtitles') - report_conflict('--embed-thumbnail', 'embedthumbnail') - report_conflict('--extract-audio', 'extractaudio') - report_conflict('--fixup', 'fixup', val1=opts.fixup not in (None, 'never', 'ignore'), default='never') - report_conflict('--recode-video', 'recodevideo') - report_conflict('--remove-chapters', 'remove_chapters', default=[]) - report_conflict('--remux-video', 'remuxvideo') - report_conflict('--sponskrub', 'sponskrub') - report_conflict('--sponsorblock-remove', 'sponsorblock_remove', default=set()) - report_conflict('--xattrs', 'xattrs') - # Fully deprecated options def report_deprecation(val, old, new=None): if not val: diff --git a/yt_dlp/downloader/external.py b/yt_dlp/downloader/external.py index 7f6b5b45c..7afee9727 100644 --- a/yt_dlp/downloader/external.py +++ b/yt_dlp/downloader/external.py @@ -470,7 +470,6 @@ def can_merge_formats(cls, info_dict, params): return ( info_dict.get('requested_formats') and info_dict.get('protocol') - and not params.get('allow_unplayable_formats') and 'no-direct-merge' not in params.get('compat_opts', []) and cls.can_download(info_dict)) diff --git a/yt_dlp/downloader/f4m.py b/yt_dlp/downloader/f4m.py index 22d0ebd26..9d3fb4a46 100644 --- a/yt_dlp/downloader/f4m.py +++ b/yt_dlp/downloader/f4m.py @@ -256,14 +256,13 @@ def _get_unencrypted_media(self, doc): media = doc.findall(_add_ns('media')) if not media: self.report_error('No media found') - if not self.params.get('allow_unplayable_formats'): - for e in (doc.findall(_add_ns('drmAdditionalHeader')) - + doc.findall(_add_ns('drmAdditionalHeaderSet'))): - # If id attribute is missing it's valid for all media nodes - # without drmAdditionalHeaderId or drmAdditionalHeaderSetId attribute - if 'id' not in e.attrib: - self.report_error('Missing ID in f4m DRM') - media = remove_encrypted_media(media) + for e in (doc.findall(_add_ns('drmAdditionalHeader')) + + doc.findall(_add_ns('drmAdditionalHeaderSet'))): + # If id attribute is missing it's valid for all media nodes + # without drmAdditionalHeaderId or drmAdditionalHeaderSetId attribute + if 'id' not in e.attrib: + self.report_error('Missing ID in f4m DRM') + media = remove_encrypted_media(media) if not media: self.report_error('Unsupported DRM') return media diff --git a/yt_dlp/downloader/hls.py b/yt_dlp/downloader/hls.py index da2574da7..057373089 100644 --- a/yt_dlp/downloader/hls.py +++ b/yt_dlp/downloader/hls.py @@ -15,6 +15,7 @@ traverse_obj, update_url_query, urljoin, + deprecation_warning, ) @@ -38,6 +39,8 @@ def _has_drm(manifest): # TODO: https://github.com/yt-dlp/yt-dlp/pull/5039 @classmethod def can_download(cls, manifest, info_dict, allow_unplayable_formats=False): + if allow_unplayable_formats: + deprecation_warning('allow_unplayable_formats is not supported', stacklevel=1) UNSUPPORTED_FEATURES = [ # r'#EXT-X-BYTERANGE', # playlists composed of byte ranges of media files [2] @@ -57,17 +60,15 @@ def can_download(cls, manifest, info_dict, allow_unplayable_formats=False): # 4. https://tools.ietf.org/html/draft-pantos-http-live-streaming-17#section-4.3.3.5 # 5. https://tools.ietf.org/html/draft-pantos-http-live-streaming-17#section-4.3.2.5 ] - if not allow_unplayable_formats: - UNSUPPORTED_FEATURES += [ - r'#EXT-X-KEY:METHOD=(?!NONE|AES-128)', # encrypted streams [1], but not necessarily DRM - ] + UNSUPPORTED_FEATURES += [ + r'#EXT-X-KEY:METHOD=(?!NONE|AES-128)', # encrypted streams [1], but not necessarily DRM + ] def check_results(): yield not info_dict.get('is_live') for feature in UNSUPPORTED_FEATURES: yield not re.search(feature, manifest) - if not allow_unplayable_formats: - yield not cls._has_drm(manifest) + yield not cls._has_drm(manifest) return all(check_results()) def real_download(self, filename, info_dict): @@ -78,7 +79,7 @@ def real_download(self, filename, info_dict): man_url = urlh.url s = urlh.read().decode('utf-8', 'ignore') - can_download, message = self.can_download(s, info_dict, self.params.get('allow_unplayable_formats')), None + can_download, message = self.can_download(s, info_dict), None if can_download: has_ffmpeg = FFmpegFD.available() no_crypto = not Cryptodome.AES and '#EXT-X-KEY:METHOD=AES-128' in s @@ -92,7 +93,7 @@ def real_download(self, filename, info_dict): message = ('Live HLS streams are not supported by the native downloader. If this is a livestream, ' f'please {install_ffmpeg}add "--downloader ffmpeg --hls-use-mpegts" to your command') if not can_download: - if self._has_drm(s) and not self.params.get('allow_unplayable_formats'): + if self._has_drm(s): if info_dict.get('has_drm') and self.params.get('test'): self.to_screen(f'[{self.FD_NAME}] This format is DRM protected', skip_eol=True) else: From ec8b22b1c120d0913d2d7c26418a2693a199b044 Mon Sep 17 00:00:00 2001 From: Simon Sawicki Date: Fri, 20 Dec 2024 21:53:33 +0100 Subject: [PATCH 2/4] Remove allow-u from extractors --- yt_dlp/extractor/globo.py | 2 +- yt_dlp/extractor/hotstar.py | 2 +- yt_dlp/extractor/ivi.py | 7 +++++-- yt_dlp/extractor/kaltura.py | 7 ++++++- yt_dlp/extractor/limelight.py | 11 ++++++++--- yt_dlp/extractor/ninecninemedia.py | 3 +-- yt_dlp/extractor/ninenow.py | 2 +- yt_dlp/extractor/nova.py | 3 +-- yt_dlp/extractor/npo.py | 5 ++--- yt_dlp/extractor/prosiebensat1.py | 2 +- yt_dlp/extractor/rai.py | 5 ++--- yt_dlp/extractor/redbee.py | 17 ++++++++++++----- yt_dlp/extractor/ruutu.py | 3 +-- yt_dlp/extractor/shahid.py | 2 +- yt_dlp/extractor/sonyliv.py | 2 +- yt_dlp/extractor/toggle.py | 3 +-- yt_dlp/extractor/toutv.py | 2 +- yt_dlp/extractor/vidio.py | 3 +-- yt_dlp/extractor/youtube.py | 2 +- 19 files changed, 48 insertions(+), 35 deletions(-) diff --git a/yt_dlp/extractor/globo.py b/yt_dlp/extractor/globo.py index d72296be6..f8308757a 100644 --- a/yt_dlp/extractor/globo.py +++ b/yt_dlp/extractor/globo.py @@ -87,7 +87,7 @@ def _real_extract(self, url): video = self._download_json( f'http://api.globovideos.com/videos/{video_id}/playlist', video_id)['videos'][0] - if not self.get_param('allow_unplayable_formats') and video.get('encrypted') is True: + if video.get('encrypted') is True: self.report_drm(video_id) title = video['title'] diff --git a/yt_dlp/extractor/hotstar.py b/yt_dlp/extractor/hotstar.py index e97740c90..57831aad7 100644 --- a/yt_dlp/extractor/hotstar.py +++ b/yt_dlp/extractor/hotstar.py @@ -236,7 +236,7 @@ def _real_extract(self, url): self._call_api_v1( f'{video_type}/detail', video_id, fatal=False, query={'tas': 10000, 'contentId': video_id}), ('body', 'results', 'item', {dict})) or {} - if not self.get_param('allow_unplayable_formats') and video_data.get('drmProtected'): + if video_data.get('drmProtected'): self.report_drm(video_id) # See https://github.com/yt-dlp/yt-dlp/issues/396 diff --git a/yt_dlp/extractor/ivi.py b/yt_dlp/extractor/ivi.py index 57c276a67..171b1f796 100644 --- a/yt_dlp/extractor/ivi.py +++ b/yt_dlp/extractor/ivi.py @@ -140,13 +140,14 @@ def _real_extract(self, url): quality = qualities(self._KNOWN_FORMATS) formats = [] + has_drm = False for f in result.get('files', []): f_url = f.get('url') content_format = f.get('content_format') if not f_url: continue - if (not self.get_param('allow_unplayable_formats') - and ('-MDRM-' in content_format or '-FPS-' in content_format)): + if '-MDRM-' in content_format or '-FPS-' in content_format: + has_drm = True continue formats.append({ 'url': f_url, @@ -154,6 +155,8 @@ def _real_extract(self, url): 'quality': quality(content_format), 'filesize': int_or_none(f.get('size_in_bytes')), }) + if not formats and has_drm: + self.report_drm(video_id) compilation = result.get('compilation') episode = title if compilation else None diff --git a/yt_dlp/extractor/kaltura.py b/yt_dlp/extractor/kaltura.py index 6d51e32f6..cd2832466 100644 --- a/yt_dlp/extractor/kaltura.py +++ b/yt_dlp/extractor/kaltura.py @@ -464,6 +464,7 @@ def sign_url(unsigned_url): formats = [] subtitles = {} + has_drm = False for f in flavor_assets: # Continue if asset is not ready if f.get('status') != 2: @@ -473,7 +474,8 @@ def sign_url(unsigned_url): if f.get('fileExt') == 'chun': continue # DRM-protected video, cannot be decrypted - if not self.get_param('allow_unplayable_formats') and f.get('fileExt') == 'wvm': + if f.get('fileExt') == 'wvm': + has_drm = True continue if not f.get('fileExt'): # QT indicates QuickTime; some videos have broken fileExt @@ -513,6 +515,9 @@ def sign_url(unsigned_url): formats.extend(fmts) self._merge_subtitles(subs, target=subtitles) + if not formats and has_drm: + self.report_drm(entry_id) + if captions: for caption in captions.get('objects', []): # Continue if caption is not ready diff --git a/yt_dlp/extractor/limelight.py b/yt_dlp/extractor/limelight.py index 763a01448..522e0409f 100644 --- a/yt_dlp/extractor/limelight.py +++ b/yt_dlp/extractor/limelight.py @@ -91,11 +91,13 @@ def _extract_info(self, pc, mobile, i, referer): formats = [] urls = [] + has_drm = False for stream in pc_item.get('streams', []): stream_url = stream.get('url') if not stream_url or stream_url in urls: continue - if not self.get_param('allow_unplayable_formats') and stream.get('drmProtected'): + if stream.get('drmProtected'): + has_drm = True continue urls.append(stream_url) ext = determine_ext(stream_url) @@ -159,8 +161,8 @@ def _extract_info(self, pc, mobile, i, referer): format_id = mobile_url.get('targetMediaPlatform') if not media_url or media_url in urls: continue - if (format_id in ('Widevine', 'SmoothStreaming') - and not self.get_param('allow_unplayable_formats', False)): + if format_id in ('Widevine', 'SmoothStreaming'): + has_drm = True continue urls.append(media_url) ext = determine_ext(media_url) @@ -179,6 +181,9 @@ def _extract_info(self, pc, mobile, i, referer): 'ext': ext, }) + if not formats and has_drm: + self.report_drm(video_id) + subtitles = {} for flag in mobile_item.get('flags'): if flag == 'ClosedCaptions': diff --git a/yt_dlp/extractor/ninecninemedia.py b/yt_dlp/extractor/ninecninemedia.py index 93e28624b..cc2da0875 100644 --- a/yt_dlp/extractor/ninecninemedia.py +++ b/yt_dlp/extractor/ninecninemedia.py @@ -29,8 +29,7 @@ def _real_extract(self, url): '$include': '[HasClosedCaptions]', }) - if (not self.get_param('allow_unplayable_formats') - and try_get(content_package, lambda x: x['Constraints']['Security']['Type'])): + if try_get(content_package, lambda x: x['Constraints']['Security']['Type']): self.report_drm(content_id) manifest_base_url = content_package_url + 'manifest.' diff --git a/yt_dlp/extractor/ninenow.py b/yt_dlp/extractor/ninenow.py index f17531e62..77e8e4d71 100644 --- a/yt_dlp/extractor/ninenow.py +++ b/yt_dlp/extractor/ninenow.py @@ -85,7 +85,7 @@ def _real_extract(self, url): else: raise ExtractorError('Unable to find video data') - if not self.get_param('allow_unplayable_formats') and try_get(common_data, lambda x: x['episode']['video']['drm'], bool): + if try_get(common_data, lambda x: x['episode']['video']['drm'], bool): self.report_drm(display_id) brightcove_id = try_get( common_data, lambda x: x['episode']['video']['brightcoveId'], str) or 'ref:{}'.format(common_data['episode']['video']['referenceId']) diff --git a/yt_dlp/extractor/nova.py b/yt_dlp/extractor/nova.py index e7b69e370..544609ec3 100644 --- a/yt_dlp/extractor/nova.py +++ b/yt_dlp/extractor/nova.py @@ -65,8 +65,7 @@ def process_format_list(format_list, format_id=''): for format_dict in format_list: if not isinstance(format_dict, dict): continue - if (not self.get_param('allow_unplayable_formats') - and traverse_obj(format_dict, ('drm', 'keySystem'))): + if traverse_obj(format_dict, ('drm', 'keySystem')): has_drm = True continue format_url = url_or_none(format_dict.get('src')) diff --git a/yt_dlp/extractor/npo.py b/yt_dlp/extractor/npo.py index 178fd98bf..765256bd1 100644 --- a/yt_dlp/extractor/npo.py +++ b/yt_dlp/extractor/npo.py @@ -275,9 +275,8 @@ def _real_extract(self, url): 'url': stream_url, }) - if not formats: - if not self.get_param('allow_unplayable_formats') and drm: - self.report_drm(video_id) + if not formats and drm: + self.report_drm(video_id) info = { 'id': video_id, diff --git a/yt_dlp/extractor/prosiebensat1.py b/yt_dlp/extractor/prosiebensat1.py index e8a471205..a651a3892 100644 --- a/yt_dlp/extractor/prosiebensat1.py +++ b/yt_dlp/extractor/prosiebensat1.py @@ -31,7 +31,7 @@ def _extract_video_info(self, url, clip_id): 'ids': clip_id, })[0] - if not self.get_param('allow_unplayable_formats') and video.get('is_protected') is True: + if video.get('is_protected') is True: self.report_drm(clip_id) formats = [] diff --git a/yt_dlp/extractor/rai.py b/yt_dlp/extractor/rai.py index efb47affc..926a09706 100644 --- a/yt_dlp/extractor/rai.py +++ b/yt_dlp/extractor/rai.py @@ -340,9 +340,8 @@ def _real_extract(self, url): media = self._download_json( f'{base}.json', video_id, 'Downloading video JSON') - if not self.get_param('allow_unplayable_formats'): - if traverse_obj(media, (('program_info', None), 'rights_management', 'rights', 'drm')): - self.report_drm(video_id) + if traverse_obj(media, (('program_info', None), 'rights_management', 'rights', 'drm')): + self.report_drm(video_id) video = media['video'] relinker_info = self._extract_relinker_info(video['content_url'], video_id) diff --git a/yt_dlp/extractor/redbee.py b/yt_dlp/extractor/redbee.py index d43bb0bab..dbc6f1e45 100644 --- a/yt_dlp/extractor/redbee.py +++ b/yt_dlp/extractor/redbee.py @@ -337,12 +337,16 @@ def _real_extract(self, url): 'height': height, }) + has_drm = False mpd_url = None if data.get('isLive') else data.get('urlDash') - if mpd_url and (self.get_param('allow_unplayable_formats') or not data.get('drm')): - fmts, subs = self._extract_mpd_formats_and_subtitles( - mpd_url, media_id, mpd_id='dash', fatal=False) - formats.extend(fmts) - self._merge_subtitles(subs, target=subtitles) + if mpd_url: + if data.get('drm'): + has_drm = True + else: + fmts, subs = self._extract_mpd_formats_and_subtitles( + mpd_url, media_id, mpd_id='dash', fatal=False) + formats.extend(fmts) + self._merge_subtitles(subs, target=subtitles) audio_url = data.get('urlAudio') if audio_url: @@ -365,6 +369,9 @@ def _real_extract(self, url): formats.extend(fmts) self._merge_subtitles(subs, target=subtitles) + if not formats and has_drm: + self.report_drm(media_id) + return { 'id': media_id, 'formats': formats, diff --git a/yt_dlp/extractor/ruutu.py b/yt_dlp/extractor/ruutu.py index 2dddb39f9..b35c46a28 100644 --- a/yt_dlp/extractor/ruutu.py +++ b/yt_dlp/extractor/ruutu.py @@ -237,8 +237,7 @@ def pv(name): return value or None if not formats: - if (not self.get_param('allow_unplayable_formats') - and xpath_text(video_xml, './Clip/DRM', default=None)): + if xpath_text(video_xml, './Clip/DRM', default=None): self.report_drm(video_id) ns_st_cds = pv('ns_st_cds') if ns_st_cds != 'free': diff --git a/yt_dlp/extractor/shahid.py b/yt_dlp/extractor/shahid.py index f0a3b6b7d..cc3afec9f 100644 --- a/yt_dlp/extractor/shahid.py +++ b/yt_dlp/extractor/shahid.py @@ -111,7 +111,7 @@ def _real_extract(self, url): playout = self._call_api( 'playout/new/url/' + video_id, video_id)['playout'] - if not self.get_param('allow_unplayable_formats') and playout.get('drm'): + if playout.get('drm'): self.report_drm(video_id) formats = self._extract_m3u8_formats(re.sub( diff --git a/yt_dlp/extractor/sonyliv.py b/yt_dlp/extractor/sonyliv.py index 0cd914cbb..e5fe920b6 100644 --- a/yt_dlp/extractor/sonyliv.py +++ b/yt_dlp/extractor/sonyliv.py @@ -142,7 +142,7 @@ def _real_extract(self, url): video_id = self._match_id(url) content = self._call_api( '1.5', 'IN/CONTENT/VIDEOURL/VOD/' + video_id, video_id) - if not self.get_param('allow_unplayable_formats') and content.get('isEncrypted'): + if content.get('isEncrypted'): self.report_drm(video_id) dash_url = content['videoURL'] headers = { diff --git a/yt_dlp/extractor/toggle.py b/yt_dlp/extractor/toggle.py index fbef7cc0f..793cfd138 100644 --- a/yt_dlp/extractor/toggle.py +++ b/yt_dlp/extractor/toggle.py @@ -126,8 +126,7 @@ def _real_extract(self, url): }) if not formats: for meta in (info.get('Metas') or []): - if (not self.get_param('allow_unplayable_formats') - and meta.get('Key') == 'Encryption' and meta.get('Value') == '1'): + if meta.get('Key') == 'Encryption' and meta.get('Value') == '1': self.report_drm(video_id) # Most likely because geo-blocked if no formats and no DRM diff --git a/yt_dlp/extractor/toutv.py b/yt_dlp/extractor/toutv.py index cbd2c9c26..6350a363f 100644 --- a/yt_dlp/extractor/toutv.py +++ b/yt_dlp/extractor/toutv.py @@ -68,7 +68,7 @@ def _real_extract(self, url): }) # IsDrm does not necessarily mean the video is DRM protected (see # https://github.com/ytdl-org/youtube-dl/issues/13994). - if not self.get_param('allow_unplayable_formats') and metadata.get('IsDrm'): + if metadata.get('IsDrm'): self.report_warning('This video is probably DRM protected.', path) video_id = metadata['IdMedia'] details = metadata['Details'] diff --git a/yt_dlp/extractor/vidio.py b/yt_dlp/extractor/vidio.py index 955a11647..8ad1b7da1 100644 --- a/yt_dlp/extractor/vidio.py +++ b/yt_dlp/extractor/vidio.py @@ -261,8 +261,7 @@ def _real_extract(self, url): formats = [] if stream_meta.get('is_drm'): - if not self.get_param('allow_unplayable_formats'): - self.report_drm(video_id) + self.report_drm(video_id) if stream_meta.get('is_premium'): sources = self._download_json( f'https://www.vidio.com/interactions_stream.json?video_id={video_id}&type=livestreamings', diff --git a/yt_dlp/extractor/youtube.py b/yt_dlp/extractor/youtube.py index 0d3963116..bbd18fad9 100644 --- a/yt_dlp/extractor/youtube.py +++ b/yt_dlp/extractor/youtube.py @@ -4511,7 +4511,7 @@ def feed_entry(name): self.write_debug(f'{video_id}: Video is in Post-Live Manifestless mode') if not formats: - if not self.get_param('allow_unplayable_formats') and traverse_obj(streaming_data, (..., 'licenseInfos')): + if traverse_obj(streaming_data, (..., 'licenseInfos')): self.report_drm(video_id) pemr = get_first( playability_statuses, From f43d7a7c3bc851544a39199831b1e8dbefefba2f Mon Sep 17 00:00:00 2001 From: Simon Sawicki Date: Fri, 20 Dec 2024 23:42:49 +0100 Subject: [PATCH 3/4] oops --- yt_dlp/YoutubeDL.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yt_dlp/YoutubeDL.py b/yt_dlp/YoutubeDL.py index b215fc9fe..f8f09812c 100644 --- a/yt_dlp/YoutubeDL.py +++ b/yt_dlp/YoutubeDL.py @@ -690,7 +690,7 @@ def process_color_policy(stream): f'{switch} is a {self._format_err("developer option", self.Styles.EMPHASIS)} intended for {self._format_err("debugging", self.Styles.EMPHASIS)}. \n' f' If you experience issues {self._format_err("DO NOT", self.Styles.ERROR)} open a bug report.') self.params['listformats'] = True - self.params['simulate'] = 'list_only' + self.params['simulate'] = True if self.params.get('bidi_workaround', False): try: From 1ea8a0a60c14fc8e347ab911ec33db8644b158c3 Mon Sep 17 00:00:00 2001 From: Simon Sawicki Date: Sun, 22 Dec 2024 11:14:40 +0100 Subject: [PATCH 4/4] cleanup --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3605e3978..7c80fbbda 100644 --- a/README.md +++ b/README.md @@ -2319,7 +2319,7 @@ #### Developer options --test Download only part of video for testing extractors --load-pages Load pages dumped by --write-pages --youtube-print-sig-code For testing youtube signatures - --allow-unplayable-formats List unplayable formats also. Implies `--simulate` and `--list-formats`. + --allow-unplayable-formats List unplayable formats. Implies `--simulate` and `--list-formats`. --no-allow-unplayable-formats Default #### Old aliases