mirror of
https://github.com/Radarr/Radarr.git
synced 2026-03-28 18:05:41 -04:00
Compare commits
3 Commits
v5.1.2.820
...
db-calls-l
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
200be6451a | ||
|
|
b279984bd7 | ||
|
|
3f6f4fc65f |
@@ -2,7 +2,7 @@
|
||||
|
||||
[](https://dev.azure.com/Radarr/Radarr/_build/latest?definitionId=1&branchName=develop)
|
||||
[](https://translate.servarr.com/engage/radarr/?utm_source=widget)
|
||||
[](https://wiki.servarr.com/radarr/installation/docker)
|
||||
[](https://wiki.servarr.com/radarr/installation#docker)
|
||||

|
||||
[](#backers)
|
||||
[](#sponsors)
|
||||
|
||||
@@ -7,8 +7,6 @@ using Moq;
|
||||
using NUnit.Framework;
|
||||
using NzbDrone.Core.ImportLists;
|
||||
using NzbDrone.Core.ImportLists.ImportListMovies;
|
||||
using NzbDrone.Core.MetadataSource;
|
||||
using NzbDrone.Core.Movies;
|
||||
using NzbDrone.Core.Test.Framework;
|
||||
|
||||
namespace NzbDrone.Core.Test.ImportListTests
|
||||
@@ -36,10 +34,6 @@ namespace NzbDrone.Core.Test.ImportListTests
|
||||
|
||||
_listMovies = Builder<ImportListMovie>.CreateListOfSize(5)
|
||||
.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)
|
||||
@@ -135,9 +129,6 @@ namespace NzbDrone.Core.Test.ImportListTests
|
||||
|
||||
var listResult = Subject.Fetch();
|
||||
listResult.AnyFailure.Should().BeFalse();
|
||||
|
||||
Mocker.GetMock<IImportListMovieService>()
|
||||
.Verify(v => v.SyncMoviesForList(It.IsAny<List<ImportListMovie>>(), listId), Times.Once());
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -149,9 +140,6 @@ namespace NzbDrone.Core.Test.ImportListTests
|
||||
|
||||
var listResult = Subject.Fetch();
|
||||
listResult.AnyFailure.Should().BeTrue();
|
||||
|
||||
Mocker.GetMock<IImportListMovieService>()
|
||||
.Verify(v => v.SyncMoviesForList(It.IsAny<List<ImportListMovie>>(), listId), Times.Never());
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -166,9 +154,6 @@ namespace NzbDrone.Core.Test.ImportListTests
|
||||
|
||||
var listResult = Subject.Fetch();
|
||||
listResult.AnyFailure.Should().BeTrue();
|
||||
|
||||
Mocker.GetMock<IImportListMovieService>()
|
||||
.Verify(v => v.SyncMoviesForList(It.IsAny<List<ImportListMovie>>(), passedListId), Times.Once());
|
||||
}
|
||||
|
||||
[Test]
|
||||
|
||||
@@ -7,6 +7,7 @@ using NzbDrone.Core.Configuration;
|
||||
using NzbDrone.Core.ImportLists;
|
||||
using NzbDrone.Core.ImportLists.ImportExclusions;
|
||||
using NzbDrone.Core.ImportLists.ImportListMovies;
|
||||
using NzbDrone.Core.MetadataSource;
|
||||
using NzbDrone.Core.Movies;
|
||||
using NzbDrone.Core.Test.Framework;
|
||||
|
||||
@@ -59,8 +60,7 @@ namespace NzbDrone.Core.Test.ImportList
|
||||
_importListFetch = new ImportListFetchResult
|
||||
{
|
||||
Movies = _list1Movies,
|
||||
AnyFailure = false,
|
||||
SyncedLists = 1
|
||||
AnyFailure = false
|
||||
};
|
||||
|
||||
_commandAll = new ImportListSyncCommand
|
||||
@@ -84,6 +84,10 @@ namespace NzbDrone.Core.Test.ImportList
|
||||
.Setup(v => v.MovieExists(It.IsAny<Movie>()))
|
||||
.Returns(false);
|
||||
|
||||
Mocker.GetMock<IMovieService>()
|
||||
.Setup(v => v.MovieExists(It.IsAny<Movie>()))
|
||||
.Returns(false);
|
||||
|
||||
Mocker.GetMock<IMovieService>()
|
||||
.Setup(v => v.AllMovieTmdbIds())
|
||||
.Returns(new List<int>());
|
||||
@@ -91,6 +95,10 @@ namespace NzbDrone.Core.Test.ImportList
|
||||
Mocker.GetMock<IFetchAndParseImportList>()
|
||||
.Setup(v => v.Fetch())
|
||||
.Returns(_importListFetch);
|
||||
|
||||
Mocker.GetMock<ISearchForNewMovie>()
|
||||
.Setup(v => v.MapMovieToTmdbMovie(It.IsAny<MovieMetadata>()))
|
||||
.Returns<MovieMetadata>(m => new MovieMetadata { TmdbId = m.TmdbId });
|
||||
}
|
||||
|
||||
private void GivenListFailure()
|
||||
@@ -100,7 +108,8 @@ namespace NzbDrone.Core.Test.ImportList
|
||||
|
||||
private void GivenNoListSync()
|
||||
{
|
||||
_importListFetch.SyncedLists = 0;
|
||||
_importListFetch.SyncedLists = new List<int>();
|
||||
_importListFetch.SyncedWithoutFailure = new List<int>();
|
||||
}
|
||||
|
||||
private void GivenCleanLevel(string cleanLevel)
|
||||
@@ -114,6 +123,9 @@ namespace NzbDrone.Core.Test.ImportList
|
||||
{
|
||||
var importListDefinition = new ImportListDefinition { Id = id, EnableAuto = enabledAuto };
|
||||
|
||||
_importListFetch.SyncedLists.Add(id);
|
||||
_importListFetch.SyncedWithoutFailure.Add(id);
|
||||
|
||||
Mocker.GetMock<IImportListFactory>()
|
||||
.Setup(v => v.Get(id))
|
||||
.Returns(importListDefinition);
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -373,7 +373,6 @@
|
||||
"EnableInteractiveSearchHelpText": "Will be used when interactive search is used",
|
||||
"EnableInteractiveSearchHelpTextWarning": "Search is not supported with this indexer",
|
||||
"EnableMediaInfoHelpText": "Extract video information such as resolution, runtime and codec information from files. This requires Radarr to read parts of the file which may cause high disk or network activity during scans.",
|
||||
"EnableProfile": "Enable Profile",
|
||||
"EnableRSS": "Enable RSS",
|
||||
"EnableSSL": "Enable SSL",
|
||||
"EnableSslHelpText": " Requires restart running as administrator to take effect",
|
||||
|
||||
Reference in New Issue
Block a user