1
0
mirror of https://github.com/Radarr/Radarr.git synced 2024-07-02 10:22:21 +02:00
This commit is contained in:
Qstick 2024-06-20 18:12:06 +03:00 committed by GitHub
commit 9e97bb6dde
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 94 additions and 80 deletions

View File

@ -7,8 +7,6 @@
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 @@ public void Setup()
_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 @@ public void should_store_movies_if_list_doesnt_fail()
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 @@ public void should_not_store_movies_if_list_fails()
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 @@ public void should_only_store_movies_for_lists_that_dont_fail()
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]

View File

@ -7,6 +7,7 @@
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 @@ public void Setup()
_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 @@ public void Setup()
.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 @@ public void Setup()
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 @@ private void GivenListFailure()
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 @@ private void GivenList(int id, bool enabledAuto)
{ {
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);

View File

@ -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;
}
} }
} }

View File

@ -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

View File

@ -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)