To tidy: speed up movie module

This commit is contained in:
ta264 2020-10-07 21:45:04 +01:00
parent bd7780196c
commit 6af1289640
2 changed files with 93 additions and 29 deletions

View File

@ -1,9 +1,11 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Threading;
using NLog;
using NzbDrone.Common;
using NzbDrone.Common.Disk;
using NzbDrone.Common.EnvironmentInfo;
using NzbDrone.Common.Extensions;
@ -17,7 +19,8 @@ namespace NzbDrone.Core.MediaCover
{
public interface IMapCoversToLocal
{
void ConvertToLocalUrls(int movieId, IEnumerable<MediaCover> covers);
Dictionary<string, FileInfo> GetCoverFileInfos();
void ConvertToLocalUrls(int movieId, IEnumerable<MediaCover> covers, Dictionary<string, FileInfo> fileInfos = null);
string GetCoverPath(int movieId, MediaCoverTypes mediaCoverTypes, int? height = null);
}
@ -70,7 +73,19 @@ namespace NzbDrone.Core.MediaCover
return Path.Combine(GetMovieCoverPath(movieId), coverTypes.ToString().ToLower() + heightSuffix + ".jpg");
}
public void ConvertToLocalUrls(int movieId, IEnumerable<MediaCover> covers)
public Dictionary<string, FileInfo> GetCoverFileInfos()
{
if (!_diskProvider.FolderExists(_coverRootFolder))
{
return new Dictionary<string, FileInfo>();
}
return _diskProvider
.GetFileInfos(_coverRootFolder, SearchOption.AllDirectories)
.ToDictionary(x => x.FullName, PathEqualityComparer.Instance);
}
public void ConvertToLocalUrls(int movieId, IEnumerable<MediaCover> covers, Dictionary<string, FileInfo> fileInfos = null)
{
if (movieId == 0)
{
@ -90,9 +105,21 @@ namespace NzbDrone.Core.MediaCover
mediaCover.RemoteUrl = mediaCover.Url;
mediaCover.Url = _configFileProvider.UrlBase + @"/MediaCover/" + movieId + "/" + mediaCover.CoverType.ToString().ToLower() + ".jpg";
if (_diskProvider.FileExists(filePath))
FileInfo file;
var fileExists = false;
if (fileInfos != null)
{
var lastWrite = _diskProvider.FileGetLastWrite(filePath);
fileExists = fileInfos.TryGetValue(filePath, out file);
}
else
{
file = _diskProvider.GetFileInfo(filePath);
fileExists = file.Exists;
}
if (fileExists)
{
var lastWrite = file.LastWriteTimeUtc;
mediaCover.Url += "?lastWrite=" + lastWrite.Ticks;
}
}

View File

@ -1,7 +1,10 @@
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using FluentValidation;
using Nancy;
using NLog;
using NzbDrone.Common.Extensions;
using NzbDrone.Core.Configuration;
using NzbDrone.Core.Datastore.Events;
@ -40,23 +43,25 @@ namespace Radarr.Api.V3.Movies
private readonly IManageCommandQueue _commandQueueManager;
private readonly IUpgradableSpecification _qualityUpgradableSpecification;
private readonly IConfigService _configService;
private readonly Logger _logger;
public MovieModule(IBroadcastSignalRMessage signalRBroadcaster,
IMovieService moviesService,
IMovieTranslationService movieTranslationService,
IAddMovieService addMovieService,
IMapCoversToLocal coverMapper,
IManageCommandQueue commandQueueManager,
IUpgradableSpecification qualityUpgradableSpecification,
IConfigService configService,
RootFolderValidator rootFolderValidator,
MappedNetworkDriveValidator mappedNetworkDriveValidator,
MoviePathValidator moviesPathValidator,
MovieExistsValidator moviesExistsValidator,
MovieAncestorValidator moviesAncestorValidator,
SystemFolderValidator systemFolderValidator,
ProfileExistsValidator profileExistsValidator,
MovieFolderAsRootFolderValidator movieFolderAsRootFolderValidator)
IMovieService moviesService,
IMovieTranslationService movieTranslationService,
IAddMovieService addMovieService,
IMapCoversToLocal coverMapper,
IManageCommandQueue commandQueueManager,
IUpgradableSpecification qualityUpgradableSpecification,
IConfigService configService,
RootFolderValidator rootFolderValidator,
MappedNetworkDriveValidator mappedNetworkDriveValidator,
MoviePathValidator moviesPathValidator,
MovieExistsValidator moviesExistsValidator,
MovieAncestorValidator moviesAncestorValidator,
SystemFolderValidator systemFolderValidator,
ProfileExistsValidator profileExistsValidator,
MovieFolderAsRootFolderValidator movieFolderAsRootFolderValidator,
Logger logger)
: base(signalRBroadcaster)
{
_moviesService = moviesService;
@ -66,6 +71,7 @@ namespace Radarr.Api.V3.Movies
_configService = configService;
_coverMapper = coverMapper;
_commandQueueManager = commandQueueManager;
_logger = logger;
GetResourceAll = AllMovie;
GetResourceById = GetMovie;
@ -104,6 +110,8 @@ namespace Radarr.Api.V3.Movies
var moviesResources = new List<MovieResource>();
var configLanguage = (Language)_configService.MovieInfoLanguage;
Dictionary<string, FileInfo> coverFileInfos = null;
if (tmdbId > 0)
{
var movie = _moviesService.FindByTmdbId(tmdbId);
@ -117,17 +125,34 @@ namespace Radarr.Api.V3.Movies
}
else
{
var translations = _movieTranslationService.GetAllTranslationsForLanguage(configLanguage);
var movies = _moviesService.GetAllMovies();
_logger.Debug("Getting all movies");
var movieTask = Task.Run(() => _moviesService.GetAllMovies());
_logger.Debug("started movie task");
var translations = _movieTranslationService
.GetAllTranslationsForLanguage(configLanguage)
.ToDictionary(x => x.Id);
_logger.Debug("Got translations");
coverFileInfos = _coverMapper.GetCoverFileInfos();
_logger.Debug("got cover file infos");
var movies = movieTask.GetAwaiter().GetResult();
_logger.Debug("Got movies");
moviesResources = new List<MovieResource>(movies.Count);
foreach (var movie in movies)
{
var translation = GetMovieTranslation(translations, movie, configLanguage);
moviesResources.Add(movie.ToResource(_qualityUpgradableSpecification, translation));
var translation = GetTranslationFromDict(translations, movie, configLanguage);
var resource = movie.ToResource(_qualityUpgradableSpecification, translation);
_coverMapper.ConvertToLocalUrls(resource.Id, resource.Images, coverFileInfos);
moviesResources.Add(resource);
}
}
MapCoversToLocal(moviesResources.ToArray());
_logger.Debug("Mapped resources; done");
return moviesResources;
}
@ -168,6 +193,21 @@ namespace Radarr.Api.V3.Movies
return translations.FirstOrDefault(t => t.Language == configLanguage && t.MovieId == movie.Id);
}
private MovieTranslation GetTranslationFromDict(Dictionary<int, MovieTranslation> translations, Movie movie, Language configLanguage)
{
if (configLanguage == Language.Original)
{
return new MovieTranslation
{
Title = movie.OriginalTitle,
Overview = movie.Overview
};
}
translations.TryGetValue(movie.Id, out var translation);
return translation;
}
private int AddMovie(MovieResource moviesResource)
{
var movie = _addMovieService.AddMovie(moviesResource.ToModel());
@ -211,12 +251,9 @@ namespace Radarr.Api.V3.Movies
_moviesService.DeleteMovie(id, deleteFiles, addExclusion);
}
private void MapCoversToLocal(params MovieResource[] movies)
private void MapCoversToLocal(MovieResource movie)
{
foreach (var moviesResource in movies)
{
_coverMapper.ConvertToLocalUrls(moviesResource.Id, moviesResource.Images);
}
_coverMapper.ConvertToLocalUrls(movie.Id, movie.Images);
}
public void Handle(MovieImportedEvent message)