diff options
-rw-r--r-- | yt_dlp/compat/functools.py | 12 | ||||
-rw-r--r-- | yt_dlp/downloader/common.py | 3 | ||||
-rw-r--r-- | yt_dlp/downloader/external.py | 3 | ||||
-rw-r--r-- | yt_dlp/extractor/common.py | 4 | ||||
-rw-r--r-- | yt_dlp/extractor/youtube.py | 6 |
5 files changed, 21 insertions, 7 deletions
diff --git a/yt_dlp/compat/functools.py b/yt_dlp/compat/functools.py index 36c983642..c3c4d8f48 100644 --- a/yt_dlp/compat/functools.py +++ b/yt_dlp/compat/functools.py @@ -10,3 +10,15 @@ try: cache # >= 3.9 except NameError: cache = lru_cache(maxsize=None) + +try: + cached_property # >= 3.8 +except NameError: + class cached_property: + def __init__(self, func): + update_wrapper(self, func) + self.func = func + + def __get__(self, instance, _): + setattr(instance, self.func.__name__, self.func(instance)) + return getattr(instance, self.func.__name__) diff --git a/yt_dlp/downloader/common.py b/yt_dlp/downloader/common.py index 276675532..d74692130 100644 --- a/yt_dlp/downloader/common.py +++ b/yt_dlp/downloader/common.py @@ -11,6 +11,7 @@ from ..minicurses import ( MultilinePrinter, QuietMultilinePrinter, ) +from ..compat import functools from ..utils import ( NUMBER_RE, LockingUnsupportedError, @@ -102,7 +103,7 @@ class FileDownloader: __to_screen = to_screen - @property + @functools.cached_property def FD_NAME(self): return re.sub(r'(?<!^)(?=[A-Z])', '_', type(self).__name__[:-2]).lower() diff --git a/yt_dlp/downloader/external.py b/yt_dlp/downloader/external.py index 812eb45b4..a9da96670 100644 --- a/yt_dlp/downloader/external.py +++ b/yt_dlp/downloader/external.py @@ -5,6 +5,7 @@ import sys import time from .fragment import FragmentFD +from ..compat import functools from ..compat import compat_setenv, compat_str from ..postprocessor.ffmpeg import EXT_TO_OUT_FORMATS, FFmpegPostProcessor from ..utils import ( @@ -74,7 +75,7 @@ class ExternalFD(FragmentFD): def EXE_NAME(cls): return cls.get_basename() - @property + @functools.cached_property def exe(self): return self.EXE_NAME diff --git a/yt_dlp/extractor/common.py b/yt_dlp/extractor/common.py index 6a451c20b..d222fa7ef 100644 --- a/yt_dlp/extractor/common.py +++ b/yt_dlp/extractor/common.py @@ -11,6 +11,7 @@ import sys import time import xml.etree.ElementTree +from ..compat import functools, re from ..compat import ( compat_cookiejar_Cookie, compat_cookies_SimpleCookie, @@ -25,7 +26,6 @@ from ..compat import ( compat_urllib_parse_urlencode, compat_urllib_request, compat_urlparse, - re, ) from ..downloader import FileDownloader from ..downloader.f4m import get_base_url, remove_encrypted_media @@ -3748,7 +3748,7 @@ class InfoExtractor: def _get_automatic_captions(self, *args, **kwargs): raise NotImplementedError('This method must be implemented by subclasses') - @property + @functools.cached_property def _cookies_passed(self): """Whether cookies have been passed to YoutubeDL""" return self.get_param('cookiefile') is not None or self.get_param('cookiesfrombrowser') is not None diff --git a/yt_dlp/extractor/youtube.py b/yt_dlp/extractor/youtube.py index 5546aa9a3..3f6886131 100644 --- a/yt_dlp/extractor/youtube.py +++ b/yt_dlp/extractor/youtube.py @@ -2,7 +2,6 @@ import base64 import calendar import copy import datetime -import functools import hashlib import itertools import json @@ -16,6 +15,7 @@ import time import traceback from .common import InfoExtractor, SearchInfoExtractor +from ..compat import functools from ..compat import ( compat_chr, compat_HTTPError, @@ -534,7 +534,7 @@ class YoutubeBaseInfoExtractor(InfoExtractor): args, [('VISITOR_DATA', ('INNERTUBE_CONTEXT', 'client', 'visitorData'), ('responseContext', 'visitorData'))], expected_type=str) - @property + @functools.cached_property def is_authenticated(self): return bool(self._generate_sapisidhash_header()) @@ -4402,7 +4402,7 @@ class YoutubeTabBaseInfoExtractor(YoutubeBaseInfoExtractor): check_get_keys='contents', fatal=False, ytcfg=ytcfg, note='Downloading API JSON with unavailable videos') - @property + @functools.cached_property def skip_webpage(self): return 'webpage' in self._configuration_arg('skip', ie_key=YoutubeTabIE.ie_key()) |