diff --git a/MediaBrowser.Controller/Providers/ISubtitleProvider.cs b/MediaBrowser.Controller/Providers/ISubtitleProvider.cs index a3aaaf298e..adefea84d2 100644 --- a/MediaBrowser.Controller/Providers/ISubtitleProvider.cs +++ b/MediaBrowser.Controller/Providers/ISubtitleProvider.cs @@ -49,7 +49,9 @@ namespace MediaBrowser.Controller.Providers public string MediaPath { get; set; } public string SeriesName { get; set; } + public string Name { get; set; } public int? IndexNumber { get; set; } public int? ParentIndexNumber { get; set; } + public long ImdbId { get; set; } } } diff --git a/MediaBrowser.Providers/Subtitles/OpenSubtitleDownloader.cs b/MediaBrowser.Providers/Subtitles/OpenSubtitleDownloader.cs index 12d8b8fc65..6025493e79 100644 --- a/MediaBrowser.Providers/Subtitles/OpenSubtitleDownloader.cs +++ b/MediaBrowser.Providers/Subtitles/OpenSubtitleDownloader.cs @@ -37,25 +37,31 @@ namespace MediaBrowser.Providers.Subtitles public Task GetSubtitles(SubtitleRequest request, CancellationToken cancellationToken) { - return request.ContentType == SubtitleMediaType.Episode - ? GetEpisodeSubtitles(request, cancellationToken) - : GetMovieSubtitles(request, cancellationToken); + return GetMediaSubtitleSubtitles(request, cancellationToken); } - public async Task GetMovieSubtitles(SubtitleRequest request, CancellationToken cancellationToken) - { - throw new NotImplementedException(); - } - - public async Task GetEpisodeSubtitles(SubtitleRequest request, CancellationToken cancellationToken) + public async Task GetMediaSubtitleSubtitles(SubtitleRequest request, CancellationToken cancellationToken) { var response = new SubtitleResponse(); - if (!request.IndexNumber.HasValue || !request.ParentIndexNumber.HasValue) + switch (request.ContentType) { - _logger.Debug("Information Missing"); - return response; + case SubtitleMediaType.Episode: + if (!request.IndexNumber.HasValue || !request.ParentIndexNumber.HasValue || string.IsNullOrEmpty(request.SeriesName)) + { + _logger.Debug("Information Missing"); + return response; + } + break; + case SubtitleMediaType.Movie: + if (string.IsNullOrEmpty(request.Name)) + { + _logger.Debug("Information Missing"); + return response; + } + break; } + if (string.IsNullOrEmpty(request.MediaPath)) { _logger.Debug("Path Missing"); @@ -76,10 +82,13 @@ namespace MediaBrowser.Providers.Subtitles var fileInfo = new FileInfo(request.MediaPath); var movieByteSize = fileInfo.Length; + var subtitleSearchParameters = request.ContentType == SubtitleMediaType.Episode + ? new SubtitleSearchParameters(subLanguageId, request.SeriesName, request.ParentIndexNumber.Value.ToString(_usCulture), request.IndexNumber.Value.ToString(_usCulture)) + : new SubtitleSearchParameters(subLanguageId, request.Name); + var parms = new List { new SubtitleSearchParameters(subLanguageId, hash, movieByteSize), - new SubtitleSearchParameters(subLanguageId, request.SeriesName, request.ParentIndexNumber.Value.ToString(_usCulture), request.IndexNumber.Value.ToString(_usCulture)), - + subtitleSearchParameters }; var result = OpenSubtitles.SearchSubtitles(parms.ToArray()); @@ -89,8 +98,14 @@ namespace MediaBrowser.Providers.Subtitles return null; } + Predicate mediaFilter = + x => + request.ContentType == SubtitleMediaType.Episode + ? int.Parse(x.SeriesSeason) == request.ParentIndexNumber && int.Parse(x.SeriesEpisode) == request.IndexNumber + : long.Parse(x.IDMovieImdb) == request.ImdbId; + var results = ((MethodResponseSubtitleSearch)result).Results; - var bestResult = results.Where(x => x.SubBad == "0" && int.Parse(x.SeriesSeason) == request.ParentIndexNumber && int.Parse(x.SeriesEpisode) == request.IndexNumber) + var bestResult = results.Where(x => x.SubBad == "0" && mediaFilter(x)) .OrderBy(x => x.MovieHash == hash) .ThenBy(x => Math.Abs(long.Parse(x.MovieByteSize) - movieByteSize)) .ThenByDescending(x => int.Parse(x.SubDownloadsCnt)) @@ -124,7 +139,7 @@ namespace MediaBrowser.Providers.Subtitles var data = Convert.FromBase64String(res.Data); response.HasContent = true; - response.Format = SubtitleFormat.SRT; + response.Format = subtitle.SubFormat.ToUpper(); response.Stream = new MemoryStream(Utilities.Decompress(new MemoryStream(data))); return response; } diff --git a/OpenSubtitlesHandler/SubtitleTypes/SubtitleSearchParameters.cs b/OpenSubtitlesHandler/SubtitleTypes/SubtitleSearchParameters.cs index e11ff1b9a9..f2e70ef813 100644 --- a/OpenSubtitlesHandler/SubtitleTypes/SubtitleSearchParameters.cs +++ b/OpenSubtitlesHandler/SubtitleTypes/SubtitleSearchParameters.cs @@ -42,6 +42,17 @@ namespace OpenSubtitlesHandler this._query = ""; } + public SubtitleSearchParameters(string subLanguageId, string query) + { + this.subLanguageId = subLanguageId; + this.movieHash = ""; + this.movieByteSize = 0; + this.imdbid = ""; + this._episode = ""; + this._season = ""; + this._query = query; + } + public SubtitleSearchParameters(string subLanguageId, string query, string season, string episode) { this.subLanguageId = subLanguageId;