jellyfin/MediaBrowser.Server.Implementations/LiveTv/TunerHosts/SatIp/ChannelScan.cs

110 lines
4.2 KiB
C#
Raw Normal View History

2016-03-31 23:26:13 +00:00
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
2016-03-31 19:32:26 +00:00
using System.Threading;
using System.Threading.Tasks;
2016-03-31 23:26:13 +00:00
using IniParser;
using IniParser.Model;
using MediaBrowser.Controller.LiveTv;
2016-03-31 19:32:26 +00:00
using MediaBrowser.Model.LiveTv;
2016-03-31 23:26:13 +00:00
using MediaBrowser.Model.Logging;
using MediaBrowser.Server.Implementations.LiveTv.TunerHosts.SatIp.Rtsp;
2016-03-31 19:32:26 +00:00
namespace MediaBrowser.Server.Implementations.LiveTv.TunerHosts.SatIp
{
public class ChannelScan
{
2016-03-31 23:26:13 +00:00
private readonly ILogger _logger;
public ChannelScan(ILogger logger)
{
_logger = logger;
}
public async Task<List<ChannelInfo>> Scan(TunerHostInfo info, CancellationToken cancellationToken)
{
var timedToken = new CancellationTokenSource(TimeSpan.FromSeconds(30));
var linkedToken = CancellationTokenSource.CreateLinkedTokenSource(timedToken.Token, cancellationToken);
using (var rtspSession = new RtspSession(info.Url, _logger))
{
var ini = info.SourceA.Split('|')[1];
var resource = GetType().Assembly.GetManifestResourceNames().FirstOrDefault(i => i.EndsWith(ini, StringComparison.OrdinalIgnoreCase));
_logger.Info("Opening ini file {0}", resource);
using (var stream = GetType().Assembly.GetManifestResourceStream(resource))
{
using (var reader = new StreamReader(stream))
{
var parser = new StreamIniDataParser();
var data = parser.ReadData(reader);
var count = GetInt(data, "DVB", "0", 0);
var index = 1;
var source = "1";
while (!linkedToken.IsCancellationRequested)
{
float percent = count == 0 ? 0 : (float)(index) / count;
percent = Math.Max(percent * 100, 100);
//SetControlPropertyThreadSafe(pgbSearchResult, "Value", (int)percent);
var strArray = data["DVB"][index.ToString(CultureInfo.InvariantCulture)].Split(',');
string tuning;
if (strArray[4] == "S2")
{
tuning = string.Format("src={0}&freq={1}&pol={2}&sr={3}&fec={4}&msys=dvbs2&mtype={5}&plts=on&ro=0.35&pids=0,16,17,18,20", source, strArray[0], strArray[1].ToLower(), strArray[2].ToLower(), strArray[3], strArray[5].ToLower());
}
else
{
tuning = string.Format("src={0}&freq={1}&pol={2}&sr={3}&fec={4}&msys=dvbs&mtype={5}&pids=0,16,17,18,20", source, strArray[0], strArray[1].ToLower(), strArray[2], strArray[3], strArray[5].ToLower());
}
if (string.IsNullOrEmpty(rtspSession.RtspSessionId))
{
rtspSession.Setup(tuning, "unicast");
rtspSession.Play(string.Empty);
}
else
{
rtspSession.Play(tuning);
}
int signallevel;
int signalQuality;
rtspSession.Describe(out signallevel, out signalQuality);
await Task.Delay(500).ConfigureAwait(false);
index++;
}
}
}
}
return new List<ChannelInfo>();
}
private int GetInt(IniData data, string s1, string s2, int defaultValue)
2016-03-31 19:32:26 +00:00
{
2016-03-31 23:26:13 +00:00
var value = data[s1][s2];
int numericValue;
if (int.TryParse(value, NumberStyles.Any, CultureInfo.InvariantCulture, out numericValue))
{
return numericValue;
}
return defaultValue;
2016-03-31 19:32:26 +00:00
}
}
public class SatChannel
{
// TODO: Add properties
}
}