mirror of
https://github.com/iptv-org/epg.git
synced 2025-05-11 09:30:06 -04:00
Merge branch 'master' into pr/558
This commit is contained in:
commit
775efbf3a1
227 changed files with 5983 additions and 867 deletions
17
.github/workflows/9tv.co.il.yml
vendored
Normal file
17
.github/workflows/9tv.co.il.yml
vendored
Normal file
|
@ -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 }}
|
5
.github/workflows/_load.yml
vendored
5
.github/workflows/_load.yml
vendored
|
@ -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 }}
|
||||
|
|
2
.github/workflows/_update-api.yml
vendored
2
.github/workflows/_update-api.yml
vendored
|
@ -2,7 +2,7 @@ name: _update-api
|
|||
on:
|
||||
workflow_dispatch:
|
||||
schedule:
|
||||
- cron: '0 12 * * *'
|
||||
- cron: '0 6 * * *'
|
||||
jobs:
|
||||
update:
|
||||
runs-on: ubuntu-latest
|
||||
|
|
2
.github/workflows/_update-readme.yml
vendored
2
.github/workflows/_update-readme.yml
vendored
|
@ -2,7 +2,7 @@ name: _update-readme
|
|||
on:
|
||||
workflow_dispatch:
|
||||
schedule:
|
||||
- cron: '0 12 * * *'
|
||||
- cron: '0 6 * * *'
|
||||
jobs:
|
||||
update:
|
||||
runs-on: ubuntu-latest
|
||||
|
|
2
.github/workflows/allente.se.yml
vendored
2
.github/workflows/allente.se.yml
vendored
|
@ -1,7 +1,7 @@
|
|||
name: allente.se
|
||||
on:
|
||||
schedule:
|
||||
- cron: '0 0 * * *'
|
||||
- cron: '5 0 * * *'
|
||||
workflow_dispatch:
|
||||
workflow_run:
|
||||
workflows: [_trigger]
|
||||
|
|
17
.github/workflows/artonline.tv.yml
vendored
Normal file
17
.github/workflows/artonline.tv.yml
vendored
Normal file
|
@ -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 }}
|
17
.github/workflows/canalplus.com.yml
vendored
Normal file
17
.github/workflows/canalplus.com.yml
vendored
Normal file
|
@ -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 }}
|
17
.github/workflows/clickthecity.com.yml
vendored
Normal file
17
.github/workflows/clickthecity.com.yml
vendored
Normal file
|
@ -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 }}
|
2
.github/workflows/comteco.com.bo.yml
vendored
2
.github/workflows/comteco.com.bo.yml
vendored
|
@ -1,7 +1,7 @@
|
|||
name: comteco.com.bo
|
||||
on:
|
||||
schedule:
|
||||
- cron: '0 0 * * *'
|
||||
- cron: '5 0 * * *'
|
||||
workflow_dispatch:
|
||||
workflow_run:
|
||||
workflows: [_trigger]
|
||||
|
|
2
.github/workflows/dishtv.in.yml
vendored
2
.github/workflows/dishtv.in.yml
vendored
|
@ -1,7 +1,7 @@
|
|||
name: dishtv.in
|
||||
on:
|
||||
schedule:
|
||||
- cron: '0 0 * * *'
|
||||
- cron: '10 0 * * *'
|
||||
workflow_dispatch:
|
||||
workflow_run:
|
||||
workflows: [_trigger]
|
||||
|
|
2
.github/workflows/guidatv.sky.it.yml
vendored
2
.github/workflows/guidatv.sky.it.yml
vendored
|
@ -1,7 +1,7 @@
|
|||
name: guidatv.sky.it
|
||||
on:
|
||||
schedule:
|
||||
- cron: '0 0 * * *'
|
||||
- cron: '10 0 * * *'
|
||||
workflow_dispatch:
|
||||
workflow_run:
|
||||
workflows: [_trigger]
|
||||
|
|
17
.github/workflows/horizon.tv.yml
vendored
Normal file
17
.github/workflows/horizon.tv.yml
vendored
Normal file
|
@ -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 }}
|
17
.github/workflows/i24news.tv.yml
vendored
Normal file
17
.github/workflows/i24news.tv.yml
vendored
Normal file
|
@ -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 }}
|
17
.github/workflows/kan.org.il.yml
vendored
Normal file
17
.github/workflows/kan.org.il.yml
vendored
Normal file
|
@ -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 }}
|
17
.github/workflows/magentatv.at.yml
vendored
Normal file
17
.github/workflows/magentatv.at.yml
vendored
Normal file
|
@ -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 }}
|
17
.github/workflows/magentatv.de.yml
vendored
Normal file
17
.github/workflows/magentatv.de.yml
vendored
Normal file
|
@ -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 }}
|
17
.github/workflows/mako.co.il.yml
vendored
Normal file
17
.github/workflows/mako.co.il.yml
vendored
Normal file
|
@ -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 }}
|
17
.github/workflows/mediaklikk.hu.yml
vendored
Normal file
17
.github/workflows/mediaklikk.hu.yml
vendored
Normal file
|
@ -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 }}
|
17
.github/workflows/musor.tv.yml
vendored
Normal file
17
.github/workflows/musor.tv.yml
vendored
Normal file
|
@ -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 }}
|
17
.github/workflows/proximusmwc.be.yml
vendored
Normal file
17
.github/workflows/proximusmwc.be.yml
vendored
Normal file
|
@ -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 }}
|
2
.github/workflows/siba.com.co.yml
vendored
2
.github/workflows/siba.com.co.yml
vendored
|
@ -1,7 +1,7 @@
|
|||
name: siba.com.co
|
||||
on:
|
||||
schedule:
|
||||
- cron: '10 0 * * *'
|
||||
- cron: '15 0 * * *'
|
||||
workflow_dispatch:
|
||||
workflow_run:
|
||||
workflows: [_trigger]
|
||||
|
|
17
.github/workflows/sky.de.yml
vendored
Normal file
17
.github/workflows/sky.de.yml
vendored
Normal file
|
@ -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 }}
|
2
.github/workflows/teliatv.ee.yml
vendored
2
.github/workflows/teliatv.ee.yml
vendored
|
@ -1,7 +1,7 @@
|
|||
name: teliatv.ee
|
||||
on:
|
||||
schedule:
|
||||
- cron: '0 0 * * *'
|
||||
- cron: '5 0 * * *'
|
||||
workflow_dispatch:
|
||||
workflow_run:
|
||||
workflows: [_trigger]
|
||||
|
|
17
.github/workflows/tv.nu.yml
vendored
Normal file
17
.github/workflows/tv.nu.yml
vendored
Normal file
|
@ -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 }}
|
2
.github/workflows/tvarenasport.com.yml
vendored
2
.github/workflows/tvarenasport.com.yml
vendored
|
@ -1,7 +1,7 @@
|
|||
name: tvarenasport.com
|
||||
on:
|
||||
schedule:
|
||||
- cron: '0 0 * * *'
|
||||
- cron: '5 0 * * *'
|
||||
workflow_dispatch:
|
||||
workflow_run:
|
||||
workflows: [_trigger]
|
||||
|
|
2
.github/workflows/tvarenasport.hr.yml
vendored
2
.github/workflows/tvarenasport.hr.yml
vendored
|
@ -1,7 +1,7 @@
|
|||
name: tvarenasport.hr
|
||||
on:
|
||||
schedule:
|
||||
- cron: '0 0 * * *'
|
||||
- cron: '5 0 * * *'
|
||||
workflow_dispatch:
|
||||
workflow_run:
|
||||
workflows: [_trigger]
|
||||
|
|
2
.github/workflows/tvim.tv.yml
vendored
2
.github/workflows/tvim.tv.yml
vendored
|
@ -1,7 +1,7 @@
|
|||
name: tvim.tv
|
||||
on:
|
||||
schedule:
|
||||
- cron: '0 0 * * *'
|
||||
- cron: '10 0 * * *'
|
||||
workflow_dispatch:
|
||||
workflow_run:
|
||||
workflows: [_trigger]
|
||||
|
|
2
.github/workflows/tvplus.com.tr.yml
vendored
2
.github/workflows/tvplus.com.tr.yml
vendored
|
@ -1,7 +1,7 @@
|
|||
name: tvplus.com.tr
|
||||
on:
|
||||
schedule:
|
||||
- cron: '5 0 * * *'
|
||||
- cron: '10 0 * * *'
|
||||
workflow_dispatch:
|
||||
workflow_run:
|
||||
workflows: [_trigger]
|
||||
|
|
40
README.md
40
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
|
|||
<tr><td valign="top" rowspan="2">🇧🇭 Bahrain</td><td align="right">99</td><td nowrap><code>https://iptv-org.github.io/epg/guides/bh-ar/osn.com.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/osn.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/osn.com.yml/badge.svg" alt="osn.com" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td align="right">99</td><td nowrap><code>https://iptv-org.github.io/epg/guides/bh-en/osn.com.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/osn.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/osn.com.yml/badge.svg" alt="osn.com" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td valign="top">🇧🇾 Belarus</td><td align="right">20</td><td nowrap><code>https://iptv-org.github.io/epg/guides/by/tv.mail.ru.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/tv.mail.ru.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tv.mail.ru.yml/badge.svg" alt="tv.mail.ru" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td valign="top">🇧🇪 Belgium</td><td align="right">7</td><td nowrap><code>https://iptv-org.github.io/epg/guides/be/vtm.be.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/vtm.be.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/vtm.be.yml/badge.svg" alt="vtm.be" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td valign="top" rowspan="2">🇧🇪 Belgium</td><td align="right">214</td><td nowrap><code>https://iptv-org.github.io/epg/guides/be/proximusmwc.be.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/proximusmwc.be.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/proximusmwc.be.yml/badge.svg" alt="proximusmwc.be" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td align="right">7</td><td nowrap><code>https://iptv-org.github.io/epg/guides/be/vtm.be.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/vtm.be.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/vtm.be.yml/badge.svg" alt="vtm.be" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td valign="top" rowspan="2">🇧🇯 Benin</td><td align="right">242</td><td nowrap><code>https://iptv-org.github.io/epg/guides/bj/canalplus-afrique.com.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/canalplus-afrique.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/canalplus-afrique.com.yml/badge.svg" alt="canalplus-afrique.com" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td align="right">130</td><td nowrap><code>https://iptv-org.github.io/epg/guides/bj/dstv.com.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/dstv.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/dstv.com.yml/badge.svg" alt="dstv.com" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td valign="top" rowspan="2">🇧🇴 Bolivia</td><td align="right">79</td><td nowrap><code>https://iptv-org.github.io/epg/guides/bo/comteco.com.bo.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/comteco.com.bo.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/comteco.com.bo.yml/badge.svg" alt="comteco.com.bo" style="max-width: 100%;"></a></td></tr>
|
||||
|
@ -38,7 +39,7 @@ To load a program guide, all you need to do is copy the link to one or more of t
|
|||
<tr><td valign="top" rowspan="2">🇧🇦 Bosnia and Herzegovina</td><td align="right">178</td><td nowrap><code>https://iptv-org.github.io/epg/guides/ba/mtel.ba.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/mtel.ba.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/mtel.ba.yml/badge.svg" alt="mtel.ba" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td align="right">4</td><td nowrap><code>https://iptv-org.github.io/epg/guides/ba/tvarenasport.com.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/tvarenasport.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tvarenasport.com.yml/badge.svg" alt="tvarenasport.com" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td valign="top">🇧🇼 Botswana</td><td align="right">130</td><td nowrap><code>https://iptv-org.github.io/epg/guides/bw/dstv.com.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/dstv.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/dstv.com.yml/badge.svg" alt="dstv.com" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td valign="top">🇧🇷 Brazil</td><td align="right">251</td><td nowrap><code>https://iptv-org.github.io/epg/guides/br/mi.tv.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/mi.tv.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/mi.tv.yml/badge.svg" alt="mi.tv" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td valign="top">🇧🇷 Brazil</td><td align="right">253</td><td nowrap><code>https://iptv-org.github.io/epg/guides/br/mi.tv.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/mi.tv.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/mi.tv.yml/badge.svg" alt="mi.tv" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td valign="top">🇧🇬 Bulgaria</td><td align="right">103</td><td nowrap><code>https://iptv-org.github.io/epg/guides/bg/tv.dir.bg.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/tv.dir.bg.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tv.dir.bg.yml/badge.svg" alt="tv.dir.bg" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td valign="top" rowspan="2">🇧🇫 Burkina Faso</td><td align="right">242</td><td nowrap><code>https://iptv-org.github.io/epg/guides/bf/canalplus-afrique.com.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/canalplus-afrique.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/canalplus-afrique.com.yml/badge.svg" alt="canalplus-afrique.com" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td align="right">128</td><td nowrap><code>https://iptv-org.github.io/epg/guides/bf/dstv.com.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/dstv.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/dstv.com.yml/badge.svg" alt="dstv.com" style="max-width: 100%;"></a></td></tr>
|
||||
|
@ -46,7 +47,7 @@ To load a program guide, all you need to do is copy the link to one or more of t
|
|||
<tr><td align="right">128</td><td nowrap><code>https://iptv-org.github.io/epg/guides/bi/dstv.com.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/dstv.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/dstv.com.yml/badge.svg" alt="dstv.com" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td valign="top" rowspan="2">🇨🇲 Cameroon</td><td align="right">242</td><td nowrap><code>https://iptv-org.github.io/epg/guides/cm/canalplus-afrique.com.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/canalplus-afrique.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/canalplus-afrique.com.yml/badge.svg" alt="canalplus-afrique.com" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td align="right">128</td><td nowrap><code>https://iptv-org.github.io/epg/guides/cm/dstv.com.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/dstv.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/dstv.com.yml/badge.svg" alt="dstv.com" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td valign="top">🇨🇦 Canada</td><td align="right">76</td><td nowrap><code>https://iptv-org.github.io/epg/guides/ca/tvtv.us.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/tvtv.us.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tvtv.us.yml/badge.svg" alt="tvtv.us" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td valign="top">🇨🇦 Canada</td><td align="right">89</td><td nowrap><code>https://iptv-org.github.io/epg/guides/ca/tvtv.us.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/tvtv.us.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tvtv.us.yml/badge.svg" alt="tvtv.us" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td valign="top" rowspan="2">🇨🇻 Cape Verde</td><td align="right">242</td><td nowrap><code>https://iptv-org.github.io/epg/guides/cv/canalplus-afrique.com.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/canalplus-afrique.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/canalplus-afrique.com.yml/badge.svg" alt="canalplus-afrique.com" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td align="right">125</td><td nowrap><code>https://iptv-org.github.io/epg/guides/cv/dstv.com.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/dstv.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/dstv.com.yml/badge.svg" alt="dstv.com" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td valign="top" rowspan="2">🇨🇫 Central African Republic</td><td align="right">242</td><td nowrap><code>https://iptv-org.github.io/epg/guides/cf/canalplus-afrique.com.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/canalplus-afrique.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/canalplus-afrique.com.yml/badge.svg" alt="canalplus-afrique.com" style="max-width: 100%;"></a></td></tr>
|
||||
|
@ -67,7 +68,7 @@ To load a program guide, all you need to do is copy the link to one or more of t
|
|||
<tr><td align="right">10</td><td nowrap><code>https://iptv-org.github.io/epg/guides/hr/tvarenasport.hr.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/tvarenasport.hr.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tvarenasport.hr.yml/badge.svg" alt="tvarenasport.hr" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td valign="top">🇨🇺 Cuba</td><td align="right">10</td><td nowrap><code>https://iptv-org.github.io/epg/guides/cu/tvcubana.icrt.cu.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/tvcubana.icrt.cu.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tvcubana.icrt.cu.yml/badge.svg" alt="tvcubana.icrt.cu" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td valign="top">🇨🇾 Cyprus</td><td align="right">30</td><td nowrap><code>https://iptv-org.github.io/epg/guides/cy/novacyprus.com.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/novacyprus.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/novacyprus.com.yml/badge.svg" alt="novacyprus.com" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td valign="top">🇨🇿 Czech Republic</td><td align="right">519</td><td nowrap><code>https://iptv-org.github.io/epg/guides/cz/m.tv.sms.cz.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/m.tv.sms.cz.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/m.tv.sms.cz.yml/badge.svg" alt="m.tv.sms.cz" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td valign="top">🇨🇿 Czech Republic</td><td align="right">523</td><td nowrap><code>https://iptv-org.github.io/epg/guides/cz/m.tv.sms.cz.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/m.tv.sms.cz.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/m.tv.sms.cz.yml/badge.svg" alt="m.tv.sms.cz" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td valign="top" rowspan="2">🇨🇩 Democratic Republic of the Congo</td><td align="right">242</td><td nowrap><code>https://iptv-org.github.io/epg/guides/cd/canalplus-afrique.com.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/canalplus-afrique.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/canalplus-afrique.com.yml/badge.svg" alt="canalplus-afrique.com" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td align="right">126</td><td nowrap><code>https://iptv-org.github.io/epg/guides/cd/dstv.com.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/dstv.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/dstv.com.yml/badge.svg" alt="dstv.com" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td valign="top">🇩🇰 Denmark</td><td align="right">61</td><td nowrap><code>https://iptv-org.github.io/epg/guides/dk/allente.se.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/allente.se.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/allente.se.yml/badge.svg" alt="allente.se" style="max-width: 100%;"></a></td></tr>
|
||||
|
@ -89,11 +90,11 @@ To load a program guide, all you need to do is copy the link to one or more of t
|
|||
<tr><td align="right">132</td><td nowrap><code>https://iptv-org.github.io/epg/guides/ee-ru/teliatv.ee.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/teliatv.ee.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/teliatv.ee.yml/badge.svg" alt="teliatv.ee" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td valign="top">🇪🇹 Ethiopia</td><td align="right">148</td><td nowrap><code>https://iptv-org.github.io/epg/guides/et/dstv.com.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/dstv.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/dstv.com.yml/badge.svg" alt="dstv.com" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td valign="top">🇫🇴 Faroe Islands</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/epg/guides/fo/kvf.fo.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/kvf.fo.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/kvf.fo.yml/badge.svg" alt="kvf.fo" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td valign="top">🇫🇯 Fiji</td><td align="right">9</td><td nowrap><code>https://iptv-org.github.io/epg/guides/fj/walesi.com.fj.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/walesi.com.fj.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/walesi.com.fj.yml/badge.svg" alt="walesi.com.fj" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td valign="top" rowspan="2">🇫🇮 Finland</td><td align="right">36</td><td nowrap><code>https://iptv-org.github.io/epg/guides/fi/allente.se.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/allente.se.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/allente.se.yml/badge.svg" alt="allente.se" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td align="right">36</td><td nowrap><code>https://iptv-org.github.io/epg/guides/fi/telkussa.fi.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/telkussa.fi.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/telkussa.fi.yml/badge.svg" alt="telkussa.fi" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td valign="top" rowspan="2">🇫🇷 France</td><td align="right">204</td><td nowrap><code>https://iptv-org.github.io/epg/guides/fr/programme-tv.net.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/programme-tv.net.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/programme-tv.net.yml/badge.svg" alt="programme-tv.net" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td align="right">190</td><td nowrap><code>https://iptv-org.github.io/epg/guides/fr/chaines-tv.orange.fr.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/chaines-tv.orange.fr.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/chaines-tv.orange.fr.yml/badge.svg" alt="chaines-tv.orange.fr" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td valign="top" rowspan="3">🇫🇷 France</td><td align="right">217</td><td nowrap><code>https://iptv-org.github.io/epg/guides/fr/canalplus.com.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/canalplus.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/canalplus.com.yml/badge.svg" alt="canalplus.com" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td align="right">211</td><td nowrap><code>https://iptv-org.github.io/epg/guides/fr/programme-tv.net.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/programme-tv.net.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/programme-tv.net.yml/badge.svg" alt="programme-tv.net" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td align="right">194</td><td nowrap><code>https://iptv-org.github.io/epg/guides/fr/chaines-tv.orange.fr.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/chaines-tv.orange.fr.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/chaines-tv.orange.fr.yml/badge.svg" alt="chaines-tv.orange.fr" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td valign="top">🇬🇫 French Guiana</td><td align="right">128</td><td nowrap><code>https://iptv-org.github.io/epg/guides/gf/canalplus-caraibes.com.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/canalplus-caraibes.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/canalplus-caraibes.com.yml/badge.svg" alt="canalplus-caraibes.com" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td valign="top">🇵🇫 French Polynesia</td><td align="right">2</td><td nowrap><code>https://iptv-org.github.io/epg/guides/pf/programme-tv.vini.pf.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/programme-tv.vini.pf.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/programme-tv.vini.pf.yml/badge.svg" alt="programme-tv.vini.pf" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td valign="top" rowspan="2">🇬🇦 Gabon</td><td align="right">242</td><td nowrap><code>https://iptv-org.github.io/epg/guides/ga/canalplus-afrique.com.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/canalplus-afrique.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/canalplus-afrique.com.yml/badge.svg" alt="canalplus-afrique.com" style="max-width: 100%;"></a></td></tr>
|
||||
|
@ -101,7 +102,8 @@ To load a program guide, all you need to do is copy the link to one or more of t
|
|||
<tr><td valign="top" rowspan="2">🇬🇲 Gambia</td><td align="right">242</td><td nowrap><code>https://iptv-org.github.io/epg/guides/gm/canalplus-afrique.com.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/canalplus-afrique.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/canalplus-afrique.com.yml/badge.svg" alt="canalplus-afrique.com" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td align="right">124</td><td nowrap><code>https://iptv-org.github.io/epg/guides/gm/dstv.com.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/dstv.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/dstv.com.yml/badge.svg" alt="dstv.com" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td valign="top">🇬🇪 Georgia</td><td align="right">116</td><td nowrap><code>https://iptv-org.github.io/epg/guides/ge/magticom.ge.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/magticom.ge.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/magticom.ge.yml/badge.svg" alt="magticom.ge" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td valign="top">🇩🇪 Germany</td><td align="right">122</td><td nowrap><code>https://iptv-org.github.io/epg/guides/de/hd-plus.de.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/hd-plus.de.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/hd-plus.de.yml/badge.svg" alt="hd-plus.de" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td valign="top" rowspan="2">🇩🇪 Germany</td><td align="right">245</td><td nowrap><code>https://iptv-org.github.io/epg/guides/de/horizon.tv.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/horizon.tv.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/horizon.tv.yml/badge.svg" alt="horizon.tv" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td align="right">122</td><td nowrap><code>https://iptv-org.github.io/epg/guides/de/hd-plus.de.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/hd-plus.de.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/hd-plus.de.yml/badge.svg" alt="hd-plus.de" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td valign="top" rowspan="2">🇬🇭 Ghana</td><td align="right">242</td><td nowrap><code>https://iptv-org.github.io/epg/guides/gh/canalplus-afrique.com.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/canalplus-afrique.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/canalplus-afrique.com.yml/badge.svg" alt="canalplus-afrique.com" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td align="right">139</td><td nowrap><code>https://iptv-org.github.io/epg/guides/gh/dstv.com.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/dstv.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/dstv.com.yml/badge.svg" alt="dstv.com" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td valign="top">🇬🇷 Greece</td><td align="right">86</td><td nowrap><code>https://iptv-org.github.io/epg/guides/gr/cosmote.gr.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/cosmote.gr.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/cosmote.gr.yml/badge.svg" alt="cosmote.gr" style="max-width: 100%;"></a></td></tr>
|
||||
|
@ -119,15 +121,22 @@ To load a program guide, all you need to do is copy the link to one or more of t
|
|||
<tr><td align="right">22</td><td nowrap><code>https://iptv-org.github.io/epg/guides/hn/mi.tv.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/mi.tv.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/mi.tv.yml/badge.svg" alt="mi.tv" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td valign="top" rowspan="2">🇭🇰 Hong Kong</td><td align="right">132</td><td nowrap><code>https://iptv-org.github.io/epg/guides/hk-en/nowplayer.now.com.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/nowplayer.now.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/nowplayer.now.com.yml/badge.svg" alt="nowplayer.now.com" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td align="right">132</td><td nowrap><code>https://iptv-org.github.io/epg/guides/hk-zh/nowplayer.now.com.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/nowplayer.now.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/nowplayer.now.com.yml/badge.svg" alt="nowplayer.now.com" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td valign="top">🇭🇺 Hungary</td><td align="right">91</td><td nowrap><code>https://iptv-org.github.io/epg/guides/hu/tvmusor.hu.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/tvmusor.hu.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tvmusor.hu.yml/badge.svg" alt="tvmusor.hu" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td valign="top" rowspan="3">🇭🇺 Hungary</td><td align="right">170</td><td nowrap><code>https://iptv-org.github.io/epg/guides/hu/musor.tv.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/musor.tv.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/musor.tv.yml/badge.svg" alt="musor.tv" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td align="right">91</td><td nowrap><code>https://iptv-org.github.io/epg/guides/hu/tvmusor.hu.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/tvmusor.hu.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tvmusor.hu.yml/badge.svg" alt="tvmusor.hu" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td align="right">8</td><td nowrap><code>https://iptv-org.github.io/epg/guides/hu/mediaklikk.hu.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/mediaklikk.hu.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/mediaklikk.hu.yml/badge.svg" alt="mediaklikk.hu" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td valign="top">🇮🇸 Iceland</td><td align="right">2</td><td nowrap><code>https://iptv-org.github.io/epg/guides/is/ruv.is.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/ruv.is.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/ruv.is.yml/badge.svg" alt="ruv.is" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td valign="top">🇮🇳 India</td><td align="right">364</td><td nowrap><code>https://iptv-org.github.io/epg/guides/in/dishtv.in.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/dishtv.in.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/dishtv.in.yml/badge.svg" alt="dishtv.in" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td valign="top" rowspan="2">🇮🇩 Indonesia</td><td align="right">98</td><td nowrap><code>https://iptv-org.github.io/epg/guides/id/mncvision.id.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/mncvision.id.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/mncvision.id.yml/badge.svg" alt="mncvision.id" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td valign="top" rowspan="3">🇮🇩 Indonesia</td><td align="right">98</td><td nowrap><code>https://iptv-org.github.io/epg/guides/id-en/mncvision.id.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/mncvision.id.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/mncvision.id.yml/badge.svg" alt="mncvision.id" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td align="right">98</td><td nowrap><code>https://iptv-org.github.io/epg/guides/id-id/mncvision.id.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/mncvision.id.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/mncvision.id.yml/badge.svg" alt="mncvision.id" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td align="right">53</td><td nowrap><code>https://iptv-org.github.io/epg/guides/id/vidio.com.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/vidio.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/vidio.com.yml/badge.svg" alt="vidio.com" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td valign="top">🇮🇷 Iran</td><td align="right">29</td><td nowrap><code>https://iptv-org.github.io/epg/guides/ir/tva.tv.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/tva.tv.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tva.tv.yml/badge.svg" alt="tva.tv" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td valign="top" rowspan="2">🇮🇶 Iraq</td><td align="right">99</td><td nowrap><code>https://iptv-org.github.io/epg/guides/iq-ar/osn.com.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/osn.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/osn.com.yml/badge.svg" alt="osn.com" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td align="right">99</td><td nowrap><code>https://iptv-org.github.io/epg/guides/iq-en/osn.com.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/osn.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/osn.com.yml/badge.svg" alt="osn.com" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td valign="top">🇮🇪 Ireland</td><td align="right">3</td><td nowrap><code>https://iptv-org.github.io/epg/guides/ie/ontvtonight.com.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/ontvtonight.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/ontvtonight.com.yml/badge.svg" alt="ontvtonight.com" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td valign="top" rowspan="4">🇮🇱 Israel</td><td align="right">3</td><td nowrap><code>https://iptv-org.github.io/epg/guides/il/i24news.tv.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/i24news.tv.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/i24news.tv.yml/badge.svg" alt="i24news.tv" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td align="right">3</td><td nowrap><code>https://iptv-org.github.io/epg/guides/il/kan.org.il.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/kan.org.il.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/kan.org.il.yml/badge.svg" alt="kan.org.il" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/epg/guides/il/9tv.co.il.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/9tv.co.il.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/9tv.co.il.yml/badge.svg" alt="9tv.co.il" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/epg/guides/il/mako.co.il.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/mako.co.il.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/mako.co.il.yml/badge.svg" alt="mako.co.il" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td valign="top" rowspan="2">🇮🇹 Italy</td><td align="right">142</td><td nowrap><code>https://iptv-org.github.io/epg/guides/it/guidatv.sky.it.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/guidatv.sky.it.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/guidatv.sky.it.yml/badge.svg" alt="guidatv.sky.it" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td align="right">15</td><td nowrap><code>https://iptv-org.github.io/epg/guides/it/mediaset.it.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/mediaset.it.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/mediaset.it.yml/badge.svg" alt="mediaset.it" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td valign="top" rowspan="2">🇨🇮 Ivory Coast</td><td align="right">242</td><td nowrap><code>https://iptv-org.github.io/epg/guides/ci/canalplus-afrique.com.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/canalplus-afrique.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/canalplus-afrique.com.yml/badge.svg" alt="canalplus-afrique.com" style="max-width: 100%;"></a></td></tr>
|
||||
|
@ -183,6 +192,7 @@ To load a program guide, all you need to do is copy the link to one or more of t
|
|||
<tr><td valign="top">🇵🇾 Paraguay</td><td align="right">39</td><td nowrap><code>https://iptv-org.github.io/epg/guides/py/gatotv.com.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/gatotv.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/gatotv.com.yml/badge.svg" alt="gatotv.com" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td valign="top" rowspan="2">🇵🇪 Peru</td><td align="right">48</td><td nowrap><code>https://iptv-org.github.io/epg/guides/pe/gatotv.com.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/gatotv.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/gatotv.com.yml/badge.svg" alt="gatotv.com" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td align="right">21</td><td nowrap><code>https://iptv-org.github.io/epg/guides/pe/mi.tv.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/mi.tv.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/mi.tv.yml/badge.svg" alt="mi.tv" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td valign="top">🇵🇭 Philippines</td><td align="right">34</td><td nowrap><code>https://iptv-org.github.io/epg/guides/ph/clickthecity.com.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/clickthecity.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/clickthecity.com.yml/badge.svg" alt="clickthecity.com" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td valign="top">🇵🇱 Poland</td><td align="right">340</td><td nowrap><code>https://iptv-org.github.io/epg/guides/pl/programtv.onet.pl.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/programtv.onet.pl.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/programtv.onet.pl.yml/badge.svg" alt="programtv.onet.pl" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td valign="top">🇵🇹 Portugal</td><td align="right">203</td><td nowrap><code>https://iptv-org.github.io/epg/guides/pt/meo.pt.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/meo.pt.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/meo.pt.yml/badge.svg" alt="meo.pt" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td valign="top" rowspan="3">🇶🇦 Qatar</td><td align="right">99</td><td nowrap><code>https://iptv-org.github.io/epg/guides/qa-ar/osn.com.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/osn.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/osn.com.yml/badge.svg" alt="osn.com" style="max-width: 100%;"></a></td></tr>
|
||||
|
@ -197,8 +207,9 @@ To load a program guide, all you need to do is copy the link to one or more of t
|
|||
<tr><td valign="top">🇷🇪 Réunion</td><td align="right">119</td><td nowrap><code>https://iptv-org.github.io/epg/guides/re/canalplus-reunion.com.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/canalplus-reunion.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/canalplus-reunion.com.yml/badge.svg" alt="canalplus-reunion.com" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td valign="top">🇧🇱 Saint Barthélemy</td><td align="right">128</td><td nowrap><code>https://iptv-org.github.io/epg/guides/bl/canalplus-caraibes.com.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/canalplus-caraibes.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/canalplus-caraibes.com.yml/badge.svg" alt="canalplus-caraibes.com" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td valign="top">🇲🇫 Saint Martin</td><td align="right">128</td><td nowrap><code>https://iptv-org.github.io/epg/guides/mf/canalplus-caraibes.com.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/canalplus-caraibes.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/canalplus-caraibes.com.yml/badge.svg" alt="canalplus-caraibes.com" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td valign="top" rowspan="2">🇸🇦 Saudi Arabia</td><td align="right">98</td><td nowrap><code>https://iptv-org.github.io/epg/guides/sa-ar/osn.com.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/osn.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/osn.com.yml/badge.svg" alt="osn.com" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td valign="top" rowspan="3">🇸🇦 Saudi Arabia</td><td align="right">98</td><td nowrap><code>https://iptv-org.github.io/epg/guides/sa-ar/osn.com.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/osn.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/osn.com.yml/badge.svg" alt="osn.com" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td align="right">98</td><td nowrap><code>https://iptv-org.github.io/epg/guides/sa-en/osn.com.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/osn.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/osn.com.yml/badge.svg" alt="osn.com" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td align="right">5</td><td nowrap><code>https://iptv-org.github.io/epg/guides/sa/artonline.tv.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/artonline.tv.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/artonline.tv.yml/badge.svg" alt="artonline.tv" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td valign="top" rowspan="2">🇸🇳 Senegal</td><td align="right">242</td><td nowrap><code>https://iptv-org.github.io/epg/guides/sn/canalplus-afrique.com.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/canalplus-afrique.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/canalplus-afrique.com.yml/badge.svg" alt="canalplus-afrique.com" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td align="right">125</td><td nowrap><code>https://iptv-org.github.io/epg/guides/sn/dstv.com.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/dstv.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/dstv.com.yml/badge.svg" alt="dstv.com" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td valign="top" rowspan="2">🇷🇸 Serbia</td><td align="right">357</td><td nowrap><code>https://iptv-org.github.io/epg/guides/rs/mts.rs.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/mts.rs.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/mts.rs.yml/badge.svg" alt="mts.rs" style="max-width: 100%;"></a></td></tr>
|
||||
|
@ -214,7 +225,8 @@ To load a program guide, all you need to do is copy the link to one or more of t
|
|||
<tr><td align="right">58</td><td nowrap><code>https://iptv-org.github.io/epg/guides/es/gatotv.com.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/gatotv.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/gatotv.com.yml/badge.svg" alt="gatotv.com" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td valign="top">🇸🇩 Sudan</td><td align="right">118</td><td nowrap><code>https://iptv-org.github.io/epg/guides/sd/dstv.com.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/dstv.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/dstv.com.yml/badge.svg" alt="dstv.com" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td valign="top">🇸🇿 Swaziland</td><td align="right">127</td><td nowrap><code>https://iptv-org.github.io/epg/guides/sz/dstv.com.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/dstv.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/dstv.com.yml/badge.svg" alt="dstv.com" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td valign="top">🇸🇪 Sweden</td><td align="right">94</td><td nowrap><code>https://iptv-org.github.io/epg/guides/se/allente.se.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/allente.se.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/allente.se.yml/badge.svg" alt="allente.se" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td valign="top" rowspan="2">🇸🇪 Sweden</td><td align="right">151</td><td nowrap><code>https://iptv-org.github.io/epg/guides/se/tv.nu.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/tv.nu.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tv.nu.yml/badge.svg" alt="tv.nu" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td align="right">94</td><td nowrap><code>https://iptv-org.github.io/epg/guides/se/allente.se.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/allente.se.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/allente.se.yml/badge.svg" alt="allente.se" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td valign="top">🇨🇭 Switzerland</td><td align="right">598</td><td nowrap><code>https://iptv-org.github.io/epg/guides/ch/tv.blue.ch.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/tv.blue.ch.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tv.blue.ch.yml/badge.svg" alt="tv.blue.ch" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td valign="top">🇸🇹 São Tomé and Príncipe</td><td align="right">128</td><td nowrap><code>https://iptv-org.github.io/epg/guides/st/dstv.com.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/dstv.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/dstv.com.yml/badge.svg" alt="dstv.com" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td valign="top">🇹🇿 Tanzania</td><td align="right">30</td><td nowrap><code>https://iptv-org.github.io/epg/guides/tz/dstv.com.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/dstv.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/dstv.com.yml/badge.svg" alt="dstv.com" style="max-width: 100%;"></a></td></tr>
|
||||
|
@ -228,9 +240,9 @@ To load a program guide, all you need to do is copy the link to one or more of t
|
|||
<tr><td valign="top">🇺🇦 Ukraine</td><td align="right">114</td><td nowrap><code>https://iptv-org.github.io/epg/guides/ua/tvgid.ua.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/tvgid.ua.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tvgid.ua.yml/badge.svg" alt="tvgid.ua" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td valign="top" rowspan="2">🇦🇪 United Arab Emirates</td><td align="right">99</td><td nowrap><code>https://iptv-org.github.io/epg/guides/ae-ar/osn.com.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/osn.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/osn.com.yml/badge.svg" alt="osn.com" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td align="right">99</td><td nowrap><code>https://iptv-org.github.io/epg/guides/ae-en/osn.com.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/osn.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/osn.com.yml/badge.svg" alt="osn.com" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td valign="top" rowspan="2">🇬🇧 United Kingdom</td><td align="right">258</td><td nowrap><code>https://iptv-org.github.io/epg/guides/uk/sky.com.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/sky.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/sky.com.yml/badge.svg" alt="sky.com" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td valign="top" rowspan="2">🇬🇧 United Kingdom</td><td align="right">262</td><td nowrap><code>https://iptv-org.github.io/epg/guides/uk/sky.com.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/sky.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/sky.com.yml/badge.svg" alt="sky.com" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td align="right">97</td><td nowrap><code>https://iptv-org.github.io/epg/guides/uk/ontvtonight.com.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/ontvtonight.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/ontvtonight.com.yml/badge.svg" alt="ontvtonight.com" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td valign="top" rowspan="4">🇺🇸 United States</td><td align="right">1683</td><td nowrap><code>https://iptv-org.github.io/epg/guides/us/tvtv.us.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/tvtv.us.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tvtv.us.yml/badge.svg" alt="tvtv.us" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td valign="top" rowspan="4">🇺🇸 United States</td><td align="right">1780</td><td nowrap><code>https://iptv-org.github.io/epg/guides/us/tvtv.us.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/tvtv.us.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tvtv.us.yml/badge.svg" alt="tvtv.us" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td align="right">410</td><td nowrap><code>https://iptv-org.github.io/epg/guides/us/directv.com.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/directv.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/directv.com.yml/badge.svg" alt="directv.com" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td align="right">88</td><td nowrap><code>https://iptv-org.github.io/epg/guides/us/tvguide.com.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/tvguide.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tvguide.com.yml/badge.svg" alt="tvguide.com" style="max-width: 100%;"></a></td></tr>
|
||||
<tr><td align="right">22</td><td nowrap><code>https://iptv-org.github.io/epg/guides/us/gatotv.com.epg.xml</code></td><td><a href="https://github.com/iptv-org/epg/actions/workflows/gatotv.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/gatotv.com.yml/badge.svg" alt="gatotv.com" style="max-width: 100%;"></a></td></tr>
|
||||
|
|
570
package-lock.json
generated
570
package-lock.json
generated
|
@ -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",
|
||||
|
|
|
@ -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"
|
||||
}
|
||||
}
|
||||
|
|
117
scripts/commands/channels/editor.js
Normal file
117
scripts/commands/channels/editor.js
Normal file
|
@ -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 <file>', 'Load channels from the file')
|
||||
.option('-c, --country <name>', '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}`
|
||||
}
|
|
@ -10,7 +10,7 @@ const xsd = `<?xml version="1.0" encoding="UTF-8"?>
|
|||
<xs:sequence>
|
||||
<xs:element ref="channels"/>
|
||||
</xs:sequence>
|
||||
<xs:attribute name="site" use="required" type="xs:NCName"/>
|
||||
<xs:attribute name="site" use="required" type="xs:string"/>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:element name="channels">
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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')
|
||||
}
|
||||
|
|
|
@ -16,6 +16,10 @@ class API {
|
|||
find(query) {
|
||||
return _.find(this.collection, query)
|
||||
}
|
||||
|
||||
all() {
|
||||
return this.collection
|
||||
}
|
||||
}
|
||||
|
||||
const api = {}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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) {
|
||||
|
|
68
sites/9tv.co.il/9tv.co.il.config.js
Normal file
68
sites/9tv.co.il/9tv.co.il.config.js
Normal file
|
@ -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()
|
||||
}
|
56
sites/9tv.co.il/9tv.co.il.test.js
Normal file
56
sites/9tv.co.il/9tv.co.il.test.js
Normal file
|
@ -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 = `<li> <a href="#" class="guide_list_link w-inline-block"> <div class="guide_list_time">06:30</div><div class="guide_info_group"> <div class="guide_info_pict" style="background-image: url(/download/pictures/img_id=8484.jpg);"></div><div class="guide_txt_group"> <h3 class="guide_info_title">Слепая</h3> <div>Она не очень любит говорить о себе или о том, кто и зачем к ней обращается. Живет уединенно, в глуши. Но тех, кто приходит -принимает. Она видит судьбы. </div></div></div></a></li><li> <a href="#" class="guide_list_link even w-inline-block"> <div class="guide_list_time">09:10</div><div class="guide_info_group"> <div class="guide_info_pict" style="background-image: url(/download/pictures/img_id=23694.jpg);"></div><div class="guide_txt_group"> <h3 class="guide_info_title">Орел и решка. Морской сезон</h3> <div>Орел и решка. Морской сезон. Ведущие -Алина Астровская и Коля Серга.</div></div></div></a></li>`
|
||||
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: `<!DOCTYPE html><html><head></head><body></body></html>`
|
||||
})
|
||||
expect(result).toMatchObject([])
|
||||
})
|
6
sites/9tv.co.il/9tv.co.il_il.channels.xml
Normal file
6
sites/9tv.co.il/9tv.co.il_il.channels.xml
Normal file
|
@ -0,0 +1,6 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<site site="9tv.co.il">
|
||||
<channels>
|
||||
<channel lang="ru" xmltv_id="Channel9.il" site_id="#">9 канал</channel>
|
||||
</channels>
|
||||
</site>
|
|
@ -20,7 +20,7 @@
|
|||
<channel lang="da" xmltv_id="DR2.dk" site_id="dk#0051">DR 2</channel>
|
||||
<channel lang="da" xmltv_id="DRRamasjang.dk" site_id="dk#0048">DR Ramasjang</channel>
|
||||
<channel lang="da" xmltv_id="EEurope.us" site_id="dk#0052">E! Europe</channel>
|
||||
<channel lang="da" xmltv_id="EuroNewsEnglish.fr" site_id="dk#0281">EuroNews English</channel>
|
||||
<channel lang="da" xmltv_id="EuronewsEnglish.fr" site_id="dk#0281">EuroNews English</channel>
|
||||
<channel lang="da" xmltv_id="Eurosport2Danmark.fr" site_id="dk#0367">Eurosport 2 Danmark</channel>
|
||||
<channel lang="da" xmltv_id="GodTVScandinavia.uk" site_id="dk#0058">God TV Scandinavia</channel>
|
||||
<channel lang="da" xmltv_id="Kanal4.dk" site_id="dk#0064">Kanal 4</channel>
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
<channel lang="no" xmltv_id="DisneyJuniorScandinavia.us" site_id="no#0307">Disney Junior Scandinavia</channel>
|
||||
<channel lang="no" xmltv_id="DR2.dk" site_id="no#0051">DR 2</channel>
|
||||
<channel lang="no" xmltv_id="EEurope.us" site_id="no#0052">E! Europe</channel>
|
||||
<channel lang="no" xmltv_id="EuroNewsEnglish.fr" site_id="no#0281">EuroNews English</channel>
|
||||
<channel lang="no" xmltv_id="EuronewsEnglish.fr" site_id="no#0281">EuroNews English</channel>
|
||||
<channel lang="no" xmltv_id="Eurosport1Norge.fr" site_id="no#531">Eurosport 1 Norge</channel>
|
||||
<channel lang="no" xmltv_id="EurosportNorge.fr" site_id="no#530">Eurosport Norge</channel>
|
||||
<channel lang="no" xmltv_id="FEM.no" site_id="no#0056">FEM</channel>
|
||||
|
|
|
@ -30,7 +30,7 @@
|
|||
<channel lang="sv" xmltv_id="DR2.dk" site_id="se#0051">DR 2</channel>
|
||||
<channel lang="sv" xmltv_id="DRRamasjang.dk" site_id="se#0048">DR Ramasjang</channel>
|
||||
<channel lang="sv" xmltv_id="EEurope.us" site_id="se#0052">E! Europe</channel>
|
||||
<channel lang="sv" xmltv_id="EuroNewsEnglish.fr" site_id="se#0281">EuroNews English</channel>
|
||||
<channel lang="sv" xmltv_id="EuronewsEnglish.fr" site_id="se#0281">EuroNews English</channel>
|
||||
<channel lang="sv" xmltv_id="Eurosport1Sverige.fr" site_id="se#1001">Eurosport 1 Sverige</channel>
|
||||
<channel lang="sv" xmltv_id="Eurosport2Sverige.fr" site_id="se#1002">Eurosport 2 Sverige</channel>
|
||||
<channel lang="sv" xmltv_id="Godare.se" site_id="se#722">Godare</channel>
|
||||
|
|
65
sites/artonline.tv/artonline.tv.config.js
Normal file
65
sites/artonline.tv/artonline.tv.config.js
Normal file
|
@ -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
|
||||
}
|
65
sites/artonline.tv/artonline.tv.test.js
Normal file
65
sites/artonline.tv/artonline.tv.test.js
Normal file
|
@ -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([])
|
||||
})
|
10
sites/artonline.tv/artonline.tv_sa.channels.xml
Normal file
10
sites/artonline.tv/artonline.tv_sa.channels.xml
Normal file
|
@ -0,0 +1,10 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<site site="artonline.tv">
|
||||
<channels>
|
||||
<channel lang="ar" xmltv_id="ARTAflam1.sa" site_id="">ART Aflam 1</channel>
|
||||
<channel lang="ar" xmltv_id="ARTAflam2.sa" site_id="Aflam2">ART Aflam 2</channel>
|
||||
<channel lang="ar" xmltv_id="ARTCinema.sa" site_id="Cinema">ART Cinema</channel>
|
||||
<channel lang="ar" xmltv_id="ARTHekayat.sa" site_id="Hekayat">ART Hekayat</channel>
|
||||
<channel lang="ar" xmltv_id="ARTHekayat2.sa" site_id="Hekayat2">ART Hekayat 2</channel>
|
||||
</channels>
|
||||
</site>
|
|
@ -89,10 +89,10 @@
|
|||
<channel lang="fr" xmltv_id="Elmouritania.mr" site_id="80384">Elmouritania</channel>
|
||||
<channel lang="fr" xmltv_id="EMCITVAfrique.fr" site_id="80673">EMCI TV Afrique</channel>
|
||||
<channel lang="fr" xmltv_id="EquinoxeTV.cm" site_id="80170">Equinoxe TV</channel>
|
||||
<channel lang="fr" xmltv_id="ES1.fr" site_id="80667">ES1</channel>
|
||||
<channel lang="fr" xmltv_id="MGGTV.fr" site_id="80667">ES1</channel>
|
||||
<channel lang="fr" xmltv_id="EspaceTV.gn" site_id="80425">Espace TV</channel>
|
||||
<channel lang="fr" xmltv_id="ETeleBenin.bj" site_id="80421">E-Télé Benin</channel>
|
||||
<channel lang="fr" xmltv_id="EuroNewsFrancais.fr" site_id="80040">EuroNews Français</channel>
|
||||
<channel lang="fr" xmltv_id="EuronewsFrancais.fr" site_id="80040">EuroNews Français</channel>
|
||||
<channel lang="fr" xmltv_id="Eurosport1France.fr" site_id="80041">Eurosport 1 France</channel>
|
||||
<channel lang="fr" xmltv_id="Eurosport2France.fr" site_id="80042">Eurosport 2 France</channel>
|
||||
<channel lang="fr" xmltv_id="EvasionGuinee.gn" site_id="80398">Evasión Guinée</channel>
|
||||
|
|
|
@ -89,10 +89,10 @@
|
|||
<channel lang="fr" xmltv_id="Elmouritania.mr" site_id="80384">Elmouritania</channel>
|
||||
<channel lang="fr" xmltv_id="EMCITVAfrique.fr" site_id="80673">EMCI TV Afrique</channel>
|
||||
<channel lang="fr" xmltv_id="EquinoxeTV.cm" site_id="80170">Equinoxe TV</channel>
|
||||
<channel lang="fr" xmltv_id="ES1.fr" site_id="80667">ES1</channel>
|
||||
<channel lang="fr" xmltv_id="MGGTV.fr" site_id="80667">ES1</channel>
|
||||
<channel lang="fr" xmltv_id="EspaceTV.gn" site_id="80425">Espace TV</channel>
|
||||
<channel lang="fr" xmltv_id="ETeleBenin.bj" site_id="80421">E-Télé Benin</channel>
|
||||
<channel lang="fr" xmltv_id="EuroNewsFrancais.fr" site_id="80040">EuroNews Français</channel>
|
||||
<channel lang="fr" xmltv_id="EuronewsFrancais.fr" site_id="80040">EuroNews Français</channel>
|
||||
<channel lang="fr" xmltv_id="Eurosport1France.fr" site_id="80041">Eurosport 1 France</channel>
|
||||
<channel lang="fr" xmltv_id="Eurosport2France.fr" site_id="80042">Eurosport 2 France</channel>
|
||||
<channel lang="fr" xmltv_id="EvasionGuinee.gn" site_id="80398">Evasión Guinée</channel>
|
||||
|
|
|
@ -89,10 +89,10 @@
|
|||
<channel lang="fr" xmltv_id="Elmouritania.mr" site_id="80384">Elmouritania</channel>
|
||||
<channel lang="fr" xmltv_id="EMCITVAfrique.fr" site_id="80673">EMCI TV Afrique</channel>
|
||||
<channel lang="fr" xmltv_id="EquinoxeTV.cm" site_id="80170">Equinoxe TV</channel>
|
||||
<channel lang="fr" xmltv_id="ES1.fr" site_id="80667">ES1</channel>
|
||||
<channel lang="fr" xmltv_id="MGGTV.fr" site_id="80667">ES1</channel>
|
||||
<channel lang="fr" xmltv_id="EspaceTV.gn" site_id="80425">Espace TV</channel>
|
||||
<channel lang="fr" xmltv_id="ETeleBenin.bj" site_id="80421">E-Télé Benin</channel>
|
||||
<channel lang="fr" xmltv_id="EuroNewsFrancais.fr" site_id="80040">EuroNews Français</channel>
|
||||
<channel lang="fr" xmltv_id="EuronewsFrancais.fr" site_id="80040">EuroNews Français</channel>
|
||||
<channel lang="fr" xmltv_id="Eurosport1France.fr" site_id="80041">Eurosport 1 France</channel>
|
||||
<channel lang="fr" xmltv_id="Eurosport2France.fr" site_id="80042">Eurosport 2 France</channel>
|
||||
<channel lang="fr" xmltv_id="EvasionGuinee.gn" site_id="80398">Evasión Guinée</channel>
|
||||
|
|
|
@ -89,10 +89,10 @@
|
|||
<channel lang="fr" xmltv_id="Elmouritania.mr" site_id="80384">Elmouritania</channel>
|
||||
<channel lang="fr" xmltv_id="EMCITVAfrique.fr" site_id="80673">EMCI TV Afrique</channel>
|
||||
<channel lang="fr" xmltv_id="EquinoxeTV.cm" site_id="80170">Equinoxe TV</channel>
|
||||
<channel lang="fr" xmltv_id="ES1.fr" site_id="80667">ES1</channel>
|
||||
<channel lang="fr" xmltv_id="MGGTV.fr" site_id="80667">ES1</channel>
|
||||
<channel lang="fr" xmltv_id="EspaceTV.gn" site_id="80425">Espace TV</channel>
|
||||
<channel lang="fr" xmltv_id="ETeleBenin.bj" site_id="80421">E-Télé Benin</channel>
|
||||
<channel lang="fr" xmltv_id="EuroNewsFrancais.fr" site_id="80040">EuroNews Français</channel>
|
||||
<channel lang="fr" xmltv_id="EuronewsFrancais.fr" site_id="80040">EuroNews Français</channel>
|
||||
<channel lang="fr" xmltv_id="Eurosport1France.fr" site_id="80041">Eurosport 1 France</channel>
|
||||
<channel lang="fr" xmltv_id="Eurosport2France.fr" site_id="80042">Eurosport 2 France</channel>
|
||||
<channel lang="fr" xmltv_id="EvasionGuinee.gn" site_id="80398">Evasión Guinée</channel>
|
||||
|
|
|
@ -89,10 +89,10 @@
|
|||
<channel lang="fr" xmltv_id="Elmouritania.mr" site_id="80384">Elmouritania</channel>
|
||||
<channel lang="fr" xmltv_id="EMCITVAfrique.fr" site_id="80673">EMCI TV Afrique</channel>
|
||||
<channel lang="fr" xmltv_id="EquinoxeTV.cm" site_id="80170">Equinoxe TV</channel>
|
||||
<channel lang="fr" xmltv_id="ES1.fr" site_id="80667">ES1</channel>
|
||||
<channel lang="fr" xmltv_id="MGGTV.fr" site_id="80667">ES1</channel>
|
||||
<channel lang="fr" xmltv_id="EspaceTV.gn" site_id="80425">Espace TV</channel>
|
||||
<channel lang="fr" xmltv_id="ETeleBenin.bj" site_id="80421">E-Télé Benin</channel>
|
||||
<channel lang="fr" xmltv_id="EuroNewsFrancais.fr" site_id="80040">EuroNews Français</channel>
|
||||
<channel lang="fr" xmltv_id="EuronewsFrancais.fr" site_id="80040">EuroNews Français</channel>
|
||||
<channel lang="fr" xmltv_id="Eurosport1France.fr" site_id="80041">Eurosport 1 France</channel>
|
||||
<channel lang="fr" xmltv_id="Eurosport2France.fr" site_id="80042">Eurosport 2 France</channel>
|
||||
<channel lang="fr" xmltv_id="EvasionGuinee.gn" site_id="80398">Evasión Guinée</channel>
|
||||
|
|
|
@ -89,10 +89,10 @@
|
|||
<channel lang="fr" xmltv_id="Elmouritania.mr" site_id="80384">Elmouritania</channel>
|
||||
<channel lang="fr" xmltv_id="EMCITVAfrique.fr" site_id="80673">EMCI TV Afrique</channel>
|
||||
<channel lang="fr" xmltv_id="EquinoxeTV.cm" site_id="80170">Equinoxe TV</channel>
|
||||
<channel lang="fr" xmltv_id="ES1.fr" site_id="80667">ES1</channel>
|
||||
<channel lang="fr" xmltv_id="MGGTV.fr" site_id="80667">ES1</channel>
|
||||
<channel lang="fr" xmltv_id="EspaceTV.gn" site_id="80425">Espace TV</channel>
|
||||
<channel lang="fr" xmltv_id="ETeleBenin.bj" site_id="80421">E-Télé Benin</channel>
|
||||
<channel lang="fr" xmltv_id="EuroNewsFrancais.fr" site_id="80040">EuroNews Français</channel>
|
||||
<channel lang="fr" xmltv_id="EuronewsFrancais.fr" site_id="80040">EuroNews Français</channel>
|
||||
<channel lang="fr" xmltv_id="Eurosport1France.fr" site_id="80041">Eurosport 1 France</channel>
|
||||
<channel lang="fr" xmltv_id="Eurosport2France.fr" site_id="80042">Eurosport 2 France</channel>
|
||||
<channel lang="fr" xmltv_id="EvasionGuinee.gn" site_id="80398">Evasión Guinée</channel>
|
||||
|
|
|
@ -89,10 +89,10 @@
|
|||
<channel lang="fr" xmltv_id="Elmouritania.mr" site_id="80384">Elmouritania</channel>
|
||||
<channel lang="fr" xmltv_id="EMCITVAfrique.fr" site_id="80673">EMCI TV Afrique</channel>
|
||||
<channel lang="fr" xmltv_id="EquinoxeTV.cm" site_id="80170">Equinoxe TV</channel>
|
||||
<channel lang="fr" xmltv_id="ES1.fr" site_id="80667">ES1</channel>
|
||||
<channel lang="fr" xmltv_id="MGGTV.fr" site_id="80667">ES1</channel>
|
||||
<channel lang="fr" xmltv_id="EspaceTV.gn" site_id="80425">Espace TV</channel>
|
||||
<channel lang="fr" xmltv_id="ETeleBenin.bj" site_id="80421">E-Télé Benin</channel>
|
||||
<channel lang="fr" xmltv_id="EuroNewsFrancais.fr" site_id="80040">EuroNews Français</channel>
|
||||
<channel lang="fr" xmltv_id="EuronewsFrancais.fr" site_id="80040">EuroNews Français</channel>
|
||||
<channel lang="fr" xmltv_id="Eurosport1France.fr" site_id="80041">Eurosport 1 France</channel>
|
||||
<channel lang="fr" xmltv_id="Eurosport2France.fr" site_id="80042">Eurosport 2 France</channel>
|
||||
<channel lang="fr" xmltv_id="EvasionGuinee.gn" site_id="80398">Evasión Guinée</channel>
|
||||
|
|
|
@ -89,10 +89,10 @@
|
|||
<channel lang="fr" xmltv_id="Elmouritania.mr" site_id="80384">Elmouritania</channel>
|
||||
<channel lang="fr" xmltv_id="EMCITVAfrique.fr" site_id="80673">EMCI TV Afrique</channel>
|
||||
<channel lang="fr" xmltv_id="EquinoxeTV.cm" site_id="80170">Equinoxe TV</channel>
|
||||
<channel lang="fr" xmltv_id="ES1.fr" site_id="80667">ES1</channel>
|
||||
<channel lang="fr" xmltv_id="MGGTV.fr" site_id="80667">ES1</channel>
|
||||
<channel lang="fr" xmltv_id="EspaceTV.gn" site_id="80425">Espace TV</channel>
|
||||
<channel lang="fr" xmltv_id="ETeleBenin.bj" site_id="80421">E-Télé Benin</channel>
|
||||
<channel lang="fr" xmltv_id="EuroNewsFrancais.fr" site_id="80040">EuroNews Français</channel>
|
||||
<channel lang="fr" xmltv_id="EuronewsFrancais.fr" site_id="80040">EuroNews Français</channel>
|
||||
<channel lang="fr" xmltv_id="Eurosport1France.fr" site_id="80041">Eurosport 1 France</channel>
|
||||
<channel lang="fr" xmltv_id="Eurosport2France.fr" site_id="80042">Eurosport 2 France</channel>
|
||||
<channel lang="fr" xmltv_id="EvasionGuinee.gn" site_id="80398">Evasión Guinée</channel>
|
||||
|
|
|
@ -89,10 +89,10 @@
|
|||
<channel lang="fr" xmltv_id="Elmouritania.mr" site_id="80384">Elmouritania</channel>
|
||||
<channel lang="fr" xmltv_id="EMCITVAfrique.fr" site_id="80673">EMCI TV Afrique</channel>
|
||||
<channel lang="fr" xmltv_id="EquinoxeTV.cm" site_id="80170">Equinoxe TV</channel>
|
||||
<channel lang="fr" xmltv_id="ES1.fr" site_id="80667">ES1</channel>
|
||||
<channel lang="fr" xmltv_id="MGGTV.fr" site_id="80667">ES1</channel>
|
||||
<channel lang="fr" xmltv_id="EspaceTV.gn" site_id="80425">Espace TV</channel>
|
||||
<channel lang="fr" xmltv_id="ETeleBenin.bj" site_id="80421">E-Télé Benin</channel>
|
||||
<channel lang="fr" xmltv_id="EuroNewsFrancais.fr" site_id="80040">EuroNews Français</channel>
|
||||
<channel lang="fr" xmltv_id="EuronewsFrancais.fr" site_id="80040">EuroNews Français</channel>
|
||||
<channel lang="fr" xmltv_id="Eurosport1France.fr" site_id="80041">Eurosport 1 France</channel>
|
||||
<channel lang="fr" xmltv_id="Eurosport2France.fr" site_id="80042">Eurosport 2 France</channel>
|
||||
<channel lang="fr" xmltv_id="EvasionGuinee.gn" site_id="80398">Evasión Guinée</channel>
|
||||
|
|
|
@ -89,10 +89,10 @@
|
|||
<channel lang="fr" xmltv_id="Elmouritania.mr" site_id="80384">Elmouritania</channel>
|
||||
<channel lang="fr" xmltv_id="EMCITVAfrique.fr" site_id="80673">EMCI TV Afrique</channel>
|
||||
<channel lang="fr" xmltv_id="EquinoxeTV.cm" site_id="80170">Equinoxe TV</channel>
|
||||
<channel lang="fr" xmltv_id="ES1.fr" site_id="80667">ES1</channel>
|
||||
<channel lang="fr" xmltv_id="MGGTV.fr" site_id="80667">ES1</channel>
|
||||
<channel lang="fr" xmltv_id="EspaceTV.gn" site_id="80425">Espace TV</channel>
|
||||
<channel lang="fr" xmltv_id="ETeleBenin.bj" site_id="80421">E-Télé Benin</channel>
|
||||
<channel lang="fr" xmltv_id="EuroNewsFrancais.fr" site_id="80040">EuroNews Français</channel>
|
||||
<channel lang="fr" xmltv_id="EuronewsFrancais.fr" site_id="80040">EuroNews Français</channel>
|
||||
<channel lang="fr" xmltv_id="Eurosport1France.fr" site_id="80041">Eurosport 1 France</channel>
|
||||
<channel lang="fr" xmltv_id="Eurosport2France.fr" site_id="80042">Eurosport 2 France</channel>
|
||||
<channel lang="fr" xmltv_id="EvasionGuinee.gn" site_id="80398">Evasión Guinée</channel>
|
||||
|
|
|
@ -89,10 +89,10 @@
|
|||
<channel lang="fr" xmltv_id="Elmouritania.mr" site_id="80384">Elmouritania</channel>
|
||||
<channel lang="fr" xmltv_id="EMCITVAfrique.fr" site_id="80673">EMCI TV Afrique</channel>
|
||||
<channel lang="fr" xmltv_id="EquinoxeTV.cm" site_id="80170">Equinoxe TV</channel>
|
||||
<channel lang="fr" xmltv_id="ES1.fr" site_id="80667">ES1</channel>
|
||||
<channel lang="fr" xmltv_id="MGGTV.fr" site_id="80667">ES1</channel>
|
||||
<channel lang="fr" xmltv_id="EspaceTV.gn" site_id="80425">Espace TV</channel>
|
||||
<channel lang="fr" xmltv_id="ETeleBenin.bj" site_id="80421">E-Télé Benin</channel>
|
||||
<channel lang="fr" xmltv_id="EuroNewsFrancais.fr" site_id="80040">EuroNews Français</channel>
|
||||
<channel lang="fr" xmltv_id="EuronewsFrancais.fr" site_id="80040">EuroNews Français</channel>
|
||||
<channel lang="fr" xmltv_id="Eurosport1France.fr" site_id="80041">Eurosport 1 France</channel>
|
||||
<channel lang="fr" xmltv_id="Eurosport2France.fr" site_id="80042">Eurosport 2 France</channel>
|
||||
<channel lang="fr" xmltv_id="EvasionGuinee.gn" site_id="80398">Evasión Guinée</channel>
|
||||
|
|
|
@ -89,10 +89,10 @@
|
|||
<channel lang="fr" xmltv_id="Elmouritania.mr" site_id="80384">Elmouritania</channel>
|
||||
<channel lang="fr" xmltv_id="EMCITVAfrique.fr" site_id="80673">EMCI TV Afrique</channel>
|
||||
<channel lang="fr" xmltv_id="EquinoxeTV.cm" site_id="80170">Equinoxe TV</channel>
|
||||
<channel lang="fr" xmltv_id="ES1.fr" site_id="80667">ES1</channel>
|
||||
<channel lang="fr" xmltv_id="MGGTV.fr" site_id="80667">ES1</channel>
|
||||
<channel lang="fr" xmltv_id="EspaceTV.gn" site_id="80425">Espace TV</channel>
|
||||
<channel lang="fr" xmltv_id="ETeleBenin.bj" site_id="80421">E-Télé Benin</channel>
|
||||
<channel lang="fr" xmltv_id="EuroNewsFrancais.fr" site_id="80040">EuroNews Français</channel>
|
||||
<channel lang="fr" xmltv_id="EuronewsFrancais.fr" site_id="80040">EuroNews Français</channel>
|
||||
<channel lang="fr" xmltv_id="Eurosport1France.fr" site_id="80041">Eurosport 1 France</channel>
|
||||
<channel lang="fr" xmltv_id="Eurosport2France.fr" site_id="80042">Eurosport 2 France</channel>
|
||||
<channel lang="fr" xmltv_id="EvasionGuinee.gn" site_id="80398">Evasión Guinée</channel>
|
||||
|
|
|
@ -89,10 +89,10 @@
|
|||
<channel lang="fr" xmltv_id="Elmouritania.mr" site_id="80384">Elmouritania</channel>
|
||||
<channel lang="fr" xmltv_id="EMCITVAfrique.fr" site_id="80673">EMCI TV Afrique</channel>
|
||||
<channel lang="fr" xmltv_id="EquinoxeTV.cm" site_id="80170">Equinoxe TV</channel>
|
||||
<channel lang="fr" xmltv_id="ES1.fr" site_id="80667">ES1</channel>
|
||||
<channel lang="fr" xmltv_id="MGGTV.fr" site_id="80667">ES1</channel>
|
||||
<channel lang="fr" xmltv_id="EspaceTV.gn" site_id="80425">Espace TV</channel>
|
||||
<channel lang="fr" xmltv_id="ETeleBenin.bj" site_id="80421">E-Télé Benin</channel>
|
||||
<channel lang="fr" xmltv_id="EuroNewsFrancais.fr" site_id="80040">EuroNews Français</channel>
|
||||
<channel lang="fr" xmltv_id="EuronewsFrancais.fr" site_id="80040">EuroNews Français</channel>
|
||||
<channel lang="fr" xmltv_id="Eurosport1France.fr" site_id="80041">Eurosport 1 France</channel>
|
||||
<channel lang="fr" xmltv_id="Eurosport2France.fr" site_id="80042">Eurosport 2 France</channel>
|
||||
<channel lang="fr" xmltv_id="EvasionGuinee.gn" site_id="80398">Evasión Guinée</channel>
|
||||
|
|
|
@ -89,10 +89,10 @@
|
|||
<channel lang="fr" xmltv_id="Elmouritania.mr" site_id="80384">Elmouritania</channel>
|
||||
<channel lang="fr" xmltv_id="EMCITVAfrique.fr" site_id="80673">EMCI TV Afrique</channel>
|
||||
<channel lang="fr" xmltv_id="EquinoxeTV.cm" site_id="80170">Equinoxe TV</channel>
|
||||
<channel lang="fr" xmltv_id="ES1.fr" site_id="80667">ES1</channel>
|
||||
<channel lang="fr" xmltv_id="MGGTV.fr" site_id="80667">ES1</channel>
|
||||
<channel lang="fr" xmltv_id="EspaceTV.gn" site_id="80425">Espace TV</channel>
|
||||
<channel lang="fr" xmltv_id="ETeleBenin.bj" site_id="80421">E-Télé Benin</channel>
|
||||
<channel lang="fr" xmltv_id="EuroNewsFrancais.fr" site_id="80040">EuroNews Français</channel>
|
||||
<channel lang="fr" xmltv_id="EuronewsFrancais.fr" site_id="80040">EuroNews Français</channel>
|
||||
<channel lang="fr" xmltv_id="Eurosport1France.fr" site_id="80041">Eurosport 1 France</channel>
|
||||
<channel lang="fr" xmltv_id="Eurosport2France.fr" site_id="80042">Eurosport 2 France</channel>
|
||||
<channel lang="fr" xmltv_id="EvasionGuinee.gn" site_id="80398">Evasión Guinée</channel>
|
||||
|
|
|
@ -89,10 +89,10 @@
|
|||
<channel lang="fr" xmltv_id="Elmouritania.mr" site_id="80384">Elmouritania</channel>
|
||||
<channel lang="fr" xmltv_id="EMCITVAfrique.fr" site_id="80673">EMCI TV Afrique</channel>
|
||||
<channel lang="fr" xmltv_id="EquinoxeTV.cm" site_id="80170">Equinoxe TV</channel>
|
||||
<channel lang="fr" xmltv_id="ES1.fr" site_id="80667">ES1</channel>
|
||||
<channel lang="fr" xmltv_id="MGGTV.fr" site_id="80667">ES1</channel>
|
||||
<channel lang="fr" xmltv_id="EspaceTV.gn" site_id="80425">Espace TV</channel>
|
||||
<channel lang="fr" xmltv_id="ETeleBenin.bj" site_id="80421">E-Télé Benin</channel>
|
||||
<channel lang="fr" xmltv_id="EuroNewsFrancais.fr" site_id="80040">EuroNews Français</channel>
|
||||
<channel lang="fr" xmltv_id="EuronewsFrancais.fr" site_id="80040">EuroNews Français</channel>
|
||||
<channel lang="fr" xmltv_id="Eurosport1France.fr" site_id="80041">Eurosport 1 France</channel>
|
||||
<channel lang="fr" xmltv_id="Eurosport2France.fr" site_id="80042">Eurosport 2 France</channel>
|
||||
<channel lang="fr" xmltv_id="EvasionGuinee.gn" site_id="80398">Evasión Guinée</channel>
|
||||
|
|
|
@ -89,10 +89,10 @@
|
|||
<channel lang="fr" xmltv_id="Elmouritania.mr" site_id="80384">Elmouritania</channel>
|
||||
<channel lang="fr" xmltv_id="EMCITVAfrique.fr" site_id="80673">EMCI TV Afrique</channel>
|
||||
<channel lang="fr" xmltv_id="EquinoxeTV.cm" site_id="80170">Equinoxe TV</channel>
|
||||
<channel lang="fr" xmltv_id="ES1.fr" site_id="80667">ES1</channel>
|
||||
<channel lang="fr" xmltv_id="MGGTV.fr" site_id="80667">ES1</channel>
|
||||
<channel lang="fr" xmltv_id="EspaceTV.gn" site_id="80425">Espace TV</channel>
|
||||
<channel lang="fr" xmltv_id="ETeleBenin.bj" site_id="80421">E-Télé Benin</channel>
|
||||
<channel lang="fr" xmltv_id="EuroNewsFrancais.fr" site_id="80040">EuroNews Français</channel>
|
||||
<channel lang="fr" xmltv_id="EuronewsFrancais.fr" site_id="80040">EuroNews Français</channel>
|
||||
<channel lang="fr" xmltv_id="Eurosport1France.fr" site_id="80041">Eurosport 1 France</channel>
|
||||
<channel lang="fr" xmltv_id="Eurosport2France.fr" site_id="80042">Eurosport 2 France</channel>
|
||||
<channel lang="fr" xmltv_id="EvasionGuinee.gn" site_id="80398">Evasión Guinée</channel>
|
||||
|
|
|
@ -89,10 +89,10 @@
|
|||
<channel lang="fr" xmltv_id="Elmouritania.mr" site_id="80384">Elmouritania</channel>
|
||||
<channel lang="fr" xmltv_id="EMCITVAfrique.fr" site_id="80673">EMCI TV Afrique</channel>
|
||||
<channel lang="fr" xmltv_id="EquinoxeTV.cm" site_id="80170">Equinoxe TV</channel>
|
||||
<channel lang="fr" xmltv_id="ES1.fr" site_id="80667">ES1</channel>
|
||||
<channel lang="fr" xmltv_id="MGGTV.fr" site_id="80667">ES1</channel>
|
||||
<channel lang="fr" xmltv_id="EspaceTV.gn" site_id="80425">Espace TV</channel>
|
||||
<channel lang="fr" xmltv_id="ETeleBenin.bj" site_id="80421">E-Télé Benin</channel>
|
||||
<channel lang="fr" xmltv_id="EuroNewsFrancais.fr" site_id="80040">EuroNews Français</channel>
|
||||
<channel lang="fr" xmltv_id="EuronewsFrancais.fr" site_id="80040">EuroNews Français</channel>
|
||||
<channel lang="fr" xmltv_id="Eurosport1France.fr" site_id="80041">Eurosport 1 France</channel>
|
||||
<channel lang="fr" xmltv_id="Eurosport2France.fr" site_id="80042">Eurosport 2 France</channel>
|
||||
<channel lang="fr" xmltv_id="EvasionGuinee.gn" site_id="80398">Evasión Guinée</channel>
|
||||
|
|
|
@ -89,10 +89,10 @@
|
|||
<channel lang="fr" xmltv_id="Elmouritania.mr" site_id="80384">Elmouritania</channel>
|
||||
<channel lang="fr" xmltv_id="EMCITVAfrique.fr" site_id="80673">EMCI TV Afrique</channel>
|
||||
<channel lang="fr" xmltv_id="EquinoxeTV.cm" site_id="80170">Equinoxe TV</channel>
|
||||
<channel lang="fr" xmltv_id="ES1.fr" site_id="80667">ES1</channel>
|
||||
<channel lang="fr" xmltv_id="MGGTV.fr" site_id="80667">ES1</channel>
|
||||
<channel lang="fr" xmltv_id="EspaceTV.gn" site_id="80425">Espace TV</channel>
|
||||
<channel lang="fr" xmltv_id="ETeleBenin.bj" site_id="80421">E-Télé Benin</channel>
|
||||
<channel lang="fr" xmltv_id="EuroNewsFrancais.fr" site_id="80040">EuroNews Français</channel>
|
||||
<channel lang="fr" xmltv_id="EuronewsFrancais.fr" site_id="80040">EuroNews Français</channel>
|
||||
<channel lang="fr" xmltv_id="Eurosport1France.fr" site_id="80041">Eurosport 1 France</channel>
|
||||
<channel lang="fr" xmltv_id="Eurosport2France.fr" site_id="80042">Eurosport 2 France</channel>
|
||||
<channel lang="fr" xmltv_id="EvasionGuinee.gn" site_id="80398">Evasión Guinée</channel>
|
||||
|
|
|
@ -89,10 +89,10 @@
|
|||
<channel lang="fr" xmltv_id="Elmouritania.mr" site_id="80384">Elmouritania</channel>
|
||||
<channel lang="fr" xmltv_id="EMCITVAfrique.fr" site_id="80673">EMCI TV Afrique</channel>
|
||||
<channel lang="fr" xmltv_id="EquinoxeTV.cm" site_id="80170">Equinoxe TV</channel>
|
||||
<channel lang="fr" xmltv_id="ES1.fr" site_id="80667">ES1</channel>
|
||||
<channel lang="fr" xmltv_id="MGGTV.fr" site_id="80667">ES1</channel>
|
||||
<channel lang="fr" xmltv_id="EspaceTV.gn" site_id="80425">Espace TV</channel>
|
||||
<channel lang="fr" xmltv_id="ETeleBenin.bj" site_id="80421">E-Télé Benin</channel>
|
||||
<channel lang="fr" xmltv_id="EuroNewsFrancais.fr" site_id="80040">EuroNews Français</channel>
|
||||
<channel lang="fr" xmltv_id="EuronewsFrancais.fr" site_id="80040">EuroNews Français</channel>
|
||||
<channel lang="fr" xmltv_id="Eurosport1France.fr" site_id="80041">Eurosport 1 France</channel>
|
||||
<channel lang="fr" xmltv_id="Eurosport2France.fr" site_id="80042">Eurosport 2 France</channel>
|
||||
<channel lang="fr" xmltv_id="EvasionGuinee.gn" site_id="80398">Evasión Guinée</channel>
|
||||
|
|
|
@ -89,10 +89,10 @@
|
|||
<channel lang="fr" xmltv_id="Elmouritania.mr" site_id="80384">Elmouritania</channel>
|
||||
<channel lang="fr" xmltv_id="EMCITVAfrique.fr" site_id="80673">EMCI TV Afrique</channel>
|
||||
<channel lang="fr" xmltv_id="EquinoxeTV.cm" site_id="80170">Equinoxe TV</channel>
|
||||
<channel lang="fr" xmltv_id="ES1.fr" site_id="80667">ES1</channel>
|
||||
<channel lang="fr" xmltv_id="MGGTV.fr" site_id="80667">ES1</channel>
|
||||
<channel lang="fr" xmltv_id="EspaceTV.gn" site_id="80425">Espace TV</channel>
|
||||
<channel lang="fr" xmltv_id="ETeleBenin.bj" site_id="80421">E-Télé Benin</channel>
|
||||
<channel lang="fr" xmltv_id="EuroNewsFrancais.fr" site_id="80040">EuroNews Français</channel>
|
||||
<channel lang="fr" xmltv_id="EuronewsFrancais.fr" site_id="80040">EuroNews Français</channel>
|
||||
<channel lang="fr" xmltv_id="Eurosport1France.fr" site_id="80041">Eurosport 1 France</channel>
|
||||
<channel lang="fr" xmltv_id="Eurosport2France.fr" site_id="80042">Eurosport 2 France</channel>
|
||||
<channel lang="fr" xmltv_id="EvasionGuinee.gn" site_id="80398">Evasión Guinée</channel>
|
||||
|
|
|
@ -89,10 +89,10 @@
|
|||
<channel lang="fr" xmltv_id="Elmouritania.mr" site_id="80384">Elmouritania</channel>
|
||||
<channel lang="fr" xmltv_id="EMCITVAfrique.fr" site_id="80673">EMCI TV Afrique</channel>
|
||||
<channel lang="fr" xmltv_id="EquinoxeTV.cm" site_id="80170">Equinoxe TV</channel>
|
||||
<channel lang="fr" xmltv_id="ES1.fr" site_id="80667">ES1</channel>
|
||||
<channel lang="fr" xmltv_id="MGGTV.fr" site_id="80667">ES1</channel>
|
||||
<channel lang="fr" xmltv_id="EspaceTV.gn" site_id="80425">Espace TV</channel>
|
||||
<channel lang="fr" xmltv_id="ETeleBenin.bj" site_id="80421">E-Télé Benin</channel>
|
||||
<channel lang="fr" xmltv_id="EuroNewsFrancais.fr" site_id="80040">EuroNews Français</channel>
|
||||
<channel lang="fr" xmltv_id="EuronewsFrancais.fr" site_id="80040">EuroNews Français</channel>
|
||||
<channel lang="fr" xmltv_id="Eurosport1France.fr" site_id="80041">Eurosport 1 France</channel>
|
||||
<channel lang="fr" xmltv_id="Eurosport2France.fr" site_id="80042">Eurosport 2 France</channel>
|
||||
<channel lang="fr" xmltv_id="EvasionGuinee.gn" site_id="80398">Evasión Guinée</channel>
|
||||
|
|
|
@ -89,10 +89,10 @@
|
|||
<channel lang="fr" xmltv_id="Elmouritania.mr" site_id="80384">Elmouritania</channel>
|
||||
<channel lang="fr" xmltv_id="EMCITVAfrique.fr" site_id="80673">EMCI TV Afrique</channel>
|
||||
<channel lang="fr" xmltv_id="EquinoxeTV.cm" site_id="80170">Equinoxe TV</channel>
|
||||
<channel lang="fr" xmltv_id="ES1.fr" site_id="80667">ES1</channel>
|
||||
<channel lang="fr" xmltv_id="MGGTV.fr" site_id="80667">ES1</channel>
|
||||
<channel lang="fr" xmltv_id="EspaceTV.gn" site_id="80425">Espace TV</channel>
|
||||
<channel lang="fr" xmltv_id="ETeleBenin.bj" site_id="80421">E-Télé Benin</channel>
|
||||
<channel lang="fr" xmltv_id="EuroNewsFrancais.fr" site_id="80040">EuroNews Français</channel>
|
||||
<channel lang="fr" xmltv_id="EuronewsFrancais.fr" site_id="80040">EuroNews Français</channel>
|
||||
<channel lang="fr" xmltv_id="Eurosport1France.fr" site_id="80041">Eurosport 1 France</channel>
|
||||
<channel lang="fr" xmltv_id="Eurosport2France.fr" site_id="80042">Eurosport 2 France</channel>
|
||||
<channel lang="fr" xmltv_id="EvasionGuinee.gn" site_id="80398">Evasión Guinée</channel>
|
||||
|
|
|
@ -89,10 +89,10 @@
|
|||
<channel lang="fr" xmltv_id="Elmouritania.mr" site_id="80384">Elmouritania</channel>
|
||||
<channel lang="fr" xmltv_id="EMCITVAfrique.fr" site_id="80673">EMCI TV Afrique</channel>
|
||||
<channel lang="fr" xmltv_id="EquinoxeTV.cm" site_id="80170">Equinoxe TV</channel>
|
||||
<channel lang="fr" xmltv_id="ES1.fr" site_id="80667">ES1</channel>
|
||||
<channel lang="fr" xmltv_id="MGGTV.fr" site_id="80667">ES1</channel>
|
||||
<channel lang="fr" xmltv_id="EspaceTV.gn" site_id="80425">Espace TV</channel>
|
||||
<channel lang="fr" xmltv_id="ETeleBenin.bj" site_id="80421">E-Télé Benin</channel>
|
||||
<channel lang="fr" xmltv_id="EuroNewsFrancais.fr" site_id="80040">EuroNews Français</channel>
|
||||
<channel lang="fr" xmltv_id="EuronewsFrancais.fr" site_id="80040">EuroNews Français</channel>
|
||||
<channel lang="fr" xmltv_id="Eurosport1France.fr" site_id="80041">Eurosport 1 France</channel>
|
||||
<channel lang="fr" xmltv_id="Eurosport2France.fr" site_id="80042">Eurosport 2 France</channel>
|
||||
<channel lang="fr" xmltv_id="EvasionGuinee.gn" site_id="80398">Evasión Guinée</channel>
|
||||
|
|
|
@ -89,10 +89,10 @@
|
|||
<channel lang="fr" xmltv_id="Elmouritania.mr" site_id="80384">Elmouritania</channel>
|
||||
<channel lang="fr" xmltv_id="EMCITVAfrique.fr" site_id="80673">EMCI TV Afrique</channel>
|
||||
<channel lang="fr" xmltv_id="EquinoxeTV.cm" site_id="80170">Equinoxe TV</channel>
|
||||
<channel lang="fr" xmltv_id="ES1.fr" site_id="80667">ES1</channel>
|
||||
<channel lang="fr" xmltv_id="MGGTV.fr" site_id="80667">ES1</channel>
|
||||
<channel lang="fr" xmltv_id="EspaceTV.gn" site_id="80425">Espace TV</channel>
|
||||
<channel lang="fr" xmltv_id="ETeleBenin.bj" site_id="80421">E-Télé Benin</channel>
|
||||
<channel lang="fr" xmltv_id="EuroNewsFrancais.fr" site_id="80040">EuroNews Français</channel>
|
||||
<channel lang="fr" xmltv_id="EuronewsFrancais.fr" site_id="80040">EuroNews Français</channel>
|
||||
<channel lang="fr" xmltv_id="Eurosport1France.fr" site_id="80041">Eurosport 1 France</channel>
|
||||
<channel lang="fr" xmltv_id="Eurosport2France.fr" site_id="80042">Eurosport 2 France</channel>
|
||||
<channel lang="fr" xmltv_id="EvasionGuinee.gn" site_id="80398">Evasión Guinée</channel>
|
||||
|
|
|
@ -42,7 +42,7 @@
|
|||
<channel lang="fr" xmltv_id="EFrance.us" site_id="50036">E! France</channel>
|
||||
<channel lang="fr" xmltv_id="EnglishClubTV.uk" site_id="50374">English Club TV</channel>
|
||||
<channel lang="fr" xmltv_id="Equidia.fr" site_id="50037">Equidia</channel>
|
||||
<channel lang="fr" xmltv_id="ES1.fr" site_id="50667">ES1</channel>
|
||||
<channel lang="fr" xmltv_id="MGGTV.fr" site_id="50667">ES1</channel>
|
||||
<channel lang="fr" xmltv_id="ESPN2Caribbean.us" site_id="50290">ESPN 2 Caribbean</channel>
|
||||
<channel lang="fr" xmltv_id="ESPNCaribbean.us" site_id="50038">ESPN Caribbean</channel>
|
||||
<channel lang="fr" xmltv_id="ETV.gp" site_id="50286">ETV</channel>
|
||||
|
|
|
@ -42,7 +42,7 @@
|
|||
<channel lang="fr" xmltv_id="EFrance.us" site_id="50036">E! France</channel>
|
||||
<channel lang="fr" xmltv_id="EnglishClubTV.uk" site_id="50374">English Club TV</channel>
|
||||
<channel lang="fr" xmltv_id="Equidia.fr" site_id="50037">Equidia</channel>
|
||||
<channel lang="fr" xmltv_id="ES1.fr" site_id="50667">ES1</channel>
|
||||
<channel lang="fr" xmltv_id="MGGTV.fr" site_id="50667">ES1</channel>
|
||||
<channel lang="fr" xmltv_id="ESPN2Caribbean.us" site_id="50290">ESPN 2 Caribbean</channel>
|
||||
<channel lang="fr" xmltv_id="ESPNCaribbean.us" site_id="50038">ESPN Caribbean</channel>
|
||||
<channel lang="fr" xmltv_id="ETV.gp" site_id="50286">ETV</channel>
|
||||
|
|
|
@ -42,7 +42,7 @@
|
|||
<channel lang="fr" xmltv_id="EFrance.us" site_id="50036">E! France</channel>
|
||||
<channel lang="fr" xmltv_id="EnglishClubTV.uk" site_id="50374">English Club TV</channel>
|
||||
<channel lang="fr" xmltv_id="Equidia.fr" site_id="50037">Equidia</channel>
|
||||
<channel lang="fr" xmltv_id="ES1.fr" site_id="50667">ES1</channel>
|
||||
<channel lang="fr" xmltv_id="MGGTV.fr" site_id="50667">ES1</channel>
|
||||
<channel lang="fr" xmltv_id="ESPN2Caribbean.us" site_id="50290">ESPN 2 Caribbean</channel>
|
||||
<channel lang="fr" xmltv_id="ESPNCaribbean.us" site_id="50038">ESPN Caribbean</channel>
|
||||
<channel lang="fr" xmltv_id="ETV.gp" site_id="50286">ETV</channel>
|
||||
|
|
|
@ -42,7 +42,7 @@
|
|||
<channel lang="fr" xmltv_id="EFrance.us" site_id="50036">E! France</channel>
|
||||
<channel lang="fr" xmltv_id="EnglishClubTV.uk" site_id="50374">English Club TV</channel>
|
||||
<channel lang="fr" xmltv_id="Equidia.fr" site_id="50037">Equidia</channel>
|
||||
<channel lang="fr" xmltv_id="ES1.fr" site_id="50667">ES1</channel>
|
||||
<channel lang="fr" xmltv_id="MGGTV.fr" site_id="50667">ES1</channel>
|
||||
<channel lang="fr" xmltv_id="ESPN2Caribbean.us" site_id="50290">ESPN 2 Caribbean</channel>
|
||||
<channel lang="fr" xmltv_id="ESPNCaribbean.us" site_id="50038">ESPN Caribbean</channel>
|
||||
<channel lang="fr" xmltv_id="ETV.gp" site_id="50286">ETV</channel>
|
||||
|
|
|
@ -42,7 +42,7 @@
|
|||
<channel lang="fr" xmltv_id="EFrance.us" site_id="50036">E! France</channel>
|
||||
<channel lang="fr" xmltv_id="EnglishClubTV.uk" site_id="50374">English Club TV</channel>
|
||||
<channel lang="fr" xmltv_id="Equidia.fr" site_id="50037">Equidia</channel>
|
||||
<channel lang="fr" xmltv_id="ES1.fr" site_id="50667">ES1</channel>
|
||||
<channel lang="fr" xmltv_id="MGGTV.fr" site_id="50667">ES1</channel>
|
||||
<channel lang="fr" xmltv_id="ESPN2Caribbean.us" site_id="50290">ESPN 2 Caribbean</channel>
|
||||
<channel lang="fr" xmltv_id="ESPNCaribbean.us" site_id="50038">ESPN Caribbean</channel>
|
||||
<channel lang="fr" xmltv_id="ETV.gp" site_id="50286">ETV</channel>
|
||||
|
|
|
@ -33,7 +33,7 @@
|
|||
<channel lang="fr" xmltv_id="DorcelTVAfrica.nl" site_id="51702">Dorcel TV Africa</channel>
|
||||
<channel lang="fr" xmltv_id="EFrance.us" site_id="51036">E! France</channel>
|
||||
<channel lang="fr" xmltv_id="EnglishClubTV.uk" site_id="51374">English Club TV</channel>
|
||||
<channel lang="fr" xmltv_id="ES1.fr" site_id="51667">ES1</channel>
|
||||
<channel lang="fr" xmltv_id="MGGTV.fr" site_id="51667">ES1</channel>
|
||||
<channel lang="fr" xmltv_id="ESPN2Caribbean.us" site_id="51290">ESPN 2 Caribbean</channel>
|
||||
<channel lang="fr" xmltv_id="ESPNCaribbean.us" site_id="51038">ESPN Caribbean</channel>
|
||||
<channel lang="fr" xmltv_id="ETV.gp" site_id="51286">ETV</channel>
|
||||
|
|
83
sites/canalplus.com/canalplus.com.config.js
Normal file
83
sites/canalplus.com/canalplus.com.config.js
Normal file
|
@ -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
|
||||
}, [])
|
||||
}
|
101
sites/canalplus.com/canalplus.com.test.js
Normal file
101
sites/canalplus.com/canalplus.com.test.js
Normal file
|
@ -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)
|
||||
})
|
222
sites/canalplus.com/canalplus.com_fr.channels.xml
Normal file
222
sites/canalplus.com/canalplus.com_fr.channels.xml
Normal file
|
@ -0,0 +1,222 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<site site="canalplus.com">
|
||||
<channels>
|
||||
<channel lang="fr" xmltv_id="3sat.de" site_id="780">3 SAT</channel>
|
||||
<channel lang="fr" xmltv_id="6ter.fr" site_id="521">6TER</channel>
|
||||
<channel lang="fr" xmltv_id="AB1.fr" site_id="611">AB1</channel>
|
||||
<channel lang="fr" xmltv_id="Action.fr" site_id="504">ACTION</channel>
|
||||
<channel lang="fr" xmltv_id="AlJazeeraEnglish.qa" site_id="675">AL JAZEERA ENG</channel>
|
||||
<channel lang="fr" xmltv_id="AlticeStudio.fr" site_id="820">ALTICE STUDIO</channel>
|
||||
<channel lang="fr" xmltv_id="Animaux.fr" site_id="503">ANIMAUX</channel>
|
||||
<channel lang="fr" xmltv_id="ArirangWorld.kr" site_id="252">ARIRANG TV</channel>
|
||||
<channel lang="fr" xmltv_id="ARTEFrancais.fr" site_id="154">ARTE</channel>
|
||||
<channel lang="fr" xmltv_id="AstrocenterTV.fr" site_id="632">ASTROCENTER TV</channel>
|
||||
<channel lang="fr" xmltv_id="Automotolachaine.fr" site_id="612">AUTOMOTO LA CHAINE</channel>
|
||||
<channel lang="fr" xmltv_id="BBCWorldNewsEurope.uk" site_id="589">BBC WORLD NEWS</channel>
|
||||
<channel lang="fr" xmltv_id="BeInSports1France.qa" site_id="381">BEIN SPORTS 1</channel>
|
||||
<channel lang="fr" xmltv_id="BeInSports2France.qa" site_id="384">BEIN SPORTS 2</channel>
|
||||
<channel lang="fr" xmltv_id="BeInSports3France.qa" site_id="516">BEIN SPORTS 3</channel>
|
||||
<channel lang="fr" xmltv_id="BeInSportsMax10France.qa" site_id="605">BEIN SPORTS MAX 10</channel>
|
||||
<channel lang="fr" xmltv_id="BeInSportsMax4France.qa" site_id="596">BEIN SPORTS MAX 4</channel>
|
||||
<channel lang="fr" xmltv_id="BeInSportsMax5France.qa" site_id="597">BEIN SPORTS MAX 5</channel>
|
||||
<channel lang="fr" xmltv_id="BeInSportsMax6France.qa" site_id="598">BEIN SPORTS MAX 6</channel>
|
||||
<channel lang="fr" xmltv_id="BeInSportsMax7France.qa" site_id="599">BEIN SPORTS MAX 7</channel>
|
||||
<channel lang="fr" xmltv_id="BeInSportsMax8France.qa" site_id="603">BEIN SPORTS MAX 8</channel>
|
||||
<channel lang="fr" xmltv_id="BeInSportsMax9France.qa" site_id="604">BEIN SPORTS MAX 9</channel>
|
||||
<channel lang="fr" xmltv_id="BETFrance.us" site_id="628">BET</channel>
|
||||
<channel lang="fr" xmltv_id="BFMBusiness.fr" site_id="645">BFM BUSINESS</channel>
|
||||
<channel lang="fr" xmltv_id="BFMTV.fr" site_id="633">BFM TV</channel>
|
||||
<channel lang="fr" xmltv_id="BloombergTVEurope.us" site_id="47">BLOOMBERG TV</channel>
|
||||
<channel lang="fr" xmltv_id="BlueZoomD.ch" site_id="893">BLUE ZOOM</channel>
|
||||
<channel lang="fr" xmltv_id="BoingFrance.it" site_id="529">BOING</channel>
|
||||
<channel lang="fr" xmltv_id="BoomerangFrance.us" site_id="530">BOOMERANG</channel>
|
||||
<channel lang="fr" xmltv_id="BSmartTV.fr" site_id="849">BSMART TV</channel>
|
||||
<channel lang="fr" xmltv_id="C8.fr" site_id="450">C8</channel>
|
||||
<channel lang="fr" xmltv_id="CanalAlphaNE.ch" site_id="772">CANAL ALPHA NE</channel>
|
||||
<channel lang="fr" xmltv_id="CanalJ.fr" site_id="525">CANAL J</channel>
|
||||
<channel lang="fr" xmltv_id="CanalPlusCinemaFrance.fr" site_id="198">CANAL+CINEMA</channel>
|
||||
<channel lang="fr" xmltv_id="CanalPlusDecale.fr" site_id="257">CANAL+DECALE</channel>
|
||||
<channel lang="fr" xmltv_id="CanalPlusDocs.fr" site_id="899">CANAL+DOCS</channel>
|
||||
<channel lang="fr" xmltv_id="CanalPlusFormula1.fr" site_id="824">CANAL+FORMULA1</channel>
|
||||
<channel lang="fr" xmltv_id="CanalPlusFrance.fr" site_id="301">CANAL+</channel>
|
||||
<channel lang="fr" xmltv_id="CanalPlusGrandEcranFrance.fr" site_id="900">CANAL+GRAND ECRAN</channel>
|
||||
<channel lang="fr" xmltv_id="CanalPlusKids.fr" site_id="259">CANAL+KIDS</channel>
|
||||
<channel lang="fr" xmltv_id="CanalPlusMotoGp.fr" site_id="823">CANAL+MOTOGP</channel>
|
||||
<channel lang="fr" xmltv_id="CanalPlusPremierLeague.fr" site_id="815">CANAL+PREMIER LEAGUE</channel>
|
||||
<channel lang="fr" xmltv_id="CanalPlusSeriesFrance.fr" site_id="481">CANAL+SERIES</channel>
|
||||
<channel lang="fr" xmltv_id="CanalPlusSport2.fr" site_id="861">CANAL+ SPORT 2 (CH)</channel>
|
||||
<channel lang="fr" xmltv_id="CanalPlusSportFrance.fr" site_id="177">CANAL+SPORT</channel>
|
||||
<channel lang="fr" xmltv_id="CanalPlusTop14.fr" site_id="816">CANAL+TOP14</channel>
|
||||
<channel lang="fr" xmltv_id="CartoonNetworkFrance.us" site_id="502">CARTOON NETWORK</channel>
|
||||
<channel lang="fr" xmltv_id="ChassePeche.fr" site_id="681">CHASSE ET PECHE</channel>
|
||||
<channel lang="fr" xmltv_id="Cherie25.fr" site_id="440">CHERIE 25</channel>
|
||||
<channel lang="fr" xmltv_id="CinePlusClassic.fr" site_id="531">CINE+ CLASSIC</channel>
|
||||
<channel lang="fr" xmltv_id="CinePlusClub.fr" site_id="532">CINE+ CLUB</channel>
|
||||
<channel lang="fr" xmltv_id="CinePlusEmotion.fr" site_id="396">CINE+ EMOTION</channel>
|
||||
<channel lang="fr" xmltv_id="CinePlusFamiz.fr" site_id="533">CINE+ FAMIZ</channel>
|
||||
<channel lang="fr" xmltv_id="CinePlusFrisson.fr" site_id="398">CINE+ FRISSON</channel>
|
||||
<channel lang="fr" xmltv_id="CinePlusPremier.fr" site_id="322">CINE+ PREMIER</channel>
|
||||
<channel lang="fr" xmltv_id="CliqueTV.fr" site_id="665">CLIQUE TV</channel>
|
||||
<channel lang="fr" xmltv_id="CNBCEurope.us" site_id="64">CNBC</channel>
|
||||
<channel lang="fr" xmltv_id="CNews.fr" site_id="480">CNEWS</channel>
|
||||
<channel lang="fr" xmltv_id="CNNInternationalEurope.us" site_id="30">CNN INT.</channel>
|
||||
<channel lang="fr" xmltv_id="ColmaxTV.fr" site_id="643">COLMAX TV</channel>
|
||||
<channel lang="fr" xmltv_id="ComediePlus.fr" site_id="534">COMEDIE+</channel>
|
||||
<channel lang="fr" xmltv_id="ComedyCentralFrance.us" site_id="806">COMEDY CENTRAL</channel>
|
||||
<channel lang="fr" xmltv_id="CStar.fr" site_id="513">CSTAR</channel>
|
||||
<channel lang="fr" xmltv_id="CStarHitsFrance.fr" site_id="723">CSTAR HITS FRANCE</channel>
|
||||
<channel lang="fr" xmltv_id="DasErste.de" site_id="781">ARD DAS ERSTE</channel>
|
||||
<channel lang="fr" xmltv_id="DisneyChannelFrance.us" site_id="282">DISNEY CHANNEL</channel>
|
||||
<channel lang="fr" xmltv_id="DisneyChannelFrancePlus1.us" site_id="535">DISNEY CHANNEL+1</channel>
|
||||
<channel lang="fr" xmltv_id="DisneyCinema.us" site_id="340">DISNEY CINEMA</channel>
|
||||
<channel lang="fr" xmltv_id="DisneyJuniorFrance.us" site_id="274">DISNEY JUNIOR</channel>
|
||||
<channel lang="fr" xmltv_id="DorcelTV.nl" site_id="536">DORCEL TV</channel>
|
||||
<channel lang="fr" xmltv_id="DorcelXXX.nl" site_id="537">DORCEL XXX</channel>
|
||||
<channel lang="fr" xmltv_id="Equidia.fr" site_id="540">EQUIDIA</channel>
|
||||
<channel lang="fr" xmltv_id="EuronewsFrancais.fr" site_id="324">EURONEWS</channel>
|
||||
<channel lang="fr" xmltv_id="Eurosport1France.fr" site_id="101">EUROSPORT 1</channel>
|
||||
<channel lang="fr" xmltv_id="Eurosport2France.fr" site_id="436">EUROSPORT 2</channel>
|
||||
<channel lang="fr" xmltv_id="Eurosport3.fr" site_id="985">EUROSPORT 3</channel>
|
||||
<channel lang="fr" xmltv_id="Eurosport360HD1.fr" site_id="635">EUROSPORT 360 1</channel>
|
||||
<channel lang="fr" xmltv_id="Eurosport360HD2.fr" site_id="636">EUROSPORT 360 2</channel>
|
||||
<channel lang="fr" xmltv_id="Eurosport360HD3.fr" site_id="637">EUROSPORT 360 3</channel>
|
||||
<channel lang="fr" xmltv_id="Eurosport360HD4.fr" site_id="638">EUROSPORT 360 4</channel>
|
||||
<channel lang="fr" xmltv_id="Eurosport360HD5.fr" site_id="650">EUROSPORT 360 5</channel>
|
||||
<channel lang="fr" xmltv_id="Eurosport360HD6.fr" site_id="651">EUROSPORT 360 6</channel>
|
||||
<channel lang="fr" xmltv_id="Eurosport360HD7.fr" site_id="652">EUROSPORT 360 7</channel>
|
||||
<channel lang="fr" xmltv_id="Eurosport360HD8.fr" site_id="653">EUROSPORT 360 8</channel>
|
||||
<channel lang="fr" xmltv_id="Eurosport4.fr" site_id="986">EUROSPORT 4</channel>
|
||||
<channel lang="fr" xmltv_id="Eurosport5.fr" site_id="987">EUROSPORT 5</channel>
|
||||
<channel lang="fr" xmltv_id="FootPlus.fr" site_id="542">FOOT+ 24/24</channel>
|
||||
<channel lang="fr" xmltv_id="France2.fr" site_id="26">FRANCE 2</channel>
|
||||
<channel lang="fr" xmltv_id="France24English.fr" site_id="311">FRANCE 24 ENG</channel>
|
||||
<channel lang="fr" xmltv_id="France24Francais.fr" site_id="310">FRANCE 24</channel>
|
||||
<channel lang="fr" xmltv_id="France3.fr" site_id="543">FRANCE 3</channel>
|
||||
<channel lang="fr" xmltv_id="France3Alpes.fr" site_id="926">F3 ALPES</channel>
|
||||
<channel lang="fr" xmltv_id="France3Alsace.fr" site_id="941">F3 ALSACE</channel>
|
||||
<channel lang="fr" xmltv_id="France3Aquitaine.fr" site_id="922">F3 AQUITAINE</channel>
|
||||
<channel lang="fr" xmltv_id="France3Auvergne.fr" site_id="924">F3 AUVERGNE</channel>
|
||||
<channel lang="fr" xmltv_id="France3BasseNormandie.fr" site_id="923">F3 BNORMANDIE</channel>
|
||||
<channel lang="fr" xmltv_id="France3Bourgogne.fr" site_id="925">F3 BOURGOGNE</channel>
|
||||
<channel lang="fr" xmltv_id="France3Bretagne.fr" site_id="939">F3 BRETAGNE</channel>
|
||||
<channel lang="fr" xmltv_id="France3CentreValdeLoire.fr" site_id="935">F3 CENTRE</channel>
|
||||
<channel lang="fr" xmltv_id="France3ChampagneArdenne.fr" site_id="938">F3 CHAMP ARDENNE</channel>
|
||||
<channel lang="fr" xmltv_id="France3CorseViaStella.fr" site_id="943">F3 CORSEVIASTELLA</channel>
|
||||
<channel lang="fr" xmltv_id="France3CotedAzur.fr" site_id="934">F3 COTE D'AZUR</channel>
|
||||
<channel lang="fr" xmltv_id="France3FrancheComte.fr" site_id="921">F3 FRANCHE COMTE</channel>
|
||||
<channel lang="fr" xmltv_id="France3HauteNormandie.fr" site_id="940">F3 HNORMANDIE</channel>
|
||||
<channel lang="fr" xmltv_id="France3LanguedocRoussillon.fr" site_id="931">F3 LANGUEDOCROU</channel>
|
||||
<channel lang="fr" xmltv_id="France3Limousin.fr" site_id="928">F3 LIMOUSIN</channel>
|
||||
<channel lang="fr" xmltv_id="France3Lorraine.fr" site_id="932">F3 LORRAINE</channel>
|
||||
<channel lang="fr" xmltv_id="France3MidiPyrenees.fr" site_id="942">F3 MIDI PYRENEES</channel>
|
||||
<channel lang="fr" xmltv_id="France3NordPasdeCalais.fr" site_id="927">F3 NORD PDC</channel>
|
||||
<channel lang="fr" xmltv_id="France3NouvelleAquitaine.fr" site_id="998">F3 NOUVELLE AQUITAINE</channel>
|
||||
<channel lang="fr" xmltv_id="France3ParisIledeFrance.fr" site_id="936">F3 PARIS IDF</channel>
|
||||
<channel lang="fr" xmltv_id="France3PaysdelaLoire.fr" site_id="933">F3 PAYS DE LA LOIRE</channel>
|
||||
<channel lang="fr" xmltv_id="France3Picardie.fr" site_id="920">F3 PICARDIE</channel>
|
||||
<channel lang="fr" xmltv_id="France3PoitouCharentes.fr" site_id="937">F3 POITOUCHAR</channel>
|
||||
<channel lang="fr" xmltv_id="France3ProvenceAlpes.fr" site_id="930">F3 PROV ALPES</channel>
|
||||
<channel lang="fr" xmltv_id="France3RhoneAlpes.fr" site_id="929">F3 RHONE ALPES</channel>
|
||||
<channel lang="fr" xmltv_id="France4.fr" site_id="544">FRANCE 4</channel>
|
||||
<channel lang="fr" xmltv_id="France5.fr" site_id="545">FRANCE 5</channel>
|
||||
<channel lang="fr" xmltv_id="Franceinfo.fr" site_id="670">FRANCEINFO:</channel>
|
||||
<channel lang="fr" xmltv_id="GameOne.fr" site_id="592">GAME ONE</channel>
|
||||
<channel lang="fr" xmltv_id="GolfPlus.fr" site_id="378">GOLF+</channel>
|
||||
<channel lang="fr" xmltv_id="Gulli.fr" site_id="549">GULLI</channel>
|
||||
<channel lang="fr" xmltv_id="HistoireTV.fr" site_id="550">HISTOIRE TV</channel>
|
||||
<channel lang="fr" xmltv_id="I24NewsFrancais.il" site_id="362">I24 NEWS</channel>
|
||||
<channel lang="fr" xmltv_id="InfoSportPlus.fr" site_id="551">INFOSPORT+</channel>
|
||||
<channel lang="fr" xmltv_id="JacquieMichelTV.fr" site_id="850">JACQUIE & MICHEL TV</channel>
|
||||
<channel lang="fr" xmltv_id="JOne.fr" site_id="484">J-ONE</channel>
|
||||
<channel lang="fr" xmltv_id="LaChaineMeteo.fr" site_id="552">LA CHAINE METEO</channel>
|
||||
<channel lang="fr" xmltv_id="LCI.fr" site_id="553">LCI</channel>
|
||||
<channel lang="fr" xmltv_id="LCPAssembleeNationale.fr" site_id="554">LCP</channel>
|
||||
<channel lang="fr" xmltv_id="LEquipe.fr" site_id="451">L'EQUIPE</channel>
|
||||
<channel lang="fr" xmltv_id="LFMTV.ch" site_id="879">LFM TV</channel>
|
||||
<channel lang="fr" xmltv_id="M6.fr" site_id="313">M6</channel>
|
||||
<channel lang="fr" xmltv_id="M6Music.fr" site_id="352">M6 MUSIC</channel>
|
||||
<channel lang="fr" xmltv_id="Mangas.fr" site_id="613">MANGAS</channel>
|
||||
<channel lang="fr" xmltv_id="ManX.be" site_id="672">MAN X</channel>
|
||||
<channel lang="fr" xmltv_id="MCMFrance.fr" site_id="556">MCM</channel>
|
||||
<channel lang="fr" xmltv_id="Melody.fr" site_id="580">MELODY</channel>
|
||||
<channel lang="fr" xmltv_id="Mezzo.fr" site_id="560">MEZZO</channel>
|
||||
<channel lang="fr" xmltv_id="MezzoLiveHD.fr" site_id="268">MEZZO LIVE</channel>
|
||||
<channel lang="fr" xmltv_id="MGGTV.fr" site_id="819">MGG TV</channel>
|
||||
<channel lang="fr" xmltv_id="MTVFrance.us" site_id="470">MTV</channel>
|
||||
<channel lang="fr" xmltv_id="MTVHitsFrance.us" site_id="629">MTV HITS</channel>
|
||||
<channel lang="fr" xmltv_id="MultiSports1.fr" site_id="562">MULTISPORTS 1</channel>
|
||||
<channel lang="fr" xmltv_id="MultiSports2.fr" site_id="563">MULTISPORTS 2</channel>
|
||||
<channel lang="fr" xmltv_id="MultiSports3.fr" site_id="564">MULTISPORTS 3</channel>
|
||||
<channel lang="fr" xmltv_id="MultiSports4.fr" site_id="565">MULTISPORTS 4</channel>
|
||||
<channel lang="fr" xmltv_id="MultiSports5.fr" site_id="566">MULTISPORTS 5</channel>
|
||||
<channel lang="fr" xmltv_id="MultiSports6.fr" site_id="567">MULTISPORTS 6</channel>
|
||||
<channel lang="fr" xmltv_id="Museum.fr" site_id="678">MUSEUM</channel>
|
||||
<channel lang="fr" xmltv_id="MyZenTV.fr" site_id="656">MY ZEN TV</channel>
|
||||
<channel lang="fr" xmltv_id="NationalGeographicFrance.us" site_id="302">NATIONAL GEO</channel>
|
||||
<channel lang="fr" xmltv_id="NationalGeographicWildFrance.us" site_id="290">NATIONAL GEOGRAPHIC WILD</channel>
|
||||
<channel lang="fr" xmltv_id="NHKWorldJapan.jp" site_id="654">NHK WORLD-JAPAN</channel>
|
||||
<channel lang="fr" xmltv_id="NickelodeonFrance.us" site_id="591">NICKELODEON</channel>
|
||||
<channel lang="fr" xmltv_id="NickelodeonJuniorFrance.us" site_id="593">NICKELODEON JUNIOR</channel>
|
||||
<channel lang="fr" xmltv_id="NickelodeonTeen.us" site_id="518">NICKELODEON TEEN</channel>
|
||||
<channel lang="fr" xmltv_id="NollywoodTV.fr" site_id="527">NOLLYWOOD TV</channel>
|
||||
<channel lang="fr" xmltv_id="NonStopPeopleFrance.fr" site_id="434">NON STOP PEOPLE</channel>
|
||||
<channel lang="fr" xmltv_id="NovelasTV.fr" site_id="693">NOVELAS TV</channel>
|
||||
<channel lang="fr" xmltv_id="NRJ12.fr" site_id="568">NRJ 12</channel>
|
||||
<channel lang="fr" xmltv_id="NRJHits.fr" site_id="569">NRJ HITS</channel>
|
||||
<channel lang="fr" xmltv_id="OCSchoc.fr" site_id="466">OCS CHOC</channel>
|
||||
<channel lang="fr" xmltv_id="OCSCity.fr" site_id="467">OCS CITY</channel>
|
||||
<channel lang="fr" xmltv_id="OCSgeants.fr" site_id="468">OCS GEANTS</channel>
|
||||
<channel lang="fr" xmltv_id="OCSmax.fr" site_id="372">OCS MAX</channel>
|
||||
<channel lang="fr" xmltv_id="OlympiaTV.fr" site_id="813">OLYMPIA TV</channel>
|
||||
<channel lang="fr" xmltv_id="OneTV.ch" site_id="880">ONE TV</channel>
|
||||
<channel lang="fr" xmltv_id="ORF1.at" site_id="783">ORF 1</channel>
|
||||
<channel lang="fr" xmltv_id="ParamountChannelFrance.us" site_id="487">PARAMOUNT CHANNEL</channel>
|
||||
<channel lang="fr" xmltv_id="ParisPremiere.fr" site_id="294">PARIS PREMIERE</channel>
|
||||
<channel lang="fr" xmltv_id="PenthouseBlack.us" site_id="686">PENTHOUSE BLACK</channel>
|
||||
<channel lang="fr" xmltv_id="PenthouseGold.us" site_id="167">PENTHOUSE</channel>
|
||||
<channel lang="fr" xmltv_id="PinkX.fr" site_id="575">PINK X</channel>
|
||||
<channel lang="fr" xmltv_id="PiwiPlus.fr" site_id="576">PIWI+</channel>
|
||||
<channel lang="fr" xmltv_id="PlanetePlus.fr" site_id="270">PLANETE+</channel>
|
||||
<channel lang="fr" xmltv_id="PlanetePlusAE.fr" site_id="588">PLANETE+AVENTURE</channel>
|
||||
<channel lang="fr" xmltv_id="PlanetePlusCI.fr" site_id="587">PLANETE+CRIME</channel>
|
||||
<channel lang="fr" xmltv_id="PolarPlus.fr" site_id="692">POLAR+</channel>
|
||||
<channel lang="fr" xmltv_id="Rai1.it" site_id="782">RAI UNO</channel>
|
||||
<channel lang="fr" xmltv_id="RFMTV.fr" site_id="557">RFM TV</channel>
|
||||
<channel lang="fr" xmltv_id="RMCDecouverte.fr" site_id="595">RMC DECOUVERTE</channel>
|
||||
<channel lang="fr" xmltv_id="RMCSport1.fr" site_id="732">RMC SPORT 1</channel>
|
||||
<channel lang="fr" xmltv_id="RMCSport2.fr" site_id="733">RMC SPORT 2</channel>
|
||||
<channel lang="fr" xmltv_id="RMCStory.fr" site_id="571">RMC STORY</channel>
|
||||
<channel lang="fr" xmltv_id="RougeTV.ch" site_id="878">ROUGE TV</channel>
|
||||
<channel lang="fr" xmltv_id="RTFrance.ru" site_id="479">RT FRANCE</channel>
|
||||
<channel lang="fr" xmltv_id="RTL9.lu" site_id="505">RTL9</channel>
|
||||
<channel lang="fr" xmltv_id="ScienceVieTV.fr" site_id="614">SCIENCE ET VIE TV</channel>
|
||||
<channel lang="fr" xmltv_id="Seasons.fr" site_id="577">SEASONS</channel>
|
||||
<channel lang="fr" xmltv_id="SerieClub.fr" site_id="356">SERIE CLUB</channel>
|
||||
<channel lang="fr" xmltv_id="SRF1.ch" site_id="778">SRF 1</channel>
|
||||
<channel lang="fr" xmltv_id="StingrayClassica.ca" site_id="165">CLASSICA</channel>
|
||||
<channel lang="fr" xmltv_id="StingrayDjazz.ca" site_id="407">DJAZZ</channel>
|
||||
<channel lang="fr" xmltv_id="TCMCinema.us" site_id="374">TCM CINEMA</channel>
|
||||
<channel lang="fr" xmltv_id="TeleBielingue.ch" site_id="775">TELEBIELINGUE</channel>
|
||||
<channel lang="fr" xmltv_id="TeleToonPlus.fr" site_id="581">TELETOON+</channel>
|
||||
<channel lang="fr" xmltv_id="TeleToonPlus1.fr" site_id="582">TELETOON+1</channel>
|
||||
<channel lang="fr" xmltv_id="Teva.fr" site_id="292">TEVA</channel>
|
||||
<channel lang="fr" xmltv_id="TF1.fr" site_id="312">TF1</channel>
|
||||
<channel lang="fr" xmltv_id="TF1SeriesFilms.fr" site_id="526">TF1 SERIES FILMS</channel>
|
||||
<channel lang="fr" xmltv_id="TFX.fr" site_id="570">TFX</channel>
|
||||
<channel lang="fr" xmltv_id="Tiji.fr" site_id="583">TIJI</channel>
|
||||
<channel lang="fr" xmltv_id="TMC.fr" site_id="584">TMC</channel>
|
||||
<channel lang="fr" xmltv_id="ToonamiFrance.us" site_id="683">TOONAMI</channel>
|
||||
<channel lang="fr" xmltv_id="ToutelHistoire.fr" site_id="620">TOUTE L'HISTOIRE</channel>
|
||||
<channel lang="fr" xmltv_id="TraceAfricaFrancais.fr" site_id="674">TRACE AFRICA</channel>
|
||||
<channel lang="fr" xmltv_id="TraceLatina.fr" site_id="784">TRACE LATINA</channel>
|
||||
<channel lang="fr" xmltv_id="TraceUrban.fr" site_id="585">TRACE URBAN</channel>
|
||||
<channel lang="fr" xmltv_id="TV5MondeFranceBelgiqueSuisse.fr" site_id="520">TV5 MONDE</channel>
|
||||
<channel lang="fr" xmltv_id="TVBreizh.fr" site_id="586">TV BREIZH</channel>
|
||||
<channel lang="fr" xmltv_id="UshuaiaTV.fr" site_id="142">USHUAIA TV</channel>
|
||||
<channel lang="fr" xmltv_id="ViceTVFrance.us" site_id="677">VICE TV</channel>
|
||||
<channel lang="fr" xmltv_id="Vixen.us" site_id="547">VIXEN</channel>
|
||||
<channel lang="fr" xmltv_id="W9.fr" site_id="296">W9</channel>
|
||||
<channel lang="fr" xmltv_id="WarnerTVFrance.us" site_id="694">WARNER TV</channel>
|
||||
<channel lang="fr" xmltv_id="XXL.fr" site_id="616">XXL</channel>
|
||||
</channels>
|
||||
</site>
|
|
@ -37,6 +37,10 @@
|
|||
<channel lang="fr" xmltv_id="CanalPlusDecale.fr" site_id="30">Canal + Décalé</channel>
|
||||
<channel lang="fr" xmltv_id="CanalPlusDocs.fr" site_id="3347">Canal + Docs</channel>
|
||||
<channel lang="fr" xmltv_id="CanalPlusFrance.fr" site_id="34">Canal + France</channel>
|
||||
<channel lang="fr" xmltv_id="CanalPlusGrandEcranFrance.fr" site_id="3349">Canal + Grand Ecran</channel>
|
||||
<channel lang="fr" xmltv_id="CanalPlusKids.fr" site_id="3348">Canal + Kids</channel>
|
||||
<channel lang="fr" xmltv_id="CanalPlusSeriesFrance.fr" site_id="1563">Canal + Séries</channel>
|
||||
<channel lang="fr" xmltv_id="CanalPlusSportFrance.fr" site_id="35">Canal + Sport</channel>
|
||||
<channel lang="fr" xmltv_id="CanalQ.pt" site_id="2046">Canal Q</channel>
|
||||
<channel lang="fr" xmltv_id="CartoonNetworkFrance.us" site_id="36">Cartoon Network France</channel>
|
||||
<channel lang="fr" xmltv_id="ChassePeche.fr" site_id="38">Chasse & Pêche</channel>
|
||||
|
@ -63,9 +67,9 @@
|
|||
<channel lang="fr" xmltv_id="DisneyJuniorFrance.us" site_id="300">Disney Junior France</channel>
|
||||
<channel lang="fr" xmltv_id="DWEnglish.de" site_id="61">DW English</channel>
|
||||
<channel lang="fr" xmltv_id="Equidia.fr" site_id="64">Equidia</channel>
|
||||
<channel lang="fr" xmltv_id="ES1.fr" site_id="2353">ES1</channel>
|
||||
<channel lang="fr" xmltv_id="MGGTV.fr" site_id="2353">ES1</channel>
|
||||
<channel lang="fr" xmltv_id="Eurochannel.us" site_id="1190">Eurochannel</channel>
|
||||
<channel lang="fr" xmltv_id="EuroNewsFrancais.fr" site_id="140">EuroNews Français</channel>
|
||||
<channel lang="fr" xmltv_id="EuronewsFrancais.fr" site_id="140">EuroNews Français</channel>
|
||||
<channel lang="fr" xmltv_id="FashionTVEurope.fr" site_id="1996">FashionTV Europe</channel>
|
||||
<channel lang="fr" xmltv_id="France2.fr" site_id="4">France 2</channel>
|
||||
<channel lang="fr" xmltv_id="France3.fr" site_id="80">France 3</channel>
|
||||
|
@ -192,4 +196,4 @@
|
|||
<channel lang="fr" xmltv_id="ZDF.de" site_id="219">ZDF</channel>
|
||||
<channel lang="fr" xmltv_id="ZDFNeo.de" site_id="973">ZDF Neo</channel>
|
||||
</channels>
|
||||
</site>
|
||||
</site>
|
||||
|
|
104
sites/clickthecity.com/clickthecity.com.config.js
Normal file
104
sites/clickthecity.com/clickthecity.com.config.js
Normal file
|
@ -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()
|
||||
}
|
72
sites/clickthecity.com/clickthecity.com.test.js
Normal file
72
sites/clickthecity.com/clickthecity.com.test.js
Normal file
|
@ -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 = `<!doctypehtml><html class=html lang=en-US prefix="og: https://ogp.me/ns#"><body class="aa-prefix-click- content-right-sidebar default-breakpoint dropdown-mobile elementor-default elementor-kit-114471 elementor-page-62235 elementor-template-full-width has-breadcrumbs has-sidebar network-template-default oceanwp-theme page-header-disabled postid-62183 single single-network wp-custom-logo wp-embed-responsive"itemscope=itemscope itemtype=https://schema.org/WebPage><div class="clr site"id=outer-wrap><a class="screen-reader-text skip-link"href=#main>Skip to content</a><div class=clr id=wrap><main class="clr site-main"id=main role=main><div class="category-tv elementor elementor-62235 elementor-location-single entry has-media has-post-thumbnail hentry network post-62183 status-publish type-network"data-elementor-id=62235 data-elementor-settings=[] data-elementor-type=single><div class=elementor-section-wrap><section class="elementor-element elementor-section-height-default elementor-section-height-default elementor-element-9dc0219 elementor-section elementor-section-boxed elementor-top-section"data-element_type=section data-id=9dc0219><div class="elementor-column-gap-default elementor-container"><div class=elementor-row><div class="elementor-element elementor-col-50 elementor-column elementor-element-b6192ca elementor-top-column"data-element_type=column data-id=b6192ca data-settings='{"background_background":"classic"}'><div class="elementor-column-wrap elementor-element-populated"><div class=elementor-widget-wrap><div class="elementor-element elementor-element-c4989ed elementor-widget elementor-widget-shortcode"data-element_type=widget data-id=c4989ed data-widget_type=shortcode.default><div class=elementor-widget-container><div class=elementor-shortcode><form class=form-inline id=frmTV method=POST name=frmTV role=form><div class=w-100><table class="card d-table overflow-hidden rounded shadow table table-bordered table-striped"id=tvlistings><tr class="bg-dark text-light"><th colspan=2>Tomorrow, March 05<tr><td class=cTme width=100>12:00 am<td class="cPrg showlnkcon"><a class="font-weight-bold text-dark"href="/tv/tvshow.php?id=109793&starttime=12%3A00+AM&endtime=1%3A00+AM"name=0>CCF Worship Service</a><tr><td class=cTme width=100>06:30 am<td class="cPrg showlnkcon"><a class="font-weight-bold text-dark"href="/tv/tvshow.php?id=94697&starttime=6%3A30+AM&endtime=7%3A30+AM"name=1>Word Of God</a><tr class="bg-dark text-light"><th colspan="2">Tonight, March 05</th></tr><tr> <td class="cTme">08:00 pm</td><td class="cPrg showlnkcon"> <a class="font-weight-bold text-dark" name="10" href="/tv/tvshow.php?id=113538&starttime=8%3A00+PM&endtime=9%3A00+PM">Rated Korina S2 </a> </td></tr><tr class="bg-dark text-light"><th colspan=2>Sunday, March 06<tr><td class=cTme>12:00 am<td class="cPrg showlnkcon"><a class="font-weight-bold text-dark"href="/tv/tvshow.php?id=114754&starttime=12%3A00+AM&endtime=3%3A30+AM"name=13>2021 PBA Governor's Cup</a></table></div></form></div></div></div></div></div></div></div></div></section></div></div></main></div></div>`
|
||||
|
||||
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: `<!DOCTYPE html><html class="html" lang="en-US" prefix="og: https://ogp.me/ns#"><head></head><body></body></html>`
|
||||
})
|
||||
expect(result).toMatchObject([])
|
||||
})
|
39
sites/clickthecity.com/clickthecity.com_ph.channels.xml
Normal file
39
sites/clickthecity.com/clickthecity.com_ph.channels.xml
Normal file
|
@ -0,0 +1,39 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<site site="clickthecity.com">
|
||||
<channels>
|
||||
<channel lang="en" xmltv_id="A2ZChannel11.ph" site_id="a2z-channel-11">A2Z Channel 11</channel>
|
||||
<channel lang="en" xmltv_id="ANC.ph" site_id="anc">ANC</channel>
|
||||
<channel lang="en" xmltv_id="AnimaxPhilippines.jp" site_id="animax">Animax</channel>
|
||||
<channel lang="en" xmltv_id="AXNPhilippines.us" site_id="axn">AXN</channel>
|
||||
<channel lang="en" xmltv_id="CelestialMoviesPinoy.hk" site_id="celestial-movies-pinoy">Celestial Movies Pinoy</channel>
|
||||
<channel lang="en" xmltv_id="CinemaOneGlobal.ph" site_id="cinema-one">Cinema One</channel>
|
||||
<channel lang="en" xmltv_id="CinemaxAsia.us" site_id="cinemax">Cinemax</channel>
|
||||
<channel lang="en" xmltv_id="CNNPhilippines.us" site_id="cnn-philippines">CNN Philippines</channel>
|
||||
<channel lang="en" xmltv_id="CrimePlusInvestigationAsia.us" site_id="crime-investigation">Crime & Investigation</channel>
|
||||
<channel lang="en" xmltv_id="IBC13.ph" site_id="ibc-tv-13">IBC 13</channel>
|
||||
<channel lang="en" xmltv_id="ETC.ph" site_id="etc">ETC</channel>
|
||||
<channel lang="en" xmltv_id="Gem.in" site_id="gem">GEM</channel>
|
||||
<channel lang="en" xmltv_id="GMANews.ph" site_id="gma-news-tv">GMA News TV</channel>
|
||||
<channel lang="en" xmltv_id="GMATV.ph" site_id="gma">GMA</channel>
|
||||
<channel lang="en" xmltv_id="GTV.ph" site_id="gtv">GTV</channel>
|
||||
<channel lang="en" xmltv_id="HBOAsia.us" site_id="hbo-asia">HBO Asia</channel>
|
||||
<channel lang="en" xmltv_id="HistoryPhilippines.us" site_id="history">History</channel>
|
||||
<channel lang="en" xmltv_id="JeepneyTV.ph" site_id="jeepney-tv">Jeepney TV</channel>
|
||||
<channel lang="en" xmltv_id="KapamilyaChannel.ph" site_id="kapamilya-channel">Kapamilya Channel</channel>
|
||||
<channel lang="en" xmltv_id="KMoviesPinoy.ph" site_id="k-movies-pinoy">K Movies Pinoy</channel>
|
||||
<channel lang="en" xmltv_id="Liga.ph" site_id="liga">Liga</channel>
|
||||
<channel lang="en" xmltv_id="MetroChannel.ph" site_id="metro-channel">Metro Channel</channel>
|
||||
<channel lang="en" xmltv_id="MyxPhilippines.ph" site_id="myx">MYX</channel>
|
||||
<channel lang="en" xmltv_id="NationalGeographicPhilippines.us" site_id="national-geographic">National Geographic</channel>
|
||||
<channel lang="en" xmltv_id="Net25.ph" site_id="net-25">Net 25</channel>
|
||||
<channel lang="en" xmltv_id="NickelodeonPhilippines.us" site_id="nickelodeon">Nickelodeon</channel>
|
||||
<channel lang="en" xmltv_id="PBO.ph" site_id="pbo">PBO</channel>
|
||||
<channel lang="en" xmltv_id="PTV.ph" site_id="ptv">PTV</channel>
|
||||
<channel lang="en" xmltv_id="RockEntertainment.sg" site_id="rock-entertainment">Rock Entertainment</channel>
|
||||
<channel lang="en" xmltv_id="RockExtreme.sg" site_id="rock-extreme">Rock Extreme</channel>
|
||||
<channel lang="en" xmltv_id="TeleNovelaChannel.ph" site_id="telenovela-channel">TeleNovela Channel</channel>
|
||||
<channel lang="en" xmltv_id="TMC.ph" site_id="tagalized-movie-channel">Tagalized Movie Channel</channel>
|
||||
<channel lang="en" xmltv_id="TV5.ph" site_id="tv5">TV5</channel>
|
||||
<channel lang="en" xmltv_id="VivaCinema.ph" site_id="viva-tv">VIVA Cinema</channel>
|
||||
</channels>
|
||||
</site>
|
|
@ -32,7 +32,7 @@
|
|||
<channel lang="es" xmltv_id="ESPN2AmericaLatina.us" site_id="ESPN 2">ESPN 2 América Latina</channel>
|
||||
<channel lang="es" xmltv_id="ESPN3AmericaLatina.us" site_id="ESPN 3">ESPN 3 América Latina</channel>
|
||||
<channel lang="es" xmltv_id="ESPNAmericaLatina.us" site_id="ESPN">ESPN América Latina</channel>
|
||||
<channel lang="es" xmltv_id="EuroNewsEspanol.fr" site_id="EURONEWS">EuroNews Español</channel>
|
||||
<channel lang="es" xmltv_id="EuronewsEspanol.fr" site_id="EURONEWS">EuroNews Español</channel>
|
||||
<channel lang="es" xmltv_id="EuropaEuropa.uk" site_id="EUROPA EUROPA">Europa Europa</channel>
|
||||
<channel lang="es" xmltv_id="EWTNEspanaLatinoamerica.us" site_id="EWTN">EWTN España - Latinoamérica</channel>
|
||||
<channel lang="es" xmltv_id="FoxSports2LatinAmerica.us" site_id="Fox Sport 2">Fox Sports 2 Latin America</channel>
|
||||
|
|
|
@ -44,8 +44,8 @@
|
|||
<channel lang="el" xmltv_id="ERT2.gr" site_id="ert2">ERT 2</channel>
|
||||
<channel lang="el" xmltv_id="ERT3.gr" site_id="ert3">ERT 3</channel>
|
||||
<channel lang="el" xmltv_id="ERTWorld.gr" site_id="ert-world">ERT World</channel>
|
||||
<channel lang="el" xmltv_id="EuroNewsEllinika.fr" site_id="euronews">EuroNews Ellinika</channel>
|
||||
<channel lang="el" xmltv_id="EuroNewsEnglish.fr" site_id="euronews-english">EuroNews English</channel>
|
||||
<channel lang="el" xmltv_id="EuronewsEllinika.fr" site_id="euronews">EuroNews Ellinika</channel>
|
||||
<channel lang="el" xmltv_id="EuronewsEnglish.fr" site_id="euronews-english">EuroNews English</channel>
|
||||
<channel lang="el" xmltv_id="FashionTVEurope.fr" site_id="fashion-tv">FashionTV Europe</channel>
|
||||
<channel lang="el" xmltv_id="FoxGreece.us" site_id="fox-hd">Fox Greece</channel>
|
||||
<channel lang="el" xmltv_id="FoxLifeGreece.us" site_id="foxlife-hd">Fox Life Greece</channel>
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
})
|
||||
})
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<site site="delta.nl">
|
||||
<channels>
|
||||
<channel lang="nl" xmltv_id="3sat.de" site_id="3016">3sat</channel>
|
||||
<channel lang="nl" xmltv_id="24KitchenNederland.us" site_id="19">24 Kitchen Nederland</channel>
|
||||
<channel lang="nl" xmltv_id="100NLTV.nl" site_id="34">100% NL TV</channel>
|
||||
<channel lang="nl" xmltv_id="192TV.nl" site_id="98">192 TV</channel>
|
||||
<channel lang="nl" xmltv_id="24KitchenNederland.us" site_id="19">24 Kitchen Nederland</channel>
|
||||
<channel lang="nl" xmltv_id="3sat.de" site_id="3016">3sat</channel>
|
||||
<channel lang="nl" xmltv_id="AAVISIE.nl" site_id="10000">AAVISIE</channel>
|
||||
<channel lang="nl" xmltv_id="AlbrandswaardTV.nl" site_id="3052">Albrandswaard TV</channel>
|
||||
<channel lang="nl" xmltv_id="AlJazeeraEnglish.qa" site_id="3076">Aljazeera English</channel>
|
||||
|
@ -54,7 +54,7 @@
|
|||
<channel lang="nl" xmltv_id="ESPN3Nederland.us" site_id="3038">ESPN 3 Nederland</channel>
|
||||
<channel lang="nl" xmltv_id="ESPN4Nederland.us" site_id="3039">ESPN 4 Nederland</channel>
|
||||
<channel lang="nl" xmltv_id="ESPNNederland.us" site_id="3036">ESPN Nederland</channel>
|
||||
<channel lang="nl" xmltv_id="EuroNewsEnglish.fr" site_id="64">EuroNews English</channel>
|
||||
<channel lang="nl" xmltv_id="EuronewsEnglish.fr" site_id="64">EuroNews English</channel>
|
||||
<channel lang="nl" xmltv_id="Eurosport1.fr" site_id="26">Eurosport 1</channel>
|
||||
<channel lang="nl" xmltv_id="Eurosport2.fr" site_id="32">Eurosport 2</channel>
|
||||
<channel lang="nl" xmltv_id="ExtremeSportsChannel.nl" site_id="93">Extreme Sports Channel</channel>
|
||||
|
@ -69,8 +69,8 @@
|
|||
<channel lang="nl" xmltv_id="FilmBoxNederland.us" site_id="10017">FilmBox Nederland</channel>
|
||||
<channel lang="nl" xmltv_id="FoxNL.us" site_id="12">Fox NL</channel>
|
||||
<channel lang="nl" xmltv_id="France2.fr" site_id="50">France 2</channel>
|
||||
<channel lang="nl" xmltv_id="France3.fr" site_id="3120">France 3</channel>
|
||||
<channel lang="nl" xmltv_id="France24Francais.fr" site_id="3021">France 24 Français</channel>
|
||||
<channel lang="nl" xmltv_id="France3.fr" site_id="3120">France 3</channel>
|
||||
<channel lang="nl" xmltv_id="GemeenteWestlandTV.nl" site_id="3145">Gemeente Westland TV</channel>
|
||||
<channel lang="nl" xmltv_id="GL8.nl" site_id="3056">GL8</channel>
|
||||
<channel lang="nl" xmltv_id="GOTV.nl" site_id="71">GO-TV</channel>
|
||||
|
@ -82,7 +82,7 @@
|
|||
<channel lang="nl" xmltv_id="HustlerTVEurope.us" site_id="3044">Hustler TV Europe</channel>
|
||||
<channel lang="nl" xmltv_id="IdeaalTV.nl" site_id="3174">Ideaal TV</channel>
|
||||
<channel lang="nl" xmltv_id="IjsselmondTV.nl" site_id="3161">Ijsselmond TV</channel>
|
||||
<channel lang="nl" xmltv_id="InsightHD.nl" site_id="3149">Insight HD</channel>
|
||||
<channel lang="nl" xmltv_id="InsightTV.nl" site_id="3149">Insight TV</channel>
|
||||
<channel lang="nl" xmltv_id="InvestigationDiscoveryEurope.us" site_id="16">Investigation Discovery Europe</channel>
|
||||
<channel lang="nl" xmltv_id="JenZ.nl" site_id="17">JenZ</channel>
|
||||
<channel lang="nl" xmltv_id="KabelEinsDeutschland.de" site_id="3018">Kabel Eins Deutschland</channel>
|
||||
|
@ -166,6 +166,7 @@
|
|||
<channel lang="nl" xmltv_id="RTVArnhemTV.nl" site_id="3183">RTV Arnhem TV</channel>
|
||||
<channel lang="nl" xmltv_id="RTVFocusTV.nl" site_id="3186">RTV Focus TV</channel>
|
||||
<channel lang="nl" xmltv_id="RTVHorizon.nl" site_id="10012">RTV Horizon</channel>
|
||||
<channel lang="nl" xmltv_id="RTVOost.nl" site_id="3097">RTV Oost</channel>
|
||||
<channel lang="nl" xmltv_id="RTVPurmerend.nl" site_id="10018">RTV Purmerend</channel>
|
||||
<channel lang="nl" xmltv_id="RTVRijnstreekTV.nl" site_id="3181">RTV Rijnstreek TV</channel>
|
||||
<channel lang="nl" xmltv_id="RTVScheldemond.nl" site_id="68">RTV Scheldemond</channel>
|
||||
|
@ -199,8 +200,8 @@
|
|||
<channel lang="nl" xmltv_id="TraceSportStars.fr" site_id="3047">Trace Sport Stars</channel>
|
||||
<channel lang="nl" xmltv_id="TraceUrban.fr" site_id="3048">Trace Urban</channel>
|
||||
<channel lang="nl" xmltv_id="TRTTurk.tr" site_id="3023">TRT Türk</channel>
|
||||
<channel lang="nl" xmltv_id="TV5MondeEurope.fr" site_id="57">TV5Monde Europe</channel>
|
||||
<channel lang="nl" xmltv_id="TV538.nl" site_id="63">TV 538</channel>
|
||||
<channel lang="nl" xmltv_id="TV5MondeEurope.fr" site_id="57">TV5Monde Europe</channel>
|
||||
<channel lang="nl" xmltv_id="TVBerghem.nl" site_id="3081">TV Berghem</channel>
|
||||
<channel lang="nl" xmltv_id="TVDrenthe.nl" site_id="3099">TV Drenthe</channel>
|
||||
<channel lang="nl" xmltv_id="TVEInternacionalEuropa.es" site_id="3022">TVE Internacional Europa</channel>
|
||||
|
@ -208,7 +209,6 @@
|
|||
<channel lang="nl" xmltv_id="TVKrimpenerwaard.nl" site_id="3079">TV Krimpenerwaard</channel>
|
||||
<channel lang="nl" xmltv_id="TVNoord.nl" site_id="3098">TV Noord</channel>
|
||||
<channel lang="nl" xmltv_id="TVNunspeet.nl" site_id="3085">TV Nunspeet</channel>
|
||||
<channel lang="nl" xmltv_id="TVOost.nl" site_id="3097">TV Oost</channel>
|
||||
<channel lang="nl" xmltv_id="TVOranje.nl" site_id="99">TV Oranje</channel>
|
||||
<channel lang="nl" xmltv_id="TVRijnmond.nl" site_id="72">TV Rijnmond</channel>
|
||||
<channel lang="nl" xmltv_id="TVStichtseVecht.nl" site_id="3071">TV Stichtse Vecht</channel>
|
||||
|
|
|
@ -60,7 +60,7 @@
|
|||
<channel lang="tr" xmltv_id="EBATVLise.tr" site_id="538">EBA TV Lise</channel>
|
||||
<channel lang="tr" xmltv_id="EBATVOrtaokul.tr" site_id="537">EBA TV Ortaokul</channel>
|
||||
<channel lang="tr" xmltv_id="Ekoturk.tr" site_id="521">Ekotürk</channel>
|
||||
<channel lang="tr" xmltv_id="EuroNewsEnglish.fr" site_id="78">EuroNews English</channel>
|
||||
<channel lang="tr" xmltv_id="EuronewsEnglish.fr" site_id="78">EuroNews English</channel>
|
||||
<channel lang="tr" xmltv_id="Eurosport1.fr" site_id="47">Eurosport 1</channel>
|
||||
<channel lang="tr" xmltv_id="Eurosport2.fr" site_id="82">Eurosport 2</channel>
|
||||
<channel lang="tr" xmltv_id="FashionTVHDEurope.fr" site_id="74">FashionTV HD Europe</channel>
|
||||
|
|
|
@ -252,7 +252,7 @@
|
|||
<channel lang="en" xmltv_id="PenthouseTV.us" site_id="595">Penthouse TV</channel>
|
||||
<channel lang="en" xmltv_id="PenthouseTVMonthlyOffer.us" site_id="587">Penthouse TV Monthly Offer</channel>
|
||||
<channel lang="en" xmltv_id="PeruMagico.pe" site_id="431">Perú Mágico</channel>
|
||||
<channel lang="en" xmltv_id="PerviykanalAmerica.ru" site_id="2140">Perviy kanal America</channel>
|
||||
<channel lang="en" xmltv_id="PervyykanalAmerica.ru" site_id="2140">Pervyy kanal America</channel>
|
||||
<channel lang="en" xmltv_id="PhoenixHongKong.hk" site_id="2104">Phoenix Hong Kong</channel>
|
||||
<channel lang="en" xmltv_id="PhoenixInfoNewsChannel.hk" site_id="2051">Phoenix InfoNews Channel</channel>
|
||||
<channel lang="en" xmltv_id="PhoenixNorthAmericaChineseChannel.hk" site_id="2050">Phoenix North America Chinese Channel</channel>
|
||||
|
|
|
@ -44,7 +44,7 @@
|
|||
<channel lang="tr" xmltv_id="HaberGlobal.tr" site_id="5bac7dedcfef0b02fac035fd">Haber Global</channel>
|
||||
<channel lang="tr" xmltv_id="Haberturk.tr" site_id="58d29bb0eefad3db9c60629d">Habertürk</channel>
|
||||
<channel lang="tr" xmltv_id="HalkTV.tr" site_id="58d29bb0eefad3db9c606288">Halk TV</channel>
|
||||
<channel lang="tr" xmltv_id="InsightHD.nl" site_id="5dfc6dc2cfef0b201d222aa0">Insight HD</channel>
|
||||
<channel lang="tr" xmltv_id="InsightTV.nl" site_id="5dfc6dc2cfef0b201d222aa0">Insight HD</channel>
|
||||
<channel lang="tr" xmltv_id="Kanal7.tr" site_id="58d29bb0eefad3db9c60629c">Kanal 7</channel>
|
||||
<channel lang="tr" xmltv_id="KanalD.tr" site_id="58d29bb0eefad3db9c606258">Kanal D</channel>
|
||||
<channel lang="tr" xmltv_id="LiderTV.tr" site_id="61517908cfef0b1593cd5f9e">Lider TV</channel>
|
||||
|
|
|
@ -30,8 +30,8 @@
|
|||
<channel lang="pt" xmltv_id="EmmanuelTV.ng" site_id="b0dc42b8-c651-4c3c-8713-a7fcd04744ee#EM7">Emmanuel TV</channel>
|
||||
<channel lang="pt" xmltv_id="ESPN2Africa.us" site_id="b0dc42b8-c651-4c3c-8713-a7fcd04744ee#HE2">ESPN 2 Africa</channel>
|
||||
<channel lang="pt" xmltv_id="ESPNAfrica.us" site_id="b0dc42b8-c651-4c3c-8713-a7fcd04744ee#E17">ESPN Africa</channel>
|
||||
<channel lang="pt" xmltv_id="EuroNewsEnglish.fr" site_id="b0dc42b8-c651-4c3c-8713-a7fcd04744ee#EUW">EuroNews English</channel>
|
||||
<channel lang="pt" xmltv_id="EuroNewsPortugues.fr" site_id="b0dc42b8-c651-4c3c-8713-a7fcd04744ee#EU7">EuroNews Português</channel>
|
||||
<channel lang="pt" xmltv_id="EuronewsEnglish.fr" site_id="b0dc42b8-c651-4c3c-8713-a7fcd04744ee#EUW">EuroNews English</channel>
|
||||
<channel lang="pt" xmltv_id="EuronewsPortugues.fr" site_id="b0dc42b8-c651-4c3c-8713-a7fcd04744ee#EU7">EuroNews Português</channel>
|
||||
<channel lang="pt" xmltv_id="EWTNAfricaAsia.us" site_id="b0dc42b8-c651-4c3c-8713-a7fcd04744ee#EWW">EWTN Africa - Asia</channel>
|
||||
<channel lang="pt" xmltv_id="FaithAfrica.za" site_id="b0dc42b8-c651-4c3c-8713-a7fcd04744ee#TBN">Faith Africa</channel>
|
||||
<channel lang="pt" xmltv_id="FeTV.ao" site_id="b0dc42b8-c651-4c3c-8713-a7fcd04744ee#FE7">Fé TV</channel>
|
||||
|
|
|
@ -39,9 +39,9 @@
|
|||
<channel lang="en" xmltv_id="ESPN2Africa.us" site_id="b8a3d100-6a41-468f-b6df-14e0ce526be6#E2H">ESPN 2 Africa</channel>
|
||||
<channel lang="en" xmltv_id="ESPNAfrica.us" site_id="b8a3d100-6a41-468f-b6df-14e0ce526be6#E1W">ESPN Africa</channel>
|
||||
<channel lang="en" xmltv_id="ETVAfrica.za" site_id="b8a3d100-6a41-468f-b6df-14e0ce526be6#ET4">E TV Africa</channel>
|
||||
<channel lang="en" xmltv_id="EuroNewsDeutsch.fr" site_id="b8a3d100-6a41-468f-b6df-14e0ce526be6#EU4">EuroNews Deutsch</channel>
|
||||
<channel lang="en" xmltv_id="EuroNewsEnglish.fr" site_id="b8a3d100-6a41-468f-b6df-14e0ce526be6#EUW">EuroNews English</channel>
|
||||
<channel lang="en" xmltv_id="EuroNewsFrancais.fr" site_id="b8a3d100-6a41-468f-b6df-14e0ce526be6#EUS">EuroNews Français</channel>
|
||||
<channel lang="en" xmltv_id="EuronewsDeutsch.fr" site_id="b8a3d100-6a41-468f-b6df-14e0ce526be6#EU4">EuroNews Deutsch</channel>
|
||||
<channel lang="en" xmltv_id="EuronewsEnglish.fr" site_id="b8a3d100-6a41-468f-b6df-14e0ce526be6#EUW">EuroNews English</channel>
|
||||
<channel lang="en" xmltv_id="EuronewsFrancais.fr" site_id="b8a3d100-6a41-468f-b6df-14e0ce526be6#EUS">EuroNews Français</channel>
|
||||
<channel lang="en" xmltv_id="EWTNAfricaAsia.us" site_id="b8a3d100-6a41-468f-b6df-14e0ce526be6#EWW">EWTN Africa - Asia</channel>
|
||||
<channel lang="en" xmltv_id="FaithAfrica.za" site_id="b8a3d100-6a41-468f-b6df-14e0ce526be6#TBN">Faith Africa</channel>
|
||||
<channel lang="en" xmltv_id="FoodNetworkEMEA.us" site_id="b8a3d100-6a41-468f-b6df-14e0ce526be6#FN7">Food Network EMEA</channel>
|
||||
|
|
|
@ -40,9 +40,9 @@
|
|||
<channel lang="en" xmltv_id="ESPN2Africa.us" site_id="fa5b7f92-9561-4312-832f-759a65e8e10f#E2H">ESPN 2 Africa</channel>
|
||||
<channel lang="en" xmltv_id="ESPNAfrica.us" site_id="fa5b7f92-9561-4312-832f-759a65e8e10f#E1W">ESPN Africa</channel>
|
||||
<channel lang="en" xmltv_id="ETVAfrica.za" site_id="fa5b7f92-9561-4312-832f-759a65e8e10f#ET4">E TV Africa</channel>
|
||||
<channel lang="en" xmltv_id="EuroNewsDeutsch.fr" site_id="fa5b7f92-9561-4312-832f-759a65e8e10f#EU4">EuroNews Deutsch</channel>
|
||||
<channel lang="en" xmltv_id="EuroNewsFrancais.fr" site_id="fa5b7f92-9561-4312-832f-759a65e8e10f#EUS">EuroNews Français</channel>
|
||||
<channel lang="en" xmltv_id="EuroNewsPortugues.fr" site_id="fa5b7f92-9561-4312-832f-759a65e8e10f#EU7">EuroNews Português</channel>
|
||||
<channel lang="en" xmltv_id="EuronewsDeutsch.fr" site_id="fa5b7f92-9561-4312-832f-759a65e8e10f#EU4">EuroNews Deutsch</channel>
|
||||
<channel lang="en" xmltv_id="EuronewsFrancais.fr" site_id="fa5b7f92-9561-4312-832f-759a65e8e10f#EUS">EuroNews Français</channel>
|
||||
<channel lang="en" xmltv_id="EuronewsPortugues.fr" site_id="fa5b7f92-9561-4312-832f-759a65e8e10f#EU7">EuroNews Português</channel>
|
||||
<channel lang="en" xmltv_id="EWTNAfricaAsia.us" site_id="fa5b7f92-9561-4312-832f-759a65e8e10f#EWW">EWTN Africa - Asia</channel>
|
||||
<channel lang="en" xmltv_id="FaithAfrica.za" site_id="fa5b7f92-9561-4312-832f-759a65e8e10f#TBN">Faith Africa</channel>
|
||||
<channel lang="en" xmltv_id="FoodNetworkEMEA.us" site_id="fa5b7f92-9561-4312-832f-759a65e8e10f#FN7">Food Network EMEA</channel>
|
||||
|
|
|
@ -40,9 +40,9 @@
|
|||
<channel lang="en" xmltv_id="ESPN2Africa.us" site_id="13727be9-2f31-43aa-9511-41b20f94b810#E2H">ESPN 2 Africa</channel>
|
||||
<channel lang="en" xmltv_id="ESPNAfrica.us" site_id="13727be9-2f31-43aa-9511-41b20f94b810#E1W">ESPN Africa</channel>
|
||||
<channel lang="en" xmltv_id="ETVAfrica.za" site_id="13727be9-2f31-43aa-9511-41b20f94b810#ET4">E TV Africa</channel>
|
||||
<channel lang="en" xmltv_id="EuroNewsDeutsch.fr" site_id="13727be9-2f31-43aa-9511-41b20f94b810#EU4">EuroNews Deutsch</channel>
|
||||
<channel lang="en" xmltv_id="EuroNewsEnglish.fr" site_id="13727be9-2f31-43aa-9511-41b20f94b810#EUW">EuroNews English</channel>
|
||||
<channel lang="en" xmltv_id="EuroNewsFrancais.fr" site_id="13727be9-2f31-43aa-9511-41b20f94b810#EUS">EuroNews Français</channel>
|
||||
<channel lang="en" xmltv_id="EuronewsDeutsch.fr" site_id="13727be9-2f31-43aa-9511-41b20f94b810#EU4">EuroNews Deutsch</channel>
|
||||
<channel lang="en" xmltv_id="EuronewsEnglish.fr" site_id="13727be9-2f31-43aa-9511-41b20f94b810#EUW">EuroNews English</channel>
|
||||
<channel lang="en" xmltv_id="EuronewsFrancais.fr" site_id="13727be9-2f31-43aa-9511-41b20f94b810#EUS">EuroNews Français</channel>
|
||||
<channel lang="en" xmltv_id="EWTNAfricaAsia.us" site_id="13727be9-2f31-43aa-9511-41b20f94b810#EWW">EWTN Africa - Asia</channel>
|
||||
<channel lang="en" xmltv_id="FaithAfrica.za" site_id="13727be9-2f31-43aa-9511-41b20f94b810#TBN">Faith Africa</channel>
|
||||
<channel lang="en" xmltv_id="FoodNetworkEMEA.us" site_id="13727be9-2f31-43aa-9511-41b20f94b810#FN7">Food Network EMEA</channel>
|
||||
|
|
|
@ -41,7 +41,7 @@
|
|||
<channel lang="en" xmltv_id="ESPN2Africa.us" site_id="f039b135-2944-423c-80d9-4e6fd3add524#SDN">ESPN 2 Africa</channel>
|
||||
<channel lang="en" xmltv_id="ESPNAfrica.us" site_id="f039b135-2944-423c-80d9-4e6fd3add524#I26">ESPN Africa</channel>
|
||||
<channel lang="en" xmltv_id="ETVAfrica.za" site_id="f039b135-2944-423c-80d9-4e6fd3add524#ETA">E TV Africa</channel>
|
||||
<channel lang="en" xmltv_id="EuroNewsEnglish.fr" site_id="f039b135-2944-423c-80d9-4e6fd3add524#EN1">EuroNews English</channel>
|
||||
<channel lang="en" xmltv_id="EuronewsEnglish.fr" site_id="f039b135-2944-423c-80d9-4e6fd3add524#EN1">EuroNews English</channel>
|
||||
<channel lang="en" xmltv_id="FaithAfrica.za" site_id="f039b135-2944-423c-80d9-4e6fd3add524#TBK">Faith Africa</channel>
|
||||
<channel lang="en" xmltv_id="FliekNet.za" site_id="f039b135-2944-423c-80d9-4e6fd3add524#FND">FliekNet</channel>
|
||||
<channel lang="en" xmltv_id="FoodNetworkEMEA.us" site_id="f039b135-2944-423c-80d9-4e6fd3add524#F26">Food Network EMEA</channel>
|
||||
|
|
|
@ -39,8 +39,8 @@
|
|||
<channel lang="en" xmltv_id="ESPN2Africa.us" site_id="13517260-207c-4049-928f-fe4776d3d4f5#E2H">ESPN 2 Africa</channel>
|
||||
<channel lang="en" xmltv_id="ESPNAfrica.us" site_id="13517260-207c-4049-928f-fe4776d3d4f5#E1W">ESPN Africa</channel>
|
||||
<channel lang="en" xmltv_id="ETVAfrica.za" site_id="13517260-207c-4049-928f-fe4776d3d4f5#ET4">E TV Africa</channel>
|
||||
<channel lang="en" xmltv_id="EuroNewsDeutsch.fr" site_id="13517260-207c-4049-928f-fe4776d3d4f5#EU4">EuroNews Deutsch</channel>
|
||||
<channel lang="en" xmltv_id="EuroNewsFrancais.fr" site_id="13517260-207c-4049-928f-fe4776d3d4f5#EUS">EuroNews Français</channel>
|
||||
<channel lang="en" xmltv_id="EuronewsDeutsch.fr" site_id="13517260-207c-4049-928f-fe4776d3d4f5#EU4">EuroNews Deutsch</channel>
|
||||
<channel lang="en" xmltv_id="EuronewsFrancais.fr" site_id="13517260-207c-4049-928f-fe4776d3d4f5#EUS">EuroNews Français</channel>
|
||||
<channel lang="en" xmltv_id="EWTNAfricaAsia.us" site_id="13517260-207c-4049-928f-fe4776d3d4f5#EWW">EWTN Africa - Asia</channel>
|
||||
<channel lang="en" xmltv_id="FaithAfrica.za" site_id="13517260-207c-4049-928f-fe4776d3d4f5#TBN">Faith Africa</channel>
|
||||
<channel lang="en" xmltv_id="FoodNetworkEMEA.us" site_id="13517260-207c-4049-928f-fe4776d3d4f5#FN7">Food Network EMEA</channel>
|
||||
|
|
|
@ -39,9 +39,9 @@
|
|||
<channel lang="en" xmltv_id="ESPN2Africa.us" site_id="5b4c4ef0-ec6f-4e35-b33a-8edbc1e0a276#E2H">ESPN 2 Africa</channel>
|
||||
<channel lang="en" xmltv_id="ESPNAfrica.us" site_id="5b4c4ef0-ec6f-4e35-b33a-8edbc1e0a276#E1W">ESPN Africa</channel>
|
||||
<channel lang="en" xmltv_id="ETVAfrica.za" site_id="5b4c4ef0-ec6f-4e35-b33a-8edbc1e0a276#ET4">E TV Africa</channel>
|
||||
<channel lang="en" xmltv_id="EuroNewsDeutsch.fr" site_id="5b4c4ef0-ec6f-4e35-b33a-8edbc1e0a276#EU4">EuroNews Deutsch</channel>
|
||||
<channel lang="en" xmltv_id="EuroNewsFrancais.fr" site_id="5b4c4ef0-ec6f-4e35-b33a-8edbc1e0a276#EUS">EuroNews Français</channel>
|
||||
<channel lang="en" xmltv_id="EuroNewsPortugues.fr" site_id="5b4c4ef0-ec6f-4e35-b33a-8edbc1e0a276#EU7">EuroNews Português</channel>
|
||||
<channel lang="en" xmltv_id="EuronewsDeutsch.fr" site_id="5b4c4ef0-ec6f-4e35-b33a-8edbc1e0a276#EU4">EuroNews Deutsch</channel>
|
||||
<channel lang="en" xmltv_id="EuronewsFrancais.fr" site_id="5b4c4ef0-ec6f-4e35-b33a-8edbc1e0a276#EUS">EuroNews Français</channel>
|
||||
<channel lang="en" xmltv_id="EuronewsPortugues.fr" site_id="5b4c4ef0-ec6f-4e35-b33a-8edbc1e0a276#EU7">EuroNews Português</channel>
|
||||
<channel lang="en" xmltv_id="EWTNAfricaAsia.us" site_id="5b4c4ef0-ec6f-4e35-b33a-8edbc1e0a276#EWW">EWTN Africa - Asia</channel>
|
||||
<channel lang="en" xmltv_id="FaithAfrica.za" site_id="5b4c4ef0-ec6f-4e35-b33a-8edbc1e0a276#TBN">Faith Africa</channel>
|
||||
<channel lang="en" xmltv_id="FoodNetworkEMEA.us" site_id="5b4c4ef0-ec6f-4e35-b33a-8edbc1e0a276#FN7">Food Network EMEA</channel>
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue