1
0
mirror of https://github.com/Radarr/Radarr.git synced 2026-03-28 18:05:41 -04:00

Compare commits

..

3 Commits

Author SHA1 Message Date
Qstick
200be6451a fixup! Remove db calls from list threads 2023-10-23 17:12:00 +03:00
Qstick
b279984bd7 fixup! Remove db calls from list threads 2023-10-23 17:12:00 +03:00
Qstick
3f6f4fc65f Remove db calls from list threads 2023-10-23 17:12:00 +03:00
7 changed files with 95 additions and 82 deletions

View File

@@ -2,7 +2,7 @@
[![Build Status](https://dev.azure.com/Radarr/Radarr/_apis/build/status/Radarr.Radarr?branchName=develop)](https://dev.azure.com/Radarr/Radarr/_build/latest?definitionId=1&branchName=develop)
[![Translated](https://translate.servarr.com/widgets/servarr/-/radarr/svg-badge.svg)](https://translate.servarr.com/engage/radarr/?utm_source=widget)
[![Docker Pulls](https://img.shields.io/docker/pulls/linuxserver/radarr.svg)](https://wiki.servarr.com/radarr/installation/docker)
[![Docker Pulls](https://img.shields.io/docker/pulls/linuxserver/radarr.svg)](https://wiki.servarr.com/radarr/installation#docker)
![Github Downloads](https://img.shields.io/github/downloads/Radarr/Radarr/total.svg)
[![Backers on Open Collective](https://opencollective.com/Radarr/backers/badge.svg)](#backers)
[![Sponsors on Open Collective](https://opencollective.com/Radarr/sponsors/badge.svg)](#sponsors)

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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