aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--yt_dlp/compat/functools.py12
-rw-r--r--yt_dlp/downloader/common.py3
-rw-r--r--yt_dlp/downloader/external.py3
-rw-r--r--yt_dlp/extractor/common.py4
-rw-r--r--yt_dlp/extractor/youtube.py6
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())