|
|
|
@ -3702,6 +3702,24 @@ class InfoExtractor:
|
|
|
|
|
(*cls.get_testcases(include_onlymatching=False), *cls.get_webpage_testcases()),
|
|
|
|
|
(..., (('playlist', 0), None), 'info_dict', 'age_limit')) or [0])
|
|
|
|
|
|
|
|
|
|
@classproperty(cache=True)
|
|
|
|
|
def _RETURN_TYPE(cls):
|
|
|
|
|
"""What the extractor returns: "video", "playlist", "any", or None (Unknown)"""
|
|
|
|
|
tests = tuple(cls.get_testcases(include_onlymatching=False))
|
|
|
|
|
if not tests:
|
|
|
|
|
return None
|
|
|
|
|
elif not any(k.startswith('playlist') for test in tests for k in test):
|
|
|
|
|
return 'video'
|
|
|
|
|
elif all(any(k.startswith('playlist') for k in test) for test in tests):
|
|
|
|
|
return 'playlist'
|
|
|
|
|
return 'any'
|
|
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
|
def is_single_video(cls, url):
|
|
|
|
|
"""Returns whether the URL is of a single video, None if unknown"""
|
|
|
|
|
assert cls.suitable(url), 'The URL must be suitable for the extractor'
|
|
|
|
|
return {'video': True, 'playlist': False}.get(cls._RETURN_TYPE)
|
|
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
|
def is_suitable(cls, age_limit):
|
|
|
|
|
"""Test whether the extractor is generally suitable for the given age limit"""
|
|
|
|
@ -3953,6 +3971,7 @@ class SearchInfoExtractor(InfoExtractor):
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
_MAX_RESULTS = float('inf')
|
|
|
|
|
_RETURN_TYPE = 'playlist'
|
|
|
|
|
|
|
|
|
|
@classproperty
|
|
|
|
|
def _VALID_URL(cls):
|
|
|
|
|