# 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
from .external import FFmpegFD
from ..compat import (
+ compat_pycrypto_AES,
compat_urlparse,
)
from ..utils import (
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:
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):