From 178525d8d7ead727d62ca0d7ec4c574c1d42beff Mon Sep 17 00:00:00 2001 From: nickern Date: Fri, 26 Apr 2024 23:36:59 +0200 Subject: [PATCH] New: Added new API endpoints to get missing and wanted movies --- src/NzbDrone.Core/Movies/MovieRepository.cs | 6 ++++ src/NzbDrone.Core/Movies/MovieService.cs | 12 ++++++++ src/Radarr.Api.V3/Movies/MissingController.cs | 23 +++++++++++++++ .../Movies/MissingWantedResource.cs | 29 +++++++++++++++++++ src/Radarr.Api.V3/Movies/WantedController.cs | 23 +++++++++++++++ 5 files changed, 93 insertions(+) create mode 100644 src/Radarr.Api.V3/Movies/MissingController.cs create mode 100644 src/Radarr.Api.V3/Movies/MissingWantedResource.cs create mode 100644 src/Radarr.Api.V3/Movies/WantedController.cs diff --git a/src/NzbDrone.Core/Movies/MovieRepository.cs b/src/NzbDrone.Core/Movies/MovieRepository.cs index 34042c2d3..eaae353f3 100644 --- a/src/NzbDrone.Core/Movies/MovieRepository.cs +++ b/src/NzbDrone.Core/Movies/MovieRepository.cs @@ -31,6 +31,7 @@ namespace NzbDrone.Core.Movies List GetRecommendations(); bool ExistsByMetadataId(int metadataId); HashSet AllMovieWithCollectionsTmdbIds(); + List FindMissing(); } public class MovieRepository : BasicRepository, IMovieRepository @@ -378,5 +379,10 @@ namespace NzbDrone.Core.Movies return conn.Query("SELECT \"TmdbId\" FROM \"MovieMetadata\" JOIN \"Movies\" ON (\"Movies\".\"MovieMetadataId\" = \"MovieMetadata\".\"Id\") WHERE \"CollectionTmdbId\" > 0").ToHashSet(); } } + + public List FindMissing() + { + return Query(x => x.Monitored == true && x.MovieFileId == 0); + } } } diff --git a/src/NzbDrone.Core/Movies/MovieService.cs b/src/NzbDrone.Core/Movies/MovieService.cs index 710ddf7fb..c9bf5066f 100644 --- a/src/NzbDrone.Core/Movies/MovieService.cs +++ b/src/NzbDrone.Core/Movies/MovieService.cs @@ -47,6 +47,8 @@ namespace NzbDrone.Core.Movies void RemoveAddOptions(Movie movie); bool ExistsByMetadataId(int metadataId); HashSet AllMovieWithCollectionsTmdbIds(); + List GetMissingMovies(); + List GetWantedMovies(); } public class MovieService : IMovieService, IHandle, @@ -412,5 +414,15 @@ namespace NzbDrone.Core.Movies UpdateMovie(movie); } } + + public List GetMissingMovies() + { + return _movieRepository.FindMissing(); + } + + public List GetWantedMovies() + { + return _movieRepository.FindMissing().Where(m => m.IsAvailable() == true).ToList(); + } } } diff --git a/src/Radarr.Api.V3/Movies/MissingController.cs b/src/Radarr.Api.V3/Movies/MissingController.cs new file mode 100644 index 000000000..3a2e91e36 --- /dev/null +++ b/src/Radarr.Api.V3/Movies/MissingController.cs @@ -0,0 +1,23 @@ +using Microsoft.AspNetCore.Mvc; +using NzbDrone.Core.Movies; +using Radarr.Http; + +namespace Radarr.Api.V3.Movies +{ + [V3ApiController("missing")] + public class MissingController : Controller + { + private readonly IMovieService _movieService; + + public MissingController(IMovieService movieService) + { + _movieService = movieService; + } + + [HttpGet] + public MissingWantedResource GetMissing() + { + return _movieService.GetMissingMovies().ToResource(); + } + } +} diff --git a/src/Radarr.Api.V3/Movies/MissingWantedResource.cs b/src/Radarr.Api.V3/Movies/MissingWantedResource.cs new file mode 100644 index 000000000..b5be0e6cc --- /dev/null +++ b/src/Radarr.Api.V3/Movies/MissingWantedResource.cs @@ -0,0 +1,29 @@ +using System.Collections.Generic; +using NzbDrone.Core.Movies; +using Radarr.Http.REST; + +namespace Radarr.Api.V3.Movies +{ + public class MissingWantedResource : RestResource + { + public int Total { get; set; } + public List Movies { get; set; } + } + + public static class MissingResourceMapper + { + public static MissingWantedResource ToResource(this List model) + { + if (model == null) + { + return null; + } + + return new MissingWantedResource + { + Total = model.Count, + Movies = model.ToResource(0) + }; + } + } +} diff --git a/src/Radarr.Api.V3/Movies/WantedController.cs b/src/Radarr.Api.V3/Movies/WantedController.cs new file mode 100644 index 000000000..ed2a2ea23 --- /dev/null +++ b/src/Radarr.Api.V3/Movies/WantedController.cs @@ -0,0 +1,23 @@ +using Microsoft.AspNetCore.Mvc; +using NzbDrone.Core.Movies; +using Radarr.Http; + +namespace Radarr.Api.V3.Movies +{ + [V3ApiController("wanted")] + public class WantedController : Controller + { + private readonly IMovieService _movieService; + + public WantedController(IMovieService movieService) + { + _movieService = movieService; + } + + [HttpGet] + public MissingWantedResource GetWanted() + { + return _movieService.GetWantedMovies().ToResource(); + } + } +}