aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Providers/Subtitles/SubtitleManager.cs
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Providers/Subtitles/SubtitleManager.cs')
-rw-r--r--MediaBrowser.Providers/Subtitles/SubtitleManager.cs97
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 ||