mirror of https://github.com/jellyfin/jellyfin.git
Move GetRecordingStreamMediaSources to IMediaSourceManager
This commit is contained in:
parent
2f1b7d0988
commit
051fa04a80
|
@ -11,14 +11,15 @@ using System.Linq;
|
||||||
using System.Text.Json;
|
using System.Text.Json;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using EasyCaching.Core.Configurations;
|
|
||||||
using Jellyfin.Data.Entities;
|
using Jellyfin.Data.Entities;
|
||||||
using Jellyfin.Data.Enums;
|
using Jellyfin.Data.Enums;
|
||||||
using Jellyfin.Extensions.Json;
|
using Jellyfin.Extensions.Json;
|
||||||
using MediaBrowser.Common.Configuration;
|
using MediaBrowser.Common.Configuration;
|
||||||
using MediaBrowser.Common.Extensions;
|
using MediaBrowser.Common.Extensions;
|
||||||
|
using MediaBrowser.Controller;
|
||||||
using MediaBrowser.Controller.Entities;
|
using MediaBrowser.Controller.Entities;
|
||||||
using MediaBrowser.Controller.Library;
|
using MediaBrowser.Controller.Library;
|
||||||
|
using MediaBrowser.Controller.LiveTv;
|
||||||
using MediaBrowser.Controller.MediaEncoding;
|
using MediaBrowser.Controller.MediaEncoding;
|
||||||
using MediaBrowser.Controller.Persistence;
|
using MediaBrowser.Controller.Persistence;
|
||||||
using MediaBrowser.Controller.Providers;
|
using MediaBrowser.Controller.Providers;
|
||||||
|
@ -37,6 +38,7 @@ namespace Emby.Server.Implementations.Library
|
||||||
// Do not use a pipe here because Roku http requests to the server will fail, without any explicit error message.
|
// Do not use a pipe here because Roku http requests to the server will fail, without any explicit error message.
|
||||||
private const char LiveStreamIdDelimeter = '_';
|
private const char LiveStreamIdDelimeter = '_';
|
||||||
|
|
||||||
|
private readonly IServerApplicationHost _appHost;
|
||||||
private readonly IItemRepository _itemRepo;
|
private readonly IItemRepository _itemRepo;
|
||||||
private readonly IUserManager _userManager;
|
private readonly IUserManager _userManager;
|
||||||
private readonly ILibraryManager _libraryManager;
|
private readonly ILibraryManager _libraryManager;
|
||||||
|
@ -55,6 +57,7 @@ namespace Emby.Server.Implementations.Library
|
||||||
private IMediaSourceProvider[] _providers;
|
private IMediaSourceProvider[] _providers;
|
||||||
|
|
||||||
public MediaSourceManager(
|
public MediaSourceManager(
|
||||||
|
IServerApplicationHost appHost,
|
||||||
IItemRepository itemRepo,
|
IItemRepository itemRepo,
|
||||||
IApplicationPaths applicationPaths,
|
IApplicationPaths applicationPaths,
|
||||||
ILocalizationManager localizationManager,
|
ILocalizationManager localizationManager,
|
||||||
|
@ -66,6 +69,7 @@ namespace Emby.Server.Implementations.Library
|
||||||
IMediaEncoder mediaEncoder,
|
IMediaEncoder mediaEncoder,
|
||||||
IDirectoryService directoryService)
|
IDirectoryService directoryService)
|
||||||
{
|
{
|
||||||
|
_appHost = appHost;
|
||||||
_itemRepo = itemRepo;
|
_itemRepo = itemRepo;
|
||||||
_userManager = userManager;
|
_userManager = userManager;
|
||||||
_libraryManager = libraryManager;
|
_libraryManager = libraryManager;
|
||||||
|
@ -799,6 +803,35 @@ namespace Emby.Server.Implementations.Library
|
||||||
return result.Item1;
|
return result.Item1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async Task<List<MediaSourceInfo>> GetRecordingStreamMediaSources(ActiveRecordingInfo info, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
var stream = new MediaSourceInfo
|
||||||
|
{
|
||||||
|
EncoderPath = _appHost.GetApiUrlForLocalAccess() + "/LiveTv/LiveRecordings/" + info.Id + "/stream",
|
||||||
|
EncoderProtocol = MediaProtocol.Http,
|
||||||
|
Path = info.Path,
|
||||||
|
Protocol = MediaProtocol.File,
|
||||||
|
Id = info.Id,
|
||||||
|
SupportsDirectPlay = false,
|
||||||
|
SupportsDirectStream = true,
|
||||||
|
SupportsTranscoding = true,
|
||||||
|
IsInfiniteStream = true,
|
||||||
|
RequiresOpening = false,
|
||||||
|
RequiresClosing = false,
|
||||||
|
BufferMs = 0,
|
||||||
|
IgnoreDts = true,
|
||||||
|
IgnoreIndex = true
|
||||||
|
};
|
||||||
|
|
||||||
|
await new LiveStreamHelper(_mediaEncoder, _logger, _appPaths)
|
||||||
|
.AddMediaInfoWithProbe(stream, false, false, cancellationToken).ConfigureAwait(false);
|
||||||
|
|
||||||
|
return new List<MediaSourceInfo>
|
||||||
|
{
|
||||||
|
stream
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
public async Task CloseLiveStream(string id)
|
public async Task CloseLiveStream(string id)
|
||||||
{
|
{
|
||||||
ArgumentException.ThrowIfNullOrEmpty(id);
|
ArgumentException.ThrowIfNullOrEmpty(id);
|
||||||
|
|
|
@ -47,7 +47,6 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
|
||||||
|
|
||||||
private const int TunerDiscoveryDurationMs = 3000;
|
private const int TunerDiscoveryDurationMs = 3000;
|
||||||
|
|
||||||
private readonly IServerApplicationHost _appHost;
|
|
||||||
private readonly ILogger<EmbyTV> _logger;
|
private readonly ILogger<EmbyTV> _logger;
|
||||||
private readonly IHttpClientFactory _httpClientFactory;
|
private readonly IHttpClientFactory _httpClientFactory;
|
||||||
private readonly IServerConfigurationManager _config;
|
private readonly IServerConfigurationManager _config;
|
||||||
|
@ -76,7 +75,6 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
|
||||||
private bool _disposed;
|
private bool _disposed;
|
||||||
|
|
||||||
public EmbyTV(
|
public EmbyTV(
|
||||||
IServerApplicationHost appHost,
|
|
||||||
IStreamHelper streamHelper,
|
IStreamHelper streamHelper,
|
||||||
IMediaSourceManager mediaSourceManager,
|
IMediaSourceManager mediaSourceManager,
|
||||||
ILogger<EmbyTV> logger,
|
ILogger<EmbyTV> logger,
|
||||||
|
@ -91,7 +89,6 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
|
||||||
{
|
{
|
||||||
Current = this;
|
Current = this;
|
||||||
|
|
||||||
_appHost = appHost;
|
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
_httpClientFactory = httpClientFactory;
|
_httpClientFactory = httpClientFactory;
|
||||||
_config = config;
|
_config = config;
|
||||||
|
@ -1021,35 +1018,6 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<List<MediaSourceInfo>> GetRecordingStreamMediaSources(ActiveRecordingInfo info, CancellationToken cancellationToken)
|
|
||||||
{
|
|
||||||
var stream = new MediaSourceInfo
|
|
||||||
{
|
|
||||||
EncoderPath = _appHost.GetApiUrlForLocalAccess() + "/LiveTv/LiveRecordings/" + info.Id + "/stream",
|
|
||||||
EncoderProtocol = MediaProtocol.Http,
|
|
||||||
Path = info.Path,
|
|
||||||
Protocol = MediaProtocol.File,
|
|
||||||
Id = info.Id,
|
|
||||||
SupportsDirectPlay = false,
|
|
||||||
SupportsDirectStream = true,
|
|
||||||
SupportsTranscoding = true,
|
|
||||||
IsInfiniteStream = true,
|
|
||||||
RequiresOpening = false,
|
|
||||||
RequiresClosing = false,
|
|
||||||
BufferMs = 0,
|
|
||||||
IgnoreDts = true,
|
|
||||||
IgnoreIndex = true
|
|
||||||
};
|
|
||||||
|
|
||||||
await new LiveStreamHelper(_mediaEncoder, _logger, _config.CommonApplicationPaths)
|
|
||||||
.AddMediaInfoWithProbe(stream, false, false, cancellationToken).ConfigureAwait(false);
|
|
||||||
|
|
||||||
return new List<MediaSourceInfo>
|
|
||||||
{
|
|
||||||
stream
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task CloseLiveStream(string id, CancellationToken cancellationToken)
|
public Task CloseLiveStream(string id, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
|
|
|
@ -61,7 +61,7 @@ namespace Emby.Server.Implementations.LiveTv
|
||||||
{
|
{
|
||||||
if (activeRecordingInfo is not null)
|
if (activeRecordingInfo is not null)
|
||||||
{
|
{
|
||||||
sources = await EmbyTV.EmbyTV.Current.GetRecordingStreamMediaSources(activeRecordingInfo, cancellationToken)
|
sources = await _mediaSourceManager.GetRecordingStreamMediaSources(activeRecordingInfo, cancellationToken)
|
||||||
.ConfigureAwait(false);
|
.ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
|
@ -8,6 +8,7 @@ using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Jellyfin.Data.Entities;
|
using Jellyfin.Data.Entities;
|
||||||
using MediaBrowser.Controller.Entities;
|
using MediaBrowser.Controller.Entities;
|
||||||
|
using MediaBrowser.Controller.LiveTv;
|
||||||
using MediaBrowser.Controller.Persistence;
|
using MediaBrowser.Controller.Persistence;
|
||||||
using MediaBrowser.Model.Dto;
|
using MediaBrowser.Model.Dto;
|
||||||
using MediaBrowser.Model.Entities;
|
using MediaBrowser.Model.Entities;
|
||||||
|
@ -116,6 +117,14 @@ namespace MediaBrowser.Controller.Library
|
||||||
/// <returns>An instance of <see cref="ILiveStream"/>.</returns>
|
/// <returns>An instance of <see cref="ILiveStream"/>.</returns>
|
||||||
public ILiveStream GetLiveStreamInfoByUniqueId(string uniqueId);
|
public ILiveStream GetLiveStreamInfoByUniqueId(string uniqueId);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the media sources for an active recording.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="info">The <see cref="ActiveRecordingInfo"/>.</param>
|
||||||
|
/// <param name="cancellationToken">The <see cref="CancellationToken"/>.</param>
|
||||||
|
/// <returns>A task containing the <see cref="MediaSourceInfo"/>'s for the recording.</returns>
|
||||||
|
Task<List<MediaSourceInfo>> GetRecordingStreamMediaSources(ActiveRecordingInfo info, CancellationToken cancellationToken);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Closes the media source.
|
/// Closes the media source.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
Loading…
Reference in New Issue