diff --git a/Dockerfile b/Dockerfile index 57428b8..c09d25e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,3 +1,5 @@ FROM php:8.4-apache +RUN echo "memory_limit=512M" > /usr/local/etc/php/conf.d/tvguide.ini + COPY --from=composer:latest /usr/bin/composer /usr/bin/composer diff --git a/app/bin/update-epg.php b/app/bin/update-epg.php index 4ca621a..8cd1814 100644 --- a/app/bin/update-epg.php +++ b/app/bin/update-epg.php @@ -8,47 +8,69 @@ $config = new Config( ); $epg = $config->get('epg', []); -$url = $epg['url'] ?? null; +$urls = $epg['urls'] ?? []; -if (!$url) { - fwrite(STDERR, "Keine epg.url in config.json gesetzt.\n"); +if (!$urls && !empty($epg['url'])) { + $urls = [$epg['url']]; +} + +if (!$urls) { + fwrite(STDERR, "Keine epg.urls in config.json gesetzt.\n"); exit(1); } +$workDir = '/var/www/epg/work'; $target = '/var/www/epg/guide.xml'; -$xzFile = $target . '.xz'; -$tmpXml = $target . '.tmp'; -echo "Lade EPG: {$url}\n"; +if (!is_dir($workDir)) { + mkdir($workDir, 0775, true); +} -$data = file_get_contents($url); +$xmlFiles = []; -if ($data === false || trim($data) === '') { - fwrite(STDERR, "Download fehlgeschlagen oder leer.\n"); +foreach ($urls as $index => $url) { + $base = $workDir . '/source-' . $index; + $xzFile = $base . '.xz'; + $xmlFile = $base . '.xml'; + + echo "Lade EPG: {$url}\n"; + + $data = file_get_contents($url); + + if ($data === false || trim($data) === '') { + fwrite(STDERR, "Download fehlgeschlagen oder leer: {$url}\n"); + continue; + } + + file_put_contents($xzFile, $data); + + echo "Entpacke XZ...\n"; + + $command = 'xz -dc ' . escapeshellarg($xzFile) . ' > ' . escapeshellarg($xmlFile); + exec($command, $output, $code); + + if ($code !== 0 || !file_exists($xmlFile) || filesize($xmlFile) === 0) { + fwrite(STDERR, "XZ konnte nicht entpackt werden: {$url}\n"); + continue; + } + + if (!@simplexml_load_file($xmlFile)) { + fwrite(STDERR, "XML ungültig: {$url}\n"); + continue; + } + + $xmlFiles[] = $xmlFile; +} + +if (!$xmlFiles) { + fwrite(STDERR, "Keine gültigen XMLTV-Dateien geladen.\n"); exit(1); } -file_put_contents($xzFile, $data); +echo "Merge XMLTV...\n"; -echo "Entpacke XZ...\n"; - -$command = 'xz -dc ' . escapeshellarg($xzFile) . ' > ' . escapeshellarg($tmpXml); -exec($command, $output, $code); - -if ($code !== 0 || !file_exists($tmpXml) || filesize($tmpXml) === 0) { - fwrite(STDERR, "XZ konnte nicht entpackt werden.\n"); - exit(1); -} - -$xml = @simplexml_load_file($tmpXml); - -if (!$xml) { - unlink($tmpXml); - fwrite(STDERR, "XML ungültig.\n"); - exit(1); -} - -rename($tmpXml, $target); +$merge = new XmlTvMergeService(); +$merge->merge($xmlFiles, $target); echo "guide.xml aktualisiert.\n"; diff --git a/app/config/channels.json b/app/config/channels.json index 230da44..583900e 100644 --- a/app/config/channels.json +++ b/app/config/channels.json @@ -49,7 +49,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 5, "group": "Unknown" @@ -71,7 +71,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 7, "group": "Unknown" @@ -82,7 +82,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 8, "group": "Unknown" @@ -93,7 +93,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 9, "group": "Unknown" @@ -104,7 +104,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 10, "group": "Unknown" @@ -115,7 +115,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 11, "group": "Unknown" @@ -126,7 +126,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 12, "group": "Unknown" @@ -137,7 +137,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 13, "group": "Unknown" @@ -148,7 +148,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 14, "group": "Unknown" @@ -159,7 +159,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 15, "group": "Unknown" @@ -170,7 +170,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 16, "group": "Unknown" @@ -181,7 +181,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 17, "group": "Unknown" @@ -192,7 +192,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 18, "group": "Unknown" @@ -203,7 +203,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 19, "group": "Unknown" @@ -214,7 +214,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 20, "group": "Unknown" @@ -225,7 +225,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 21, "group": "Unknown" @@ -236,7 +236,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 22, "group": "Unknown" @@ -258,7 +258,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 24, "group": "Unknown" @@ -269,7 +269,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 25, "group": "Unknown" @@ -280,7 +280,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 26, "group": "Unknown" @@ -302,7 +302,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 28, "group": "Unknown" @@ -313,7 +313,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 29, "group": "Unknown" @@ -324,7 +324,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 30, "group": "Unknown" @@ -335,7 +335,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 31, "group": "Unknown" @@ -346,7 +346,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 32, "group": "Unknown" @@ -357,7 +357,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 33, "group": "Unknown" @@ -368,7 +368,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 34, "group": "Unknown" @@ -379,7 +379,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 35, "group": "Unknown" @@ -390,7 +390,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 36, "group": "Unknown" @@ -401,7 +401,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 37, "group": "Unknown" @@ -412,7 +412,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 38, "group": "Unknown" @@ -423,7 +423,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 39, "group": "Unknown" @@ -434,7 +434,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 40, "group": "Unknown" @@ -445,7 +445,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 41, "group": "Unknown" @@ -456,7 +456,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 42, "group": "Unknown" @@ -467,7 +467,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 43, "group": "Unknown" @@ -478,7 +478,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 44, "group": "Unknown" @@ -489,7 +489,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 45, "group": "Unknown" @@ -500,7 +500,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 46, "group": "Unknown" @@ -511,7 +511,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 47, "group": "Unknown" @@ -522,7 +522,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 48, "group": "Unknown" @@ -533,7 +533,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 49, "group": "Unknown" @@ -555,7 +555,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 51, "group": "Unknown" @@ -566,7 +566,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 52, "group": "Unknown" @@ -577,7 +577,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 53, "group": "Unknown" @@ -588,7 +588,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 54, "group": "Unknown" @@ -599,7 +599,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 55, "group": "Unknown" @@ -610,7 +610,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 56, "group": "Unknown" @@ -621,7 +621,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 57, "group": "Unknown" @@ -632,7 +632,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 58, "group": "Unknown" @@ -643,7 +643,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 59, "group": "Unknown" @@ -654,7 +654,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 60, "group": "Unknown" @@ -665,7 +665,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 61, "group": "Unknown" @@ -676,7 +676,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 62, "group": "Unknown" @@ -687,7 +687,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 63, "group": "Unknown" @@ -698,7 +698,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 64, "group": "Unknown" @@ -709,7 +709,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 65, "group": "Unknown" @@ -720,7 +720,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 66, "group": "Unknown" @@ -742,7 +742,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 68, "group": "Unknown" @@ -753,7 +753,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 69, "group": "Unknown" @@ -764,7 +764,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 70, "group": "Unknown" @@ -775,7 +775,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 71, "group": "Unknown" @@ -786,7 +786,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 72, "group": "Unknown" @@ -797,7 +797,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 73, "group": "Unknown" @@ -808,7 +808,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 74, "group": "Unknown" @@ -819,7 +819,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 75, "group": "Unknown" @@ -830,7 +830,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 76, "group": "Unknown" @@ -841,7 +841,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 77, "group": "Unknown" @@ -852,7 +852,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 78, "group": "Unknown" @@ -863,7 +863,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 79, "group": "Unknown" @@ -874,7 +874,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 80, "group": "Unknown" @@ -885,7 +885,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 81, "group": "Unknown" @@ -896,7 +896,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 82, "group": "Unknown" @@ -907,7 +907,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 83, "group": "Unknown" @@ -918,7 +918,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 84, "group": "Unknown" @@ -929,7 +929,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 85, "group": "Unknown" @@ -940,7 +940,7 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 86, "group": "Unknown" @@ -951,9 +951,1857 @@ "icon": "", "country": "", "language": "", - "enabled": true, + "enabled": false, "favorite": false, "number": 87, "group": "Unknown" + }, + "CANAL+Golf.at": { + "uuid": "e449e8b57a8032d406629a3821a061b1", + "name": "CANAL+ Golf", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 88, + "group": "Unknown" + }, + "ORF2europe.at": { + "uuid": "7e9b8480fdb039074c1dab25dd26c197", + "name": "ORF 2 Europe", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 89, + "group": "Unknown" + }, + "krone.tv.at": { + "uuid": "7615f8c35820ccc640d444a27eda6615", + "name": "Krone TV", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 90, + "group": "Unknown" + }, + "Golf-live.at": { + "uuid": "81dbddfc956fa6ecea6241accbf3d294", + "name": "Golf-live.at", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 91, + "group": "Unknown" + }, + "KURIER_TV.at": { + "uuid": "2f13b424f8202cbfbb25ba66ae29612b", + "name": "KURIER TV", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 92, + "group": "Unknown" + }, + "Tele5.at": { + "uuid": "0a19be9e4ae5c293dba9a4d45c05a635", + "name": "TELE 5", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 93, + "group": "Unknown" + }, + "SixxAustria.at": { + "uuid": "77e30ef4d79484841a02e9703230fdf5", + "name": "Sixx Austria", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 94, + "group": "Unknown" + }, + "ServusTV.at": { + "uuid": "ccbc2e5b8b1b4f85b5bdb84c0153b08f", + "name": "Servus TV", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 95, + "group": "Unknown" + }, + "Sat1.at": { + "uuid": "80ecd713657ff26edecd639b8e2e5bbf", + "name": "Sat.1 AT", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 96, + "group": "Unknown" + }, + "Puls4.at": { + "uuid": "be0d36b91e8bdba3ca3b01df97fdc04e", + "name": "PULS 4", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 97, + "group": "Unknown" + }, + "Pro7.at": { + "uuid": "4de31e1868379ee5db45ca2d0057f65b", + "name": "ProSieben", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 98, + "group": "Unknown" + }, + "ORF3.at": { + "uuid": "13bcb8f84550448fd82b2ec84edf104b", + "name": "ORF III", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 99, + "group": "Unknown" + }, + "ORF2.at": { + "uuid": "705c0f6f5ffb8378532906c616fc4d34", + "name": "ORF 2", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 100, + "group": "Unknown" + }, + "ORF1.at": { + "uuid": "5a46f76ffe588d546b3d2c2d8bec64a2", + "name": "ORF eins", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 101, + "group": "Unknown" + }, + "OE24TV.at": { + "uuid": "0a6e9d7325ab9e9888136f32204158e5", + "name": "OE24TV", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 102, + "group": "Unknown" + }, + "Nickelodeon.at": { + "uuid": "50ead31df6dc61aad27b5946d0b27b76", + "name": "Nickelodeon", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 103, + "group": "Unknown" + }, + "ATV2.at": { + "uuid": "56c21f1495c527e21e95494a490a51c0", + "name": "ATV2", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 104, + "group": "Unknown" + }, + "ATV.de": { + "uuid": "08ef8199603282d9fbebb45d808efe96", + "name": "ATV", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 105, + "group": "Unknown" + }, + "ORFSport.at": { + "uuid": "8dc9a79a4d74e98e869186036bd91c1b", + "name": "ORF Sport+", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 106, + "group": "Unknown" + }, + "ORFKids.at": { + "uuid": "01a824de200f0ba2e645c890b2234f0d", + "name": "ORF Kids", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 107, + "group": "Unknown" + }, + "R9Osterreich.at": { + "uuid": "b3063824e1686ae4b57345b1717078b3", + "name": "R9 Österreich", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 108, + "group": "Unknown" + }, + "ARCADIAWorld.at": { + "uuid": "367087a82607bd3d972ee883ee65cfc5", + "name": "ARCADIA World", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 109, + "group": "Unknown" + }, + "SchauTV.at": { + "uuid": "36e1723c4fe9b59def13d82aa088fe0b", + "name": "Kurier TV", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 110, + "group": "Unknown" + }, + "TirolTV.at": { + "uuid": "515985c5c9dc121f9f45d2a406da7367", + "name": "Tirol TV", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 111, + "group": "Unknown" + }, + "Puls24.at": { + "uuid": "c919c4e1b11a36e938e95645afe49f21", + "name": "PULS24", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 112, + "group": "Unknown" + }, + "OKTO.at": { + "uuid": "e86d6a412ba4ebebb430816985e4d889", + "name": "OKTO", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 113, + "group": "Unknown" + }, + "LT1.at": { + "uuid": "614b781eb7195ddf20d1686788538421", + "name": "LT1", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 114, + "group": "Unknown" + }, + "LandleTV.at": { + "uuid": "8463b7f0784ed87c7cd4a7dadf7e87f5", + "name": "Ländle TV", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 115, + "group": "Unknown" + }, + "Kabel1.at": { + "uuid": "f5e45ee13c3281ac0c305bc43ef4668d", + "name": "Kabel 1 Austria", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 116, + "group": "Unknown" + }, + "Eurosport1.at": { + "uuid": "52ceb3c85bb4d93211a9d54f91326e5d", + "name": "Eurosport 1", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 117, + "group": "Unknown" + }, + "HitradioOE3.at": { + "uuid": "e92b0e9d3446c4564b585f85b2125a87", + "name": "Hitradio OE3", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 118, + "group": "Unknown" + }, + "KroneHit.at": { + "uuid": "43d30d9d6b7b954745168939c73f12f2", + "name": "KroneHit", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 119, + "group": "Unknown" + }, + "Laola1.at": { + "uuid": "bb1bdb4beef730e29ee2b905dcd2f523", + "name": "Laola1.TV", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 120, + "group": "Unknown" + }, + "W24.at": { + "uuid": "3e5297529e2cb2f10550ac246c04016d", + "name": "W24", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 121, + "group": "Unknown" + }, + "exxpresstv.at": { + "uuid": "2fba25de56f8e7d8bbeb89b2396951e5", + "name": "exxpresstv", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 122, + "group": "Unknown" + }, + "C+Action.at": { + "uuid": "ba55be60949be42b1149f82fdad25cc3", + "name": "CANAL+ Action", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 123, + "group": "Unknown" + }, + "SkySportTopEvent.de": { + "uuid": "989451fc7f2a6c5a29de37bdf9682553", + "name": "Sky Sport Top Event", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 124, + "group": "Unknown" + }, + "SkySportTennis.de": { + "uuid": "2a1778ea9769016fd2867029ed2ed398", + "name": "Sky Sport Tennis", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 125, + "group": "Unknown" + }, + "SkySportPremierLeague.de": { + "uuid": "75bf5c3cc232dda18c782b9ba821bb36", + "name": "Sky Sport Premier League HD", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 126, + "group": "Unknown" + }, + "SkySportMix.de": { + "uuid": "34b22dd03e1089c9b52e9498555abf4f", + "name": "SkySport Mix HD", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 127, + "group": "Unknown" + }, + "SkyShowcase.de": { + "uuid": "7c70ad36f4fc0a622b9db16759c90509", + "name": "Sky Showcase HD", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 128, + "group": "Unknown" + }, + "SkySportGolf.de": { + "uuid": "89ade0539b0ea96d8602c5ad08f1ba41", + "name": "Sky Sport Golf HD", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 129, + "group": "Unknown" + }, + "SkySportF1.de": { + "uuid": "94796775704a1d49c7b7199bab396508", + "name": "Sky Sport F1 HD", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 130, + "group": "Unknown" + }, + "SkyCinemaHighlights.de": { + "uuid": "b346f8c11d018de8de9430d50407a4f5", + "name": "Sky Cinema Highlights HD", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 131, + "group": "Unknown" + }, + "SkyCinemaFamily.de": { + "uuid": "6c71458e6d9715515fd763d45d5ccd0c", + "name": "Sky Cinema Family", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 132, + "group": "Unknown" + }, + "SkyAtlanticHD.de": { + "uuid": "29d833e4e2204af69a1b6bf437a8bcd3", + "name": "sky.at.sportlantic HD", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 133, + "group": "Unknown" + }, + "SkyCinemaClassics.de": { + "uuid": "28836a6c1959116cf02bc50a36db2b86", + "name": "Sky Cinema Classics", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 134, + "group": "Unknown" + }, + "SkyKrimi.de": { + "uuid": "5bc72259253c9609072c74185a15a009", + "name": "Sky Krimi", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 135, + "group": "Unknown" + }, + "SkyCrime.de": { + "uuid": "bb135343fbb6b15a1030c92cc5ab1cbc", + "name": "Sky Crime HD", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 136, + "group": "Unknown" + }, + "SkyAction.de": { + "uuid": "c31c58e648b06c381e2654016c969c63", + "name": "Sky Action", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 137, + "group": "Unknown" + }, + "Sat1Emotions.de": { + "uuid": "665f06ffad28f779405c80264c9c5719", + "name": "Sat.1 emotions", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 138, + "group": "Unknown" + }, + "SPORT1plus.de": { + "uuid": "9786ed872376bde25c8b0f8a50cc70bf", + "name": "SPORT1+", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 139, + "group": "Unknown" + }, + "NowUS.de": { + "uuid": "ac38f2eeacfa91428f4c6e53a47cb611", + "name": "NOW US", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 140, + "group": "Unknown" + }, + "SkyCinemaPremieren.de": { + "uuid": "d9c15fe52cb54abf9ebed520fb0f8b08", + "name": "Sky Cinema Premieren", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 141, + "group": "Unknown" + }, + "SkySportBundesliga.de": { + "uuid": "90735889184a9f73810d1b1e440d31cd", + "name": "Sky Sport Bundesliga", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 142, + "group": "Unknown" + }, + "Prime.de": { + "uuid": "da1e928e59af28547ae1625c5dc1df3a", + "name": "Prime", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 143, + "group": "Unknown" + }, + "SkySportAustria.de": { + "uuid": "34944e963ea05d91c6fcd302ce6165ca", + "name": "Sky Sport Austria", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 144, + "group": "Unknown" + }, + "DAZN2.de": { + "uuid": "aacdd986842a9b9cb957e0204bed2f2c", + "name": "DAZN 2 HD", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 145, + "group": "Unknown" + }, + "DAZN1.de": { + "uuid": "37ac8f728a5bd8182e1ad672dbee4b2e", + "name": "DAZN 1 HD", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 146, + "group": "Unknown" + }, + "WarnerTVSerie.de": { + "uuid": "55143847300c9a9344efe7b74e18eebc", + "name": "Warner Serie", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 147, + "group": "Unknown" + }, + "WarnerTVComedy.de": { + "uuid": "0789973280c5daa79da92b6905d36d04", + "name": "Warner Comedy", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 148, + "group": "Unknown" + }, + "WarnerTVFilm.de": { + "uuid": "3e4e612fb0362f087644e6d83628b234", + "name": "Warner Film", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 149, + "group": "Unknown" + }, + "blueSport1Live.ch": { + "uuid": "25b97b41852677e8c725513708a5bd84", + "name": "blue Sport 1 Live", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 150, + "group": "Unknown" + }, + "blueStars.ch": { + "uuid": "6a4d0172e96cf24c192d68524cdc95d3", + "name": "blue Stars", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 151, + "group": "Unknown" + }, + "blueSport7Live.ch": { + "uuid": "f32169dfb2896709a0a015a5892c5ad1", + "name": "blue Sport 7 Live", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 152, + "group": "Unknown" + }, + "blueSport6Live.ch": { + "uuid": "b5e8b9844e7dc323d5a4d8d6a5247fce", + "name": "blue Sport 6 Live", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 153, + "group": "Unknown" + }, + "blueSport5Live.ch": { + "uuid": "183ce24d9033ce8f4b8e459c577e5058", + "name": "blue Sport 5 Live", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 154, + "group": "Unknown" + }, + "blueSport4Live.ch": { + "uuid": "aa03750255a26dba8c73ea2848f37061", + "name": "blue Sport 4 Live", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 155, + "group": "Unknown" + }, + "blueSport3Live.ch": { + "uuid": "2827ab39d60cbd02baacecb606d58ece", + "name": "blue Sport 3 Live", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 156, + "group": "Unknown" + }, + "blueSport2Live.ch": { + "uuid": "a79b143e9c86a1c96c00b87fcb5f2525", + "name": "blue Sport 2 Live", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 157, + "group": "Unknown" + }, + "blueSport25Live.ch": { + "uuid": "fe549d21052ece9e021266acb80f7788", + "name": "blue Sport 25 Live", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 158, + "group": "Unknown" + }, + "blueSport24Live.ch": { + "uuid": "0712541d61b6cce557576d36781a0518", + "name": "blue Sport 24 Live", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 159, + "group": "Unknown" + }, + "blueSport23Live.ch": { + "uuid": "d035b45ab060d18255f705bab2b4468c", + "name": "blue Sport 23 Live", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 160, + "group": "Unknown" + }, + "blueSport22Live.ch": { + "uuid": "743e1d44e04ecdf6f142722dc3160385", + "name": "blue Sport 22 Live", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 161, + "group": "Unknown" + }, + "blueSport21Live.ch": { + "uuid": "b5d93e611bbecad89cf1543589c4fdb4", + "name": "blue Sport 21 Live", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 162, + "group": "Unknown" + }, + "blueSport20Live.ch": { + "uuid": "fe0de4f11cfd4e65fe3c6b4c078ab37e", + "name": "blue Sport 20 Live", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 163, + "group": "Unknown" + }, + "blueSport19Live.ch": { + "uuid": "55fbdba92f403080a3637c4e7a42d3d8", + "name": "blue Sport 19 Live", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 164, + "group": "Unknown" + }, + "blueSport18Live.ch": { + "uuid": "d97f2d83c4b0013291297fb5eda2e731", + "name": "blue Sport 18 Live", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 165, + "group": "Unknown" + }, + "blueSport2.ch": { + "uuid": "bd4abc4ebcb844053c4a914a76980310", + "name": "blue Sport D 2", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 166, + "group": "Unknown" + }, + "blueSport17Live.ch": { + "uuid": "c60e63118abf4bd70941fd40472f4079", + "name": "blue Sport 17 Live", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 167, + "group": "Unknown" + }, + "blueSport16Live.ch": { + "uuid": "0a3d74d45374704aff4f741eb897ed63", + "name": "blue Sport 16 Live", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 168, + "group": "Unknown" + }, + "blueSport15Live.ch": { + "uuid": "a480702ebe88f69cd48d70925660352a", + "name": "blue Sport 15 Live", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 169, + "group": "Unknown" + }, + "blueSport14Live.ch": { + "uuid": "5c251532724f4e848a457ab26402806d", + "name": "blue Sport 14 Live", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 170, + "group": "Unknown" + }, + "blueSport13Live.ch": { + "uuid": "b8f0fd011315655f68a76e7f35e78066", + "name": "blue Sport 13 Live", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 171, + "group": "Unknown" + }, + "blueSport12Live.ch": { + "uuid": "867f05a7ac8662c9fea898581b5a3c1c", + "name": "blue Sport 12 Live", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 172, + "group": "Unknown" + }, + "blueSport11Live.ch": { + "uuid": "83182156e491fee3b0a6976ef749e633", + "name": "blue Sport 11 Live", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 173, + "group": "Unknown" + }, + "blueSport10Live.ch": { + "uuid": "57de9b5a1864ea2dd0ab9b3013fd5f54", + "name": "blue Sport 10 Live", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 174, + "group": "Unknown" + }, + "blueSport9Live.ch": { + "uuid": "df055b32e3eed1f3a3c44f5302eb87d5", + "name": "blue Sport 9 Live", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 175, + "group": "Unknown" + }, + "blueSport8Live.ch": { + "uuid": "0695e5ded356d1d65cfadc80c5558d55", + "name": "blue Sport 8 Live", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 176, + "group": "Unknown" + }, + "blueSport1.ch": { + "uuid": "bee0b107dcb9c28c4e648db890205c72", + "name": "blue Sport D 1", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 177, + "group": "Unknown" + }, + "MySports10D.ch": { + "uuid": "4acd380ed899b3ef59228a93a7038cb4", + "name": "MySports 10 D", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 178, + "group": "Unknown" + }, + "MYSPORTS9D.ch": { + "uuid": "b14b9bf7c2da1841395c3ec216080ad9", + "name": "MySports 9 D", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 179, + "group": "Unknown" + }, + "MYSPORTS8D.ch": { + "uuid": "fe276792cd3d3ba2d66d62a633a5f1cf", + "name": "MySports 8 D", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 180, + "group": "Unknown" + }, + "MYSPORTS7D.ch": { + "uuid": "01146663d8436165f57931832bf98fd3", + "name": "MySports 7 D", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 181, + "group": "Unknown" + }, + "MYSPORTS6D.ch": { + "uuid": "8841df652b4ac04bc2c5a7300569bdbf", + "name": "MySports 6 D", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 182, + "group": "Unknown" + }, + "MYSPORTS5D.ch": { + "uuid": "81fdab83ccd845a11efaaed83e0472d4", + "name": "MySports 5 D", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 183, + "group": "Unknown" + }, + "MYSPORTS4D.ch": { + "uuid": "81b2b66ddb0ded08908cab5f6f250159", + "name": "MySports 4 D", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 184, + "group": "Unknown" + }, + "MYSPORTS3D.ch": { + "uuid": "02158221af5b2486f785597549c63e69", + "name": "MySports 3 D", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 185, + "group": "Unknown" + }, + "MYSPORTS2D.ch": { + "uuid": "243bee386f1bcbe45bb75cb397592ca6", + "name": "MySports 2 D", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 186, + "group": "Unknown" + }, + "MYSPORTSD.ch": { + "uuid": "7d92caf96e103177787db53d3e56a257", + "name": "MySports One D", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 187, + "group": "Unknown" + }, + "MYSPORTS1D.ch": { + "uuid": "f2f1a0825cba2a8fd259b553f6e3dbe0", + "name": "MySports 1 D", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 188, + "group": "Unknown" + }, + "WedoMovies.de": { + "uuid": "eff05ab91e8b20fc745fe00083a2dff9", + "name": "wedo movies", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 189, + "group": "Unknown" + }, + "SportdigitalFussball2.de": { + "uuid": "5c7835fd5181170dbc08a54b271c1ff9", + "name": "Sportdigital Fussball 2", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 190, + "group": "Unknown" + }, + "SportdigitalFussball.de": { + "uuid": "162df3f71d51a030c28013b0f28adbed", + "name": "Sportdigital Fussball", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 191, + "group": "Unknown" + }, + "Sportdigitalscooore.de": { + "uuid": "8c42a1fb917d9219b3831773e26eb339", + "name": "Sportdigital Scooore", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 192, + "group": "Unknown" + }, + "EdgeSport.de": { + "uuid": "6ff28d2cc147fbcdeedfc5bcf2bd14af", + "name": "Sportdigital Edge", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 193, + "group": "Unknown" + }, + "SkySport2.de": { + "uuid": "95c0db6bc0fbf7233d8661361c52a71a", + "name": "Sky Sport 2 HD", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 194, + "group": "Unknown" + }, + "SkySport1.de": { + "uuid": "cf6b4ff6aec61634d6d853aea49c862e", + "name": "Sky Sport 1 HD", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 195, + "group": "Unknown" + }, + "SkyBundesliga1.de": { + "uuid": "981e5ffd6e524ee416781df19efe1366", + "name": "Sky Fußball Bundesliga 1", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 196, + "group": "Unknown" + }, + "SkyBundesliga10.de": { + "uuid": "6746c61f69d2b0cb6079cb9e39e0dd1c", + "name": "Sky Sport Bundesliga 10 HD", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 197, + "group": "Unknown" + }, + "SkyBundesliga9.de": { + "uuid": "6700fea9b95a4016e486a5840fc34734", + "name": "Sky Sport Bundesliga 9 HD", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 198, + "group": "Unknown" + }, + "SkyBundesliga8.de": { + "uuid": "3a707174ea9596d0bc340ffc2cdc0962", + "name": "Sky Sport Bundesliga 8 HD", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 199, + "group": "Unknown" + }, + "SkyBundesliga7.de": { + "uuid": "5d59945f1b8e3b4b11595f0a8d2030c6", + "name": "Sky Sport Bundesliga 7 HD", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 200, + "group": "Unknown" + }, + "SkyBundesliga6.de": { + "uuid": "4daf791cd3f0a58cca17271576b7f57e", + "name": "Sky Sport Bundesliga 6 HD", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 201, + "group": "Unknown" + }, + "SkyBundesliga5.de": { + "uuid": "56fffdeab2ad568d3aa162353891abab", + "name": "Sky Sport Bundesliga 5 HD", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 202, + "group": "Unknown" + }, + "SkyBundesliga4.de": { + "uuid": "548f1923f89a029f5e5ae27bd6511503", + "name": "Sky Sport Bundesliga 4 HD", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 203, + "group": "Unknown" + }, + "SkyBundesliga3.de": { + "uuid": "7f1400fb9cf268e63f2a82d167a41972", + "name": "Sky Sport Bundesliga 3 HD", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 204, + "group": "Unknown" + }, + "SkyBundesliga2.de": { + "uuid": "58655fa1a001a847cb87d556891602c9", + "name": "Sky Sport Bundesliga 2 HD", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 205, + "group": "Unknown" + }, + "SkySportBundesligaUHD.de": { + "uuid": "376701eecbfa8f86420a21263fd6954f", + "name": "Sky Sport Bundesliga UHD", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 206, + "group": "Unknown" + }, + "SkySportUHD.de": { + "uuid": "85eb64e7c3f72761f2c032e0ae5e203e", + "name": "Sky Sport UHD", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 207, + "group": "Unknown" + }, + "DFB.TV.de": { + "uuid": "ef0aaedc9acc431a56229dbded33f962", + "name": "DFB.TV", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 208, + "group": "Unknown" + }, + "SkySport10.de": { + "uuid": "3c874a8d75507433d97aca0b1d10aab5", + "name": "SkySport10 HD", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 209, + "group": "Unknown" + }, + "SkySport9.de": { + "uuid": "eb79ece1f04bbf699c30a749ea9fcb05", + "name": "SkySport9 HD", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 210, + "group": "Unknown" + }, + "SkySport8.de": { + "uuid": "638a5c5d19befd2ef4a630c3d748526b", + "name": "SkySport8 HD", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 211, + "group": "Unknown" + }, + "SkySport7.de": { + "uuid": "c1b18c60c00d04478ebd50377bbb045c", + "name": "SkySport7 HD", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 212, + "group": "Unknown" + }, + "SkySport6.de": { + "uuid": "ef465ba4ed576bd1b83c86fbfa9aa1a5", + "name": "SkySport6 HD", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 213, + "group": "Unknown" + }, + "SkySport5.de": { + "uuid": "4ab168dd6640f9e7c55834cb81e8e90d", + "name": "SkySport5 HD", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 214, + "group": "Unknown" + }, + "SkySport4.de": { + "uuid": "07bd08bec55f8448ec3904584ea8f9c1", + "name": "SkySport4 HD", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 215, + "group": "Unknown" + }, + "SkySport3.de": { + "uuid": "b9dc645b238175b5ece9e2bdbfe7b949", + "name": "SkySport3 HD", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 216, + "group": "Unknown" + }, + "ClipMyHorseTV.de": { + "uuid": "fbc8e8718baf9ea63db0d590b3216510", + "name": "ClipMyHorse.tv", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 217, + "group": "Unknown" + }, + "SkyCinemaPremieren+1.de": { + "uuid": "e99a54926230851ea103815b936edbd6", + "name": "Sky Cinema +1", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 218, + "group": "Unknown" + }, + "SkyAtlanticPlus1.de": { + "uuid": "bd3c1e184b1cdc0c0c6fea0d8c433b5b", + "name": "sky.at.sportlantic HD +1", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 219, + "group": "Unknown" + }, + "FUSSBALL.TV1.de": { + "uuid": "79231211f858148bcbbbea705cf89b9c", + "name": "FUSSBALL.TV 1", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 220, + "group": "Unknown" + }, + "FUSSBALL.TV2.de": { + "uuid": "3c4c04743868ca111a31a54cec9cd1c8", + "name": "FUSSBALL.TV 2", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 221, + "group": "Unknown" + }, + "FUSSBALL.TV3.de": { + "uuid": "1d2b79ea8c6d6eba224e4778872bdc9b", + "name": "FUSSBALL.TV 3", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 222, + "group": "Unknown" + }, + "MS_Golf_1.de": { + "uuid": "2213a6a35e21b6c4345bc3626b7ebc08", + "name": "MS GOLF 1", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 223, + "group": "Unknown" + }, + "Thriller.de": { + "uuid": "c429ae068535f98dd748ab157c3d485d", + "name": "Thriller - Rakuten TV", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 224, + "group": "Unknown" + }, + "SpiegelTVKonflikte.de": { + "uuid": "1dc4714913af69075fb90262f94b3ff5", + "name": "SpiegelTV Konflikte", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 225, + "group": "Unknown" + }, + "RomantischeFilme.de": { + "uuid": "898edd326ac5678608c85841c98b2ddc", + "name": "Romantische Filme - Rakuten TV", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 226, + "group": "Unknown" + }, + "Netzkino.de": { + "uuid": "46ae2a3c6300786a34fb699b9dbb43d0", + "name": "Netzkino", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 227, + "group": "Unknown" + }, + "MyTimeMovieNetwork.de": { + "uuid": "06ecf229cc8b8550fc4f33327773151b", + "name": "MyTime Movie Network", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 228, + "group": "Unknown" + }, + "Grjngo.de": { + "uuid": "9bb8ceab23f034ed02c7f01f06be20b8", + "name": "Grjngo", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 229, + "group": "Unknown" + }, + "FilmRiseSerien.de": { + "uuid": "e17ec68ee692a329f08f1b0e44d684f5", + "name": "FilmRise Serien", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 230, + "group": "Unknown" + }, + "FilmRiseBingeWatch.de": { + "uuid": "894ae3e9878f3e243e21335b4e144764", + "name": "FilmRise Binge Watch", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 231, + "group": "Unknown" + }, + "FilmGold.de": { + "uuid": "78b609524150bd44086bf17d0ab4e2c2", + "name": "FilmGold", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 232, + "group": "Unknown" + }, + "Fantasja.de": { + "uuid": "7e6c91c3f2ed27b4d237fe24a2e0b068", + "name": "Fantasja", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 233, + "group": "Unknown" + }, + "Fabella.de": { + "uuid": "dc405bf6875bed827434fd6fd90eeab7", + "name": "Fabella", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 234, + "group": "Unknown" + }, + "DeutschesKino.de": { + "uuid": "4ec104cde98907b5e38cc14d5eae9854", + "name": "Deutsches Kino - Rakuten TV", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 235, + "group": "Unknown" + }, + "DEFA_TV.de": { + "uuid": "2734242171a5d038fca3fa477b2439d8", + "name": "DEFA TV", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 236, + "group": "Unknown" + }, + "DDR_TV-Archiv.de": { + "uuid": "e7116c63ff1d2dbbbff67fd9b2f51f5d", + "name": "DDR TV-Archiv", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 237, + "group": "Unknown" + }, + "CrimeSerien.de": { + "uuid": "8ed80ab177c7b2ed59a8c7846d81d08e", + "name": "Crime Serien - Rakuten TV", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 238, + "group": "Unknown" + }, + "Artflix.de": { + "uuid": "3d1177ebc8af58e9a7829c90e12f3a1b", + "name": "Artflix", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 239, + "group": "Unknown" + }, + "Komodien.de": { + "uuid": "43cd34f38947be0928802d8ffd567d3a", + "name": "Komodien - Rakuten TV", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 240, + "group": "Unknown" + }, + "Actionfilme.de": { + "uuid": "7a216f660fe0b03e71af9f3fa7592068", + "name": "Actionfilme - Rakuten TV", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 241, + "group": "Unknown" + }, + "DramaFilme.de": { + "uuid": "46650277dfb5f3d7d0948a163d81cd0b", + "name": "Drama Filme - Rakuten TV", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 242, + "group": "Unknown" + }, + "TopFilme.de": { + "uuid": "0fa59b90fbd9fff623b3a922a39ab8da", + "name": "Top Filme - Rakuten TV", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 243, + "group": "Unknown" + }, + "Amasia.de": { + "uuid": "61112bec042d8cf77eb1a4cfebb16d33", + "name": "Amasia - The Finest Art of Asian Movies", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 244, + "group": "Unknown" + }, + "RedBullTV.de": { + "uuid": "dd2b38aa2ead6746f5d1699774adba24", + "name": "Red Bull TV", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 245, + "group": "Unknown" + }, + "ServusTVMotorsport.de": { + "uuid": "78783dda717071d3b88d2d4421502720", + "name": "Servus TV Motorsport", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 246, + "group": "Unknown" + }, + "MS_Golf_2.de": { + "uuid": "db43719aae235f613b208b9e52c4ddc3", + "name": "MS GOLF 2", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 247, + "group": "Unknown" + }, + "Weihnachtskino.ch": { + "uuid": "de5a75abd1aabf8111ee0bb45e4e2701", + "name": "Weihnachtskino", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 248, + "group": "Unknown" + }, + "DAZNRise.de": { + "uuid": "f66d0ec93e9203fa74facd5b74e13fb1", + "name": "DAZN RISE", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 249, + "group": "Unknown" + }, + "DAZNFast.de": { + "uuid": "9500146750f9187c2a19c13e2c2f19c9", + "name": "DAZN FAST", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 250, + "group": "Unknown" + }, + "Sport Digital": { + "uuid": "97de6d5e04a5c630384035dbadcdea71", + "name": "Sport Digital", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 251, + "group": "Unknown" + }, + "blueSport4LiveUHD.ch": { + "uuid": "87087e14910d00304362d6c4d893da2f", + "name": "blue Sport 4 Live D", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 252, + "group": "Unknown" + }, + "blueSport3LiveUHD.ch": { + "uuid": "dc58e5d5e66e79810bfec85e5f828522", + "name": "blue Sport 3 Live D", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 253, + "group": "Unknown" + }, + "blueSport2LiveUHD.ch": { + "uuid": "609dfc85e8e33d13b9d8de13f2dd9181", + "name": "blue Sport 2 Live D", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 254, + "group": "Unknown" + }, + "blueSport1LiveUHD.ch": { + "uuid": "b493a0950c7f3eb59ab13f2d44544311", + "name": "blue Sport 1 Live D", + "icon": "", + "country": "", + "language": "", + "enabled": true, + "favorite": false, + "number": 255, + "group": "Unknown" } } \ No newline at end of file diff --git a/app/config/config.json b/app/config/config.json index 05742ad..4a9351b 100644 --- a/app/config/config.json +++ b/app/config/config.json @@ -7,6 +7,10 @@ "default_view": "today", "epg": { "provider": "rytec", - "url": "http://www.xmltvepg.nl/rytecDE_Common.xz" + "urls": [ + "http://www.xmltvepg.nl/rytecAT_Basic.xz", + "http://www.xmltvepg.nl/rytecDE_Common.xz", + "http://www.xmltvepg.nl/rytecDE_SportMovies.xz" + ] } } diff --git a/app/src/Services/XmlTvMergeService.php b/app/src/Services/XmlTvMergeService.php new file mode 100644 index 0000000..9e14cca --- /dev/null +++ b/app/src/Services/XmlTvMergeService.php @@ -0,0 +1,64 @@ +'); + + $seenChannels = []; + $seenProgrammes = []; + + foreach ($files as $file) { + if (!file_exists($file)) { + continue; + } + + $xml = simplexml_load_file($file); + + if (!$xml) { + continue; + } + + foreach ($xml->channel as $channel) { + $id = (string)$channel['id']; + + if ($id === '' || isset($seenChannels[$id])) { + continue; + } + + $this->appendXml($merged, $channel); + $seenChannels[$id] = true; + } + + foreach ($xml->programme as $programme) { + $channel = (string)$programme['channel']; + $start = (string)$programme['start']; + $stop = (string)$programme['stop']; + $title = trim((string)$programme->title); + + $key = md5($channel . '|' . $start . '|' . $stop . '|' . $title); + + if (isset($seenProgrammes[$key])) { + continue; + } + + $this->appendXml($merged, $programme); + $seenProgrammes[$key] = true; + } + } + + $dom = dom_import_simplexml($merged)->ownerDocument; + $dom->formatOutput = true; + $dom->save($target); + } + + private function appendXml(SimpleXMLElement $target, SimpleXMLElement $source): void + { + $targetDom = dom_import_simplexml($target); + $sourceDom = dom_import_simplexml($source); + + $imported = $targetDom->ownerDocument->importNode($sourceDom, true); + $targetDom->appendChild($imported); + } +}