diff --git a/media_manager/exceptions.py b/media_manager/exceptions.py index 48a0f70..f092ff6 100644 --- a/media_manager/exceptions.py +++ b/media_manager/exceptions.py @@ -1,4 +1,4 @@ -from fastapi import Request, HTTPException +from fastapi import Request from fastapi.responses import JSONResponse @@ -16,17 +16,21 @@ class MediaAlreadyExists(Exception): class NotFoundError(Exception): """Custom exception for when an entity is not found.""" + def __init__(self, message: str = "The requested entity was not found."): super().__init__(message) self.message = message + pass class InvalidConfigError(Exception): """Custom exception for when an entity is not found.""" + def __init__(self, message: str = "The server is improperly configured."): super().__init__(message) self.message = message + pass @@ -54,4 +58,4 @@ async def invalid_config_error_exception_handler( return JSONResponse( status_code=500, content={"detail": exc.message}, - ) \ No newline at end of file + ) diff --git a/media_manager/main.py b/media_manager/main.py index 5b20714..f34c5a1 100644 --- a/media_manager/main.py +++ b/media_manager/main.py @@ -56,7 +56,34 @@ from media_manager.tv.service import ( # noqa: E402 import_all_show_torrents, update_all_non_ended_shows_metadata, ) -from media_manager.movies.service import import_all_movie_torrents, update_all_movies_metadata +from media_manager.movies.service import ( + import_all_movie_torrents, + update_all_movies_metadata, +) # noqa: E402 +import uvicorn # noqa: E402 +from fastapi.staticfiles import StaticFiles # noqa: E402 +from media_manager.auth.users import openid_client # noqa: E402 +from media_manager.auth.users import SECRET as AUTH_USERS_SECRET # noqa: E402 +from media_manager.auth.router import users_router as custom_users_router # noqa: E402 +from media_manager.auth.router import auth_metadata_router # noqa: E402 +from media_manager.auth.schemas import UserCreate, UserRead, UserUpdate # noqa: E402 +from media_manager.auth.oauth import get_oauth_router # noqa: E402 + +from media_manager.auth.users import ( # noqa: E402 + bearer_auth_backend, + fastapi_users, + cookie_auth_backend, + openid_cookie_auth_backend, +) +from media_manager.exceptions import ( # noqa: E402 + NotFoundError, + not_found_error_exception_handler, + MediaAlreadyExists, + media_already_exists_exception_handler, + InvalidConfigError, + invalid_config_error_exception_handler, +) + import shutil # noqa: E402 from fastapi import FastAPI # noqa: E402 @@ -92,6 +119,7 @@ def weekly_tasks(): update_all_non_ended_shows_metadata() update_all_movies_metadata() + scheduler = BackgroundScheduler() trigger = CronTrigger(minute=0, hour="*") weekly_trigger = CronTrigger( @@ -125,29 +153,6 @@ app.add_middleware( allow_headers=["*"], ) -import uvicorn # noqa: E402 -from fastapi.staticfiles import StaticFiles # noqa: E402 -from media_manager.auth.users import openid_client # noqa: E402 -from media_manager.auth.users import SECRET as AUTH_USERS_SECRET # noqa: E402 -from media_manager.auth.router import users_router as custom_users_router # noqa: E402 -from media_manager.auth.router import auth_metadata_router # noqa: E402 -from media_manager.auth.schemas import UserCreate, UserRead, UserUpdate # noqa: E402 -from media_manager.auth.oauth import get_oauth_router # noqa: E402 - -from media_manager.auth.users import ( # noqa: E402 - bearer_auth_backend, - fastapi_users, - cookie_auth_backend, - openid_cookie_auth_backend, -) -from media_manager.exceptions import ( - NotFoundError, - not_found_error_exception_handler, - MediaAlreadyExists, - media_already_exists_exception_handler, - InvalidConfigError, - invalid_config_error_exception_handler, -) # ---------------------------- # Standard Auth Routers diff --git a/media_manager/metadataProvider/abstractMetaDataProvider.py b/media_manager/metadataProvider/abstractMetaDataProvider.py index 36c31d2..c3902b3 100644 --- a/media_manager/metadataProvider/abstractMetaDataProvider.py +++ b/media_manager/metadataProvider/abstractMetaDataProvider.py @@ -25,7 +25,6 @@ class AbstractMetadataProvider(ABC): def get_movie_metadata(self, id: int = None) -> Movie: raise NotImplementedError() - @abstractmethod def search_show( self, query: str | None = None @@ -56,6 +55,7 @@ class AbstractMetadataProvider(ABC): """ raise NotImplementedError() + metadata_providers = {} diff --git a/media_manager/metadataProvider/tmdb.py b/media_manager/metadataProvider/tmdb.py index bb0f071..241d231 100644 --- a/media_manager/metadataProvider/tmdb.py +++ b/media_manager/metadataProvider/tmdb.py @@ -246,24 +246,3 @@ class TmdbMetadataProvider(AbstractMetadataProvider): log.warning(f"image for show {movie.name} could not be downloaded") return False return True - - - - - - - - - - - - - - - - - - - - - diff --git a/media_manager/metadataProvider/tvdb.py b/media_manager/metadataProvider/tvdb.py index 2032766..a87e732 100644 --- a/media_manager/metadataProvider/tvdb.py +++ b/media_manager/metadataProvider/tvdb.py @@ -1,5 +1,3 @@ -import pprint - import tvdb_v4_official import logging @@ -138,12 +136,14 @@ class TvdbMetadataProvider(AbstractMetadataProvider): log.warning(f"Error processing search result {result}: {e}") return formatted_results - def search_movie(self, query: str | None = None) -> list[MetaDataProviderSearchResult]: + def search_movie( + self, query: str | None = None + ) -> list[MetaDataProviderSearchResult]: if query is None: results = self.tvdb_client.get_all_movies() else: results = self.tvdb_client.search(query) - results = results[0:20] # this will return the first 20 results + results = results[0:20] # this will return the first 20 results log.info(f"got {len(results)} results from TVDB search") formatted_results = [] for result in results: @@ -212,4 +212,4 @@ class TvdbMetadataProvider(AbstractMetadataProvider): metadata_provider=self.name, ) - return movie \ No newline at end of file + return movie diff --git a/media_manager/metadataProvider/utils.py b/media_manager/metadataProvider/utils.py index a116a1b..8d12690 100644 --- a/media_manager/metadataProvider/utils.py +++ b/media_manager/metadataProvider/utils.py @@ -6,6 +6,7 @@ import pillow_avif pillow_avif + def get_year_from_date(first_air_date: str | None) -> int | None: if first_air_date: return int(first_air_date.split("-")[0]) @@ -13,7 +14,7 @@ def get_year_from_date(first_air_date: str | None) -> int | None: return None -def download_poster_image(storage_path=None, poster_url=None, id: UUID=None) -> bool: +def download_poster_image(storage_path=None, poster_url=None, id: UUID = None) -> bool: res = requests.get(poster_url, stream=True) if res.status_code == 200: image_file_path = storage_path.joinpath(str(id)) diff --git a/media_manager/movies/repository.py b/media_manager/movies/repository.py index 2738bc2..db10a6b 100644 --- a/media_manager/movies/repository.py +++ b/media_manager/movies/repository.py @@ -6,7 +6,6 @@ from sqlalchemy.exc import ( from sqlalchemy.orm import Session, joinedload import logging -from media_manager.auth.db import User from media_manager.exceptions import NotFoundError from media_manager.movies.models import Movie, MovieRequest, MovieFile from media_manager.movies.schemas import ( @@ -187,8 +186,12 @@ class MovieRepository: db_model = MovieRequest( id=movie_request.id, movie_id=movie_request.movie_id, - requested_by_id=movie_request.requested_by.id if movie_request.requested_by else None, - authorized_by_id=movie_request.authorized_by.id if movie_request.authorized_by else None, + requested_by_id=movie_request.requested_by.id + if movie_request.requested_by + else None, + authorized_by_id=movie_request.authorized_by.id + if movie_request.authorized_by + else None, wanted_quality=movie_request.wanted_quality, min_quality=movie_request.min_quality, authorized=movie_request.authorized, diff --git a/media_manager/movies/router.py b/media_manager/movies/router.py index 46990e8..cb6e91e 100644 --- a/media_manager/movies/router.py +++ b/media_manager/movies/router.py @@ -22,7 +22,6 @@ from media_manager.movies.schemas import ( RichMovieRequest, ) from media_manager.movies.dependencies import ( - movie_dep, movie_service_dep, ) from media_manager.metadataProvider.dependencies import metadata_provider_dep @@ -115,9 +114,6 @@ def get_all_movies_with_torrents(movie_service: movie_service_dep): return movie_service.get_all_movies_with_torrents() - - - # -------------------------------- # MOVIE REQUESTS # -------------------------------- @@ -133,7 +129,9 @@ def create_movie_request( movie_request: CreateMovieRequest, user: Annotated[UserRead, Depends(current_active_user)], ): - log.info(f"User {user.email} is creating a movie request for {movie_request.movie_id}") + log.info( + f"User {user.email} is creating a movie request for {movie_request.movie_id}" + ) movie_request = MovieRequest.model_validate(movie_request) movie_request.requested_by = user log.info("SERVASasdasd") @@ -195,6 +193,7 @@ def authorize_request( movie_request.authorized_by = None return movie_service.update_movie_request(movie_request=movie_request) + @router.delete( "/movies/requests/{movie_request_id}", status_code=status.HTTP_204_NO_CONTENT, @@ -205,6 +204,7 @@ def delete_movie_request( ): movie_service.delete_movie_request(movie_request_id=movie_request_id) + # -------------------------------- # TORRENTS # -------------------------------- @@ -252,4 +252,4 @@ def download_torrent_for_movie( response_model=list[PublicMovieFile], ) def get_movie_files_by_movie_id(movie_service: movie_service_dep, movie_id: MovieId): - return movie_service.get_public_movie_files_by_movie_id(movie_id=movie_id) \ No newline at end of file + return movie_service.get_public_movie_files_by_movie_id(movie_id=movie_id) diff --git a/media_manager/movies/schemas.py b/media_manager/movies/schemas.py index b75fa32..0d452c3 100644 --- a/media_manager/movies/schemas.py +++ b/media_manager/movies/schemas.py @@ -6,7 +6,7 @@ from pydantic import BaseModel, Field, ConfigDict, model_validator from media_manager.auth.schemas import UserRead from media_manager.torrent.models import Quality -from media_manager.torrent.schemas import TorrentId, TorrentStatus, Torrent +from media_manager.torrent.schemas import TorrentId, Torrent MovieId = typing.NewType("MovieId", UUID) MovieRequestId = typing.NewType("MovieRequestId", UUID) diff --git a/media_manager/movies/service.py b/media_manager/movies/service.py index 58bced9..1cfba78 100644 --- a/media_manager/movies/service.py +++ b/media_manager/movies/service.py @@ -9,7 +9,7 @@ from media_manager.database import SessionLocal from media_manager.indexer.schemas import IndexerQueryResult from media_manager.indexer.schemas import IndexerQueryResultId from media_manager.metadataProvider.schemas import MetaDataProviderSearchResult -from media_manager.torrent.schemas import Torrent, TorrentStatus, Quality +from media_manager.torrent.schemas import Torrent, TorrentStatus from media_manager.torrent.service import TorrentService from media_manager.movies import log from media_manager.movies.schemas import ( @@ -27,7 +27,6 @@ from media_manager.torrent.schemas import QualityStrings from media_manager.movies.repository import MovieRepository from media_manager.exceptions import NotFoundError import pprint -from pathlib import Path from media_manager.config import BasicConfig from media_manager.torrent.repository import TorrentRepository from media_manager.torrent.utils import import_file, import_torrent @@ -37,7 +36,6 @@ from media_manager.metadataProvider.abstractMetaDataProvider import ( ) from media_manager.metadataProvider.tmdb import TmdbMetadataProvider from media_manager.metadataProvider.tvdb import TvdbMetadataProvider -from media_manager.movies.schemas import Movie, MovieRequest, MovieRequestId class MovieService: @@ -494,9 +492,7 @@ class MovieService: f"Subtitle file {subtitle_file.name} does not match expected format, can't extract language code, skipping." ) continue - language_code = ( - language_code_match.group(1) - ) + language_code = language_code_match.group(1) target_subtitle_file = ( movie_file_path / f"{movie_file_name}.{language_code}.srt" ) diff --git a/media_manager/torrent/models.py b/media_manager/torrent/models.py index 1107593..61eeeda 100644 --- a/media_manager/torrent/models.py +++ b/media_manager/torrent/models.py @@ -16,4 +16,4 @@ class Torrent(Base): hash: Mapped[str] season_files = relationship("SeasonFile", back_populates="torrent") - movie_files = relationship("MovieFile", back_populates="torrent") \ No newline at end of file + movie_files = relationship("MovieFile", back_populates="torrent") diff --git a/media_manager/torrent/repository.py b/media_manager/torrent/repository.py index 0ff1cdc..db92cc8 100644 --- a/media_manager/torrent/repository.py +++ b/media_manager/torrent/repository.py @@ -12,6 +12,7 @@ from media_manager.movies.schemas import ( MovieFile as MovieFileSchema, ) + class TorrentRepository: def __init__(self, db: DbSessionDependency): self.db = db @@ -71,4 +72,4 @@ class TorrentRepository: def get_movie_files_of_torrent(self, torrent_id: TorrentId): stmt = select(MovieFile).where(MovieFile.torrent_id == torrent_id) result = self.db.execute(stmt).scalars().all() - return [MovieFileSchema.model_validate(movie_file) for movie_file in result] \ No newline at end of file + return [MovieFileSchema.model_validate(movie_file) for movie_file in result] diff --git a/media_manager/torrent/service.py b/media_manager/torrent/service.py index f6205de..753847e 100644 --- a/media_manager/torrent/service.py +++ b/media_manager/torrent/service.py @@ -85,8 +85,6 @@ class TorrentService: """ return self.torrent_repository.get_movie_of_torrent(torrent_id=torrent.id) - - def download(self, indexer_result: IndexerQueryResult) -> Torrent: log.info(f"Attempting to download torrent: {indexer_result.title}") torrent = Torrent( @@ -205,6 +203,4 @@ class TorrentService: # remove_season_files_by_torrent_id(db=self.db, torrent_id=torrent_id) # media_manager.torrent.repository.delete_torrent(db=self.db, torrent_id=t.id) def get_movie_files_of_torrent(self, torrent: Torrent): - return self.torrent_repository.get_movie_files_of_torrent( - torrent_id=torrent.id - ) \ No newline at end of file + return self.torrent_repository.get_movie_files_of_torrent(torrent_id=torrent.id) diff --git a/media_manager/tv/service.py b/media_manager/tv/service.py index 262edba..e3e09b3 100644 --- a/media_manager/tv/service.py +++ b/media_manager/tv/service.py @@ -237,9 +237,7 @@ class TvService: :param metadata_provider: The metadata provider to use. :return: A list of metadata provider show search results. """ - results: list[MetaDataProviderSearchResult] = ( - metadata_provider.search_show() - ) + results: list[MetaDataProviderSearchResult] = metadata_provider.search_show() filtered_results = [] for result in results: