[cache, extractor/youtube] Invalidate old cache

This commit is contained in:
pukkandan 2022-08-27 07:22:48 +05:30
parent 4e4982ab5b
commit 5e01315aa1
No known key found for this signature in database
GPG key ID: 7EEE9E1E817D0A39
3 changed files with 16 additions and 7 deletions

View file

@ -6,7 +6,8 @@ import re
import shutil import shutil
import traceback 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: class Cache:
@ -45,12 +46,20 @@ class Cache:
if ose.errno != errno.EEXIST: if ose.errno != errno.EEXIST:
raise raise
self._ydl.write_debug(f'Saving {section}.{key} to cache') 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: except Exception:
tb = traceback.format_exc() tb = traceback.format_exc()
self._ydl.report_warning(f'Writing cache to {fn!r} failed: {tb}') 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',) assert dtype in ('json',)
if not self.enabled: if not self.enabled:
@ -61,8 +70,8 @@ class Cache:
try: try:
with open(cache_fn, encoding='utf-8') as cachef: with open(cache_fn, encoding='utf-8') as cachef:
self._ydl.write_debug(f'Loading {section}.{key} from cache') self._ydl.write_debug(f'Loading {section}.{key} from cache')
return json.load(cachef) return self._validate(json.load(cachef), after)
except ValueError: except (ValueError, KeyError):
try: try:
file_size = os.path.getsize(cache_fn) file_size = os.path.getsize(cache_fn)
except OSError as oe: except OSError as oe:

View file

@ -2659,7 +2659,7 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
def _extract_n_function_code(self, video_id, player_url): def _extract_n_function_code(self, video_id, player_url):
player_id = self._extract_player_info(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) jscode = func_code or self._load_player(video_id, player_url)
jsi = JSInterpreter(jscode) jsi = JSInterpreter(jscode)

View file

@ -1,6 +1,6 @@
# Autogenerated by devscripts/update-version.py # Autogenerated by devscripts/update-version.py
__version__ = '2022.08.19' __version__ = '2022.08.19.1'
RELEASE_GIT_HEAD = '48c88e088' RELEASE_GIT_HEAD = '48c88e088'