Qstick 1 month ago committed by GitHub
commit f8ea8e1b4c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -7,8 +7,6 @@ using Moq;
using NUnit.Framework; using NUnit.Framework;
using NzbDrone.Core.ImportLists; using NzbDrone.Core.ImportLists;
using NzbDrone.Core.ImportLists.ImportListMovies; using NzbDrone.Core.ImportLists.ImportListMovies;
using NzbDrone.Core.MetadataSource;
using NzbDrone.Core.Movies;
using NzbDrone.Core.Test.Framework; using NzbDrone.Core.Test.Framework;
namespace NzbDrone.Core.Test.ImportListTests namespace NzbDrone.Core.Test.ImportListTests
@ -36,10 +34,6 @@ namespace NzbDrone.Core.Test.ImportListTests
_listMovies = Builder<ImportListMovie>.CreateListOfSize(5) _listMovies = Builder<ImportListMovie>.CreateListOfSize(5)
.Build().ToList(); .Build().ToList();
Mocker.GetMock<ISearchForNewMovie>()
.Setup(v => v.MapMovieToTmdbMovie(It.IsAny<MovieMetadata>()))
.Returns<MovieMetadata>(m => new MovieMetadata { TmdbId = m.TmdbId });
} }
private void GivenList(int id, bool enabled, bool enabledAuto, ImportListFetchResult fetchResult) private void GivenList(int id, bool enabled, bool enabledAuto, ImportListFetchResult fetchResult)
@ -135,9 +129,6 @@ namespace NzbDrone.Core.Test.ImportListTests
var listResult = Subject.Fetch(); var listResult = Subject.Fetch();
listResult.AnyFailure.Should().BeFalse(); listResult.AnyFailure.Should().BeFalse();
Mocker.GetMock<IImportListMovieService>()
.Verify(v => v.SyncMoviesForList(It.IsAny<List<ImportListMovie>>(), listId), Times.Once());
} }
[Test] [Test]
@ -149,9 +140,6 @@ namespace NzbDrone.Core.Test.ImportListTests
var listResult = Subject.Fetch(); var listResult = Subject.Fetch();
listResult.AnyFailure.Should().BeTrue(); listResult.AnyFailure.Should().BeTrue();
Mocker.GetMock<IImportListMovieService>()
.Verify(v => v.SyncMoviesForList(It.IsAny<List<ImportListMovie>>(), listId), Times.Never());
} }
[Test] [Test]
@ -166,9 +154,6 @@ namespace NzbDrone.Core.Test.ImportListTests
var listResult = Subject.Fetch(); var listResult = Subject.Fetch();
listResult.AnyFailure.Should().BeTrue(); listResult.AnyFailure.Should().BeTrue();
Mocker.GetMock<IImportListMovieService>()
.Verify(v => v.SyncMoviesForList(It.IsAny<List<ImportListMovie>>(), passedListId), Times.Once());
} }
[Test] [Test]

@ -7,6 +7,7 @@ using NzbDrone.Core.Configuration;
using NzbDrone.Core.ImportLists; using NzbDrone.Core.ImportLists;
using NzbDrone.Core.ImportLists.ImportExclusions; using NzbDrone.Core.ImportLists.ImportExclusions;
using NzbDrone.Core.ImportLists.ImportListMovies; using NzbDrone.Core.ImportLists.ImportListMovies;
using NzbDrone.Core.MetadataSource;
using NzbDrone.Core.Movies; using NzbDrone.Core.Movies;
using NzbDrone.Core.Test.Framework; using NzbDrone.Core.Test.Framework;
@ -59,8 +60,7 @@ namespace NzbDrone.Core.Test.ImportList
_importListFetch = new ImportListFetchResult _importListFetch = new ImportListFetchResult
{ {
Movies = _list1Movies, Movies = _list1Movies,
AnyFailure = false, AnyFailure = false
SyncedLists = 1
}; };
_commandAll = new ImportListSyncCommand _commandAll = new ImportListSyncCommand
@ -84,6 +84,10 @@ namespace NzbDrone.Core.Test.ImportList
.Setup(v => v.MovieExists(It.IsAny<Movie>())) .Setup(v => v.MovieExists(It.IsAny<Movie>()))
.Returns(false); .Returns(false);
Mocker.GetMock<IMovieService>()
.Setup(v => v.MovieExists(It.IsAny<Movie>()))
.Returns(false);
Mocker.GetMock<IMovieService>() Mocker.GetMock<IMovieService>()
.Setup(v => v.AllMovieTmdbIds()) .Setup(v => v.AllMovieTmdbIds())
.Returns(new List<int>()); .Returns(new List<int>());
@ -91,6 +95,10 @@ namespace NzbDrone.Core.Test.ImportList
Mocker.GetMock<IFetchAndParseImportList>() Mocker.GetMock<IFetchAndParseImportList>()
.Setup(v => v.Fetch()) .Setup(v => v.Fetch())
.Returns(_importListFetch); .Returns(_importListFetch);
Mocker.GetMock<ISearchForNewMovie>()
.Setup(v => v.MapMovieToTmdbMovie(It.IsAny<MovieMetadata>()))
.Returns<MovieMetadata>(m => new MovieMetadata { TmdbId = m.TmdbId });
} }
private void GivenListFailure() private void GivenListFailure()
@ -100,7 +108,8 @@ namespace NzbDrone.Core.Test.ImportList
private void GivenNoListSync() private void GivenNoListSync()
{ {
_importListFetch.SyncedLists = 0; _importListFetch.SyncedLists = new List<int>();
_importListFetch.SyncedWithoutFailure = new List<int>();
} }
private void GivenCleanLevel(string cleanLevel) private void GivenCleanLevel(string cleanLevel)
@ -114,6 +123,9 @@ namespace NzbDrone.Core.Test.ImportList
{ {
var importListDefinition = new ImportListDefinition { Id = id, EnableAuto = enabledAuto }; var importListDefinition = new ImportListDefinition { Id = id, EnableAuto = enabledAuto };
_importListFetch.SyncedLists.Add(id);
_importListFetch.SyncedWithoutFailure.Add(id);
Mocker.GetMock<IImportListFactory>() Mocker.GetMock<IImportListFactory>()
.Setup(v => v.Get(id)) .Setup(v => v.Get(id))
.Returns(importListDefinition); .Returns(importListDefinition);

@ -5,9 +5,6 @@ using System.Threading.Tasks;
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 @@ namespace NzbDrone.Core.ImportLists
{ {
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 @@ namespace NzbDrone.Core.ImportLists
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 @@ namespace NzbDrone.Core.ImportLists
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 @@ namespace NzbDrone.Core.ImportLists
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 @@ namespace NzbDrone.Core.ImportLists
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 @@ namespace NzbDrone.Core.ImportLists
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.Configuration;
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 @@ namespace NzbDrone.Core.ImportLists
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 @@ namespace NzbDrone.Core.ImportLists
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 @@ namespace NzbDrone.Core.ImportLists
_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 @@ namespace NzbDrone.Core.ImportLists
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 @@ namespace NzbDrone.Core.ImportLists
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 @@ namespace NzbDrone.Core.ImportLists
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 @@ 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) public void Execute(ImportListSyncCommand message)
{ {
if (message.DefinitionId.HasValue) if (message.DefinitionId.HasValue)

Loading…
Cancel
Save