]> jfr.im git - yt-dlp.git/commitdiff
[cache, extractor/youtube] Invalidate old cache
authorpukkandan <redacted>
Sat, 27 Aug 2022 01:52:48 +0000 (07:22 +0530)
committerpukkandan <redacted>
Sat, 27 Aug 2022 01:55:14 +0000 (07:25 +0530)
yt_dlp/cache.py
yt_dlp/extractor/youtube.py
yt_dlp/version.py

index 83351b79765ff40e7c9416524b02a740d2456a6d..602cb9edba282ceaba21f4e29589648dadb92b59 100644 (file)
@@ -6,7 +6,8 @@
 import shutil
 import traceback
 
-from .utils import expand_path, write_json_file
+from .utils import expand_path, traverse_obj, version_tuple, write_json_file
+from .version import __version__
 
 
 class Cache:
@@ -45,12 +46,20 @@ def store(self, section, key, data, dtype='json'):
                 if ose.errno != errno.EEXIST:
                     raise
             self._ydl.write_debug(f'Saving {section}.{key} to cache')
-            write_json_file(data, fn)
+            write_json_file({'yt-dlp_version': __version__, 'data': data}, fn)
         except Exception:
             tb = traceback.format_exc()
             self._ydl.report_warning(f'Writing cache to {fn!r} failed: {tb}')
 
-    def load(self, section, key, dtype='json', default=None):
+    def _validate(self, data, after):
+        version = traverse_obj(data, 'yt-dlp_version')
+        if not version:  # Backward compatibility
+            data, version = {'data': data}, '2022.08.19'
+        if not after or version_tuple(version) > version_tuple(after):
+            return data['data']
+        self._ydl.write_debug(f'Discarding old cache from version {version} (need {after})')
+
+    def load(self, section, key, dtype='json', default=None, *, after=None):
         assert dtype in ('json',)
 
         if not self.enabled:
@@ -61,8 +70,8 @@ def load(self, section, key, dtype='json', default=None):
             try:
                 with open(cache_fn, encoding='utf-8') as cachef:
                     self._ydl.write_debug(f'Loading {section}.{key} from cache')
-                    return json.load(cachef)
-            except ValueError:
+                    return self._validate(json.load(cachef), after)
+            except (ValueError, KeyError):
                 try:
                     file_size = os.path.getsize(cache_fn)
                 except OSError as oe:
index e9f8adbd156a6fc14855e6f21124c7a6d72587f9..38e5faa79435ae2d74aed6f30f404689396cff18 100644 (file)
@@ -2659,7 +2659,7 @@ def _extract_n_function_name(self, jscode):
 
     def _extract_n_function_code(self, video_id, player_url):
         player_id = self._extract_player_info(player_url)
-        func_code = self.cache.load('youtube-nsig', player_id)
+        func_code = self.cache.load('youtube-nsig', player_id, after='2022.08.19')
         jscode = func_code or self._load_player(video_id, player_url)
         jsi = JSInterpreter(jscode)
 
index 45f670b091cddadab529379c13a2a48c37280d0a..1ded15df4240a4e77c8c8326bd943154e054bbea 100644 (file)
@@ -1,6 +1,6 @@
 # Autogenerated by devscripts/update-version.py
 
-__version__ = '2022.08.19'
+__version__ = '2022.08.19.1'
 
 RELEASE_GIT_HEAD = '48c88e088'