|
|
|
@ -161,16 +161,16 @@ namespace MediaBrowser.MediaEncoding.Subtitles
|
|
|
|
|
|
|
|
|
|
var fileInfo = await GetReadableFile(mediaSource.Path, inputFiles, mediaSource.Protocol, subtitleStream, cancellationToken).ConfigureAwait(false);
|
|
|
|
|
|
|
|
|
|
var stream = await GetSubtitleStream(fileInfo.Item1, fileInfo.Item2, fileInfo.Item4, cancellationToken).ConfigureAwait(false);
|
|
|
|
|
var stream = await GetSubtitleStream(fileInfo.Item1, subtitleStream.Language, fileInfo.Item2, fileInfo.Item4, cancellationToken).ConfigureAwait(false);
|
|
|
|
|
|
|
|
|
|
return new Tuple<Stream, string>(stream, fileInfo.Item3);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private async Task<Stream> GetSubtitleStream(string path, MediaProtocol protocol, bool requiresCharset, CancellationToken cancellationToken)
|
|
|
|
|
private async Task<Stream> GetSubtitleStream(string path, string language, MediaProtocol protocol, bool requiresCharset, CancellationToken cancellationToken)
|
|
|
|
|
{
|
|
|
|
|
if (requiresCharset)
|
|
|
|
|
{
|
|
|
|
|
var charset = await GetSubtitleFileCharacterSet(path, protocol, cancellationToken).ConfigureAwait(false);
|
|
|
|
|
var charset = await GetSubtitleFileCharacterSet(path, language, protocol, cancellationToken).ConfigureAwait(false);
|
|
|
|
|
|
|
|
|
|
if (!string.IsNullOrEmpty(charset))
|
|
|
|
|
{
|
|
|
|
@ -198,13 +198,18 @@ namespace MediaBrowser.MediaEncoding.Subtitles
|
|
|
|
|
throw new ArgumentNullException("charset");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_logger.Debug("Getting encoding object for character set: {0}", charset);
|
|
|
|
|
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
return Encoding.GetEncoding(charset);
|
|
|
|
|
}
|
|
|
|
|
catch (ArgumentException)
|
|
|
|
|
{
|
|
|
|
|
return Encoding.GetEncoding(charset.Replace("-", string.Empty));
|
|
|
|
|
charset = charset.Replace("-", string.Empty);
|
|
|
|
|
_logger.Debug("Getting encoding object for character set: {0}", charset);
|
|
|
|
|
|
|
|
|
|
return Encoding.GetEncoding(charset);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -257,7 +262,7 @@ namespace MediaBrowser.MediaEncoding.Subtitles
|
|
|
|
|
// Convert
|
|
|
|
|
var outputPath = GetSubtitleCachePath(mediaPath, protocol, subtitleStream.Index, ".srt");
|
|
|
|
|
|
|
|
|
|
await ConvertTextSubtitleToSrt(subtitleStream.Path, protocol, outputPath, cancellationToken).ConfigureAwait(false);
|
|
|
|
|
await ConvertTextSubtitleToSrt(subtitleStream.Path, subtitleStream.Language, protocol, outputPath, cancellationToken).ConfigureAwait(false);
|
|
|
|
|
|
|
|
|
|
return new Tuple<string, MediaProtocol, string, bool>(outputPath, MediaProtocol.File, "srt", true);
|
|
|
|
|
}
|
|
|
|
@ -356,7 +361,7 @@ namespace MediaBrowser.MediaEncoding.Subtitles
|
|
|
|
|
/// <param name="outputPath">The output path.</param>
|
|
|
|
|
/// <param name="cancellationToken">The cancellation token.</param>
|
|
|
|
|
/// <returns>Task.</returns>
|
|
|
|
|
private async Task ConvertTextSubtitleToSrt(string inputPath, MediaProtocol inputProtocol, string outputPath, CancellationToken cancellationToken)
|
|
|
|
|
private async Task ConvertTextSubtitleToSrt(string inputPath, string language, MediaProtocol inputProtocol, string outputPath, CancellationToken cancellationToken)
|
|
|
|
|
{
|
|
|
|
|
var semaphore = GetLock(outputPath);
|
|
|
|
|
|
|
|
|
@ -366,7 +371,7 @@ namespace MediaBrowser.MediaEncoding.Subtitles
|
|
|
|
|
{
|
|
|
|
|
if (!_fileSystem.FileExists(outputPath))
|
|
|
|
|
{
|
|
|
|
|
await ConvertTextSubtitleToSrtInternal(inputPath, inputProtocol, outputPath, cancellationToken).ConfigureAwait(false);
|
|
|
|
|
await ConvertTextSubtitleToSrtInternal(inputPath, language, inputProtocol, outputPath, cancellationToken).ConfigureAwait(false);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
finally
|
|
|
|
@ -389,7 +394,7 @@ namespace MediaBrowser.MediaEncoding.Subtitles
|
|
|
|
|
/// outputPath
|
|
|
|
|
/// </exception>
|
|
|
|
|
/// <exception cref="System.ApplicationException"></exception>
|
|
|
|
|
private async Task ConvertTextSubtitleToSrtInternal(string inputPath, MediaProtocol inputProtocol, string outputPath, CancellationToken cancellationToken)
|
|
|
|
|
private async Task ConvertTextSubtitleToSrtInternal(string inputPath, string language, MediaProtocol inputProtocol, string outputPath, CancellationToken cancellationToken)
|
|
|
|
|
{
|
|
|
|
|
if (string.IsNullOrEmpty(inputPath))
|
|
|
|
|
{
|
|
|
|
@ -403,7 +408,7 @@ namespace MediaBrowser.MediaEncoding.Subtitles
|
|
|
|
|
|
|
|
|
|
_fileSystem.CreateDirectory(Path.GetDirectoryName(outputPath));
|
|
|
|
|
|
|
|
|
|
var encodingParam = await GetSubtitleFileCharacterSet(inputPath, inputProtocol, cancellationToken).ConfigureAwait(false);
|
|
|
|
|
var encodingParam = await GetSubtitleFileCharacterSet(inputPath, language, inputProtocol, cancellationToken).ConfigureAwait(false);
|
|
|
|
|
|
|
|
|
|
if (!string.IsNullOrEmpty(encodingParam))
|
|
|
|
|
{
|
|
|
|
@ -733,7 +738,7 @@ namespace MediaBrowser.MediaEncoding.Subtitles
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public async Task<string> GetSubtitleFileCharacterSet(string path, MediaProtocol protocol, CancellationToken cancellationToken)
|
|
|
|
|
public async Task<string> GetSubtitleFileCharacterSet(string path, string language, MediaProtocol protocol, CancellationToken cancellationToken)
|
|
|
|
|
{
|
|
|
|
|
if (protocol == MediaProtocol.File)
|
|
|
|
|
{
|
|
|
|
@ -743,7 +748,7 @@ namespace MediaBrowser.MediaEncoding.Subtitles
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var charset = await DetectCharset(path, protocol, cancellationToken).ConfigureAwait(false);
|
|
|
|
|
var charset = await DetectCharset(path, language, protocol, cancellationToken).ConfigureAwait(false);
|
|
|
|
|
|
|
|
|
|
if (!string.IsNullOrWhiteSpace(charset))
|
|
|
|
|
{
|
|
|
|
@ -755,6 +760,11 @@ namespace MediaBrowser.MediaEncoding.Subtitles
|
|
|
|
|
return charset;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!string.IsNullOrWhiteSpace(language))
|
|
|
|
|
{
|
|
|
|
|
return GetSubtitleFileCharacterSetFromLanguage(language);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -799,7 +809,7 @@ namespace MediaBrowser.MediaEncoding.Subtitles
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private async Task<string> DetectCharset(string path, MediaProtocol protocol, CancellationToken cancellationToken)
|
|
|
|
|
private async Task<string> DetectCharset(string path, string language, MediaProtocol protocol, CancellationToken cancellationToken)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
@ -816,6 +826,15 @@ namespace MediaBrowser.MediaEncoding.Subtitles
|
|
|
|
|
_logger.Info("UniversalDetector detected charset {0} for {1}", charset, path);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// This is often incorrectly indetected. If this happens, try to use other techniques instead
|
|
|
|
|
if (string.Equals("x-mac-cyrillic", charset, StringComparison.OrdinalIgnoreCase))
|
|
|
|
|
{
|
|
|
|
|
if (!string.IsNullOrWhiteSpace(language))
|
|
|
|
|
{
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return charset;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|