From 03f194bd34aef4f47852fe39204a8fa88a784685 Mon Sep 17 00:00:00 2001 From: Fey Date: Mon, 6 Apr 2026 16:42:27 +0200 Subject: [PATCH] Added options for SAT>IP Multicast Playout and building a date-ordered TS list to CSV. --- skyscraper8/Program.cs | 1912 +++++++++-------- skyscraper8/Properties/launchSettings.json | 2 +- skyscraper8/QuickAndDirtySatIpClient.cs | 532 ++--- skyscraper8/SatIp/RtspClient.cs | 11 +- .../SatIp/RtspRequests/RtspSetupRequest.cs | 120 +- .../RemoteStreamReaderTunerFactory.cs | 2 +- skyscraper8/Skyscraper/TsRotationToCsv.cs | 112 + 7 files changed, 1419 insertions(+), 1272 deletions(-) create mode 100644 skyscraper8/Skyscraper/TsRotationToCsv.cs diff --git a/skyscraper8/Program.cs b/skyscraper8/Program.cs index 9ea9c0a..2fed178 100644 --- a/skyscraper8/Program.cs +++ b/skyscraper8/Program.cs @@ -1,958 +1,966 @@ -using log4net; -using skyscraper5.Abertis; -using skyscraper5.Hdmv; -using skyscraper5.Mpeg2; -using skyscraper5.Scorcher; -using skyscraper5.Skyscraper; -using skyscraper5.Skyscraper.Gps; -using skyscraper5.Skyscraper.IO; -using skyscraper5.Skyscraper.IO.CrazycatStreamReader; -using skyscraper5.Skyscraper.IO.TunerInterface; -using skyscraper5.Skyscraper.Plugins; -using skyscraper5.Skyscraper.RecordingImporter; -using skyscraper5.Skyscraper.Scraper; -using skyscraper5.Skyscraper.Scraper.Storage.Filesystem; -using skyscraper5.Skyscraper.Scraper.Storage.InMemory; -using skyscraper5.Skyscraper.Webserver; -using skyscraper5.src.Aac; -using skyscraper5.src.Mpeg2.PacketFilter; -using skyscraper5.T2MI; -using skyscraper8.Skyscraper.IO; -using skyscraper8.Skyscraper.Scraper.Storage; -using System.Diagnostics; -using System.Net; -using System.Net.NetworkInformation; -using System.Net.Sockets; -using System.Runtime.InteropServices; -using skyscraper5.Dvb.DataBroadcasting; -using skyscraper8; -using skyscraper8.GSE; -using skyscraper8.Skyscraper.Math; -using skyscraper8.Skyscraper; -using skyscraper8.Skyscraper.Security.AccessControl; - -[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config")] -namespace skyscraper5 -{ - class Program - { - private static readonly ILog logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name); - - private static void IntegrationTest() - { - //SoftcamTestProgram softcamTestProgram = new SoftcamTestProgram(); - //softcamTestProgram.Run(); - - /*List ssdpDevices = SsdpClient.GetSsdpDevices(1000).ToList(); - foreach (SsdpDevice ssdpDevice in ssdpDevices) - { - Console.WriteLine("SSDP device: {0}", ssdpDevice.Server); - }*/ - - //"urn:ses-com:device:SatIPServer:1" - /*PluginManager pluginManager = PluginManager.GetInstance(); - StorageConnectionManager storageConnectionManager = StorageConnectionManager.GetInstance(); - ObjectStorageFactory objectStorageFactory = storageConnectionManager.GetDefaultObjectStorageFactory(); - ObjectStorage objectStorage = objectStorageFactory.CreateObjectStorage();*/ - - /*url = RtspClient.MakeUrl(DiSEqC_Opcode.DISEQC_OPTION_A | DiSEqC_Opcode.DISEQC_POSITION_A | DiSEqC_Opcode.DISEQC_HORIZONTAL, 11141, true, 23500); - describe = rtspClient.GetDescribe(url); - sessionDescriptionProtocol = describe.GetSessionDescriptionProtocol(); - - rtcps = 0; - rtps = 0; - - setup = rtspClient.GetSetup(url); - setup.OnRtcpPacket += ((data, length) => - rtcps++); - setup.OnRtpPacket += (data, length) => - rtps++; - - play = rtspClient.GetPlay(setup); - - Thread.Sleep(5000); - - rtspClient.AutoReconnect = false; - rtspClient.GetTeardown(setup); - Console.WriteLine("{0} RTCPs", rtcps); - Console.WriteLine("{0} RTPs", rtps);*/ - //rtspClient.Dispose(); - } - - static void Main(string[] args) - { - IntegrationTest(); - - logger.InfoFormat(String.Format("Hello! This is skyscraper8, public release #{0}, code version {1}", VersionInfo.GetPublicReleaseNumber(), VersionInfo.GetCurrentAssemblyDisplayVersion())); - - logger.DebugFormat("Found {0}-bit Operating system.", Environment.Is64BitOperatingSystem ? 64 : 32); - logger.DebugFormat("I'm a {0}-bit Process.", Environment.Is64BitProcess ? 64 : 32); - - PluginManager.GetInstance(); - SoftcamKeyset.GetInstance().AutoInitalize(); - - if (args.Length != 0) - { - if (args[0].ToLowerInvariant().EndsWith(".ts")) - { - FileInfo fi = new FileInfo(args[0]); - if (fi.Exists) - HandleSingleFile(fi); - else - Console.WriteLine("{0} missing.", fi.FullName); - return; - } - - if (args[0].ToLowerInvariant().EndsWith(".m3u8")) - { - M3U8Stream m3U8Stream = new M3U8Stream(args[0]); - SkyscraperContext skyscraperContext = new SkyscraperContext(new TsContext()); - skyscraperContext.InitalizeFilterChain(); - skyscraperContext.IngestFromStream(m3U8Stream); - return; - } - - if (args[0].ToLowerInvariant().Equals("bumutest")) - { - FileInfo fi = new FileInfo(args[1]); - FileStream fstream = fi.OpenRead(); - - TsContext mpeg2 = new TsContext(); - SkyscraperContext skyscraper = new SkyscraperContext(mpeg2, new InMemoryScraperStorage(), new NullObjectStorage()); - skyscraper.InitalizeFilterChain(); - - MultiprotocolEncapsulationDecoder mpeDecoder = new MultiprotocolEncapsulationDecoder(skyscraper); - PsiDecoder psiDecoder = new PsiDecoder(0x1019, mpeDecoder); - mpeg2.RegisterPacketProcessor(0x1019, psiDecoder); - - skyscraper.IngestFromStream(fstream); - } - if (args[0].Equals("aactest")) - { - new AacTestProgram().Run(); - return; - } - if (args[0].ToLowerInvariant().Equals("cscan")) - { - HandleCrazyScanToTestingSystem(args[1]); - return; - } - if (args[0].ToLowerInvariant().Equals("cscan-live")) - { - HandleCrazyScanToLiveSystem(args[1]); - return; - } - if (args[0].ToLowerInvariant().Equals("cscan-live-notimeout")) - { - HandleCrazyScanToLiveSystem(args[1], false); - return; - } - - if (args[0].ToLowerInvariant().Equals("udpin")) - { - HandleUdpTesting(); - return; - } - if (args[0].ToLowerInvariant().Equals("udp-agent")) - { - HandleUdpLive(); - return; - } - - if (args[0].Equals("abertest")) - { - FileInfo fi = new FileInfo(args[1]); - if (!fi.Exists) - { - Console.WriteLine("{0} not found", fi.FullName); - return; - } - AbertisDemoProgram abertisDemo = new AbertisDemoProgram(fi); - abertisDemo.Run(); - return; - } - - if (args[0].ToLowerInvariant().Equals("t2mitest")) - { - new TestApp(args[1]).Run(); - return; - } - - if (args[0].ToLowerInvariant().Equals("ioctltest")) - { - IoctlTest(); - return; - } - - if (args[0].ToLowerInvariant().Equals("m2tstots")) - { - FileInfo infile = new FileInfo(args[1]); - FileInfo outfile = new FileInfo(args[2]); - new M2TsToTs(infile,outfile).Run(); - return; - } - - if (Directory.Exists(args[0])) - { - DirectoryInfo doThisDir = new DirectoryInfo(args[0]); - ProcessDirectory(doThisDir); - return; - } - - if (args[0].ToLowerInvariant().Equals("proxytest")) - { - TcpTsProxy tcpTsProxy = new TcpTsProxy(); - Thread.Sleep(5000); - tcpTsProxy.Dispose(); - return; - } - - if (args[0].ToLowerInvariant().Equals("importtest")) - { - DirectoryInfo doThisDir = new DirectoryInfo(args[1]); - InMemoryScraperStorage imss = new InMemoryScraperStorage(); - FilesystemStorage fs = new FilesystemStorage(new DirectoryInfo(".")); - TsFileCollectionImporter importer = new TsFileCollectionImporter(imss, fs, doThisDir); - importer.Run(); - return; - } - - - //fsimport "D:\Skyscraper" "E:\\" - if (args[0].ToLowerInvariant().Equals("fsimport")) - { - DirectoryInfo srcDir = new DirectoryInfo(args[1]); - DirectoryInfo tgtDir = new DirectoryInfo(args[2]); - FilesystemStorage fss = new FilesystemStorage(tgtDir); - TsFileCollectionImporter importer = new TsFileCollectionImporter(fss, fss, srcDir); - importer.Run(); - return; - } - - if (args[0].ToLowerInvariant().Equals("webservertest")) - { - SkyscraperWebserver webserverTest = SkyscraperWebserver.GetInstance(); - webserverTest.Start(); - while (webserverTest.IsListening) - { - Thread.Sleep(1000); - } - - return; - } - - if (args[0].ToLowerInvariant().Equals("gpstest")) - { - GpsManager.GpsTest(); - return; - } - - if (args[0].ToLowerInvariant().Equals("what-can-i-receive")) - { - WhatCanIReceive.StandaloneProgram(); - return; - } - - if (args[0].ToLowerInvariant().Equals("make-dummy-ts")) - { - DummyTsGenerator dummyTsGenerator = new DummyTsGenerator(); - dummyTsGenerator.Run(); - return; - } - - if (args[0].ToLowerInvariant().Equals("file-live")) - { - Program.HandleFileToLiveSystem(args[1]); - return; - } - - if (args[0].ToLowerInvariant().Equals("hlsproxy")) - { - DirectoryInfo di = new DirectoryInfo(args[1]); - HlsProxy hlsproxy = new HlsProxy(di); - hlsproxy.Run(); - return; - } - - if (args[0].ToLowerInvariant().Equals("hlsproxy-destructive")) - { - DirectoryInfo di = new DirectoryInfo(args[1]); - HlsProxy hlsproxy = new HlsProxy(di); - hlsproxy.DestructiveMode = true; - hlsproxy.Run(); - return; - } - - if (args[0].ToLowerInvariant().Equals("satip")) - { - QuickAndDirtySatIpClient qadsipc = new QuickAndDirtySatIpClient(args); - qadsipc.Run(); - return; +using log4net; +using skyscraper5.Abertis; +using skyscraper5.Hdmv; +using skyscraper5.Mpeg2; +using skyscraper5.Scorcher; +using skyscraper5.Skyscraper; +using skyscraper5.Skyscraper.Gps; +using skyscraper5.Skyscraper.IO; +using skyscraper5.Skyscraper.IO.CrazycatStreamReader; +using skyscraper5.Skyscraper.IO.TunerInterface; +using skyscraper5.Skyscraper.Plugins; +using skyscraper5.Skyscraper.RecordingImporter; +using skyscraper5.Skyscraper.Scraper; +using skyscraper5.Skyscraper.Scraper.Storage.Filesystem; +using skyscraper5.Skyscraper.Scraper.Storage.InMemory; +using skyscraper5.Skyscraper.Webserver; +using skyscraper5.src.Aac; +using skyscraper5.src.Mpeg2.PacketFilter; +using skyscraper5.T2MI; +using skyscraper8.Skyscraper.IO; +using skyscraper8.Skyscraper.Scraper.Storage; +using System.Diagnostics; +using System.Net; +using System.Net.NetworkInformation; +using System.Net.Sockets; +using System.Runtime.InteropServices; +using skyscraper5.Dvb.DataBroadcasting; +using skyscraper8; +using skyscraper8.GSE; +using skyscraper8.Skyscraper.Math; +using skyscraper8.Skyscraper; +using skyscraper8.Skyscraper.Security.AccessControl; + +[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config")] +namespace skyscraper5 +{ + class Program + { + private static readonly ILog logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name); + + private static void IntegrationTest() + { + //SoftcamTestProgram softcamTestProgram = new SoftcamTestProgram(); + //softcamTestProgram.Run(); + + /*List ssdpDevices = SsdpClient.GetSsdpDevices(1000).ToList(); + foreach (SsdpDevice ssdpDevice in ssdpDevices) + { + Console.WriteLine("SSDP device: {0}", ssdpDevice.Server); + }*/ + + //"urn:ses-com:device:SatIPServer:1" + /*PluginManager pluginManager = PluginManager.GetInstance(); + StorageConnectionManager storageConnectionManager = StorageConnectionManager.GetInstance(); + ObjectStorageFactory objectStorageFactory = storageConnectionManager.GetDefaultObjectStorageFactory(); + ObjectStorage objectStorage = objectStorageFactory.CreateObjectStorage();*/ + + /*url = RtspClient.MakeUrl(DiSEqC_Opcode.DISEQC_OPTION_A | DiSEqC_Opcode.DISEQC_POSITION_A | DiSEqC_Opcode.DISEQC_HORIZONTAL, 11141, true, 23500); + describe = rtspClient.GetDescribe(url); + sessionDescriptionProtocol = describe.GetSessionDescriptionProtocol(); + + rtcps = 0; + rtps = 0; + + setup = rtspClient.GetSetup(url); + setup.OnRtcpPacket += ((data, length) => + rtcps++); + setup.OnRtpPacket += (data, length) => + rtps++; + + play = rtspClient.GetPlay(setup); + + Thread.Sleep(5000); + + rtspClient.AutoReconnect = false; + rtspClient.GetTeardown(setup); + Console.WriteLine("{0} RTCPs", rtcps); + Console.WriteLine("{0} RTPs", rtps);*/ + //rtspClient.Dispose(); + } + + static void Main(string[] args) + { + IntegrationTest(); + + logger.InfoFormat(String.Format("Hello! This is skyscraper8, public release #{0}, code version {1}", VersionInfo.GetPublicReleaseNumber(), VersionInfo.GetCurrentAssemblyDisplayVersion())); + + logger.DebugFormat("Found {0}-bit Operating system.", Environment.Is64BitOperatingSystem ? 64 : 32); + logger.DebugFormat("I'm a {0}-bit Process.", Environment.Is64BitProcess ? 64 : 32); + + PluginManager.GetInstance(); + //SoftcamKeyset.GetInstance().AutoInitalize(); + + if (args.Length != 0) + { + if (args[0].ToLowerInvariant().EndsWith(".ts")) + { + FileInfo fi = new FileInfo(args[0]); + if (fi.Exists) + HandleSingleFile(fi); + else + Console.WriteLine("{0} missing.", fi.FullName); + return; } - if (args[0].ToLowerInvariant().Equals("satip-playout")) + if (args[0].ToLowerInvariant().EndsWith(".m3u8")) + { + M3U8Stream m3U8Stream = new M3U8Stream(args[0]); + SkyscraperContext skyscraperContext = new SkyscraperContext(new TsContext()); + skyscraperContext.InitalizeFilterChain(); + skyscraperContext.IngestFromStream(m3U8Stream); + return; + } + + if (args[0].ToLowerInvariant().Equals("bumutest")) + { + FileInfo fi = new FileInfo(args[1]); + FileStream fstream = fi.OpenRead(); + + TsContext mpeg2 = new TsContext(); + SkyscraperContext skyscraper = new SkyscraperContext(mpeg2, new InMemoryScraperStorage(), new NullObjectStorage()); + skyscraper.InitalizeFilterChain(); + + MultiprotocolEncapsulationDecoder mpeDecoder = new MultiprotocolEncapsulationDecoder(skyscraper); + PsiDecoder psiDecoder = new PsiDecoder(0x1019, mpeDecoder); + mpeg2.RegisterPacketProcessor(0x1019, psiDecoder); + + skyscraper.IngestFromStream(fstream); + } + if (args[0].Equals("aactest")) + { + new AacTestProgram().Run(); + return; + } + if (args[0].ToLowerInvariant().Equals("cscan")) + { + HandleCrazyScanToTestingSystem(args[1]); + return; + } + if (args[0].ToLowerInvariant().Equals("cscan-live")) + { + HandleCrazyScanToLiveSystem(args[1]); + return; + } + if (args[0].ToLowerInvariant().Equals("cscan-live-notimeout")) + { + HandleCrazyScanToLiveSystem(args[1], false); + return; + } + + if (args[0].ToLowerInvariant().Equals("udpin")) + { + HandleUdpTesting(); + return; + } + if (args[0].ToLowerInvariant().Equals("udp-agent")) + { + HandleUdpLive(); + return; + } + + if (args[0].Equals("abertest")) + { + FileInfo fi = new FileInfo(args[1]); + if (!fi.Exists) + { + Console.WriteLine("{0} not found", fi.FullName); + return; + } + AbertisDemoProgram abertisDemo = new AbertisDemoProgram(fi); + abertisDemo.Run(); + return; + } + + if (args[0].ToLowerInvariant().Equals("t2mitest")) + { + new TestApp(args[1]).Run(); + return; + } + + if (args[0].ToLowerInvariant().Equals("ioctltest")) + { + IoctlTest(); + return; + } + + if (args[0].ToLowerInvariant().Equals("m2tstots")) + { + FileInfo infile = new FileInfo(args[1]); + FileInfo outfile = new FileInfo(args[2]); + new M2TsToTs(infile,outfile).Run(); + return; + } + + if (Directory.Exists(args[0])) + { + DirectoryInfo doThisDir = new DirectoryInfo(args[0]); + ProcessDirectory(doThisDir); + return; + } + + if (args[0].ToLowerInvariant().Equals("proxytest")) + { + TcpTsProxy tcpTsProxy = new TcpTsProxy(); + Thread.Sleep(5000); + tcpTsProxy.Dispose(); + return; + } + + if (args[0].ToLowerInvariant().Equals("importtest")) + { + DirectoryInfo doThisDir = new DirectoryInfo(args[1]); + InMemoryScraperStorage imss = new InMemoryScraperStorage(); + FilesystemStorage fs = new FilesystemStorage(new DirectoryInfo(".")); + TsFileCollectionImporter importer = new TsFileCollectionImporter(imss, fs, doThisDir); + importer.Run(); + return; + } + + + //fsimport "D:\Skyscraper" "E:\\" + if (args[0].ToLowerInvariant().Equals("fsimport")) + { + DirectoryInfo srcDir = new DirectoryInfo(args[1]); + DirectoryInfo tgtDir = new DirectoryInfo(args[2]); + FilesystemStorage fss = new FilesystemStorage(tgtDir); + TsFileCollectionImporter importer = new TsFileCollectionImporter(fss, fss, srcDir); + importer.Run(); + return; + } + + if (args[0].ToLowerInvariant().Equals("webservertest")) + { + SkyscraperWebserver webserverTest = SkyscraperWebserver.GetInstance(); + webserverTest.Start(); + while (webserverTest.IsListening) + { + Thread.Sleep(1000); + } + + return; + } + + if (args[0].ToLowerInvariant().Equals("gpstest")) + { + GpsManager.GpsTest(); + return; + } + + if (args[0].ToLowerInvariant().Equals("what-can-i-receive")) + { + WhatCanIReceive.StandaloneProgram(); + return; + } + + if (args[0].ToLowerInvariant().Equals("make-dummy-ts")) + { + DummyTsGenerator dummyTsGenerator = new DummyTsGenerator(); + dummyTsGenerator.Run(); + return; + } + + if (args[0].ToLowerInvariant().Equals("file-live")) + { + Program.HandleFileToLiveSystem(args[1]); + return; + } + + if (args[0].ToLowerInvariant().Equals("hlsproxy")) + { + DirectoryInfo di = new DirectoryInfo(args[1]); + HlsProxy hlsproxy = new HlsProxy(di); + hlsproxy.Run(); + return; + } + + if (args[0].ToLowerInvariant().Equals("hlsproxy-destructive")) + { + DirectoryInfo di = new DirectoryInfo(args[1]); + HlsProxy hlsproxy = new HlsProxy(di); + hlsproxy.DestructiveMode = true; + hlsproxy.Run(); + return; + } + + if (args[0].ToLowerInvariant().Equals("satip")) + { + QuickAndDirtySatIpClient qadsipc = new QuickAndDirtySatIpClient(args); + qadsipc.Run(); + return; + } + + if (args[0].ToLowerInvariant().Equals("satip-playout")) { QuickAndDirtySatIpClient qadsipc = new QuickAndDirtySatIpClient(args); qadsipc.SetPlayoutMode(args); qadsipc.Run(); - return; - } - - - if (args[0].ToLowerInvariant().Equals("shannon")) - { - if (args.Length != 2) - { - Console.WriteLine("Specify ONE file, please."); - return; - } - FileInfo fi = new FileInfo(args[1]); - if (!fi.Exists) - { - Console.WriteLine("{0} doesn't exist.", fi.FullName); - return; - } - FileStream fileStream = fi.OpenRead(); - EntropyCalculatorStream entropyCalculatorStream = new EntropyCalculatorStream(); - fileStream.CopyTo(entropyCalculatorStream); - fileStream.Close(); - fileStream.Dispose(); - Console.WriteLine("Entropy value: {0} ({1}%)", entropyCalculatorStream.Entropy, entropyCalculatorStream.Percentage); - return; - } - - if (args[0].ToLowerInvariant().Equals("pcap-on")) - { - TogglePcapConfiguration(1); - return; - } - if (args[0].ToLowerInvariant().Equals("pcap-off")) - { - TogglePcapConfiguration(2); - return; - } - - if (args[0].ToLowerInvariant().Equals("subts-on")) - { - ToggleSubTsDumpConfiguration(true); - return; - } - - if (args[0].ToLowerInvariant().Equals("subts-off")) - { - ToggleSubTsDumpConfiguration(false); - return; - } - - if (args[0].ToLowerInvariant().Equals("pts2bbf")) - { - if (args[1].ToLowerInvariant().Equals("bbfudpdecap")) - { - FileInfo fi = new FileInfo(args[2]); - Pts2Bbf.Run(fi, true); - return; - } - else - { - FileInfo fi = new FileInfo(args[1]); - Pts2Bbf.Run(fi, false); - return; - } - } - - if (args[0].ToLowerInvariant().Equals("pts2bbf2")) - { - FileInfo fi = new FileInfo(args[1]); - Pts2Bbf2 pts2Bbf2 = new Pts2Bbf2(fi); - pts2Bbf2.Run(); - return; - } - - if (args[0].ToLowerInvariant().Equals("stid135test")) - { - FileInfo fi = new FileInfo(args[1]); - Stid135Test.Run(fi); - return; - } - - if (args[0].ToLowerInvariant().Equals("make-catalogue")) - { - DirectoryInfo di = new DirectoryInfo(args[1]); - logger.InfoFormat("Input directory: {0}", di.FullName); - FileInfo fi = new FileInfo(args[2]); - logger.InfoFormat("Output File: {0}", fi.FullName); - CatalogueGenerator catalogueGenerator = new CatalogueGenerator(di, fi); - catalogueGenerator.Run(); - catalogueGenerator.Dispose(); - return; - } - } - - /*Passing passing = new Passing(); - if (!passing.Boot()) - { - Environment.Exit(1); - return; - } - passing.Run();*/ - Console.WriteLine("You're not supposed to run me directly. Run me from the commandline using the following:"); - Console.WriteLine("for example: .\\skyscraper8.exe cscan tcp://127.0.0.1:6969"); - Console.WriteLine(" or: .\\skyscraper8.exe udpin - listens on port 9003 on all local interface for udp packets."); - Console.WriteLine(" or: .\\skyscraper8.exe \"C:\\path\\to\\file.ts\\"); - Console.WriteLine(" or: .\\skyscraper8.exe \"C:\\path\\to\\my\\folder\\with\\ts\\files\\\" (for batch extraction)"); - Console.WriteLine(" or: .\\skyscraper8.exe satip IP_ADDRESS DISEQC POLARITY FREQUENCY SYSTEM SYMBOL_RATE (see README file)"); - Console.WriteLine(" or: .\\skyscraper8.exe satip-playout IP_ADDRESS DISEQC POLARITY FREQUENCY SYSTEM SYMBOL_RATE DESTINATION_PORT"); - Console.WriteLine(" or: .\\skyscraper8.exe pcap-on - to write a configuration file that allows PCAP writing during scraping."); - Console.WriteLine(" or: .\\skyscraper8.exe pcap-off - to write a configuration file that turns off PCAP writing during scraping."); - Console.WriteLine(" or: .\\skyscraper8.exe subts-on - to write a configuration file that allows extraction of nested TS."); - Console.WriteLine(" or: .\\skyscraper8.exe subts-off - to write a configuration file that turns off extraction of nested TS."); - Console.WriteLine(); - Console.WriteLine("default behaviour is pcap writing and nested TS writing on."); - Console.WriteLine(); - Console.WriteLine("Bonus features:"); - Console.WriteLine(".\\skyscraper8.exe hlsproxy \"C:\\path\\to\\hls\\files\\\" - to pipe a HLS stream from a local directory into VLC."); - Console.WriteLine(".\\skyscraper8.exe hlsproxy-destructive \"C:\\path\\to\\hls\\files\\\" - to pipe a HLS stream from a local directory into VLC and delete HLS segments afterwards. (be careful!)"); - Console.WriteLine(".\\skyscraper8.exe shannon \"C:\\some\\file.bmp\" - calculates the Shannon entropy value for any given file."); - Console.WriteLine(".\\skyscraper8.exe make-catalogue \"C:\\path\\to\\ts\\collection\\\" \"C:\\outputted_index.csv\" - generates a catalogue with core information about your TS files."); - Console.WriteLine(".\\skyscraper8.exe pts2bbf2 \"C:\\path\\to\\file.ts\\\" - extracts every single BBFrame from a GS to into a small file for each. (be careful, might generate many small files!)"); - } - - private static void ToggleSubTsDumpConfiguration(bool enabled) - { - PluginManager pluginManager = PluginManager.GetInstance(); - if (!pluginManager.Ini.ContainsKey("subts")) - pluginManager.Ini.Add("subts", new IniSection()); - - pluginManager.Ini["subts"]["dump"] = enabled ? "1" : "0"; - pluginManager.SaveConfiguration(); - - Console.WriteLine("Wrote skyscraper5.ini."); - } - - private static void TogglePcapConfiguration(int value) - { - PluginManager pluginManager = PluginManager.GetInstance(); - if (!pluginManager.Ini.ContainsKey("ip_handler")) - pluginManager.Ini.Add("ip_handler", new IniSection()); - - pluginManager.Ini["ip_handler"]["type"] = value.ToString(); - pluginManager.SaveConfiguration(); - - Console.WriteLine("Wrote skyscraper5.ini."); - } - private static void ProcessDirectory(DirectoryInfo di) - { - DataStorage dataStorage = new InMemoryScraperStorage(); - FilesystemStorage filesystemStorage = new FilesystemStorage(new DirectoryInfo(".")); - ProcessDirectory(di, dataStorage, filesystemStorage); - } - - private static void ProcessDirectory(DirectoryInfo di, DataStorage dataStorage, ObjectStorage objectStorage) - { - DirectoryInfo[] directoryInfos = di.GetDirectories(); - foreach (DirectoryInfo subdir in directoryInfos) - { - ProcessDirectory(subdir, dataStorage, objectStorage); - } - FileInfo[] fileInfos = di.GetFiles("*.ts"); - foreach (FileInfo fileInfo in fileInfos) - { - Console.WriteLine(new string('_', Console.WindowWidth - 1)); - Console.WriteLine("Processing: {0}", fileInfo.Name); - SkyscraperContext skyscraper = new SkyscraperContext(new TsContext(), dataStorage, objectStorage); - skyscraper.InitalizeFilterChain(); - //StreamTypeAutodetectionTest streamTypeAutodetectionTest = new StreamTypeAutodetectionTest(); - FileStream fileStream = fileInfo.OpenRead(); - - Stopwatch stopwatch = new Stopwatch(); - stopwatch.Start(); - skyscraper.IngestFromStream(fileStream); - //streamTypeAutodetectionTest.IngestFromStream(fileStream); - stopwatch.Stop(); - - Console.WriteLine("Time to process: " + stopwatch.Elapsed.TotalSeconds); - - Console.WriteLine("File was: {0}", fileInfo.Name); - PrintPidStatistics(skyscraper); - } - } - - private static void PrintPidStatistics(SkyscraperContext skyscraper) - { - Console.WriteLine("Unattached PIDs:"); - ulong[] pidStatistics = skyscraper.DvbContext.GetPidStatistics(); - if (pidStatistics == null) - return; - for (int i = 0; i < pidStatistics.Length; i++) - { - if (pidStatistics[i] != 0) - { - if (!skyscraper.DvbContext.IsPidProcessorPresent(i)) - { - Console.WriteLine("{0:X4}", i); - } - } - } - } - - private static void HandleUdpTesting() - { - DataStorage data = new InMemoryScraperStorage(); - ObjectStorage objects = new FilesystemStorage(new DirectoryInfo(".")); - HandleUdpInput(data,objects); - } - - private static void HandleUdpLive() - { - StorageConnectionManager connectionManager = StorageConnectionManager.GetInstance(); - DataStorageFactory dataFactory = connectionManager.GetDefaultDataStorageFactory(); - ObjectStorageFactory objectFactory = connectionManager.GetDefaultObjectStorageFactory(); - DataStorage dataStorage = dataFactory.CreateDataStorage(); - ObjectStorage objectStorage; - if (objectFactory.IsEquivalent(dataFactory)) - objectStorage = (ObjectStorage)dataStorage; - else - objectStorage = objectFactory.CreateObjectStorage(); - HandleUdpInput(dataStorage,objectStorage); - } - - private static void HandleUdpInput(DataStorage dataStorage,ObjectStorage objectStorage) - { - NetworkInterface[] networkInterfaces = NetworkInterface.GetAllNetworkInterfaces(); - foreach (NetworkInterface networkInterface in networkInterfaces) - { - IPInterfaceProperties interfaceProperties = networkInterface.GetIPProperties(); - foreach (UnicastIPAddressInformation unicastAddress in interfaceProperties.UnicastAddresses) - { - Console.WriteLine("Listening on: {0}", unicastAddress.Address.ToString()); - } - } - - //tsp -v --control-port 9001 -I dvb --delivery-system DVB-S2 --frequency 11421000000 --symbol-rate 22000000 --polarity horizontal -O ip 127.0.0.1:9001 - //SkyscraperWebserver.GetInstance().Start(); - //scraperStorage = new FilesystemScraperStorage(new DirectoryInfo("C:\\scraped_data")); - - SkyscraperContext skyscraper = null; - - UdpClient udpServer = new UdpClient(new IPEndPoint(IPAddress.Any, 9003)); - IPEndPoint remote = null; - IPEndPoint oldRemote = null; - int numPackets; - byte[] singlePacket = new byte[188]; - while (true) - { - byte[] buffer = udpServer.Receive(ref remote); - if (!remote.Equals(oldRemote)) - { - oldRemote = remote; - skyscraper = new SkyscraperContext(new TsContext(), dataStorage,objectStorage); - skyscraper.InitalizeFilterChain(); - skyscraper.EnableTimeout = true; - logger.InfoFormat("Got zapped by {0}", remote); - } - - numPackets = buffer.Length / 188; - for (int i = 0; i < numPackets; i++) - { - Array.Copy(buffer, i * 188, singlePacket, 0, 188); - skyscraper.IngestSinglePacket(singlePacket); - } - } - } - - private static void HandleCrazyScanToTestingSystem(string url) - { - - DataStorage dataStorage = new InMemoryScraperStorage(); - ObjectStorage objectStorage = new FilesystemStorage(new DirectoryInfo(".")); - HandleCrazyScan(url, dataStorage, objectStorage, true); - } - - private static void HandleFileToLiveSystem(string filename) - { - StorageConnectionManager connectionManager = StorageConnectionManager.GetInstance(); - DataStorageFactory dataStorageFactory = connectionManager.GetDefaultDataStorageFactory(); - ObjectStorageFactory objectStorageFactory = connectionManager.GetDefaultObjectStorageFactory(); - DataStorage dataStorage = dataStorageFactory.CreateDataStorage(); - ObjectStorage objectStorage; - if (objectStorageFactory.IsEquivalent(dataStorageFactory)) - objectStorage = (ObjectStorage)dataStorage; - else - objectStorage = objectStorageFactory.CreateObjectStorage(); - - FileInfo fi = new FileInfo(filename); - if (!fi.Exists) - { - logger.FatalFormat("{0} not found.", fi.FullName); - return; - } - - SkyscraperContext skyscraper = new SkyscraperContext(new TsContext(), dataStorage,objectStorage); - skyscraper.InitalizeFilterChain(); - skyscraper.EnableTimeout = false; - skyscraper.TcpProxyEnabled = false; - FileStream fileStream = fi.OpenRead(); - skyscraper.IngestFromStream(fileStream); - fileStream.Close(); - fileStream.Dispose(); - skyscraper.Dispose(); - } - - private static void HandleCrazyScanToLiveSystem(string url, bool withTimeout = true) - { - StorageConnectionManager connectionManager = StorageConnectionManager.GetInstance(); - DataStorageFactory dataStorageFactory = connectionManager.GetDefaultDataStorageFactory(); - ObjectStorageFactory objectStorageFactory = connectionManager.GetDefaultObjectStorageFactory(); - DataStorage dataStorage = dataStorageFactory.CreateDataStorage(); - ObjectStorage objectStorage; - if (objectStorageFactory.IsEquivalent(dataStorageFactory)) - objectStorage = (ObjectStorage)dataStorage; - else - objectStorage = objectStorageFactory.CreateObjectStorage(); - - objectStorage.Ping(); - HandleCrazyScan(url, dataStorage,objectStorage, withTimeout); - } - - private static void HandleCrazyScan(string url, DataStorage dataStorage, ObjectStorage objectStorage, bool timeout) - { - if (!url.StartsWith("tcp://")) - { - logger.Fatal("Use TCP, please."); - return; - } - - if (url.EndsWith("/")) - { - logger.Fatal("Don't use that trailing slash, please."); - return; - } - - url = url.Substring(6); - string[] strings = url.Split(':'); - string hostname = strings[0]; - int port = Int32.Parse(strings[1]); - - TcpClient tcpClient = new TcpClient(hostname, port); - - SkyscraperContext skyscraper = new SkyscraperContext(new TsContext(), dataStorage,objectStorage); - skyscraper.InitalizeFilterChain(new SkipFilter(1024)); - //skyscraper.EnableTimeout = timeout; - //skyscraper.TimeoutSeconds = 10; - skyscraper.TcpProxyEnabled = true; - skyscraper.IngestFromStream(new BufferedStream(tcpClient.GetStream(), 96256 * 2)); - } - - private static void HandleSingleFile(FileInfo fi) - { - //Environment.CurrentDirectory = fi.Directory.FullName; - TsContext tsContext = new TsContext(); - DataStorage dataStorage = new InMemoryScraperStorage(); - ObjectStorage objectStorage = new FilesystemStorage(new DirectoryInfo(".")); - SkyscraperContext skyscraper = new SkyscraperContext(tsContext, dataStorage,objectStorage); - skyscraper.InitalizeFilterChain(); - FileStream fileStream = fi.OpenRead(); - skyscraper.IngestFromStream(fileStream); - skyscraper.Dispose(); - fileStream.Close(); - - Console.WriteLine(""); - Console.WriteLine("Current Network ID: {0}", skyscraper.CurrentNetworkId); - Console.WriteLine("Current Transport Stream ID: {0}", skyscraper.CurrentTransportStreamId); - if (tsContext.PcrMonitor != null) - { - Console.WriteLine("Processing Performance: {0}", tsContext.PcrMonitor.Performance); - } - else - { - Console.WriteLine("No PCR detected."); - } - Console.WriteLine("DNS Records found: {0}", dataStorage.DnsCountA()); - Console.WriteLine(""); - - Console.WriteLine(new string('-', Console.WindowWidth)); - Console.WriteLine(""); - Console.ReadKey(true); - } - - private static void IoctlTest() - { - /* - int dvbSatSearchLnb = LibDvbV5.DvbSatSearchLnb("EXTENDED"); - LibDvbV5SatLnb lnb = new LibDvbV5SatLnb(dvbSatSearchLnb); - - LibDvbV5Device device = new LibDvbV5Device(); - device.SetLog(8, null); - device.Find(); - - LibDvbV5DeviceList findDeviceByDeliverySystem = device.FindDeviceByDeliverySystem(LibDvbV5FrontendDeliverySystem.SYS_DVBC_ANNEX_A); - if (findDeviceByDeliverySystem == null) - return; - - LibDvbV5DeviceList demuxerName = device.GetSisterDevice(findDeviceByDeliverySystem, DvbDeviceType.Demux); - LibDvbV5DeviceList dvrName = device.GetSisterDevice(findDeviceByDeliverySystem, DvbDeviceType.Dvr); - - LibDvb5FrontendParameters frontend = findDeviceByDeliverySystem.ToFrontendParameters(); - frontend.SetDeliverySystem(LibDvbV5FrontendDeliverySystem.SYS_DVBC_ANNEX_A); - frontend.StoreParameter(17, (uint)LibDvbV5FrontendDeliverySystem.SYS_DVBC_ANNEX_A); - frontend.StoreParameter(3, 610000000); //freq - frontend.StoreParameter(8, 6900000); //symbol rate - frontend.SetParameters(); - Thread.Sleep(400); - frontend.GetStatistics(); - Thread.Sleep(400); - uint retrieveStats = frontend.RetrieveStats(512); - if ((retrieveStats & 0x10) != 0) - { - Console.WriteLine("got lock!"); - LibDvbV5OpenDescriptor dvrFd = device.DeviceOpen(dvrName); - if (dvrFd == null) - throw new IOException("open failed"); - dvrFd.SetBufferSize(1024 * 1024); - - LibDvbV5OpenDescriptor demuxFd = device.DeviceOpen(demuxerName); - if (demuxFd == null) - throw new IOException("open failed"); - - demuxFd.DemuxSetPesFilter(0x2000, DemuxerPesType.DMX_PES_OTHER); - - FileStream fileStream = File.OpenWrite(String.Format("{0}.ts", DateTime.Now.Ticks)); - byte[] packBuffer = new byte[188]; - int readLen = 0; - for (int i = 0; i < 9001; i++) - { - readLen = dvrFd.Read(packBuffer, 188); - if (readLen > 0) - { - fileStream.Write(packBuffer, 0, 188); - } - } - - fileStream.Flush(true); - fileStream.Close(); - demuxFd.Dispose(); - dvrFd.Dispose(); - } - else - { - Console.WriteLine("no lock :("); - } - frontend.Dispose(); - device.Dispose(); - Thread.Sleep(1000); - return;*/ - /*FileInfo fi = new FileInfo("/dev/video0"); - SafeUnixHandle safeUnixHandle = UnsafeLibCNativeMethodsWrappers.OpenDevice(fi); - UnsafeLibCNativeMethodsWrappers.GetCapability(safeUnixHandle); - UnsafeLibCNativeMethodsWrappers.Close(safeUnixHandle);*/ - - //LocalStreamReader streamReader = LocalStreamReader.GetInstance(); - IStreamReader streamReader = new NullStreamReader(); - - bool checkForDvb = streamReader.CheckForDVB(); - if (checkForDvb) - { - streamReader.CheckForDVBEx((x, y) => { Console.WriteLine("{0}, {1}", x, y); }); - if (streamReader.StartDvbEx(0)) - { - - STD_TYPE ttype = default; - bool result = streamReader.GetTunerType(ref ttype); - if (!result) - Console.WriteLine("oh no"); - - Caps caps = streamReader.GetCaps(); - - BlScanCallback scanCallback = - (ref SearchResult searchResult) => - { - Console.WriteLine("{0}/{1}/{2}",searchResult.Freq,searchResult.Pol,searchResult.SR); - }; - - /*UnsafeStreamReaderMethods.AirScanCallback airScanCallback = - (ref UnsafeStreamReaderMethods.SearchResult2 searchResult2) => - { - Console.WriteLine(searchResult2.Freq); - };*/ - AirScanCallback altTest = (ref SearchResult2 searchResult) => - { - Console.WriteLine(searchResult.Freq); - }; - - //int tpNum = 0; - //result = UnsafeStreamReaderMethods.BLScanEx(10744000, 8000, 1, 9750000, 10600000, 11700000, 1, UnsafeStreamReaderMethods.STD_TYPE.STD_DVBS2, ref sr1); - //result = UnsafeStreamReaderMethods.BLScan(10744000, 8000, 0, 9750000, 10600000, 11700000, 1000, ref sr1); - /*result = UnsafeStreamReaderMethods.SetChannelExEx(10744000, 22000000, 0, - UnsafeStreamReaderMethods.VITERBIRATE_TYPE.VR_5_6, 9750000, 10600000, 11700000, - UnsafeStreamReaderMethods.MOD_TYPE.MOD_QPSK, 0, 0, - UnsafeStreamReaderMethods.ROLLOFF_TYPE.ROLLOFF_AUTO);*/ - /* - result = UnsafeStreamReaderMethods.SendDiSEqC(2, - UnsafeStreamReaderMethods.DiSEqC_Opcode.DISEQC_HIGH_NIBBLE | - UnsafeStreamReaderMethods.DiSEqC_Opcode.DISEQC_LOW_BAND | - UnsafeStreamReaderMethods.DiSEqC_Opcode.DISEQC_HORIZONTAL | - UnsafeStreamReaderMethods.DiSEqC_Opcode.DISEQC_POSITION_B | - UnsafeStreamReaderMethods.DiSEqC_Opcode.DISEQC_OPTION_A); - result = UnsafeStreamReaderMethods.SetChannel(10775000, 29900000, 0, - UnsafeStreamReaderMethods.VITERBIRATE_TYPE.VR_3_5, 9750000, 10600000, 11700000); - - - for (int i = 0; i < 100; i++) - { - Thread.Sleep(1000); - } - */ - - - SearchResult2 sr1 = default; - SearchResult2 sr2 = default; - int tpNum = default; - IntPtr allocHGlobal = Marshal.AllocHGlobal(1024); - result = streamReader.AirScan(100000, 800000, 3000, 8000, (int)STD_TYPE.STD_DVBC, allocHGlobal, ref tpNum, altTest); - SearchResult2 ptrToStructure = (SearchResult2)Marshal.PtrToStructure(allocHGlobal, typeof(SearchResult2)); - Marshal.FreeHGlobal(allocHGlobal); - Console.WriteLine(tpNum); - - /* - byte[] buffer = new byte[1024]; - - int offset = 0; - FileStream fileStream = File.OpenWrite("tbs5580.bin"); - result = true; - while (result) - { - result = UnsafeStreamReaderMethods.GetEEPROM(buffer, offset, 8); - if (result) - { - fileStream.Write(buffer, 0, 8); - offset += 8; - } - } - - fileStream.Flush(true); - fileStream.Close(); - */ - - /* - * - double snr = default; - for (uint i = 100; i < 200; i++) - { - result = UnsafeStreamReaderMethods.RFScan2(i * 1000, UnsafeStreamReaderMethods.STD_TYPE.STD_DVBC, ref snr); - if (result) - Console.WriteLine("{0} -> {1}", i, snr); - } - - */ - /* - UnsafeStreamReaderMethods.SearchResult sr1 = default; - UnsafeStreamReaderMethods.SearchResult sr2 = default; - int tpNum = default; - result = UnsafeStreamReaderMethods.SetChannel(10744000, 22000000, 0, 0, 9750000, 10600000, 11700000); - ulong numPackets = 0; - IntPtr filterPtr = default; - byte[] buffer = new byte[188]; - FileStream fs = File.OpenWrite("test.ts"); - result = UnsafeStreamReaderMethods.SetFilter(8192, ((data, length) => - { - //Console.WriteLine("Packet {0}", numPackets++); - Marshal.Copy(data, buffer, 0, length); - fs.Write(buffer, 0, 188); - }), 0x02, 1, ref filterPtr); - - sbyte[] iq = new sbyte[200]; - for (int i = 0; i < 150; i++) - { - Thread.Sleep(100); - UnsafeStreamReaderMethods.IQScan(0, iq, 100); - Console.WriteLine("{0},{1} - {2},{3} - {4},{5} - {6},{7}", iq[0], iq[1], iq[2], iq[3], iq[4], iq[5], iq[6], iq[7]); - } - result = UnsafeStreamReaderMethods.DelFilter(filterPtr); - fs.Flush(true); - fs.Close(); - */ - //result = UnsafeStreamReaderMethods.BLScan(11068, 8000, 1, 975000, 10600000, 11700000, 1, ref sr); - - /* - for (int i = 10700; i < 12750; i += 3) - { - result = UnsafeStreamReaderMethods.BLScan(i, 0, 1, 975000, 10600000, 11700000, 1, ref sr1); - if (sr1.SR != 0) - { - Console.Write("\r\n{0}/{1}/{2}", i, sr1.Pol, sr1.SR); - } - else - { - Console.Write("."); - } - result = UnsafeStreamReaderMethods.BLScan(i, 0, 0, 975000, 10600000, 11700000, 1, ref sr1); - if (sr1.SR != 0) - { - Console.Write("\r\n{0}/{1}/{2}", i, sr1.Pol, sr1.SR); - } - else - { - Console.Write("."); - } - }*/ - - //result = UnsafeStreamReaderMethods.BLScan2(10700, 12750, 0, 975000, 10600000, 11700000, ref sr1, ref tpNum, scanCallback); - - /* - byte[] macBuffer = new byte[6]; - result = UnsafeStreamReaderMethods.GetMAC(macBuffer); - */ - /* - double m = default; - for (int i = 10700; i < 12750; i += 1) - { - result = UnsafeStreamReaderMethods.RFScan(i, 0, 975000, 10600000, 11700000, out m); - Console.WriteLine("{2} {0} -> {1}", i, m, result); - } - */ - - - /* - result = UnsafeStreamReaderMethods.SetChannel(10744000, 22000000, 0, 0, 9750000, 10600000, 11700000); - - if (File.Exists("test.ts")) - File.Delete("test.ts"); - - FileStream fileStream = File.OpenWrite("test.ts"); - IntPtr filterPtr = IntPtr.Zero; - byte[] packet = new byte[188]; - UnsafeStreamReaderMethods.StdcallDvbCallback callback = (bytes, k) => - { - Marshal.Copy(bytes, packet, 0, k); - fileStream.Write(packet, 0, 188); - }; - result = UnsafeStreamReaderMethods.SetFilter(8192, callback, 0x02, 1, ref filterPtr); - - if (!result) - throw new NotImplementedException("no filter"); - - IntPtr rcPtr = IntPtr.Zero; - result = UnsafeStreamReaderMethods.SetRemoteControl(0, -1, (bytes, k) => - { - Console.WriteLine(k); - }, - ref rcPtr); - - result = UnsafeStreamReaderMethods.DelFilter(rcPtr); - result = UnsafeStreamReaderMethods.DelFilter(filterPtr); - */ - - /* - if (!UnsafeStreamReaderMethods.StopDVB()) - Console.WriteLine("wtf"); - */ - /* - fileStream.Flush(true); - fileStream.Close(); - */ - } - } - - } - } -} + return; + } + + + if (args[0].ToLowerInvariant().Equals("shannon")) + { + if (args.Length != 2) + { + Console.WriteLine("Specify ONE file, please."); + return; + } + FileInfo fi = new FileInfo(args[1]); + if (!fi.Exists) + { + Console.WriteLine("{0} doesn't exist.", fi.FullName); + return; + } + FileStream fileStream = fi.OpenRead(); + EntropyCalculatorStream entropyCalculatorStream = new EntropyCalculatorStream(); + fileStream.CopyTo(entropyCalculatorStream); + fileStream.Close(); + fileStream.Dispose(); + Console.WriteLine("Entropy value: {0} ({1}%)", entropyCalculatorStream.Entropy, entropyCalculatorStream.Percentage); + return; + } + + if (args[0].ToLowerInvariant().Equals("pcap-on")) + { + TogglePcapConfiguration(1); + return; + } + if (args[0].ToLowerInvariant().Equals("pcap-off")) + { + TogglePcapConfiguration(2); + return; + } + + if (args[0].ToLowerInvariant().Equals("subts-on")) + { + ToggleSubTsDumpConfiguration(true); + return; + } + + if (args[0].ToLowerInvariant().Equals("subts-off")) + { + ToggleSubTsDumpConfiguration(false); + return; + } + + if (args[0].ToLowerInvariant().Equals("pts2bbf")) + { + if (args[1].ToLowerInvariant().Equals("bbfudpdecap")) + { + FileInfo fi = new FileInfo(args[2]); + Pts2Bbf.Run(fi, true); + return; + } + else + { + FileInfo fi = new FileInfo(args[1]); + Pts2Bbf.Run(fi, false); + return; + } + } + + if (args[0].ToLowerInvariant().Equals("pts2bbf2")) + { + FileInfo fi = new FileInfo(args[1]); + Pts2Bbf2 pts2Bbf2 = new Pts2Bbf2(fi); + pts2Bbf2.Run(); + return; + } + + if (args[0].ToLowerInvariant().Equals("stid135test")) + { + FileInfo fi = new FileInfo(args[1]); + Stid135Test.Run(fi); + return; + } + + if (args[0].ToLowerInvariant().Equals("make-catalogue")) + { + DirectoryInfo di = new DirectoryInfo(args[1]); + logger.InfoFormat("Input directory: {0}", di.FullName); + FileInfo fi = new FileInfo(args[2]); + logger.InfoFormat("Output File: {0}", fi.FullName); + CatalogueGenerator catalogueGenerator = new CatalogueGenerator(di, fi); + catalogueGenerator.Run(); + catalogueGenerator.Dispose(); + return; + } + if (args[0].ToLowerInvariant().Equals("rotation-catalogue")) + { + TsRotationToCsv rotator = new TsRotationToCsv(); + rotator.SourceDir = new DirectoryInfo(args[1]); + rotator.DestinationCsv = new FileInfo(args[2]); + rotator.Run(); + return; + } + } + + /*Passing passing = new Passing(); + if (!passing.Boot()) + { + Environment.Exit(1); + return; + } + passing.Run();*/ + Console.WriteLine("You're not supposed to run me directly. Run me from the commandline using the following:"); + Console.WriteLine("for example: .\\skyscraper8.exe cscan tcp://127.0.0.1:6969"); + Console.WriteLine(" or: .\\skyscraper8.exe udpin - listens on port 9003 on all local interface for udp packets."); + Console.WriteLine(" or: .\\skyscraper8.exe \"C:\\path\\to\\file.ts\\"); + Console.WriteLine(" or: .\\skyscraper8.exe \"C:\\path\\to\\my\\folder\\with\\ts\\files\\\" (for batch extraction)"); + Console.WriteLine(" or: .\\skyscraper8.exe satip IP_ADDRESS DISEQC POLARITY FREQUENCY SYSTEM SYMBOL_RATE (see README file)"); + Console.WriteLine(" or: .\\skyscraper8.exe satip-playout IP_ADDRESS DISEQC POLARITY FREQUENCY SYSTEM SYMBOL_RATE DESTINATION_PORT"); + Console.WriteLine(" or: .\\skyscraper8.exe pcap-on - to write a configuration file that allows PCAP writing during scraping."); + Console.WriteLine(" or: .\\skyscraper8.exe pcap-off - to write a configuration file that turns off PCAP writing during scraping."); + Console.WriteLine(" or: .\\skyscraper8.exe subts-on - to write a configuration file that allows extraction of nested TS."); + Console.WriteLine(" or: .\\skyscraper8.exe subts-off - to write a configuration file that turns off extraction of nested TS."); + Console.WriteLine(); + Console.WriteLine("default behaviour is pcap writing and nested TS writing on."); + Console.WriteLine(); + Console.WriteLine("Bonus features:"); + Console.WriteLine(".\\skyscraper8.exe hlsproxy \"C:\\path\\to\\hls\\files\\\" - to pipe a HLS stream from a local directory into VLC."); + Console.WriteLine(".\\skyscraper8.exe hlsproxy-destructive \"C:\\path\\to\\hls\\files\\\" - to pipe a HLS stream from a local directory into VLC and delete HLS segments afterwards. (be careful!)"); + Console.WriteLine(".\\skyscraper8.exe shannon \"C:\\some\\file.bmp\" - calculates the Shannon entropy value for any given file."); + Console.WriteLine(".\\skyscraper8.exe make-catalogue \"C:\\path\\to\\ts\\collection\\\" \"C:\\outputted_index.csv\" - generates a catalogue with core information about your TS files."); + Console.WriteLine(".\\skyscraper8.exe pts2bbf2 \"C:\\path\\to\\file.ts\\\" - extracts every single BBFrame from a GS to into a small file for each. (be careful, might generate many small files!)"); + } + + private static void ToggleSubTsDumpConfiguration(bool enabled) + { + PluginManager pluginManager = PluginManager.GetInstance(); + if (!pluginManager.Ini.ContainsKey("subts")) + pluginManager.Ini.Add("subts", new IniSection()); + + pluginManager.Ini["subts"]["dump"] = enabled ? "1" : "0"; + pluginManager.SaveConfiguration(); + + Console.WriteLine("Wrote skyscraper5.ini."); + } + + private static void TogglePcapConfiguration(int value) + { + PluginManager pluginManager = PluginManager.GetInstance(); + if (!pluginManager.Ini.ContainsKey("ip_handler")) + pluginManager.Ini.Add("ip_handler", new IniSection()); + + pluginManager.Ini["ip_handler"]["type"] = value.ToString(); + pluginManager.SaveConfiguration(); + + Console.WriteLine("Wrote skyscraper5.ini."); + } + private static void ProcessDirectory(DirectoryInfo di) + { + DataStorage dataStorage = new InMemoryScraperStorage(); + FilesystemStorage filesystemStorage = new FilesystemStorage(new DirectoryInfo(".")); + ProcessDirectory(di, dataStorage, filesystemStorage); + } + + private static void ProcessDirectory(DirectoryInfo di, DataStorage dataStorage, ObjectStorage objectStorage) + { + DirectoryInfo[] directoryInfos = di.GetDirectories(); + foreach (DirectoryInfo subdir in directoryInfos) + { + ProcessDirectory(subdir, dataStorage, objectStorage); + } + FileInfo[] fileInfos = di.GetFiles("*.ts"); + foreach (FileInfo fileInfo in fileInfos) + { + Console.WriteLine(new string('_', Console.WindowWidth - 1)); + Console.WriteLine("Processing: {0}", fileInfo.Name); + SkyscraperContext skyscraper = new SkyscraperContext(new TsContext(), dataStorage, objectStorage); + skyscraper.InitalizeFilterChain(); + //StreamTypeAutodetectionTest streamTypeAutodetectionTest = new StreamTypeAutodetectionTest(); + FileStream fileStream = fileInfo.OpenRead(); + + Stopwatch stopwatch = new Stopwatch(); + stopwatch.Start(); + skyscraper.IngestFromStream(fileStream); + //streamTypeAutodetectionTest.IngestFromStream(fileStream); + stopwatch.Stop(); + + Console.WriteLine("Time to process: " + stopwatch.Elapsed.TotalSeconds); + + Console.WriteLine("File was: {0}", fileInfo.Name); + PrintPidStatistics(skyscraper); + } + } + + private static void PrintPidStatistics(SkyscraperContext skyscraper) + { + Console.WriteLine("Unattached PIDs:"); + ulong[] pidStatistics = skyscraper.DvbContext.GetPidStatistics(); + if (pidStatistics == null) + return; + for (int i = 0; i < pidStatistics.Length; i++) + { + if (pidStatistics[i] != 0) + { + if (!skyscraper.DvbContext.IsPidProcessorPresent(i)) + { + Console.WriteLine("{0:X4}", i); + } + } + } + } + + private static void HandleUdpTesting() + { + DataStorage data = new InMemoryScraperStorage(); + ObjectStorage objects = new FilesystemStorage(new DirectoryInfo(".")); + HandleUdpInput(data,objects); + } + + private static void HandleUdpLive() + { + StorageConnectionManager connectionManager = StorageConnectionManager.GetInstance(); + DataStorageFactory dataFactory = connectionManager.GetDefaultDataStorageFactory(); + ObjectStorageFactory objectFactory = connectionManager.GetDefaultObjectStorageFactory(); + DataStorage dataStorage = dataFactory.CreateDataStorage(); + ObjectStorage objectStorage; + if (objectFactory.IsEquivalent(dataFactory)) + objectStorage = (ObjectStorage)dataStorage; + else + objectStorage = objectFactory.CreateObjectStorage(); + HandleUdpInput(dataStorage,objectStorage); + } + + private static void HandleUdpInput(DataStorage dataStorage,ObjectStorage objectStorage) + { + NetworkInterface[] networkInterfaces = NetworkInterface.GetAllNetworkInterfaces(); + foreach (NetworkInterface networkInterface in networkInterfaces) + { + IPInterfaceProperties interfaceProperties = networkInterface.GetIPProperties(); + foreach (UnicastIPAddressInformation unicastAddress in interfaceProperties.UnicastAddresses) + { + Console.WriteLine("Listening on: {0}", unicastAddress.Address.ToString()); + } + } + + //tsp -v --control-port 9001 -I dvb --delivery-system DVB-S2 --frequency 11421000000 --symbol-rate 22000000 --polarity horizontal -O ip 127.0.0.1:9001 + //SkyscraperWebserver.GetInstance().Start(); + //scraperStorage = new FilesystemScraperStorage(new DirectoryInfo("C:\\scraped_data")); + + SkyscraperContext skyscraper = null; + + UdpClient udpServer = new UdpClient(new IPEndPoint(IPAddress.Any, 9003)); + IPEndPoint remote = null; + IPEndPoint oldRemote = null; + int numPackets; + byte[] singlePacket = new byte[188]; + while (true) + { + byte[] buffer = udpServer.Receive(ref remote); + if (!remote.Equals(oldRemote)) + { + oldRemote = remote; + skyscraper = new SkyscraperContext(new TsContext(), dataStorage,objectStorage); + skyscraper.InitalizeFilterChain(); + skyscraper.EnableTimeout = true; + logger.InfoFormat("Got zapped by {0}", remote); + } + + numPackets = buffer.Length / 188; + for (int i = 0; i < numPackets; i++) + { + Array.Copy(buffer, i * 188, singlePacket, 0, 188); + skyscraper.IngestSinglePacket(singlePacket); + } + } + } + + private static void HandleCrazyScanToTestingSystem(string url) + { + + DataStorage dataStorage = new InMemoryScraperStorage(); + ObjectStorage objectStorage = new FilesystemStorage(new DirectoryInfo(".")); + HandleCrazyScan(url, dataStorage, objectStorage, true); + } + + private static void HandleFileToLiveSystem(string filename) + { + StorageConnectionManager connectionManager = StorageConnectionManager.GetInstance(); + DataStorageFactory dataStorageFactory = connectionManager.GetDefaultDataStorageFactory(); + ObjectStorageFactory objectStorageFactory = connectionManager.GetDefaultObjectStorageFactory(); + DataStorage dataStorage = dataStorageFactory.CreateDataStorage(); + ObjectStorage objectStorage; + if (objectStorageFactory.IsEquivalent(dataStorageFactory)) + objectStorage = (ObjectStorage)dataStorage; + else + objectStorage = objectStorageFactory.CreateObjectStorage(); + + FileInfo fi = new FileInfo(filename); + if (!fi.Exists) + { + logger.FatalFormat("{0} not found.", fi.FullName); + return; + } + + SkyscraperContext skyscraper = new SkyscraperContext(new TsContext(), dataStorage,objectStorage); + skyscraper.InitalizeFilterChain(); + skyscraper.EnableTimeout = false; + skyscraper.TcpProxyEnabled = false; + FileStream fileStream = fi.OpenRead(); + skyscraper.IngestFromStream(fileStream); + fileStream.Close(); + fileStream.Dispose(); + skyscraper.Dispose(); + } + + private static void HandleCrazyScanToLiveSystem(string url, bool withTimeout = true) + { + StorageConnectionManager connectionManager = StorageConnectionManager.GetInstance(); + DataStorageFactory dataStorageFactory = connectionManager.GetDefaultDataStorageFactory(); + ObjectStorageFactory objectStorageFactory = connectionManager.GetDefaultObjectStorageFactory(); + DataStorage dataStorage = dataStorageFactory.CreateDataStorage(); + ObjectStorage objectStorage; + if (objectStorageFactory.IsEquivalent(dataStorageFactory)) + objectStorage = (ObjectStorage)dataStorage; + else + objectStorage = objectStorageFactory.CreateObjectStorage(); + + objectStorage.Ping(); + HandleCrazyScan(url, dataStorage,objectStorage, withTimeout); + } + + private static void HandleCrazyScan(string url, DataStorage dataStorage, ObjectStorage objectStorage, bool timeout) + { + if (!url.StartsWith("tcp://")) + { + logger.Fatal("Use TCP, please."); + return; + } + + if (url.EndsWith("/")) + { + logger.Fatal("Don't use that trailing slash, please."); + return; + } + + url = url.Substring(6); + string[] strings = url.Split(':'); + string hostname = strings[0]; + int port = Int32.Parse(strings[1]); + + TcpClient tcpClient = new TcpClient(hostname, port); + + SkyscraperContext skyscraper = new SkyscraperContext(new TsContext(), dataStorage,objectStorage); + skyscraper.InitalizeFilterChain(new SkipFilter(1024)); + //skyscraper.EnableTimeout = timeout; + //skyscraper.TimeoutSeconds = 10; + skyscraper.TcpProxyEnabled = true; + skyscraper.IngestFromStream(new BufferedStream(tcpClient.GetStream(), 96256 * 2)); + } + + private static void HandleSingleFile(FileInfo fi) + { + //Environment.CurrentDirectory = fi.Directory.FullName; + TsContext tsContext = new TsContext(); + DataStorage dataStorage = new InMemoryScraperStorage(); + ObjectStorage objectStorage = new FilesystemStorage(new DirectoryInfo(".")); + SkyscraperContext skyscraper = new SkyscraperContext(tsContext, dataStorage,objectStorage); + skyscraper.InitalizeFilterChain(); + FileStream fileStream = fi.OpenRead(); + skyscraper.IngestFromStream(fileStream); + skyscraper.Dispose(); + fileStream.Close(); + + Console.WriteLine(""); + Console.WriteLine("Current Network ID: {0}", skyscraper.CurrentNetworkId); + Console.WriteLine("Current Transport Stream ID: {0}", skyscraper.CurrentTransportStreamId); + if (tsContext.PcrMonitor != null) + { + Console.WriteLine("Processing Performance: {0}", tsContext.PcrMonitor.Performance); + } + else + { + Console.WriteLine("No PCR detected."); + } + Console.WriteLine("DNS Records found: {0}", dataStorage.DnsCountA()); + Console.WriteLine(""); + + Console.WriteLine(new string('-', Console.WindowWidth)); + Console.WriteLine(""); + Console.ReadKey(true); + } + + private static void IoctlTest() + { + /* + int dvbSatSearchLnb = LibDvbV5.DvbSatSearchLnb("EXTENDED"); + LibDvbV5SatLnb lnb = new LibDvbV5SatLnb(dvbSatSearchLnb); + + LibDvbV5Device device = new LibDvbV5Device(); + device.SetLog(8, null); + device.Find(); + + LibDvbV5DeviceList findDeviceByDeliverySystem = device.FindDeviceByDeliverySystem(LibDvbV5FrontendDeliverySystem.SYS_DVBC_ANNEX_A); + if (findDeviceByDeliverySystem == null) + return; + + LibDvbV5DeviceList demuxerName = device.GetSisterDevice(findDeviceByDeliverySystem, DvbDeviceType.Demux); + LibDvbV5DeviceList dvrName = device.GetSisterDevice(findDeviceByDeliverySystem, DvbDeviceType.Dvr); + + LibDvb5FrontendParameters frontend = findDeviceByDeliverySystem.ToFrontendParameters(); + frontend.SetDeliverySystem(LibDvbV5FrontendDeliverySystem.SYS_DVBC_ANNEX_A); + frontend.StoreParameter(17, (uint)LibDvbV5FrontendDeliverySystem.SYS_DVBC_ANNEX_A); + frontend.StoreParameter(3, 610000000); //freq + frontend.StoreParameter(8, 6900000); //symbol rate + frontend.SetParameters(); + Thread.Sleep(400); + frontend.GetStatistics(); + Thread.Sleep(400); + uint retrieveStats = frontend.RetrieveStats(512); + if ((retrieveStats & 0x10) != 0) + { + Console.WriteLine("got lock!"); + LibDvbV5OpenDescriptor dvrFd = device.DeviceOpen(dvrName); + if (dvrFd == null) + throw new IOException("open failed"); + dvrFd.SetBufferSize(1024 * 1024); + + LibDvbV5OpenDescriptor demuxFd = device.DeviceOpen(demuxerName); + if (demuxFd == null) + throw new IOException("open failed"); + + demuxFd.DemuxSetPesFilter(0x2000, DemuxerPesType.DMX_PES_OTHER); + + FileStream fileStream = File.OpenWrite(String.Format("{0}.ts", DateTime.Now.Ticks)); + byte[] packBuffer = new byte[188]; + int readLen = 0; + for (int i = 0; i < 9001; i++) + { + readLen = dvrFd.Read(packBuffer, 188); + if (readLen > 0) + { + fileStream.Write(packBuffer, 0, 188); + } + } + + fileStream.Flush(true); + fileStream.Close(); + demuxFd.Dispose(); + dvrFd.Dispose(); + } + else + { + Console.WriteLine("no lock :("); + } + frontend.Dispose(); + device.Dispose(); + Thread.Sleep(1000); + return;*/ + /*FileInfo fi = new FileInfo("/dev/video0"); + SafeUnixHandle safeUnixHandle = UnsafeLibCNativeMethodsWrappers.OpenDevice(fi); + UnsafeLibCNativeMethodsWrappers.GetCapability(safeUnixHandle); + UnsafeLibCNativeMethodsWrappers.Close(safeUnixHandle);*/ + + //LocalStreamReader streamReader = LocalStreamReader.GetInstance(); + IStreamReader streamReader = new NullStreamReader(); + + bool checkForDvb = streamReader.CheckForDVB(); + if (checkForDvb) + { + streamReader.CheckForDVBEx((x, y) => { Console.WriteLine("{0}, {1}", x, y); }); + if (streamReader.StartDvbEx(0)) + { + + STD_TYPE ttype = default; + bool result = streamReader.GetTunerType(ref ttype); + if (!result) + Console.WriteLine("oh no"); + + Caps caps = streamReader.GetCaps(); + + BlScanCallback scanCallback = + (ref SearchResult searchResult) => + { + Console.WriteLine("{0}/{1}/{2}",searchResult.Freq,searchResult.Pol,searchResult.SR); + }; + + /*UnsafeStreamReaderMethods.AirScanCallback airScanCallback = + (ref UnsafeStreamReaderMethods.SearchResult2 searchResult2) => + { + Console.WriteLine(searchResult2.Freq); + };*/ + AirScanCallback altTest = (ref SearchResult2 searchResult) => + { + Console.WriteLine(searchResult.Freq); + }; + + //int tpNum = 0; + //result = UnsafeStreamReaderMethods.BLScanEx(10744000, 8000, 1, 9750000, 10600000, 11700000, 1, UnsafeStreamReaderMethods.STD_TYPE.STD_DVBS2, ref sr1); + //result = UnsafeStreamReaderMethods.BLScan(10744000, 8000, 0, 9750000, 10600000, 11700000, 1000, ref sr1); + /*result = UnsafeStreamReaderMethods.SetChannelExEx(10744000, 22000000, 0, + UnsafeStreamReaderMethods.VITERBIRATE_TYPE.VR_5_6, 9750000, 10600000, 11700000, + UnsafeStreamReaderMethods.MOD_TYPE.MOD_QPSK, 0, 0, + UnsafeStreamReaderMethods.ROLLOFF_TYPE.ROLLOFF_AUTO);*/ + /* + result = UnsafeStreamReaderMethods.SendDiSEqC(2, + UnsafeStreamReaderMethods.DiSEqC_Opcode.DISEQC_HIGH_NIBBLE | + UnsafeStreamReaderMethods.DiSEqC_Opcode.DISEQC_LOW_BAND | + UnsafeStreamReaderMethods.DiSEqC_Opcode.DISEQC_HORIZONTAL | + UnsafeStreamReaderMethods.DiSEqC_Opcode.DISEQC_POSITION_B | + UnsafeStreamReaderMethods.DiSEqC_Opcode.DISEQC_OPTION_A); + result = UnsafeStreamReaderMethods.SetChannel(10775000, 29900000, 0, + UnsafeStreamReaderMethods.VITERBIRATE_TYPE.VR_3_5, 9750000, 10600000, 11700000); + + + for (int i = 0; i < 100; i++) + { + Thread.Sleep(1000); + } + */ + + + SearchResult2 sr1 = default; + SearchResult2 sr2 = default; + int tpNum = default; + IntPtr allocHGlobal = Marshal.AllocHGlobal(1024); + result = streamReader.AirScan(100000, 800000, 3000, 8000, (int)STD_TYPE.STD_DVBC, allocHGlobal, ref tpNum, altTest); + SearchResult2 ptrToStructure = (SearchResult2)Marshal.PtrToStructure(allocHGlobal, typeof(SearchResult2)); + Marshal.FreeHGlobal(allocHGlobal); + Console.WriteLine(tpNum); + + /* + byte[] buffer = new byte[1024]; + + int offset = 0; + FileStream fileStream = File.OpenWrite("tbs5580.bin"); + result = true; + while (result) + { + result = UnsafeStreamReaderMethods.GetEEPROM(buffer, offset, 8); + if (result) + { + fileStream.Write(buffer, 0, 8); + offset += 8; + } + } + + fileStream.Flush(true); + fileStream.Close(); + */ + + /* + * + double snr = default; + for (uint i = 100; i < 200; i++) + { + result = UnsafeStreamReaderMethods.RFScan2(i * 1000, UnsafeStreamReaderMethods.STD_TYPE.STD_DVBC, ref snr); + if (result) + Console.WriteLine("{0} -> {1}", i, snr); + } + + */ + /* + UnsafeStreamReaderMethods.SearchResult sr1 = default; + UnsafeStreamReaderMethods.SearchResult sr2 = default; + int tpNum = default; + result = UnsafeStreamReaderMethods.SetChannel(10744000, 22000000, 0, 0, 9750000, 10600000, 11700000); + ulong numPackets = 0; + IntPtr filterPtr = default; + byte[] buffer = new byte[188]; + FileStream fs = File.OpenWrite("test.ts"); + result = UnsafeStreamReaderMethods.SetFilter(8192, ((data, length) => + { + //Console.WriteLine("Packet {0}", numPackets++); + Marshal.Copy(data, buffer, 0, length); + fs.Write(buffer, 0, 188); + }), 0x02, 1, ref filterPtr); + + sbyte[] iq = new sbyte[200]; + for (int i = 0; i < 150; i++) + { + Thread.Sleep(100); + UnsafeStreamReaderMethods.IQScan(0, iq, 100); + Console.WriteLine("{0},{1} - {2},{3} - {4},{5} - {6},{7}", iq[0], iq[1], iq[2], iq[3], iq[4], iq[5], iq[6], iq[7]); + } + result = UnsafeStreamReaderMethods.DelFilter(filterPtr); + fs.Flush(true); + fs.Close(); + */ + //result = UnsafeStreamReaderMethods.BLScan(11068, 8000, 1, 975000, 10600000, 11700000, 1, ref sr); + + /* + for (int i = 10700; i < 12750; i += 3) + { + result = UnsafeStreamReaderMethods.BLScan(i, 0, 1, 975000, 10600000, 11700000, 1, ref sr1); + if (sr1.SR != 0) + { + Console.Write("\r\n{0}/{1}/{2}", i, sr1.Pol, sr1.SR); + } + else + { + Console.Write("."); + } + result = UnsafeStreamReaderMethods.BLScan(i, 0, 0, 975000, 10600000, 11700000, 1, ref sr1); + if (sr1.SR != 0) + { + Console.Write("\r\n{0}/{1}/{2}", i, sr1.Pol, sr1.SR); + } + else + { + Console.Write("."); + } + }*/ + + //result = UnsafeStreamReaderMethods.BLScan2(10700, 12750, 0, 975000, 10600000, 11700000, ref sr1, ref tpNum, scanCallback); + + /* + byte[] macBuffer = new byte[6]; + result = UnsafeStreamReaderMethods.GetMAC(macBuffer); + */ + /* + double m = default; + for (int i = 10700; i < 12750; i += 1) + { + result = UnsafeStreamReaderMethods.RFScan(i, 0, 975000, 10600000, 11700000, out m); + Console.WriteLine("{2} {0} -> {1}", i, m, result); + } + */ + + + /* + result = UnsafeStreamReaderMethods.SetChannel(10744000, 22000000, 0, 0, 9750000, 10600000, 11700000); + + if (File.Exists("test.ts")) + File.Delete("test.ts"); + + FileStream fileStream = File.OpenWrite("test.ts"); + IntPtr filterPtr = IntPtr.Zero; + byte[] packet = new byte[188]; + UnsafeStreamReaderMethods.StdcallDvbCallback callback = (bytes, k) => + { + Marshal.Copy(bytes, packet, 0, k); + fileStream.Write(packet, 0, 188); + }; + result = UnsafeStreamReaderMethods.SetFilter(8192, callback, 0x02, 1, ref filterPtr); + + if (!result) + throw new NotImplementedException("no filter"); + + IntPtr rcPtr = IntPtr.Zero; + result = UnsafeStreamReaderMethods.SetRemoteControl(0, -1, (bytes, k) => + { + Console.WriteLine(k); + }, + ref rcPtr); + + result = UnsafeStreamReaderMethods.DelFilter(rcPtr); + result = UnsafeStreamReaderMethods.DelFilter(filterPtr); + */ + + /* + if (!UnsafeStreamReaderMethods.StopDVB()) + Console.WriteLine("wtf"); + */ + /* + fileStream.Flush(true); + fileStream.Close(); + */ + } + } + + } + } +} diff --git a/skyscraper8/Properties/launchSettings.json b/skyscraper8/Properties/launchSettings.json index e263e51..087bf5d 100644 --- a/skyscraper8/Properties/launchSettings.json +++ b/skyscraper8/Properties/launchSettings.json @@ -2,7 +2,7 @@ "profiles": { "skyscraper8": { "commandName": "Project", - "commandLineArgs": "satip-playout auto 1 V 12597 S2 45000 6970", + "commandLineArgs": "rotation-catalogue F:\\\\ F:\\\\rotate-us.csv", "remoteDebugEnabled": false }, "Container (Dockerfile)": { diff --git a/skyscraper8/QuickAndDirtySatIpClient.cs b/skyscraper8/QuickAndDirtySatIpClient.cs index 046a7ac..045c641 100644 --- a/skyscraper8/QuickAndDirtySatIpClient.cs +++ b/skyscraper8/QuickAndDirtySatIpClient.cs @@ -1,79 +1,79 @@ -using log4net; -using skyscraper5.Skyscraper.IO.CrazycatStreamReader; -using skyscraper8.SatIp; -using skyscraper8.SatIp.RtspResponses; -using skyscraper8.SimpleServiceDiscoveryProtocol; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Net; -using System.Text; -using System.Threading.Tasks; -using skyscraper5.Mpeg2; -using skyscraper5.Skyscraper.Scraper; -using skyscraper5.Skyscraper.Scraper.Storage.Filesystem; -using skyscraper5.Skyscraper.Scraper.Storage.InMemory; -using skyscraper8.Skyscraper.Scraper.Storage; - -namespace skyscraper8 -{ - internal class QuickAndDirtySatIpClient - { - private static readonly ILog logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name); - private const bool ENABLE_TS_WRITER = true; - - public QuickAndDirtySatIpClient(string[] args) - { - if (args.Length == 1) - { - logger.Fatal("Hey, what's your SAT>IP Server's IP Address? You can also say \"autodetect\" here."); - return; - } - if (args[1].ToLowerInvariant().Contains("auto")) - { - ipAddress = AutodetectIPAddress(); - } - else - { - ipAddress = IPAddress.Parse(args[1]); - } - - if (args.Length == 2) - { - logger.Fatal("You didn't specify a DiSEqc setting. (Number between 1-4)"); - return; - } - diseqcNumber = Int32.Parse(args[2]); - - if (args.Length == 3) - { - logger.Fatal("You didn't specify a polarity. Use H or V."); - return; - } - polarity = args[3].ToUpperInvariant()[0]; - - if (args.Length == 4) - { - logger.Fatal("Please specify a frequency."); - return; - } - frequency = Int32.Parse(args[4]); - - if (args.Length == 5) - { - logger.Fatal("What DVB Standard do we have here? S or S2?"); - return; - } - isS2 = ParseDvbStandard(args[5]); - - if (args.Length == 6) - { - logger.Fatal("What's the symbol rate?"); - return; - } - symbolRate = Int32.Parse(args[6]); - } - +using log4net; +using skyscraper5.Skyscraper.IO.CrazycatStreamReader; +using skyscraper8.SatIp; +using skyscraper8.SatIp.RtspResponses; +using skyscraper8.SimpleServiceDiscoveryProtocol; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Text; +using System.Threading.Tasks; +using skyscraper5.Mpeg2; +using skyscraper5.Skyscraper.Scraper; +using skyscraper5.Skyscraper.Scraper.Storage.Filesystem; +using skyscraper5.Skyscraper.Scraper.Storage.InMemory; +using skyscraper8.Skyscraper.Scraper.Storage; + +namespace skyscraper8 +{ + internal class QuickAndDirtySatIpClient + { + private static readonly ILog logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name); + private const bool ENABLE_TS_WRITER = true; + + public QuickAndDirtySatIpClient(string[] args) + { + if (args.Length == 1) + { + logger.Fatal("Hey, what's your SAT>IP Server's IP Address? You can also say \"autodetect\" here."); + return; + } + if (args[1].ToLowerInvariant().Contains("auto")) + { + ipAddress = AutodetectIPAddress(); + } + else + { + ipAddress = IPAddress.Parse(args[1]); + } + + if (args.Length == 2) + { + logger.Fatal("You didn't specify a DiSEqc setting. (Number between 1-4)"); + return; + } + diseqcNumber = Int32.Parse(args[2]); + + if (args.Length == 3) + { + logger.Fatal("You didn't specify a polarity. Use H or V."); + return; + } + polarity = args[3].ToUpperInvariant()[0]; + + if (args.Length == 4) + { + logger.Fatal("Please specify a frequency."); + return; + } + frequency = Int32.Parse(args[4]); + + if (args.Length == 5) + { + logger.Fatal("What DVB Standard do we have here? S or S2?"); + return; + } + isS2 = ParseDvbStandard(args[5]); + + if (args.Length == 6) + { + logger.Fatal("What's the symbol rate?"); + return; + } + symbolRate = Int32.Parse(args[6]); + } + public void SetPlayoutMode(string[] args) { if (args.Length == 7) @@ -83,66 +83,79 @@ namespace skyscraper8 } destinationPort = int.Parse(args[7]); playoutMode = true; - } - - private IPAddress AutodetectIPAddress() - { - SsdpDevice firstSatIpServer = SsdpClient.GetFirstSatIpServer(1000, null); - if (firstSatIpServer == null) - { - logger.WarnFormat("Didn't find any SAT>IP servers."); - return null; - } - IPAddress ipAddress = firstSatIpServer.GetIpAddress(); - logger.InfoFormat("Found SAT>IP Server at {0}", ipAddress); - return ipAddress; - } - - private int symbolRate; - private bool isS2; - private int frequency; - private char polarity; - private int diseqcNumber; - private IPAddress ipAddress; - private RtspClient rtspClient; - public void Run() - { - rtspClient = new RtspClient(ipAddress, 554); - rtspClient.AutoReconnect = false; - Keepalive(); - DiSEqC_Opcode opcode = BuildDiseqcOpcode(); - string url = RtspClient.MakeUrl(opcode, frequency, isS2, symbolRate, null, false); - RtspDescribeResponse describe = rtspClient.GetDescribe(url); - SessionDescriptionProtocol sessionDescriptionProtocol = describe.GetSessionDescriptionProtocol(); - - packetQueue = new Queue(); - RtspSetupResponse setup = rtspClient.GetSetup(url, destinationPort); - if (setup.RtspStatusCode == 404) - { - logger.Fatal("Your SAT>IP server doesn't have a tuner available that can talk to the requested frequency."); - return; - } - setup.OnRtcpPacket += Setup_OnRtcpPacket; - setup.OnRtpPacket += Setup_OnRtpPacket; - - if (dataStorage == null) - dataStorage = new InMemoryScraperStorage(); - if (objectStorage == null) - objectStorage = new FilesystemStorage(new DirectoryInfo(".")); + if (args.Length == 10) + { + if (args[8].ToLowerInvariant().Equals("multicast")) + { + destinationIp = IPAddress.Parse(args[9]); + multicastMode = true; + } + else + { + logger.FatalFormat("Don't know what {0} means.", args[8]); + return; + } + } + } + + private IPAddress AutodetectIPAddress() + { + SsdpDevice firstSatIpServer = SsdpClient.GetFirstSatIpServer(1000, null); + if (firstSatIpServer == null) + { + logger.WarnFormat("Didn't find any SAT>IP servers."); + return null; + } + IPAddress ipAddress = firstSatIpServer.GetIpAddress(); + logger.InfoFormat("Found SAT>IP Server at {0}", ipAddress); + return ipAddress; + } + + private int symbolRate; + private bool isS2; + private int frequency; + private char polarity; + private int diseqcNumber; + private IPAddress ipAddress; + private RtspClient rtspClient; + public void Run() + { + rtspClient = new RtspClient(ipAddress, 554); + rtspClient.AutoReconnect = false; + Keepalive(); + DiSEqC_Opcode opcode = BuildDiseqcOpcode(); + string url = RtspClient.MakeUrl(opcode, frequency, isS2, symbolRate, null, false); + RtspDescribeResponse describe = rtspClient.GetDescribe(url); + SessionDescriptionProtocol sessionDescriptionProtocol = describe.GetSessionDescriptionProtocol(); + + packetQueue = new Queue(); + RtspSetupResponse setup = rtspClient.GetSetup(url, destinationPort, multicastMode, destinationIp); + if (setup.RtspStatusCode == 404) + { + logger.Fatal("Your SAT>IP server doesn't have a tuner available that can talk to the requested frequency."); + return; + } + setup.OnRtcpPacket += Setup_OnRtcpPacket; + setup.OnRtpPacket += Setup_OnRtpPacket; + + if (dataStorage == null) + dataStorage = new InMemoryScraperStorage(); + if (objectStorage == null) + objectStorage = new FilesystemStorage(new DirectoryInfo(".")); if (!playoutMode) { context = new SkyscraperContext(new TsContext(), dataStorage, objectStorage); context.EnableTimeout = true; context.TimeoutSeconds = 60; context.InitalizeFilterChain(); - } - - RtspPlayResponse play = rtspClient.GetPlay(setup); - DateTime lastTimestamp = DateTime.Now; - bool initMessagePrinted = false; - - while (true) - { + } + + RtspPlayResponse play = rtspClient.GetPlay(setup); + DateTime lastTimestamp = DateTime.Now; + bool initMessagePrinted = false; + + while (true) + { if (playoutMode) { Thread.Sleep(1000); @@ -152,8 +165,8 @@ namespace skyscraper8 logger.InfoFormat("Began SAT>IP playout to port {0}", destinationPort); initMessagePrinted = true; } - } - else + } + else { if (packetQueue.Count >= 1) { @@ -181,135 +194,136 @@ namespace skyscraper8 { Keepalive(url); lastTimestamp = DateTime.Now; - } - } - } - - rtspClient.GetTeardown(setup); - rtspClient.Dispose(); - } - - private FileStream fs; - private uint stuffingBytes; - private Queue packetQueue; - private ObjectStorage objectStorage; - private DataStorage dataStorage; - private SkyscraperContext context; - private void Setup_OnRtpPacket(byte[] data, int length) - { - for (int i = 12; i < length; i += 1) - { - if (data[i] == 'G') - { - byte[] buffer = new byte[188]; - Array.Copy(data, i, buffer, 0, 188); - lock (packetQueue) - { - packetQueue.Enqueue(buffer); - } - - DumpPacket(buffer); - i += 187; - } - else if (data[i] == 0xff) - { - stuffingBytes++; - } - } - } - - private void DumpPacket(byte[] buffer) - { - if (!ENABLE_TS_WRITER) - return; - - if (fs == null) - { - string fname = String.Format("{0}.ts", DateTime.Now.Ticks); - fs = File.OpenWrite(fname); - } - - fs.Write(buffer, 0, buffer.Length); - } - + } + } + } + + rtspClient.GetTeardown(setup); + rtspClient.Dispose(); + } + + private FileStream fs; + private uint stuffingBytes; + private Queue packetQueue; + private ObjectStorage objectStorage; + private DataStorage dataStorage; + private SkyscraperContext context; + private void Setup_OnRtpPacket(byte[] data, int length) + { + for (int i = 12; i < length; i += 1) + { + if (data[i] == 'G') + { + byte[] buffer = new byte[188]; + Array.Copy(data, i, buffer, 0, 188); + lock (packetQueue) + { + packetQueue.Enqueue(buffer); + } + + DumpPacket(buffer); + i += 187; + } + else if (data[i] == 0xff) + { + stuffingBytes++; + } + } + } + + private void DumpPacket(byte[] buffer) + { + if (!ENABLE_TS_WRITER) + return; + + if (fs == null) + { + string fname = String.Format("{0}.ts", DateTime.Now.Ticks); + fs = File.OpenWrite(fname); + } + + fs.Write(buffer, 0, buffer.Length); + } + private int rtcps; private IPAddress destinationIp; private int destinationPort; private bool playoutMode; + private bool multicastMode; - private void Setup_OnRtcpPacket(byte[] data, int length) - { - //rtcps++; - } - - private DiSEqC_Opcode BuildDiseqcOpcode() - { - DiSEqC_Opcode opcode = DiSEqC_Opcode.DISEQC_HIGH_NIBBLE; - switch (diseqcNumber) - { - case 1: - opcode |= DiSEqC_Opcode.DISEQC_OPTION_A; - opcode |= DiSEqC_Opcode.DISEQC_POSITION_A; - break; - case 2: - opcode |= DiSEqC_Opcode.DISEQC_OPTION_A; - opcode |= DiSEqC_Opcode.DISEQC_POSITION_B; - break; - case 3: - opcode |= DiSEqC_Opcode.DISEQC_OPTION_B; - opcode |= DiSEqC_Opcode.DISEQC_POSITION_A; - break; - case 4: - opcode |= DiSEqC_Opcode.DISEQC_OPTION_B; - opcode |= DiSEqC_Opcode.DISEQC_POSITION_B; - break; - default: - throw new ArgumentOutOfRangeException("Your DiSEqC position should be a number between 1 and 4."); - } - - switch (polarity) - { - case 'H': - opcode |= DiSEqC_Opcode.DISEQC_HORIZONTAL; - break; - case 'V': - opcode |= DiSEqC_Opcode.DISEQC_VERTICAL; - break; - default: - throw new ArgumentException("The polarity should be H or V."); - } - - return opcode; - } - - private bool ParseDvbStandard(string standard) - { - standard = standard.ToUpperInvariant(); - if (standard.StartsWith("DVB")) - standard = standard.Substring(3); - if (standard.StartsWith("-")) - standard = standard.Substring(1); - - switch (standard) - { - case "S": - return false; - case "S2": - return true; - case "S2X": - return true; - default: - throw new ArgumentException(String.Format("I have no idea what kind of Standard {0} is supposed to be.", standard)); - } - } - - private void Keepalive(string url = "/") - { - RtspOptionsResponse options = rtspClient.GetOptions("/"); - if (options.RtspStatusCode != 200) - { - throw new RtspException(String.Format("Unexpected RTSP Status code. Wanted {0}, got {1}", 200, options.RtspStatusCode)); - } - } - } -} + private void Setup_OnRtcpPacket(byte[] data, int length) + { + //rtcps++; + } + + private DiSEqC_Opcode BuildDiseqcOpcode() + { + DiSEqC_Opcode opcode = DiSEqC_Opcode.DISEQC_HIGH_NIBBLE; + switch (diseqcNumber) + { + case 1: + opcode |= DiSEqC_Opcode.DISEQC_OPTION_A; + opcode |= DiSEqC_Opcode.DISEQC_POSITION_A; + break; + case 2: + opcode |= DiSEqC_Opcode.DISEQC_OPTION_A; + opcode |= DiSEqC_Opcode.DISEQC_POSITION_B; + break; + case 3: + opcode |= DiSEqC_Opcode.DISEQC_OPTION_B; + opcode |= DiSEqC_Opcode.DISEQC_POSITION_A; + break; + case 4: + opcode |= DiSEqC_Opcode.DISEQC_OPTION_B; + opcode |= DiSEqC_Opcode.DISEQC_POSITION_B; + break; + default: + throw new ArgumentOutOfRangeException("Your DiSEqC position should be a number between 1 and 4."); + } + + switch (polarity) + { + case 'H': + opcode |= DiSEqC_Opcode.DISEQC_HORIZONTAL; + break; + case 'V': + opcode |= DiSEqC_Opcode.DISEQC_VERTICAL; + break; + default: + throw new ArgumentException("The polarity should be H or V."); + } + + return opcode; + } + + private bool ParseDvbStandard(string standard) + { + standard = standard.ToUpperInvariant(); + if (standard.StartsWith("DVB")) + standard = standard.Substring(3); + if (standard.StartsWith("-")) + standard = standard.Substring(1); + + switch (standard) + { + case "S": + return false; + case "S2": + return true; + case "S2X": + return true; + default: + throw new ArgumentException(String.Format("I have no idea what kind of Standard {0} is supposed to be.", standard)); + } + } + + private void Keepalive(string url = "/") + { + RtspOptionsResponse options = rtspClient.GetOptions("/"); + if (options.RtspStatusCode != 200) + { + throw new RtspException(String.Format("Unexpected RTSP Status code. Wanted {0}, got {1}", 200, options.RtspStatusCode)); + } + } + } +} diff --git a/skyscraper8/SatIp/RtspClient.cs b/skyscraper8/SatIp/RtspClient.cs index 56335ba..6a6891c 100644 --- a/skyscraper8/SatIp/RtspClient.cs +++ b/skyscraper8/SatIp/RtspClient.cs @@ -99,7 +99,7 @@ namespace skyscraper8.SatIp return result; } - public RtspSetupResponse GetSetup(string url, int destinationPort = 0) + public RtspSetupResponse GetSetup(string url, int destinationPort = 0, bool multicastMode = false, IPAddress multicastIp = null) { RtspSetupRequest request = new RtspSetupRequest(); request.RequestPath = url; @@ -123,7 +123,14 @@ namespace skyscraper8.SatIp rtcpSocket.Bind(new IPEndPoint(ListenIp, 0)); int rtcpPort = GetPortFromEndPoint(rtcpSocket.LocalEndPoint); - request.SetRtpAvpUnicast(rtpPort, rtcpPort); + if (multicastMode && multicastIp != null) + { + request.SetRtpAvpMulticast(multicastIp, rtpPort, rtcpPort); + } + else + { + request.SetRtpAvpUnicast(rtpPort, rtcpPort); + } RtspResponseHeader response = GetResponse(request.ListHeaders(RootPath)); RtspSetupResponse setupResponse = new RtspSetupResponse(response); diff --git a/skyscraper8/SatIp/RtspRequests/RtspSetupRequest.cs b/skyscraper8/SatIp/RtspRequests/RtspSetupRequest.cs index cb582bb..a6787da 100644 --- a/skyscraper8/SatIp/RtspRequests/RtspSetupRequest.cs +++ b/skyscraper8/SatIp/RtspRequests/RtspSetupRequest.cs @@ -1,57 +1,63 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace skyscraper8.SatIp.RtspRequests -{ - internal class RtspSetupRequest : RtspRequest - { - public RtspSetupRequest() : base("SETUP") - { - } - - public uint CSeq - { - set - { - base.args["CSeq"] = Convert.ToString(value); - } - get - { - return uint.Parse(base.args["CSeq"]); - } - } - - public string UserAgent - { - set - { - base.args["User-Agent"] = value; - } - get - { - return base.args["User-Agent"]; - } - } - - public string Transport - { - set - { - base.args["Transport"] = value; - } - get - { - return base.args["Transport"]; - } - } - - public void SetRtpAvpUnicast(int rtpPort, int rtcpPort) - { - Transport = String.Format("RTP/AVP;unicast;client_port={0}-{1}", rtpPort, rtcpPort); - } - } - -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Text; +using System.Threading.Tasks; + +namespace skyscraper8.SatIp.RtspRequests +{ + internal class RtspSetupRequest : RtspRequest + { + public RtspSetupRequest() : base("SETUP") + { + } + + public uint CSeq + { + set + { + base.args["CSeq"] = Convert.ToString(value); + } + get + { + return uint.Parse(base.args["CSeq"]); + } + } + + public string UserAgent + { + set + { + base.args["User-Agent"] = value; + } + get + { + return base.args["User-Agent"]; + } + } + + public string Transport + { + set + { + base.args["Transport"] = value; + } + get + { + return base.args["Transport"]; + } + } + + public void SetRtpAvpUnicast(int rtpPort, int rtcpPort) + { + Transport = String.Format("RTP/AVP;unicast;client_port={0}-{1}", rtpPort, rtcpPort); + } + + public void SetRtpAvpMulticast(IPAddress targetIp, int rtpPort, int rtcpPort) + { + Transport = String.Format("RTP/AVP;multicast;destination={2};port={0}-{1}", rtpPort, rtcpPort, targetIp.ToString()); + } + } + +} diff --git a/skyscraper8/Skyscraper/IO/TunerInterface/RemoteStreamReaderTunerFactory.cs b/skyscraper8/Skyscraper/IO/TunerInterface/RemoteStreamReaderTunerFactory.cs index 6fdb6fa..fdcbe6a 100644 --- a/skyscraper8/Skyscraper/IO/TunerInterface/RemoteStreamReaderTunerFactory.cs +++ b/skyscraper8/Skyscraper/IO/TunerInterface/RemoteStreamReaderTunerFactory.cs @@ -6,7 +6,7 @@ namespace skyscraper5.Skyscraper.IO.TunerInterface { [SkyscraperPlugin] [TunerFactoryId(2,"skyscraper5 Remote Stream Reader")] - internal class RemoteStreamReaderTunerFactory : ITunerFactory + public class RemoteStreamReaderTunerFactory : ITunerFactory { public string Hostname { get; set; } diff --git a/skyscraper8/Skyscraper/TsRotationToCsv.cs b/skyscraper8/Skyscraper/TsRotationToCsv.cs new file mode 100644 index 0000000..4040a7c --- /dev/null +++ b/skyscraper8/Skyscraper/TsRotationToCsv.cs @@ -0,0 +1,112 @@ +using log4net; +using log4net.Repository.Hierarchy; +using skyscraper5.Docsis.MacManagement; +using skyscraper5.Skyscraper; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace skyscraper8.Skyscraper +{ + internal class TsRotationToCsv + { + public DirectoryInfo SourceDir { get; set; } + public FileInfo DestinationCsv { get; set; } + + private List files; + private ILog logger; + public void Run() + { + logger = LogManager.GetLogger(typeof(TsRotationToCsv)); + files = new List(); + ScrapeDirectory(SourceDir); + files.Sort(new FileInfoComparerByDate(logger)); + DumpCsv(); + } + + private void DumpCsv() + { + StreamWriter sw = new StreamWriter(DestinationCsv.FullName); + foreach (FileInfo file in files) + { + sw.WriteLine(String.Format("\"{0}\";{1};{2}", file.FullName, file.Length, file.LastWriteTime)); + } + sw.Flush(); + sw.Close(); + } + + private void ScrapeDirectory(DirectoryInfo di) + { + try + { + foreach (FileSystemInfo fsi in di.GetFileSystemInfos()) + { + switch (fsi) + { + case FileInfo fi: + if (fi.Extension.ToLowerInvariant().Equals(".ts")) + { + files.Add(fi); + if (files.Count % 100 == 0) + logger.InfoFormat("Listed {0} files.", files.Count); + } + break; + case DirectoryInfo subdirectory: + ScrapeDirectory(subdirectory); + break; + default: + throw new NotImplementedException(di.GetType().Name); + } + } + } + catch (Exception e) + { + logger.WarnFormat(e.Message); + } + } + + private class FileInfoComparerByDate : Comparer + { + private ILog logger; + private int ups, downs, stands; + + public FileInfoComparerByDate(ILog logger) + { + this.logger = logger; + } + + public override int Compare(FileInfo? x, FileInfo? y) + { + long xTime = x.LastWriteTime.ToUnixTime(); + long yTime = y.LastWriteTime.ToUnixTime(); + + int ops; + int v = xTime.CompareTo(yTime); + switch(v) + { + case -1: + ups++; + ops = ups; + break; + case 0: + stands++; + ops = stands; + break; + case 1: + downs++; + ops = downs; + break; + default: + throw new NotImplementedException(v.ToString()); + } + if (ops % 1000 == 0) + { + logger.InfoFormat("Sort progress: {0} up, {1} down, {2} stand.", ups, downs, stands); + } + return v; + } + } + } +}