diff --git a/skyscraper8/DvbSis/SisSdtContainer.cs b/skyscraper8/DvbSis/SisSdtContainer.cs index f4006de..bafbb04 100644 --- a/skyscraper8/DvbSis/SisSdtContainer.cs +++ b/skyscraper8/DvbSis/SisSdtContainer.cs @@ -13,13 +13,13 @@ namespace skyscraper8.DvbSis public ushort? NetworkId { get; private set; } public ushort? TransportStreamId { get; private set; } - private List sdtServices; + private List> sdtServices; public void OnSdtService(ushort transportStreamId, ushort originalNetworkId, SdtService sdtService) { if (sdtServices == null) - sdtServices = new List(); + sdtServices = new List>(); - sdtServices.Add(sdtService); + sdtServices.Add(new Tuple(transportStreamId,originalNetworkId,sdtService)); } public void SetNetworkId(ushort networkId) @@ -32,12 +32,12 @@ namespace skyscraper8.DvbSis this.TransportStreamId = transportStreamId; } - public IReadOnlyList Services + public IReadOnlyList> Services { get { if (sdtServices == null) - return new List().AsReadOnly(); + return new List>().AsReadOnly(); return sdtServices.AsReadOnly(); } diff --git a/skyscraper8/Skyscraper/CatalogueGenerator.cs b/skyscraper8/Skyscraper/CatalogueGenerator.cs index b9a811b..fc8f433 100644 --- a/skyscraper8/Skyscraper/CatalogueGenerator.cs +++ b/skyscraper8/Skyscraper/CatalogueGenerator.cs @@ -91,12 +91,13 @@ namespace skyscraper8.Skyscraper logger.InfoFormat("Reading: {0}", fi.Name); FileStream fileStream = fi.OpenRead(); + BufferedStream bufferedStream = new BufferedStream(fileStream); byte[] buffer = new byte[188]; try { - for (long l = 0; l < fileStream.Length; l += 188) + for (long l = 0; l < bufferedStream.Length; l += 188) { - if (fileStream.Read(buffer, 0, 188) != 188) + if (bufferedStream.Read(buffer, 0, 188) != 188) { logger.ErrorFormat("Failed to read 188 bytes from offset {0} of file {1}, aborting reading it.", l, fi.Name); readError = 1; @@ -118,6 +119,9 @@ namespace skyscraper8.Skyscraper logger.ErrorFormat("Failed to read from {0}: {1}", fi.Name, e.ToString()); } + bufferedStream.Close(); + fileStream.Close(); + string filename = fi.FullName; TsType tsType = GuessTsType(tsContext); long totalPackets = tsContext.PacketsRead + 1; diff --git a/skyscraper8/Skyscraper/IO/StreamExtensions.cs b/skyscraper8/Skyscraper/IO/StreamExtensions.cs index 7010270..a7c28ee 100644 --- a/skyscraper8/Skyscraper/IO/StreamExtensions.cs +++ b/skyscraper8/Skyscraper/IO/StreamExtensions.cs @@ -44,6 +44,7 @@ namespace skyscraper5.Skyscraper.IO [DebuggerStepThrough] public static uint ReadUInt32BE(this Stream stream) { + byte[] buffer = new byte[4]; if (stream.Read(buffer, 0, 4) != 4) throw new EndOfStreamException(); if (BitConverter.IsLittleEndian) diff --git a/skyscraper8/Skyscraper/Scraper/SkyscraperContext.cs b/skyscraper8/Skyscraper/Scraper/SkyscraperContext.cs index cd0b408..c1e1005 100644 --- a/skyscraper8/Skyscraper/Scraper/SkyscraperContext.cs +++ b/skyscraper8/Skyscraper/Scraper/SkyscraperContext.cs @@ -727,10 +727,13 @@ namespace skyscraper5.Skyscraper.Scraper UiJunction?.NotifyPmtProgram(result, pmtPid); - pmtTracker?.MarkAsProcessed(pmtPid); - if (pmtTracker.ShouldFireAutodetection()) - { - CheckForHiddenMpes(); + if (pmtTracker != null) + { + pmtTracker.MarkAsProcessed(pmtPid); + if (pmtTracker.ShouldFireAutodetection()) + { + CheckForHiddenMpes(); + } } } @@ -3350,7 +3353,15 @@ namespace skyscraper5.Skyscraper.Scraper public void OnSisCat(int sourcePid, SisCatContainer catContainer) { - throw new NotImplementedException(); + if (catContainer.CaDescriptors.Count > 0) + { + SkyscraperContext skyscraperContext = GetSisContext(sourcePid); + + foreach(CaDescriptor catEntry in catContainer.CaDescriptors) + { + skyscraperContext.NotifyOfCaSystem(catEntry); + } + } } public void OnSisDsaci(ushort currentDsaGroupId, int versionNumber, byte sectionNumber, byte lastSectionNumber, Stream dsaci) @@ -3412,7 +3423,18 @@ namespace skyscraper5.Skyscraper.Scraper public void OnSisNit(int sourcePid, SisNitContainer nitContainer) { - throw new NotImplementedException(); + SkyscraperContext skyscraperContext = GetSisContext(sourcePid); + if (nitContainer.NetworkId.HasValue) + skyscraperContext.SetNetworkId(nitContainer.NetworkId.Value); + if (nitContainer.Network != null) + skyscraperContext.OnNitNetwork(nitContainer.Network); + + foreach(Tuple nitEntry in nitContainer.TransportStreams) + { + ushort networkId = nitEntry.Item1; + NitTransportStream ts = nitEntry.Item2; + skyscraperContext.OnNitTransportStream(networkId, ts); + } } public void OnSisPat(int sourcePid, SisPatContainer patContainer) @@ -3432,17 +3454,35 @@ namespace skyscraper5.Skyscraper.Scraper public void OnSisPmt(int sourcePid, SisPmtContainer pmtContainer) { - throw new NotImplementedException(); + SkyscraperContext context = GetSisContext(sourcePid); + context.PmtEvent(pmtContainer.ProgramMapping, 0); } public void OnSisSdt(int sourcePid, SisSdtContainer sdtContainer) { - throw new NotImplementedException(); + SkyscraperContext context = GetSisContext(sourcePid); + + if (sdtContainer.NetworkId.HasValue) + context.SetNetworkId(sdtContainer.NetworkId.Value); + if (sdtContainer.TransportStreamId.HasValue) + context.SetTransportStreamId(sdtContainer.TransportStreamId.Value); + + foreach(Tuple sdtEntry in sdtContainer.Services) + { + ushort tsId = sdtEntry.Item1; + ushort netId = sdtEntry.Item2; + SdtService service = sdtEntry.Item3; + context.OnSdtService(tsId, netId, service); + } } public void OnSisTdt(int sourcePid, SisTdtContainer tdtContainer) { - throw new NotImplementedException(); + if (tdtContainer.UtcTime.HasValue) + { + SkyscraperContext context = GetSisContext(sourcePid); + context.OnTdtTime(tdtContainer.UtcTime.Value); + } } private bool[] _sisTimestampFlags; @@ -3472,7 +3512,11 @@ namespace skyscraper5.Skyscraper.Scraper public void OnSisTot(int sourcePid, SisTotContainer totContainer) { - throw new NotImplementedException(); + if (totContainer.LocalTimeOffset != null) + { + SkyscraperContext context = GetSisContext(sourcePid); + context.OnTotTime(totContainer.UtcTime, totContainer.LocalTimeOffset); + } } } } diff --git a/skyscraper8/Skyscraper/Scraper/Storage/Filesystem/FilesystemStorage.cs b/skyscraper8/Skyscraper/Scraper/Storage/Filesystem/FilesystemStorage.cs index d9dc24d..be8e345 100644 --- a/skyscraper8/Skyscraper/Scraper/Storage/Filesystem/FilesystemStorage.cs +++ b/skyscraper8/Skyscraper/Scraper/Storage/Filesystem/FilesystemStorage.cs @@ -1,12 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.IO; -using System.Linq; -using System.Net; -using System.Net.NetworkInformation; -using System.Text; -using Newtonsoft.Json; +using Newtonsoft.Json; using skyscraper5.Docsis.MacManagement; using skyscraper5.DsmCc.Descriptors; using skyscraper5.Dvb.DataBroadcasting.IntModel; @@ -46,6 +38,15 @@ using skyscraper8.Ses; using skyscraper8.SimpleServiceDiscoveryProtocol; using skyscraper8.Skyscraper.Drawing; using skyscraper8.Skyscraper.Scraper.Storage; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Net; +using System.Net.NetworkInformation; +using System.Text; +using System.Text.RegularExpressions; using Platform = skyscraper5.Dvb.SystemSoftwareUpdate.Model.Platform; namespace skyscraper5.Skyscraper.Scraper.Storage.Filesystem @@ -1982,14 +1983,14 @@ namespace skyscraper5.Skyscraper.Scraper.Storage.Filesystem public bool TestForSisDsaci(int networkId, int tsId, ushort groupId, int versionNumber) { - string xmlFileName = Path.Combine(rootDirectory.FullName, "DVB-SIS", networkId.ToString(), tsId.ToString(), String.Format("DSACI_Group{0}_Version{1}.xml")); + string xmlFileName = Path.Combine(rootDirectory.FullName, "DVB-SIS", networkId.ToString(), tsId.ToString(), String.Format("DSACI_Group{0}_Version{1}.xml",groupId,versionNumber)); FileInfo fi = new FileInfo(xmlFileName); return fi.Exists; } - public void StoreSisDsaci(int networkId, int tsId, ushort currentDsaGroupId, int versionNumber, Stream dsaci) + public void StoreSisDsaci(int networkId, int tsId, ushort groupId, int versionNumber, Stream dsaci) { - string xmlFileName = Path.Combine(rootDirectory.FullName, "DVB-SIS", networkId.ToString(), tsId.ToString(), String.Format("DSACI_Group{0}_Version{1}.xml")); + string xmlFileName = Path.Combine(rootDirectory.FullName, "DVB-SIS", networkId.ToString(), tsId.ToString(), String.Format("DSACI_Group{0}_Version{1}.xml", groupId, versionNumber)); FileInfo fi = new FileInfo(xmlFileName); fi.Directory.EnsureExists(); diff --git a/skyscraper8/Skyscraper/Scraper/Storage/NullObjectStorage.cs b/skyscraper8/Skyscraper/Scraper/Storage/NullObjectStorage.cs index d8106af..f88acd9 100644 --- a/skyscraper8/Skyscraper/Scraper/Storage/NullObjectStorage.cs +++ b/skyscraper8/Skyscraper/Scraper/Storage/NullObjectStorage.cs @@ -137,6 +137,16 @@ namespace skyscraper8.Skyscraper.Scraper.Storage public byte[] SsdpGetMetadata(SsdpDevice ssdpDevice) { throw new NotImplementedException(); - } - } + } + + public bool TestForSisDsaci(int value1, int value2, ushort groupId, int versionNumber) + { + return true; + } + + public void StoreSisDsaci(int value1, int value2, ushort currentDsaGroupId, int versionNumber, Stream dsaci) + { + throw new NotImplementedException(); + } + } }