Compare commits

...

2 Commits

Author SHA1 Message Date
72531f0bee feat: caught age restricted exception
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2024-04-26 16:01:21 +02:00
207ca1b6a5 feat: caching of artwork request 2024-04-26 15:56:13 +02:00
3 changed files with 16 additions and 6 deletions

View File

@ -68,9 +68,11 @@ def write_metadata_to_target(metadata: Metadata, target: Target, song: Song):
LOGGER.info(str(metadata)) LOGGER.info(str(metadata))
if song.artwork.best_variant is not None: if song.artwork.best_variant is not None:
best_variant = song.artwork.best_variant
r = artwork_connection.get( r = artwork_connection.get(
url=song.artwork.best_variant["url"], url=best_variant["url"],
disable_cache=False, name=song.artwork.get_variant_name(best_variant, song.option_string),
) )
temp_target: Target = Target.temp() temp_target: Target = Target.temp()

View File

@ -8,7 +8,7 @@ from .metadata import (
ID3Timestamp, ID3Timestamp,
Metadata Metadata
) )
from ..utils.string_processing import unify, hash_url from ..utils.string_processing import unify, hash_url, hash_url
from .parents import OuterProxy as Base from .parents import OuterProxy as Base
@ -50,6 +50,9 @@ class Artwork:
return None return None
return min(self._variant_mapping.values(), key=lambda x: x["deviation"]) return min(self._variant_mapping.values(), key=lambda x: x["deviation"])
def get_variant_name(self, variant: ArtworkVariant, option_string: str) -> str:
return f"artwork_{variant['width']}x{variant['height']}_{option_string}"
def __merge__(self, other: Artwork, override: bool = False) -> None: def __merge__(self, other: Artwork, override: bool = False) -> None:
for key, value in other._variant_mapping.items(): for key, value in other._variant_mapping.items():
if key not in self._variant_mapping or override: if key not in self._variant_mapping or override:

View File

@ -552,7 +552,12 @@ class YoutubeMusic(SuperYouTube):
return self.download_values_by_url[source.url] return self.download_values_by_url[source.url]
if ydl_res is None: if ydl_res is None:
try:
ydl_res = self.ydl.extract_info(url=source.url, download=False) ydl_res = self.ydl.extract_info(url=source.url, download=False)
except DownloadError as e:
self.not_download[source.hash_url] = e
self.LOGGER.error(f"Couldn't fetch song from {source.url}. {e}")
return {"error": e}
_best_format = _get_best_format(ydl_res.get("formats", [{}])) _best_format = _get_best_format(ydl_res.get("formats", [{}]))
self.download_values_by_url[source.url] = { self.download_values_by_url[source.url] = {
@ -567,7 +572,7 @@ class YoutubeMusic(SuperYouTube):
def download_song_to_target(self, source: Source, target: Target, desc: str = None) -> DownloadResult: def download_song_to_target(self, source: Source, target: Target, desc: str = None) -> DownloadResult:
media = self.fetch_media_url(source) media = self.fetch_media_url(source)
if source.hash_url not in self.not_download: if source.hash_url not in self.not_download and "error" not in media:
result = self.download_connection.stream_into( result = self.download_connection.stream_into(
media["url"], media["url"],
target, target,
@ -580,7 +585,7 @@ class YoutubeMusic(SuperYouTube):
method="GET", method="GET",
) )
else: else:
result = DownloadResult(error_message=str(self.not_download[source.hash_url])) result = DownloadResult(error_message=str(media.get("error") or self.not_download[source.hash_url]))
if result.is_fatal_error: if result.is_fatal_error:
result.merge(super().download_song_to_target(source=source, target=target, desc=desc)) result.merge(super().download_song_to_target(source=source, target=target, desc=desc))