mirror of
https://github.com/jellyfin/jellyfin.git
synced 2024-07-21 13:10:45 +02:00
fixed chapter extraction
This commit is contained in:
parent
80ef863dfc
commit
43a806ad02
|
@ -61,9 +61,10 @@ namespace MediaBrowser.Controller.MediaInfo
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="inputFiles">The input files.</param>
|
/// <param name="inputFiles">The input files.</param>
|
||||||
/// <param name="type">The type.</param>
|
/// <param name="type">The type.</param>
|
||||||
|
/// <param name="isAudio">if set to <c>true</c> [is audio].</param>
|
||||||
/// <param name="cancellationToken">The cancellation token.</param>
|
/// <param name="cancellationToken">The cancellation token.</param>
|
||||||
/// <returns>Task.</returns>
|
/// <returns>Task.</returns>
|
||||||
Task<InternalMediaInfoResult> GetMediaInfo(string[] inputFiles, InputType type, CancellationToken cancellationToken);
|
Task<InternalMediaInfoResult> GetMediaInfo(string[] inputFiles, InputType type, bool isAudio, CancellationToken cancellationToken);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the probe size argument.
|
/// Gets the probe size argument.
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
using MediaBrowser.Controller.Configuration;
|
using MediaBrowser.Controller.Configuration;
|
||||||
using MediaBrowser.Controller.Entities;
|
using MediaBrowser.Controller.Entities;
|
||||||
|
using MediaBrowser.Controller.Entities.Audio;
|
||||||
using MediaBrowser.Controller.MediaInfo;
|
using MediaBrowser.Controller.MediaInfo;
|
||||||
using MediaBrowser.Controller.Providers;
|
using MediaBrowser.Controller.Providers;
|
||||||
using MediaBrowser.Model.Entities;
|
using MediaBrowser.Model.Entities;
|
||||||
|
@ -117,7 +118,7 @@ namespace MediaBrowser.Providers.MediaInfo
|
||||||
inputPath = MediaEncoderHelpers.GetInputArgument(video.Path, video.LocationType == LocationType.Remote, video.VideoType, video.IsoType, isoMount, video.PlayableStreamFileNames, out type);
|
inputPath = MediaEncoderHelpers.GetInputArgument(video.Path, video.LocationType == LocationType.Remote, video.VideoType, video.IsoType, isoMount, video.PlayableStreamFileNames, out type);
|
||||||
}
|
}
|
||||||
|
|
||||||
return await MediaEncoder.GetMediaInfo(inputPath, type, cancellationToken).ConfigureAwait(false);
|
return await MediaEncoder.GetMediaInfo(inputPath, type, item is Audio, cancellationToken).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
|
@ -255,13 +255,15 @@ namespace MediaBrowser.Server.Implementations.HttpServer
|
||||||
{
|
{
|
||||||
LogHttpRequest(context, index);
|
LogHttpRequest(context, index);
|
||||||
|
|
||||||
if (context.Request.IsWebSocketRequest)
|
var request = context.Request;
|
||||||
|
|
||||||
|
if (request.IsWebSocketRequest)
|
||||||
{
|
{
|
||||||
ProcessWebSocketRequest(context);
|
ProcessWebSocketRequest(context);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var localPath = context.Request.Url.LocalPath;
|
var localPath = request.Url.LocalPath;
|
||||||
|
|
||||||
if (string.Equals(localPath, "/mediabrowser/", StringComparison.OrdinalIgnoreCase))
|
if (string.Equals(localPath, "/mediabrowser/", StringComparison.OrdinalIgnoreCase))
|
||||||
{
|
{
|
||||||
|
@ -288,8 +290,8 @@ namespace MediaBrowser.Server.Implementations.HttpServer
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var url = context.Request.Url.ToString();
|
var url = request.Url.ToString();
|
||||||
var endPoint = context.Request.RemoteEndPoint;
|
var endPoint = request.RemoteEndPoint;
|
||||||
|
|
||||||
await ProcessRequestAsync(context).ConfigureAwait(false);
|
await ProcessRequestAsync(context).ConfigureAwait(false);
|
||||||
|
|
||||||
|
|
|
@ -206,38 +206,58 @@ namespace MediaBrowser.Server.Implementations.LiveTv
|
||||||
return await GetRecording(recording, service.Name, cancellationToken).ConfigureAwait(false);
|
return await GetRecording(recording, service.Name, cancellationToken).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private readonly SemaphoreSlim _liveStreamSemaphore = new SemaphoreSlim(1, 1);
|
||||||
|
|
||||||
public async Task<LiveStreamInfo> GetRecordingStream(string id, CancellationToken cancellationToken)
|
public async Task<LiveStreamInfo> GetRecordingStream(string id, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
var service = ActiveService;
|
await _liveStreamSemaphore.WaitAsync(cancellationToken).ConfigureAwait(false);
|
||||||
|
|
||||||
var recordings = await service.GetRecordingsAsync(cancellationToken).ConfigureAwait(false);
|
try
|
||||||
|
|
||||||
var recording = recordings.First(i => _tvDtoService.GetInternalRecordingId(service.Name, i.Id) == new Guid(id));
|
|
||||||
|
|
||||||
var result = await service.GetRecordingStream(recording.Id, cancellationToken).ConfigureAwait(false);
|
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(result.Id))
|
|
||||||
{
|
{
|
||||||
_openStreams.AddOrUpdate(result.Id, result, (key, info) => result);
|
var service = ActiveService;
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
var recordings = await service.GetRecordingsAsync(cancellationToken).ConfigureAwait(false);
|
||||||
|
|
||||||
|
var recording = recordings.First(i => _tvDtoService.GetInternalRecordingId(service.Name, i.Id) == new Guid(id));
|
||||||
|
|
||||||
|
var result = await service.GetRecordingStream(recording.Id, cancellationToken).ConfigureAwait(false);
|
||||||
|
|
||||||
|
if (!string.IsNullOrEmpty(result.Id))
|
||||||
|
{
|
||||||
|
_openStreams.AddOrUpdate(result.Id, result, (key, info) => result);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
_liveStreamSemaphore.Release();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<LiveStreamInfo> GetChannelStream(string id, CancellationToken cancellationToken)
|
public async Task<LiveStreamInfo> GetChannelStream(string id, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
var service = ActiveService;
|
await _liveStreamSemaphore.WaitAsync(cancellationToken).ConfigureAwait(false);
|
||||||
|
|
||||||
var channel = GetInternalChannel(id);
|
try
|
||||||
|
|
||||||
var result = await service.GetChannelStream(channel.ChannelInfo.Id, cancellationToken).ConfigureAwait(false);
|
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(result.Id))
|
|
||||||
{
|
{
|
||||||
_openStreams.AddOrUpdate(result.Id, result, (key, info) => result);
|
var service = ActiveService;
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
var channel = GetInternalChannel(id);
|
||||||
|
|
||||||
|
var result = await service.GetChannelStream(channel.ChannelInfo.Id, cancellationToken).ConfigureAwait(false);
|
||||||
|
|
||||||
|
if (!string.IsNullOrEmpty(result.Id))
|
||||||
|
{
|
||||||
|
_openStreams.AddOrUpdate(result.Id, result, (key, info) => result);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
_liveStreamSemaphore.Release();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<LiveTvChannel> GetChannel(ChannelInfo channelInfo, string serviceName, CancellationToken cancellationToken)
|
private async Task<LiveTvChannel> GetChannel(ChannelInfo channelInfo, string serviceName, CancellationToken cancellationToken)
|
||||||
|
@ -1243,9 +1263,18 @@ namespace MediaBrowser.Server.Implementations.LiveTv
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task CloseLiveStream(string id, CancellationToken cancellationToken)
|
public async Task CloseLiveStream(string id, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
return ActiveService.CloseLiveStream(id, cancellationToken);
|
await _liveStreamSemaphore.WaitAsync(cancellationToken).ConfigureAwait(false);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await ActiveService.CloseLiveStream(id, cancellationToken).ConfigureAwait(false);
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
_liveStreamSemaphore.Release();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public GuideInfo GetGuideInfo()
|
public GuideInfo GetGuideInfo()
|
||||||
|
|
|
@ -102,12 +102,13 @@ namespace MediaBrowser.Server.Implementations.MediaEncoder
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="inputFiles">The input files.</param>
|
/// <param name="inputFiles">The input files.</param>
|
||||||
/// <param name="type">The type.</param>
|
/// <param name="type">The type.</param>
|
||||||
|
/// <param name="isAudio">if set to <c>true</c> [is audio].</param>
|
||||||
/// <param name="cancellationToken">The cancellation token.</param>
|
/// <param name="cancellationToken">The cancellation token.</param>
|
||||||
/// <returns>Task.</returns>
|
/// <returns>Task.</returns>
|
||||||
public Task<InternalMediaInfoResult> GetMediaInfo(string[] inputFiles, InputType type,
|
public Task<InternalMediaInfoResult> GetMediaInfo(string[] inputFiles, InputType type, bool isAudio,
|
||||||
CancellationToken cancellationToken)
|
CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
return GetMediaInfoInternal(GetInputArgument(inputFiles, type), type != InputType.File,
|
return GetMediaInfoInternal(GetInputArgument(inputFiles, type), !isAudio,
|
||||||
GetProbeSizeArgument(type), cancellationToken);
|
GetProbeSizeArgument(type), cancellationToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -177,27 +178,27 @@ namespace MediaBrowser.Server.Implementations.MediaEncoder
|
||||||
CancellationToken cancellationToken)
|
CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
var process = new Process
|
var process = new Process
|
||||||
|
{
|
||||||
|
StartInfo = new ProcessStartInfo
|
||||||
{
|
{
|
||||||
StartInfo = new ProcessStartInfo
|
CreateNoWindow = true,
|
||||||
{
|
UseShellExecute = false,
|
||||||
CreateNoWindow = true,
|
|
||||||
UseShellExecute = false,
|
|
||||||
|
|
||||||
// Must consume both or ffmpeg may hang due to deadlocks. See comments below.
|
// Must consume both or ffmpeg may hang due to deadlocks. See comments below.
|
||||||
RedirectStandardOutput = true,
|
RedirectStandardOutput = true,
|
||||||
RedirectStandardError = true,
|
RedirectStandardError = true,
|
||||||
FileName = FFProbePath,
|
FileName = FFProbePath,
|
||||||
Arguments =
|
Arguments =
|
||||||
string.Format(
|
string.Format(
|
||||||
"{0} -i {1} -threads 0 -v info -print_format json -show_streams -show_format",
|
"{0} -i {1} -threads 0 -v info -print_format json -show_streams -show_format",
|
||||||
probeSizeArgument, inputPath).Trim(),
|
probeSizeArgument, inputPath).Trim(),
|
||||||
|
|
||||||
WindowStyle = ProcessWindowStyle.Hidden,
|
WindowStyle = ProcessWindowStyle.Hidden,
|
||||||
ErrorDialog = false
|
ErrorDialog = false
|
||||||
},
|
},
|
||||||
|
|
||||||
EnableRaisingEvents = true
|
EnableRaisingEvents = true
|
||||||
};
|
};
|
||||||
|
|
||||||
_logger.Debug("{0} {1}", process.StartInfo.FileName, process.StartInfo.Arguments);
|
_logger.Debug("{0} {1}", process.StartInfo.FileName, process.StartInfo.Arguments);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue