[BACKEND] Try to fetch source metadata from uploader_url (#886)
Makes it possible to fix https://github.com/jmbannon/ytdl-sub/issues/756 In the case that uploader_url does not equal the input url, keep trying to fetch uploader_url to get all possible metadata that yt-dlp does not provide in a single API call
This commit is contained in:
parent
961e04d027
commit
915e29379a
2 changed files with 26 additions and 5 deletions
|
|
@ -216,11 +216,14 @@ class YTDLP:
|
||||||
**kwargs
|
**kwargs
|
||||||
arguments passed directory to YoutubeDL extract_info
|
arguments passed directory to YoutubeDL extract_info
|
||||||
"""
|
"""
|
||||||
|
parent_dict: Dict = {}
|
||||||
try:
|
try:
|
||||||
with cls._listen_and_log_downloaded_info_json(
|
with cls._listen_and_log_downloaded_info_json(
|
||||||
working_directory=working_directory, log_prefix=log_prefix_on_info_json_dl
|
working_directory=working_directory, log_prefix=log_prefix_on_info_json_dl
|
||||||
):
|
):
|
||||||
_ = cls.extract_info(ytdl_options_overrides=ytdl_options_overrides, **kwargs)
|
parent_dict = cls.extract_info(
|
||||||
|
ytdl_options_overrides=ytdl_options_overrides, **kwargs
|
||||||
|
)
|
||||||
except RejectedVideoReached:
|
except RejectedVideoReached:
|
||||||
cls.logger.debug(
|
cls.logger.debug(
|
||||||
"RejectedVideoReached, stopping additional downloads "
|
"RejectedVideoReached, stopping additional downloads "
|
||||||
|
|
@ -234,4 +237,19 @@ class YTDLP:
|
||||||
except MaxDownloadsReached:
|
except MaxDownloadsReached:
|
||||||
cls.logger.info("MaxDownloadsReached, stopping additional downloads.")
|
cls.logger.info("MaxDownloadsReached, stopping additional downloads.")
|
||||||
|
|
||||||
|
# For YouTube playlists in particular, channel metadata is not fetched. Attempt to get
|
||||||
|
# channel metadata via grabbing uploader_url info json a max of 3 times
|
||||||
|
current_iter = 0
|
||||||
|
url = kwargs.get("url")
|
||||||
|
uploader_url = parent_dict.get("uploader_url")
|
||||||
|
while current_iter < 3 and uploader_url and url != uploader_url:
|
||||||
|
cls.logger.debug("Attempting to get parent metadata from URL %s", uploader_url)
|
||||||
|
parent_dict = cls.extract_info(
|
||||||
|
ytdl_options_overrides=ytdl_options_overrides | {"playlist_items": "0:0"},
|
||||||
|
url=uploader_url,
|
||||||
|
)
|
||||||
|
current_iter += 1
|
||||||
|
url = uploader_url
|
||||||
|
uploader_url = parent_dict.get("uploader_url")
|
||||||
|
|
||||||
return cls._get_entry_dicts_from_info_json_files(working_directory=working_directory)
|
return cls._get_entry_dicts_from_info_json_files(working_directory=working_directory)
|
||||||
|
|
|
||||||
|
|
@ -157,13 +157,16 @@ class EntryParent(BaseEntry):
|
||||||
def _uid_is_uploader_id(parent: "EntryParent"):
|
def _uid_is_uploader_id(parent: "EntryParent"):
|
||||||
return parent.uid == parent.uploader_id
|
return parent.uid == parent.uploader_id
|
||||||
|
|
||||||
top_level_parents = [
|
top_level_parents = [parent for parent in parents if parent.num_children() == 0]
|
||||||
parent for parent in parents if parent.num_children() == 0 and _url_matches(parent)
|
|
||||||
]
|
|
||||||
|
|
||||||
# If more than 1 parent exists, assume the uploader_id is the root parent
|
# If more than 1 parent exists, assume the uploader_id is the root parent
|
||||||
if len(top_level_parents) > 1:
|
if len(top_level_parents) > 1:
|
||||||
top_level_parents = [parent for parent in parents if _uid_is_uploader_id(parent)]
|
top_level_parents = [
|
||||||
|
parent for parent in top_level_parents if _uid_is_uploader_id(parent)
|
||||||
|
]
|
||||||
|
|
||||||
|
if len(top_level_parents) > 1:
|
||||||
|
top_level_parents = [parent for parent in top_level_parents if _url_matches(parent)]
|
||||||
|
|
||||||
match len(top_level_parents):
|
match len(top_level_parents):
|
||||||
case 0:
|
case 0:
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue