2017-01-02 17:05:55 +00:00
using System ;
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;
using NzbDrone.Core.Exceptions ;
using NzbDrone.Core.MediaFiles ;
using NzbDrone.Core.Messaging.Commands ;
using NzbDrone.Core.Messaging.Events ;
using NzbDrone.Core.MetadataSource ;
using NzbDrone.Core.Tv.Commands ;
using NzbDrone.Core.Tv.Events ;
namespace NzbDrone.Core.Tv
{
public class RefreshMovieService : IExecute < RefreshMovieCommand >
{
private readonly IProvideMovieInfo _movieInfo ;
private readonly IMovieService _movieService ;
private readonly IRefreshEpisodeService _refreshEpisodeService ;
private readonly IEventAggregator _eventAggregator ;
private readonly IDiskScanService _diskScanService ;
private readonly ICheckIfMovieShouldBeRefreshed _checkIfMovieShouldBeRefreshed ;
private readonly Logger _logger ;
public RefreshMovieService ( IProvideMovieInfo movieInfo ,
IMovieService movieService ,
IRefreshEpisodeService refreshEpisodeService ,
IEventAggregator eventAggregator ,
IDiskScanService diskScanService ,
ICheckIfMovieShouldBeRefreshed checkIfMovieShouldBeRefreshed ,
Logger logger )
{
_movieInfo = movieInfo ;
_movieService = movieService ;
_refreshEpisodeService = refreshEpisodeService ;
_eventAggregator = eventAggregator ;
_diskScanService = diskScanService ;
_checkIfMovieShouldBeRefreshed = checkIfMovieShouldBeRefreshed ;
_logger = logger ;
}
private void RefreshMovieInfo ( Movie movie )
{
_logger . ProgressInfo ( "Updating Info for {0}" , movie . Title ) ;
Movie movieInfo ;
try
{
2017-03-10 23:17:09 +00:00
movieInfo = _movieInfo . GetMovieInfo ( movie . TmdbId , movie . Profile , movie . HasPreDBEntry ) ;
2017-01-02 17:05:55 +00:00
}
catch ( MovieNotFoundException )
{
_logger . Error ( "Movie '{0}' (imdbid {1}) was not found, it may have been removed from TheTVDB." , movie . Title , movie . ImdbId ) ;
return ;
}
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 ;
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 ;
2017-03-10 23:17:09 +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 ) ;
}
_movieService . UpdateMovie ( movie ) ;
_logger . Debug ( "Finished movie refresh for {0}" , movie . Title ) ;
_eventAggregator . PublishEvent ( new MovieUpdatedEvent ( movie ) ) ;
}
public void Execute ( RefreshMovieCommand message )
{
_eventAggregator . PublishEvent ( new MovieRefreshStartingEvent ( message . Trigger = = CommandTrigger . Manual ) ) ;
if ( message . MovieId . HasValue )
{
var movie = _movieService . GetMovie ( message . MovieId . Value ) ;
2017-02-24 18:52:40 +00:00
RefreshMovieInfo ( movie ) ;
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 ) ;
}
catch ( Exception e )
{
_logger . Error ( e , "Couldn't refresh info for {0}" . Inject ( movie ) ) ;
}
}
else
{
try
{
_logger . Info ( "Skipping refresh of movie: {0}" , movie . Title ) ;
_diskScanService . Scan ( movie ) ;
}
catch ( Exception e )
{
_logger . Error ( e , "Couldn't rescan movie {0}" . Inject ( movie ) ) ;
}
}
}
}
}
}
}