aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorshirt <2660574+shirt-dev@users.noreply.github.com>2021-09-28 14:53:24 -0400
committerGitHub <noreply@github.com>2021-09-29 00:23:24 +0530
commit7687c8ac6e223a725b3ef8f56f04779bebdc86c5 (patch)
tree03178ebcf5ff2749ed0a170c1da749eaa2444f9d
parent80c360d7aad7ccda48ccd13be62dbb6fc5a6f128 (diff)
downloadhypervideo-pre-7687c8ac6e223a725b3ef8f56f04779bebdc86c5.tar.lz
hypervideo-pre-7687c8ac6e223a725b3ef8f56f04779bebdc86c5.tar.xz
hypervideo-pre-7687c8ac6e223a725b3ef8f56f04779bebdc86c5.zip
[HLS] Fix decryption issues (#1117)
* Unpad HLS fragments with PKCS#7 according to datatracker.ietf.org/doc/html/rfc8216 * media_sequence should only be incremented in for media fragments * The native decryption should only be used if ffmpeg is unavailable since it is significantly slower. Closes #1086 Authored by: shirt-dev, pukkandan
-rw-r--r--yt_dlp/downloader/fragment.py3
-rw-r--r--yt_dlp/downloader/hls.py20
2 files changed, 15 insertions, 8 deletions
diff --git a/yt_dlp/downloader/fragment.py b/yt_dlp/downloader/fragment.py
index 31f946792..22134f3b6 100644
--- a/yt_dlp/downloader/fragment.py
+++ b/yt_dlp/downloader/fragment.py
@@ -355,7 +355,8 @@ class FragmentFD(FileDownloader):
# not what it decrypts to.
if self.params.get('test', False):
return frag_content
- return aes_cbc_decrypt_bytes(frag_content, decrypt_info['KEY'], iv)
+ decrypted_data = aes_cbc_decrypt_bytes(frag_content, decrypt_info['KEY'], iv)
+ return decrypted_data[:-decrypted_data[-1]]
return decrypt_fragment
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):