Files
ChanSort/source/ChanSort.Loader.SilvaSchneider/Serializer.cs
hbeham 0cf97fe76c - UHD channels using ServiceType 0x9F are now recognized as TV channels (fixes an issue with Panasonic lists where these channels did not show up and their numbers were assigned multiple times)
- ChannelList.SignalSource and DataRoot.GetChannelList(SignalSource) are now handled so that if all bits of a given Mask are left 0, the list will accept anything.
  i.e. if Tv/Radio/Data is left 0, the list can contain all of them as well as channels that have neither of the 3 bits set.
- added basic unit tests for each loader to ensure test files have the expected numbers of channels in the various sub lists
2019-08-29 16:57:20 +02:00

99 lines
2.9 KiB
C#

using System;
using System.IO;
using System.Text;
using ChanSort.Api;
namespace ChanSort.Loader.SilvaSchneider
{
internal class Serializer : SerializerBase
{
private readonly ChannelList allChannels = new ChannelList(0, "All");
private byte[] content;
#region ctor()
public Serializer(string inputFile) : base(inputFile)
{
this.Features.ChannelNameEdit = ChannelNameEditMode.None;
this.DataRoot.SortedFavorites = false;
this.DataRoot.SupportedFavorites = 0;
this.DataRoot.AddChannelList(this.allChannels);
// hide columns for fields that don't exist in Silva-Schneider channel list
foreach (var list in this.DataRoot.ChannelLists)
{
list.VisibleColumnFieldNames.Remove("PcrPid");
list.VisibleColumnFieldNames.Remove("VideoPid");
list.VisibleColumnFieldNames.Remove("AudioPid");
list.VisibleColumnFieldNames.Remove("Lock");
list.VisibleColumnFieldNames.Remove("Skip");
list.VisibleColumnFieldNames.Remove("Hidden");
list.VisibleColumnFieldNames.Remove("Encrypted");
list.VisibleColumnFieldNames.Remove("Favorites");
}
}
#endregion
public override string DisplayName => "Silva Schneider *.sdx Loader";
#region Load()
public override void Load()
{
var decoder = new DvbStringDecoder(this.DefaultEncoding);
var pos = 0;
content = File.ReadAllBytes(this.FileName);
int prevPos = 0, nextPos;
while (prevPos < content.Length && (nextPos = Array.FindIndex(content, prevPos, ch => ch == (byte)'\n')) >= 0)
{
if (nextPos - prevPos == 0)
continue;
string line = Encoding.ASCII.GetString(content, prevPos, nextPos-prevPos);
ChannelInfo channel = new Channels(pos, line, content, prevPos, nextPos-prevPos, decoder);
this.DataRoot.AddChannel(this.allChannels, channel);
pos++;
prevPos = nextPos + 1;
}
}
#endregion
#region Save()
public override void Save(string tvOutputFile)
{
if (tvOutputFile != this.FileName)
{
File.Copy(this.FileName, tvOutputFile);
this.FileName = tvOutputFile;
}
using (var file = new FileStream(tvOutputFile, FileMode.Create))
{
foreach (var channel in this.allChannels.GetChannelsByNewOrder())
{
// when a reference list was applied, the list may contain proxy entries for deleted channels, which must be ignored
if (channel is Channels realChannel && channel.NewProgramNr >= 0)
file.Write(this.content, realChannel.FileOffset, realChannel.Length + 1);
}
}
}
#endregion
#region GetFileInformation()
public override string GetFileInformation()
{
var sb = new StringBuilder();
sb.Append(base.GetFileInformation());
return sb.ToString();
}
#endregion
}
}