]> jfr.im git - yt-dlp.git/commitdiff
[hls] Better FairPlay DRM detection (#1661)
authornyuszika7h <redacted>
Fri, 19 Nov 2021 01:49:51 +0000 (02:49 +0100)
committerGitHub <redacted>
Fri, 19 Nov 2021 01:49:51 +0000 (07:19 +0530)
Authored by: nyuszika7h

yt_dlp/downloader/hls.py
yt_dlp/extractor/common.py

index 61312c5ba558218e4452a91698078828126f0429..e932fd6aeada3a60f9c771702ee51016e446ec4c 100644 (file)
@@ -77,6 +77,15 @@ def real_download(self, filename, info_dict):
                 message = ('The stream has AES-128 encryption and neither ffmpeg nor pycryptodomex are available; '
                            'Decryption will be performed natively, but will be extremely slow')
         if not can_download:
+            has_drm = re.search('|'.join([
+                r'#EXT-X-FAXS-CM:',  # Adobe Flash Access
+                r'#EXT-X-(?:SESSION-)?KEY:.*?URI="skd://',  # Apple FairPlay
+            ]), s)
+            if has_drm and not self.params.get('allow_unplayable_formats'):
+                self.report_error(
+                    'This video is DRM protected; Try selecting another format with --format or '
+                    'add --check-formats to automatically fallback to the next best format')
+                return False
             message = message or 'Unsupported features have been detected'
             fd = FFmpegFD(self.ydl, self.params)
             self.report_warning(f'{message}; extraction will be delegated to {fd.get_basename()}')
index 6f0650296105c865449e1dedbf1d6639d6114847..a47364d076b13c86bb26725f0bb6ad96a59935cc 100644 (file)
@@ -2035,10 +2035,10 @@ def _parse_m3u8_formats_and_subtitles(
             video_id=None):
         formats, subtitles = [], {}
 
-        if '#EXT-X-FAXS-CM:' in m3u8_doc:  # Adobe Flash Access
-            return formats, subtitles
-
-        has_drm = re.search(r'#EXT-X-(?:SESSION-)?KEY:.*?URI="skd://', m3u8_doc)
+        has_drm = re.search('|'.join([
+            r'#EXT-X-FAXS-CM:',  # Adobe Flash Access
+            r'#EXT-X-(?:SESSION-)?KEY:.*?URI="skd://',  # Apple FairPlay
+        ]), m3u8_doc)
 
         def format_url(url):
             return url if re.match(r'^https?://', url) else compat_urlparse.urljoin(m3u8_url, url)