mirror of
https://github.com/jellyfin/jellyfin.git
synced 2025-07-09 03:04:24 -04:00
Update SubtitleEncoder.cs
This commit is contained in:
parent
7acee4070e
commit
473a995650
@ -168,33 +168,25 @@ namespace MediaBrowser.MediaEncoding.Subtitles
|
|||||||
MediaStream subtitleStream,
|
MediaStream subtitleStream,
|
||||||
CancellationToken cancellationToken)
|
CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
var inputFile = mediaSource.Path;
|
var fileInfo = await GetReadableFile(mediaSource, subtitleStream, cancellationToken).ConfigureAwait(false);
|
||||||
|
|
||||||
var protocol = mediaSource.Protocol;
|
var stream = await GetSubtitleStream(fileInfo, cancellationToken).ConfigureAwait(false);
|
||||||
if (subtitleStream.IsExternal)
|
|
||||||
{
|
|
||||||
protocol = _mediaSourceManager.GetPathProtocol(subtitleStream.Path);
|
|
||||||
}
|
|
||||||
|
|
||||||
var fileInfo = await GetReadableFile(mediaSource.Path, inputFile, mediaSource, subtitleStream, cancellationToken).ConfigureAwait(false);
|
|
||||||
|
|
||||||
var stream = await GetSubtitleStream(fileInfo.Path, fileInfo.Protocol, fileInfo.IsExternal, cancellationToken).ConfigureAwait(false);
|
|
||||||
|
|
||||||
return (stream, fileInfo.Format);
|
return (stream, fileInfo.Format);
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<Stream> GetSubtitleStream(string path, MediaProtocol protocol, bool requiresCharset, CancellationToken cancellationToken)
|
private async Task<Stream> GetSubtitleStream(SubtitleInfo fileInfo, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
if (requiresCharset)
|
if (fileInfo.IsExternal)
|
||||||
{
|
{
|
||||||
using (var stream = await GetStream(path, protocol, cancellationToken).ConfigureAwait(false))
|
using (var stream = await GetStream(fileInfo.Path, fileInfo.Protocol, cancellationToken).ConfigureAwait(false))
|
||||||
{
|
{
|
||||||
var result = CharsetDetector.DetectFromStream(stream).Detected;
|
var result = CharsetDetector.DetectFromStream(stream).Detected;
|
||||||
stream.Position = 0;
|
stream.Position = 0;
|
||||||
|
|
||||||
if (result != null)
|
if (result != null)
|
||||||
{
|
{
|
||||||
_logger.LogDebug("charset {CharSet} detected for {Path}", result.EncodingName, path);
|
_logger.LogDebug("charset {CharSet} detected for {Path}", result.EncodingName, fileInfo.Path);
|
||||||
|
|
||||||
using var reader = new StreamReader(stream, result.Encoding);
|
using var reader = new StreamReader(stream, result.Encoding);
|
||||||
var text = await reader.ReadToEndAsync().ConfigureAwait(false);
|
var text = await reader.ReadToEndAsync().ConfigureAwait(false);
|
||||||
@ -204,12 +196,10 @@ namespace MediaBrowser.MediaEncoding.Subtitles
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return File.OpenRead(path);
|
return File.OpenRead(fileInfo.Path);
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<SubtitleInfo> GetReadableFile(
|
private async Task<SubtitleInfo> GetReadableFile(
|
||||||
string mediaPath,
|
|
||||||
string inputFile,
|
|
||||||
MediaSourceInfo mediaSource,
|
MediaSourceInfo mediaSource,
|
||||||
MediaStream subtitleStream,
|
MediaStream subtitleStream,
|
||||||
CancellationToken cancellationToken)
|
CancellationToken cancellationToken)
|
||||||
@ -241,9 +231,9 @@ namespace MediaBrowser.MediaEncoding.Subtitles
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Extract
|
// Extract
|
||||||
var outputPath = GetSubtitleCachePath(mediaPath, mediaSource, subtitleStream.Index, "." + outputFormat);
|
var outputPath = GetSubtitleCachePath(mediaSource, subtitleStream.Index, "." + outputFormat);
|
||||||
|
|
||||||
await ExtractTextSubtitle(inputFile, mediaSource, subtitleStream.Index, outputCodec, outputPath, cancellationToken)
|
await ExtractTextSubtitle(mediaSource, subtitleStream.Index, outputCodec, outputPath, cancellationToken)
|
||||||
.ConfigureAwait(false);
|
.ConfigureAwait(false);
|
||||||
|
|
||||||
return new SubtitleInfo(outputPath, MediaProtocol.File, outputFormat, false);
|
return new SubtitleInfo(outputPath, MediaProtocol.File, outputFormat, false);
|
||||||
@ -255,13 +245,18 @@ namespace MediaBrowser.MediaEncoding.Subtitles
|
|||||||
if (GetReader(currentFormat, false) == null)
|
if (GetReader(currentFormat, false) == null)
|
||||||
{
|
{
|
||||||
// Convert
|
// Convert
|
||||||
var outputPath = GetSubtitleCachePath(mediaPath, mediaSource, subtitleStream.Index, ".srt");
|
var outputPath = GetSubtitleCachePath(mediaSource, subtitleStream.Index, ".srt");
|
||||||
|
|
||||||
await ConvertTextSubtitleToSrt(subtitleStream.Path, subtitleStream.Language, mediaSource, outputPath, cancellationToken).ConfigureAwait(false);
|
await ConvertTextSubtitleToSrt(subtitleStream.Path, subtitleStream.Language, mediaSource, outputPath, cancellationToken).ConfigureAwait(false);
|
||||||
|
|
||||||
return new SubtitleInfo(outputPath, MediaProtocol.File, "srt", true);
|
return new SubtitleInfo(outputPath, MediaProtocol.File, "srt", true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (subtitleStream.IsExternal)
|
||||||
|
{
|
||||||
|
return new SubtitleInfo(subtitleStream.Path, _mediaSourceManager.GetPathProtocol(subtitleStream.Path), currentFormat, true);
|
||||||
|
}
|
||||||
|
|
||||||
return new SubtitleInfo(subtitleStream.Path, mediaSource.Protocol, currentFormat, true);
|
return new SubtitleInfo(subtitleStream.Path, mediaSource.Protocol, currentFormat, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -504,7 +499,6 @@ namespace MediaBrowser.MediaEncoding.Subtitles
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Extracts the text subtitle.
|
/// Extracts the text subtitle.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="inputFile">The input file.</param>
|
|
||||||
/// <param name="mediaSource">The mediaSource.</param>
|
/// <param name="mediaSource">The mediaSource.</param>
|
||||||
/// <param name="subtitleStreamIndex">Index of the subtitle stream.</param>
|
/// <param name="subtitleStreamIndex">Index of the subtitle stream.</param>
|
||||||
/// <param name="outputCodec">The output codec.</param>
|
/// <param name="outputCodec">The output codec.</param>
|
||||||
@ -513,7 +507,6 @@ namespace MediaBrowser.MediaEncoding.Subtitles
|
|||||||
/// <returns>Task.</returns>
|
/// <returns>Task.</returns>
|
||||||
/// <exception cref="ArgumentException">Must use inputPath list overload.</exception>
|
/// <exception cref="ArgumentException">Must use inputPath list overload.</exception>
|
||||||
private async Task ExtractTextSubtitle(
|
private async Task ExtractTextSubtitle(
|
||||||
string inputFile,
|
|
||||||
MediaSourceInfo mediaSource,
|
MediaSourceInfo mediaSource,
|
||||||
int subtitleStreamIndex,
|
int subtitleStreamIndex,
|
||||||
string outputCodec,
|
string outputCodec,
|
||||||
@ -529,7 +522,7 @@ namespace MediaBrowser.MediaEncoding.Subtitles
|
|||||||
if (!File.Exists(outputPath))
|
if (!File.Exists(outputPath))
|
||||||
{
|
{
|
||||||
await ExtractTextSubtitleInternal(
|
await ExtractTextSubtitleInternal(
|
||||||
_mediaEncoder.GetInputArgument(inputFile, mediaSource),
|
_mediaEncoder.GetInputArgument(mediaSource.Path, mediaSource),
|
||||||
subtitleStreamIndex,
|
subtitleStreamIndex,
|
||||||
outputCodec,
|
outputCodec,
|
||||||
outputPath,
|
outputPath,
|
||||||
@ -695,15 +688,15 @@ namespace MediaBrowser.MediaEncoding.Subtitles
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private string GetSubtitleCachePath(string mediaPath, MediaSourceInfo mediaSource, int subtitleStreamIndex, string outputSubtitleExtension)
|
private string GetSubtitleCachePath(MediaSourceInfo mediaSource, int subtitleStreamIndex, string outputSubtitleExtension)
|
||||||
{
|
{
|
||||||
if (mediaSource.Protocol == MediaProtocol.File)
|
if (mediaSource.Protocol == MediaProtocol.File)
|
||||||
{
|
{
|
||||||
var ticksParam = string.Empty;
|
var ticksParam = string.Empty;
|
||||||
|
|
||||||
var date = _fileSystem.GetLastWriteTimeUtc(mediaPath);
|
var date = _fileSystem.GetLastWriteTimeUtc(mediaSource.Path);
|
||||||
|
|
||||||
ReadOnlySpan<char> filename = (mediaPath + "_" + subtitleStreamIndex.ToString(CultureInfo.InvariantCulture) + "_" + date.Ticks.ToString(CultureInfo.InvariantCulture) + ticksParam).GetMD5() + outputSubtitleExtension;
|
ReadOnlySpan<char> filename = (mediaSource.Path + "_" + subtitleStreamIndex.ToString(CultureInfo.InvariantCulture) + "_" + date.Ticks.ToString(CultureInfo.InvariantCulture) + ticksParam).GetMD5() + outputSubtitleExtension;
|
||||||
|
|
||||||
var prefix = filename.Slice(0, 1);
|
var prefix = filename.Slice(0, 1);
|
||||||
|
|
||||||
@ -711,7 +704,7 @@ namespace MediaBrowser.MediaEncoding.Subtitles
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ReadOnlySpan<char> filename = (mediaPath + "_" + subtitleStreamIndex.ToString(CultureInfo.InvariantCulture)).GetMD5() + outputSubtitleExtension;
|
ReadOnlySpan<char> filename = (mediaSource.Path + "_" + subtitleStreamIndex.ToString(CultureInfo.InvariantCulture)).GetMD5() + outputSubtitleExtension;
|
||||||
|
|
||||||
var prefix = filename.Slice(0, 1);
|
var prefix = filename.Slice(0, 1);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user