- experimental support for Xoro HB_DATABASE_C.DBM with file size of 109720 (in case there is no checksum validation)

- LG webOS 4 GlobalClone TLL now allows to set Fav H
- Panasonic svl.bin/svl.db now also uses the ONID as 3rd criteria for joining SVL and TSL tables (caused tuplicates when there are multiple ONIDs on the same transponder)
- Fav list names can no longer be edited for file formats that don't explicitly allow it
- workaround for regression that ReferenceListForm constructur throws an error when deserializing a SuperToolTip
This commit is contained in:
Horst Beham
2023-12-18 17:03:05 +01:00
parent 1f3b9cdff6
commit 77af8ea8d0
10 changed files with 179 additions and 62 deletions

View File

@@ -121,7 +121,7 @@ namespace ChanSort.Api
}
int.TryParse(value, out var intValue);
return intValue;
return sig * intValue;
}
#endregion

View File

@@ -44,6 +44,53 @@ offPcrPid=104
offVideoPid=106
;---------------------------------------
[dbm:109720]
; overall file layout
isDvbS=false
separateTvRadioData=false
offChecksum=-1
offDataLength=-1
offData=0
offTransponderBitmap=0x0000
lenTransponderBitmap=16
offTransponderData=0x0010
numTransponder=100
lenTransponderData=40
offChannelBitmap=0x0fc6
lenChannelBitmap=75
offChannelData=0x1014
numChannel=600
lenChannelData=176
;transponder record
offFreq=0
offSymRate=8
;channel record
offName=0
lenName=64
offProgNr=64
offLcn=66
offTransponderIndex=70
offServiceType=76
offHide=77
maskHide=0x04
offSkip=77
maskSkip=0x08
offLock=77
maskLock=0x10
offFavorites=79
offTsid=96
offOnid=98
offSid=100
offPcrPid=104
offVideoPid=106
;---------------------------------------
[dbm:163772]

View File

@@ -108,6 +108,9 @@ namespace ChanSort.Loader.DBM
#region ValidateChecksum()
private void ValidateChecksum()
{
if (mapping.Settings.GetInt("offChecksum") < 0)
return;
var expectedChecksum = BitConverter.ToUInt16(data, 0);
var calculatedChecksum = CalcChecksum(data, sec.GetInt("offData"), (int)mapping.GetDword("offDataLength"));
if (expectedChecksum != calculatedChecksum)
@@ -263,9 +266,13 @@ namespace ChanSort.Loader.DBM
mapping.SetByte("offFavorites", fav);
}
mapping.BaseOffset = 0;
var calculatedChecksum = CalcChecksum(data, sec.GetInt("offData"), (int)mapping.GetDword("offDataLength"));
mapping.SetWord("offChecksum", calculatedChecksum);
if (mapping.Settings.GetInt("offChecksum") >= 0)
{
mapping.BaseOffset = 0;
var calculatedChecksum = CalcChecksum(data, sec.GetInt("offData"), (int)mapping.GetDword("offDataLength"));
mapping.SetWord("offChecksum", calculatedChecksum);
}
File.WriteAllBytes(this.FileName, this.data);
}
#endregion

View File

@@ -30,6 +30,7 @@ namespace ChanSort.Loader.GlobalClone
this.Features.CanSkipChannels = true;
this.Features.CanLockChannels = true;
this.Features.CanHideChannels = true;
this.Features.FavoritesMode = FavoritesMode.Flags; // will be overwritten when a <favoriteIdx> element is found
this.DataRoot.AddChannelList(this.atvChannels);
this.DataRoot.AddChannelList(this.dtvTvChannels);
@@ -329,7 +330,7 @@ namespace ChanSort.Loader.GlobalClone
int n = info.LocalName[11] - 'A';
var mask = 1 << n;
this.Features.FavoritesMode = FavoritesMode.OrderedPerSource;
this.Features.MaxFavoriteLists = Math.Max(this.Features.MaxFavoriteLists, n);
this.Features.MaxFavoriteLists = Math.Max(this.Features.MaxFavoriteLists, n + 1);
if (((int)ch.Favorites & mask) != 0) // xml element holds bad index data (250) when fav is not set
ch.SetOldPosition(n + 1, int.Parse(info.InnerText));
}

View File

@@ -241,7 +241,7 @@ namespace ChanSort.Loader.Panasonic
select s.rowid,s.major_channel,s.physical_ch,cast(s.sname as blob),t.freq,s.skip,s.running_status,s.free_CA_mode,s.child_lock,
profile1index,profile2index,profile3index,profile4index,s.stype,s.onid,s.tsid,s.svcid,s.ntype,s.ya_svcid,delivery,ifnull(t.delivery_type, 0)
from SVL s
left outer join TSL t on s.ntype=t.ntype and s.physical_ch=t.physical_ch and s.tsid=t.tsid
left outer join TSL t on s.ntype=t.ntype and s.physical_ch=t.physical_ch and s.tsid=t.tsid and s.onid=t.onid
order by s.ntype,major_channel
";

View File

@@ -2407,6 +2407,35 @@ namespace ChanSort.Ui
#endregion
#region tabSubList_MouseUp
private void tabSubList_MouseUp(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
var list = this.CurrentChannelList;
if (list == null)
return;
if (this.currentTvSerializer?.Features.CanEditFavListNames != true)
return;
var hit = this.tabSubList.CalcHitInfo(e.Location);
if (hit.IsValid && hit.Page != null)
{
using var dlg = new TextInputForm();
dlg.StartPosition = FormStartPosition.Manual;
dlg.Location = this.tabSubList.PointToScreen(e.Location);
var favIndex = this.tabSubList.TabPages.IndexOf(hit.Page) - 1;
dlg.Text = list.GetFavListCaption(favIndex);
if (dlg.ShowDialog(this) == DialogResult.OK)
{
list.SetFavListCaption(favIndex, dlg.Text);
hit.Page.Text = list.GetFavListCaption(favIndex, true);
}
}
}
}
#endregion
#region gview_CustomUnboundColumnData
private void gview_CustomUnboundColumnData(object sender, CustomColumnDataEventArgs e)
@@ -3972,32 +4001,5 @@ namespace ChanSort.Ui
}
#endregion
#region tabSubList_MouseUp
private void tabSubList_MouseUp(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
var list = this.CurrentChannelList;
if (list == null)
return;
var hit = this.tabSubList.CalcHitInfo(e.Location);
if (hit.IsValid && hit.Page != null)
{
using var dlg = new TextInputForm();
dlg.StartPosition = FormStartPosition.Manual;
dlg.Location = this.tabSubList.PointToScreen(e.Location);
var favIndex = this.tabSubList.TabPages.IndexOf(hit.Page) - 1;
dlg.Text = list.GetFavListCaption(favIndex);
if (dlg.ShowDialog(this) == DialogResult.OK)
{
list.SetFavListCaption(favIndex, dlg.Text);
hit.Page.Text = list.GetFavListCaption(favIndex, true);
}
}
}
}
#endregion
}
}

View File

@@ -0,0 +1,6 @@
DevExpress.XtraEditors.ComboBoxEdit, DevExpress.XtraEditors.v23.1, Version=23.1.6.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a
DevExpress.XtraEditors.PictureEdit, DevExpress.XtraEditors.v23.1, Version=23.1.6.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a
DevExpress.XtraEditors.ButtonEdit, DevExpress.XtraEditors.v23.1, Version=23.1.6.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a
DevExpress.XtraEditors.CheckEdit, DevExpress.XtraEditors.v23.1, Version=23.1.6.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a
DevExpress.XtraBars.BarManager, DevExpress.XtraBars.v23.1, Version=23.1.6.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a
DevExpress.XtraEditors.Repository.RepositoryItemTextEdit, DevExpress.XtraEditors.v23.1, Version=23.1.6.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a

View File

@@ -173,14 +173,36 @@
<data name="edFile.Properties.Buttons5" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="edFile.Properties.Buttons6" type="System.Resources.ResXNullRef, System.Windows.Forms">
<data name="edFile.Properties.Buttons6" xml:space="preserve">
<value />
</data>
<data name="edFile.Properties.Buttons7" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="edFile.Properties.Buttons8" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
<data name="edFile.Properties.Buttons8" type="DevExpress.Utils.SuperToolTip, DevExpress.Utils.v23.1" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFpEZXZFeHByZXNzLlV0aWxzLnYyMy4xLCBWZXJzaW9uPTIzLjEu
Ni4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI4OGQxNzU0ZDcwMGU0OWEMAwAAAFlE
ZXZFeHByZXNzLkRhdGEudjIzLjEsIFZlcnNpb249MjMuMS42LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVi
bGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURldkV4cHJlc3MuVXRpbHMuU3VwZXJUb29s
VGlwBQAAAA1BbGxvd0h0bWxUZXh0EUZpeGVkVG9vbFRpcFdpZHRoCkl0ZW1zQ291bnQJaXRlbVR5cGUw
BWl0ZW0wBAAABAQfRGV2RXhwcmVzcy5VdGlscy5EZWZhdWx0Qm9vbGVhbgMAAAABCCVEZXZFeHByZXNz
LlV0aWxzLlN1cGVyVG9vbFRpcEl0ZW1UeXBlAgAAACFEZXZFeHByZXNzLlV0aWxzLlRvb2xUaXBUaXRs
ZUl0ZW0CAAAAAgAAAAX8////H0RldkV4cHJlc3MuVXRpbHMuRGVmYXVsdEJvb2xlYW4BAAAAB3ZhbHVl
X18ACAMAAAACAAAAAAEAAAAF+////yVEZXZFeHByZXNzLlV0aWxzLlN1cGVyVG9vbFRpcEl0ZW1UeXBl
AQAAAAd2YWx1ZV9fAAgCAAAAAQAAAAkGAAAADAcAAABRU3lzdGVtLkRyYXdpbmcsIFZlcnNpb249NC4w
LjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhBQYAAAAh
RGV2RXhwcmVzcy5VdGlscy5Ub29sVGlwVGl0bGVJdGVtBwAAAA1BbGxvd0h0bWxUZXh0BEljb24MSW1h
Z2VPcHRpb25zCkxlZnRJbmRlbnQITWF4V2lkdGgST3duZXJBbGxvd0h0bWxUZXh0BFRleHQEBAQAAAAB
H0RldkV4cHJlc3MuVXRpbHMuRGVmYXVsdEJvb2xlYW4DAAAAE1N5c3RlbS5EcmF3aW5nLkljb24HAAAA
KERldkV4cHJlc3MuVXRpbHMuVG9vbFRpcEl0ZW1JbWFnZU9wdGlvbnMCAAAACAgBAgAAAAH4/////P//
/wIAAAAKCQkAAAAAAAAAPAEAAAAGCgAAAAAFCQAAAChEZXZFeHByZXNzLlV0aWxzLlRvb2xUaXBJdGVt
SW1hZ2VPcHRpb25zBQAAAAhJbWFnZVVyaQxTdmdJbWFnZVNpemUJQWxpZ25tZW50CkltYWdlSW5kZXgT
SW1hZ2VUb1RleHREaXN0YW5jZQEEBAAAE1N5c3RlbS5EcmF3aW5nLlNpemUHAAAAJkRldkV4cHJlc3Mu
VXRpbHMuVG9vbFRpcEltYWdlQWxpZ25tZW50AgAAAAgIAgAAAAkKAAAABfX///8TU3lzdGVtLkRyYXdp
bmcuU2l6ZQIAAAAFd2lkdGgGaGVpZ2h0AAAICAcAAAAAAAAAAAAAAAX0////JkRldkV4cHJlc3MuVXRp
bHMuVG9vbFRpcEltYWdlQWxpZ25tZW50AQAAAAd2YWx1ZV9fAAgCAAAAAAAAAP////8OAAAACw==
</value>
</data>
<data name="edFile.Properties.Buttons9" type="DevExpress.Utils.ToolTipAnchor, DevExpress.Utils.v23.1">
<value>Default</value>
@@ -1127,16 +1149,4 @@ This step can be repeated as needed.</value>
<data name="&gt;&gt;$this.Type" xml:space="preserve">
<value>DevExpress.XtraEditors.XtraForm, DevExpress.Utils.v23.1, Version=23.1.6.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
</data>
<data name="edFile.Properties.Buttons8" xml:space="preserve">
<value></value>
</data>
<data name="groupControl1.Text" xml:space="preserve">
<value>1. Select reference list file</value>
</data>
<data name="groupControl2.Text" xml:space="preserve">
<value>2. Bring order to your TV file</value>
</data>
<data name="checkEdit1.Properties.Caption" xml:space="preserve">
<value>Data/Other</value>
</data>
</root>

View File

@@ -60,8 +60,20 @@ struct s_Channel
word progNrMinus1;
word lcn;
byte u3[2];
word satelliteIndex;
word transponderIndex;
union
{
struct
{
word satelliteIndex;
word transponderIndex;
} dvbs;
struct
{
byte transponderIndex;
byte unknown;
word dummy;
} dvbc;
} transponder;
byte u4[bytesBetweenTransponderIndexAndServiceType];
e_ServiceType serviceType;
e_Flags flags;
@@ -75,6 +87,7 @@ struct s_Channel
byte u7[2];
word pcrPidMaybe;
word vpidMaybe;
word pmt;
var off1 = current_offset;
byte unk[channelRecordLength - (off1-off0)];
@@ -83,14 +96,16 @@ struct s_Channel
public struct DBM
{
var hasHeader = 1;
var satBitmapLength = 0;
var satRecordCount = 0;
var satRecordLength = 0;
var transponderBitmapLength = 0;
var transponderRecordCount = 0;
var transponderRecordLength = 0;
var unknownDataLength = 0;
var unknownDataAfterTransponderData = 0;
var channelBitmapLength = 0;
var unknownDataAfterChannelBitmap = 0;
var channelRecordCount = 0;
var channelRecordLength = 0;
var bytesBetweenTransponderIndexAndServiceType = 6;
@@ -101,16 +116,32 @@ public struct DBM
// Renkforce 1510 C HD, Telestar digiHD TC 7
satBitmapLength = 0;
satRecordCount = 0;
satRecordLength = 84;
satRecordLength = 0;
transponderBitmapLength = 16;
transponderRecordCount = 100;
transponderRecordLength = 36;
unknownDataLength = 22;
unknownDataAfterTransponderData = 22;
channelBitmapLength = 50;
channelRecordCount = 400;
channelRecordLength = 176;
bytesBetweenTransponderIndexAndServiceType = 2;
break;
case 109720:
// XORO DVB-C tuner
hasHeader = 0;
satBitmapLength = 0;
satRecordCount = 0;
satRecordLength = 0;
transponderBitmapLength = 16;
transponderRecordCount = 100;
transponderRecordLength = 40;
unknownDataAfterTransponderData = 22;
channelBitmapLength = 78;
unknownDataAfterChannelBitmap = 0;
channelRecordCount = 600;
channelRecordLength = 176;
bytesBetweenTransponderIndexAndServiceType = 2;
break;
case 163772:
// TechniSat DVB-C TS_Programmliste_06_01.DBM
satBitmapLength = 0;
@@ -119,7 +150,7 @@ public struct DBM
transponderBitmapLength = 16;
transponderRecordCount = 100;
transponderRecordLength = 36;
unknownDataLength = 22;
unknownDataAfterTransponderData = 22;
channelBitmapLength = 126;
channelRecordCount = 1000;
channelRecordLength = 160;
@@ -133,7 +164,7 @@ public struct DBM
transponderBitmapLength = 376;
transponderRecordCount = 3000;
transponderRecordLength = 36;
unknownDataLength = 22;
unknownDataAfterTransponderData = 22;
channelBitmapLength = 502;
channelRecordCount = 4000;
channelRecordLength = 164;
@@ -146,7 +177,7 @@ public struct DBM
transponderBitmapLength = 376;
transponderRecordCount = 3000;
transponderRecordLength = 36;
unknownDataLength = 20;
unknownDataAfterTransponderData = 20;
channelBitmapLength = 500;
channelRecordCount = 4000;
channelRecordLength = 164;
@@ -159,7 +190,7 @@ public struct DBM
transponderBitmapLength = 376;
transponderRecordCount = 3000;
transponderRecordLength = 40;
unknownDataLength = 22;
unknownDataAfterTransponderData = 22;
channelBitmapLength = 502;
channelRecordCount = 4000;
channelRecordLength = 164;
@@ -172,7 +203,7 @@ public struct DBM
transponderBitmapLength = 376;
transponderRecordCount = 3000;
transponderRecordLength = 36;
unknownDataLength = 22;
unknownDataAfterTransponderData = 22;
channelBitmapLength = 626;
channelRecordCount = 5000;
channelRecordLength = 164;
@@ -181,9 +212,11 @@ public struct DBM
$assert(false, "Structure for this file size is not supported");
break;
}
word BytesumPlus0x55;
dword DataLengthForBytesum;
if (hasHeader != 0) {
word BytesumPlus0x55;
dword DataLengthForBytesum;
}
byte SatelliteBitmap[satBitmapLength];
s_Satellite SatelliteData[satRecordCount];
@@ -191,9 +224,12 @@ public struct DBM
byte TransponderBitmap[transponderBitmapLength];
s_Transponder TransponderData[transponderRecordCount];
byte unknown[unknownDataLength];
byte unknown[unknownDataAfterTransponderData];
byte ChannelBitmap[channelBitmapLength];
byte unknown2[unknownDataAfterChannelBitmap];
s_Channel ChannelData[channelRecordCount];
byte Extra[*];

View File

@@ -1,6 +1,14 @@
ChanSort Change Log
===================
2023-12-18
- fixed loading Panasonic tv.db / idtvChannel.bin lists which contain DVB-T2 channels
- fixed Panasonic svl.db/svl.bin lists that contained multiple transponder records with the same frequency
- LG webOS4 lists only showed favorites A-G, missing out H
- Favorite list names can now only be edited when the file formation actually supports it
- Added a few missing translations in polish and italian language
- added experimental support for Xoro DVB-C receiver HB\_DATABASE\_C.HBM format with file size 109720 (108KB)
2023-12-12
- fixed Panasonic svl.db / svl.db error "no such table SVL" when saving the list more than once
- partial support for Philips ChannelMap_120 format. The TV will only import the reordered favorite