mirror of
https://github.com/jellyfin/jellyfin.git
synced 2025-12-16 14:03:03 +03:00
Add ITranscodeManager service
This commit is contained in:
@@ -9,6 +9,7 @@ using System.Text;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using Jellyfin.Api.Attributes;
|
||||
using Jellyfin.Api.Extensions;
|
||||
using Jellyfin.Api.Helpers;
|
||||
using Jellyfin.Api.Models.StreamingDtos;
|
||||
using Jellyfin.Data.Enums;
|
||||
@@ -18,6 +19,7 @@ using MediaBrowser.Common.Configuration;
|
||||
using MediaBrowser.Controller.Configuration;
|
||||
using MediaBrowser.Controller.Library;
|
||||
using MediaBrowser.Controller.MediaEncoding;
|
||||
using MediaBrowser.Controller.Streaming;
|
||||
using MediaBrowser.MediaEncoding.Encoder;
|
||||
using MediaBrowser.Model.Configuration;
|
||||
using MediaBrowser.Model.Dlna;
|
||||
@@ -50,7 +52,7 @@ public class DynamicHlsController : BaseJellyfinApiController
|
||||
private readonly IServerConfigurationManager _serverConfigurationManager;
|
||||
private readonly IMediaEncoder _mediaEncoder;
|
||||
private readonly IFileSystem _fileSystem;
|
||||
private readonly TranscodingJobHelper _transcodingJobHelper;
|
||||
private readonly ITranscodeManager _transcodeManager;
|
||||
private readonly ILogger<DynamicHlsController> _logger;
|
||||
private readonly EncodingHelper _encodingHelper;
|
||||
private readonly IDynamicHlsPlaylistGenerator _dynamicHlsPlaylistGenerator;
|
||||
@@ -66,7 +68,7 @@ public class DynamicHlsController : BaseJellyfinApiController
|
||||
/// <param name="serverConfigurationManager">Instance of the <see cref="IServerConfigurationManager"/> interface.</param>
|
||||
/// <param name="mediaEncoder">Instance of the <see cref="IMediaEncoder"/> interface.</param>
|
||||
/// <param name="fileSystem">Instance of the <see cref="IFileSystem"/> interface.</param>
|
||||
/// <param name="transcodingJobHelper">Instance of the <see cref="TranscodingJobHelper"/> class.</param>
|
||||
/// <param name="transcodeManager">Instance of the <see cref="ITranscodeManager"/> interface.</param>
|
||||
/// <param name="logger">Instance of the <see cref="ILogger{DynamicHlsController}"/> interface.</param>
|
||||
/// <param name="dynamicHlsHelper">Instance of <see cref="DynamicHlsHelper"/>.</param>
|
||||
/// <param name="encodingHelper">Instance of <see cref="EncodingHelper"/>.</param>
|
||||
@@ -78,7 +80,7 @@ public class DynamicHlsController : BaseJellyfinApiController
|
||||
IServerConfigurationManager serverConfigurationManager,
|
||||
IMediaEncoder mediaEncoder,
|
||||
IFileSystem fileSystem,
|
||||
TranscodingJobHelper transcodingJobHelper,
|
||||
ITranscodeManager transcodeManager,
|
||||
ILogger<DynamicHlsController> logger,
|
||||
DynamicHlsHelper dynamicHlsHelper,
|
||||
EncodingHelper encodingHelper,
|
||||
@@ -90,7 +92,7 @@ public class DynamicHlsController : BaseJellyfinApiController
|
||||
_serverConfigurationManager = serverConfigurationManager;
|
||||
_mediaEncoder = mediaEncoder;
|
||||
_fileSystem = fileSystem;
|
||||
_transcodingJobHelper = transcodingJobHelper;
|
||||
_transcodeManager = transcodeManager;
|
||||
_logger = logger;
|
||||
_dynamicHlsHelper = dynamicHlsHelper;
|
||||
_encodingHelper = encodingHelper;
|
||||
@@ -282,7 +284,7 @@ public class DynamicHlsController : BaseJellyfinApiController
|
||||
_serverConfigurationManager,
|
||||
_mediaEncoder,
|
||||
_encodingHelper,
|
||||
_transcodingJobHelper,
|
||||
_transcodeManager,
|
||||
TranscodingJobType,
|
||||
cancellationToken)
|
||||
.ConfigureAwait(false);
|
||||
@@ -292,7 +294,7 @@ public class DynamicHlsController : BaseJellyfinApiController
|
||||
|
||||
if (!System.IO.File.Exists(playlistPath))
|
||||
{
|
||||
var transcodingLock = _transcodingJobHelper.GetTranscodingLock(playlistPath);
|
||||
var transcodingLock = _transcodeManager.GetTranscodingLock(playlistPath);
|
||||
await transcodingLock.WaitAsync(cancellationToken).ConfigureAwait(false);
|
||||
try
|
||||
{
|
||||
@@ -301,11 +303,11 @@ public class DynamicHlsController : BaseJellyfinApiController
|
||||
// If the playlist doesn't already exist, startup ffmpeg
|
||||
try
|
||||
{
|
||||
job = await _transcodingJobHelper.StartFfMpeg(
|
||||
job = await _transcodeManager.StartFfMpeg(
|
||||
state,
|
||||
playlistPath,
|
||||
GetCommandLineArguments(playlistPath, state, true, 0),
|
||||
Request,
|
||||
Request.HttpContext.User.GetUserId(),
|
||||
TranscodingJobType,
|
||||
cancellationTokenSource)
|
||||
.ConfigureAwait(false);
|
||||
@@ -330,11 +332,11 @@ public class DynamicHlsController : BaseJellyfinApiController
|
||||
}
|
||||
}
|
||||
|
||||
job ??= _transcodingJobHelper.OnTranscodeBeginRequest(playlistPath, TranscodingJobType);
|
||||
job ??= _transcodeManager.OnTranscodeBeginRequest(playlistPath, TranscodingJobType);
|
||||
|
||||
if (job is not null)
|
||||
{
|
||||
_transcodingJobHelper.OnTranscodeEndRequest(job);
|
||||
_transcodeManager.OnTranscodeEndRequest(job);
|
||||
}
|
||||
|
||||
var playlistText = HlsHelpers.GetLivePlaylistText(playlistPath, state);
|
||||
@@ -1382,7 +1384,7 @@ public class DynamicHlsController : BaseJellyfinApiController
|
||||
_serverConfigurationManager,
|
||||
_mediaEncoder,
|
||||
_encodingHelper,
|
||||
_transcodingJobHelper,
|
||||
_transcodeManager,
|
||||
TranscodingJobType,
|
||||
cancellationTokenSource.Token)
|
||||
.ConfigureAwait(false);
|
||||
@@ -1420,7 +1422,7 @@ public class DynamicHlsController : BaseJellyfinApiController
|
||||
_serverConfigurationManager,
|
||||
_mediaEncoder,
|
||||
_encodingHelper,
|
||||
_transcodingJobHelper,
|
||||
_transcodeManager,
|
||||
TranscodingJobType,
|
||||
cancellationToken)
|
||||
.ConfigureAwait(false);
|
||||
@@ -1435,12 +1437,12 @@ public class DynamicHlsController : BaseJellyfinApiController
|
||||
|
||||
if (System.IO.File.Exists(segmentPath))
|
||||
{
|
||||
job = _transcodingJobHelper.OnTranscodeBeginRequest(playlistPath, TranscodingJobType);
|
||||
job = _transcodeManager.OnTranscodeBeginRequest(playlistPath, TranscodingJobType);
|
||||
_logger.LogDebug("returning {0} [it exists, try 1]", segmentPath);
|
||||
return await GetSegmentResult(state, playlistPath, segmentPath, segmentExtension, segmentId, job, cancellationToken).ConfigureAwait(false);
|
||||
}
|
||||
|
||||
var transcodingLock = _transcodingJobHelper.GetTranscodingLock(playlistPath);
|
||||
var transcodingLock = _transcodeManager.GetTranscodingLock(playlistPath);
|
||||
await transcodingLock.WaitAsync(cancellationToken).ConfigureAwait(false);
|
||||
var released = false;
|
||||
var startTranscoding = false;
|
||||
@@ -1449,7 +1451,7 @@ public class DynamicHlsController : BaseJellyfinApiController
|
||||
{
|
||||
if (System.IO.File.Exists(segmentPath))
|
||||
{
|
||||
job = _transcodingJobHelper.OnTranscodeBeginRequest(playlistPath, TranscodingJobType);
|
||||
job = _transcodeManager.OnTranscodeBeginRequest(playlistPath, TranscodingJobType);
|
||||
transcodingLock.Release();
|
||||
released = true;
|
||||
_logger.LogDebug("returning {0} [it exists, try 2]", segmentPath);
|
||||
@@ -1487,7 +1489,7 @@ public class DynamicHlsController : BaseJellyfinApiController
|
||||
// If the playlist doesn't already exist, startup ffmpeg
|
||||
try
|
||||
{
|
||||
await _transcodingJobHelper.KillTranscodingJobs(streamingRequest.DeviceId, streamingRequest.PlaySessionId, p => false)
|
||||
await _transcodeManager.KillTranscodingJobs(streamingRequest.DeviceId, streamingRequest.PlaySessionId, p => false)
|
||||
.ConfigureAwait(false);
|
||||
|
||||
if (currentTranscodingIndex.HasValue)
|
||||
@@ -1498,11 +1500,11 @@ public class DynamicHlsController : BaseJellyfinApiController
|
||||
streamingRequest.StartTimeTicks = streamingRequest.CurrentRuntimeTicks;
|
||||
|
||||
state.WaitForPath = segmentPath;
|
||||
job = await _transcodingJobHelper.StartFfMpeg(
|
||||
job = await _transcodeManager.StartFfMpeg(
|
||||
state,
|
||||
playlistPath,
|
||||
GetCommandLineArguments(playlistPath, state, false, segmentId),
|
||||
Request,
|
||||
Request.HttpContext.User.GetUserId(),
|
||||
TranscodingJobType,
|
||||
cancellationTokenSource).ConfigureAwait(false);
|
||||
}
|
||||
@@ -1516,7 +1518,7 @@ public class DynamicHlsController : BaseJellyfinApiController
|
||||
}
|
||||
else
|
||||
{
|
||||
job = _transcodingJobHelper.OnTranscodeBeginRequest(playlistPath, TranscodingJobType);
|
||||
job = _transcodeManager.OnTranscodeBeginRequest(playlistPath, TranscodingJobType);
|
||||
if (job?.TranscodingThrottler is not null)
|
||||
{
|
||||
await job.TranscodingThrottler.UnpauseTranscoding().ConfigureAwait(false);
|
||||
@@ -1533,7 +1535,7 @@ public class DynamicHlsController : BaseJellyfinApiController
|
||||
}
|
||||
|
||||
_logger.LogDebug("returning {0} [general case]", segmentPath);
|
||||
job ??= _transcodingJobHelper.OnTranscodeBeginRequest(playlistPath, TranscodingJobType);
|
||||
job ??= _transcodeManager.OnTranscodeBeginRequest(playlistPath, TranscodingJobType);
|
||||
return await GetSegmentResult(state, playlistPath, segmentPath, segmentExtension, segmentId, job, cancellationToken).ConfigureAwait(false);
|
||||
}
|
||||
|
||||
@@ -2000,7 +2002,7 @@ public class DynamicHlsController : BaseJellyfinApiController
|
||||
if (transcodingJob is not null)
|
||||
{
|
||||
transcodingJob.DownloadPositionTicks = Math.Max(transcodingJob.DownloadPositionTicks ?? segmentEndingPositionTicks, segmentEndingPositionTicks);
|
||||
_transcodingJobHelper.OnTranscodeEndRequest(transcodingJob);
|
||||
_transcodeManager.OnTranscodeEndRequest(transcodingJob);
|
||||
}
|
||||
|
||||
return Task.CompletedTask;
|
||||
@@ -2011,7 +2013,7 @@ public class DynamicHlsController : BaseJellyfinApiController
|
||||
|
||||
private int? GetCurrentTranscodingIndex(string playlist, string segmentExtension)
|
||||
{
|
||||
var job = _transcodingJobHelper.GetTranscodingJob(playlist, TranscodingJobType);
|
||||
var job = _transcodeManager.GetTranscodingJob(playlist, TranscodingJobType);
|
||||
|
||||
if (job is null || job.HasExited)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user