aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpukkandan <pukkandan.ytdlp@gmail.com>2021-09-22 01:15:16 +0530
committerpukkandan <pukkandan.ytdlp@gmail.com>2021-09-22 01:15:16 +0530
commitdaf7ac2b92494bed6bc9fcada69fbb9b94b539bb (patch)
treecd0045dd26d1ca3888fa557bcd5199a6cd970732
parent96933fc1b6043060498f2c85c25457bd526ba793 (diff)
downloadhypervideo-pre-daf7ac2b92494bed6bc9fcada69fbb9b94b539bb.tar.lz
hypervideo-pre-daf7ac2b92494bed6bc9fcada69fbb9b94b539bb.tar.xz
hypervideo-pre-daf7ac2b92494bed6bc9fcada69fbb9b94b539bb.zip
[fragment] Avoid repeated request for AES key
-rw-r--r--yt_dlp/downloader/fragment.py10
1 files changed, 8 insertions, 2 deletions
diff --git a/yt_dlp/downloader/fragment.py b/yt_dlp/downloader/fragment.py
index 567bf69d3..cd1e2350d 100644
--- a/yt_dlp/downloader/fragment.py
+++ b/yt_dlp/downloader/fragment.py
@@ -369,13 +369,19 @@ class FragmentFD(FileDownloader):
return False, frag_index
return frag_content, frag_index
+ _key_cache = {}
+
+ def _get_key(url):
+ if url not in _key_cache:
+ _key_cache[url] = self.ydl.urlopen(self._prepare_url(info_dict, url)).read()
+ return _key_cache[url]
+
def decrypt_fragment(fragment, frag_content):
decrypt_info = fragment.get('decrypt_info')
if not decrypt_info or decrypt_info['METHOD'] != 'AES-128':
return frag_content
iv = decrypt_info.get('IV') or compat_struct_pack('>8xq', fragment['media_sequence'])
- decrypt_info['KEY'] = decrypt_info.get('KEY') or self.ydl.urlopen(
- self._prepare_url(info_dict, info_dict.get('_decryption_key_url') or decrypt_info['URI'])).read()
+ decrypt_info['KEY'] = decrypt_info.get('KEY') or _get_key(info_dict.get('_decryption_key_url') or decrypt_info['URI'])
# Don't decrypt the content in tests since the data is explicitly truncated and it's not to a valid block
# size (see https://github.com/ytdl-org/youtube-dl/pull/27660). Tests only care that the correct data downloaded,
# not what it decrypts to.