diff options
Diffstat (limited to 'MediaBrowser.Providers/Subtitles/SubtitleManager.cs')
| -rw-r--r-- | MediaBrowser.Providers/Subtitles/SubtitleManager.cs | 97 |
1 files changed, 66 insertions, 31 deletions
diff --git a/MediaBrowser.Providers/Subtitles/SubtitleManager.cs b/MediaBrowser.Providers/Subtitles/SubtitleManager.cs index fe655759e..945498966 100644 --- a/MediaBrowser.Providers/Subtitles/SubtitleManager.cs +++ b/MediaBrowser.Providers/Subtitles/SubtitleManager.cs @@ -16,8 +16,8 @@ using System.IO; using System.Linq; using System.Threading; using System.Threading.Tasks; - -using MediaBrowser.Controller.IO; +using MediaBrowser.Common.Configuration; +using MediaBrowser.Controller.Configuration; using MediaBrowser.Model.IO; namespace MediaBrowser.Providers.Subtitles @@ -30,17 +30,19 @@ namespace MediaBrowser.Providers.Subtitles 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) + public SubtitleManager(ILogger logger, IFileSystem fileSystem, ILibraryMonitor monitor, ILibraryManager libraryManager, IMediaSourceManager mediaSourceManager, IServerConfigurationManager config) { _logger = logger; _fileSystem = fileSystem; _monitor = monitor; _libraryManager = libraryManager; _mediaSourceManager = mediaSourceManager; + _config = config; } public void AddParts(IEnumerable<ISubtitleProvider> subtitleProviders) @@ -102,6 +104,11 @@ namespace MediaBrowser.Providers.Subtitles return results.SelectMany(i => i).ToArray(); } + private SubtitleOptions GetOptions() + { + return _config.GetConfiguration<SubtitleOptions>("subtitles"); + } + public async Task DownloadSubtitles(Video video, string subtitleId, CancellationToken cancellationToken) @@ -109,49 +116,37 @@ namespace MediaBrowser.Providers.Subtitles var parts = subtitleId.Split(new[] { '_' }, 2); var provider = GetProvider(parts.First()); + var saveInMediaFolder = GetOptions().SaveSubtitlesInMediaFolders && video.SupportsLocalMetadata; + try { var response = await GetRemoteSubtitles(subtitleId, cancellationToken).ConfigureAwait(false); using (var stream = response.Stream) { - var savePath = Path.Combine(_fileSystem.GetDirectoryName(video.Path), - _fileSystem.GetFileNameWithoutExtension(video.Path) + "." + response.Language.ToLower()); - - if (response.IsForced) + using (var memoryStream = new MemoryStream()) { - savePath += ".forced"; - } - - savePath += "." + response.Format.ToLower(); + await stream.CopyToAsync(memoryStream).ConfigureAwait(false); + memoryStream.Position = 0; - _logger.Info("Saving subtitles to {0}", savePath); + var savePaths = new List<string>(); + var saveFileName = _fileSystem.GetFileNameWithoutExtension(video.Path) + "." + response.Language.ToLower(); - _monitor.ReportFileSystemChangeBeginning(savePath); + if (response.IsForced) + { + saveFileName += ".forced"; + } - try - { - //var isText = MediaStream.IsTextFormat(response.Format); + saveFileName += "." + response.Format.ToLower(); - using (var fs = _fileSystem.GetFileStream(savePath, FileOpenMode.Create, FileAccessMode.Write, - FileShareMode.Read, true)) + if (saveInMediaFolder) { - await stream.CopyToAsync(fs).ConfigureAwait(false); + savePaths.Add(Path.Combine(video.ContainingFolderPath, saveFileName)); } - EventHelper.FireEventIfNotNull(SubtitlesDownloaded, this, new SubtitleDownloadEventArgs - { - Item = video, - Format = response.Format, - Language = response.Language, - IsForced = response.IsForced, - Provider = provider.Name + savePaths.Add(Path.Combine(video.GetInternalMetadataPath(), saveFileName)); - }, _logger); - } - finally - { - _monitor.ReportFileSystemChangeComplete(savePath, false); + await TrySaveToFiles(memoryStream, savePaths).ConfigureAwait(false); } } } @@ -173,6 +168,46 @@ namespace MediaBrowser.Providers.Subtitles } } + private async Task TrySaveToFiles(Stream stream, List<string> savePaths) + { + Exception exceptionToThrow = null; + + foreach (var savePath in savePaths) + { + _logger.Info("Saving subtitles to {0}", savePath); + + _monitor.ReportFileSystemChangeBeginning(savePath); + + try + { + using (var fs = _fileSystem.GetFileStream(savePath, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read, true)) + { + await stream.CopyToAsync(fs).ConfigureAwait(false); + } + + return; + } + catch (Exception ex) + { + if (exceptionToThrow == null) + { + exceptionToThrow = ex; + } + } + finally + { + _monitor.ReportFileSystemChangeComplete(savePath, false); + } + + stream.Position = 0; + } + + if (exceptionToThrow != null) + { + throw exceptionToThrow; + } + } + public Task<RemoteSubtitleInfo[]> SearchSubtitles(Video video, string language, bool? isPerfectMatch, CancellationToken cancellationToken) { if (video.LocationType != LocationType.FileSystem || |
