diff options
Diffstat (limited to 'MediaBrowser.Providers/Subtitles/SubtitleManager.cs')
| -rw-r--r-- | MediaBrowser.Providers/Subtitles/SubtitleManager.cs | 57 |
1 files changed, 45 insertions, 12 deletions
diff --git a/MediaBrowser.Providers/Subtitles/SubtitleManager.cs b/MediaBrowser.Providers/Subtitles/SubtitleManager.cs index 6a9b7136c..071687c0f 100644 --- a/MediaBrowser.Providers/Subtitles/SubtitleManager.cs +++ b/MediaBrowser.Providers/Subtitles/SubtitleManager.cs @@ -19,6 +19,8 @@ using System.Threading.Tasks; using MediaBrowser.Common.Configuration; using MediaBrowser.Controller.Configuration; using MediaBrowser.Model.IO; +using MediaBrowser.Model.Globalization; +using MediaBrowser.Model.Configuration; namespace MediaBrowser.Providers.Subtitles { @@ -28,33 +30,56 @@ namespace MediaBrowser.Providers.Subtitles private readonly ILogger _logger; private readonly IFileSystem _fileSystem; private readonly ILibraryMonitor _monitor; - private readonly ILibraryManager _libraryManager; private readonly IMediaSourceManager _mediaSourceManager; private readonly IServerConfigurationManager _config; public event EventHandler<SubtitleDownloadEventArgs> SubtitlesDownloaded; public event EventHandler<SubtitleDownloadFailureEventArgs> SubtitleDownloadFailure; - public SubtitleManager(ILogger logger, IFileSystem fileSystem, ILibraryMonitor monitor, ILibraryManager libraryManager, IMediaSourceManager mediaSourceManager, IServerConfigurationManager config) + private ILocalizationManager _localization; + + public SubtitleManager(ILogger logger, IFileSystem fileSystem, ILibraryMonitor monitor, IMediaSourceManager mediaSourceManager, IServerConfigurationManager config, ILocalizationManager localizationManager) { _logger = logger; _fileSystem = fileSystem; _monitor = monitor; - _libraryManager = libraryManager; _mediaSourceManager = mediaSourceManager; _config = config; + _localization = localizationManager; } public void AddParts(IEnumerable<ISubtitleProvider> subtitleProviders) { - _subtitleProviders = subtitleProviders.ToArray(); + _subtitleProviders = subtitleProviders + .OrderBy(i => + { + var hasOrder = i as IHasOrder; + return hasOrder == null ? 0 : hasOrder.Order; + }) + .ToArray(); } public async Task<RemoteSubtitleInfo[]> SearchSubtitles(SubtitleSearchRequest request, CancellationToken cancellationToken) { + if (request.Language != null) + { + var culture = _localization.FindLanguageInfo(request.Language); + + if (culture != null) + { + request.TwoLetterISOLanguageName = culture.TwoLetterISOLanguageName; + } + } + var contentType = request.ContentType; var providers = _subtitleProviders .Where(i => i.SupportedMediaTypes.Contains(contentType)) + .Where(i => !request.DisabledSubtitleFetchers.Contains(i.Name, StringComparer.OrdinalIgnoreCase)) + .OrderBy(i => + { + var index = request.SubtitleFetcherOrder.ToList().IndexOf(i.Name); + return index == -1 ? int.MaxValue : index; + }) .ToArray(); // If not searching all, search one at a time until something is found @@ -109,14 +134,22 @@ namespace MediaBrowser.Providers.Subtitles return _config.GetConfiguration<SubtitleOptions>("subtitles"); } + public Task DownloadSubtitles(Video video, string subtitleId, CancellationToken cancellationToken) + { + var libraryOptions = BaseItem.LibraryManager.GetLibraryOptions(video); + + return DownloadSubtitles(video, libraryOptions, subtitleId, cancellationToken); + } + public async Task DownloadSubtitles(Video video, + LibraryOptions libraryOptions, string subtitleId, CancellationToken cancellationToken) { var parts = subtitleId.Split(new[] { '_' }, 2); var provider = GetProvider(parts.First()); - var saveInMediaFolder = video.IsSaveLocalMetadataEnabled(); + var saveInMediaFolder = libraryOptions.SaveSubtitlesWithMedia; try { @@ -180,6 +213,8 @@ namespace MediaBrowser.Providers.Subtitles try { + _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(savePath)); + using (var fs = _fileSystem.GetFileStream(savePath, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read, true)) { await stream.CopyToAsync(fs).ConfigureAwait(false); @@ -210,8 +245,7 @@ namespace MediaBrowser.Providers.Subtitles public Task<RemoteSubtitleInfo[]> SearchSubtitles(Video video, string language, bool? isPerfectMatch, CancellationToken cancellationToken) { - if (video.LocationType != LocationType.FileSystem || - video.VideoType != VideoType.VideoFile) + if (video.VideoType != VideoType.VideoFile) { return Task.FromResult<RemoteSubtitleInfo[]>(new RemoteSubtitleInfo[] { }); } @@ -275,12 +309,12 @@ namespace MediaBrowser.Providers.Subtitles return _subtitleProviders.First(i => string.Equals(id, GetProviderId(i.Name))); } - public Task DeleteSubtitles(string itemId, int index) + public Task DeleteSubtitles(BaseItem item, int index) { var stream = _mediaSourceManager.GetMediaStreams(new MediaStreamQuery { Index = index, - ItemId = new Guid(itemId), + ItemId = item.Id, Type = MediaStreamType.Subtitle }).First(); @@ -297,7 +331,7 @@ namespace MediaBrowser.Providers.Subtitles _monitor.ReportFileSystemChangeComplete(path, false); } - return _libraryManager.GetItemById(itemId).RefreshMetadata(CancellationToken.None); + return item.RefreshMetadata(CancellationToken.None); } public Task<SubtitleResponse> GetRemoteSubtitles(string id, CancellationToken cancellationToken) @@ -310,9 +344,8 @@ namespace MediaBrowser.Providers.Subtitles return provider.GetSubtitles(id, cancellationToken); } - public SubtitleProviderInfo[] GetProviders(string itemId) + public SubtitleProviderInfo[] GetSupportedProviders(BaseItem video) { - var video = _libraryManager.GetItemById(itemId) as Video; VideoContentType mediaType; if (video is Episode) |
