Revert cover mapping for collections, optimize translation mapping

pull/9236/head v5.0.3.8127
Qstick 1 year ago
parent 017f272201
commit 3d46bd2d8f

@ -2,9 +2,7 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using NLog; using NLog;
using NzbDrone.Core.Datastore; using NzbDrone.Core.Datastore;
using NzbDrone.Core.Languages;
using NzbDrone.Core.Messaging.Events; using NzbDrone.Core.Messaging.Events;
using NzbDrone.Core.Movies.Translations;
namespace NzbDrone.Core.Movies namespace NzbDrone.Core.Movies
{ {
@ -45,37 +43,7 @@ namespace NzbDrone.Core.Movies
public List<MovieMetadata> GetMoviesWithCollections() public List<MovieMetadata> GetMoviesWithCollections()
{ {
var movieDictionary = new Dictionary<int, MovieMetadata>(); return Query(x => x.CollectionTmdbId > 0);
var builder = new SqlBuilder(_database.DatabaseType)
.LeftJoin<MovieMetadata, MovieTranslation>((mm, t) => mm.Id == t.MovieMetadataId)
.Where<MovieMetadata>(x => x.CollectionTmdbId > 0);
_ = _database.QueryJoined<MovieMetadata, MovieTranslation>(
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();
} }
public List<MovieMetadata> GetMoviesByCollectionTmdbId(int collectionId) public List<MovieMetadata> GetMoviesByCollectionTmdbId(int collectionId)

@ -1,17 +1,17 @@
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO;
using System.Linq; using System.Linq;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using NzbDrone.Common.Extensions; using NzbDrone.Common.Extensions;
using NzbDrone.Core.Configuration;
using NzbDrone.Core.Datastore.Events; using NzbDrone.Core.Datastore.Events;
using NzbDrone.Core.MediaCover; using NzbDrone.Core.Languages;
using NzbDrone.Core.Messaging.Commands; using NzbDrone.Core.Messaging.Commands;
using NzbDrone.Core.Messaging.Events; using NzbDrone.Core.Messaging.Events;
using NzbDrone.Core.Movies; using NzbDrone.Core.Movies;
using NzbDrone.Core.Movies.Collections; using NzbDrone.Core.Movies.Collections;
using NzbDrone.Core.Movies.Commands; using NzbDrone.Core.Movies.Commands;
using NzbDrone.Core.Movies.Events; using NzbDrone.Core.Movies.Events;
using NzbDrone.Core.Movies.Translations;
using NzbDrone.Core.Organizer; using NzbDrone.Core.Organizer;
using NzbDrone.SignalR; using NzbDrone.SignalR;
using Radarr.Http; using Radarr.Http;
@ -29,27 +29,30 @@ namespace Radarr.Api.V3.Collections
private readonly IMovieCollectionService _collectionService; private readonly IMovieCollectionService _collectionService;
private readonly IMovieService _movieService; private readonly IMovieService _movieService;
private readonly IMovieMetadataService _movieMetadataService; private readonly IMovieMetadataService _movieMetadataService;
private readonly IMovieTranslationService _movieTranslationService;
private readonly IConfigService _configService;
private readonly IBuildFileNames _fileNameBuilder; private readonly IBuildFileNames _fileNameBuilder;
private readonly INamingConfigService _namingService; private readonly INamingConfigService _namingService;
private readonly IMapCoversToLocal _coverMapper;
private readonly IManageCommandQueue _commandQueueManager; private readonly IManageCommandQueue _commandQueueManager;
public CollectionController(IBroadcastSignalRMessage signalRBroadcaster, public CollectionController(IBroadcastSignalRMessage signalRBroadcaster,
IMovieCollectionService collectionService, IMovieCollectionService collectionService,
IMovieService movieService, IMovieService movieService,
IMovieMetadataService movieMetadataService, IMovieMetadataService movieMetadataService,
IMovieTranslationService movieTranslationService,
IConfigService configService,
IBuildFileNames fileNameBuilder, IBuildFileNames fileNameBuilder,
INamingConfigService namingService, INamingConfigService namingService,
IMapCoversToLocal coverMapper,
IManageCommandQueue commandQueueManager) IManageCommandQueue commandQueueManager)
: base(signalRBroadcaster) : base(signalRBroadcaster)
{ {
_collectionService = collectionService; _collectionService = collectionService;
_movieService = movieService; _movieService = movieService;
_movieMetadataService = movieMetadataService; _movieMetadataService = movieMetadataService;
_movieTranslationService = movieTranslationService;
_configService = configService;
_fileNameBuilder = fileNameBuilder; _fileNameBuilder = fileNameBuilder;
_namingService = namingService; _namingService = namingService;
_coverMapper = coverMapper;
_commandQueueManager = commandQueueManager; _commandQueueManager = commandQueueManager;
} }
@ -62,7 +65,6 @@ namespace Radarr.Api.V3.Collections
public List<CollectionResource> GetCollections(int? tmdbId) public List<CollectionResource> GetCollections(int? tmdbId)
{ {
var collectionResources = new List<CollectionResource>(); var collectionResources = new List<CollectionResource>();
var coverFileInfos = _coverMapper.GetCoverFileInfos();
if (tmdbId.HasValue) if (tmdbId.HasValue)
{ {
@ -75,7 +77,7 @@ namespace Radarr.Api.V3.Collections
} }
else else
{ {
collectionResources = MapToResource(_collectionService.GetAllCollections(), coverFileInfos).ToList(); collectionResources = MapToResource(_collectionService.GetAllCollections()).ToList();
} }
return collectionResources; return collectionResources;
@ -137,20 +139,31 @@ namespace Radarr.Api.V3.Collections
return Accepted(updated); return Accepted(updated);
} }
private IEnumerable<CollectionResource> MapToResource(List<MovieCollection> collections, Dictionary<string, FileInfo> coverFileInfos) private IEnumerable<CollectionResource> MapToResource(List<MovieCollection> collections)
{ {
// Avoid calling for naming spec on every movie in filenamebuilder // Avoid calling for naming spec on every movie in filenamebuilder
var namingConfig = _namingService.GetConfig(); var namingConfig = _namingService.GetConfig();
var collectionMovies = _movieMetadataService.GetMoviesWithCollections();
var existingMoviesTmdbIds = _movieService.AllMovieWithCollectionsTmdbIds(); var existingMoviesTmdbIds = _movieService.AllMovieWithCollectionsTmdbIds();
var configLanguage = (Language)_configService.MovieInfoLanguage;
var allCollectionMovies = _movieMetadataService.GetMoviesWithCollections()
.GroupBy(x => x.CollectionTmdbId)
.ToDictionary(x => x.Key, x => (IEnumerable<MovieMetadata>)x);
var translations = _movieTranslationService.GetAllTranslationsForLanguage(configLanguage);
var tdict = translations.ToDictionary(x => x.MovieMetadataId);
foreach (var collection in collections) foreach (var collection in collections)
{ {
var resource = collection.ToResource(); 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); movieResource.Folder = _fileNameBuilder.GetMovieFolder(new Movie { MovieMetadata = movie }, namingConfig);
if (!existingMoviesTmdbIds.Contains(movie.TmdbId)) if (!existingMoviesTmdbIds.Contains(movie.TmdbId))
@ -161,8 +174,6 @@ namespace Radarr.Api.V3.Collections
resource.Movies.Add(movieResource); resource.Movies.Add(movieResource);
} }
MapCoversToLocal(resource.Movies, coverFileInfos);
yield return resource; yield return resource;
} }
} }
@ -172,13 +183,15 @@ namespace Radarr.Api.V3.Collections
var resource = collection.ToResource(); var resource = collection.ToResource();
var existingMoviesTmdbIds = _movieService.AllMovieWithCollectionsTmdbIds(); var existingMoviesTmdbIds = _movieService.AllMovieWithCollectionsTmdbIds();
var namingConfig = _namingService.GetConfig(); var namingConfig = _namingService.GetConfig();
var configLanguage = (Language)_configService.MovieInfoLanguage;
foreach (var movie in _movieMetadataService.GetMoviesByCollectionTmdbId(collection.TmdbId)) foreach (var movie in _movieMetadataService.GetMoviesByCollectionTmdbId(collection.TmdbId))
{ {
var movieResource = movie.ToResource(); var translations = _movieTranslationService.GetAllTranslationsForMovieMetadata(movie.Id);
movieResource.Folder = _fileNameBuilder.GetMovieFolder(new Movie { MovieMetadata = movie }, namingConfig); 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)) if (!existingMoviesTmdbIds.Contains(movie.TmdbId))
{ {
@ -191,9 +204,52 @@ namespace Radarr.Api.V3.Collections
return resource; return resource;
} }
private void MapCoversToLocal(IEnumerable<CollectionMovieResource> movies, Dictionary<string, FileInfo> coverFileInfos) private MovieTranslation GetMovieTranslation(List<MovieTranslation> 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<int, MovieTranslation> 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] [NonAction]

@ -1,6 +1,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using NzbDrone.Core.MediaCover; using NzbDrone.Core.MediaCover;
using NzbDrone.Core.Movies; using NzbDrone.Core.Movies;
using NzbDrone.Core.Movies.Translations;
namespace Radarr.Api.V3.Collections namespace Radarr.Api.V3.Collections
{ {
@ -22,18 +23,21 @@ namespace Radarr.Api.V3.Collections
public static class CollectionMovieResourceMapper public static class CollectionMovieResourceMapper
{ {
public static CollectionMovieResource ToResource(this MovieMetadata model) public static CollectionMovieResource ToResource(this MovieMetadata model, MovieTranslation movieTranslation = null)
{ {
if (model == null) if (model == null)
{ {
return null; return null;
} }
var translatedTitle = movieTranslation?.Title ?? model.Title;
var translatedOverview = movieTranslation?.Overview ?? model.Overview;
return new CollectionMovieResource return new CollectionMovieResource
{ {
TmdbId = model.TmdbId, TmdbId = model.TmdbId,
Title = model.Title, Title = translatedTitle,
Overview = model.Overview, Overview = translatedOverview,
SortTitle = model.SortTitle, SortTitle = model.SortTitle,
Images = model.Images, Images = model.Images,
ImdbId = model.ImdbId, ImdbId = model.ImdbId,

@ -28,7 +28,6 @@ namespace Radarr.Api.V3.ImportLists
private readonly IImportExclusionsService _importExclusionService; private readonly IImportExclusionsService _importExclusionService;
private readonly INamingConfigService _namingService; private readonly INamingConfigService _namingService;
private readonly IMovieTranslationService _movieTranslationService; private readonly IMovieTranslationService _movieTranslationService;
private readonly IMapCoversToLocal _coverMapper;
private readonly IConfigService _configService; private readonly IConfigService _configService;
public ImportListMoviesController(IMovieService movieService, public ImportListMoviesController(IMovieService movieService,
@ -40,7 +39,6 @@ namespace Radarr.Api.V3.ImportLists
IImportExclusionsService importExclusionsService, IImportExclusionsService importExclusionsService,
INamingConfigService namingService, INamingConfigService namingService,
IMovieTranslationService movieTranslationService, IMovieTranslationService movieTranslationService,
IMapCoversToLocal coverMapper,
IConfigService configService) IConfigService configService)
{ {
_movieService = movieService; _movieService = movieService;
@ -52,7 +50,6 @@ namespace Radarr.Api.V3.ImportLists
_importExclusionService = importExclusionsService; _importExclusionService = importExclusionsService;
_namingService = namingService; _namingService = namingService;
_movieTranslationService = movieTranslationService; _movieTranslationService = movieTranslationService;
_coverMapper = coverMapper;
_configService = configService; _configService = configService;
} }
@ -118,7 +115,6 @@ namespace Radarr.Api.V3.ImportLists
foreach (var currentMovie in movies) foreach (var currentMovie in movies)
{ {
var resource = currentMovie.ToResource(); var resource = currentMovie.ToResource();
_coverMapper.ConvertToLocalUrls(0, resource.Images);
var poster = currentMovie.MovieMetadata.Value.Images.FirstOrDefault(c => c.CoverType == MediaCoverTypes.Poster); var poster = currentMovie.MovieMetadata.Value.Images.FirstOrDefault(c => c.CoverType == MediaCoverTypes.Poster);
if (poster != null) if (poster != null)
@ -148,7 +144,6 @@ namespace Radarr.Api.V3.ImportLists
foreach (var currentMovie in movies) foreach (var currentMovie in movies)
{ {
var resource = currentMovie.ToResource(); var resource = currentMovie.ToResource();
_coverMapper.ConvertToLocalUrls(0, resource.Images);
var poster = currentMovie.MovieMetadata.Value.Images.FirstOrDefault(c => c.CoverType == MediaCoverTypes.Poster); var poster = currentMovie.MovieMetadata.Value.Images.FirstOrDefault(c => c.CoverType == MediaCoverTypes.Poster);
if (poster != null) if (poster != null)

Loading…
Cancel
Save