diff --git a/readme.md b/readme.md index 77be839..48ec36d 100644 --- a/readme.md +++ b/readme.md @@ -78,7 +78,7 @@ System requirements **Hardware**: - USB stick/SD-card to transfer the channel list between your TV and PC. A stick <= 32 GB with FAT32 file system -is STRONGLY recommended. (Some TVs write gargabe to NTFS and don't support exFAT at all) +is STRONGLY recommended. (Some TVs write garbage to NTFS and don't support exFAT at all) Build from source ----------------- diff --git a/source/ChanSort.Loader.CmdbBin/ChanSort.Loader.CmdbBin.ini b/source/ChanSort.Loader.CmdbBin/ChanSort.Loader.CmdbBin.ini index fee6b81..8496789 100644 --- a/source/ChanSort.Loader.CmdbBin/ChanSort.Loader.CmdbBin.ini +++ b/source/ChanSort.Loader.CmdbBin/ChanSort.Loader.CmdbBin.ini @@ -29,6 +29,12 @@ offName=2 lenName=16 [dvbsChannel:196] +offEncrypted=11 +maskEncrypted=0x10 +offSkip=11 +maskSkip=0x20 +offLocked=11 +maskLocked=0x40 offChannelTypeOld=13 offServiceType=15 offTransponderIndex=16 @@ -99,12 +105,18 @@ offFreqInMhz=16 offSymbolRate=28 [dvbsChannel:200] -#offChannelType=-1 +offEncrypted=13 +maskEncrypted=0x10 +offSkip=13 +maskSkip=0x20 +offLocked=13 +maskLocked=0x40 +offChannelTypeOld=15 offServiceType=17 offTransponderIndex=18 offPmtPid=22 -offVideoPid=24 -offPcrPid=26 +offPcrPid=24 +offVideoPid=26 offProgramNr=32 offServiceId=34 offAudioPid=52 @@ -141,11 +153,20 @@ offFreqInMhz=16 offSymbolRate=28 [dvbsChannel:256] +offEncrypted=13 +maskEncrypted=0x10 +offSkip=13 +maskSkip=0x20 +offLocked=13 +maskLocked=0x40 offChannelType=15 offServiceType=16 +offFav=18 +maskFav=1 offTransponderIndex=20 offPmtPid=22 offPcrPid=26 +offVideoPid=28 offProgramNr=32 offServiceId=34 offAudioPid=58 @@ -155,12 +176,66 @@ offProvider=200 lenProvider=52 -# Philips format 100 lists - dtv_cmdb_2.bin with 3443 KB +# Philips ChannelMap_100 lists - dtv_cmdb_2.bin with 3443 KB #[dtv_cmdb_2.bin:3525205] # blackbox - 4532 KB -#[dtv_cmdb_2.bin:4640189] + +[dtv_cmdb_2.bin:4640189] +offChannelBitmap=8 +lenChannelBitmap=752 +offChannelRecord=0x2f8 +lenChannelRecord=608 +numChannelRecord=6000 +offTransponderBitmap=0x0037acf8 +lenTransponderBitmap=376 +offTransponderRecord=0x0037ae70 +lenTransponderRecord=320 +numTransponderRecord=3000 +offSatelliteBitmap=0x00468a24 +lenSatelliteBitmap=32 +offSatelliteRecord=0x00468a44 +lenSatelliteRecord=68 +numSatelliteRecord=254 + +[dvbsSatellite:68] +offName=2 +lenName=32 +offLowFreq=36 +offHighFreq=38 + +[dvbsTransponder:320] +offSatelliteIndex=0 +offTransportStreamId=6 +offOriginalNetworkId=8 +offNetworkId=10 +offTransponderIndex=14 +offFreqInMhz=16 +offSymbolRate=28 + +[dvbsChannel:608] +offEncrypted=13 +maskEncrypted=0x10 +offSkip=13 +maskSkip=0x20 +offLocked=13 +maskLocked=0x40 +offChannelType=15 +offServiceType=16 +offFav=18 +maskFav=1 +offTransponderIndex=20 +offPmtPid=22 +offPcrPid=26 +offVideoPid=28 +offProgramNr=32 +offServiceId=34 +offAudioPid=58 +offName=246 +lenName=66 +offProvider=312 +lenProvider=270 @@ -199,11 +274,20 @@ offFreqInMhz=16 offSymbolRate=28 [dvbsChannel:660] +offEncrypted=13 +maskEncrypted=0x10 +offSkip=13 +maskSkip=0x20 +offLocked=13 +maskLocked=0x40 offChannelType=15 offServiceType=16 +offFav=18 +maskFav=1 offTransponderIndex=20 offPmtPid=22 offPcrPid=26 +offVideoPid=28 offProgramNr=32 offServiceId=34 offAudioPid=58 diff --git a/source/ChanSort.Loader.CmdbBin/CmdbFileSerializer.cs b/source/ChanSort.Loader.CmdbBin/CmdbFileSerializer.cs index b104293..3b3d8c5 100644 --- a/source/ChanSort.Loader.CmdbBin/CmdbFileSerializer.cs +++ b/source/ChanSort.Loader.CmdbBin/CmdbFileSerializer.cs @@ -21,10 +21,22 @@ namespace ChanSort.Loader.CmdbBin public CmdbFileSerializer(string inputFile) : base(inputFile) { + this.Features.FavoritesMode = FavoritesMode.Flags; + this.Features.MaxFavoriteLists = 1; + this.DataRoot.AddChannelList(dvbsTv); this.DataRoot.AddChannelList(dvbsRadio); // this.DataRoot.AddChannelList(dvbsData); // there seem to be multiple data lists with Toshiba TVs which all have their own numbering starting at 1. Better don't show data channels at all than dupes this.ReadConfigurationFromIniFile(); + + foreach (var list in this.DataRoot.ChannelLists) + { + //list.VisibleColumnFieldNames.Remove(nameof(ChannelInfo.Favorites)); + //list.VisibleColumnFieldNames.Remove(nameof(ChannelInfo.Skip)); + //list.VisibleColumnFieldNames.Remove(nameof(ChannelInfo.Lock)); + list.VisibleColumnFieldNames.Remove(nameof(ChannelInfo.Hidden)); + //list.VisibleColumnFieldNames.Remove(nameof(ChannelInfo.Encrypted)); + } } #region ReadConfigurationFromIniFile() @@ -109,13 +121,16 @@ namespace ChanSort.Loader.CmdbBin } #endregion + #region ReadSatellite() private void ReadSatellite(DataMapping map, int index) { var sat = new Satellite(index); sat.Name = map.GetString("offName", map.Settings.GetInt("lenName")); this.DataRoot.AddSatellite(sat); } - + #endregion + + #region ReadTransponder() private void ReadTransponder(DataMapping map, int index) { //var idx = map.GetWord("offTransponderIndex"); // seems to be some logical number, skipping a new numbers here and there @@ -129,6 +144,7 @@ namespace ChanSort.Loader.CmdbBin tp.SymbolRate = map.GetWord("offSymbolRate"); this.DataRoot.AddTransponder(tp.Satellite, tp); } + #endregion #region ReadChannel() private void ReadChannel(DataMapping chanMap, ChannelList tvList, ChannelList radioList, ChannelList dataList, int recordIndex) @@ -137,8 +153,9 @@ namespace ChanSort.Loader.CmdbBin if (channelType == 0) // some file format versions store the channel type in the upper nibble of a byte channelType = chanMap.GetByte("offChannelTypeOld") >> 4; var serviceType = chanMap.GetByte("offServiceType"); - var apid = chanMap.GetWord("offAudioPid") & 0x1FFF; - var vpid = chanMap.GetWord("offVideoPid") & 0x1FFF; + + if (chanMap.Settings.GetInt("offFav", -1) < 0) + this.Features.FavoritesMode = FavoritesMode.None; ChannelList list; if (channelType != 0) @@ -149,10 +166,7 @@ namespace ChanSort.Loader.CmdbBin list = type == SignalSource.Radio ? radioList : type == SignalSource.Tv ? tvList : dataList; } else - { - //list = vpid != 0 && vpid != 0x1FFF ? tvList : apid != 0 && apid != 0x1FFF ? radioList : dataList; list = tvList; - } var progNr = (int)chanMap.GetWord("offProgramNr"); if (progNr == 0xFFFE) @@ -163,8 +177,12 @@ namespace ChanSort.Loader.CmdbBin ch.ServiceTypeName = Api.LookupData.Instance.GetServiceTypeDescription(ch.ServiceType); ch.PcrPid = chanMap.GetWord("offPcrPid") & 0x1FFF; ch.ServiceId = chanMap.GetWord("offServiceId"); - ch.AudioPid = apid; - ch.VideoPid = vpid; + ch.AudioPid = chanMap.GetWord("offAudioPid"); + ch.Encrypted = chanMap.GetFlag("Encrypted"); + ch.VideoPid = chanMap.GetWord("offVideoPid") & 0x1FFF; + ch.Skip = chanMap.GetFlag("Skip"); + ch.Lock = chanMap.GetFlag("Locked"); + ch.Favorites = chanMap.GetFlag("Fav") ? Favorites.A : 0; var off = chanMap.BaseOffset + chanMap.GetOffsets("offName")[0]; this.dvbStringDecoder.GetChannelNames(chanMap.Data, off, chanMap.Settings.GetInt("lenName"), out var longName, out var shortName); diff --git a/source/ChanSort.Loader.CmdbBin/CmdbPlugin.cs b/source/ChanSort.Loader.CmdbBin/CmdbPlugin.cs index 685ae16..7ac1150 100644 --- a/source/ChanSort.Loader.CmdbBin/CmdbPlugin.cs +++ b/source/ChanSort.Loader.CmdbBin/CmdbPlugin.cs @@ -1,4 +1,5 @@ -using ChanSort.Api; +using System.IO; +using ChanSort.Api; namespace ChanSort.Loader.CmdbBin { @@ -10,7 +11,15 @@ namespace ChanSort.Loader.CmdbBin public SerializerBase CreateSerializer(string inputFile) { - return new CmdbFileSerializer(inputFile); + var dir = Path.GetDirectoryName(inputFile); + + // ignore Philips ChannelMap_100 channel lists which don't have atv_cmdb.bin and dtv_cmdb_2.bin in the same folder + + var anchorFile = Path.Combine(dir, "dtv_cmdb_2.bin"); + if (File.Exists(anchorFile) && File.Exists(Path.Combine(dir, "atv_cmdb.bin"))) + return new CmdbFileSerializer(anchorFile); + + return null; } } } diff --git a/source/Information/FileStructures_for_HHD_Hex_Editor_Neo/dtv_cmdb_2-bin.h b/source/Information/FileStructures_for_HHD_Hex_Editor_Neo/dtv_cmdb_2-bin.h index 30201ec..7a840dd 100644 --- a/source/Information/FileStructures_for_HHD_Hex_Editor_Neo/dtv_cmdb_2-bin.h +++ b/source/Information/FileStructures_for_HHD_Hex_Editor_Neo/dtv_cmdb_2-bin.h @@ -7,7 +7,25 @@ enum ChannelType : byte { Tv = 1, - Radio = 2 + Radio = 2, + Data = 3, + Data5 = 5 +}; + +struct Flags +{ + byte u1 : 3; + byte protected : 1; + byte u2 : 1; + byte skip : 1; + byte locked : 1; + byte u3 : 1; +}; + +struct ChannelTypeNibble +{ + byte unk : 4; + ChannelType type : 4; }; struct DvbId @@ -20,7 +38,9 @@ struct Channel_5048 { var off0 = current_offset; word channelIndex; - byte u1[13]; + byte u1[11]; + Flags flags; + byte u1b; ChannelType channelType; word serviceType; byte u2[2]; @@ -36,7 +56,8 @@ struct Channel_5048 byte u6[186]; char name[66]; char provider[270]; - byte unk[channelSize - (current_offset - off0)]; + byte unk[channelSize - 4 - (current_offset - off0)]; + dword bytesum; }; struct Transponder_5048 @@ -91,6 +112,94 @@ public struct dtv_cmdb_2_5048 }; + +#undef channelSize +#define channelSize 608 +#undef transponderSize +#define transponderSize 320 +#undef satelliteSize +#define satelliteSize 68 + +struct Channel_4532 +{ + var off0 = current_offset; + word channelIndex; + byte u1[11]; + Flags flags; + byte u1b; + ChannelType channelType; + word serviceType; + byte u2[2]; + word transponderIndex; + word pmtPid; + word u3; + word pcrPid; + word videoPid; + word u4; + word programNr; + word serviceId; + byte u5[22]; + word audioPid; + byte u6[186]; + char name[66]; + char provider[270]; + byte unk[channelSize - 4 - (current_offset - off0)]; + dword bytesum; +}; + +struct Transponder_4532 +{ + var off0 = current_offset; + word satelliteIndex; + word u1[2]; + word tsid; + word onid; + word nid_maybe; + word u2; + word transpoderNumber; + word freqInMhz; + byte u3[10]; + word symrate; + byte unk[transponderSize - (current_offset - off0)]; +}; + +struct Satellite_4532 +{ + var off0 = current_offset; + byte u1[2]; + char name[32]; + byte u2[2]; + word lowFreq; + word highFreq; + byte unk[satelliteSize - (current_offset - off0)]; +}; + +public struct dtv_cmdb_2_4532 +{ + char magic[4]; + word u1; + word u2; + byte channelBitmap[752]; + Channel_4532 channels[6000]; + + byte transponderBitmap[376]; + Transponder_4532 transponder[3000]; + + byte unknownBitmap[32]; + struct { + word u1; + word onid; + byte unknownData[50]; + } unknown[254]; + + byte satelliteBitmap[32]; + Satellite_4532 satellites[254]; + + byte _0x30; +}; + + + #undef channelSize #define channelSize 256 #undef transponderSize @@ -102,7 +211,9 @@ struct Channel_1684 { var off0 = current_offset; word channelIndex; - byte u1[13]; + byte u1[11]; + Flags flags; + byte u1b; ChannelType channelType; word serviceType; byte u2[2]; @@ -119,7 +230,8 @@ struct Channel_1684 byte u6[90]; char name[50]; char provider[52]; - byte unk[channelSize - (current_offset - off0)]; + byte unk[channelSize - 4 - (current_offset - off0)]; + dword bytesum; }; struct Transponder_1684 @@ -185,8 +297,10 @@ struct Channel_1322 { var off0 = current_offset; word channelIndex; - byte u1[14]; - //ChannelType channelType; + byte u1[11]; + Flags flags; + byte u1b; + ChannelTypeNibble channelType; byte u1b; byte serviceType; word transponderIndex; @@ -201,7 +315,8 @@ struct Channel_1322 DvbId audioPid; byte u6[90]; char name[50]; - byte unk[channelSize - (current_offset - off0)]; + byte unk[channelSize - 4 - (current_offset - off0)]; + dword bytesum; }; struct Transponder_1322 @@ -265,7 +380,11 @@ struct Channel_1296 { var off0 = current_offset; word channelIndex; - byte u1[13]; + byte u1[9]; + Flags flags_maybe; + byte u1a; + ChannelTypeNibble type; + byte u1b; byte serviceType; word transponderIndex; DvbId pmtPid; @@ -280,7 +399,8 @@ struct Channel_1296 DvbId audioPid; byte u6[90]; char name[50]; - byte unk[channelSize - (current_offset - off0)]; + byte unk[channelSize - 4 -(current_offset - off0)]; + dword bytesum; }; struct Transponder_1296 diff --git a/source/changelog.md b/source/changelog.md index 80d20e0..628e669 100644 --- a/source/changelog.md +++ b/source/changelog.md @@ -6,8 +6,8 @@ ChanSort Change Log - Philips: added ChanSort.Loader.Philips.ini file to try out different configurations until working ones get confirmed. - Philips: disabled deleting channels for most file formats (they require files for menu and tuner to be kept in-sync). - Philips: identified several variants of ChannelMap_100 format which now have special handling. - one that exports \*cmdb\*.bin files is now fully tested and working. - ones that export only .xml files inside the channellib and s2channellib folders should work too, but not confirmed. + - one that exports \*cmdb\*.bin files is now fully tested and working. + - ones that export only .xml files inside the channellib and s2channellib folders should work too, but not confirmed. - Philips: ChannelFormat_105 and 110 specific settings in .ini, currently best-effort without user confirmation. - Philips: added support for Repair\\Mgr_chan_s_fta.db lists. Can be read as a reference list, but editing is currently disabled in the .ini file (enabling it is experimental) diff --git a/source/fileformats.md b/source/fileformats.md index 933f3fc..9c084db 100644 --- a/source/fileformats.md +++ b/source/fileformats.md @@ -23,7 +23,7 @@ https://github.com/PredatH0r/ChanSort/wiki/Samsung - Series based on webOS 2-5 exporting a GlobalClone00001.TLL file \*: Some devices behave erroneously due to firmware issues. -+: See system requirements for LM-series. xxLM640T is not supported due to its firmware limitations. ++: xxLM640T is not supported due to its firmware limitations. \#: Only satellite channels supported. Models with the NetCast operating system don't have the export/import function in the menu. Instead you need to press+hold the @@ -36,8 +36,8 @@ Always select "none / other / all" and never your cable TV provider or something Sony --- -- Android-TVs "sdb.xml" files using format "FormateVer" 1.1.0 -- KDL 2012/2014 "sdb.xml" files using "FormatVer" 1.0.0, 1.1.0 and 1.2.0 +- Android-TVs: "sdb.xml" files using format "FormateVer" 1.1.0 +- KDL 2012/2014: "sdb.xml" files using "FormatVer" 1.0.0, 1.1.0 and 1.2.0 Hisense --- @@ -49,7 +49,7 @@ Special thanks to Hisense for supporting ChanSort with technical information and Panasonic --- -Most Viera models since 2011 with a channel list formats +Most Viera models since 2011 with channel list formats - svl.bin - svl.db @@ -63,7 +63,7 @@ ChanSort currently supports the formats: Sharp (and some models from Dyon, Blaupunkt, Hisense, Changhong, Grundig, alphatronics, JTC Genesis) --- -Some of these TV share similar hardware and can export/import a .csv file allowing to change the channel order: +Some of these TVs share similar hardware and can export/import a .csv file allowing to change the channel order: - DVBS_Program.csv (alongside cvt_database.dat) - DVBS_CHANNEL_TABLE.csv (alongside dtv_cmdb\*.bin) - MS\*_DVBS_CHANNEL_TABLE.csv (alongside MS\*_HOTELMODE_TABLE.json) diff --git a/source/fileformats_de.md b/source/fileformats_de.md index a1eaffb..b114cc4 100644 --- a/source/fileformats_de.md +++ b/source/fileformats_de.md @@ -23,7 +23,7 @@ https://github.com/PredatH0r/ChanSort/wiki/Samsung - Serien basierend auf webOS 2-5, die eine GlobalClone00001.TLL-Datei exportieren \*: Einige Geräte verhalten sich fehlerhaft aufgrund Probleme in deren Firmware. -+: Siehe Systemanforderungen für die LM-Serie. xxLM640T kann aufgrund von Firmwaremängeln nicht unterstützt werden. ++: xxLM640T kann aufgrund von Firmwaremängeln nicht unterstützt werden. \#: Nur Satellitensender werden unterstützt. Modelle mit NetCast Betriebssytem beinhalten keine Import/Export Funktion im normalen Menü. Um das Geheimmenü aufzurufen, @@ -36,8 +36,8 @@ W Sony --- -- Android-TV "sdb.xml" Dateien mit Version "FormateVer" 1.1.0 -- KDL 2012/2014 "sdb.xml" mit "FormatVer" 1.0.0, 1.1.0 and 1.2.0 +- Android-TVs: "sdb.xml" Dateien mit Version "FormateVer" 1.1.0 +- KDL 2012/2014: "sdb.xml" mit "FormatVer" 1.0.0, 1.1.0 and 1.2.0 Hisense ---