diff --git a/server/entertainment_decider/extractors/all/tmdb.py b/server/entertainment_decider/extractors/all/tmdb.py index 3a1b038..7a9ecdd 100644 --- a/server/entertainment_decider/extractors/all/tmdb.py +++ b/server/entertainment_decider/extractors/all/tmdb.py @@ -12,6 +12,9 @@ import tmdbsimple as tmdb tmdb.API_KEY = "f090bb54758cabf231fb605d3e3e0468" +EXTRACTOR_KEY = ".extractor/org.themoviedb" +EXTRACTOR_NAME = "The Movie DB" + TMDB_DATE_FORMAT = "%Y-%m-%d" TMDB_REGEX_URI = r""" ( diff --git a/server/entertainment_decider/extractors/all/youtube.py b/server/entertainment_decider/extractors/all/youtube.py index 4e53553..f2ebcc0 100644 --- a/server/entertainment_decider/extractors/all/youtube.py +++ b/server/entertainment_decider/extractors/all/youtube.py @@ -11,6 +11,7 @@ from ...models import Tag, TagKey EXTRACTOR_KEY = ".extractor/com.youtube" +EXTRACTOR_NAME = "YouTube" KEYWORD_PREFIX = f"{EXTRACTOR_KEY}/keyword" diff --git a/server/entertainment_decider/extractors/collection/aggregated.py b/server/entertainment_decider/extractors/collection/aggregated.py index 12a4512..bad39bb 100644 --- a/server/entertainment_decider/extractors/collection/aggregated.py +++ b/server/entertainment_decider/extractors/collection/aggregated.py @@ -35,7 +35,11 @@ class AggregatedCollectionExtractor(CollectionExtractor[DataType]): return colls def __init__(self) -> None: - super().__init__("aggregated") + super().__init__( + key=".extractor/.aggregated", + long_name="Aggregated Lists", + name="aggregated", + ) def uri_suitable(self, uri: str) -> SuitableLevel: return SuitableLevel.always_or_no(self.__uri_regex.match(uri) is not None) diff --git a/server/entertainment_decider/extractors/collection/tmdb.py b/server/entertainment_decider/extractors/collection/tmdb.py index b0b6819..1cb5c0c 100644 --- a/server/entertainment_decider/extractors/collection/tmdb.py +++ b/server/entertainment_decider/extractors/collection/tmdb.py @@ -8,6 +8,8 @@ from pony import orm from ...models import MediaCollection from ..all.tmdb import ( + EXTRACTOR_KEY, + EXTRACTOR_NAME, TmdbCollectionData, TMDB_REGEX_URI, TmdbKeywordData, @@ -46,7 +48,11 @@ class TmdbBaseExtractor(CollectionExtractor[T]): return int(m.group("id")) if m and m.group("class") == cls.TMDB_CLASS else None def __init__(self) -> None: - super().__init__("tmdb") + super().__init__( + key=EXTRACTOR_KEY, + long_name=EXTRACTOR_NAME, + name="tmdb", + ) def uri_suitable(self, uri: str) -> SuitableLevel: id = self._get_id(uri) diff --git a/server/entertainment_decider/extractors/collection/tt_rss.py b/server/entertainment_decider/extractors/collection/tt_rss.py index 5b5956e..af977fd 100644 --- a/server/entertainment_decider/extractors/collection/tt_rss.py +++ b/server/entertainment_decider/extractors/collection/tt_rss.py @@ -28,7 +28,11 @@ class TtRssCollectionExtractor(CollectionExtractor[HeadlineList]): mark_as_read: bool = False, label_filter: Optional[int] = None, ): - super().__init__("tt-rss") + super().__init__( + key=".extractor/org.tt-rss", + long_name="TT-RSS", + name="tt-rss", + ) self.__params = params self.__label_filter = label_filter self.__mark_as_read = mark_as_read diff --git a/server/entertainment_decider/extractors/collection/tvmaze.py b/server/entertainment_decider/extractors/collection/tvmaze.py index a49e5aa..525c474 100644 --- a/server/entertainment_decider/extractors/collection/tvmaze.py +++ b/server/entertainment_decider/extractors/collection/tvmaze.py @@ -12,6 +12,8 @@ from ...models import ( MediaElement, ) from ..all.tvmaze import ( + EXTRACTOR_KEY, + EXTRACTOR_NAME, TvmazeEpisodeEmbedded, TvmazeShowEmbedded, add_embedding, @@ -67,7 +69,11 @@ class TvmazeCollectionExtractor(CollectionExtractor[TvmazeShowEmbedded]): return f"tvmaze:///shows/{show_id}" def __init__(self) -> None: - super().__init__("tvmaze") + super().__init__( + key=EXTRACTOR_KEY, + long_name=EXTRACTOR_NAME, + name="tvmaze", + ) def uri_suitable(self, uri: str) -> SuitableLevel: show_id = self.__get_show_id(uri) diff --git a/server/entertainment_decider/extractors/collection/youtube.py b/server/entertainment_decider/extractors/collection/youtube.py index 922d2ed..f1b6383 100644 --- a/server/entertainment_decider/extractors/collection/youtube.py +++ b/server/entertainment_decider/extractors/collection/youtube.py @@ -9,6 +9,10 @@ from pony import orm # TODO remove import youtubesearchpython from ...models import MediaCollection +from ..all.youtube import ( + EXTRACTOR_KEY, + EXTRACTOR_NAME, +) from ..generic import ( ChangedReport, ExtractedDataOnline, @@ -65,7 +69,11 @@ class YouTubeCollectionExtractor(CollectionExtractor[DataType]): return collection_id def __init__(self) -> None: - super().__init__("youtube") + super().__init__( + key=EXTRACTOR_KEY, + long_name=EXTRACTOR_NAME, + name="youtube", + ) def uri_suitable(self, uri: str) -> SuitableLevel: return SuitableLevel.always_or_no(self.__uri_regex.match(uri) is not None) diff --git a/server/entertainment_decider/extractors/generic.py b/server/entertainment_decider/extractors/generic.py index f3cf0cb..bb83a76 100644 --- a/server/entertainment_decider/extractors/generic.py +++ b/server/entertainment_decider/extractors/generic.py @@ -145,9 +145,17 @@ E = TypeVar("E", MediaElement, MediaCollection) class GeneralExtractor(Generic[E, T]): name: str + """legacy name for database entries""" + long_name: str + """(long) name for human readable titles / descriptions""" + key: str + """key for tag key (prefixes) and further database usage, replaces name""" def __init__( self, + *, + key: str, + long_name: str, name: str, ): self.key = key diff --git a/server/entertainment_decider/extractors/media/tmdb.py b/server/entertainment_decider/extractors/media/tmdb.py index 165a517..dcc587b 100644 --- a/server/entertainment_decider/extractors/media/tmdb.py +++ b/server/entertainment_decider/extractors/media/tmdb.py @@ -13,6 +13,8 @@ from ...models import ( Tag, ) from ..all.tmdb import ( + EXTRACTOR_KEY, + EXTRACTOR_NAME, TMDB_REGEX_URI, TmdbMovieData, ) @@ -45,7 +47,11 @@ class TmdbMovieMediaExtractor(MediaExtractor[TmdbMovieData]): return int(m.group("movie_id")) if m else None def __init__(self) -> None: - super().__init__("tmdb") + super().__init__( + key=EXTRACTOR_KEY, + long_name=EXTRACTOR_NAME, + name="tmdb", + ) def uri_suitable(self, uri: str) -> SuitableLevel: movie_id = self.__get_movie_id(uri) diff --git a/server/entertainment_decider/extractors/media/tvmaze.py b/server/entertainment_decider/extractors/media/tvmaze.py index 2eda15f..e4899dd 100644 --- a/server/entertainment_decider/extractors/media/tvmaze.py +++ b/server/entertainment_decider/extractors/media/tvmaze.py @@ -8,6 +8,8 @@ import requests from ...models import MediaElement, MediaThumbnail from ..all.tvmaze import ( + EXTRACTOR_KEY, + EXTRACTOR_NAME, TvmazeEpisodeEmbedded, select_best_image, ) @@ -53,7 +55,11 @@ class TvmazeMediaExtractor(MediaExtractor[TvmazeEpisodeEmbedded]): return f"tvmaze:///episodes/{episode_id}" def __init__(self) -> None: - super().__init__("tvmaze") + super().__init__( + key=EXTRACTOR_KEY, + long_name=EXTRACTOR_NAME, + name="tvmaze", + ) def uri_suitable(self, uri: str) -> SuitableLevel: episode_id = self.__get_episode_id(uri) diff --git a/server/entertainment_decider/extractors/media/youtube.py b/server/entertainment_decider/extractors/media/youtube.py index ba79343..4bae5df 100644 --- a/server/entertainment_decider/extractors/media/youtube.py +++ b/server/entertainment_decider/extractors/media/youtube.py @@ -16,6 +16,8 @@ from ...models import ( thumbnail_sort_key, ) from ..all.youtube import ( + EXTRACTOR_KEY, + EXTRACTOR_NAME, YoutubeVideoData, get_video_tags, ) @@ -52,7 +54,11 @@ class YoutubeMediaExtractor(MediaExtractor[YoutubeVideoData]): ) def __init__(self) -> None: - super().__init__("youtube") + super().__init__( + name="youtube", + key=EXTRACTOR_KEY, + long_name=EXTRACTOR_NAME, + ) def uri_suitable(self, uri: str) -> SuitableLevel: return SuitableLevel.always_or_no(self.__uri_regex.match(uri) is not None) diff --git a/server/entertainment_decider/extractors/media/ytdl.py b/server/entertainment_decider/extractors/media/ytdl.py index a7070dc..fafb4e4 100644 --- a/server/entertainment_decider/extractors/media/ytdl.py +++ b/server/entertainment_decider/extractors/media/ytdl.py @@ -22,6 +22,10 @@ from ..generic import ( from .base import MediaExtractor +EXTRACTOR_KEY = ".extractor/.yt-dl" +EXTRACTOR_NAME = "YT-DL" + + class YtdlMediaExtractor(MediaExtractor[Dict]): SUPPORTED_PATTERN = re.compile( r"""^ @@ -31,7 +35,11 @@ class YtdlMediaExtractor(MediaExtractor[Dict]): ) def __init__(self) -> None: - super().__init__("ytdl") + super().__init__( + key=EXTRACTOR_KEY, + long_name=EXTRACTOR_NAME, + name="ytdl", + ) def uri_suitable(self, uri: str) -> SuitableLevel: return SuitableLevel.fallback_or_no(bool(self.SUPPORTED_PATTERN.search(uri)))