From 3d46bd2d8f4604719d52d070fb8f611229df02ef Mon Sep 17 00:00:00 2001 From: Qstick Date: Sun, 17 Sep 2023 10:19:22 -0500 Subject: [PATCH] Revert cover mapping for collections, optimize translation mapping --- .../Movies/MovieMetadataRepository.cs | 34 +------ .../Collections/CollectionController.cs | 94 +++++++++++++++---- .../Collections/CollectionMovieResource.cs | 10 +- .../ImportLists/ImportListMoviesController.cs | 5 - 4 files changed, 83 insertions(+), 60 deletions(-) diff --git a/src/NzbDrone.Core/Movies/MovieMetadataRepository.cs b/src/NzbDrone.Core/Movies/MovieMetadataRepository.cs index 8c9642bb6..41fc1236e 100644 --- a/src/NzbDrone.Core/Movies/MovieMetadataRepository.cs +++ b/src/NzbDrone.Core/Movies/MovieMetadataRepository.cs @@ -2,9 +2,7 @@ using System.Linq; using NLog; using NzbDrone.Core.Datastore; -using NzbDrone.Core.Languages; using NzbDrone.Core.Messaging.Events; -using NzbDrone.Core.Movies.Translations; namespace NzbDrone.Core.Movies { @@ -45,37 +43,7 @@ public List FindById(List tmdbIds) public List GetMoviesWithCollections() { - var movieDictionary = new Dictionary(); - - var builder = new SqlBuilder(_database.DatabaseType) - .LeftJoin((mm, t) => mm.Id == t.MovieMetadataId) - .Where(x => x.CollectionTmdbId > 0); - - _ = _database.QueryJoined( - builder, - (metadata, translation) => - { - if (!movieDictionary.TryGetValue(metadata.Id, out var movieEntry)) - { - movieEntry = metadata; - movieDictionary.Add(movieEntry.Id, movieEntry); - } - - if (translation != null) - { - movieEntry.Translations.Add(translation); - } - else - { - // Add a translation to avoid filename builder making another call thinking translations are not loaded - // Optimize this later by pulling translations with metadata always - movieEntry.Translations.Add(new MovieTranslation { Title = movieEntry.Title, Language = Language.English }); - } - - return movieEntry; - }); - - return movieDictionary.Values.ToList(); + return Query(x => x.CollectionTmdbId > 0); } public List GetMoviesByCollectionTmdbId(int collectionId) diff --git a/src/Radarr.Api.V3/Collections/CollectionController.cs b/src/Radarr.Api.V3/Collections/CollectionController.cs index fa865870a..f2c888e67 100644 --- a/src/Radarr.Api.V3/Collections/CollectionController.cs +++ b/src/Radarr.Api.V3/Collections/CollectionController.cs @@ -1,17 +1,17 @@ -using System; using System.Collections.Generic; -using System.IO; using System.Linq; using Microsoft.AspNetCore.Mvc; using NzbDrone.Common.Extensions; +using NzbDrone.Core.Configuration; using NzbDrone.Core.Datastore.Events; -using NzbDrone.Core.MediaCover; +using NzbDrone.Core.Languages; using NzbDrone.Core.Messaging.Commands; using NzbDrone.Core.Messaging.Events; using NzbDrone.Core.Movies; using NzbDrone.Core.Movies.Collections; using NzbDrone.Core.Movies.Commands; using NzbDrone.Core.Movies.Events; +using NzbDrone.Core.Movies.Translations; using NzbDrone.Core.Organizer; using NzbDrone.SignalR; using Radarr.Http; @@ -29,27 +29,30 @@ public class CollectionController : RestControllerWithSignalR GetCollections(int? tmdbId) { var collectionResources = new List(); - var coverFileInfos = _coverMapper.GetCoverFileInfos(); if (tmdbId.HasValue) { @@ -75,7 +77,7 @@ public List GetCollections(int? tmdbId) } else { - collectionResources = MapToResource(_collectionService.GetAllCollections(), coverFileInfos).ToList(); + collectionResources = MapToResource(_collectionService.GetAllCollections()).ToList(); } return collectionResources; @@ -137,20 +139,31 @@ public ActionResult UpdateCollections(CollectionUpdateResource resource) return Accepted(updated); } - private IEnumerable MapToResource(List collections, Dictionary coverFileInfos) + private IEnumerable MapToResource(List collections) { // Avoid calling for naming spec on every movie in filenamebuilder var namingConfig = _namingService.GetConfig(); - var collectionMovies = _movieMetadataService.GetMoviesWithCollections(); var existingMoviesTmdbIds = _movieService.AllMovieWithCollectionsTmdbIds(); + var configLanguage = (Language)_configService.MovieInfoLanguage; + + var allCollectionMovies = _movieMetadataService.GetMoviesWithCollections() + .GroupBy(x => x.CollectionTmdbId) + .ToDictionary(x => x.Key, x => (IEnumerable)x); + + var translations = _movieTranslationService.GetAllTranslationsForLanguage(configLanguage); + var tdict = translations.ToDictionary(x => x.MovieMetadataId); foreach (var collection in collections) { var resource = collection.ToResource(); - foreach (var movie in collectionMovies.Where(m => m.CollectionTmdbId == collection.TmdbId)) + allCollectionMovies.TryGetValue(collection.TmdbId, out var collectionMovies); + + foreach (var movie in collectionMovies) { - var movieResource = movie.ToResource(); + var translation = GetTranslationFromDict(tdict, movie, configLanguage); + + var movieResource = movie.ToResource(translation); movieResource.Folder = _fileNameBuilder.GetMovieFolder(new Movie { MovieMetadata = movie }, namingConfig); if (!existingMoviesTmdbIds.Contains(movie.TmdbId)) @@ -161,8 +174,6 @@ private IEnumerable MapToResource(List coll resource.Movies.Add(movieResource); } - MapCoversToLocal(resource.Movies, coverFileInfos); - yield return resource; } } @@ -172,13 +183,15 @@ private CollectionResource MapToResource(MovieCollection collection) var resource = collection.ToResource(); var existingMoviesTmdbIds = _movieService.AllMovieWithCollectionsTmdbIds(); var namingConfig = _namingService.GetConfig(); + var configLanguage = (Language)_configService.MovieInfoLanguage; foreach (var movie in _movieMetadataService.GetMoviesByCollectionTmdbId(collection.TmdbId)) { - var movieResource = movie.ToResource(); - movieResource.Folder = _fileNameBuilder.GetMovieFolder(new Movie { MovieMetadata = movie }, namingConfig); + var translations = _movieTranslationService.GetAllTranslationsForMovieMetadata(movie.Id); + var translation = GetMovieTranslation(translations, movie, configLanguage); - _coverMapper.ConvertToLocalUrls(0, movieResource.Images); + var movieResource = movie.ToResource(translation); + movieResource.Folder = _fileNameBuilder.GetMovieFolder(new Movie { MovieMetadata = movie }, namingConfig); if (!existingMoviesTmdbIds.Contains(movie.TmdbId)) { @@ -191,9 +204,52 @@ private CollectionResource MapToResource(MovieCollection collection) return resource; } - private void MapCoversToLocal(IEnumerable movies, Dictionary coverFileInfos) + private MovieTranslation GetMovieTranslation(List translations, MovieMetadata movieMetadata, Language configLanguage) { - _coverMapper.ConvertToLocalUrls(movies.Select(x => Tuple.Create(0, x.Images.AsEnumerable())), coverFileInfos); + if (configLanguage == Language.Original) + { + return new MovieTranslation + { + Title = movieMetadata.OriginalTitle, + Overview = movieMetadata.Overview + }; + } + + var translation = translations.FirstOrDefault(t => t.Language == configLanguage && t.MovieMetadataId == movieMetadata.Id); + + if (translation == null) + { + translation = new MovieTranslation + { + Title = movieMetadata.Title, + Language = Language.English + }; + } + + return translation; + } + + private MovieTranslation GetTranslationFromDict(Dictionary translations, MovieMetadata movieMetadata, Language configLanguage) + { + if (configLanguage == Language.Original) + { + return new MovieTranslation + { + Title = movieMetadata.OriginalTitle, + Overview = movieMetadata.Overview + }; + } + + if (!translations.TryGetValue(movieMetadata.Id, out var translation)) + { + translation = new MovieTranslation + { + Title = movieMetadata.Title, + Language = Language.English + }; + } + + return translation; } [NonAction] diff --git a/src/Radarr.Api.V3/Collections/CollectionMovieResource.cs b/src/Radarr.Api.V3/Collections/CollectionMovieResource.cs index 2c8a20249..091bf94e7 100644 --- a/src/Radarr.Api.V3/Collections/CollectionMovieResource.cs +++ b/src/Radarr.Api.V3/Collections/CollectionMovieResource.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using NzbDrone.Core.MediaCover; using NzbDrone.Core.Movies; +using NzbDrone.Core.Movies.Translations; namespace Radarr.Api.V3.Collections { @@ -22,18 +23,21 @@ public class CollectionMovieResource public static class CollectionMovieResourceMapper { - public static CollectionMovieResource ToResource(this MovieMetadata model) + public static CollectionMovieResource ToResource(this MovieMetadata model, MovieTranslation movieTranslation = null) { if (model == null) { return null; } + var translatedTitle = movieTranslation?.Title ?? model.Title; + var translatedOverview = movieTranslation?.Overview ?? model.Overview; + return new CollectionMovieResource { TmdbId = model.TmdbId, - Title = model.Title, - Overview = model.Overview, + Title = translatedTitle, + Overview = translatedOverview, SortTitle = model.SortTitle, Images = model.Images, ImdbId = model.ImdbId, diff --git a/src/Radarr.Api.V3/ImportLists/ImportListMoviesController.cs b/src/Radarr.Api.V3/ImportLists/ImportListMoviesController.cs index 42fef65ad..42188bdf8 100644 --- a/src/Radarr.Api.V3/ImportLists/ImportListMoviesController.cs +++ b/src/Radarr.Api.V3/ImportLists/ImportListMoviesController.cs @@ -28,7 +28,6 @@ public class ImportListMoviesController : Controller private readonly IImportExclusionsService _importExclusionService; private readonly INamingConfigService _namingService; private readonly IMovieTranslationService _movieTranslationService; - private readonly IMapCoversToLocal _coverMapper; private readonly IConfigService _configService; public ImportListMoviesController(IMovieService movieService, @@ -40,7 +39,6 @@ public ImportListMoviesController(IMovieService movieService, IImportExclusionsService importExclusionsService, INamingConfigService namingService, IMovieTranslationService movieTranslationService, - IMapCoversToLocal coverMapper, IConfigService configService) { _movieService = movieService; @@ -52,7 +50,6 @@ public ImportListMoviesController(IMovieService movieService, _importExclusionService = importExclusionsService; _namingService = namingService; _movieTranslationService = movieTranslationService; - _coverMapper = coverMapper; _configService = configService; } @@ -118,7 +115,6 @@ private IEnumerable MapToResource(IEnumerable m foreach (var currentMovie in movies) { var resource = currentMovie.ToResource(); - _coverMapper.ConvertToLocalUrls(0, resource.Images); var poster = currentMovie.MovieMetadata.Value.Images.FirstOrDefault(c => c.CoverType == MediaCoverTypes.Poster); if (poster != null) @@ -148,7 +144,6 @@ private IEnumerable MapToResource(IEnumerable c.CoverType == MediaCoverTypes.Poster); if (poster != null)