diff --git a/server/entertainment_decider/extractors/collection/base.py b/server/entertainment_decider/extractors/collection/base.py index e91b5f0..acbbb0e 100644 --- a/server/entertainment_decider/extractors/collection/base.py +++ b/server/entertainment_decider/extractors/collection/base.py @@ -3,8 +3,9 @@ from __future__ import annotations import logging from typing import Optional, TypeVar -from ...models import CollectionUriMapping, MediaCollection -from ..generic import ExtractedData, GeneralExtractor +from ...models import CollectionUriMapping, MediaCollection, MediaElement +from ..generic import ExtractedData, ExtractionError, GeneralExtractor +from ..media import media_extract_uri T = TypeVar("T") @@ -40,3 +41,17 @@ class CollectionExtractor(GeneralExtractor[MediaCollection, T]): if collection: self.__configure_collection(collection) return collection + + def _add_episode(self, collection: MediaCollection, uri: str, season: int = 0, episode: int = 0) -> Optional[MediaElement]: + logging.debug(f"Add to collection {collection.title!r} media {uri!r} (Season {season}, Episode {episode})") + try: + element = media_extract_uri(uri) + except ExtractionError: + logging.warning(f"Failed while extracting media {uri!r}", exc_info=True) + return None + collection.add_episode( + media = element, + season = season, + episode = episode, + ) + return element diff --git a/server/entertainment_decider/extractors/collection/tt_rss.py b/server/entertainment_decider/extractors/collection/tt_rss.py index e535168..bf7de6d 100644 --- a/server/entertainment_decider/extractors/collection/tt_rss.py +++ b/server/entertainment_decider/extractors/collection/tt_rss.py @@ -8,8 +8,7 @@ from pony import orm # TODO remove from ...models import MediaCollection from ..all.tt_rss import HeadlineList, TtRssConnectionParameter, TtRssUri -from ..generic import ExtractedData, ExtractionError, SuitableLevel -from ..media import media_extract_uri +from ..generic import ExtractedData, SuitableLevel from .base import CollectionExtractor @@ -76,11 +75,10 @@ class TtRssCollectionExtractor(CollectionExtractor[HeadlineList]): object.title = object.uri logging.debug(f"Got {len(data)} headlines") for headline in data: - logging.debug(f"Add to collection {headline.url!r}") - try: - object.add_episode(media_extract_uri(headline.url)) - orm.commit() - except ExtractionError: - logging.warning(f"Failed while extracting media {headline.url!r}", exc_info=True) + self._add_episode( + collection = object, + uri = headline.url + ) + orm.commit() if object.watch_in_order_auto: object.watch_in_order = False # no order available diff --git a/server/entertainment_decider/extractors/collection/youtube.py b/server/entertainment_decider/extractors/collection/youtube.py index 244e0ba..64bab6e 100644 --- a/server/entertainment_decider/extractors/collection/youtube.py +++ b/server/entertainment_decider/extractors/collection/youtube.py @@ -9,8 +9,7 @@ from pony import orm # TODO remove import youtubesearchpython from ...models import MediaCollection -from ..generic import ExtractedData, ExtractionError, SuitableLevel -from ..media import media_extract_uri +from ..generic import ExtractedData, SuitableLevel from .base import CollectionExtractor @@ -89,7 +88,6 @@ class YouTubeCollectionExtractor(CollectionExtractor[Dict]): video_list = data["videos"] if object.watch_in_order_auto: object.watch_in_order = not is_channel - len_video_list = len(video_list) if is_channel: video_list = reversed(video_list) for index, video in enumerate(video_list): @@ -98,11 +96,11 @@ class YouTubeCollectionExtractor(CollectionExtractor[Dict]): f"https://youtube.com/watch?v={video['id']}", f"https://youtu.be/{video['id']}", ] - logging.debug(f"[youtube] Add to collection {object.title!r} video {video_url!r} ({index+1} of {len_video_list})") - try: - element = media_extract_uri(video_url) + element = self._add_episode( + collection = object, + uri = video_url, + episode = index + 1, + ) + if element: element.add_uris(other_urls) - object.add_episode(element, episode=index+1) orm.commit() # so progress is stored - except ExtractionError: - logging.warning(f"Failed while extracting media {video_url!r}", exc_info=True)