From 7620cd46c3ac6c265be3730925281f77a801c89c Mon Sep 17 00:00:00 2001 From: shirt-dev <2660574+shirt-dev@users.noreply.github.com> Date: Sat, 13 Feb 2021 11:15:41 -0500 Subject: [PATCH] #79 Fix HLS AES-128 with multiple keys in external downloaders Authored-by: shirtjs <2660574+shirtjs@users.noreply.github.com> --- youtube_dlc/downloader/external.py | 10 ++++++---- youtube_dlc/downloader/hls.py | 7 ++++++- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/youtube_dlc/downloader/external.py b/youtube_dlc/downloader/external.py index 0b894f5a5e..ff82d6779b 100644 --- a/youtube_dlc/downloader/external.py +++ b/youtube_dlc/downloader/external.py @@ -126,11 +126,13 @@ class ExternalFD(FileDownloader): for [i, url] in enumerate(info_dict['url_list']): tmpsegmentname = '%s_%s.frag' % (tmpfilename, i) file_list.append(tmpsegmentname) + key_list = info_dict.get('key_list') + decrypt_info = None dest, _ = sanitize_open(tmpfilename, 'wb') - for i in file_list: - src, _ = sanitize_open(i, 'rb') - if 'decrypt_info' in info_dict: - decrypt_info = info_dict['decrypt_info'] + for i, file in enumerate(file_list): + src, _ = sanitize_open(file, 'rb') + if key_list: + decrypt_info = next((x for x in key_list if x['INDEX'] == i), decrypt_info) if decrypt_info['METHOD'] == 'AES-128': iv = decrypt_info.get('IV') decrypt_info['KEY'] = decrypt_info.get('KEY') or self.ydl.urlopen( diff --git a/youtube_dlc/downloader/hls.py b/youtube_dlc/downloader/hls.py index ea515a48e3..0d427479f8 100644 --- a/youtube_dlc/downloader/hls.py +++ b/youtube_dlc/downloader/hls.py @@ -134,6 +134,7 @@ class HlsFD(FragmentFD): i = 0 media_sequence = 0 decrypt_info = {'METHOD': 'NONE'} + key_list = [] byte_range = {} frag_index = 0 ad_frag_next = False @@ -215,6 +216,10 @@ class HlsFD(FragmentFD): decrypt_info['URI'] = update_url_query(decrypt_info['URI'], extra_query) if decrypt_url != decrypt_info['URI']: decrypt_info['KEY'] = None + key_data = decrypt_info.copy() + key_data['INDEX'] = frag_index + key_list.append(key_data) + elif line.startswith('#EXT-X-MEDIA-SEQUENCE'): media_sequence = int(line[22:]) elif line.startswith('#EXT-X-BYTERANGE'): @@ -232,7 +237,7 @@ class HlsFD(FragmentFD): if real_downloader: info_copy = info_dict.copy() info_copy['url_list'] = fragment_urls - info_copy['decrypt_info'] = decrypt_info + info_copy['key_list'] = key_list fd = real_downloader(self.ydl, self.params) # TODO: Make progress updates work without hooking twice # for ph in self._progress_hooks: