diff --git a/.github/workflows/9tv.co.il.yml b/.github/workflows/9tv.co.il.yml
new file mode 100644
index 00000000..07fbd82f
--- /dev/null
+++ b/.github/workflows/9tv.co.il.yml
@@ -0,0 +1,17 @@
+name: 9tv.co.il
+on:
+ schedule:
+ - cron: '0 0 * * *'
+ workflow_dispatch:
+ workflow_run:
+ workflows: [_trigger]
+ types:
+ - completed
+jobs:
+ load:
+ uses: ./.github/workflows/_load.yml
+ with:
+ site: ${{github.workflow}}
+ secrets:
+ APP_ID: ${{ secrets.APP_ID }}
+ APP_PRIVATE_KEY: ${{ secrets.APP_PRIVATE_KEY }}
diff --git a/.github/workflows/_load.yml b/.github/workflows/_load.yml
index 17e58f35..37f7413e 100644
--- a/.github/workflows/_load.yml
+++ b/.github/workflows/_load.yml
@@ -15,10 +15,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- - name: Download data from API
- run: |
- mkdir -p scripts/data
- curl -L -o scripts/data/channels.json https://iptv-org.github.io/api/channels.json
+ - run: npm run api:load
- uses: FedericoCarboni/setup-ffmpeg@v1
- uses: actions/setup-node@v2
if: ${{ !env.ACT }}
diff --git a/.github/workflows/_update-api.yml b/.github/workflows/_update-api.yml
index 927ed780..d076ee27 100644
--- a/.github/workflows/_update-api.yml
+++ b/.github/workflows/_update-api.yml
@@ -2,7 +2,7 @@ name: _update-api
on:
workflow_dispatch:
schedule:
- - cron: '0 12 * * *'
+ - cron: '0 6 * * *'
jobs:
update:
runs-on: ubuntu-latest
diff --git a/.github/workflows/_update-readme.yml b/.github/workflows/_update-readme.yml
index 1a1e1132..21d89b28 100644
--- a/.github/workflows/_update-readme.yml
+++ b/.github/workflows/_update-readme.yml
@@ -2,7 +2,7 @@ name: _update-readme
on:
workflow_dispatch:
schedule:
- - cron: '0 12 * * *'
+ - cron: '0 6 * * *'
jobs:
update:
runs-on: ubuntu-latest
diff --git a/.github/workflows/allente.se.yml b/.github/workflows/allente.se.yml
index 6cce784f..d4968348 100644
--- a/.github/workflows/allente.se.yml
+++ b/.github/workflows/allente.se.yml
@@ -1,7 +1,7 @@
name: allente.se
on:
schedule:
- - cron: '0 0 * * *'
+ - cron: '5 0 * * *'
workflow_dispatch:
workflow_run:
workflows: [_trigger]
diff --git a/.github/workflows/artonline.tv.yml b/.github/workflows/artonline.tv.yml
new file mode 100644
index 00000000..8a422300
--- /dev/null
+++ b/.github/workflows/artonline.tv.yml
@@ -0,0 +1,17 @@
+name: artonline.tv
+on:
+ schedule:
+ - cron: '0 0 * * *'
+ workflow_dispatch:
+ workflow_run:
+ workflows: [_trigger]
+ types:
+ - completed
+jobs:
+ load:
+ uses: ./.github/workflows/_load.yml
+ with:
+ site: ${{github.workflow}}
+ secrets:
+ APP_ID: ${{ secrets.APP_ID }}
+ APP_PRIVATE_KEY: ${{ secrets.APP_PRIVATE_KEY }}
diff --git a/.github/workflows/canalplus.com.yml b/.github/workflows/canalplus.com.yml
new file mode 100644
index 00000000..3beee9ab
--- /dev/null
+++ b/.github/workflows/canalplus.com.yml
@@ -0,0 +1,17 @@
+name: canalplus.com
+on:
+ schedule:
+ - cron: '0 0 * * *'
+ workflow_dispatch:
+ workflow_run:
+ workflows: [_trigger]
+ types:
+ - completed
+jobs:
+ load:
+ uses: ./.github/workflows/_load.yml
+ with:
+ site: ${{github.workflow}}
+ secrets:
+ APP_ID: ${{ secrets.APP_ID }}
+ APP_PRIVATE_KEY: ${{ secrets.APP_PRIVATE_KEY }}
diff --git a/.github/workflows/clickthecity.com.yml b/.github/workflows/clickthecity.com.yml
new file mode 100644
index 00000000..31b3e2d8
--- /dev/null
+++ b/.github/workflows/clickthecity.com.yml
@@ -0,0 +1,17 @@
+name: clickthecity.com
+on:
+ schedule:
+ - cron: '0 0 * * *'
+ workflow_dispatch:
+ workflow_run:
+ workflows: [_trigger]
+ types:
+ - completed
+jobs:
+ load:
+ uses: ./.github/workflows/_load.yml
+ with:
+ site: ${{github.workflow}}
+ secrets:
+ APP_ID: ${{ secrets.APP_ID }}
+ APP_PRIVATE_KEY: ${{ secrets.APP_PRIVATE_KEY }}
diff --git a/.github/workflows/comteco.com.bo.yml b/.github/workflows/comteco.com.bo.yml
index df258366..e66b53e2 100644
--- a/.github/workflows/comteco.com.bo.yml
+++ b/.github/workflows/comteco.com.bo.yml
@@ -1,7 +1,7 @@
name: comteco.com.bo
on:
schedule:
- - cron: '0 0 * * *'
+ - cron: '5 0 * * *'
workflow_dispatch:
workflow_run:
workflows: [_trigger]
diff --git a/.github/workflows/dishtv.in.yml b/.github/workflows/dishtv.in.yml
index 3ea9921b..4f2144bb 100644
--- a/.github/workflows/dishtv.in.yml
+++ b/.github/workflows/dishtv.in.yml
@@ -1,7 +1,7 @@
name: dishtv.in
on:
schedule:
- - cron: '0 0 * * *'
+ - cron: '10 0 * * *'
workflow_dispatch:
workflow_run:
workflows: [_trigger]
diff --git a/.github/workflows/guidatv.sky.it.yml b/.github/workflows/guidatv.sky.it.yml
index 144f0e57..bc69b75c 100644
--- a/.github/workflows/guidatv.sky.it.yml
+++ b/.github/workflows/guidatv.sky.it.yml
@@ -1,7 +1,7 @@
name: guidatv.sky.it
on:
schedule:
- - cron: '0 0 * * *'
+ - cron: '10 0 * * *'
workflow_dispatch:
workflow_run:
workflows: [_trigger]
diff --git a/.github/workflows/horizon.tv.yml b/.github/workflows/horizon.tv.yml
new file mode 100644
index 00000000..b4e46d4d
--- /dev/null
+++ b/.github/workflows/horizon.tv.yml
@@ -0,0 +1,17 @@
+name: horizon.tv
+on:
+ schedule:
+ - cron: '0 0 * * *'
+ workflow_dispatch:
+ workflow_run:
+ workflows: [_trigger]
+ types:
+ - completed
+jobs:
+ load:
+ uses: ./.github/workflows/_load.yml
+ with:
+ site: ${{github.workflow}}
+ secrets:
+ APP_ID: ${{ secrets.APP_ID }}
+ APP_PRIVATE_KEY: ${{ secrets.APP_PRIVATE_KEY }}
diff --git a/.github/workflows/i24news.tv.yml b/.github/workflows/i24news.tv.yml
new file mode 100644
index 00000000..7768a031
--- /dev/null
+++ b/.github/workflows/i24news.tv.yml
@@ -0,0 +1,17 @@
+name: i24news.tv
+on:
+ schedule:
+ - cron: '0 0 * * *'
+ workflow_dispatch:
+ workflow_run:
+ workflows: [_trigger]
+ types:
+ - completed
+jobs:
+ load:
+ uses: ./.github/workflows/_load.yml
+ with:
+ site: ${{github.workflow}}
+ secrets:
+ APP_ID: ${{ secrets.APP_ID }}
+ APP_PRIVATE_KEY: ${{ secrets.APP_PRIVATE_KEY }}
diff --git a/.github/workflows/kan.org.il.yml b/.github/workflows/kan.org.il.yml
new file mode 100644
index 00000000..6fdb988f
--- /dev/null
+++ b/.github/workflows/kan.org.il.yml
@@ -0,0 +1,17 @@
+name: kan.org.il
+on:
+ schedule:
+ - cron: '0 0 * * *'
+ workflow_dispatch:
+ workflow_run:
+ workflows: [_trigger]
+ types:
+ - completed
+jobs:
+ load:
+ uses: ./.github/workflows/_load.yml
+ with:
+ site: ${{github.workflow}}
+ secrets:
+ APP_ID: ${{ secrets.APP_ID }}
+ APP_PRIVATE_KEY: ${{ secrets.APP_PRIVATE_KEY }}
diff --git a/.github/workflows/magentatv.at.yml b/.github/workflows/magentatv.at.yml
new file mode 100644
index 00000000..5d4a70ee
--- /dev/null
+++ b/.github/workflows/magentatv.at.yml
@@ -0,0 +1,17 @@
+name: magentatv.at
+on:
+ schedule:
+ - cron: '0 0 * * *'
+ workflow_dispatch:
+ workflow_run:
+ workflows: [_trigger]
+ types:
+ - completed
+jobs:
+ load:
+ uses: ./.github/workflows/_load.yml
+ with:
+ site: ${{github.workflow}}
+ secrets:
+ APP_ID: ${{ secrets.APP_ID }}
+ APP_PRIVATE_KEY: ${{ secrets.APP_PRIVATE_KEY }}
diff --git a/.github/workflows/magentatv.de.yml b/.github/workflows/magentatv.de.yml
new file mode 100644
index 00000000..011ec02e
--- /dev/null
+++ b/.github/workflows/magentatv.de.yml
@@ -0,0 +1,17 @@
+name: magentatv.de
+on:
+ schedule:
+ - cron: '0 0 * * *'
+ workflow_dispatch:
+ workflow_run:
+ workflows: [_trigger]
+ types:
+ - completed
+jobs:
+ load:
+ uses: ./.github/workflows/_load.yml
+ with:
+ site: ${{github.workflow}}
+ secrets:
+ APP_ID: ${{ secrets.APP_ID }}
+ APP_PRIVATE_KEY: ${{ secrets.APP_PRIVATE_KEY }}
diff --git a/.github/workflows/mako.co.il.yml b/.github/workflows/mako.co.il.yml
new file mode 100644
index 00000000..146700d6
--- /dev/null
+++ b/.github/workflows/mako.co.il.yml
@@ -0,0 +1,17 @@
+name: mako.co.il
+on:
+ schedule:
+ - cron: '0 0 * * *'
+ workflow_dispatch:
+ workflow_run:
+ workflows: [_trigger]
+ types:
+ - completed
+jobs:
+ load:
+ uses: ./.github/workflows/_load.yml
+ with:
+ site: ${{github.workflow}}
+ secrets:
+ APP_ID: ${{ secrets.APP_ID }}
+ APP_PRIVATE_KEY: ${{ secrets.APP_PRIVATE_KEY }}
diff --git a/.github/workflows/mediaklikk.hu.yml b/.github/workflows/mediaklikk.hu.yml
new file mode 100644
index 00000000..83efb792
--- /dev/null
+++ b/.github/workflows/mediaklikk.hu.yml
@@ -0,0 +1,17 @@
+name: mediaklikk.hu
+on:
+ schedule:
+ - cron: '0 0 * * *'
+ workflow_dispatch:
+ workflow_run:
+ workflows: [_trigger]
+ types:
+ - completed
+jobs:
+ load:
+ uses: ./.github/workflows/_load.yml
+ with:
+ site: ${{github.workflow}}
+ secrets:
+ APP_ID: ${{ secrets.APP_ID }}
+ APP_PRIVATE_KEY: ${{ secrets.APP_PRIVATE_KEY }}
diff --git a/.github/workflows/musor.tv.yml b/.github/workflows/musor.tv.yml
new file mode 100644
index 00000000..c5ce40c9
--- /dev/null
+++ b/.github/workflows/musor.tv.yml
@@ -0,0 +1,17 @@
+name: musor.tv
+on:
+ schedule:
+ - cron: '0 0 * * *'
+ workflow_dispatch:
+ workflow_run:
+ workflows: [_trigger]
+ types:
+ - completed
+jobs:
+ load:
+ uses: ./.github/workflows/_load.yml
+ with:
+ site: ${{github.workflow}}
+ secrets:
+ APP_ID: ${{ secrets.APP_ID }}
+ APP_PRIVATE_KEY: ${{ secrets.APP_PRIVATE_KEY }}
diff --git a/.github/workflows/proximusmwc.be.yml b/.github/workflows/proximusmwc.be.yml
new file mode 100644
index 00000000..7bfc2c0b
--- /dev/null
+++ b/.github/workflows/proximusmwc.be.yml
@@ -0,0 +1,17 @@
+name: proximusmwc.be
+on:
+ schedule:
+ - cron: '0 0 * * *'
+ workflow_dispatch:
+ workflow_run:
+ workflows: [_trigger]
+ types:
+ - completed
+jobs:
+ load:
+ uses: ./.github/workflows/_load.yml
+ with:
+ site: ${{github.workflow}}
+ secrets:
+ APP_ID: ${{ secrets.APP_ID }}
+ APP_PRIVATE_KEY: ${{ secrets.APP_PRIVATE_KEY }}
diff --git a/.github/workflows/siba.com.co.yml b/.github/workflows/siba.com.co.yml
index ca1b77a1..9be5be69 100644
--- a/.github/workflows/siba.com.co.yml
+++ b/.github/workflows/siba.com.co.yml
@@ -1,7 +1,7 @@
name: siba.com.co
on:
schedule:
- - cron: '10 0 * * *'
+ - cron: '15 0 * * *'
workflow_dispatch:
workflow_run:
workflows: [_trigger]
diff --git a/.github/workflows/sky.de.yml b/.github/workflows/sky.de.yml
new file mode 100644
index 00000000..0e2c6e97
--- /dev/null
+++ b/.github/workflows/sky.de.yml
@@ -0,0 +1,17 @@
+name: sky.de
+on:
+ schedule:
+ - cron: '0 0 * * *'
+ workflow_dispatch:
+ workflow_run:
+ workflows: [_trigger]
+ types:
+ - completed
+jobs:
+ load:
+ uses: ./.github/workflows/_load.yml
+ with:
+ site: ${{github.workflow}}
+ secrets:
+ APP_ID: ${{ secrets.APP_ID }}
+ APP_PRIVATE_KEY: ${{ secrets.APP_PRIVATE_KEY }}
diff --git a/.github/workflows/teliatv.ee.yml b/.github/workflows/teliatv.ee.yml
index eb61d449..4b04c268 100644
--- a/.github/workflows/teliatv.ee.yml
+++ b/.github/workflows/teliatv.ee.yml
@@ -1,7 +1,7 @@
name: teliatv.ee
on:
schedule:
- - cron: '0 0 * * *'
+ - cron: '5 0 * * *'
workflow_dispatch:
workflow_run:
workflows: [_trigger]
diff --git a/.github/workflows/tv.nu.yml b/.github/workflows/tv.nu.yml
new file mode 100644
index 00000000..dcfff814
--- /dev/null
+++ b/.github/workflows/tv.nu.yml
@@ -0,0 +1,17 @@
+name: tv.nu
+on:
+ schedule:
+ - cron: '0 0 * * *'
+ workflow_dispatch:
+ workflow_run:
+ workflows: [_trigger]
+ types:
+ - completed
+jobs:
+ load:
+ uses: ./.github/workflows/_load.yml
+ with:
+ site: ${{github.workflow}}
+ secrets:
+ APP_ID: ${{ secrets.APP_ID }}
+ APP_PRIVATE_KEY: ${{ secrets.APP_PRIVATE_KEY }}
diff --git a/.github/workflows/tvarenasport.com.yml b/.github/workflows/tvarenasport.com.yml
index 05425747..8d0d65fe 100644
--- a/.github/workflows/tvarenasport.com.yml
+++ b/.github/workflows/tvarenasport.com.yml
@@ -1,7 +1,7 @@
name: tvarenasport.com
on:
schedule:
- - cron: '0 0 * * *'
+ - cron: '5 0 * * *'
workflow_dispatch:
workflow_run:
workflows: [_trigger]
diff --git a/.github/workflows/tvarenasport.hr.yml b/.github/workflows/tvarenasport.hr.yml
index d7c21394..2225c969 100644
--- a/.github/workflows/tvarenasport.hr.yml
+++ b/.github/workflows/tvarenasport.hr.yml
@@ -1,7 +1,7 @@
name: tvarenasport.hr
on:
schedule:
- - cron: '0 0 * * *'
+ - cron: '5 0 * * *'
workflow_dispatch:
workflow_run:
workflows: [_trigger]
diff --git a/.github/workflows/tvim.tv.yml b/.github/workflows/tvim.tv.yml
index db5d2c87..4e029e27 100644
--- a/.github/workflows/tvim.tv.yml
+++ b/.github/workflows/tvim.tv.yml
@@ -1,7 +1,7 @@
name: tvim.tv
on:
schedule:
- - cron: '0 0 * * *'
+ - cron: '10 0 * * *'
workflow_dispatch:
workflow_run:
workflows: [_trigger]
diff --git a/.github/workflows/tvplus.com.tr.yml b/.github/workflows/tvplus.com.tr.yml
index 8867361b..6d985dcd 100644
--- a/.github/workflows/tvplus.com.tr.yml
+++ b/.github/workflows/tvplus.com.tr.yml
@@ -1,7 +1,7 @@
name: tvplus.com.tr
on:
schedule:
- - cron: '5 0 * * *'
+ - cron: '10 0 * * *'
workflow_dispatch:
workflow_run:
workflows: [_trigger]
diff --git a/README.md b/README.md
index 60866fc4..db25f360 100644
--- a/README.md
+++ b/README.md
@@ -30,7 +30,8 @@ To load a program guide, all you need to do is copy the link to one or more of t
๐ง๐ญ Bahrain | 99 | https://iptv-org.github.io/epg/guides/bh-ar/osn.com.epg.xml |  |
99 | https://iptv-org.github.io/epg/guides/bh-en/osn.com.epg.xml |  |
๐ง๐พ Belarus | 20 | https://iptv-org.github.io/epg/guides/by/tv.mail.ru.epg.xml |  |
- ๐ง๐ช Belgium | 7 | https://iptv-org.github.io/epg/guides/be/vtm.be.epg.xml |  |
+ ๐ง๐ช Belgium | 214 | https://iptv-org.github.io/epg/guides/be/proximusmwc.be.epg.xml |  |
+ 7 | https://iptv-org.github.io/epg/guides/be/vtm.be.epg.xml |  |
๐ง๐ฏ Benin | 242 | https://iptv-org.github.io/epg/guides/bj/canalplus-afrique.com.epg.xml |  |
130 | https://iptv-org.github.io/epg/guides/bj/dstv.com.epg.xml |  |
๐ง๐ด Bolivia | 79 | https://iptv-org.github.io/epg/guides/bo/comteco.com.bo.epg.xml |  |
@@ -38,7 +39,7 @@ To load a program guide, all you need to do is copy the link to one or more of t
๐ง๐ฆ Bosnia and Herzegovina | 178 | https://iptv-org.github.io/epg/guides/ba/mtel.ba.epg.xml |  |
4 | https://iptv-org.github.io/epg/guides/ba/tvarenasport.com.epg.xml |  |
๐ง๐ผ Botswana | 130 | https://iptv-org.github.io/epg/guides/bw/dstv.com.epg.xml |  |
- ๐ง๐ท Brazil | 251 | https://iptv-org.github.io/epg/guides/br/mi.tv.epg.xml |  |
+ ๐ง๐ท Brazil | 253 | https://iptv-org.github.io/epg/guides/br/mi.tv.epg.xml |  |
๐ง๐ฌ Bulgaria | 103 | https://iptv-org.github.io/epg/guides/bg/tv.dir.bg.epg.xml |  |
๐ง๐ซ Burkina Faso | 242 | https://iptv-org.github.io/epg/guides/bf/canalplus-afrique.com.epg.xml |  |
128 | https://iptv-org.github.io/epg/guides/bf/dstv.com.epg.xml |  |
@@ -46,7 +47,7 @@ To load a program guide, all you need to do is copy the link to one or more of t
128 | https://iptv-org.github.io/epg/guides/bi/dstv.com.epg.xml |  |
๐จ๐ฒ Cameroon | 242 | https://iptv-org.github.io/epg/guides/cm/canalplus-afrique.com.epg.xml |  |
128 | https://iptv-org.github.io/epg/guides/cm/dstv.com.epg.xml |  |
- ๐จ๐ฆ Canada | 76 | https://iptv-org.github.io/epg/guides/ca/tvtv.us.epg.xml |  |
+ ๐จ๐ฆ Canada | 89 | https://iptv-org.github.io/epg/guides/ca/tvtv.us.epg.xml |  |
๐จ๐ป Cape Verde | 242 | https://iptv-org.github.io/epg/guides/cv/canalplus-afrique.com.epg.xml |  |
125 | https://iptv-org.github.io/epg/guides/cv/dstv.com.epg.xml |  |
๐จ๐ซ Central African Republic | 242 | https://iptv-org.github.io/epg/guides/cf/canalplus-afrique.com.epg.xml |  |
@@ -67,7 +68,7 @@ To load a program guide, all you need to do is copy the link to one or more of t
10 | https://iptv-org.github.io/epg/guides/hr/tvarenasport.hr.epg.xml |  |
๐จ๐บ Cuba | 10 | https://iptv-org.github.io/epg/guides/cu/tvcubana.icrt.cu.epg.xml |  |
๐จ๐พ Cyprus | 30 | https://iptv-org.github.io/epg/guides/cy/novacyprus.com.epg.xml |  |
- ๐จ๐ฟ Czech Republic | 519 | https://iptv-org.github.io/epg/guides/cz/m.tv.sms.cz.epg.xml |  |
+ ๐จ๐ฟ Czech Republic | 523 | https://iptv-org.github.io/epg/guides/cz/m.tv.sms.cz.epg.xml |  |
๐จ๐ฉ Democratic Republic of the Congo | 242 | https://iptv-org.github.io/epg/guides/cd/canalplus-afrique.com.epg.xml |  |
126 | https://iptv-org.github.io/epg/guides/cd/dstv.com.epg.xml |  |
๐ฉ๐ฐ Denmark | 61 | https://iptv-org.github.io/epg/guides/dk/allente.se.epg.xml |  |
@@ -89,11 +90,11 @@ To load a program guide, all you need to do is copy the link to one or more of t
132 | https://iptv-org.github.io/epg/guides/ee-ru/teliatv.ee.epg.xml |  |
๐ช๐น Ethiopia | 148 | https://iptv-org.github.io/epg/guides/et/dstv.com.epg.xml |  |
๐ซ๐ด Faroe Islands | 1 | https://iptv-org.github.io/epg/guides/fo/kvf.fo.epg.xml |  |
- ๐ซ๐ฏ Fiji | 9 | https://iptv-org.github.io/epg/guides/fj/walesi.com.fj.epg.xml |  |
๐ซ๐ฎ Finland | 36 | https://iptv-org.github.io/epg/guides/fi/allente.se.epg.xml |  |
36 | https://iptv-org.github.io/epg/guides/fi/telkussa.fi.epg.xml |  |
- ๐ซ๐ท France | 204 | https://iptv-org.github.io/epg/guides/fr/programme-tv.net.epg.xml |  |
- 190 | https://iptv-org.github.io/epg/guides/fr/chaines-tv.orange.fr.epg.xml |  |
+ ๐ซ๐ท France | 217 | https://iptv-org.github.io/epg/guides/fr/canalplus.com.epg.xml |  |
+ 211 | https://iptv-org.github.io/epg/guides/fr/programme-tv.net.epg.xml |  |
+ 194 | https://iptv-org.github.io/epg/guides/fr/chaines-tv.orange.fr.epg.xml |  |
๐ฌ๐ซ French Guiana | 128 | https://iptv-org.github.io/epg/guides/gf/canalplus-caraibes.com.epg.xml |  |
๐ต๐ซ French Polynesia | 2 | https://iptv-org.github.io/epg/guides/pf/programme-tv.vini.pf.epg.xml |  |
๐ฌ๐ฆ Gabon | 242 | https://iptv-org.github.io/epg/guides/ga/canalplus-afrique.com.epg.xml |  |
@@ -101,7 +102,8 @@ To load a program guide, all you need to do is copy the link to one or more of t
๐ฌ๐ฒ Gambia | 242 | https://iptv-org.github.io/epg/guides/gm/canalplus-afrique.com.epg.xml |  |
124 | https://iptv-org.github.io/epg/guides/gm/dstv.com.epg.xml |  |
๐ฌ๐ช Georgia | 116 | https://iptv-org.github.io/epg/guides/ge/magticom.ge.epg.xml |  |
- ๐ฉ๐ช Germany | 122 | https://iptv-org.github.io/epg/guides/de/hd-plus.de.epg.xml |  |
+ ๐ฉ๐ช Germany | 245 | https://iptv-org.github.io/epg/guides/de/horizon.tv.epg.xml |  |
+ 122 | https://iptv-org.github.io/epg/guides/de/hd-plus.de.epg.xml |  |
๐ฌ๐ญ Ghana | 242 | https://iptv-org.github.io/epg/guides/gh/canalplus-afrique.com.epg.xml |  |
139 | https://iptv-org.github.io/epg/guides/gh/dstv.com.epg.xml |  |
๐ฌ๐ท Greece | 86 | https://iptv-org.github.io/epg/guides/gr/cosmote.gr.epg.xml |  |
@@ -119,15 +121,22 @@ To load a program guide, all you need to do is copy the link to one or more of t
22 | https://iptv-org.github.io/epg/guides/hn/mi.tv.epg.xml |  |
๐ญ๐ฐ Hong Kong | 132 | https://iptv-org.github.io/epg/guides/hk-en/nowplayer.now.com.epg.xml |  |
132 | https://iptv-org.github.io/epg/guides/hk-zh/nowplayer.now.com.epg.xml |  |
- ๐ญ๐บ Hungary | 91 | https://iptv-org.github.io/epg/guides/hu/tvmusor.hu.epg.xml |  |
+ ๐ญ๐บ Hungary | 170 | https://iptv-org.github.io/epg/guides/hu/musor.tv.epg.xml |  |
+ 91 | https://iptv-org.github.io/epg/guides/hu/tvmusor.hu.epg.xml |  |
+ 8 | https://iptv-org.github.io/epg/guides/hu/mediaklikk.hu.epg.xml |  |
๐ฎ๐ธ Iceland | 2 | https://iptv-org.github.io/epg/guides/is/ruv.is.epg.xml |  |
๐ฎ๐ณ India | 364 | https://iptv-org.github.io/epg/guides/in/dishtv.in.epg.xml |  |
- ๐ฎ๐ฉ Indonesia | 98 | https://iptv-org.github.io/epg/guides/id/mncvision.id.epg.xml |  |
+ ๐ฎ๐ฉ Indonesia | 98 | https://iptv-org.github.io/epg/guides/id-en/mncvision.id.epg.xml |  |
+ 98 | https://iptv-org.github.io/epg/guides/id-id/mncvision.id.epg.xml |  |
53 | https://iptv-org.github.io/epg/guides/id/vidio.com.epg.xml |  |
๐ฎ๐ท Iran | 29 | https://iptv-org.github.io/epg/guides/ir/tva.tv.epg.xml |  |
๐ฎ๐ถ Iraq | 99 | https://iptv-org.github.io/epg/guides/iq-ar/osn.com.epg.xml |  |
99 | https://iptv-org.github.io/epg/guides/iq-en/osn.com.epg.xml |  |
๐ฎ๐ช Ireland | 3 | https://iptv-org.github.io/epg/guides/ie/ontvtonight.com.epg.xml |  |
+ ๐ฎ๐ฑ Israel | 3 | https://iptv-org.github.io/epg/guides/il/i24news.tv.epg.xml |  |
+ 3 | https://iptv-org.github.io/epg/guides/il/kan.org.il.epg.xml |  |
+ 1 | https://iptv-org.github.io/epg/guides/il/9tv.co.il.epg.xml |  |
+ 1 | https://iptv-org.github.io/epg/guides/il/mako.co.il.epg.xml |  |
๐ฎ๐น Italy | 142 | https://iptv-org.github.io/epg/guides/it/guidatv.sky.it.epg.xml |  |
15 | https://iptv-org.github.io/epg/guides/it/mediaset.it.epg.xml |  |
๐จ๐ฎ Ivory Coast | 242 | https://iptv-org.github.io/epg/guides/ci/canalplus-afrique.com.epg.xml |  |
@@ -183,6 +192,7 @@ To load a program guide, all you need to do is copy the link to one or more of t
๐ต๐พ Paraguay | 39 | https://iptv-org.github.io/epg/guides/py/gatotv.com.epg.xml |  |
๐ต๐ช Peru | 48 | https://iptv-org.github.io/epg/guides/pe/gatotv.com.epg.xml |  |
21 | https://iptv-org.github.io/epg/guides/pe/mi.tv.epg.xml |  |
+ ๐ต๐ญ Philippines | 34 | https://iptv-org.github.io/epg/guides/ph/clickthecity.com.epg.xml |  |
๐ต๐ฑ Poland | 340 | https://iptv-org.github.io/epg/guides/pl/programtv.onet.pl.epg.xml |  |
๐ต๐น Portugal | 203 | https://iptv-org.github.io/epg/guides/pt/meo.pt.epg.xml |  |
๐ถ๐ฆ Qatar | 99 | https://iptv-org.github.io/epg/guides/qa-ar/osn.com.epg.xml |  |
@@ -197,8 +207,9 @@ To load a program guide, all you need to do is copy the link to one or more of t
๐ท๐ช Rรฉunion | 119 | https://iptv-org.github.io/epg/guides/re/canalplus-reunion.com.epg.xml |  |
๐ง๐ฑ Saint Barthรฉlemy | 128 | https://iptv-org.github.io/epg/guides/bl/canalplus-caraibes.com.epg.xml |  |
๐ฒ๐ซ Saint Martin | 128 | https://iptv-org.github.io/epg/guides/mf/canalplus-caraibes.com.epg.xml |  |
- ๐ธ๐ฆ Saudi Arabia | 98 | https://iptv-org.github.io/epg/guides/sa-ar/osn.com.epg.xml |  |
+ ๐ธ๐ฆ Saudi Arabia | 98 | https://iptv-org.github.io/epg/guides/sa-ar/osn.com.epg.xml |  |
98 | https://iptv-org.github.io/epg/guides/sa-en/osn.com.epg.xml |  |
+ 5 | https://iptv-org.github.io/epg/guides/sa/artonline.tv.epg.xml |  |
๐ธ๐ณ Senegal | 242 | https://iptv-org.github.io/epg/guides/sn/canalplus-afrique.com.epg.xml |  |
125 | https://iptv-org.github.io/epg/guides/sn/dstv.com.epg.xml |  |
๐ท๐ธ Serbia | 357 | https://iptv-org.github.io/epg/guides/rs/mts.rs.epg.xml |  |
@@ -214,7 +225,8 @@ To load a program guide, all you need to do is copy the link to one or more of t
58 | https://iptv-org.github.io/epg/guides/es/gatotv.com.epg.xml |  |
๐ธ๐ฉ Sudan | 118 | https://iptv-org.github.io/epg/guides/sd/dstv.com.epg.xml |  |
๐ธ๐ฟ Swaziland | 127 | https://iptv-org.github.io/epg/guides/sz/dstv.com.epg.xml |  |
- ๐ธ๐ช Sweden | 94 | https://iptv-org.github.io/epg/guides/se/allente.se.epg.xml |  |
+ ๐ธ๐ช Sweden | 151 | https://iptv-org.github.io/epg/guides/se/tv.nu.epg.xml |  |
+ 94 | https://iptv-org.github.io/epg/guides/se/allente.se.epg.xml |  |
๐จ๐ญ Switzerland | 598 | https://iptv-org.github.io/epg/guides/ch/tv.blue.ch.epg.xml |  |
๐ธ๐น Sรฃo Tomรฉ and Prรญncipe | 128 | https://iptv-org.github.io/epg/guides/st/dstv.com.epg.xml |  |
๐น๐ฟ Tanzania | 30 | https://iptv-org.github.io/epg/guides/tz/dstv.com.epg.xml |  |
@@ -228,9 +240,9 @@ To load a program guide, all you need to do is copy the link to one or more of t
๐บ๐ฆ Ukraine | 114 | https://iptv-org.github.io/epg/guides/ua/tvgid.ua.epg.xml |  |
๐ฆ๐ช United Arab Emirates | 99 | https://iptv-org.github.io/epg/guides/ae-ar/osn.com.epg.xml |  |
99 | https://iptv-org.github.io/epg/guides/ae-en/osn.com.epg.xml |  |
- ๐ฌ๐ง United Kingdom | 258 | https://iptv-org.github.io/epg/guides/uk/sky.com.epg.xml |  |
+ ๐ฌ๐ง United Kingdom | 262 | https://iptv-org.github.io/epg/guides/uk/sky.com.epg.xml |  |
97 | https://iptv-org.github.io/epg/guides/uk/ontvtonight.com.epg.xml |  |
- ๐บ๐ธ United States | 1683 | https://iptv-org.github.io/epg/guides/us/tvtv.us.epg.xml |  |
+ ๐บ๐ธ United States | 1780 | https://iptv-org.github.io/epg/guides/us/tvtv.us.epg.xml |  |
410 | https://iptv-org.github.io/epg/guides/us/directv.com.epg.xml |  |
88 | https://iptv-org.github.io/epg/guides/us/tvguide.com.epg.xml |  |
22 | https://iptv-org.github.io/epg/guides/us/gatotv.com.epg.xml |  |
diff --git a/package-lock.json b/package-lock.json
index 690e3bbb..5799aadd 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -12,24 +12,27 @@
"cheerio": "^1.0.0-rc.10",
"commander": "^8.2.0",
"csv-parser": "^3.0.0",
- "dayjs": "^1.10.4",
- "epg-grabber": "^0.20.0",
+ "dayjs": "^1.10.8",
+ "epg-grabber": "^0.23.0",
"epg-parser": "^0.1.6",
"form-data": "^4.0.0",
"fs-extra": "^10.0.1",
"glob": "^7.2.0",
"iconv-lite": "^0.4.24",
+ "inquirer": "^8.2.0",
"jest": "^27.3.1",
"libxmljs": "^0.19.7",
"lodash": "^4.17.21",
"markdown-include": "^0.4.3",
"mockdate": "^3.0.5",
"nedb-promises": "^5.0.3",
+ "node-cleanup": "^2.1.2",
"parse-duration": "^1.0.0",
"pdf-parse": "^1.1.1",
"signale": "^1.4.0",
"srcset": "^4.0.0",
"tabletojson": "^2.0.7",
+ "transliteration": "^2.2.0",
"wildcard-match": "^5.1.2"
}
},
@@ -1397,11 +1400,40 @@
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
},
+ "node_modules/base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
"node_modules/bindings": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/bindings/-/bindings-1.3.1.tgz",
"integrity": "sha512-i47mqjF9UbjxJhxGf+pZ6kSxrnI3wBLlnGI2ArWJ4r0VrvDS7ZYXkprq/pLaBWYq4GM0r4zdHY+NNRqEMU7uew=="
},
+ "node_modules/bl": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
+ "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
+ "dependencies": {
+ "buffer": "^5.5.0",
+ "inherits": "^2.0.4",
+ "readable-stream": "^3.4.0"
+ }
+ },
"node_modules/boolbase": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
@@ -1462,6 +1494,29 @@
"node-int64": "^0.4.0"
}
},
+ "node_modules/buffer": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+ "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "dependencies": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.1.13"
+ }
+ },
"node_modules/buffer-from": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
@@ -1554,6 +1609,11 @@
"node": ">=10"
}
},
+ "node_modules/chardet": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
+ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA=="
+ },
"node_modules/cheerio": {
"version": "1.0.0-rc.10",
"resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.10.tgz",
@@ -1604,6 +1664,36 @@
"resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz",
"integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA=="
},
+ "node_modules/cli-cursor": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
+ "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
+ "dependencies": {
+ "restore-cursor": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cli-spinners": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz",
+ "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==",
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/cli-width": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz",
+ "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==",
+ "engines": {
+ "node": ">= 10"
+ }
+ },
"node_modules/cliui": {
"version": "7.0.4",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
@@ -1614,6 +1704,14 @@
"wrap-ansi": "^7.0.0"
}
},
+ "node_modules/clone": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
+ "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=",
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
"node_modules/clone-response": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz",
@@ -1831,6 +1929,14 @@
"node": ">= 10"
}
},
+ "node_modules/curl-generator": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/curl-generator/-/curl-generator-0.2.0.tgz",
+ "integrity": "sha512-KKTRYPMX3LnX45phiklGA+rv2W5mG0KD8sirV0yjtM7aliGMp5PIwqC5n74AFlwIHGMVsD9NKlyKpcYFA8bPog==",
+ "dependencies": {
+ "ms": "^2.0.0"
+ }
+ },
"node_modules/data-urls": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz",
@@ -1845,9 +1951,9 @@
}
},
"node_modules/dayjs": {
- "version": "1.10.7",
- "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.7.tgz",
- "integrity": "sha512-P6twpd70BcPK34K26uJ1KT3wlhpuOAPoMwJzpsIWUxHZ7wpmbdZL/hQqBDfz7hGurYSa5PhzdhDHtt319hL3ig=="
+ "version": "1.10.8",
+ "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.8.tgz",
+ "integrity": "sha512-wbNwDfBHHur9UOzNUjeKUOJ0fCb0a52Wx0xInmQ7Y8FstyajiV1NmK1e00cxsr9YrE9r7yAChE0VvpuY5Rnlow=="
},
"node_modules/debug": {
"version": "4.3.2",
@@ -1921,6 +2027,14 @@
"node": ">=0.10.0"
}
},
+ "node_modules/defaults": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz",
+ "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=",
+ "dependencies": {
+ "clone": "^1.0.2"
+ }
+ },
"node_modules/defer-to-connect": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz",
@@ -2092,14 +2206,15 @@
}
},
"node_modules/epg-grabber": {
- "version": "0.20.0",
- "resolved": "https://registry.npmjs.org/epg-grabber/-/epg-grabber-0.20.0.tgz",
- "integrity": "sha512-6xmz1AfYKDduEjZqQlYyacR41fb8ITDymORyOcKmTdCs9XXrofYL84lULkEmhsNfksAuPf5hMef/uFptbDh/GA==",
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/epg-grabber/-/epg-grabber-0.23.0.tgz",
+ "integrity": "sha512-tjMH8+UxguXNkI30gwISeXRvErlByXHGpvLBLq/eDHAPT9pQ6G96R7UHHJ+vZ4fIaMTZEh3aiTKnzjO+trlGhw==",
"dependencies": {
"axios": "^0.21.1",
"axios-cookiejar-support": "^1.0.1",
"axios-mock-adapter": "^1.20.0",
"commander": "^7.1.0",
+ "curl-generator": "^0.2.0",
"dayjs": "^1.10.4",
"glob": "^7.1.6",
"lodash": "^4.17.21",
@@ -2265,6 +2380,19 @@
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
+ "node_modules/external-editor": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz",
+ "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==",
+ "dependencies": {
+ "chardet": "^0.7.0",
+ "iconv-lite": "^0.4.24",
+ "tmp": "^0.0.33"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
"node_modules/fast-deep-equal": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
@@ -2692,6 +2820,25 @@
"node": ">=0.10.0"
}
},
+ "node_modules/ieee754": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
"node_modules/ignore-walk": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.4.tgz",
@@ -2747,6 +2894,52 @@
"resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
"integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="
},
+ "node_modules/inquirer": {
+ "version": "8.2.0",
+ "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.0.tgz",
+ "integrity": "sha512-0crLweprevJ02tTuA6ThpoAERAGyVILC4sS74uib58Xf/zSr1/ZWtmm7D5CI+bSQEaA04f0K7idaHpQbSWgiVQ==",
+ "dependencies": {
+ "ansi-escapes": "^4.2.1",
+ "chalk": "^4.1.1",
+ "cli-cursor": "^3.1.0",
+ "cli-width": "^3.0.0",
+ "external-editor": "^3.0.3",
+ "figures": "^3.0.0",
+ "lodash": "^4.17.21",
+ "mute-stream": "0.0.8",
+ "ora": "^5.4.1",
+ "run-async": "^2.4.0",
+ "rxjs": "^7.2.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0",
+ "through": "^2.3.6"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/inquirer/node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/inquirer/node_modules/figures": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
+ "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
+ "dependencies": {
+ "escape-string-regexp": "^1.0.5"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/is-arrayish": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
@@ -2812,6 +3005,14 @@
"node": ">=6"
}
},
+ "node_modules/is-interactive": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz",
+ "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/is-number": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
@@ -2849,6 +3050,17 @@
"resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
"integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
},
+ "node_modules/is-unicode-supported": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
+ "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
@@ -3766,6 +3978,21 @@
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
},
+ "node_modules/log-symbols": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
+ "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
+ "dependencies": {
+ "chalk": "^4.1.0",
+ "is-unicode-supported": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/logform": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/logform/-/logform-2.3.0.tgz",
@@ -3948,6 +4175,11 @@
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
},
+ "node_modules/mute-stream": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz",
+ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA=="
+ },
"node_modules/nan": {
"version": "2.14.2",
"resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz",
@@ -3990,6 +4222,11 @@
"ms": "^2.1.1"
}
},
+ "node_modules/node-cleanup": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/node-cleanup/-/node-cleanup-2.1.2.tgz",
+ "integrity": "sha1-esGavSl+Caf3KnFUXZUbUX5N3iw="
+ },
"node_modules/node-ensure": {
"version": "0.0.0",
"resolved": "https://registry.npmjs.org/node-ensure/-/node-ensure-0.0.0.tgz",
@@ -4207,6 +4444,28 @@
"node": ">= 0.8.0"
}
},
+ "node_modules/ora": {
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz",
+ "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==",
+ "dependencies": {
+ "bl": "^4.1.0",
+ "chalk": "^4.1.0",
+ "cli-cursor": "^3.1.0",
+ "cli-spinners": "^2.5.0",
+ "is-interactive": "^1.0.0",
+ "is-unicode-supported": "^0.1.0",
+ "log-symbols": "^4.1.0",
+ "strip-ansi": "^6.0.0",
+ "wcwidth": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/os-homedir": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
@@ -4658,6 +4917,18 @@
"lowercase-keys": "^2.0.0"
}
},
+ "node_modules/restore-cursor": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
+ "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
+ "dependencies": {
+ "onetime": "^5.1.0",
+ "signal-exit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/rimraf": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
@@ -4672,6 +4943,22 @@
"url": "https://github.com/sponsors/isaacs"
}
},
+ "node_modules/run-async": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz",
+ "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/rxjs": {
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.4.tgz",
+ "integrity": "sha512-h5M3Hk78r6wAheJF0a5YahB1yRQKCsZ4MsGdZ5O9ETbVtjPcScGfrMmoOq7EBsCRzd4BDkvDJ7ogP8Sz5tTFiQ==",
+ "dependencies": {
+ "tslib": "^2.1.0"
+ }
+ },
"node_modules/safe-buffer": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
@@ -5096,6 +5383,22 @@
"resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz",
"integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w=="
},
+ "node_modules/through": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+ "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
+ },
+ "node_modules/tmp": {
+ "version": "0.0.33",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
+ "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
+ "dependencies": {
+ "os-tmpdir": "~1.0.2"
+ },
+ "engines": {
+ "node": ">=0.6.0"
+ }
+ },
"node_modules/tmpl": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz",
@@ -5144,6 +5447,21 @@
"node": ">=8"
}
},
+ "node_modules/transliteration": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/transliteration/-/transliteration-2.2.0.tgz",
+ "integrity": "sha512-o29GDWtecNoK4TNfnJQesGluFPiza+U8NoiKrErU8eTNlVgma6w1LV/tTiGo+waFLkhtL9WxrW0lXhZKmm7msQ==",
+ "dependencies": {
+ "yargs": "^16.1.0"
+ },
+ "bin": {
+ "slugify": "dist/bin/slugify",
+ "transliterate": "dist/bin/transliterate"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
"node_modules/triple-beam": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz",
@@ -5319,6 +5637,14 @@
"makeerror": "1.0.12"
}
},
+ "node_modules/wcwidth": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
+ "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=",
+ "dependencies": {
+ "defaults": "^1.0.3"
+ }
+ },
"node_modules/webidl-conversions": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz",
@@ -6650,11 +6976,26 @@
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
},
+ "base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="
+ },
"bindings": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/bindings/-/bindings-1.3.1.tgz",
"integrity": "sha512-i47mqjF9UbjxJhxGf+pZ6kSxrnI3wBLlnGI2ArWJ4r0VrvDS7ZYXkprq/pLaBWYq4GM0r4zdHY+NNRqEMU7uew=="
},
+ "bl": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
+ "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
+ "requires": {
+ "buffer": "^5.5.0",
+ "inherits": "^2.0.4",
+ "readable-stream": "^3.4.0"
+ }
+ },
"boolbase": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
@@ -6702,6 +7043,15 @@
"node-int64": "^0.4.0"
}
},
+ "buffer": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+ "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+ "requires": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.1.13"
+ }
+ },
"buffer-from": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
@@ -6765,6 +7115,11 @@
"resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz",
"integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw=="
},
+ "chardet": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
+ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA=="
+ },
"cheerio": {
"version": "1.0.0-rc.10",
"resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.10.tgz",
@@ -6806,6 +7161,24 @@
"resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz",
"integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA=="
},
+ "cli-cursor": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
+ "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
+ "requires": {
+ "restore-cursor": "^3.1.0"
+ }
+ },
+ "cli-spinners": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz",
+ "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g=="
+ },
+ "cli-width": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz",
+ "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw=="
+ },
"cliui": {
"version": "7.0.4",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
@@ -6816,6 +7189,11 @@
"wrap-ansi": "^7.0.0"
}
},
+ "clone": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
+ "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4="
+ },
"clone-response": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz",
@@ -6997,6 +7375,14 @@
"minimist": "^1.2.0"
}
},
+ "curl-generator": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/curl-generator/-/curl-generator-0.2.0.tgz",
+ "integrity": "sha512-KKTRYPMX3LnX45phiklGA+rv2W5mG0KD8sirV0yjtM7aliGMp5PIwqC5n74AFlwIHGMVsD9NKlyKpcYFA8bPog==",
+ "requires": {
+ "ms": "^2.0.0"
+ }
+ },
"data-urls": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz",
@@ -7008,9 +7394,9 @@
}
},
"dayjs": {
- "version": "1.10.7",
- "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.7.tgz",
- "integrity": "sha512-P6twpd70BcPK34K26uJ1KT3wlhpuOAPoMwJzpsIWUxHZ7wpmbdZL/hQqBDfz7hGurYSa5PhzdhDHtt319hL3ig=="
+ "version": "1.10.8",
+ "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.8.tgz",
+ "integrity": "sha512-wbNwDfBHHur9UOzNUjeKUOJ0fCb0a52Wx0xInmQ7Y8FstyajiV1NmK1e00cxsr9YrE9r7yAChE0VvpuY5Rnlow=="
},
"debug": {
"version": "4.3.2",
@@ -7060,6 +7446,14 @@
"resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
"integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg=="
},
+ "defaults": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz",
+ "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=",
+ "requires": {
+ "clone": "^1.0.2"
+ }
+ },
"defer-to-connect": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz",
@@ -7179,14 +7573,15 @@
"integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A=="
},
"epg-grabber": {
- "version": "0.20.0",
- "resolved": "https://registry.npmjs.org/epg-grabber/-/epg-grabber-0.20.0.tgz",
- "integrity": "sha512-6xmz1AfYKDduEjZqQlYyacR41fb8ITDymORyOcKmTdCs9XXrofYL84lULkEmhsNfksAuPf5hMef/uFptbDh/GA==",
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/epg-grabber/-/epg-grabber-0.23.0.tgz",
+ "integrity": "sha512-tjMH8+UxguXNkI30gwISeXRvErlByXHGpvLBLq/eDHAPT9pQ6G96R7UHHJ+vZ4fIaMTZEh3aiTKnzjO+trlGhw==",
"requires": {
"axios": "^0.21.1",
"axios-cookiejar-support": "^1.0.1",
"axios-mock-adapter": "^1.20.0",
"commander": "^7.1.0",
+ "curl-generator": "^0.2.0",
"dayjs": "^1.10.4",
"glob": "^7.1.6",
"lodash": "^4.17.21",
@@ -7303,6 +7698,16 @@
}
}
},
+ "external-editor": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz",
+ "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==",
+ "requires": {
+ "chardet": "^0.7.0",
+ "iconv-lite": "^0.4.24",
+ "tmp": "^0.0.33"
+ }
+ },
"fast-deep-equal": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
@@ -7621,6 +8026,11 @@
"safer-buffer": ">= 2.1.2 < 3"
}
},
+ "ieee754": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="
+ },
"ignore-walk": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.4.tgz",
@@ -7667,6 +8077,42 @@
"resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
"integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="
},
+ "inquirer": {
+ "version": "8.2.0",
+ "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.0.tgz",
+ "integrity": "sha512-0crLweprevJ02tTuA6ThpoAERAGyVILC4sS74uib58Xf/zSr1/ZWtmm7D5CI+bSQEaA04f0K7idaHpQbSWgiVQ==",
+ "requires": {
+ "ansi-escapes": "^4.2.1",
+ "chalk": "^4.1.1",
+ "cli-cursor": "^3.1.0",
+ "cli-width": "^3.0.0",
+ "external-editor": "^3.0.3",
+ "figures": "^3.0.0",
+ "lodash": "^4.17.21",
+ "mute-stream": "0.0.8",
+ "ora": "^5.4.1",
+ "run-async": "^2.4.0",
+ "rxjs": "^7.2.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0",
+ "through": "^2.3.6"
+ },
+ "dependencies": {
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
+ },
+ "figures": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
+ "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
+ "requires": {
+ "escape-string-regexp": "^1.0.5"
+ }
+ }
+ }
+ },
"is-arrayish": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
@@ -7700,6 +8146,11 @@
"resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz",
"integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ=="
},
+ "is-interactive": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz",
+ "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w=="
+ },
"is-number": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
@@ -7725,6 +8176,11 @@
"resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
"integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
},
+ "is-unicode-supported": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
+ "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw=="
+ },
"isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
@@ -8436,6 +8892,15 @@
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
},
+ "log-symbols": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
+ "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
+ "requires": {
+ "chalk": "^4.1.0",
+ "is-unicode-supported": "^0.1.0"
+ }
+ },
"logform": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/logform/-/logform-2.3.0.tgz",
@@ -8584,6 +9049,11 @@
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
},
+ "mute-stream": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz",
+ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA=="
+ },
"nan": {
"version": "2.14.2",
"resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz",
@@ -8622,6 +9092,11 @@
}
}
},
+ "node-cleanup": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/node-cleanup/-/node-cleanup-2.1.2.tgz",
+ "integrity": "sha1-esGavSl+Caf3KnFUXZUbUX5N3iw="
+ },
"node-ensure": {
"version": "0.0.0",
"resolved": "https://registry.npmjs.org/node-ensure/-/node-ensure-0.0.0.tgz",
@@ -8795,6 +9270,22 @@
"word-wrap": "~1.2.3"
}
},
+ "ora": {
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz",
+ "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==",
+ "requires": {
+ "bl": "^4.1.0",
+ "chalk": "^4.1.0",
+ "cli-cursor": "^3.1.0",
+ "cli-spinners": "^2.5.0",
+ "is-interactive": "^1.0.0",
+ "is-unicode-supported": "^0.1.0",
+ "log-symbols": "^4.1.0",
+ "strip-ansi": "^6.0.0",
+ "wcwidth": "^1.0.1"
+ }
+ },
"os-homedir": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
@@ -9128,6 +9619,15 @@
"lowercase-keys": "^2.0.0"
}
},
+ "restore-cursor": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
+ "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
+ "requires": {
+ "onetime": "^5.1.0",
+ "signal-exit": "^3.0.2"
+ }
+ },
"rimraf": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
@@ -9136,6 +9636,19 @@
"glob": "^7.1.3"
}
},
+ "run-async": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz",
+ "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ=="
+ },
+ "rxjs": {
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.4.tgz",
+ "integrity": "sha512-h5M3Hk78r6wAheJF0a5YahB1yRQKCsZ4MsGdZ5O9ETbVtjPcScGfrMmoOq7EBsCRzd4BDkvDJ7ogP8Sz5tTFiQ==",
+ "requires": {
+ "tslib": "^2.1.0"
+ }
+ },
"safe-buffer": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
@@ -9451,6 +9964,19 @@
"resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz",
"integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w=="
},
+ "through": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+ "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
+ },
+ "tmp": {
+ "version": "0.0.33",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
+ "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
+ "requires": {
+ "os-tmpdir": "~1.0.2"
+ }
+ },
"tmpl": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz",
@@ -9487,6 +10013,14 @@
"punycode": "^2.1.1"
}
},
+ "transliteration": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/transliteration/-/transliteration-2.2.0.tgz",
+ "integrity": "sha512-o29GDWtecNoK4TNfnJQesGluFPiza+U8NoiKrErU8eTNlVgma6w1LV/tTiGo+waFLkhtL9WxrW0lXhZKmm7msQ==",
+ "requires": {
+ "yargs": "^16.1.0"
+ }
+ },
"triple-beam": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz",
@@ -9611,6 +10145,14 @@
"makeerror": "1.0.12"
}
},
+ "wcwidth": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
+ "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=",
+ "requires": {
+ "defaults": "^1.0.3"
+ }
+ },
"webidl-conversions": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz",
diff --git a/package.json b/package.json
index 57ad993f..0e8af9ef 100644
--- a/package.json
+++ b/package.json
@@ -4,11 +4,13 @@
"channels:validate": "node scripts/commands/channels/validate.js",
"channels:lint": "node scripts/commands/channels/lint.js",
"channels:parse": "node scripts/commands/channels/parse.js",
+ "channels:editor": "node scripts/commands/channels/editor.js",
"queue:create": "node scripts/commands/queue/create.js",
"cluster:load": "node scripts/commands/cluster/load.js",
"programs:save": "node scripts/commands/programs/save.js",
"guides:update": "node scripts/commands/guides/update.js",
"api:update": "node scripts/commands/api/update.js",
+ "api:load": "mkdir -p scripts/data && curl -L -o scripts/data/channels.json https://iptv-org.github.io/api/channels.json",
"readme:update": "node scripts/commands/readme/update.js",
"test": "npx jest --runInBand",
"test:commands": "npx jest --runInBand -- commands",
@@ -29,24 +31,27 @@
"cheerio": "^1.0.0-rc.10",
"commander": "^8.2.0",
"csv-parser": "^3.0.0",
- "dayjs": "^1.10.4",
- "epg-grabber": "^0.20.0",
+ "dayjs": "^1.10.8",
+ "epg-grabber": "^0.23.0",
"epg-parser": "^0.1.6",
"form-data": "^4.0.0",
"fs-extra": "^10.0.1",
"glob": "^7.2.0",
"iconv-lite": "^0.4.24",
+ "inquirer": "^8.2.0",
"jest": "^27.3.1",
"libxmljs": "^0.19.7",
"lodash": "^4.17.21",
"markdown-include": "^0.4.3",
"mockdate": "^3.0.5",
"nedb-promises": "^5.0.3",
+ "node-cleanup": "^2.1.2",
"parse-duration": "^1.0.0",
"pdf-parse": "^1.1.1",
"signale": "^1.4.0",
"srcset": "^4.0.0",
"tabletojson": "^2.0.7",
+ "transliteration": "^2.2.0",
"wildcard-match": "^5.1.2"
}
}
diff --git a/scripts/commands/channels/editor.js b/scripts/commands/channels/editor.js
new file mode 100644
index 00000000..94e37caf
--- /dev/null
+++ b/scripts/commands/channels/editor.js
@@ -0,0 +1,117 @@
+const { api, parser, xml, file, logger } = require('../../core')
+const { transliterate } = require('transliteration')
+const nodeCleanup = require('node-cleanup')
+const { program } = require('commander')
+const inquirer = require('inquirer')
+
+program
+ .requiredOption('-i, --input ', 'Load channels from the file')
+ .option('-c, --country ', 'Source country', 'us')
+ .parse(process.argv)
+
+const options = program.opts()
+const defaultCountry = options.country
+const newLabel = ` [new]`
+
+let site
+let channels = []
+
+async function main() {
+ await api.channels.load()
+ let result = await parser.parseChannels(options.input)
+ site = result.site
+ channels = result.channels
+ for (const channel of channels) {
+ if (channel.xmltv_id) continue
+ let choices = await getOptions(channel)
+ const question = {
+ name: 'option',
+ message: `Choose an option:`,
+ type: 'list',
+ choices,
+ pageSize: 10
+ }
+ await inquirer.prompt(question).then(async selected => {
+ switch (selected.option) {
+ case 'Overwrite...':
+ const input = await getInput(channel)
+ channel.xmltv_id = input.xmltv_id
+ break
+ case 'Skip...':
+ channel.xmltv_id = '-'
+ break
+ default:
+ const [name, xmltv_id] = selected.option
+ .replace(/ \[.*\]/, '')
+ .split('|')
+ .map(i => i.trim().replace(newLabel, ''))
+ channel.xmltv_id = xmltv_id
+ break
+ }
+ })
+ }
+}
+
+main()
+
+function save() {
+ const output = xml.create(channels, site)
+
+ file.writeSync(options.input, output)
+
+ logger.info(`\nFile '${options.input}' successfully saved`)
+}
+
+nodeCleanup(() => {
+ save()
+})
+
+async function getInput(channel) {
+ const name = channel.name.trim()
+ const input = await inquirer.prompt([
+ {
+ name: 'xmltv_id',
+ message: ' ID:',
+ type: 'input',
+ default: generateCode(name, defaultCountry)
+ }
+ ])
+
+ return { name, xmltv_id: input['xmltv_id'] }
+}
+
+async function getOptions(channel) {
+ const channels = await api.channels.all()
+ const similar = await getSimilar(channels, channel)
+ let variants = []
+ variants.push(`${channel.name.trim()} | ${generateCode(channel.name, defaultCountry)}${newLabel}`)
+ similar.forEach(i => {
+ variants.push(`${i.name} | ${i.id} [api]`)
+ })
+ variants.push(`Overwrite...`)
+ variants.push(`Skip...`)
+
+ return variants
+}
+
+async function getSimilar(list, channel) {
+ return list.filter(i =>
+ i.name
+ .toLowerCase()
+ .replace(/\s|-|:/gi, '')
+ .startsWith(
+ channel.name
+ .replace(/(\s|-|:)/gi, '')
+ .slice(0, 8)
+ .toLowerCase()
+ )
+ )
+}
+
+function generateCode(name, country) {
+ const id = transliterate(name)
+ .replace(/\+/gi, 'Plus')
+ .replace(/[^a-z\d]+/gi, '')
+
+ return `${id}.${country}`
+}
diff --git a/scripts/commands/channels/lint.js b/scripts/commands/channels/lint.js
index c14453a9..0436f6a4 100644
--- a/scripts/commands/channels/lint.js
+++ b/scripts/commands/channels/lint.js
@@ -10,7 +10,7 @@ const xsd = `
-
+
diff --git a/scripts/commands/channels/parse.js b/scripts/commands/channels/parse.js
index 11b76958..0200de32 100644
--- a/scripts/commands/channels/parse.js
+++ b/scripts/commands/channels/parse.js
@@ -24,7 +24,12 @@ async function main() {
if (isPromise(channels)) {
channels = await channels
}
- channels = _.sortBy(channels, 'xmltv_id')
+ channels = channels.map(c => {
+ c.lang = c.lang || 'en'
+
+ return c
+ })
+ channels = _.sortBy(channels, ['lang', 'xmltv_id'])
const dir = file.dirname(options.config)
const outputFilepath = options.output || `${dir}/${config.site}.channels.xml`
@@ -33,7 +38,7 @@ async function main() {
await file.write(outputFilepath, output)
- logger.info(`File '${output}' successfully saved`)
+ logger.info(`File '${outputFilepath}' successfully saved`)
}
main()
diff --git a/scripts/commands/guides/update.js b/scripts/commands/guides/update.js
index d40a28aa..f7de932e 100644
--- a/scripts/commands/guides/update.js
+++ b/scripts/commands/guides/update.js
@@ -11,6 +11,7 @@ async function main() {
await db.programs.load()
await api.channels.load()
+ let total = 0
const grouped = groupByGroup(await loadQueue())
for (const key in grouped) {
let channels = {}
@@ -35,6 +36,7 @@ async function main() {
channels = Object.values(channels)
channels = _.sortBy(channels, 'xmltv_id')
programs = _.sortBy(programs, ['channel', 'start'])
+ total += programs.length
const filepath = `${PUBLIC_DIR}/guides/${key}.epg.xml`
logger.info(`Creating "${filepath}"...`)
@@ -42,7 +44,12 @@ async function main() {
await file.create(filepath, output)
}
- logger.info(`Done`)
+ if (!total) {
+ logger.error('\nError: No programs found')
+ process.exit(1)
+ } else {
+ logger.info(`Done`)
+ }
}
main()
diff --git a/scripts/commands/queue/create.js b/scripts/commands/queue/create.js
index bdba5f56..9ac95184 100644
--- a/scripts/commands/queue/create.js
+++ b/scripts/commands/queue/create.js
@@ -48,20 +48,9 @@ async function createQueue() {
const [__, region] = filename.match(/_([a-z-]+)\.channels\.xml/i) || [null, null]
const groupId = `${region}/${site}`
for (const item of items) {
- if (!item.site || !item.site_id || !item.xmltv_id) continue
+ if (!item.site || !item.xmltv_id) continue
const channel = api.channels.find({ id: item.xmltv_id })
- if (!channel) {
- await logError(groupId, {
- xmltv_id: item.xmltv_id,
- site: item.site,
- site_id: item.site_id,
- lang: item.lang,
- date: undefined,
- error: 'The channel has the wrong xmltv_id'
- })
- continue
- }
-
+ if (!channel) continue
for (const d of dates) {
const dString = d.toJSON()
const key = `${item.site}:${item.lang}:${item.xmltv_id}:${dString}`
@@ -123,12 +112,3 @@ function split(arr, n) {
}
return result
}
-
-async function logError(key, data) {
- const filepath = `${LOGS_DIR}/errors/${key}.log`
- if (!(await file.exists(filepath))) {
- await file.create(filepath)
- }
-
- await file.append(filepath, JSON.stringify(data) + '\r\n')
-}
diff --git a/scripts/core/api.js b/scripts/core/api.js
index 97f2ad21..575dad99 100644
--- a/scripts/core/api.js
+++ b/scripts/core/api.js
@@ -16,6 +16,10 @@ class API {
find(query) {
return _.find(this.collection, query)
}
+
+ all() {
+ return this.collection
+ }
}
const api = {}
diff --git a/scripts/core/file.js b/scripts/core/file.js
index d191cc84..d3c7b384 100644
--- a/scripts/core/file.js
+++ b/scripts/core/file.js
@@ -48,6 +48,10 @@ file.write = function (filepath, data = '') {
return fs.writeFile(path.resolve(filepath), data, { encoding: 'utf8' }).catch(console.error)
}
+file.writeSync = function (filepath, data = '') {
+ return fs.writeFileSync(path.resolve(filepath), data, { encoding: 'utf8' })
+}
+
file.clear = async function (filepath) {
if (await file.exists(filepath)) return file.write(filepath, '')
return true
diff --git a/scripts/core/parser.js b/scripts/core/parser.js
index e320bf70..892db44c 100644
--- a/scripts/core/parser.js
+++ b/scripts/core/parser.js
@@ -4,11 +4,10 @@ const grabber = require('epg-grabber')
const parser = {}
-parser.parseChannels = async function(filepath) {
+parser.parseChannels = async function (filepath) {
const content = await file.read(filepath)
- const channels = grabber.parseChannels(content)
- return channels
+ return grabber.parseChannels(content)
}
parser.parseLogs = async function (filepath) {
diff --git a/sites/9tv.co.il/9tv.co.il.config.js b/sites/9tv.co.il/9tv.co.il.config.js
new file mode 100644
index 00000000..32c77e37
--- /dev/null
+++ b/sites/9tv.co.il/9tv.co.il.config.js
@@ -0,0 +1,68 @@
+const cheerio = require('cheerio')
+const dayjs = require('dayjs')
+const utc = require('dayjs/plugin/utc')
+const timezone = require('dayjs/plugin/timezone')
+const customParseFormat = require('dayjs/plugin/customParseFormat')
+
+dayjs.extend(utc)
+dayjs.extend(timezone)
+dayjs.extend(customParseFormat)
+
+module.exports = {
+ site: '9tv.co.il',
+ url: function ({ date }) {
+ return `https://www.9tv.co.il/BroadcastSchedule/getBrodcastSchedule?date=${date.format(
+ 'DD/MM/YYYY 00:00:00'
+ )}`
+ },
+ parser: function ({ content, date }) {
+ const programs = []
+ const items = parseItems(content)
+ items.forEach(item => {
+ const prev = programs[programs.length - 1]
+ const $item = cheerio.load(item)
+ const start = parseStart($item, date)
+ if (prev) prev.stop = start
+ const stop = start.add(1, 'h')
+ programs.push({
+ title: parseTitle($item),
+ icon: parseIcon($item),
+ description: parseDescription($item),
+ start,
+ stop
+ })
+ })
+
+ return programs
+ }
+}
+
+function parseStart($item, date) {
+ let time = $item('a > div.guide_list_time').text().trim()
+
+ return dayjs.tz(`${date.format('YYYY-MM-DD')} ${time}`, 'YYYY-MM-DD HH:mm', 'Asia/Jerusalem')
+}
+
+function parseIcon($item) {
+ const backgroundImage = $item('a > div.guide_info_group > div.guide_info_pict').css(
+ 'background-image'
+ )
+ if (!backgroundImage) return null
+ const [_, relativePath] = backgroundImage.match(/url\((.*)\)/) || [null, null]
+
+ return relativePath ? `https://www.9tv.co.il${relativePath}` : null
+}
+
+function parseDescription($item) {
+ return $item('a > div.guide_info_group > div.guide_txt_group > div').text().trim()
+}
+
+function parseTitle($item) {
+ return $item('a > div.guide_info_group > div.guide_txt_group > h3').text().trim()
+}
+
+function parseItems(content) {
+ const $ = cheerio.load(content)
+
+ return $('li').toArray()
+}
diff --git a/sites/9tv.co.il/9tv.co.il.test.js b/sites/9tv.co.il/9tv.co.il.test.js
new file mode 100644
index 00000000..862194e5
--- /dev/null
+++ b/sites/9tv.co.il/9tv.co.il.test.js
@@ -0,0 +1,56 @@
+// npx epg-grabber --config=sites/9tv.co.il/9tv.co.il.config.js --channels=sites/9tv.co.il/9tv.co.il_il.channels.xml --output=guide.xml --days=2
+
+const { parser, url } = require('./9tv.co.il.config.js')
+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('2022-03-06', 'YYYY-MM-DD').startOf('d')
+const channel = {
+ site_id: '#',
+ xmltv_id: 'Channel9.il'
+}
+
+it('can generate valid url', () => {
+ expect(url({ date })).toBe(
+ 'https://www.9tv.co.il/BroadcastSchedule/getBrodcastSchedule?date=06/03/2022 00:00:00'
+ )
+})
+
+it('can parse response', () => {
+ const content = ` 06:30
ะกะปะตะฟะฐั
ะะฝะฐ ะฝะต ะพัะตะฝั ะปัะฑะธั ะณะพะฒะพัะธัั ะพ ัะตะฑะต ะธะปะธ ะพ ัะพะผ, ะบัะพ ะธ ะทะฐัะตะผ ะบ ะฝะตะน ะพะฑัะฐัะฐะตััั. ะะธะฒะตั ัะตะดะธะฝะตะฝะฝะพ, ะฒ ะณะปััะธ. ะะพ ัะตั
, ะบัะพ ะฟัะธั
ะพะดะธั -ะฟัะธะฝะธะผะฐะตั. ะะฝะฐ ะฒะธะดะธั ััะดัะฑั.
09:10
ะัะตะป ะธ ัะตัะบะฐ. ะะพััะบะพะน ัะตะทะพะฝ
ะัะตะป ะธ ัะตัะบะฐ. ะะพััะบะพะน ัะตะทะพะฝ. ะะตะดััะธะต -ะะปะธะฝะฐ ะัััะพะฒัะบะฐั ะธ ะะพะปั ะกะตัะณะฐ.
`
+ const result = parser({ content, date }).map(p => {
+ p.start = p.start.toJSON()
+ p.stop = p.stop.toJSON()
+ return p
+ })
+
+ expect(result).toMatchObject([
+ {
+ start: '2022-03-06T04:30:00.000Z',
+ stop: '2022-03-06T07:10:00.000Z',
+ title: `ะกะปะตะฟะฐั`,
+ icon: 'https://www.9tv.co.il/download/pictures/img_id=8484.jpg',
+ description:
+ 'ะะฝะฐ ะฝะต ะพัะตะฝั ะปัะฑะธั ะณะพะฒะพัะธัั ะพ ัะตะฑะต ะธะปะธ ะพ ัะพะผ, ะบัะพ ะธ ะทะฐัะตะผ ะบ ะฝะตะน ะพะฑัะฐัะฐะตััั. ะะธะฒะตั ัะตะดะธะฝะตะฝะฝะพ, ะฒ ะณะปััะธ. ะะพ ัะตั
, ะบัะพ ะฟัะธั
ะพะดะธั -ะฟัะธะฝะธะผะฐะตั. ะะฝะฐ ะฒะธะดะธั ััะดัะฑั.'
+ },
+ {
+ start: '2022-03-06T07:10:00.000Z',
+ stop: '2022-03-06T08:10:00.000Z',
+ icon: 'https://www.9tv.co.il/download/pictures/img_id=23694.jpg',
+ title: `ะัะตะป ะธ ัะตัะบะฐ. ะะพััะบะพะน ัะตะทะพะฝ`,
+ description: 'ะัะตะป ะธ ัะตัะบะฐ. ะะพััะบะพะน ัะตะทะพะฝ. ะะตะดััะธะต -ะะปะธะฝะฐ ะัััะพะฒัะบะฐั ะธ ะะพะปั ะกะตัะณะฐ.'
+ }
+ ])
+})
+
+it('can handle empty guide', () => {
+ const result = parser({
+ date,
+ channel,
+ content: ``
+ })
+ expect(result).toMatchObject([])
+})
diff --git a/sites/9tv.co.il/9tv.co.il_il.channels.xml b/sites/9tv.co.il/9tv.co.il_il.channels.xml
new file mode 100644
index 00000000..509a2f5e
--- /dev/null
+++ b/sites/9tv.co.il/9tv.co.il_il.channels.xml
@@ -0,0 +1,6 @@
+
+
+
+ 9 ะบะฐะฝะฐะป
+
+
diff --git a/sites/allente.se/allente.se_dk.channels.xml b/sites/allente.se/allente.se_dk.channels.xml
index b0d4c229..66183732 100644
--- a/sites/allente.se/allente.se_dk.channels.xml
+++ b/sites/allente.se/allente.se_dk.channels.xml
@@ -20,7 +20,7 @@
DR 2
DR Ramasjang
E! Europe
- EuroNews English
+ EuroNews English
Eurosport 2 Danmark
God TV Scandinavia
Kanal 4
diff --git a/sites/allente.se/allente.se_no.channels.xml b/sites/allente.se/allente.se_no.channels.xml
index ae2e9248..efbeda2c 100644
--- a/sites/allente.se/allente.se_no.channels.xml
+++ b/sites/allente.se/allente.se_no.channels.xml
@@ -11,7 +11,7 @@
Disney Junior Scandinavia
DR 2
E! Europe
- EuroNews English
+ EuroNews English
Eurosport 1 Norge
Eurosport Norge
FEM
diff --git a/sites/allente.se/allente.se_se.channels.xml b/sites/allente.se/allente.se_se.channels.xml
index d16c4512..122e0b74 100644
--- a/sites/allente.se/allente.se_se.channels.xml
+++ b/sites/allente.se/allente.se_se.channels.xml
@@ -30,7 +30,7 @@
DR 2
DR Ramasjang
E! Europe
- EuroNews English
+ EuroNews English
Eurosport 1 Sverige
Eurosport 2 Sverige
Godare
diff --git a/sites/artonline.tv/artonline.tv.config.js b/sites/artonline.tv/artonline.tv.config.js
new file mode 100644
index 00000000..4aadf797
--- /dev/null
+++ b/sites/artonline.tv/artonline.tv.config.js
@@ -0,0 +1,65 @@
+const customParseFormat = require('dayjs/plugin/customParseFormat')
+const timezone = require('dayjs/plugin/timezone')
+const utc = require('dayjs/plugin/utc')
+const dayjs = require('dayjs')
+
+dayjs.extend(customParseFormat)
+dayjs.extend(timezone)
+dayjs.extend(utc)
+
+module.exports = {
+ site: 'artonline.tv',
+ url: function ({ channel }) {
+ return `https://www.artonline.tv/Home/Tvlist${channel.site_id}`
+ },
+ request: {
+ method: 'POST',
+ headers: {
+ 'content-type': 'application/x-www-form-urlencoded'
+ },
+ data: function({ date }) {
+ const diff = date.diff(dayjs.utc().startOf('d'), 'd')
+ const params = new URLSearchParams()
+ params.append('objId', diff)
+
+ return params
+ }
+ },
+ parser: function ({ content }) {
+ const programs = []
+ if(!content) return programs
+ const items = JSON.parse(content)
+ items.forEach(item => {
+ const icon = parseIcon(item)
+ const start = parseStart(item)
+ const duration = parseDuration(item)
+ const stop = start.add(duration, 's')
+ programs.push({
+ title: item.title,
+ description: item.description,
+ icon,
+ start,
+ stop
+ })
+ })
+
+ return programs
+ }
+}
+
+function parseStart(item) {
+ const [_, M, D, YYYY] = item.adddate.match(/(\d+)\/(\d+)\/(\d+) /)
+ const [HH, mm] = item.start_Time.split(':')
+
+ return dayjs(`${YYYY}-${M}-${D}T${HH}:${mm}:00`, 'YYYY-M-DTHH:mm:ss', 'Asia/Riyadh')
+}
+
+function parseDuration(item) {
+ const [__, HH, mm, ss] = item.duration.match(/(\d+):(\d+):(\d+)/)
+
+ return parseInt(HH) * 3600 + parseInt(mm) * 60 + parseInt(ss)
+}
+
+function parseIcon(item) {
+ return item.thumbnail ? `https://www.artonline.tv${item.thumbnail}` : null
+}
diff --git a/sites/artonline.tv/artonline.tv.test.js b/sites/artonline.tv/artonline.tv.test.js
new file mode 100644
index 00000000..cfd93357
--- /dev/null
+++ b/sites/artonline.tv/artonline.tv.test.js
@@ -0,0 +1,65 @@
+// npx epg-grabber --config=sites/artonline.tv/artonline.tv.config.js --channels=sites/artonline.tv/artonline.tv_sa.channels.xml --output=guide.xml --days=2
+
+const { parser, url, request } = require('./artonline.tv.config.js')
+const dayjs = require('dayjs')
+const utc = require('dayjs/plugin/utc')
+const customParseFormat = require('dayjs/plugin/customParseFormat')
+dayjs.extend(customParseFormat)
+dayjs.extend(utc)
+
+const channel = {
+ site_id: 'Aflam2',
+ xmltv_id: 'ARTAflam2.sa'
+}
+
+it('can generate valid url', () => {
+ expect(url({ channel })).toBe('https://www.artonline.tv/Home/TvlistAflam2')
+})
+
+it('can generate valid request method', () => {
+ expect(request.method).toBe('POST')
+})
+
+it('can generate valid request headers', () => {
+ expect(request.headers).toMatchObject({
+ 'content-type': 'application/x-www-form-urlencoded'
+ })
+})
+
+it('can generate valid request data for today', () => {
+ const date = dayjs.utc().startOf('d')
+ const data = request.data({ date })
+ expect(data.get('objId')).toBe('0')
+})
+
+it('can generate valid request data for tomorrow', () => {
+ const date = dayjs.utc().startOf('d').add(1, 'd')
+ const data = request.data({ date })
+ expect(data.get('objId')).toBe('1')
+})
+
+it('can parse response', () => {
+ const content = `[{"id":158963,"eventid":null,"duration":"01:34:00","lang":"Arabic","title":"ุงูุฑุงูุตู ู ุงูุณูุงุณู","description":"ุชูุฑุฑ ุงูุฑุงูุตู ุณูููุง ุงูุดุงุก ุฏุงุฑ ุญุถุงูู ููุฃุทูุงู ุงููุชุงู
ู ู ุนูุฏู
ุง ุชุชูุฏู
ุจู
ุดูุฑุนูุง ููู
ุณุฆูู ูุฑูุถ ูุชุชุญุฏุงู ุ ุชูุฌุฃ ูููุฒูุฑ ุนุจุฏ ุงูุญู
ูุฏ ุฑุฃูุช ุชุฑุจุทู ุจูุง ุนูุงูุฉ ูุฏูู
ุฉ ุ ูุฎุดู ุนูู ู
ุฑูุฒู ู ูุฑูุถ ู
ุณุงุนุฏุชูุง ูุชูุฑุฑ ูุชุงุจุฉ ู
ุฐูุฑุงุชูุง ุจู
ุณุงุนุฏุฉ ุฃุญุฏ ุงูุตุญูููู ุ ูุชุฎูู ุนุจุฏ ุงูุญู
ูุฏ ู ุงูู
ุณุฆูููู ุซู
ููุงุฌุฃ ุนุจุฏ ุงูุญู
ูุฏ ุจุญุตูู ุณูููุง ุนูู ุงูู
ูุงููู ููู
ุดูุฑุน ู ุงูุจุฏุก ูู ุชูููุฐู ู ุฐูู ูุนูุงูุชูุง ุจุฃุญุฏ ูุจุงุฑ ุงูู
ุณุฆูููู .","thumbnail":"/UploadImages/Channel/ARTAFLAM1/03/AlRaqesaWaAlSeyasi.jpg","image":"0","start_Time":"00:30","adddate":"3/4/2022 12:00:00 AM","repeat1":null,"iD_genre":0,"iD_Show_Type":0,"iD_Channel":77,"iD_country":0,"iD_rating":0,"end_time":"02:04","season_Number":0,"epoisode_Number":0,"hasCatchup":0,"cmsid":0,"containerID":0,"imagePath":"../../UploadImages/Channel/ARTAFLAM1/3/","youtube":"0","published_at":"0","directed_by":"0","composition":"0","cast":"0","timeShow":null,"short_description":"ุชูุฑุฑ ุงูุฑุงูุตู ุณูููุง ุงูุดุงุก ุฏุงุฑ ุญุถุงูู ููุฃุทูุงู ุงููุชุงู
ู ู ุนูุฏู
ุง ุชุชูุฏู
ุจู
ุดูุฑุนูุง ููู
ุณุฆูู ูุฑูุถ ูุชุชุญุฏุงู ุ ุชูุฌุฃ ูููุฒูุฑ ุนุจุฏ ุงูุญู
ูุฏ ุฑุฃูุช ุชุฑุจุทู ุจูุง ุนูุงูุฉ ูุฏูู
ุฉ ุ ูุฎุดู ุนูู ู
ุฑูุฒู ู ูุฑูุถ ู
ุณุงุนุฏุชูุง ูุชูุฑุฑ ูุชุงุจุฉ ู
ุฐูุฑุงุชูุง ุจู
ุณุงุนุฏุฉ ุฃุญุฏ ุงูุตุญูููู ุ ูุชุฎูู ุนุจุฏ ุงูุญู
ูุฏ ู ุงูู
ุณุฆูููู ุซู
ููุงุฌุฃ ุนุจุฏ ุงูุญู
ูุฏ ุจุญุตูู ุณูููุง ุนูู ุงูู
ูุงููู ููู
ุดูุฑุน ู ุงูุจุฏุก ูู ุชูููุฐู ู ุฐูู ูุนูุงูุชูุง ุจุฃุญุฏ ูุจุงุฑ ุงูู
ุณุฆูููู .","seOdescription":null,"tagseo":null,"channel_name":null,"pathimage":null,"pathThumbnail":null}]`
+ const result = parser({ content }).map(p => {
+ p.start = p.start.toJSON()
+ p.stop = p.stop.toJSON()
+ return p
+ })
+
+ expect(result).toMatchObject([
+ {
+ start: '2022-03-03T21:30:00.000Z',
+ stop: '2022-03-03T23:04:00.000Z',
+ title: 'ุงูุฑุงูุตู ู ุงูุณูุงุณู',
+ description: 'ุชูุฑุฑ ุงูุฑุงูุตู ุณูููุง ุงูุดุงุก ุฏุงุฑ ุญุถุงูู ููุฃุทูุงู ุงููุชุงู
ู ู ุนูุฏู
ุง ุชุชูุฏู
ุจู
ุดูุฑุนูุง ููู
ุณุฆูู ูุฑูุถ ูุชุชุญุฏุงู ุ ุชูุฌุฃ ูููุฒูุฑ ุนุจุฏ ุงูุญู
ูุฏ ุฑุฃูุช ุชุฑุจุทู ุจูุง ุนูุงูุฉ ูุฏูู
ุฉ ุ ูุฎุดู ุนูู ู
ุฑูุฒู ู ูุฑูุถ ู
ุณุงุนุฏุชูุง ูุชูุฑุฑ ูุชุงุจุฉ ู
ุฐูุฑุงุชูุง ุจู
ุณุงุนุฏุฉ ุฃุญุฏ ุงูุตุญูููู ุ ูุชุฎูู ุนุจุฏ ุงูุญู
ูุฏ ู ุงูู
ุณุฆูููู ุซู
ููุงุฌุฃ ุนุจุฏ ุงูุญู
ูุฏ ุจุญุตูู ุณูููุง ุนูู ุงูู
ูุงููู ููู
ุดูุฑุน ู ุงูุจุฏุก ูู ุชูููุฐู ู ุฐูู ูุนูุงูุชูุง ุจุฃุญุฏ ูุจุงุฑ ุงูู
ุณุฆูููู .',
+ icon: 'https://www.artonline.tv/UploadImages/Channel/ARTAFLAM1/03/AlRaqesaWaAlSeyasi.jpg'
+ }
+ ])
+})
+
+it('can handle empty guide', () => {
+ const result = parser({
+ content: ''
+ })
+ expect(result).toMatchObject([])
+})
diff --git a/sites/artonline.tv/artonline.tv_sa.channels.xml b/sites/artonline.tv/artonline.tv_sa.channels.xml
new file mode 100644
index 00000000..abd0989f
--- /dev/null
+++ b/sites/artonline.tv/artonline.tv_sa.channels.xml
@@ -0,0 +1,10 @@
+
+
+
+ ART Aflam 1
+ ART Aflam 2
+ ART Cinema
+ ART Hekayat
+ ART Hekayat 2
+
+
\ No newline at end of file
diff --git a/sites/canalplus-afrique.com/canalplus-afrique.com_bf.channels.xml b/sites/canalplus-afrique.com/canalplus-afrique.com_bf.channels.xml
index e94158b2..4ce71f8e 100644
--- a/sites/canalplus-afrique.com/canalplus-afrique.com_bf.channels.xml
+++ b/sites/canalplus-afrique.com/canalplus-afrique.com_bf.channels.xml
@@ -89,10 +89,10 @@
Elmouritania
EMCI TV Afrique
Equinoxe TV
- ES1
+ ES1
Espace TV
E-Tรฉlรฉ Benin
- EuroNews Franรงais
+ EuroNews Franรงais
Eurosport 1 France
Eurosport 2 France
Evasiรณn Guinรฉe
diff --git a/sites/canalplus-afrique.com/canalplus-afrique.com_bi.channels.xml b/sites/canalplus-afrique.com/canalplus-afrique.com_bi.channels.xml
index e94158b2..4ce71f8e 100644
--- a/sites/canalplus-afrique.com/canalplus-afrique.com_bi.channels.xml
+++ b/sites/canalplus-afrique.com/canalplus-afrique.com_bi.channels.xml
@@ -89,10 +89,10 @@
Elmouritania
EMCI TV Afrique
Equinoxe TV
- ES1
+ ES1
Espace TV
E-Tรฉlรฉ Benin
- EuroNews Franรงais
+ EuroNews Franรงais
Eurosport 1 France
Eurosport 2 France
Evasiรณn Guinรฉe
diff --git a/sites/canalplus-afrique.com/canalplus-afrique.com_bj.channels.xml b/sites/canalplus-afrique.com/canalplus-afrique.com_bj.channels.xml
index e94158b2..4ce71f8e 100644
--- a/sites/canalplus-afrique.com/canalplus-afrique.com_bj.channels.xml
+++ b/sites/canalplus-afrique.com/canalplus-afrique.com_bj.channels.xml
@@ -89,10 +89,10 @@
Elmouritania
EMCI TV Afrique
Equinoxe TV
- ES1
+ ES1
Espace TV
E-Tรฉlรฉ Benin
- EuroNews Franรงais
+ EuroNews Franรงais
Eurosport 1 France
Eurosport 2 France
Evasiรณn Guinรฉe
diff --git a/sites/canalplus-afrique.com/canalplus-afrique.com_cd.channels.xml b/sites/canalplus-afrique.com/canalplus-afrique.com_cd.channels.xml
index e94158b2..4ce71f8e 100644
--- a/sites/canalplus-afrique.com/canalplus-afrique.com_cd.channels.xml
+++ b/sites/canalplus-afrique.com/canalplus-afrique.com_cd.channels.xml
@@ -89,10 +89,10 @@
Elmouritania
EMCI TV Afrique
Equinoxe TV
- ES1
+ ES1
Espace TV
E-Tรฉlรฉ Benin
- EuroNews Franรงais
+ EuroNews Franรงais
Eurosport 1 France
Eurosport 2 France
Evasiรณn Guinรฉe
diff --git a/sites/canalplus-afrique.com/canalplus-afrique.com_cf.channels.xml b/sites/canalplus-afrique.com/canalplus-afrique.com_cf.channels.xml
index e94158b2..4ce71f8e 100644
--- a/sites/canalplus-afrique.com/canalplus-afrique.com_cf.channels.xml
+++ b/sites/canalplus-afrique.com/canalplus-afrique.com_cf.channels.xml
@@ -89,10 +89,10 @@
Elmouritania
EMCI TV Afrique
Equinoxe TV
- ES1
+ ES1
Espace TV
E-Tรฉlรฉ Benin
- EuroNews Franรงais
+ EuroNews Franรงais
Eurosport 1 France
Eurosport 2 France
Evasiรณn Guinรฉe
diff --git a/sites/canalplus-afrique.com/canalplus-afrique.com_cg.channels.xml b/sites/canalplus-afrique.com/canalplus-afrique.com_cg.channels.xml
index e94158b2..4ce71f8e 100644
--- a/sites/canalplus-afrique.com/canalplus-afrique.com_cg.channels.xml
+++ b/sites/canalplus-afrique.com/canalplus-afrique.com_cg.channels.xml
@@ -89,10 +89,10 @@
Elmouritania
EMCI TV Afrique
Equinoxe TV
- ES1
+ ES1
Espace TV
E-Tรฉlรฉ Benin
- EuroNews Franรงais
+ EuroNews Franรงais
Eurosport 1 France
Eurosport 2 France
Evasiรณn Guinรฉe
diff --git a/sites/canalplus-afrique.com/canalplus-afrique.com_ci.channels.xml b/sites/canalplus-afrique.com/canalplus-afrique.com_ci.channels.xml
index e94158b2..4ce71f8e 100644
--- a/sites/canalplus-afrique.com/canalplus-afrique.com_ci.channels.xml
+++ b/sites/canalplus-afrique.com/canalplus-afrique.com_ci.channels.xml
@@ -89,10 +89,10 @@
Elmouritania
EMCI TV Afrique
Equinoxe TV
- ES1
+ ES1
Espace TV
E-Tรฉlรฉ Benin
- EuroNews Franรงais
+ EuroNews Franรงais
Eurosport 1 France
Eurosport 2 France
Evasiรณn Guinรฉe
diff --git a/sites/canalplus-afrique.com/canalplus-afrique.com_cm.channels.xml b/sites/canalplus-afrique.com/canalplus-afrique.com_cm.channels.xml
index e94158b2..4ce71f8e 100644
--- a/sites/canalplus-afrique.com/canalplus-afrique.com_cm.channels.xml
+++ b/sites/canalplus-afrique.com/canalplus-afrique.com_cm.channels.xml
@@ -89,10 +89,10 @@
Elmouritania
EMCI TV Afrique
Equinoxe TV
- ES1
+ ES1
Espace TV
E-Tรฉlรฉ Benin
- EuroNews Franรงais
+ EuroNews Franรงais
Eurosport 1 France
Eurosport 2 France
Evasiรณn Guinรฉe
diff --git a/sites/canalplus-afrique.com/canalplus-afrique.com_cv.channels.xml b/sites/canalplus-afrique.com/canalplus-afrique.com_cv.channels.xml
index e94158b2..4ce71f8e 100644
--- a/sites/canalplus-afrique.com/canalplus-afrique.com_cv.channels.xml
+++ b/sites/canalplus-afrique.com/canalplus-afrique.com_cv.channels.xml
@@ -89,10 +89,10 @@
Elmouritania
EMCI TV Afrique
Equinoxe TV
- ES1
+ ES1
Espace TV
E-Tรฉlรฉ Benin
- EuroNews Franรงais
+ EuroNews Franรงais
Eurosport 1 France
Eurosport 2 France
Evasiรณn Guinรฉe
diff --git a/sites/canalplus-afrique.com/canalplus-afrique.com_dj.channels.xml b/sites/canalplus-afrique.com/canalplus-afrique.com_dj.channels.xml
index e94158b2..4ce71f8e 100644
--- a/sites/canalplus-afrique.com/canalplus-afrique.com_dj.channels.xml
+++ b/sites/canalplus-afrique.com/canalplus-afrique.com_dj.channels.xml
@@ -89,10 +89,10 @@
Elmouritania
EMCI TV Afrique
Equinoxe TV
- ES1
+ ES1
Espace TV
E-Tรฉlรฉ Benin
- EuroNews Franรงais
+ EuroNews Franรงais
Eurosport 1 France
Eurosport 2 France
Evasiรณn Guinรฉe
diff --git a/sites/canalplus-afrique.com/canalplus-afrique.com_ga.channels.xml b/sites/canalplus-afrique.com/canalplus-afrique.com_ga.channels.xml
index e94158b2..4ce71f8e 100644
--- a/sites/canalplus-afrique.com/canalplus-afrique.com_ga.channels.xml
+++ b/sites/canalplus-afrique.com/canalplus-afrique.com_ga.channels.xml
@@ -89,10 +89,10 @@
Elmouritania
EMCI TV Afrique
Equinoxe TV
- ES1
+ ES1
Espace TV
E-Tรฉlรฉ Benin
- EuroNews Franรงais
+ EuroNews Franรงais
Eurosport 1 France
Eurosport 2 France
Evasiรณn Guinรฉe
diff --git a/sites/canalplus-afrique.com/canalplus-afrique.com_gh.channels.xml b/sites/canalplus-afrique.com/canalplus-afrique.com_gh.channels.xml
index e94158b2..4ce71f8e 100644
--- a/sites/canalplus-afrique.com/canalplus-afrique.com_gh.channels.xml
+++ b/sites/canalplus-afrique.com/canalplus-afrique.com_gh.channels.xml
@@ -89,10 +89,10 @@
Elmouritania
EMCI TV Afrique
Equinoxe TV
- ES1
+ ES1
Espace TV
E-Tรฉlรฉ Benin
- EuroNews Franรงais
+ EuroNews Franรงais
Eurosport 1 France
Eurosport 2 France
Evasiรณn Guinรฉe
diff --git a/sites/canalplus-afrique.com/canalplus-afrique.com_gm.channels.xml b/sites/canalplus-afrique.com/canalplus-afrique.com_gm.channels.xml
index e94158b2..4ce71f8e 100644
--- a/sites/canalplus-afrique.com/canalplus-afrique.com_gm.channels.xml
+++ b/sites/canalplus-afrique.com/canalplus-afrique.com_gm.channels.xml
@@ -89,10 +89,10 @@
Elmouritania
EMCI TV Afrique
Equinoxe TV
- ES1
+ ES1
Espace TV
E-Tรฉlรฉ Benin
- EuroNews Franรงais
+ EuroNews Franรงais
Eurosport 1 France
Eurosport 2 France
Evasiรณn Guinรฉe
diff --git a/sites/canalplus-afrique.com/canalplus-afrique.com_gn.channels.xml b/sites/canalplus-afrique.com/canalplus-afrique.com_gn.channels.xml
index e94158b2..4ce71f8e 100644
--- a/sites/canalplus-afrique.com/canalplus-afrique.com_gn.channels.xml
+++ b/sites/canalplus-afrique.com/canalplus-afrique.com_gn.channels.xml
@@ -89,10 +89,10 @@
Elmouritania
EMCI TV Afrique
Equinoxe TV
- ES1
+ ES1
Espace TV
E-Tรฉlรฉ Benin
- EuroNews Franรงais
+ EuroNews Franรงais
Eurosport 1 France
Eurosport 2 France
Evasiรณn Guinรฉe
diff --git a/sites/canalplus-afrique.com/canalplus-afrique.com_gq.channels.xml b/sites/canalplus-afrique.com/canalplus-afrique.com_gq.channels.xml
index e94158b2..4ce71f8e 100644
--- a/sites/canalplus-afrique.com/canalplus-afrique.com_gq.channels.xml
+++ b/sites/canalplus-afrique.com/canalplus-afrique.com_gq.channels.xml
@@ -89,10 +89,10 @@
Elmouritania
EMCI TV Afrique
Equinoxe TV
- ES1
+ ES1
Espace TV
E-Tรฉlรฉ Benin
- EuroNews Franรงais
+ EuroNews Franรงais
Eurosport 1 France
Eurosport 2 France
Evasiรณn Guinรฉe
diff --git a/sites/canalplus-afrique.com/canalplus-afrique.com_gw.channels.xml b/sites/canalplus-afrique.com/canalplus-afrique.com_gw.channels.xml
index e94158b2..4ce71f8e 100644
--- a/sites/canalplus-afrique.com/canalplus-afrique.com_gw.channels.xml
+++ b/sites/canalplus-afrique.com/canalplus-afrique.com_gw.channels.xml
@@ -89,10 +89,10 @@
Elmouritania
EMCI TV Afrique
Equinoxe TV
- ES1
+ ES1
Espace TV
E-Tรฉlรฉ Benin
- EuroNews Franรงais
+ EuroNews Franรงais
Eurosport 1 France
Eurosport 2 France
Evasiรณn Guinรฉe
diff --git a/sites/canalplus-afrique.com/canalplus-afrique.com_ml.channels.xml b/sites/canalplus-afrique.com/canalplus-afrique.com_ml.channels.xml
index e94158b2..4ce71f8e 100644
--- a/sites/canalplus-afrique.com/canalplus-afrique.com_ml.channels.xml
+++ b/sites/canalplus-afrique.com/canalplus-afrique.com_ml.channels.xml
@@ -89,10 +89,10 @@
Elmouritania
EMCI TV Afrique
Equinoxe TV
- ES1
+ ES1
Espace TV
E-Tรฉlรฉ Benin
- EuroNews Franรงais
+ EuroNews Franรงais
Eurosport 1 France
Eurosport 2 France
Evasiรณn Guinรฉe
diff --git a/sites/canalplus-afrique.com/canalplus-afrique.com_mr.channels.xml b/sites/canalplus-afrique.com/canalplus-afrique.com_mr.channels.xml
index e94158b2..4ce71f8e 100644
--- a/sites/canalplus-afrique.com/canalplus-afrique.com_mr.channels.xml
+++ b/sites/canalplus-afrique.com/canalplus-afrique.com_mr.channels.xml
@@ -89,10 +89,10 @@
Elmouritania
EMCI TV Afrique
Equinoxe TV
- ES1
+ ES1
Espace TV
E-Tรฉlรฉ Benin
- EuroNews Franรงais
+ EuroNews Franรงais
Eurosport 1 France
Eurosport 2 France
Evasiรณn Guinรฉe
diff --git a/sites/canalplus-afrique.com/canalplus-afrique.com_ne.channels.xml b/sites/canalplus-afrique.com/canalplus-afrique.com_ne.channels.xml
index e94158b2..4ce71f8e 100644
--- a/sites/canalplus-afrique.com/canalplus-afrique.com_ne.channels.xml
+++ b/sites/canalplus-afrique.com/canalplus-afrique.com_ne.channels.xml
@@ -89,10 +89,10 @@
Elmouritania
EMCI TV Afrique
Equinoxe TV
- ES1
+ ES1
Espace TV
E-Tรฉlรฉ Benin
- EuroNews Franรงais
+ EuroNews Franรงais
Eurosport 1 France
Eurosport 2 France
Evasiรณn Guinรฉe
diff --git a/sites/canalplus-afrique.com/canalplus-afrique.com_rw.channels.xml b/sites/canalplus-afrique.com/canalplus-afrique.com_rw.channels.xml
index e94158b2..4ce71f8e 100644
--- a/sites/canalplus-afrique.com/canalplus-afrique.com_rw.channels.xml
+++ b/sites/canalplus-afrique.com/canalplus-afrique.com_rw.channels.xml
@@ -89,10 +89,10 @@
Elmouritania
EMCI TV Afrique
Equinoxe TV
- ES1
+ ES1
Espace TV
E-Tรฉlรฉ Benin
- EuroNews Franรงais
+ EuroNews Franรงais
Eurosport 1 France
Eurosport 2 France
Evasiรณn Guinรฉe
diff --git a/sites/canalplus-afrique.com/canalplus-afrique.com_sl.channels.xml b/sites/canalplus-afrique.com/canalplus-afrique.com_sl.channels.xml
index e94158b2..4ce71f8e 100644
--- a/sites/canalplus-afrique.com/canalplus-afrique.com_sl.channels.xml
+++ b/sites/canalplus-afrique.com/canalplus-afrique.com_sl.channels.xml
@@ -89,10 +89,10 @@
Elmouritania
EMCI TV Afrique
Equinoxe TV
- ES1
+ ES1
Espace TV
E-Tรฉlรฉ Benin
- EuroNews Franรงais
+ EuroNews Franรงais
Eurosport 1 France
Eurosport 2 France
Evasiรณn Guinรฉe
diff --git a/sites/canalplus-afrique.com/canalplus-afrique.com_sn.channels.xml b/sites/canalplus-afrique.com/canalplus-afrique.com_sn.channels.xml
index e94158b2..4ce71f8e 100644
--- a/sites/canalplus-afrique.com/canalplus-afrique.com_sn.channels.xml
+++ b/sites/canalplus-afrique.com/canalplus-afrique.com_sn.channels.xml
@@ -89,10 +89,10 @@
Elmouritania
EMCI TV Afrique
Equinoxe TV
- ES1
+ ES1
Espace TV
E-Tรฉlรฉ Benin
- EuroNews Franรงais
+ EuroNews Franรงais
Eurosport 1 France
Eurosport 2 France
Evasiรณn Guinรฉe
diff --git a/sites/canalplus-afrique.com/canalplus-afrique.com_td.channels.xml b/sites/canalplus-afrique.com/canalplus-afrique.com_td.channels.xml
index e94158b2..4ce71f8e 100644
--- a/sites/canalplus-afrique.com/canalplus-afrique.com_td.channels.xml
+++ b/sites/canalplus-afrique.com/canalplus-afrique.com_td.channels.xml
@@ -89,10 +89,10 @@
Elmouritania
EMCI TV Afrique
Equinoxe TV
- ES1
+ ES1
Espace TV
E-Tรฉlรฉ Benin
- EuroNews Franรงais
+ EuroNews Franรงais
Eurosport 1 France
Eurosport 2 France
Evasiรณn Guinรฉe
diff --git a/sites/canalplus-afrique.com/canalplus-afrique.com_tg.channels.xml b/sites/canalplus-afrique.com/canalplus-afrique.com_tg.channels.xml
index e94158b2..4ce71f8e 100644
--- a/sites/canalplus-afrique.com/canalplus-afrique.com_tg.channels.xml
+++ b/sites/canalplus-afrique.com/canalplus-afrique.com_tg.channels.xml
@@ -89,10 +89,10 @@
Elmouritania
EMCI TV Afrique
Equinoxe TV
- ES1
+ ES1
Espace TV
E-Tรฉlรฉ Benin
- EuroNews Franรงais
+ EuroNews Franรงais
Eurosport 1 France
Eurosport 2 France
Evasiรณn Guinรฉe
diff --git a/sites/canalplus-caraibes.com/canalplus-caraibes.com_bl.channels.xml b/sites/canalplus-caraibes.com/canalplus-caraibes.com_bl.channels.xml
index 99b776f2..b7f6377e 100644
--- a/sites/canalplus-caraibes.com/canalplus-caraibes.com_bl.channels.xml
+++ b/sites/canalplus-caraibes.com/canalplus-caraibes.com_bl.channels.xml
@@ -42,7 +42,7 @@
E! France
English Club TV
Equidia
- ES1
+ ES1
ESPN 2 Caribbean
ESPN Caribbean
ETV
diff --git a/sites/canalplus-caraibes.com/canalplus-caraibes.com_gf.channels.xml b/sites/canalplus-caraibes.com/canalplus-caraibes.com_gf.channels.xml
index 99b776f2..b7f6377e 100644
--- a/sites/canalplus-caraibes.com/canalplus-caraibes.com_gf.channels.xml
+++ b/sites/canalplus-caraibes.com/canalplus-caraibes.com_gf.channels.xml
@@ -42,7 +42,7 @@
E! France
English Club TV
Equidia
- ES1
+ ES1
ESPN 2 Caribbean
ESPN Caribbean
ETV
diff --git a/sites/canalplus-caraibes.com/canalplus-caraibes.com_gp.channels.xml b/sites/canalplus-caraibes.com/canalplus-caraibes.com_gp.channels.xml
index 99b776f2..b7f6377e 100644
--- a/sites/canalplus-caraibes.com/canalplus-caraibes.com_gp.channels.xml
+++ b/sites/canalplus-caraibes.com/canalplus-caraibes.com_gp.channels.xml
@@ -42,7 +42,7 @@
E! France
English Club TV
Equidia
- ES1
+ ES1
ESPN 2 Caribbean
ESPN Caribbean
ETV
diff --git a/sites/canalplus-caraibes.com/canalplus-caraibes.com_mf.channels.xml b/sites/canalplus-caraibes.com/canalplus-caraibes.com_mf.channels.xml
index 99b776f2..b7f6377e 100644
--- a/sites/canalplus-caraibes.com/canalplus-caraibes.com_mf.channels.xml
+++ b/sites/canalplus-caraibes.com/canalplus-caraibes.com_mf.channels.xml
@@ -42,7 +42,7 @@
E! France
English Club TV
Equidia
- ES1
+ ES1
ESPN 2 Caribbean
ESPN Caribbean
ETV
diff --git a/sites/canalplus-caraibes.com/canalplus-caraibes.com_mq.channels.xml b/sites/canalplus-caraibes.com/canalplus-caraibes.com_mq.channels.xml
index 99b776f2..b7f6377e 100644
--- a/sites/canalplus-caraibes.com/canalplus-caraibes.com_mq.channels.xml
+++ b/sites/canalplus-caraibes.com/canalplus-caraibes.com_mq.channels.xml
@@ -42,7 +42,7 @@
E! France
English Club TV
Equidia
- ES1
+ ES1
ESPN 2 Caribbean
ESPN Caribbean
ETV
diff --git a/sites/canalplus-haiti.com/canalplus-haiti.com_ht.channels.xml b/sites/canalplus-haiti.com/canalplus-haiti.com_ht.channels.xml
index 6dbb604a..82838da3 100644
--- a/sites/canalplus-haiti.com/canalplus-haiti.com_ht.channels.xml
+++ b/sites/canalplus-haiti.com/canalplus-haiti.com_ht.channels.xml
@@ -33,7 +33,7 @@
Dorcel TV Africa
E! France
English Club TV
- ES1
+ ES1
ESPN 2 Caribbean
ESPN Caribbean
ETV
diff --git a/sites/canalplus.com/canalplus.com.config.js b/sites/canalplus.com/canalplus.com.config.js
new file mode 100644
index 00000000..9ea5388d
--- /dev/null
+++ b/sites/canalplus.com/canalplus.com.config.js
@@ -0,0 +1,83 @@
+const dayjs = require('dayjs')
+const axios = require('axios')
+
+module.exports = {
+ site: 'canalplus.com',
+ url: function ({ channel, date }) {
+ const diff = date.diff(dayjs.utc().startOf('d'), 'd')
+
+ return `https://hodor.canalplus.pro/api/v2/mycanal/channels/f55e5c7ddf0afba59d1c64581358910d/${channel.site_id}/broadcasts/day/${diff}`
+ },
+ async parser({ content }) {
+ let programs = []
+ const items = parseItems(content)
+ for (let item of items) {
+ const prev = programs[programs.length - 1]
+ const details = await loadProgramDetails(item)
+ const info = parseInfo(details)
+ const start = parseStart(item)
+ if (prev) prev.stop = start
+ const stop = start.add(1, 'h')
+ programs.push({
+ title: item.title,
+ description: parseDescription(info),
+ icon: parseIcon(info),
+ start,
+ stop
+ })
+ }
+
+ return programs
+ },
+ async channels() {
+ const data = await axios
+ .get(`https://secure-webtv-static.canal-plus.com/metadata/cpfra/all/v2.2/globalchannels.json`)
+ .then(r => r.data)
+ .catch(console.log)
+
+ return data.channels.map(item => {
+ return {
+ lang: 'fr',
+ site_id: item.id,
+ name: item.name
+ }
+ })
+ }
+}
+
+function parseStart(item) {
+ return item && item.startTime ? dayjs(item.startTime) : null
+}
+
+function parseIcon(info) {
+ return info ? info.URLImage : null
+}
+
+function parseDescription(info) {
+ return info ? info.summary : null
+}
+
+function parseInfo(data) {
+ if (!data || !data.detail || !data.detail.informations) return null
+
+ return data.detail.informations
+}
+
+async function loadProgramDetails(item) {
+ if (!item.onClick || !item.onClick.URLPage) return {}
+
+ return await axios
+ .get(item.onClick.URLPage)
+ .then(r => r.data)
+ .catch(console.error)
+}
+
+function parseItems(content) {
+ const data = JSON.parse(content)
+ if (!data || !Array.isArray(data.timeSlices)) return []
+
+ return data.timeSlices.reduce((acc, curr) => {
+ acc = acc.concat(curr.contents)
+ return acc
+ }, [])
+}
diff --git a/sites/canalplus.com/canalplus.com.test.js b/sites/canalplus.com/canalplus.com.test.js
new file mode 100644
index 00000000..00e3fd11
--- /dev/null
+++ b/sites/canalplus.com/canalplus.com.test.js
@@ -0,0 +1,101 @@
+// npm run channels:parse -- --config=./sites/canalplus.com/canalplus.com.config.js --output=./sites/canalplus.com/canalplus.com_fr.channels.xml
+// npx epg-grabber --config=sites/canalplus.com/canalplus.com.config.js --channels=sites/canalplus.com/canalplus.com_fr.channels.xml --output=guide.xml --days=2
+
+const { parser, url } = require('./canalplus.com.config.js')
+const axios = require('axios')
+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('2022-03-07', 'YYYY-MM-DD').startOf('d')
+const channel = {
+ site_id: '312',
+ xmltv_id: 'TF1.fr'
+}
+
+jest.mock('axios')
+
+it('can generate valid url for today', () => {
+ const today = dayjs.utc().startOf('d')
+ expect(url({ channel, date: today })).toBe(
+ 'https://hodor.canalplus.pro/api/v2/mycanal/channels/f55e5c7ddf0afba59d1c64581358910d/312/broadcasts/day/0'
+ )
+})
+
+it('can generate valid url for tomorrow', () => {
+ const tomorrow = dayjs.utc().startOf('d').add(1, 'd')
+ expect(url({ channel, date: tomorrow })).toBe(
+ 'https://hodor.canalplus.pro/api/v2/mycanal/channels/f55e5c7ddf0afba59d1c64581358910d/312/broadcasts/day/1'
+ )
+})
+
+it('can parse response', done => {
+ const content = `{"timeSlices":[{"timeSlice":"0","contents":[{"contentID":"18257183_50061","title":"TFou","subtitle":"Emission du 07 mars 2022","startTime":1646630700000,"onClick":{"displayTemplate":"detailSeason","displayName":"TFou","path":"/jeunesse/tfou/h/10709960_50061","URLPage":"https://hodor.canalplus.pro/api/v2/mycanal/detail/f55e5c7ddf0afba59d1c64581358910d/okapi/10709339_50061.json?detailType=detailSeason&objectType=season&broadcastID=PLM_1094261940&episodeId=18257183_50061&brandID=10709960_50061&fromDiff=true"}}]},{"timeSlice":"1","contents":[{"contentID":"18257202_50061","title":"Petits plats en รฉquilibre","subtitle":"Mag. Gastronomie","startTime":1646654100000,"onClick":{"displayTemplate":"detailPage","displayName":"Petits plats en รฉquilibre","path":"/divertissement/petits-plats-en-equilibre-mag-gastronomie/h/18257202_50061","URLPage":"https://hodor.canalplus.pro/api/v2/mycanal/detail/f55e5c7ddf0afba59d1c64581358910d/okapi/18257202_50061.json?detailType=detailPage&objectType=unit&broadcastID=PLM_1094380194&fromDiff=true"}}]}]}`
+
+ axios.get.mockImplementation(url => {
+ if (
+ url ===
+ 'https://hodor.canalplus.pro/api/v2/mycanal/detail/f55e5c7ddf0afba59d1c64581358910d/okapi/10709339_50061.json?detailType=detailSeason&objectType=season&broadcastID=PLM_1094261940&episodeId=18257183_50061&brandID=10709960_50061&fromDiff=true'
+ ) {
+ return Promise.resolve({
+ data: JSON.parse(
+ `{"detail":{"informations":{"URLImage":"https://thumb.canalplus.pro/http/unsafe/{resolutionXY}/filters:quality({imageQualityPercentage})/img-hapi.canalplus.pro:80/ServiceImage/ImageID/97215037","summary":"Une รฉmission jeunesse qui propose les meilleures sรฉries de dessins animรฉs du moment."}}}`
+ )
+ })
+ } else if (
+ url ===
+ 'https://hodor.canalplus.pro/api/v2/mycanal/detail/f55e5c7ddf0afba59d1c64581358910d/okapi/18257202_50061.json?detailType=detailPage&objectType=unit&broadcastID=PLM_1094380194&fromDiff=true'
+ ) {
+ return Promise.resolve({
+ data: JSON.parse(
+ `{"detail":{"informations":{"URLImage":"https://thumb.canalplus.pro/http/unsafe/{resolutionXY}/filters:quality({imageQualityPercentage})/img-hapi.canalplus.pro:80/ServiceImage/ImageID/100841894","summary":"Chaque jour, Laurent Mariotte propose des recettes simples et savoureuses pour profiter des ingrรฉdients de saison, en donnant la part belle aux produits locaux."}}}`
+ )
+ })
+ } else {
+ return Promise.resolve({ data: '' })
+ }
+ })
+
+ parser({ content })
+ .then(result => {
+ result.map(p => {
+ p.start = p.start.toJSON()
+ p.stop = p.stop.toJSON()
+ return p
+ })
+
+ expect(result).toMatchObject([
+ {
+ start: '2022-03-07T05:25:00.000Z',
+ stop: '2022-03-07T11:55:00.000Z',
+ title: 'TFou',
+ description:
+ 'Une รฉmission jeunesse qui propose les meilleures sรฉries de dessins animรฉs du moment.',
+ icon: 'https://thumb.canalplus.pro/http/unsafe/{resolutionXY}/filters:quality({imageQualityPercentage})/img-hapi.canalplus.pro:80/ServiceImage/ImageID/97215037'
+ },
+ {
+ start: '2022-03-07T11:55:00.000Z',
+ stop: '2022-03-07T12:55:00.000Z',
+ title: 'Petits plats en รฉquilibre',
+ description:
+ 'Chaque jour, Laurent Mariotte propose des recettes simples et savoureuses pour profiter des ingrรฉdients de saison, en donnant la part belle aux produits locaux.',
+ icon: 'https://thumb.canalplus.pro/http/unsafe/{resolutionXY}/filters:quality({imageQualityPercentage})/img-hapi.canalplus.pro:80/ServiceImage/ImageID/100841894'
+ }
+ ])
+ done()
+ })
+ .catch(done)
+})
+
+it('can handle empty guide', done => {
+ parser({
+ content: `{"currentPage":{"displayTemplate":"error","displayName":"Page introuvable","path":"/erreur","BOName":"Page introuvable","BOLayoutName":"Erreur 404"},"title":"Page introuvable","text":"La page que vous demandez est introuvable. Si le problรจme persiste, vous pouvez contacter l'assistance de CANAL+.","code":404}`
+ })
+ .then(result => {
+ expect(result).toMatchObject([])
+ done()
+ })
+ .catch(done)
+})
diff --git a/sites/canalplus.com/canalplus.com_fr.channels.xml b/sites/canalplus.com/canalplus.com_fr.channels.xml
new file mode 100644
index 00000000..5e67ad2a
--- /dev/null
+++ b/sites/canalplus.com/canalplus.com_fr.channels.xml
@@ -0,0 +1,222 @@
+
+
+
+ 3 SAT
+ 6TER
+ AB1
+ ACTION
+ AL JAZEERA ENG
+ ALTICE STUDIO
+ ANIMAUX
+ ARIRANG TV
+ ARTE
+ ASTROCENTER TV
+ AUTOMOTO LA CHAINE
+ BBC WORLD NEWS
+ BEIN SPORTS 1
+ BEIN SPORTS 2
+ BEIN SPORTS 3
+ BEIN SPORTS MAX 10
+ BEIN SPORTS MAX 4
+ BEIN SPORTS MAX 5
+ BEIN SPORTS MAX 6
+ BEIN SPORTS MAX 7
+ BEIN SPORTS MAX 8
+ BEIN SPORTS MAX 9
+ BET
+ BFM BUSINESS
+ BFM TV
+ BLOOMBERG TV
+ BLUE ZOOM
+ BOING
+ BOOMERANG
+ BSMART TV
+ C8
+ CANAL ALPHA NE
+ CANAL J
+ CANAL+CINEMA
+ CANAL+DECALE
+ CANAL+DOCS
+ CANAL+FORMULA1
+ CANAL+
+ CANAL+GRAND ECRAN
+ CANAL+KIDS
+ CANAL+MOTOGP
+ CANAL+PREMIER LEAGUE
+ CANAL+SERIES
+ CANAL+ SPORT 2 (CH)
+ CANAL+SPORT
+ CANAL+TOP14
+ CARTOON NETWORK
+ CHASSE ET PECHE
+ CHERIE 25
+ CINE+ CLASSIC
+ CINE+ CLUB
+ CINE+ EMOTION
+ CINE+ FAMIZ
+ CINE+ FRISSON
+ CINE+ PREMIER
+ CLIQUE TV
+ CNBC
+ CNEWS
+ CNN INT.
+ COLMAX TV
+ COMEDIE+
+ COMEDY CENTRAL
+ CSTAR
+ CSTAR HITS FRANCE
+ ARD DAS ERSTE
+ DISNEY CHANNEL
+ DISNEY CHANNEL+1
+ DISNEY CINEMA
+ DISNEY JUNIOR
+ DORCEL TV
+ DORCEL XXX
+ EQUIDIA
+ EURONEWS
+ EUROSPORT 1
+ EUROSPORT 2
+ EUROSPORT 3
+ EUROSPORT 360 1
+ EUROSPORT 360 2
+ EUROSPORT 360 3
+ EUROSPORT 360 4
+ EUROSPORT 360 5
+ EUROSPORT 360 6
+ EUROSPORT 360 7
+ EUROSPORT 360 8
+ EUROSPORT 4
+ EUROSPORT 5
+ FOOT+ 24/24
+ FRANCE 2
+ FRANCE 24 ENG
+ FRANCE 24
+ FRANCE 3
+ F3 ALPES
+ F3 ALSACE
+ F3 AQUITAINE
+ F3 AUVERGNE
+ F3 BNORMANDIE
+ F3 BOURGOGNE
+ F3 BRETAGNE
+ F3 CENTRE
+ F3 CHAMP ARDENNE
+ F3 CORSEVIASTELLA
+ F3 COTE D'AZUR
+ F3 FRANCHE COMTE
+ F3 HNORMANDIE
+ F3 LANGUEDOCROU
+ F3 LIMOUSIN
+ F3 LORRAINE
+ F3 MIDI PYRENEES
+ F3 NORD PDC
+ F3 NOUVELLE AQUITAINE
+ F3 PARIS IDF
+ F3 PAYS DE LA LOIRE
+ F3 PICARDIE
+ F3 POITOUCHAR
+ F3 PROV ALPES
+ F3 RHONE ALPES
+ FRANCE 4
+ FRANCE 5
+ FRANCEINFO:
+ GAME ONE
+ GOLF+
+ GULLI
+ HISTOIRE TV
+ I24 NEWS
+ INFOSPORT+
+ JACQUIE & MICHEL TV
+ J-ONE
+ LA CHAINE METEO
+ LCI
+ LCP
+ L'EQUIPE
+ LFM TV
+ M6
+ M6 MUSIC
+ MANGAS
+ MAN X
+ MCM
+ MELODY
+ MEZZO
+ MEZZO LIVE
+ MGG TV
+ MTV
+ MTV HITS
+ MULTISPORTS 1
+ MULTISPORTS 2
+ MULTISPORTS 3
+ MULTISPORTS 4
+ MULTISPORTS 5
+ MULTISPORTS 6
+ MUSEUM
+ MY ZEN TV
+ NATIONAL GEO
+ NATIONAL GEOGRAPHIC WILD
+ NHK WORLD-JAPAN
+ NICKELODEON
+ NICKELODEON JUNIOR
+ NICKELODEON TEEN
+ NOLLYWOOD TV
+ NON STOP PEOPLE
+ NOVELAS TV
+ NRJ 12
+ NRJ HITS
+ OCS CHOC
+ OCS CITY
+ OCS GEANTS
+ OCS MAX
+ OLYMPIA TV
+ ONE TV
+ ORF 1
+ PARAMOUNT CHANNEL
+ PARIS PREMIERE
+ PENTHOUSE BLACK
+ PENTHOUSE
+ PINK X
+ PIWI+
+ PLANETE+
+ PLANETE+AVENTURE
+ PLANETE+CRIME
+ POLAR+
+ RAI UNO
+ RFM TV
+ RMC DECOUVERTE
+ RMC SPORT 1
+ RMC SPORT 2
+ RMC STORY
+ ROUGE TV
+ RT FRANCE
+ RTL9
+ SCIENCE ET VIE TV
+ SEASONS
+ SERIE CLUB
+ SRF 1
+ CLASSICA
+ DJAZZ
+ TCM CINEMA
+ TELEBIELINGUE
+ TELETOON+
+ TELETOON+1
+ TEVA
+ TF1
+ TF1 SERIES FILMS
+ TFX
+ TIJI
+ TMC
+ TOONAMI
+ TOUTE L'HISTOIRE
+ TRACE AFRICA
+ TRACE LATINA
+ TRACE URBAN
+ TV5 MONDE
+ TV BREIZH
+ USHUAIA TV
+ VICE TV
+ VIXEN
+ W9
+ WARNER TV
+ XXL
+
+
diff --git a/sites/chaines-tv.orange.fr/chaines-tv.orange.fr_fr.channels.xml b/sites/chaines-tv.orange.fr/chaines-tv.orange.fr_fr.channels.xml
index 1ab7b8a7..db1d0d0b 100644
--- a/sites/chaines-tv.orange.fr/chaines-tv.orange.fr_fr.channels.xml
+++ b/sites/chaines-tv.orange.fr/chaines-tv.orange.fr_fr.channels.xml
@@ -37,6 +37,10 @@
Canal + Dรฉcalรฉ
Canal + Docs
Canal + France
+ Canal + Grand Ecran
+ Canal + Kids
+ Canal + Sรฉries
+ Canal + Sport
Canal Q
Cartoon Network France
Chasse & Pรชche
@@ -63,9 +67,9 @@
Disney Junior France
DW English
Equidia
- ES1
+ ES1
Eurochannel
- EuroNews Franรงais
+ EuroNews Franรงais
FashionTV Europe
France 2
France 3
@@ -192,4 +196,4 @@
ZDF
ZDF Neo
-
\ No newline at end of file
+
diff --git a/sites/clickthecity.com/clickthecity.com.config.js b/sites/clickthecity.com/clickthecity.com.config.js
new file mode 100644
index 00000000..6f21e240
--- /dev/null
+++ b/sites/clickthecity.com/clickthecity.com.config.js
@@ -0,0 +1,104 @@
+const cheerio = require('cheerio')
+const axios = require('axios')
+const dayjs = require('dayjs')
+const utc = require('dayjs/plugin/utc')
+const timezone = require('dayjs/plugin/timezone')
+const customParseFormat = require('dayjs/plugin/customParseFormat')
+
+dayjs.extend(utc)
+dayjs.extend(timezone)
+dayjs.extend(customParseFormat)
+
+module.exports = {
+ site: 'clickthecity.com',
+ url({ channel }) {
+ return `https://www.clickthecity.com/tv/network/${channel.site_id}`
+ },
+ request: {
+ method: 'POST',
+ headers: {
+ 'content-type': 'application/x-www-form-urlencoded'
+ },
+ data({ date }) {
+ const params = new URLSearchParams()
+ params.append('optDate', date.format('YYYY-MM-DD'))
+ params.append('optTime', '00:00:00')
+
+ return params
+ }
+ },
+ parser({ content, date }) {
+ const programs = []
+ const items = parseItems(content, date)
+ items.forEach(item => {
+ const prev = programs[programs.length - 1]
+ const $item = cheerio.load(item)
+ const start = parseStart($item, date)
+ const stop = parseStop($item, date)
+ if (stop && prev && stop.isBefore(prev.start)) return
+ programs.push({
+ title: parseTitle($item),
+ start,
+ stop
+ })
+ })
+
+ return programs
+ },
+ async channels() {
+ const html = await axios
+ .get(`https://www.clickthecity.com/tv-networks/`)
+ .then(r => r.data)
+ .catch(console.log)
+ const $ = cheerio.load(html)
+ const items = $(
+ '#main > div > div > div > section.elementor-section.elementor-top-section.elementor-element.elementor-element-a3c51b3.elementor-section-boxed.elementor-section-height-default.elementor-section-height-default > div > div > div.elementor-column.elementor-col-50.elementor-top-column.elementor-element.elementor-element-b23e0a8 > div > div > div.elementor-element.elementor-element-b46952e.elementor-posts--align-center.elementor-grid-tablet-3.elementor-grid-mobile-3.elementor-grid-4.elementor-posts--thumbnail-top.elementor-widget.elementor-widget-posts > div > div > article'
+ ).toArray()
+
+ return items.map(item => {
+ const name = $(item).find('div > h3').text().trim()
+ const url = $(item).find('a').attr('href')
+ const [_, site_id] = url.match(/network\/(.*)\//) || [null, null]
+
+ return {
+ site_id,
+ name
+ }
+ })
+ }
+}
+
+function parseTitle($item) {
+ return $item('td > a').text().trim()
+}
+
+function parseStart($item, date) {
+ const url = $item('td > a').attr('href') || ''
+ const [_, time] = url.match(/starttime=(\d{1,2}%3A\d{2}\+(AM|PM))/) || [null, null]
+ if (!time) return null
+
+ return dayjs.tz(
+ `${date.format('YYYY-MM-DD')} ${time.replace('%3A', ':')}`,
+ 'YYYY-MM-DD h:mm A',
+ 'Asia/Manila'
+ )
+}
+
+function parseStop($item, date) {
+ const url = $item('td > a').attr('href') || ''
+ const [_, time] = url.match(/endtime=(\d{1,2}%3A\d{2}\+(AM|PM))/) || [null, null]
+ if (!time) return null
+
+ return dayjs.tz(
+ `${date.format('YYYY-MM-DD')} ${time.replace('%3A', ':')}`,
+ 'YYYY-MM-DD h:mm A',
+ 'Asia/Manila'
+ )
+}
+
+function parseItems(content, date) {
+ const $ = cheerio.load(content)
+ const stringDate = date.format('MMMM DD')
+
+ return $(`#tvlistings > tbody > tr:not(.bg-dark)`).toArray()
+}
diff --git a/sites/clickthecity.com/clickthecity.com.test.js b/sites/clickthecity.com/clickthecity.com.test.js
new file mode 100644
index 00000000..f42f2179
--- /dev/null
+++ b/sites/clickthecity.com/clickthecity.com.test.js
@@ -0,0 +1,72 @@
+// npm run channels:parse -- --config=./sites/clickthecity.com/clickthecity.com.config.js --output=./sites/clickthecity.com/clickthecity.com_ph.channels.xml
+// npx epg-grabber --config=sites/clickthecity.com/clickthecity.com.config.js --channels=sites/clickthecity.com/clickthecity.com_ph.channels.xml --output=guide.xml --days=2
+
+const { parser, url, request } = require('./clickthecity.com.config.js')
+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('2022-03-05', 'YYYY-MM-DD').startOf('d')
+const channel = {
+ site_id: 'tv5',
+ xmltv_id: 'TV5.ph'
+}
+
+it('can generate valid url', () => {
+ expect(url({ channel })).toBe('https://www.clickthecity.com/tv/network/tv5')
+})
+
+it('can generate valid request method', () => {
+ expect(request.method).toBe('POST')
+})
+
+it('can generate valid request headers', () => {
+ expect(request.headers).toMatchObject({
+ 'content-type': 'application/x-www-form-urlencoded'
+ })
+})
+
+it('can generate valid request data', () => {
+ const result = request.data({ date })
+ expect(result.get('optDate')).toBe('2022-03-05')
+ expect(result.get('optTime')).toBe('00:00:00')
+})
+
+it('can parse response', () => {
+ const content = ``
+
+ const result = parser({ content, date }).map(p => {
+ p.start = p.start.toJSON()
+ p.stop = p.stop.toJSON()
+ return p
+ })
+
+ expect(result).toMatchObject([
+ {
+ start: '2022-03-04T16:00:00.000Z',
+ stop: '2022-03-04T17:00:00.000Z',
+ title: `CCF Worship Service`
+ },
+ {
+ start: '2022-03-04T22:30:00.000Z',
+ stop: '2022-03-04T23:30:00.000Z',
+ title: `Word Of God`
+ },
+ {
+ start: '2022-03-05T12:00:00.000Z',
+ stop: '2022-03-05T13:00:00.000Z',
+ title: `Rated Korina S2`
+ }
+ ])
+})
+
+it('can handle empty guide', () => {
+ const result = parser({
+ date,
+ channel,
+ content: ``
+ })
+ expect(result).toMatchObject([])
+})
diff --git a/sites/clickthecity.com/clickthecity.com_ph.channels.xml b/sites/clickthecity.com/clickthecity.com_ph.channels.xml
new file mode 100644
index 00000000..d1b63bcb
--- /dev/null
+++ b/sites/clickthecity.com/clickthecity.com_ph.channels.xml
@@ -0,0 +1,39 @@
+
+
+
+ A2Z Channel 11
+ ANC
+ Animax
+ AXN
+ Celestial Movies Pinoy
+ Cinema One
+ Cinemax
+ CNN Philippines
+ Crime & Investigation
+ IBC 13
+ ETC
+ GEM
+ GMA News TV
+ GMA
+ GTV
+ HBO Asia
+ History
+ Jeepney TV
+ Kapamilya Channel
+ K Movies Pinoy
+ Liga
+ Metro Channel
+ MYX
+ National Geographic
+ Net 25
+ Nickelodeon
+ PBO
+ PTV
+ Rock Entertainment
+ Rock Extreme
+ TeleNovela Channel
+ Tagalized Movie Channel
+ TV5
+ VIVA Cinema
+
+
diff --git a/sites/comteco.com.bo/comteco.com.bo_bo.channels.xml b/sites/comteco.com.bo/comteco.com.bo_bo.channels.xml
index 3a4d76bc..b59c941f 100644
--- a/sites/comteco.com.bo/comteco.com.bo_bo.channels.xml
+++ b/sites/comteco.com.bo/comteco.com.bo_bo.channels.xml
@@ -32,7 +32,7 @@
ESPN 2 Amรฉrica Latina
ESPN 3 Amรฉrica Latina
ESPN Amรฉrica Latina
- EuroNews Espaรฑol
+ EuroNews Espaรฑol
Europa Europa
EWTN Espaรฑa - Latinoamรฉrica
Fox Sports 2 Latin America
diff --git a/sites/cosmote.gr/cosmote.gr_gr.channels.xml b/sites/cosmote.gr/cosmote.gr_gr.channels.xml
index 808b6402..8edf18d9 100644
--- a/sites/cosmote.gr/cosmote.gr_gr.channels.xml
+++ b/sites/cosmote.gr/cosmote.gr_gr.channels.xml
@@ -44,8 +44,8 @@
ERT 2
ERT 3
ERT World
- EuroNews Ellinika
- EuroNews English
+ EuroNews Ellinika
+ EuroNews English
FashionTV Europe
Fox Greece
Fox Life Greece
diff --git a/sites/delta.nl/delta.nl.config.js b/sites/delta.nl/delta.nl.config.js
index e3be8d1a..90cbfbf1 100644
--- a/sites/delta.nl/delta.nl.config.js
+++ b/sites/delta.nl/delta.nl.config.js
@@ -8,17 +8,19 @@ module.exports = {
.add(1, 'd')
.unix()}&includeDetails=true&channels=${channel.site_id}`
},
- parser: function ({ content, channel }) {
+ async parser({ content, channel }) {
let programs = []
const items = parseItems(content, channel)
- items.forEach(item => {
+ for (let item of items) {
+ const details = await loadProgramDetails(item)
programs.push({
title: item.title,
icon: item.images.thumbnail.url,
+ description: details.description,
start: parseStart(item).toJSON(),
stop: parseStop(item).toJSON()
})
- })
+ }
return programs
},
@@ -40,6 +42,17 @@ module.exports = {
}
}
+async function loadProgramDetails(item) {
+ if (!item.ID) return {}
+ const url = `https://clientapi.tv.delta.nl/guide/4/details/${item.ID}?X-Response-Version=4.5`
+ const data = await axios
+ .get(url)
+ .then(r => r.data)
+ .catch(console.log)
+
+ return data || {}
+}
+
function parseStart(item) {
return dayjs.unix(item.start)
}
diff --git a/sites/delta.nl/delta.nl.test.js b/sites/delta.nl/delta.nl.test.js
index cb7fa226..2f979ba1 100644
--- a/sites/delta.nl/delta.nl.test.js
+++ b/sites/delta.nl/delta.nl.test.js
@@ -1,13 +1,16 @@
-// node ./scripts/channels.js --config=./sites/delta.nl/delta.nl.config.js --output=./sites/delta.nl/delta.nl_nl.channels.xml
-// npx epg-grabber --config=sites/delta.nl/delta.nl.config.js --channels=sites/delta.nl/delta.nl_nl.channels.xml --output=.gh-pages/guides/nl/delta.nl.epg.xml --days=2
+// npm run channels:parse --config=./sites/delta.nl/delta.nl.config.js --output=./sites/delta.nl/delta.nl_nl.channels.xml
+// npx epg-grabber --config=sites/delta.nl/delta.nl.config.js --channels=sites/delta.nl/delta.nl_nl.channels.xml --output=guide.xml --days=2
const { parser, url, request } = require('./delta.nl.config.js')
+const axios = require('axios')
const dayjs = require('dayjs')
const utc = require('dayjs/plugin/utc')
const customParseFormat = require('dayjs/plugin/customParseFormat')
dayjs.extend(customParseFormat)
dayjs.extend(utc)
+jest.mock('axios')
+
const date = dayjs.utc('2021-11-12', 'YYYY-MM-DD').startOf('d')
const channel = {
site_id: '1',
@@ -20,25 +23,47 @@ it('can generate valid url', () => {
)
})
-it('can parse response', () => {
- const content = `{"1":[{"ID":"P~945cb98e-3d19-11ec-8456-953363d7a344","seriesID":"S~d37c4626-b691-11ea-ba69-255835135f02","channelID":"1","start":1636674960,"end":1636676520,"catchupAvailableUntil":1637279760,"title":"NOS Journaal","images":{"thumbnail":{"url":"https://cdn.gvidi.tv/img/booxmedia/e19c/static/NOS%20Journaal5.jpg"}},"additionalInformation":{"metadataID":"M~944f3c6e-3d19-11ec-9faf-2735f2e98d2a","externalMetadataID":"E~TV01-2026117420668"},"parentalGuidance":{"kijkwijzer":["AL"]},"restrictions":{"startoverDisabled":false,"catchupDisabled":false,"recordingDisabled":false},"isFiller":false}]}`
- const result = parser({ date, channel, content })
+it('can parse response', done => {
+ axios.get.mockImplementation(() =>
+ Promise.resolve({
+ data: JSON.parse(
+ `{"ID":"P~945cb98e-3d19-11ec-8456-953363d7a344","seriesID":"S~d37c4626-b691-11ea-ba69-255835135f02","channelID":"1","start":1636674960,"end":1636676520,"catchupAvailableUntil":1637279760,"title":"Eigen Huis & Tuin: Lekker Leven","description":"Nederlands lifestyleprogramma uit 2022 (ook in HD) met dagelijkse inspiratie voor een lekker leven in en om het huis.\\nPresentatrice Froukje de Both, kok Hugo Kennis en een team van experts, onder wie tuinman Tom Groot, geven praktische tips op het gebied van wonen, lifestyle, tuinieren en koken. Daarmee kun je zelf direct aan de slag om je leven leuker รฉn gezonder te maken. Afl. 15 van seizoen 4.","images":{"thumbnail":{"url":"https://cdn.gvidi.tv/img/booxmedia/b291/561946.jpg"}},"additionalInformation":{"metadataID":"M~c512c206-95e5-11ec-87d8-494f70130311","externalMetadataID":"E~RTL4-89d99356_6599_4b65_a7a0_a93f39019645"},"parentalGuidance":{"kijkwijzer":["AL"]},"restrictions":{"startoverDisabled":false,"catchupDisabled":false,"recordingDisabled":false},"isFiller":false}`
+ )
+ })
+ )
- expect(result).toMatchObject([
- {
- start: '2021-11-11T23:56:00.000Z',
- stop: '2021-11-12T00:22:00.000Z',
- title: 'NOS Journaal',
- icon: 'https://cdn.gvidi.tv/img/booxmedia/e19c/static/NOS%20Journaal5.jpg'
- }
- ])
+ const content = `{"1":[{"ID":"P~945cb98e-3d19-11ec-8456-953363d7a344","seriesID":"S~d37c4626-b691-11ea-ba69-255835135f02","channelID":"1","start":1636674960,"end":1636676520,"catchupAvailableUntil":1637279760,"title":"NOS Journaal","images":{"thumbnail":{"url":"https://cdn.gvidi.tv/img/booxmedia/e19c/static/NOS%20Journaal5.jpg"}},"additionalInformation":{"metadataID":"M~944f3c6e-3d19-11ec-9faf-2735f2e98d2a","externalMetadataID":"E~TV01-2026117420668"},"parentalGuidance":{"kijkwijzer":["AL"]},"restrictions":{"startoverDisabled":false,"catchupDisabled":false,"recordingDisabled":false},"isFiller":false}]}`
+
+ parser({ date, channel, content })
+ .then(result => {
+ expect(result).toMatchObject([
+ {
+ start: '2021-11-11T23:56:00.000Z',
+ stop: '2021-11-12T00:22:00.000Z',
+ title: 'NOS Journaal',
+ description:
+ 'Nederlands lifestyleprogramma uit 2022 (ook in HD) met dagelijkse inspiratie voor een lekker leven in en om het huis.\nPresentatrice Froukje de Both, kok Hugo Kennis en een team van experts, onder wie tuinman Tom Groot, geven praktische tips op het gebied van wonen, lifestyle, tuinieren en koken. Daarmee kun je zelf direct aan de slag om je leven leuker รฉn gezonder te maken. Afl. 15 van seizoen 4.',
+ icon: 'https://cdn.gvidi.tv/img/booxmedia/e19c/static/NOS%20Journaal5.jpg'
+ }
+ ])
+ done()
+ })
+ .catch(error => {
+ done(error)
+ })
})
-it('can handle empty guide', () => {
- const result = parser({
+it('can handle empty guide', done => {
+ parser({
date,
channel,
content: `{"code":500,"message":"Error retrieving guide"}`
})
- expect(result).toMatchObject([])
+ .then(result => {
+ expect(result).toMatchObject([])
+ done()
+ })
+ .catch(error => {
+ done(error)
+ })
})
diff --git a/sites/delta.nl/delta.nl_nl.channels.xml b/sites/delta.nl/delta.nl_nl.channels.xml
index e175fd07..f1994a1b 100644
--- a/sites/delta.nl/delta.nl_nl.channels.xml
+++ b/sites/delta.nl/delta.nl_nl.channels.xml
@@ -1,10 +1,10 @@
- 3sat
- 24 Kitchen Nederland
100% NL TV
192 TV
+ 24 Kitchen Nederland
+ 3sat
AAVISIE
Albrandswaard TV
Aljazeera English
@@ -54,7 +54,7 @@
ESPN 3 Nederland
ESPN 4 Nederland
ESPN Nederland
- EuroNews English
+ EuroNews English
Eurosport 1
Eurosport 2
Extreme Sports Channel
@@ -69,8 +69,8 @@
FilmBox Nederland
Fox NL
France 2
- France 3
France 24 Franรงais
+ France 3
Gemeente Westland TV
GL8
GO-TV
@@ -82,7 +82,7 @@
Hustler TV Europe
Ideaal TV
Ijsselmond TV
- Insight HD
+ Insight TV
Investigation Discovery Europe
JenZ
Kabel Eins Deutschland
@@ -166,6 +166,7 @@
RTV Arnhem TV
RTV Focus TV
RTV Horizon
+ RTV Oost
RTV Purmerend
RTV Rijnstreek TV
RTV Scheldemond
@@ -199,8 +200,8 @@
Trace Sport Stars
Trace Urban
TRT Tรผrk
- TV5Monde Europe
TV 538
+ TV5Monde Europe
TV Berghem
TV Drenthe
TVE Internacional Europa
@@ -208,7 +209,6 @@
TV Krimpenerwaard
TV Noord
TV Nunspeet
- TV Oost
TV Oranje
TV Rijnmond
TV Stichtse Vecht
diff --git a/sites/digiturk.com.tr/digiturk.com.tr_tr.channels.xml b/sites/digiturk.com.tr/digiturk.com.tr_tr.channels.xml
index 22d9969d..c6138e6c 100644
--- a/sites/digiturk.com.tr/digiturk.com.tr_tr.channels.xml
+++ b/sites/digiturk.com.tr/digiturk.com.tr_tr.channels.xml
@@ -60,7 +60,7 @@
EBA TV Lise
EBA TV Ortaokul
Ekotรผrk
- EuroNews English
+ EuroNews English
Eurosport 1
Eurosport 2
FashionTV HD Europe
diff --git a/sites/directv.com/directv.com_us.channels.xml b/sites/directv.com/directv.com_us.channels.xml
index 3a6b60cb..22d182f2 100644
--- a/sites/directv.com/directv.com_us.channels.xml
+++ b/sites/directv.com/directv.com_us.channels.xml
@@ -252,7 +252,7 @@
Penthouse TV
Penthouse TV Monthly Offer
Perรบ Mรกgico
- Perviy kanal America
+ Pervyy kanal America
Phoenix Hong Kong
Phoenix InfoNews Channel
Phoenix North America Chinese Channel
diff --git a/sites/dsmart.com.tr/dsmart.com.tr_tr.channels.xml b/sites/dsmart.com.tr/dsmart.com.tr_tr.channels.xml
index c42498b1..f63f80c0 100644
--- a/sites/dsmart.com.tr/dsmart.com.tr_tr.channels.xml
+++ b/sites/dsmart.com.tr/dsmart.com.tr_tr.channels.xml
@@ -44,7 +44,7 @@
Haber Global
Habertรผrk
Halk TV
- Insight HD
+ Insight HD
Kanal 7
Kanal D
Lider TV
diff --git a/sites/dstv.com/dstv.com_ao.channels.xml b/sites/dstv.com/dstv.com_ao.channels.xml
index ac88c66b..350a9a37 100644
--- a/sites/dstv.com/dstv.com_ao.channels.xml
+++ b/sites/dstv.com/dstv.com_ao.channels.xml
@@ -30,8 +30,8 @@
Emmanuel TV
ESPN 2 Africa
ESPN Africa
- EuroNews English
- EuroNews Portuguรชs
+ EuroNews English
+ EuroNews Portuguรชs
EWTN Africa - Asia
Faith Africa
Fรฉ TV
diff --git a/sites/dstv.com/dstv.com_bf.channels.xml b/sites/dstv.com/dstv.com_bf.channels.xml
index 64a9bc54..09058d7d 100644
--- a/sites/dstv.com/dstv.com_bf.channels.xml
+++ b/sites/dstv.com/dstv.com_bf.channels.xml
@@ -39,9 +39,9 @@
ESPN 2 Africa
ESPN Africa
E TV Africa
- EuroNews Deutsch
- EuroNews English
- EuroNews Franรงais
+ EuroNews Deutsch
+ EuroNews English
+ EuroNews Franรงais
EWTN Africa - Asia
Faith Africa
Food Network EMEA
diff --git a/sites/dstv.com/dstv.com_bi.channels.xml b/sites/dstv.com/dstv.com_bi.channels.xml
index 8df1c998..9cee70c1 100644
--- a/sites/dstv.com/dstv.com_bi.channels.xml
+++ b/sites/dstv.com/dstv.com_bi.channels.xml
@@ -40,9 +40,9 @@
ESPN 2 Africa
ESPN Africa
E TV Africa
- EuroNews Deutsch
- EuroNews Franรงais
- EuroNews Portuguรชs
+ EuroNews Deutsch
+ EuroNews Franรงais
+ EuroNews Portuguรชs
EWTN Africa - Asia
Faith Africa
Food Network EMEA
diff --git a/sites/dstv.com/dstv.com_bj.channels.xml b/sites/dstv.com/dstv.com_bj.channels.xml
index 7de408a5..1e4891f3 100644
--- a/sites/dstv.com/dstv.com_bj.channels.xml
+++ b/sites/dstv.com/dstv.com_bj.channels.xml
@@ -40,9 +40,9 @@
ESPN 2 Africa
ESPN Africa
E TV Africa
- EuroNews Deutsch
- EuroNews English
- EuroNews Franรงais
+ EuroNews Deutsch
+ EuroNews English
+ EuroNews Franรงais
EWTN Africa - Asia
Faith Africa
Food Network EMEA
diff --git a/sites/dstv.com/dstv.com_bw.channels.xml b/sites/dstv.com/dstv.com_bw.channels.xml
index 5b88edcb..8bb748e3 100644
--- a/sites/dstv.com/dstv.com_bw.channels.xml
+++ b/sites/dstv.com/dstv.com_bw.channels.xml
@@ -41,7 +41,7 @@
ESPN 2 Africa
ESPN Africa
E TV Africa
- EuroNews English
+ EuroNews English
Faith Africa
FliekNet
Food Network EMEA
diff --git a/sites/dstv.com/dstv.com_cd.channels.xml b/sites/dstv.com/dstv.com_cd.channels.xml
index 67e8cafb..c86224e3 100644
--- a/sites/dstv.com/dstv.com_cd.channels.xml
+++ b/sites/dstv.com/dstv.com_cd.channels.xml
@@ -39,8 +39,8 @@
ESPN 2 Africa
ESPN Africa
E TV Africa
- EuroNews Deutsch
- EuroNews Franรงais
+ EuroNews Deutsch
+ EuroNews Franรงais
EWTN Africa - Asia
Faith Africa
Food Network EMEA
diff --git a/sites/dstv.com/dstv.com_cf.channels.xml b/sites/dstv.com/dstv.com_cf.channels.xml
index cc0c4d8e..c1f96840 100644
--- a/sites/dstv.com/dstv.com_cf.channels.xml
+++ b/sites/dstv.com/dstv.com_cf.channels.xml
@@ -39,9 +39,9 @@
ESPN 2 Africa
ESPN Africa
E TV Africa
- EuroNews Deutsch
- EuroNews Franรงais
- EuroNews Portuguรชs
+ EuroNews Deutsch
+ EuroNews Franรงais
+ EuroNews Portuguรชs
EWTN Africa - Asia
Faith Africa
Food Network EMEA
diff --git a/sites/dstv.com/dstv.com_cg.channels.xml b/sites/dstv.com/dstv.com_cg.channels.xml
index 1bb2da85..b8190392 100644
--- a/sites/dstv.com/dstv.com_cg.channels.xml
+++ b/sites/dstv.com/dstv.com_cg.channels.xml
@@ -39,9 +39,9 @@
ESPN 2 Africa
ESPN Africa
E TV Africa
- EuroNews Deutsch
- EuroNews English
- EuroNews Franรงais
+ EuroNews Deutsch
+ EuroNews English
+ EuroNews Franรงais
EWTN Africa - Asia
Faith Africa
Food Network EMEA
diff --git a/sites/dstv.com/dstv.com_ci.channels.xml b/sites/dstv.com/dstv.com_ci.channels.xml
index e6d70253..a9fb6f72 100644
--- a/sites/dstv.com/dstv.com_ci.channels.xml
+++ b/sites/dstv.com/dstv.com_ci.channels.xml
@@ -39,9 +39,9 @@
ESPN 2 Africa
ESPN Africa
E TV Africa
- EuroNews Deutsch
- EuroNews English
- EuroNews Franรงais
+ EuroNews Deutsch
+ EuroNews English
+ EuroNews Franรงais
EWTN Africa - Asia
Faith Africa
Food Network EMEA
diff --git a/sites/dstv.com/dstv.com_cm.channels.xml b/sites/dstv.com/dstv.com_cm.channels.xml
index d9b2046e..2d4f66ed 100644
--- a/sites/dstv.com/dstv.com_cm.channels.xml
+++ b/sites/dstv.com/dstv.com_cm.channels.xml
@@ -39,9 +39,9 @@
ESPN 2 Africa
ESPN Africa
E TV Africa
- EuroNews Deutsch
- EuroNews English
- EuroNews Franรงais
+ EuroNews Deutsch
+ EuroNews English
+ EuroNews Franรงais
EWTN Africa - Asia
Faith Africa
Food Network EMEA
diff --git a/sites/dstv.com/dstv.com_cv.channels.xml b/sites/dstv.com/dstv.com_cv.channels.xml
index 7af8aed1..cd91749c 100644
--- a/sites/dstv.com/dstv.com_cv.channels.xml
+++ b/sites/dstv.com/dstv.com_cv.channels.xml
@@ -39,9 +39,9 @@
ESPN 2 Africa
ESPN Africa
E TV Africa
- EuroNews Deutsch
- EuroNews Franรงais
- EuroNews Portuguรชs
+ EuroNews Deutsch
+ EuroNews Franรงais
+ EuroNews Portuguรชs
EWTN Africa - Asia
Faith Africa
Food Network EMEA
diff --git a/sites/dstv.com/dstv.com_dj.channels.xml b/sites/dstv.com/dstv.com_dj.channels.xml
index b1be0e80..6faef52d 100644
--- a/sites/dstv.com/dstv.com_dj.channels.xml
+++ b/sites/dstv.com/dstv.com_dj.channels.xml
@@ -36,9 +36,9 @@
ESPN 2 Africa
ESPN Africa
E TV Africa
- EuroNews Deutsch
- EuroNews English
- EuroNews Franรงais
+ EuroNews Deutsch
+ EuroNews English
+ EuroNews Franรงais
EWTN Africa - Asia
Faith Africa
Food Network EMEA
diff --git a/sites/dstv.com/dstv.com_er.channels.xml b/sites/dstv.com/dstv.com_er.channels.xml
index a10309d0..0fdce57f 100644
--- a/sites/dstv.com/dstv.com_er.channels.xml
+++ b/sites/dstv.com/dstv.com_er.channels.xml
@@ -38,9 +38,9 @@
ESPN 2 Africa
ESPN Africa
E TV Africa
- EuroNews Deutsch
- EuroNews English
- EuroNews Franรงais
+ EuroNews Deutsch
+ EuroNews English
+ EuroNews Franรงais
EWTN Africa - Asia
Faith Africa
Food Network EMEA
diff --git a/sites/dstv.com/dstv.com_et.channels.xml b/sites/dstv.com/dstv.com_et.channels.xml
index ea4b1834..1f9cedef 100644
--- a/sites/dstv.com/dstv.com_et.channels.xml
+++ b/sites/dstv.com/dstv.com_et.channels.xml
@@ -47,9 +47,9 @@
ESPN Africa
E TV Africa
ETV News
- EuroNews Deutsch
- EuroNews English
- EuroNews Franรงais
+ EuroNews Deutsch
+ EuroNews English
+ EuroNews Franรงais
EWTN Africa - Asia
Faith Africa
Fana TV
diff --git a/sites/dstv.com/dstv.com_ga.channels.xml b/sites/dstv.com/dstv.com_ga.channels.xml
index 33fa180e..982529ed 100644
--- a/sites/dstv.com/dstv.com_ga.channels.xml
+++ b/sites/dstv.com/dstv.com_ga.channels.xml
@@ -39,9 +39,9 @@
ESPN 2 Africa
ESPN Africa
E TV Africa
- EuroNews Deutsch
- EuroNews English
- EuroNews Franรงais
+ EuroNews Deutsch
+ EuroNews English
+ EuroNews Franรงais
EWTN Africa - Asia
Faith Africa
Food Network EMEA
diff --git a/sites/dstv.com/dstv.com_gh.channels.xml b/sites/dstv.com/dstv.com_gh.channels.xml
index af480b87..b4e55cea 100644
--- a/sites/dstv.com/dstv.com_gh.channels.xml
+++ b/sites/dstv.com/dstv.com_gh.channels.xml
@@ -40,9 +40,9 @@
ESPN 2 Africa
ESPN Africa
E TV Africa
- EuroNews Deutsch
- EuroNews English
- EuroNews Franรงais
+ EuroNews Deutsch
+ EuroNews English
+ EuroNews Franรงais
EWTN Africa - Asia
Faith Africa
Food Network EMEA
diff --git a/sites/dstv.com/dstv.com_gm.channels.xml b/sites/dstv.com/dstv.com_gm.channels.xml
index ca0e6802..82f94926 100644
--- a/sites/dstv.com/dstv.com_gm.channels.xml
+++ b/sites/dstv.com/dstv.com_gm.channels.xml
@@ -38,9 +38,9 @@
ESPN 2 Africa
ESPN Africa
E TV Africa
- EuroNews Deutsch
- EuroNews English
- EuroNews Franรงais
+ EuroNews Deutsch
+ EuroNews English
+ EuroNews Franรงais
EWTN Africa - Asia
Faith Africa
Food Network EMEA
diff --git a/sites/dstv.com/dstv.com_gn.channels.xml b/sites/dstv.com/dstv.com_gn.channels.xml
index b95948e1..5b09ab9d 100644
--- a/sites/dstv.com/dstv.com_gn.channels.xml
+++ b/sites/dstv.com/dstv.com_gn.channels.xml
@@ -39,9 +39,9 @@
ESPN 2 Africa
ESPN Africa
E TV Africa
- EuroNews Deutsch
- EuroNews English
- EuroNews Franรงais
+ EuroNews Deutsch
+ EuroNews English
+ EuroNews Franรงais
EWTN Africa - Asia
Faith Africa
Food Network EMEA
diff --git a/sites/dstv.com/dstv.com_gq.channels.xml b/sites/dstv.com/dstv.com_gq.channels.xml
index ed6b7caf..3f7ce7bf 100644
--- a/sites/dstv.com/dstv.com_gq.channels.xml
+++ b/sites/dstv.com/dstv.com_gq.channels.xml
@@ -39,9 +39,9 @@
ESPN 2 Africa
ESPN Africa
E TV Africa
- EuroNews Deutsch
- EuroNews English
- EuroNews Franรงais
+ EuroNews Deutsch
+ EuroNews English
+ EuroNews Franรงais
EWTN Africa - Asia
Faith Africa
Food Network EMEA
diff --git a/sites/dstv.com/dstv.com_gw.channels.xml b/sites/dstv.com/dstv.com_gw.channels.xml
index 07d837b6..898883c3 100644
--- a/sites/dstv.com/dstv.com_gw.channels.xml
+++ b/sites/dstv.com/dstv.com_gw.channels.xml
@@ -39,9 +39,9 @@
ESPN 2 Africa
ESPN Africa
E TV Africa
- EuroNews Deutsch
- EuroNews English
- EuroNews Franรงais
+ EuroNews Deutsch
+ EuroNews English
+ EuroNews Franรงais
EWTN Africa - Asia
Faith Africa
Food Network EMEA
diff --git a/sites/dstv.com/dstv.com_ke.channels.xml b/sites/dstv.com/dstv.com_ke.channels.xml
index 8fcc000c..c04622de 100644
--- a/sites/dstv.com/dstv.com_ke.channels.xml
+++ b/sites/dstv.com/dstv.com_ke.channels.xml
@@ -44,9 +44,9 @@
ESPN Africa
E TV Africa
ETV News
- EuroNews Deutsch
- EuroNews English
- EuroNews Franรงais
+ EuroNews Deutsch
+ EuroNews English
+ EuroNews Franรงais
EWTN Africa - Asia
Faith Africa
Food Network EMEA
diff --git a/sites/dstv.com/dstv.com_lr.channels.xml b/sites/dstv.com/dstv.com_lr.channels.xml
index 30e523c3..b2b27f67 100644
--- a/sites/dstv.com/dstv.com_lr.channels.xml
+++ b/sites/dstv.com/dstv.com_lr.channels.xml
@@ -39,9 +39,9 @@
ESPN 2 Africa
ESPN Africa
E TV Africa
- EuroNews Deutsch
- EuroNews English
- EuroNews Franรงais
+ EuroNews Deutsch
+ EuroNews English
+ EuroNews Franรงais
EWTN Africa - Asia
Faith Africa
Food Network EMEA
diff --git a/sites/dstv.com/dstv.com_ls.channels.xml b/sites/dstv.com/dstv.com_ls.channels.xml
index b96f437a..0f6b26bd 100644
--- a/sites/dstv.com/dstv.com_ls.channels.xml
+++ b/sites/dstv.com/dstv.com_ls.channels.xml
@@ -47,7 +47,7 @@
ESPN Africa
E Toonz
E TV
- EuroNews English
+ EuroNews English
Faith Africa
FliekNet
Food Network EMEA
diff --git a/sites/dstv.com/dstv.com_mg.channels.xml b/sites/dstv.com/dstv.com_mg.channels.xml
index 109debcf..655d0613 100644
--- a/sites/dstv.com/dstv.com_mg.channels.xml
+++ b/sites/dstv.com/dstv.com_mg.channels.xml
@@ -39,9 +39,9 @@
ESPN 2 Africa
ESPN Africa
E TV Africa
- EuroNews Deutsch
- EuroNews English
- EuroNews Franรงais
+ EuroNews Deutsch
+ EuroNews English
+ EuroNews Franรงais
EWTN Africa - Asia
Faith Africa
Food Network EMEA
diff --git a/sites/dstv.com/dstv.com_ml.channels.xml b/sites/dstv.com/dstv.com_ml.channels.xml
index fc83cb19..14bf4d6c 100644
--- a/sites/dstv.com/dstv.com_ml.channels.xml
+++ b/sites/dstv.com/dstv.com_ml.channels.xml
@@ -39,9 +39,9 @@
ESPN 2 Africa
ESPN Africa
E TV Africa
- EuroNews Deutsch
- EuroNews English
- EuroNews Franรงais
+ EuroNews Deutsch
+ EuroNews English
+ EuroNews Franรงais
EWTN Africa - Asia
Faith Africa
Food Network EMEA
diff --git a/sites/dstv.com/dstv.com_mr.channels.xml b/sites/dstv.com/dstv.com_mr.channels.xml
index a6a24284..25242a9f 100644
--- a/sites/dstv.com/dstv.com_mr.channels.xml
+++ b/sites/dstv.com/dstv.com_mr.channels.xml
@@ -39,9 +39,9 @@
ESPN 2 Africa
ESPN Africa
E TV Africa
- EuroNews Deutsch
- EuroNews English
- EuroNews Franรงais
+ EuroNews Deutsch
+ EuroNews English
+ EuroNews Franรงais
EWTN Africa - Asia
Faith Africa
Food Network EMEA
diff --git a/sites/dstv.com/dstv.com_mu.channels.xml b/sites/dstv.com/dstv.com_mu.channels.xml
index e6f81d4f..3a2ef9ef 100644
--- a/sites/dstv.com/dstv.com_mu.channels.xml
+++ b/sites/dstv.com/dstv.com_mu.channels.xml
@@ -39,9 +39,9 @@
ESPN 2 Africa
ESPN Africa
E TV Africa
- EuroNews Deutsch
- EuroNews English
- EuroNews Franรงais
+ EuroNews Deutsch
+ EuroNews English
+ EuroNews Franรงais
EWTN Africa - Asia
Faith Africa
Food Network EMEA
diff --git a/sites/dstv.com/dstv.com_mw.channels.xml b/sites/dstv.com/dstv.com_mw.channels.xml
index 26e7c385..40c4769d 100644
--- a/sites/dstv.com/dstv.com_mw.channels.xml
+++ b/sites/dstv.com/dstv.com_mw.channels.xml
@@ -40,7 +40,7 @@
ESPN 2 Africa
ESPN Africa
E TV Africa
- EuroNews English
+ EuroNews English
Faith Africa
FliekNet
Food Network EMEA
diff --git a/sites/dstv.com/dstv.com_mz.channels.xml b/sites/dstv.com/dstv.com_mz.channels.xml
index de0a01e1..71296e8e 100644
--- a/sites/dstv.com/dstv.com_mz.channels.xml
+++ b/sites/dstv.com/dstv.com_mz.channels.xml
@@ -32,8 +32,8 @@
Emmanuel TV
ESPN 2 Africa
ESPN Africa
- EuroNews English
- EuroNews Portuguรชs
+ EuroNews English
+ EuroNews Portuguรชs
EWTN Africa - Asia
Faith Africa
Fรฉ TV
diff --git a/sites/dstv.com/dstv.com_na.channels.xml b/sites/dstv.com/dstv.com_na.channels.xml
index ef1f2358..1c9a9581 100644
--- a/sites/dstv.com/dstv.com_na.channels.xml
+++ b/sites/dstv.com/dstv.com_na.channels.xml
@@ -40,7 +40,7 @@
ESPN 2 Africa
ESPN Africa
E TV Africa
- EuroNews English
+ EuroNews English
Faith Africa
FliekNet
Food Network EMEA
diff --git a/sites/dstv.com/dstv.com_ne.channels.xml b/sites/dstv.com/dstv.com_ne.channels.xml
index 79af0c8b..68432e52 100644
--- a/sites/dstv.com/dstv.com_ne.channels.xml
+++ b/sites/dstv.com/dstv.com_ne.channels.xml
@@ -39,9 +39,9 @@
ESPN 2 Africa
ESPN Africa
E TV Africa
- EuroNews Deutsch
- EuroNews English
- EuroNews Franรงais
+ EuroNews Deutsch
+ EuroNews English
+ EuroNews Franรงais
EWTN Africa - Asia
Faith Africa
Food Network EMEA
diff --git a/sites/dstv.com/dstv.com_ng.channels.xml b/sites/dstv.com/dstv.com_ng.channels.xml
index f382bd1e..6878506c 100644
--- a/sites/dstv.com/dstv.com_ng.channels.xml
+++ b/sites/dstv.com/dstv.com_ng.channels.xml
@@ -42,9 +42,9 @@
ESPN 2 Africa
ESPN Africa
E TV Africa
- EuroNews Deutsch
- EuroNews English
- EuroNews Franรงais
+ EuroNews Deutsch
+ EuroNews English
+ EuroNews Franรงais
EWTN Africa - Asia
Faith Africa
Food Network EMEA
diff --git a/sites/dstv.com/dstv.com_rw.channels.xml b/sites/dstv.com/dstv.com_rw.channels.xml
index 804f51da..507bc666 100644
--- a/sites/dstv.com/dstv.com_rw.channels.xml
+++ b/sites/dstv.com/dstv.com_rw.channels.xml
@@ -40,8 +40,8 @@
ESPN 2 Africa
ESPN Africa
E TV Africa
- EuroNews English
- EuroNews Franรงais
+ EuroNews English
+ EuroNews Franรงais
EWTN Africa - Asia
Faith Africa
Food Network EMEA
diff --git a/sites/dstv.com/dstv.com_sc.channels.xml b/sites/dstv.com/dstv.com_sc.channels.xml
index df8e6bf5..de4df7cb 100644
--- a/sites/dstv.com/dstv.com_sc.channels.xml
+++ b/sites/dstv.com/dstv.com_sc.channels.xml
@@ -38,9 +38,9 @@
ESPN 2 Africa
ESPN Africa
E TV Africa
- EuroNews Deutsch
- EuroNews English
- EuroNews Franรงais
+ EuroNews Deutsch
+ EuroNews English
+ EuroNews Franรงais
EWTN Africa - Asia
Faith Africa
Food Network EMEA
diff --git a/sites/dstv.com/dstv.com_sd.channels.xml b/sites/dstv.com/dstv.com_sd.channels.xml
index 4b9c8255..079c311f 100644
--- a/sites/dstv.com/dstv.com_sd.channels.xml
+++ b/sites/dstv.com/dstv.com_sd.channels.xml
@@ -34,9 +34,9 @@
ESPN 2 Africa
ESPN Africa
E TV Africa
- EuroNews Deutsch
- EuroNews English
- EuroNews Franรงais
+ EuroNews Deutsch
+ EuroNews English
+ EuroNews Franรงais
EWTN Africa - Asia
Faith Africa
Food Network EMEA
diff --git a/sites/dstv.com/dstv.com_sl.channels.xml b/sites/dstv.com/dstv.com_sl.channels.xml
index 2a17d0f1..a09d1c06 100644
--- a/sites/dstv.com/dstv.com_sl.channels.xml
+++ b/sites/dstv.com/dstv.com_sl.channels.xml
@@ -39,9 +39,9 @@
ESPN 2 Africa
ESPN Africa
E TV Africa
- EuroNews Deutsch
- EuroNews English
- EuroNews Franรงais
+ EuroNews Deutsch
+ EuroNews English
+ EuroNews Franรงais
EWTN Africa - Asia
Faith Africa
Food Network EMEA
diff --git a/sites/dstv.com/dstv.com_sn.channels.xml b/sites/dstv.com/dstv.com_sn.channels.xml
index 5e4ebce3..edf82601 100644
--- a/sites/dstv.com/dstv.com_sn.channels.xml
+++ b/sites/dstv.com/dstv.com_sn.channels.xml
@@ -39,9 +39,9 @@
ESPN 2 Africa
ESPN Africa
E TV Africa
- EuroNews Deutsch
- EuroNews English
- EuroNews Franรงais
+ EuroNews Deutsch
+ EuroNews English
+ EuroNews Franรงais
EWTN Africa - Asia
Faith Africa
Food Network EMEA
diff --git a/sites/dstv.com/dstv.com_so.channels.xml b/sites/dstv.com/dstv.com_so.channels.xml
index e36d2198..d6cd8f1d 100644
--- a/sites/dstv.com/dstv.com_so.channels.xml
+++ b/sites/dstv.com/dstv.com_so.channels.xml
@@ -35,9 +35,9 @@
ESPN 2 Africa
ESPN Africa
E TV Africa
- EuroNews Deutsch
- EuroNews English
- EuroNews Franรงais
+ EuroNews Deutsch
+ EuroNews English
+ EuroNews Franรงais
EWTN Africa - Asia
Faith Africa
Food Network EMEA
diff --git a/sites/dstv.com/dstv.com_ss.channels.xml b/sites/dstv.com/dstv.com_ss.channels.xml
index 7eacf942..0c53c890 100644
--- a/sites/dstv.com/dstv.com_ss.channels.xml
+++ b/sites/dstv.com/dstv.com_ss.channels.xml
@@ -37,9 +37,9 @@
ESPN 2 Africa
ESPN Africa
E TV Africa
- EuroNews Deutsch
- EuroNews English
- EuroNews Franรงais
+ EuroNews Deutsch
+ EuroNews English
+ EuroNews Franรงais
EWTN Africa - Asia
Faith Africa
Food Network EMEA
diff --git a/sites/dstv.com/dstv.com_st.channels.xml b/sites/dstv.com/dstv.com_st.channels.xml
index d6353931..f99d7c5b 100644
--- a/sites/dstv.com/dstv.com_st.channels.xml
+++ b/sites/dstv.com/dstv.com_st.channels.xml
@@ -39,9 +39,9 @@
ESPN 2 Africa
ESPN Africa
E TV Africa
- EuroNews Deutsch
- EuroNews English
- EuroNews Franรงais
+ EuroNews Deutsch
+ EuroNews English
+ EuroNews Franรงais
EWTN Africa - Asia
Faith Africa
Food Network EMEA
diff --git a/sites/dstv.com/dstv.com_sz.channels.xml b/sites/dstv.com/dstv.com_sz.channels.xml
index d95576f4..e46b7bce 100644
--- a/sites/dstv.com/dstv.com_sz.channels.xml
+++ b/sites/dstv.com/dstv.com_sz.channels.xml
@@ -40,7 +40,7 @@
ESPN 2 Africa
ESPN Africa
E TV Africa
- EuroNews English
+ EuroNews English
Faith Africa
FliekNet
Food Network EMEA
diff --git a/sites/dstv.com/dstv.com_td.channels.xml b/sites/dstv.com/dstv.com_td.channels.xml
index 2a80971c..2e16d5f0 100644
--- a/sites/dstv.com/dstv.com_td.channels.xml
+++ b/sites/dstv.com/dstv.com_td.channels.xml
@@ -37,9 +37,9 @@
ESPN 2 Africa
ESPN Africa
E TV Africa
- EuroNews Deutsch
- EuroNews English
- EuroNews Franรงais
+ EuroNews Deutsch
+ EuroNews English
+ EuroNews Franรงais
EWTN Africa - Asia
Faith Africa
Food Network EMEA
diff --git a/sites/dstv.com/dstv.com_tg.channels.xml b/sites/dstv.com/dstv.com_tg.channels.xml
index 800e8b7d..8eae6273 100644
--- a/sites/dstv.com/dstv.com_tg.channels.xml
+++ b/sites/dstv.com/dstv.com_tg.channels.xml
@@ -47,9 +47,9 @@
ESPN 2 Africa
ESPN Africa
E TV Africa
- EuroNews Deutsch
- EuroNews English
- EuroNews Franรงais
+ EuroNews Deutsch
+ EuroNews English
+ EuroNews Franรงais
EWTN Africa - Asia
Faith Africa
Food Network EMEA
diff --git a/sites/dstv.com/dstv.com_ug.channels.xml b/sites/dstv.com/dstv.com_ug.channels.xml
index 74e46bf6..dd8a5915 100644
--- a/sites/dstv.com/dstv.com_ug.channels.xml
+++ b/sites/dstv.com/dstv.com_ug.channels.xml
@@ -48,9 +48,9 @@
ESPN Africa
E TV Africa
ETV News
- EuroNews Deutsch
- EuroNews English
- EuroNews Franรงais
+ EuroNews Deutsch
+ EuroNews English
+ EuroNews Franรงais
EWTN Africa - Asia
Faith Africa
Food Network EMEA
diff --git a/sites/dstv.com/dstv.com_za.channels.xml b/sites/dstv.com/dstv.com_za.channels.xml
index 700a3fe2..9eecf044 100644
--- a/sites/dstv.com/dstv.com_za.channels.xml
+++ b/sites/dstv.com/dstv.com_za.channels.xml
@@ -48,7 +48,7 @@
ESPN Africa
E Toonz
E TV
- EuroNews English
+ EuroNews English
Faith Africa
FliekNet
Food Network EMEA
diff --git a/sites/dstv.com/dstv.com_zm.channels.xml b/sites/dstv.com/dstv.com_zm.channels.xml
index 31affc4f..e4b62db9 100644
--- a/sites/dstv.com/dstv.com_zm.channels.xml
+++ b/sites/dstv.com/dstv.com_zm.channels.xml
@@ -42,7 +42,7 @@
ESPN 2 Africa
ESPN Africa
E TV Africa
- EuroNews English
+ EuroNews English
Faith Africa
FliekNet
Food Network EMEA
diff --git a/sites/dstv.com/dstv.com_zw.channels.xml b/sites/dstv.com/dstv.com_zw.channels.xml
index 842bce0b..b5ab31b3 100644
--- a/sites/dstv.com/dstv.com_zw.channels.xml
+++ b/sites/dstv.com/dstv.com_zw.channels.xml
@@ -40,7 +40,7 @@
ESPN 2 Africa
ESPN Africa
E TV Africa
- EuroNews English
+ EuroNews English
Faith Africa
FliekNet
Food Network EMEA
diff --git a/sites/guidatv.sky.it/guidatv.sky.it_it.channels.xml b/sites/guidatv.sky.it/guidatv.sky.it_it.channels.xml
index 23bfe43e..d2b9e922 100644
--- a/sites/guidatv.sky.it/guidatv.sky.it_it.channels.xml
+++ b/sites/guidatv.sky.it/guidatv.sky.it_it.channels.xml
@@ -32,7 +32,7 @@
Discovery Science Italia
DMAX Italia
Emilia-Romagna 24
- EuroNews Italiano
+ EuroNews Italiano
Eurosport 1 Italia
Eurosport 2 Italia
Focus
@@ -101,7 +101,7 @@
Real Time Italia
Rete 4
RT Documentary
- RTL 102.5 RadioVisione
+ RTL 102.5 RadioVisione
RT News
San Marino RTV
Sky Arte
diff --git a/sites/hd-plus.de/hd-plus.de_de.channels.xml b/sites/hd-plus.de/hd-plus.de_de.channels.xml
index 40a6d29f..06193689 100644
--- a/sites/hd-plus.de/hd-plus.de_de.channels.xml
+++ b/sites/hd-plus.de/hd-plus.de_de.channels.xml
@@ -27,7 +27,7 @@
Disney Channel Deutschland
DMAX Deutschland
E! Europe
- EuroNews Deutsch
+ EuroNews Deutsch
Eurosport 1 Germany
EWTN auf Deutsch
Franken Fernsehen
@@ -87,8 +87,8 @@
Sixx Deutschland
Sky Atlantic
Sky Cinema Action
- Sky Cinema Hits
- Sky Cinema Nostalgie
+ Sky Cinema Hits
+ Sky Cinema Nostalgie
Sky Comedy
Sky Krimi
Sky Sport 1
diff --git a/sites/horizon.tv/horizon.tv.config.js b/sites/horizon.tv/horizon.tv.config.js
new file mode 100644
index 00000000..de72115c
--- /dev/null
+++ b/sites/horizon.tv/horizon.tv.config.js
@@ -0,0 +1,70 @@
+const axios = require('axios')
+const dayjs = require('dayjs')
+
+const API_ENDPOINT = `https://legacy-static.oesp.horizon.tv/oesp/v4/DE/deu/web/programschedules`
+
+module.exports = {
+ site: 'horizon.tv',
+ url: function ({ date }) {
+ return `${API_ENDPOINT}/${date.format('YYYYMMDD')}/1`
+ },
+ async parser({ content, channel, date }) {
+ let programs = []
+ let items = parseItems(content, channel)
+ if (!items.length) return programs
+ const d = date.format('YYYYMMDD')
+ const promises = [
+ axios.get(`${API_ENDPOINT}/${d}/2`),
+ axios.get(`${API_ENDPOINT}/${d}/3`),
+ axios.get(`${API_ENDPOINT}/${d}/4`)
+ ]
+ await Promise.allSettled(promises)
+ .then(results => {
+ results.forEach(r => {
+ if (r.status === 'fulfilled') {
+ items = items.concat(parseItems(r.value.data, channel))
+ }
+ })
+ })
+ .catch(console.error)
+ items.forEach(item => {
+ programs.push({
+ title: item.t,
+ start: parseStart(item),
+ stop: parseStop(item)
+ })
+ })
+
+ return programs
+ },
+ async channels() {
+ const data = await axios
+ .get(`https://legacy-dynamic.oesp.horizon.tv/oesp/v4/DE/deu/web/channels`)
+ .then(r => r.data)
+ .catch(console.log)
+
+ return data.channels.map(item => {
+ return {
+ lang: 'de',
+ site_id: item.id.replace('lgi-obolite-de-prod-master:65535-', ''),
+ name: item.title
+ }
+ })
+ }
+}
+
+function parseStart(item) {
+ return dayjs(item.s)
+}
+
+function parseStop(item) {
+ return dayjs(item.e)
+}
+
+function parseItems(content, channel) {
+ const data = typeof content === 'string' ? JSON.parse(content) : content
+ if (!data || !Array.isArray(data.entries)) return []
+ const entity = data.entries.find(e => e.o === `lgi-obolite-de-prod-master:${channel.site_id}`)
+
+ return entity ? entity.l : []
+}
diff --git a/sites/horizon.tv/horizon.tv.test.js b/sites/horizon.tv/horizon.tv.test.js
new file mode 100644
index 00000000..9edc73cd
--- /dev/null
+++ b/sites/horizon.tv/horizon.tv.test.js
@@ -0,0 +1,105 @@
+// npm run channels:parse -- --config=./sites/horizon.tv/horizon.tv.config.js --output=./sites/horizon.tv/horizon.tv_de.channels.xml
+// npx epg-grabber --config=sites/horizon.tv/horizon.tv.config.js --channels=sites/horizon.tv/horizon.tv_de.channels.xml --output=guide.xml --days=2
+
+const { parser, url } = require('./horizon.tv.config.js')
+const axios = require('axios')
+const dayjs = require('dayjs')
+const utc = require('dayjs/plugin/utc')
+const customParseFormat = require('dayjs/plugin/customParseFormat')
+dayjs.extend(customParseFormat)
+dayjs.extend(utc)
+
+jest.mock('axios')
+
+const date = dayjs.utc('2022-03-09', 'YYYY-MM-DD').startOf('d')
+const channel = {
+ site_id: '123_tv',
+ xmltv_id: '123TV.de'
+}
+
+it('can generate valid url', () => {
+ expect(url({ date })).toBe(
+ 'https://legacy-static.oesp.horizon.tv/oesp/v4/DE/deu/web/programschedules/20220309/1'
+ )
+})
+
+it('can parse response', done => {
+ const content = `{"entries":[{"o":"lgi-obolite-de-prod-master:123_tv","l":[{"i":"crid:~~2F~~2Fmedia-press.tv~~2F265057185,imi:b6915913733f74d3d92ebdba58340d133fd5632b","t":"DuftGeheimnis","s":1646776800000,"e":1646780400000,"c":"lgi-obolite-de-prod-master:genre-18","a":false,"r":false,"rm":false,"ad":[],"sl":[]}]}]}`
+
+ axios.get.mockImplementation(url => {
+ if (
+ url === 'https://legacy-static.oesp.horizon.tv/oesp/v4/DE/deu/web/programschedules/20220309/2'
+ ) {
+ return Promise.resolve({
+ data: JSON.parse(
+ `{"entries":[{"o":"lgi-obolite-de-prod-master:123_tv","l":[{"i":"crid:~~2F~~2Fmedia-press.tv~~2F263411037,imi:152c4e326ba8e52f91d10b28e4fd8544ff9cbade","t":"1-2-3.tv Morning-Deals","s":1646798400000,"e":1646802000000,"c":"lgi-obolite-de-prod-master:genre-18","a":false,"r":false,"rm":false,"ad":[],"sl":[]}]}]}`
+ )
+ })
+ } else if (
+ url === 'https://legacy-static.oesp.horizon.tv/oesp/v4/DE/deu/web/programschedules/20220309/3'
+ ) {
+ return Promise.resolve({
+ data: JSON.parse(
+ `{"entries":[{"o":"lgi-obolite-de-prod-master:123_tv","l":[{"i":"crid:~~2F~~2Fmedia-press.tv~~2F265166355,imi:2c61f3f21d3599e7b1f1aacdec066389688296a6","t":"Confiserie","s":1646820000000,"e":1646823600000,"c":"lgi-obolite-de-prod-master:genre-18","a":false,"r":false,"rm":false,"ad":[],"sl":[]}]}]}`
+ )
+ })
+ } else if (
+ url === 'https://legacy-static.oesp.horizon.tv/oesp/v4/DE/deu/web/programschedules/20220309/4'
+ ) {
+ return Promise.resolve({
+ data: JSON.parse(
+ `{"entries":[{"o":"lgi-obolite-de-prod-master:123_tv","l":[{"i":"crid:~~2F~~2Fmedia-press.tv~~2F265166350,imi:d8e2a799e061e6390f49bcf4f12df65f2c761bb6","t":"Sneaker World","s":1646841600000,"e":1646845200000,"c":"lgi-obolite-de-prod-master:genre-18","a":false,"r":false,"rm":false,"ad":[],"sl":[]}]}]}`
+ )
+ })
+ } else {
+ return Promise.resolve({ data: '' })
+ }
+ })
+
+ parser({ content, channel, date })
+ .then(result => {
+ result = result.map(p => {
+ p.start = p.start.toJSON()
+ p.stop = p.stop.toJSON()
+ return p
+ })
+
+ expect(result).toMatchObject([
+ {
+ start: '2022-03-08T22:00:00.000Z',
+ stop: '2022-03-08T23:00:00.000Z',
+ title: 'DuftGeheimnis'
+ },
+ {
+ start: '2022-03-09T04:00:00.000Z',
+ stop: '2022-03-09T05:00:00.000Z',
+ title: '1-2-3.tv Morning-Deals'
+ },
+ {
+ start: '2022-03-09T10:00:00.000Z',
+ stop: '2022-03-09T11:00:00.000Z',
+ title: 'Confiserie'
+ },
+ {
+ start: '2022-03-09T16:00:00.000Z',
+ stop: '2022-03-09T17:00:00.000Z',
+ title: 'Sneaker World'
+ }
+ ])
+ done()
+ })
+ .catch(done)
+})
+
+it('can handle empty guide', done => {
+ parser({
+ content: `[{"type":"PATH_PARAM","code":"period","reason":"INVALID"}]`,
+ channel,
+ date
+ })
+ .then(result => {
+ expect(result).toMatchObject([])
+ done()
+ })
+ .catch(done)
+})
diff --git a/sites/horizon.tv/horizon.tv_de.channels.xml b/sites/horizon.tv/horizon.tv_de.channels.xml
new file mode 100644
index 00000000..6ab30add
--- /dev/null
+++ b/sites/horizon.tv/horizon.tv_de.channels.xml
@@ -0,0 +1,250 @@
+
+
+
+ 1-2-3.tv
+ 13th Street HD
+ 3sat
+ Al Arabiya
+ Al Jazeera
+ Antenna TV
+ ARD-alpha
+ arte
+ Astro TV
+ ATV Avrupa
+ Baby TV
+ Balkanika Music Television
+ BBC World News
+ Beate Uhse HD
+ Bibel TV
+ BILD HD
+ Bloomberg
+ BN TV
+ Boomerang
+ BR Fernsehen Nord
+ BR Fernsehen Sรผd
+ BVN
+ 24Horas
+ Cartoon Network
+ CGTN
+ CGTN Documentary
+ Channel21
+ CMC
+ CNBC
+ CNN
+ COMEDY CENTRAL
+ Crime + Investigation
+ Das Erste
+ DELUXE MUSIC
+ Deutsches Musik Fernsehen
+ DIE NEUE ZEIT TV
+ Discovery Channel HD
+ Disney HD
+ DMAX
+ DM SAT
+ ERT World
+ eSPORTS1 HD
+ EURO D
+ euronews (D)
+ Eurosport1 HD
+ EUROSPORT 2
+ Eurosport360HD 1
+ Eurosport360HD 2
+ Eurosport360HD 3
+ Eurosport360HD 4
+ Eurosport360HD 5
+ Eurosport360HD 6
+ Eurosport360HD 7
+ Eurosport360HD 8
+ Eurosport360HD 9
+ EURO STAR
+ Fashion TV
+ Fix&Foxi
+ Fox HD
+ France 2
+ France 24 (in English)
+ France 24 (en francais)
+ France 3
+ France 4
+ France 5
+ GEO TV HD
+ Ginx TV
+ Habertรผrk
+ Handystar
+ Hayat TV
+ Heimatkanal
+ HOME & GARDEN TV HD
+ The HISTORY Channel
+ HopeTV
+ hr-fernsehen
+ HRT TV 1
+ HSE
+ HSE Extra
+ HSE Trend
+ itvn
+ JSTV
+ Junior
+ Juwelo
+ kabel eins classics
+ Kabel eins HD
+ kabel eins Doku
+ Kanal 7
+ KIKA
+ Kinowelt TV HD
+ Klan Kosova
+ Kohavision TV
+ k-tv
+ Lust Pur
+ MBC Maghreb al Arabia
+ MDR Sachsen
+ MDR S-Anhalt
+ MDR Thรผringen HD
+ Mediaset
+ Motorvision
+ MTV
+ N24 Doku
+ Nasch Kinomir
+ NatGeo HD
+ National Geographic Wild HD
+ NDR FS HH
+ NDR FS MV
+ NDR FS NDS
+ NDR FS SH
+ NHK WORLD-JAPAN
+ Nick HD
+ Nick.Jr.
+ Nitro
+ Nederland 2
+ NRWision HD
+ ntv
+ NTV Mir
+ ONE HD
+ OstWest
+ Channel One Russia
+ phoenix
+ Pink Extra
+ Pink Film
+ Pink FOLK
+ Pink Music
+ Pink Plus
+ ProSieben HD
+ ProSieben FUN HD
+ ProSieben MAXX
+ Pro TV International
+ KAZAKH TV
+ QVC
+ QVC Style
+ QVC ZWEI
+ Radio Bremen TV
+ Rai Uno
+ Rai Due
+ Rai Tre
+ Rai News 24
+ Rai Storia
+ rbb Berlin
+ rbb Brandenburg
+ Record Internacional
+ RiC
+ Romance TV
+ RTK1
+ RTL Crime HD
+ RTL
+ RTL Living HD
+ RTLup
+ RTLZWEI
+ Russia Today
+ RTPi
+ RTR Planeta
+ RTS Sat
+ RTV21
+ SAT.1
+ SAT.1 emotions
+ SAT.1 GOLD
+ SonLife
+ ServusTV
+ Show Max
+ SHOW TURK
+ Silverline Movie Channel
+ SIXX
+ Sky Atlantic HD
+ Sky Cinema Action HD
+ Sky Cinema Best Of HD
+ Sky Cinema Classics
+ Sky Cinema Family
+ Sky Cinema Fun
+ Sky Cinema Premieren HD
+ Sky Cinema Premieren +24
+ Sky Cinema Special HD
+ Sky Cinema Thriller HD
+ Sky Comedy HD
+ Sky Crime HD
+ Sky Documentaries HD
+ Sky Krimi HD
+ Sky Nature HD
+ Sky One HD
+ Sky Replay HD
+ Sky Serien & Shows HD
+ Sky Sport 10 HD
+ Sky Sport 11 HD
+ Sky Sport 1 HD
+ Sky Sport 2 HD
+ Sky Sport 3 HD
+ Sky Sport 4 HD
+ Sky Sport 5 HD
+ Sky Sport 6 HD
+ Sky Sport 7 HD
+ Sky Sport 8 HD
+ Sky Sport 9 HD
+ Sky Sport Bundesliga 10 HD
+ Sky Sport Bundesliga 1 HD
+ Sky Sport Bundesliga 2 HD
+ Sky Sport Bundesliga 3 HD
+ Sky Sport Bundesliga 4 HD
+ Sky Sport Bundesliga 5 HD
+ Sky Sport Bundesliga 6 HD
+ Sky Sport Bundesliga 7 HD
+ Sky Sport Bundesliga 8 HD
+ Sky Sport Bundesliga 9 HD
+ Sky Sport F1 HD
+ Sky Sport News HD
+ sonnenklar.TV
+ SONY AXN
+ SONY CHANNEL HD
+ Spiegel Geschichte
+ Spiegel TV Wissen HD
+ Sport1 HD
+ Sport1+
+ SPORTDIGITAL FUSSBALL
+ SR Fernsehen HD
+ Super RTL
+ SWR BW HD
+ SWR Fernsehen RP
+ SYFY HD
+ tagesschau24 HD
+ Tele 5
+ Telebom / Tele Dom
+ TLC
+ TOGGO plus
+ TRT Tรผrk
+ TV5MONDE Europe
+ TV 8
+ TV Crne Gore Sat
+ TVE Internacional
+ TVN 24
+ TV Polonia
+ iTVS
+ Universal TV HD
+ Vodafone TV
+ VOX
+ VOXup
+ Warner TV Comedy HD
+ Warner TV Film
+ Warner TV Serie
+ WDR Aachen
+ WDR Bonn
+ WDR Kรถln HD
+ WELT
+ ZDF
+ ZDFinfo HD
+ zdf_neo
+
+
diff --git a/sites/i24news.tv/i24news.tv.config.js b/sites/i24news.tv/i24news.tv.config.js
new file mode 100644
index 00000000..7141e34d
--- /dev/null
+++ b/sites/i24news.tv/i24news.tv.config.js
@@ -0,0 +1,66 @@
+const dayjs = require('dayjs')
+const utc = require('dayjs/plugin/utc')
+const timezone = require('dayjs/plugin/timezone')
+const customParseFormat = require('dayjs/plugin/customParseFormat')
+
+dayjs.extend(utc)
+dayjs.extend(timezone)
+dayjs.extend(customParseFormat)
+
+module.exports = {
+ site: 'i24news.tv',
+ url: function ({ channel }) {
+ const [lang] = channel.site_id.split('#')
+
+ return `https://api.i24news.tv/v2/${lang}/schedules/world`
+ },
+ parser: function ({ content, date }) {
+ let programs = []
+ const items = parseItems(content, date)
+ items.forEach(item => {
+ if (!item.show) return
+ programs.push({
+ title: item.show.title,
+ description: item.show.body,
+ icon: parseIcon(item),
+ start: parseStart(item, date),
+ stop: parseStop(item, date)
+ })
+ })
+
+ return programs
+ }
+}
+
+function parseIcon(item) {
+ return item.show.image ? item.show.image.href : null
+}
+
+function parseStart(item, date) {
+ if (!item.startHour) return null
+
+ return dayjs.tz(
+ `${date.format('YYYY-MM-DD')} ${item.startHour}`,
+ 'YYYY-MM-DD HH:mm',
+ 'Asia/Jerusalem'
+ )
+}
+
+function parseStop(item, date) {
+ if (!item.endHour) return null
+
+ return dayjs.tz(
+ `${date.format('YYYY-MM-DD')} ${item.endHour}`,
+ 'YYYY-MM-DD HH:mm',
+ 'Asia/Jerusalem'
+ )
+}
+
+function parseItems(content, date) {
+ const data = JSON.parse(content)
+ if (!Array.isArray(data)) return []
+ let day = date.day() - 1
+ day = day < 0 ? 6 : day
+
+ return data.filter(item => item.day === day)
+}
diff --git a/sites/i24news.tv/i24news.tv.test.js b/sites/i24news.tv/i24news.tv.test.js
new file mode 100644
index 00000000..f08e76cc
--- /dev/null
+++ b/sites/i24news.tv/i24news.tv.test.js
@@ -0,0 +1,45 @@
+// npx epg-grabber --config=sites/i24news.tv/i24news.tv.config.js --channels=sites/i24news.tv/i24news.tv_il.channels.xml --output=guide.xml --days=2
+
+const { parser, url } = require('./i24news.tv.config.js')
+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('2022-03-06', 'YYYY-MM-DD').startOf('d')
+const channel = {
+ site_id: 'ar#',
+ xmltv_id: 'I24NewsArabic.il'
+}
+
+it('can generate valid url', () => {
+ expect(url({ channel })).toBe('https://api.i24news.tv/v2/ar/schedules/world')
+})
+
+it('can parse response', () => {
+ const content = `[{"id":348995,"startHour":"22:30","endHour":"23:00","day":5,"firstDiffusion":false,"override":false,"show":{"parsedBody":[{"type":"text","text":"Special Edition"}],"id":131,"title":"ุชุบุทูุฉ ุฎุงุตุฉ","body":"Special Edition","slug":"Special-Edition-ุชุบุทูุฉ-ุฎุงุตุฉ","visible":true,"image":{"id":1142467,"credit":"","legend":"","href":"https://cdn.i24news.tv/uploads/a1/be/85/20/69/6f/32/1c/ed/b0/f8/5c/f6/1c/40/f9/a1be8520696f321cedb0f85cf61c40f9.png"}}},{"id":349023,"startHour":"15:00","endHour":"15:28","day":6,"firstDiffusion":false,"override":false,"show":{"parsedBody":[{"type":"text","text":"Special Edition"}],"id":131,"title":"ุชุบุทูุฉ ุฎุงุตุฉ","body":"Special Edition","slug":"Special-Edition-ุชุบุทูุฉ-ุฎุงุตุฉ","visible":true,"image":{"id":1142467,"credit":"","legend":"","href":"https://cdn.i24news.tv/uploads/a1/be/85/20/69/6f/32/1c/ed/b0/f8/5c/f6/1c/40/f9/a1be8520696f321cedb0f85cf61c40f9.png"}}}]`
+ const result = parser({ content, date }).map(p => {
+ p.start = p.start.toJSON()
+ p.stop = p.stop.toJSON()
+ return p
+ })
+
+ expect(result).toMatchObject([
+ {
+ start: '2022-03-06T13:00:00.000Z',
+ stop: '2022-03-06T13:28:00.000Z',
+ title: 'ุชุบุทูุฉ ุฎุงุตุฉ',
+ description: 'Special Edition',
+ icon: 'https://cdn.i24news.tv/uploads/a1/be/85/20/69/6f/32/1c/ed/b0/f8/5c/f6/1c/40/f9/a1be8520696f321cedb0f85cf61c40f9.png'
+ }
+ ])
+})
+
+it('can handle empty guide', () => {
+ const result = parser({
+ content: `[]`,
+ date
+ })
+ expect(result).toMatchObject([])
+})
diff --git a/sites/i24news.tv/i24news.tv_il.channels.xml b/sites/i24news.tv/i24news.tv_il.channels.xml
new file mode 100644
index 00000000..f792fe10
--- /dev/null
+++ b/sites/i24news.tv/i24news.tv_il.channels.xml
@@ -0,0 +1,8 @@
+
+
+
+ i24News Arabic
+ i24News English
+ i24 News Franรงais
+
+
diff --git a/sites/ipko.com/ipko.com.test.js b/sites/ipko.com/ipko.com.test.js
index 1331f97c..ecdaaa44 100644
--- a/sites/ipko.com/ipko.com.test.js
+++ b/sites/ipko.com/ipko.com.test.js
@@ -10,7 +10,7 @@ dayjs.extend(utc)
const date = dayjs.utc('2021-10-24', 'YYYY-MM-DD').startOf('d')
const channel = {
site_id: '406',
- xmltv_id: 'RTK1.rs'
+ xmltv_id: 'RTK1.xk'
}
const content = `{"element":{"1":[{"id":6367,"channel_id":406,"program_name":"Beautiful People 13","name_short":"","description":"Lin largohet nga Nju Meksiko pรซr t'u vendosur nรซ Nju Jork e pรซr t'ia nisur nga fillimi: njรซ punรซ tรซ re, shtรซpi tรซ re dhe njohje tรซ reja. Bashkรซ me tรซ janรซ vajzat e saj, Sofia, njรซ 16 vjeรงare qรซ shkรซlqen nรซ shkollรซ, dhe Kareni, 20 vjeรงare, qรซ do tรซ bรซ","category":"Sezoni I","duration":150,"day":"Sun","left_distanc":165,"date":"00:55:00"}]}}`
diff --git a/sites/ipko.com/ipko.com_al.channels.xml b/sites/ipko.com/ipko.com_al.channels.xml
index ca98b7df..48b53b71 100644
--- a/sites/ipko.com/ipko.com_al.channels.xml
+++ b/sites/ipko.com/ipko.com_al.channels.xml
@@ -34,7 +34,7 @@
Rai 1
Rai 2
Rai 3
- RTK 1
+ RTK 1
RTV 21 Sat
Stinรซt
diff --git a/sites/kan.org.il/kan.org.il.config.js b/sites/kan.org.il/kan.org.il.config.js
new file mode 100644
index 00000000..b4733a1c
--- /dev/null
+++ b/sites/kan.org.il/kan.org.il.config.js
@@ -0,0 +1,51 @@
+const dayjs = require('dayjs')
+const utc = require('dayjs/plugin/utc')
+const timezone = require('dayjs/plugin/timezone')
+const customParseFormat = require('dayjs/plugin/customParseFormat')
+
+dayjs.extend(utc)
+dayjs.extend(timezone)
+dayjs.extend(customParseFormat)
+
+module.exports = {
+ site: 'kan.org.il',
+ url: function ({ channel, date }) {
+ return `https://www.kan.org.il/tv-guide/tv_guidePrograms.ashx?stationID=${
+ channel.site_id
+ }&day=${date.format('DD/MM/YYYY')}`
+ },
+ parser: function ({ content }) {
+ let programs = []
+ const items = parseItems(content)
+ items.forEach(item => {
+ programs.push({
+ title: item.title,
+ description: item.live_desc,
+ icon: item.picture_code,
+ start: parseStart(item),
+ stop: parseStop(item)
+ })
+ })
+
+ return programs
+ }
+}
+
+function parseStart(item) {
+ if (!item.start_time) return null
+
+ return dayjs.tz(item.start_time, 'YYYY-MM-DDTHH:mm:ss', 'Asia/Jerusalem')
+}
+
+function parseStop(item) {
+ if (!item.end_time) return null
+
+ return dayjs.tz(item.end_time, 'YYYY-MM-DDTHH:mm:ss', 'Asia/Jerusalem')
+}
+
+function parseItems(content) {
+ const data = JSON.parse(content)
+ if (!Array.isArray(data)) return []
+
+ return data
+}
diff --git a/sites/kan.org.il/kan.org.il.test.js b/sites/kan.org.il/kan.org.il.test.js
new file mode 100644
index 00000000..e4e9d4fb
--- /dev/null
+++ b/sites/kan.org.il/kan.org.il.test.js
@@ -0,0 +1,47 @@
+// npx epg-grabber --config=sites/kan.org.il/kan.org.il.config.js --channels=sites/kan.org.il/kan.org.il_il.channels.xml --output=guide.xml --days=2
+
+const { parser, url } = require('./kan.org.il.config.js')
+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('2022-03-06', 'YYYY-MM-DD').startOf('d')
+const channel = {
+ site_id: '19',
+ xmltv_id: 'KANEducational.il'
+}
+
+it('can generate valid url', () => {
+ expect(url({ channel, date })).toBe(
+ 'https://www.kan.org.il/tv-guide/tv_guidePrograms.ashx?stationID=19&day=06/03/2022'
+ )
+})
+
+it('can parse response', () => {
+ const content = `[{"title":"ืืจืฅ ืืืืืช - ืืื ืชืืจืืื ืืืจืืื ืื","start_time":"2022-03-06T00:05:37","end_time":"2022-03-06T00:27:12","id":"2598","age_category_desc":"0","epg_name":"ืืจืฅ ืืืืืช","title1":"ืืจืฅ ืืืืืช - ืืื ืชืืจืืื ืืืจืืื ืื","chapter_number":"9","live_desc":"ืงืืืฆืช ืชืืืืืื ืืชืืจืื ืช ืืคืจืืฅ ืืืืืช ืืขืืื ืืจืืฉืื ื ืืืืืฉ ืขืืจื ืืืฉืื. ืืืืฆืขืืช ืืชืืืืืื ืืืื ืืฆืืคื ืขื ืืขืืืชืื ืฉื ืืืฉืื ืืชืงืืคืช ืืืืืื, ืืืชืืืืืชื ืืื ื ืืื ืืช ืืฉืืืื ืืขืืช'ืืื ื ืืืื ืชืงืืืชืื ืืืืจืืืื ืืืืืฉืื.","Station_Radio":"0","Station_Id":"20","stationUrlScheme":"kan11://plugin/?type=player&plugin_identifier=kan_player&ds=general-provider%3A%2F%2FfetchData%3Ftype%3DFEED_JSON%26url%3DaHR0cHM6Ly93d3cua2FuLm9yZy5pbC9hcHBLYW4vbGl2ZVN0YXRpb25zLmFzaHg%3D&id=4","program_code":"3671","picture_code":"https://kanweb.blob.core.windows.net/download/pictures/2021/1/20/imgid=45847_Z.jpeg","program_image":"","station_image":"Logo_Image_Logo20_img__8.jpg","program_id":"","timezone":"2"}]`
+ const result = parser({ content }).map(p => {
+ p.start = p.start.toJSON()
+ p.stop = p.stop.toJSON()
+ return p
+ })
+
+ expect(result).toMatchObject([
+ {
+ start: '2022-03-05T22:05:37.000Z',
+ stop: '2022-03-05T22:27:12.000Z',
+ title: 'ืืจืฅ ืืืืืช - ืืื ืชืืจืืื ืืืจืืื ืื',
+ description:
+ "ืงืืืฆืช ืชืืืืืื ืืชืืจืื ืช ืืคืจืืฅ ืืืืืช ืืขืืื ืืจืืฉืื ื ืืืืืฉ ืขืืจื ืืืฉืื. ืืืืฆืขืืช ืืชืืืืืื ืืืื ืืฆืืคื ืขื ืืขืืืชืื ืฉื ืืืฉืื ืืชืงืืคืช ืืืืืื, ืืืชืืืืืชื ืืื ื ืืื ืืช ืืฉืืืื ืืขืืช'ืืื ื ืืืื ืชืงืืืชืื ืืืืจืืืื ืืืืืฉืื.",
+ icon: 'https://kanweb.blob.core.windows.net/download/pictures/2021/1/20/imgid=45847_Z.jpeg'
+ }
+ ])
+})
+
+it('can handle empty guide', () => {
+ const result = parser({
+ content: `[]`
+ })
+ expect(result).toMatchObject([])
+})
diff --git a/sites/kan.org.il/kan.org.il_il.channels.xml b/sites/kan.org.il/kan.org.il_il.channels.xml
new file mode 100644
index 00000000..d973bf3c
--- /dev/null
+++ b/sites/kan.org.il/kan.org.il_il.channels.xml
@@ -0,0 +1,8 @@
+
+
+
+ ืืื 11
+ ืืื ืืืืช
+ ู
ูุงู
+
+
diff --git a/sites/m.tv.sms.cz/m.tv.sms.cz_cz.channels.xml b/sites/m.tv.sms.cz/m.tv.sms.cz_cz.channels.xml
index 74703238..1a36754e 100644
--- a/sites/m.tv.sms.cz/m.tv.sms.cz_cz.channels.xml
+++ b/sites/m.tv.sms.cz/m.tv.sms.cz_cz.channels.xml
@@ -80,6 +80,7 @@
CS History
CS Horror
CS Mystery
+ Chuck TV
CT 1
CT 2
CT 24
@@ -123,9 +124,9 @@
Eroxxx HD
Eska TV
Eurochannel
- EuroNews English
- EuroNews Magyar
- EuroNews Russkiy
+ EuroNews English
+ EuroNews Magyar
+ EuroNews Russkiy
Eurosport 1
Eurosport 2
EWTN Europe
@@ -146,13 +147,13 @@
FilmBox Family
FilmBox Premium Czechia
FilmBox Premium Polska
- FilmBox Stars Hungary
+ FilmBox Stars Czechia
Film Cafรฉ Hungary
Film Europe
Film Europe +
Film Mรกnia
- Film + Czechia
- Film + Hungary
+ Film + Czechia
+ Film + Hungary
Fokus TV
Folklorika
Food Network EMEA
@@ -254,6 +255,7 @@
MyZen TV
MyZen TV 4K
NASA TV Public
+ NASA TV UHD Public
National Geographic Hrvatska
National Geographic Hungary & Czechia
National Geographic UK
@@ -296,7 +298,7 @@
Park TV
Passion XXX
Pax TV
- Perviy kanal
+ Perviy kanal
Phoenix
Pick UK
Playboy TV Europe
@@ -312,7 +314,7 @@
Polsat Sport
Polsat Sport Extra
Power TV
- Premier Sport
+ Premier Sport 1
Premier Sport 2
Prima
Prima Cool
@@ -358,36 +360,37 @@
RTL 5
RTL Crime Hrvatska
RTL Deutschland
- RTL Gold
+ RTL Gold
RTL Hrvatska
- RTL II
- RTL Klub
+ RTL II
+ RTL Klub
RTL Kockica
RTL Living Hrvatska
RTL Passion Hrvatska
- RTL +
+ RTL +
RTL Zwei Deutschland
RTR Planeta
RTVi Europe
RTVS 1
RTVS 2
RTVS 3
+ RTVS 24
RTVS ล port
Sat. 1 Deutschland
Sat. 1 Gold Deutschland
Senzi
Sixx Deutschland
- Sky Arts UK
- Sky Atlantic UK
+ Sky Arts UK
+ Sky Atlantic UK
Sky Cinema Action
Sky Cinema Drama
Sky Cinema Family
Sky Cinema Greats
Sky Cinema Hits
Sky Cinema Premiere
- Sky Cinema Sci-fi Horror
+ Sky Cinema Sci-fi Horror
Sky Cinema Select
- Sky Comedy UK
+ Sky Comedy UK
Sky Crime
Sky History 2
Sky News International
@@ -402,6 +405,7 @@
Sky Sports Premier League UK
Sky Witness UK
Slรกger TV
+ Slรกgr Original
Slรกgr 2
Slรกgr Muzika
Slรกgr Premium
diff --git a/sites/magentatv.at/magentatv.at.config.js b/sites/magentatv.at/magentatv.at.config.js
new file mode 100644
index 00000000..3c5388b5
--- /dev/null
+++ b/sites/magentatv.at/magentatv.at.config.js
@@ -0,0 +1,70 @@
+const axios = require('axios')
+const dayjs = require('dayjs')
+
+const API_ENDPOINT = `https://prod.oesp.magentatv.at/oesp/v4/AT/deu/web/programschedules`
+
+module.exports = {
+ site: 'magentatv.at',
+ url: function ({ date }) {
+ return `${API_ENDPOINT}/${date.format('YYYYMMDD')}/1`
+ },
+ async parser({ content, channel, date }) {
+ let programs = []
+ let items = parseItems(content, channel)
+ if (!items.length) return programs
+ const d = date.format('YYYYMMDD')
+ const promises = [
+ axios.get(`${API_ENDPOINT}/${d}/2`),
+ axios.get(`${API_ENDPOINT}/${d}/3`),
+ axios.get(`${API_ENDPOINT}/${d}/4`)
+ ]
+ await Promise.allSettled(promises)
+ .then(results => {
+ results.forEach(r => {
+ if (r.status === 'fulfilled') {
+ items = items.concat(parseItems(r.value.data, channel))
+ }
+ })
+ })
+ .catch(console.error)
+ items.forEach(item => {
+ programs.push({
+ title: item.t,
+ start: parseStart(item),
+ stop: parseStop(item)
+ })
+ })
+
+ return programs
+ },
+ async channels() {
+ const data = await axios
+ .get(`https://prod.oesp.magentatv.at/oesp/v4/AT/deu/web/channels`)
+ .then(r => r.data)
+ .catch(console.log)
+
+ return data.channels.map(item => {
+ return {
+ lang: 'de',
+ site_id: item.id.replace('lgi-at-prodobo-master:101-', ''),
+ name: item.title
+ }
+ })
+ }
+}
+
+function parseStart(item) {
+ return dayjs(item.s)
+}
+
+function parseStop(item) {
+ return dayjs(item.e)
+}
+
+function parseItems(content, channel) {
+ const data = typeof content === 'string' ? JSON.parse(content) : content
+ if (!data || !Array.isArray(data.entries)) return []
+ const entity = data.entries.find(e => e.o === `lgi-at-prodobo-master:${channel.site_id}`)
+
+ return entity ? entity.l : []
+}
diff --git a/sites/magentatv.at/magentatv.at.test.js b/sites/magentatv.at/magentatv.at.test.js
new file mode 100644
index 00000000..eee51716
--- /dev/null
+++ b/sites/magentatv.at/magentatv.at.test.js
@@ -0,0 +1,103 @@
+// npm run channels:parse -- --config=./sites/magentatv.at/magentatv.at.config.js --output=./sites/magentatv.at/magentatv.at_at.channels.xml
+// npx epg-grabber --config=sites/magentatv.at/magentatv.at.config.js --channels=sites/magentatv.at/magentatv.at_at.channels.xml --output=guide.xml --days=2
+
+const { parser, url } = require('./magentatv.at.config.js')
+const axios = require('axios')
+const dayjs = require('dayjs')
+const utc = require('dayjs/plugin/utc')
+const customParseFormat = require('dayjs/plugin/customParseFormat')
+dayjs.extend(customParseFormat)
+dayjs.extend(utc)
+
+jest.mock('axios')
+
+const date = dayjs.utc('2022-03-09', 'YYYY-MM-DD').startOf('d')
+const channel = {
+ site_id: '13TH_Street_HD',
+ xmltv_id: '13thStreetDeutschland.us'
+}
+
+it('can generate valid url', () => {
+ expect(url({ date })).toBe(
+ 'https://prod.oesp.magentatv.at/oesp/v4/AT/deu/web/programschedules/20220309/1'
+ )
+})
+
+it('can parse response', done => {
+ const content = `{"entries":[{"o":"lgi-at-prodobo-master:13TH_Street_HD","l":[{"i":"crid:~~2F~~2Fbds.tv~~2F1870513,imi:c83a0bf1b04d6610d0517e63647772c1c8725693","t":"Law & Order: Special Victims Unit","s":1646778600000,"e":1646781300000,"c":"lgi-at-prodobo-master:genre-9","a":false,"r":false,"rm":false,"ad":[],"sl":[]}]}]}`
+
+ axios.get.mockImplementation(url => {
+ if (url === 'https://prod.oesp.magentatv.at/oesp/v4/AT/deu/web/programschedules/20220309/2') {
+ return Promise.resolve({
+ data: JSON.parse(
+ `{"entries":[{"o":"lgi-at-prodobo-master:13TH_Street_HD","l":[{"i":"crid:~~2F~~2Fmedia-press.tv~~2F217048123,imi:ee14cfe306cb50502b03c96d58851c32345a9391","t":"FBI: Special Crime Unit","s":1646781300000,"e":1646784000000,"c":"lgi-at-prodobo-master:genre-9","a":false,"r":false,"rm":false,"ad":[],"sl":[]}]}]}`
+ )
+ })
+ } else if (
+ url === 'https://prod.oesp.magentatv.at/oesp/v4/AT/deu/web/programschedules/20220309/3'
+ ) {
+ return Promise.resolve({
+ data: JSON.parse(
+ `{"entries":[{"o":"lgi-at-prodobo-master:13TH_Street_HD","l":[{"i":"crid:~~2F~~2Fmedia-press.tv~~2F224431085,imi:805c5a9b6610edb65cdff319a9b080ab5f65a6c8","t":"FBI: Special Crime Unit","s":1646784000000,"e":1646786700000,"c":"lgi-at-prodobo-master:genre-9","a":false,"r":false,"rm":false,"ad":[],"sl":[]}]}]}`
+ )
+ })
+ } else if (
+ url === 'https://prod.oesp.magentatv.at/oesp/v4/AT/deu/web/programschedules/20220309/4'
+ ) {
+ return Promise.resolve({
+ data: JSON.parse(
+ `{"entries":[{"o":"lgi-at-prodobo-master:13TH_Street_HD","l":[{"i":"crid:~~2F~~2Fbds.tv~~2F918961,imi:f27353bf910e8849d60e0381fdb2d1f7518ef7a2","t":"Law & Order","s":1646786700000,"e":1646789400000,"c":"lgi-at-prodobo-master:genre-9","a":false,"r":false,"rm":false,"ad":[],"sl":[]}]}]}`
+ )
+ })
+ } else {
+ return Promise.resolve({ data: '' })
+ }
+ })
+
+ parser({ content, channel, date })
+ .then(result => {
+ result = result.map(p => {
+ p.start = p.start.toJSON()
+ p.stop = p.stop.toJSON()
+ return p
+ })
+
+ expect(result).toMatchObject([
+ {
+ start: '2022-03-08T22:30:00.000Z',
+ stop: '2022-03-08T23:15:00.000Z',
+ title: 'Law & Order: Special Victims Unit'
+ },
+ {
+ start: '2022-03-08T23:15:00.000Z',
+ stop: '2022-03-09T00:00:00.000Z',
+ title: 'FBI: Special Crime Unit'
+ },
+ {
+ start: '2022-03-09T00:00:00.000Z',
+ stop: '2022-03-09T00:45:00.000Z',
+ title: 'FBI: Special Crime Unit'
+ },
+ {
+ start: '2022-03-09T00:45:00.000Z',
+ stop: '2022-03-09T01:30:00.000Z',
+ title: 'Law & Order'
+ }
+ ])
+ done()
+ })
+ .catch(done)
+})
+
+it('can handle empty guide', done => {
+ parser({
+ content: `[{"type":"PATH_PARAM","code":"period","reason":"INVALID"}]`,
+ channel,
+ date
+ })
+ .then(result => {
+ expect(result).toMatchObject([])
+ done()
+ })
+ .catch(done)
+})
diff --git a/sites/magentatv.at/magentatv.at_at.channels.xml b/sites/magentatv.at/magentatv.at_at.channels.xml
new file mode 100644
index 00000000..e310eaae
--- /dev/null
+++ b/sites/magentatv.at/magentatv.at_at.channels.xml
@@ -0,0 +1,174 @@
+
+
+
+ 1-2-3.tv
+ 13th Street HD
+ 3sat
+ Al Jazeera
+ ARD-alpha
+ ARTE Deutsch
+ ATV
+ ATV 2
+ Baby TV
+ Bibel TV
+ Bloomberg
+ Blue Hustler Europe
+ Boomerang
+ Cartoon Network
+ CGTN
+ CNBC
+ CNN
+ COMEDY CENTRAL
+ Crime + Investigation
+ Das Erste
+ DELUXE MUSIC
+ Disney Channel Deutschland
+ DMAX Austria
+ eSPORTS1 HD
+ euronews (D)
+ Eurosport 1 Germany
+ Evil Angel TV
+ Fashion TV
+ Fix&Foxi
+ France 24 (en francais)
+ GEO TV HD
+ Habertรผrk
+ Hayat TV
+ Heimatkanal
+ HOME & GARDEN TV HD
+ HR Fernsehen
+ HRT TV 1
+ HSE
+ HSE Extra
+ HSE Trend
+ Hustler TV Europe
+ Kabel Eins Austria
+ Kabel Eins Classics
+ Kabel Eins Doku Austria
+ KIKA
+ Kinowelt TV HD
+ Motorvision
+ MTV
+ N24 Doku
+ NatGeo HD
+ National Geographic Wild HD
+ Nick HD
+ Nick.Jr.
+ Nitro Austria
+ N-TV Austria
+ Oe24 TV
+ One
+ ORF 1
+ ORF 2 Burgenland
+ ORF 2 Europe
+ ORF 2 Kรคrnten
+ ORF 2 Niederรsterreich
+ ORF 2 Oberรsterreich
+ ORF 2 Salzburg
+ ORF 2 Steiermark
+ ORF 2 Tirol
+ ORF 2 Vorarlberg
+ ORF 2 Wien
+ ORF III
+ ORF Sport +
+ Phoenix
+ Pink Extra
+ Pink Film
+ Pink Music
+ Pink Plus
+ ProSieben Austria
+ ProSieben FUN HD
+ ProSieben Maxx Austria
+ QVC2 Deutsch
+ QVC Deutschland
+ QVC Style Deutschland
+ QVC ZWEI
+ Rai Uno
+ Rai Due
+ Rai Tre
+ RBB Berlin
+ RiC
+ Romance TV
+ RTL Austria
+ RTL Crime Deutschland
+ RTL Living Deutschland
+ RTL Passion Deutschland
+ RTLup
+ RTL Zwei Austria
+ RTR Planeta
+ SAT.1 emotions
+ Sat. 1 Gold รsterreich
+ Sat. 1 รsterreich
+ Servus TV รsterreich
+ Sixx Austria
+ Sky Atlantic HD
+ Sky Cinema Action HD
+ Sky Cinema Best Of HD
+ Sky Cinema Classics
+ Sky Cinema Family
+ Sky Cinema Fun
+ Sky Cinema Premieren HD
+ Sky Cinema Premieren +24
+ Sky Cinema Special HD
+ Sky Cinema Thriller HD
+ Sky Comedy HD
+ Sky Crime HD
+ Sky Documentaries HD
+ Sky Krimi HD
+ Sky Nature HD
+ Sky One HD
+ Sky Replay HD
+ Sky Sport 10 HD
+ Sky Sport 11 HD
+ Sky Sport 1 HD
+ Sky Sport 2 HD
+ Sky Sport 3 HD
+ Sky Sport 4 HD
+ Sky Sport 5 HD
+ Sky Sport 6 HD
+ Sky Sport 7 HD
+ Sky Sport 8 HD
+ Sky Sport 9 HD
+ Sky Sport Austria 1
+ Sky Sport Austria 2
+ Sky Sport Austria 3
+ Sky Sport Austria 4
+ Sky Sport Austria 5
+ Sky Sport Austria 6
+ Sky Sport Austria 7
+ Sky Sport Bundesliga 10 HD
+ Sky Sport Bundesliga 1 HD
+ Sky Sport Bundesliga 2 HD
+ Sky Sport Bundesliga 3 HD
+ Sky Sport Bundesliga 4 HD
+ Sky Sport Bundesliga 5 HD
+ Sky Sport Bundesliga 6 HD
+ Sky Sport Bundesliga 7 HD
+ Sky Sport Bundesliga 8 HD
+ Sky Sport Bundesliga 9 HD
+ Sky Sport F1 HD
+ Sky Sport News HD
+ Spiegel Geschichte
+ Spiegel TV Wissen HD
+ Sport 1
+ Sport 1+
+ SPORTDIGITAL FUSSBALL
+ SR Fernsehen HD
+ Super RTL Austria
+ SWR Fernsehen RP
+ SYFY HD
+ tagesschau24 HD
+ Tele 5
+ TLC Austria
+ TV5MONDE Europe
+ TV Polonia
+ Universal TV HD
+ Vox Austria
+ Warner TV Comedy HD
+ Warner TV Serie
+ WDR Fernsehen Kรถln
+ ZDF
+ ZDF Info
+ ZDF Neo
+
+
diff --git a/sites/magentatv.de/magentatv.de.config.js b/sites/magentatv.de/magentatv.de.config.js
new file mode 100644
index 00000000..0c180b0e
--- /dev/null
+++ b/sites/magentatv.de/magentatv.de.config.js
@@ -0,0 +1,123 @@
+const axios = require('axios')
+const dayjs = require('dayjs')
+
+const X_CSRFTOKEN = 'e0a032d1c9df6c3fb8c8352399d32c40ddb17ccceb5142fe'
+const COOKIE =
+ 'JSESSIONID=93892A98DBCCEBD83EDC4C23EBEB23B6; CSESSIONID=4A36799EF09D80539BBA8E8211FA80D3; CSRFSESSION=e0a032d1c9df6c3fb8c8352399d32c40ddb17ccceb5142fe; JSESSIONID=93892A98DBCCEBD83EDC4C23EBEB23B6'
+
+module.exports = {
+ site: 'magentatv.de',
+ ignore: true, // the site uses a constantly updated session ID
+ url: `https://api.prod.sngtv.magentatv.de/EPG/JSON/PlayBillList`,
+ request: {
+ method: 'POST',
+ headers: {
+ X_CSRFToken: X_CSRFTOKEN,
+ 'Content-Type': 'application/json',
+ Cookie: COOKIE
+ },
+ data({ channel, date }) {
+ return {
+ count: -1,
+ isFillProgram: 1,
+ offset: 0,
+ properties: [
+ {
+ include: 'endtime,genres,id,name,starttime,channelid,pictures,introduce',
+ name: 'playbill'
+ }
+ ],
+ type: 2,
+ begintime: date.format('YYYYMMDD000000'),
+ channelid: channel.site_id,
+ endtime: date.add(1, 'd').format('YYYYMMDD000000')
+ }
+ }
+ },
+ parser: function ({ content }) {
+ let programs = []
+ const items = parseItems(content)
+ items.forEach(item => {
+ programs.push({
+ title: item.name,
+ description: item.introduce,
+ icon: parseIcon(item),
+ category: parseCategory(item),
+ start: parseStart(item),
+ stop: parseStop(item)
+ })
+ })
+
+ return programs
+ },
+ async channels() {
+ const data = await axios
+ .post(
+ `https://api.prod.sngtv.magentatv.de/EPG/JSON/AllChannel`,
+ {
+ channelNamespace: 2,
+ filterlist: [
+ {
+ key: 'IsHide',
+ value: '-1'
+ }
+ ],
+ metaDataVer: 'Channel/1.1',
+ properties: [
+ {
+ include: '/channellist/logicalChannel/contentId,/channellist/logicalChannel/name',
+ name: 'logicalChannel'
+ }
+ ],
+ returnSatChannel: 0
+ },
+ {
+ headers: {
+ X_CSRFToken: X_CSRFTOKEN,
+ 'Content-Type': 'application/json',
+ Cookie: COOKIE
+ }
+ }
+ )
+ .then(r => r.data)
+ .catch(console.log)
+
+ return data.channellist.map(item => {
+ return {
+ lang: 'de',
+ site_id: item.contentId,
+ name: item.name
+ }
+ })
+ }
+}
+
+function parseCategory(item) {
+ return item.genres
+ ? item.genres
+ .replace('und', ',')
+ .split(',')
+ .map(i => i.trim())
+ : []
+}
+
+function parseIcon(item) {
+ if (!Array.isArray(item.pictures) || !item.pictures.length) return null
+
+ return item.pictures[0].href
+}
+
+function parseStart(item) {
+ return dayjs(item.starttime)
+}
+
+function parseStop(item) {
+ return dayjs(item.endtime)
+}
+
+function parseItems(content) {
+ const data = JSON.parse(content)
+ if (!data || !Array.isArray(data.playbilllist)) return []
+
+ return data.playbilllist
+}
diff --git a/sites/magentatv.de/magentatv.de.test.js b/sites/magentatv.de/magentatv.de.test.js
new file mode 100644
index 00000000..104a3105
--- /dev/null
+++ b/sites/magentatv.de/magentatv.de.test.js
@@ -0,0 +1,78 @@
+// npm run channels:parse -- --config=./sites/magentatv.de/magentatv.de.config.js --output=./sites/magentatv.de/magentatv.de_de.channels.xml
+// npx epg-grabber --config=sites/magentatv.de/magentatv.de.config.js --channels=sites/magentatv.de/magentatv.de_de.channels.xml --output=guide.xml --days=2
+
+const { parser, url, request } = require('./magentatv.de.config.js')
+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('2022-03-09', 'YYYY-MM-DD').startOf('d')
+const channel = {
+ site_id: '255',
+ xmltv_id: '13thStreetDeutschland.us'
+}
+
+it('can generate valid url', () => {
+ expect(url).toBe('https://api.prod.sngtv.magentatv.de/EPG/JSON/PlayBillList')
+})
+
+it('can generate valid request method', () => {
+ expect(request.method).toBe('POST')
+})
+
+it('can generate valid request headers', () => {
+ expect(request.headers).toMatchObject({
+ X_CSRFToken: 'e0a032d1c9df6c3fb8c8352399d32c40ddb17ccceb5142fe',
+ 'Content-Type': 'application/json',
+ Cookie:
+ 'JSESSIONID=93892A98DBCCEBD83EDC4C23EBEB23B6; CSESSIONID=4A36799EF09D80539BBA8E8211FA80D3; CSRFSESSION=e0a032d1c9df6c3fb8c8352399d32c40ddb17ccceb5142fe; JSESSIONID=93892A98DBCCEBD83EDC4C23EBEB23B6'
+ })
+})
+
+it('can generate valid request data', () => {
+ expect(request.data({ channel, date })).toMatchObject({
+ count: -1,
+ isFillProgram: 1,
+ offset: 0,
+ properties: [
+ {
+ include: 'endtime,genres,id,name,starttime,channelid,pictures,introduce',
+ name: 'playbill'
+ }
+ ],
+ type: 2,
+ begintime: '20220309000000',
+ channelid: '255',
+ endtime: '20220310000000'
+ })
+})
+
+it('can parse response', () => {
+ const content = `{"playbilllist":[{"id":"30021745","name":"FBI: Special Crime Unit","introduce":"Nachdem ein Mann von einem Sprengstoffpaket getรถtet wurde, das zu ihm nach Hause geschickt wurde, versucht das Team, den Absender zu fassen und sein neuestes tรถdliches Paket abzufangen. Maggie hat Mรผhe, ihrer jรผngeren Schwester zu vertrauen.","channelid":"255","starttime":"2022-03-09 01:00:00 UTC+01:00","endtime":"2022-03-09 01:45:00 UTC+01:00","genres":"Wissen,Natur und Tiere","pictures":[{"rel":"image","href":"http://ngiss.t-online.de/sweetprogrammanager/media/gracenote/1/9/p19740197_e_h9_af.jpg","description":"Brother's Keeper","imageType":"1","copyrightNotice":"(c) ProSiebenSat.1","mimeType":"image/jpeg","resolution":["1440","1080"]},{"rel":"image","href":"http://ngiss.t-online.de/sweetprogrammanager/media/gracenote/1/5/p15528073_i_h9_ae.jpg","description":"FBI","imageType":"13","copyrightNotice":"(c) ProSiebenSat.1","mimeType":"image/jpeg","resolution":["1440","1080"]},{"rel":"image","href":"http://ngiss.t-online.de/sweetprogrammanager/media/gracenote/1/9/p19740197_e_h8_af.jpg","description":"Brother's Keeper","imageType":"17","copyrightNotice":"(c) ProSiebenSat.1","mimeType":"image/jpeg","resolution":["1920","1080"]},{"rel":"image","href":"http://ngiss.t-online.de/sweetprogrammanager/media/gracenote/1/5/p15528073_i_h10_af.jpg","description":"FBI","imageType":"18","copyrightNotice":"(c) ProSiebenSat.1","mimeType":"image/jpeg","resolution":["1920","1080"]}]}]}`
+ const result = parser({ content }).map(p => {
+ p.start = p.start.toJSON()
+ p.stop = p.stop.toJSON()
+ return p
+ })
+
+ expect(result).toMatchObject([
+ {
+ start: '2022-03-09T00:00:00.000Z',
+ stop: '2022-03-09T00:45:00.000Z',
+ title: 'FBI: Special Crime Unit',
+ description:
+ 'Nachdem ein Mann von einem Sprengstoffpaket getรถtet wurde, das zu ihm nach Hause geschickt wurde, versucht das Team, den Absender zu fassen und sein neuestes tรถdliches Paket abzufangen. Maggie hat Mรผhe, ihrer jรผngeren Schwester zu vertrauen.',
+ icon: 'http://ngiss.t-online.de/sweetprogrammanager/media/gracenote/1/9/p19740197_e_h9_af.jpg',
+ category: ['Wissen', 'Natur', 'Tiere']
+ }
+ ])
+})
+
+it('can handle empty guide', () => {
+ const result = parser({
+ content: `{"counttotal":"0"}`
+ })
+ expect(result).toMatchObject([])
+})
diff --git a/sites/magentatv.de/magentatv.de_de.channels.xml b/sites/magentatv.de/magentatv.de_de.channels.xml
new file mode 100644
index 00000000..8e7d7145
--- /dev/null
+++ b/sites/magentatv.de/magentatv.de_de.channels.xml
@@ -0,0 +1,265 @@
+
+
+
+ 1-2-3.tv
+ 13TH STREET
+ 3sat
+ ALEX Berlin
+ allgรคu.tv
+ altenburg.tv
+ Animal Planet
+ ANIXE HD Serie
+ ANIXE+
+ ARD-alpha
+ ARTE
+ a.tv
+ auto motor und sport
+ Baby TV
+ Baden TV
+ Baden TV Sรผd
+ BBC World
+ Beate-Uhse.TV (Sky)
+ beIN iZ
+ beIN Movies Turk
+ Bergblick
+ Bibel TV
+ BILD
+ Blue Hustler
+ BonGusto
+ Boomerang
+ BR Fernsehen Nord
+ BR Fernsehen Sรผd
+ Cartoon Network
+ CEM TV
+ CHANNEL21
+ Chemnitz Fernsehen
+ Classica (Sky)
+ CNN International
+ Comedy Central
+ Nick/Comedy Central+1
+ Crime+Investigation
+ #dabeiTV
+ Das Erste
+ DELUXE MUSIC
+ Deutsches Musik Fernsehen
+ Discovery Channel
+ Disney Channel
+ DMAX
+ Dresden Fernsehen
+ DW
+ E! Entertainment
+ ems TV
+ eSPORTS1
+ Euro D
+ Euronews Deutsch
+ Euronews Italiano
+ Euronews Russki
+ Eurosport 1
+ Eurosport 2
+ Eurostar TV
+ Extreme Sports
+ Fashion TV
+ FC BAYERN.TV LIVE
+ France 24 francais
+ Franken Fernsehen
+ Friesischer Rundfunk
+ GEO Television
+ Habertรผrk TV
+ Hamburg 1
+ HAUPTSTADT.TV
+ Heimatkanal
+ HGTV
+ The HISTORY Channel
+ hr-fernsehen
+ HSE
+ iTVN
+ Jukebox
+ Junior (Sky)
+ Juwelo
+ Kabel Eins CLASSICS
+ Kabel Eins
+ Kabel Eins Doku
+ Kanal 7
+ KiKA
+ KinoweltTV
+ K-TV
+ LAUSITZWELLE
+ Leipzig Fernsehen
+ L-TV
+ Lust pur
+ MagentaSport
+ Marco Polo TV
+ MDF.1 Fernsehen
+ MDR-Fernsehen Sachsen
+ MDR-Fernsehen Sachsen-Anhalt
+ MDR-Fernsehen Thรผringen
+ More Than Sports TV
+ MOTORVISION.TV
+ MTV
+ mรผnchen.tv
+ N24 Doku
+ Kinomir
+ National Geographic
+ National Geographic Wild
+ NDR Fernsehen Hamburg
+ NDR Fernsehen Mecklenburg-Vorpommern
+ NDR Fernsehen Niedersachsen
+ NDR Fernsehen Schleswig-Holstein
+ Nick Jr.
+ Nicktoons (Sky)
+ NIEDERBAYERN TV - DEG
+ NIEDERBAYERN TV - LA
+ NIEDERBAYERN TV - PA
+ NITRO
+ nrwision
+ n-tv
+ Oberpfalz TV
+ OF-TV
+ OK4
+ OK54 Trier
+ OK-TV Ludwigshafen
+ OK:TV Mainz
+ OK Weinstraรe
+ ONE
+ OstWest
+ Penthouse Passion
+ phoenix
+ Playboy Europe
+ ProSieben
+ ProSieben FUN
+ ProSieben MAXX
+ QVC
+ Radio Bremen TV
+ Rai 1
+ Rai 2
+ Rai 3
+ rbb fernsehen Berlin
+ rbb fernsehen Brandenburg
+ Red Bull TV
+ Regio TV
+ Rennsteig.TV
+ RFH Regionalfernsehen Harz
+ RFO
+ Rhein-Main TV
+ RNF
+ Romance TV
+ RTL Crime
+ RTL
+ RTL Hessen
+ RTL Living
+ RTL HH SH
+ RTL HB NDS
+ RTL Passion
+ RTLup
+ RTL NRW
+ RTLZWEI
+ RTR Planeta
+ salve.tv
+ SAT.1 Bayern
+ SAT.1
+ SAT.1 emotions
+ SAT.1 GOLD
+ SAT.1 HH SH
+ SAT.1 NDS Bremen
+ SAT.1 NRW
+ SAT.1 RhlPf Hessen
+ ServusTV
+ Shop LC
+ Show Max
+ Show Turk
+ sixx
+ SkyAtlantic
+ Sky Cinema Action
+ Sky Cinema Best of
+ Sky Cinema Classics
+ Sky Cinema Family
+ Sky Cinema Fun
+ Sky Cinema Mittelerde
+ Sky Cinema Premieren
+ Sky Cinema Premieren +24
+ Sky Cinema Thriller
+ Sky Comedy
+ Sky Crime
+ Sky Documentaries
+ SkyKrimi
+ Sky Nature
+ Sky One
+ Sky Replay
+ Sky Sport 1
+ Sky Sport 10
+ Sky Sport 11
+ Sky Sport 2
+ Sky Sport 3
+ Sky Sport 4
+ Sky Sport 5
+ Sky Sport 6
+ Sky Sport 7
+ Sky Sport 8
+ Sky Sport 9
+ Sky Sport Bundesliga 1
+ Sky Sport Bundesliga 10
+ Sky Sport Bundesliga 2
+ Sky Sport Bundesliga 3
+ Sky Sport Bundesliga 4
+ Sky Sport Bundesliga 5
+ Sky Sport Bundesliga 6
+ Sky Sport Bundesliga 7
+ Sky Sport Bundesliga 8
+ Sky Sport Bundesliga 9
+ Sky Sport F1
+ Sky Sport News
+ sonnenklar.TV
+ SONY AXN
+ SONY CHANNEL
+ Spiegel Geschichte
+ Spiegel TV Wissen
+ SPORT1
+ SPORT1+
+ SPORTDIGITAL FUSSBALL
+ SR Fernsehen
+ Studio 47
+ Super RTL
+ SWR Fernsehen BW
+ SWR Fernsehen RP
+ SYFY
+ tagesschau24
+ TELE 5
+ TeleBom/TeleDom
+ TLC
+ TOGGO plus
+ TV8 Int
+ TVA Ostbayern
+ tv.berlin
+ tv.ingolstadt
+ TV Mainfranken
+ TV Mittelrhein
+ TV Oberfranken
+ TV Polonia
+ TV Westsachsen
+ รLKE TV
+ Universal TV
+ VOX
+ VOXup
+ Warner TV Comedy
+ Warner TV Film
+ Warner TV Serie
+ WDR Fernsehen Aachen
+ WDR Fernsehen Bielefeld
+ WDR Fernsehen Bonn
+ WDR Fernsehen Dortmund
+ WDR Fernsehen Duisburg
+ WDR Fernsehen Dรผsseldorf
+ WDR Fernsehen Essen
+ WDR Fernsehen Kรถln
+ WDR Fernsehen Mรผnster
+ WDR Fernsehen Siegen
+ WDR Fernsehen Wuppertal
+ WELT
+ Welt der Wunder
+ wetter.com TV
+ WWTV
+ ZDF
+ ZDFinfo
+ ZDFneo
+
+
diff --git a/sites/magticom.ge/magticom.ge_ge.channels.xml b/sites/magticom.ge/magticom.ge_ge.channels.xml
index b0110273..0d793904 100644
--- a/sites/magticom.ge/magticom.ge_ge.channels.xml
+++ b/sites/magticom.ge/magticom.ge_ge.channels.xml
@@ -36,7 +36,7 @@
Enki Benki
Erox HD
Ertsulovneba
- EuroNews Russkiy
+ EuroNews Russkiy
Evrokino
FashionBox HD
Fast & FunBox HD
@@ -80,7 +80,7 @@
Paramount Channel Russia
Paramount Comedy Russia
Peretz International
- Perviy kanal CIS
+ Perviy kanal CIS
Pos TV
Pyatnitsa! International
Qartuli Arkhi
diff --git a/sites/mako.co.il/mako.co.il.config.js b/sites/mako.co.il/mako.co.il.config.js
new file mode 100644
index 00000000..ce6dc3e5
--- /dev/null
+++ b/sites/mako.co.il/mako.co.il.config.js
@@ -0,0 +1,50 @@
+const dayjs = require('dayjs')
+const utc = require('dayjs/plugin/utc')
+const timezone = require('dayjs/plugin/timezone')
+const customParseFormat = require('dayjs/plugin/customParseFormat')
+
+dayjs.extend(utc)
+dayjs.extend(timezone)
+dayjs.extend(customParseFormat)
+
+module.exports = {
+ site: 'mako.co.il',
+ url: 'https://www.mako.co.il/AjaxPage?jspName=EPGResponse.jsp',
+ parser: function ({ content, date }) {
+ let programs = []
+ const items = parseItems(content, date)
+ items.forEach(item => {
+ const start = parseStart(item)
+ const stop = start.add(item.DurationMs, 'ms')
+ programs.push({
+ title: item.ProgramName,
+ description: item.EventDescription,
+ icon: item.Picture,
+ start,
+ stop
+ })
+ })
+
+ return programs
+ }
+}
+
+function parseStart(item) {
+ if (!item.StartTimeUTC) return null
+
+ return dayjs(item.StartTimeUTC)
+}
+
+function parseStop(item) {
+ if (!item.end_time) return null
+
+ return dayjs.tz(item.end_time, 'YYYY-MM-DDTHH:mm:ss', 'Asia/Jerusalem')
+}
+
+function parseItems(content, date) {
+ const data = JSON.parse(content)
+ if (!data || !Array.isArray(data.programs)) return []
+ const d = date.format('DD/MM/YYYY')
+
+ return data.programs.filter(item => item.Date.startsWith(d))
+}
diff --git a/sites/mako.co.il/mako.co.il.test.js b/sites/mako.co.il/mako.co.il.test.js
new file mode 100644
index 00000000..c3e18170
--- /dev/null
+++ b/sites/mako.co.il/mako.co.il.test.js
@@ -0,0 +1,45 @@
+// npx epg-grabber --config=sites/mako.co.il/mako.co.il.config.js --channels=sites/mako.co.il/mako.co.il_il.channels.xml --output=guide.xml --days=2
+
+const { parser, url } = require('./mako.co.il.config.js')
+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('2022-03-07', 'YYYY-MM-DD').startOf('d')
+const channel = {
+ site_id: '#',
+ xmltv_id: 'Keshet12.il'
+}
+
+it('can generate valid url', () => {
+ expect(url).toBe('https://www.mako.co.il/AjaxPage?jspName=EPGResponse.jsp')
+})
+
+it('can parse response', () => {
+ const content = `{"programs":[{"DisplayEndTime":"06:15","MakoTVURL":"","HouseNumber":"L17165475","StartTimeUTC":1646539200000,"DurationMs":900000,"DisplayStartTime":"06:00","MobilePicture":"https://img.mako.co.il/2017/01/01/placeHolder.jpg","StartTime":"06/03/2022 06:00:00","RerunBroadcast":false,"Duration":"00:15","ProgramName":"ืืืชืจืืช ืืืืงืจ","Date":"06/03/2022 06:00:00","MakoProgramsURL":"","LiveBroadcast":true,"ProgramCode":134987,"Episode":"","Picture":"https://img.mako.co.il//2021/08/04/hadshot_haboker_im_niv_raskin.jpg","MakoShortName":"","hebrewDate":"6 ืืืจืฅ","Season":"","day":"ืืขืจื","EventDescription":"","EnglishName":"cotrot,EP 46"},{"DisplayEndTime":"02:39","MakoTVURL":"","HouseNumber":"A168960","StartTimeUTC":1646613480000,"DurationMs":60000,"DisplayStartTime":"02:38","MobilePicture":"https://img.mako.co.il/2017/01/01/placeHolder.jpg","StartTime":"07/03/2022 02:38:00","RerunBroadcast":true,"Duration":"00:01","ProgramName":"ืจืืงืืื ืขื ืืืืืื - ืืจ ืืืืจ","Date":"07/03/2022 02:38:00","MakoProgramsURL":"","LiveBroadcast":false,"ProgramCode":135029,"Episode":"","Picture":"https://img.mako.co.il/2022/02/13/DancingWithStars2022_EPG.jpg","MakoShortName":"","hebrewDate":"7 ืืืจืฅ","Season":"","day":"ืืืจ","EventDescription":"ืืืืืจืช ืืืืฉืืช ืืืจืืืืช ืฉื ืืืืงืจ, ืืื ืฉืื ืืคืจืฉื ืืืืช ืืืืืชืจืืช ืฉืืขืฉื ืืช ืืืื.","EnglishName":"rokdim,EP 10"}]}`
+ const result = parser({ content, date }).map(p => {
+ p.start = p.start.toJSON()
+ p.stop = p.stop.toJSON()
+ return p
+ })
+
+ expect(result).toMatchObject([
+ {
+ start: '2022-03-07T00:38:00.000Z',
+ stop: '2022-03-07T00:39:00.000Z',
+ title: 'ืจืืงืืื ืขื ืืืืืื - ืืจ ืืืืจ',
+ description: 'ืืืืืจืช ืืืืฉืืช ืืืจืืืืช ืฉื ืืืืงืจ, ืืื ืฉืื ืืคืจืฉื ืืืืช ืืืืืชืจืืช ืฉืืขืฉื ืืช ืืืื.',
+ icon: 'https://img.mako.co.il/2022/02/13/DancingWithStars2022_EPG.jpg'
+ }
+ ])
+})
+
+it('can handle empty guide', () => {
+ const result = parser({
+ content: `[]`,
+ date
+ })
+ expect(result).toMatchObject([])
+})
diff --git a/sites/mako.co.il/mako.co.il_il.channels.xml b/sites/mako.co.il/mako.co.il_il.channels.xml
new file mode 100644
index 00000000..fa1ac649
--- /dev/null
+++ b/sites/mako.co.il/mako.co.il_il.channels.xml
@@ -0,0 +1,6 @@
+
+
+
+ Keshet 12
+
+
diff --git a/sites/maxtv.hrvatskitelekom.hr/maxtv.hrvatskitelekom.hr_hr.channels.xml b/sites/maxtv.hrvatskitelekom.hr/maxtv.hrvatskitelekom.hr_hr.channels.xml
index 8876187e..57a58be6 100644
--- a/sites/maxtv.hrvatskitelekom.hr/maxtv.hrvatskitelekom.hr_hr.channels.xml
+++ b/sites/maxtv.hrvatskitelekom.hr/maxtv.hrvatskitelekom.hr_hr.channels.xml
@@ -44,7 +44,7 @@
DW English
E! Europe
Epic Drama
- EuroNews English
+ EuroNews English
Extreme Sports Channel
FashionTV Europe
Federalna TV
@@ -136,15 +136,15 @@
Sat. 1 Deutschland
Sky News UK
Sport 1
- Sport Klub 1 Hrvatska
- Sport Klub 2 Srbija
- Sport Klub 3
- Sport Klub 4
- Sport Klub 5
- Sport Klub 6
- Sport Klub Esports
- Sport Klub Golf
- Sport Klub Start
+ Sport Klub 1 Hrvatska
+ Sport Klub 2 Srbija
+ Sport Klub 3
+ Sport Klub 4
+ Sport Klub 5
+ Sport Klub 6
+ Sport Klub Esports
+ Sport Klub Golf
+ Sport Klub Start
Sportska TV
Stingray Classica
Stingray Djazz
diff --git a/sites/mediaklikk.hu/mediaklikk.hu.config.js b/sites/mediaklikk.hu/mediaklikk.hu.config.js
new file mode 100644
index 00000000..557f2f23
--- /dev/null
+++ b/sites/mediaklikk.hu/mediaklikk.hu.config.js
@@ -0,0 +1,81 @@
+const cheerio = require('cheerio')
+const dayjs = require('dayjs')
+const utc = require('dayjs/plugin/utc')
+const timezone = require('dayjs/plugin/timezone')
+const customParseFormat = require('dayjs/plugin/customParseFormat')
+
+dayjs.extend(utc)
+dayjs.extend(timezone)
+dayjs.extend(customParseFormat)
+
+module.exports = {
+ site: 'mediaklikk.hu',
+ url: 'https://mediaklikk.hu/wp-content/plugins/hms-global-widgets/widgets/programGuide/programGuideInterface.php',
+ request: {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/x-www-form-urlencoded'
+ },
+ data: function ({ date, channel }) {
+ const params = new URLSearchParams()
+ params.append('ChannelIds', `${channel.site_id},`)
+ params.append('Date', date.format('YYYY-MM-DD'))
+
+ return params
+ }
+ },
+ parser: function ({ content }) {
+ const programs = []
+ const items = parseItems(content)
+ items.forEach(item => {
+ const $item = cheerio.load(item)
+ const start = parseStart($item)
+ let stop = parseStop($item)
+ if (!stop) stop = start.add(30, 'm')
+ programs.push({
+ title: parseTitle($item),
+ description: parseDescription($item),
+ icon: parseIcon($item),
+ start,
+ stop
+ })
+ })
+
+ return programs
+ }
+}
+
+function parseStart($item) {
+ const timeString = $item('*').data('from')
+
+ return dayjs.tz(timeString, 'YYYY-MM-DD HH:mm:ss', 'Europe/Budapest')
+}
+
+function parseStop($item) {
+ const timeString = $item('*').data('till')
+ if (!timeString) return null
+
+ return dayjs.tz(timeString, 'YYYY-MM-DD HH:mm:ss', 'Europe/Budapest')
+}
+
+function parseTitle($item) {
+ return $item('.program_info > h1').text().trim()
+}
+
+function parseDescription($item) {
+ return $item('.program_about > .program_description > p').text().trim()
+}
+
+function parseIcon($item) {
+ const backgroundImage = $item('.program_about > .program_photo').css('background-image')
+ if (!backgroundImage) return null
+ const [_, icon] = backgroundImage.match(/url\(\'(.*)'\)/) || [null, null]
+
+ return icon
+}
+
+function parseItems(content) {
+ const $ = cheerio.load(content)
+
+ return $('li.program_body').toArray()
+}
diff --git a/sites/mediaklikk.hu/mediaklikk.hu.test.js b/sites/mediaklikk.hu/mediaklikk.hu.test.js
new file mode 100644
index 00000000..c6c575b3
--- /dev/null
+++ b/sites/mediaklikk.hu/mediaklikk.hu.test.js
@@ -0,0 +1,66 @@
+// npx epg-grabber --config=sites/mediaklikk.hu/mediaklikk.hu.config.js --channels=sites/mediaklikk.hu/mediaklikk.hu_hu.channels.xml --output=guide.xml --days=2
+
+const { parser, url, request } = require('./mediaklikk.hu.config.js')
+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('2022-03-10', 'YYYY-MM-DD').startOf('d')
+const channel = {
+ site_id: '3',
+ xmltv_id: 'DuneTV.hu'
+}
+
+it('can generate valid url', () => {
+ expect(url).toBe(
+ 'https://mediaklikk.hu/wp-content/plugins/hms-global-widgets/widgets/programGuide/programGuideInterface.php'
+ )
+})
+
+it('can generate valid request method', () => {
+ expect(request.method).toBe('POST')
+})
+
+it('can generate valid request headers', () => {
+ expect(request.headers).toMatchObject({
+ 'Content-Type': 'application/x-www-form-urlencoded'
+ })
+})
+
+it('can generate valid request data', () => {
+ const result = request.data({ date, channel })
+ expect(result.get('ChannelIds')).toBe('3,')
+ expect(result.get('Date')).toBe('2022-03-10')
+})
+
+it('can parse response', () => {
+ const content = ``
+
+ const result = parser({ content }).map(p => {
+ p.start = p.start.toJSON()
+ p.stop = p.stop.toJSON()
+ return p
+ })
+
+ expect(result).toMatchObject([
+ {
+ start: '2022-03-09T23:35:35.000Z',
+ stop: '2022-03-10T00:35:54.000Z',
+ title: `A tengeralattjรกrรณ (2018)`,
+ description:
+ 'A La Rochelle-ben tรถrtรฉnt robbanรกs utรกn a polgรกrmester parancsot kap nรฉhรกny sรบlyos intรฉzkedรฉs meghozatalรกra. Az ellensรฉges tรกmadรกs utรกn az U-612 fedรฉlzetรฉn a bajtรกrsiassรกg terรฉn gondok mutatkoznak. Hoffmann รฉs Tennstedt rivalizรกlรกsa รฉs a legรฉnysรฉg kรถzt tapasztalhatรณ feszรผltsรฉg veszรฉlybe sodorja kรผldetรฉsรผket.(Eredeti hang digitรกlisan.)',
+ icon: 'https://mediaklikk.hu/wp-content/uploads/sites/4/2020/06/00-150x150.jpg'
+ }
+ ])
+})
+
+it('can handle empty guide', () => {
+ const result = parser({
+ date,
+ channel,
+ content: ``
+ })
+ expect(result).toMatchObject([])
+})
diff --git a/sites/mediaklikk.hu/mediaklikk.hu_hu.channels.xml b/sites/mediaklikk.hu/mediaklikk.hu_hu.channels.xml
new file mode 100644
index 00000000..e45b2162
--- /dev/null
+++ b/sites/mediaklikk.hu/mediaklikk.hu_hu.channels.xml
@@ -0,0 +1,13 @@
+
+
+
+ Duna
+ Duna World
+ M1
+ M2
+ M3
+ M4 Sport
+ M4 Sport +
+ M5
+
+
\ No newline at end of file
diff --git a/sites/meo.pt/meo.pt_pt.channels.xml b/sites/meo.pt/meo.pt_pt.channels.xml
index d248ed81..cc504002 100644
--- a/sites/meo.pt/meo.pt_pt.channels.xml
+++ b/sites/meo.pt/meo.pt_pt.channels.xml
@@ -68,9 +68,9 @@
Eleven Sports 4 Portugal
Eleven Sports 5 Portugal
Eleven Sports 6 Portugal
- EuroNews Deutsch
- EuroNews English
- EuroNews Portuguรชs
+ EuroNews Deutsch
+ EuroNews English
+ EuroNews Portuguรชs
Eurosport 1
Eurosport 2
FashionTV Europe
@@ -120,7 +120,7 @@
PFC Internacional
Panda Kids
Penthouse Gold
- Perviy kanal Europa
+ Perviy kanal Europa
Phoenix CNE
Playboy TV Europe
Porto Canal
diff --git a/sites/mi.tv/mi.tv_br.channels.xml b/sites/mi.tv/mi.tv_br.channels.xml
index 75f14fa4..bb2f9415 100644
--- a/sites/mi.tv/mi.tv_br.channels.xml
+++ b/sites/mi.tv/mi.tv_br.channels.xml
@@ -55,6 +55,7 @@
E! Brasil
EPTV Sul de Minas
ESPN 2 Brasil
+ ESPN 3 Brasil
ESPN Brasil
ESPN Extra Brasil
Eurochannel
@@ -212,8 +213,9 @@
TV Cultura Nacional
TV Diรกrio
TV Difusora Sรฃo Luรญs
- TVE
+ TVE
TVE Bahia
+ TVE
TV Em Tempo
TV Escola
TV Gazeta
diff --git a/sites/mi.tv/mi.tv_cl.channels.xml b/sites/mi.tv/mi.tv_cl.channels.xml
index 88631a8d..3bf74cb4 100644
--- a/sites/mi.tv/mi.tv_cl.channels.xml
+++ b/sites/mi.tv/mi.tv_cl.channels.xml
@@ -37,7 +37,7 @@
ESPN 3 Andino
ESPN Chile
ETC TV
- EuroNews Espaรฑol
+ EuroNews Espaรฑol
Fox Sports 1 Chile
Fox Sports 2 Chile
Fox Sports Chile
diff --git a/sites/mncvision.id/mncvision.id.config.js b/sites/mncvision.id/mncvision.id.config.js
index 20331b04..243fbe2e 100644
--- a/sites/mncvision.id/mncvision.id.config.js
+++ b/sites/mncvision.id/mncvision.id.config.js
@@ -12,7 +12,7 @@ dayjs.extend(customParseFormat)
module.exports = {
site: 'mncvision.id',
- url: `https://mncvision.id/schedule/table`,
+ url: 'https://mncvision.id/schedule/table',
request: {
method: 'POST',
data: function ({ channel, date }) {
@@ -30,21 +30,33 @@ module.exports = {
'Content-Type': 'multipart/form-data; boundary=X-EPG-BOUNDARY'
}
},
- async parser({ content, date }) {
+ async parser({ content, date, headers, channel }) {
const programs = []
- const items = parseItems(content)
+
+ let items = parseItems(content)
+ const pages = parsePages(content)
+ const cookies = headers && headers['set-cookie'] ? headers['set-cookie'].join(';') : ''
+ for (let url of pages) {
+ const nextContent = await axios
+ .get(url, {
+ headers: {
+ Cookie: cookies
+ }
+ })
+ .then(r => r.data)
+ .catch(console.log)
+ items = items.concat(parseItems(nextContent))
+ }
+
for (const item of items) {
- const title = parseTitle(item)
const start = parseStart(item, date)
const duration = parseDuration(item)
const stop = start.add(duration, 'm')
- const description = await loadDescription(item)
-
programs.push({
- title,
- description,
- start: start.toJSON(),
- stop: stop.toJSON()
+ title: parseTitle(item),
+ description: await loadDescription(item, channel),
+ start,
+ stop
})
}
@@ -72,12 +84,17 @@ module.exports = {
}
}
-async function loadDescription(item) {
+async function loadDescription(item, channel) {
+ const cookies = {
+ en: 's1nd0vL=jgs82rfmntm362uvdbknng4l5n4lq4u4;',
+ id: 's1nd0vL=bfh2v7qvrsso7ck6pama3ane6bfv5k5g;'
+ }
+ const cookie = cookies[channel.lang]
const $item = cheerio.load(item)
const progUrl = $item('a').attr('href')
if (!progUrl) return null
const data = await axios
- .get(progUrl)
+ .get(progUrl, { headers: { 'X-Requested-With': 'XMLHttpRequest', cookie } })
.then(r => r.data)
.catch(console.log)
if (!data) return null
@@ -117,3 +134,16 @@ function parseItems(content) {
return $('tr[valign="top"]').toArray()
}
+
+function parsePages(content) {
+ const $ = cheerio.load(content)
+ const links = $('#schedule > div.schedule_search_result_container > div.box.well > a').toArray()
+
+ const pages = {}
+ for (let link of links) {
+ const url = $(link).attr('href')
+ pages[url] = true
+ }
+
+ return Object.keys(pages)
+}
diff --git a/sites/mncvision.id/mncvision.id.test.js b/sites/mncvision.id/mncvision.id.test.js
index 6055d9d1..fcb7a7b7 100644
--- a/sites/mncvision.id/mncvision.id.test.js
+++ b/sites/mncvision.id/mncvision.id.test.js
@@ -1,5 +1,6 @@
// node ./scripts/channels.js --config=./sites/mncvision.id/mncvision.id.config.js --output=./sites/mncvision.id/mncvision.id_id.channels.xml
-// npx epg-grabber --config=sites/mncvision.id/mncvision.id.config.js --channels=sites/mncvision.id/mncvision.id_id.channels.xml --output=.gh-pages/guides/id/mncvision.id.epg.xml --days=2
+// npx epg-grabber --config=sites/mncvision.id/mncvision.id.config.js --channels=sites/mncvision.id/mncvision.id_id-id.channels.xml --output=guide.xml --days=2
+// npx epg-grabber --config=sites/mncvision.id/mncvision.id.config.js --channels=sites/mncvision.id/mncvision.id_id-en.channels.xml --output=guide.xml --days=2
const { parser, url, request } = require('./mncvision.id.config.js')
const axios = require('axios')
@@ -12,11 +13,21 @@ dayjs.extend(utc)
jest.mock('axios')
const date = dayjs.utc('2021-11-12', 'YYYY-MM-DD').startOf('d')
-const channel = {
+const channelID = {
site_id: '203',
- xmltv_id: 'AnimalPlanetSoutheastAsia.us'
+ xmltv_id: 'AnimalPlanetSoutheastAsia.us',
+ lang: 'id'
}
-const content = ` `
+const channelEN = {
+ site_id: '203',
+ xmltv_id: 'AnimalPlanetSoutheastAsia.us',
+ lang: 'en'
+}
+const setCookie = [
+ 's1nd0vL=0qpsmm7dpjmi7nt8d2h5epf16rmgg8a8; expires=Sat, 05-Mar-2022 15:44:22 GMT; Max-Age=7200; path=/; HttpOnly'
+]
+const content0 = ` Jadwal Tayang Channel: 41 Tanggal: 2022-03-05
`
+const content50 = ` Jadwal Tayang Channel: 41 Tanggal: 2022-03-05
`
it('can generate valid url', () => {
expect(url).toBe('https://mncvision.id/schedule/table')
@@ -29,27 +40,56 @@ it('can generate valid request headers', () => {
})
it('can generate valid request data', () => {
- const result = request.data({ channel, date })
+ const result = request.data({ channel: channelID, date })
expect(result._boundary).toBe('X-EPG-BOUNDARY')
})
-it('can parse response', done => {
- axios.get.mockImplementation(() =>
- Promise.resolve({
- data: `
+it('can parse response in Indonesian', done => {
+ axios.get.mockImplementation((url, options = {}) => {
+ if (
+ url === 'https://www.mncvision.id/schedule/detail/2022030500000041/Hey-Duggee-S3-Ep-22/1' &&
+ options.headers &&
+ options.headers['X-Requested-With'] === 'XMLHttpRequest' &&
+ options.headers['cookie'] === 's1nd0vL=bfh2v7qvrsso7ck6pama3ane6bfv5k5g;'
+ ) {
+ return Promise.resolve({
+ data: `
Nikmati suasana kehidupan koloni anjing laut di kawasan pantai barat Afrika Selatan.
`
- })
- )
+ })
+ } else if (
+ url === 'https://www.mncvision.id/schedule/table/startno/50' &&
+ options.headers &&
+ options.headers['Cookie'] === setCookie.join(';')
+ ) {
+ return Promise.resolve({
+ data: content50
+ })
+ }
- parser({ date, channel, content })
+ return Promise.resolve({ data: '' })
+ })
+
+ parser({ date, content: content0, headers: { 'set-cookie': setCookie }, channel: channelID })
.then(result => {
+ result = result.map(p => {
+ p.start = p.start.toJSON()
+ p.stop = p.stop.toJSON()
+ return p
+ })
+
expect(result).toMatchObject([
{
start: '2021-11-11T17:00:00.000Z',
- stop: '2021-11-11T18:00:00.000Z',
- title: 'African Wild S1: Seals',
+ stop: '2021-11-11T17:07:00.000Z',
+ title: 'Hey Duggee S3, Ep 22',
description:
'Nikmati suasana kehidupan koloni anjing laut di kawasan pantai barat Afrika Selatan.'
+ },
+ {
+ start: '2021-11-12T01:25:00.000Z',
+ stop: '2021-11-12T01:32:00.000Z',
+ title: 'Hey Duggee S1, Ep 46',
+ description: null
}
])
done()
@@ -59,20 +99,51 @@ it('can parse response', done => {
})
})
-it('can parse response with empty description', done => {
- axios.get.mockImplementation(() =>
- Promise.resolve({
- data: ` -
`
- })
- )
+it('can parse response in English', done => {
+ axios.get.mockImplementation((url, options = {}) => {
+ if (
+ url === 'https://www.mncvision.id/schedule/detail/2022030500000041/Hey-Duggee-S3-Ep-22/1' &&
+ options.headers &&
+ options.headers['X-Requested-With'] === 'XMLHttpRequest' &&
+ options.headers['cookie'] === 's1nd0vL=jgs82rfmntm362uvdbknng4l5n4lq4u4;'
+ ) {
+ return Promise.resolve({
+ data: `
+ While Castiel investigates the disappearance of a local teen, Sam and Dean are visited by an old friend.
`
+ })
+ } else if (
+ url === 'https://www.mncvision.id/schedule/table/startno/50' &&
+ options.headers &&
+ options.headers['Cookie'] === setCookie.join(';')
+ ) {
+ return Promise.resolve({
+ data: content50
+ })
+ }
- parser({ date, channel, content })
+ return Promise.resolve({ data: '' })
+ })
+
+ parser({ date, content: content0, headers: { 'set-cookie': setCookie }, channel: channelEN })
.then(result => {
+ result = result.map(p => {
+ p.start = p.start.toJSON()
+ p.stop = p.stop.toJSON()
+ return p
+ })
+
expect(result).toMatchObject([
{
start: '2021-11-11T17:00:00.000Z',
- stop: '2021-11-11T18:00:00.000Z',
- title: 'African Wild S1: Seals',
+ stop: '2021-11-11T17:07:00.000Z',
+ title: 'Hey Duggee S3, Ep 22',
+ description:
+ 'While Castiel investigates the disappearance of a local teen, Sam and Dean are visited by an old friend.'
+ },
+ {
+ start: '2021-11-12T01:25:00.000Z',
+ stop: '2021-11-12T01:32:00.000Z',
+ title: 'Hey Duggee S1, Ep 46',
description: null
}
])
@@ -86,7 +157,7 @@ it('can parse response with empty description', done => {
it('can handle empty guide', done => {
parser({
date,
- channel,
+ channel: channelID,
content: ``
})
.then(result => {
diff --git a/sites/mncvision.id/mncvision.id_id-en.channels.xml b/sites/mncvision.id/mncvision.id_id-en.channels.xml
new file mode 100644
index 00000000..0dffefa9
--- /dev/null
+++ b/sites/mncvision.id/mncvision.id_id-en.channels.xml
@@ -0,0 +1,103 @@
+
+
+
+ ABC Australia Asia
+ Aljazeera English
+ Al Quran Al Kareem TV
+ Animal Planet Southeast Asia
+ Animax Asia
+ ANTV
+ Arirang World
+ Asian Food Network
+ AXN East Asia
+ Baby TV Asia
+ BBC Earth Asia
+ BBC World News Asia Pacific
+ BeIn Sports 1 Indonesia
+ BeIn Sports 3 Indonesia
+ Berita Satu News Channel
+ Besmart
+ Bloomberg TV Asia
+ Boomerang South East Asia
+ Cartoon Network Asia
+ CBeebies Asia
+ Celestial Classic Movies
+ Celestial Movies Indonesia
+ CGTN
+ CGTN Documentary
+ Cinemax Asia
+ CNA
+ CNBC Asia-Pacific
+ CNN International Asia Pacific
+ Crime + Investigation Asia
+ Discovery Channel Southeast Asia
+ DW English
+ Ent
+ Fight Sports
+ FMN
+ Fox News Channel
+ France 24 English
+ Galaxy
+ Galaxy Premium
+ GTV
+ HBO Asia
+ HBO Family Asia
+ HBO Hits
+ HBO Signature Asia
+ HGTV Asia
+ History Asia
+ Hits
+ Hits Movies
+ IDX Channel
+ IMC
+ Indosiar
+ Ie
+ INews
+ Jak TV
+ Kids TV
+ Kix
+ Kompas TV
+ Life
+ Lifestyle & Fashion
+ Lifetime Asia
+ Metro TV
+ Miao Mi
+ MNC News
+ MNC Sports
+ MNC Sports 2
+ MNC Sports 3
+ MNC TV
+ M Shop Signature
+ M Shop Super Sale!
+ Music TV
+ Muslim TV
+ National Geographic Asia
+ National Geographic Wild Asia
+ NET
+ NHK World Japan
+ NHK World Premium
+ Nickelodeon South East Asia
+ Nick Jr Asia
+ OK TV
+ One
+ Quran TV
+ RCTI
+ SCTV
+ SEA Today
+ Soccer Channel
+ SPOTV
+ SPOTV 2
+ Tawaf TV
+ Thrill
+ TLC Southeast Asia
+ Trans 7
+ Trans TV
+ TVN Movies Indonesia
+ TVN Premium Indonesia
+ TVOne
+ TVRI Nasional
+ Vision Prime
+ Warner TV Southeast Asia
+ Zee Bioskop
+
+
diff --git a/sites/mncvision.id/mncvision.id_id.channels.xml b/sites/mncvision.id/mncvision.id_id-id.channels.xml
similarity index 100%
rename from sites/mncvision.id/mncvision.id_id.channels.xml
rename to sites/mncvision.id/mncvision.id_id-id.channels.xml
diff --git a/sites/mtel.ba/mtel.ba_ba.channels.xml b/sites/mtel.ba/mtel.ba_ba.channels.xml
index 4a3a8f01..2cc02524 100644
--- a/sites/mtel.ba/mtel.ba_ba.channels.xml
+++ b/sites/mtel.ba/mtel.ba_ba.channels.xml
@@ -144,7 +144,7 @@
Rock & Roll
Rossiya 24
RTL Hrvatska
- RTL II
+ RTL II
RTL Kockica
RTL Living Hrvatska
RT News
diff --git a/sites/mts.rs/mts.rs_rs.channels.xml b/sites/mts.rs/mts.rs_rs.channels.xml
index 1c91f7b8..e7df3c16 100644
--- a/sites/mts.rs/mts.rs_rs.channels.xml
+++ b/sites/mts.rs/mts.rs_rs.channels.xml
@@ -71,8 +71,8 @@
eduTV
E! Europe
Epic Drama
- EuroNews English
- EuroNews Serbia
+ EuroNews English
+ EuroNews Serbia
Eurosport 1
Eurosport 2
Extreme Sports Channel
@@ -90,7 +90,7 @@
FilmBox Stars Adria
Film Klub
Film Klub Extra
- Film + Hungary
+ Film + Hungary
Food Network EMEA
Fox Crime Srbija
Fox Life Srbija
@@ -213,12 +213,12 @@
RT Documentary
RTL Croatia World
RTL Deutschland
- RTL Gold
+ RTL Gold
RTL Hrvatska
- RTL II
- RTL Klub
+ RTL II
+ RTL Klub
RTL Kockica
- RTL +
+ RTL +
RT News
RTP
RTR Planeta
diff --git a/sites/musor.tv/musor.tv.config.js b/sites/musor.tv/musor.tv.config.js
new file mode 100644
index 00000000..28cdf115
--- /dev/null
+++ b/sites/musor.tv/musor.tv.config.js
@@ -0,0 +1,88 @@
+const cheerio = require('cheerio')
+const dayjs = require('dayjs')
+const axios = require('axios')
+const utc = require('dayjs/plugin/utc')
+const customParseFormat = require('dayjs/plugin/customParseFormat')
+
+dayjs.extend(utc)
+dayjs.extend(customParseFormat)
+
+module.exports = {
+ site: 'musor.tv',
+ url({ channel, date }) {
+ const diff = date.diff(dayjs.utc().startOf('d'), 'd')
+
+ return diff === 0
+ ? `https://musor.tv/mai/tvmusor/${channel.site_id}`
+ : `https://musor.tv/napi/tvmusor/${channel.site_id}/${date.format('YYYY.MM.DD')}`
+ },
+ parser({ content }) {
+ const programs = []
+ const items = parseItems(content)
+ items.forEach(item => {
+ const prev = programs[programs.length - 1]
+ const $item = cheerio.load(item)
+ let start = parseStart($item)
+ if (prev) prev.stop = start
+ const stop = start.add(30, 'm')
+ programs.push({
+ title: parseTitle($item),
+ description: parseDescription($item),
+ icon: parseIcon($item),
+ start,
+ stop
+ })
+ })
+
+ return programs
+ },
+ async channels() {
+ const html = await axios
+ .get(`https://musor.tv/`)
+ .then(r => r.data)
+ .catch(console.log)
+
+ const $ = cheerio.load(html)
+ const channels = $('body > div.big_content > div > nav > table > tbody > tr > td > a').toArray()
+ return channels
+ .map(item => {
+ const $item = cheerio.load(item)
+ const url = $item('*').attr('href')
+ if (!url.startsWith('//musor.tv/mai/tvmusor/')) return null
+ const site_id = url.replace('//musor.tv/mai/tvmusor/', '')
+ return {
+ lang: 'hu',
+ site_id,
+ name: $item('*').text()
+ }
+ })
+ .filter(i => i)
+ }
+}
+
+function parseIcon($item) {
+ const imgSrc = $item('div.smartpe_screenshot > img').attr('src')
+
+ return imgSrc ? `https:${imgSrc}` : null
+}
+
+function parseTitle($item) {
+ return $item('div:nth-child(2) > div > h3 > a').text().trim()
+}
+
+function parseDescription($item) {
+ return $item('div:nth-child(5) > div > div').text().trim()
+}
+
+function parseStart($item) {
+ let datetime = $item('div:nth-child(1) > div > div > div > div > time').attr('content')
+ if (!datetime) return null
+
+ return dayjs.utc(datetime.replace('GMT', 'T'), 'YYYY-MM-DDTHH:mm:ss')
+}
+
+function parseItems(content) {
+ const $ = cheerio.load(content)
+
+ return $('div.multicolumndayprogarea > div.smartpe_progentry').toArray()
+}
diff --git a/sites/musor.tv/musor.tv.test.js b/sites/musor.tv/musor.tv.test.js
new file mode 100644
index 00000000..b9fa192c
--- /dev/null
+++ b/sites/musor.tv/musor.tv.test.js
@@ -0,0 +1,54 @@
+// npm run channels:parse -- --config=./sites/musor.tv/musor.tv.config.js --output=./sites/musor.tv/musor.tv_hu.channels.xml
+// npx epg-grabber --config=sites/musor.tv/musor.tv.config.js --channels=sites/musor.tv/musor.tv_hu.channels.xml --output=guide.xml --days=2
+
+const { parser, url } = require('./musor.tv.config.js')
+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('2022-03-07', 'YYYY-MM-DD').startOf('d')
+const channel = {
+ site_id: 'DUNA',
+ xmltv_id: 'DunaTV.hu'
+}
+
+it('can generate valid url', () => {
+ expect(url({ channel, date })).toBe('https://musor.tv/napi/tvmusor/DUNA/2022.03.07')
+})
+
+it('can parse response', () => {
+ const content = ` kubai-francia filmdrรกma,2014
A Havannai รฉjszaka az elsล film, amely teljes egรฉszรฉben Kubรกban forgott รฉs kendลzetlen ลszintesรฉggel beszรฉl egy elveszett generรกciรณ minden illรบziรณjรกrรณl รฉs csalรณdottsรกgรกrรณl. Amadeo 16 รฉvig nem talรกlkozott legjobb barรกtaival, fe
nรฉmet tรฉvรฉfilmsorozat,2018
8/1.: รj utakonUlrich Wrangel tengeralattjรกrรณ-kapitรกny รฉs emberei รถsszecsapรกsba keverednek egy amerikai fregatt-tal. Ekรถzben a megszรกllt Franciaorszรกgban az ifjรบ Klaus Hoffmann kapitรกny azon igyekszik, hogy mรฉltรณ legyen apja hรญrnevรฉ
`
+ const result = parser({ content, date }).map(p => {
+ p.start = p.start.toJSON()
+ p.stop = p.stop.toJSON()
+ return p
+ })
+
+ expect(result).toMatchObject([
+ {
+ start: '2022-03-06T23:35:00.000Z',
+ stop: '2022-03-07T01:15:00.000Z',
+ title: `Havannai รฉjszaka`,
+ icon: 'https://musor.tv/img/small/143/14373/Labadrugas.jpg',
+ description:
+ 'A Havannai รฉjszaka az elsล film, amely teljes egรฉszรฉben Kubรกban forgott รฉs kendลzetlen ลszintesรฉggel beszรฉl egy elveszett generรกciรณ minden illรบziรณjรกrรณl รฉs csalรณdottsรกgรกrรณl. Amadeo 16 รฉvig nem talรกlkozott legjobb barรกtaival, fe'
+ },
+ {
+ start: '2022-03-07T01:15:00.000Z',
+ stop: '2022-03-07T01:45:00.000Z',
+ title: `A tengeralattjรกrรณ 2018 I./1.`,
+ description:
+ '8/1.: รj utakonUlrich Wrangel tengeralattjรกrรณ-kapitรกny รฉs emberei รถsszecsapรกsba keverednek egy amerikai fregatt-tal. Ekรถzben a megszรกllt Franciaorszรกgban az ifjรบ Klaus Hoffmann kapitรกny azon igyekszik, hogy mรฉltรณ legyen apja hรญrnevรฉ'
+ }
+ ])
+})
+
+it('can handle empty guide', () => {
+ const result = parser({
+ date,
+ content: ``
+ })
+ expect(result).toMatchObject([])
+})
diff --git a/sites/musor.tv/musor.tv_hu.channels.xml b/sites/musor.tv/musor.tv_hu.channels.xml
new file mode 100644
index 00000000..367d573a
--- /dev/null
+++ b/sites/musor.tv/musor.tv_hu.channels.xml
@@ -0,0 +1,175 @@
+
+
+
+ 7.TV
+ AMC (HD)
+ Animal Planet (HD)
+ Apostol TV
+ Arena 4 (HD)
+ ATV (HD)
+ ATV Spirit (HD)
+ Auto Motor Sport (HD)
+ AXN (HD)
+ Baby TV
+ Balaton TV
+ BBC Earth (HD)
+ BBC World News
+ EWTN / Bonum TV
+ Boomerang
+ Cartoon Network
+ CBS Reality
+ Cinemax 2 (HD)
+ Cinemax (HD)
+ club MTV
+ CNBC
+ CNN
+ Comedy Central Family
+ Comedy Central (HD)
+ Cool (HD)
+ D1 Televรญziรณ
+ Da Vinci
+ DIGI Animal World (HD)
+ DIGI Life (HD)
+ DIGI Sport 1 (HD)
+ DIGI Sport 2 (HD)
+ DIGI Sport 3 (HD)
+ DIGI World (HD)
+ Dikh TV (HD)
+ Direct One TV
+ Discovery Channel (HD)
+ Discovery Science (HD)
+ Disney Channel
+ Docubox HD
+ Discovery Turbo Xtra (DTX) (HD)
+ Duck TV
+ Duck TV HD
+ Duna TV (HD)
+ Duna World (HD)
+ E! Entertainment (HD)
+ English Club TV
+ Epic Drama (HD)
+ Erdรฉly TV
+ Euronews (HD)
+ Eurosport 1 (HD)
+ Eurosport 2 (HD)
+ Eurosport 4K
+ Extreme Sports Channel
+ Fashion TV HD
+ Fehรฉrvรกr TV
+ FEM3
+ Fightbox HD
+ Film 4 (HD)
+ Filmbox Arthouse
+ Filmbox
+ Filmbox Extra HD
+ Filmbox Family
+ Filmbox Premium
+ Filmbox Stars
+ Film Cafรฉ (HD)
+ Film Mรกnia (HD)
+ Film Now
+ film+ (HD)
+ Fishing & Hunting Channel (HD)
+ Fit HD
+ FIX TV (HD)
+ Food Network (HD)
+ Funbox UltraHD 4K
+ Galaxy 4 (HD)
+ Gametoon HD
+ Hatoscsatorna
+ HBO 2 (HD)
+ HBO 3 (HD)
+ HBO (HD)
+ Hegyvidรฉk TV
+ Heti TV
+ HGTV
+ Hรญr TV (HD)
+ History (HD)
+ H!T Music
+ ID (HD)
+ Izaura TV
+ JimJam
+ Jocky TV
+ Kapos TV
+ Kรถlcsey TV
+ Life TV (HD)
+ Love Nature (HD / 4K)
+ Love Nature (HD / 4K)
+ M1 (HD)
+ M2 / Petลfi (HD)
+ M4 Sport (HD)
+ M4 Sport+ (HD)
+ M5 (HD)
+ Mezzo
+ Mezzo Live HD
+ Minimax
+ Mozi+ (HD)
+ Moziverzum (HD)
+ MTV 00s
+ MTV 80s
+ MTV 90s
+ MTV European
+ MTV Hits
+ MTV Hungary
+ MTV Live HD
+ 1 Music Channel (HD)
+ Muzsika TV
+ National Geographic (HD)
+ National Geographic Wild (HD)
+ Nautical Channel (HD)
+ Nickelodeon
+ Nick Jr
+ Nicktoons
+ Ozone TV (HD)
+ Pannon TV (Vajdasรกg)
+ Paramount Network (HD)
+ PAX TV
+ Pesti TV
+ Prime (HD)
+ RTL Gold
+ RTL II (HD)
+ RTL Klub (HD)
+ RTL+
+ Sky News
+ Slรกger TV (HD)
+ Sony Max
+ Sony Movie Channel
+ Sorozat+
+ Spektrum (HD)
+ Spektrum Home (HD)
+ Spรญler1 TV (HD)
+ Spรญler2 TV (HD)
+ Sport 1 (HD)
+ Sport 2 (HD)
+ Stingray Classica HD
+ Stingray C Music
+ Stingray iConcerts HD
+ Story 4 (HD)
+ Super TV2 (HD)
+ Szeged TV
+ TeenNick
+ TLC (HD)
+ Total Dance TV (HD)
+ Trace Sports HD
+ Trace Urban (HD)
+ Travel Channel (HD)
+ Travel XP (HD / 4K)
+ Travel XP (HD / 4K)
+ TV2 (HD)
+ TV21 Ungvรกr (Kรกrpรกtalja)
+ TV2 Comedy
+ TV2 Kids
+ TV2 Sรฉf
+ TV 4 (HD)
+ TV Eger
+ TV Paprika (HD)
+ รjbuda TV
+ Viasat 3 (HD)
+ Viasat 6
+ Viasat Explore (HD)
+ Viasat History (HD)
+ Viasat Nature (HD)
+ Zalaegerszegi TV
+ Zenebutik TV
+
+
diff --git a/sites/novacyprus.com/novacyprus.com_cy.channels.xml b/sites/novacyprus.com/novacyprus.com_cy.channels.xml
index 8f2d59c3..1a20aedd 100644
--- a/sites/novacyprus.com/novacyprus.com_cy.channels.xml
+++ b/sites/novacyprus.com/novacyprus.com_cy.channels.xml
@@ -5,12 +5,12 @@
Boomerang Central & Eastern Europe
Discovery Channel Europe
Disney Channel Middle East
- EuroNews Ellinika
+ EuroNews Ellinika
Eurosport 1
Eurosport 2
Fox Greece
Fox Life Greece
- Insight HD
+ Insight HD
Mad Greekz
Mad TV
MTV Live
diff --git a/sites/nowplayer.now.com/nowplayer.now.com_hk-en.channels.xml b/sites/nowplayer.now.com/nowplayer.now.com_hk-en.channels.xml
index a3b30744..3f5904dc 100644
--- a/sites/nowplayer.now.com/nowplayer.now.com_hk-en.channels.xml
+++ b/sites/nowplayer.now.com/nowplayer.now.com_hk-en.channels.xml
@@ -39,7 +39,7 @@
DW English
EBC News Asia
ETTV Asia News
- EuroNews English
+ EuroNews English
Fight Sports
Food Network Asia
France 24 English
diff --git a/sites/nowplayer.now.com/nowplayer.now.com_hk-zh.channels.xml b/sites/nowplayer.now.com/nowplayer.now.com_hk-zh.channels.xml
index f8eafccb..cf614a23 100644
--- a/sites/nowplayer.now.com/nowplayer.now.com_hk-zh.channels.xml
+++ b/sites/nowplayer.now.com/nowplayer.now.com_hk-zh.channels.xml
@@ -39,7 +39,7 @@
DW English
EBC News Asia
ETTV Asia News
- EuroNews English
+ EuroNews English
Fight Sports
Food Network Asia
France 24 English
diff --git a/sites/ontvtonight.com/ontvtonight.com_uk.channels.xml b/sites/ontvtonight.com/ontvtonight.com_uk.channels.xml
index 5e7dfff8..8d7f63a5 100644
--- a/sites/ontvtonight.com/ontvtonight.com_uk.channels.xml
+++ b/sites/ontvtonight.com/ontvtonight.com_uk.channels.xml
@@ -81,7 +81,7 @@
RT UK
Sangat TV
SBN International
- Sky Arts UK
+ Sky Arts UK
Sky One UK
Smithsonian Channel UK
Sony Channel UK
diff --git a/sites/pbsguam.org/pbsguam.org.config.js b/sites/pbsguam.org/pbsguam.org.config.js
index bccc511e..59d1411a 100644
--- a/sites/pbsguam.org/pbsguam.org.config.js
+++ b/sites/pbsguam.org/pbsguam.org.config.js
@@ -4,7 +4,7 @@ const isBetween = require('dayjs/plugin/isBetween')
dayjs.extend(isBetween)
module.exports = {
- site: 'pbsguam.org',
+ site: 'pbsguam.org', // the program is only available Thursday through Sunday
url: 'https://pbsguam.org/calendar/',
parser: function ({ content, date }) {
let programs = []
diff --git a/sites/pbsguam.org/pbsguam.org.test.js b/sites/pbsguam.org/pbsguam.org.test.js
index 5d90d331..fd2ff87c 100644
--- a/sites/pbsguam.org/pbsguam.org.test.js
+++ b/sites/pbsguam.org/pbsguam.org.test.js
@@ -1,4 +1,4 @@
-// npx epg-grabber --config=sites/pbsguam.org/pbsguam.org.config.js --channels=sites/pbsguam.org/pbsguam.org_gu.channels.xml --output=.gh-pages/guides/gu/pbsguam.org.epg.xml --days=2
+// npx epg-grabber --config=sites/pbsguam.org/pbsguam.org.config.js --channels=sites/pbsguam.org/pbsguam.org_gu.channels.xml --output=guide.xml --days=2
const { parser, url } = require('./pbsguam.org.config.js')
const dayjs = require('dayjs')
diff --git a/sites/programacion-tv.elpais.com/programacion-tv.elpais.com_es.channels.xml b/sites/programacion-tv.elpais.com/programacion-tv.elpais.com_es.channels.xml
index a5358b2e..2162e4be 100644
--- a/sites/programacion-tv.elpais.com/programacion-tv.elpais.com_es.channels.xml
+++ b/sites/programacion-tv.elpais.com/programacion-tv.elpais.com_es.channels.xml
@@ -48,7 +48,7 @@
Energy
ETB 1
ETB 3
- EuroNews Espaรฑol
+ EuroNews Espaรฑol
Eurosport 1
Eurosport 2
EWTN Espaรฑa - Latinoamรฉrica
diff --git a/sites/programetv.ro/programetv.ro_ro.channels.xml b/sites/programetv.ro/programetv.ro_ro.channels.xml
index 0a9672a0..6cb9fdf4 100644
--- a/sites/programetv.ro/programetv.ro_ro.channels.xml
+++ b/sites/programetv.ro/programetv.ro_ro.channels.xml
@@ -67,7 +67,7 @@
Erox HD
Eroxxx HD
Etno TV
- EuroNews English
+ EuroNews English
Eurosport 1 Romania
Eurosport 2 Romania
Eurosport 4K
@@ -168,10 +168,10 @@
Rock TV
Romรขnia TV
RTL Deutschland
- RTL Gold
- RTL II
- RTL Klub
- RTL +
+ RTL Gold
+ RTL II
+ RTL Klub
+ RTL +
RTL Zwei Deutschland
RT News
Sat. 1 Deutschland
diff --git a/sites/programme-tv.net/programme-tv.net_fr.channels.xml b/sites/programme-tv.net/programme-tv.net_fr.channels.xml
index 77184856..502fa52f 100644
--- a/sites/programme-tv.net/programme-tv.net_fr.channels.xml
+++ b/sites/programme-tv.net/programme-tv.net_fr.channels.xml
@@ -17,9 +17,9 @@
BBC Four
BBC One
BBC Two
- BeIn Sports 1
- BeIn Sports 2
- BeIn Sports 3
+ BeIn Sports 1 France
+ BeIn Sports 2 France
+ BeIn Sports 3 France
BeIn Sports Max 10 France
BeIn Sports Max 4 France
BeIn Sports Max 5 France
@@ -39,10 +39,16 @@
Canal J
Canal + Cinรฉma France
Canal + Dรฉcalรฉ
- Canal + Family France
+ Canal + Docs
+ Canal + Grand Ecran France
+ Canal + Kids
+ Canal + Formula 1
Canal + France
+ Canal + Moto GP
+ Canal + Premier League
Canal + Sรฉries France
Canal + Sport France
+ Canal + Top 14
Canvas
Cartoon Network France
Chasse & Pรชche
@@ -70,7 +76,7 @@
E! France
Equidia
Eurochannel
- EuroNews Franรงais
+ EuroNews Franรงais
Eurosport 1 France
Eurosport 2 France
FashionTV Europe
@@ -163,6 +169,7 @@
RMC Dรฉcouverte
RMC Sport 1
RMC Sport 2
+ RMC Sport UHD
RMC Story
RTBF La Une
RT France
@@ -206,4 +213,4 @@
XXL
ZDF
-
\ No newline at end of file
+
diff --git a/sites/programtv.onet.pl/programtv.onet.pl_pl.channels.xml b/sites/programtv.onet.pl/programtv.onet.pl_pl.channels.xml
index 2cc1e13c..04135cc6 100644
--- a/sites/programtv.onet.pl/programtv.onet.pl_pl.channels.xml
+++ b/sites/programtv.onet.pl/programtv.onet.pl_pl.channels.xml
@@ -100,8 +100,8 @@
Eska TV
Eska TV Extra
Eurochannel
- EuroNews English
- EuroNews Franรงais
+ EuroNews English
+ EuroNews Franรงais
Eurosport 1 Germany
Eurosport 1 Polska
Eurosport 2 Polska
@@ -198,7 +198,7 @@
ORF 1
ORF 2
Paramount Channel Polska
- Perviy kanal Europa
+ Perviy kanal Europa
Phoenix
Planete + Polska
Playboy TV Europe
@@ -244,7 +244,7 @@
Romance TV Polska
Rossiya 24
RT Documentary
- RTL 102.5 RadioVisione
+ RTL 102.5 RadioVisione
RTL Deutschland
RTL Zwei Deutschland
RT News
@@ -256,10 +256,10 @@
Scifi Polska
Sixx Deutschland
Sky Cinema Action
- Sky Cinema Comedy
- Sky Cinema Hits
- Sky Cinema Nostalgie
- Sky Cinema +24
+ Sky Cinema Comedy
+ Sky Cinema Hits
+ Sky Cinema Nostalgie
+ Sky Cinema +24
Sky Krimi
Sky News International
Sky Sport 1
@@ -267,7 +267,7 @@
Sky Sport Austria 1
Spiegel Geschichte
Sport 1
- Sport Klub Polska
+ Sport Klub Polska
SRF 1
SRF Zwei
Stars TV
diff --git a/sites/proximusmwc.be/proximusmwc.be.config.js b/sites/proximusmwc.be/proximusmwc.be.config.js
new file mode 100644
index 00000000..c384ea7f
--- /dev/null
+++ b/sites/proximusmwc.be/proximusmwc.be.config.js
@@ -0,0 +1,79 @@
+const axios = require('axios')
+const dayjs = require('dayjs')
+
+module.exports = {
+ site: 'proximusmwc.be',
+ url: 'https://api.proximusmwc.be/v2/graphql',
+ request: {
+ headers: {
+ 'Content-Type': 'application/json'
+ },
+ data({ channel, date }) {
+ return {
+ query:
+ 'query ($language: String!, $startTime: Int!, $endTime: Int!, $options: SchedulesByIntervalOptions) { schedulesByInterval(language: $language, startTime: $startTime, endTime: $endTime, options: $options) { trailId programReferenceNumber channelId title category startTime endTime image { key url __typename } parentalRating detailUrl grouped description shortDescription category categoryId subCategory links { episodeNumber id seasonId seasonName seriesId seriesTitle title type __typename } seriesId __typename }}',
+ variables: {
+ startTime: date.unix(),
+ endTime: date.add(1, 'd').unix(),
+ language: 'fr',
+ options: { channelIds: [channel.site_id] }
+ }
+ }
+ }
+ },
+ parser: function ({ content, date, channel }) {
+ const programs = []
+ const items = parseItems(content)
+ items.forEach(item => {
+ programs.push({
+ title: item.title,
+ description: item.description,
+ icon: parseIcon(item),
+ category: parseCategory(item),
+ start: dayjs.unix(item.startTime),
+ stop: dayjs.unix(item.endTime)
+ })
+ })
+
+ return programs
+ },
+ async channels() {
+ const query = {
+ operationName: 'getPlayableChannels',
+ variables: { language: 'fr', id: '0' },
+ query:
+ 'query getPlayableChannels($language: String!, $queryParams: ChannelQueryParams, $id: String) { playableChannels(language: $language, queryParams: $queryParams, id: $id) { id name language radio }}'
+ }
+ const data = await axios
+ .post(`https://api.proximusmwc.be/v2/graphql`, query)
+ .then(r => r.data)
+ .catch(console.log)
+
+ const channels = []
+ for (let item of data.data.playableChannels) {
+ if (item.radio) continue
+ channels.push({
+ lang: item.language,
+ site_id: item.id,
+ name: item.name
+ })
+ }
+
+ return channels
+ }
+}
+
+function parseCategory(item) {
+ return item.category ? item.category.replace(/^C\./, '') : null
+}
+
+function parseIcon(item) {
+ return item.image[0] ? item.image[0].url : null
+}
+
+function parseItems(content) {
+ const data = JSON.parse(content)
+ if (!data || !data.data || !Array.isArray(data.data.schedulesByInterval)) return []
+
+ return data.data.schedulesByInterval
+}
diff --git a/sites/proximusmwc.be/proximusmwc.be.test.js b/sites/proximusmwc.be/proximusmwc.be.test.js
new file mode 100644
index 00000000..6a3498d8
--- /dev/null
+++ b/sites/proximusmwc.be/proximusmwc.be.test.js
@@ -0,0 +1,68 @@
+// npm run channels:parse -- --config=./sites/proximusmwc.be/proximusmwc.be.config.js --output=./sites/proximusmwc.be/proximusmwc.be_be.channels.xml
+// npx epg-grabber --config=sites/proximusmwc.be/proximusmwc.be.config.js --channels=sites/proximusmwc.be/proximusmwc.be_be.channels.xml --output=guide.xml --days=2
+
+const { parser, url, request } = require('./proximusmwc.be.config.js')
+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('2022-03-04', 'YYYY-MM-DD').startOf('d')
+const channel = {
+ site_id: 'UID0024',
+ xmltv_id: 'DasErste.de'
+}
+
+it('can generate valid url', () => {
+ expect(url).toBe('https://api.proximusmwc.be/v2/graphql')
+})
+
+it('can generate valid request headers', () => {
+ expect(request.headers).toMatchObject({
+ 'Content-Type': 'application/json'
+ })
+})
+
+it('can generate valid request data', () => {
+ expect(request.data({ channel, date })).toMatchObject({
+ query:
+ 'query ($language: String!, $startTime: Int!, $endTime: Int!, $options: SchedulesByIntervalOptions) { schedulesByInterval(language: $language, startTime: $startTime, endTime: $endTime, options: $options) { trailId programReferenceNumber channelId title category startTime endTime image { key url __typename } parentalRating detailUrl grouped description shortDescription category categoryId subCategory links { episodeNumber id seasonId seasonName seriesId seriesTitle title type __typename } seriesId __typename }}',
+ variables: {
+ endTime: 1646438400,
+ language: 'fr',
+ options: { channelIds: ['UID0024'] },
+ startTime: 1646352000
+ }
+ })
+})
+
+it('can parse response', () => {
+ const content = `{"data":{"schedulesByInterval":[{"trailId":"UID0024_202202225537","programReferenceNumber":"107504040014","channelId":"UID0024","title":"Der Bozen-Krimi","category":"C.Magazine","startTime":1646350800,"endTime":1646356200,"description":"Chiara Schoras alias \\"Capo\\" Sonja Schwarz muss im 14. Bozen-Krimi nicht nur einen widersprรผchlichen Mordfall aufklรคren, sondern auch ein Geheimnis ans Licht bringen, das zwei Familien auf schmerzhafte Weise untrennbar verbindet.","image":[{"key":"source","url":"https://experience-cache.proximustv.be:443/posterserver/poster/EPG/250_250_BF6BF77FC28F72FA23EAEA6CAAE98B60.jpg","__typename":"Image"},{"key":"custom","url":"https://experience-cache.proximustv.be:443/posterserver/poster/EPG/w-%width%_h-%height%/250_250_BF6BF77FC28F72FA23EAEA6CAAE98B60.jpg","__typename":"Image"}]}]}}`
+ const result = parser({ content, channel, date }).map(p => {
+ p.start = p.start.toJSON()
+ p.stop = p.stop.toJSON()
+ return p
+ })
+
+ expect(result).toMatchObject([
+ {
+ start: '2022-03-03T23:40:00.000Z',
+ stop: '2022-03-04T01:10:00.000Z',
+ title: `Der Bozen-Krimi`,
+ description:
+ 'Chiara Schoras alias "Capo" Sonja Schwarz muss im 14. Bozen-Krimi nicht nur einen widersprรผchlichen Mordfall aufklรคren, sondern auch ein Geheimnis ans Licht bringen, das zwei Familien auf schmerzhafte Weise untrennbar verbindet.',
+ category: 'Magazine',
+ icon: 'https://experience-cache.proximustv.be:443/posterserver/poster/EPG/250_250_BF6BF77FC28F72FA23EAEA6CAAE98B60.jpg'
+ }
+ ])
+})
+
+it('can handle empty guide', () => {
+ const result = parser({
+ date,
+ channel,
+ content: `{"data":{"schedulesByInterval":[]}}`
+ })
+ expect(result).toMatchObject([])
+})
diff --git a/sites/proximusmwc.be/proximusmwc.be_be.channels.xml b/sites/proximusmwc.be/proximusmwc.be_be.channels.xml
new file mode 100644
index 00000000..b71b5cbc
--- /dev/null
+++ b/sites/proximusmwc.be/proximusmwc.be_be.channels.xml
@@ -0,0 +1,219 @@
+
+
+
+ BRF TV HD
+ Das Erste
+ RTL
+ ZDF
+ BBC Ent
+ BBC First
+ BBC One
+ BBC Two
+ BBC World
+ CNN
+ eSportsONE
+ Euronews E
+ Extreme
+ FashionTV
+ MVTV
+ MTV Live HD
+ Penthouse Gold
+ TVE Int
+ 13รจ Rue HD
+ 2M Monde
+ AB3
+ ABXPLO HD
+ Action
+ Al Aoula
+ Al Jazeera
+ Animaux
+ Antenne Centre HD
+ Arte
+ AUTOMOTO
+ Be1
+ Be Cinรฉ
+ Bel RTL
+ Be Sรฉries
+ Boomerang F
+ Boukรฉ HD
+ bx1
+ C8
+ Canal J
+ Canal Zoom
+ Cartoon F
+ Cinรฉ+Classic
+ Cinรฉ+Frisson
+ Cinรฉ+Premier
+ ClubRTL
+ Comedy Central F
+ Crime District
+ Discovery F
+ Disn Ch HD F
+ Disn Jr F
+ Disney+
+ Dobbit TV F
+ Dorcel XXX
+ E! F
+ Eleven Pro League 1 (FR)
+ Eleven Pro League 2 (FR)
+ Eleven Pro League 3 (FR)
+ ES1 F
+ ES2 F
+ ES3 F
+ Euronews F
+ Eurosp F
+ Eurosp2 F
+ France 2
+ France 24 F
+ France 3
+ France 4
+ France 5
+ Game One
+ Gulli HD
+ Histoire
+ KTO
+ LCI
+ LN24
+ Maghreb TV
+ Mangas
+ MaTรฉlรฉ
+ Melody.tv
+ MezzoLive
+ MTV F
+ MTV Hits
+ Museum TV
+ MyZen.tv
+ NGC F
+ NGC Wild F
+ nick F
+ nick jr F
+ No Tรฉlรฉ HD
+ Paramount Channel
+ PickxLive F HD
+ Pickx+ F
+ Pickx+ Sports 10 F HD
+ Pickx+ Sports 1 F
+ Pickx+ Sports 3 F
+ Pickx+ Sports 4 F
+ Pickx+ Sports 5 F
+ Pickx+ Sports 6 F
+ Pickx+ Sports 7 F
+ Pickx+ Sports 8 F HD
+ Pickx+ Sports 9 F HD
+ Pink
+ PlugRTL
+ ContactV
+ RFM TV
+ La Trois
+ La Une
+ RTC Liรจge HD
+ RTL-TVI
+ Sc et Vie TV
+ ST100TV F
+ SyFy F
+ TCM cinรฉma
+ Tรฉlรฉ MB HD
+ Tรฉlรฉ Sambre
+ TF1
+ Tiji
+ TIPIK
+ TIPIK vision
+ TMC HD
+ TraceUrban
+ TREK
+ TV5 Monde
+ TV Breizh
+ TV Com
+ TV Lux
+ Ushuaรฏa
+ Vedia
+ Mediaset
+ RAI Uno
+ RAI Due
+ RAI Tre
+ Animal Pl
+ ATV
+ AVS HD
+ AVS Gent
+ Baby TV N
+ Boomerang N
+ BRUZZ HD
+ Canvas
+ Cartoon N
+ Comedy Central N
+ Discovery N
+ Disc Science
+ Disn Ch N
+ DisnJr N
+ Dobbit TV N
+ Dusk
+ Eclips
+ รฉรฉn
+ E! N
+ Eleven Pro League 1 (NL)
+ Eleven Pro League 2 (NL)
+ Eleven Pro League 3 (NL)
+ ES1 N
+ ES2 N
+ ES3 N
+ Eurosp N
+ Eurosp2 N
+ Focus TV HD
+ FOX
+ History
+ Insight TV
+ Inv Disc
+ Kanaal Z
+ Ketnet
+ Ment TV
+ MTV 80s
+ MTV N
+ NGC N
+ NGC Wild N
+ nick N
+ nick jr N
+ nick Toons
+ Njam! HD
+ NPO 1
+ NPO 2
+ NPO 3
+ OUT tv
+ Passie XXX
+ Pebble TV
+ PickxLive N HD
+ Pickx+ N
+ Pickx+ Sports 10 N
+ Pickx+ Sports 1 N
+ Pickx+ Sports 2 N
+ Pickx+ Sports 3 N
+ Pickx+ Sports 4 N
+ Pickx+ Sports 5 N
+ Pickx+ Sports 6 N
+ Pickx+ Sports 7 N
+ Pickx+ Sports 8 N
+ Pickx+ Sports 9 N
+ Plattelands
+ Play4
+ Play5
+ Play6
+ Play7 HD
+ Ring TV HD
+ ROB TV
+ RTV Kempen HD
+ RTV Mech HD
+ Sport 10
+ Classica
+ ST100 Hits
+ ST100TV N
+ TLC
+ TVLimbC
+ TV Oost
+ Vlaamsparlement.tv
+ VTM
+ VTM 2
+ VTM 3
+ VTM 4
+ VTM Gold
+ VTM Kids
+
+
diff --git a/sites/rev.bs/rev.bs_bs.channels.xml b/sites/rev.bs/rev.bs_bs.channels.xml
index 01fdf802..80573a18 100644
--- a/sites/rev.bs/rev.bs_bs.channels.xml
+++ b/sites/rev.bs/rev.bs_bs.channels.xml
@@ -62,7 +62,7 @@
ESPNU
Es TV
Eurochannel
- EuroNews English
+ EuroNews English
EWTN US
Fight Network
Food Network East
diff --git a/sites/sky.com/sky.com_uk.channels.xml b/sites/sky.com/sky.com_uk.channels.xml
index 248b3bc2..d546a515 100644
--- a/sites/sky.com/sky.com_uk.channels.xml
+++ b/sites/sky.com/sky.com_uk.channels.xml
@@ -30,6 +30,7 @@
BBC One Scotland
BBC Parliament
BBC Red Button 1
+ BBC Three
BBC Two
BT Sport 1
BT Sport 2
@@ -83,7 +84,7 @@
E4 UK +1
Eden
Eman Channel
- EuroNews English
+ EuroNews English
Eurosport 1 UK
Eurosport 2 UK
Faith UK
@@ -193,29 +194,29 @@
Sony TV
Sangat TV
Sikh Channel
- Sky Arts UK
+ Sky Arts UK
Sky Atlantic HD
Sky Cinema Action HD
Sky Cinema Animation HD
Sky Cinema Comedy HD
Sky Cinema Drama HD
Sky Cinema Family HD
- Sky Cinema Feel Good HD
+ Sky Cinema Feel Good HD
Sky Cinema Greats HD
Sky Cinema Hits HD
Sky Cinema Premiere HD
Sky Cinema Sci-Fi Horror HD
- Sky Cinema Sci-Fi Horror
+ Sky Cinema Sci-Fi Horror
Sky Cinema Thriller HD
Sky Comedy HD
Sky Crime
- Sky Documentaries
+ Sky Documentaries
Sky History
Sky History 2
Sky Max HD
- Sky Nature
+ Sky Nature
Sky News
- Sky Replay
+ Sky Replay
Sky Showcase HD
Sky Sports Arena
Sky Sports Box Office
@@ -241,6 +242,9 @@
TCM Movies
TG4
TJC
+ TLC
+ TLC HD
+ TLC +1
Takbeer TV
Talking Pictures TV
The Box UK
diff --git a/sites/sky.de/sky.de.config.js b/sites/sky.de/sky.de.config.js
new file mode 100644
index 00000000..d3f544e0
--- /dev/null
+++ b/sites/sky.de/sky.de.config.js
@@ -0,0 +1,45 @@
+const dayjs = require('dayjs')
+
+module.exports = {
+ site: 'sky.de',
+ ignore: true, // server returns error 403 (https://github.com/iptv-org/epg/runs/5435899744?check_suite_focus=true)
+ url: `https://www.sky.de/sgtvg/service/getBroadcastsForGrid`,
+ request: {
+ method: 'POST',
+ data: function ({ channel, date }) {
+ return {
+ cil: [channel.site_id],
+ d: date.valueOf()
+ }
+ }
+ },
+ parser: function ({ content, channel }) {
+ const programs = []
+ const items = parseItems(content, channel)
+ items.forEach(item => {
+ programs.push({
+ title: item.et,
+ description: item.epit,
+ category: item.ec,
+ start: dayjs(item.bsdt),
+ stop: dayjs(item.bedt),
+ season: item.sn,
+ episode: item.en,
+ icon: item.pu ? `http://sky.de${item.pu}` : null
+ })
+ })
+
+ return programs
+ }
+}
+
+function parseContent(content, channel) {
+ const json = JSON.parse(content)
+ if (!Array.isArray(json.cl)) return null
+ return json.cl.find(i => i.ci == channel.site_id)
+}
+
+function parseItems(content, channel) {
+ const data = parseContent(content, channel)
+ return data && Array.isArray(data.el) ? data.el : []
+}
diff --git a/sites/sky.de/sky.de.test.js b/sites/sky.de/sky.de.test.js
new file mode 100644
index 00000000..8a5c7821
--- /dev/null
+++ b/sites/sky.de/sky.de.test.js
@@ -0,0 +1,67 @@
+// npx epg-grabber --config=sites/sky.de/sky.de.config.js --channels=sites/sky.de/sky.de_de.channels.xml --output=guide.xml --days=2
+
+const { parser, url, request } = require('./sky.de.config.js')
+const dayjs = require('dayjs')
+const utc = require('dayjs/plugin/utc')
+dayjs.extend(utc)
+
+const date = dayjs.utc('2022-02-28', 'YYYY-MM-DD').startOf('d')
+const channel = {
+ site_id: '522',
+ xmltv_id: 'WarnerTVComedyHD.de'
+}
+
+const content = `{"cl":[{"ci":522,"el":[{"ei":122309300,"bsdt":1645916700000,"bst":"00:05","bedt":1645918200000,"len":25,"et":"King of Queens","ec":"Comedyserie","cop":"USA","yop":2001,"fsk":"ab 0 Jahre","epit":"Der Experte","sn":"4","en":"11","pu":"/static/img/program_guide/1522936_s.jpg"},{"ei":122309301,"bsdt":1645918200000,"bst":"00:30","bedt":1645919700000,"len":25,"et":"King of Queens","ec":"Comedyserie","cop":"USA","yop":2001,"fsk":"ab 0 Jahre","epit":"Speedy Gonzales","sn":"4","en":"12","pu":"/static/img/program_guide/1522937_s.jpg"}]}]}`
+
+it('can generate valid url', () => {
+ expect(url).toBe('https://www.sky.de/sgtvg/service/getBroadcastsForGrid')
+})
+
+it('can generate valid request method', () => {
+ expect(request.method).toBe('POST')
+})
+
+it('can generate valid request data', () => {
+ expect(request.data({ channel, date })).toMatchObject({
+ cil: [channel.site_id],
+ d: date.valueOf()
+ })
+})
+
+it('can parse response', () => {
+ const result = parser({ content, channel }).map(p => {
+ p.start = p.start.toJSON()
+ p.stop = p.stop.toJSON()
+ return p
+ })
+
+ expect(result).toMatchObject([
+ {
+ title: 'King of Queens',
+ description: 'Der Experte',
+ category: 'Comedyserie',
+ start: '2022-02-26T23:05:00.000Z',
+ stop: '2022-02-26T23:30:00.000Z',
+ season: '4',
+ episode: '11',
+ icon: 'http://sky.de/static/img/program_guide/1522936_s.jpg'
+ },
+ {
+ title: 'King of Queens',
+ description: 'Speedy Gonzales',
+ category: 'Comedyserie',
+ start: '2022-02-26T23:30:00.000Z',
+ stop: '2022-02-26T23:55:00.000Z',
+ season: '4',
+ episode: '12',
+ icon: 'http://sky.de/static/img/program_guide/1522937_s.jpg'
+ }
+ ])
+})
+
+it('can handle empty guide', () => {
+ const result = parser({
+ content: `[]`
+ })
+ expect(result).toMatchObject([])
+})
diff --git a/sites/sky.de/sky.de_de.channels.xml b/sites/sky.de/sky.de_de.channels.xml
new file mode 100644
index 00000000..e05ffe23
--- /dev/null
+++ b/sites/sky.de/sky.de_de.channels.xml
@@ -0,0 +1,123 @@
+
+
+
+ 13th Street Deutschland
+ Beate Uhse TV
+ Boomerang Deutschland
+ Cartoon Network Deutschland
+ Classica HD
+ Crime + Investigation Deutschland
+ DAZN 1 Deutschland
+ DAZN 2 Deutschland
+ Discovery Channel Deutschland
+ E! Europe
+ Eurosport 1 Germany
+ Eurosport 2 Germany
+ Eurosport360 HD 1
+ Eurosport360 HD 2
+ Eurosport360 HD 3
+ Eurosport360 HD 4
+ Eurosport360 HD 5
+ Eurosport360 HD 6
+ Eurosport360 HD 7
+ Eurosport360 HD 8
+ Eurosport360 HD 9
+ Heimatkanal
+ History Deutschland
+ Jukebox
+ Junior
+ Kinowelt TV
+ Motorvision TV
+ National Geographic Deutschland
+ National Geographic Wild Deutschland
+ Nick Jr Deutschland
+ Nicktoons Deutschland
+ Romance TV Deutschland
+ Sky Atlantic
+ Sky Cinema Action
+ Sky Cinema Action HD
+ Sky Cinema Best Of
+ Sky Cinema Best Of HD
+ Sky Cinema Classics
+ Sky Cinema Family
+ Sky Cinema Family HD
+ Sky Cinema Fun
+ Sky Cinema Premieren
+ Sky Cinema Premieren +24
+ Sky Cinema Premieren +24 HD
+ Sky Cinema Premieren HD
+ Sky Cinema Special
+ Sky Cinema Thriller
+ Sky Comedy
+ Sky Crime
+ Sky Documentaries Deutschland
+ Sky Krimi HD
+ Sky Nature Deutschland
+ Sky One
+ Sky Replay Deutschland
+ Sky Sport 1
+ Sky Sport 10
+ Sky Sport 11
+ Sky Sport 2
+ Sky Sport 3
+ Sky Sport 4
+ Sky Sport 5
+ Sky Sport 6
+ Sky Sport 7
+ Sky Sport 8
+ Sky Sport 9
+ Sky Sport 1 HD
+ Sky Sport 10 HD
+ Sky Sport 11 HD
+ Sky Sport 2 HD
+ Sky Sport 3 HD
+ Sky Sport 4 HD
+ Sky Sport 5 HD
+ Sky Sport 6 HD
+ Sky Sport 7 HD
+ Sky Sport 8 HD
+ Sky Sport 9 HD
+ Sky Sport Austria 1
+ Sky Sport Austria 2
+ Sky Sport Austria 3
+ Sky Sport Austria 4
+ Sky Sport Austria 5
+ Sky Sport Austria 6
+ Sky Sport Austria 7
+ Sky Sport Bundesliga 1
+ Sky Sport Bundesliga 1 HD
+ Sky Sport Bundesliga 10
+ Sky Sport Bundesliga 10 HD
+ Sky Sport Bundesliga 2
+ Sky Sport Bundesliga 2 HD
+ Sky Sport Bundesliga 3
+ Sky Sport Bundesliga 3 HD
+ Sky Sport Bundesliga 4
+ Sky Sport Bundesliga 4 HD
+ Sky Sport Bundesliga 5
+ Sky Sport Bundesliga 5 HD
+ Sky Sport Bundesliga 6
+ Sky Sport Bundesliga 6 HD
+ Sky Sport Bundesliga 7
+ Sky Sport Bundesliga 7 HD
+ Sky Sport Bundesliga 8
+ Sky Sport Bundesliga 8 HD
+ Sky Sport Bundesliga 9
+ Sky Sport Bundesliga 9 HD
+ Sky Sport Bundesliga UHD
+ Sky Sport F1
+ Sky Sport News
+ Sky Sport UHD
+ Spiegel Geschichte
+ Spiegel Geschichte HD
+ Spiegel TV Wissen
+ Sportdigital Fussball
+ Syfy Deutschland
+ Universal TV Deutschland
+ Warner TV Comedy Deutschland
+ Warner TV Comedy Deutschland HD
+ Warner TV Film Deutschland
+ Warner TV Film Deutschland HD
+ Warner TV Serie Deutschland
+
+
\ No newline at end of file
diff --git a/sites/teliatv.ee/teliatv.ee_ee-en.channels.xml b/sites/teliatv.ee/teliatv.ee_ee-en.channels.xml
index b7f3e8f5..8c2fdc39 100644
--- a/sites/teliatv.ee/teliatv.ee_ee-en.channels.xml
+++ b/sites/teliatv.ee/teliatv.ee_ee-en.channels.xml
@@ -39,7 +39,7 @@
ETV 2
ETV +
Eurochannel
- EuroNews Russkiy
+ EuroNews Russkiy
Eurosport 1 Rossiya
FashionTV Russia
Fight Sports
@@ -84,7 +84,7 @@
NTV Serial
Okhota i Rybalka
Orsent TV
- Perviy Baltijskyi Kanal
+ Perviy Baltijskyi Kanal
Private TV
ProSieben Deutschland
Pyatnitsa! International
diff --git a/sites/teliatv.ee/teliatv.ee_ee-et.channels.xml b/sites/teliatv.ee/teliatv.ee_ee-et.channels.xml
index 48894a76..6380ff4d 100644
--- a/sites/teliatv.ee/teliatv.ee_ee-et.channels.xml
+++ b/sites/teliatv.ee/teliatv.ee_ee-et.channels.xml
@@ -39,7 +39,7 @@
ETV 2
ETV +
Eurochannel
- EuroNews Russkiy
+ EuroNews Russkiy
Eurosport 1 Rossiya
FashionTV Russia
Fight Sports
@@ -84,7 +84,7 @@
NTV Serial
Okhota i Rybalka
Orsent TV
- Perviy Baltijskyi Kanal
+ Perviy Baltijskyi Kanal
Private TV
ProSieben Deutschland
Pyatnitsa! International
diff --git a/sites/teliatv.ee/teliatv.ee_ee-ru.channels.xml b/sites/teliatv.ee/teliatv.ee_ee-ru.channels.xml
index ffd71775..e5c2bda3 100644
--- a/sites/teliatv.ee/teliatv.ee_ee-ru.channels.xml
+++ b/sites/teliatv.ee/teliatv.ee_ee-ru.channels.xml
@@ -39,7 +39,7 @@
ETV 2
ETV +
Eurochannel
- EuroNews Russkiy
+ EuroNews Russkiy
Eurosport 1 Rossiya
FashionTV Russia
Fight Sports
@@ -84,7 +84,7 @@
NTV Serial
Okhota i Rybalka
Orsent TV
- Perviy Baltijskyi Kanal
+ Perviy Baltijskyi Kanal
Private TV
ProSieben Deutschland
Pyatnitsa! International
diff --git a/sites/tv.blue.ch/tv.blue.ch_ch.channels.xml b/sites/tv.blue.ch/tv.blue.ch_ch.channels.xml
index 0fe97a76..6dd98b2b 100644
--- a/sites/tv.blue.ch/tv.blue.ch_ch.channels.xml
+++ b/sites/tv.blue.ch/tv.blue.ch_ch.channels.xml
@@ -57,7 +57,7 @@
E! Deutschland
ESports 1
Eurochannel
- EuroNews Deutsch
+ EuroNews Deutsch
Eurosport 1 Germany
Eurosport 2
Fix & Foxi
@@ -185,9 +185,9 @@
Volksmusik TV
Vox Deutschland
Voxup
- Warner TV Comedy
- Warner TV Film
- Warner TV Serie
+ Warner TV Comedy
+ Warner TV Film
+ Warner TV Serie
WDR Fernsehen Kรถln
Welt
Welt der Wunder TV
@@ -228,7 +228,7 @@
Edge Sport
E! Europe
English Club TV
- EuroNews English
+ EuroNews English
Eurosport 1
Extreme Sports Channel
FashionTV Europe
@@ -244,7 +244,7 @@
Great! Movies Action
Great! Movies Classic
I24 News English
- Insight HD
+ Insight HD
Insight UHD
ITV 2
ITV 3
@@ -330,8 +330,8 @@
Disney Junior France
E! France
Equidia
- ES1
- EuroNews Franรงais
+ ES1
+ EuroNews Franรงais
Eurosport 1 France
Eurosport 2 France
France 2
@@ -462,7 +462,7 @@
Discovery Science Italia
DMAX Italia
Espansione TV
- EuroNews Italiano
+ EuroNews Italiano
Eurosport 1 Italia
Eurosport 2 Italia
Focus
@@ -507,7 +507,7 @@
Rete 4
RSI La 1
RSI La 2
- RTL 102.5 RadioVisione
+ RTL 102.5 RadioVisione
San Marino RTV
Senato TV
Sky TG 24
@@ -530,7 +530,7 @@
Kurdistan TV
Rรปdaw
TRT Kurdรฎ
- BVN TV Europa
+ BVN TV Europa
TVP Polonia
Record TV Europa
RTP 3
@@ -546,17 +546,17 @@
Karusel International
Nash Kinomir
Ost West
- Perviy kanal Europa
+ Perviy kanal Europa
RTR Planeta
Telebom & Teledom
ABC News
Arta
- EuroNews Albania
+ EuroNews Albania
Fax News
First Channel
Kohavision
Ora
- RTK 1
+ RTK 1
RTSH 3
RTV 21 Sat
Syri TV
diff --git a/sites/tv.dir.bg/tv.dir.bg_bg.channels.xml b/sites/tv.dir.bg/tv.dir.bg_bg.channels.xml
index 3bb8b47c..892a36f1 100644
--- a/sites/tv.dir.bg/tv.dir.bg_bg.channels.xml
+++ b/sites/tv.dir.bg/tv.dir.bg_bg.channels.xml
@@ -83,7 +83,7 @@
Nova TV
NTV Mir
Okhota i Rybalka
- Perviy kanal
+ Perviy kanal
Planeta Folk
Planeta HD
POTV
diff --git a/sites/tv.lv/tv.lv_lv.channels.xml b/sites/tv.lv/tv.lv_lv.channels.xml
index 9125bb91..b8694944 100644
--- a/sites/tv.lv/tv.lv_lv.channels.xml
+++ b/sites/tv.lv/tv.lv_lv.channels.xml
@@ -8,7 +8,7 @@
History Europe
LTV 1
LTV 7
- Perviy kanal Europa
+ Perviy kanal Europa
REN TV Baltic
TV 1000 East
TV 1000 Russkoe Kino
diff --git a/sites/tv.nu/tv.nu.config.js b/sites/tv.nu/tv.nu.config.js
new file mode 100644
index 00000000..098d6c59
--- /dev/null
+++ b/sites/tv.nu/tv.nu.config.js
@@ -0,0 +1,45 @@
+const dayjs = require('dayjs')
+
+module.exports = {
+ site: 'tv.nu',
+ url: function ({ channel, date }) {
+ return `https://web-api.tv.nu/channels/${channel.site_id}/schedule?date=${date.format(
+ 'YYYY-MM-DD'
+ )}&fullDay=true`
+ },
+ parser: function ({ content }) {
+ let programs = []
+ const items = parseItems(content)
+ items.forEach(item => {
+ programs.push({
+ title: item.title,
+ description: item.description,
+ icon: item.imageLandscape,
+ category: item.genres,
+ start: parseStart(item),
+ stop: parseStop(item)
+ })
+ })
+
+ return programs
+ }
+}
+
+function parseStart(item) {
+ if (!item.broadcast || !item.broadcast.startTime) return null
+
+ return dayjs(item.broadcast.startTime)
+}
+
+function parseStop(item) {
+ if (!item.broadcast || !item.broadcast.endTime) return null
+
+ return dayjs(item.broadcast.endTime)
+}
+
+function parseItems(content) {
+ const data = JSON.parse(content)
+ if (!data || !data.data || !Array.isArray(data.data.broadcasts)) return []
+
+ return data.data.broadcasts
+}
diff --git a/sites/tv.nu/tv.nu.test.js b/sites/tv.nu/tv.nu.test.js
new file mode 100644
index 00000000..322ea8fd
--- /dev/null
+++ b/sites/tv.nu/tv.nu.test.js
@@ -0,0 +1,48 @@
+// npx epg-grabber --config=sites/tv.nu/tv.nu.config.js --channels=sites/tv.nu/tv.nu_se.channels.xml --output=guide.xml --days=2
+
+const { parser, url } = require('./tv.nu.config.js')
+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('2022-03-06', 'YYYY-MM-DD').startOf('d')
+const channel = {
+ site_id: '3sat',
+ xmltv_id: '3sat.de'
+}
+
+it('can generate valid url', () => {
+ expect(url({ channel, date })).toBe(
+ 'https://web-api.tv.nu/channels/3sat/schedule?date=2022-03-06&fullDay=true'
+ )
+})
+
+it('can parse response', () => {
+ const content = `{"data":{"broadcasts":[{"type":"broadcast","id":"1NqJwy-2l-8enC","slug":"vielfaltige-vogelwelt-osterreich","programId":"174565","isPlay":false,"isMovie":false,"isSeries":false,"isLive":false,"title":"Vielfรคltige Vogelwelt รsterreich","description":"In รsterreich sind mehr als 400 Vogelarten nachgewiesen und manche von ihnen fallen durch optische Eigenheiten ganz besonders auf. Diese Dokumentation befasst sich mit dem Bienenfresser, dem Fichtenkreuzschnรคbel und dem Stelzenlรคufer.","imagePortrait":"https://new.static.tv.nu/86184349","imageLandscape":"https://new.static.tv.nu/86184347","genres":["Natur","Special"],"playProviders":[],"broadcast":{"id":"1NqJwy-2l-8enC","startTime":1646542800000,"endTime":1646543700000,"channel":{"name":"3sat","slug":"3sat","themedLogo":{"light":{"url":"https://new.static.tv.nu/19402383","isFallback":false},"dark":{"url":"https://new.static.tv.nu/59995595","isFallback":true}}}}}]}}`
+ const result = parser({ content }).map(p => {
+ p.start = p.start.toJSON()
+ p.stop = p.stop.toJSON()
+ return p
+ })
+
+ expect(result).toMatchObject([
+ {
+ start: '2022-03-06T05:00:00.000Z',
+ stop: '2022-03-06T05:15:00.000Z',
+ title: 'Vielfรคltige Vogelwelt รsterreich',
+ description:
+ 'In รsterreich sind mehr als 400 Vogelarten nachgewiesen und manche von ihnen fallen durch optische Eigenheiten ganz besonders auf. Diese Dokumentation befasst sich mit dem Bienenfresser, dem Fichtenkreuzschnรคbel und dem Stelzenlรคufer.',
+ icon: 'https://new.static.tv.nu/86184347',
+ category: ['Natur', 'Special']
+ }
+ ])
+})
+
+it('can handle empty guide', () => {
+ const result = parser({
+ content: `{"meta":{"status":200},"data":{"broadcasts":[]}}`
+ })
+ expect(result).toMatchObject([])
+})
diff --git a/sites/tv.nu/tv.nu_se.channels.xml b/sites/tv.nu/tv.nu_se.channels.xml
new file mode 100644
index 00000000..cb97405a
--- /dev/null
+++ b/sites/tv.nu/tv.nu_se.channels.xml
@@ -0,0 +1,156 @@
+
+
+
+ 3sat
+ Al Jazeera English
+ Animal Planet
+ ARTE
+ ATG Live
+ BBC Brit
+ BBC Earth
+ BBC World News
+ Bloomberg TV HD
+ Boomerang
+ BraZZers TV Plus
+ Cartoon Network
+ CBS Reality
+ Club MTV
+ C More First
+ C More Fotboll
+ C More Mix
+ C More Hits
+ C More Hockey
+ C More Live
+ C More Live 2
+ C More Live 3
+ C More Live 4
+ C More Live 5
+ C More Series
+ C More Stars
+ CNBC
+ CNN
+ Das Erste
+ Discovery Channel
+ Discovery Science
+ Disney Channel
+ Disney Junior
+ DMAX
+ DR1
+ DR2
+ DR Ramasjang
+ DW
+ E!
+ eSportsone
+ Euro News
+ Eurosport 1
+ Eurosport 2
+ Expressen TV
+ Extreme Sports Channel
+ FTV
+ Fight Sports
+ France 2
+ France 24 English HD
+ FULE TV
+ GINX eSports TV
+ Godare
+ GOD TV
+ H2
+ History HD
+ History HD (Internationell)
+ Horse & Country TV
+ HRT1
+ Hustler TV
+ Investigation Discovery
+ Kanal 10
+ Kanal 11
+ Kanal 5 Danmark
+ Kanal 5
+ Kanal 9
+ Kunskapskanalen
+ Mezzo
+ Mezzo Live HD
+ Motorvision TV
+ MTV3
+ MTV Hits
+ MTV Live HD
+ MTV
+ National Geographic
+ National Geographic
+ Nautical Channel
+ Nelonen
+ NFL Network
+ NHK World Europe
+ Nickelodeon
+ Nick JR
+ Nicktoons
+ NRK1
+ NRK2
+ NRK3
+ Outdoor Channel HD
+ OUTtv
+ Paramount Network
+ Pink Plus
+ Playboy TV Europe
+ ProSieben
+ Rai 1
+ Rai 2
+ RTL
+ RTLZWEI
+ SF Kanalen
+ Sjuan
+ Sky News
+ Sportkanalen
+ Stingray Classica
+ Djazz HD
+ STRIVE Sport TV
+ Super RTL
+ SVT1
+ SVT2
+ SVT24
+ SVT Barn
+ TLC
+ Trace Urban HD
+ Travel Channel
+ TV10
+ TV12
+ TV2
+ TV3 Danmark
+ TV3 Norge
+ 3 Plus Danmark
+ TV3
+ TV4
+ TV4 Fakta
+ TV4 Film
+ TV4 Guld
+ TV5 Monde Europe
+ TV6
+ TV8
+ TV Chile Internacional
+ TVE Internacional
+ TV Polonia
+ V Film Action
+ V Film Family
+ V Film Hits
+ V Film Premiere
+ VH1
+ Viasat Explore
+ Viasat History
+ Viasat Nature
+ Viasat Sport HD
+ VOX
+ V Series
+ V Sport 1
+ V Sport Extra
+ V Sport Fotball
+ V Sport Golf
+ V Sport Hockey
+ V Sport Motor
+ V Sport Premium
+ V Sport Ultra HD
+ WILD TV HD
+ Yle TV1
+ Yle TV2
+ Yle Teema & Fem
+ ZDF
+
+
diff --git a/sites/tv.yandex.ru/tv.yandex.ru_kz.channels.xml b/sites/tv.yandex.ru/tv.yandex.ru_kz.channels.xml
index 1ee13ddc..7a10b1ca 100644
--- a/sites/tv.yandex.ru/tv.yandex.ru_kz.channels.xml
+++ b/sites/tv.yandex.ru/tv.yandex.ru_kz.channels.xml
@@ -4,7 +4,7 @@
31 Kanal
Almaty TV
Atameken Business
- Perviy kanal Evrasia
+ Perviy kanal Evrasia
RTR Planeta
Setanta Sports Ukraine
STS International
diff --git a/sites/tv.yandex.ru/tv.yandex.ru_ru.channels.xml b/sites/tv.yandex.ru/tv.yandex.ru_ru.channels.xml
index 4616f0ee..62c91fab 100644
--- a/sites/tv.yandex.ru/tv.yandex.ru_ru.channels.xml
+++ b/sites/tv.yandex.ru/tv.yandex.ru_ru.channels.xml
@@ -171,7 +171,7 @@
OTR
Paramount Channel Russia
Paramount Comedy Russia
- Perviy kanal
+ Perviy kanal
Pobeda
Poehali!
Priklyucheniya
diff --git a/sites/tv2go.t-2.net/tv2go.t-2.net_si.channels.xml b/sites/tv2go.t-2.net/tv2go.t-2.net_si.channels.xml
index 70eea474..c920fd7c 100644
--- a/sites/tv2go.t-2.net/tv2go.t-2.net_si.channels.xml
+++ b/sites/tv2go.t-2.net/tv2go.t-2.net_si.channels.xml
@@ -72,7 +72,7 @@
Erox HD
Eroxxx HD
ETV
- EuroNews English
+ EuroNews English
Eurosport 1
Eurosport 1 Germany
Eurosport 2
@@ -168,7 +168,7 @@
Oto
OTV
OTV Valentino
- Perviy kanal Europa
+ Perviy kanal Europa
PeTV
Pink Extra
Pink Film
@@ -190,11 +190,11 @@
Rai 1
Rai 2
Rai 3
- RTK 1
+ RTK 1
RTL 2 Hrvatska
RTL Deutschland
RTL Hrvatska
- RTL II
+ RTL II
RTL Kockica
RTL Living Deutschland
RT News
diff --git a/sites/tvmusor.hu/tvmusor.hu_hu.channels.xml b/sites/tvmusor.hu/tvmusor.hu_hu.channels.xml
index 5aea41b9..91f75bfb 100644
--- a/sites/tvmusor.hu/tvmusor.hu_hu.channels.xml
+++ b/sites/tvmusor.hu/tvmusor.hu_hu.channels.xml
@@ -26,7 +26,7 @@
Duck TV SD
Duna TV
Duna World
- EuroNews English
+ EuroNews English
Eurosport 1
Eurosport 2
Fem 3
@@ -34,7 +34,7 @@
Film Cafรฉ Hungary
Film Mรกnia
Film Now Hungary
- Film + Hungary
+ Film + Hungary
Food Network EMEA
Hatoscsatorna
HBO 2 Central Europe
@@ -62,10 +62,10 @@
Ozone TV
Paramount Network Hungary
Prime
- RTL Gold
- RTL II
- RTL Klub
- RTL +
+ RTL Gold
+ RTL II
+ RTL Klub
+ RTL +
Sky News International
Slรกger TV
Sony Max Hungary
@@ -75,8 +75,7 @@
Spรญler TV 1
Sport 1 Hungary
Sport 2 Hungary
- Story 4
- Story 5
+ Story 5
Super TV 2
TeenNick Hungary
The Fishing & Hunting Channel
@@ -85,6 +84,7 @@
TV 2
TV 2 Kids
TV 2 Sรฉf
+ Story 4
TV Paprika
VH1 Europe
Viasat 3
diff --git a/sites/tvplus.com.tr/tvplus.com.tr_tr.channels.xml b/sites/tvplus.com.tr/tvplus.com.tr_tr.channels.xml
index 284819ed..16651754 100644
--- a/sites/tvplus.com.tr/tvplus.com.tr_tr.channels.xml
+++ b/sites/tvplus.com.tr/tvplus.com.tr_tr.channels.xml
@@ -46,7 +46,7 @@
Ekotรผrk
English Club TV
Epic Drama
- EuroNews English
+ EuroNews English
Eurosport 1
Eurosport 2
Fashion One Europe
diff --git a/sites/tvprofil.com/tvprofil.com_al.channels.xml b/sites/tvprofil.com/tvprofil.com_al.channels.xml
index 49935069..1b3e7c6c 100644
--- a/sites/tvprofil.com/tvprofil.com_al.channels.xml
+++ b/sites/tvprofil.com/tvprofil.com_al.channels.xml
@@ -39,7 +39,7 @@
Erox HD
Eroxxx HD
Eurochannel
- EuroNews Albania
+ EuroNews Albania
Eurosport 1
Explorer Histori
Explorer Natyra
@@ -116,7 +116,7 @@
Report TV
Rete 4
RT Documentary
- RTK 1
+ RTK 1
RT News
RTS 1
RTSH 1
diff --git a/sites/tvprofil.com/tvprofil.com_ba.channels.xml b/sites/tvprofil.com/tvprofil.com_ba.channels.xml
index bec96f2f..4bca9154 100644
--- a/sites/tvprofil.com/tvprofil.com_ba.channels.xml
+++ b/sites/tvprofil.com/tvprofil.com_ba.channels.xml
@@ -132,13 +132,13 @@
RTS Trezor
RTV 1
Sport 1
- Sport Klub 1 Hrvatska
- Sport Klub 1 Srbija
- Sport Klub 2 Srbija
- Sport Klub 3
- Sport Klub Esports
- Sport Klub Golf
- Sport Klub HD
+ Sport Klub 1 Hrvatska
+ Sport Klub 1 Srbija
+ Sport Klub 2 Srbija
+ Sport Klub 3
+ Sport Klub Esports
+ Sport Klub Golf
+ Sport Klub HD
Sportska TV
Stars TV
Stingray IConcerts
diff --git a/sites/tvprofil.com/tvprofil.com_hu.channels.xml b/sites/tvprofil.com/tvprofil.com_hu.channels.xml
index 20b9eb70..cbbd057f 100644
--- a/sites/tvprofil.com/tvprofil.com_hu.channels.xml
+++ b/sites/tvprofil.com/tvprofil.com_hu.channels.xml
@@ -24,7 +24,7 @@
Film Cafรฉ Hungary
Film Mรกnia
Film Now Hungary
- Film + Hungary
+ Film + Hungary
Galaxy 4
HBO Hungary
Hรญr TV
@@ -41,9 +41,9 @@
Nick Jr Hungary
Pax TV
Prime
- RTL Gold
- RTL II
- RTL Klub
+ RTL Gold
+ RTL II
+ RTL Klub
Slรกger TV
Sony Max Hungary
Sony Movie Channel Hungary
diff --git a/sites/tvprofil.com/tvprofil.com_me.channels.xml b/sites/tvprofil.com/tvprofil.com_me.channels.xml
index badecd0e..0aaae3d1 100644
--- a/sites/tvprofil.com/tvprofil.com_me.channels.xml
+++ b/sites/tvprofil.com/tvprofil.com_me.channels.xml
@@ -14,7 +14,7 @@
Kanal 5
Nova M
RTS Poletarac
- Sport Klub 1 Crna Gora
+ Sport Klub 1 Crna Gora
TVCG 1
TVCG 2
TV Vijesti
diff --git a/sites/tvprofil.com/tvprofil.com_rs.channels.xml b/sites/tvprofil.com/tvprofil.com_rs.channels.xml
index 6b4908b0..20c75daa 100644
--- a/sites/tvprofil.com/tvprofil.com_rs.channels.xml
+++ b/sites/tvprofil.com/tvprofil.com_rs.channels.xml
@@ -1,7 +1,7 @@
- RTL +
+ RTL +
Kazbuka
Novosadska TV
Prva TV Crna Gora
diff --git a/sites/tvprofil.com/tvprofil.com_si.channels.xml b/sites/tvprofil.com/tvprofil.com_si.channels.xml
index 1558fbec..e510d35c 100644
--- a/sites/tvprofil.com/tvprofil.com_si.channels.xml
+++ b/sites/tvprofil.com/tvprofil.com_si.channels.xml
@@ -7,8 +7,8 @@
Kino
Nova 24 TV
Oto
- Sport Klub 1 Slovenija
- Sport Klub 2 Slovenija
+ Sport Klub 1 Slovenija
+ Sport Klub 2 Slovenija
Sport TV 1
Sport TV 1
Sport TV 2
diff --git a/sites/tvtv.us/tvtv.us_ca.channels.xml b/sites/tvtv.us/tvtv.us_ca.channels.xml
index 4c23f2c1..76ba7062 100644
--- a/sites/tvtv.us/tvtv.us_ca.channels.xml
+++ b/sites/tvtv.us/tvtv.us_ca.channels.xml
@@ -41,6 +41,7 @@
LCN
Leafs Nation Network
Prime Asia TV
+ Qello Concerts by Stingray
Saisons Canada
Sportsman Channel Canada
SportsNet Canucks
@@ -58,13 +59,25 @@
Stingray Broadway
Stingray Classica
Stingray Classic R&B
+ Stingray Classic Rock
Stingray Country
+ Stingray Exitos del Momento
Stingray Festival 4K
+ Stingray Flashback 70s
Stingray Franco Fรชtes
Stingray Gospel
+ Stingray Greatest Hits
+ Stingray Hip-Hop/R&B
+ Stingray Hit List
+ Stingray Hot Country
+ Stingray Karaoke
+ Stingray Naturescape
Stingray No Fences
+ Stingray Pop Adult
+ Stingray Remember the 80's
+ Stingray Rock Alternative
Stingray Romance Latino
- Stingray Soul Storm
+ Stingray Soul Storm
Telebimbi
The Rural Channel
TSN1
diff --git a/sites/tvtv.us/tvtv.us_us.channels.xml b/sites/tvtv.us/tvtv.us_us.channels.xml
index 93266212..e424214b 100644
--- a/sites/tvtv.us/tvtv.us_us.channels.xml
+++ b/sites/tvtv.us/tvtv.us_us.channels.xml
@@ -5,10 +5,13 @@
5 StarMax West
Aaj Tak
ABC East
+ ABC News Live
ACC Network
AccuWeather
ActionMax East
ActionMax West
+ [adult swim]East
+ [adult swim]West
A&E East
A&E West
Al Resalah
@@ -64,6 +67,7 @@
Bally Sports Wisconsin
BBC America East
BBC America West
+ BBC World News (North America)
BeIn Sports en Espaรฑol
BeIn Sports USA
BET East
@@ -79,6 +83,7 @@
Big Ten Network Overflow 4
Blaze
Bloomberg TV
+ Boomerang
Bounce
Bravo East
Bravo West
@@ -92,6 +97,8 @@
CBHT
CBLT
CBS East
+ CBS News Live
+ CBS Sports Network
CFTO
CGTN America
Channel i
@@ -121,10 +128,13 @@
Cozi TV
Create
CreaTV Classrooms
+ C-SPAN
+ C-SPAN2
CTI Zhong Tian Channel
CTN
Curiosity Channel
CW East
+ Dabl
Decades
Destination America
Discovery Channel East
@@ -137,9 +147,13 @@
Disney Junior West
Disney XD East
Disney XD West
+ Classic Doctor Who
DocuBox HD
Dream 2
+ Dust
DW Deutsch+
+ E!
+ Electric Now
Enlace
Epix2 East
Epix Drive-In
@@ -147,7 +161,6 @@
Epix Hits
Epix West
Esperanza TV
- ESPN
ESPN 2
ESPN 2 West
ESPN Bases Loaded
@@ -162,16 +175,18 @@
ESPN College Extra 8
ESPN Deportes
ESPNU
+ ESPN
Estrella TV
ES.TV
+ Entertainment Tonight Live
ETTV America
ETTV China
ETTV Drama
ETTV Global
ETTV News
ETTV YOYO
- Euronews English
- Euronews Franรงais
+ Euronews English
+ Euronews Franรงais
Family CHRGD
FETV
Flix East
@@ -183,10 +198,14 @@
Fox Deportes
Fox East
Fox Movies
+ FOXNET(National)
+ FOX News
+ LiveNow From FOX
Fox Soccer Plus
Fox Sports 1
Fox Sports 2
Fox Sports Racing
+ FOX Weather
France 24 English
Freeform East
Freeform West
@@ -195,14 +214,15 @@
Fuse West
Fusion
FX East
+ FX Movie Channel
FX West
FXX East
FXX West
- FX Movie Channel
FYI East
FYI West
Galavisiรณn Este
Galavisiรณn Oeste
+ Game Show Central
Game Show Network East
Game Show Network West
Gem Shopping Network
@@ -211,6 +231,8 @@
GMA News
GMA Pinoy TV
Go4IT
+ Golf Channel
+ Golfpass
Gol TV
Gospel Broadcasting Network
Grit
@@ -249,6 +271,7 @@
HTV
Hum TV
IFC East
+ IFC Film Picks
IFC West
In Demand en Espaรฑol
IndiePlex East
@@ -259,6 +282,7 @@
ION TV East
IVC
Jaya Plus
+ Jewelry TV
360 North (K05FW-D3) Girdwood, AK
Three Angels (K08MM) Bakersfield, CA
Comet TV (K11LC-D2) Prescott, AZ
@@ -326,6 +350,10 @@
ABC (KAEF) Eureka, CA
MeTV (KAEF-TV2) Eureka, CA
Movies! (KAEF-TV3) Eureka, CA
+ PBS (KAET-DT1) Arizona PX
+ PBS Arizona Life (KAET-DT2) Arizona PX
+ PBS World (KAET-DT3) Arizona PX
+ PBS Kids (KAET-DT4) Arizona PX
CBN News Channel (KAHC-LD) Sacramento, CA
Infomercials (KAHC-LD2) Sacramento, CA
Cozi TV (KAHC-LD3) Sacramento, CA
@@ -340,6 +368,13 @@
Azteca (KAKZ-LD3) Palm Springs, CA
QVC (KAKZ-DT4) Palm Springs, CA
Kanal D
+ NBC (KARE-DT1) St Paul MN
+ Court TV (KARE-DT2) St Paul MN
+ True Crime Network (KARE-DT3) St Paul MN
+ Quest (KARE-DT4) St Paul MN
+ Circle (KARE-DT5) St Paul MN
+ CW (KASW-DT1) Arizona PX
+ Grit (KASW-DT2) Arizona PX
Decades (KAXT-CD2) San Francisco, CA
MeTV (KAZA) Los Angeles, CA
Decades (KAZA2) Avalon, CA
@@ -425,6 +460,10 @@
NewsChannel 12 OEYT (KCOY) Santa Maria, CA
FOX (KCOY-DT2) Santa Maria, CA
Grit TV (KCOY-TV3) Santa Maria, CA
+ FOX (KCPQ-DT1) Seattle WA
+ Court TV (KCPQ-DT2) Seattle WA
+ Court TV Mystery (KCPQ-DT3) Seattle WA
+ Stadium (KCPQ-DT4) Seattle WA
NBC (KCRA) Sacramento, CA
MeTV (KCRA-DT2) Sacramento, CA
Jazz TV (KCSM-DT6) San Mateo, CA
@@ -438,8 +477,16 @@
Stadium (KCVU-DT4) Chico, CA
DABL (KCVU5) Chico, CA
CW (KCWQ) Palm Springs, CA
+ CW (KDAF-DT1) Dallas TX
+ Antenna TV (KDAF-DT2) Dallas TX
+ Court TV (KDAF-DT3) Dallas TX
+ Charge! (KDAF-DT4) Dallas TX
Corner Store (KDBK-LP2) Bakersfield, CA
The Walk TV (KDEO-DT6) Denver, CO
+ FOX (KDFW-DT1) Dallas TX
+ MyNetwork TV (KDFW-DT2) Dallas TX
+ Heores and Icons (KDFW-DT3) Dallas TX
+ GetTV (KDFW-DT4) Dallas TX
FOX (KDFX) Palm Springs, CA
UniMรกs (KDJT) Monterey, CA
KDOC (KDOC) Los Angeles, CA
@@ -542,6 +589,10 @@
HSN (KGMC4) Clovis, CA
Antenna (KGMC5) Clovis, CA
MeTV (KGMC-DT6) Fresno, CA
+ abc (KGO-DT1) San Francisco, CA
+ Localish (KGO-DT2) San Francisco, CA
+ This TV (KGO-DT3) San Francisco, CA
+ HSN (KGO-DT4) San Francisco, CA
CBS (KGPE) Fresno, CA
Court TV Mystery (KGPE2) Fresno, CA
ABC (KGTV) San Diego, CA
@@ -558,6 +609,8 @@
Shop LC (KHIZ-LD5) Los Angeles, CA
SSTN (KHIZ-LD6) Los Angeles, CA
CBN News (KHIZ-LD7) Los Angeles, CA
+ NBC (KHQ-DT1) Spokane WA
+ SWX Collage Sports (KHQ-DT2) Spokane WA
Real Estate (KHSC-DT2) Fresno, CA
Revenue Frontier (KHSC-DT3) Fresno, CA
SonLife Network (KHSC-DT4) Fresno, CA
@@ -573,9 +626,16 @@
NBC (KIEM) Eureka, CA
US Armenia (KIIO-LD) Los Angeles, CA
Bounce (KILM) Los Angeles, CA
+ NBC (KING-DT1) Seattle WA
+ True Crime Network (KING-DT2) Seattle WA
+ Quest (KING-DT3) Seattle WA
+ Twist (KING-DT4) Seattle WA
CBS (KION) Salinas, CA
CW (KION-TV2) Monterey, CA
ION (KION-TV3) Monterey, CA
+ CBS (KIRO-DT1) Seattle WA
+ Cozi TV (KIRO-DT2) Seattle WA
+ Laff (KIRO-DT3) Seattle WA
PBS (KIXE) Redding, CA
Create (KIXE-TV2) Redding, CA
PBS World (KIXE-DT3) Redding, CA
@@ -647,6 +707,8 @@
Azteca (KMSG-LD2) Visalia, CA
Daystar (KMSG-LD3) Fresno, CA
The Country Network (KMSG-DT5) Fresno, CA
+ FOX (KMSP-DT1) St Paul MN
+ FOX (KMSP-DT9) St Paul MN
(KMTP) San Francisco, CA
World Channel (KMTP-TV2) San Francisco, CA
WTV (KMTP-TV4) San Francisco, CA
@@ -673,6 +735,10 @@
Telemundo (KNVN-DT2) Chico, CA
AccuWeather (KNVN5) Chico, CA
KNXT (KNXT) Fresno, CA
+ abc (KNXV-DT1) Arizona PX
+ Antenna TV(KNXV-DT2) Arizona PX
+ Laff (KNXV-DT3) Arizona PX
+ QVC (KNXV-DT4) Arizona PX
PBS SoCal1 (KOCE) Huntington Beach, CA
PBS SoCal2 (KOCE-TV2) Huntington Beach, CA
Daystar (KOCE-TV3) Los Angeles, CA
@@ -680,6 +746,9 @@
PBS (KODG-LP) Palm Springs, CA
CHARGE! (KOFY-DT2) San Francisco, CA
PosiTiv (KOFY-DT3) San Francisco, CA
+ ABC (KOMO-DT1) Seattle WA
+ Comet (KOMO-DT2) Seattle WA
+ Charge (KOMO-DT3) Seattle WA
MyNetworkTV (KOTR) Monterey, CA
CBS (KOVR) Sacramento, CA
Start TV (KOVR2) Sacramento, CA
@@ -691,6 +760,10 @@
PBS Kids (KPBS-DT4) San Diego, CA
ONTV4U (KPDF-CA6) Phoenix, AZ
Smart Lifestyle TV (KPHE-DT5) Phoenix, AZ
+ CBS (KPHO-DT1) Arizona PX
+ Cozi TV (KPHO-DT2) Arizona PX
+ Dabl (KPHO-DT3) Arizona PX
+ Shop LC (KPHO-DT4) Arizona PX
CBS (KPIX) San Francisco, CA
Start TV (KPIX-TV2) San Francisco, CA
DABL (KPIX-TV3) San Francisco, CA
@@ -703,6 +776,17 @@
UNI (KPMR) Santa Barbara, CA
UniMรกs (KPMR-DT2) Santa Barbara, CA
LATV (KPMR-DT3) Santa Barbara, CA
+ NBC (KPNX-DT1) Arizona PX
+ Shop LC (KPNX-DT2) Arizona PX
+ True Crime Network (KPNX-DT3) Arizona PX
+ Quest (KPNX-DT4) Arizona PX
+ Twist (KPNX-DT5) Arizona PX
+ Ion Television (KPPX-DT1) Arizona PX
+ Bounce (KPPX-DT2) Arizona PX
+ Court TV(KPPX-DT3) Arizona PX
+ NewsY (KPPX-DT4) Arizona PX
+ Defy TV (KPPX-DT5) Arizona PX
+ TrueReal (KPPX-DT6) Arizona PX
MyNetworkTV (KPSE) Palm Springs, CA
Grit TV (KPSE-LD2) Palm Springs, CA
Bounce (KPSE-LD3) Palm Springs, CA
@@ -768,6 +852,9 @@
Shop LC (KSAO-DT5) Sacramento, CA
SonLife Network (KSAO-DT6) Sacramento, CA
The Country Network (KSAO-DT7) Sacramento, CA
+ FOX (KSAZ-DT1) Arizona PX
+ Heroes and Icons (KSAZ-DT2) Arizona PX
+ the Grio TV (KSAZ-DT3) Arizona PX
CBS (KSBB-CD) Santa Barbara, CA
Azteca (KSBO) Santa Maria, CA
QVC (KSBS-CD3) Denver, CO
@@ -810,12 +897,23 @@
Defy (KSPX-TV5) Sacramento-Modesto, CA
TrueReal (KSPX-TV6) Sacramento, CA
Telemundo (KSPX-TV9) Sacramento, CA
+ 45tv (KSTC-DT2) St Paul MN
+ MeTV (KSTC-DT3) St Paul MN
+ Antenna TV (KSTC-DT4) St Paul MN
+ abc (KSTP-DT1) St Paul MN
+ True Real (KSTP-DT5) St Paul MN
+ Heroes and Icons (KSTP-DT7) St Paul MN
Telemundo (KSTS) San Jose, CA
TeleXitos (KSTS-DT2) San Jose, CA
NBC (KSTS-DT3) San Francisco, CA
Cozi TV (KSTS4) San Jose, CA
LX Network (KSTS-DT5) San Francisco, CA
Azteca (KSTV) Sacramento, CA
+ CW (KSTW-DT1) Seattle WA
+ Start TV (KSTW-DT2) Seattle WA
+ Grit (KSTW-DT3) Seattle WA
+ Dabl (KSTW-DT4) Seattle WA
+ Circle (KSTW-DT5) Seattle WA
FOX (KSWB) San Diego, CA
Antenna (KSWB-TV2) San Diego, CA
Court TV (KSWB-TV3) San Diego, CA
@@ -829,6 +927,8 @@
Smile (KTBN-TV3) Santa Ana, CA
Enlace (KTBN-TV4) Los Angeles, CA
PosiTiV (KTBN-TV5) Los Angeles, CA
+ PBS (KTCA-DT1) St Paul MN
+ PBS Kids (KTCA-DT4) St Paul MN
UniMรกs (KTFF) Porterville, CA
UNI (KTFF-DT2) Porterville, CA
Quest (KTFF-DT3) Porterville, CA
@@ -857,6 +957,10 @@
The Grio (KTTV-DT3) Los Angeles, CA
Decades (KTTV4) Los Angeles, CA
Shop LC (KTVP-LD3) Phoenix, AZ
+ CBS (WFAA-DT1) Dallas TX
+ Start TV (WFAA-DT2) Dallas TX
+ Dabl (WFAA-DT3) Dallas TX
+ Fave TV (WFAA-DT4) Dallas TX
FOX (KTVU) San Francisco, CA
LATV (KTVU-DT2) San Francisco, CA
Movies! (KTVU-DT3) San Francisco, CA
@@ -875,6 +979,11 @@
Three Angels (KURK-LD3) San Francisco, CA
Vida Mejor TV (KURK-LD4) Santa Rosa, CA
KUSI (KUSI) San Diego, CA
+ My Nework TV (KUTP-DT1) Arizona PX
+ Movies! (KUTP-DT2) Arizona PX
+ Buzzr (KUTP-DT3) Arizona PX
+ Decades (KUTP-DT4) Arizona PX
+ Start TV (KUTP-DT5) Arizona PX
Court TV Mystery (KUVE-CD4) Tucson, AZ
Court TV Mystery (KUVE-DT4) Tucson, AZ
MyNetworkTV (KUVI) Bakersfield, CA
@@ -936,6 +1045,9 @@
Majestadtv (KWHY-DT5) Los Angeles, CA
KWHY-TV7 (KWHY-TV7) Los Angeles, CA
Infomercials (KWMO-LD2) Hot Springs, AR
+ NBC (KXAS-DT1) Dallas TX
+ Cozi TV (KXAS-DT2) Dallas TX
+ NBCLX (KXAS-DT3) Dallas TX
LATV (KXBF-LD2) Bakersfield, CA
KXLA (KXLA) Los Angeles, CA
amga TV (KXLA10) Los Angeles, CA
@@ -961,6 +1073,9 @@
Buzzr TV (KYMB-LD4) Monterey, CA
SonLife Network (KYMB-LD5) Monterey, CA
The Country Network (KYMB-LD6) Monterey, CA
+ CBS (KYW-DT1) Philadelphia, PA
+ Start TV (KYW-DT2) Philadelphia, PA
+ Dabl (KYW-DT3) Philadelphia, PA
Azteca (KZDF) Santa Barbra, CA
Jewelry Television (KZDN-DT4) Denver, CO
Heartland (KZGN) Los Angeles, CA
@@ -994,11 +1109,13 @@
Melody Hits
MeTV
Mezzo Live HD
+ MGM
MLB Network
MLB Strike Zone
MNT East
MoreMax East
MoreMax West
+ Motortrend
MovieMax East
MovieMax West
MoviePlex East
@@ -1006,17 +1123,36 @@
Movies!
MSG
MSG2
- MGM
MSNBC
MTV2 East
MTV2 West
MTV Classic East
MTV Classic West
MTV East
+ MTV Live
+ MTV U
Music Choice 90s
- Music Choice Pop Country
- NASA TV UHD
- NASA TV HD
+ Music Choice Alternative
+ Music Choice Dance/EDM
+ Music Choice Hip-Hop and R&B
+ Music Choice Hit List
+ Music Choice Kids Only!
+ Music Choice Metal
+ Music Choice Mexicana
+ Music Choice Musica Urbana
+ Music Choice Pop & Country
+ Music Choice Pop Hits
+ Music Choice Pop Latino
+ Music Choice Rap
+ Music Choice R&B Soul
+ Music Choice Rock
+ Music Choice Teen Beats
+ Music Choice Throwback Jamz
+ Music Choice Today's Country
+ Music Choice Toddler Tunes
+ Music Choice Tropicales
+ Music Choice Y2K
+ NASA TV UHD
Nat Geo Mundo
National Geographic East
National Geographic West
@@ -1033,6 +1169,8 @@
NBA League Pass 9
NBA TV
NBC East
+ NBCLX (National)
+ NBC News Now
NBC Sports
NBC Sports Bay Area
NBC Sports Boston
@@ -1046,12 +1184,15 @@
NBC Universo West
NDTV 24x7
NDTV Good Times
+ NECN
NESN
+ NESN Plus
Newsmax TV
NewsNation East
Newsy
NFL Network
NFL Red Zone
+ NHK World (US-National)
NHL Network
Nickelodeon East
Nickelodeon West
@@ -1088,10 +1229,17 @@
PixL TV
PixL TV en Espanol
Playboy TV Latin America
+ Classic Doctor Who (Pluto)
+ Game Show Central (Pluto)
+ Nick on PlutoTV
+ beIN Sports Xtra (English-USA)
+ Totally Turtles
+ World Poker Tour (Pluto)
Pop East
Pop West
Pursuit Channel
Quest
+ QVC
QVC2
QVC3
Rai News 24
@@ -1105,6 +1253,7 @@
Rotana Classic
Rotana Khalijia
RTR Planeta
+ SonLife Broadcasting Network
SBS
Schlager TV
Science
@@ -1135,7 +1284,6 @@
Sky News Arabia
Smart LifeStyle TV
Smithsonian
- SonLife Broadcasting Network
Sony Mix
Sony Movies
Sony SAB TV USA
@@ -1183,8 +1331,10 @@
TBN East
TBS East
TBS West
+ TCM
TCT
Teach
+ TeenNick
Televisiรณn Dominicana
TeleXitos
Tennis Channel
@@ -1205,9 +1355,13 @@
TNT East
TNT West
Toku
+ TPT Now (KTCA-DT5) St Paul MN
The Travel Channel
Travelxp 4K North America
True Crime Network
+ TruTV East
+ TruTV West
+ TUDN
TVB1
TVE Internacional Amรฉrica
TVG
@@ -1220,11 +1374,15 @@
TV One
TVP Polonia
TVW
+ The Walking Dead Universe
TyC Sports
Ultra Familia
UniMรกs Central
- UniMรกs Este
+ UniMรกs Este
+ Unimas West (National Feed)
Universal Kids
+ Univision East (National Feed)
+ Univision West (National Feed)
UPtv
USA Network East
USA Network West
@@ -1236,59 +1394,382 @@
ViendoMovies
Vme
Vme Kids
+ VSiN
GetTV (W34EY-D3) Huntsville, AL
Three Angels (W34EY-D6) Huntsville, AL
+ abc (WABC-DT1) New York NY
+ Localish (WABC-DT2) New York NY
+ This TV (WABC-DT3) New York NY
+ HSN (WABC-DT4) New York NY
+ FOX (WAGA-DT1) Atanta GA
+ Movies (WAGA-DT2) Atanta GA
+ Buzzr (WAGA-DT3) Atanta GA
+ the GrioTV (WAGA-DT4) Atanta GA
+ Decades (WAGA-DT5) Atanta GA
Laff (WALE-LD2) Montgomery, AL
Jewelry TV (WALE-LD4) Montgomery, AL
+ My Network TV (WATL-DT1) Atlanta GA
+ This TV (WATL-DT2) Atlanta GA
+ Antenna TV (WATL-DT3) Atlanta GA
+ abc (WATM1) Altoona PA
+ FOX (WATM2) Altoona PA
+ Cozi TV (WATM3) Altoona PA
+ This TV (WATM4) Altoona PA
+ CBS (WBBM-DT1) Chicago, IL
+ Start TV (WFMZ-DT2) Chicago, IL
+ Dabl (WFMZ-DT3) Chicago, IL
YouToo America (WBCF-LD2) Florence, AL
Decades (WBGT-CD5) Rochester, NY
Movies! (WBGT-CD7) Rochester, NY
+ NBC (WBTS-CD1) Boston MI
+ Cozi TV (WBTS-CD2) Boston MI
NewsNet (WBXZ-LP11) Buffalo, NY
THIS (WBXZ-LP12) Buffalo, NY
Jewelry TV (WBXZ-LP3) Buffalo, NY
Corner Store (WBXZ-LP7) Buffalo, NY
+ CBS (WBZ-DT1) Boston MA
+ Start TV (WBZ-DT2) Boston MA
+ Dabl (WBZ-DT3) Boston MA
+ NBC (WCAU-DT1) Philadelphia, PA
+ Cozi (WCAU-DT2) Philadelphia, PA
+ CBS (WCBS-DT1) New York NY
+ Start TV (WCBS-DT2) New York NY
+ Dabl (WCBS-DT3) New York NY
+ CBS (WCCO-DT1) St Paul MN
+ Start TV (WCCO-DT2) St Paul MN
+ Dabl (WCCO-DT3) St Paul MN
+ Fave TV (WCCO-DT4) St Paul MN
+ CW (WCIU-DT1) Chicago IL
+ The U (WCIU-DT2) Chicago IL
+ MeTV (WCIU-DT3) Chicago IL
+ Heroes and Icons (WCIU-DT4) Chicago IL
+ MeTV Plus (WCIU-DT5) Chicago IL
+ Decades (WCIU-DT6) Chicago IL
+ CBS (WCTV1) Tallahassee FL
+ MeTV (WCTV2) Tallahassee FL
+ Circle (WCTV3) Tallahassee FL
+ ION Television (WCTV4) Tallahassee FL
+ True Crime Network (WCTV5) Tallahassee FL
+ abc (WCVB-DT1) Boston MA
+ MeTV (WCVB-DT2) Boston MA
+ My Network TV (WDCA-DT1) Washington D.C.
+ Movies! (WDCA-DT2) Washington D.C.
+ Heroes and Icons (WDCA-DT3) Washington D.C.
+ CW (WDCW-DT1) Washington D.C.
+ Telemundo (WDNI-CD1) Indianapolis IN
+ MeTV (WDPN-DT1) Philadelphia PA
+ Grit (WDPN-DT2) Philadelphia PA
+ Court TV Mystery (WDPN-DT3) Philadelphia PA
+ Heroes and Icons (WDPN-DT4) Philadelphia PA
+ Retro TV (WDPN-DT5) Philadelphia PA
+ WeatherNation
Weather Now
+ NBC 2 (WESH-DT1) Orlando FL
+ MeTV (WESH-DT2) Orlando FL
+ PBS (WETA-DT1) Washington D.C.
+ WETA UK (WETA-DT2) Washington D.C.
+ PBS Kids (WETA-DT3) Washington D.C.
+ PBS World (WETA-DT4) Washington D.C.
We TV East
We TV West
+ abc (WEWS-DT1) Cleveland OH
+ Grit (WEWS-DT2) Cleveland OH
+ Laff (WEWS-DT3) Cleveland OH
+ TrueReal (WEWS-DT4) Cleveland OH
+ HSN (WEWS-DT5) Cleveland OH
+ abc (WFAA-DT1) Dallas TX
+ Accuweather (WFAA-DT2) Dallas TX
+ True Crime Network (WFAA-DT3) Dallas TX
+ Quest (WFAA-DT4) Dallas TX
+ FOX (WFLD-DT1) Chicago, IL
+ Movies! (WFLD-DT2) Chicago, IL
+ Buzzr! (WFMZ-DT3) Chicago, IL
+ The GrioTV (WFLD-DT4) Chicago, IL
+ WFMZ69 (WFMZ-DT1) Allentown PA
+ MeTV (WFMZ-DT3) Allentown PA
+ CBS (WFOR-DT1) Miami FL
+ Start TV (WFOR-DT2) Miami FL
+ Dabl (WFOR-DT3) Miami FL
+ FAVE TV (WFOR-DT4) Miami FL
+ PBS (WFSU1) Tallahassee FL
+ The Florida Channel (WFSU2)
+ Create (WFSU3) Tallahassee FL
+ PBS Kids (WFSU4) Tallahassee FL
+ ABC 9 (WFTV-DT1) Orlando FL
+ UniMas (WFUT-DT1) New York, NY
+ True Crime Network (WFUT-DT2) New York, NY
+ getTV (WFUT-DT3) New York, NY
+ Bounce TV (WFUT-DT4) New York, NY
+ FOX (WFXT-DT1) Boston MI
+ Court TV Mystery (WFXT-DT2) Boston MI
+ Laff (WFXT-DT3) Boston MI
+ PBS (WFYI-DT1) Indianapolis IN
+ PBS Kids (WFYI-DT2) Indianapolis IN
+ Create (WFYI-DT3) Indianapolis IN
Grit TV (WGCE-CD2) Rochester, NY
Buzzr TV (WGCE-CD5) Rochester, NY
+ CBS (WGCL-DT1) Atanta GA
+ Cozi TV (WGCL-DT2) Atanta GA
+ Grit (WGCL-DT3) Atanta GA
+ WGN9 (WGN-DT1) Chicago, IL
+ Antenna TV (WGN-DT2) Chicago, IL
+ Court TV (WGN-DT3) Chicago, IL
+ Rewind TV (WGN-DT4) Chicago, IL
+ TBD. (WGN-DT5) Chicago, IL
+ NBC (WGRZ1) Buffalo NY
+ Antenna TV (WGRZ2) Buffalo NY
+ True Crime Network (WGRZ3) Buffalo NY
+ Quest (WGRZ4) Buffalo NY
+ Twist (WGRZ5) Buffalo NY
+ PBS (WUPA-DT1) Atanta GA
+ Create (WUPA-DT2) Atanta GA
+ PBS World(WUPA-DT3) Atanta GA
+ PBS Kids(WUPA-DT4) Atanta GA
+ My NetworkTV (WHVL-LD1) State Collage PA
+ Buzzr (WHVL-LD2) State Collage PA
+ PBS (WHYY-DT1) Philadelphia, PA
+ PBS World (WHYY-DT2) Philadelphia, PA
+ PBS Kids (WHYY-DT2) Philadelphia, PA
Willow
Willow Cricket
+ CW (WISH-DT1) Indianapolis IN
+ GetTV (WISH-DT2) Indianapolis IN
+ Twist (WISH-DT3) Indianapolis IN
+ CBS (WIVB1) Buffalo NY
+ NBC (WJAC1) Altoona PA
+ MeTV (WJAC2) Altoona PA
+ Comet (WJAC3) Altoona PA
+ CW (WJAC4) Altoona PA
+ MeTV (WJLP-DT1) New York, NY
+ Retro TV (WJLP-DT5) New York, NY
+ Heartland Network (WJLP-DT6) New York, NY
+ FOX (WJW-DT1) Cleveland OH
+ Antenna TV (WJW-DT2) Cleveland OH
+ Comet (WJW-DT3) Cleveland OH
+ Charge (WJW-DT4) Cleveland OH
+ abc (WKBW1) Buffalo NY
+ Bounce (WKBW2) Buffalo NY
+ Court TV Mystery (WKBW3) Buffalo NY
+ Grit (WKBW4) Buffalo NY
+ HSN (WKBW5) Buffalo NY
+ CW 18(WKCF-DT1) Orlando FL
+ CBS 6 (WKMG-DT1) Orlando FL
+ Azteca (WKOB-LD1) New York, NY
+ Daystar (WKOB-LD2) New York, NY
+ SonLife (WKOB-LD5) New York, NY
+ EstrellaTV (WKOB-LD6) New York, NY
Shop LC (WKOB-DT7) New York, NY
+ NBC (WKYC-DT1) Cleveland OH
+ True Crime Network (WKYC-DT2) Cleveland OH
+ Cozi TV (WKYC-DT3) Cleveland OH
+ Quest (WKYC-DT4) Cleveland OH
+ Twist (WKYC-DT5) Cleveland OH
+ Shop LC (WKYC-DT6) Cleveland OH
+ PBS (WLIW-DT1) New York, NY
+ PBS Create (WLIW-DT2) New York, NY
+ PBS World (WLIW-DT3) New York, NY
+ All Arts (WLIW-DT4) New York, NY
+ WLNY (WLNY-DT1) New York, NY
+ Comet (WLNY-DT2) New York, NY
+ Stadium (WLNY-DT3) New York, NY
+ Start TV (WLNY-DT4) New York, NY
+ Circle (WLNY-DT5) New York, NY
+ ABC (WLS-DT1) Chicago, IL
+ Localish (WLS-DT2) Chicago, IL
+ This TV (WLS-DT3) Chicago, IL
+ CW (WLVI-DT1) Boston MA
+ Buzzr (WLVI-DT2) Boston MA
+ NBC (WMAQ-DT1) Chicago, IL
+ Cozi TV (WMAQ-DT2) Chicago, IL
+ abc (WMAR-DT1) Washington D.C.
+ Grit (WMAR-DT2) Washington D.C.
+ Bounce (WMAR-DT3) Washington D.C.
+ Court TV Mystery (WMAR-DT4) Washington D.C.
+ Court TV (WMAR-DT5) Washington D.C.
WMBQ-CD3 New York, NY
REV'N (WMJN-LD4) Huntsville, AL
+ NBC (WNBC-DT1) New York NY
+ Cozi TV (WNBC-DT2) New York NY
+ PBS (WNED1) Buffalo NY
+ Create (WNED21) Buffalo NY
+ PBS Kids (WNED3) Buffalo NY
+ PBS (WNET-DT1) New York, NY
+ PBS Kids (WNET-DT2) New York, NY
+ Telemundo (WNJU-DT1) New York, NY
+ TeleXitos (WNJU-DT2) New York, NY
+ CW (WNLO1) Buffalo NY
+ Rewind TV (WNLO2) Buffalo NY
Create (WNPI-DT2) Watertown, NY
CCTV 4 America (WNXY-LD2) New York, NY
CGTN Espaรฑol (WNXY-LD3) New York, NY
+ NYC Life (WNYE-DT1) New York, NY
+ NYC GOV (WNYE-DT2) New York, NY
+ CUNY TV (WNYE-DT3) New York, NY
WNYN-DT4 New York, NY
WNYN-DT5 New York, NY
+ FOX (WNYW-DT1) New York NY
+ Movies! (WNYW-DT2) New York NY
+ The Grio TV (WNYW-DT4) New York NY
+ Decades (WNYW-DT5) New York NY
Retro TV (WNYX-DT5) New York, NY
+ FOX 35 (WOFL-DT1) Orlando FL
+ CBS (WOIO-DT1) Cleveland OH
+ MeTV /My Network TV (WOIO-DT2) Cleveland OH
+ Dabl (WOIO-DT3) Cleveland OH
+ Rewind TV (WOIO-DT4) Cleveland OH
+ World Poker Tour
PBS Kids (WPBS-DT4) Watertown, NY
+ PBS (WPBT-DT1) Miami FL
+ Create (WPBT-DT2) Miami FL
+ Health (WPBT-DT3) Miami FL
+ PBS Kids (WPBT-DT4) Miami FL
+ PHL17 (WPHL-DT1) Philadelphia, PA
+ Antenna TV (WPHL-DT2) Philadelphia, PA
+ Court TV (WPHL-DT3) Philadelphia, PA
+ CW (WPIX-DT1) NY
+ Antenna TV (WPIX-DT2) NY
+ Court TV (WPIX-DT3) NY
+ Rewind TV (WPIX-DT4) NY
+ abc (WPLG-DT1) Miami FL
+ MeTV (WPLG-DT2) Miami FL
+ Heroes and Icons (WPLG-DT3) Miami FL
+ PBS (WPSU1) Altoona PA
+ Create (WPSU2) Altoona PA
+ PBS World (WPSU3) Altoona PA
+ PBS Kids (WPSU4) Altoona PA
+ ABC (WPVI-DT1) Philadelphia, PA
+ Localish (WPVI-DT2) Philadelphia, PA
+ This TV (KYW-DT3) Philadelphia, PA
+ My Network TV (WPWR-DT) Chicago IL
+ ION (WPXN-DT1) New York, NY
+ My65 / FOX 35 Plus (WRBW-DT1) Orlando FL
+ NBC (WRC-DT1) Washington D.C.
+ Cozi TV(WRC-DT2) Washington D.C.
+ NBCLX (WRC-DT5) Washington D.C.
+ Telemundp (WRC-DT4) Washington D.C.
+ UniMรกs 29 (WRCF-CD1) Orlando FL
Family Channel USA (WRTD-DT3) Birmingham, AL
Telemundo (WRTD-LD5) Tuscaloosa, AL
+ abc (WRTV-DT1) Indianapolis IN
+ Grit (WRTV-DT2) Indianapolis IN
+ Laff (WRTV-DT3) Indianapolis IN
+ QVC (WRTV-DT4) Indianapolis IN
+ ABC (WSB-DT1) Atanta GA
+ Bounce (WSB-DT2) Atanta GA
+ Dabl (WSB-DT3) Atanta GA
+ My Network TV (WSBK-DT1) Boston MA
+ Heroes and Icons (WSBK-DT2) Boston MA
+ Comet (WSBK-DT3) Boston MA
+ Charge! (WSBK-DT4) Boston MA
The Cowboy Channel (WSFG-DT2) Berry, AL
Smile (WSFG-DT3) Berry, AL
Hillsong (WSFG-LD4) Berry, AL
Family Channel USA (WSFG-DT5) Berry, AL
+ CW (WSFL-DT1) Miami FL
+ Court TV (WSFL-DT2) Miami FL
+ Antenna TV (WSFL-DT3) Miami FL
+ TrueReal (WSFL-DT4) Miami FL
The Cowboy Channel (WSSF-LD2) Fayette, AL
Smile (WSSF-LD3) Fayette, AL
TBN (WSSF-LD6) Fayette, AL
+ FOX (WSVN-DT1) Miami FL
+ The Grio TV (WSVN-DT2) Miami FL
+ CBS (WTAJ1) Altoona PA
+ Court TV Mystery (WTAJ2) Altoona PA
+ Laff (WTAJ3) Altoona PA
+ Grit (WTAJ4) Altoona PA
+ NBC (WTHR-DT1) Indianapolis IN
+ Dabl (WTHR-DT2) Indianapolis IN
+ MeTV (WTHR-DT3) Indianapolis IN
+ True Crime Network (WTHR-DT4) Indianapolis IN
+ Quest (WTHR-DT5) Indianapolis IN
+ Circle (WTHR-DT6) Indianapolis IN
+ The CW (WTLF1) Tallahassee FL
+ Comet (WTLF2) Tallahassee FL
+ TBD. (WTLF3) Tallahassee FL
+ Telemundo 31 (WTMO-CD1) Orlando FL
+ FOX (WTTG-DT1) Washington D.C.
+ Burzzr (WTTG-DT2) Washington D.C.
+ MeTV (WTTG-DT3) Washington D.C.
+ CBS (WTTV-DT1) Indianapolis IN
+ the Dot (WTTV-DT2) Indianapolis IN
+ Comet (WTTV-DT3) Indianapolis IN
+ PBS (WTTW-DT1) Chicago, IL
+ WTTW Prime (WTTW-DT2) Chicago, IL
+ Create and World (WTTW-DT3) Chicago, IL
+ NBC (WTVJ-DT1) Miami FL
+ Cozi TV (WTVJ-DT2) Miami FL
+ NBCLX (WTVJ-DT3) Miami FL
H&I (WTVU-CD3) Syracuse, NY
Decades (WTVU-CD5) Syracuse, NY
Movies! (WTVU-CD6) Syracuse, NY
+ NBC (WCTV1) Tallahassee FL
+ FOX (WCTV2) Tallahassee FL
+ Charge! (WCTV3) Tallahassee FL
+ FOX (WTXF-DT1) Philadelphia, PA
+ Movies!(WTXF-DT2) Philadelphia, PA
+ The Griotv (WTXF-DT3) Philadelphia, PA
+ abc (WTXL1) Tallahassee FL
+ Bounce (WTXL2) Tallahassee FL
+ Geit (WTXL3) Tallahassee FL
+ Court TV Mystery (WTXL4) Tallahassee FL
+ Court TV (WTXL5) Tallahassee FL
+ CW (WUAB-DT1) Cleveland OH
+ Bounce (WUAB-DT2) Cleveland OH
+ Circle (WUAB-DT3) Cleveland OH
SonLife Network (WUCB-DT4) Albany, NY
+ CW (WUCW-DT1) St Paul MN
+ Comet (WUCW-DT2) St Paul MN
+ Charge (WUCW-DT3) St Paul MN
+ TBD (WUCW-DT4) St Paul MN
+ Rewind TV (WUCW-DT5) St Paul MN
Court TV Mystery (WUOA-LD3) Birminghamg, AL
GetTV (WUOA-LD4) Birmingham, AL
QVC (WUOA-LD5) Birmingham, AL
Shop LC (WUOA-LD6) Birmingham, AL
QVC2 (WUOA-LD7) Birmingham, AL
+ CW (WUPA-DT1) Atanta GA
+ Start TV (WUPA-DT2) Atanta GA
+ Comet (WUPA-DT3) Atanta GA
+ MeTV (WUPA-DT4) Atanta GA
+ Start TV(WUPA-DT5) Atanta GA
+ CBS (WUSA-DT1) Washington D.C.
+ True Crime Network (WUSA-DT2) Washington D.C.
+ Twist (WUSA-DT4) Washington D.C.
+ FOX (WUTV1) Buffalo NY
+ TBD. (WUTV2) Buffalo NY
+ Charge! (WUTV3) Buffalo NY
+ Univision 43 (WVEN-DT1) Orlando FL
+ PBS (WVIZ-DT1) Cleveland OH
+ The Ohio Channel (WVIZ-DT2) Cleveland OH
+ PBS World (WVIZ-DT3) Cleveland OH
+ PBS Create (WVIZ-DT4) Cleveland OH
+ PBS Kids (WVIZ-DT5) Cleveland OH
Infomercials (WVTT-CD4) Olean, NY
Cornerstone (WVVC-LD2) Utica, NY
+ CBS (WWJ-DT1) Detroit MI
+ Start TV (WWJ-DT2) Detroit MI
+ Dabl (WWJ-DT3) Detroit MI
+ Fave TV (WWJ-DT4) Detroit MI
+ My Network TV (WWOR-DT1) NY
+ Buzzr (WWOR-DT3) NY
+ Heroes and Icons (WWOR-DT4) NY
+ NBC (WXIA-DT1) Atanta GA
+ True Crime Network (WXIA-DT3) Atanta GA
+ Quest (WXIA-DT4) Atanta GA
CCTV 4 America (WXNY-LD2) New York, NY
CGTN Espaรฑol (WXNY-LD3) New York, NY
Retro TV (WXNY-LD4) New York, NY
Retro TV (WXNY-DT5) New York, NY
+ Univision Nueva York (WXTV-DT1) NY
+ Bounce (WXTV-DT2) NY
+ Twist (WXTV-DT3) NY
+ Grit (WXTV-DT4) NY
WXXA-TV4
+ abc (WXYZ-DT1) Detroit MI
+ Bounce (WXYZ-DT2) Detroit MI
+ Laff (WXYZ-DT3) Detroit MI
+ Court TV (WXYZ-DT4) Detroit MI
Azteca (WYAM-LD2) Huntsville, AL
Retro TV (WYBN-LD2) Albany, NY
THIS (WYBN-LD3) Albany, NY
@@ -1305,389 +1786,5 @@
Zee TV USA
Zee Zest
Zing USA
- NBC (WCAU-DT1) Philadelphia, PA
- Cozi (WCAU-DT2) Philadelphia, PA
- CBS (KYW-DT1) Philadelphia, PA
- Start TV (KYW-DT2) Philadelphia, PA
- Dabl (KYW-DT3) Philadelphia, PA
- ABC (WPVI-DT1) Philadelphia, PA
- Localish (WPVI-DT2) Philadelphia, PA
- This TV (KYW-DT3) Philadelphia, PA
- FOX (WTXF-DT1) Philadelphia, PA
- Movies!(WTXF-DT2) Philadelphia, PA
- The Griotv (WTXF-DT3) Philadelphia, PA
- PBS (WHYY-DT1) Philadelphia, PA
- PBS World (WHYY-DT2) Philadelphia, PA
- PBS Kids (WHYY-DT2) Philadelphia, PA
- PHL17 (WPHL-DT1) Philadelphia, PA
- Antenna TV (WPHL-DT2) Philadelphia, PA
- Court TV (WPHL-DT3) Philadelphia, PA
- CBS (WBBM-DT1) Chicago, IL
- Start TV (WFMZ-DT2) Chicago, IL
- Dabl (WFMZ-DT3) Chicago, IL
- NBC (WMAQ-DT1) Chicago, IL
- Cozi TV (WMAQ-DT2) Chicago, IL
- FOX (WFLD-DT1) Chicago, IL
- Movies! (WFLD-DT2) Chicago, IL
- Buzzr! (WFMZ-DT3) Chicago, IL
- The GrioTV (WFLD-DT4) Chicago, IL
- ABC (WLS-DT1) Chicago, IL
- Localish (WLS-DT2) Chicago, IL
- This TV (WLS-DT3) Chicago, IL
- WGN9 (WGN-DT1) Chicago, IL
- Antenna TV (WGN-DT2) Chicago, IL
- Court TV (WGN-DT3) Chicago, IL
- Rewind TV (WGN-DT4) Chicago, IL
- TBD. (WGN-DT5) Chicago, IL
- PBS (WTTW-DT1) Chicago, IL
- WTTW Prime (WTTW-DT2) Chicago, IL
- Create and World (WTTW-DT3) Chicago, IL
- CBS (WCTV1) Tallahassee FL
- MeTV (WCTV2) Tallahassee FL
- Circle (WCTV3) Tallahassee FL
- ION Television (WCTV4) Tallahassee FL
- True Crime Network (WCTV5) Tallahassee FL
- NBC (WCTV1) Tallahassee FL
- FOX (WCTV2) Tallahassee FL
- Charge! (WCTV3) Tallahassee FL
- The CW (WTLF1) Tallahassee FL
- Comet (WTLF2) Tallahassee FL
- TBD. (WTLF3) Tallahassee FL
- PBS (WFSU1) Tallahassee FL
- The Florida Channel (WFSU2)
- Create (WFSU3) Tallahassee FL
- PBS Kids (WFSU4) Tallahassee FL
- ABC (WSB-DT1) Atanta GA
- Bounce (WSB-DT2) Atanta GA
- Dabl (WSB-DT3) Atanta GA
- CBS (WGCL-DT1) Atanta GA
- Cozi TV (WGCL-DT2) Atanta GA
- Grit (WGCL-DT3) Atanta GA
- NBC (WXIA-DT1) Atanta GA
- True Crime Network (WXIA-DT3) Atanta GA
- Quest (WXIA-DT4) Atanta GA
- FOX (WAGA-DT1) Atanta GA
- Movies (WAGA-DT2) Atanta GA
- Buzzr (WAGA-DT3) Atanta GA
- the GrioTV (WAGA-DT4) Atanta GA
- Decades (WAGA-DT5) Atanta GA
- CW (WUPA-DT1) Atanta GA
- Start TV (WUPA-DT2) Atanta GA
- Comet (WUPA-DT3) Atanta GA
- MeTV (WUPA-DT4) Atanta GA
- Start TV(WUPA-DT5) Atanta GA
- PBS (WUPA-DT1) Atanta GA
- Create (WUPA-DT2) Atanta GA
- PBS World(WUPA-DT3) Atanta GA
- PBS Kids(WUPA-DT4) Atanta GA
- ABC News Live
- CBS News Live
- NBC News Now
- FOX Weather
- Univision Nueva York (WXTV-DT1) NY
- Bounce (WXTV-DT2) NY
- Twist (WXTV-DT3) NY
- Grit (WXTV-DT4) NY
- CW (WPIX-DT1) NY
- Antenna TV (WPIX-DT2) NY
- Court TV (WPIX-DT3) NY
- Rewind TV (WPIX-DT4) NY
- WFMZ69 (WFMZ-DT1) Allentown PA
- MeTV (WFMZ-DT3) Allentown PA
- My Network TV (WWOR-DT1) NY
- Buzzr (WWOR-DT3) NY
- Heroes and Icons (WWOR-DT4) NY
- MeTV (WDPN-DT1) Philadelphia PA
- Grit (WDPN-DT2) Philadelphia PA
- Court TV Mystery (WDPN-DT3) Philadelphia PA
- Heroes and Icons (WDPN-DT4) Philadelphia PA
- Retro TV (WDPN-DT5) Philadelphia PA
- PBS (WNET-DT1) New York, NY
- PBS Kids (WNET-DT2) New York, NY
- PBS (WLIW-DT1) New York, NY
- PBS Create (WLIW-DT2) New York, NY
- PBS World (WLIW-DT3) New York, NY
- All Arts (WLIW-DT4) New York, NY
- NYC Life (WNYE-DT1) New York, NY
- NYC GOV (WNYE-DT2) New York, NY
- CUNY TV (WNYE-DT3) New York, NY
- Azteca (WKOB-LD1) New York, NY
- Daystar (WKOB-LD2) New York, NY
- SonLife (WKOB-LD5) New York, NY
- EstrellaTV (WKOB-LD6) New York, NY
- Telemundo (WNJU-DT1) New York, NY
- TeleXitos (WNJU-DT2) New York, NY
- WLNY (WLNY-DT1) New York, NY
- Comet (WLNY-DT2) New York, NY
- Stadium (WLNY-DT3) New York, NY
- Start TV (WLNY-DT4) New York, NY
- Circle (WLNY-DT5) New York, NY
- UniMas (WFUT-DT1) New York, NY
- True Crime Network (WFUT-DT2) New York, NY
- getTV (WFUT-DT3) New York, NY
- Bounce TV (WFUT-DT4) New York, NY
- CBS (WCBS-DT1) New York NY
- Start TV (WCBS-DT2) New York NY
- Dabl (WCBS-DT3) New York NY
- abc (WABC-DT1) New York NY
- Localish (WABC-DT2) New York NY
- This TV (WABC-DT3) New York NY
- HSN (WABC-DT4) New York NY
- NBC (WNBC-DT1) New York NY
- Cozi TV (WNBC-DT2) New York NY
- FOX (WNYW-DT1) New York NY
- Movies! (WNYW-DT2) New York NY
- The Grio TV (WNYW-DT4) New York NY
- Decades (WNYW-DT5) New York NY
- CBS (WWJ-DT1) Detroit MI
- Start TV (WWJ-DT2) Detroit MI
- Dabl (WWJ-DT3) Detroit MI
- Fave TV (WWJ-DT4) Detroit MI
- abc (WXYZ-DT1) Detroit MI
- Bounce (WXYZ-DT2) Detroit MI
- Laff (WXYZ-DT3) Detroit MI
- Court TV (WXYZ-DT4) Detroit MI
- NBC (WBTS-CD1) Boston MI
- Cozi TV (WBTS-CD2) Boston MI
- FOX (WFXT-DT1) Boston MI
- Court TV Mystery (WFXT-DT2) Boston MI
- Laff (WFXT-DT3) Boston MI
- NBC (KHQ-DT1) Spokane WA
- SWX Collage Sports (KHQ-DT2) Spokane WA
- NBC (KING-DT1) Seattle WA
- True Crime Network (KING-DT2) Seattle WA
- Quest (KING-DT3) Seattle WA
- Twist (KING-DT4) Seattle WA
- CBS (KIRO-DT1) Seattle WA
- Cozi TV (KIRO-DT2) Seattle WA
- Laff (KIRO-DT3) Seattle WA
- ABC (KOMO-DT1) Seattle WA
- Comet (KOMO-DT2) Seattle WA
- Charge (KOMO-DT3) Seattle WA
- FOX (KCPQ-DT1) Seattle WA
- Court TV (KCPQ-DT2) Seattle WA
- Court TV Mystery (KCPQ-DT3) Seattle WA
- Stadium (KCPQ-DT4) Seattle WA
- CW (KSTW-DT1) Seattle WA
- Start TV (KSTW-DT2) Seattle WA
- Grit (KSTW-DT3) Seattle WA
- Dabl (KSTW-DT4) Seattle WA
- Circle (KSTW-DT5) Seattle WA
- Motortrend
- BBC World News (North America)
- CBS Sports Network
- FOX News
- Golf Channel
- TeenNick
- TUDN
- C-SPAN
- C-SPAN2
- NBC (WGRZ1) Buffalo NY
- Antenna TV (WGRZ2) Buffalo NY
- True Crime Network (WGRZ3) Buffalo NY
- Quest (WGRZ4) Buffalo NY
- Twist (WGRZ5) Buffalo NY
- CBS (WIVB1) Buffalo NY
- abc (WKBW1) Buffalo NY
- Bounce (WKBW2) Buffalo NY
- Court TV Mystery (WKBW3) Buffalo NY
- Grit (WKBW4) Buffalo NY
- HSN (WKBW5) Buffalo NY
- CW (WNLO1) Buffalo NY
- Rewind TV (WNLO2) Buffalo NY
- PBS (WNED1) Buffalo NY
- Create (WNED21) Buffalo NY
- PBS Kids (WNED3) Buffalo NY
- FOX (WUTV1) Buffalo NY
- TBD. (WUTV2) Buffalo NY
- Charge! (WUTV3) Buffalo NY
- FOXNET(National)
- [adult swim]East
- [adult swim]West
- abc (WMAR-DT1) Washington D.C.
- Grit (WMAR-DT2) Washington D.C.
- Bounce (WMAR-DT3) Washington D.C.
- Court TV Mystery (WMAR-DT4) Washington D.C.
- Court TV (WMAR-DT5) Washington D.C.
- NBC (WRC-DT1) Washington D.C.
- Cozi TV(WRC-DT2) Washington D.C.
- NBCLX (WRC-DT5) Washington D.C.
- Telemundp (WRC-DT4) Washington D.C.
- FOX (WTTG-DT1) Washington D.C.
- Burzzr (WTTG-DT2) Washington D.C.
- MeTV (WTTG-DT3) Washington D.C.
- CBS (WUSA-DT1) Washington D.C.
- True Crime Network (WUSA-DT2) Washington D.C.
- Twist (WUSA-DT4) Washington D.C.
- CW (WDCW-DT1) Washington D.C.
- PBS (WETA-DT1) Washington D.C.
- WETA UK (WETA-DT2) Washington D.C.
- PBS Kids (WETA-DT3) Washington D.C.
- PBS World (WETA-DT4) Washington D.C.
- beIN Sports Xtra (English-USA)
- NHK World (US-National)
- MeTV (WJLP-DT1) New York, NY
- Retro TV (WJLP-DT5) New York, NY
- Heartland Network (WJLP-DT6) New York, NY
- ION (WPXN-DT1) New York, NY
- Dabl
- Jewelry TV
- My NetworkTV (WHVL-LD1) State Collage PA
- Buzzr (WHVL-LD2) State Collage PA
- NBC (WJAC1) Altoona PA
- MeTV (WJAC2) Altoona PA
- Comet (WJAC3) Altoona PA
- CW (WJAC4) Altoona PA
- CBS (WTAJ1) Altoona PA
- Court TV Mystery (WTAJ2) Altoona PA
- Laff (WTAJ3) Altoona PA
- Grit (WTAJ4) Altoona PA
- abc (WATM1) Altoona PA
- FOX (WATM2) Altoona PA
- Cozi TV (WATM3) Altoona PA
- This TV (WATM4) Altoona PA
- PBS (WPSU1) Altoona PA
- Create (WPSU2) Altoona PA
- PBS World (WPSU3) Altoona PA
- PBS Kids (WPSU4) Altoona PA
- NBCLX (National)
- PBS (WPBT-DT1) Miami FL
- Create (WPBT-DT2) Miami FL
- Health (WPBT-DT3) Miami FL
- PBS Kids (WPBT-DT4) Miami FL
- CBS (WFOR-DT1) Miami FL
- Start TV (WFOR-DT2) Miami FL
- Dabl (WFOR-DT3) Miami FL
- FAVE TV (WFOR-DT4) Miami FL
- FOX (WSVN-DT1) Miami FL
- The Grio TV (WSVN-DT2) Miami FL
- NBC (WTVJ-DT1) Miami FL
- Cozi TV (WTVJ-DT2) Miami FL
- NBCLX (WTVJ-DT3) Miami FL
- abc (WPLG-DT1) Miami FL
- MeTV (WPLG-DT2) Miami FL
- Heroes and Icons (WPLG-DT3) Miami FL
- CW (WSFL-DT1) Miami FL
- Court TV (WSFL-DT2) Miami FL
- Antenna TV (WSFL-DT3) Miami FL
- TrueReal (WSFL-DT4) Miami FL
- FOX (KDFW-DT1) Dallas TX
- MyNetwork TV (KDFW-DT2) Dallas TX
- Heores and Icons (KDFW-DT3) Dallas TX
- GetTV (KDFW-DT4) Dallas TX
- NBC (KXAS-DT1) Dallas TX
- Cozi TV (KXAS-DT2) Dallas TX
- NBCLX (KXAS-DT3) Dallas TX
- abc (WFAA-DT1) Dallas TX
- Accuweather (WFAA-DT2) Dallas TX
- True Crime Network (WFAA-DT3) Dallas TX
- Quest (WFAA-DT4) Dallas TX
- CBS (WFAA-DT1) Dallas TX
- Start TV (WFAA-DT2) Dallas TX
- Dabl (WFAA-DT3) Dallas TX
- Fave TV (WFAA-DT4) Dallas TX
- CW (KDAF-DT1) Dallas TX
- Antenna TV (KDAF-DT2) Dallas TX
- Court TV (KDAF-DT3) Dallas TX
- Charge! (KDAF-DT4) Dallas TX
- My Network TV (WPWR-DT) Chicago IL
- CW (WCIU-DT1) Chicago IL
- The U (WCIU-DT2) Chicago IL
- MeTV (WCIU-DT3) Chicago IL
- Heroes and Icons (WCIU-DT4) Chicago IL
- MeTV Plus (WCIU-DT5) Chicago IL
- Decades (WCIU-DT6) Chicago IL
- My Network TV (WATL-DT1) Atlanta GA
- This TV (WATL-DT2) Atlanta GA
- Antenna TV (WATL-DT3) Atlanta GA
- My Network TV (WSBK-DT1) Boston MA
- Heroes and Icons (WSBK-DT2) Boston MA
- Comet (WSBK-DT3) Boston MA
- Charge! (WSBK-DT4) Boston MA
- My Network TV (WDCA-DT1) Washington D.C.
- Movies! (WDCA-DT2) Washington D.C.
- Heroes and Icons (WDCA-DT3) Washington D.C.
- NECN
- Boomerang
- TruTV East
- TruTV West
- TCM
- E!
- QVC
- NBC (KPNX-DT1) Arizona PX
- Shop LC (KPNX-DT2) Arizona PX
- True Crime Network (KPNX-DT3) Arizona PX
- Quest (KPNX-DT4) Arizona PX
- Twist (KPNX-DT5) Arizona PX
- FOX (KSAZ-DT1) Arizona PX
- Heroes and Icons (KSAZ-DT2) Arizona PX
- the Grio TV (KSAZ-DT3) Arizona PX
- abc (KNXV-DT1) Arizona PX
- Antenna TV(KNXV-DT2) Arizona PX
- Laff (KNXV-DT3) Arizona PX
- QVC (KNXV-DT4) Arizona PX
- CBS (KPHO-DT1) Arizona PX
- Cozi TV (KPHO-DT2) Arizona PX
- Dabl (KPHO-DT3) Arizona PX
- Shop LC (KPHO-DT4) Arizona PX
- CW (KASW-DT1) Arizona PX
- Grit (KASW-DT2) Arizona PX
- PBS (KAET-DT1) Arizona PX
- PBS Arizona Life (KAET-DT2) Arizona PX
- PBS World (KAET-DT3) Arizona PX
- PBS Kids (KAET-DT4) Arizona PX
- My Nework TV (KUTP-DT1) Arizona PX
- Movies! (KUTP-DT2) Arizona PX
- Buzzr (KUTP-DT3) Arizona PX
- Decades (KUTP-DT4) Arizona PX
- Start TV (KUTP-DT5) Arizona PX
- Ion Television (KPPX-DT1) Arizona PX
- Bounce (KPPX-DT2) Arizona PX
- Court TV(KPPX-DT3) Arizona PX
- NewsY (KPPX-DT4) Arizona PX
- Defy TV (KPPX-DT5) Arizona PX
- TrueReal (KPPX-DT6) Arizona PX
- abc (WTXL1) Tallahassee FL
- Bounce (WTXL2) Tallahassee FL
- Geit (WTXL3) Tallahassee FL
- Court TV Mystery (WTXL4) Tallahassee FL
- Court TV (WTXL5) Tallahassee FL
- NBC (WKYC-DT1) Cleveland OH
- True Crime Network (WKYC-DT2) Cleveland OH
- Cozi TV (WKYC-DT3) Cleveland OH
- Quest (WKYC-DT4) Cleveland OH
- Twist (WKYC-DT5) Cleveland OH
- Shop LC (WKYC-DT6) Cleveland OH
- abc (WEWS-DT1) Cleveland OH
- Grit (WEWS-DT2) Cleveland OH
- Laff (WEWS-DT3) Cleveland OH
- TrueReal (WEWS-DT4) Cleveland OH
- HSN (WEWS-DT5) Cleveland OH
- FOX (WJW-DT1) Cleveland OH
- Antenna TV (WJW-DT2) Cleveland OH
- Comet (WJW-DT3) Cleveland OH
- Charge (WJW-DT4) Cleveland OH
- CBS (WOIO-DT1) Cleveland OH
- MeTV /My Network TV (WOIO-DT2) Cleveland OH
- Dabl (WOIO-DT3) Cleveland OH
- Rewind TV (WOIO-DT4) Cleveland OH
- CW (WUAB-DT1) Cleveland OH
- Bounce (WUAB-DT2) Cleveland OH
- Circle (WUAB-DT3) Cleveland OH
- PBS (WVIZ-DT1) Cleveland OH
- The Ohio Channel (WVIZ-DT2) Cleveland OH
- PBS World (WVIZ-DT3) Cleveland OH
- PBS Create (WVIZ-DT4) Cleveland OH
- PBS Kids (WVIZ-DT5) Cleveland OH
- VSiN
- WeatherNation
- Nick on PlutoTV
- ABC (WFTV-DT1) Orlando FL
- CBS (WKMG-DT1) Orlando FL
- FOX (WOFL-DT1) Orlando FL
- My65 (WRBW-DT1) Orlando FL
- NBC (WESH-DT1) Orlando FL
- MeTV (WESH-DT2) Orlando FL
- NESN Plus
diff --git a/sites/vidio.com/vidio.com_id.channels.xml b/sites/vidio.com/vidio.com_id.channels.xml
index 5eb49687..17c254b9 100644
--- a/sites/vidio.com/vidio.com_id.channels.xml
+++ b/sites/vidio.com/vidio.com_id.channels.xml
@@ -22,9 +22,9 @@
Da Ai TV
Da Vinci Asia
DW English
- EuroNews English
+ EuroNews English
Fashion TV Asia
- Fashion TV L'Original
+ Fashion TV L'Original
Fashion TV Midnite Secret
Hip Hip Horee!
Horee!
diff --git a/sites/vivacom.bg/vivacom.bg_bg.channels.xml b/sites/vivacom.bg/vivacom.bg_bg.channels.xml
index aa263207..dcc19aee 100644
--- a/sites/vivacom.bg/vivacom.bg_bg.channels.xml
+++ b/sites/vivacom.bg/vivacom.bg_bg.channels.xml
@@ -65,7 +65,7 @@
Erox HD
Eroxxx HD
Eurochannel
- EuroNews English
+ EuroNews English
Eurosport 1
Eurosport 2
Evrokom
diff --git a/sites/walesi.com.fj/walesi.com.fj.config.js b/sites/walesi.com.fj/walesi.com.fj.config.js
index f54c1acf..dcb00c99 100644
--- a/sites/walesi.com.fj/walesi.com.fj.config.js
+++ b/sites/walesi.com.fj/walesi.com.fj.config.js
@@ -11,6 +11,7 @@ dayjs.extend(customParseFormat)
module.exports = {
site: 'walesi.com.fj',
+ ignore: true, // the program is no longer available on the website
url: 'https://www.walesi.com.fj/wp-admin/admin-ajax.php',
request: {
method: 'POST',
diff --git a/sites/walesi.com.fj/walesi.com.fj.test.js b/sites/walesi.com.fj/walesi.com.fj.test.js
index afaaae6e..5dd8b3c4 100644
--- a/sites/walesi.com.fj/walesi.com.fj.test.js
+++ b/sites/walesi.com.fj/walesi.com.fj.test.js
@@ -1,5 +1,5 @@
-// node ./scripts/channels.js --config=./sites/walesi.com.fj/walesi.com.fj.config.js --output=./sites/walesi.com.fj/walesi.com.fj_fj.channels.xml
-// npx epg-grabber --config=sites/walesi.com.fj/walesi.com.fj.config.js --channels=sites/walesi.com.fj/walesi.com.fj_fj.channels.xml --output=.gh-pages/guides/fj/walesi.com.fj.epg.xml --days=2
+// npm run channels:parse --config=./sites/walesi.com.fj/walesi.com.fj.config.js --output=./sites/walesi.com.fj/walesi.com.fj_fj.channels.xml
+// npx epg-grabber --config=sites/walesi.com.fj/walesi.com.fj.config.js --channels=sites/walesi.com.fj/walesi.com.fj_fj.channels.xml --output=guide.xml --days=2
const { parser, url, request } = require('./walesi.com.fj.config.js')
const dayjs = require('dayjs')
diff --git a/sites/zap.co.ao/zap.co.ao_ao.channels.xml b/sites/zap.co.ao/zap.co.ao_ao.channels.xml
index c3c35951..f96982f4 100644
--- a/sites/zap.co.ao/zap.co.ao_ao.channels.xml
+++ b/sites/zap.co.ao/zap.co.ao_ao.channels.xml
@@ -32,7 +32,7 @@
Disney Junior Portugal
ESPN 2 Africa
ESPN Africa
- EuroNews Portuguรชs
+ EuroNews Portuguรชs
Extreme Sports Channel
FightBox HD
Food Network EMEA
diff --git a/tests/__data__/input/database/no-programs.db b/tests/__data__/input/database/no-programs.db
new file mode 100644
index 00000000..e69de29b
diff --git a/tests/commands/guides/update.test.js b/tests/commands/guides/update.test.js
index 98c8455a..665bbf5b 100644
--- a/tests/commands/guides/update.test.js
+++ b/tests/commands/guides/update.test.js
@@ -5,15 +5,15 @@ const path = require('path')
beforeEach(() => {
fs.emptyDirSync('tests/__data__/output')
fs.copyFileSync('tests/__data__/input/database/queue.db', 'tests/__data__/output/queue.db')
- fs.copyFileSync('tests/__data__/input/database/programs.db', 'tests/__data__/output/programs.db')
+})
+it('can generate /guides', () => {
+ fs.copyFileSync('tests/__data__/input/database/programs.db', 'tests/__data__/output/programs.db')
const stdout = execSync(
'DB_DIR=tests/__data__/output DATA_DIR=tests/__data__/input/data PUBLIC_DIR=tests/__data__/output npm run guides:update',
{ encoding: 'utf8' }
)
-})
-it('can generate /guides', () => {
expect(content('tests/__data__/output/guides/fr/chaines-tv.orange.fr.epg.xml')).toBe(
content('tests/__data__/expected/guides/fr/chaines-tv.orange.fr.epg.xml')
)
@@ -23,6 +23,39 @@ it('can generate /guides', () => {
)
})
+it('will terminate process if programs not found', () => {
+ fs.copyFileSync(
+ 'tests/__data__/input/database/no-programs.db',
+ 'tests/__data__/output/programs.db'
+ )
+ try {
+ const stdout = execSync(
+ 'DB_DIR=tests/__data__/output DATA_DIR=tests/__data__/input/data PUBLIC_DIR=tests/__data__/output npm run guides:update',
+ { encoding: 'utf8' }
+ )
+ console.log(stdout)
+ process.exit(1)
+ } catch (err) {
+ expect(err.status).toBe(1)
+ expect(err.stdout).toBe(`
+> guides:update
+> node scripts/commands/guides/update.js
+
+Generating guides/...
+Loading \"database/programs.db\"...
+Loading queue...
+Creating \"tests/__data__/output/guides/us/directv.com.epg.xml\"...
+Creating \"tests/__data__/output/guides/fr/chaines-tv.orange.fr.epg.xml\"...
+Creating \"tests/__data__/output/guides/bh/chaines-tv.orange.fr.epg.xml\"...
+Creating \"tests/__data__/output/guides/ge/magticom.ge.epg.xml\"...
+Creating \"tests/__data__/output/guides/ru/yandex.ru.epg.xml\"...
+Creating \"tests/__data__/output/guides/zw/dstv.com.epg.xml\"...
+
+Error: No programs found
+`)
+ }
+})
+
function content(filepath) {
const data = fs.readFileSync(path.resolve(filepath), {
encoding: 'utf8'