2018-02-15 12:39:01 +00:00
using System ;
2017-01-02 17:05:55 +00:00
using System.Collections.Generic ;
using System.IO ;
using System.Linq ;
using NLog ;
using NzbDrone.Common.Extensions ;
using NzbDrone.Common.Instrumentation.Extensions ;
//using NzbDrone.Core.DataAugmentation.DailyMovie;
2018-11-23 07:03:32 +00:00
using NzbDrone.Core.Configuration ;
2017-01-02 17:05:55 +00:00
using NzbDrone.Core.Exceptions ;
using NzbDrone.Core.MediaFiles ;
using NzbDrone.Core.Messaging.Commands ;
using NzbDrone.Core.Messaging.Events ;
using NzbDrone.Core.MetadataSource ;
2017-04-26 11:31:55 +00:00
using NzbDrone.Core.MediaFiles.Commands ;
2017-08-09 20:14:01 +00:00
using NzbDrone.Core.MetadataSource.RadarrAPI ;
using NzbDrone.Core.Movies.AlternativeTitles ;
2018-03-14 20:41:36 +00:00
using NzbDrone.Core.Movies.Commands ;
using NzbDrone.Core.Movies.Events ;
2017-01-02 17:05:55 +00:00
2018-03-14 20:41:36 +00:00
namespace NzbDrone.Core.Movies
2017-01-02 17:05:55 +00:00
{
public class RefreshMovieService : IExecute < RefreshMovieCommand >
{
private readonly IProvideMovieInfo _movieInfo ;
private readonly IMovieService _movieService ;
2017-08-09 20:14:01 +00:00
private readonly IAlternativeTitleService _titleService ;
2017-01-02 17:05:55 +00:00
private readonly IEventAggregator _eventAggregator ;
2018-02-15 12:39:01 +00:00
private readonly IManageCommandQueue _commandQueueManager ;
2017-01-02 17:05:55 +00:00
private readonly IDiskScanService _diskScanService ;
private readonly ICheckIfMovieShouldBeRefreshed _checkIfMovieShouldBeRefreshed ;
2018-11-23 07:03:32 +00:00
private readonly IConfigService _configService ;
2017-08-09 20:14:01 +00:00
private readonly IRadarrAPIClient _apiClient ;
2018-02-15 12:39:01 +00:00
2017-01-02 17:05:55 +00:00
private readonly Logger _logger ;
public RefreshMovieService ( IProvideMovieInfo movieInfo ,
IMovieService movieService ,
2017-08-09 20:14:01 +00:00
IAlternativeTitleService titleService ,
2017-01-02 17:05:55 +00:00
IEventAggregator eventAggregator ,
IDiskScanService diskScanService ,
2017-08-09 20:14:01 +00:00
IRadarrAPIClient apiClient ,
2017-01-02 17:05:55 +00:00
ICheckIfMovieShouldBeRefreshed checkIfMovieShouldBeRefreshed ,
2018-02-15 12:39:01 +00:00
IManageCommandQueue commandQueue ,
2018-11-23 07:03:32 +00:00
IConfigService configService ,
2017-01-02 17:05:55 +00:00
Logger logger )
{
_movieInfo = movieInfo ;
_movieService = movieService ;
2017-08-09 20:14:01 +00:00
_titleService = titleService ;
2017-01-02 17:05:55 +00:00
_eventAggregator = eventAggregator ;
2017-08-09 20:14:01 +00:00
_apiClient = apiClient ;
2018-02-15 12:39:01 +00:00
_commandQueueManager = commandQueue ;
2017-01-02 17:05:55 +00:00
_diskScanService = diskScanService ;
_checkIfMovieShouldBeRefreshed = checkIfMovieShouldBeRefreshed ;
2018-11-23 07:03:32 +00:00
_configService = configService ;
2017-01-02 17:05:55 +00:00
_logger = logger ;
}
private void RefreshMovieInfo ( Movie movie )
{
_logger . ProgressInfo ( "Updating Info for {0}" , movie . Title ) ;
Movie movieInfo ;
2018-02-15 12:39:01 +00:00
2018-11-23 07:03:32 +00:00
movieInfo = _movieInfo . GetMovieInfo ( movie . TmdbId , movie . Profile , movie . HasPreDBEntry ) ;
2017-01-02 17:05:55 +00:00
2017-01-04 19:27:14 +00:00
if ( movie . TmdbId ! = movieInfo . TmdbId )
2017-01-02 17:05:55 +00:00
{
2017-01-04 19:27:14 +00:00
_logger . Warn ( "Movie '{0}' (tvdbid {1}) was replaced with '{2}' (tvdbid {3}), because the original was a duplicate." , movie . Title , movie . TmdbId , movieInfo . Title , movieInfo . TmdbId ) ;
movie . TmdbId = movieInfo . TmdbId ;
2017-01-02 17:05:55 +00:00
}
movie . Title = movieInfo . Title ;
movie . TitleSlug = movieInfo . TitleSlug ;
movie . ImdbId = movieInfo . ImdbId ;
movie . Overview = movieInfo . Overview ;
movie . Status = movieInfo . Status ;
movie . CleanTitle = movieInfo . CleanTitle ;
movie . SortTitle = movieInfo . SortTitle ;
movie . LastInfoSync = DateTime . UtcNow ;
movie . Runtime = movieInfo . Runtime ;
movie . Images = movieInfo . Images ;
movie . Ratings = movieInfo . Ratings ;
movie . Actors = movieInfo . Actors ;
movie . Genres = movieInfo . Genres ;
movie . Certification = movieInfo . Certification ;
movie . InCinemas = movieInfo . InCinemas ;
2017-01-04 19:27:14 +00:00
movie . Website = movieInfo . Website ;
2017-08-09 20:14:01 +00:00
//movie.AlternativeTitles = movieInfo.AlternativeTitles;
2017-01-02 17:05:55 +00:00
movie . Year = movieInfo . Year ;
2017-01-08 15:36:22 +00:00
movie . PhysicalRelease = movieInfo . PhysicalRelease ;
2017-01-15 20:17:24 +00:00
movie . YouTubeTrailerId = movieInfo . YouTubeTrailerId ;
2017-01-16 18:57:43 +00:00
movie . Studio = movieInfo . Studio ;
2018-02-15 12:39:01 +00:00
movie . HasPreDBEntry = movieInfo . HasPreDBEntry ;
2017-01-02 17:05:55 +00:00
try
{
movie . Path = new DirectoryInfo ( movie . Path ) . FullName ;
movie . Path = movie . Path . GetActualCasing ( ) ;
}
catch ( Exception e )
{
_logger . Warn ( e , "Couldn't update movie path for " + movie . Path ) ;
}
2017-08-09 20:14:01 +00:00
movieInfo . AlternativeTitles = movieInfo . AlternativeTitles . Where ( t = > t . CleanTitle ! = movie . CleanTitle )
. DistinctBy ( t = > t . CleanTitle )
. ExceptBy ( t = > t . CleanTitle , movie . AlternativeTitles , t = > t . CleanTitle , EqualityComparer < string > . Default ) . ToList ( ) ;
try
{
2018-02-19 12:02:55 +00:00
movie . AlternativeTitles . AddRange ( _titleService . AddAltTitles ( movieInfo . AlternativeTitles , movie ) ) ;
2017-08-09 20:14:01 +00:00
var mappings = _apiClient . AlternativeTitlesAndYearForMovie ( movieInfo . TmdbId ) ;
var mappingsTitles = mappings . Item1 ;
2017-09-10 13:58:31 +00:00
_titleService . DeleteNotEnoughVotes ( mappingsTitles ) ;
2017-08-09 20:14:01 +00:00
mappingsTitles = mappingsTitles . ExceptBy ( t = > t . CleanTitle , movie . AlternativeTitles ,
t = > t . CleanTitle , EqualityComparer < string > . Default ) . ToList ( ) ;
2018-02-15 12:39:01 +00:00
2017-09-10 13:58:31 +00:00
mappingsTitles = mappingsTitles . Where ( t = > t . Votes > 3 ) . ToList ( ) ;
2017-08-09 20:14:01 +00:00
movie . AlternativeTitles . AddRange ( _titleService . AddAltTitles ( mappingsTitles , movie ) ) ;
if ( mappings . Item2 ! = null )
{
movie . SecondaryYear = mappings . Item2 . Year ;
movie . SecondaryYearSourceId = mappings . Item2 . SourceId ;
}
2017-09-10 13:58:31 +00:00
else
{
movie . SecondaryYear = null ;
movie . SecondaryYearSourceId = 0 ;
}
2017-08-09 20:14:01 +00:00
}
catch ( RadarrAPIException ex )
{
//Not that wild, could just be a 404.
}
2017-09-10 13:58:31 +00:00
catch ( Exception ex )
{
_logger . Info ( ex , "Unable to communicate with Mappings Server." ) ;
}
2018-02-15 12:39:01 +00:00
2017-08-09 20:14:01 +00:00
2017-01-02 17:05:55 +00:00
_movieService . UpdateMovie ( movie ) ;
2017-08-09 20:14:01 +00:00
try
{
var newTitles = movieInfo . AlternativeTitles . Except ( movie . AlternativeTitles ) ;
//_titleService.AddAltTitles(newTitles.ToList(), movie);
}
catch ( Exception e )
{
_logger . Debug ( e , "Failed adding alternative titles." ) ;
throw ;
}
2017-01-02 17:05:55 +00:00
_logger . Debug ( "Finished movie refresh for {0}" , movie . Title ) ;
_eventAggregator . PublishEvent ( new MovieUpdatedEvent ( movie ) ) ;
}
2018-11-23 07:03:32 +00:00
private void RescanMovie ( Movie movie , bool isNew , CommandTrigger trigger )
{
var rescanAfterRefresh = _configService . RescanAfterRefresh ;
var shouldRescan = true ;
if ( isNew )
{
_logger . Trace ( "Forcing refresh of {0}. Reason: New movie" , movie ) ;
shouldRescan = true ;
}
else if ( rescanAfterRefresh = = RescanAfterRefreshType . Never )
{
_logger . Trace ( "Skipping refresh of {0}. Reason: never recan after refresh" , movie ) ;
shouldRescan = false ;
}
else if ( rescanAfterRefresh = = RescanAfterRefreshType . AfterManual & & trigger ! = CommandTrigger . Manual )
{
_logger . Trace ( "Skipping refresh of {0}. Reason: not after automatic scans" , movie ) ;
shouldRescan = false ;
}
if ( ! shouldRescan )
{
return ;
}
try
{
_diskScanService . Scan ( movie ) ;
}
catch ( Exception e )
{
_logger . Error ( e , "Couldn't rescan movie {0}" , movie ) ;
}
}
2017-01-02 17:05:55 +00:00
public void Execute ( RefreshMovieCommand message )
{
2018-11-23 07:03:32 +00:00
var trigger = message . Trigger ;
var isNew = message . IsNewMovie ;
2017-01-02 17:05:55 +00:00
_eventAggregator . PublishEvent ( new MovieRefreshStartingEvent ( message . Trigger = = CommandTrigger . Manual ) ) ;
if ( message . MovieId . HasValue )
{
var movie = _movieService . GetMovie ( message . MovieId . Value ) ;
2018-11-23 07:03:32 +00:00
try
{
RefreshMovieInfo ( movie ) ;
RescanMovie ( movie , isNew , trigger ) ;
}
catch ( MovieNotFoundException )
{
_logger . Error ( "Movie '{0}' (imdbid {1}) was not found, it may have been removed from TheTVDB." , movie . Title , movie . ImdbId ) ;
}
catch ( Exception e )
{
_logger . Error ( e , "Couldn't refresh info for {0}" , movie ) ;
RescanMovie ( movie , isNew , trigger ) ;
throw ;
}
2017-01-02 17:05:55 +00:00
}
else
{
var allMovie = _movieService . GetAllMovies ( ) . OrderBy ( c = > c . SortTitle ) . ToList ( ) ;
foreach ( var movie in allMovie )
{
if ( message . Trigger = = CommandTrigger . Manual | | _checkIfMovieShouldBeRefreshed . ShouldRefresh ( movie ) )
{
try
{
RefreshMovieInfo ( movie ) ;
}
2018-11-23 07:03:32 +00:00
catch ( MovieNotFoundException )
{
_logger . Error ( "Movie '{0}' (imdbid {1}) was not found, it may have been removed from TheTVDB." , movie . Title , movie . ImdbId ) ;
continue ;
}
2017-01-02 17:05:55 +00:00
catch ( Exception e )
{
2018-11-23 07:03:32 +00:00
_logger . Error ( e , "Couldn't refresh info for {0}" , movie ) ;
2017-01-02 17:05:55 +00:00
}
2018-11-23 07:03:32 +00:00
RescanMovie ( movie , false , trigger ) ;
2017-01-02 17:05:55 +00:00
}
else
{
2018-11-23 07:03:32 +00:00
_logger . Info ( "Skipping refresh of movie: {0}" , movie . Title ) ;
RescanMovie ( movie , false , trigger ) ;
2017-01-02 17:05:55 +00:00
}
}
}
}
}
}