mirror of
https://github.com/PredatH0r/ChanSort.git
synced 2026-01-16 20:32:04 +01:00
exerimental support for Hisense's new channellist.db format
This commit is contained in:
@@ -282,6 +282,14 @@ namespace ChanSort.Api
|
||||
}
|
||||
}
|
||||
|
||||
public void SetOldPosition(int subListIndex, int oldPos)
|
||||
{
|
||||
if (subListIndex == 0)
|
||||
this.OldProgramNr = oldPos;
|
||||
else
|
||||
this.OldFavIndex[subListIndex - 1] = oldPos;
|
||||
}
|
||||
|
||||
internal void ChangePosition(int subListIndex, int delta)
|
||||
{
|
||||
if (subListIndex == 0)
|
||||
|
||||
@@ -16,8 +16,9 @@ namespace ChanSort.Api
|
||||
Analog = 0x0001,
|
||||
Digital = 0x0002,
|
||||
|
||||
// bit 5+6+7+8: Antenna/Cable/Sat/IP
|
||||
MaskAntennaCableSat = 0x00F0,
|
||||
// bit 4+5+6+7+8: AvInput/Antenna/Cable/Sat/IP
|
||||
MaskAntennaCableSat = 0x00F8,
|
||||
AvInput = 0x0008,
|
||||
Antenna = 0x0010,
|
||||
Cable = 0x0020,
|
||||
Sat = 0x0040,
|
||||
|
||||
@@ -12,7 +12,7 @@ namespace ChanSort.Loader.Hisense
|
||||
#if HISENSE_ENABLED
|
||||
public class HisDbSerializerPlugin : ISerializerPlugin
|
||||
{
|
||||
public string PluginName => "Hisense *.db";
|
||||
public string PluginName => "Hisense channel.db";
|
||||
public string FileFilter => "channel*.db";
|
||||
|
||||
#region CreateSerializer()
|
||||
|
||||
@@ -0,0 +1,102 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProjectGuid>{9282E1DB-CD1F-400A-ACA1-17E0C4562ACF}</ProjectGuid>
|
||||
<OutputType>Library</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>ChanSort.Loader.Hisense2017</RootNamespace>
|
||||
<AssemblyName>ChanSort.Loader.Hisense2017</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
<TargetFrameworkProfile>
|
||||
</TargetFrameworkProfile>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>..\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<PlatformTarget>x86</PlatformTarget>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>bin\Release\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<OutputPath>..\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<DebugType>full</DebugType>
|
||||
<PlatformTarget>x86</PlatformTarget>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
|
||||
<OutputPath>bin\x86\Release\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<Optimize>true</Optimize>
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<PlatformTarget>x86</PlatformTarget>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Core" />
|
||||
<Reference Include="System.Data.SQLite, Version=1.0.87.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=x86">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\DLL\System.Data.SQLite.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Windows.Forms" />
|
||||
<Reference Include="System.Xml.Linq" />
|
||||
<Reference Include="System.Data.DataSetExtensions" />
|
||||
<Reference Include="Microsoft.CSharp" />
|
||||
<Reference Include="System.Data" />
|
||||
<Reference Include="System.Net.Http" />
|
||||
<Reference Include="System.Xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="HisDbSerializer.cs" />
|
||||
<Compile Include="HisDbSerializerPlugin.cs" />
|
||||
<Compile Include="Resources.Designer.cs">
|
||||
<DependentUpon>Resources.resx</DependentUpon>
|
||||
<AutoGen>True</AutoGen>
|
||||
<DesignTime>True</DesignTime>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\ChanSort.Api\ChanSort.Api.csproj">
|
||||
<Project>{dccffa08-472b-4d17-bb90-8f513fc01392}</Project>
|
||||
<Name>ChanSort.Api</Name>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<EmbeddedResource Include="Resources.cs.resx" />
|
||||
<EmbeddedResource Include="Resources.de.resx" />
|
||||
<EmbeddedResource Include="Resources.pt.resx" />
|
||||
<EmbeddedResource Include="Resources.resx">
|
||||
<Generator>ResXFileCodeGenerator</Generator>
|
||||
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
|
||||
<SubType>Designer</SubType>
|
||||
</EmbeddedResource>
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
Other similar extension points exist, see Microsoft.Common.targets.
|
||||
<Target Name="BeforeBuild">
|
||||
</Target>
|
||||
<Target Name="AfterBuild">
|
||||
</Target>
|
||||
-->
|
||||
</Project>
|
||||
613
source/ChanSort.Loader.Hisense2017/HisDbSerializer.cs
Normal file
613
source/ChanSort.Loader.Hisense2017/HisDbSerializer.cs
Normal file
@@ -0,0 +1,613 @@
|
||||
//#define LOCK_LCN_LISTS
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using System.Data.SQLite;
|
||||
using System.IO;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Windows.Forms;
|
||||
using ChanSort.Api;
|
||||
|
||||
namespace ChanSort.Loader.Hisense
|
||||
{
|
||||
public class HisDbSerializer : SerializerBase
|
||||
{
|
||||
private readonly Dictionary<long, ChannelInfo> channelsById = new Dictionary<long, ChannelInfo>();
|
||||
private readonly Dictionary<int, ChannelList> channelLists = new Dictionary<int, ChannelList>();
|
||||
private ChannelList favlist;
|
||||
private readonly Dictionary<int,int> favListIdToFavIndex = new Dictionary<int, int>();
|
||||
private List<string> tableNames;
|
||||
|
||||
private static readonly List<string> ColumnNames = new List<string>
|
||||
{
|
||||
"OldPosition",
|
||||
"Position",
|
||||
"Source",
|
||||
"NewProgramNr",
|
||||
"Name",
|
||||
"ShortName",
|
||||
"Favorites",
|
||||
"Lock",
|
||||
"Hidden",
|
||||
"Encrypted",
|
||||
"FreqInMhz",
|
||||
"OriginalNetworkId",
|
||||
"TransportStreamId",
|
||||
"ServiceId",
|
||||
"ServiceType",
|
||||
"ServiceTypeName",
|
||||
"NetworkName",
|
||||
"Satellite",
|
||||
"SymbolRate"
|
||||
};
|
||||
|
||||
public class HisTransponder : Transponder
|
||||
{
|
||||
public SignalSource SignalSource { get; set; }
|
||||
public string Source { get; set; }
|
||||
|
||||
public HisTransponder(int id) : base(id)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
#region ctor()
|
||||
|
||||
public HisDbSerializer(string inputFile) : base(inputFile)
|
||||
{
|
||||
DepencencyChecker.AssertVc2010RedistPackageX86Installed();
|
||||
|
||||
Features.ChannelNameEdit = ChannelNameEditMode.All;
|
||||
Features.CanDeleteChannels = false;
|
||||
Features.CanSkipChannels = false;
|
||||
Features.CanHaveGaps = true;
|
||||
DataRoot.SortedFavorites = true;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
public override string DisplayName => "Hisense servicelist.db Loader";
|
||||
|
||||
#region Load()
|
||||
|
||||
public override void Load()
|
||||
{
|
||||
using (var conn = new SQLiteConnection("Data Source=" + FileName))
|
||||
{
|
||||
conn.Open();
|
||||
using (var cmd = conn.CreateCommand())
|
||||
{
|
||||
RepairCorruptedDatabaseImage(cmd);
|
||||
LoadLists(cmd);
|
||||
LoadTableNames(cmd);
|
||||
LoadSatelliteData(cmd);
|
||||
LoadTunerData(cmd);
|
||||
LoadServiceData(cmd);
|
||||
LoadFavorites(cmd);
|
||||
}
|
||||
}
|
||||
|
||||
if (channelsById.Count == 0)
|
||||
MessageBox.Show(Resources.Load_NoChannelsMsg, Resources.Load_NoChannelsCaption, MessageBoxButtons.OK);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region RepairCorruptedDatabaseImage()
|
||||
|
||||
private void RepairCorruptedDatabaseImage(SQLiteCommand cmd)
|
||||
{
|
||||
cmd.CommandText = "REINDEX";
|
||||
cmd.ExecuteNonQuery();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region LoadTableNames()
|
||||
|
||||
private void LoadTableNames(SQLiteCommand cmd)
|
||||
{
|
||||
tableNames = new List<string>();
|
||||
cmd.CommandText = "SELECT name FROM sqlite_master WHERE type = 'table' order by name";
|
||||
using (var r = cmd.ExecuteReader())
|
||||
{
|
||||
while (r.Read())
|
||||
tableNames.Add(r.GetString(0).ToLower());
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region LoadLists()
|
||||
private void LoadLists(SQLiteCommand cmd)
|
||||
{
|
||||
cmd.CommandText = "select Pid, Name from FavoriteList";
|
||||
using (var r = cmd.ExecuteReader())
|
||||
{
|
||||
while (r.Read())
|
||||
{
|
||||
int listId = r.GetInt32(0);
|
||||
string name = r.GetString(1);
|
||||
if (name.StartsWith("FAV"))
|
||||
{
|
||||
favListIdToFavIndex.Add(listId, int.Parse(name.Substring(3)));
|
||||
continue;
|
||||
}
|
||||
|
||||
var list = new ChannelList(SignalSource.Analog | SignalSource.AvInput | SignalSource.DvbCT | SignalSource.DvbS | SignalSource.TvAndRadio, name);
|
||||
list.VisibleColumnFieldNames = ColumnNames;
|
||||
list.IsMixedSourceFavoritesList = list.Caption.StartsWith("FAV");
|
||||
|
||||
channelLists.Add(listId, list);
|
||||
DataRoot.AddChannelList(list);
|
||||
}
|
||||
|
||||
|
||||
favlist = new ChannelList(SignalSource.Analog | SignalSource.AvInput | SignalSource.DvbCT | SignalSource.DvbS | SignalSource.TvAndRadio, "Favorites");
|
||||
favlist.VisibleColumnFieldNames = ColumnNames;
|
||||
favlist.IsMixedSourceFavoritesList = true;
|
||||
channelLists.Add(0, favlist);
|
||||
DataRoot.AddChannelList(favlist);
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
|
||||
#region LoadSatelliteData()
|
||||
|
||||
|
||||
private void LoadSatelliteData(SQLiteCommand cmd)
|
||||
{
|
||||
// sample data file doesn't contain any satellite information
|
||||
#if false
|
||||
var regex = new Regex(@"^satellite$");
|
||||
foreach (var tableName in this.tableNames)
|
||||
{
|
||||
if (!regex.IsMatch(tableName))
|
||||
continue;
|
||||
cmd.CommandText = "select satl_rec_id, i2_orb_pos, ac_sat_name from " + tableName;
|
||||
using (var r = cmd.ExecuteReader())
|
||||
{
|
||||
while (r.Read())
|
||||
{
|
||||
var sat = new Satellite(r.GetInt32(0));
|
||||
var pos = r.GetInt32(1);
|
||||
sat.OrbitalPosition = $"{(decimal) Math.Abs(pos)/10:n1}{(pos < 0 ? 'W' : 'E')}";
|
||||
sat.Name = r.GetString(2);
|
||||
this.DataRoot.AddSatellite(sat);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
#region LoadTunerData()
|
||||
|
||||
private void LoadTunerData(SQLiteCommand cmd)
|
||||
{
|
||||
List<Tuple<string,SignalSource,string>> inputs = new List<Tuple<string, SignalSource, string>>
|
||||
{
|
||||
Tuple.Create("C", SignalSource.DvbC, "symbolrate"),
|
||||
Tuple.Create("C2", SignalSource.DvbC, "bandwidth"),
|
||||
Tuple.Create("S", SignalSource.DvbS, "symbolrate"),
|
||||
Tuple.Create("S2", SignalSource.DvbS, "symbolrate"),
|
||||
Tuple.Create("T", SignalSource.DvbT, "bandwidth"),
|
||||
Tuple.Create("T2", SignalSource.DvbT, "bandwidth"),
|
||||
};
|
||||
foreach (var input in inputs)
|
||||
{
|
||||
var table = input.Item1;
|
||||
var symrate = input.Item3;
|
||||
LoadTunerData(cmd, "DVB" + table + "Tuner", ", Frequency," + symrate, (t, r, i0) =>
|
||||
{
|
||||
t.Source = "DVB-" + input.Item1;
|
||||
t.SignalSource = input.Item2;
|
||||
t.FrequencyInMhz = (decimal) r.GetInt32(i0 + 0) / 1000;
|
||||
t.SymbolRate = r.GetInt32(i0 + 1);
|
||||
});
|
||||
}
|
||||
|
||||
#if false
|
||||
this.LoadTunerData(cmd, "tsl_#_data_sat_dig", ", freq, sym_rate, orb_pos", (t, r, i0) =>
|
||||
{
|
||||
t.FrequencyInMhz = r.GetInt32(i0 + 0);
|
||||
t.SymbolRate = r.GetInt32(i0 + 1);
|
||||
|
||||
// satellite information may or may not be available in the database. if there is none, create a proxy sat records from the orbital position in the TSL data
|
||||
if (t.Satellite == null)
|
||||
{
|
||||
var opos = r.GetInt32(i0 + 2);
|
||||
var sat = this.DataRoot.Satellites.TryGet(opos);
|
||||
if (sat == null)
|
||||
{
|
||||
sat = new Satellite(opos);
|
||||
var pos = (decimal) opos / 10;
|
||||
sat.Name = pos < 0 ? (-pos).ToString("n1") + "W" : pos.ToString("n1") + "E";
|
||||
}
|
||||
t.Satellite = sat;
|
||||
}
|
||||
});
|
||||
#endif
|
||||
}
|
||||
|
||||
private void LoadTunerData(SQLiteCommand cmd, string joinTable, string joinFields, Action<HisTransponder, SQLiteDataReader, int> enhanceTransponderInfo)
|
||||
{
|
||||
if (!tableNames.Contains(joinTable.ToLower()))
|
||||
return;
|
||||
|
||||
cmd.CommandText = $"select tuner.tunerid, oid, tid, satellite {joinFields} "
|
||||
+ $" from tuner inner join {joinTable} on {joinTable}.tunerid=tuner.tunerid";
|
||||
|
||||
using (var r = cmd.ExecuteReader())
|
||||
{
|
||||
while (r.Read())
|
||||
{
|
||||
var id = r.GetInt32(0);
|
||||
var trans = new HisTransponder(id);
|
||||
trans.OriginalNetworkId = r.GetInt32(1);
|
||||
trans.TransportStreamId = r.GetInt32(2);
|
||||
trans.Satellite = DataRoot.Satellites.TryGet(r.GetInt32(3));
|
||||
|
||||
enhanceTransponderInfo(trans, r, 4);
|
||||
|
||||
DataRoot.AddTransponder(trans.Satellite, trans);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region LoadServiceData()
|
||||
|
||||
private void LoadServiceData(SQLiteCommand cmd)
|
||||
{
|
||||
cmd.CommandText = @"
|
||||
select s.pid, s.type, anls.Frequency, digs.TunerId, digs.Sid, Name, ShortName, Encrypted, Visible, Selectable, ParentalLock
|
||||
from service s
|
||||
left outer join AnalogService anls on anls.ServiceId=s.Pid
|
||||
left outer join DVBService digs on digs.ServiceId=s.Pid
|
||||
";
|
||||
|
||||
using (var r = cmd.ExecuteReader())
|
||||
{
|
||||
while (r.Read())
|
||||
{
|
||||
ChannelInfo ci = null;
|
||||
if (!r.IsDBNull(2))
|
||||
ci = new ChannelInfo(SignalSource.Analog, r.GetInt32(0), -1, r.GetString(5));
|
||||
else if (!r.IsDBNull(3))
|
||||
{
|
||||
var trans = (HisTransponder)DataRoot.Transponder.TryGet(r.GetInt32(3));
|
||||
ci = new ChannelInfo(trans.SignalSource, r.GetInt32(0), -1, r.GetString(5));
|
||||
ci.Transponder = trans;
|
||||
ci.FreqInMhz = trans.FrequencyInMhz;
|
||||
ci.OriginalNetworkId = trans.OriginalNetworkId;
|
||||
ci.TransportStreamId = trans.TransportStreamId;
|
||||
ci.Source = trans.Source;
|
||||
ci.ServiceId = r.GetInt32(4);
|
||||
ci.ShortName = r.GetString(6);
|
||||
ci.Encrypted = r.GetInt32(7) != 0;
|
||||
ci.Hidden = r.GetInt32(8) == 0;
|
||||
ci.Skip = r.GetInt32(9) == 0;
|
||||
ci.Lock = r.GetInt32(10) != 0;
|
||||
}
|
||||
else if (r.GetInt32(1) == 0)
|
||||
ci = new ChannelInfo(SignalSource.AvInput, r.GetInt32(0), -1, r.GetString(5));
|
||||
|
||||
if (ci != null)
|
||||
channelsById.Add(ci.RecordIndex, ci);
|
||||
}
|
||||
}
|
||||
#if LOCK_LCN_LISTS
|
||||
// make the current list read-only if LCN is used
|
||||
if (r.GetInt32(i0 + 3) != 0)
|
||||
{
|
||||
this.channelLists[x - 1].ReadOnly = true;
|
||||
}
|
||||
#endif
|
||||
|
||||
}
|
||||
#if false
|
||||
private void LoadServiceData(SQLiteCommand cmd, string joinTable, string joinFields, Action<ChannelInfo, SQLiteDataReader, int> enhanceChannelInfo)
|
||||
{
|
||||
if (!tableNames.Contains(joinTable))
|
||||
return;
|
||||
|
||||
cmd.CommandText = $"select service.pid, -1, {joinFields}"
|
||||
+ $" from service inner join {joinTable} on {joinTable}.ServiceId=";
|
||||
using (var r = cmd.ExecuteReader())
|
||||
{
|
||||
while (r.Read())
|
||||
{
|
||||
var id = (uint)r.GetInt32(0);
|
||||
var prNr = (int)(uint)r.GetInt32(1) >> 18;
|
||||
var trans = DataRoot.Transponder.TryGet((r.GetInt32(2) << 16) | r.GetInt32(3));
|
||||
var stype = (ServiceType)r.GetInt32(4);
|
||||
var name = r.GetString(5);
|
||||
var nwMask = (NwMask)r.GetInt32(6);
|
||||
var sid = r.GetInt32(7);
|
||||
var bmedium = (BroadcastMedium)r.GetInt32(8);
|
||||
|
||||
var ssource = DetermineSignalSource(bmedium, stype);
|
||||
var ci = new ChannelInfo(ssource, id, prNr, name);
|
||||
if (trans != null)
|
||||
{
|
||||
ci.Transponder = trans;
|
||||
ci.OriginalNetworkId = trans.OriginalNetworkId;
|
||||
ci.TransportStreamId = trans.TransportStreamId;
|
||||
ci.SymbolRate = trans.SymbolRate;
|
||||
ci.FreqInMhz = trans.FrequencyInMhz;
|
||||
ci.Satellite = trans.Satellite?.ToString();
|
||||
}
|
||||
|
||||
ci.ServiceId = sid;
|
||||
|
||||
//ci.Skip = (nwMask & NwMask.Active) == 0;
|
||||
ci.Lock = (nwMask & NwMask.Lock) != 0;
|
||||
ci.Hidden = (nwMask & NwMask.Visible) == 0;
|
||||
ci.Favorites |= (Favorites)((int)(nwMask & (NwMask.Fav1 | NwMask.Fav2 | NwMask.Fav3 | NwMask.Fav4)) >> 4);
|
||||
|
||||
if (stype == ServiceType.Radio)
|
||||
ci.ServiceTypeName = "Radio";
|
||||
else if (stype == ServiceType.Tv)
|
||||
ci.ServiceTypeName = "TV";
|
||||
else if (stype == ServiceType.App)
|
||||
ci.ServiceTypeName = "Data";
|
||||
|
||||
enhanceChannelInfo(ci, r, 9);
|
||||
|
||||
var list = channelLists[tableNr - 1];
|
||||
ci.Source = list.ShortCaption;
|
||||
DataRoot.AddChannel(list, ci);
|
||||
|
||||
// add the channel to all favorites lists
|
||||
DataRoot.AddChannel(channelLists[6], ci);
|
||||
channelsById[ci.RecordIndex] = ci;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#endregion
|
||||
|
||||
#region LoadFavorites()
|
||||
|
||||
private void LoadFavorites(SQLiteCommand cmd)
|
||||
{
|
||||
cmd.CommandText = "select FavoriteId, ServiceId, ChannelNum from FavoriteItem fi";
|
||||
using (var r = cmd.ExecuteReader())
|
||||
{
|
||||
while (r.Read())
|
||||
{
|
||||
int favListId = r.GetInt32(0);
|
||||
var ci = channelsById.TryGet(r.GetInt32(1));
|
||||
int favListIdx = favListIdToFavIndex.TryGet(favListId);
|
||||
if (favListIdx != 0)
|
||||
{
|
||||
ci?.SetOldPosition(favListIdx, r.GetInt32(1));
|
||||
}
|
||||
else
|
||||
{
|
||||
var list = channelLists.TryGet(favListId);
|
||||
// TODO create copy of channel for each channel list so that it can have an independant number
|
||||
ci?.SetOldPosition(0, r.GetInt32(1));
|
||||
DataRoot.AddChannel(list, ci);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
foreach(var ci in channelsById.Values)
|
||||
DataRoot.AddChannel(favlist, ci);
|
||||
}
|
||||
#endregion
|
||||
|
||||
// Saving ====================================
|
||||
|
||||
#region Save()
|
||||
|
||||
public override void Save(string tvOutputFile)
|
||||
{
|
||||
//Editor.SequentializeFavPos(channelLists[6], 4);
|
||||
|
||||
if (tvOutputFile != FileName)
|
||||
File.Copy(FileName, tvOutputFile, true);
|
||||
|
||||
using (var conn = new SQLiteConnection("Data Source=" + tvOutputFile))
|
||||
{
|
||||
conn.Open();
|
||||
using (var trans = conn.BeginTransaction())
|
||||
using (var cmd = conn.CreateCommand())
|
||||
{
|
||||
cmd.Transaction = trans;
|
||||
try
|
||||
{
|
||||
CreateFavTables(cmd);
|
||||
#if !LOCK_LCN_LISTS
|
||||
ResetLcn(cmd);
|
||||
#endif
|
||||
foreach (var list in DataRoot.ChannelLists)
|
||||
{
|
||||
if (list.ReadOnly)
|
||||
continue;
|
||||
foreach (var ci in list.Channels)
|
||||
UpdateChannel(cmd, ci);
|
||||
}
|
||||
trans.Commit();
|
||||
FileName = tvOutputFile;
|
||||
}
|
||||
catch
|
||||
{
|
||||
trans.Rollback();
|
||||
throw;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region CreateFavTables()
|
||||
|
||||
private void CreateFavTables(SQLiteCommand cmd)
|
||||
{
|
||||
for (var i = 1; i <= 4; i++)
|
||||
if (!tableNames.Contains("fav_" + i))
|
||||
{
|
||||
cmd.CommandText = $"CREATE TABLE fav_{i} (ui2_svc_id INTEGER, ui2_svc_rec_id INTEGER, user_defined_ch_num VARCHAR, user_defined_ch_name VARCHAR)";
|
||||
cmd.ExecuteNonQuery();
|
||||
tableNames.Add($"fav_{i}");
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region ResetLcn()
|
||||
|
||||
private void ResetLcn(SQLiteCommand cmd)
|
||||
{
|
||||
var regex = new Regex(@"^svl_\d_data_dvb$");
|
||||
foreach (var table in tableNames)
|
||||
{
|
||||
if (!regex.IsMatch(table))
|
||||
continue;
|
||||
cmd.CommandText = "update " + table + " set cur_lcn=0, original_lcn=0, lcn_idx=0";
|
||||
cmd.ExecuteNonQuery();
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region UpdateChannel()
|
||||
|
||||
private void UpdateChannel(SQLiteCommand cmd, ChannelInfo ci)
|
||||
{
|
||||
if (ci.RecordIndex < 0) // skip reference list proxy channels
|
||||
return;
|
||||
|
||||
var x = (int) ((ulong) ci.RecordIndex >> 32); // the table number is kept in the higher 32 bits
|
||||
var id = (int) (ci.RecordIndex & 0xFFFFFFFF); // the record id is kept in the lower 32 bits
|
||||
|
||||
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 && ci.NewProgramNr >= 0) setFlags |= NwMask.Visible;
|
||||
|
||||
cmd.CommandText = $"update svl_{x} set channel_id=(channel_id&{0x3FFFF})|(@chnr << 18)" +
|
||||
$", ch_id_txt=@chnr || ' 0'" +
|
||||
$", ac_name=@name" +
|
||||
$", 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.String);
|
||||
cmd.Parameters.Add("@resetFlags", DbType.Int32);
|
||||
cmd.Parameters.Add("@setFlags", DbType.Int32);
|
||||
cmd.Parameters["@id"].Value = id;
|
||||
cmd.Parameters["@chnr"].Value = ci.NewProgramNr;
|
||||
cmd.Parameters["@name"].Value = ci.Name;
|
||||
cmd.Parameters["@resetFlags"].Value = ~(int) resetFlags;
|
||||
cmd.Parameters["@setFlags"].Value = (int) setFlags;
|
||||
cmd.ExecuteNonQuery();
|
||||
|
||||
for (var i = 0; i < 4; i++)
|
||||
if (ci.FavIndex[i] <= 0)
|
||||
{
|
||||
cmd.CommandText = $"delete from fav_{i + 1} where ui2_svc_id={ci.RecordIndex >> 32} and ui2_svc_rec_id={ci.RecordIndex & 0xFFFF}";
|
||||
cmd.ExecuteNonQuery();
|
||||
}
|
||||
else
|
||||
{
|
||||
cmd.CommandText = $"update fav_{i + 1} set user_defined_ch_num=@chnr, user_defined_ch_name=@name where ui2_svc_id=@svcid and ui2_svc_rec_id=@recid";
|
||||
cmd.Parameters.Clear();
|
||||
cmd.Parameters.Add("@chnr", DbType.String); // for some reason this is a VARCHAR in the database
|
||||
cmd.Parameters.Add("@name", DbType.String);
|
||||
cmd.Parameters.Add("@svcid", DbType.Int32);
|
||||
cmd.Parameters.Add("@recid", DbType.Int32);
|
||||
cmd.Parameters["@chnr"].Value = ci.FavIndex[i].ToString();
|
||||
cmd.Parameters["@name"].Value = ci.Name;
|
||||
cmd.Parameters["@svcid"].Value = ci.RecordIndex >> 32;
|
||||
cmd.Parameters["@recid"].Value = ci.RecordIndex & 0xFFFF;
|
||||
if (cmd.ExecuteNonQuery() == 0)
|
||||
{
|
||||
cmd.CommandText = $"insert into fav_{i + 1} (ui2_svc_id, ui2_svc_rec_id, user_defined_ch_num, user_defined_ch_name) values (@svcid,@recid,@chnr,@name)";
|
||||
cmd.ExecuteNonQuery();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region enums and bitmasks
|
||||
|
||||
internal enum BroadcastType
|
||||
{
|
||||
Analog = 1,
|
||||
Dvb = 2
|
||||
}
|
||||
|
||||
internal enum BroadcastMedium
|
||||
{
|
||||
DigTer = 1,
|
||||
DigCab = 2,
|
||||
DigSat = 3,
|
||||
AnaTer = 4,
|
||||
AnaCab = 5,
|
||||
AnaSat = 6
|
||||
}
|
||||
|
||||
internal enum ServiceType
|
||||
{
|
||||
Tv = 1,
|
||||
Radio = 2,
|
||||
App = 3
|
||||
}
|
||||
|
||||
[Flags]
|
||||
internal enum NwMask
|
||||
{
|
||||
Active = 1 << 1,
|
||||
Visible = 1 << 3,
|
||||
Fav1 = 1 << 4,
|
||||
Fav2 = 1 << 5,
|
||||
Fav3 = 1 << 6,
|
||||
Fav4 = 1 << 7,
|
||||
Lock = 1 << 8
|
||||
}
|
||||
|
||||
[Flags]
|
||||
internal enum OptionMask
|
||||
{
|
||||
NameEdited = 1 << 3,
|
||||
ChNumEdited = 1 << 10,
|
||||
DeletedByUser = 1 << 13
|
||||
}
|
||||
|
||||
[Flags]
|
||||
internal enum HashCode
|
||||
{
|
||||
Name = 1 << 0,
|
||||
ChannelId = 1 << 1,
|
||||
BroadcastType = 1 << 2,
|
||||
TsRecId = 1 << 3,
|
||||
ProgNum = 1 << 4,
|
||||
DvbShortName = 1 << 5,
|
||||
Radio = 1 << 10,
|
||||
Encrypted = 1 << 11,
|
||||
Tv = 1 << 13
|
||||
}
|
||||
|
||||
[Flags]
|
||||
internal enum DvbLinkageMask
|
||||
{
|
||||
Ts = 1 << 2
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
}
|
||||
}
|
||||
26
source/ChanSort.Loader.Hisense2017/HisDbSerializerPlugin.cs
Normal file
26
source/ChanSort.Loader.Hisense2017/HisDbSerializerPlugin.cs
Normal file
@@ -0,0 +1,26 @@
|
||||
#define HISENSE_ENABLED
|
||||
|
||||
/*
|
||||
Support for the Hisense file format (Sep 2015) is currently disabled due to the risk of damaging the TV when
|
||||
users import files in an older/newer format than the currently installed firmware expects.
|
||||
*/
|
||||
|
||||
using ChanSort.Api;
|
||||
|
||||
namespace ChanSort.Loader.Hisense
|
||||
{
|
||||
#if HISENSE_ENABLED
|
||||
public class HisDbSerializerPlugin : ISerializerPlugin
|
||||
{
|
||||
public string PluginName => "Hisense servicelist.db";
|
||||
public string FileFilter => "servicelist*.db";
|
||||
|
||||
#region CreateSerializer()
|
||||
public SerializerBase CreateSerializer(string inputFile)
|
||||
{
|
||||
return new HisDbSerializer(inputFile);
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
#endif
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
using System.Reflection;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
// General Information about an assembly is controlled through the following
|
||||
// set of attributes. Change these attribute values to modify the information
|
||||
// associated with an assembly.
|
||||
[assembly: AssemblyTitle("ChanSort.Loader.Hisense")]
|
||||
[assembly: AssemblyDescription("")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("")]
|
||||
[assembly: AssemblyProduct("ChanSort.Loader.Hisense")]
|
||||
[assembly: AssemblyCopyright("Copyright © 2015")]
|
||||
[assembly: AssemblyTrademark("")]
|
||||
[assembly: AssemblyCulture("")]
|
||||
|
||||
// Setting ComVisible to false makes the types in this assembly not visible
|
||||
// to COM components. If you need to access a type in this assembly from
|
||||
// COM, set the ComVisible attribute to true on that type.
|
||||
[assembly: ComVisible(false)]
|
||||
|
||||
// The following GUID is for the ID of the typelib if this project is exposed to COM
|
||||
[assembly: Guid("d093e7ee-d3ad-4e7b-af82-c6918ca017fb")]
|
||||
|
||||
// Version information for an assembly consists of the following four values:
|
||||
//
|
||||
// Major Version
|
||||
// Minor Version
|
||||
// Build Number
|
||||
// Revision
|
||||
//
|
||||
// You can specify all the values or you can default the Build and Revision Numbers
|
||||
// by using the '*' as shown below:
|
||||
// [assembly: AssemblyVersion("1.0.*")]
|
||||
[assembly: AssemblyVersion("1.0.0.0")]
|
||||
[assembly: AssemblyFileVersion("1.0.0.0")]
|
||||
83
source/ChanSort.Loader.Hisense2017/Resources.Designer.cs
generated
Normal file
83
source/ChanSort.Loader.Hisense2017/Resources.Designer.cs
generated
Normal file
@@ -0,0 +1,83 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
// Runtime Version:4.0.30319.42000
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
namespace ChanSort.Loader.Hisense {
|
||||
using System;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// A strongly-typed resource class, for looking up localized strings, etc.
|
||||
/// </summary>
|
||||
// This class was auto-generated by the StronglyTypedResourceBuilder
|
||||
// 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", "4.0.0.0")]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
internal class Resources {
|
||||
|
||||
private static global::System.Resources.ResourceManager resourceMan;
|
||||
|
||||
private static global::System.Globalization.CultureInfo resourceCulture;
|
||||
|
||||
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
|
||||
internal Resources() {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns the cached ResourceManager instance used by this class.
|
||||
/// </summary>
|
||||
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||
internal static global::System.Resources.ResourceManager ResourceManager {
|
||||
get {
|
||||
if (object.ReferenceEquals(resourceMan, null)) {
|
||||
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ChanSort.Loader.Hisense.Resources", typeof(Resources).Assembly);
|
||||
resourceMan = temp;
|
||||
}
|
||||
return resourceMan;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Overrides the current thread's CurrentUICulture property for all
|
||||
/// resource lookups using this strongly typed resource class.
|
||||
/// </summary>
|
||||
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||
internal static global::System.Globalization.CultureInfo Culture {
|
||||
get {
|
||||
return resourceCulture;
|
||||
}
|
||||
set {
|
||||
resourceCulture = value;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to No channels found.
|
||||
/// </summary>
|
||||
internal static string Load_NoChannelsCaption {
|
||||
get {
|
||||
return ResourceManager.GetString("Load_NoChannelsCaption", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to This channel list file does not contain any data.
|
||||
///Most likely a predefined channel list was selected during the TV's intial setup. Such lists do not get exported and cannot be edited on the TV or on your PC.
|
||||
///To get a list that can be edited on your PC you have to reset your TV to factory defaults and select the option 'Other' during the satellite channel setup..
|
||||
/// </summary>
|
||||
internal static string Load_NoChannelsMsg {
|
||||
get {
|
||||
return ResourceManager.GetString("Load_NoChannelsMsg", resourceCulture);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
120
source/ChanSort.Loader.Hisense2017/Resources.cs.resx
Normal file
120
source/ChanSort.Loader.Hisense2017/Resources.cs.resx
Normal file
@@ -0,0 +1,120 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
</root>
|
||||
128
source/ChanSort.Loader.Hisense2017/Resources.de.resx
Normal file
128
source/ChanSort.Loader.Hisense2017/Resources.de.resx
Normal file
@@ -0,0 +1,128 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="Load_NoChannelsMsg" xml:space="preserve">
|
||||
<value>Diese Senderliste enthält keine Daten.
|
||||
Vermutlich wurde bei der Ersteinrichtung des Geräte eine vordefinierte Liste gewählt. Solche Listen können nicht exportiert und weder am TV noch am PC bearbeitet werden.
|
||||
Um eine bearbeitbare Liste zu erhalten, müssen Sie ihr Gerät auf Werkseinstellungen zurücksetzen und beim Sat-Suchlauf die Option 'Andere' auswählen.</value>
|
||||
</data>
|
||||
<data name="Load_NoChannelsCaption" xml:space="preserve">
|
||||
<value>Keine Sender gefunden</value>
|
||||
</data>
|
||||
</root>
|
||||
120
source/ChanSort.Loader.Hisense2017/Resources.pt.resx
Normal file
120
source/ChanSort.Loader.Hisense2017/Resources.pt.resx
Normal file
@@ -0,0 +1,120 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
</root>
|
||||
128
source/ChanSort.Loader.Hisense2017/Resources.resx
Normal file
128
source/ChanSort.Loader.Hisense2017/Resources.resx
Normal file
@@ -0,0 +1,128 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="Load_NoChannelsMsg" xml:space="preserve">
|
||||
<value>This channel list file does not contain any data.
|
||||
Most likely a predefined channel list was selected during the TV's intial setup. Such lists do not get exported and cannot be edited on the TV or on your PC.
|
||||
To get a list that can be edited on your PC you have to reset your TV to factory defaults and select the option 'Other' during the satellite channel setup.</value>
|
||||
</data>
|
||||
<data name="Load_NoChannelsCaption" xml:space="preserve">
|
||||
<value>No channels found</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -101,6 +101,7 @@
|
||||
|
||||
[ACTChannelDataMapping:256]
|
||||
; LA 2013 series firmware prior to 04.20.29
|
||||
; LH541V
|
||||
reorderChannelData = 0
|
||||
lenName = 40
|
||||
offSignalSource = 8
|
||||
@@ -550,6 +551,18 @@
|
||||
lnbCount = 40
|
||||
lnbLength = 48
|
||||
|
||||
[DvbsBlock:663532]
|
||||
; LH541V
|
||||
satCount = 64
|
||||
satLength = 44
|
||||
transponderCount = 2400
|
||||
transponderLength = 48
|
||||
linkedListExtraDataLength = 2
|
||||
dvbsChannelCount = 6000
|
||||
dvbsChannelLength = 80
|
||||
lnbCount = 40
|
||||
lnbLength = 48
|
||||
|
||||
[DvbsBlock:687880]
|
||||
; everything before LM series + LM340S, LM611S, LS560S
|
||||
satCount = 64
|
||||
@@ -784,6 +797,33 @@
|
||||
offVideoPid = 64
|
||||
offAudioPid = 66
|
||||
|
||||
[SatChannelDataMapping:80]
|
||||
; LH541V
|
||||
lenName = 40
|
||||
offSatelliteNr = 0
|
||||
offSourceType = 4
|
||||
offTransponderIndex = 5, 12
|
||||
offProgramNr = 8
|
||||
offProgramNrPreset = 10
|
||||
offFavorites2 = 14
|
||||
offDeleted = 14
|
||||
maskDeleted = 0x42
|
||||
offEncrypted = 14
|
||||
maskEncrypted = 0x80
|
||||
offLock = 15
|
||||
maskLock = 0x01
|
||||
offSkip = 15
|
||||
maskSkip = 0x02
|
||||
offHide = 15
|
||||
maskHide = 0x04
|
||||
offProgNrCustomized = 15
|
||||
maskProgNrCustomized = 0x40
|
||||
offServiceId = 16
|
||||
offServiceType = 18
|
||||
offNameLength = 19
|
||||
offName = 20
|
||||
offVideoPid = 60
|
||||
offAudioPid = 62
|
||||
|
||||
[SatChannelDataMapping:92]
|
||||
; LA series
|
||||
@@ -920,6 +960,10 @@
|
||||
; LB550U, LB561V
|
||||
offSize = 0
|
||||
|
||||
[FirmwareData:21460]
|
||||
; LH541V
|
||||
offSize = 0
|
||||
|
||||
[FirmwareData:23072]
|
||||
; LE3300, LD420, LD450, LD550
|
||||
offSize = 0
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio 14
|
||||
VisualStudioVersion = 14.0.23107.0
|
||||
# Visual Studio 15
|
||||
VisualStudioVersion = 15.0.26228.4
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ChanSort", "ChanSort\ChanSort.csproj", "{5FAFDABC-A52F-498C-BD2F-AFFC4119797A}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
@@ -46,6 +46,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ChanSort.Loader.Hisense", "
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Test.Loader.Samsung", "Test.Loader.Samsung\Test.Loader.Samsung.csproj", "{1ED68A9B-6698-4609-B9E6-8E08B6055F2E}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ChanSort.Loader.Hisense2017", "ChanSort.Loader.Hisense2017\ChanSort.Loader.Hisense2017.csproj", "{9282E1DB-CD1F-400A-ACA1-17E0C4562ACF}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
@@ -78,7 +80,8 @@ Global
|
||||
{DCCFFA08-472B-4D17-BB90-8F513FC01392}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{DCCFFA08-472B-4D17-BB90-8F513FC01392}.Release|Mixed Platforms.ActiveCfg = Release|x86
|
||||
{DCCFFA08-472B-4D17-BB90-8F513FC01392}.Release|Mixed Platforms.Build.0 = Release|x86
|
||||
{DCCFFA08-472B-4D17-BB90-8F513FC01392}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{DCCFFA08-472B-4D17-BB90-8F513FC01392}.Release|x86.ActiveCfg = Release|x86
|
||||
{DCCFFA08-472B-4D17-BB90-8F513FC01392}.Release|x86.Build.0 = Release|x86
|
||||
{E972D8A1-2F5F-421C-AC91-CFF45E5191BE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{E972D8A1-2F5F-421C-AC91-CFF45E5191BE}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{E972D8A1-2F5F-421C-AC91-CFF45E5191BE}.Debug|Mixed Platforms.ActiveCfg = Debug|x86
|
||||
@@ -89,7 +92,8 @@ Global
|
||||
{E972D8A1-2F5F-421C-AC91-CFF45E5191BE}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{E972D8A1-2F5F-421C-AC91-CFF45E5191BE}.Release|Mixed Platforms.ActiveCfg = Release|x86
|
||||
{E972D8A1-2F5F-421C-AC91-CFF45E5191BE}.Release|Mixed Platforms.Build.0 = Release|x86
|
||||
{E972D8A1-2F5F-421C-AC91-CFF45E5191BE}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{E972D8A1-2F5F-421C-AC91-CFF45E5191BE}.Release|x86.ActiveCfg = Release|x86
|
||||
{E972D8A1-2F5F-421C-AC91-CFF45E5191BE}.Release|x86.Build.0 = Release|x86
|
||||
{68CFCB2F-B52A-43A1-AA5C-5D64A1D655D2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{68CFCB2F-B52A-43A1-AA5C-5D64A1D655D2}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{68CFCB2F-B52A-43A1-AA5C-5D64A1D655D2}.Debug|Mixed Platforms.ActiveCfg = Debug|x86
|
||||
@@ -100,7 +104,8 @@ Global
|
||||
{68CFCB2F-B52A-43A1-AA5C-5D64A1D655D2}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{68CFCB2F-B52A-43A1-AA5C-5D64A1D655D2}.Release|Mixed Platforms.ActiveCfg = Release|x86
|
||||
{68CFCB2F-B52A-43A1-AA5C-5D64A1D655D2}.Release|Mixed Platforms.Build.0 = Release|x86
|
||||
{68CFCB2F-B52A-43A1-AA5C-5D64A1D655D2}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{68CFCB2F-B52A-43A1-AA5C-5D64A1D655D2}.Release|x86.ActiveCfg = Release|x86
|
||||
{68CFCB2F-B52A-43A1-AA5C-5D64A1D655D2}.Release|x86.Build.0 = Release|x86
|
||||
{A1C9A98D-368A-44E8-9B7F-7EACA46C9EC5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{A1C9A98D-368A-44E8-9B7F-7EACA46C9EC5}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{A1C9A98D-368A-44E8-9B7F-7EACA46C9EC5}.Debug|Mixed Platforms.ActiveCfg = Debug|x86
|
||||
@@ -111,7 +116,8 @@ Global
|
||||
{A1C9A98D-368A-44E8-9B7F-7EACA46C9EC5}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{A1C9A98D-368A-44E8-9B7F-7EACA46C9EC5}.Release|Mixed Platforms.ActiveCfg = Release|x86
|
||||
{A1C9A98D-368A-44E8-9B7F-7EACA46C9EC5}.Release|Mixed Platforms.Build.0 = Release|x86
|
||||
{A1C9A98D-368A-44E8-9B7F-7EACA46C9EC5}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{A1C9A98D-368A-44E8-9B7F-7EACA46C9EC5}.Release|x86.ActiveCfg = Release|x86
|
||||
{A1C9A98D-368A-44E8-9B7F-7EACA46C9EC5}.Release|x86.Build.0 = Release|x86
|
||||
{F6F02792-07F1-48D5-9AF3-F945CA5E3931}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{F6F02792-07F1-48D5-9AF3-F945CA5E3931}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{F6F02792-07F1-48D5-9AF3-F945CA5E3931}.Debug|Mixed Platforms.ActiveCfg = Debug|x86
|
||||
@@ -122,7 +128,8 @@ Global
|
||||
{F6F02792-07F1-48D5-9AF3-F945CA5E3931}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{F6F02792-07F1-48D5-9AF3-F945CA5E3931}.Release|Mixed Platforms.ActiveCfg = Release|x86
|
||||
{F6F02792-07F1-48D5-9AF3-F945CA5E3931}.Release|Mixed Platforms.Build.0 = Release|x86
|
||||
{F6F02792-07F1-48D5-9AF3-F945CA5E3931}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{F6F02792-07F1-48D5-9AF3-F945CA5E3931}.Release|x86.ActiveCfg = Release|x86
|
||||
{F6F02792-07F1-48D5-9AF3-F945CA5E3931}.Release|x86.Build.0 = Release|x86
|
||||
{68DA8072-3A29-4076-9F64-D66F38349585}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{68DA8072-3A29-4076-9F64-D66F38349585}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{68DA8072-3A29-4076-9F64-D66F38349585}.Debug|Mixed Platforms.ActiveCfg = Debug|x86
|
||||
@@ -133,7 +140,8 @@ Global
|
||||
{68DA8072-3A29-4076-9F64-D66F38349585}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{68DA8072-3A29-4076-9F64-D66F38349585}.Release|Mixed Platforms.ActiveCfg = Release|x86
|
||||
{68DA8072-3A29-4076-9F64-D66F38349585}.Release|Mixed Platforms.Build.0 = Release|x86
|
||||
{68DA8072-3A29-4076-9F64-D66F38349585}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{68DA8072-3A29-4076-9F64-D66F38349585}.Release|x86.ActiveCfg = Release|x86
|
||||
{68DA8072-3A29-4076-9F64-D66F38349585}.Release|x86.Build.0 = Release|x86
|
||||
{F943DBFE-D3C3-4885-A38B-375148012FEC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{F943DBFE-D3C3-4885-A38B-375148012FEC}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{F943DBFE-D3C3-4885-A38B-375148012FEC}.Debug|Mixed Platforms.ActiveCfg = Debug|x86
|
||||
@@ -144,7 +152,8 @@ Global
|
||||
{F943DBFE-D3C3-4885-A38B-375148012FEC}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{F943DBFE-D3C3-4885-A38B-375148012FEC}.Release|Mixed Platforms.ActiveCfg = Release|x86
|
||||
{F943DBFE-D3C3-4885-A38B-375148012FEC}.Release|Mixed Platforms.Build.0 = Release|x86
|
||||
{F943DBFE-D3C3-4885-A38B-375148012FEC}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{F943DBFE-D3C3-4885-A38B-375148012FEC}.Release|x86.ActiveCfg = Release|x86
|
||||
{F943DBFE-D3C3-4885-A38B-375148012FEC}.Release|x86.Build.0 = Release|x86
|
||||
{74A18C6F-09FF-413E-90D9-827066FA5B36}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{74A18C6F-09FF-413E-90D9-827066FA5B36}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{74A18C6F-09FF-413E-90D9-827066FA5B36}.Debug|Mixed Platforms.ActiveCfg = Debug|x86
|
||||
@@ -167,7 +176,8 @@ Global
|
||||
{5361C8CB-F737-4709-AF8C-E1F0456F3C5B}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{5361C8CB-F737-4709-AF8C-E1F0456F3C5B}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
||||
{5361C8CB-F737-4709-AF8C-E1F0456F3C5B}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
||||
{5361C8CB-F737-4709-AF8C-E1F0456F3C5B}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{5361C8CB-F737-4709-AF8C-E1F0456F3C5B}.Release|x86.ActiveCfg = Release|x86
|
||||
{5361C8CB-F737-4709-AF8C-E1F0456F3C5B}.Release|x86.Build.0 = Release|x86
|
||||
{33897002-0537-49A4-B963-A18D17311B3D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{33897002-0537-49A4-B963-A18D17311B3D}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{33897002-0537-49A4-B963-A18D17311B3D}.Debug|Mixed Platforms.ActiveCfg = Debug|x86
|
||||
@@ -190,8 +200,8 @@ Global
|
||||
{D093E7EE-D3AD-4E7B-AF82-C6918CA017FB}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{D093E7EE-D3AD-4E7B-AF82-C6918CA017FB}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
||||
{D093E7EE-D3AD-4E7B-AF82-C6918CA017FB}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
||||
{D093E7EE-D3AD-4E7B-AF82-C6918CA017FB}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{D093E7EE-D3AD-4E7B-AF82-C6918CA017FB}.Release|x86.Build.0 = Release|Any CPU
|
||||
{D093E7EE-D3AD-4E7B-AF82-C6918CA017FB}.Release|x86.ActiveCfg = Release|x86
|
||||
{D093E7EE-D3AD-4E7B-AF82-C6918CA017FB}.Release|x86.Build.0 = Release|x86
|
||||
{1ED68A9B-6698-4609-B9E6-8E08B6055F2E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{1ED68A9B-6698-4609-B9E6-8E08B6055F2E}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{1ED68A9B-6698-4609-B9E6-8E08B6055F2E}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
||||
@@ -202,8 +212,20 @@ Global
|
||||
{1ED68A9B-6698-4609-B9E6-8E08B6055F2E}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{1ED68A9B-6698-4609-B9E6-8E08B6055F2E}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
||||
{1ED68A9B-6698-4609-B9E6-8E08B6055F2E}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
||||
{1ED68A9B-6698-4609-B9E6-8E08B6055F2E}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{1ED68A9B-6698-4609-B9E6-8E08B6055F2E}.Release|x86.Build.0 = Release|Any CPU
|
||||
{1ED68A9B-6698-4609-B9E6-8E08B6055F2E}.Release|x86.ActiveCfg = Release|x86
|
||||
{1ED68A9B-6698-4609-B9E6-8E08B6055F2E}.Release|x86.Build.0 = Release|x86
|
||||
{9282E1DB-CD1F-400A-ACA1-17E0C4562ACF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{9282E1DB-CD1F-400A-ACA1-17E0C4562ACF}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{9282E1DB-CD1F-400A-ACA1-17E0C4562ACF}.Debug|Mixed Platforms.ActiveCfg = Debug|x86
|
||||
{9282E1DB-CD1F-400A-ACA1-17E0C4562ACF}.Debug|Mixed Platforms.Build.0 = Debug|x86
|
||||
{9282E1DB-CD1F-400A-ACA1-17E0C4562ACF}.Debug|x86.ActiveCfg = Debug|x86
|
||||
{9282E1DB-CD1F-400A-ACA1-17E0C4562ACF}.Debug|x86.Build.0 = Debug|x86
|
||||
{9282E1DB-CD1F-400A-ACA1-17E0C4562ACF}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{9282E1DB-CD1F-400A-ACA1-17E0C4562ACF}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{9282E1DB-CD1F-400A-ACA1-17E0C4562ACF}.Release|Mixed Platforms.ActiveCfg = Release|x86
|
||||
{9282E1DB-CD1F-400A-ACA1-17E0C4562ACF}.Release|Mixed Platforms.Build.0 = Release|x86
|
||||
{9282E1DB-CD1F-400A-ACA1-17E0C4562ACF}.Release|x86.ActiveCfg = Release|x86
|
||||
{9282E1DB-CD1F-400A-ACA1-17E0C4562ACF}.Release|x86.Build.0 = Release|x86
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
|
||||
2
source/ChanSort/MainForm.Designer.cs
generated
2
source/ChanSort/MainForm.Designer.cs
generated
@@ -1563,7 +1563,7 @@
|
||||
this.miCzech.Id = 95;
|
||||
this.miCzech.ImageIndex = 41;
|
||||
this.miCzech.Name = "miCzech";
|
||||
this.miCzech.Tag = "cs-CS";
|
||||
this.miCzech.Tag = "cs-CZ";
|
||||
this.miCzech.DownChanged += new DevExpress.XtraBars.ItemClickEventHandler(this.miLanguage_DownChanged);
|
||||
//
|
||||
// mnuCharset
|
||||
|
||||
@@ -31,7 +31,7 @@ namespace ChanSort.Ui
|
||||
{
|
||||
public partial class MainForm : XtraForm
|
||||
{
|
||||
public const string AppVersion = "v2016-08-10";
|
||||
public const string AppVersion = "v2017-03-29";
|
||||
|
||||
private const int MaxMruEntries = 10;
|
||||
private readonly List<string> isoEncodings = new List<string>();
|
||||
|
||||
@@ -0,0 +1,200 @@
|
||||
#include "tll-common.h"
|
||||
|
||||
#define MAX_SAT_COUNT 64
|
||||
struct TLL44_Satellite;
|
||||
typedef TLL44_Satellite TLL_Satellite;
|
||||
|
||||
#define MAX_TP_COUNT 2400
|
||||
struct TLL48_Transponder;
|
||||
typedef TLL48_Transponder TLL_Transponder;
|
||||
|
||||
#define MAX_DVBS_COUNT 6000
|
||||
struct TLL80_SatChannel;
|
||||
typedef TLL80_SatChannel TLL_SatChannel;
|
||||
|
||||
#define MAX_LNB_COUNT 40
|
||||
struct TLL48_Lnb;
|
||||
typedef TLL48_Lnb TLL_Lnb;
|
||||
|
||||
#define DVBS_CHANNELLIST_PREFIXSIZE 2
|
||||
|
||||
#include "tll-satellite.h"
|
||||
|
||||
struct LH256_AnalogChannel
|
||||
{
|
||||
byte t1[8];
|
||||
TLL_SignalSource SignalSource;
|
||||
byte t1b;
|
||||
word ChannelTransponder1;
|
||||
word ProgramNr;
|
||||
word LogicalProgramNr1;
|
||||
byte t2[4];
|
||||
byte Favorites1;
|
||||
byte t2b[3];
|
||||
word Frequency1Div50;
|
||||
word APID1;
|
||||
byte ChannelNumberInBand;
|
||||
byte ChannelBand;
|
||||
byte t3[10];
|
||||
char CH_Name1[40];
|
||||
byte CH_NameLength1;
|
||||
byte t4;
|
||||
word SID1;
|
||||
byte t5a[38];
|
||||
word ChannelTransponder2;
|
||||
dword FrequencyDiv50;
|
||||
byte t6[6];
|
||||
word ONID;
|
||||
word TSID;
|
||||
byte t7[32];
|
||||
word ChannelTransponder3;
|
||||
word ProgramNr2;
|
||||
word LogicalProgramNr2;
|
||||
word ChannelTransponder4;
|
||||
byte Favorites2;
|
||||
TLL_EditFlags EditFlags;
|
||||
word SID2;
|
||||
byte ServiceType;
|
||||
byte CH_NameLength2;
|
||||
char CH_Name2[40];
|
||||
byte t10[12];
|
||||
word Frequency2Div50;
|
||||
word APID2;
|
||||
word u1;
|
||||
word u2;
|
||||
byte t11[12];
|
||||
};
|
||||
|
||||
struct LH256_AnalogBlock
|
||||
{
|
||||
dword BlockSize;
|
||||
dword ChannelCount;
|
||||
LH256_AnalogChannel Channels[ChannelCount];
|
||||
};
|
||||
|
||||
struct LH256_FirmwareBlock
|
||||
{
|
||||
dword BlockSize;
|
||||
byte u[BlockSize];
|
||||
};
|
||||
|
||||
struct LH256_DvbCtChannel
|
||||
{
|
||||
byte t1[8];
|
||||
TLL_SignalSource SignalSource;
|
||||
byte t1b;
|
||||
word ChannelTransponder1;
|
||||
word ProgramNr;
|
||||
word LogicalProgramNr1;
|
||||
byte t2a[4];
|
||||
byte Fav1;
|
||||
byte t2b[3];
|
||||
word PcrPid1;
|
||||
word APID1;
|
||||
byte t2c[8];
|
||||
word VPID1;
|
||||
byte t3[2];
|
||||
char CH_Name1[40];
|
||||
byte CH_NameLength1;
|
||||
byte t4;
|
||||
word SID1;
|
||||
byte t5a[37];
|
||||
byte NitVersion;
|
||||
word ChannelTransponder2;
|
||||
dword Frequency;
|
||||
byte t6[6];
|
||||
word ONID;
|
||||
word TSID;
|
||||
word NID;
|
||||
dword SpecialData;
|
||||
byte t7[26];
|
||||
word ChannelTransponder3;
|
||||
word ProgramNr2;
|
||||
word LogicalProgramNr2;
|
||||
word ChannelTransponder4;
|
||||
byte Favorites2;
|
||||
TLL_EditFlags EditFlags;
|
||||
word SID2;
|
||||
byte ServiceType;
|
||||
byte CH_NameLength2;
|
||||
char CH_Name2[40];
|
||||
byte t10[12];
|
||||
word PcrPid2;
|
||||
word APID2;
|
||||
word u1;
|
||||
word u2;
|
||||
byte t11[12];
|
||||
};
|
||||
|
||||
struct LH256_DvbCTBlock
|
||||
{
|
||||
dword BlockSize;
|
||||
dword ChannelCount;
|
||||
LH256_DvbCtChannel Channels[ChannelCount];
|
||||
};
|
||||
|
||||
struct TLL48_Transponder
|
||||
{
|
||||
byte t1[10];
|
||||
word TP_Number;
|
||||
word TP_Freq;
|
||||
byte t2[8];
|
||||
word NID;
|
||||
word TID;
|
||||
byte t3[3];
|
||||
word SRateTimes2;
|
||||
byte t4[9];
|
||||
byte SatIndexTimes2;
|
||||
byte t5[3];
|
||||
byte u40[4];
|
||||
};
|
||||
|
||||
struct TLL80_SatChannel
|
||||
{
|
||||
word LnbIndex;
|
||||
word t1;
|
||||
TLL_SignalSource SignalSource;
|
||||
byte t2;
|
||||
word TP_Number;
|
||||
word CH_Number;
|
||||
word CH_NumberFixed;
|
||||
word TP_Number2;
|
||||
byte FavCrypt;
|
||||
TLL_EditFlags EditFlags;
|
||||
word SID;
|
||||
byte ServiceType;
|
||||
byte CH_NameLength;
|
||||
char CH_Name[52];
|
||||
word VPID;
|
||||
word APID;
|
||||
word t3;
|
||||
word t4;
|
||||
};
|
||||
|
||||
struct TLL48_Lnb
|
||||
{
|
||||
byte SettingsID;
|
||||
byte t2[3];
|
||||
byte SatelliteID;
|
||||
byte ScanSearchType;
|
||||
byte NetworkSearch;
|
||||
byte BlindSearch;
|
||||
byte t3[4];
|
||||
char FrequencyName[12];
|
||||
word LOF1;
|
||||
byte t4[2];
|
||||
word LOF2;
|
||||
byte t5[18];
|
||||
};
|
||||
|
||||
|
||||
public struct LH256
|
||||
{
|
||||
byte Header[4];
|
||||
|
||||
LH256_AnalogBlock Analog;
|
||||
LH256_FirmwareBlock Firmware;
|
||||
LH256_DvbCTBlock DvbCT;
|
||||
TLL_DvbSBlock DvbS;
|
||||
TLL_SettingsBlock Settings;
|
||||
};
|
||||
@@ -1,6 +1,6 @@
|
||||
struct TLL_DvbsHeaderSubblock
|
||||
{
|
||||
dword Crc32;
|
||||
dword Crc_32;
|
||||
byte DVBS_S2_Tag[8];
|
||||
word Temp03[2];
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user