Use async api calls for Refresh and NetImportSync

pull/4454/head
ta264 4 years ago committed by Qstick
parent 4a5012f98e
commit 2bdd806565

@ -1,6 +1,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Threading.Tasks;
using FizzWare.NBuilder; using FizzWare.NBuilder;
using Moq; using Moq;
using NUnit.Framework; using NUnit.Framework;
@ -32,15 +33,15 @@ namespace NzbDrone.Core.Test.MovieTests
.Returns(_movie); .Returns(_movie);
Mocker.GetMock<IProvideMovieInfo>() Mocker.GetMock<IProvideMovieInfo>()
.Setup(s => s.GetMovieInfo(It.IsAny<int>())) .Setup(s => s.GetMovieInfoAsync(It.IsAny<int>()))
.Callback<int>((i) => { throw new MovieNotFoundException(i); }); .ThrowsAsync(new MovieNotFoundException(1));
} }
private void GivenNewMovieInfo(Movie movie) private void GivenNewMovieInfo(Movie movie)
{ {
Mocker.GetMock<IProvideMovieInfo>() Mocker.GetMock<IProvideMovieInfo>()
.Setup(s => s.GetMovieInfo(_movie.TmdbId)) .Setup(s => s.GetMovieInfoAsync(_movie.TmdbId))
.Returns(new Tuple<Movie, List<Credit>>(movie, new List<Credit>())); .ReturnsAsync(new Tuple<Movie, List<Credit>>(movie, new List<Credit>()));
} }
[Test] [Test]

@ -68,8 +68,8 @@ namespace NzbDrone.Core.Test.NetImport
.Returns(false); .Returns(false);
Mocker.GetMock<ISearchForNewMovie>() Mocker.GetMock<ISearchForNewMovie>()
.Setup(v => v.MapMovieToTmdbMovie(It.IsAny<Movie>())) .Setup(v => v.MapMovieToTmdbMovieAsync(It.IsAny<Movie>()))
.Returns((Movie movie) => movie); .ReturnsAsync((Movie movie) => movie);
Mocker.GetMock<IMovieService>() Mocker.GetMock<IMovieService>()
.Setup(v => v.MovieExists(It.IsAny<Movie>())) .Setup(v => v.MovieExists(It.IsAny<Movie>()))

@ -2,6 +2,7 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Threading.Tasks;
using NLog; using NLog;
using NzbDrone.Common.Extensions; using NzbDrone.Common.Extensions;
using NzbDrone.Common.Instrumentation.Extensions; using NzbDrone.Common.Instrumentation.Extensions;
@ -52,7 +53,7 @@ namespace NzbDrone.Core.Movies
_logger = logger; _logger = logger;
} }
private void RefreshMovieInfo(Movie movie) private void RefreshMovieInfo(Movie movie, Task<Tuple<Movie, List<Credit>>> dataTask)
{ {
_logger.ProgressInfo("Updating Info for {0}", movie.Title); _logger.ProgressInfo("Updating Info for {0}", movie.Title);
@ -61,7 +62,7 @@ namespace NzbDrone.Core.Movies
try try
{ {
var tuple = _movieInfo.GetMovieInfo(movie.TmdbId); var tuple = dataTask.GetAwaiter().GetResult();
movieInfo = tuple.Item1; movieInfo = tuple.Item1;
credits = tuple.Item2; credits = tuple.Item2;
} }
@ -172,10 +173,11 @@ namespace NzbDrone.Core.Movies
if (message.MovieId.HasValue) if (message.MovieId.HasValue)
{ {
var movie = _movieService.GetMovie(message.MovieId.Value); var movie = _movieService.GetMovie(message.MovieId.Value);
var movieData = _movieInfo.GetMovieInfoAsync(movie.TmdbId);
try try
{ {
RefreshMovieInfo(movie); RefreshMovieInfo(movie, movieData);
RescanMovie(movie, isNew, trigger); RescanMovie(movie, isNew, trigger);
} }
catch (MovieNotFoundException) catch (MovieNotFoundException)
@ -200,31 +202,44 @@ namespace NzbDrone.Core.Movies
updatedTMDBMovies = _movieInfo.GetChangedMovies(message.LastStartTime.Value); updatedTMDBMovies = _movieInfo.GetChangedMovies(message.LastStartTime.Value);
} }
foreach (var movie in allMovie) var toRefresh = allMovie
.Where(movie => (updatedTMDBMovies.Count == 0 && _checkIfMovieShouldBeRefreshed.ShouldRefresh(movie)) ||
updatedTMDBMovies.Contains(movie.TmdbId) ||
message.Trigger == CommandTrigger.Manual)
.ToDictionary(x => _movieInfo.GetMovieInfoAsync(x.TmdbId), x => x);
var tasks = toRefresh.Keys.ToList();
var skipped = allMovie.Except(toRefresh.Values);
foreach (var movie in skipped)
{
_logger.Info("Skipping refresh of movie: {0}", movie.Title);
RescanMovie(movie, false, trigger);
}
while (tasks.Count > 0)
{ {
if ((updatedTMDBMovies.Count == 0 && _checkIfMovieShouldBeRefreshed.ShouldRefresh(movie)) || updatedTMDBMovies.Contains(movie.TmdbId) || message.Trigger == CommandTrigger.Manual) var finishedTask = Task.WhenAny(tasks).GetAwaiter().GetResult();
tasks.Remove(finishedTask);
var movie = toRefresh[finishedTask];
try
{ {
try RefreshMovieInfo(movie, finishedTask);
{
RefreshMovieInfo(movie);
}
catch (MovieNotFoundException)
{
_logger.Error("Movie '{0}' (imdbid {1}) was not found, it may have been removed from The Movie Database.", movie.Title, movie.ImdbId);
continue;
}
catch (Exception e)
{
_logger.Error(e, "Couldn't refresh info for {0}", movie);
}
RescanMovie(movie, false, trigger);
} }
else catch (MovieNotFoundException)
{ {
_logger.Info("Skipping refresh of movie: {0}", movie.Title); _logger.Error("Movie '{0}' (imdbid {1}) was not found, it may have been removed from The Movie Database.", movie.Title, movie.ImdbId);
RescanMovie(movie, false, trigger); continue;
} }
catch (Exception e)
{
_logger.Error(e, "Couldn't refresh info for {0}", movie);
}
RescanMovie(movie, false, trigger);
} }
} }
} }

@ -1,5 +1,6 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Threading.Tasks;
using NLog; using NLog;
using NzbDrone.Common.Extensions; using NzbDrone.Common.Extensions;
using NzbDrone.Core.Configuration; using NzbDrone.Core.Configuration;
@ -121,12 +122,17 @@ namespace NzbDrone.Core.NetImport
_logger.Info($"Found {listedMovies.Count()} movies on your auto enabled lists not in your library"); _logger.Info($"Found {listedMovies.Count()} movies on your auto enabled lists not in your library");
} }
var tasks = listedMovies.Select(x => _movieSearch.MapMovieToTmdbMovieAsync(x)).ToList();
var importExclusions = new List<string>(); var importExclusions = new List<string>();
var moviesToAdd = new List<Movie>(); var moviesToAdd = new List<Movie>();
foreach (var movie in listedMovies) while (tasks.Count > 0)
{ {
var mapped = _movieSearch.MapMovieToTmdbMovie(movie); var finishedTask = Task.WhenAny(tasks).GetAwaiter().GetResult();
tasks.Remove(finishedTask);
var mapped = finishedTask.GetAwaiter().GetResult();
if (mapped != null && mapped.TmdbId > 0) if (mapped != null && mapped.TmdbId > 0)
{ {

Loading…
Cancel
Save