diff options
| author | Luke Pulverenti <luke.pulverenti@gmail.com> | 2016-11-01 00:07:12 -0400 |
|---|---|---|
| committer | Luke Pulverenti <luke.pulverenti@gmail.com> | 2016-11-01 00:07:12 -0400 |
| commit | b1276dc2084515ed817ba8b2af405a9bc1f57cd6 (patch) | |
| tree | 9e8f80656065b7143ec389166c8f7e8667c4d758 /MediaBrowser.MediaEncoding/Subtitles | |
| parent | 13d8110ce29a7d976c3e88dc4b330922964ac11a (diff) | |
make media encoding project portable
Diffstat (limited to 'MediaBrowser.MediaEncoding/Subtitles')
| -rw-r--r-- | MediaBrowser.MediaEncoding/Subtitles/OpenSubtitleDownloader.cs | 15 | ||||
| -rw-r--r-- | MediaBrowser.MediaEncoding/Subtitles/SubtitleEncoder.cs | 111 |
2 files changed, 52 insertions, 74 deletions
diff --git a/MediaBrowser.MediaEncoding/Subtitles/OpenSubtitleDownloader.cs b/MediaBrowser.MediaEncoding/Subtitles/OpenSubtitleDownloader.cs index d8f36de9a1..e26a6392c9 100644 --- a/MediaBrowser.MediaEncoding/Subtitles/OpenSubtitleDownloader.cs +++ b/MediaBrowser.MediaEncoding/Subtitles/OpenSubtitleDownloader.cs @@ -14,6 +14,7 @@ using MediaBrowser.Controller.Security; using MediaBrowser.Controller.Subtitles; using MediaBrowser.Model.Dto; using MediaBrowser.Model.Entities; +using MediaBrowser.Model.IO; using MediaBrowser.Model.Logging; using MediaBrowser.Model.Providers; using MediaBrowser.Model.Serialization; @@ -31,14 +32,16 @@ namespace MediaBrowser.MediaEncoding.Subtitles private readonly IEncryptionManager _encryption; private readonly IJsonSerializer _json; + private readonly IFileSystem _fileSystem; - public OpenSubtitleDownloader(ILogManager logManager, IHttpClient httpClient, IServerConfigurationManager config, IEncryptionManager encryption, IJsonSerializer json) + public OpenSubtitleDownloader(ILogManager logManager, IHttpClient httpClient, IServerConfigurationManager config, IEncryptionManager encryption, IJsonSerializer json, IFileSystem fileSystem) { _logger = logManager.GetLogger(GetType().Name); _httpClient = httpClient; _config = config; _encryption = encryption; _json = json; + _fileSystem = fileSystem; _config.NamedConfigurationUpdating += _config_NamedConfigurationUpdating; @@ -133,7 +136,7 @@ namespace MediaBrowser.MediaEncoding.Subtitles if ((DateTime.UtcNow - _lastRateLimitException).TotalHours < 1) { - throw new ApplicationException("OpenSubtitles rate limit reached"); + throw new Exception("OpenSubtitles rate limit reached"); } var resultDownLoad = await OpenSubtitles.DownloadSubtitlesAsync(downloadsList, cancellationToken).ConfigureAwait(false); @@ -141,12 +144,12 @@ namespace MediaBrowser.MediaEncoding.Subtitles if ((resultDownLoad.Status ?? string.Empty).IndexOf("407", StringComparison.OrdinalIgnoreCase) != -1) { _lastRateLimitException = DateTime.UtcNow; - throw new ApplicationException("OpenSubtitles rate limit reached"); + throw new Exception("OpenSubtitles rate limit reached"); } if (!(resultDownLoad is MethodResponseSubtitleDownload)) { - throw new ApplicationException("Invalid response type"); + throw new Exception("Invalid response type"); } var results = ((MethodResponseSubtitleDownload)resultDownLoad).Results; @@ -269,11 +272,11 @@ namespace MediaBrowser.MediaEncoding.Subtitles var subLanguageId = NormalizeLanguage(request.Language); string hash; - using (var fileStream = File.OpenRead(request.MediaPath)) + using (var fileStream = _fileSystem.OpenRead(request.MediaPath)) { hash = Utilities.ComputeHash(fileStream); } - var fileInfo = new FileInfo(request.MediaPath); + var fileInfo = _fileSystem.GetFileInfo(request.MediaPath); var movieByteSize = fileInfo.Length; var searchImdbId = request.ContentType == VideoContentType.Movie ? imdbId.ToString(_usCulture) : ""; var subtitleSearchParameters = request.ContentType == VideoContentType.Episode diff --git a/MediaBrowser.MediaEncoding/Subtitles/SubtitleEncoder.cs b/MediaBrowser.MediaEncoding/Subtitles/SubtitleEncoder.cs index 416184f496..1248d138db 100644 --- a/MediaBrowser.MediaEncoding/Subtitles/SubtitleEncoder.cs +++ b/MediaBrowser.MediaEncoding/Subtitles/SubtitleEncoder.cs @@ -18,9 +18,8 @@ using System.Text; using System.Threading; using System.Threading.Tasks; using MediaBrowser.Model.IO; -using MediaBrowser.Common.IO; -using MediaBrowser.Controller.IO; -using MediaBrowser.Model.IO; +using MediaBrowser.Model.Diagnostics; +using MediaBrowser.Model.TextEncoding; using UniversalDetector; namespace MediaBrowser.MediaEncoding.Subtitles @@ -36,8 +35,10 @@ namespace MediaBrowser.MediaEncoding.Subtitles private readonly IHttpClient _httpClient; private readonly IMediaSourceManager _mediaSourceManager; private readonly IMemoryStreamProvider _memoryStreamProvider; + private readonly IProcessFactory _processFactory; + private readonly IEncoding _textEncoding; - public SubtitleEncoder(ILibraryManager libraryManager, ILogger logger, IApplicationPaths appPaths, IFileSystem fileSystem, IMediaEncoder mediaEncoder, IJsonSerializer json, IHttpClient httpClient, IMediaSourceManager mediaSourceManager, IMemoryStreamProvider memoryStreamProvider) + public SubtitleEncoder(ILibraryManager libraryManager, ILogger logger, IApplicationPaths appPaths, IFileSystem fileSystem, IMediaEncoder mediaEncoder, IJsonSerializer json, IHttpClient httpClient, IMediaSourceManager mediaSourceManager, IMemoryStreamProvider memoryStreamProvider, IProcessFactory processFactory, IEncoding textEncoding) { _libraryManager = libraryManager; _logger = logger; @@ -48,6 +49,8 @@ namespace MediaBrowser.MediaEncoding.Subtitles _httpClient = httpClient; _mediaSourceManager = mediaSourceManager; _memoryStreamProvider = memoryStreamProvider; + _processFactory = processFactory; + _textEncoding = textEncoding; } private string SubtitleCachePath @@ -418,7 +421,6 @@ namespace MediaBrowser.MediaEncoding.Subtitles /// or /// outputPath /// </exception> - /// <exception cref="System.ApplicationException"></exception> private async Task ConvertTextSubtitleToSrtInternal(string inputPath, string language, MediaProtocol inputProtocol, string outputPath, CancellationToken cancellationToken) { if (string.IsNullOrEmpty(inputPath)) @@ -440,23 +442,20 @@ namespace MediaBrowser.MediaEncoding.Subtitles encodingParam = " -sub_charenc " + encodingParam; } - var process = new Process + var process = _processFactory.Create(new ProcessOptions { - StartInfo = new ProcessStartInfo - { - RedirectStandardOutput = false, - RedirectStandardError = true, - RedirectStandardInput = true, + RedirectStandardOutput = false, + RedirectStandardError = true, + RedirectStandardInput = true, - CreateNoWindow = true, - UseShellExecute = false, - FileName = _mediaEncoder.EncoderPath, - Arguments = string.Format("{0} -i \"{1}\" -c:s srt \"{2}\"", encodingParam, inputPath, outputPath), + CreateNoWindow = true, + UseShellExecute = false, + FileName = _mediaEncoder.EncoderPath, + Arguments = string.Format("{0} -i \"{1}\" -c:s srt \"{2}\"", encodingParam, inputPath, outputPath), - WindowStyle = ProcessWindowStyle.Hidden, - ErrorDialog = false - } - }; + IsHidden = true, + ErrorDialog = false + }); _logger.Info("{0} {1}", process.StartInfo.FileName, process.StartInfo.Arguments); @@ -538,7 +537,7 @@ namespace MediaBrowser.MediaEncoding.Subtitles _logger.Error(msg); - throw new ApplicationException(msg); + throw new Exception(msg); } await SetAssFont(outputPath).ConfigureAwait(false); } @@ -593,23 +592,20 @@ namespace MediaBrowser.MediaEncoding.Subtitles var processArgs = string.Format("-i {0} -map 0:{1} -an -vn -c:s {2} \"{3}\"", inputPath, subtitleStreamIndex, outputCodec, outputPath); - var process = new Process + var process = _processFactory.Create(new ProcessOptions { - StartInfo = new ProcessStartInfo - { - CreateNoWindow = true, - UseShellExecute = false, + CreateNoWindow = true, + UseShellExecute = false, - RedirectStandardOutput = false, - RedirectStandardError = true, - RedirectStandardInput = true, + RedirectStandardOutput = false, + RedirectStandardError = true, + RedirectStandardInput = true, - FileName = _mediaEncoder.EncoderPath, - Arguments = processArgs, - WindowStyle = ProcessWindowStyle.Hidden, - ErrorDialog = false - } - }; + FileName = _mediaEncoder.EncoderPath, + Arguments = processArgs, + IsHidden = true, + ErrorDialog = false + }); _logger.Info("{0} {1}", process.StartInfo.FileName, process.StartInfo.Arguments); @@ -675,10 +671,6 @@ namespace MediaBrowser.MediaEncoding.Subtitles { } - catch (DirectoryNotFoundException) - { - - } catch (IOException ex) { _logger.ErrorException("Error deleting extracted subtitle {0}", ex, outputPath); @@ -695,7 +687,7 @@ namespace MediaBrowser.MediaEncoding.Subtitles _logger.Error(msg); - throw new ApplicationException(msg); + throw new Exception(msg); } else { @@ -749,20 +741,26 @@ namespace MediaBrowser.MediaEncoding.Subtitles string text; Encoding encoding; - using (var reader = new StreamReader(file, true)) + using (var fileStream = _fileSystem.OpenRead(file)) { - encoding = reader.CurrentEncoding; + using (var reader = new StreamReader(fileStream, true)) + { + encoding = reader.CurrentEncoding; - text = await reader.ReadToEndAsync().ConfigureAwait(false); + text = await reader.ReadToEndAsync().ConfigureAwait(false); + } } var newText = text.Replace(",Arial,", ",Arial Unicode MS,"); if (!string.Equals(text, newText)) { - using (var writer = new StreamWriter(file, false, encoding)) + using (var fileStream = _fileSystem.GetFileStream(file, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read)) { - writer.Write(newText); + using (var writer = new StreamWriter(fileStream, encoding)) + { + writer.Write(newText); + } } } } @@ -795,7 +793,7 @@ namespace MediaBrowser.MediaEncoding.Subtitles { if (protocol == MediaProtocol.File) { - if (GetFileEncoding(path).Equals(Encoding.UTF8)) + if (_textEncoding.GetFileEncoding(path).Equals(Encoding.UTF8)) { return string.Empty; } @@ -902,29 +900,6 @@ namespace MediaBrowser.MediaEncoding.Subtitles return null; } - private Encoding GetFileEncoding(string srcFile) - { - // *** Detect byte order mark if any - otherwise assume default - var buffer = new byte[5]; - - using (var file = _fileSystem.GetFileStream(srcFile, FileOpenMode.Open, FileAccessMode.Read, FileShareMode.ReadWrite)) - { - file.Read(buffer, 0, 5); - } - - if (buffer[0] == 0xef && buffer[1] == 0xbb && buffer[2] == 0xbf) - return Encoding.UTF8; - if (buffer[0] == 0xfe && buffer[1] == 0xff) - return Encoding.Unicode; - if (buffer[0] == 0 && buffer[1] == 0 && buffer[2] == 0xfe && buffer[3] == 0xff) - return Encoding.UTF32; - if (buffer[0] == 0x2b && buffer[1] == 0x2f && buffer[2] == 0x76) - return Encoding.UTF7; - - // It's ok - anything aside from utf is ok since that's what we're looking for - return Encoding.Default; - } - private async Task<Stream> GetStream(string path, MediaProtocol protocol, CancellationToken cancellationToken) { if (protocol == MediaProtocol.Http) |
