diff --git a/Services/EpgService.cs b/Services/EpgService.cs index 0c844cc..47e8a54 100644 --- a/Services/EpgService.cs +++ b/Services/EpgService.cs @@ -21,8 +21,10 @@ public class EpgService /// Cache-Verzeichnis für heruntergeladene XMLTV-Dateien private static readonly string CacheDir = AppPaths.Epg; - /// EPG-Quelle: kostenloser XMLTV-Feed für deutschsprachige Sender (DE/AT/CH) - private const string EpgUrl = "https://epg.pw/xmltv/epg_DE.xml.gz"; + /// EPG-Quelle: kostenloser XMLTV-Feed fuer Deutschland + /// iptv-epg.org liefert sauberes UTC mit korrektem +0000 (Tagesschau 20:00 lokal = 1800 +0000). + /// Zuvor war epg.pw im Einsatz, das aber unsystematisch falsche Zeiten lieferte. + private const string EpgUrl = "https://iptv-epg.org/files/epg-de.xml.gz"; /// In-Memory-Index: Sendername (normalisiert) → Liste der Events, sortiert nach Startzeit private Dictionary> _eventsByChannel = new(); @@ -172,14 +174,7 @@ public class EpgService _eventsByChannel = events; } - /// - /// XMLTV-Zeit "20260510120000 +0200" → lokale DateTime. - /// - /// WICHTIG: epg.pw markiert alle Zeiten mit "+0000", liefert sie aber faktisch - /// schon in lokaler Zeit (MEZ/MESZ). Das ist ein Bug im Feed. Wir behandeln - /// daher "+0000" speziell: Zeit direkt als lokal interpretieren, nicht konvertieren. - /// Echte Offsets (z.B. "+0200") werden korrekt umgerechnet. - /// + /// XMLTV-Zeit "20260510120000 +0200" → lokale DateTime. private static DateTime ParseXmltvTime(string s) { if (string.IsNullOrWhiteSpace(s)) return DateTime.MinValue; @@ -191,13 +186,6 @@ public class EpgService if (parts.Length == 2 && parts[1].Length == 5) { - // Sonderfall: epg.pw liefert IMMER "+0000", obwohl die Zeiten in Wahrheit - // schon lokale Sendezeiten sind (Tagesschau 20:00 steht als 200000 +0000, - // nicht 180000 +0000). Daher "+0000" als "bereits lokal" behandeln. - if (parts[1] == "+0000" || parts[1] == "-0000") - return dt; - - // Echter Offset → konvertieren var sign = parts[1][0] == '-' ? -1 : 1; var hh = int.Parse(parts[1].Substring(1, 2)); var mm = int.Parse(parts[1].Substring(3, 2)); @@ -214,7 +202,15 @@ public class EpgService public static string NormalizeName(string name) { if (string.IsNullOrWhiteSpace(name)) return ""; - var s = name.Trim().ToLowerInvariant(); + var s = name.Trim(); + + // Länder-Präfixe entfernen (iptv-epg.org Feed verwendet "DE - Sendername") + string[] prefixes = { "DE - ", "AT - ", "CH - " }; + foreach (var pre in prefixes) + if (s.StartsWith(pre, StringComparison.OrdinalIgnoreCase)) + s = s[pre.Length..].TrimStart(); + + s = s.ToLowerInvariant(); // HD/SD-Suffixe entfernen string[] suffixes = { " hd", " uhd", " 4k", " sd", " austria", " österreich", " schweiz" }; foreach (var suf in suffixes)