aboutsummaryrefslogtreecommitdiffstats
path: root/yt_dlp/downloader/hls.py
diff options
context:
space:
mode:
Diffstat (limited to 'yt_dlp/downloader/hls.py')
-rw-r--r--yt_dlp/downloader/hls.py20
1 files changed, 13 insertions, 7 deletions
diff --git a/yt_dlp/downloader/hls.py b/yt_dlp/downloader/hls.py
index f343e1879..751d874d4 100644
--- a/yt_dlp/downloader/hls.py
+++ b/yt_dlp/downloader/hls.py
@@ -9,6 +9,7 @@ from .fragment import FragmentFD
from .external import FFmpegFD
from ..compat import (
+ compat_pycrypto_AES,
compat_urlparse,
)
from ..utils import (
@@ -68,14 +69,20 @@ class HlsFD(FragmentFD):
man_url = urlh.geturl()
s = urlh.read().decode('utf-8', 'ignore')
- if not self.can_download(s, info_dict, self.params.get('allow_unplayable_formats')):
- if info_dict.get('extra_param_to_segment_url') or info_dict.get('_decryption_key_url'):
- self.report_error('pycryptodome not found. Please install')
- return False
+ can_download, message = self.can_download(s, info_dict, self.params.get('allow_unplayable_formats')), None
+ if can_download and not compat_pycrypto_AES and '#EXT-X-KEY:METHOD=AES-128' in s:
+ if FFmpegFD.available():
+ can_download, message = False, 'The stream has AES-128 encryption and pycryptodome is not available'
+ else:
+ message = ('The stream has AES-128 encryption and neither ffmpeg nor pycryptodome are available; '
+ 'Decryption will be performed natively, but will be extremely slow')
+ if not can_download:
+ message = message or 'Unsupported features have been detected'
fd = FFmpegFD(self.ydl, self.params)
- self.report_warning(
- '%s detected unsupported features; extraction will be delegated to %s' % (self.FD_NAME, fd.get_basename()))
+ self.report_warning(f'{message}; extraction will be delegated to {fd.get_basename()}')
return fd.real_download(filename, info_dict)
+ elif message:
+ self.report_warning(message)
is_webvtt = info_dict['ext'] == 'vtt'
if is_webvtt:
@@ -232,7 +239,6 @@ class HlsFD(FragmentFD):
elif line.startswith('#EXT-X-DISCONTINUITY'):
discontinuity_count += 1
i += 1
- media_sequence += 1
# We only download the first fragment during the test
if self.params.get('test', False):