- fixed channel names turning from bad-byte-order-UTF16-varchar to BLOB when saving (probably the cause of Samsung J errors)

- Samsung E,F,H,J .scm file format: allow independant reordering of each favorites list (with editable numbers)
- Samsung J .zip file format: predefined lists can be edited again, allow independant reordering of each favorites list (sequential numbers), allow deleting channels
This commit is contained in:
hbeham
2015-11-29 20:36:56 +01:00
parent e795d00ebb
commit 845c1c44c1
11 changed files with 134 additions and 181 deletions

View File

@@ -402,5 +402,24 @@ namespace ChanSort.Api
}
#endregion
#region SequentializeFavPos()
/// <summary>
/// Put the numbers in channel.FavIndex[i] in a sequential order, starting with 1
/// </summary>
/// <param name="channelList"></param>
/// <param name="favCount">Number of favorite lists (i=0..favCount-1)</param>
public static void SequentializeFavPos(ChannelList channelList, int favCount)
{
for (int fav = 0; fav < favCount; fav++)
{
var list = channelList.Channels.Where(c => c.FavIndex[fav] >= 0).OrderBy(c => c.FavIndex[fav]).ToList();
int i = 0;
foreach (var channel in list)
channel.FavIndex[fav] = ++i;
}
}
#endregion
}
}

View File

@@ -66,8 +66,8 @@
</ItemGroup>
<ItemGroup>
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="HisSerializer.cs" />
<Compile Include="HisSerializerPlugin.cs" />
<Compile Include="DbSerializer.cs" />
<Compile Include="DbSerializerPlugin.cs" />
</ItemGroup>
<ItemGroup>
<None Include="ChanSort.Loader.Hisense.ini">

View File

@@ -3,11 +3,12 @@ using System.Collections.Generic;
using System.Data;
using ChanSort.Api;
using System.Data.SQLite;
using System.Text;
using System.Text.RegularExpressions;
namespace ChanSort.Loader.Hisense
{
public class HisSerializer : SerializerBase
public class DbSerializer : SerializerBase
{
public override string DisplayName => "Hisense *.db Loader";
@@ -32,7 +33,7 @@ namespace ChanSort.Loader.Hisense
#region ctor()
public HisSerializer(string inputFile) : base(inputFile)
public DbSerializer(string inputFile) : base(inputFile)
{
DepencencyChecker.AssertVc2010RedistPackageX86Installed();
@@ -324,55 +325,38 @@ namespace ChanSort.Loader.Hisense
int x = (int)((ulong)ci.RecordIndex >> 32); // the table number is kept in the higher 32 bits
int id = (int)(ci.RecordIndex & 0xFFFFFFFF); // the record id is kept in the lower 32 bits
if (ci.NewProgramNr != ci.OldProgramNr)
{
if (ci.NewProgramNr >= 0)
{
cmd.CommandText = $"update svl_{x} set channel_id=(channel_id & {0xFFFC}) | @chnr, option_mask=option_mask | " + ((int) OptionMask.ChNumEdited) + " where svl_rec_id=@id";
cmd.Parameters.Clear();
cmd.Parameters.Add("@id", DbType.Int32);
cmd.Parameters.Add("@chnr", DbType.Int32);
cmd.Parameters["@id"].Value = id;
cmd.Parameters["@chnr"].Value = ci.NewProgramNr << 18;
cmd.ExecuteNonQuery();
}
else
{
cmd.CommandText = $"update svl_{x} set nw_mask=nw_mask | " + ((int)OptionMask.DeletedByUser) + " where svl_rec_id=@id";
cmd.Parameters.Clear();
cmd.Parameters.Add("@id", DbType.Int32);
cmd.Parameters.Add("@fav", DbType.Int32);
cmd.Parameters["@id"].Value = id;
cmd.Parameters["@fav"].Value = ((int)ci.Favorites & 0x0F) << 4;
cmd.ExecuteNonQuery();
}
}
if (ci.IsNameModified)
{
cmd.CommandText = $"update svl_{x} set name=@name, option_mask=option_mask|" + ((int)OptionMask.NameEdited) + " where svl_rec_id=@id";
cmd.Parameters.Clear();
cmd.Parameters.Add("@id", DbType.Int32);
cmd.Parameters.Add("@name", DbType.String);
cmd.Parameters["@id"].Value = id;
cmd.Parameters["@name"].Value = ci.Name;
cmd.ExecuteNonQuery();
}
var resetFlags = NwMask.Fav1 | NwMask.Fav2 | NwMask.Fav3 | NwMask.Fav4 | NwMask.Lock | NwMask.Visible;
var setFlags = (NwMask)(((int)ci.Favorites & 0x0F) << 4);
if (ci.Lock) setFlags |= NwMask.Lock;
if (!ci.Hidden) setFlags |= NwMask.Visible;
cmd.CommandText = $"update svl_{x} set nw_mask=(nw_mask & @resetFlags)|@setFlags where svl_rec_id=@id";
cmd.Parameters.Clear();
cmd.Parameters.Add("@id", DbType.Int32);
cmd.Parameters.Add("@resetFlags", DbType.Int32);
cmd.Parameters.Add("@setFlags", DbType.Int32);
cmd.Parameters["@id"].Value = id;
cmd.Parameters["@resetFlags"].Value = ~(int)resetFlags;
cmd.Parameters["@setFlags"].Value = (int)setFlags;
cmd.ExecuteNonQuery();
//if (ci.NewProgramNr >= 0)
{
cmd.CommandText = $"update svl_{x} set channel_id=(channel_id&{0xFFFC})|@chnr, name=cast(@name as varchar), " +
$"option_mask=option_mask|{(int)(OptionMask.ChNumEdited|OptionMask.NameEdited)}, nw_mask=(nw_mask&@resetFlags)|@setFlags where svl_rec_id=@id";
cmd.Parameters.Clear();
cmd.Parameters.Add("@id", DbType.Int32);
cmd.Parameters.Add("@chnr", DbType.Int32);
cmd.Parameters.Add("@name", DbType.Binary);
cmd.Parameters.Add("@resetFlags", DbType.Int32);
cmd.Parameters.Add("@setFlags", DbType.Int32);
cmd.Parameters["@id"].Value = id;
cmd.Parameters["@chnr"].Value = ci.NewProgramNr << 18;
cmd.Parameters["@name"].Value = Encoding.BigEndianUnicode.GetBytes(ci.Name);
cmd.Parameters["@resetFlags"].Value = ~(int)resetFlags;
cmd.Parameters["@setFlags"].Value = (int)setFlags;
cmd.ExecuteNonQuery();
}
//else
//{
// cmd.CommandText = $"update svl_{x} set nw_mask=nw_mask | " + ((int)OptionMask.DeletedByUser) + " where svl_rec_id=@id";
// cmd.Parameters.Clear();
// cmd.Parameters.Add("@id", DbType.Int32);
// cmd.Parameters.Add("@fav", DbType.Int32);
// cmd.Parameters["@id"].Value = id;
// cmd.Parameters["@fav"].Value = ((int)ci.Favorites & 0x0F) << 4;
// cmd.ExecuteNonQuery();
//}
}
#endregion

View File

@@ -10,7 +10,7 @@ using ChanSort.Api;
namespace ChanSort.Loader.Hisense
{
#if HISENSE_ENABLED
public class HisSerializerPlugin : ISerializerPlugin
public class DbSerializerPlugin : ISerializerPlugin
{
public string PluginName => "Hisense *.db";
public string FileFilter => "channel.db";
@@ -18,7 +18,7 @@ namespace ChanSort.Loader.Hisense
#region CreateSerializer()
public SerializerBase CreateSerializer(string inputFile)
{
return new HisSerializer(inputFile);
return new DbSerializer(inputFile);
}
#endregion
}

View File

@@ -1,4 +1,5 @@
[Series:B]
; "Clone" directory: must be manually zipped and renamed to .scm, favorites 1-4 are stored in a bitmask
SatDataBase.dat = 145
TransponderDataBase.dat = 49
FineTune = 20
@@ -11,7 +12,7 @@
Favorites = 4
[Series:C]
; _1001 format. favorites A-D are stored in a bitmask
; _1001.scm format: favorites 1-4 are stored in a bitmask
SatDataBase.dat = 145
TransponderDataBase.dat = 45
PTC = 12
@@ -22,7 +23,7 @@
Favorites = 4
[Series:D]
; _1101 format. favorite A-E have individual number fields, but only allow 0 = not-a-fav, 1=is-a-fav
; _1101.scm format: favorite 1-5 have individual number fields, but only allow 0 = not-a-fav, 1=is-a-fav
SatDataBase.dat = 145
TransponderDataBase.dat = 45
PTC = 12
@@ -35,8 +36,8 @@
SortedFavorites = 0
[Series:E]
; _1201 format with favorites A-E and individual numbering (-1 = not-a-fav, 0...x = fav program nr)
; used by E models
; _1201.scm format: with favorites 1-5 and individual numbering (-1 = not-a-fav, 1...x = [sequential?] fav nr)
; used by E , F, H, some J models and LTxxBxxx, LTxxCxxx, HExxCxxx, ...
SatDataBase.dat = 145
TransponderDataBase.dat = 45
PTC = 12
@@ -47,26 +48,15 @@
map-AstraHDPlusD = 212
map-CyfraPlusD = 172
Favorites = 5
; SortedFavorites: 1=allow individual ordering of each list, 2=force all lists to use the main program nr
; some models don't seem to work correctly when the fav and prog numbers are different.
SortedFavorites = 1
[Series:F]
; _1201 format with favorites A-E, but forced to use same numbers as main program number (-1 = not-a-fav, 0...x = main program nr)
; used by F, H, low-end J and HExxC models
SatDataBase.dat = 145
TransponderDataBase.dat = 45
PTC = 12
map-AirA = 64
map-AirD = 320
map-CableD = 320
map-SateD = 168
map-AstraHDPlusD = 212
map-CyfraPlusD = 172
Favorites = 5
SortedFavorites = 2
[Analog:28]
; map-AirA and map-CableA for B series
; map-AirA and map-CableA for B models
offInUse = 0
maskInUse = 0x02
offProgramNr = 4
@@ -77,7 +67,7 @@
offChecksum = 27
[Analog:40]
; map-AirA and map-CableA for C series
; map-AirA and map-CableA for C models
offInUse = 1
maskInUse = 0x01
offDeleted = 2
@@ -96,7 +86,7 @@
offChecksum = 39
[Analog:64]
; map-AirA and map-CableA for D,E and F series
; map-AirA and map-CableA for D,E,F,H,J models
offInUse = 1
maskInUse = 0x01
offDeleted = 2
@@ -137,7 +127,7 @@
offName = 8
[DvbCT:248]
; map-AirD and map-CableD for B series
; map-AirD and map-CableD for B models
offProgramNr = 0
offVideoPid = 2
offPcrPid = 4
@@ -166,7 +156,7 @@
offChecksum = 247
[DvbCT:292]
; map-AirD and map-CableD for C series
; map-AirD and map-CableD for C models
offProgramNr = 0
offVideoPid = 2
offPcrPid = 4
@@ -202,7 +192,7 @@
[DvbCT:320]
; map-AirD, map-CableD, Freesat for D,E and F series
; map-AirD, map-CableD, Freesat for D,E,F,H,J models
offProgramNr = 0
offVideoPid = 2
offPcrPid = 4
@@ -237,7 +227,7 @@
offChecksum = 319
[TransponderDataBase.dat:49]
; B Series
; B models
offMagicByte = 0
offTransponderIndex = 1
offSatelliteIndex = 5
@@ -245,7 +235,7 @@
offSymbolRate = 17
[TransponderDataBase.dat:45]
; C,D,E Series
; C,D,E,F,H,J models
offMagicByte = 0
offTransponderIndex = 1
offSatelliteIndex = 5
@@ -253,7 +243,7 @@
offSymbolRate = 13
[DvbS:144]
; map-SateD for B and C Series
; map-SateD for B and C models
offProgramNr = 0
offVideoPid = 2
offPcrPid = 4
@@ -279,7 +269,7 @@
offChecksum = 143
[DvbS:172]
; map-SateD for D Series
; map-SateD for D models
offProgramNr = 0
offVideoPid = 2
offPcrPid = 4
@@ -305,7 +295,7 @@
offChecksum = 171
[DvbS:168]
; map-SateD for E and F Series
; map-SateD for E,F,H,J models
offProgramNr = 0
offVideoPid = 2
offPcrPid = 4
@@ -331,7 +321,7 @@
offChecksum = 167
[AstraHDPlusD:212]
; map-AstraHDPlusD for D, E and F Series
; map-AstraHDPlusD for D,E,F,H,J models
offProgramNr = 0,20
offVideoPid=2
offPcrId=4

View File

@@ -163,10 +163,9 @@ namespace ChanSort.Loader.Samsung
case "1001": series = "C"; break;
case "1101": series = "D"; break;
case "1201":
var letter = match.Groups[2].Value;
// E, F, H and low-end J series use same file format
// E however allows individually sorted favorites while the other require the fav number to be equal to the main program nr
series = letter == "E" ? "E" : "F";
//var letter = match.Groups[2].Value;
// E, F, H and some J models use same file format
series = "E";
break;
default:
return false;
@@ -191,12 +190,12 @@ namespace ChanSort.Loader.Samsung
if (cloneInfo.Length >= 9)
{
char series = (char) cloneInfo[8];
if (series == 'B') // LTxxBxxx uses E/F format. the old B-series has no CloneInfo file, so we can tell the difference
series = 'F';
else if (series == 'C') // there are models with a C that are actually F: LTxxCxxx, HExxCxxx, ... so we can't decide here
if (series == 'B') // LTxxBxxx uses 1201 format. The 2009 B-models have no CloneInfo file, so we can tell the difference
series = 'E';
else if (series == 'C') // "C" usually means 1001 format, but there some with 1201 format: LTxxCxxx, HExxCxxx, ... so we can't decide here
return false;
else if (series >= 'F') // F, H, low-end J
series = 'F';
else if (series >= 'E') // E, F, H, some J
series = 'E';
if (this.modelConstants.TryGetValue("Series:" + series, out this.c))
return true;
}
@@ -215,7 +214,7 @@ namespace ChanSort.Loader.Samsung
DetectModelFromAstraHdPlusD(zip)
};
// E, F, B(2013), H, low-end J series use an identical format, so we only care about one here
// E, F, H, some J and a few others use an identical format, which we all treat as "E"
string validCandidates = "BCDE";
foreach (var candidateList in candidates)
{
@@ -234,8 +233,6 @@ namespace ChanSort.Loader.Samsung
return false;
var series = validCandidates[0];
if (series == 'E') // E allows favorites to be individually sorted, while F-J require them to match the main program nr
series = 'F'; // since we can't tell the difference from the format, we use the safe F/H/J logic, which also works for E
this.modelConstants.TryGetValue("Series:" + series, out this.c);
return true;
}

View File

@@ -6,11 +6,8 @@ namespace ChanSort.Loader.SamsungJ
{
internal class DbChannel : ChannelInfo
{
#if INDIVIDUALLY_SORTED_FAVS
internal Dictionary<int,int> OriginalFavIndex = new Dictionary<int, int>();
#else
internal List<int> OriginalFavIndex = new List<int> { -1, -1, -1, -1 , -1 };
internal Favorites OriginalFavs;
#endif
#region ctor()
internal DbChannel(SQLiteDataReader r, IDictionary<string, int> field, DataRoot dataRoot, Dictionary<long, string> providers, Satellite sat, Transponder tp)
@@ -50,6 +47,7 @@ namespace ChanSort.Loader.SamsungJ
base.IsDeleted = this.OldProgramNr == -1;
}
#endregion
#region ReadAnalogData()

View File

@@ -25,9 +25,9 @@ namespace ChanSort.Loader.SamsungJ
DepencencyChecker.AssertVc2010RedistPackageX86Installed();
this.Features.ChannelNameEdit = ChannelNameEditMode.All;
this.Features.CanDeleteChannels = false;
this.Features.CanDeleteChannels = true;
this.DataRoot.SupportedFavorites = Favorites.A | Favorites.B | Favorites.C | Favorites.D | Favorites.E;
this.DataRoot.SortedFavorites = false;
this.DataRoot.SortedFavorites = true;
}
#endregion
@@ -268,14 +268,8 @@ namespace ChanSort.Loader.SamsungJ
"SRV.srvId", "major", "progNum", "cast(srvName as blob)", "srvType", "hidden", "scrambled", "lockMode", "numSel", // SRV
};
if (digital)
{
fieldNames.AddRange(new[] {"onid", "tsid", "vidPid", "provId", "cast(shrtSrvName as blob)", "lcn"}); // SRV_DVB
// make LCN-based channel lists read-only
cmd.CommandText = "select count(1) from SRV_DVB where lcn<>65535";
channelList.ReadOnly = (long)cmd.ExecuteScalar() > 0;
}
var sql = this.BuildQuery(table, fieldNames);
var fields = this.GetFieldMap(fieldNames);
@@ -410,15 +404,14 @@ namespace ChanSort.Loader.SamsungJ
var channel = this.channelById.TryGet(r.GetInt64(0));
if (channel == null)
continue;
int fav = r.GetInt32(1) - 1;
int pos = r.GetInt32(2);
int fav = r.GetInt32(1) - 1; // fav values start with 1 in the table
int pos = r.GetInt32(2); // pos values start with 0
if (pos >= 0)
{
channel.Favorites |= (Favorites) (1 << fav);
#if INDIVIDUALLY_SORTED_FAVS
channel.FavIndex[fav] = channel.OriginalFavIndex[fav] = pos;
#else
channel.OriginalFavs = channel.Favorites;
#endif
channel.OriginalFavs = channel.Favorites;
channel.FavIndex[fav] = channel.OriginalFavIndex[fav] = pos + 1;
}
}
}
#endregion
@@ -477,6 +470,7 @@ namespace ChanSort.Loader.SamsungJ
{
using (var trans = conn.BeginTransaction())
{
Editor.SequentializeFavPos(channelList, 5);
this.WriteChannels(cmdUpdateSrv, cmdDeleteSrv, cmdInsertFav, cmdUpdateFav, cmdDeleteFav, channelList);
trans.Commit();
}
@@ -492,7 +486,7 @@ namespace ChanSort.Loader.SamsungJ
private static SQLiteCommand PrepareUpdateCommand(SQLiteConnection conn)
{
var cmd = conn.CreateCommand();
cmd.CommandText = "update SRV set major=@nr, lockMode=@lock, hideGuide=@hidden, hidden=@hidden, numSel=@numsel, srvName=@srvname where srvId=@id";
cmd.CommandText = "update SRV set major=@nr, lockMode=@lock, hideGuide=@hidden, hidden=@hidden, numSel=@numsel, srvName=cast(@srvname as varchar) where srvId=@id";
cmd.Parameters.Add(new SQLiteParameter("@id", DbType.Int64));
cmd.Parameters.Add(new SQLiteParameter("@nr", DbType.Int32));
cmd.Parameters.Add(new SQLiteParameter("@lock", DbType.Boolean));
@@ -554,7 +548,8 @@ namespace ChanSort.Loader.SamsungJ
#region WriteChannels()
private void WriteChannels(SQLiteCommand cmdUpdateSrv, SQLiteCommand cmdDeleteSrv, SQLiteCommand cmdInsertFav, SQLiteCommand cmdUpdateFav, SQLiteCommand cmdDeleteFav,
ChannelList channelList, bool analog = false)
{
{
foreach (ChannelInfo channelInfo in channelList.Channels)
{
var channel = channelInfo as DbChannel;
@@ -563,39 +558,33 @@ namespace ChanSort.Loader.SamsungJ
if (channel.NewProgramNr < 0)
{
// delete channel from all tables that have a reference to srvId
cmdDeleteSrv.Parameters["@id"].Value = channel.RecordIndex;
cmdDeleteSrv.ExecuteNonQuery();
}
else
{
cmdUpdateSrv.Parameters["@id"].Value = channel.RecordIndex;
cmdUpdateSrv.Parameters["@nr"].Value = channel.NewProgramNr;
cmdUpdateSrv.Parameters["@lock"].Value = channel.Lock;
cmdUpdateSrv.Parameters["@hidden"].Value = channel.Hidden;
cmdUpdateSrv.Parameters["@numsel"].Value = !channel.Skip;
cmdUpdateSrv.Parameters["@srvname"].Value = channel.Name == null ? (object)DBNull.Value : Encoding.BigEndianUnicode.GetBytes(channel.Name);
cmdUpdateSrv.ExecuteNonQuery();
continue;
}
// update channel record
cmdUpdateSrv.Parameters["@id"].Value = channel.RecordIndex;
cmdUpdateSrv.Parameters["@nr"].Value = channel.NewProgramNr;
cmdUpdateSrv.Parameters["@lock"].Value = channel.Lock;
cmdUpdateSrv.Parameters["@hidden"].Value = channel.Hidden;
cmdUpdateSrv.Parameters["@numsel"].Value = !channel.Skip;
cmdUpdateSrv.Parameters["@srvname"].Value = channel.Name == null ? (object)DBNull.Value : Encoding.BigEndianUnicode.GetBytes(channel.Name);
cmdUpdateSrv.ExecuteNonQuery();
// update favorites
for (int i=0, mask=1; i<5; i++, mask <<= 1)
{
#if INDIVIDUALLY_SORTED_FAVS
int oldPos;
if (!channel.OriginalFavIndex.TryGetValue(i, out oldPos))
oldPos = -1;
int newPos = channel.FavIndex[i];
if (newPos == oldPos)
continue;
#else
int oldPos = ((int)channel.OriginalFavs & mask) != 0 ? channel.OldProgramNr : -1;
int newPos = ((int)channel.Favorites & mask) != 0 ? channel.NewProgramNr : -1;
#endif
if (newPos > 0)
int oldPos = channel.OriginalFavIndex[i];
int newPos = ((int)channel.Favorites & mask) != 0 ? channel.FavIndex[i] : -1;
if (newPos >= 0)
{
var c = oldPos < 0 ? cmdInsertFav : cmdUpdateFav;
c.Parameters["@id"].Value = channel.RecordIndex;
c.Parameters["@fav"].Value = i + 1;
c.Parameters["@pos"].Value = newPos;
c.Parameters["@pos"].Value = newPos - 1;
c.ExecuteNonQuery();
}
else
@@ -604,10 +593,13 @@ namespace ChanSort.Loader.SamsungJ
cmdDeleteFav.Parameters["@fav"].Value = i + 1;
cmdDeleteFav.ExecuteNonQuery();
}
channel.OriginalFavIndex[i] = channel.FavIndex[i] = newPos;
}
channel.OriginalFavs = channel.Favorites;
}
}
#endregion
}
}

View File

@@ -25,7 +25,7 @@ namespace ChanSort.Ui
{
public partial class MainForm : XtraForm
{
public const string AppVersion = "v2015-11-28";
public const string AppVersion = "v2015-11-29";
private const int MaxMruEntries = 10;
@@ -1382,7 +1382,7 @@ namespace ChanSort.Ui
{
bool fileLoaded = this.dataRoot != null;
bool isRight = this.lastFocusedGrid == this.gviewRight;
bool mayEdit = fileLoaded && this.currentChannelList != null && !this.currentChannelList.ReadOnly;
bool mayEdit = fileLoaded && this.currentChannelList != null && (!this.currentChannelList.ReadOnly || this.miAllowEditPredefinedLists.Down);
foreach (BarItemLink link in this.miEdit.ItemLinks)
link.Item.Enabled = mayEdit;
@@ -2600,7 +2600,11 @@ namespace ChanSort.Ui
#region miAllowEditPredefinedLists_DownChanged
private void miAllowEditPredefinedLists_DownChanged(object sender, ItemClickEventArgs e)
{
TryExecute(this.UpdateGridReadOnly);
TryExecute(() =>
{
this.UpdateGridReadOnly();
this.UpdateMenu();
});
}
#endregion
}

View File

@@ -1,6 +1,4 @@
using System;
using System.IO;
using System.Text;
using System.Text;
using ChanSort.Loader.Samsung;
using Microsoft.VisualStudio.TestTools.UnitTesting;
@@ -12,41 +10,6 @@ namespace Test.Loader.Samsung
private readonly StringBuilder errors = new StringBuilder();
private const string RootPath = @"d:\sources\ChanSort\TestFiles_Samsung\";
#region LoadAllFilesAndLogDetecedFileFormat()
[TestMethod]
public void LoadAllFilesAndLogDetecedFileFormat()
{
RecurseInto(RootPath);
Assert.AreEqual("", errors.ToString());
}
private void RecurseInto(string dir)
{
foreach (var path in Directory.GetFiles(dir, "*.scm"))
{
if (path.Contains("_null"))
continue;
try
{
var s = new ScmSerializer(path);
s.Load();
var series = s.Series;
System.Diagnostics.Debug.WriteLine($"{path.Substring(RootPath.Length)}: {series}");
}
catch (Exception ex)
{
errors.AppendLine($"{path.Substring(RootPath.Length)} : {ex.Message}");
}
}
foreach (var path in Directory.GetDirectories(dir))
RecurseInto(path);
}
#endregion
[TestMethod]
public void LoadFileWithExcessiveHighFrequency_1()
{
@@ -69,7 +32,7 @@ namespace Test.Loader.Samsung
// This file uses the 1201 format (E,F,H,J), but has a "C" in its model name
var s = new ScmSerializer(RootPath + @"__C=F\Kinig\Reier Monika.scm");
s.Load();
Assert.AreEqual("F", s.Series);
Assert.AreEqual("E", s.Series);
}
[TestMethod]
@@ -78,7 +41,7 @@ namespace Test.Loader.Samsung
// This file uses the 1201 format (E,F,H,J), but has a "B" in its model name
var s = new ScmSerializer(RootPath + @"__B=F\DieterHerzberg_B\renamed.scm");
s.Load();
Assert.AreEqual("F", s.Series);
Assert.AreEqual("E", s.Series);
}
[TestMethod]
@@ -87,7 +50,7 @@ namespace Test.Loader.Samsung
// J-series model with SCM format
var s = new ScmSerializer(RootPath + @"__J\HenryLoenwind_SCM\channel_list_UE32J5170_1201_orig.scm");
s.Load();
Assert.AreEqual("F", s.Series);
Assert.AreEqual("E", s.Series);
}
}

View File

@@ -1,8 +1,14 @@
ChanSort Change Log
===================
2015-11-29
- Samsung E,F,H,J .scm file format: allow independant reordering of each
favorites list
- Samsung J .zip file format: predefined lists can be edited again, allow
independant reordering of each favorites list, allow deleting channels
2015-11-28
- fixed file format detection for Samsung J series models with .scm file extension
- fixed file format detection for Samsung J models with .scm file extension
2015-11-27
- disable editing of predefined channel lists (based on LCN).