Stream custom live channels using your own media
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

51 lines
1.6 KiB

using System.Globalization;
using System.Xml;
using System.Xml.Serialization;
using ErsatzTV.Infrastructure.Epg.Models;
namespace ErsatzTV.Infrastructure.Epg;
public static class EpgReader
{
private const string XmlTvDateFormat = "yyyyMMddHHmmss zzz";
public static Option<EpgProgramme> FindProgrammeAt(Stream xmlStream, DateTimeOffset targetTime)
{
var serializer = new XmlSerializer(typeof(EpgProgramme));
var settings = new XmlReaderSettings
{
ConformanceLevel = ConformanceLevel.Fragment
};
using var reader = XmlReader.Create(xmlStream, settings);
while (reader.Read())
{
if (reader.NodeType != XmlNodeType.Element || reader.Name != "programme")
{
continue;
}
string startStr = reader.GetAttribute("start");
string stopStr = reader.GetAttribute("stop");
if (startStr == null || stopStr == null)
{
continue;
}
if (DateTimeOffset.TryParseExact(startStr, XmlTvDateFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out var start) &&
DateTimeOffset.TryParseExact(stopStr, XmlTvDateFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out var stop))
{
if (start <= targetTime && targetTime < stop)
{
using var subtreeReader = reader.ReadSubtree();
return Optional(serializer.Deserialize(subtreeReader) as EpgProgramme);
}
}
}
return Option<EpgProgramme>.None;
}
}