ChannelScan.cs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Globalization;
  4. using System.IO;
  5. using System.Linq;
  6. using System.Threading;
  7. using System.Threading.Tasks;
  8. using IniParser;
  9. using IniParser.Model;
  10. using MediaBrowser.Controller.LiveTv;
  11. using MediaBrowser.Model.LiveTv;
  12. using MediaBrowser.Model.Logging;
  13. using MediaBrowser.Server.Implementations.LiveTv.TunerHosts.SatIp.Rtsp;
  14. namespace MediaBrowser.Server.Implementations.LiveTv.TunerHosts.SatIp
  15. {
  16. public class ChannelScan
  17. {
  18. private readonly ILogger _logger;
  19. public ChannelScan(ILogger logger)
  20. {
  21. _logger = logger;
  22. }
  23. public async Task<List<ChannelInfo>> Scan(TunerHostInfo info, CancellationToken cancellationToken)
  24. {
  25. var timedToken = new CancellationTokenSource(TimeSpan.FromSeconds(30));
  26. var linkedToken = CancellationTokenSource.CreateLinkedTokenSource(timedToken.Token, cancellationToken);
  27. using (var rtspSession = new RtspSession(info.Url, _logger))
  28. {
  29. var ini = info.SourceA.Split('|')[1];
  30. var resource = GetType().Assembly.GetManifestResourceNames().FirstOrDefault(i => i.EndsWith(ini, StringComparison.OrdinalIgnoreCase));
  31. _logger.Info("Opening ini file {0}", resource);
  32. using (var stream = GetType().Assembly.GetManifestResourceStream(resource))
  33. {
  34. using (var reader = new StreamReader(stream))
  35. {
  36. var parser = new StreamIniDataParser();
  37. var data = parser.ReadData(reader);
  38. var count = GetInt(data, "DVB", "0", 0);
  39. var index = 1;
  40. var source = "1";
  41. while (!linkedToken.IsCancellationRequested)
  42. {
  43. float percent = count == 0 ? 0 : (float)(index) / count;
  44. percent = Math.Max(percent * 100, 100);
  45. //SetControlPropertyThreadSafe(pgbSearchResult, "Value", (int)percent);
  46. var strArray = data["DVB"][index.ToString(CultureInfo.InvariantCulture)].Split(',');
  47. string tuning;
  48. if (strArray[4] == "S2")
  49. {
  50. 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());
  51. }
  52. else
  53. {
  54. 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());
  55. }
  56. if (string.IsNullOrEmpty(rtspSession.RtspSessionId))
  57. {
  58. rtspSession.Setup(tuning, "unicast");
  59. rtspSession.Play(string.Empty);
  60. }
  61. else
  62. {
  63. rtspSession.Play(tuning);
  64. }
  65. int signallevel;
  66. int signalQuality;
  67. rtspSession.Describe(out signallevel, out signalQuality);
  68. await Task.Delay(500).ConfigureAwait(false);
  69. index++;
  70. }
  71. }
  72. }
  73. }
  74. return new List<ChannelInfo>();
  75. }
  76. private int GetInt(IniData data, string s1, string s2, int defaultValue)
  77. {
  78. var value = data[s1][s2];
  79. int numericValue;
  80. if (int.TryParse(value, NumberStyles.Any, CultureInfo.InvariantCulture, out numericValue))
  81. {
  82. return numericValue;
  83. }
  84. return defaultValue;
  85. }
  86. }
  87. public class SatChannel
  88. {
  89. // TODO: Add properties
  90. }
  91. }