diff --git a/server/entertainment_decider/extractors/all/tmdb.py b/server/entertainment_decider/extractors/all/tmdb.py index e5b0f63..688dfe2 100644 --- a/server/entertainment_decider/extractors/all/tmdb.py +++ b/server/entertainment_decider/extractors/all/tmdb.py @@ -5,6 +5,7 @@ from functools import cached_property import itertools import math from typing import ( + Iterable, Literal, NewType, Optional, @@ -12,6 +13,12 @@ from typing import ( TypedDict, ) +from ...models import ( + Tag, + TagKey, + predefined_movie_tag, +) + import tmdbsimple as tmdb # type: ignore @@ -24,6 +31,8 @@ tmdb.API_KEY = "f090bb54758cabf231fb605d3e3e0468" EXTRACTOR_KEY = ".extractor/org.themoviedb" EXTRACTOR_NAME = "The Movie DB" +GENRE_PREFIX = f"{EXTRACTOR_KEY}/genre" + TMDB_DATE_FORMAT = "%Y-%m-%d" TMDB_REGEX_URI = r""" ( @@ -266,6 +275,11 @@ class TmdbMovieData: def _info(self) -> TmdbMovieInfoDict: return self.obj.info(append_to_response="external_ids,images,keywords") # type: ignore + def get_tags(self) -> Iterable[Tag]: + yield predefined_movie_tag() + for genre in self.genres: + yield get_genre_tag(genre) + @cached_property def description(self) -> Optional[str]: return self._info.get("overview") @@ -335,3 +349,34 @@ class TmdbMovieData: @cached_property def tmdb_id(self) -> int: return self._info["id"] + + +def get_genre_tag(genre: GenreTitle) -> Tag: + return get_any_tag( + category_key=GENRE_PREFIX, + category_name="Genre", + element_key=genre.lower(), + element_name=genre, + ) + + +def get_any_tag( + *, + category_key: str, + category_name: str, + element_key: str, + element_name: str, +) -> Tag: + TagKey.get_or_create_tag( + tag_key=category_key, + title=f"[{EXTRACTOR_NAME}] {category_name}", + use_for_preferences=False, + ) + return TagKey.get_or_create_tag( + tag_key=f"{category_key}/{element_key}", + title=f"[{EXTRACTOR_NAME}] [{category_name}] {element_name}", + use_for_preferences=True, + super_tags=[ + category_key, + ], + ) diff --git a/server/entertainment_decider/extractors/media/tmdb.py b/server/entertainment_decider/extractors/media/tmdb.py index 6d5fc74..bd4003b 100644 --- a/server/entertainment_decider/extractors/media/tmdb.py +++ b/server/entertainment_decider/extractors/media/tmdb.py @@ -1,15 +1,11 @@ from __future__ import annotations -import itertools import re -from typing import List, Optional - -from pony import orm +from typing import Optional from ...models import ( MediaElement, MediaThumbnail, - Tag, ) from ..all.tmdb import ( EXTRACTOR_KEY, @@ -102,10 +98,6 @@ class TmdbMovieMediaExtractor(MediaExtractor[TmdbMovieData]): data.tmdb_short_uri, ) ) - for genre in itertools.chain(["Movie"], data.genres): - tag_list: List[Tag] = list( - orm.select(tag for tag in Tag if tag.title == genre) - ) - if len(tag_list) == 1: - object.tag_list.add(tag_list[0]) + for tag in data.get_tags(data): + object.tag_list.add(tag) return ChangedReport.ChangedSome # TODO improve