From 8b6e318a202be881270d13b0b712e30e9157f042 Mon Sep 17 00:00:00 2001 From: Felix Stupp Date: Fri, 23 May 2025 22:44:29 +0200 Subject: [PATCH] make youtube extractor compatible with mutliple date formats --- .../extractors/media/youtube.py | 10 ++++++-- .../entertainment_decider/extras/__init__.py | 4 ++++ .../entertainment_decider/extras/datetimes.py | 24 +++++++++++++++++++ 3 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 server/entertainment_decider/extras/datetimes.py diff --git a/server/entertainment_decider/extractors/media/youtube.py b/server/entertainment_decider/extractors/media/youtube.py index b9842d7..5b1fb60 100644 --- a/server/entertainment_decider/extractors/media/youtube.py +++ b/server/entertainment_decider/extractors/media/youtube.py @@ -10,6 +10,9 @@ from youtubesearchpython import ( # type: ignore Video, ) +from ...extras import ( + multi_strptime, +) from ...models import ( MediaElement, MediaThumbnail, @@ -106,8 +109,11 @@ class YoutubeMediaExtractor(MediaExtractor[YoutubeVideoData]): key=lambda thumb: thumbnail_sort_key(thumb["width"], thumb["height"]), ) object.thumbnail = MediaThumbnail.from_uri(best_thumb["url"]) - object.release_date = datetime.strptime( - data.get("uploadDate") or data["publishDate"], "%Y-%m-%d" + object.release_date = multi_strptime( + data.get("uploadDate") or data["publishDate"], + "%Y-%m-%dT%H:%M:%S%:z", + "%Y-%m-%dT%H:%M:%S%z", + "%Y-%m-%d", ) object.length = int(data["duration"]["secondsText"]) for tag in get_video_tags(data): diff --git a/server/entertainment_decider/extras/__init__.py b/server/entertainment_decider/extras/__init__.py index 68fd7f8..5ee899d 100644 --- a/server/entertainment_decider/extras/__init__.py +++ b/server/entertainment_decider/extras/__init__.py @@ -1,4 +1,7 @@ from .chain import Chain +from .datetimes import ( + multi_strptime, +) from .errors import gen_api_error from .strings import remove_common_trails from .typing import LazyValue @@ -8,5 +11,6 @@ __all__ = [ "Chain", "LazyValue", "gen_api_error", + "multi_strptime", "remove_common_trails", ] diff --git a/server/entertainment_decider/extras/datetimes.py b/server/entertainment_decider/extras/datetimes.py new file mode 100644 index 0000000..e5a0b51 --- /dev/null +++ b/server/entertainment_decider/extras/datetimes.py @@ -0,0 +1,24 @@ +from __future__ import annotations + +from datetime import ( + datetime, +) +from logging import ( + INFO, + Logger, +) + +log = Logger(__name__) + + +def multi_strptime(text: str, *format: str, log_level: int = INFO) -> datetime: + log.debug(f"try multi_strptime on {text!r} with {format!r}") + for fmt in format: + try: + return datetime.strptime(text, fmt) + except: + log.log( + level=log_level, + msg=f"failed multi_strptime on {text!r} with {fmt!r}, continue", + ) + raise ValueError(f"failed all multi_strptime on {text!r} with {format!r}")