mirror of https://github.com/Radarr/Radarr
Remove db calls from list threads
This commit is contained in:
parent
3e5089719c
commit
3f6f4fc65f
|
@ -60,7 +60,7 @@ namespace NzbDrone.Core.Test.ImportList
|
|||
{
|
||||
Movies = _list1Movies,
|
||||
AnyFailure = false,
|
||||
SyncedLists = 1
|
||||
SyncedLists = new List<int> { 1 }
|
||||
};
|
||||
|
||||
_commandAll = new ImportListSyncCommand
|
||||
|
@ -100,7 +100,7 @@ namespace NzbDrone.Core.Test.ImportList
|
|||
|
||||
private void GivenNoListSync()
|
||||
{
|
||||
_importListFetch.SyncedLists = 0;
|
||||
_importListFetch.SyncedLists = new List<int>();
|
||||
}
|
||||
|
||||
private void GivenCleanLevel(string cleanLevel)
|
||||
|
|
|
@ -5,9 +5,6 @@ using System.Threading.Tasks;
|
|||
using NLog;
|
||||
using NzbDrone.Common.Instrumentation.Extensions;
|
||||
using NzbDrone.Common.TPL;
|
||||
using NzbDrone.Core.ImportLists.ImportListMovies;
|
||||
using NzbDrone.Core.MetadataSource;
|
||||
using NzbDrone.Core.Movies;
|
||||
|
||||
namespace NzbDrone.Core.ImportLists
|
||||
{
|
||||
|
@ -21,26 +18,14 @@ namespace NzbDrone.Core.ImportLists
|
|||
{
|
||||
private readonly IImportListFactory _importListFactory;
|
||||
private readonly IImportListStatusService _importListStatusService;
|
||||
private readonly IImportListMovieService _listMovieService;
|
||||
private readonly ISearchForNewMovie _movieSearch;
|
||||
private readonly IProvideMovieInfo _movieInfoService;
|
||||
private readonly IMovieMetadataService _movieMetadataService;
|
||||
private readonly Logger _logger;
|
||||
|
||||
public FetchAndParseImportListService(IImportListFactory importListFactory,
|
||||
IImportListStatusService importListStatusService,
|
||||
IImportListMovieService listMovieService,
|
||||
ISearchForNewMovie movieSearch,
|
||||
IProvideMovieInfo movieInfoService,
|
||||
IMovieMetadataService movieMetadataService,
|
||||
Logger logger)
|
||||
{
|
||||
_importListFactory = importListFactory;
|
||||
_importListStatusService = importListStatusService;
|
||||
_listMovieService = listMovieService;
|
||||
_movieSearch = movieSearch;
|
||||
_movieInfoService = movieInfoService;
|
||||
_movieMetadataService = movieMetadataService;
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
|
@ -101,21 +86,17 @@ namespace NzbDrone.Core.ImportLists
|
|||
|
||||
if (!importListReports.AnyFailure)
|
||||
{
|
||||
var alreadyMapped = result.Movies.Where(x => importListReports.Movies.Any(r => r.TmdbId == x.TmdbId));
|
||||
var listMovies = MapMovieReports(importListReports.Movies.Where(x => result.Movies.All(r => r.TmdbId != x.TmdbId))).Where(x => x.TmdbId > 0).ToList();
|
||||
var listMovies = importListReports.Movies;
|
||||
|
||||
listMovies.AddRange(alreadyMapped);
|
||||
listMovies = listMovies.DistinctBy(x => x.TmdbId).ToList();
|
||||
listMovies.ForEach(m => m.ListId = importList.Definition.Id);
|
||||
|
||||
result.Movies.AddRange(listMovies);
|
||||
_listMovieService.SyncMoviesForList(listMovies, importList.Definition.Id);
|
||||
|
||||
result.SyncedWithoutFailure.Add(importList.Definition.Id);
|
||||
}
|
||||
|
||||
result.AnyFailure |= importListReports.AnyFailure;
|
||||
result.SyncedLists++;
|
||||
|
||||
_importListStatusService.UpdateListSyncStatus(importList.Definition.Id);
|
||||
result.SyncedLists.Add(importList.Definition.Id);
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
|
@ -129,9 +110,17 @@ namespace NzbDrone.Core.ImportLists
|
|||
|
||||
Task.WaitAll(taskList.ToArray());
|
||||
|
||||
foreach (var list in importLists)
|
||||
{
|
||||
if (result.SyncedLists.Contains(list.Definition.Id))
|
||||
{
|
||||
_importListStatusService.UpdateListSyncStatus(list.Definition.Id);
|
||||
}
|
||||
}
|
||||
|
||||
result.Movies = result.Movies.DistinctBy(r => new { r.TmdbId, r.ImdbId, r.Title }).ToList();
|
||||
|
||||
_logger.Debug("Found {0} total reports from {1} lists", result.Movies.Count, result.SyncedLists);
|
||||
_logger.Debug("Found {0} total reports from {1} lists", result.Movies.Count, result.SyncedLists.Count);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
@ -160,19 +149,19 @@ namespace NzbDrone.Core.ImportLists
|
|||
|
||||
if (!importListReports.AnyFailure)
|
||||
{
|
||||
var listMovies = MapMovieReports(importListReports.Movies)
|
||||
.Where(x => x.TmdbId > 0)
|
||||
.DistinctBy(x => x.TmdbId)
|
||||
.ToList();
|
||||
var listMovies = importListReports.Movies;
|
||||
|
||||
listMovies.ForEach(m => m.ListId = importList.Definition.Id);
|
||||
|
||||
result.Movies.AddRange(listMovies);
|
||||
_listMovieService.SyncMoviesForList(listMovies, importList.Definition.Id);
|
||||
|
||||
result.SyncedWithoutFailure.Add(importList.Definition.Id);
|
||||
}
|
||||
|
||||
result.AnyFailure |= importListReports.AnyFailure;
|
||||
|
||||
result.SyncedLists.Add(importList.Definition.Id);
|
||||
|
||||
_importListStatusService.UpdateListSyncStatus(importList.Definition.Id);
|
||||
}
|
||||
}
|
||||
|
@ -187,32 +176,5 @@ namespace NzbDrone.Core.ImportLists
|
|||
|
||||
return result;
|
||||
}
|
||||
|
||||
private List<ImportListMovie> MapMovieReports(IEnumerable<ImportListMovie> reports)
|
||||
{
|
||||
var mappedMovies = reports.Select(m => _movieSearch.MapMovieToTmdbMovie(new MovieMetadata { Title = m.Title, TmdbId = m.TmdbId, ImdbId = m.ImdbId, Year = m.Year }))
|
||||
.Where(x => x != null)
|
||||
.DistinctBy(x => x.TmdbId)
|
||||
.ToList();
|
||||
|
||||
_movieMetadataService.UpsertMany(mappedMovies);
|
||||
|
||||
var mappedListMovies = new List<ImportListMovie>();
|
||||
|
||||
foreach (var movieMeta in mappedMovies)
|
||||
{
|
||||
var mappedListMovie = new ImportListMovie();
|
||||
|
||||
if (movieMeta != null)
|
||||
{
|
||||
mappedListMovie.MovieMetadata = movieMeta;
|
||||
mappedListMovie.MovieMetadataId = movieMeta.Id;
|
||||
}
|
||||
|
||||
mappedListMovies.Add(mappedListMovie);
|
||||
}
|
||||
|
||||
return mappedListMovies;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -15,11 +15,14 @@ namespace NzbDrone.Core.ImportLists
|
|||
public ImportListFetchResult()
|
||||
{
|
||||
Movies = new List<ImportListMovie>();
|
||||
SyncedLists = new List<int>();
|
||||
SyncedWithoutFailure = new List<int>();
|
||||
}
|
||||
|
||||
public List<ImportListMovie> Movies { get; set; }
|
||||
public bool AnyFailure { get; set; }
|
||||
public int SyncedLists { get; set; }
|
||||
public List<int> SyncedLists { get; set; }
|
||||
public List<int> SyncedWithoutFailure { get; set; }
|
||||
}
|
||||
|
||||
public abstract class ImportListBase<TSettings> : IImportList
|
||||
|
|
|
@ -7,6 +7,7 @@ using NzbDrone.Core.Configuration;
|
|||
using NzbDrone.Core.ImportLists.ImportExclusions;
|
||||
using NzbDrone.Core.ImportLists.ImportListMovies;
|
||||
using NzbDrone.Core.Messaging.Commands;
|
||||
using NzbDrone.Core.MetadataSource;
|
||||
using NzbDrone.Core.Movies;
|
||||
|
||||
namespace NzbDrone.Core.ImportLists
|
||||
|
@ -17,6 +18,8 @@ namespace NzbDrone.Core.ImportLists
|
|||
private readonly IImportListFactory _importListFactory;
|
||||
private readonly IFetchAndParseImportList _listFetcherAndParser;
|
||||
private readonly IMovieService _movieService;
|
||||
private readonly IMovieMetadataService _movieMetadataService;
|
||||
private readonly ISearchForNewMovie _movieSearch;
|
||||
private readonly IAddMovieService _addMovieService;
|
||||
private readonly IConfigService _configService;
|
||||
private readonly IImportExclusionsService _exclusionService;
|
||||
|
@ -25,6 +28,8 @@ namespace NzbDrone.Core.ImportLists
|
|||
public ImportListSyncService(IImportListFactory importListFactory,
|
||||
IFetchAndParseImportList listFetcherAndParser,
|
||||
IMovieService movieService,
|
||||
IMovieMetadataService movieMetadataService,
|
||||
ISearchForNewMovie movieSearch,
|
||||
IAddMovieService addMovieService,
|
||||
IConfigService configService,
|
||||
IImportExclusionsService exclusionService,
|
||||
|
@ -34,6 +39,8 @@ namespace NzbDrone.Core.ImportLists
|
|||
_importListFactory = importListFactory;
|
||||
_listFetcherAndParser = listFetcherAndParser;
|
||||
_movieService = movieService;
|
||||
_movieMetadataService = movieMetadataService;
|
||||
_movieSearch = movieSearch;
|
||||
_addMovieService = addMovieService;
|
||||
_exclusionService = exclusionService;
|
||||
_listMovieService = listMovieService;
|
||||
|
@ -52,17 +59,17 @@ namespace NzbDrone.Core.ImportLists
|
|||
|
||||
var listItemsResult = _listFetcherAndParser.Fetch();
|
||||
|
||||
if (listItemsResult.SyncedLists == 0)
|
||||
if (listItemsResult.SyncedLists.Count == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
ProcessListItems(listItemsResult);
|
||||
|
||||
if (!listItemsResult.AnyFailure)
|
||||
{
|
||||
CleanLibrary();
|
||||
}
|
||||
|
||||
ProcessListItems(listItemsResult);
|
||||
}
|
||||
|
||||
private void SyncList(ImportListDefinition definition)
|
||||
|
@ -125,7 +132,25 @@ namespace NzbDrone.Core.ImportLists
|
|||
|
||||
private void ProcessListItems(ImportListFetchResult listFetchResult)
|
||||
{
|
||||
listFetchResult.Movies = listFetchResult.Movies.DistinctBy(x =>
|
||||
var allMappedMovies = new List<ImportListMovie>();
|
||||
|
||||
// Sync ListMovies table for Discovery view and Cleaning task
|
||||
foreach (var listId in listFetchResult.SyncedWithoutFailure)
|
||||
{
|
||||
var listMovies = listFetchResult.Movies.Where(x => x.ListId == listId);
|
||||
var alreadyMapped = allMappedMovies.Where(x => listMovies.Any(r => r.TmdbId == x.TmdbId));
|
||||
var mappedListMovies = MapMovieReports(listMovies.Where(x => allMappedMovies.All(r => r.TmdbId != x.TmdbId)).ToList()).Where(x => x.TmdbId > 0).ToList();
|
||||
|
||||
mappedListMovies.AddRange(alreadyMapped);
|
||||
mappedListMovies = mappedListMovies.DistinctBy(x => x.TmdbId).ToList();
|
||||
mappedListMovies.ForEach(m => m.ListId = listId);
|
||||
|
||||
allMappedMovies.AddRange(mappedListMovies);
|
||||
|
||||
_listMovieService.SyncMoviesForList(mappedListMovies, listId);
|
||||
}
|
||||
|
||||
allMappedMovies = allMappedMovies.DistinctBy(x =>
|
||||
{
|
||||
if (x.TmdbId != 0)
|
||||
{
|
||||
|
@ -140,7 +165,7 @@ namespace NzbDrone.Core.ImportLists
|
|||
return x.Title;
|
||||
}).ToList();
|
||||
|
||||
var listedMovies = listFetchResult.Movies.ToList();
|
||||
var listedMovies = allMappedMovies;
|
||||
|
||||
var importExclusions = _exclusionService.GetAllExclusions();
|
||||
var dbMovies = _movieService.AllMovieTmdbIds();
|
||||
|
@ -168,6 +193,33 @@ namespace NzbDrone.Core.ImportLists
|
|||
}
|
||||
}
|
||||
|
||||
private List<ImportListMovie> MapMovieReports(IEnumerable<ImportListMovie> reports)
|
||||
{
|
||||
var mappedMovies = reports.Select(m => _movieSearch.MapMovieToTmdbMovie(new MovieMetadata { Title = m.Title, TmdbId = m.TmdbId, ImdbId = m.ImdbId, Year = m.Year }))
|
||||
.Where(x => x != null)
|
||||
.DistinctBy(x => x.TmdbId)
|
||||
.ToList();
|
||||
|
||||
_movieMetadataService.UpsertMany(mappedMovies);
|
||||
|
||||
var mappedListMovies = new List<ImportListMovie>();
|
||||
|
||||
foreach (var movieMeta in mappedMovies)
|
||||
{
|
||||
var mappedListMovie = new ImportListMovie();
|
||||
|
||||
if (movieMeta != null)
|
||||
{
|
||||
mappedListMovie.MovieMetadata = movieMeta;
|
||||
mappedListMovie.MovieMetadataId = movieMeta.Id;
|
||||
}
|
||||
|
||||
mappedListMovies.Add(mappedListMovie);
|
||||
}
|
||||
|
||||
return mappedListMovies;
|
||||
}
|
||||
|
||||
public void Execute(ImportListSyncCommand message)
|
||||
{
|
||||
if (message.DefinitionId.HasValue)
|
||||
|
|
Loading…
Reference in New Issue