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 { 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 { movieInfo = _movieInfo.GetMovieInfo(movie.TmdbId); } catch (MovieNotFoundException) { _logger.Error("Movie '{0}' (imdbid {1}) was not found, it may have been removed from TheTVDB.", movie.Title, movie.ImdbId); return; } if (movie.TmdbId != movieInfo.TmdbId) { _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; } 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; movie.Website = movieInfo.Website; movie.AlternativeTitles = movieInfo.AlternativeTitles; movie.Year = movieInfo.Year; movie.PhysicalRelease = movieInfo.PhysicalRelease; movie.YouTubeTrailerId = movieInfo.YouTubeTrailerId; 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); RefreshMovieInfo(movie); } 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)); } } } } } } }