diff --git a/alembic/versions/16e78af9e5bf_add_original_language_columns_to_show_.py b/alembic/versions/16e78af9e5bf_add_original_language_columns_to_show_.py index bb08933..6cba8ae 100644 --- a/alembic/versions/16e78af9e5bf_add_original_language_columns_to_show_.py +++ b/alembic/versions/16e78af9e5bf_add_original_language_columns_to_show_.py @@ -5,6 +5,7 @@ Revises: eb0bd3cc1852 Create Date: 2025-12-13 18:47:02.146038 """ + from typing import Sequence, Union from alembic import op @@ -12,8 +13,8 @@ import sqlalchemy as sa # revision identifiers, used by Alembic. -revision: str = '16e78af9e5bf' -down_revision: Union[str, None] = 'eb0bd3cc1852' +revision: str = "16e78af9e5bf" +down_revision: Union[str, None] = "eb0bd3cc1852" branch_labels: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None @@ -21,22 +22,16 @@ depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: """Upgrade schema.""" # Add original_language column to show table - op.add_column( - 'show', - sa.Column('original_language', sa.String(10), nullable=True) - ) - + op.add_column("show", sa.Column("original_language", sa.String(10), nullable=True)) + # Add original_language column to movie table - op.add_column( - 'movie', - sa.Column('original_language', sa.String(10), nullable=True) - ) + op.add_column("movie", sa.Column("original_language", sa.String(10), nullable=True)) def downgrade() -> None: """Downgrade schema.""" # Remove original_language column from movie table - op.drop_column('movie', 'original_language') - + op.drop_column("movie", "original_language") + # Remove original_language column from show table - op.drop_column('show', 'original_language') + op.drop_column("show", "original_language") diff --git a/media_manager/metadataProvider/config.py b/media_manager/metadataProvider/config.py index 67de5ec..4f07b46 100644 --- a/media_manager/metadataProvider/config.py +++ b/media_manager/metadataProvider/config.py @@ -3,8 +3,9 @@ from pydantic_settings import BaseSettings class TmdbConfig(BaseSettings): tmdb_relay_url: str = "https://metadata-relay.dorninger.co/tmdb" - primary_languages: list[str] = [] # ISO 639-1 language codes - default_language: str = "en" # ISO 639-1 language codes + primary_languages: list[str] = [] # ISO 639-1 language codes + default_language: str = "en" # ISO 639-1 language codes + class TvdbConfig(BaseSettings): tvdb_relay_url: str = "https://metadata-relay.dorninger.co/tvdb" diff --git a/media_manager/metadataProvider/tmdb.py b/media_manager/metadataProvider/tmdb.py index d45caff..85c81f7 100644 --- a/media_manager/metadataProvider/tmdb.py +++ b/media_manager/metadataProvider/tmdb.py @@ -32,7 +32,7 @@ class TmdbMetadataProvider(AbstractMetadataProvider): """ Determine the language parameter to use for TMDB API calls. Returns the original language if it's in primary_languages, otherwise returns default_language. - + :param original_language: The original language code (ISO 639-1) of the media :return: Language parameter (ISO 639-1 format, e.g., 'en', 'no') """ @@ -45,8 +45,7 @@ class TmdbMetadataProvider(AbstractMetadataProvider): language = self.default_language try: response = requests.get( - url=f"{self.url}/tv/shows/{id}", - params={"language": language} + url=f"{self.url}/tv/shows/{id}", params={"language": language} ) response.raise_for_status() return response.json() @@ -59,13 +58,15 @@ class TmdbMetadataProvider(AbstractMetadataProvider): ) raise - def __get_season_metadata(self, show_id: int, season_number: int, language: str | None = None) -> dict: + def __get_season_metadata( + self, show_id: int, season_number: int, language: str | None = None + ) -> dict: if language is None: language = self.default_language try: response = requests.get( url=f"{self.url}/tv/shows/{show_id}/{season_number}", - params={"language": language} + params={"language": language}, ) response.raise_for_status() return response.json() @@ -102,7 +103,10 @@ class TmdbMetadataProvider(AbstractMetadataProvider): def __get_trending_tv(self) -> dict: try: - response = requests.get(url=f"{self.url}/tv/trending", params={"language": self.default_language}) + response = requests.get( + url=f"{self.url}/tv/trending", + params={"language": self.default_language}, + ) response.raise_for_status() return response.json() except requests.RequestException as e: @@ -119,8 +123,7 @@ class TmdbMetadataProvider(AbstractMetadataProvider): language = self.default_language try: response = requests.get( - url=f"{self.url}/movies/{id}", - params={"language": language} + url=f"{self.url}/movies/{id}", params={"language": language} ) response.raise_for_status() return response.json() @@ -155,7 +158,10 @@ class TmdbMetadataProvider(AbstractMetadataProvider): def __get_trending_movies(self) -> dict: try: - response = requests.get(url=f"{self.url}/movies/trending", params={"language": self.default_language}) + response = requests.get( + url=f"{self.url}/movies/trending", + params={"language": self.default_language}, + ) response.raise_for_status() return response.json() except requests.RequestException as e: @@ -170,10 +176,10 @@ class TmdbMetadataProvider(AbstractMetadataProvider): def download_show_poster_image(self, show: Show) -> bool: # Determine which language to use based on show's original_language language = self.__get_language_param(show.original_language) - + # Fetch metadata in the appropriate language to get localized poster show_metadata = self.__get_show_metadata(show.external_id, language=language) - + # downloading the poster # all pictures from TMDB should already be jpeg, so no need to convert if show_metadata["poster_path"] is not None: @@ -206,20 +212,20 @@ class TmdbMetadataProvider(AbstractMetadataProvider): if language is None: show_metadata = self.__get_show_metadata(id) language = show_metadata.get("original_language") - + # Determine which language to use for metadata language = self.__get_language_param(language) - + # Fetch show metadata in the appropriate language show_metadata = self.__get_show_metadata(id, language=language) - + season_list = [] # inserting all the metadata into the objects for season in show_metadata["seasons"]: season_metadata = self.__get_season_metadata( - show_id=show_metadata["id"], + show_id=show_metadata["id"], season_number=season["season_number"], - language=language + language=language, ) episode_list = [] @@ -287,19 +293,18 @@ class TmdbMetadataProvider(AbstractMetadataProvider): ) else: poster_url = None - + # Determine which name to use based on primary_languages original_language = result.get("original_language") original_name = result.get("original_name") display_name = result["name"] - + overview = result["overview"] # Use original name if language is in primary_languages and skip overview if original_language and original_language in self.primary_languages: display_name = original_name overview = None - formatted_results.append( MetaDataProviderSearchResult( poster_path=poster_url, @@ -334,13 +339,13 @@ class TmdbMetadataProvider(AbstractMetadataProvider): if language is None: movie_metadata = self.__get_movie_metadata(id=id) language = movie_metadata.get("original_language") - + # Determine which language to use for metadata language = self.__get_language_param(language) - + # Fetch movie metadata in the appropriate language movie_metadata = self.__get_movie_metadata(id=id, language=language) - + year = media_manager.metadataProvider.utils.get_year_from_date( movie_metadata["release_date"] ) @@ -384,18 +389,18 @@ class TmdbMetadataProvider(AbstractMetadataProvider): ) else: poster_url = None - + # Determine which name to use based on primary_languages original_language = result.get("original_language") original_title = result.get("original_title") display_name = result["title"] - + overview = result["overview"] # Use original name if language is in primary_languages and skip overview if original_language and original_language in self.primary_languages: display_name = original_title overview = None - + formatted_results.append( MetaDataProviderSearchResult( poster_path=poster_url, @@ -418,10 +423,12 @@ class TmdbMetadataProvider(AbstractMetadataProvider): def download_movie_poster_image(self, movie: Movie) -> bool: # Determine which language to use based on movie's original_language language = self.__get_language_param(movie.original_language) - + # Fetch metadata in the appropriate language to get localized poster - movie_metadata = self.__get_movie_metadata(id=movie.external_id, language=language) - + movie_metadata = self.__get_movie_metadata( + id=movie.external_id, language=language + ) + # downloading the poster # all pictures from TMDB should already be jpeg, so no need to convert if movie_metadata["poster_path"] is not None: diff --git a/media_manager/movies/service.py b/media_manager/movies/service.py index c8fa344..84559dc 100644 --- a/media_manager/movies/service.py +++ b/media_manager/movies/service.py @@ -63,7 +63,10 @@ class MovieService: self.notification_service = notification_service def add_movie( - self, external_id: int, metadata_provider: AbstractMetadataProvider, language: str | None = None + self, + external_id: int, + metadata_provider: AbstractMetadataProvider, + language: str | None = None, ) -> Movie | None: """ Add a new movie to the database. @@ -72,7 +75,9 @@ class MovieService: :param metadata_provider: The name of the metadata provider. :param language: Optional language code (ISO 639-1) to fetch metadata in. """ - movie_with_metadata = metadata_provider.get_movie_metadata(id=external_id, language=language) + movie_with_metadata = metadata_provider.get_movie_metadata( + id=external_id, language=language + ) saved_movie = self.movie_repository.save_movie(movie=movie_with_metadata) metadata_provider.download_movie_poster_image(movie=saved_movie) return saved_movie @@ -699,7 +704,9 @@ class MovieService: log.debug(f"Found movie: {db_movie.name} for metadata update.") # Use stored original_language preference for metadata fetching - fresh_movie_data = metadata_provider.get_movie_metadata(id=db_movie.external_id, language=db_movie.original_language) + fresh_movie_data = metadata_provider.get_movie_metadata( + id=db_movie.external_id, language=db_movie.original_language + ) if not fresh_movie_data: log.warning( f"Could not fetch fresh metadata for movie {db_movie.name} (External ID: {db_movie.external_id}) from {db_movie.metadata_provider}." diff --git a/media_manager/tv/router.py b/media_manager/tv/router.py index a1ff66f..49744ce 100644 --- a/media_manager/tv/router.py +++ b/media_manager/tv/router.py @@ -58,7 +58,10 @@ router = APIRouter() }, ) def add_a_show( - tv_service: tv_service_dep, metadata_provider: metadata_provider_dep, show_id: int, language: str | None = None + tv_service: tv_service_dep, + metadata_provider: metadata_provider_dep, + show_id: int, + language: str | None = None, ): try: show = tv_service.add_show( diff --git a/media_manager/tv/service.py b/media_manager/tv/service.py index 76e55e3..f479bcf 100644 --- a/media_manager/tv/service.py +++ b/media_manager/tv/service.py @@ -69,7 +69,10 @@ class TvService: self.notification_service = notification_service def add_show( - self, external_id: int, metadata_provider: AbstractMetadataProvider, language: str | None = None + self, + external_id: int, + metadata_provider: AbstractMetadataProvider, + language: str | None = None, ) -> Show | None: """ Add a new show to the database. @@ -78,7 +81,9 @@ class TvService: :param metadata_provider: The name of the metadata provider. :param language: Optional language code (ISO 639-1) to fetch metadata in. """ - show_with_metadata = metadata_provider.get_show_metadata(id=external_id, language=language) + show_with_metadata = metadata_provider.get_show_metadata( + id=external_id, language=language + ) saved_show = self.tv_repository.save_show(show=show_with_metadata) metadata_provider.download_show_poster_image(show=saved_show) return saved_show @@ -758,7 +763,9 @@ class TvService: # old_poster_url = db_show.poster_url # poster_url removed from db_show # Use stored original_language preference for metadata fetching - fresh_show_data = metadata_provider.get_show_metadata(id=db_show.external_id, language=db_show.original_language) + fresh_show_data = metadata_provider.get_show_metadata( + id=db_show.external_id, language=db_show.original_language + ) if not fresh_show_data: log.warning( f"Could not fetch fresh metadata for show {db_show.name} (External ID: {db_show.external_id}) from {db_show.metadata_provider}."