From ec80b97e1d665dfca3c25008822fbd848e588474 Mon Sep 17 00:00:00 2001 From: feyris-tan <4116042+feyris-tan@users.noreply.github.com> Date: Sun, 22 Jun 2025 16:56:32 +0200 Subject: [PATCH] All three DVB-NIP (and the sole DVB-I) test signals work now. --- .../SkyscraperVfs/ObjectCarouselMetadata.cs | 3 ++ skyscraper8/DvbI/DvbIFilesystemProcessor.cs | 2 +- skyscraper8/DvbI/DvbIUtils.cs | 35 +++++++++------- ...ep_app1_DVB-I_slep_app2_DVB-I_slep_app3.cs | 9 ++-- skyscraper8/DvbNip/DvbNipReceiver.cs | 5 +++ skyscraper8/DvbNip/DvbNipUtilities.cs | 42 +++++++++++++++++-- skyscraper8/Properties/launchSettings.json | 2 +- .../InMemory/InMemoryScraperStorage.cs | 2 + ...astGatewayConfigurationTransportSession.cs | 6 ++- 9 files changed, 80 insertions(+), 26 deletions(-) diff --git a/skyscraper8/Dvb/DataBroadcasting/SkyscraperVfs/ObjectCarouselMetadata.cs b/skyscraper8/Dvb/DataBroadcasting/SkyscraperVfs/ObjectCarouselMetadata.cs index 63e4394..b7692a3 100644 --- a/skyscraper8/Dvb/DataBroadcasting/SkyscraperVfs/ObjectCarouselMetadata.cs +++ b/skyscraper8/Dvb/DataBroadcasting/SkyscraperVfs/ObjectCarouselMetadata.cs @@ -54,6 +54,9 @@ namespace skyscraper5.Dvb.DataBroadcasting.SkyscraperVfs public bool FileExists(string filename) { + if (string.IsNullOrEmpty(filename)) + return false; + if (filename.StartsWith("/")) filename = filename.Replace('/', '\\'); diff --git a/skyscraper8/DvbI/DvbIFilesystemProcessor.cs b/skyscraper8/DvbI/DvbIFilesystemProcessor.cs index b6d9543..a3adc68 100644 --- a/skyscraper8/DvbI/DvbIFilesystemProcessor.cs +++ b/skyscraper8/DvbI/DvbIFilesystemProcessor.cs @@ -63,7 +63,7 @@ namespace skyscraper8.DvbI byte[] slepBytes = vfs.GetFile(INDEX_FILENAME); ServiceListEntryPoints serviceListEntryPoints = DvbIUtils.UnpackServiceListEntryPoints(slepBytes); - IEnumerable enumerable = DvbIUtils.FlattenServiceListEntryPoints(serviceListEntryPoints); + List enumerable = DvbIUtils.FlattenServiceListEntryPoints(serviceListEntryPoints).ToList(); foreach(DvbiServiceList serviceList in enumerable) { DateTime serviceListLastChecked; diff --git a/skyscraper8/DvbI/DvbIUtils.cs b/skyscraper8/DvbI/DvbIUtils.cs index 445b631..fd044dd 100644 --- a/skyscraper8/DvbI/DvbIUtils.cs +++ b/skyscraper8/DvbI/DvbIUtils.cs @@ -17,29 +17,30 @@ namespace skyscraper8.DvbI private static XmlSerializer serviceListEntryPointSerializer; public static ServiceListEntryPoints UnpackServiceListEntryPoints(byte[] buffer) - { - MemoryStream slepStream = new MemoryStream(buffer, false); - return UnpackServiceListEntryPoints(slepStream); - } - - public static ServiceListEntryPoints UnpackServiceListEntryPoints(Stream slepStream) { if (serviceListEntryPointSerializer == null) serviceListEntryPointSerializer = new XmlSerializer(typeof(ServiceListEntryPoints)); - object slepWrapped = serviceListEntryPointSerializer.Deserialize(slepStream); + string s = Encoding.UTF8.GetString(buffer); + s = s.Replace("", ""); + s = s.Replace("", ""); + + object slepWrapped = serviceListEntryPointSerializer.Deserialize(new StringReader(s)); ServiceListEntryPoints serviceListEntryPoint = (ServiceListEntryPoints)slepWrapped; return serviceListEntryPoint; } - + private static XmlSerializer serviceListSerializer; public static ServiceListType UnpackServiceList(byte[] buffer) { if (serviceListSerializer == null) serviceListSerializer = new XmlSerializer(typeof(ServiceListType)); - MemoryStream slStream = new MemoryStream(buffer, false); - object slWrapped = serviceListSerializer.Deserialize(slStream); + string s = Encoding.UTF8.GetString(buffer); + s = s.Replace("", ""); + s = s.Replace("", ""); + + object slWrapped = serviceListSerializer.Deserialize(new StringReader(s)); ServiceListType slt = (ServiceListType)slWrapped; return slt; } @@ -54,12 +55,16 @@ namespace skyscraper8.DvbI serviceList.Id = serviceListOffering.ServiceListId; serviceList.Name = serviceListOffering.ServiceListName; - foreach(ServiceListEntryPointsProviderOfferingServiceListOfferingDelivery delivery in serviceListOffering.Delivery) + if (serviceListOffering.Delivery != null) { - if (delivery.DASHDelivery != null && string.IsNullOrEmpty(serviceList.DashDelivery)) - serviceList.DashDelivery = delivery.DASHDelivery; - if (delivery.DVBSDelivery != null && string.IsNullOrEmpty(serviceList.DvbSDelivery)) - serviceList.DvbSDelivery = delivery.DVBSDelivery[0].OrbitalPosition; + foreach (ServiceListEntryPointsProviderOfferingServiceListOfferingDelivery delivery in + serviceListOffering.Delivery) + { + if (delivery.DASHDelivery != null && string.IsNullOrEmpty(serviceList.DashDelivery)) + serviceList.DashDelivery = delivery.DASHDelivery; + if (delivery.DVBSDelivery != null && string.IsNullOrEmpty(serviceList.DvbSDelivery)) + serviceList.DvbSDelivery = delivery.DVBSDelivery[0].OrbitalPosition; + } } if (serviceListOffering.RelatedMaterial != null) diff --git a/skyscraper8/DvbI/Model/DVB-I_slep_DVB-I_slep_app1_DVB-I_slep_app2_DVB-I_slep_app3.cs b/skyscraper8/DvbI/Model/DVB-I_slep_DVB-I_slep_app1_DVB-I_slep_app2_DVB-I_slep_app3.cs index 08e019b..05eefda 100644 --- a/skyscraper8/DvbI/Model/DVB-I_slep_DVB-I_slep_app1_DVB-I_slep_app2_DVB-I_slep_app3.cs +++ b/skyscraper8/DvbI/Model/DVB-I_slep_DVB-I_slep_app1_DVB-I_slep_app2_DVB-I_slep_app3.cs @@ -224,10 +224,11 @@ namespace moe.yo3explorer.skyscraper8.DVBI.Model { private string uRIField; private string contentTypeField; - - /// - //[System.Xml.Serialization.XmlElementAttribute(Namespace="urn:dvb:metadata:servicediscovery-types:2023")] - public string URI { + + /// + //[System.Xml.Serialization.XmlElementAttribute(Namespace="urn:dvb:metadata:servicediscovery-types:2023")] + [System.Xml.Serialization.XmlElementAttribute("URI")] + public string URI { get { return this.uRIField; } diff --git a/skyscraper8/DvbNip/DvbNipReceiver.cs b/skyscraper8/DvbNip/DvbNipReceiver.cs index 7af5d66..82313da 100644 --- a/skyscraper8/DvbNip/DvbNipReceiver.cs +++ b/skyscraper8/DvbNip/DvbNipReceiver.cs @@ -180,6 +180,9 @@ namespace skyscraper8.DvbNip string rawSlepString = Encoding.UTF8.GetString(rawSlepBytes); rawSlepString = rawSlepString.Replace("(); + if (string.IsNullOrEmpty(url)) + return; if (!serviceListUrls.ContainsKey(url)) { diff --git a/skyscraper8/DvbNip/DvbNipUtilities.cs b/skyscraper8/DvbNip/DvbNipUtilities.cs index 2bc2799..2296c0a 100644 --- a/skyscraper8/DvbNip/DvbNipUtilities.cs +++ b/skyscraper8/DvbNip/DvbNipUtilities.cs @@ -47,6 +47,7 @@ namespace skyscraper8.DvbNip case ".mpd": case ".m4s": case ".m3u8": + case ".ts": return true; default: return false; @@ -66,7 +67,15 @@ namespace skyscraper8.DvbNip privateDataSignallingManifestXmlSerializer = new XmlSerializer(typeof(PrivateDataSignallingManifestType)); } - object v = privateDataSignallingManifestXmlSerializer.Deserialize(toStream); + byte[] buffer = new byte[toStream.Length]; + toStream.Read(buffer, 0, (int)toStream.Length); + string bufferString = Encoding.UTF8.GetString(buffer, 0, (int)toStream.Length); + if (bufferString.Contains("urn:dvb:metadata:nativeip:2023")) + { + bufferString = bufferString.Replace("urn:dvb:metadata:nativeip:2023", "urn:dvb:metadata:nativeip:2024"); + } + + object v = privateDataSignallingManifestXmlSerializer.Deserialize(new StringReader(bufferString)); PrivateDataSignallingManifestType result = (PrivateDataSignallingManifestType)v; return result; } @@ -80,7 +89,16 @@ namespace skyscraper8.DvbNip timeOffsetFileXmlSerializer = new XmlSerializer(typeof(TimeOffsetFileType)); } - object v = timeOffsetFileXmlSerializer.Deserialize(toStream); + byte[] buffer = new byte[toStream.Length]; + toStream.Read(buffer, 0, (int)toStream.Length); + string bufferString = Encoding.UTF8.GetString(buffer, 0, (int)toStream.Length); + if (bufferString.Contains("urn:dvb:metadata:nativeip:2023")) + { + bufferString = bufferString.Replace("urn:dvb:metadata:nativeip:2023", "urn:dvb:metadata:nativeip:2024"); + } + + + object v = timeOffsetFileXmlSerializer.Deserialize(new StringReader(bufferString)); TimeOffsetFileType result = (TimeOffsetFileType)v; return result; } @@ -93,7 +111,15 @@ namespace skyscraper8.DvbNip networkInformationFileXmlSerializer = new XmlSerializer(typeof(NetworkInformationFileType)); } - object v = networkInformationFileXmlSerializer.Deserialize(toStream); + byte[] buffer = new byte[toStream.Length]; + toStream.Read(buffer, 0, (int)toStream.Length); + string bufferString = Encoding.UTF8.GetString(buffer, 0, (int)toStream.Length); + if (bufferString.Contains("urn:dvb:metadata:nativeip:2023")) + { + bufferString = bufferString.Replace("urn:dvb:metadata:nativeip:2023", "urn:dvb:metadata:nativeip:2024"); + } + + object v = networkInformationFileXmlSerializer.Deserialize(new StringReader(bufferString)); NetworkInformationFileType result = (NetworkInformationFileType)v; return result; } @@ -105,8 +131,16 @@ namespace skyscraper8.DvbNip { serviceInformationFileXmlSerializer = new XmlSerializer(typeof(ServiceInformationFileType)); } + + byte[] buffer = new byte[toStream.Length]; + toStream.Read(buffer, 0, (int)toStream.Length); + string bufferString = Encoding.UTF8.GetString(buffer, 0, (int)toStream.Length); + if (bufferString.Contains("urn:dvb:metadata:nativeip:2023")) + { + bufferString = bufferString.Replace("urn:dvb:metadata:nativeip:2023", "urn:dvb:metadata:nativeip:2024"); + } - object v = serviceInformationFileXmlSerializer.Deserialize(toStream); + object v = serviceInformationFileXmlSerializer.Deserialize(new StringReader(bufferString)); ServiceInformationFileType result = (ServiceInformationFileType)v; return result; } diff --git a/skyscraper8/Properties/launchSettings.json b/skyscraper8/Properties/launchSettings.json index e9429fe..b746a2f 100644 --- a/skyscraper8/Properties/launchSettings.json +++ b/skyscraper8/Properties/launchSettings.json @@ -2,7 +2,7 @@ "profiles": { "skyscraper8": { "commandName": "Project", - "commandLineArgs": "\"E:\\NIP-Research\\nip.m3u8\"", + "commandLineArgs": "\"C:\\Temp\\Hotbird130_12380_V_NIP.ts\"\r\n", "remoteDebugEnabled": false }, "Container (Dockerfile)": { diff --git a/skyscraper8/Skyscraper/Scraper/Storage/InMemory/InMemoryScraperStorage.cs b/skyscraper8/Skyscraper/Scraper/Storage/InMemory/InMemoryScraperStorage.cs index 1203e96..52647d7 100644 --- a/skyscraper8/Skyscraper/Scraper/Storage/InMemory/InMemoryScraperStorage.cs +++ b/skyscraper8/Skyscraper/Scraper/Storage/InMemory/InMemoryScraperStorage.cs @@ -1584,6 +1584,8 @@ namespace skyscraper5.Skyscraper.Scraper.Storage.InMemory { if (_dvbiServiceLists == null) _dvbiServiceLists = new Dictionary(); + if (string.IsNullOrEmpty(serviceList.Id)) + return; _dvbiServiceLists.Add(serviceList.Id, serviceList); } diff --git a/skyscraper8/Skyscraper/Scraper/Storage/Utilities/DatabaseKeyNipMulticastGatewayConfigurationTransportSession.cs b/skyscraper8/Skyscraper/Scraper/Storage/Utilities/DatabaseKeyNipMulticastGatewayConfigurationTransportSession.cs index 7b9099b..6e65579 100644 --- a/skyscraper8/Skyscraper/Scraper/Storage/Utilities/DatabaseKeyNipMulticastGatewayConfigurationTransportSession.cs +++ b/skyscraper8/Skyscraper/Scraper/Storage/Utilities/DatabaseKeyNipMulticastGatewayConfigurationTransportSession.cs @@ -17,7 +17,11 @@ namespace skyscraper8.Skyscraper.Scraper.Storage.Utilities this.LinkId = carrier.NipLinkId; this.NetworkId = carrier.NipNetworkId; this.ServiceId = carrier.NipServiceId; - this.SourceAddress = IPAddress.Parse(address.NetworkSourceAddress); + if (!string.IsNullOrEmpty(address.NetworkSourceAddress)) + { + this.SourceAddress = IPAddress.Parse(address.NetworkSourceAddress); + } + this.DestinationAddress = IPAddress.Parse(address.NetworkDestinationGroupAddress); this.DestinationPort = ushort.Parse(address.TransportDestinationPort); this.TSI = long.Parse(address.MediaTransportSessionIdentifier);