mirror of
https://github.com/Radarr/Radarr.git
synced 2024-10-02 06:07:19 +02:00
Remove db calls from list threads
This commit is contained in:
parent
3e5089719c
commit
3f6f4fc65f
@ -60,7 +60,7 @@ public void Setup()
|
|||||||
{
|
{
|
||||||
Movies = _list1Movies,
|
Movies = _list1Movies,
|
||||||
AnyFailure = false,
|
AnyFailure = false,
|
||||||
SyncedLists = 1
|
SyncedLists = new List<int> { 1 }
|
||||||
};
|
};
|
||||||
|
|
||||||
_commandAll = new ImportListSyncCommand
|
_commandAll = new ImportListSyncCommand
|
||||||
@ -100,7 +100,7 @@ private void GivenListFailure()
|
|||||||
|
|
||||||
private void GivenNoListSync()
|
private void GivenNoListSync()
|
||||||
{
|
{
|
||||||
_importListFetch.SyncedLists = 0;
|
_importListFetch.SyncedLists = new List<int>();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void GivenCleanLevel(string cleanLevel)
|
private void GivenCleanLevel(string cleanLevel)
|
||||||
|
@ -5,9 +5,6 @@
|
|||||||
using NLog;
|
using NLog;
|
||||||
using NzbDrone.Common.Instrumentation.Extensions;
|
using NzbDrone.Common.Instrumentation.Extensions;
|
||||||
using NzbDrone.Common.TPL;
|
using NzbDrone.Common.TPL;
|
||||||
using NzbDrone.Core.ImportLists.ImportListMovies;
|
|
||||||
using NzbDrone.Core.MetadataSource;
|
|
||||||
using NzbDrone.Core.Movies;
|
|
||||||
|
|
||||||
namespace NzbDrone.Core.ImportLists
|
namespace NzbDrone.Core.ImportLists
|
||||||
{
|
{
|
||||||
@ -21,26 +18,14 @@ public class FetchAndParseImportListService : IFetchAndParseImportList
|
|||||||
{
|
{
|
||||||
private readonly IImportListFactory _importListFactory;
|
private readonly IImportListFactory _importListFactory;
|
||||||
private readonly IImportListStatusService _importListStatusService;
|
private readonly IImportListStatusService _importListStatusService;
|
||||||
private readonly IImportListMovieService _listMovieService;
|
|
||||||
private readonly ISearchForNewMovie _movieSearch;
|
|
||||||
private readonly IProvideMovieInfo _movieInfoService;
|
|
||||||
private readonly IMovieMetadataService _movieMetadataService;
|
|
||||||
private readonly Logger _logger;
|
private readonly Logger _logger;
|
||||||
|
|
||||||
public FetchAndParseImportListService(IImportListFactory importListFactory,
|
public FetchAndParseImportListService(IImportListFactory importListFactory,
|
||||||
IImportListStatusService importListStatusService,
|
IImportListStatusService importListStatusService,
|
||||||
IImportListMovieService listMovieService,
|
|
||||||
ISearchForNewMovie movieSearch,
|
|
||||||
IProvideMovieInfo movieInfoService,
|
|
||||||
IMovieMetadataService movieMetadataService,
|
|
||||||
Logger logger)
|
Logger logger)
|
||||||
{
|
{
|
||||||
_importListFactory = importListFactory;
|
_importListFactory = importListFactory;
|
||||||
_importListStatusService = importListStatusService;
|
_importListStatusService = importListStatusService;
|
||||||
_listMovieService = listMovieService;
|
|
||||||
_movieSearch = movieSearch;
|
|
||||||
_movieInfoService = movieInfoService;
|
|
||||||
_movieMetadataService = movieMetadataService;
|
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -101,21 +86,17 @@ public ImportListFetchResult Fetch()
|
|||||||
|
|
||||||
if (!importListReports.AnyFailure)
|
if (!importListReports.AnyFailure)
|
||||||
{
|
{
|
||||||
var alreadyMapped = result.Movies.Where(x => importListReports.Movies.Any(r => r.TmdbId == x.TmdbId));
|
var listMovies = importListReports.Movies;
|
||||||
var listMovies = MapMovieReports(importListReports.Movies.Where(x => result.Movies.All(r => r.TmdbId != x.TmdbId))).Where(x => x.TmdbId > 0).ToList();
|
|
||||||
|
|
||||||
listMovies.AddRange(alreadyMapped);
|
|
||||||
listMovies = listMovies.DistinctBy(x => x.TmdbId).ToList();
|
|
||||||
listMovies.ForEach(m => m.ListId = importList.Definition.Id);
|
listMovies.ForEach(m => m.ListId = importList.Definition.Id);
|
||||||
|
|
||||||
result.Movies.AddRange(listMovies);
|
result.Movies.AddRange(listMovies);
|
||||||
_listMovieService.SyncMoviesForList(listMovies, importList.Definition.Id);
|
|
||||||
|
result.SyncedWithoutFailure.Add(importList.Definition.Id);
|
||||||
}
|
}
|
||||||
|
|
||||||
result.AnyFailure |= importListReports.AnyFailure;
|
result.AnyFailure |= importListReports.AnyFailure;
|
||||||
result.SyncedLists++;
|
result.SyncedLists.Add(importList.Definition.Id);
|
||||||
|
|
||||||
_importListStatusService.UpdateListSyncStatus(importList.Definition.Id);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
@ -129,9 +110,17 @@ public ImportListFetchResult Fetch()
|
|||||||
|
|
||||||
Task.WaitAll(taskList.ToArray());
|
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();
|
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;
|
return result;
|
||||||
}
|
}
|
||||||
@ -160,19 +149,19 @@ public ImportListFetchResult FetchSingleList(ImportListDefinition definition)
|
|||||||
|
|
||||||
if (!importListReports.AnyFailure)
|
if (!importListReports.AnyFailure)
|
||||||
{
|
{
|
||||||
var listMovies = MapMovieReports(importListReports.Movies)
|
var listMovies = importListReports.Movies;
|
||||||
.Where(x => x.TmdbId > 0)
|
|
||||||
.DistinctBy(x => x.TmdbId)
|
|
||||||
.ToList();
|
|
||||||
|
|
||||||
listMovies.ForEach(m => m.ListId = importList.Definition.Id);
|
listMovies.ForEach(m => m.ListId = importList.Definition.Id);
|
||||||
|
|
||||||
result.Movies.AddRange(listMovies);
|
result.Movies.AddRange(listMovies);
|
||||||
_listMovieService.SyncMoviesForList(listMovies, importList.Definition.Id);
|
|
||||||
|
result.SyncedWithoutFailure.Add(importList.Definition.Id);
|
||||||
}
|
}
|
||||||
|
|
||||||
result.AnyFailure |= importListReports.AnyFailure;
|
result.AnyFailure |= importListReports.AnyFailure;
|
||||||
|
|
||||||
|
result.SyncedLists.Add(importList.Definition.Id);
|
||||||
|
|
||||||
_importListStatusService.UpdateListSyncStatus(importList.Definition.Id);
|
_importListStatusService.UpdateListSyncStatus(importList.Definition.Id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -187,32 +176,5 @@ public ImportListFetchResult FetchSingleList(ImportListDefinition definition)
|
|||||||
|
|
||||||
return result;
|
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 @@ public class ImportListFetchResult
|
|||||||
public ImportListFetchResult()
|
public ImportListFetchResult()
|
||||||
{
|
{
|
||||||
Movies = new List<ImportListMovie>();
|
Movies = new List<ImportListMovie>();
|
||||||
|
SyncedLists = new List<int>();
|
||||||
|
SyncedWithoutFailure = new List<int>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<ImportListMovie> Movies { get; set; }
|
public List<ImportListMovie> Movies { get; set; }
|
||||||
public bool AnyFailure { 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
|
public abstract class ImportListBase<TSettings> : IImportList
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
using NzbDrone.Core.ImportLists.ImportExclusions;
|
using NzbDrone.Core.ImportLists.ImportExclusions;
|
||||||
using NzbDrone.Core.ImportLists.ImportListMovies;
|
using NzbDrone.Core.ImportLists.ImportListMovies;
|
||||||
using NzbDrone.Core.Messaging.Commands;
|
using NzbDrone.Core.Messaging.Commands;
|
||||||
|
using NzbDrone.Core.MetadataSource;
|
||||||
using NzbDrone.Core.Movies;
|
using NzbDrone.Core.Movies;
|
||||||
|
|
||||||
namespace NzbDrone.Core.ImportLists
|
namespace NzbDrone.Core.ImportLists
|
||||||
@ -17,6 +18,8 @@ public class ImportListSyncService : IExecute<ImportListSyncCommand>
|
|||||||
private readonly IImportListFactory _importListFactory;
|
private readonly IImportListFactory _importListFactory;
|
||||||
private readonly IFetchAndParseImportList _listFetcherAndParser;
|
private readonly IFetchAndParseImportList _listFetcherAndParser;
|
||||||
private readonly IMovieService _movieService;
|
private readonly IMovieService _movieService;
|
||||||
|
private readonly IMovieMetadataService _movieMetadataService;
|
||||||
|
private readonly ISearchForNewMovie _movieSearch;
|
||||||
private readonly IAddMovieService _addMovieService;
|
private readonly IAddMovieService _addMovieService;
|
||||||
private readonly IConfigService _configService;
|
private readonly IConfigService _configService;
|
||||||
private readonly IImportExclusionsService _exclusionService;
|
private readonly IImportExclusionsService _exclusionService;
|
||||||
@ -25,6 +28,8 @@ public class ImportListSyncService : IExecute<ImportListSyncCommand>
|
|||||||
public ImportListSyncService(IImportListFactory importListFactory,
|
public ImportListSyncService(IImportListFactory importListFactory,
|
||||||
IFetchAndParseImportList listFetcherAndParser,
|
IFetchAndParseImportList listFetcherAndParser,
|
||||||
IMovieService movieService,
|
IMovieService movieService,
|
||||||
|
IMovieMetadataService movieMetadataService,
|
||||||
|
ISearchForNewMovie movieSearch,
|
||||||
IAddMovieService addMovieService,
|
IAddMovieService addMovieService,
|
||||||
IConfigService configService,
|
IConfigService configService,
|
||||||
IImportExclusionsService exclusionService,
|
IImportExclusionsService exclusionService,
|
||||||
@ -34,6 +39,8 @@ public ImportListSyncService(IImportListFactory importListFactory,
|
|||||||
_importListFactory = importListFactory;
|
_importListFactory = importListFactory;
|
||||||
_listFetcherAndParser = listFetcherAndParser;
|
_listFetcherAndParser = listFetcherAndParser;
|
||||||
_movieService = movieService;
|
_movieService = movieService;
|
||||||
|
_movieMetadataService = movieMetadataService;
|
||||||
|
_movieSearch = movieSearch;
|
||||||
_addMovieService = addMovieService;
|
_addMovieService = addMovieService;
|
||||||
_exclusionService = exclusionService;
|
_exclusionService = exclusionService;
|
||||||
_listMovieService = listMovieService;
|
_listMovieService = listMovieService;
|
||||||
@ -52,17 +59,17 @@ private void SyncAll()
|
|||||||
|
|
||||||
var listItemsResult = _listFetcherAndParser.Fetch();
|
var listItemsResult = _listFetcherAndParser.Fetch();
|
||||||
|
|
||||||
if (listItemsResult.SyncedLists == 0)
|
if (listItemsResult.SyncedLists.Count == 0)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ProcessListItems(listItemsResult);
|
||||||
|
|
||||||
if (!listItemsResult.AnyFailure)
|
if (!listItemsResult.AnyFailure)
|
||||||
{
|
{
|
||||||
CleanLibrary();
|
CleanLibrary();
|
||||||
}
|
}
|
||||||
|
|
||||||
ProcessListItems(listItemsResult);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SyncList(ImportListDefinition definition)
|
private void SyncList(ImportListDefinition definition)
|
||||||
@ -125,7 +132,25 @@ private void ProcessMovieReport(ImportListDefinition importList, ImportListMovie
|
|||||||
|
|
||||||
private void ProcessListItems(ImportListFetchResult listFetchResult)
|
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)
|
if (x.TmdbId != 0)
|
||||||
{
|
{
|
||||||
@ -140,7 +165,7 @@ private void ProcessListItems(ImportListFetchResult listFetchResult)
|
|||||||
return x.Title;
|
return x.Title;
|
||||||
}).ToList();
|
}).ToList();
|
||||||
|
|
||||||
var listedMovies = listFetchResult.Movies.ToList();
|
var listedMovies = allMappedMovies;
|
||||||
|
|
||||||
var importExclusions = _exclusionService.GetAllExclusions();
|
var importExclusions = _exclusionService.GetAllExclusions();
|
||||||
var dbMovies = _movieService.AllMovieTmdbIds();
|
var dbMovies = _movieService.AllMovieTmdbIds();
|
||||||
@ -168,6 +193,33 @@ private void ProcessListItems(ImportListFetchResult listFetchResult)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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)
|
public void Execute(ImportListSyncCommand message)
|
||||||
{
|
{
|
||||||
if (message.DefinitionId.HasValue)
|
if (message.DefinitionId.HasValue)
|
||||||
|
Loading…
Reference in New Issue
Block a user