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__)
MultilinePrinter,
QuietMultilinePrinter,
)
+from ..compat import functools
from ..utils import (
NUMBER_RE,
LockingUnsupportedError,
__to_screen = to_screen
- @property
+ @functools.cached_property
def FD_NAME(self):
return re.sub(r'(?<!^)(?=[A-Z])', '_', type(self).__name__[:-2]).lower()
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 (
def EXE_NAME(cls):
return cls.get_basename()
- @property
+ @functools.cached_property
def exe(self):
return self.EXE_NAME
import time
import xml.etree.ElementTree
+from ..compat import functools, re
from ..compat import (
compat_cookiejar_Cookie,
compat_cookies_SimpleCookie,
compat_urllib_parse_urlencode,
compat_urllib_request,
compat_urlparse,
- re,
)
from ..downloader import FileDownloader
from ..downloader.f4m import get_base_url, remove_encrypted_media
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
import calendar
import copy
import datetime
-import functools
import hashlib
import itertools
import json
import traceback
from .common import InfoExtractor, SearchInfoExtractor
+from ..compat import functools
from ..compat import (
compat_chr,
compat_HTTPError,
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())
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())