Merge branch 'master' of https://github.com/iptv-org/epg into update-plex-pluto-channels

This commit is contained in:
StrangeDrVN
2026-02-15 13:46:57 +05:30
19 changed files with 1577 additions and 342 deletions

View File

@@ -22,11 +22,11 @@
<tr><td><a href="sites/beinsports.com">beinsports.com</a></td><td align="right">130</td><td align="right">81</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/berrymedia.co.kr">berrymedia.co.kr</a></td><td align="right">5</td><td align="right">5</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/cableplus.com.uy">cableplus.com.uy</a></td><td align="right">171</td><td align="right">44</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/canalplus.com">canalplus.com</a></td><td align="right">13118</td><td align="right">179</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/canalplus.com">canalplus.com</a></td><td align="right">13118</td><td align="right">179</td><td align="center">🟢</td><td>https://github.com/iptv-org/epg/issues/3002</td></tr>
<tr><td><a href="sites/cgates.lt">cgates.lt</a></td><td align="right">47</td><td align="right">29</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/chada.ma">chada.ma</a></td><td align="right">1</td><td align="right">1</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/chaines-tv.orange.fr">chaines-tv.orange.fr</a></td><td align="right">373</td><td align="right">328</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/claro.com.br">claro.com.br</a></td><td align="right">273</td><td align="right">0</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/claro.com.br">claro.com.br</a></td><td align="right">273</td><td align="right">0</td><td align="center">🟢</td><td>https://github.com/iptv-org/epg/issues/2988</td></tr>
<tr><td><a href="sites/clarotvmais.com.br">clarotvmais.com.br</a></td><td align="right">158</td><td align="right">0</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/clickthecity.com">clickthecity.com</a></td><td align="right">32</td><td align="right">30</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/content.astro.com.my">content.astro.com.my</a></td><td align="right">149</td><td align="right">93</td><td align="center">🟢</td><td></td></tr>
@@ -38,7 +38,7 @@
<tr><td><a href="sites/derana.lk">derana.lk</a></td><td align="right">1</td><td align="right">1</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/digea.gr">digea.gr</a></td><td align="right">88</td><td align="right">0</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/digiturk.com.tr">digiturk.com.tr</a></td><td align="right">112</td><td align="right">91</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/directv.com">directv.com</a></td><td align="right">1043</td><td align="right">640</td><td align="center">🔴</td><td>https://github.com/iptv-org/epg/issues/2284</td></tr>
<tr><td><a href="sites/directv.com">directv.com</a></td><td align="right">1043</td><td align="right">640</td><td align="center">🔴</td><td>https://github.com/iptv-org/epg/issues/3001, https://github.com/iptv-org/epg/issues/2284</td></tr>
<tr><td><a href="sites/directv.com.ar">directv.com.ar</a></td><td align="right">371</td><td align="right">0</td><td align="center">🔴</td><td>https://github.com/iptv-org/epg/issues/2339</td></tr>
<tr><td><a href="sites/directv.com.uy">directv.com.uy</a></td><td align="right">374</td><td align="right">59</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/dishtv.in">dishtv.in</a></td><td align="right">434</td><td align="right">326</td><td align="center">🟢</td><td></td></tr>
@@ -59,7 +59,7 @@
<tr><td><a href="sites/foxsports.com.au">foxsports.com.au</a></td><td align="right">7</td><td align="right">7</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/foxtel.com.au">foxtel.com.au</a></td><td align="right">99</td><td align="right">60</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/freetv.tv">freetv.tv</a></td><td align="right">7</td><td align="right">7</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/freeview.co.uk">freeview.co.uk</a></td><td align="right">167</td><td align="right">98</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/freeview.co.uk">freeview.co.uk</a></td><td align="right">166</td><td align="right">104</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/frikanalen.no">frikanalen.no</a></td><td align="right">1</td><td align="right">1</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/galamtv.kz">galamtv.kz</a></td><td align="right">27</td><td align="right">22</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/gatotv.com">gatotv.com</a></td><td align="right">475</td><td align="right">360</td><td align="center">🟢</td><td></td></tr>
@@ -91,7 +91,7 @@
<tr><td><a href="sites/mediaklikk.hu">mediaklikk.hu</a></td><td align="right">8</td><td align="right">8</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/mediasetinfinity.mediaset.it">mediasetinfinity.mediaset.it</a></td><td align="right">13</td><td align="right">13</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/melita.com">melita.com</a></td><td align="right">127</td><td align="right">110</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/meo.pt">meo.pt</a></td><td align="right">217</td><td align="right">189</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/meo.pt">meo.pt</a></td><td align="right">211</td><td align="right">185</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/meuguia.tv">meuguia.tv</a></td><td align="right">102</td><td align="right">96</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/mewatch.sg">mewatch.sg</a></td><td align="right">25</td><td align="right">24</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/mi.tv">mi.tv</a></td><td align="right">2084</td><td align="right">614</td><td align="center">🟢</td><td></td></tr>
@@ -110,7 +110,7 @@
<tr><td><a href="sites/neo.io">neo.io</a></td><td align="right">337</td><td align="right">230</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/nhkworldpremium.com">nhkworldpremium.com</a></td><td align="right">2</td><td align="right">2</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/nhl.com">nhl.com</a></td><td align="right">1</td><td align="right">1</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/nostv.pt">nostv.pt</a></td><td align="right">169</td><td align="right">152</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/nostv.pt">nostv.pt</a></td><td align="right">167</td><td align="right">151</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/novacyprus.com">novacyprus.com</a></td><td align="right">29</td><td align="right">24</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/novasports.gr">novasports.gr</a></td><td align="right">16</td><td align="right">16</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/nowplayer.now.com">nowplayer.now.com</a></td><td align="right">288</td><td align="right">227</td><td align="center">🟢</td><td></td></tr>
@@ -146,7 +146,7 @@
<tr><td><a href="sites/ruv.is">ruv.is</a></td><td align="right">2</td><td align="right">2</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/s.mxtv.jp">s.mxtv.jp</a></td><td align="right">2</td><td align="right">2</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/sat.tv">sat.tv</a></td><td align="right">30308</td><td align="right">249</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/shahid.mbc.net">shahid.mbc.net</a></td><td align="right">206</td><td align="right">167</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/shahid.mbc.net">shahid.mbc.net</a></td><td align="right">207</td><td align="right">168</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/siba.com.co">siba.com.co</a></td><td align="right">98</td><td align="right">95</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/singtel.com">singtel.com</a></td><td align="right">155</td><td align="right">113</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/sjonvarp.is">sjonvarp.is</a></td><td align="right">13</td><td align="right">13</td><td align="center">🟢</td><td></td></tr>
@@ -188,11 +188,11 @@
<tr><td><a href="sites/tv.movistar.com.pe">tv.movistar.com.pe</a></td><td align="right">282</td><td align="right">39</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/tv.nu">tv.nu</a></td><td align="right">199</td><td align="right">180</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/tv.post.lu">tv.post.lu</a></td><td align="right">332</td><td align="right">241</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/tv.sfr.fr">tv.sfr.fr</a></td><td align="right">489</td><td align="right">438</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/tv.sfr.fr">tv.sfr.fr</a></td><td align="right">489</td><td align="right">438</td><td align="center">🟢</td><td>https://github.com/iptv-org/epg/issues/2998</td></tr>
<tr><td><a href="sites/tv.trueid.net">tv.trueid.net</a></td><td align="right">246</td><td align="right">35</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/tv.yandex.ru">tv.yandex.ru</a></td><td align="right">97</td><td align="right">66</td><td align="center">🔴</td><td>https://github.com/iptv-org/epg/issues/2803</td></tr>
<tr><td><a href="sites/tv24.co.uk">tv24.co.uk</a></td><td align="right">1072</td><td align="right">38</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/tv24.se">tv24.se</a></td><td align="right">326</td><td align="right">157</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/tv24.se">tv24.se</a></td><td align="right">326</td><td align="right">157</td><td align="center">🟢</td><td>https://github.com/iptv-org/epg/issues/2993</td></tr>
<tr><td><a href="sites/tv2go.t-2.net">tv2go.t-2.net</a></td><td align="right">342</td><td align="right">232</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/tvarenasport.com">tvarenasport.com</a></td><td align="right">18</td><td align="right">18</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/tvarenasport.hr">tvarenasport.hr</a></td><td align="right">10</td><td align="right">10</td><td align="center">🟢</td><td></td></tr>
@@ -212,16 +212,17 @@
<tr><td><a href="sites/tvmusor.hu">tvmusor.hu</a></td><td align="right">99</td><td align="right">66</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/tvmustra.hu">tvmustra.hu</a></td><td align="right">189</td><td align="right">0</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/tvpassport.com">tvpassport.com</a></td><td align="right">19287</td><td align="right">2496</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/tvplus.com.tr">tvplus.com.tr</a></td><td align="right">150</td><td align="right">144</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/tvplus.com.tr">tvplus.com.tr</a></td><td align="right">150</td><td align="right">144</td><td align="center">🟢</td><td>https://github.com/iptv-org/epg/issues/2983</td></tr>
<tr><td><a href="sites/tvprofil.com">tvprofil.com</a></td><td align="right">9091</td><td align="right">408</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/tvtv.us">tvtv.us</a></td><td align="right">2299</td><td align="right">2230</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/v3.myafn.dodmedia.osd.mil">v3.myafn.dodmedia.osd.mil</a></td><td align="right">8</td><td align="right">8</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/vantagetv.ee">vantagetv.ee</a></td><td align="right">3</td><td align="right">1</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/vidio.com">vidio.com</a></td><td align="right">57</td><td align="right">52</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/virginmediatelevision.ie">virginmediatelevision.ie</a></td><td align="right">5</td><td align="right">5</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/virgintvgo.virginmedia.com">virgintvgo.virginmedia.com</a></td><td align="right">238</td><td align="right">181</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/visionplus.id">visionplus.id</a></td><td align="right">250</td><td align="right">224</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/vivoplay.com.br">vivoplay.com.br</a></td><td align="right">397</td><td align="right">0</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/vodafone.pt">vodafone.pt</a></td><td align="right">147</td><td align="right">135</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/vodafone.pt">vodafone.pt</a></td><td align="right">146</td><td align="right">135</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/vtm.be">vtm.be</a></td><td align="right">7</td><td align="right">6</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/walesi.com.fj">walesi.com.fj</a></td><td align="right">9</td><td align="right">8</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/watch.sportsnet.ca">watch.sportsnet.ca</a></td><td align="right">8</td><td align="right">8</td><td align="center">🟢</td><td></td></tr>
@@ -229,7 +230,7 @@
<tr><td><a href="sites/wavve.com">wavve.com</a></td><td align="right">77</td><td align="right">76</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/web.magentatv.de">web.magentatv.de</a></td><td align="right">348</td><td align="right">226</td><td align="center">🟢</td><td>https://github.com/iptv-org/epg/issues/2966</td></tr>
<tr><td><a href="sites/webtv.delta.nl">webtv.delta.nl</a></td><td align="right">247</td><td align="right">204</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/winplay.co">winplay.co</a></td><td align="right">2</td><td align="right">2</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/winplay.co">winplay.co</a></td><td align="right">2</td><td align="right">2</td><td align="center">🟢</td><td>https://github.com/iptv-org/epg/issues/3003</td></tr>
<tr><td><a href="sites/worldfishingnetwork.com">worldfishingnetwork.com</a></td><td align="right">1</td><td align="right">1</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/www3.nhk.or.jp">www3.nhk.or.jp</a></td><td align="right">1</td><td align="right">1</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/xem.kplus.vn">xem.kplus.vn</a></td><td align="right">77</td><td align="right">0</td><td align="center">🟢</td><td></td></tr>
@@ -237,7 +238,7 @@
<tr><td><a href="sites/yes.co.il">yes.co.il</a></td><td align="right">174</td><td align="right">0</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/zap.co.ao">zap.co.ao</a></td><td align="right">114</td><td align="right">63</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/zap2it.com">zap2it.com</a></td><td align="right">595</td><td align="right">0</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/ziggogo.tv">ziggogo.tv</a></td><td align="right">156</td><td align="right">150</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/ziggogo.tv">ziggogo.tv</a></td><td align="right">156</td><td align="right">150</td><td align="center">🟢</td><td>https://github.com/iptv-org/epg/issues/2977, https://github.com/iptv-org/epg/issues/2976</td></tr>
<tr><td><a href="sites/znbc.co.zm">znbc.co.zm</a></td><td align="right">4</td><td align="right">4</td><td align="center">🟢</td><td></td></tr>
<tr><td><a href="sites/zuragt.mn">zuragt.mn</a></td><td align="right">34</td><td align="right">27</td><td align="center">🟢</td><td></td></tr>
</tbody>

View File

@@ -1,14 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<channels>
<channel site="freeview.co.uk" site_id="64257#4164" lang="en" xmltv_id="BBCOne.uk@London">BBC ONE Lon</channel>
<channel site="freeview.co.uk" site_id="64257#4287" lang="en" xmltv_id="BBCTwo.uk@England">BBC TWO</channel>
<channel site="freeview.co.uk" site_id="64257#4288" lang="en" xmltv_id="BBCThree.uk@SD">BBC THREE</channel>
<channel site="freeview.co.uk" site_id="64257#4352" lang="en" xmltv_id="BBCNews.uk@Africa">BBC NEWS</channel>
<channel site="freeview.co.uk" site_id="64257#4416" lang="en" xmltv_id="">BBC Red Button</channel>
<channel site="freeview.co.uk" site_id="64257#4544" lang="en" xmltv_id="BBCFour.uk@UK">BBC FOUR</channel>
<channel site="freeview.co.uk" site_id="64257#4608" lang="en" xmltv_id="CBBC.uk@SD">CBBC</channel>
<channel site="freeview.co.uk" site_id="64257#4672" lang="en" xmltv_id="CBeebies.uk@SD">CBeebies</channel>
<channel site="freeview.co.uk" site_id="64257#4736" lang="en" xmltv_id="BBCParliament.uk@SD">BBC Parliament</channel>
<channel site="freeview.co.uk" site_id="64257#5632" lang="en" xmltv_id="">BBC R5L</channel>
<channel site="freeview.co.uk" site_id="64257#5696" lang="en" xmltv_id="">BBC 5SX</channel>
<channel site="freeview.co.uk" site_id="64257#5760" lang="en" xmltv_id="">BBC 6 Music</channel>
@@ -25,146 +17,153 @@
<channel site="freeview.co.uk" site_id="64257#6784" lang="en" xmltv_id="">BBC Radio 2</channel>
<channel site="freeview.co.uk" site_id="64257#6848" lang="en" xmltv_id="">BBC Radio 3</channel>
<channel site="freeview.co.uk" site_id="64257#6912" lang="en" xmltv_id="">BBC Radio 4</channel>
<channel site="freeview.co.uk" site_id="64257#7168" lang="en" xmltv_id="BBCRedButton1.uk@SD">BBC RB 1</channel>
<channel site="freeview.co.uk" site_id="64257#8261" lang="en" xmltv_id="ITV1.uk@London">ITV1</channel>
<channel site="freeview.co.uk" site_id="64257#8294" lang="en" xmltv_id="ITV3.uk@SD">ITV3</channel>
<channel site="freeview.co.uk" site_id="64257#8325" lang="en" xmltv_id="ITV2.uk@SD">ITV2</channel>
<channel site="freeview.co.uk" site_id="64257#8330" lang="en" xmltv_id="ITV4.uk@SD">ITV4</channel>
<channel site="freeview.co.uk" site_id="64257#8340" lang="en" xmltv_id="ITVBe.uk@SD">ITV Quiz</channel>
<channel site="freeview.co.uk" site_id="64257#8361" lang="en" xmltv_id="">ITV1+1</channel>
<channel site="freeview.co.uk" site_id="64257#8384" lang="en" xmltv_id="Channel4.uk@UK">Channel 4</channel>
<channel site="freeview.co.uk" site_id="64257#8385" lang="en" xmltv_id="Film4.uk@SD">Film4</channel>
<channel site="freeview.co.uk" site_id="64257#8442" lang="en" xmltv_id="More4.uk@SD">More 4</channel>
<channel site="freeview.co.uk" site_id="64257#8448" lang="en" xmltv_id="E4.uk@SD">E4</channel>
<channel site="freeview.co.uk" site_id="64257#8452" lang="en" xmltv_id="">Channel 4+1</channel>
<channel site="freeview.co.uk" site_id="64257#8458" lang="en" xmltv_id="E4.uk@Plus1">E4+1</channel>
<channel site="freeview.co.uk" site_id="64257#8460" lang="en" xmltv_id="4seven.uk@SD">4seven</channel>
<channel site="freeview.co.uk" site_id="64257#8500" lang="en" xmltv_id="Channel5.uk@SD">5</channel>
<channel site="freeview.co.uk" site_id="64257#8700" lang="en" xmltv_id="">That&apos;s TV 3</channel>
<channel site="freeview.co.uk" site_id="64257#12928" lang="en" xmltv_id="5STAR.uk@SD">5STAR</channel>
<channel site="freeview.co.uk" site_id="64257#12952" lang="en" xmltv_id="YAAAS.uk@HD">YAAAS!</channel>
<channel site="freeview.co.uk" site_id="64257#12992" lang="en" xmltv_id="5USA.uk@SD">5USA</channel>
<channel site="freeview.co.uk" site_id="64257#13008" lang="en" xmltv_id="UDaveJaVu.uk@SD">U&amp;DaveJaVu</channel>
<channel site="freeview.co.uk" site_id="64257#13024" lang="en" xmltv_id="Channel5.uk@Plus1">5 +1</channel>
<channel site="freeview.co.uk" site_id="64257#13120" lang="en" xmltv_id="QVC.uk@SD">QVC</channel>
<channel site="freeview.co.uk" site_id="64257#13144" lang="en" xmltv_id="MBC.uk@HD">MBC</channel>
<channel site="freeview.co.uk" site_id="64257#14384" lang="en" xmltv_id="Blaze.uk@SD">Blaze</channel>
<channel site="freeview.co.uk" site_id="64257#14388" lang="en" xmltv_id="Blaze.uk@Plus1">Blaze+1</channel>
<channel site="freeview.co.uk" site_id="64257#14416" lang="en" xmltv_id="QVC2.uk@SD">QVC2</channel>
<channel site="freeview.co.uk" site_id="64257#14448" lang="en" xmltv_id="TrueCrime.uk@SD">TRUE CRIME</channel>
<channel site="freeview.co.uk" site_id="64257#14456" lang="en" xmltv_id="TrueCrimeXtra.uk@SD">TRUE CRIME XTRA</channel>
<channel site="freeview.co.uk" site_id="64257#14464" lang="en" xmltv_id="WildEarth.uk@SD">WildEarth</channel>
<channel site="freeview.co.uk" site_id="64257#14480" lang="en" xmltv_id="Legend.uk@SD">LEGEND</channel>
<channel site="freeview.co.uk" site_id="64257#15016" lang="en" xmltv_id="">Sonlife</channel>
<channel site="freeview.co.uk" site_id="64257#15064" lang="en" xmltv_id="">On Demand 365</channel>
<channel site="freeview.co.uk" site_id="64257#15448" lang="en" xmltv_id="">Channelbox</channel>
<channel site="freeview.co.uk" site_id="64257#15480" lang="en" xmltv_id="">UK RADIO PORTAL</channel>
<channel site="freeview.co.uk" site_id="64257#15576" lang="en" xmltv_id="GREATaction.uk@SD">Great! Action</channel>
<channel site="freeview.co.uk" site_id="64257#15584" lang="en" xmltv_id="GREATmystery.uk@SD">Great! Movies</channel>
<channel site="freeview.co.uk" site_id="64257#15592" lang="en" xmltv_id="TJC.uk@SD">TJC</channel>
<channel site="freeview.co.uk" site_id="64257#15864" lang="en" xmltv_id="">That&apos;s Oldies</channel>
<channel site="freeview.co.uk" site_id="64257#15920" lang="en" xmltv_id="ITV4.uk@Plus1">ITV4+1</channel>
<channel site="freeview.co.uk" site_id="64257#15952" lang="en" xmltv_id="ITV2.uk@Plus1">ITV2+1</channel>
<channel site="freeview.co.uk" site_id="64257#16016" lang="en" xmltv_id="ITV3.uk@Plus1">ITV3+1</channel>
<channel site="freeview.co.uk" site_id="64257#16112" lang="en" xmltv_id="5Action.uk@SD">5ACTION</channel>
<channel site="freeview.co.uk" site_id="64257#16164" lang="en" xmltv_id="">CNA Originals</channel>
<channel site="freeview.co.uk" site_id="64257#16170" lang="en" xmltv_id="">GIGS</channel>
<channel site="freeview.co.uk" site_id="64257#16180" lang="en" xmltv_id="">EuroNews</channel>
<channel site="freeview.co.uk" site_id="64257#16188" lang="en" xmltv_id="">Trailblazer</channel>
<channel site="freeview.co.uk" site_id="64257#16194" lang="en" xmltv_id="">Odyssey TV</channel>
<channel site="freeview.co.uk" site_id="64257#16200" lang="en" xmltv_id="KetchupTV.us@SD">Ketchup TV</channel>
<channel site="freeview.co.uk" site_id="64257#16208" lang="en" xmltv_id="UDrama.uk@SD">U&amp;Drama</channel>
<channel site="freeview.co.uk" site_id="64257#16216" lang="en" xmltv_id="">Ketchup Too</channel>
<channel site="freeview.co.uk" site_id="64257#16240" lang="en" xmltv_id="">ROK</channel>
<channel site="freeview.co.uk" site_id="64257#16248" lang="en" xmltv_id="RevelationTV.uk@SD">Revelation TV</channel>
<channel site="freeview.co.uk" site_id="64257#16256" lang="en" xmltv_id="GODTV.uk@SD">God TV</channel>
<channel site="freeview.co.uk" site_id="64257#16264" lang="en" xmltv_id="">Nolly Africa</channel>
<channel site="freeview.co.uk" site_id="64257#16270" lang="en" xmltv_id="AlArabyTV.qa@SD">Alaraby Network</channel>
<channel site="freeview.co.uk" site_id="64257#16272" lang="en" xmltv_id="PopMax.uk@SD">POP Max</channel>
<channel site="freeview.co.uk" site_id="64257#16278" lang="en" xmltv_id="AlJazeera.qa@English">Al Jazeera English</channel>
<channel site="freeview.co.uk" site_id="64257#16280" lang="en" xmltv_id="TinyPop.uk@SD">Tiny Pop</channel>
<channel site="freeview.co.uk" site_id="64257#16284" lang="en" xmltv_id="AlJazeera.qa@Arabic">Al Jazeera Arabic</channel>
<channel site="freeview.co.uk" site_id="64257#16286" lang="en" xmltv_id="">Global Arabic +</channel>
<channel site="freeview.co.uk" site_id="64257#16322" lang="en" xmltv_id="">NHK WORLD</channel>
<channel site="freeview.co.uk" site_id="64257#16328" lang="en" xmltv_id="">Newsmax</channel>
<channel site="freeview.co.uk" site_id="64257#16346" lang="en" xmltv_id="">Amazing Facts</channel>
<channel site="freeview.co.uk" site_id="64257#16360" lang="en" xmltv_id="">New Media TV</channel>
<channel site="freeview.co.uk" site_id="64257#16364" lang="en" xmltv_id="TogetherTV.uk@SD">Together TV</channel>
<channel site="freeview.co.uk" site_id="64257#16370" lang="en" xmltv_id="France24.fr@English">FRANCE 24</channel>
<channel site="freeview.co.uk" site_id="64257#16376" lang="en" xmltv_id="">Nosey</channel>
<channel site="freeview.co.uk" site_id="64257#16394" lang="en" xmltv_id="">Shop On TV</channel>
<channel site="freeview.co.uk" site_id="64257#16400" lang="en" xmltv_id="">Purpose Media</channel>
<channel site="freeview.co.uk" site_id="64257#16406" lang="en" xmltv_id="TalkTV.uk@SD">Talk</channel>
<channel site="freeview.co.uk" site_id="64257#17472" lang="en" xmltv_id="BBCTwo.uk@HD">BBC TWO HD</channel>
<channel site="freeview.co.uk" site_id="64257#17536" lang="en" xmltv_id="BBCOne.uk@LondonHD">BBC ONE Lon HD</channel>
<channel site="freeview.co.uk" site_id="64257#17604" lang="en" xmltv_id="">ITV1 HD</channel>
<channel site="freeview.co.uk" site_id="64257#17664" lang="en" xmltv_id="">Channel 4 HD</channel>
<channel site="freeview.co.uk" site_id="64257#17728" lang="en" xmltv_id="Channel5.uk@HD">5 HD</channel>
<channel site="freeview.co.uk" site_id="64257#17920" lang="en" xmltv_id="BBCThree.uk@HD">BBC THREE HD</channel>
<channel site="freeview.co.uk" site_id="64257#18048" lang="en" xmltv_id="">BBC FOUR HD</channel>
<channel site="freeview.co.uk" site_id="64257#18112" lang="en" xmltv_id="CBBC.uk@HD">CBBC HD</channel>
<channel site="freeview.co.uk" site_id="64257#18176" lang="en" xmltv_id="CBeebies.uk@HD">CBeebies HD</channel>
<channel site="freeview.co.uk" site_id="64257#19968" lang="en" xmltv_id="UEden.uk@SD">U&amp;Eden</channel>
<channel site="freeview.co.uk" site_id="64257#20032" lang="en" xmltv_id="">LEGEND XTRA</channel>
<channel site="freeview.co.uk" site_id="64257#20160" lang="en" xmltv_id="TBNUK.uk@SD">TBN UK</channel>
<channel site="freeview.co.uk" site_id="64257#20256" lang="en" xmltv_id="5SELECT.uk@SD">5SELECT</channel>
<channel site="freeview.co.uk" site_id="64257#22080" lang="en" xmltv_id="SkyNews.uk@SD">Sky News</channel>
<channel site="freeview.co.uk" site_id="64257#22144" lang="en" xmltv_id="SkyArts.uk@SD">Sky Arts</channel>
<channel site="freeview.co.uk" site_id="64257#22208" lang="en" xmltv_id="SkyMix.uk@SD">Sky Mix</channel>
<channel site="freeview.co.uk" site_id="64257#22226" lang="en" xmltv_id="Challenge.uk@SD">Challenge</channel>
<channel site="freeview.co.uk" site_id="64257#22272" lang="en" xmltv_id="UDave.uk@SD">U&amp;Dave</channel>
<channel site="freeview.co.uk" site_id="64257#22336" lang="en" xmltv_id="UDrama.uk@Plus1">U&amp;Drama+1</channel>
<channel site="freeview.co.uk" site_id="64257#22368" lang="en" xmltv_id="E4Extra.uk@SD">E4 Extra</channel>
<channel site="freeview.co.uk" site_id="64257#22464" lang="en" xmltv_id="Film4.uk@Plus1">Film4+1</channel>
<channel site="freeview.co.uk" site_id="64257#22592" lang="en" xmltv_id="talkSPORT.uk@SD">talkSPORT</channel>
<channel site="freeview.co.uk" site_id="64257#22624" lang="en" xmltv_id="">RNIB Connect</channel>
<channel site="freeview.co.uk" site_id="64257#22656" lang="en" xmltv_id="">Heart</channel>
<channel site="freeview.co.uk" site_id="64257#22688" lang="en" xmltv_id="">Capital</channel>
<channel site="freeview.co.uk" site_id="64257#22848" lang="en" xmltv_id="">Classic FM</channel>
<channel site="freeview.co.uk" site_id="64257#22880" lang="en" xmltv_id="">LBC</channel>
<channel site="freeview.co.uk" site_id="64257#23040" lang="en" xmltv_id="FoodNetwork.uk@SD">Food Network</channel>
<channel site="freeview.co.uk" site_id="64257#23152" lang="en" xmltv_id="">That&apos;s TV 2</channel>
<channel site="freeview.co.uk" site_id="64257#23184" lang="en" xmltv_id="">SonLife</channel>
<channel site="freeview.co.uk" site_id="64257#23680" lang="en" xmltv_id="">Must Have Ideas</channel>
<channel site="freeview.co.uk" site_id="64257#23712" lang="en" xmltv_id="Really.uk@SD">Really</channel>
<channel site="freeview.co.uk" site_id="64257#23744" lang="en" xmltv_id="QuestRed.uk@SD">Quest Red</channel>
<channel site="freeview.co.uk" site_id="64257#23808" lang="en" xmltv_id="Quest.uk@Plus1">QUEST+1</channel>
<channel site="freeview.co.uk" site_id="64257#24448" lang="en" xmltv_id="GemsTV.uk@SD">Gems TV</channel>
<channel site="freeview.co.uk" site_id="64257#25792" lang="en" xmltv_id="UYesterday.uk@SD">U&amp;Yesterday</channel>
<channel site="freeview.co.uk" site_id="64257#25920" lang="en" xmltv_id="IdealWorldTV.uk@SD">Ideal World</channel>
<channel site="freeview.co.uk" site_id="64257#23904" lang="en" xmltv_id="">That&apos;s 80s</channel>
<channel site="freeview.co.uk" site_id="64257#26368" lang="en" xmltv_id="">Smooth Radio</channel>
<channel site="freeview.co.uk" site_id="64257#27168" lang="en" xmltv_id="GREATtv.uk@SD">Great! TV</channel>
<channel site="freeview.co.uk" site_id="64257#27200" lang="en" xmltv_id="JewelleryMaker.uk@SD">Jewellery Maker</channel>
<channel site="freeview.co.uk" site_id="64257#27232" lang="en" xmltv_id="">Hobbycraft TV</channel>
<channel site="freeview.co.uk" site_id="64257#27296" lang="en" xmltv_id="GREATromance.uk@UK">Great! Christmas</channel>
<channel site="freeview.co.uk" site_id="64257#27328" lang="en" xmltv_id="Quest.uk@SD">QUEST</channel>
<channel site="freeview.co.uk" site_id="64257#27360" lang="en" xmltv_id="GBNews.uk@SD">GB News</channel>
<channel site="freeview.co.uk" site_id="64257#27392" lang="en" xmltv_id="TogetherTV.uk@Plus1">Together TV+1</channel>
<channel site="freeview.co.uk" site_id="64257#27424" lang="en" xmltv_id="PopUp.uk@SD">POP UP</channel>
<channel site="freeview.co.uk" site_id="64257#27680" lang="en" xmltv_id="DMAX.uk@UK">DMAX</channel>
<channel site="freeview.co.uk" site_id="64257#27744" lang="en" xmltv_id="">Rewind TV</channel>
<channel site="freeview.co.uk" site_id="64257#27776" lang="en" xmltv_id="Pop.uk@SD">POP</channel>
<channel site="freeview.co.uk" site_id="64257#27808" lang="en" xmltv_id="">Together TV IP</channel>
<channel site="freeview.co.uk" site_id="64257#27840" lang="en" xmltv_id="HobbyMaker.uk@SD">HobbyMaker</channel>
<channel site="freeview.co.uk" site_id="64257#27872" lang="en" xmltv_id="GREATmovies.uk@UK">Great! Mystery</channel>
<channel site="freeview.co.uk" site_id="64257#27936" lang="en" xmltv_id="ThatsTV.uk@SD">That&apos;s TV (UK)</channel>
<channel site="freeview.co.uk" site_id="64257#27968" lang="en" xmltv_id="PBSAmerica.uk@SD">PBS America</channel>
<channel site="freeview.co.uk" site_id="64257#28000" lang="en" xmltv_id="HGTV.uk@SD">HGTV</channel>
<channel site="freeview.co.uk" site_id="64257#28032" lang="en" xmltv_id="">That&apos;s Melody</channel>
<channel site="freeview.co.uk" site_id="64257#28096" lang="en" xmltv_id="UW.uk@SD">U&amp;W</channel>
<channel site="freeview.co.uk" site_id="64257#28160" lang="en" xmltv_id="">Premier Radio</channel>
<channel site="freeview.co.uk" site_id="64257#28224" lang="en" xmltv_id="TalkingPicturesTV.uk@SD">TalkingPictures TV</channel>
<channel site="freeview.co.uk" site_id="64257#28352" lang="en" xmltv_id="">Great! Player</channel>
<channel site="freeview.co.uk" site_id="64257#28384" lang="en" xmltv_id="">GREAT! romance mix</channel>
<channel site="freeview.co.uk" site_id="64257#32842" lang="en" xmltv_id="LondonLive.uk@SD">London TV</channel>
<channel site="freeview.co.uk" site_id="64257#33088" lang="en" xmltv_id="">3ABN</channel>
<channel site="freeview.co.uk" site_id="64257#28384" lang="en" xmltv_id="">Great! Romance Mix</channel>
<channel site="freeview.co.uk" site_id="64257#33280" lang="en" xmltv_id="">India Today</channel>
<channel site="freeview.co.uk" site_id="64257#33664" lang="en" xmltv_id="">TRACE UK</channel>
<channel site="freeview.co.uk" site_id="64257#33856" lang="en" xmltv_id="">Pop Player</channel>
<channel site="freeview.co.uk" site_id="64257#33664" lang="en" xmltv_id="">MBC Group</channel>
<channel site="freeview.co.uk" site_id="64257#33920" lang="en" xmltv_id="">wedotv movies</channel>
<channel site="freeview.co.uk" site_id="64257#33984" lang="en" xmltv_id="">It Is Written TV</channel>
<channel site="freeview.co.uk" site_id="64257#34048" lang="en" xmltv_id="">OUTflix Proud</channel>
<channel site="freeview.co.uk" site_id="64257#34176" lang="en" xmltv_id="">High Street TV</channel>
<channel site="freeview.co.uk" site_id="64257#34432" lang="en" xmltv_id="">Cartoon Classics</channel>
<channel site="freeview.co.uk" site_id="64257#34496" lang="en" xmltv_id="">wedotv Movies UK</channel>
<channel site="freeview.co.uk" site_id="64257#34560" lang="en" xmltv_id="">Nolly Africa</channel>
<channel site="freeview.co.uk" site_id="64257#8460" lang="en" xmltv_id="4seven.uk@SD">4seven</channel>
<channel site="freeview.co.uk" site_id="64257#16112" lang="en" xmltv_id="5Action.uk@SD">5ACTION</channel>
<channel site="freeview.co.uk" site_id="64257#20256" lang="en" xmltv_id="5SELECT.uk@SD">5SELECT</channel>
<channel site="freeview.co.uk" site_id="64257#12928" lang="en" xmltv_id="5STAR.uk@SD">5STAR</channel>
<channel site="freeview.co.uk" site_id="64257#12992" lang="en" xmltv_id="5USA.uk@SD">5USA</channel>
<channel site="freeview.co.uk" site_id="64257#34240" lang="en" xmltv_id="Alarabiya.ae@SD">AL ARABIYA</channel>
<channel site="freeview.co.uk" site_id="64257#16270" lang="en" xmltv_id="AlArabyTV.qa@SD">Alaraby Network</channel>
<channel site="freeview.co.uk" site_id="64257#16284" lang="en" xmltv_id="AlJazeera.qa@Arabic">Al Jazeera Arabic</channel>
<channel site="freeview.co.uk" site_id="64257#16278" lang="en" xmltv_id="AlJazeera.qa@English">Al Jazeera English</channel>
<channel site="freeview.co.uk" site_id="64257#34304" lang="en" xmltv_id="AsharqNews.sa@SD">ASHARQ NEWS</channel>
<channel site="freeview.co.uk" site_id="64257#18048" lang="en" xmltv_id="BBCFour.uk@HD">BBC FOUR HD</channel>
<channel site="freeview.co.uk" site_id="64257#4544" lang="en" xmltv_id="BBCFour.uk@UK">BBC FOUR</channel>
<channel site="freeview.co.uk" site_id="64257#4352" lang="en" xmltv_id="BBCNews.uk">BBC NEWS</channel>
<channel site="freeview.co.uk" site_id="64257#4164" lang="en" xmltv_id="BBCOne.uk@London">BBC ONE Lon</channel>
<channel site="freeview.co.uk" site_id="64257#17536" lang="en" xmltv_id="BBCOne.uk@LondonHD">BBC ONE Lon HD</channel>
<channel site="freeview.co.uk" site_id="64257#4736" lang="en" xmltv_id="BBCParliament.uk@SD">BBC Parliament</channel>
<channel site="freeview.co.uk" site_id="64257#7168" lang="en" xmltv_id="BBCRedButton1.uk@SD">BBC RB 1</channel>
<channel site="freeview.co.uk" site_id="64257#17920" lang="en" xmltv_id="BBCThree.uk@HD">BBC THREE HD</channel>
<channel site="freeview.co.uk" site_id="64257#4288" lang="en" xmltv_id="BBCThree.uk@SD">BBC THREE</channel>
<channel site="freeview.co.uk" site_id="64257#4287" lang="en" xmltv_id="BBCTwo.uk@England">BBC TWO</channel>
<channel site="freeview.co.uk" site_id="64257#17472" lang="en" xmltv_id="BBCTwo.uk@HD">BBC TWO HD</channel>
<channel site="freeview.co.uk" site_id="64257#14388" lang="en" xmltv_id="Blaze.uk@Plus1">Blaze+1</channel>
<channel site="freeview.co.uk" site_id="64257#14384" lang="en" xmltv_id="Blaze.uk@SD">Blaze</channel>
<channel site="freeview.co.uk" site_id="64257#18112" lang="en" xmltv_id="CBBC.uk@HD">CBBC HD</channel>
<channel site="freeview.co.uk" site_id="64257#4608" lang="en" xmltv_id="CBBC.uk@SD">CBBC</channel>
<channel site="freeview.co.uk" site_id="64257#18176" lang="en" xmltv_id="CBeebies.uk@HD">CBeebies HD</channel>
<channel site="freeview.co.uk" site_id="64257#4672" lang="en" xmltv_id="CBeebies.uk@SD">CBeebies</channel>
<channel site="freeview.co.uk" site_id="64257#22226" lang="en" xmltv_id="Challenge.uk@SD">Challenge</channel>
<channel site="freeview.co.uk" site_id="64257#17664" lang="en" xmltv_id="Channel4.uk@HD">Channel 4 HD</channel>
<channel site="freeview.co.uk" site_id="64257#8452" lang="en" xmltv_id="Channel4.uk@Plus1">Channel 4+1</channel>
<channel site="freeview.co.uk" site_id="64257#8384" lang="en" xmltv_id="Channel4.uk@UK">Channel 4</channel>
<channel site="freeview.co.uk" site_id="64257#17728" lang="en" xmltv_id="Channel5.uk@HD">5 HD</channel>
<channel site="freeview.co.uk" site_id="64257#13024" lang="en" xmltv_id="Channel5.uk@Plus1">5 +1</channel>
<channel site="freeview.co.uk" site_id="64257#8500" lang="en" xmltv_id="Channel5.uk@SD">5</channel>
<channel site="freeview.co.uk" site_id="64257#27680" lang="en" xmltv_id="DMAX.uk@UK">DMAX</channel>
<channel site="freeview.co.uk" site_id="64257#8458" lang="en" xmltv_id="E4.uk@Plus1">E4+1</channel>
<channel site="freeview.co.uk" site_id="64257#8448" lang="en" xmltv_id="E4.uk@SD">E4</channel>
<channel site="freeview.co.uk" site_id="64257#22368" lang="en" xmltv_id="E4Extra.uk@SD">E4 Extra</channel>
<channel site="freeview.co.uk" site_id="64257#22464" lang="en" xmltv_id="Film4.uk@Plus1">Film4+1</channel>
<channel site="freeview.co.uk" site_id="64257#8385" lang="en" xmltv_id="Film4.uk@SD">Film4</channel>
<channel site="freeview.co.uk" site_id="64257#23040" lang="en" xmltv_id="FoodNetwork.uk@SD">Food Network</channel>
<channel site="freeview.co.uk" site_id="64257#16370" lang="en" xmltv_id="France24.fr@English">FRANCE 24</channel>
<channel site="freeview.co.uk" site_id="64257#27360" lang="en" xmltv_id="GBNews.uk@SD">GB News</channel>
<channel site="freeview.co.uk" site_id="64257#24448" lang="en" xmltv_id="GemsTV.uk@SD">Gemporia</channel>
<channel site="freeview.co.uk" site_id="64257#16256" lang="en" xmltv_id="GODTV.uk@SD">God TV</channel>
<channel site="freeview.co.uk" site_id="64257#15576" lang="en" xmltv_id="GREATaction.uk@SD">Great! Action</channel>
<channel site="freeview.co.uk" site_id="64257#27872" lang="en" xmltv_id="GREATmovies.uk@UK">Great! Mystery</channel>
<channel site="freeview.co.uk" site_id="64257#15584" lang="en" xmltv_id="GREATmystery.uk@SD">Great! Movies</channel>
<channel site="freeview.co.uk" site_id="64257#27296" lang="en" xmltv_id="GREATromance.uk@UK">Great! Romance</channel>
<channel site="freeview.co.uk" site_id="64257#27168" lang="en" xmltv_id="GREATtv.uk@SD">Great! TV</channel>
<channel site="freeview.co.uk" site_id="64257#28000" lang="en" xmltv_id="HGTV.uk@SD">HGTV</channel>
<channel site="freeview.co.uk" site_id="64257#27840" lang="en" xmltv_id="HobbyMaker.uk@SD">HobbyMaker</channel>
<channel site="freeview.co.uk" site_id="64257#25920" lang="en" xmltv_id="IdealWorldTV.uk@SD">Ideal World</channel>
<channel site="freeview.co.uk" site_id="64257#17604" lang="en" xmltv_id="ITV1.uk@HD">ITV1 HD</channel>
<channel site="freeview.co.uk" site_id="64257#8261" lang="en" xmltv_id="ITV1.uk@London">ITV1</channel>
<channel site="freeview.co.uk" site_id="64257#8361" lang="en" xmltv_id="ITV1.uk@Plus1">ITV1+1</channel>
<channel site="freeview.co.uk" site_id="64257#15952" lang="en" xmltv_id="ITV2.uk@Plus1">ITV2+1</channel>
<channel site="freeview.co.uk" site_id="64257#8325" lang="en" xmltv_id="ITV2.uk@SD">ITV2</channel>
<channel site="freeview.co.uk" site_id="64257#16016" lang="en" xmltv_id="ITV3.uk@Plus1">ITV3+1</channel>
<channel site="freeview.co.uk" site_id="64257#8294" lang="en" xmltv_id="ITV3.uk@SD">ITV3</channel>
<channel site="freeview.co.uk" site_id="64257#15920" lang="en" xmltv_id="ITV4.uk@Plus1">ITV4+1</channel>
<channel site="freeview.co.uk" site_id="64257#8330" lang="en" xmltv_id="ITV4.uk@SD">ITV4</channel>
<channel site="freeview.co.uk" site_id="64257#8340" lang="en" xmltv_id="ITVBe.uk@SD">ITV Quiz</channel>
<channel site="freeview.co.uk" site_id="64257#27200" lang="en" xmltv_id="JewelleryMaker.uk@SD">Jewellery Maker</channel>
<channel site="freeview.co.uk" site_id="64257#16200" lang="en" xmltv_id="KetchupTV.us@SD">Ketchup TV</channel>
<channel site="freeview.co.uk" site_id="64257#14480" lang="en" xmltv_id="Legend.uk@SD">LEGEND</channel>
<channel site="freeview.co.uk" site_id="64257#32842" lang="en" xmltv_id="LondonLive.uk@SD">London TV</channel>
<channel site="freeview.co.uk" site_id="64257#13144" lang="en" xmltv_id="MBC.uk@HD">MBC</channel>
<channel site="freeview.co.uk" site_id="64257#8442" lang="en" xmltv_id="More4.uk@SD">More 4</channel>
<channel site="freeview.co.uk" site_id="64257#16328" lang="en" xmltv_id="NewsmaxTV.us">Newsmax</channel>
<channel site="freeview.co.uk" site_id="64257#16322" lang="en" xmltv_id="NHKWorldJapan.jp">NHK WORLD</channel>
<channel site="freeview.co.uk" site_id="64257#27968" lang="en" xmltv_id="PBSAmerica.uk@SD">PBS America</channel>
<channel site="freeview.co.uk" site_id="64257#16272" lang="en" xmltv_id="PopMax.uk@SD">POP</channel>
<channel site="freeview.co.uk" site_id="64257#27424" lang="en" xmltv_id="PopUp.uk@SD">POP UP</channel>
<channel site="freeview.co.uk" site_id="64257#23808" lang="en" xmltv_id="Quest.uk@Plus1">QUEST+1</channel>
<channel site="freeview.co.uk" site_id="64257#27328" lang="en" xmltv_id="Quest.uk@SD">QUEST</channel>
<channel site="freeview.co.uk" site_id="64257#23744" lang="en" xmltv_id="QuestRed.uk@SD">Quest Red</channel>
<channel site="freeview.co.uk" site_id="64257#14416" lang="en" xmltv_id="QVC2.uk@SD">QVC2</channel>
<channel site="freeview.co.uk" site_id="64257#13120" lang="en" xmltv_id="QVC.uk@SD">QVC</channel>
<channel site="freeview.co.uk" site_id="64257#23712" lang="en" xmltv_id="Really.uk@SD">Really</channel>
<channel site="freeview.co.uk" site_id="64257#16248" lang="en" xmltv_id="RevelationTV.uk@SD">Revelation TV</channel>
<channel site="freeview.co.uk" site_id="64257#22144" lang="en" xmltv_id="SkyArts.uk@SD">Sky Arts</channel>
<channel site="freeview.co.uk" site_id="64257#22208" lang="en" xmltv_id="SkyMix.uk@SD">Sky Mix</channel>
<channel site="freeview.co.uk" site_id="64257#22080" lang="en" xmltv_id="SkyNews.uk@SD">Sky News</channel>
<channel site="freeview.co.uk" site_id="64257#28224" lang="en" xmltv_id="TalkingPicturesTV.uk@SD">TalkingPictures TV</channel>
<channel site="freeview.co.uk" site_id="64257#22592" lang="en" xmltv_id="talkSPORT.uk@SD">talkSPORT</channel>
<channel site="freeview.co.uk" site_id="64257#16406" lang="en" xmltv_id="TalkTV.uk@SD">Talk</channel>
<channel site="freeview.co.uk" site_id="64257#20160" lang="en" xmltv_id="TBNUK.uk@SD">TBN UK</channel>
<channel site="freeview.co.uk" site_id="64257#27936" lang="en" xmltv_id="ThatsTV.uk@SD">That&apos;s TV (UK)</channel>
<channel site="freeview.co.uk" site_id="64257#16280" lang="en" xmltv_id="TinyPop.uk@SD">Tiny Pop</channel>
<channel site="freeview.co.uk" site_id="64257#15592" lang="en" xmltv_id="TJC.uk@SD">TJC</channel>
<channel site="freeview.co.uk" site_id="64257#27392" lang="en" xmltv_id="TogetherTV.uk@Plus1">Together TV+1</channel>
<channel site="freeview.co.uk" site_id="64257#16364" lang="en" xmltv_id="TogetherTV.uk@SD">Together TV</channel>
<channel site="freeview.co.uk" site_id="64257#14448" lang="en" xmltv_id="TrueCrime.uk@SD">TRUE CRIME</channel>
<channel site="freeview.co.uk" site_id="64257#14456" lang="en" xmltv_id="TrueCrimeXtra.uk@SD">TRUE CRIME XTRA</channel>
<channel site="freeview.co.uk" site_id="64257#22272" lang="en" xmltv_id="UDave.uk@SD">U&amp;Dave</channel>
<channel site="freeview.co.uk" site_id="64257#13008" lang="en" xmltv_id="UDaveJaVu.uk@SD">U&amp;DaveJaVu</channel>
<channel site="freeview.co.uk" site_id="64257#22336" lang="en" xmltv_id="UDrama.uk@Plus1">U&amp;Drama+1</channel>
<channel site="freeview.co.uk" site_id="64257#16208" lang="en" xmltv_id="UDrama.uk@SD">U&amp;Drama</channel>
<channel site="freeview.co.uk" site_id="64257#19968" lang="en" xmltv_id="UEden.uk@SD">U&amp;Eden</channel>
<channel site="freeview.co.uk" site_id="64257#28096" lang="en" xmltv_id="UW.uk@SD">U&amp;W</channel>
<channel site="freeview.co.uk" site_id="64257#25792" lang="en" xmltv_id="UYesterday.uk@SD">U&amp;Yesterday</channel>
<channel site="freeview.co.uk" site_id="64257#14464" lang="en" xmltv_id="WildEarth.uk@SD">WildEarth</channel>
<channel site="freeview.co.uk" site_id="64257#34368" lang="en" xmltv_id="YAAAS.uk">YAAAS!</channel>
</channels>

File diff suppressed because one or more lines are too long

View File

@@ -48,7 +48,7 @@
<channel site="meo.pt" site_id="CNN" lang="pt" xmltv_id="CNNInternational.us@MENA">CNN</channel>
<channel site="meo.pt" site_id="CNNPT" lang="pt" xmltv_id="CNNPortugal.pt@SD">CNN Portugal</channel>
<channel site="meo.pt" site_id="CNOVA" lang="pt" xmltv_id="TVCancaoNova.pt@SD">Canção Nova</channel>
<channel site="meo.pt" site_id="CONTALA" lang="pt" xmltv_id="">Conta Lá</channel>
<channel site="meo.pt" site_id="CONTALA" lang="pt" xmltv_id="ContaLa.pt@HD">Conta Lá</channel>
<channel site="meo.pt" site_id="CUBAV" lang="pt" xmltv_id="CubavisionInternacional.cu@SD">Cubavision</channel>
<channel site="meo.pt" site_id="DAZN1" lang="pt" xmltv_id="DAZN1.uk@Portugal">DAZN 1</channel>
<channel site="meo.pt" site_id="DAZN2" lang="pt" xmltv_id="DAZN2.uk@Portugal">DAZN 2</channel>
@@ -66,7 +66,6 @@
<channel site="meo.pt" site_id="DORCEL" lang="pt" xmltv_id="">DORCEL TV</channel>
<channel site="meo.pt" site_id="DUCKTV" lang="pt" xmltv_id="">Duck TV</channel>
<channel site="meo.pt" site_id="DW-TV" lang="pt" xmltv_id="DW.de@English">DEUTSCHE WELLE</channel>
<channel site="meo.pt" site_id="E! HD" lang="pt" xmltv_id="">E! Entertainment</channel>
<channel site="meo.pt" site_id="ENGLISH" lang="pt" xmltv_id="">English Club TV</channel>
<channel site="meo.pt" site_id="EURHD" lang="pt" xmltv_id="">Eurosport 1</channel>
<channel site="meo.pt" site_id="EURN" lang="pt" xmltv_id="EuronewsPortuguese.fr@SD">Euronews</channel>
@@ -112,9 +111,6 @@
<channel site="meo.pt" site_id="MCMTHD" lang="pt" xmltv_id="MCMTop.fr@SD">MCM Top</channel>
<channel site="meo.pt" site_id="MEZHD" lang="pt" xmltv_id="MezzoLive.fr@SD">Mezzo Live</channel>
<channel site="meo.pt" site_id="MEZZO" lang="pt" xmltv_id="Mezzo.fr@SD">Mezzo</channel>
<channel site="meo.pt" site_id="MTV00S" lang="en" xmltv_id="MTV00s.uk@SD">MTV 00s</channel>
<channel site="meo.pt" site_id="MTVLIVE" lang="en" xmltv_id="MTVLive.uk@SD">MTV Live</channel>
<channel site="meo.pt" site_id="MTVPHD" lang="pt" xmltv_id="MTV.pt@SD">MTV Portugal</channel>
<channel site="meo.pt" site_id="NBATVHD" lang="pt" xmltv_id="NBATV.us@SD">NBA TV</channel>
<channel site="meo.pt" site_id="NEWBR" lang="pt" xmltv_id="">NEW Brasil</channel>
<channel site="meo.pt" site_id="NEWSNOW" lang="pt" xmltv_id="NewsNow.pt@SD">News Now</channel>
@@ -185,8 +181,6 @@
<channel site="meo.pt" site_id="TELESUR" lang="pt" xmltv_id="Telesur.ve@SD">Telesur</channel>
<channel site="meo.pt" site_id="TLC" lang="pt" xmltv_id="TLC.pt@SD">TLC</channel>
<channel site="meo.pt" site_id="TPA" lang="en" xmltv_id="TPAi.ao@SD">TPA Notícias</channel>
<channel site="meo.pt" site_id="TRACEBR" lang="pt" xmltv_id="TraceBrazuca.fr@SD">Trace Brasil</channel>
<channel site="meo.pt" site_id="TRACETC" lang="pt" xmltv_id="TraceToca.fr@SD">Trace Toca</channel>
<channel site="meo.pt" site_id="TRAHD" lang="pt" xmltv_id="TraceUrban.fr@SD">Trace Urban</channel>
<channel site="meo.pt" site_id="TRAXP" lang="pt" xmltv_id="Travelxp.in@SD">Travelxp HD</channel>
<channel site="meo.pt" site_id="TRAXP4K" lang="pt" xmltv_id="">Travelxp 4K HDR</channel>
@@ -217,4 +211,4 @@
<channel site="meo.pt" site_id="ZDFNEO" lang="pt" xmltv_id="ZDFneo.de@SD">ZDFNEO</channel>
<channel site="meo.pt" site_id="ZEECIN" lang="pt" xmltv_id="">ZEE CINEMA</channel>
<channel site="meo.pt" site_id="ZEETV" lang="pt" xmltv_id="ZeeTVUK.uk@SD">ZEE TV</channel>
</channels>
</channels>

View File

@@ -3,65 +3,55 @@ const { DateTime } = require('luxon')
module.exports = {
site: 'meo.pt',
days: 2,
url: 'https://authservice.apps.meo.pt/Services/GridTv/GridTvMng.svc/getProgramsFromChannels',
url: function ({ channel, date }) {
return `https://meogouser.apps.meo.pt/Services/GridTv/GridTv.svc/GetLiveChannelProgramsByDate?callLetter=${channel.site_id}&date=${date.format('YYYY-MM-DD')}&userAgent=IPTV_OFR_GTV`
},
request: {
method: 'POST',
method: 'GET',
headers: {
Origin: 'https://www.meo.pt',
'User-Agent': 'Mozilla/5.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; en-US Trident/4.0)'
},
data: function ({ channel, date }) {
return {
service: 'channelsguide',
channels: [channel.site_id],
dateStart: date.format('YYYY-MM-DDT00:00:00-00:00'),
dateEnd: date.add(1, 'd').format('YYYY-MM-DDT00:00:00-00:00'),
accountID: ''
}
'accept': '*/*',
'accept-language': 'fr-FR,fr;q=0.9,en-US;q=0.8,en;q=0.7,pt;q=0.6,cs;q=0.5',
'cache-control': 'no-cache',
'origin': 'https://www.meo.pt',
'pragma': 'no-cache',
'priority': 'u=1, i',
'referer': 'https://www.meo.pt/',
'sec-ch-ua': '"Not(A:Brand";v="8", "Chromium";v="144", "Google Chrome";v="144"',
'sec-ch-ua-mobile': '?1',
'sec-ch-ua-platform': '"Android"',
'sec-fetch-dest': 'empty',
'sec-fetch-mode': 'cors',
'sec-fetch-site': 'same-site',
'user-agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Mobile Safari/537.36'
}
},
async parser({ content }) {
const axios = require('axios')
async parser({ content, channel }) {
let programs = []
const items = parseItems(content)
if (!items.length) return programs
// simple per-run in-memory cache
const detailsCache = new Map()
for (const item of items) {
const start = parseStart(item)
let stop = parseStop(item)
if (stop < start) {
stop = stop.plus({ days: 1 })
}
let description = ''
let image = ''
const programID = item.uniqueId || null
if (programID) {
let details = detailsCache.get(programID)
if (!details) {
details = await fetchProgramDetails(programID, axios).catch(() => null)
if (details) detailsCache.set(programID, details)
}
if (details) {
description = details.description || description
image = details.image || image
}
}
const start = DateTime.fromISO(item.StartDate, { zone: 'Europe/Lisbon' }).toUTC()
const stop = DateTime.fromISO(item.EndDate, { zone: 'Europe/Lisbon' }).toUTC()
const prog = {
title: item.name || 'Sem título',
title: item.Title || 'Sem título',
start,
stop
}
if (description) prog.description = description
if (image) {
if (item.Synopsis) {
prog.description = item.Synopsis
}
// Construct image URL using the same logic as before if possible
if (item.Title && channel.site_id) {
const encodedTitle = encodeURIComponent(item.Title)
const image = `https://proxycache.online.meo.pt/eemstb/ImageHandler.ashx?evTitle=${encodedTitle}&chCallLetter=${channel.site_id}&profile=16_9&width=600`
prog.icon = { src: image }
prog.image = image
}
programs.push(prog)
}
@@ -70,84 +60,45 @@ module.exports = {
async channels() {
const axios = require('axios')
const data = await axios
.post('https://authservice.apps.meo.pt/Services/GridTv/GridTvMng.svc/getGridAnon', null, {
.get('https://meogouser.apps.meo.pt/Services/GridTv/GridTv.svc/GetContentsForChannels?userAgent=IPTV_OFR_GTV', {
headers: {
Origin: 'https://www.meo.pt',
'User-Agent': 'Mozilla/5.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; en-US Trident/4.0)'
'accept': '*/*',
'accept-language': 'fr-FR,fr;q=0.9,en-US;q=0.8,en;q=0.7,pt;q=0.6,cs;q=0.5',
'cache-control': 'no-cache',
'origin': 'https://www.meo.pt',
'pragma': 'no-cache',
'priority': 'u=1, i',
'referer': 'https://www.meo.pt/',
'sec-ch-ua': '"Not(A:Brand";v="8", "Chromium";v="144", "Google Chrome";v="144"',
'sec-ch-ua-mobile': '?1',
'sec-ch-ua-platform': '"Android"',
'sec-fetch-dest': 'empty',
'sec-fetch-mode': 'cors',
'sec-fetch-site': 'same-site',
'user-agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Mobile Safari/537.36'
}
})
.then(r => r.data)
.catch(console.log)
// channel logo at data.d.channels.logo
return data.d.channels
return data.Result
.map(item => {
return {
lang: 'pt',
site_id: item.sigla,
name: item.name
site_id: item.CallLetter,
name: item.Title
}
})
.filter(channel => channel.site_id)
}
}
function parseStart(item) {
return DateTime.fromFormat(`${item.date} ${item.timeIni}`, 'd-M-yyyy HH:mm', {
zone: 'Europe/Lisbon'
}).toUTC()
}
function parseStop(item) {
return DateTime.fromFormat(`${item.date} ${item.timeEnd}`, 'd-M-yyyy HH:mm', {
zone: 'Europe/Lisbon'
}).toUTC()
}
function parseItems(content) {
if (!content) return []
const data = JSON.parse(content)
const programs = data?.d?.channels?.[0]?.programs
return Array.isArray(programs) ? programs : []
}
async function fetchProgramDetails(programID, axiosInstance) {
try {
const response = await axiosInstance.post(
'https://authservice.apps.meo.pt/Services/GridTv/GridTvMng.svc/getProgramDetails',
{
service: 'programdetail',
programID: String(programID),
accountID: ''
},
{
headers: {
Origin: 'https://www.meo.pt',
'User-Agent': 'Mozilla/5.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; en-US Trident/4.0)'
},
timeout: 10000
}
)
const data = response.data
// Response structure has program data directly in data.d
const program = data?.d
if (!program || typeof program !== 'object') return null
// Build image URL using MEO's image handler
let image = null
if (program.progName && program.channelSigla) {
const encodedTitle = encodeURIComponent(program.progName)
image = `https://proxycache.online.meo.pt/eemstb/ImageHandler.ashx?evTitle=${encodedTitle}&chCallLetter=${program.channelSigla}&profile=16_9&width=600`
}
const description = program.description || null
return { description, image }
const data = typeof content === 'string' ? JSON.parse(content) : content
return Array.isArray(data.Result) ? data.Result : []
} catch {
// Silent fail returning null so parser continues
return null
return []
}
}

View File

@@ -18,37 +18,28 @@ const channel = {
}
it('can generate valid url', () => {
expect(url).toBe(
'https://authservice.apps.meo.pt/Services/GridTv/GridTvMng.svc/getProgramsFromChannels'
expect(url({ channel, date })).toBe(
'https://meogouser.apps.meo.pt/Services/GridTv/GridTv.svc/GetLiveChannelProgramsByDate?callLetter=RTPM&date=2022-12-02&userAgent=IPTV_OFR_GTV'
)
})
it('can generate valid request method', () => {
expect(request.method).toBe('POST')
expect(request.method).toBe('GET')
})
it('can generate valid request headers', () => {
expect(request.headers).toMatchObject({
Origin: 'https://www.meo.pt'
})
})
it('can generate valid request method', () => {
expect(request.data({ channel, date })).toMatchObject({
service: 'channelsguide',
channels: ['RTPM'],
dateStart: '2022-12-02T00:00:00-00:00',
dateEnd: '2022-12-03T00:00:00-00:00',
accountID: ''
'origin': 'https://www.meo.pt',
'user-agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Mobile Safari/537.36'
})
})
it('can parse response', async () => {
const content = fs.readFileSync(path.resolve(__dirname, '__data__/content.json'))
const content = fs.readFileSync(path.resolve(__dirname, '__data__/content.json'), 'utf-8')
axios.post.mockResolvedValue({ data: {} })
axios.get.mockResolvedValue({ data: {} })
let results = await parser({ content })
let results = await parser({ content, channel })
results = results.map(p => {
p.start = p.start.toJSON()
p.stop = p.stop.toJSON()
@@ -56,9 +47,13 @@ it('can parse response', async () => {
})
expect(results[0]).toMatchObject({
start: '2022-12-01T23:35:00.000Z',
stop: '2022-12-02T00:17:00.000Z',
title: 'Walker, O Ranger Do Texas T6 - Ep. 14'
start: '2026-01-22T23:40:00.000Z',
stop: '2026-01-23T00:04:00.000Z',
title: 'Barman - Ep. 4',
description: "'Barman' é uma série de comédia dramática sobre um jovem comediante que começa a trabalhar como Barman porque precisa de arranjar dinheiro depressa, pelo caminho é obrigado a lidar com a vida noturna e conciliar duas realidades diferentes.",
icon: {
src: 'https://proxycache.online.meo.pt/eemstb/ImageHandler.ashx?evTitle=Barman%20-%20Ep.%204&chCallLetter=RTPM&profile=16_9&width=600'
}
})
})

View File

@@ -1,6 +1,11 @@
const axios = require('axios')
const cheerio = require('cheerio')
const dayjs = require('dayjs')
const utc = require('dayjs/plugin/utc')
const timezone = require('dayjs/plugin/timezone')
dayjs.extend(utc)
dayjs.extend(timezone)
module.exports = {
site: 'movistarplus.es',
@@ -8,35 +13,87 @@ module.exports = {
url({ channel, date }) {
return `https://www.movistarplus.es/programacion-tv/${channel.site_id}/${date.format('YYYY-MM-DD')}`
},
async parser({ content }) {
request: {
headers: {
'User-Agent':
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
Accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Accept-Language': 'es-ES,es;q=0.9,en;q=0.8',
Referer: 'https://www.movistarplus.es/programacion-tv'
},
maxRedirects: 5
},
async parser({ content, date }) {
let programs = []
let items = parseItems(content)
if (!items.length) return programs
const $ = cheerio.load(content)
const programElements = $('div[id^="ele-"]').get()
for (let i = 0; i < items.length; i++) {
const el = items[i]
let description = null
const programDivs = $('div[id^="ele-"]').toArray()
if (programElements[i]) {
const programDiv = $(programElements[i])
const programLink = programDiv.find('a').attr('href')
if (programLink) {
const idMatch = programLink.match(/id=(\d+)/)
if (idMatch && idMatch[1]) {
description = await getProgramDescription(programLink).catch(() => null)
for (let i = 0; i < programDivs.length; i++) {
const el = $(programDivs[i])
const title = el.find('li.title').text().trim()
if (!title) continue
const timeText = el.find('li.time').text().trim()
if (!timeText) continue
const [hours, minutes] = timeText.split(':').map(h => parseInt(h, 10))
// Parse time in Spain timezone (Europe/Madrid)
let startDate = dayjs.tz(
`${date.format('YYYY-MM-DD')} ${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}`,
'YYYY-MM-DD HH:mm',
'Europe/Madrid'
)
// If the time is in early morning (before 5 AM), it's the next day
if (hours < 5) {
startDate = startDate.add(1, 'day')
}
// Calculate end time from next program's start time
let endDate
if (i < programDivs.length - 1) {
const nextEl = $(programDivs[i + 1])
const nextTimeText = nextEl.find('li.time').text().trim()
if (nextTimeText) {
const [nextHours, nextMinutes] = nextTimeText.split(':').map(h => parseInt(h, 10))
endDate = dayjs.tz(
`${date.format('YYYY-MM-DD')} ${nextHours.toString().padStart(2, '0')}:${nextMinutes.toString().padStart(2, '0')}`,
'YYYY-MM-DD HH:mm',
'Europe/Madrid'
)
// If the next time is in early morning (before 5 AM), it's the next day
if (nextHours < 5) {
endDate = endDate.add(1, 'day')
}
// If end time is still before or same as start time, add another day
if (endDate.isBefore(startDate) || endDate.isSame(startDate)) {
endDate = endDate.add(1, 'day')
}
}
}
// If no end time, use start of next day
if (!endDate) {
endDate = startDate.add(1, 'day').startOf('day')
}
const programLink = el.find('a').attr('href')
let description = null
if (programLink) {
description = await getProgramDescription(programLink).catch(() => null)
}
programs.push({
title: el.item.name,
description: description,
start: dayjs(el.item.startDate),
stop: dayjs(el.item.endDate)
title,
description,
start: startDate,
stop: endDate
})
}
@@ -44,7 +101,13 @@ module.exports = {
},
async channels() {
const html = await axios
.get('https://www.movistarplus.es/programacion-tv')
.get('https://www.movistarplus.es/programacion-tv', {
headers: {
'User-Agent':
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
Accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'
}
})
.then(r => r.data)
.catch(console.log)
@@ -65,33 +128,17 @@ module.exports = {
}
}
function parseItems(content) {
try {
const $ = cheerio.load(content)
let scheme = $('script:contains("@type": "ItemList")').html()
scheme = JSON.parse(scheme)
if (!scheme || !Array.isArray(scheme.itemListElement)) return []
return scheme.itemListElement
} catch {
return []
}
}
async function getProgramDescription(programUrl) {
try {
const response = await axios.get(programUrl, {
headers: {
'Referer': 'https://www.movistarplus.es/programacion-tv/'
}
})
const response = await axios.get(programUrl, {
headers: {
'User-Agent':
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
Referer: 'https://www.movistarplus.es/programacion-tv/'
}
})
const $ = cheerio.load(response.data)
const description = $('.show-content .text p').first().text().trim() || null
const $ = cheerio.load(response.data)
const description = $('.show-content .text p').first().text().trim() || null
return description
} catch (error) {
console.error(`Error fetching description from ${programUrl}:`, error.message)
return null
}
return description
}

File diff suppressed because one or more lines are too long

View File

@@ -12,7 +12,6 @@
<channel site="nostv.pt" site_id="30" lang="pt" xmltv_id="RecordNews.br@SD">Record News</channel>
<channel site="nostv.pt" site_id="33" lang="pt" xmltv_id="Telesur.ve@SD">TeleSUR</channel>
<channel site="nostv.pt" site_id="34" lang="en" xmltv_id="MCMTop.fr@SD">MCM Top</channel>
<channel site="nostv.pt" site_id="35" lang="pt" xmltv_id="MTV00s.uk@SD">MTV 00s</channel>
<channel site="nostv.pt" site_id="37" lang="fr" xmltv_id="M6.fr@HD">M6</channel>
<channel site="nostv.pt" site_id="39" lang="en" xmltv_id="SkyNewsAustralia.au@SD">Sky News</channel>
<channel site="nostv.pt" site_id="40" lang="de" xmltv_id="RTL.hr@SD">RTL</channel>
@@ -142,7 +141,6 @@
<channel site="nostv.pt" site_id="555" lang="pt" xmltv_id="TVI.pt@SD">TVI HD</channel>
<channel site="nostv.pt" site_id="556" lang="pt" xmltv_id="RTPNoticias.pt@HD">RTP Noticias HD</channel>
<channel site="nostv.pt" site_id="557" lang="pt" xmltv_id="CNNPortugal.pt@SD">CNN Portugal HD</channel>
<channel site="nostv.pt" site_id="560" lang="en" xmltv_id="MTVLive.uk@SD">MTV Live</channel>
<channel site="nostv.pt" site_id="561" lang="pt" xmltv_id="DiscoveryChannel.pt@SD">Discovery HD</channel>
<channel site="nostv.pt" site_id="563" lang="pt" xmltv_id="Eurosport2.fr@France">Eurosport 2 HD</channel>
<channel site="nostv.pt" site_id="565" lang="pt" xmltv_id="Canal11.pt@SD">Canal 11 HD</channel>
@@ -168,5 +166,5 @@
<channel site="nostv.pt" site_id="702" lang="pt" xmltv_id="TimelessDiziChannel.ro@SD">Dizi</channel>
<channel site="nostv.pt" site_id="705" lang="pt" xmltv_id="NewsNow.pt@SD">Now</channel>
<channel site="nostv.pt" site_id="706" lang="pt" xmltv_id="SportTV7.pt@SD">Sport TV 7 HD</channel>
<channel site="nostv.pt" site_id="721" lang="pt" xmltv_id="">Conta Lá</channel>
</channels>
<channel site="nostv.pt" site_id="721" lang="pt" xmltv_id="ContaLa.pt@HD">Conta Lá</channel>
</channels>

View File

@@ -5,24 +5,33 @@ const utc = require('dayjs/plugin/utc')
dayjs.extend(utc)
const headers = {
'X-Apikey': 'xe1dgrShwdR1DVOKGmsj8Ut4QLlGyOFI',
'X-Core-Appversion': '2.20.0.3',
'X-Core-Contentratinglimit': '0',
'X-Core-Deviceid': '',
'X-Core-Devicetype': 'web',
Origin: 'https://nostv.pt',
'User-Agent':
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
'accept': 'application/json, text/plain, */*',
'accept-language': 'fr-FR,fr;q=0.9,en-US;q=0.8,en;q=0.7,pt;q=0.6,cs;q=0.5',
'cache-control': 'no-cache',
'origin': 'https://nostv.pt',
'pragma': 'no-cache',
'priority': 'u=1, i',
'referer': 'https://nostv.pt/',
'sec-ch-ua': '"Not(A:Brand";v="8", "Chromium";v="144", "Google Chrome";v="144"',
'sec-ch-ua-mobile': '?1',
'sec-ch-ua-platform': '"Android"',
'sec-fetch-dest': 'empty',
'sec-fetch-mode': 'cors',
'sec-fetch-site': 'cross-site',
'user-agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Mobile Safari/537.36',
'x-apikey': 'xe1dgrShwdR1DVOKGmsj8Ut4QLlGyOFI',
'x-core-appversion': '2.20.2.2',
'x-core-contentratinglimit': '0',
'x-core-deviceid': '',
'x-core-devicetype': 'web',
'x-core-timezoneoffset': '3600000'
}
module.exports = {
site: 'nostv.pt',
days: 2,
url({ channel, date }) {
return `https://api.clg.nos.pt/nostv/ott/schedule/range/contents/guest?channels=${channel.site_id
}&minDate=${date.format('YYYY-MM-DD')}T00:00:00Z&maxDate=${date.format(
'YYYY-MM-DD'
)}T23:59:59Z&isDateInclusive=true&client_id=${headers['X-Apikey']}`
return `https://api.clg.nos.pt/nostv/ott/schedule/range/contents/guest?channels=${channel.site_id}&minDate=${date.format('YYYY-MM-DD')}T00:00:00Z&maxDate=${date.format('YYYY-MM-DD')}T23:59:59Z&isDateInclusive=true&client_id=${headers['x-apikey']}`
},
request: { headers },
parser({ content }) {
@@ -31,7 +40,7 @@ module.exports = {
const items = Array.isArray(content) ? content : JSON.parse(content)
items.forEach(item => {
const image = item.Images
? `https://mage.stream.nos.pt/mage/v1/Images?sourceUri=${item.Images[0].Url}&profile=ott_1_452x340&client_id=${headers['X-Apikey']}`
? `https://mage.stream.nos.pt/mage/v1/Images?sourceUri=${item.Images[0].Url}&profile=ott_1_452x340&client_id=${headers['x-apikey']}`
: null
programs.push({
title: item.Metadata?.Title,
@@ -54,7 +63,7 @@ module.exports = {
async channels() {
const result = await axios
.get(
`https://api.clg.nos.pt/nostv/ott/channels/guest?client_id=${headers['X-Apikey']}`,
`https://api.clg.nos.pt/nostv/ott/channels/guest?client_id=${headers['x-apikey']}`,
{ headers }
)
.then(r => r.data)

View File

@@ -28,20 +28,17 @@ it('can parse response', () => {
return p
})
const image = 'https://mage.stream.nos.pt/mage/v1/Images?sourceUri=http://vip.pam.local.internal/PAM.Images/Store/8329ed1aec5d4c0faa2056972256ff9f&profile=ott_1_452x340&client_id=xe1dgrShwdR1DVOKGmsj8Ut4QLlGyOFI'
expect(results[0]).toMatchObject({
start: '2023-12-11T16:30:00.000Z',
stop: '2023-12-11T17:00:00.000Z',
title: 'Village Vets',
description:
'A história de dois melhores amigos veterinários e o seu extraordinário trabalho na Austrália.',
season: 1,
episode: 12,
start: '2026-01-23T22:39:00.000Z',
stop: '2026-01-24T00:23:00.000Z',
title: 'Em Casa d\'Amália',
description: 'Que mais poderíamos pedir para o regresso deste programa, do que receber um dos poetas de Amália? Manuel Alegre, autor do icónico "Trova do Vento que Passa", estará connosco. A este raro momento, juntam-se também ilustres convidados: Paulo de Carvalho e o seu filho Agir, Rita Guerra e André Amaro...',
season: 9,
episode: 15,
icon: {
src: image
src: 'https://mage.stream.nos.pt/mage/v1/Images?sourceUri=http://vip.pam.local.internal/PAM.Images/Store/901d96a8f1534749b076212c296d821e&profile=ott_1_452x340&client_id=xe1dgrShwdR1DVOKGmsj8Ut4QLlGyOFI'
},
image
image: 'https://mage.stream.nos.pt/mage/v1/Images?sourceUri=http://vip.pam.local.internal/PAM.Images/Store/901d96a8f1534749b076212c296d821e&profile=ott_1_452x340&client_id=xe1dgrShwdR1DVOKGmsj8Ut4QLlGyOFI'
})
})

View File

@@ -35,6 +35,7 @@
<channel site="shahid.mbc.net" site_id="49922763891977" lang="ar" xmltv_id="MajidAlMohandis.sa@SD">ماجد المهندس</channel>
<channel site="shahid.mbc.net" site_id="988045" lang="ar" xmltv_id="Maraya.sa@HD">قناة مرايا</channel>
<channel site="shahid.mbc.net" site_id="387238" lang="ar" xmltv_id="MBC1.ae@SD">MBC1</channel>
<channel site="shahid.mbc.net" site_id="387248" lang="ar" xmltv_id="MBC1Egypt.eg@HD">MBC1</channel>
<channel site="shahid.mbc.net" site_id="816764" lang="ar" xmltv_id="MBC1USA.us@SD">MBC1</channel>
<channel site="shahid.mbc.net" site_id="400917" lang="ar" xmltv_id="MBC2.ae@SD">MBC2</channel>
<channel site="shahid.mbc.net" site_id="409385" lang="ar" xmltv_id="MBC3.ae@SD">MBC3</channel>

View File

@@ -14,7 +14,7 @@ module.exports = {
}
},
url: function ({ date, channel }) {
return `${API_STATIC_ENDPOINT}/${channel.lang}/events/segments/${date.format('YYYYMMDDHHmmss')}`
return `${API_STATIC_ENDPOINT}/${channel.lang}/events/segments/${date.format('YYYYMMDD')}000000`
},
async parser({ content, channel, date }) {
let programs = []
@@ -22,25 +22,19 @@ module.exports = {
if (!items.length) return programs
const promises = [
axios.get(
`${API_STATIC_ENDPOINT}/${channel.lang}/events/segments/${date
.add(6, 'h')
.format('YYYYMMDDHHmmss')}`,
`${API_STATIC_ENDPOINT}/${channel.lang}/events/segments/${date.format('YYYYMMDD')}060000`,
{
responseType: 'arraybuffer'
}
),
axios.get(
`${API_STATIC_ENDPOINT}/${channel.lang}/events/segments/${date
.add(12, 'h')
.format('YYYYMMDDHHmmss')}`,
`${API_STATIC_ENDPOINT}/${channel.lang}/events/segments/${date.format('YYYYMMDD')}120000`,
{
responseType: 'arraybuffer'
}
),
axios.get(
`${API_STATIC_ENDPOINT}/${channel.lang}/events/segments/${date
.add(18, 'h')
.format('YYYYMMDDHHmmss')}`,
`${API_STATIC_ENDPOINT}/${channel.lang}/events/segments/${date.format('YYYYMMDD')}180000`,
{
responseType: 'arraybuffer'
}
@@ -63,6 +57,7 @@ module.exports = {
const detail = await loadProgramDetails(item, channel)
programs.push({
title: item.title,
subTitle: detail.episodeName,
icon: parseIcon(item),
description: detail.longDescription,
category: detail.genres,

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,15 @@
# vantagetv.ee
https://vantagetv.ee/epg.xml
### Download the guide
```sh
npm run grab --- --site=vantagetv.ee
```
### Test
```sh
npm test --- vantagetv.ee
```

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<channels>
<channel site="vantagetv.ee" site_id="vmusic" lang="en" xmltv_id="VantageMusic.ee@SD">Vantage Music</channel>
<channel site="vantagetv.ee" site_id="vdance" lang="en" xmltv_id="">Vantage Dance</channel>
<channel site="vantagetv.ee" site_id="vrock" lang="en" xmltv_id="">Vantage Rock</channel>
</channels>

View File

@@ -0,0 +1,27 @@
const parser = require('epg-parser')
module.exports = {
site: 'vantagetv.ee',
days: 2,
url: 'http://vantagetv.ee/epg.xml',
parser: function ({ content, channel, date }) {
let programs = []
const items = parseItems(content, channel, date)
items.forEach(item => {
programs.push({
title: item.title?.[0]?.value,
description: item.desc?.[0]?.value,
start: item.start,
stop: item.stop
})
})
return programs
}
}
function parseItems(content, channel, date) {
const { programs } = parser.parse(content)
return programs.filter(p => p.channel === channel.site_id && date.isSame(p.start, 'day'))
}

View File

@@ -0,0 +1,41 @@
const { parser, url } = require('./vantagetv.ee.config.js')
const fs = require('fs')
const path = require('path')
const dayjs = require('dayjs')
const utc = require('dayjs/plugin/utc')
const customParseFormat = require('dayjs/plugin/customParseFormat')
dayjs.extend(customParseFormat)
dayjs.extend(utc)
const date = dayjs.utc('2026-02-05', 'YYYY-MM-DD').startOf('d')
const channel = { site_id: 'vrock' }
it('can generate valid url', () => {
expect(url).toBe('http://vantagetv.ee/epg.xml')
})
it('can parse response', () => {
const content = fs.readFileSync(path.resolve(__dirname, '__data__/content.xml'))
const results = parser({ content, channel, date })
expect(results.length).toBe(3)
expect(results[0]).toMatchObject({
title: 'Breakfast with Vantage Rock',
description: 'Get ready for your day with Vantage Rock',
start: '2026-02-05T04:00:00.000Z',
stop: '2026-02-05T08:00:00.000Z'
})
expect(results[2]).toMatchObject({
title: 'Rock All Night',
description: 'It might be late, but that&apos;s no reason to stop!',
start: '2026-02-05T22:00:00.000Z',
stop: '2026-02-06T04:00:00.000Z'
})
})
it('can handle empty guide', () => {
const results = parser({ content: '' })
expect(results).toMatchObject([])
})

View File

@@ -33,7 +33,6 @@
<channel site="vodafone.pt" site_id="2749" lang="pt" xmltv_id="24Horas.es@SD">24h</channel>
<channel site="vodafone.pt" site_id="2750" lang="pt" xmltv_id="CNBCEurope.uk@SD">CNBC</channel>
<channel site="vodafone.pt" site_id="2751" lang="pt" xmltv_id="TPAi.ao@SD">TPA</channel>
<channel site="vodafone.pt" site_id="2754" lang="pt" xmltv_id="MTV00s.uk@SD">MTV 00s</channel>
<channel site="vodafone.pt" site_id="2757" lang="pt" xmltv_id="PROTVInternational.ro@SD">Pro TV International</channel>
<channel site="vodafone.pt" site_id="2760" lang="pt" xmltv_id="BloombergTV.us@Europe">Bloomberg</channel>
<channel site="vodafone.pt" site_id="2761" lang="pt" xmltv_id="Mezzo.fr@SD">Mezzo</channel>
@@ -146,5 +145,5 @@
<channel site="vodafone.pt" site_id="8781" lang="pt" xmltv_id="BabyTV.uk@UK">BabyTV</channel>
<channel site="vodafone.pt" site_id="8783" lang="pt" xmltv_id="Historia.pt@SD">História</channel>
<channel site="vodafone.pt" site_id="8901" lang="pt" xmltv_id="WSport.za@SD">W-Sport</channel>
<channel site="vodafone.pt" site_id="8933" lang="pt" xmltv_id="">Conta Lá</channel>
<channel site="vodafone.pt" site_id="8933" lang="pt" xmltv_id="ContaLa.pt@HD">Conta Lá</channel>
</channels>