diff --git a/media_manager/movies/schemas.py b/media_manager/movies/schemas.py index f6a0a2c..6061df9 100644 --- a/media_manager/movies/schemas.py +++ b/media_manager/movies/schemas.py @@ -37,7 +37,7 @@ class MovieFile(BaseModel): class PublicMovieFile(MovieFile): - downloaded: bool = False + imported: bool = False class MovieRequestBase(BaseModel): diff --git a/media_manager/movies/service.py b/media_manager/movies/service.py index 1f00f57..bc81945 100644 --- a/media_manager/movies/service.py +++ b/media_manager/movies/service.py @@ -15,7 +15,7 @@ from media_manager.indexer.utils import evaluate_indexer_query_results from media_manager.metadataProvider.schemas import MetaDataProviderSearchResult from media_manager.notification.service import NotificationService from media_manager.schemas import MediaImportSuggestion -from media_manager.torrent.schemas import Torrent, TorrentStatus +from media_manager.torrent.schemas import Torrent, TorrentStatus, Quality from media_manager.torrent.service import TorrentService from media_manager.movies import log from media_manager.movies.schemas import ( @@ -153,10 +153,12 @@ class MovieService: if delete_torrents: # Get all torrents associated with this movie - torrents = self.movie_repository.get_torrents_by_movie_id( + movie_torrents = self.movie_repository.get_torrents_by_movie_id( movie_id=movie.id ) - for torrent in torrents: + + for movie_torrent in movie_torrents: + torrent = self.torrent_service.get_torrent_by_id(torrent_id=movie_torrent.torrent_id) try: self.torrent_service.cancel_download( torrent=torrent, delete_files=True @@ -211,6 +213,7 @@ class MovieService: elif movie_id: try: self.movie_repository.get_movie_by_id(movie_id=movie_id) + return True except NotFoundError: return False @@ -420,7 +423,7 @@ class MovieService: :return: The downloaded torrent. """ indexer_result = self.indexer_service.get_result( - indexer_query_result_id=public_indexer_result_id + result_id=public_indexer_result_id ) movie_torrent = self.torrent_service.download(indexer_result=indexer_result) self.torrent_service.pause_download(torrent=movie_torrent) @@ -483,7 +486,7 @@ class MovieService: if len(available_torrents) == 0: log.warning( - f"No torrents found for movie request {movie_request.id} with quality between {QualityStrings[movie_request.min_quality]} and {QualityStrings[movie_request.wanted_quality]}" + f"No torrents found for movie request {movie_request.id} with quality between {QualityStrings[movie_request.min_quality.name]} and {QualityStrings[movie_request.wanted_quality.name]}" ) return False @@ -586,9 +589,9 @@ class MovieService: if len(video_files) != 1: # Send notification about multiple video files found if self.notification_service: - self.notification_service.send_notification( + self.notification_service.send_notification_to_all_providers( title="Manual Import Required", - body=f"Multiple video files found for movie {movie.name}. Please import manually.", + message=f"Multiple video files found for movie {movie.name}. Please import manually.", ) log.error( f"Found {len(video_files)} video files for movie {movie.name}, expected 1. Skipping auto import." @@ -621,9 +624,9 @@ class MovieService: self.torrent_service.torrent_repository.save_torrent(torrent=torrent) if self.notification_service: - self.notification_service.send_notification( + self.notification_service.send_notification_to_all_providers( title="Movie Downloaded", - body=f"Movie {movie.name} has been successfully downloaded and imported.", + message=f"Movie {movie.name} has been successfully downloaded and imported.", ) else: log.error( @@ -631,9 +634,9 @@ class MovieService: ) if self.notification_service: - self.notification_service.send_notification( + self.notification_service.send_notification_to_all_providers( title="Import Failed", - body=f"Failed to import files for movie {movie.name}. Please check logs.", + message=f"Failed to import files for movie {movie.name}. Please check logs.", ) log.info(f"Finished importing files for torrent {torrent.title}") @@ -678,6 +681,7 @@ class MovieService: movie_id=movie.id, file_path_suffix="IMPORTED", torrent_id=None, + quality=Quality.unknown ) ) diff --git a/web/src/lib/api/api.d.ts b/web/src/lib/api/api.d.ts index 838f7dc..b7b5bd8 100644 --- a/web/src/lib/api/api.d.ts +++ b/web/src/lib/api/api.d.ts @@ -11,10 +11,7 @@ export interface paths { path?: never; cookie?: never; }; - /** - * Hello World - * @description A simple endpoint to check if the API is running. - */ + /** Hello World */ get: operations['hello_world_api_v1_health_get']; put?: never; post?: never; @@ -285,25 +282,7 @@ export interface paths { patch?: never; trace?: never; }; - '/api/v1/tv/shows': { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get All Shows */ - get: operations['get_all_shows_api_v1_tv_shows_get']; - put?: never; - /** Add A Show */ - post: operations['add_a_show_api_v1_tv_shows_post']; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - '/api/v1/tv/episodes/count': { + '/api/v1/tv/search': { parameters: { query?: never; header?: never; @@ -311,10 +290,10 @@ export interface paths { cookie?: never; }; /** - * Get Total Count Of Downloaded Episodes - * @description Total number of episodes downloaded + * Search Metadata Providers For A Show + * @description Search for a show on the configured metadata provider. */ - get: operations['get_total_count_of_downloaded_episodes_api_v1_tv_episodes_count_get']; + get: operations['search_metadata_providers_for_a_show_api_v1_tv_search_get']; put?: never; post?: never; delete?: never; @@ -323,19 +302,21 @@ export interface paths { patch?: never; trace?: never; }; - '/api/v1/tv/shows/{show_id}': { + '/api/v1/tv/recommended': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** Get A Show */ - get: operations['get_a_show_api_v1_tv_shows__show_id__get']; + /** + * Get Recommended Shows + * @description Get a list of recommended/popular shows from the metadata provider. + */ + get: operations['get_recommended_shows_api_v1_tv_recommended_get']; put?: never; post?: never; - /** Delete A Show */ - delete: operations['delete_a_show_api_v1_tv_shows__show_id__delete']; + delete?: never; options?: never; head?: never; patch?: never; @@ -350,7 +331,7 @@ export interface paths { }; /** * Get All Importable Shows - * @description get a list of unknown shows that were detected in the tv directory and are importable + * @description Get a list of unknown shows that were detected in the TV directory and are importable. */ get: operations['get_all_importable_shows_api_v1_tv_importable_get']; put?: never; @@ -381,6 +362,30 @@ export interface paths { patch?: never; trace?: never; }; + '/api/v1/tv/shows': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get All Shows + * @description Get all shows in the library. + */ + get: operations['get_all_shows_api_v1_tv_shows_get']; + put?: never; + /** + * Add A Show + * @description Add a new show to the library. + */ + post: operations['add_a_show_api_v1_tv_shows_post']; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; '/api/v1/tv/shows/torrents': { parameters: { query?: never; @@ -390,8 +395,7 @@ export interface paths { }; /** * Get Shows With Torrents - * @description get all shows that are associated with torrents - * :return: A list of shows with all their torrents + * @description Get all shows that are associated with torrents. */ get: operations['get_shows_with_torrents_api_v1_tv_shows_torrents_get']; put?: never; @@ -409,7 +413,10 @@ export interface paths { path?: never; cookie?: never; }; - /** Get Available Libraries */ + /** + * Get Available Libraries + * @description Get available TV libraries from configuration. + */ get: operations['get_available_libraries_api_v1_tv_shows_libraries_get']; put?: never; post?: never; @@ -419,6 +426,30 @@ export interface paths { patch?: never; trace?: never; }; + '/api/v1/tv/shows/{show_id}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get A Show + * @description Get details for a specific show. + */ + get: operations['get_a_show_api_v1_tv_shows__show_id__get']; + put?: never; + post?: never; + /** + * Delete A Show + * @description Delete a show from the library. + */ + delete: operations['delete_a_show_api_v1_tv_shows__show_id__delete']; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; '/api/v1/tv/shows/{show_id}/metadata': { parameters: { query?: never; @@ -430,7 +461,7 @@ export interface paths { put?: never; /** * Update Shows Metadata - * @description Updates a shows metadata. + * @description Update a show's metadata from the provider. */ post: operations['update_shows_metadata_api_v1_tv_shows__show_id__metadata_post']; delete?: never; @@ -450,7 +481,7 @@ export interface paths { put?: never; /** * Set Continuous Download - * @description Toggles whether future seasons of a show will be downloaded. + * @description Toggle whether future seasons of a show will be automatically downloaded. */ post: operations['set_continuous_download_api_v1_tv_shows__show_id__continuousDownload_post']; delete?: never; @@ -459,23 +490,6 @@ export interface paths { patch?: never; trace?: never; }; - '/api/v1/tv/shows/{show_id}/torrents': { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get A Shows Torrents */ - get: operations['get_a_shows_torrents_api_v1_tv_shows__show_id__torrents_get']; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; '/api/v1/tv/shows/{show_id}/library': { parameters: { query?: never; @@ -487,7 +501,7 @@ export interface paths { put?: never; /** * Set Library - * @description Sets the library of a Show. + * @description Set the library path for a Show. */ post: operations['set_library_api_v1_tv_shows__show_id__library_post']; delete?: never; @@ -496,6 +510,26 @@ export interface paths { patch?: never; trace?: never; }; + '/api/v1/tv/shows/{show_id}/torrents': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get A Shows Torrents + * @description Get torrents associated with a specific show. + */ + get: operations['get_a_shows_torrents_api_v1_tv_shows__show_id__torrents_get']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; '/api/v1/tv/seasons/requests': { parameters: { query?: never; @@ -503,13 +537,19 @@ export interface paths { path?: never; cookie?: never; }; - /** Get Season Requests */ + /** + * Get Season Requests + * @description Get all season requests. + */ get: operations['get_season_requests_api_v1_tv_seasons_requests_get']; - /** Update Request */ + /** + * Update Request + * @description Update an existing season request. + */ put: operations['update_request_api_v1_tv_seasons_requests_put']; /** * Request A Season - * @description adds request flag to a season + * @description Create a new season request. */ post: operations['request_a_season_api_v1_tv_seasons_requests_post']; delete?: never; @@ -518,23 +558,6 @@ export interface paths { patch?: never; trace?: never; }; - '/api/v1/tv/seasons/requests/{request_id}': { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post?: never; - /** Delete Season Request */ - delete: operations['delete_season_request_api_v1_tv_seasons_requests__request_id__delete']; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; '/api/v1/tv/seasons/requests/{season_request_id}': { parameters: { query?: never; @@ -550,11 +573,31 @@ export interface paths { head?: never; /** * Authorize Request - * @description updates the request flag to true + * @description Authorize or de-authorize a season request. */ patch: operations['authorize_request_api_v1_tv_seasons_requests__season_request_id__patch']; trace?: never; }; + '/api/v1/tv/seasons/requests/{request_id}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post?: never; + /** + * Delete Season Request + * @description Delete a season request. + */ + delete: operations['delete_season_request_api_v1_tv_seasons_requests__request_id__delete']; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; '/api/v1/tv/seasons/{season_id}': { parameters: { query?: never; @@ -562,7 +605,10 @@ export interface paths { path?: never; cookie?: never; }; - /** Get Season */ + /** + * Get Season + * @description Get details for a specific season. + */ get: operations['get_season_api_v1_tv_seasons__season_id__get']; put?: never; post?: never; @@ -579,7 +625,10 @@ export interface paths { path?: never; cookie?: never; }; - /** Get Season Files */ + /** + * Get Season Files + * @description Get files associated with a specific season. + */ get: operations['get_season_files_api_v1_tv_seasons__season_id__files_get']; put?: never; post?: never; @@ -596,10 +645,17 @@ export interface paths { path?: never; cookie?: never; }; - /** Get Torrents For A Season */ + /** + * Get Torrents For A Season + * @description Search for torrents for a specific season of a show. + * Default season_number is 1 because it often returns multi-season torrents. + */ get: operations['get_torrents_for_a_season_api_v1_tv_torrents_get']; put?: never; - /** Download A Torrent */ + /** + * Download A Torrent + * @description Trigger a download for a specific torrent. + */ post: operations['download_a_torrent_api_v1_tv_torrents_post']; delete?: never; options?: never; @@ -607,32 +663,18 @@ export interface paths { patch?: never; trace?: never; }; - '/api/v1/tv/search': { + '/api/v1/tv/episodes/count': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** Search Metadata Providers For A Show */ - get: operations['search_metadata_providers_for_a_show_api_v1_tv_search_get']; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - '/api/v1/tv/recommended': { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get Recommended Shows */ - get: operations['get_recommended_shows_api_v1_tv_recommended_get']; + /** + * Get Total Count Of Downloaded Episodes + * @description Total number of episodes downloaded + */ + get: operations['get_total_count_of_downloaded_episodes_api_v1_tv_episodes_count_get']; put?: never; post?: never; delete?: never; @@ -710,37 +752,41 @@ export interface paths { patch: operations['update_torrent_status_api_v1_torrent__torrent_id__status_patch']; trace?: never; }; - '/api/v1/movies': { + '/api/v1/movies/search': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** Get All Movies */ - get: operations['get_all_movies_api_v1_movies_get']; + /** + * Search For Movie + * @description Search for a movie on the configured metadata provider. + */ + get: operations['search_for_movie_api_v1_movies_search_get']; put?: never; - /** Add A Movie */ - post: operations['add_a_movie_api_v1_movies_post']; + post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/v1/movies/{movie_id}': { + '/api/v1/movies/recommended': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** Get Movie By Id */ - get: operations['get_movie_by_id_api_v1_movies__movie_id__get']; + /** + * Get Popular Movies + * @description Get a list of recommended/popular movies from the metadata provider. + */ + get: operations['get_popular_movies_api_v1_movies_recommended_get']; put?: never; post?: never; - /** Delete A Movie */ - delete: operations['delete_a_movie_api_v1_movies__movie_id__delete']; + delete?: never; options?: never; head?: never; patch?: never; @@ -755,7 +801,7 @@ export interface paths { }; /** * Get All Importable Movies - * @description get a list of unknown movies that were detected in the movie directory and are importable + * @description Get a list of unknown movies that were detected in the movie directory and are importable. */ get: operations['get_all_importable_movies_api_v1_movies_importable_get']; put?: never; @@ -777,7 +823,7 @@ export interface paths { put?: never; /** * Import Detected Movie - * @description get a list of unknown movies that were detected in the movie directory and are importable + * @description Import a detected movie from the specified directory into the library. */ post: operations['import_detected_movie_api_v1_movies_importable__movie_id__post']; delete?: never; @@ -786,51 +832,24 @@ export interface paths { patch?: never; trace?: never; }; - '/api/v1/movies/libraries': { + '/api/v1/movies': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** Get Available Libraries */ - get: operations['get_available_libraries_api_v1_movies_libraries_get']; + /** + * Get All Movies + * @description Get all movies in the library. + */ + get: operations['get_all_movies_api_v1_movies_get']; put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - '/api/v1/movies/search': { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Search For Movie */ - get: operations['search_for_movie_api_v1_movies_search_get']; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - '/api/v1/movies/recommended': { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get Popular Movies */ - get: operations['get_popular_movies_api_v1_movies_recommended_get']; - put?: never; - post?: never; + /** + * Add A Movie + * @description Add a new movie to the library. + */ + post: operations['add_a_movie_api_v1_movies_post']; delete?: never; options?: never; head?: never; @@ -844,7 +863,10 @@ export interface paths { path?: never; cookie?: never; }; - /** Get All Movies With Torrents */ + /** + * Get All Movies With Torrents + * @description Get all movies that are associated with torrents. + */ get: operations['get_all_movies_with_torrents_api_v1_movies_torrents_get']; put?: never; post?: never; @@ -854,6 +876,26 @@ export interface paths { patch?: never; trace?: never; }; + '/api/v1/movies/libraries': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get Available Libraries + * @description Get available Movie libraries from configuration. + */ + get: operations['get_available_libraries_api_v1_movies_libraries_get']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; '/api/v1/movies/requests': { parameters: { query?: never; @@ -861,10 +903,16 @@ export interface paths { path?: never; cookie?: never; }; - /** Get All Movie Requests */ + /** + * Get All Movie Requests + * @description Get all movie requests. + */ get: operations['get_all_movie_requests_api_v1_movies_requests_get']; put?: never; - /** Create Movie Request */ + /** + * Create Movie Request + * @description Create a new movie request. + */ post: operations['create_movie_request_api_v1_movies_requests_post']; delete?: never; options?: never; @@ -880,50 +928,45 @@ export interface paths { cookie?: never; }; get?: never; - /** Update Movie Request */ + /** + * Update Movie Request + * @description Update an existing movie request. + */ put: operations['update_movie_request_api_v1_movies_requests__movie_request_id__put']; post?: never; - /** Delete Movie Request */ + /** + * Delete Movie Request + * @description Delete a movie request. + */ delete: operations['delete_movie_request_api_v1_movies_requests__movie_request_id__delete']; options?: never; head?: never; /** * Authorize Request - * @description updates the request flag to true + * @description Authorize or de-authorize a movie request. */ patch: operations['authorize_request_api_v1_movies_requests__movie_request_id__patch']; trace?: never; }; - '/api/v1/movies/{movie_id}/torrents': { + '/api/v1/movies/{movie_id}': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** Get All Available Torrents For A Movie */ - get: operations['get_all_available_torrents_for_a_movie_api_v1_movies__movie_id__torrents_get']; - put?: never; - /** Download Torrent For Movie */ - post: operations['download_torrent_for_movie_api_v1_movies__movie_id__torrents_post']; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - '/api/v1/movies/{movie_id}/files': { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get Movie Files By Movie Id */ - get: operations['get_movie_files_by_movie_id_api_v1_movies__movie_id__files_get']; + /** + * Get Movie By Id + * @description Get details for a specific movie. + */ + get: operations['get_movie_by_id_api_v1_movies__movie_id__get']; put?: never; post?: never; - delete?: never; + /** + * Delete A Movie + * @description Delete a movie from the library. + */ + delete: operations['delete_a_movie_api_v1_movies__movie_id__delete']; options?: never; head?: never; patch?: never; @@ -940,7 +983,7 @@ export interface paths { put?: never; /** * Set Library - * @description Sets the library of a movie. + * @description Set the library path for a Movie. */ post: operations['set_library_api_v1_movies__movie_id__library_post']; delete?: never; @@ -949,6 +992,50 @@ export interface paths { patch?: never; trace?: never; }; + '/api/v1/movies/{movie_id}/files': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get Movie Files By Movie Id + * @description Get files associated with a specific movie. + */ + get: operations['get_movie_files_by_movie_id_api_v1_movies__movie_id__files_get']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/api/v1/movies/{movie_id}/torrents': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Search For Torrents For Movie + * @description Search for torrents for a specific movie. + */ + get: operations['search_for_torrents_for_movie_api_v1_movies__movie_id__torrents_get']; + put?: never; + /** + * Download Torrent For Movie + * @description Trigger a download for a specific torrent for a movie. + */ + post: operations['download_torrent_for_movie_api_v1_movies__movie_id__torrents_post']; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; '/api/v1/notification': { parameters: { query?: never; @@ -1467,10 +1554,10 @@ export interface components { /** Torrent Id */ torrent_id?: string | null; /** - * Downloaded + * Imported * @default false */ - downloaded: boolean; + imported: boolean; }; /** PublicSeason */ PublicSeason: { @@ -2555,31 +2642,10 @@ export interface operations { }; }; }; - get_all_shows_api_v1_tv_shows_get: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successful Response */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - 'application/json': components['schemas']['Show'][]; - }; - }; - }; - }; - add_a_show_api_v1_tv_shows_post: { + search_metadata_providers_for_a_show_api_v1_tv_search_get: { parameters: { query: { - show_id: number; - language?: string | null; + query: string; metadata_provider?: 'tmdb' | 'tvdb'; }; header?: never; @@ -2588,13 +2654,13 @@ export interface operations { }; requestBody?: never; responses: { - /** @description Successfully created show */ - 201: { + /** @description Successful Response */ + 200: { headers: { [name: string]: unknown; }; content: { - 'application/json': components['schemas']['Show']; + 'application/json': components['schemas']['MetaDataProviderSearchResult'][]; }; }; /** @description Validation Error */ @@ -2608,9 +2674,11 @@ export interface operations { }; }; }; - get_total_count_of_downloaded_episodes_api_v1_tv_episodes_count_get: { + get_recommended_shows_api_v1_tv_recommended_get: { parameters: { - query?: never; + query?: { + metadata_provider?: 'tmdb' | 'tvdb'; + }; header?: never; path?: never; cookie?: never; @@ -2623,65 +2691,9 @@ export interface operations { [name: string]: unknown; }; content: { - 'application/json': number; + 'application/json': components['schemas']['MetaDataProviderSearchResult'][]; }; }; - }; - }; - get_a_show_api_v1_tv_shows__show_id__get: { - parameters: { - query?: never; - header?: never; - path: { - /** @description The ID of the show */ - show_id: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successful Response */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - 'application/json': components['schemas']['PublicShow']; - }; - }; - /** @description Validation Error */ - 422: { - headers: { - [name: string]: unknown; - }; - content: { - 'application/json': components['schemas']['HTTPValidationError']; - }; - }; - }; - }; - delete_a_show_api_v1_tv_shows__show_id__delete: { - parameters: { - query?: { - delete_files_on_disk?: boolean; - delete_torrents?: boolean; - }; - header?: never; - path: { - /** @description The ID of the show */ - show_id: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successful Response */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; /** @description Validation Error */ 422: { headers: { @@ -2756,6 +2768,59 @@ export interface operations { }; }; }; + get_all_shows_api_v1_tv_shows_get: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful Response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['Show'][]; + }; + }; + }; + }; + add_a_show_api_v1_tv_shows_post: { + parameters: { + query: { + show_id: number; + language?: string | null; + metadata_provider?: 'tmdb' | 'tvdb'; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successfully created show */ + 201: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['Show']; + }; + }; + /** @description Validation Error */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['HTTPValidationError']; + }; + }; + }; + }; get_shows_with_torrents_api_v1_tv_shows_torrents_get: { parameters: { query?: never; @@ -2796,6 +2861,71 @@ export interface operations { }; }; }; + get_a_show_api_v1_tv_shows__show_id__get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description The ID of the show */ + show_id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful Response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['PublicShow']; + }; + }; + /** @description Validation Error */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['HTTPValidationError']; + }; + }; + }; + }; + delete_a_show_api_v1_tv_shows__show_id__delete: { + parameters: { + query?: { + delete_files_on_disk?: boolean; + delete_torrents?: boolean; + }; + header?: never; + path: { + /** @description The ID of the show */ + show_id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful Response */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Validation Error */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['HTTPValidationError']; + }; + }; + }; + }; update_shows_metadata_api_v1_tv_shows__show_id__metadata_post: { parameters: { query?: { @@ -2864,38 +2994,6 @@ export interface operations { }; }; }; - get_a_shows_torrents_api_v1_tv_shows__show_id__torrents_get: { - parameters: { - query?: never; - header?: never; - path: { - /** @description The ID of the show */ - show_id: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successful Response */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - 'application/json': components['schemas']['RichShowTorrent']; - }; - }; - /** @description Validation Error */ - 422: { - headers: { - [name: string]: unknown; - }; - content: { - 'application/json': components['schemas']['HTTPValidationError']; - }; - }; - }; - }; set_library_api_v1_tv_shows__show_id__library_post: { parameters: { query: { @@ -2928,6 +3026,38 @@ export interface operations { }; }; }; + get_a_shows_torrents_api_v1_tv_shows__show_id__torrents_get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description The ID of the show */ + show_id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful Response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['RichShowTorrent']; + }; + }; + /** @description Validation Error */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['HTTPValidationError']; + }; + }; + }; + }; get_season_requests_api_v1_tv_seasons_requests_get: { parameters: { query?: never; @@ -3010,12 +3140,14 @@ export interface operations { }; }; }; - delete_season_request_api_v1_tv_seasons_requests__request_id__delete: { + authorize_request_api_v1_tv_seasons_requests__season_request_id__patch: { parameters: { - query?: never; + query?: { + authorized_status?: boolean; + }; header?: never; path: { - request_id: string; + season_request_id: string; }; cookie?: never; }; @@ -3039,14 +3171,12 @@ export interface operations { }; }; }; - authorize_request_api_v1_tv_seasons_requests__season_request_id__patch: { + delete_season_request_api_v1_tv_seasons_requests__request_id__delete: { parameters: { - query?: { - authorized_status?: boolean; - }; + query?: never; header?: never; path: { - season_request_id: string; + request_id: string; }; cookie?: never; }; @@ -3200,12 +3330,9 @@ export interface operations { }; }; }; - search_metadata_providers_for_a_show_api_v1_tv_search_get: { + get_total_count_of_downloaded_episodes_api_v1_tv_episodes_count_get: { parameters: { - query: { - query: string; - metadata_provider?: 'tmdb' | 'tvdb'; - }; + query?: never; header?: never; path?: never; cookie?: never; @@ -3218,47 +3345,7 @@ export interface operations { [name: string]: unknown; }; content: { - 'application/json': components['schemas']['MetaDataProviderSearchResult'][]; - }; - }; - /** @description Validation Error */ - 422: { - headers: { - [name: string]: unknown; - }; - content: { - 'application/json': components['schemas']['HTTPValidationError']; - }; - }; - }; - }; - get_recommended_shows_api_v1_tv_recommended_get: { - parameters: { - query?: { - metadata_provider?: 'tmdb' | 'tvdb'; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successful Response */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - 'application/json': components['schemas']['MetaDataProviderSearchResult'][]; - }; - }; - /** @description Validation Error */ - 422: { - headers: { - [name: string]: unknown; - }; - content: { - 'application/json': components['schemas']['HTTPValidationError']; + 'application/json': number; }; }; }; @@ -3408,205 +3495,6 @@ export interface operations { }; }; }; - get_all_movies_api_v1_movies_get: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successful Response */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - 'application/json': components['schemas']['PublicMovie'][]; - }; - }; - }; - }; - add_a_movie_api_v1_movies_post: { - parameters: { - query: { - movie_id: number; - language?: string | null; - metadata_provider?: 'tmdb' | 'tvdb'; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully created movie */ - 201: { - headers: { - [name: string]: unknown; - }; - content: { - 'application/json': components['schemas']['Movie']; - }; - }; - /** @description Validation Error */ - 422: { - headers: { - [name: string]: unknown; - }; - content: { - 'application/json': components['schemas']['HTTPValidationError']; - }; - }; - }; - }; - get_movie_by_id_api_v1_movies__movie_id__get: { - parameters: { - query?: never; - header?: never; - path: { - movie_id: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successful Response */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - 'application/json': components['schemas']['PublicMovie']; - }; - }; - /** @description Validation Error */ - 422: { - headers: { - [name: string]: unknown; - }; - content: { - 'application/json': components['schemas']['HTTPValidationError']; - }; - }; - }; - }; - delete_a_movie_api_v1_movies__movie_id__delete: { - parameters: { - query?: { - delete_files_on_disk?: boolean; - delete_torrents?: boolean; - }; - header?: never; - path: { - /** @description The ID of the movie */ - movie_id: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successful Response */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Validation Error */ - 422: { - headers: { - [name: string]: unknown; - }; - content: { - 'application/json': components['schemas']['HTTPValidationError']; - }; - }; - }; - }; - get_all_importable_movies_api_v1_movies_importable_get: { - parameters: { - query?: { - metadata_provider?: 'tmdb' | 'tvdb'; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successful Response */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - 'application/json': components['schemas']['MediaImportSuggestion'][]; - }; - }; - /** @description Validation Error */ - 422: { - headers: { - [name: string]: unknown; - }; - content: { - 'application/json': components['schemas']['HTTPValidationError']; - }; - }; - }; - }; - import_detected_movie_api_v1_movies_importable__movie_id__post: { - parameters: { - query: { - directory: string; - }; - header?: never; - path: { - movie_id: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successful Response */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Validation Error */ - 422: { - headers: { - [name: string]: unknown; - }; - content: { - 'application/json': components['schemas']['HTTPValidationError']; - }; - }; - }; - }; - get_available_libraries_api_v1_movies_libraries_get: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successful Response */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - 'application/json': components['schemas']['LibraryItem'][]; - }; - }; - }; - }; search_for_movie_api_v1_movies_search_get: { parameters: { query: { @@ -3670,6 +3558,122 @@ export interface operations { }; }; }; + get_all_importable_movies_api_v1_movies_importable_get: { + parameters: { + query?: { + metadata_provider?: 'tmdb' | 'tvdb'; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful Response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['MediaImportSuggestion'][]; + }; + }; + /** @description Validation Error */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['HTTPValidationError']; + }; + }; + }; + }; + import_detected_movie_api_v1_movies_importable__movie_id__post: { + parameters: { + query: { + directory: string; + }; + header?: never; + path: { + /** @description The ID of the movie */ + movie_id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful Response */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Validation Error */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['HTTPValidationError']; + }; + }; + }; + }; + get_all_movies_api_v1_movies_get: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful Response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['PublicMovie'][]; + }; + }; + }; + }; + add_a_movie_api_v1_movies_post: { + parameters: { + query: { + movie_id: number; + language?: string | null; + metadata_provider?: 'tmdb' | 'tvdb'; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successfully created movie */ + 201: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['Movie']; + }; + }; + /** @description Validation Error */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['HTTPValidationError']; + }; + }; + }; + }; get_all_movies_with_torrents_api_v1_movies_torrents_get: { parameters: { query?: never; @@ -3690,6 +3694,26 @@ export interface operations { }; }; }; + get_available_libraries_api_v1_movies_libraries_get: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful Response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['LibraryItem'][]; + }; + }; + }; + }; get_all_movie_requests_api_v1_movies_requests_get: { parameters: { query?: never; @@ -3838,13 +3862,143 @@ export interface operations { }; }; }; - get_all_available_torrents_for_a_movie_api_v1_movies__movie_id__torrents_get: { + get_movie_by_id_api_v1_movies__movie_id__get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description The ID of the movie */ + movie_id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful Response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['PublicMovie']; + }; + }; + /** @description Validation Error */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['HTTPValidationError']; + }; + }; + }; + }; + delete_a_movie_api_v1_movies__movie_id__delete: { + parameters: { + query?: { + delete_files_on_disk?: boolean; + delete_torrents?: boolean; + }; + header?: never; + path: { + /** @description The ID of the movie */ + movie_id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful Response */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Validation Error */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['HTTPValidationError']; + }; + }; + }; + }; + set_library_api_v1_movies__movie_id__library_post: { + parameters: { + query: { + library: string; + }; + header?: never; + path: { + /** @description The ID of the movie */ + movie_id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful Response */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Validation Error */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['HTTPValidationError']; + }; + }; + }; + }; + get_movie_files_by_movie_id_api_v1_movies__movie_id__files_get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description The ID of the movie */ + movie_id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful Response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['PublicMovieFile'][]; + }; + }; + /** @description Validation Error */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['HTTPValidationError']; + }; + }; + }; + }; + search_for_torrents_for_movie_api_v1_movies__movie_id__torrents_get: { parameters: { query?: { search_query_override?: string | null; }; header?: never; path: { + /** @description The ID of the movie */ movie_id: string; }; cookie?: never; @@ -3879,6 +4033,7 @@ export interface operations { }; header?: never; path: { + /** @description The ID of the movie */ movie_id: string; }; cookie?: never; @@ -3905,68 +4060,6 @@ export interface operations { }; }; }; - get_movie_files_by_movie_id_api_v1_movies__movie_id__files_get: { - parameters: { - query?: never; - header?: never; - path: { - movie_id: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successful Response */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - 'application/json': components['schemas']['PublicMovieFile'][]; - }; - }; - /** @description Validation Error */ - 422: { - headers: { - [name: string]: unknown; - }; - content: { - 'application/json': components['schemas']['HTTPValidationError']; - }; - }; - }; - }; - set_library_api_v1_movies__movie_id__library_post: { - parameters: { - query: { - library: string; - }; - header?: never; - path: { - movie_id: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successful Response */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Validation Error */ - 422: { - headers: { - [name: string]: unknown; - }; - content: { - 'application/json': components['schemas']['HTTPValidationError']; - }; - }; - }; - }; get_all_notifications_api_v1_notification_get: { parameters: { query?: never; diff --git a/web/src/lib/components/checkmark-x.svelte b/web/src/lib/components/checkmark-x.svelte index 43f8d66..c684cd1 100644 --- a/web/src/lib/components/checkmark-x.svelte +++ b/web/src/lib/components/checkmark-x.svelte @@ -1,8 +1,8 @@ - {#if state} diff --git a/web/src/routes/dashboard/movies/[movieId=uuid]/+page.svelte b/web/src/routes/dashboard/movies/[movieId=uuid]/+page.svelte index 0e3744f..32224f5 100644 --- a/web/src/routes/dashboard/movies/[movieId=uuid]/+page.svelte +++ b/web/src/routes/dashboard/movies/[movieId=uuid]/+page.svelte @@ -143,7 +143,7 @@ {file.file_path_suffix} - + {/each}