From 24cbd6bcef76db891439ab8f620c716170196d5a Mon Sep 17 00:00:00 2001 From: Tim Turner Date: Thu, 19 Jan 2017 19:58:57 -0500 Subject: [PATCH] Fix issue with reimporting on movie fresh (#357) Fixes #314. Still have multiple movieFiles issue to clean up. --- .../EpisodeImport/ImportApprovedMovie.cs | 40 +++++++------- .../MediaFiles/MediaFileService.cs | 6 +- .../MediaFileTableCleanupService.cs | 55 ++++++------------- .../MediaFiles/UpdateMovieFileService.cs | 12 ++-- src/NzbDrone.Core/Tv/MovieRepository.cs | 8 +++ src/NzbDrone.Core/Tv/MovieService.cs | 6 ++ 6 files changed, 61 insertions(+), 66 deletions(-) diff --git a/src/NzbDrone.Core/MediaFiles/EpisodeImport/ImportApprovedMovie.cs b/src/NzbDrone.Core/MediaFiles/EpisodeImport/ImportApprovedMovie.cs index 1a2c812d6..83d10c448 100644 --- a/src/NzbDrone.Core/MediaFiles/EpisodeImport/ImportApprovedMovie.cs +++ b/src/NzbDrone.Core/MediaFiles/EpisodeImport/ImportApprovedMovie.cs @@ -68,22 +68,22 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport { //check if already imported if (importResults.Select(r => r.ImportDecision.LocalMovie.Movie) - .Select(e => e.Id).Contains(localMovie.Movie.Id)) + .Select(m => m.Id).Contains(localMovie.Movie.Id)) { importResults.Add(new ImportResult(importDecision, "Movie has already been imported")); continue; } - var episodeFile = new MovieFile(); - episodeFile.DateAdded = DateTime.UtcNow; - episodeFile.MovieId = localMovie.Movie.Id; - episodeFile.Path = localMovie.Path.CleanFilePath(); - episodeFile.Size = _diskProvider.GetFileSize(localMovie.Path); - episodeFile.Quality = localMovie.Quality; - episodeFile.MediaInfo = localMovie.MediaInfo; - episodeFile.Movie = localMovie.Movie; - episodeFile.ReleaseGroup = localMovie.ParsedMovieInfo.ReleaseGroup; - episodeFile.Edition = localMovie.ParsedMovieInfo.Edition; + var movieFile = new MovieFile(); + movieFile.DateAdded = DateTime.UtcNow; + movieFile.MovieId = localMovie.Movie.Id; + movieFile.Path = localMovie.Path.CleanFilePath(); + movieFile.Size = _diskProvider.GetFileSize(localMovie.Path); + movieFile.Quality = localMovie.Quality; + movieFile.MediaInfo = localMovie.MediaInfo; + movieFile.Movie = localMovie.Movie; + movieFile.ReleaseGroup = localMovie.ParsedMovieInfo.ReleaseGroup; + movieFile.Edition = localMovie.ParsedMovieInfo.Edition; bool copyOnly; switch (importMode) @@ -102,17 +102,17 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport if (newDownload) { - episodeFile.SceneName = GetSceneName(downloadClientItem, localMovie); + movieFile.SceneName = GetSceneName(downloadClientItem, localMovie); - var moveResult = _episodeFileUpgrader.UpgradeMovieFile(episodeFile, localMovie, copyOnly); + var moveResult = _episodeFileUpgrader.UpgradeMovieFile(movieFile, localMovie, copyOnly); //TODO: Check if this works oldFiles = moveResult.OldFiles; } else { - episodeFile.RelativePath = localMovie.Movie.Path.GetRelativePath(episodeFile.Path); + movieFile.RelativePath = localMovie.Movie.Path.GetRelativePath(movieFile.Path); } - _mediaFileService.Add(episodeFile); + _mediaFileService.Add(movieFile); importResults.Add(new ImportResult(importDecision)); if (newDownload) @@ -122,22 +122,22 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport if (downloadClientItem != null) { - _eventAggregator.PublishEvent(new MovieImportedEvent(localMovie, episodeFile, newDownload, downloadClientItem.DownloadClient, downloadClientItem.DownloadId, downloadClientItem.IsReadOnly)); + _eventAggregator.PublishEvent(new MovieImportedEvent(localMovie, movieFile, newDownload, downloadClientItem.DownloadClient, downloadClientItem.DownloadId, downloadClientItem.IsReadOnly)); } else { - _eventAggregator.PublishEvent(new MovieImportedEvent(localMovie, episodeFile, newDownload)); + _eventAggregator.PublishEvent(new MovieImportedEvent(localMovie, movieFile, newDownload)); } if (newDownload) { - _eventAggregator.PublishEvent(new MovieDownloadedEvent(localMovie, episodeFile, oldFiles)); + _eventAggregator.PublishEvent(new MovieDownloadedEvent(localMovie, movieFile, oldFiles)); } } catch (Exception e) { - _logger.Warn(e, "Couldn't import episode " + localMovie); - importResults.Add(new ImportResult(importDecision, "Failed to import episode")); + _logger.Warn(e, "Couldn't import movie " + localMovie); + importResults.Add(new ImportResult(importDecision, "Failed to import movie")); } } diff --git a/src/NzbDrone.Core/MediaFiles/MediaFileService.cs b/src/NzbDrone.Core/MediaFiles/MediaFileService.cs index 37e663ee5..4f6a9389b 100644 --- a/src/NzbDrone.Core/MediaFiles/MediaFileService.cs +++ b/src/NzbDrone.Core/MediaFiles/MediaFileService.cs @@ -111,11 +111,11 @@ namespace NzbDrone.Core.MediaFiles public List FilterExistingFiles(List files, Movie movie) { - var seriesFiles = GetFilesBySeries(movie.Id).Select(f => Path.Combine(movie.Path, f.RelativePath)).ToList(); + var movieFiles = GetFilesByMovie(movie.Id).Select(f => Path.Combine(movie.Path, f.RelativePath)).ToList(); - if (!seriesFiles.Any()) return files; + if (!movieFiles.Any()) return files; - return files.Except(seriesFiles, PathEqualityComparer.Instance).ToList(); + return files.Except(movieFiles, PathEqualityComparer.Instance).ToList(); } public EpisodeFile Get(int id) diff --git a/src/NzbDrone.Core/MediaFiles/MediaFileTableCleanupService.cs b/src/NzbDrone.Core/MediaFiles/MediaFileTableCleanupService.cs index 49eb11ca9..3c57b3feb 100644 --- a/src/NzbDrone.Core/MediaFiles/MediaFileTableCleanupService.cs +++ b/src/NzbDrone.Core/MediaFiles/MediaFileTableCleanupService.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.IO; using NLog; @@ -18,14 +18,17 @@ namespace NzbDrone.Core.MediaFiles public class MediaFileTableCleanupService : IMediaFileTableCleanupService { private readonly IMediaFileService _mediaFileService; + private readonly IMovieService _movieService; private readonly IEpisodeService _episodeService; private readonly Logger _logger; public MediaFileTableCleanupService(IMediaFileService mediaFileService, + IMovieService movieService, IEpisodeService episodeService, Logger logger) { _mediaFileService = mediaFileService; + _movieService = movieService; _episodeService = episodeService; _logger = logger; } @@ -89,61 +92,39 @@ namespace NzbDrone.Core.MediaFiles public void Clean(Movie movie, List filesOnDisk) { - - //TODO: Update implementation for movies. - var seriesFiles = _mediaFileService.GetFilesBySeries(movie.Id); - var episodes = _episodeService.GetEpisodeBySeries(movie.Id); + var movieFiles = _mediaFileService.GetFilesByMovie(movie.Id); var filesOnDiskKeys = new HashSet(filesOnDisk, PathEqualityComparer.Instance); - foreach (var seriesFile in seriesFiles) + foreach(var movieFile in movieFiles) { - var episodeFile = seriesFile; - var episodeFilePath = Path.Combine(movie.Path, episodeFile.RelativePath); + var movieFilePath = Path.Combine(movie.Path, movieFile.RelativePath); try { - if (!filesOnDiskKeys.Contains(episodeFilePath)) + if (!filesOnDiskKeys.Contains(movieFilePath)) { - _logger.Debug("File [{0}] no longer exists on disk, removing from db", episodeFilePath); - _mediaFileService.Delete(seriesFile, DeleteMediaFileReason.MissingFromDisk); + _logger.Debug("File [{0}] no longer exists on disk, removing from db", movieFilePath); + _mediaFileService.Delete(movieFile, DeleteMediaFileReason.MissingFromDisk); continue; } - if (episodes.None(e => e.EpisodeFileId == episodeFile.Id)) - { - _logger.Debug("File [{0}] is not assigned to any episodes, removing from db", episodeFilePath); - _mediaFileService.Delete(episodeFile, DeleteMediaFileReason.NoLinkedEpisodes); - continue; - } + //var localMovie = _parsingService.GetLocalMovie(movieFile.Path, movie); - // var localEpsiode = _parsingService.GetLocalEpisode(episodeFile.Path, series); - // - // if (localEpsiode == null || episodes.Count != localEpsiode.Episodes.Count) - // { - // _logger.Debug("File [{0}] parsed episodes has changed, removing from db", episodeFile.Path); - // _mediaFileService.Delete(episodeFile); - // continue; - // } + //if (localMovie == null) + //{ + // _logger.Debug("File [{0}] parsed episodes has changed, removing from db", localMovie.Path); + // _mediaFileService.Delete(localMovie); + // continue; + //} } catch (Exception ex) { - var errorMessage = string.Format("Unable to cleanup EpisodeFile in DB: {0}", episodeFile.Id); + var errorMessage = string.Format("Unable to cleanup MovieFile in DB: {0}", movieFile.Id); _logger.Error(ex, errorMessage); } } - - foreach (var e in episodes) - { - var episode = e; - - if (episode.EpisodeFileId > 0 && seriesFiles.None(f => f.Id == episode.EpisodeFileId)) - { - episode.EpisodeFileId = 0; - _episodeService.UpdateEpisode(episode); - } - } } } } \ No newline at end of file diff --git a/src/NzbDrone.Core/MediaFiles/UpdateMovieFileService.cs b/src/NzbDrone.Core/MediaFiles/UpdateMovieFileService.cs index 6d6fdbbd8..f282ecd3c 100644 --- a/src/NzbDrone.Core/MediaFiles/UpdateMovieFileService.cs +++ b/src/NzbDrone.Core/MediaFiles/UpdateMovieFileService.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.IO; using System.Linq; @@ -107,7 +107,7 @@ namespace NzbDrone.Core.MediaFiles return; } - /* var movies = _movieService.MoviesWithFiles(message.Series.Id); + var movies = _movieService.MoviesWithFiles(message.Movie.Id); var movieFiles = new List(); var updated = new List(); @@ -119,7 +119,7 @@ namespace NzbDrone.Core.MediaFiles movieFiles.Add(movieFile); - if (ChangeFileDate(movieFile, message.Series, moviesInFile)) + if (ChangeFileDate(movieFile, message.Movie)) { updated.Add(movieFile); } @@ -127,13 +127,13 @@ namespace NzbDrone.Core.MediaFiles if (updated.Any()) { - _logger.ProgressDebug("Changed file date for {0} files of {1} in {2}", updated.Count, movieFiles.Count, message.Series.Title); + _logger.ProgressDebug("Changed file date for {0} files of {1} in {2}", updated.Count, movieFiles.Count, message.Movie.Title); } else { - _logger.ProgressDebug("No file dates changed for {0}", message.Series.Title); - }*/ + _logger.ProgressDebug("No file dates changed for {0}", message.Movie.Title); + } } private bool ChangeFileDateToLocalAirDate(string filePath, string fileDate, string fileTime) diff --git a/src/NzbDrone.Core/Tv/MovieRepository.cs b/src/NzbDrone.Core/Tv/MovieRepository.cs index b51a417d8..d0c86f7aa 100644 --- a/src/NzbDrone.Core/Tv/MovieRepository.cs +++ b/src/NzbDrone.Core/Tv/MovieRepository.cs @@ -5,6 +5,7 @@ using NzbDrone.Core.Datastore; using NzbDrone.Core.Messaging.Events; using NzbDrone.Core.Datastore.Extensions; using Marr.Data.QGen; +using NzbDrone.Core.MediaFiles; namespace NzbDrone.Core.Tv { @@ -16,6 +17,7 @@ namespace NzbDrone.Core.Tv Movie FindByImdbId(string imdbid); Movie FindByTitleSlug(string slug); List MoviesBetweenDates(DateTime start, DateTime end, bool includeUnmonitored); + List MoviesWithFiles(int movieId); PagingSpec MoviesWithoutFiles(PagingSpec pagingSpec); List GetMoviesByFileId(int fileId); void SetFileId(int fileId, int movieId); @@ -135,6 +137,12 @@ namespace NzbDrone.Core.Tv return query.ToList(); } + public List MoviesWithFiles(int movieId) + { + return Query.Join(JoinType.Inner, m => m.MovieFile, (m, mf) => m.MovieFileId == mf.Id) + .Where(m => m.Id == movieId); + } + public PagingSpec MoviesWithoutFiles(PagingSpec pagingSpec) { diff --git a/src/NzbDrone.Core/Tv/MovieService.cs b/src/NzbDrone.Core/Tv/MovieService.cs index 683182f36..24e1d19dd 100644 --- a/src/NzbDrone.Core/Tv/MovieService.cs +++ b/src/NzbDrone.Core/Tv/MovieService.cs @@ -35,6 +35,7 @@ namespace NzbDrone.Core.Tv List UpdateMovie(List movie); bool MoviePathExists(string folder); void RemoveAddOptions(Movie movie); + List MoviesWithFiles(int movieId); } public class MovieService : IMovieService, IHandle, @@ -235,6 +236,11 @@ namespace NzbDrone.Core.Tv return episodes; } + public List MoviesWithFiles(int movieId) + { + return _movieRepository.MoviesWithFiles(movieId); + } + public PagingSpec MoviesWithoutFiles(PagingSpec pagingSpec) { var movieResult = _movieRepository.MoviesWithoutFiles(pagingSpec);