|
@@ -1,15 +1,104 @@
|
|
|
-using System.Collections.Generic;
|
|
|
+using System;
|
|
|
+using System.Collections.Generic;
|
|
|
+using System.Globalization;
|
|
|
+using System.IO;
|
|
|
+using System.Linq;
|
|
|
using System.Threading;
|
|
|
using System.Threading.Tasks;
|
|
|
+using IniParser;
|
|
|
+using IniParser.Model;
|
|
|
+using MediaBrowser.Controller.LiveTv;
|
|
|
using MediaBrowser.Model.LiveTv;
|
|
|
+using MediaBrowser.Model.Logging;
|
|
|
+using MediaBrowser.Server.Implementations.LiveTv.TunerHosts.SatIp.Rtsp;
|
|
|
|
|
|
namespace MediaBrowser.Server.Implementations.LiveTv.TunerHosts.SatIp
|
|
|
{
|
|
|
public class ChannelScan
|
|
|
{
|
|
|
- public async Task<List<SatChannel>> Scan(TunerHostInfo info, CancellationToken cancellationToken)
|
|
|
+ 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)
|
|
|
{
|
|
|
- return new List<SatChannel>();
|
|
|
+ var value = data[s1][s2];
|
|
|
+ int numericValue;
|
|
|
+ if (int.TryParse(value, NumberStyles.Any, CultureInfo.InvariantCulture, out numericValue))
|
|
|
+ {
|
|
|
+ return numericValue;
|
|
|
+ }
|
|
|
+
|
|
|
+ return defaultValue;
|
|
|
}
|
|
|
}
|
|
|
|