From 954b44ed7a95d27d2b9ff21fe0b64837b8c761b7 Mon Sep 17 00:00:00 2001 From: Horst Beham Date: Tue, 22 Nov 2022 21:36:01 +0100 Subject: [PATCH] - fixed "Export to Excel" (copies the list as tab-separated text into clipboard) - included latest translation to Polish (thanks to J.D.) - reorganized File menu and tool bar - allow renaming channels in SatcoDX channel lists (\*.sdx) - improved support for Panasonic LS 500 / LX 700 series --- source/ChanSort.Api/Model/ChannelList.cs | 3 +- source/ChanSort.Api/Utils/CsvFile.cs | 110 ++-- .../ChanSort.Loader.LG/Resource.Designer.cs | 2 +- source/ChanSort.Loader.LG/Resource.pl.resx | 2 +- source/ChanSort.Loader.Loewe/Serializer.cs | 6 +- source/ChanSort.Loader.Panasonic/DbChannel.cs | 10 +- .../IdtvChannelSerializer.cs | 545 +++++++++++------- .../ChanSort.Loader.SatcoDX.csproj | 4 + source/ChanSort.Loader.SatcoDX/Channel.cs | 17 + source/ChanSort.Loader.SatcoDX/Serializer.cs | 27 +- source/ChanSort/MainForm.Designer.cs | 31 +- source/ChanSort/MainForm.cs | 13 +- source/ChanSort/MainForm.resx | 54 +- source/ChanSort/ReferenceListForm.resx | 3 + source/Translation.xlsx | Bin 110181 -> 112713 bytes source/changelog.md | 12 +- 16 files changed, 529 insertions(+), 310 deletions(-) diff --git a/source/ChanSort.Api/Model/ChannelList.cs b/source/ChanSort.Api/Model/ChannelList.cs index a4ed4f1..ae7fdbb 100644 --- a/source/ChanSort.Api/Model/ChannelList.cs +++ b/source/ChanSort.Api/Model/ChannelList.cs @@ -92,7 +92,8 @@ namespace ChanSort.Api this.channelByProgNr.TryGetValue(ci.OldProgramNr, out other); if (other != null) { - warning2 = string.Format(Resources.ChannelList_ProgramNrAssignedToMultipleChannels, + var format = Resources.ChannelList_ProgramNrAssignedToMultipleChannels.Replace("{1}", "{1,5}"); + warning2 = string.Format(format, this.ShortCaption, ci.OldProgramNr, other.RecordIndex, other.Name, ci.RecordIndex, ci.Name); ++duplicateProgNrCount; isDupeProgNr = true; diff --git a/source/ChanSort.Api/Utils/CsvFile.cs b/source/ChanSort.Api/Utils/CsvFile.cs index d8991d7..1b531ad 100644 --- a/source/ChanSort.Api/Utils/CsvFile.cs +++ b/source/ChanSort.Api/Utils/CsvFile.cs @@ -1,45 +1,83 @@ using System.Collections.Generic; using System.Text; -namespace ChanSort.Api +namespace ChanSort.Api; + +public static class CsvFile { - public static class CsvFile + public static IList Parse(string line, char separator) { - public static IList Parse(string line, char separator) - { - if (line.EndsWith("\n")) line = line.Substring(0, line.Length - 1); - if (line.EndsWith("\r")) line = line.Substring(0, line.Length - 1); + if (line.EndsWith("\n")) line = line.Substring(0, line.Length - 1); + if (line.EndsWith("\r")) line = line.Substring(0, line.Length - 1); - List tokens = new List(); - if (line.Length == 0) - return tokens; - - bool inQuote = false; - StringBuilder token = new StringBuilder(); - for(int i = 0, len=line.Length; i tokens = new List(); + if (line.Length == 0) return tokens; + + bool inQuote = false; + StringBuilder token = new StringBuilder(); + for(int i = 0, len=line.Length; i= 0) // characters that require the value to be quoted + needQuotes = true; + sb.Append(c); + } + if (needQuotes) + sb.Insert(0, "\"").Append("\""); + return sb.ToString(); + } + + public static string ToLine(IEnumerable values, char separator, bool needQuotes = false) + { + if (values == null) + return ""; + var sb = new StringBuilder(); + foreach (var value in values) + { + if (sb.Length > 0) + sb.Append(separator); + sb.Append(ToValue(value, needQuotes)); + } + + return sb.ToString(); + } + +} \ No newline at end of file diff --git a/source/ChanSort.Loader.LG/Resource.Designer.cs b/source/ChanSort.Loader.LG/Resource.Designer.cs index 5d5bcf0..bb9726e 100644 --- a/source/ChanSort.Loader.LG/Resource.Designer.cs +++ b/source/ChanSort.Loader.LG/Resource.Designer.cs @@ -19,7 +19,7 @@ namespace ChanSort.Loader.LG { // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] internal class Resource { diff --git a/source/ChanSort.Loader.LG/Resource.pl.resx b/source/ChanSort.Loader.LG/Resource.pl.resx index f11a8ad..093f7cb 100644 --- a/source/ChanSort.Loader.LG/Resource.pl.resx +++ b/source/ChanSort.Loader.LG/Resource.pl.resx @@ -153,7 +153,7 @@ Starsze oprogramowanie LG dla modeli telewizorów opartych na webOS nie obsługu Listy kanałów LG można zaimportować z powrotem do telewizora TYLKO, jeśli podczas wyszukiwania kanałów w telewizorze wybrano specjalne opcje: - Dostawca: MUSI być żaden/inny (NIE wybieraj dostawcy telewizji kablowej ani Astry 19.2E) -- Blindscan: MUSI być wybrany +- Wyszukiwanie na ślepo: MUSI być wybrany - Wyszukiwanie sieci: opcjonalne (można wybrać) Telewizor nie przetworzy listy poprawnie, jeśli te kroki nie zostaną wykonane! diff --git a/source/ChanSort.Loader.Loewe/Serializer.cs b/source/ChanSort.Loader.Loewe/Serializer.cs index ef6c677..bdad521 100644 --- a/source/ChanSort.Loader.Loewe/Serializer.cs +++ b/source/ChanSort.Loader.Loewe/Serializer.cs @@ -366,8 +366,10 @@ class Serializer : SerializerBase { var a = e.Attributes; var listId = int.Parse(a["FavoriteId"].InnerText); - var serviceId = int.Parse(a["ServiceId"].InnerText); - var lcn = int.Parse(a["Lcn"].InnerText); + if (!int.TryParse(a["ServiceId"].InnerText, out var serviceId)) + return; + if (!int.TryParse(a["Lcn"].InnerText, out var lcn)) + return; if (!this.channelsById.TryGetValue(serviceId, out var c)) return; diff --git a/source/ChanSort.Loader.Panasonic/DbChannel.cs b/source/ChanSort.Loader.Panasonic/DbChannel.cs index e9e1217..e17f324 100644 --- a/source/ChanSort.Loader.Panasonic/DbChannel.cs +++ b/source/ChanSort.Loader.Panasonic/DbChannel.cs @@ -12,7 +12,9 @@ namespace ChanSort.Loader.Panasonic internal bool NonAscii; internal bool ValidUtf8 = true; - #region ctor() + internal int InternalProviderFlag2; + + #region ctor(IDataReader, ...) internal DbChannel(IDataReader r, IDictionary field, DataRoot dataRoot, Encoding encoding) { this.RecordIndex = r.GetInt32(field["rowid"]); @@ -61,6 +63,12 @@ namespace ChanSort.Loader.Panasonic #endregion + #region ctor(SignalSource, ...) + public DbChannel(SignalSource signalSource, long id, int progNr, string name) : base(signalSource, id, progNr, name) + { + } + #endregion + #region ParseFavorites private void ParseFavorites(IDataReader r, IDictionary field) { diff --git a/source/ChanSort.Loader.Panasonic/IdtvChannelSerializer.cs b/source/ChanSort.Loader.Panasonic/IdtvChannelSerializer.cs index 11882b4..7c8e87a 100644 --- a/source/ChanSort.Loader.Panasonic/IdtvChannelSerializer.cs +++ b/source/ChanSort.Loader.Panasonic/IdtvChannelSerializer.cs @@ -1,21 +1,52 @@ -using System; +//#define DUMP + +using System; using System.Collections.Generic; using System.IO; +using System.Linq; using System.Runtime.InteropServices; using System.Security.Cryptography; using System.Text; -using System.Xml.Linq; using ChanSort.Api; using Microsoft.Data.Sqlite; namespace ChanSort.Loader.Panasonic; /* - * Serializer for the 2022 Android based Panasonic LS 500, LX 700, ... series file format + * Serializer for the 2022/2023 Android based Panasonic LS 500, LX 700 series file format + * * The format uses a directory tree with * /hotel.bin (irrelevant content) - * /mnt/vendor/tvdata/database/tv.db Sqlite database (probably for the menu, EPG, ...) - * /mnt/vendor/tvdata/database/channel/idtvChannel.bin (probably for the tuner) + * /mnt/vendor/tvdata/database/tv.db Sqlite database + * /mnt/vendor/tvdata/database/channel/idtvChannel.bin + * + * All statements here are based on observation without confirmation from official sources. + * + * The .bin file contains all DVB-S, DVB-T and DVB-C channels that were found in a scan. Channels are sorted by source (DVB-S, -T, -C), TV/radio/data and then by display_number (or channel_index). + * The .db file may contain a subset of DVB channels, particularly omitting data channels, but also contains additional non-DVB channels. + * The link between DVB channel records in the .db and .bin file is via a common internal_provider_flag2 value. + * In the .bin file the ipf2 is a unique value, but multiple .db channels may reference the same .bin channel. + * + * In Menu / Channels / Channel Management the list is based on the records from the .db file ordered by display_number. + * Entering a channel's number on the remote control also seems to use the .db file records and offers selection between channels that start with the same display_number digits (which includes possible duplicates). + * + * The TV's EPG list is not ordered by the display_number. It somehow depends on the channel_index in the .db file and the physical order of records in the .bin file. + * There is some nontransparent regrouping/reordering going on that may result in completely random looking EPG order when the physical records in the .bin are not in the same sequence as the channel_index + * in the .db file. + * + * For zapping the TV seems uses the EPG channel order. Zapping fails when TV and radio channels are mixed. It works for the first part but after alternating TV/radio several times, it will zap back + * to the first TV channel even if there are further channels of the same type as the currently tuned in channel in the list. Therefore it is highly recommended to have all TV channels first, then all radio channels. + * + * At least the initial firmware of these models has a quirks with inconsistent handling of internal_provider_flag2 as int16, uint16 and int32 with wrong sign-extension, causing lookup-failures + * and duplicate channel records in list. In the .bin file the int32 value 55984 can either be -9552 or 55984 in the .db file (some rows have int16, others uint16 values!). For this reason + * this code here casts the values down to uint16 to ensure lookups work fine. It's unknown if there can be values > 65535 in the .bin or .db file. + * + * The value in the tv.db channel_index is ambiguous because when searching for DVB-C and then DVB-S, both input sources start with channel_index=0, but when searching DVB-S first and then DVB-C, + * the channel_index sequence is continuous and doesn't reset to 0. There's also duplicate values when the TV puts several channels on the same display_number. + * + * In this case of multiple .db channels referencing the same .bin channel the lowest display_number will be used and stored in the .bin channel. + * When saving a new list, the channel_index will be set to a consecutive sequence following the ordering by display_number. + * */ internal class IdtvChannelSerializer : SerializerBase { @@ -38,17 +69,19 @@ internal class IdtvChannelSerializer : SerializerBase enum Flags : ushort { Encrypted = 0x0002, + Radio = 0x04, + Data = 0x10, IsFavorite = 0x0080, - Deleted = 0x0100, + Deleted = 0x0100, // if really by "user" is uncertain Skip = 0x0400, CustomProgNr = 0x1000 } - [StructLayout(LayoutKind.Sequential,Pack=1)] + [StructLayout(LayoutKind.Sequential, Pack = 1)] unsafe struct IdtvChannel { public short U0; // always 1 - public short RecordLength; // 60 + length of channel name + public ushort RecordLength; // 60 + length of channel name public short U4; // always 6 public fixed byte U6[3]; // all 00 public ushort U9; // 0 = sat, 18 = cable ? @@ -58,27 +91,59 @@ internal class IdtvChannelSerializer : SerializerBase public short U24; // always 100 public short U26; // always 0 public short U28; // always 0 - public short ProgNr; + public ushort ProgNr; public short Lcn; // maybe? public fixed byte U32[2]; // e.g. 0a 01 00 00 public Flags Flags; public fixed byte U38[4]; // 12 07 01 02 - public short Tsid; - public short Onid; - public short Sid; + public ushort Tsid; + public ushort Onid; + public ushort Sid; public fixed byte U48[4]; - public uint InternalProviderFlag2; // seems like all sat channels are in the 20000-29999 range, dvb-c in 30000-39999 + + public int InternalProviderFlag2; // this is a unique .bin record identifier, used in the .db file's "internal_provider_flag2" to reference the .bin record + public fixed byte U56[8]; //public fixed byte ChannelName[RecordLength - 60]; // pseudo-C# description of variable length channel name UTF8 data at end of structure } + #endregion + #region tv.db channels table + /* + * type: TYPE_PREVIEW, TYPE_OTHER, TYPE_DVB_S, TYPE_DVB_C, TYPE_DVB_T, TYPE_DVB_T2 + * service_type: SERVICE_TYPE_AUDIO_VIDEO, SERVICE_TYPE_AUDIO, SERVICE_TYPE_DATA + * display_number: program number (entered on remote control) + * internal_provider_flag1: DVB-C/T: frequency in Hz, DVB-S: freq in kHz + * internal_provider_flag2: id to link from .db to .bin data record + * internal_provider_flag3: maybe DVB-S satellite index (17 = Sat #18 in the TV's UI = Astra 19.2E), but also at times 0 + * internal_provider_flag4: symbol rate in sym/sec + * input_type: 0=cable, 2=sat, ... + */ + #endregion + + #region BinChannelEntry + private class BinChannelEntry + { + public readonly int Index; + public readonly IdtvChannel Channel; + public readonly string Name; + public readonly int StartOffset; + + public BinChannelEntry(int index, IdtvChannel channel, string name, int startOffset) + { + this.Index = index; + this.Channel = channel; + this.Name = name; + this.StartOffset = startOffset; + } + } #endregion private readonly string dbFile; private readonly string binFile; - private Dictionary channelDict = new(); // maps record-index of .bin file to Channel object created from .db file - private byte[] binFileData; - private List binFileRecordOffsets = new(); + + private byte[] binFileData; // will keep the originally loaded record order as-is, even after saving the file with a different physical record order + private readonly Dictionary binChannelByInternalProviderFlag2 = new(); private readonly StringBuilder log = new(); @@ -135,84 +200,14 @@ internal class IdtvChannelSerializer : SerializerBase { // when the USB stick is removed without properly ejecting it, the .db file is often corrupted, causing an exception when running the first query View.Default.MessageBox( - "The Panasonic tv.db file in this channel list is corrupted and can't be loaded.\n\n"+ + "The Panasonic tv.db file in this channel list is corrupted and can't be loaded.\n\n" + "After using the Hotel Menu's \"TV to USB\", press HOME / Notifications / your USB stick / Eject.\n" + "This will properly finish all write operations so the stick can be unplugged safely without data loss."); - //throw new FileLoadException("Corrupt database file"); return; } - this.ReadChannelsFromDatabase(cmd); this.ReadIdtvChannelsBin(); - } - #endregion - - #region ReadChannelsFromDatabase() - private void ReadChannelsFromDatabase(SqliteCommand cmd) - { - cmd.CommandText = "select * from channels where type in ('TYPE_DVB_S','TYPE_DVB_C','TYPE_DVB_T','TYPE_DVB_T2')"; - using var r = cmd.ExecuteReader(); - - var cols = new Dictionary(); - for (int i = 0, c = r.FieldCount; i < c; i++) - cols[r.GetName(i)] = i; - - while (r.Read()) - { - var id = r.GetInt64(cols["_id"]); - var type = r.GetString(cols["type"]); - var svcType = r.GetString(cols["service_type"]); - var name = r.IsDBNull(cols["display_name"]) ? "" : r.GetString(cols["display_name"]); - var progNrStr = r.GetString(cols["display_number"]); - if (!int.TryParse(progNrStr, out var progNr)) - continue; - - SignalSource signalSource = 0; - switch (type) - { - case "TYPE_DVB_C": signalSource |= SignalSource.Cable; break; - case "TYPE_DVB_S": signalSource |= SignalSource.Sat; break; - case "TYPE_DVB_T": signalSource |= SignalSource.Antenna; break; - case "TYPE_DVB_T2": signalSource |= SignalSource.Antenna; break; - } - - switch (svcType) - { - case "SERVICE_TYPE_AUDIO": signalSource |= SignalSource.Radio; break; - case "SERVICE_TYPE_AUDIO_VIDEO": signalSource |= SignalSource.Tv; break; - default: signalSource |= SignalSource.Data; break; - } - - var ch = new ChannelInfo(signalSource, id, progNr, name); - ch.Lock = r.GetBoolean(cols["locked"]); - ch.Skip = !r.GetBoolean(cols["browsable"]); - ch.Hidden = !r.GetBoolean(cols["searchable"]); - ch.Encrypted = r.GetBoolean(cols["scrambled"]); - - ch.OriginalNetworkId = r.GetInt32(cols["original_network_id"]); - ch.TransportStreamId = r.GetInt32(cols["transport_stream_id"]); - ch.ServiceId = r.GetInt32(cols["service_id"]); - ch.FreqInMhz = r.GetInt64(cols["internal_provider_flag1"]) / 1000; // for DVB-S it is in MHz, for DVB-C/T it is in kHz - if (ch.FreqInMhz >= 13000) - ch.FreqInMhz /= 1000; - ch.SymbolRate = r.GetInt32(cols["internal_provider_flag4"]) / 1000; - if ((signalSource & SignalSource.Radio) != 0) - ch.ServiceTypeName = "Radio"; - else if ((signalSource & SignalSource.Tv) != 0) - ch.ServiceTypeName = r.GetBoolean(cols["is_hd"]) ? "HD-TV" : "SD-TV"; - else - ch.ServiceTypeName = "Data"; - ch.RecordOrder = r.GetInt32(cols["channel_index"]); // record index in the idtvChannel.bin file - ch.Favorites = (Favorites)r.GetByte(cols["favorite"]); - - var list = this.DataRoot.GetChannelList(signalSource); - this.DataRoot.AddChannel(list, ch); - - if (channelDict.TryGetValue(ch.RecordOrder, out var otherChannel)) - throw new FileLoadException($"tv.db channel _ids {otherChannel.RecordIndex} ({otherChannel.Name}) and {ch.RecordIndex} ({ch.Name}) both reference same idtvChannel.bin record {ch.RecordOrder}\n"+ - "Please make sure to search satellite channels first and cable/antenna afterwards."); - channelDict.Add(ch.RecordOrder, ch); - } + this.ReadChannelsFromDatabase(cmd); } #endregion @@ -240,48 +235,39 @@ internal class IdtvChannelSerializer : SerializerBase r.ReadBytes(16); // md5 i = 0; +#if DUMP log.AppendLine($"#\tname\tprogNr\tonid-tsid-sid\tflags\tlcn\tipf2"); +#endif + // load data records and store them in the binChannelByInternalProviderFlag2 dictionary var structSize = Marshal.SizeOf(); while (strm.Position + structSize <= binFileData.Length) { - var off = strm.Position; - binFileRecordOffsets.Add((int)off); - + var off = (int)strm.Position; + // C# trickery to read binary data into a structure var bytes = r.ReadBytes(structSize); GCHandle handle = GCHandle.Alloc(bytes, GCHandleType.Pinned); - var chan = Marshal.PtrToStructure(handle.AddrOfPinnedObject()); - handle.Free(); - - var freq = chan.Freq / 1000; - if (freq >= 13000) - freq /= 1000; - var symRate = chan.SymRate / 1000; - var progNr = chan.ProgNr; - var name = Encoding.UTF8.GetString(r.ReadBytes(chan.RecordLength - 60)); - - log.AppendLine($"{i}\t{name}\t{progNr}\t{chan.Onid}-{chan.Tsid}-{chan.Sid}\t{(ushort)chan.Flags:X4}\t{chan.Lcn}\t{chan.InternalProviderFlag2}"); - - if (channelDict.TryGetValue(i, out var ch)) + try { - if (ch.OldProgramNr != progNr) - throw new FileLoadException($"mismatching program_number between tv.db _id {ch.RecordIndex} ({ch.OldProgramNr}) and idtvChannel.bin record {i} ({progNr})"); - if (ch.Name != name) - throw new FileLoadException($"mismatching name between tv.db _id {ch.RecordIndex} ({ch.Name}) and idtvChannel.bin record {i} ({name})"); - if (Math.Abs(ch.FreqInMhz - freq) > 2) - throw new FileLoadException($"mismatching frequency between tv.db _id {ch.RecordIndex} ({ch.FreqInMhz}) and idtvChannel.bin record {i} ({freq})"); - if (Math.Abs(ch.SymbolRate - symRate) > 2) - throw new FileLoadException($"mismatching symbol rate between tv.db _id {ch.RecordIndex} ({ch.SymbolRate}) and idtvChannel.bin record {i} ({symRate})"); + var chan = Marshal.PtrToStructure(handle.AddrOfPinnedObject()); + var name = Encoding.UTF8.GetString(r.ReadBytes(chan.RecordLength - 60)); - if (ch.Encrypted != ((chan.Flags & Flags.Encrypted) != 0)) - throw new FileLoadException($"mismatching crypt-flag between tv.db _id {ch.RecordIndex} ({ch.Encrypted}) and idtvChannel.bin record {i}"); - if (ch.Skip != ((chan.Flags & Flags.Skip) != 0)) // it seems running a DVB-C search will alter the "browsable" flag of already existing DVB-S channels - log.AppendLine($"mismatching browsable-flag between tv.db _id {ch.RecordIndex} ({ch.Skip}) and idtvChannel.bin record {i}"); - if ((ch.Favorites == 0) != ((chan.Flags & Flags.IsFavorite) == 0)) - throw new FileLoadException($"mismatching favorites-info between tv.db _id {ch.RecordIndex} ({ch.Favorites}) and idtvChannel.bin record {i}"); + var key = (ushort)chan.InternalProviderFlag2; - ch.AddDebug((ushort)chan.Flags); + if (this.binChannelByInternalProviderFlag2.TryGetValue(key, out var ch)) + throw new FileLoadException($"{binFile} channel records {ch.Index} and {i} have duplicate internal_provider_flag2 value {key}."); + + this.binChannelByInternalProviderFlag2.Add(key, new BinChannelEntry(i, chan, name, off)); + +#if DUMP + var progNr = chan.ProgNr; + log.AppendLine($"{i}\t{name}\t{progNr}\t{chan.Onid}-{chan.Tsid}-{chan.Sid}\t0x{(ushort)chan.Flags:X4}\t{chan.Lcn}\t{chan.InternalProviderFlag2}"); +#endif + } + finally + { + handle.Free(); } ++i; @@ -289,56 +275,189 @@ internal class IdtvChannelSerializer : SerializerBase if (i < numRecords) throw new FileLoadException($"idtvChannel contains only {i} data records, but expected {numRecords}"); + } + #endregion - // make sure no channel from tv.db refers to a record_index that does not exist in idtvChannel.bin - foreach (var list in this.DataRoot.ChannelLists) + #region ReadChannelsFromDatabase() + private void ReadChannelsFromDatabase(SqliteCommand cmd) + { + cmd.CommandText = "select * from channels where type in ('TYPE_DVB_S','TYPE_DVB_C','TYPE_DVB_T','TYPE_DVB_T2') order by _id"; + using var r = cmd.ExecuteReader(); + + var cols = new Dictionary(); + for (int i = 0, c = r.FieldCount; i < c; i++) + cols[r.GetName(i)] = i; + + var channelDict = new Dictionary(); // maps InternalProviderFlag2 of .bin file to Channel object created from .db file + + while (r.Read()) { - foreach (var ch in list.Channels) + var id = r.GetInt64(cols["_id"]); + var type = r.GetString(cols["type"]); + var svcType = r.GetString(cols["service_type"]); + var name = r.IsDBNull(cols["display_name"]) ? "" : r.GetString(cols["display_name"]); + var progNrStr = r.GetString(cols["display_number"]); + if (!int.TryParse(progNrStr, out var progNr)) + continue; + + SignalSource signalSource = 0; + switch (type) { - if (ch.RecordOrder < 0 || ch.RecordOrder >= numRecords) - throw new FileLoadException($"{list.ShortCaption} channel with _id {ch.RecordIndex} refers to non-existing index {ch.RecordOrder} in idtvChannel.bin"); + case "TYPE_DVB_C": + signalSource |= SignalSource.Cable; + break; + case "TYPE_DVB_S": + signalSource |= SignalSource.Sat; + break; + case "TYPE_DVB_T": + signalSource |= SignalSource.Antenna; + break; + case "TYPE_DVB_T2": + signalSource |= SignalSource.Antenna; + break; } + + switch (svcType) + { + case "SERVICE_TYPE_AUDIO": + signalSource |= SignalSource.Radio; + break; + case "SERVICE_TYPE_AUDIO_VIDEO": + signalSource |= SignalSource.Tv; + break; + default: + signalSource |= SignalSource.Data; + break; + } + + var ch = new DbChannel(signalSource, id, progNr, name); + ch.Lock = r.GetBoolean(cols["locked"]); + ch.Skip = !r.GetBoolean(cols["browsable"]); + ch.Hidden = !r.GetBoolean(cols["searchable"]); + ch.Encrypted = r.GetBoolean(cols["scrambled"]); + + ch.OriginalNetworkId = r.GetInt32(cols["original_network_id"]); + ch.TransportStreamId = r.GetInt32(cols["transport_stream_id"]); + ch.ServiceId = r.GetInt32(cols["service_id"]); + ch.FreqInMhz = r.GetInt64(cols["internal_provider_flag1"]) / 1000; // for DVB-S it is in MHz, for DVB-C/T it is in kHz + if (ch.FreqInMhz >= 13000) + ch.FreqInMhz /= 1000; + ch.SymbolRate = r.GetInt32(cols["internal_provider_flag4"]) / 1000; + if ((signalSource & SignalSource.Radio) != 0) + ch.ServiceTypeName = "Radio"; + else if ((signalSource & SignalSource.Tv) != 0) + ch.ServiceTypeName = r.GetBoolean(cols["is_hd"]) ? "HD-TV" : "SD-TV"; + else + ch.ServiceTypeName = "Data"; + ch.InternalProviderFlag2 = (ushort)r.GetInt32(cols["internal_provider_flag2"]); // reference between idtvChannel.bin and tv.db records. + ch.RecordOrder = ch.InternalProviderFlag2; // r.GetInt32(cols["channel_index"]); // only read for debugging purpose + ch.Favorites = (Favorites)r.GetByte(cols["favorite"]); + + var list = this.DataRoot.GetChannelList(signalSource); + if (channelDict.TryGetValue((ushort)ch.InternalProviderFlag2, out var olderChannel)) + { + log.AppendLine( + //$"tv.db channel _id {olderChannel.RecordIndex} ({olderChannel.Name}) is overridden by _id {ch.RecordIndex} ({ch.Name}) with same internal_provider_flag2 {ch.InternalProviderFlag2}"); + $"tv.db channel _id {ch.RecordIndex} (#{ch.OldProgramNr} {ch.Name}) is a duplicate of _id {olderChannel.RecordIndex} (#{olderChannel.OldProgramNr} {olderChannel.Name}) with same internal_provider_flag2 {ch.InternalProviderFlag2}"); + //list.RemoveChannel(olderChannel); + } + else + channelDict[(ushort)ch.InternalProviderFlag2] = ch; + + this.DataRoot.AddChannel(list, ch); + + // validate consistency between .db and .bin (multiple .db rows can reference the same .bin record) + if (!this.binChannelByInternalProviderFlag2.TryGetValue((ushort)ch.InternalProviderFlag2, out var idtvEntry)) + throw new FileLoadException($"{list.ShortCaption} channel with _id {ch.RecordIndex} refers to non-existing idtvChannel.bin record with internal_provider_flag2 {ch.InternalProviderFlag2}"); + ValidateChannelData(ch, idtvEntry); } } #endregion + #region ValidateChannelData() + private void ValidateChannelData(DbChannel ch, BinChannelEntry entry) + { + var chan = entry.Channel; + var name = entry.Name; + var i = entry.Index; + + var freq = chan.Freq / 1000; + if (freq >= 13000) + freq /= 1000; + var symRate = chan.SymRate / 1000; + + //var progNr = chan.ProgNr; + //if (ch.OldProgramNr != progNr) // multiple .db rows with different display_number can reference the same .db row, so skip this check + // throw new FileLoadException($"mismatching display_number between tv.db _id {ch.RecordIndex} ({ch.OldProgramNr}) and idtvChannel.bin record {i} ({progNr})"); + if (ch.Name != name) + throw new FileLoadException($"mismatching name between tv.db _id {ch.RecordIndex} ({ch.Name}) and idtvChannel.bin record {i} ({name})"); + if (Math.Abs(ch.FreqInMhz - freq) > 2) + throw new FileLoadException($"mismatching frequency between tv.db _id {ch.RecordIndex} ({ch.FreqInMhz}) and idtvChannel.bin record {i} ({freq})"); + if (Math.Abs(ch.SymbolRate - symRate) > 2) + throw new FileLoadException($"mismatching symbol rate between tv.db _id {ch.RecordIndex} ({ch.SymbolRate}) and idtvChannel.bin record {i} ({symRate})"); + + if (ch.Encrypted != ((chan.Flags & Flags.Encrypted) != 0)) + log.AppendLine($"mismatching crypt-flag between tv.db _id {ch.RecordIndex} ({ch.Encrypted}) and idtvChannel.bin record {i}"); + if (ch.Skip != ((chan.Flags & Flags.Skip) != 0)) // it seems running a DVB-C search will alter the "browsable" flag of already existing DVB-S channels + log.AppendLine($"mismatching browsable-flag between tv.db _id {ch.RecordIndex} ({ch.Skip}) and idtvChannel.bin record {i}"); + if ((ch.Favorites == 0) != ((chan.Flags & Flags.IsFavorite) == 0)) + log.AppendLine($"mismatching favorites-info between tv.db _id {ch.RecordIndex} ({ch.Favorites}) and idtvChannel.bin record {i}"); + + ch.AddDebug((ushort)chan.Flags); + } + #endregion + #region Save() public override void Save(string tvOutputFile) { // saving the list requires to: - // - update fields inside the data records and physically reorder the records + // - update fields inside the .bin file data records and physically reorder the records // - updating records in the .db file - // - updating all channel record indexes in this loader's internal data in channelDict, binFileRecordOffsets and channelInfo.RecordOrder for consecutive save operations to work - GetNewIdtvChannelBinRecordOrder(out var newToOld, out var oldToNew); + GetNewIdtvChannelBinRecordOrder(out var newToOld, out var newChannelIndexMap, out var channelDict); - SaveIdtvChannelBin(newToOld); - SaveTvDb(oldToNew); + SaveIdtvChannelBin(newToOld, channelDict); + SaveTvDb(newChannelIndexMap); } #endregion #region GetNewBinFileRecordOrder() - private void GetNewIdtvChannelBinRecordOrder(out List newToOld, out IDictionary oldToNew) + private void GetNewIdtvChannelBinRecordOrder(out List newToOld, out IDictionary newChannelIndexMap, out Dictionary channelMap) { - // create forward mapping by sorting a list that contains old record numbers. The index of the list is the new record number. - newToOld = new List(binFileRecordOffsets.Count); - for (int i = 0, c=this.binFileRecordOffsets.Count; i(); + foreach (var list in this.DataRoot.ChannelLists) + { + foreach (var ch in list.Channels) + { + if (ch is not DbChannel dbc) + continue; + if (!channelDict.TryGetValue((ushort)dbc.InternalProviderFlag2, out var cur) || ch.NewProgramNr >= 0 && ch.NewProgramNr <= cur.NewProgramNr) + channelDict[(ushort)dbc.InternalProviderFlag2] = dbc; + } + } - var offFreq = (int)Marshal.OffsetOf(nameof(IdtvChannel.Freq)); + + // sort list of ipf2 values to get the desired channel order + newToOld = this.binChannelByInternalProviderFlag2.Keys.ToList(); newToOld.Sort((a, b) => { + var entry1 = this.binChannelByInternalProviderFlag2[a]; + var entry2 = this.binChannelByInternalProviderFlag2[b]; + // all sat channels must come first before cable/antenna channels - var freq1 = BitConverter.ToUInt32(this.binFileData, binFileRecordOffsets[a] + offFreq); - var freq2 = BitConverter.ToUInt32(this.binFileData, binFileRecordOffsets[b] + offFreq); + var freq1 = entry1.Channel.Freq; + var freq2 = entry2.Channel.Freq; var c = (freq1 < 14000000 ? 0 : 1).CompareTo(freq2 < 14000000 ? 0 : 1); // hack: Sat has values below 14 000 000 (in kHz), Cable/antenna above (in Hz) if (c != 0) return c; - this.channelDict.TryGetValue(a, out var ch1); - this.channelDict.TryGetValue(b, out var ch2); + channelDict.TryGetValue(a, out var ch1); + channelDict.TryGetValue(b, out var ch2); + + // existing channels first (TV, radio), non-existing ones last (data) if (ch1 == null && ch2 == null) return a.CompareTo(b); if (ch2 == null) @@ -346,112 +465,134 @@ internal class IdtvChannelSerializer : SerializerBase if (ch1 == null) return +1; - c = ((int)ch1.SignalSource).CompareTo((int)ch2.SignalSource); // group TV/Radio/Data + // group TV/Radio/Data + var ss1 = GetSignalSource(ch1, a); + var ss2 = GetSignalSource(ch2, b); + c = ((int)ss1).CompareTo((int)ss2); if (c != 0) return c; + + // lower display number first c = ch1.NewProgramNr.CompareTo(ch2.NewProgramNr); if (c != 0) return c; - return a.CompareTo(b); // default keeps old order + // keep previous order + return a.CompareTo(b); }); // create reverse mapping - oldToNew = new Dictionary(newToOld.Count); - for (int i = 0; i < newToOld.Count; i++) - oldToNew[newToOld[i]] = i; + newChannelIndexMap = new Dictionary(); + for (int i = 0, c = newToOld.Count; i < c; i++) + newChannelIndexMap[newToOld[i]] = i; + + channelMap = channelDict; + + SignalSource GetSignalSource(DbChannel channel, ushort internalProviderFlag2) + { + if (channel != null) + return channel.SignalSource; + var binEntry = this.binChannelByInternalProviderFlag2[internalProviderFlag2]; + + var flags = binEntry.Channel.Flags; + if ((flags & Flags.Radio) != 0) + return SignalSource.Radio; + if ((flags & Flags.Data) != 0) + return SignalSource.Data; + return SignalSource.Tv; + } } #endregion #region SaveIdtvChannelBin() - private void SaveIdtvChannelBin(IList newToOld) + private void SaveIdtvChannelBin(IList newToOld, IDictionary channelMap) { - UpdateIdtvChannelBinRecords(); - ReorderBinFileRecords(newToOld); + UpdateIdtvChannelBinRecords(channelMap); + var newBin = ReorderBinFileRecords(newToOld); // update MD5 checksum var md5 = MD5.Create(); - var checksum = md5.ComputeHash(binFileData, 8 + 16, binFileData.Length - 8 - 16); - Array.Copy(checksum, 0, binFileData, 8, 16); + var checksum = md5.ComputeHash(newBin, 8 + 16, newBin.Length - 8 - 16); + Array.Copy(checksum, 0, newBin, 8, 16); - File.WriteAllBytes(binFile, binFileData); + File.WriteAllBytes(this.binFile, newBin); } #endregion - + #region UpdateIdtvChannelBinRecords() - private void UpdateIdtvChannelBinRecords() + private void UpdateIdtvChannelBinRecords(IDictionary channelMap) { - // in-place update of the old .bin file data + // in-place update of channel data in the initially loaded binFileData var offProgNr = (int)Marshal.OffsetOf(nameof(IdtvChannel.ProgNr)); var offFlags = (int)Marshal.OffsetOf(nameof(IdtvChannel.Flags)); var w = new BinaryWriter(new MemoryStream(this.binFileData)); - foreach (var list in this.DataRoot.ChannelLists) + foreach(var entry in channelMap) { - foreach (var ch in list.Channels) - { - if (ch.IsProxy) - continue; - var filePosition = this.binFileRecordOffsets[ch.RecordOrder]; - w.Seek(filePosition + offProgNr, SeekOrigin.Begin); - //w.Write(ch.NewProgramNr > 0 ? (ushort)ch.NewProgramNr : (ushort)0xFFFE); // deleted channels have -2 / 0xFFFE - w.Write(ch.NewProgramNr); + var dbc = entry.Value; + + if (!this.binChannelByInternalProviderFlag2.TryGetValue(entry.Key, out var binEntry)) + continue; + + // update display_number + var filePosition = binEntry.StartOffset; + w.Seek(filePosition + offProgNr, SeekOrigin.Begin); + //w.Write(ch.NewProgramNr > 0 ? (ushort)ch.NewProgramNr : (ushort)0xFFFE); // deleted channels have -2 / 0xFFFE + w.Write(dbc.NewProgramNr); - // update flags - var off = filePosition + offFlags; - var flags = BitConverter.ToUInt16(this.binFileData, off); - if (ch.Favorites == 0) - flags = (ushort)(flags & ~(ushort)Flags.IsFavorite); - else - flags = (ushort)(flags | (ushort)Flags.IsFavorite); - - if (ch.Skip) - flags = (ushort)(flags | (ushort)Flags.Skip); - else - flags = (ushort)(flags & ~(ushort)Flags.Skip); + // update flags + var off = filePosition + offFlags; + var flags = BitConverter.ToUInt16(this.binFileData, off); + if (dbc.Favorites == 0) + flags = (ushort)(flags & ~(ushort)Flags.IsFavorite); + else + flags = (ushort)(flags | (ushort)Flags.IsFavorite); - if (ch.IsDeleted) - flags |= (ushort)Flags.Deleted; + if (dbc.Skip) + flags = (ushort)(flags | (ushort)Flags.Skip); + else + flags = (ushort)(flags & ~(ushort)Flags.Skip); - flags |= (ushort)Flags.CustomProgNr; - w.Seek(filePosition + offFlags, SeekOrigin.Begin); - w.Write(flags); - } + flags = (ushort)(flags & ~(ushort)Flags.Data); // Sky option channels can transformed from Data to TV and might otherwise be out-of-order in EPG and zapping + + if (dbc.IsDeleted) + flags |= (ushort)Flags.Deleted; + + flags |= (ushort)Flags.CustomProgNr; + + w.Seek(filePosition + offFlags, SeekOrigin.Begin); + w.Write(flags); } - + w.Flush(); } #endregion #region ReorderBinFileRecords() - private void ReorderBinFileRecords(IList newToOld) + private byte[] ReorderBinFileRecords(IList newToOld) { using var mem = new MemoryStream(this.binFileData.Length); - mem.Write(binFileData, 0, 8 + 16); // copy header + mem.Write(this.binFileData, 0, 8 + 16); // copy header - var newOffsets = new List(newToOld.Count); - foreach (var oldIndex in newToOld) + foreach (var ipf2 in newToOld) { - newOffsets.Add((int)mem.Position); - // TODO: this only works as long as channel name editing is not supported - var off = binFileRecordOffsets[oldIndex]; - var recordLen = BitConverter.ToInt16(binFileData, off + (int)Marshal.OffsetOf(nameof(IdtvChannel.RecordLength))) + 4; - mem.Write(binFileData, off, recordLen); + var entry = this.binChannelByInternalProviderFlag2[ipf2]; + var off = entry.StartOffset; + var recordLen = entry.Channel.RecordLength + 4; + mem.Write(this.binFileData, off, recordLen); } - mem.Flush(); - binFileRecordOffsets = newOffsets; - binFileData = new byte[mem.Length]; - Array.Copy(mem.GetBuffer(), 0, binFileData, 0, mem.Length); + mem.Flush(); + return mem.GetBuffer(); } #endregion #region SaveTvDb() - private void SaveTvDb(IDictionary oldToNew) + private void SaveTvDb(IDictionary newChannelIndexMap) { string connString = "Data Source=" + this.dbFile; using var db = new SqliteConnection(connString); @@ -468,6 +609,7 @@ internal class IdtvChannelSerializer : SerializerBase upd.Parameters.Add("@locked", SqliteType.Integer); upd.Parameters.Add("@fav", SqliteType.Integer); upd.Parameters.Add("@recIdx", SqliteType.Integer); + //upd.Parameters.Add("@ipf2", SqliteType.Integer); upd.Prepare(); using var del = db.CreateCommand(); @@ -475,12 +617,11 @@ internal class IdtvChannelSerializer : SerializerBase del.Parameters.Add("@id", SqliteType.Integer); del.Prepare(); - var newChannelDict = new Dictionary(); foreach (var list in this.DataRoot.ChannelLists) { foreach (var ch in list.Channels) { - if (ch.IsProxy) + if (ch is not DbChannel dbc) continue; if (ch.NewProgramNr < 0 || ch.IsDeleted) { @@ -489,24 +630,18 @@ internal class IdtvChannelSerializer : SerializerBase } else { - var newRecordIndex = oldToNew[ch.RecordOrder]; - upd.Parameters["@id"].Value = ch.RecordIndex; upd.Parameters["@progNr"].Value = ch.NewProgramNr; upd.Parameters["@browseable"].Value = !ch.Skip; //upd.Parameters["@searchable"].Value = !ch.Hidden; upd.Parameters["@locked"].Value = ch.Lock; upd.Parameters["@fav"].Value = (int)ch.Favorites; - upd.Parameters["@recIdx"].Value = newRecordIndex; + upd.Parameters["@recIdx"].Value = newChannelIndexMap[(ushort)dbc.InternalProviderFlag2]; + //upd.Parameters["@ipf2"].Value = (int)(ushort)dbc.InternalProviderFlag2; // fix broken short/ushort/int sign extension upd.ExecuteNonQuery(); - - ch.RecordOrder = newRecordIndex; - - newChannelDict.Add(newRecordIndex, ch); } } } - this.channelDict = newChannelDict; trans.Commit(); } diff --git a/source/ChanSort.Loader.SatcoDX/ChanSort.Loader.SatcoDX.csproj b/source/ChanSort.Loader.SatcoDX/ChanSort.Loader.SatcoDX.csproj index 28e1398..77d1d8d 100644 --- a/source/ChanSort.Loader.SatcoDX/ChanSort.Loader.SatcoDX.csproj +++ b/source/ChanSort.Loader.SatcoDX/ChanSort.Loader.SatcoDX.csproj @@ -23,6 +23,7 @@ prompt 4 false + latest pdbonly @@ -32,6 +33,7 @@ prompt 4 false + latest true @@ -42,6 +44,7 @@ prompt MinimumRecommendedRules.ruleset false + latest ..\Release\ @@ -52,6 +55,7 @@ prompt MinimumRecommendedRules.ruleset false + latest diff --git a/source/ChanSort.Loader.SatcoDX/Channel.cs b/source/ChanSort.Loader.SatcoDX/Channel.cs index ca0662a..d469d8b 100644 --- a/source/ChanSort.Loader.SatcoDX/Channel.cs +++ b/source/ChanSort.Loader.SatcoDX/Channel.cs @@ -108,5 +108,22 @@ namespace ChanSort.Loader.SatcoDX this.ShortName = shortName.TrimEnd(); } #endregion + + #region Export() + public void Export(byte[] buffer, Encoding encoding) + { + Array.Copy(this.data, this.FileOffset, buffer, 0, this.Length + 1); + if (!this.IsNameModified) + return; + + // 43-50 + 115-126 in version 103 or 115-131 in version 105: channel name + var bytes = encoding.GetBytes(this.Name); + Tools.MemSet(buffer, 43, 32, 8); + Tools.MemSet(buffer, 115, 32, buffer.Length - 115 -1); + Array.Copy(bytes, 0, buffer, 43, Math.Min(bytes.Length, 8)); + if (bytes.Length > 8) + Array.Copy(bytes, 8, buffer, 115, Math.Min(bytes.Length - 8, this.Length - 115 - 1)); + } + #endregion } } \ No newline at end of file diff --git a/source/ChanSort.Loader.SatcoDX/Serializer.cs b/source/ChanSort.Loader.SatcoDX/Serializer.cs index 831cfb0..d3c5227 100644 --- a/source/ChanSort.Loader.SatcoDX/Serializer.cs +++ b/source/ChanSort.Loader.SatcoDX/Serializer.cs @@ -16,7 +16,7 @@ namespace ChanSort.Loader.SatcoDX public Serializer(string inputFile) : base(inputFile) { - this.Features.ChannelNameEdit = ChannelNameEditMode.None; + this.Features.ChannelNameEdit = ChannelNameEditMode.All; this.Features.DeleteMode = DeleteMode.Physically; this.Features.CanSkipChannels = false; this.Features.CanLockChannels = false; @@ -79,19 +79,22 @@ namespace ChanSort.Loader.SatcoDX this.FileName = tvOutputFile; } - using (var file = new FileStream(tvOutputFile, FileMode.Create)) + using var file = new FileStream(tvOutputFile, FileMode.Create); + byte[] buffer = null; + foreach (var channel in this.allChannels.GetChannelsByNewOrder()) { - foreach (var channel in this.allChannels.GetChannelsByNewOrder()) - { - // when a reference list was applied, the list may contain proxy entries for deleted channels, which must be ignored - if (channel.IsProxy || channel.IsDeleted) - continue; - if (channel is Channel realChannel) - file.Write(this.content, realChannel.FileOffset, realChannel.Length + 1); - } + // when a reference list was applied, the list may contain proxy entries for deleted channels, which must be ignored + if (channel.IsProxy || channel.IsDeleted) + continue; + if (channel is not Channel realChannel) + continue; - file.Write(this.content, this.trailingDataPos, this.content.Length - this.trailingDataPos); + buffer ??= new byte[realChannel.Length + 1]; + realChannel.Export(buffer, this.DefaultEncoding); + file.Write(buffer, 0, buffer.Length); } + + file.Write(this.content, this.trailingDataPos, this.content.Length - this.trailingDataPos); } #endregion @@ -106,7 +109,7 @@ namespace ChanSort.Loader.SatcoDX get => base.DefaultEncoding; set { - if (value == this.DefaultEncoding) + if (ReferenceEquals(value, this.DefaultEncoding)) return; base.DefaultEncoding = value; diff --git a/source/ChanSort/MainForm.Designer.cs b/source/ChanSort/MainForm.Designer.cs index 5d2c3ce..03d585c 100644 --- a/source/ChanSort/MainForm.Designer.cs +++ b/source/ChanSort/MainForm.Designer.cs @@ -115,6 +115,7 @@ this.miOpen = new DevExpress.XtraBars.BarButtonItem(); this.miReload = new DevExpress.XtraBars.BarButtonItem(); this.miRestoreOriginal = new DevExpress.XtraBars.BarButtonItem(); + this.miDeleteBackup = new DevExpress.XtraBars.BarButtonItem(); this.miFileInformation = new DevExpress.XtraBars.BarButtonItem(); this.miSave = new DevExpress.XtraBars.BarButtonItem(); this.miSaveAs = new DevExpress.XtraBars.BarButtonItem(); @@ -220,7 +221,6 @@ this.popupInputSource = new DevExpress.XtraBars.PopupMenu(this.components); this.popupFavList = new DevExpress.XtraBars.PopupMenu(this.components); this.timerSelectFocusedRow = new System.Windows.Forms.Timer(this.components); - this.miDeleteBackup = new DevExpress.XtraBars.BarButtonItem(); ((System.ComponentModel.ISupportInitialize)(this.splitContainerControl1)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.splitContainerControl1.Panel1)).BeginInit(); this.splitContainerControl1.Panel1.SuspendLayout(); @@ -1142,12 +1142,9 @@ this.bar1.LinksPersistInfo.AddRange(new DevExpress.XtraBars.LinkPersistInfo[] { new DevExpress.XtraBars.LinkPersistInfo(this.miFile), new DevExpress.XtraBars.LinkPersistInfo(this.miOpen), - new DevExpress.XtraBars.LinkPersistInfo(this.miOpenReferenceFile), new DevExpress.XtraBars.LinkPersistInfo(this.miReload), - new DevExpress.XtraBars.LinkPersistInfo(this.miSave, true), - new DevExpress.XtraBars.LinkPersistInfo(this.miSaveAs), - new DevExpress.XtraBars.LinkPersistInfo(this.miSaveReferenceFile), - new DevExpress.XtraBars.LinkPersistInfo(this.miPrint, true), + new DevExpress.XtraBars.LinkPersistInfo(this.miSave), + new DevExpress.XtraBars.LinkPersistInfo(this.miPrint), new DevExpress.XtraBars.LinkPersistInfo(this.miEdit, true), new DevExpress.XtraBars.LinkPersistInfo(this.mnuFavSet), new DevExpress.XtraBars.LinkPersistInfo(this.miLockOn), @@ -1180,14 +1177,14 @@ new DevExpress.XtraBars.LinkPersistInfo(this.miReload), new DevExpress.XtraBars.LinkPersistInfo(this.miRestoreOriginal), new DevExpress.XtraBars.LinkPersistInfo(this.miDeleteBackup), - new DevExpress.XtraBars.LinkPersistInfo(this.miFileInformation), new DevExpress.XtraBars.LinkPersistInfo(this.miSave, true), new DevExpress.XtraBars.LinkPersistInfo(this.miSaveAs), - new DevExpress.XtraBars.LinkPersistInfo(this.miOpenReferenceFile, true), - new DevExpress.XtraBars.LinkPersistInfo(this.miAddFromRefList), new DevExpress.XtraBars.LinkPersistInfo(this.miSaveReferenceFile), new DevExpress.XtraBars.LinkPersistInfo(this.miExcelExport), - new DevExpress.XtraBars.LinkPersistInfo(this.miPrint), + new DevExpress.XtraBars.LinkPersistInfo(this.miOpenReferenceFile, true), + new DevExpress.XtraBars.LinkPersistInfo(this.miAddFromRefList), + new DevExpress.XtraBars.LinkPersistInfo(this.miPrint, true), + new DevExpress.XtraBars.LinkPersistInfo(this.miFileInformation), new DevExpress.XtraBars.LinkPersistInfo(this.miQuit, true), new DevExpress.XtraBars.LinkPersistInfo(this.miRecentFiles, true)}); this.miFile.Name = "miFile"; @@ -1224,6 +1221,13 @@ this.miRestoreOriginal.Name = "miRestoreOriginal"; this.miRestoreOriginal.ItemClick += new DevExpress.XtraBars.ItemClickEventHandler(this.miRestoreOriginal_ItemClick); // + // miDeleteBackup + // + resources.ApplyResources(this.miDeleteBackup, "miDeleteBackup"); + this.miDeleteBackup.Id = 117; + this.miDeleteBackup.Name = "miDeleteBackup"; + this.miDeleteBackup.ItemClick += new DevExpress.XtraBars.ItemClickEventHandler(this.miDeleteBackup_ItemClick); + // // miFileInformation // resources.ApplyResources(this.miFileInformation, "miFileInformation"); @@ -2222,13 +2226,6 @@ // this.timerSelectFocusedRow.Tick += new System.EventHandler(this.timerSelectFocusedRow_Tick); // - // miDeleteBackup - // - resources.ApplyResources(this.miDeleteBackup, "miDeleteBackup"); - this.miDeleteBackup.Id = 117; - this.miDeleteBackup.Name = "miDeleteBackup"; - this.miDeleteBackup.ItemClick += new DevExpress.XtraBars.ItemClickEventHandler(this.miDeleteBackup_ItemClick); - // // MainForm // this.AllowDrop = true; diff --git a/source/ChanSort/MainForm.cs b/source/ChanSort/MainForm.cs index accc03b..3aa8b0e 100644 --- a/source/ChanSort/MainForm.cs +++ b/source/ChanSort/MainForm.cs @@ -2035,18 +2035,18 @@ namespace ChanSort.Ui { if (channel.IsDeleted || channel.NewProgramNr == -1) continue; - sb.Append(list.ShortCaption).Append(sep); + sb.Append(list.ShortCaption?.Replace("\0", "")).Append(sep); sb.Append(channel.NewProgramNr).Append(sep); - sb.Append('"').Append(channel.Name).Append('"').Append(sep); + sb.Append(channel.Name?.Replace("\0", "")).Append(sep); sb.Append(channel.Favorites).Append(sep); sb.Append(channel.Lock ? "L" : "").Append(sep); sb.Append(channel.Skip ? "S" : "").Append(sep); sb.Append(channel.Hidden ? "H" : "").Append(sep); - sb.Append(channel.Encrypted == null ? "?" : channel.Encrypted.Value ? "C" : "").Append(sep); - sb.Append('"').Append(channel.Satellite).Append('"').Append(sep); + sb.Append(channel.Encrypted == true ? "C" : "").Append(sep); + sb.Append(channel.Satellite?.Replace("\0", "")).Append(sep); sb.Append(channel.ChannelOrTransponder).Append(sep); sb.Append(channel.FreqInMhz).Append(sep); - sb.Append(channel.Polarity).Append(sep); + sb.Append(channel.Polarity == '\0' ? "" : channel.Polarity).Append(sep); sb.Append(channel.SymbolRate).Append(sep); sb.Append(channel.OriginalNetworkId).Append(sep); sb.Append(channel.TransportStreamId).Append(sep); @@ -2059,7 +2059,8 @@ namespace ChanSort.Ui } Clipboard.Clear(); - Clipboard.SetData(DataFormats.Text, sb.ToString()); + Clipboard.SetText(sb.ToString()); + XtraMessageBox.Show(this, Resources.MainForm_ExportExcelList_Message, this.miExcelExport.Caption, diff --git a/source/ChanSort/MainForm.resx b/source/ChanSort/MainForm.resx index 83e2605..7860287 100644 --- a/source/ChanSort/MainForm.resx +++ b/source/ChanSort/MainForm.resx @@ -276,7 +276,7 @@ gridLeft - ChanSort.XGridControl, ChanSort, Version=1.0.8313.22695, Culture=neutral, PublicKeyToken=null + ChanSort.XGridControl, ChanSort, Version=1.0.8359.22033, Culture=neutral, PublicKeyToken=null grpOutputList @@ -413,12 +413,6 @@ Delete backup files - - File &information... - - - 30 - &Save @@ -431,15 +425,6 @@ 33 - - Apply order from a reference list... - - - 23 - - - Add channels from reference list... - Save reference list... @@ -452,12 +437,27 @@ 32 + + Apply order from a reference list... + + + 23 + + + Add channels from reference list... + &Print... 34 + + File &information... + + + 30 + &Quit @@ -1240,7 +1240,7 @@ gviewLeft - ChanSort.XGridView, ChanSort, Version=1.0.8313.22695, Culture=neutral, PublicKeyToken=null + ChanSort.XGridView, ChanSort, Version=1.0.8359.22033, Culture=neutral, PublicKeyToken=null colIndex1 @@ -1324,13 +1324,13 @@ globalImageCollection1 - ChanSort.Ui.GlobalImageCollection, ChanSort, Version=1.0.8313.22695, Culture=neutral, PublicKeyToken=null + ChanSort.Ui.GlobalImageCollection, ChanSort, Version=1.0.8359.22033, Culture=neutral, PublicKeyToken=null gviewRight - ChanSort.XGridView, ChanSort, Version=1.0.8313.22695, Culture=neutral, PublicKeyToken=null + ChanSort.XGridView, ChanSort, Version=1.0.8359.22033, Culture=neutral, PublicKeyToken=null colIndex @@ -1572,6 +1572,12 @@ DevExpress.XtraBars.BarButtonItem, DevExpress.XtraBars.v22.1, Version=22.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a + + miDeleteBackup + + + DevExpress.XtraBars.BarButtonItem, DevExpress.XtraBars.v22.1, Version=22.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a + miFileInformation @@ -2094,12 +2100,6 @@ System.Windows.Forms.Timer, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - miDeleteBackup - - - DevExpress.XtraBars.BarButtonItem, DevExpress.XtraBars.v22.1, Version=22.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a - MainForm @@ -2107,7 +2107,7 @@ DevExpress.XtraEditors.XtraForm, DevExpress.Utils.v22.1, Version=22.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a - 10/05/2022 12:50:36 + 11/20/2022 12:41:24 16, 16 @@ -2997,7 +2997,7 @@ gridRight - ChanSort.XGridControl, ChanSort, Version=1.0.8313.22695, Culture=neutral, PublicKeyToken=null + ChanSort.XGridControl, ChanSort, Version=1.0.8359.22033, Culture=neutral, PublicKeyToken=null grpInputList diff --git a/source/ChanSort/ReferenceListForm.resx b/source/ChanSort/ReferenceListForm.resx index 3d2ba24..b68914c 100644 --- a/source/ChanSort/ReferenceListForm.resx +++ b/source/ChanSort/ReferenceListForm.resx @@ -1127,4 +1127,7 @@ This step can be repeated as needed. DevExpress.XtraEditors.XtraForm, DevExpress.Utils.v22.1, Version=22.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a + + Data/Other + \ No newline at end of file diff --git a/source/Translation.xlsx b/source/Translation.xlsx index 0f9adc0908a4ad3e82a01bfe0272ebba4076ce77..2404c77120bd16ccfa6094698ede3ebd7f390940 100644 GIT binary patch delta 62126 zcma&NWk6Nm^F4g&Zt1+FN=uidgeWDYAgO>zx6}b76{JLIkPxI%T1vQpfGFLKfP}P^ z#Iq0j`PT3M;(2qnx8}^AS+i!%KDaoE-MNKb)`bmiakUF&p(7An*a!p(0)gMI0KFPAS!t?hbxW^8_U(@U`V^m0juJ(1xFjbLnN>hmW-(9C^FGUait*a02< zSF_g8+wGOD-_`NCx|(;cWRN0o(`H)|B|Yw^Q5Iz#s}A1^u;$deLBumOIaFyOJc4EU z_UiqaU4`l_<5>}fqU%9OYoYXVU8~z|!FQit*4M$s>W$u*%IwvG^yKl*2YMK& zm#-(Kt21fz?n zPeuwr42OYJcrD`GM0bMdMB`clh{c@!^jvxO^J6ld+*;2>jRk8AGx@_Qm6O}t3QFHy z(aP?^%-jC1FM8F|``Xp~nuIPpLW-$zE=Ts8B%7^J_)9BM7itC50i*LKO^h;KXD-y^ zY|@kHfefukqq>0p0K`sD52NCS+NSn{tDMpN&~o;t=7T#kD-_pUj{7o~mE>n79?@Z0 zKZ-Gl39nZWxEd*>Mt{eyz~K$WWEeSfP05dfT~dArug2`{d3&agubZJ?4{R~2PJgC< z$emtk4W9o@X9a%#q&+GH)H5RTlZF^M3Mq z*)JlOtM0`hwXW?l<78`e#p$s%`@N$Xfm58usxt%KUWq%s&Gz5y@4Se8_A}5nHNGl` zQCYd0u)>k+W8dSn`_as281bVA5REe3f;u{ zO`?2IUW~d;O_BHV<@*+vhf~9k?_Pg#gQqk8Wogvu0b_Uh2eQj=kg=(34d0GpUMzd! z+{KX+(6>n-qibhJw7DY(CD~@0WL{j4ZI*nCum2c}Rw9VQ^LaG$l8?P;6}l4|`O6;F zMdNto*hNZJE5)gRmINJosFUGLWbLykw&C23_b=L=rK8v>p1B1N8n^a7ydo}b)0mKH zj3cNe6t+EaQ@AQm&7Vl)+J`YwwvvZW!;J@97-e2!#^q@~&L!%8{N=YCMf=mIpEhZr z`01!>Q?IxndVBX31$LGDUtX_#%esp?l&kx4ewFYxD~41b(=4rszo{y;XJr=kt*leZ zd;o3uRdVHZ-0_zg!%s@x%-76kZaP4lIF6Ii{`*cunsxz(i!$CX<7BT zG|r1fek}~o0F%pjsSb^DE3dRhXzymdX(+E9PSHOK_OWp57r^?oo%_kP>C%)X5sjw> z&bJy~wptI3ZmLzEmN)N&k0I*I%r6h7LMN`B&rHhKsp`{2oUYut*XQPb^9r5Iy)WOs z`T0jTMx@`45h75(-}J0SkA`3LF&f9j@P=J#h;T&SLW=oH;WUI@UNVl^x5{sKkAb<_ zWu1jbF+8QbzmDC5pD&j} zr^`$H=O^9#vgfDgXHC$|>1nj=ZU5sb*|XpL(C@I*5$3laGW-u@tV&<)Q*dMBeQpPT9&2ced6zm>3O<

{Ptk!}8?kUJtv(*8s5+Q^D_8&BK9l6b1-K;+N{D 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 Tv{{!fS&c}KR^Rxq1mS-G<;<<* delta 59603 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 E8#~_u#sB~S diff --git a/source/changelog.md b/source/changelog.md index 504f367..6bc3ccb 100644 --- a/source/changelog.md +++ b/source/changelog.md @@ -1,9 +1,19 @@ ChanSort Change Log =================== +2022-11-22 +- fixed "Export to Excel" (copies the list as tab-separated text into clipboard) +- included latest translation to Polish (thanks to J.D.) +- reorganized File menu and tool bar +- allow renaming channels in SatcoDX channel lists (\*.sdx) +- improved support for Panasonic LS 500 / LX 700 series + +2022-11-14 +- fixed issue loading Loewe servicelist.xml file containing empty service-ids + 2022-10-06 - added support for Android based Panasonic LS and LX 500-700 series (lists with a /mnt/.../tv.db file) -- fixed reference list dialog now showing any controls on small screens with and large scaling factor +- fixed reference list dialog not showing any controls on small screens with and large scaling factor - fixed "NullReferenceException" while applying a reference list based on a SQLite database file (\*.db or Samsung .zip) which contained NULL values for channel names instead of empty strings. - function to remove backup files (so that the next "File / Save" operation will create a new backup)