mirror of
https://github.com/PredatH0r/ChanSort.git
synced 2026-02-28 01:00:43 +01:00
- 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:
@@ -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
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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).
|
||||
|
||||
Reference in New Issue
Block a user