|
|
|
@ -36,7 +36,6 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
|
|
|
|
|
private readonly IHttpClientFactory _httpClientFactory;
|
|
|
|
|
private readonly IServerApplicationHost _appHost;
|
|
|
|
|
private readonly ISocketFactory _socketFactory;
|
|
|
|
|
private readonly INetworkManager _networkManager;
|
|
|
|
|
private readonly IStreamHelper _streamHelper;
|
|
|
|
|
|
|
|
|
|
private readonly JsonSerializerOptions _jsonOptions;
|
|
|
|
@ -50,7 +49,6 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
|
|
|
|
|
IHttpClientFactory httpClientFactory,
|
|
|
|
|
IServerApplicationHost appHost,
|
|
|
|
|
ISocketFactory socketFactory,
|
|
|
|
|
INetworkManager networkManager,
|
|
|
|
|
IStreamHelper streamHelper,
|
|
|
|
|
IMemoryCache memoryCache)
|
|
|
|
|
: base(config, logger, fileSystem, memoryCache)
|
|
|
|
@ -58,7 +56,6 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
|
|
|
|
|
_httpClientFactory = httpClientFactory;
|
|
|
|
|
_appHost = appHost;
|
|
|
|
|
_socketFactory = socketFactory;
|
|
|
|
|
_networkManager = networkManager;
|
|
|
|
|
_streamHelper = streamHelper;
|
|
|
|
|
|
|
|
|
|
_jsonOptions = JsonDefaults.Options;
|
|
|
|
@ -70,7 +67,7 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
|
|
|
|
|
|
|
|
|
|
protected override string ChannelIdPrefix => "hdhr_";
|
|
|
|
|
|
|
|
|
|
private string GetChannelId(TunerHostInfo info, Channels i)
|
|
|
|
|
private string GetChannelId(Channels i)
|
|
|
|
|
=> ChannelIdPrefix + i.GuideNumber;
|
|
|
|
|
|
|
|
|
|
internal async Task<List<Channels>> GetLineup(TunerHostInfo info, CancellationToken cancellationToken)
|
|
|
|
@ -103,7 +100,7 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
|
|
|
|
|
{
|
|
|
|
|
Name = i.GuideName,
|
|
|
|
|
Number = i.GuideNumber,
|
|
|
|
|
Id = GetChannelId(tuner, i),
|
|
|
|
|
Id = GetChannelId(i),
|
|
|
|
|
IsFavorite = i.Favorite,
|
|
|
|
|
TunerHostId = tuner.Id,
|
|
|
|
|
IsHD = i.HD,
|
|
|
|
@ -255,7 +252,7 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
|
|
|
|
|
{
|
|
|
|
|
var model = await GetModelInfo(info, false, cancellationToken).ConfigureAwait(false);
|
|
|
|
|
|
|
|
|
|
var tuners = new List<LiveTvTunerInfo>();
|
|
|
|
|
var tuners = new List<LiveTvTunerInfo>(model.TunerCount);
|
|
|
|
|
|
|
|
|
|
var uri = new Uri(GetApiUrl(info));
|
|
|
|
|
|
|
|
|
@ -264,10 +261,10 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
|
|
|
|
|
// Legacy HdHomeruns are IPv4 only
|
|
|
|
|
var ipInfo = IPAddress.Parse(uri.Host);
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < model.TunerCount; ++i)
|
|
|
|
|
for (int i = 0; i < model.TunerCount; i++)
|
|
|
|
|
{
|
|
|
|
|
var name = string.Format(CultureInfo.InvariantCulture, "Tuner {0}", i + 1);
|
|
|
|
|
var currentChannel = "none"; // @todo Get current channel and map back to Station Id
|
|
|
|
|
var currentChannel = "none"; // TODO: Get current channel and map back to Station Id
|
|
|
|
|
var isAvailable = await manager.CheckTunerAvailability(ipInfo, i, cancellationToken).ConfigureAwait(false);
|
|
|
|
|
var status = isAvailable ? LiveTvTunerStatus.Available : LiveTvTunerStatus.LiveTv;
|
|
|
|
|
tuners.Add(new LiveTvTunerInfo
|
|
|
|
@ -455,28 +452,28 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
|
|
|
|
|
Path = url,
|
|
|
|
|
Protocol = MediaProtocol.Udp,
|
|
|
|
|
MediaStreams = new List<MediaStream>
|
|
|
|
|
{
|
|
|
|
|
new MediaStream
|
|
|
|
|
{
|
|
|
|
|
Type = MediaStreamType.Video,
|
|
|
|
|
// Set the index to -1 because we don't know the exact index of the video stream within the container
|
|
|
|
|
Index = -1,
|
|
|
|
|
IsInterlaced = isInterlaced,
|
|
|
|
|
Codec = videoCodec,
|
|
|
|
|
Width = width,
|
|
|
|
|
Height = height,
|
|
|
|
|
BitRate = videoBitrate,
|
|
|
|
|
NalLengthSize = nal
|
|
|
|
|
},
|
|
|
|
|
new MediaStream
|
|
|
|
|
{
|
|
|
|
|
Type = MediaStreamType.Audio,
|
|
|
|
|
// Set the index to -1 because we don't know the exact index of the audio stream within the container
|
|
|
|
|
Index = -1,
|
|
|
|
|
Codec = audioCodec,
|
|
|
|
|
BitRate = audioBitrate
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
new MediaStream
|
|
|
|
|
{
|
|
|
|
|
Type = MediaStreamType.Video,
|
|
|
|
|
// Set the index to -1 because we don't know the exact index of the video stream within the container
|
|
|
|
|
Index = -1,
|
|
|
|
|
IsInterlaced = isInterlaced,
|
|
|
|
|
Codec = videoCodec,
|
|
|
|
|
Width = width,
|
|
|
|
|
Height = height,
|
|
|
|
|
BitRate = videoBitrate,
|
|
|
|
|
NalLengthSize = nal
|
|
|
|
|
},
|
|
|
|
|
new MediaStream
|
|
|
|
|
{
|
|
|
|
|
Type = MediaStreamType.Audio,
|
|
|
|
|
// Set the index to -1 because we don't know the exact index of the audio stream within the container
|
|
|
|
|
Index = -1,
|
|
|
|
|
Codec = audioCodec,
|
|
|
|
|
BitRate = audioBitrate
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
RequiresOpening = true,
|
|
|
|
|
RequiresClosing = true,
|
|
|
|
|
BufferMs = 0,
|
|
|
|
@ -551,7 +548,7 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var profile = streamId.Split('_')[0];
|
|
|
|
|
var profile = streamId.AsSpan().LeftPart('_').ToString();
|
|
|
|
|
|
|
|
|
|
Logger.LogInformation("GetChannelStream: channel id: {0}. stream id: {1} profile: {2}", channel.Id, streamId, profile);
|
|
|
|
|
|
|
|
|
|