diff --git a/src/NzbDrone.Core/Parser/ParsingService.cs b/src/NzbDrone.Core/Parser/ParsingService.cs index 7ad4d8afd..205f1bfe8 100644 --- a/src/NzbDrone.Core/Parser/ParsingService.cs +++ b/src/NzbDrone.Core/Parser/ParsingService.cs @@ -355,14 +355,11 @@ namespace NzbDrone.Core.Parser private Movie GetMovie(ParsedMovieInfo parsedEpisodeInfo, string imdbId, SearchCriteriaBase searchCriteria) { + Movie possibleMovie = null; if (searchCriteria != null) { var possibleTitles = new List(); - - Movie possibleMovie = null; - possibleTitles.Add(searchCriteria.Movie.CleanTitle); - foreach (string altTitle in searchCriteria.Movie.AlternativeTitles) { possibleTitles.Add(altTitle.CleanSeriesTitle()); @@ -392,49 +389,50 @@ namespace NzbDrone.Core.Parser } } - if (possibleMovie != null && (parsedEpisodeInfo.Year < 1800 || possibleMovie.Year == parsedEpisodeInfo.Year)) - { - return possibleMovie; - } - - + if (possibleMovie != null && (parsedEpisodeInfo.Year < 1800 || possibleMovie.Year == parsedEpisodeInfo.Year)) + { + return possibleMovie; + } } - - Movie movie = null; - - if (searchCriteria == null) + else { + // search by title and year if (parsedEpisodeInfo.Year > 1900) { - movie = _movieService.FindByTitle(parsedEpisodeInfo.MovieTitle, parsedEpisodeInfo.Year); - + possibleMovie = _movieService.FindByTitle(parsedEpisodeInfo.MovieTitle, parsedEpisodeInfo.Year); } else { - movie = _movieService.FindByTitle(parsedEpisodeInfo.MovieTitle); + // search by title + possibleMovie = _movieService.FindByTitle(parsedEpisodeInfo.MovieTitle); } - if (movie == null) + // search by title + if (possibleMovie == null) { - movie = _movieService.FindByTitle(parsedEpisodeInfo.MovieTitle); + possibleMovie = _movieService.FindByTitle(parsedEpisodeInfo.MovieTitle); } - return movie; - } + // search by alternative titles + if (possibleMovie == null) + { + possibleMovie = _movieService.FindByAlternativeTitle(parsedEpisodeInfo.MovieTitle); + } + } - if (movie == null && imdbId.IsNotNullOrWhiteSpace()) + if (possibleMovie == null && imdbId.IsNotNullOrWhiteSpace()) { - movie = _movieService.FindByImdbId(imdbId); + possibleMovie = _movieService.FindByImdbId(imdbId); } - if (movie == null) + if (possibleMovie == null) { - _logger.Debug("No matching movie {0}", parsedEpisodeInfo.MovieTitle); + _logger.Error($"Unable to match movie {parsedEpisodeInfo.MovieTitle}, try adding a alternative title to themoviedb.org for this movie."); return null; } - return movie; + return possibleMovie; } private Series GetSeries(ParsedEpisodeInfo parsedEpisodeInfo, int tvdbId, int tvRageId, SearchCriteriaBase searchCriteria) diff --git a/src/NzbDrone.Core/Tv/MovieRepository.cs b/src/NzbDrone.Core/Tv/MovieRepository.cs index 816b6f35d..03c234610 100644 --- a/src/NzbDrone.Core/Tv/MovieRepository.cs +++ b/src/NzbDrone.Core/Tv/MovieRepository.cs @@ -13,6 +13,7 @@ namespace NzbDrone.Core.Tv public interface IMovieRepository : IBasicRepository { bool MoviePathExists(string path); + Movie FindByAlternativeTitle(string cleanTitle); Movie FindByTitle(string cleanTitle); Movie FindByTitle(string cleanTitle, int year); Movie FindByImdbId(string imdbid); @@ -61,16 +62,13 @@ namespace NzbDrone.Core.Tv cleanTitle = cleanTitle.ToLowerInvariant(); var cleanRoman = cleanTitle; - var cleanNum = cleanTitle; foreach (KeyValuePair entry in romanNumeralsMapper) { string num = entry.Key; string roman = entry.Value.ToLower(); - cleanRoman = cleanRoman.Replace(num, roman); - cleanNum = cleanNum.Replace(roman, num); } @@ -102,6 +100,33 @@ namespace NzbDrone.Core.Tv } } + public Movie FindByAlternativeTitle(string cleanTitle) + { + cleanTitle = cleanTitle.ToLowerInvariant(); + + var cleanRoman = cleanTitle; + + var cleanNum = cleanTitle; + + foreach (KeyValuePair entry in romanNumeralsMapper) + { + string num = entry.Key; + string roman = entry.Value.ToLower(); + + cleanRoman = cleanRoman.Replace(num, roman); + + cleanNum = cleanNum.Replace(roman, num); + } + + var result = Query.Where(m => m.AlternativeTitles.Any(t => + Parser.Parser.CleanSeriesTitle(t.ToLower()) == cleanTitle || + Parser.Parser.CleanSeriesTitle(t.ToLower()) == cleanRoman || + Parser.Parser.CleanSeriesTitle(t.ToLower()) == cleanNum)) + .FirstOrDefault(); + + return result; + } + public Movie FindByTitle(string cleanTitle, int year) { cleanTitle = cleanTitle.ToLowerInvariant(); diff --git a/src/NzbDrone.Core/Tv/MovieService.cs b/src/NzbDrone.Core/Tv/MovieService.cs index 110f82a40..d0d2ba119 100644 --- a/src/NzbDrone.Core/Tv/MovieService.cs +++ b/src/NzbDrone.Core/Tv/MovieService.cs @@ -25,6 +25,7 @@ namespace NzbDrone.Core.Tv Movie AddMovie(Movie newMovie); List AddMovies(List newMovies); Movie FindByImdbId(string imdbid); + Movie FindByAlternativeTitle(string title); Movie FindByTitle(string title); Movie FindByTitle(string title, int year); Movie FindByTitleInexact(string title); @@ -185,6 +186,11 @@ namespace NzbDrone.Core.Tv return _movieRepository.FindByTitle(title.CleanSeriesTitle()); } + public Movie FindByAlternativeTitle(string title) + { + return _movieRepository.FindByAlternativeTitle(title.CleanSeriesTitle()); + } + public Movie FindByImdbId(string imdbid) { return _movieRepository.FindByImdbId(imdbid);