mirror of
https://github.com/PredatH0r/ChanSort.git
synced 2026-01-14 19:32:04 +01:00
- 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:
@@ -121,7 +121,7 @@ namespace ChanSort.Api
|
||||
}
|
||||
|
||||
int.TryParse(value, out var intValue);
|
||||
return intValue;
|
||||
return sig * intValue;
|
||||
}
|
||||
#endregion
|
||||
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
@@ -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
|
||||
";
|
||||
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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=">>$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>
|
||||
@@ -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[*];
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user