From 26beed9606b7e06a28232e4f51cec4fd3d197ee7 Mon Sep 17 00:00:00 2001 From: feyris-tan <4116042+feyris-tan@users.noreply.github.com> Date: Fri, 13 Feb 2026 22:06:10 +0100 Subject: [PATCH] Modernized the architecture for BAT and NIT. --- skyscraper8/Dvb/Psi/BatParser.cs | 18 ++++++++++---- skyscraper8/Dvb/Psi/Model/BatBouquet.cs | 4 +++- skyscraper8/Dvb/Psi/Model/NitNetwork.cs | 3 ++- skyscraper8/Dvb/Psi/NitParser.cs | 24 +++++++++++++------ .../Scraper/ISkyscraperUiJunction.cs | 5 ++-- .../Skyscraper/Scraper/SkyscraperContext.cs | 8 +------ .../Storage/Filesystem/FilesystemStorage.cs | 2 +- 7 files changed, 39 insertions(+), 25 deletions(-) diff --git a/skyscraper8/Dvb/Psi/BatParser.cs b/skyscraper8/Dvb/Psi/BatParser.cs index 8e7ea7d..3ec518a 100644 --- a/skyscraper8/Dvb/Psi/BatParser.cs +++ b/skyscraper8/Dvb/Psi/BatParser.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Collections.ObjectModel; using System.IO; using System.Reflection; using skyscraper5.Dvb.Descriptors; @@ -51,17 +52,23 @@ namespace skyscraper5.Dvb.Psi byte[] bouquetDescriptorsData = ms.ReadBytes(bouquetDescriptorsLength); IEnumerable outerDescriptors = TsDescriptorUnpacker.GetInstance().UnpackDescriptors(bouquetDescriptorsData, "BAT"); BatBouquet batBouquet = ParseOuterDescriptors(outerDescriptors,bouquetId); - EventHandler.OnBatBouquet(batBouquet); readUInt16Be = ms.ReadUInt16BE(); int transportStreamLoopLength = (readUInt16Be & 0x0fff); byte[] transportStreamLoopData = ms.ReadBytes(transportStreamLoopLength); - ParseTransportStream(transportStreamLoopData, batBouquet); + ReadOnlyCollection transportStreams = ParseTransportStream(transportStreamLoopData, batBouquet).ToList().AsReadOnly(); + batBouquet.TransportStreams = transportStreams; uint crc32 = ms.ReadUInt32BE(); - } - private void ParseTransportStream(byte[] transportStreamLoopData, BatBouquet batBouquet) + EventHandler.OnBatBouquet(batBouquet); + foreach(BatTransportStream ts in transportStreams) + { + EventHandler.OnBatTransportStream(batBouquet, ts); + } + } + + private IEnumerable ParseTransportStream(byte[] transportStreamLoopData, BatBouquet batBouquet) { MemoryStream ms = new MemoryStream(transportStreamLoopData, false); while (ms.GetAvailableBytes() > 6) @@ -75,7 +82,8 @@ namespace skyscraper5.Dvb.Psi byte[] transportDescriptorsData = ms.ReadBytes(transportDescriptorsLength); IEnumerable descriptors = TsDescriptorUnpacker.GetInstance().UnpackDescriptors(transportDescriptorsData, "BAT"); BatTransportStream child = ParseInnerDescriptors(transportStreamId, originalNetworkId, descriptors); - EventHandler.OnBatTransportStream(batBouquet, child); + //EventHandler.OnBatTransportStream(batBouquet, child); + yield return child; } } diff --git a/skyscraper8/Dvb/Psi/Model/BatBouquet.cs b/skyscraper8/Dvb/Psi/Model/BatBouquet.cs index 2e25da0..40386b0 100644 --- a/skyscraper8/Dvb/Psi/Model/BatBouquet.cs +++ b/skyscraper8/Dvb/Psi/Model/BatBouquet.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Collections.ObjectModel; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -35,8 +36,9 @@ namespace skyscraper5.Dvb.Psi.Model public int? ControlRemoteAccessOverInternet { get; set; } public bool? DoNotApplyRevocation { get; set; } public bool? DoNotScramble { get; set; } + public ReadOnlyCollection TransportStreams { get; internal set; } - public BatBouquet(ushort bouquetId) + public BatBouquet(ushort bouquetId) { BouquetId = bouquetId; Linkages = new List(); diff --git a/skyscraper8/Dvb/Psi/Model/NitNetwork.cs b/skyscraper8/Dvb/Psi/Model/NitNetwork.cs index 649ffd2..b9fca0b 100644 --- a/skyscraper8/Dvb/Psi/Model/NitNetwork.cs +++ b/skyscraper8/Dvb/Psi/Model/NitNetwork.cs @@ -44,8 +44,9 @@ namespace skyscraper5.Dvb.Psi.Model //from descriptor 0x41 public ServiceListDescriptor.Service[] ServiceList { get; set; } + public ReadOnlyCollection Streams { get; internal set; } - public NitNetwork(ushort networkId) + public NitNetwork(ushort networkId) { NetworkId = networkId; Linkages = new List(); diff --git a/skyscraper8/Dvb/Psi/NitParser.cs b/skyscraper8/Dvb/Psi/NitParser.cs index 6cfd7e9..4bd19be 100644 --- a/skyscraper8/Dvb/Psi/NitParser.cs +++ b/skyscraper8/Dvb/Psi/NitParser.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Collections.ObjectModel; using System.IO; using System.Reflection; using skyscraper5.Dvb.Descriptors; @@ -140,17 +141,25 @@ namespace skyscraper5.Dvb.Psi throw new NotImplementedException(dvbDescriptor.GetType().Name); } } - EventHandler.OnNitNetwork(nitNetwork); - + readUInt16Be = ms.ReadUInt16BE(); int transportStreamLoopLength = readUInt16Be & 0x0fff; byte[] transportStreamsBuffer = ms.ReadBytes(transportStreamLoopLength); - UnpackTransportStreams(networkId,transportStreamsBuffer); + + uint crc32 = ms.ReadUInt32BE(); - } - private void UnpackTransportStreams(ushort networkId, byte[] buffer) + ReadOnlyCollection nitTransportStreams = UnpackTransportStreams(networkId, transportStreamsBuffer).ToList().AsReadOnly(); + nitNetwork.Streams = nitTransportStreams; + EventHandler.OnNitNetwork(nitNetwork); + foreach (NitTransportStream stream in nitTransportStreams) + { + EventHandler.OnNitTransportStream(networkId, stream); + } + } + + private IEnumerable UnpackTransportStreams(ushort networkId, byte[] buffer) { MemoryStream ms = new MemoryStream(buffer, false); while ((ms.Length - ms.Position) > 6) @@ -162,7 +171,7 @@ namespace skyscraper5.Dvb.Psi ushort readUInt16Be = ms.ReadUInt16BE(); int transportDescriptorsLength = readUInt16Be & 0x0fff; if (transportDescriptorsLength > ms.GetAvailableBytes()) - return; + yield break; byte[] transportDescriptorBuffer = ms.ReadBytes(transportDescriptorsLength); IEnumerable descriptors = TsDescriptorUnpacker.GetInstance().UnpackDescriptors(transportDescriptorBuffer, "NIT"); foreach (TsDescriptor dvbDescriptor in descriptors) @@ -277,7 +286,8 @@ namespace skyscraper5.Dvb.Psi } } - EventHandler.OnNitTransportStream(networkId, child); + yield return child; + //EventHandler.OnNitTransportStream(networkId, child); } } diff --git a/skyscraper8/Skyscraper/Scraper/ISkyscraperUiJunction.cs b/skyscraper8/Skyscraper/Scraper/ISkyscraperUiJunction.cs index 5a97aa3..1d95ad7 100644 --- a/skyscraper8/Skyscraper/Scraper/ISkyscraperUiJunction.cs +++ b/skyscraper8/Skyscraper/Scraper/ISkyscraperUiJunction.cs @@ -28,7 +28,6 @@ namespace skyscraper5.Skyscraper.Scraper void NotifySdtService(SdtService sdtService); void NotifyPatProgram(int pmtPid, ushort programId); void NotifyPmtProgram(ProgramMapping result, int pmtPid); - void NotifyNit(NitTransportStream transportStream); void NotifyMpeTraffic(IpTrafficInfo iti, int ipv4PacketLength); void NotifyAit(AitApplication aitApplication); void DsmCcModuleAdd(int elementaryPid, ushort moduleInfoModuleId, byte moduleInfoModuleVersion); @@ -37,7 +36,6 @@ namespace skyscraper5.Skyscraper.Scraper void NotifyWss(ushort programNumber, WssDataBlock wssDataBlock); void NotifyStreamTypeDetection(string contestantTag, int pid); void NotifyBat(BatBouquet batBouquet); - void NotifyBatTs(ushort batBouquetBouquetId, BatTransportStream child); void DsmCcVfs(VfsFile vfsFile); void NotifyTot(DateTime utcTime, LocalTimeOffsetDescriptor ltod); void NotifyTdt(DateTime utcTime); @@ -188,7 +186,8 @@ namespace skyscraper5.Skyscraper.Scraper /// /// Returns true if the "Do not auto-zap" checkbox is checked in the FoundFrequenciesWIndow bool MayAutoZap(); + void NotifyNit(NitNetwork nitNetwork); - TaskQueue Tasks { get; set; } + TaskQueue Tasks { get; set; } } } diff --git a/skyscraper8/Skyscraper/Scraper/SkyscraperContext.cs b/skyscraper8/Skyscraper/Scraper/SkyscraperContext.cs index d592a76..3552853 100644 --- a/skyscraper8/Skyscraper/Scraper/SkyscraperContext.cs +++ b/skyscraper8/Skyscraper/Scraper/SkyscraperContext.cs @@ -1079,8 +1079,6 @@ namespace skyscraper5.Skyscraper.Scraper public void OnNitTransportStream(ushort networkId, NitTransportStream transportStream) { - UiJunction?.NotifyNit(transportStream); - string name; switch (transportStream.DeliveryMethod) { @@ -1128,10 +1126,7 @@ namespace skyscraper5.Skyscraper.Scraper public void OnNitNetwork(NitNetwork nitNetwork) { - if (!string.IsNullOrEmpty(nitNetwork.Name)) - { - - } + UiJunction?.NotifyNit(nitNetwork); if (nitNetwork.XaitPid.HasValue && CurrentNetworkId.HasValue) { ushort nitNetworkXaitPid = nitNetwork.XaitPid.Value; @@ -1230,7 +1225,6 @@ namespace skyscraper5.Skyscraper.Scraper public void OnBatTransportStream(BatBouquet batBouquet, BatTransportStream child) { - UiJunction?.NotifyBatTs(batBouquet.BouquetId, child); string name = String.Format("{0},{1}", batBouquet.BouquetId, child.OriginalNetworkId); if (DataStorage.TestForBatTransportStream(batBouquet.BouquetId, child)) { diff --git a/skyscraper8/Skyscraper/Scraper/Storage/Filesystem/FilesystemStorage.cs b/skyscraper8/Skyscraper/Scraper/Storage/Filesystem/FilesystemStorage.cs index d1e9995..defb3d6 100644 --- a/skyscraper8/Skyscraper/Scraper/Storage/Filesystem/FilesystemStorage.cs +++ b/skyscraper8/Skyscraper/Scraper/Storage/Filesystem/FilesystemStorage.cs @@ -51,7 +51,7 @@ using Platform = skyscraper5.Dvb.SystemSoftwareUpdate.Model.Platform; namespace skyscraper5.Skyscraper.Scraper.Storage.Filesystem { - internal class FilesystemStorage : DataStorage, ObjectStorage + public class FilesystemStorage : DataStorage, ObjectStorage { private readonly DirectoryInfo rootDirectory; private readonly string importFilesKnownFilename;