mirror of
https://github.com/lidarr/lidarr.git
synced 2025-08-23 06:45:19 -07:00
Fix issue with reimporting on movie fresh (#357)
Fixes #314. Still have multiple movieFiles issue to clean up.
This commit is contained in:
parent
40ca469339
commit
24cbd6bcef
6 changed files with 61 additions and 66 deletions
|
@ -68,22 +68,22 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport
|
||||||
{
|
{
|
||||||
//check if already imported
|
//check if already imported
|
||||||
if (importResults.Select(r => r.ImportDecision.LocalMovie.Movie)
|
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"));
|
importResults.Add(new ImportResult(importDecision, "Movie has already been imported"));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
var episodeFile = new MovieFile();
|
var movieFile = new MovieFile();
|
||||||
episodeFile.DateAdded = DateTime.UtcNow;
|
movieFile.DateAdded = DateTime.UtcNow;
|
||||||
episodeFile.MovieId = localMovie.Movie.Id;
|
movieFile.MovieId = localMovie.Movie.Id;
|
||||||
episodeFile.Path = localMovie.Path.CleanFilePath();
|
movieFile.Path = localMovie.Path.CleanFilePath();
|
||||||
episodeFile.Size = _diskProvider.GetFileSize(localMovie.Path);
|
movieFile.Size = _diskProvider.GetFileSize(localMovie.Path);
|
||||||
episodeFile.Quality = localMovie.Quality;
|
movieFile.Quality = localMovie.Quality;
|
||||||
episodeFile.MediaInfo = localMovie.MediaInfo;
|
movieFile.MediaInfo = localMovie.MediaInfo;
|
||||||
episodeFile.Movie = localMovie.Movie;
|
movieFile.Movie = localMovie.Movie;
|
||||||
episodeFile.ReleaseGroup = localMovie.ParsedMovieInfo.ReleaseGroup;
|
movieFile.ReleaseGroup = localMovie.ParsedMovieInfo.ReleaseGroup;
|
||||||
episodeFile.Edition = localMovie.ParsedMovieInfo.Edition;
|
movieFile.Edition = localMovie.ParsedMovieInfo.Edition;
|
||||||
|
|
||||||
bool copyOnly;
|
bool copyOnly;
|
||||||
switch (importMode)
|
switch (importMode)
|
||||||
|
@ -102,17 +102,17 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport
|
||||||
|
|
||||||
if (newDownload)
|
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;
|
oldFiles = moveResult.OldFiles;
|
||||||
}
|
}
|
||||||
else
|
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));
|
importResults.Add(new ImportResult(importDecision));
|
||||||
|
|
||||||
if (newDownload)
|
if (newDownload)
|
||||||
|
@ -122,22 +122,22 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport
|
||||||
|
|
||||||
if (downloadClientItem != null)
|
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
|
else
|
||||||
{
|
{
|
||||||
_eventAggregator.PublishEvent(new MovieImportedEvent(localMovie, episodeFile, newDownload));
|
_eventAggregator.PublishEvent(new MovieImportedEvent(localMovie, movieFile, newDownload));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (newDownload)
|
if (newDownload)
|
||||||
{
|
{
|
||||||
_eventAggregator.PublishEvent(new MovieDownloadedEvent(localMovie, episodeFile, oldFiles));
|
_eventAggregator.PublishEvent(new MovieDownloadedEvent(localMovie, movieFile, oldFiles));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
_logger.Warn(e, "Couldn't import episode " + localMovie);
|
_logger.Warn(e, "Couldn't import movie " + localMovie);
|
||||||
importResults.Add(new ImportResult(importDecision, "Failed to import episode"));
|
importResults.Add(new ImportResult(importDecision, "Failed to import movie"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -111,11 +111,11 @@ namespace NzbDrone.Core.MediaFiles
|
||||||
|
|
||||||
public List<string> FilterExistingFiles(List<string> files, Movie movie)
|
public List<string> FilterExistingFiles(List<string> 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)
|
public EpisodeFile Get(int id)
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using NLog;
|
using NLog;
|
||||||
|
@ -18,14 +18,17 @@ namespace NzbDrone.Core.MediaFiles
|
||||||
public class MediaFileTableCleanupService : IMediaFileTableCleanupService
|
public class MediaFileTableCleanupService : IMediaFileTableCleanupService
|
||||||
{
|
{
|
||||||
private readonly IMediaFileService _mediaFileService;
|
private readonly IMediaFileService _mediaFileService;
|
||||||
|
private readonly IMovieService _movieService;
|
||||||
private readonly IEpisodeService _episodeService;
|
private readonly IEpisodeService _episodeService;
|
||||||
private readonly Logger _logger;
|
private readonly Logger _logger;
|
||||||
|
|
||||||
public MediaFileTableCleanupService(IMediaFileService mediaFileService,
|
public MediaFileTableCleanupService(IMediaFileService mediaFileService,
|
||||||
|
IMovieService movieService,
|
||||||
IEpisodeService episodeService,
|
IEpisodeService episodeService,
|
||||||
Logger logger)
|
Logger logger)
|
||||||
{
|
{
|
||||||
_mediaFileService = mediaFileService;
|
_mediaFileService = mediaFileService;
|
||||||
|
_movieService = movieService;
|
||||||
_episodeService = episodeService;
|
_episodeService = episodeService;
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
}
|
}
|
||||||
|
@ -89,61 +92,39 @@ namespace NzbDrone.Core.MediaFiles
|
||||||
|
|
||||||
public void Clean(Movie movie, List<string> filesOnDisk)
|
public void Clean(Movie movie, List<string> filesOnDisk)
|
||||||
{
|
{
|
||||||
|
var movieFiles = _mediaFileService.GetFilesByMovie(movie.Id);
|
||||||
//TODO: Update implementation for movies.
|
|
||||||
var seriesFiles = _mediaFileService.GetFilesBySeries(movie.Id);
|
|
||||||
var episodes = _episodeService.GetEpisodeBySeries(movie.Id);
|
|
||||||
|
|
||||||
var filesOnDiskKeys = new HashSet<string>(filesOnDisk, PathEqualityComparer.Instance);
|
var filesOnDiskKeys = new HashSet<string>(filesOnDisk, PathEqualityComparer.Instance);
|
||||||
|
|
||||||
foreach (var seriesFile in seriesFiles)
|
foreach(var movieFile in movieFiles)
|
||||||
{
|
{
|
||||||
var episodeFile = seriesFile;
|
var movieFilePath = Path.Combine(movie.Path, movieFile.RelativePath);
|
||||||
var episodeFilePath = Path.Combine(movie.Path, episodeFile.RelativePath);
|
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (!filesOnDiskKeys.Contains(episodeFilePath))
|
if (!filesOnDiskKeys.Contains(movieFilePath))
|
||||||
{
|
{
|
||||||
_logger.Debug("File [{0}] no longer exists on disk, removing from db", episodeFilePath);
|
_logger.Debug("File [{0}] no longer exists on disk, removing from db", movieFilePath);
|
||||||
_mediaFileService.Delete(seriesFile, DeleteMediaFileReason.MissingFromDisk);
|
_mediaFileService.Delete(movieFile, DeleteMediaFileReason.MissingFromDisk);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (episodes.None(e => e.EpisodeFileId == episodeFile.Id))
|
//var localMovie = _parsingService.GetLocalMovie(movieFile.Path, movie);
|
||||||
{
|
|
||||||
_logger.Debug("File [{0}] is not assigned to any episodes, removing from db", episodeFilePath);
|
|
||||||
_mediaFileService.Delete(episodeFile, DeleteMediaFileReason.NoLinkedEpisodes);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// var localEpsiode = _parsingService.GetLocalEpisode(episodeFile.Path, series);
|
//if (localMovie == null)
|
||||||
//
|
//{
|
||||||
// if (localEpsiode == null || episodes.Count != localEpsiode.Episodes.Count)
|
// _logger.Debug("File [{0}] parsed episodes has changed, removing from db", localMovie.Path);
|
||||||
// {
|
// _mediaFileService.Delete(localMovie);
|
||||||
// _logger.Debug("File [{0}] parsed episodes has changed, removing from db", episodeFile.Path);
|
// continue;
|
||||||
// _mediaFileService.Delete(episodeFile);
|
//}
|
||||||
// continue;
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
catch (Exception ex)
|
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);
|
_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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,4 +1,4 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
@ -107,7 +107,7 @@ namespace NzbDrone.Core.MediaFiles
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* var movies = _movieService.MoviesWithFiles(message.Series.Id);
|
var movies = _movieService.MoviesWithFiles(message.Movie.Id);
|
||||||
|
|
||||||
var movieFiles = new List<MovieFile>();
|
var movieFiles = new List<MovieFile>();
|
||||||
var updated = new List<MovieFile>();
|
var updated = new List<MovieFile>();
|
||||||
|
@ -119,7 +119,7 @@ namespace NzbDrone.Core.MediaFiles
|
||||||
|
|
||||||
movieFiles.Add(movieFile);
|
movieFiles.Add(movieFile);
|
||||||
|
|
||||||
if (ChangeFileDate(movieFile, message.Series, moviesInFile))
|
if (ChangeFileDate(movieFile, message.Movie))
|
||||||
{
|
{
|
||||||
updated.Add(movieFile);
|
updated.Add(movieFile);
|
||||||
}
|
}
|
||||||
|
@ -127,13 +127,13 @@ namespace NzbDrone.Core.MediaFiles
|
||||||
|
|
||||||
if (updated.Any())
|
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
|
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)
|
private bool ChangeFileDateToLocalAirDate(string filePath, string fileDate, string fileTime)
|
||||||
|
|
|
@ -5,6 +5,7 @@ using NzbDrone.Core.Datastore;
|
||||||
using NzbDrone.Core.Messaging.Events;
|
using NzbDrone.Core.Messaging.Events;
|
||||||
using NzbDrone.Core.Datastore.Extensions;
|
using NzbDrone.Core.Datastore.Extensions;
|
||||||
using Marr.Data.QGen;
|
using Marr.Data.QGen;
|
||||||
|
using NzbDrone.Core.MediaFiles;
|
||||||
|
|
||||||
namespace NzbDrone.Core.Tv
|
namespace NzbDrone.Core.Tv
|
||||||
{
|
{
|
||||||
|
@ -16,6 +17,7 @@ namespace NzbDrone.Core.Tv
|
||||||
Movie FindByImdbId(string imdbid);
|
Movie FindByImdbId(string imdbid);
|
||||||
Movie FindByTitleSlug(string slug);
|
Movie FindByTitleSlug(string slug);
|
||||||
List<Movie> MoviesBetweenDates(DateTime start, DateTime end, bool includeUnmonitored);
|
List<Movie> MoviesBetweenDates(DateTime start, DateTime end, bool includeUnmonitored);
|
||||||
|
List<Movie> MoviesWithFiles(int movieId);
|
||||||
PagingSpec<Movie> MoviesWithoutFiles(PagingSpec<Movie> pagingSpec);
|
PagingSpec<Movie> MoviesWithoutFiles(PagingSpec<Movie> pagingSpec);
|
||||||
List<Movie> GetMoviesByFileId(int fileId);
|
List<Movie> GetMoviesByFileId(int fileId);
|
||||||
void SetFileId(int fileId, int movieId);
|
void SetFileId(int fileId, int movieId);
|
||||||
|
@ -135,6 +137,12 @@ namespace NzbDrone.Core.Tv
|
||||||
return query.ToList();
|
return query.ToList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<Movie> MoviesWithFiles(int movieId)
|
||||||
|
{
|
||||||
|
return Query.Join<Movie, MovieFile>(JoinType.Inner, m => m.MovieFile, (m, mf) => m.MovieFileId == mf.Id)
|
||||||
|
.Where(m => m.Id == movieId);
|
||||||
|
}
|
||||||
|
|
||||||
public PagingSpec<Movie> MoviesWithoutFiles(PagingSpec<Movie> pagingSpec)
|
public PagingSpec<Movie> MoviesWithoutFiles(PagingSpec<Movie> pagingSpec)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
|
@ -35,6 +35,7 @@ namespace NzbDrone.Core.Tv
|
||||||
List<Movie> UpdateMovie(List<Movie> movie);
|
List<Movie> UpdateMovie(List<Movie> movie);
|
||||||
bool MoviePathExists(string folder);
|
bool MoviePathExists(string folder);
|
||||||
void RemoveAddOptions(Movie movie);
|
void RemoveAddOptions(Movie movie);
|
||||||
|
List<Movie> MoviesWithFiles(int movieId);
|
||||||
}
|
}
|
||||||
|
|
||||||
public class MovieService : IMovieService, IHandle<MovieFileAddedEvent>,
|
public class MovieService : IMovieService, IHandle<MovieFileAddedEvent>,
|
||||||
|
@ -235,6 +236,11 @@ namespace NzbDrone.Core.Tv
|
||||||
return episodes;
|
return episodes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<Movie> MoviesWithFiles(int movieId)
|
||||||
|
{
|
||||||
|
return _movieRepository.MoviesWithFiles(movieId);
|
||||||
|
}
|
||||||
|
|
||||||
public PagingSpec<Movie> MoviesWithoutFiles(PagingSpec<Movie> pagingSpec)
|
public PagingSpec<Movie> MoviesWithoutFiles(PagingSpec<Movie> pagingSpec)
|
||||||
{
|
{
|
||||||
var movieResult = _movieRepository.MoviesWithoutFiles(pagingSpec);
|
var movieResult = _movieRepository.MoviesWithoutFiles(pagingSpec);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue