@ -168,33 +168,25 @@ namespace MediaBrowser.MediaEncoding.Subtitles
MediaStream subtitleStream ,
CancellationToken cancellationToken )
{
var inputFile = mediaSource . Path ;
var fileInfo = await GetReadableFile ( mediaSource , subtitleStream , cancellationToken ) . ConfigureAwait ( false ) ;
var protocol = mediaSource . Protocol ;
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 ) ;
var stream = await GetSubtitleStream ( fileInfo , cancellationToken ) . ConfigureAwait ( false ) ;
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, p rotocol, cancellationToken ) . ConfigureAwait ( false ) )
using ( var stream = await GetStream ( fileInfo. Path , fileInfo . P rotocol, cancellationToken ) . ConfigureAwait ( false ) )
{
var result = CharsetDetector . DetectFromStream ( stream ) . Detected ;
stream . Position = 0 ;
if ( result ! = null )
{
_logger . LogDebug ( "charset {CharSet} detected for {Path}" , result . EncodingName , p ath) ;
_logger . LogDebug ( "charset {CharSet} detected for {Path}" , result . EncodingName , fileInfo. P ath) ;
using var reader = new StreamReader ( stream , result . Encoding ) ;
var text = await reader . ReadToEndAsync ( ) . ConfigureAwait ( false ) ;
@ -204,12 +196,10 @@ namespace MediaBrowser.MediaEncoding.Subtitles
}
}
return File . OpenRead ( p ath) ;
return File . OpenRead ( fileInfo. P ath) ;
}
private async Task < SubtitleInfo > GetReadableFile (
string mediaPath ,
string inputFile ,
MediaSourceInfo mediaSource ,
MediaStream subtitleStream ,
CancellationToken cancellationToken )
@ -241,9 +231,9 @@ namespace MediaBrowser.MediaEncoding.Subtitles
}
// Extract
var outputPath = GetSubtitleCachePath ( media Path, media Source, subtitleStream . Index , "." + outputFormat ) ;
var outputPath = GetSubtitleCachePath ( media Source, subtitleStream . Index , "." + outputFormat ) ;
await ExtractTextSubtitle ( inputFile, mediaSource, subtitleStream . Index , outputCodec , outputPath , cancellationToken )
await ExtractTextSubtitle ( mediaSource, subtitleStream . Index , outputCodec , outputPath , cancellationToken )
. ConfigureAwait ( false ) ;
return new SubtitleInfo ( outputPath , MediaProtocol . File , outputFormat , false ) ;
@ -255,13 +245,18 @@ namespace MediaBrowser.MediaEncoding.Subtitles
if ( GetReader ( currentFormat , false ) = = null )
{
// Convert
var outputPath = GetSubtitleCachePath ( media Path, media Source, subtitleStream . Index , ".srt" ) ;
var outputPath = GetSubtitleCachePath ( media Source, subtitleStream . Index , ".srt" ) ;
await ConvertTextSubtitleToSrt ( subtitleStream . Path , subtitleStream . Language , mediaSource , outputPath , cancellationToken ) . ConfigureAwait ( false ) ;
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 ) ;
}
@ -504,7 +499,6 @@ namespace MediaBrowser.MediaEncoding.Subtitles
/// <summary>
/// Extracts the text subtitle.
/// </summary>
/// <param name="inputFile">The input file.</param>
/// <param name="mediaSource">The mediaSource.</param>
/// <param name="subtitleStreamIndex">Index of the subtitle stream.</param>
/// <param name="outputCodec">The output codec.</param>
@ -513,7 +507,6 @@ namespace MediaBrowser.MediaEncoding.Subtitles
/// <returns>Task.</returns>
/// <exception cref="ArgumentException">Must use inputPath list overload.</exception>
private async Task ExtractTextSubtitle (
string inputFile ,
MediaSourceInfo mediaSource ,
int subtitleStreamIndex ,
string outputCodec ,
@ -529,7 +522,7 @@ namespace MediaBrowser.MediaEncoding.Subtitles
if ( ! File . Exists ( outputPath ) )
{
await ExtractTextSubtitleInternal (
_mediaEncoder . GetInputArgument ( inputFile , mediaSource ) ,
_mediaEncoder . GetInputArgument ( mediaSource. Path , mediaSource ) ,
subtitleStreamIndex ,
outputCodec ,
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 )
{
var ticksParam = string . Empty ;
var date = _fileSystem . GetLastWriteTimeUtc ( media Path) ;
var date = _fileSystem . GetLastWriteTimeUtc ( media Source. Path) ;
ReadOnlySpan < char > filename = ( media Path + "_" + subtitleStreamIndex . ToString ( CultureInfo . InvariantCulture ) + "_" + date . Ticks . ToString ( CultureInfo . InvariantCulture ) + ticksParam ) . GetMD5 ( ) + outputSubtitleExtension ;
ReadOnlySpan < char > filename = ( media Source. Path + "_" + subtitleStreamIndex . ToString ( CultureInfo . InvariantCulture ) + "_" + date . Ticks . ToString ( CultureInfo . InvariantCulture ) + ticksParam ) . GetMD5 ( ) + outputSubtitleExtension ;
var prefix = filename . Slice ( 0 , 1 ) ;
@ -711,7 +704,7 @@ namespace MediaBrowser.MediaEncoding.Subtitles
}
else
{
ReadOnlySpan < char > filename = ( media Path + "_" + subtitleStreamIndex . ToString ( CultureInfo . InvariantCulture ) ) . GetMD5 ( ) + outputSubtitleExtension ;
ReadOnlySpan < char > filename = ( media Source. Path + "_" + subtitleStreamIndex . ToString ( CultureInfo . InvariantCulture ) ) . GetMD5 ( ) + outputSubtitleExtension ;
var prefix = filename . Slice ( 0 , 1 ) ;