Modernized the architecture for BAT and NIT.
Some checks failed
🚀 Pack skyscraper8 / make-zip (push) Failing after 42s

This commit is contained in:
feyris-tan 2026-02-13 22:06:10 +01:00
parent 08abdb0fb6
commit 26beed9606
7 changed files with 39 additions and 25 deletions

View File

@ -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<TsDescriptor> 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<BatTransportStream> 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<BatTransportStream> 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<TsDescriptor> descriptors = TsDescriptorUnpacker.GetInstance().UnpackDescriptors(transportDescriptorsData, "BAT");
BatTransportStream child = ParseInnerDescriptors(transportStreamId, originalNetworkId, descriptors);
EventHandler.OnBatTransportStream(batBouquet, child);
//EventHandler.OnBatTransportStream(batBouquet, child);
yield return child;
}
}

View File

@ -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<BatTransportStream> TransportStreams { get; internal set; }
public BatBouquet(ushort bouquetId)
public BatBouquet(ushort bouquetId)
{
BouquetId = bouquetId;
Linkages = new List<LinkageDescriptor>();

View File

@ -44,8 +44,9 @@ namespace skyscraper5.Dvb.Psi.Model
//from descriptor 0x41
public ServiceListDescriptor.Service[] ServiceList { get; set; }
public ReadOnlyCollection<NitTransportStream> Streams { get; internal set; }
public NitNetwork(ushort networkId)
public NitNetwork(ushort networkId)
{
NetworkId = networkId;
Linkages = new List<LinkageDescriptor>();

View File

@ -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<NitTransportStream> nitTransportStreams = UnpackTransportStreams(networkId, transportStreamsBuffer).ToList().AsReadOnly();
nitNetwork.Streams = nitTransportStreams;
EventHandler.OnNitNetwork(nitNetwork);
foreach (NitTransportStream stream in nitTransportStreams)
{
EventHandler.OnNitTransportStream(networkId, stream);
}
}
private IEnumerable<NitTransportStream> 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<TsDescriptor> 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);
}
}

View File

@ -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
/// </summary>
/// <returns>Returns true if the "Do not auto-zap" checkbox is checked in the FoundFrequenciesWIndow</returns>
bool MayAutoZap();
void NotifyNit(NitNetwork nitNetwork);
TaskQueue Tasks { get; set; }
TaskQueue Tasks { get; set; }
}
}

View File

@ -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))
{

View File

@ -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;