initial support for .m3u Lists (for SAT>IP)

This commit is contained in:
Horst Beham
2020-01-02 11:48:00 +01:00
parent 1cc3061a4d
commit 19499d0d57
10 changed files with 360 additions and 32 deletions

View File

@@ -0,0 +1,79 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" 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>{484028B6-3AAE-4F7E-A88A-76BEEB70203B}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>ChanSort.Loader.M3u</RootNamespace>
<AssemblyName>ChanSort.Loader.M3u</AssemblyName>
<TargetFrameworkVersion>v4.6</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<Deterministic>true</Deterministic>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<LangVersion>latest</LangVersion>
</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>
<LangVersion>latest</LangVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\x86\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<DebugType>full</DebugType>
<PlatformTarget>x86</PlatformTarget>
<LangVersion>latest</LangVersion>
<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>
<LangVersion>latest</LangVersion>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Web" />
<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="Channel.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Serializer.cs" />
<Compile Include="SerializerPlugin.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\ChanSort.Api\ChanSort.Api.csproj">
<Project>{dccffa08-472b-4d17-bb90-8f513fc01392}</Project>
<Name>ChanSort.Api</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>

View File

@@ -0,0 +1,14 @@
using ChanSort.Api;
namespace ChanSort.Loader.M3u
{
internal class Channel : ChannelInfo
{
public string Uri { get; }
public Channel(int index, int progNr, string name, string uri) : base(SignalSource.IP, index, progNr, name)
{
this.Uri = uri;
}
}
}

View File

@@ -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.M3u")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("ChanSort.Loader.M3u")]
[assembly: AssemblyCopyright("Copyright © 2020")]
[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("484028b6-3aae-4f7e-a88a-76beeb70203b")]
// 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")]

View File

@@ -0,0 +1,161 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using System.Web;
using ChanSort.Api;
namespace ChanSort.Loader.M3u
{
class Serializer : SerializerBase
{
private readonly ChannelList allChannels = new ChannelList(SignalSource.IP, "All");
private List<string> lines = new List<string>();
#region ctor()
public Serializer(string inputFile) : base(inputFile)
{
this.Features.ChannelNameEdit = ChannelNameEditMode.All;
this.Features.DeleteMode = DeleteMode.Physically;
this.Features.SortedFavorites = false;
this.Features.SupportedFavorites = 0;
this.Features.CanLockChannels = false;
this.Features.CanSkipChannels = false;
this.Features.CanHideChannels = false;
this.DataRoot.AddChannelList(this.allChannels);
base.DefaultEncoding = new UTF8Encoding(false);
this.allChannels.VisibleColumnFieldNames = new List<string>()
{
"OldPosition", "Position", "Name", "FreqInMhz", "Polarity", "SymbolRate", "VideoPid", "AudioPid", "Satellite"
};
}
#endregion
#region Load()
public override void Load()
{
var rdr = new StreamReader(this.FileName);
var header = rdr.ReadLine()?.TrimEnd();
if (header != "#EXTM3U")
throw new FileLoadException("Unsupported .m3u file: " + this.FileName);
int lineNr=0;
string line1, line2;
while ((line1 = rdr.ReadLine()) != null)
{
++lineNr;
if (line1.Trim() == "")
continue;
var lineNr1 = lineNr;
while ((line2 = rdr.ReadLine()) != null)
{
++lineNr;
if (line2.Trim() != "")
{
ReadChannel(lineNr1, line1, line2);
break;
}
}
}
}
#endregion
#region ReadChannel()
private static readonly Regex ExtInfRegex = new Regex(@"^#EXTINF:\d+,(?:(\d+)\. )?(.*)$");
private void ReadChannel(int lineNr, string line1, string line2)
{
var match = ExtInfRegex.Match(line1);
if (!match.Success)
throw new FileLoadException($"Unsupported #EXTINF line #{lineNr}: {line1}");
int progNr = string.IsNullOrEmpty(match.Groups[2].Value)
? this.allChannels.Count + 1
: this.ParseInt(match.Groups[1].Value);
Uri uri;
try
{
uri = new Uri(line2);
}
catch
{
throw new FileLoadException($"Unsupported URI in line #{lineNr}: {line2}");
}
var chan = new Channel(lineNr, progNr, match.Groups[2].Value, line2);
chan.Satellite = uri.GetLeftPart(UriPartial.Path);
var parms = HttpUtility.ParseQueryString(uri.Query);
foreach (var key in parms.AllKeys)
{
var val = parms.Get(key);
switch (key)
{
case "freq":
chan.FreqInMhz = this.ParseInt(val);
break;
case "pol":
if (val.Length == 1)
chan.Polarity = Char.ToUpper(val[0]);
break;
case "sr":
chan.SymbolRate = this.ParseInt(val);
break;
case "pids":
var pids = val.Split(',');
//if (pids.Length > 3)
// chan.PcrPid = this.ParseInt(pids[3]);
if (pids.Length > 4)
chan.VideoPid = this.ParseInt(pids[4]);
if (pids.Length > 5)
chan.AudioPid = this.ParseInt(pids[5]);
break;
}
}
this.DataRoot.AddChannel(this.allChannels, chan);
}
#endregion
#region DefaultEncoding
public override Encoding DefaultEncoding
{
get => base.DefaultEncoding; // set to UTF-8 without BOM in constructor
set { } // can't be changed
}
#endregion
#region Save()
public override void Save(string tvOutputFile)
{
using var file = new StreamWriter(new FileStream(tvOutputFile, FileMode.Create), this.DefaultEncoding);
file.WriteLine("#EXTM3U");
foreach (ChannelInfo channel in this.allChannels.GetChannelsByNewOrder())
{
// when a reference list was applied, the list may contain proxy entries for deleted channels, which must be ignored
if (channel is Channel chan && !channel.IsDeleted)
{
file.WriteLine($"#EXTINF:0,{chan.NewProgramNr}. {chan.Name}");
file.WriteLine(chan.Uri);
}
}
this.FileName = tvOutputFile;
}
#endregion
#region GetFileInformation()
public override string GetFileInformation()
{
StringBuilder sb = new StringBuilder();
sb.Append(base.GetFileInformation());
return sb.ToString();
}
#endregion
}
}

View File

@@ -0,0 +1,16 @@
using ChanSort.Api;
namespace ChanSort.Loader.M3u
{
public class SerializerPlugin : ISerializerPlugin
{
public string DllName { get; set; }
public string PluginName => "m3u (WinAmp, VLC, SAT>IP, ...)";
public string FileFilter => "*.m3u";
public SerializerBase CreateSerializer(string inputFile)
{
return new Serializer(inputFile);
}
}
}

View File

@@ -74,6 +74,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Test.Loader.Toshiba", "Test
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Test.Loader.VDR", "Test.Loader.VDR\Test.Loader.VDR.csproj", "{AED060F0-495C-494C-89C2-7A96A0FA3762}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ChanSort.Loader.M3u", "ChanSort.Loader.M3u\ChanSort.Loader.M3u.csproj", "{484028B6-3AAE-4F7E-A88A-76BEEB70203B}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -408,6 +410,18 @@ Global
{AED060F0-495C-494C-89C2-7A96A0FA3762}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{AED060F0-495C-494C-89C2-7A96A0FA3762}.Release|x86.ActiveCfg = Release|x86
{AED060F0-495C-494C-89C2-7A96A0FA3762}.Release|x86.Build.0 = Release|x86
{484028B6-3AAE-4F7E-A88A-76BEEB70203B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{484028B6-3AAE-4F7E-A88A-76BEEB70203B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{484028B6-3AAE-4F7E-A88A-76BEEB70203B}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{484028B6-3AAE-4F7E-A88A-76BEEB70203B}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{484028B6-3AAE-4F7E-A88A-76BEEB70203B}.Debug|x86.ActiveCfg = Debug|x86
{484028B6-3AAE-4F7E-A88A-76BEEB70203B}.Debug|x86.Build.0 = Debug|x86
{484028B6-3AAE-4F7E-A88A-76BEEB70203B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{484028B6-3AAE-4F7E-A88A-76BEEB70203B}.Release|Any CPU.Build.0 = Release|Any CPU
{484028B6-3AAE-4F7E-A88A-76BEEB70203B}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{484028B6-3AAE-4F7E-A88A-76BEEB70203B}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{484028B6-3AAE-4F7E-A88A-76BEEB70203B}.Release|x86.ActiveCfg = Release|x86
{484028B6-3AAE-4F7E-A88A-76BEEB70203B}.Release|x86.Build.0 = Release|x86
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE

View File

@@ -404,6 +404,10 @@
<Project>{e972d8a1-2f5f-421c-ac91-cff45e5191be}</Project>
<Name>ChanSort.Loader.LG</Name>
</ProjectReference>
<ProjectReference Include="..\ChanSort.Loader.M3u\ChanSort.Loader.M3u.csproj">
<Project>{484028b6-3aae-4f7e-a88a-76beeb70203b}</Project>
<Name>ChanSort.Loader.M3u</Name>
</ProjectReference>
<ProjectReference Include="..\ChanSort.Loader.Panasonic\ChanSort.Loader.Panasonic.csproj">
<Project>{68da8072-3a29-4076-9f64-d66f38349585}</Project>
<Name>ChanSort.Loader.Panasonic</Name>

View File

@@ -1512,7 +1512,7 @@ namespace ChanSort.Ui
if (col == this.colDebug) return col.Visible;
if (col == this.colSignalSource) return col.Visible;
if (col == this.colLogicalIndex) return col.Visible;
if (col == this.colPolarity) return (source & SignalSource.Sat) != 0;
if (col == this.colPolarity) return (source & SignalSource.Sat) != 0 || (source & SignalSource.IP) != 0;
return true;
}
@@ -1618,7 +1618,7 @@ namespace ChanSort.Ui
this.btnToggleFavF.Enabled = mayEdit && (this.DataRoot.SupportedFavorites & Favorites.F) != 0 && this.subListIndex != 6;
this.btnToggleFavG.Enabled = mayEdit && (this.DataRoot.SupportedFavorites & Favorites.G) != 0 && this.subListIndex != 7;
this.btnToggleFavH.Enabled = mayEdit && (this.DataRoot.SupportedFavorites & Favorites.H) != 0 && this.subListIndex != 8;
this.btnToggleLock.Enabled = mayEdit;
this.btnToggleLock.Enabled = mayEdit && this.DataRoot.CanLock;
if (afterFileLoad)
{

View File

@@ -270,7 +270,7 @@
<value>Numeric</value>
</data>
<data name="gridLeft.Size" type="System.Drawing.Size, System.Drawing">
<value>499, 374</value>
<value>499, 368</value>
</data>
<data name="gridLeft.TabIndex" type="System.Int32, mscorlib">
<value>1</value>
@@ -291,7 +291,7 @@
<value>Bottom</value>
</data>
<data name="lblHotkeyLeft.Location" type="System.Drawing.Point, System.Drawing">
<value>2, 428</value>
<value>2, 422</value>
</data>
<data name="lblHotkeyLeft.Padding" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>2, 2, 2, 2</value>
@@ -330,7 +330,7 @@
<value>6, 13</value>
</data>
<data name="$this.ClientSize" type="System.Drawing.Size, System.Drawing">
<value>1416, 557</value>
<value>1402, 551</value>
</data>
<data name="tabSubList.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left, Right</value>
@@ -339,7 +339,7 @@
<value>0, 5</value>
</data>
<data name="pageProgNr.Size" type="System.Drawing.Size, System.Drawing">
<value>1405, 0</value>
<value>1391, 0</value>
</data>
<data name="pageProgNr.Text" xml:space="preserve">
<value>Pr#</value>
@@ -357,7 +357,7 @@
<value>0</value>
</data>
<data name="tabSubList.Size" type="System.Drawing.Size, System.Drawing">
<value>1411, 22</value>
<value>1397, 22</value>
</data>
<data name="tabSubList.TabIndex" type="System.Int32, mscorlib">
<value>6</value>
@@ -381,7 +381,7 @@
<value>0, 83</value>
</data>
<data name="grpSubList.Size" type="System.Drawing.Size, System.Drawing">
<value>1416, 27</value>
<value>1402, 27</value>
</data>
<data name="grpSubList.TabIndex" type="System.Int32, mscorlib">
<value>10</value>
@@ -795,7 +795,7 @@
<value>0, 0</value>
</data>
<data name="barDockControlTop.Size" type="System.Drawing.Size, System.Drawing">
<value>1416, 26</value>
<value>1402, 26</value>
</data>
<data name="&gt;&gt;barDockControlTop.Name" xml:space="preserve">
<value>barDockControlTop</value>
@@ -813,10 +813,10 @@
<value>Bottom</value>
</data>
<data name="barDockControlBottom.Location" type="System.Drawing.Point, System.Drawing">
<value>0, 557</value>
<value>0, 551</value>
</data>
<data name="barDockControlBottom.Size" type="System.Drawing.Size, System.Drawing">
<value>1416, 0</value>
<value>1402, 0</value>
</data>
<data name="&gt;&gt;barDockControlBottom.Name" xml:space="preserve">
<value>barDockControlBottom</value>
@@ -837,7 +837,7 @@
<value>0, 26</value>
</data>
<data name="barDockControlLeft.Size" type="System.Drawing.Size, System.Drawing">
<value>0, 531</value>
<value>0, 525</value>
</data>
<data name="&gt;&gt;barDockControlLeft.Name" xml:space="preserve">
<value>barDockControlLeft</value>
@@ -855,10 +855,10 @@
<value>Right</value>
</data>
<data name="barDockControlRight.Location" type="System.Drawing.Point, System.Drawing">
<value>1416, 26</value>
<value>1402, 26</value>
</data>
<data name="barDockControlRight.Size" type="System.Drawing.Size, System.Drawing">
<value>0, 531</value>
<value>0, 525</value>
</data>
<data name="&gt;&gt;barDockControlRight.Name" xml:space="preserve">
<value>barDockControlRight</value>
@@ -1018,7 +1018,7 @@
<value>Top, Right</value>
</data>
<data name="picDonate.Location" type="System.Drawing.Point, System.Drawing">
<value>1238, 4</value>
<value>1224, 4</value>
</data>
<data name="picDonate.Size" type="System.Drawing.Size, System.Drawing">
<value>166, 54</value>
@@ -1045,7 +1045,7 @@
<value>0, 33</value>
</data>
<data name="pageEmpty.Size" type="System.Drawing.Size, System.Drawing">
<value>1226, 0</value>
<value>1212, 0</value>
</data>
<data name="pageEmpty.Text" xml:space="preserve">
<value>No channel lists</value>
@@ -1063,7 +1063,7 @@
<value>0</value>
</data>
<data name="tabChannelList.Size" type="System.Drawing.Size, System.Drawing">
<value>1232, 22</value>
<value>1218, 22</value>
</data>
<data name="tabChannelList.TabIndex" type="System.Int32, mscorlib">
<value>5</value>
@@ -1147,7 +1147,7 @@
<value>0, 26</value>
</data>
<data name="grpTopPanel.Size" type="System.Drawing.Size, System.Drawing">
<value>1416, 57</value>
<value>1402, 57</value>
</data>
<data name="grpTopPanel.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
@@ -1264,7 +1264,7 @@
<value>globalImageCollection1</value>
</data>
<data name="&gt;&gt;globalImageCollection1.Type" xml:space="preserve">
<value>ChanSort.Ui.GlobalImageCollection, ChanSort, Version=1.0.7305.24811, Culture=neutral, PublicKeyToken=null</value>
<value>ChanSort.Ui.GlobalImageCollection, ChanSort, Version=1.0.7305.33710, Culture=neutral, PublicKeyToken=null</value>
</data>
<data name="&gt;&gt;gviewRight.Name" xml:space="preserve">
<value>gviewRight</value>
@@ -1374,6 +1374,12 @@
<data name="&gt;&gt;colFreqInMhz.Type" xml:space="preserve">
<value>DevExpress.XtraGrid.Columns.GridColumn, DevExpress.XtraGrid.v19.2, Version=19.2.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
</data>
<data name="&gt;&gt;colPolarity.Name" xml:space="preserve">
<value>colPolarity</value>
</data>
<data name="&gt;&gt;colPolarity.Type" xml:space="preserve">
<value>DevExpress.XtraGrid.Columns.GridColumn, DevExpress.XtraGrid.v19.2, Version=19.2.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
</data>
<data name="&gt;&gt;colChannelOrTransponder.Name" xml:space="preserve">
<value>colChannelOrTransponder</value>
</data>
@@ -1428,12 +1434,6 @@
<data name="&gt;&gt;colSymbolRate.Type" xml:space="preserve">
<value>DevExpress.XtraGrid.Columns.GridColumn, DevExpress.XtraGrid.v19.2, Version=19.2.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
</data>
<data name="&gt;&gt;colPolarity.Name" xml:space="preserve">
<value>colPolarity</value>
</data>
<data name="&gt;&gt;colPolarity.Type" xml:space="preserve">
<value>DevExpress.XtraGrid.Columns.GridColumn, DevExpress.XtraGrid.v19.2, Version=19.2.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
</data>
<data name="&gt;&gt;colNetworkName.Name" xml:space="preserve">
<value>colNetworkName</value>
</data>
@@ -1957,7 +1957,7 @@
<value>DevExpress.XtraEditors.XtraForm, DevExpress.Utils.v19.2, Version=19.2.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
</data>
<data name="SharedImageCollection.Timestamp" type="System.DateTime, mscorlib">
<value>01/01/2020 13:48:29</value>
<value>01/01/2020 18:44:40</value>
</data>
<data name="SharedImageCollection.ImageSize" type="System.Drawing.Size, System.Drawing">
<value>16, 16</value>
@@ -2392,7 +2392,7 @@
<value>0, 0</value>
</data>
<data name="grpOutputList.Size" type="System.Drawing.Size, System.Drawing">
<value>503, 447</value>
<value>503, 441</value>
</data>
<data name="grpOutputList.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
@@ -2773,7 +2773,7 @@
<value>Signal source</value>
</data>
<data name="gridRight.Size" type="System.Drawing.Size, System.Drawing">
<value>903, 374</value>
<value>889, 368</value>
</data>
<data name="gridRight.TabIndex" type="System.Int32, mscorlib">
<value>1</value>
@@ -2794,7 +2794,7 @@
<value>Bottom</value>
</data>
<data name="lblHotkeyRight.Location" type="System.Drawing.Point, System.Drawing">
<value>2, 428</value>
<value>2, 422</value>
</data>
<data name="lblHotkeyRight.Padding" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>2, 2, 2, 2</value>
@@ -2986,7 +2986,7 @@
<value>2, 21</value>
</data>
<data name="panelControl3.Size" type="System.Drawing.Size, System.Drawing">
<value>903, 33</value>
<value>889, 33</value>
</data>
<data name="panelControl3.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
@@ -3010,7 +3010,7 @@
<value>0, 0</value>
</data>
<data name="grpInputList.Size" type="System.Drawing.Size, System.Drawing">
<value>907, 447</value>
<value>893, 441</value>
</data>
<data name="grpInputList.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
@@ -3034,7 +3034,7 @@
<value>Panel2</value>
</data>
<data name="splitContainerControl1.Size" type="System.Drawing.Size, System.Drawing">
<value>1416, 447</value>
<value>1402, 441</value>
</data>
<data name="splitContainerControl1.TabIndex" type="System.Int32, mscorlib">
<value>5</value>

View File

@@ -1,6 +1,10 @@
ChanSort Change Log
===================
2020-01-02
- added support for m3u lists (SAT>IP, VLC, WinAmp, ...)
- disabled "Lock" toggle button when the list does not support parental locks
2020-01-01
- fixed loading of Samsung .scm files (Samsung.ini file was missing in the release package)
- added "polarity" information for Samsung .scm and .zip files