Files
ChanSort/ChanSort.Api/Controller/CsvFileSerializer.cs
2013-03-31 14:09:38 +02:00

128 lines
4.2 KiB
C#

using System.Collections.Generic;
using System.IO;
using System.Linq;
namespace ChanSort.Api
{
public class CsvFileSerializer
{
private static readonly char[] Separators = new[] { ',', ';', '\t' };
#region Load()
public void Load(string fileName, DataRoot dataRoot)
{
foreach (var list in dataRoot.ChannelLists)
{
foreach (var channel in list.Channels)
channel.NewProgramNr = 0;
}
using (var stream = new StreamReader(fileName))
{
ReadChannelsFromStream(stream, dataRoot);
}
}
#endregion
#region ReadChannelsFromStream()
public static void ReadChannelsFromStream(TextReader stream, DataRoot dataRoot)
{
string line;
while ((line = stream.ReadLine()) != null)
{
ParseChannel(line, dataRoot);
}
}
#endregion
#region ParseChannel()
private static void ParseChannel(string line, DataRoot dataRoot)
{
var parts = line.Split(Separators);
if (parts.Length < 5) return;
int index, slot, transportStreamId;
if (!int.TryParse(parts[0], out index)) return;
if (!int.TryParse(parts[1], out slot)) return;
if (!int.TryParse(parts[2], out transportStreamId)) return;
string uid = parts[3].Replace("\"", "");
SignalSource signalSource;
switch (uid[0])
{
case 'S': signalSource = SignalSource.DvbS; break;
case 'C': signalSource = SignalSource.DvbCT; break;
case 'A': signalSource = SignalSource.AnalogCT; break;
case 'H': signalSource = SignalSource.HdPlusD; break;
default: return;
}
var signalType = slot < 0x4000 ? SignalType.Tv : SignalType.Radio;
var channelList = dataRoot.GetChannelList(signalSource, signalType, true);
string name = parts[4].Replace("\"", "");
IEnumerable<ChannelInfo> channels = FindChannels(channelList, name, uid);
var channel = channels == null ? null : channels.FirstOrDefault(c => c.NewProgramNr == 0);
if (channel != null)
channel.NewProgramNr = slot & 0x3FFF;
else
{
channel = new ChannelInfo(signalSource, signalType, uid, slot, name);
channel.TransportStreamId = transportStreamId;
channelList.AddChannel(channel);
}
}
#endregion
#region FindChannels()
private static IEnumerable<ChannelInfo> FindChannels(ChannelList channelList, string name, string uid)
{
IList<ChannelInfo> list = channelList.GetChannelByName(name).ToList();
if (list.Count == 1)
return list;
string[] uidParts;
if (uid.StartsWith("C") && (uidParts = uid.Split('-')).Length <= 4)
{
// older CSV files didn't use the Transponder as part of the UID, which is necessary
// to distinguish between identical channels (onid,tsid,sid) received on multiple transponders
// (e.g. from differnt regional DVB-T transmitters)
int onid = int.Parse(uidParts[1]);
int tsid = int.Parse(uidParts[2]);
int sid = int.Parse(uidParts[3]);
return channelList.Channels.Where(c =>
c.OriginalNetworkId == onid &&
c.TransportStreamId == tsid &&
c.ServiceId == sid
).ToList();
}
var byUidList = channelList.GetChannelByUid(uid);
return byUidList;
}
#endregion
#region Save()
public void Save(string fileName, DataRoot dataRoot, UnsortedChannelMode unsortedChannelMode)
{
using (StreamWriter stream = new StreamWriter(fileName))
{
foreach (var channelList in dataRoot.ChannelLists)
{
int radioMask = channelList.SignalType == SignalType.Radio ? 0x4000 : 0;
foreach (var channel in channelList.Channels.Where(ch => ch.NewProgramNr != 0).OrderBy(ch => ch.NewProgramNr))
{
string line = string.Format("{0},{1},{2},{3},\"{4}\"",
channel.RecordIndex,
channel.NewProgramNr | radioMask,
channel.TransportStreamId,
channel.Uid,
channel.Name);
stream.WriteLine(line);
}
}
}
}
#endregion
}
}