diff --git a/.github/workflows/_check.yml b/.github/workflows/_check.yml
index c0557afe..e2e0f0ef 100644
--- a/.github/workflows/_check.yml
+++ b/.github/workflows/_check.yml
@@ -10,12 +10,22 @@ jobs:
- uses: actions/checkout@v2
with:
fetch-depth: 2
- - name: Download channels from API
+ - 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
- - id: files
- uses: jitterbit/get-changed-files@v1
- - run: npm install
- - run: npm run lint -- ${{ steps.files.outputs.added_modified }}
- - run: npm run validate -- ${{ steps.files.outputs.added_modified }}
+ - uses: actions/setup-node@v2
+ if: ${{ !env.ACT && steps.files.outputs.any_changed == 'true' }}
+ with:
+ node-version: '14'
+ cache: 'npm'
+ - uses: tj-actions/changed-files@v12.2
+ id: files
+ with:
+ files: 'sites'
+ - name: validate
+ if: steps.files.outputs.any_changed == 'true'
+ run: |
+ npm install
+ npm run channels:lint -- ${{ steps.files.outputs.all_changed_files }}
+ npm run channels:validate -- ${{ steps.files.outputs.all_changed_files }}
diff --git a/.github/workflows/_load.yml b/.github/workflows/_load.yml
index b1203259..17e58f35 100644
--- a/.github/workflows/_load.yml
+++ b/.github/workflows/_load.yml
@@ -14,18 +14,22 @@ jobs:
load:
runs-on: ubuntu-latest
steps:
- - run: echo running on branch ${GITHUB_REF##*/}
- 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
- uses: FedericoCarboni/setup-ffmpeg@v1
+ - uses: actions/setup-node@v2
+ if: ${{ !env.ACT }}
+ with:
+ node-version: '14'
+ cache: 'npm'
- run: npm install
- - run: CHANNELS_PATH=sites/${{inputs.site}}/*.channels.xml node scripts/commands/create-queue.js --max-clusters=1 --days=2
- - run: NODE_OPTIONS=--insecure-http-parser node scripts/commands/load-cluster.js --timeout=30000 --cluster-id=1
- - run: node scripts/commands/save-results.js
- - run: node scripts/commands/update-guides.js
+ - run: CHANNELS_PATH=sites/${{inputs.site}}/*.channels.xml npm run queue:create -- --max-clusters=1 --days=2
+ - run: NODE_OPTIONS=--insecure-http-parser npm run cluster:load -- --timeout=30000 --cluster-id=1
+ - run: npm run programs:save
+ - run: npm run guides:update
- uses: tibdex/github-app-token@v1
if: ${{ !env.ACT }}
id: create-app-token
diff --git a/.github/workflows/_update-api.yml b/.github/workflows/_update-api.yml
index 38433931..927ed780 100644
--- a/.github/workflows/_update-api.yml
+++ b/.github/workflows/_update-api.yml
@@ -4,12 +4,17 @@ on:
schedule:
- cron: '0 12 * * *'
jobs:
- check:
+ update:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
+ - uses: actions/setup-node@v2
+ if: ${{ !env.ACT }}
+ with:
+ node-version: '14'
+ cache: 'npm'
- run: npm install
- - run: node scripts/commands/update-api.js
+ - run: npm run api:update
- uses: tibdex/github-app-token@v1
if: ${{ !env.ACT }}
id: create-app-token
@@ -21,7 +26,7 @@ jobs:
with:
repository-name: iptv-org/api
branch: gh-pages
- folder: .gh-pages/api
+ folder: .api
token: ${{ steps.create-app-token.outputs.token }}
git-config-name: iptv-bot[bot]
git-config-email: 84861620+iptv-bot[bot]@users.noreply.github.com
diff --git a/.github/workflows/_update-readme.yml b/.github/workflows/_update-readme.yml
new file mode 100644
index 00000000..1a1e1132
--- /dev/null
+++ b/.github/workflows/_update-readme.yml
@@ -0,0 +1,57 @@
+name: _update-readme
+on:
+ workflow_dispatch:
+ schedule:
+ - cron: '0 12 * * *'
+jobs:
+ update:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v2
+ - run: echo "::set-output name=branch_name::$(date +'bot/auto-update-%s')"
+ id: create-branch-name
+ - run: git config user.name 'iptv-bot[bot]'
+ - run: git config user.email '84861620+iptv-bot[bot]@users.noreply.github.com'
+ - run: git checkout -b ${{ steps.create-branch-name.outputs.branch_name }}
+ - name: Download data from API
+ run: |
+ mkdir -p scripts/data
+ curl -L -o scripts/data/countries.json https://iptv-org.github.io/api/countries.json
+ - uses: actions/setup-node@v2
+ if: ${{ !env.ACT }}
+ with:
+ node-version: '14'
+ cache: 'npm'
+ - run: npm install
+ - run: npm run readme:update
+ - name: Commit Changes
+ if: ${{ !env.ACT }}
+ run: |
+ git add README.md
+ git commit -m "[Bot] Update README.md"
+ git status
+ git push -u origin ${{ steps.create-branch-name.outputs.branch_name }}
+ - uses: tibdex/github-app-token@v1
+ if: ${{ !env.ACT }}
+ id: create-app-token
+ with:
+ app_id: ${{ secrets.APP_ID }}
+ private_key: ${{ secrets.APP_PRIVATE_KEY }}
+ - uses: repo-sync/pull-request@v2
+ if: ${{ !env.ACT && github.ref == 'refs/heads/master' }}
+ id: pull-request
+ with:
+ github_token: ${{ steps.create-app-token.outputs.token }}
+ source_branch: ${{ steps.create-branch-name.outputs.branch_name }}
+ destination_branch: 'master'
+ pr_title: '[Bot] Daily update'
+ pr_body: |
+ This pull request is created via [update-readme][1] workflow.
+
+ [1]: https://github.com/iptv-org/epg/actions/runs/${{ github.run_id }}
+ - uses: juliangruber/merge-pull-request-action@v1
+ if: ${{ !env.ACT && github.ref == 'refs/heads/master' }}
+ with:
+ github-token: ${{ secrets.PAT }}
+ number: ${{ steps.pull-request.outputs.pr_number }}
+ method: squash
diff --git a/.github/workflows/sky.de.yml b/.github/workflows/sky.de.yml
new file mode 100644
index 00000000..0e2c6e97
--- /dev/null
+++ b/.github/workflows/sky.de.yml
@@ -0,0 +1,17 @@
+name: sky.de
+on:
+ schedule:
+ - cron: '0 0 * * *'
+ workflow_dispatch:
+ workflow_run:
+ workflows: [_trigger]
+ types:
+ - completed
+jobs:
+ load:
+ uses: ./.github/workflows/_load.yml
+ with:
+ site: ${{github.workflow}}
+ secrets:
+ APP_ID: ${{ secrets.APP_ID }}
+ APP_PRIVATE_KEY: ${{ secrets.APP_PRIVATE_KEY }}
diff --git a/.readme/template.md b/.readme/template.md
index 1a98da9b..9dc85d98 100644
--- a/.readme/template.md
+++ b/.readme/template.md
@@ -17,10 +17,6 @@ The API documentation can be found in the [iptv-org/api](https://github.com/iptv
Links to other useful IPTV-related resources can be found in the [iptv-org/awesome-iptv](https://github.com/iptv-org/awesome-iptv) repository.
-## API
-
-The API documentation can be found in the [iptv-org/api](https://github.com/iptv-org/api) repository.
-
## Contribution
If you find a bug or want to contribute to the code or documentation, you can help by submitting an [issue](https://github.com/iptv-org/epg/issues) or a [pull request](https://github.com/iptv-org/epg/pulls).
diff --git a/README.md b/README.md
index 52223afb..60866fc4 100644
--- a/README.md
+++ b/README.md
@@ -38,15 +38,15 @@ To load a program guide, all you need to do is copy the link to one or more of t
๐ง๐ฆ Bosnia and Herzegovina | 178 | https://iptv-org.github.io/epg/guides/ba/mtel.ba.epg.xml |  |
4 | https://iptv-org.github.io/epg/guides/ba/tvarenasport.com.epg.xml |  |
๐ง๐ผ Botswana | 130 | https://iptv-org.github.io/epg/guides/bw/dstv.com.epg.xml |  |
- ๐ง๐ท Brazil | 248 | https://iptv-org.github.io/epg/guides/br/mi.tv.epg.xml |  |
- ๐ง๐ฌ Bulgaria | 105 | https://iptv-org.github.io/epg/guides/bg/tv.dir.bg.epg.xml |  |
+ ๐ง๐ท Brazil | 251 | https://iptv-org.github.io/epg/guides/br/mi.tv.epg.xml |  |
+ ๐ง๐ฌ Bulgaria | 103 | https://iptv-org.github.io/epg/guides/bg/tv.dir.bg.epg.xml |  |
๐ง๐ซ Burkina Faso | 242 | https://iptv-org.github.io/epg/guides/bf/canalplus-afrique.com.epg.xml |  |
128 | https://iptv-org.github.io/epg/guides/bf/dstv.com.epg.xml |  |
๐ง๐ฎ Burundi | 242 | https://iptv-org.github.io/epg/guides/bi/canalplus-afrique.com.epg.xml |  |
128 | https://iptv-org.github.io/epg/guides/bi/dstv.com.epg.xml |  |
๐จ๐ฒ Cameroon | 242 | https://iptv-org.github.io/epg/guides/cm/canalplus-afrique.com.epg.xml |  |
128 | https://iptv-org.github.io/epg/guides/cm/dstv.com.epg.xml |  |
- ๐จ๐ฆ Canada | 62 | https://iptv-org.github.io/epg/guides/ca/tvtv.us.epg.xml |  |
+ ๐จ๐ฆ Canada | 76 | https://iptv-org.github.io/epg/guides/ca/tvtv.us.epg.xml |  |
๐จ๐ป Cape Verde | 242 | https://iptv-org.github.io/epg/guides/cv/canalplus-afrique.com.epg.xml |  |
125 | https://iptv-org.github.io/epg/guides/cv/dstv.com.epg.xml |  |
๐จ๐ซ Central African Republic | 242 | https://iptv-org.github.io/epg/guides/cf/canalplus-afrique.com.epg.xml |  |
@@ -57,17 +57,17 @@ To load a program guide, all you need to do is copy the link to one or more of t
98 | https://iptv-org.github.io/epg/guides/td-en/osn.com.epg.xml |  |
๐จ๐ฑ Chile | 79 | https://iptv-org.github.io/epg/guides/cl/mi.tv.epg.xml |  |
52 | https://iptv-org.github.io/epg/guides/cl/gatotv.com.epg.xml |  |
- ๐จ๐ณ China | 98 | https://iptv-org.github.io/epg/guides/cn/tv.cctv.com.epg.xml |  |
+ ๐จ๐ณ China | 97 | https://iptv-org.github.io/epg/guides/cn/tv.cctv.com.epg.xml |  |
๐จ๐ด Colombia | 103 | https://iptv-org.github.io/epg/guides/co/siba.com.co.epg.xml |  |
56 | https://iptv-org.github.io/epg/guides/co/gatotv.com.epg.xml |  |
42 | https://iptv-org.github.io/epg/guides/co/mi.tv.epg.xml |  |
๐ฐ๐ฒ Comoros | 119 | https://iptv-org.github.io/epg/guides/km/canalplus-reunion.com.epg.xml |  |
๐จ๐ท Costa Rica | 49 | https://iptv-org.github.io/epg/guides/cr/gatotv.com.epg.xml |  |
- ๐ญ๐ท Croatia | 169 | https://iptv-org.github.io/epg/guides/hr/maxtv.hrvatskitelekom.hr.epg.xml |  |
+ ๐ญ๐ท Croatia | 168 | https://iptv-org.github.io/epg/guides/hr/maxtv.hrvatskitelekom.hr.epg.xml |  |
10 | https://iptv-org.github.io/epg/guides/hr/tvarenasport.hr.epg.xml |  |
๐จ๐บ Cuba | 10 | https://iptv-org.github.io/epg/guides/cu/tvcubana.icrt.cu.epg.xml |  |
๐จ๐พ Cyprus | 30 | https://iptv-org.github.io/epg/guides/cy/novacyprus.com.epg.xml |  |
- ๐จ๐ฟ Czech Republic | 512 | https://iptv-org.github.io/epg/guides/cz/m.tv.sms.cz.epg.xml |  |
+ ๐จ๐ฟ Czech Republic | 519 | https://iptv-org.github.io/epg/guides/cz/m.tv.sms.cz.epg.xml |  |
๐จ๐ฉ Democratic Republic of the Congo | 242 | https://iptv-org.github.io/epg/guides/cd/canalplus-afrique.com.epg.xml |  |
126 | https://iptv-org.github.io/epg/guides/cd/dstv.com.epg.xml |  |
๐ฉ๐ฐ Denmark | 61 | https://iptv-org.github.io/epg/guides/dk/allente.se.epg.xml |  |
@@ -75,8 +75,8 @@ To load a program guide, all you need to do is copy the link to one or more of t
121 | https://iptv-org.github.io/epg/guides/dj/dstv.com.epg.xml |  |
๐ฉ๐ด Dominican Republic | 60 | https://iptv-org.github.io/epg/guides/do/gatotv.com.epg.xml |  |
๐ช๐จ Ecuador | 45 | https://iptv-org.github.io/epg/guides/ec/gatotv.com.epg.xml |  |
- ๐ช๐ฌ Egypt | 108 | https://iptv-org.github.io/epg/guides/eg-ar/elcinema.com.epg.xml |  |
- 108 | https://iptv-org.github.io/epg/guides/eg-en/elcinema.com.epg.xml |  |
+ ๐ช๐ฌ Egypt | 106 | https://iptv-org.github.io/epg/guides/eg-ar/elcinema.com.epg.xml |  |
+ 106 | https://iptv-org.github.io/epg/guides/eg-en/elcinema.com.epg.xml |  |
99 | https://iptv-org.github.io/epg/guides/eg-ar/osn.com.epg.xml |  |
99 | https://iptv-org.github.io/epg/guides/eg-en/osn.com.epg.xml |  |
๐ธ๐ป El Salvador | 52 | https://iptv-org.github.io/epg/guides/sv/gatotv.com.epg.xml |  |
@@ -100,7 +100,7 @@ To load a program guide, all you need to do is copy the link to one or more of t
125 | https://iptv-org.github.io/epg/guides/ga/dstv.com.epg.xml |  |
๐ฌ๐ฒ Gambia | 242 | https://iptv-org.github.io/epg/guides/gm/canalplus-afrique.com.epg.xml |  |
124 | https://iptv-org.github.io/epg/guides/gm/dstv.com.epg.xml |  |
- ๐ฌ๐ช Georgia | 117 | https://iptv-org.github.io/epg/guides/ge/magticom.ge.epg.xml |  |
+ ๐ฌ๐ช Georgia | 116 | https://iptv-org.github.io/epg/guides/ge/magticom.ge.epg.xml |  |
๐ฉ๐ช Germany | 122 | https://iptv-org.github.io/epg/guides/de/hd-plus.de.epg.xml |  |
๐ฌ๐ญ Ghana | 242 | https://iptv-org.github.io/epg/guides/gh/canalplus-afrique.com.epg.xml |  |
139 | https://iptv-org.github.io/epg/guides/gh/dstv.com.epg.xml |  |
@@ -122,13 +122,13 @@ To load a program guide, all you need to do is copy the link to one or more of t
๐ญ๐บ Hungary | 91 | https://iptv-org.github.io/epg/guides/hu/tvmusor.hu.epg.xml |  |
๐ฎ๐ธ Iceland | 2 | https://iptv-org.github.io/epg/guides/is/ruv.is.epg.xml |  |
๐ฎ๐ณ India | 364 | https://iptv-org.github.io/epg/guides/in/dishtv.in.epg.xml |  |
- ๐ฎ๐ฉ Indonesia | 90 | https://iptv-org.github.io/epg/guides/id/mncvision.id.epg.xml |  |
- 29 | https://iptv-org.github.io/epg/guides/id/vidio.com.epg.xml |  |
+ ๐ฎ๐ฉ Indonesia | 98 | https://iptv-org.github.io/epg/guides/id/mncvision.id.epg.xml |  |
+ 53 | https://iptv-org.github.io/epg/guides/id/vidio.com.epg.xml |  |
๐ฎ๐ท Iran | 29 | https://iptv-org.github.io/epg/guides/ir/tva.tv.epg.xml |  |
๐ฎ๐ถ Iraq | 99 | https://iptv-org.github.io/epg/guides/iq-ar/osn.com.epg.xml |  |
99 | https://iptv-org.github.io/epg/guides/iq-en/osn.com.epg.xml |  |
๐ฎ๐ช Ireland | 3 | https://iptv-org.github.io/epg/guides/ie/ontvtonight.com.epg.xml |  |
- ๐ฎ๐น Italy | 145 | https://iptv-org.github.io/epg/guides/it/guidatv.sky.it.epg.xml |  |
+ ๐ฎ๐น Italy | 142 | https://iptv-org.github.io/epg/guides/it/guidatv.sky.it.epg.xml |  |
15 | https://iptv-org.github.io/epg/guides/it/mediaset.it.epg.xml |  |
๐จ๐ฎ Ivory Coast | 242 | https://iptv-org.github.io/epg/guides/ci/canalplus-afrique.com.epg.xml |  |
128 | https://iptv-org.github.io/epg/guides/ci/dstv.com.epg.xml |  |
@@ -143,13 +143,13 @@ To load a program guide, all you need to do is copy the link to one or more of t
๐ฑ๐ป Latvia | 21 | https://iptv-org.github.io/epg/guides/lv/tv.lv.epg.xml |  |
๐ฑ๐ง Lebanon | 99 | https://iptv-org.github.io/epg/guides/lb-ar/osn.com.epg.xml |  |
99 | https://iptv-org.github.io/epg/guides/lb-en/osn.com.epg.xml |  |
- ๐ฑ๐ธ Lesotho | 146 | https://iptv-org.github.io/epg/guides/ls/dstv.com.epg.xml |  |
+ ๐ฑ๐ธ Lesotho | 145 | https://iptv-org.github.io/epg/guides/ls/dstv.com.epg.xml |  |
๐ฑ๐ท Liberia | 125 | https://iptv-org.github.io/epg/guides/lr/dstv.com.epg.xml |  |
๐ฑ๐พ Libya | 99 | https://iptv-org.github.io/epg/guides/ly-ar/osn.com.epg.xml |  |
99 | https://iptv-org.github.io/epg/guides/ly-en/osn.com.epg.xml |  |
๐ฒ๐ฌ Madagascar | 125 | https://iptv-org.github.io/epg/guides/mg/dstv.com.epg.xml |  |
- ๐ฒ๐ผ Malawi | 132 | https://iptv-org.github.io/epg/guides/mw/dstv.com.epg.xml |  |
- ๐ฒ๐พ Malaysia | 123 | https://iptv-org.github.io/epg/guides/my/astro.com.my.epg.xml |  |
+ ๐ฒ๐ผ Malawi | 131 | https://iptv-org.github.io/epg/guides/mw/dstv.com.epg.xml |  |
+ ๐ฒ๐พ Malaysia | 141 | https://iptv-org.github.io/epg/guides/my/astro.com.my.epg.xml |  |
๐ฒ๐ฑ Mali | 242 | https://iptv-org.github.io/epg/guides/ml/canalplus-afrique.com.epg.xml |  |
125 | https://iptv-org.github.io/epg/guides/ml/dstv.com.epg.xml |  |
๐ฒ๐ถ Martinique | 128 | https://iptv-org.github.io/epg/guides/mq/canalplus-caraibes.com.epg.xml |  |
@@ -170,7 +170,7 @@ To load a program guide, all you need to do is copy the link to one or more of t
๐ณ๐ฎ Nicaragua | 50 | https://iptv-org.github.io/epg/guides/ni/gatotv.com.epg.xml |  |
๐ณ๐ช Niger | 242 | https://iptv-org.github.io/epg/guides/ne/canalplus-afrique.com.epg.xml |  |
128 | https://iptv-org.github.io/epg/guides/ne/dstv.com.epg.xml |  |
- ๐ณ๐ฌ Nigeria | 147 | https://iptv-org.github.io/epg/guides/ng/dstv.com.epg.xml |  |
+ ๐ณ๐ฌ Nigeria | 146 | https://iptv-org.github.io/epg/guides/ng/dstv.com.epg.xml |  |
๐ฒ๐ฐ North Macedonia | 52 | https://iptv-org.github.io/epg/guides/mk/maxtvgo.mk.epg.xml |  |
4 | https://iptv-org.github.io/epg/guides/mk/tvarenasport.com.epg.xml |  |
๐ณ๐ด Norway | 71 | https://iptv-org.github.io/epg/guides/no/allente.se.epg.xml |  |
@@ -183,15 +183,15 @@ To load a program guide, all you need to do is copy the link to one or more of t
๐ต๐พ Paraguay | 39 | https://iptv-org.github.io/epg/guides/py/gatotv.com.epg.xml |  |
๐ต๐ช Peru | 48 | https://iptv-org.github.io/epg/guides/pe/gatotv.com.epg.xml |  |
21 | https://iptv-org.github.io/epg/guides/pe/mi.tv.epg.xml |  |
- ๐ต๐ฑ Poland | 341 | https://iptv-org.github.io/epg/guides/pl/programtv.onet.pl.epg.xml |  |
- ๐ต๐น Portugal | 110 | https://iptv-org.github.io/epg/guides/pt/meo.pt.epg.xml |  |
+ ๐ต๐ฑ Poland | 340 | https://iptv-org.github.io/epg/guides/pl/programtv.onet.pl.epg.xml |  |
+ ๐ต๐น Portugal | 203 | https://iptv-org.github.io/epg/guides/pt/meo.pt.epg.xml |  |
๐ถ๐ฆ Qatar | 99 | https://iptv-org.github.io/epg/guides/qa-ar/osn.com.epg.xml |  |
99 | https://iptv-org.github.io/epg/guides/qa-en/osn.com.epg.xml |  |
22 | https://iptv-org.github.io/epg/guides/qa/beinsports.com.epg.xml |  |
๐จ๐ฌ Republic of the Congo | 242 | https://iptv-org.github.io/epg/guides/cg/canalplus-afrique.com.epg.xml |  |
125 | https://iptv-org.github.io/epg/guides/cg/dstv.com.epg.xml |  |
๐ท๐ด Romania | 224 | https://iptv-org.github.io/epg/guides/ro/programetv.ro.epg.xml |  |
- ๐ท๐บ Russia | 285 | https://iptv-org.github.io/epg/guides/ru/tv.yandex.ru.epg.xml |  |
+ ๐ท๐บ Russia | 283 | https://iptv-org.github.io/epg/guides/ru/tv.yandex.ru.epg.xml |  |
๐ท๐ผ Rwanda | 242 | https://iptv-org.github.io/epg/guides/rw/canalplus-afrique.com.epg.xml |  |
132 | https://iptv-org.github.io/epg/guides/rw/dstv.com.epg.xml |  |
๐ท๐ช Rรฉunion | 119 | https://iptv-org.github.io/epg/guides/re/canalplus-reunion.com.epg.xml |  |
@@ -208,13 +208,13 @@ To load a program guide, all you need to do is copy the link to one or more of t
125 | https://iptv-org.github.io/epg/guides/sl/dstv.com.epg.xml |  |
๐ธ๐ฎ Slovenia | 277 | https://iptv-org.github.io/epg/guides/si/tv2go.t-2.net.epg.xml |  |
๐ธ๐ด Somalia | 120 | https://iptv-org.github.io/epg/guides/so/dstv.com.epg.xml |  |
- ๐ฟ๐ฆ South Africa | 160 | https://iptv-org.github.io/epg/guides/za/dstv.com.epg.xml |  |
+ ๐ฟ๐ฆ South Africa | 159 | https://iptv-org.github.io/epg/guides/za/dstv.com.epg.xml |  |
๐ธ๐ธ South Sudan | 125 | https://iptv-org.github.io/epg/guides/ss/dstv.com.epg.xml |  |
- ๐ช๐ธ Spain | 112 | https://iptv-org.github.io/epg/guides/es/programacion-tv.elpais.com.epg.xml |  |
+ ๐ช๐ธ Spain | 110 | https://iptv-org.github.io/epg/guides/es/programacion-tv.elpais.com.epg.xml |  |
58 | https://iptv-org.github.io/epg/guides/es/gatotv.com.epg.xml |  |
๐ธ๐ฉ Sudan | 118 | https://iptv-org.github.io/epg/guides/sd/dstv.com.epg.xml |  |
๐ธ๐ฟ Swaziland | 127 | https://iptv-org.github.io/epg/guides/sz/dstv.com.epg.xml |  |
- ๐ธ๐ช Sweden | 89 | https://iptv-org.github.io/epg/guides/se/allente.se.epg.xml |  |
+ ๐ธ๐ช Sweden | 94 | https://iptv-org.github.io/epg/guides/se/allente.se.epg.xml |  |
๐จ๐ญ Switzerland | 598 | https://iptv-org.github.io/epg/guides/ch/tv.blue.ch.epg.xml |  |
๐ธ๐น Sรฃo Tomรฉ and Prรญncipe | 128 | https://iptv-org.github.io/epg/guides/st/dstv.com.epg.xml |  |
๐น๐ฟ Tanzania | 30 | https://iptv-org.github.io/epg/guides/tz/dstv.com.epg.xml |  |
@@ -222,15 +222,15 @@ To load a program guide, all you need to do is copy the link to one or more of t
๐น๐ฌ Togo | 242 | https://iptv-org.github.io/epg/guides/tg/canalplus-afrique.com.epg.xml |  |
137 | https://iptv-org.github.io/epg/guides/tg/dstv.com.epg.xml |  |
๐น๐ท Turkey | 145 | https://iptv-org.github.io/epg/guides/tr/tvplus.com.tr.epg.xml |  |
- 118 | https://iptv-org.github.io/epg/guides/tr/digiturk.com.tr.epg.xml |  |
- 105 | https://iptv-org.github.io/epg/guides/tr/dsmart.com.tr.epg.xml |  |
+ 117 | https://iptv-org.github.io/epg/guides/tr/digiturk.com.tr.epg.xml |  |
+ 106 | https://iptv-org.github.io/epg/guides/tr/dsmart.com.tr.epg.xml |  |
๐บ๐ฌ Uganda | 151 | https://iptv-org.github.io/epg/guides/ug/dstv.com.epg.xml |  |
๐บ๐ฆ Ukraine | 114 | https://iptv-org.github.io/epg/guides/ua/tvgid.ua.epg.xml |  |
๐ฆ๐ช United Arab Emirates | 99 | https://iptv-org.github.io/epg/guides/ae-ar/osn.com.epg.xml |  |
99 | https://iptv-org.github.io/epg/guides/ae-en/osn.com.epg.xml |  |
- ๐ฌ๐ง United Kingdom | 190 | https://iptv-org.github.io/epg/guides/uk/sky.com.epg.xml |  |
+ ๐ฌ๐ง United Kingdom | 258 | https://iptv-org.github.io/epg/guides/uk/sky.com.epg.xml |  |
97 | https://iptv-org.github.io/epg/guides/uk/ontvtonight.com.epg.xml |  |
- ๐บ๐ธ United States | 1298 | https://iptv-org.github.io/epg/guides/us/tvtv.us.epg.xml |  |
+ ๐บ๐ธ United States | 1683 | https://iptv-org.github.io/epg/guides/us/tvtv.us.epg.xml |  |
410 | https://iptv-org.github.io/epg/guides/us/directv.com.epg.xml |  |
88 | https://iptv-org.github.io/epg/guides/us/tvguide.com.epg.xml |  |
22 | https://iptv-org.github.io/epg/guides/us/gatotv.com.epg.xml |  |
@@ -244,14 +244,14 @@ To load a program guide, all you need to do is copy the link to one or more of t
-## EPG Codes
-
-๐ [iptv-org.github.io](https://iptv-org.github.io/)
-
## API
The API documentation can be found in the [iptv-org/api](https://github.com/iptv-org/api) repository.
+## Resources
+
+Links to other useful IPTV-related resources can be found in the [iptv-org/awesome-iptv](https://github.com/iptv-org/awesome-iptv) repository.
+
## Contribution
If you find a bug or want to contribute to the code or documentation, you can help by submitting an [issue](https://github.com/iptv-org/epg/issues) or a [pull request](https://github.com/iptv-org/epg/pulls).
diff --git a/package-lock.json b/package-lock.json
index 3de27d75..690e3bbb 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -16,6 +16,7 @@
"epg-grabber": "^0.20.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",
"jest": "^27.3.1",
@@ -23,7 +24,6 @@
"lodash": "^4.17.21",
"markdown-include": "^0.4.3",
"mockdate": "^3.0.5",
- "mz": "^2.7.0",
"nedb-promises": "^5.0.3",
"parse-duration": "^1.0.0",
"pdf-parse": "^1.1.1",
@@ -1179,11 +1179,6 @@
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
- "node_modules/any-promise": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
- "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8="
- },
"node_modules/anymatch": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
@@ -2346,9 +2341,9 @@
"integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw=="
},
"node_modules/follow-redirects": {
- "version": "1.14.5",
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.5.tgz",
- "integrity": "sha512-wtphSXy7d4/OR+MvIFbCVBDzZ5520qV8XfPklSN5QtxuMUJZ+b0Wnst1e1lCDocfzuCkHqj8k0FpZqO+UIaKNA==",
+ "version": "1.14.9",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz",
+ "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==",
"funding": [
{
"type": "individual",
@@ -2377,6 +2372,27 @@
"node": ">= 6"
}
},
+ "node_modules/fs-extra": {
+ "version": "10.0.1",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.1.tgz",
+ "integrity": "sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag==",
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/fs-extra/node_modules/universalify": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
+ "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
"node_modules/fs-minipass": {
"version": "1.2.7",
"resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz",
@@ -3614,6 +3630,25 @@
"node": ">=6"
}
},
+ "node_modules/jsonfile": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
+ "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+ "dependencies": {
+ "universalify": "^2.0.0"
+ },
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/jsonfile/node_modules/universalify": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
+ "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
"node_modules/keyv": {
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/keyv/-/keyv-4.0.4.tgz",
@@ -3913,16 +3948,6 @@
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
},
- "node_modules/mz": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
- "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
- "dependencies": {
- "any-promise": "^1.0.0",
- "object-assign": "^4.0.1",
- "thenify-all": "^1.0.0"
- }
- },
"node_modules/nan": {
"version": "2.14.2",
"resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz",
@@ -5066,25 +5091,6 @@
"resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz",
"integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg=="
},
- "node_modules/thenify": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
- "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
- "dependencies": {
- "any-promise": "^1.0.0"
- }
- },
- "node_modules/thenify-all": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
- "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=",
- "dependencies": {
- "thenify": ">= 3.1.0 < 4"
- },
- "engines": {
- "node": ">=0.8"
- }
- },
"node_modules/throat": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz",
@@ -6460,11 +6466,6 @@
"color-convert": "^2.0.1"
}
},
- "any-promise": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
- "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8="
- },
"anymatch": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
@@ -7368,9 +7369,9 @@
"integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw=="
},
"follow-redirects": {
- "version": "1.14.5",
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.5.tgz",
- "integrity": "sha512-wtphSXy7d4/OR+MvIFbCVBDzZ5520qV8XfPklSN5QtxuMUJZ+b0Wnst1e1lCDocfzuCkHqj8k0FpZqO+UIaKNA=="
+ "version": "1.14.9",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz",
+ "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w=="
},
"form-data": {
"version": "4.0.0",
@@ -7382,6 +7383,23 @@
"mime-types": "^2.1.12"
}
},
+ "fs-extra": {
+ "version": "10.0.1",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.1.tgz",
+ "integrity": "sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag==",
+ "requires": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "dependencies": {
+ "universalify": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
+ "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ=="
+ }
+ }
+ },
"fs-minipass": {
"version": "1.2.7",
"resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz",
@@ -8308,6 +8326,22 @@
"minimist": "^1.2.5"
}
},
+ "jsonfile": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
+ "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+ "requires": {
+ "graceful-fs": "^4.1.6",
+ "universalify": "^2.0.0"
+ },
+ "dependencies": {
+ "universalify": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
+ "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ=="
+ }
+ }
+ },
"keyv": {
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/keyv/-/keyv-4.0.4.tgz",
@@ -8550,16 +8584,6 @@
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
},
- "mz": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
- "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
- "requires": {
- "any-promise": "^1.0.0",
- "object-assign": "^4.0.1",
- "thenify-all": "^1.0.0"
- }
- },
"nan": {
"version": "2.14.2",
"resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz",
@@ -9422,22 +9446,6 @@
"resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz",
"integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg=="
},
- "thenify": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
- "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
- "requires": {
- "any-promise": "^1.0.0"
- }
- },
- "thenify-all": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
- "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=",
- "requires": {
- "thenify": ">= 3.1.0 < 4"
- }
- },
"throat": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz",
diff --git a/package.json b/package.json
index 856e4900..57ad993f 100644
--- a/package.json
+++ b/package.json
@@ -1,13 +1,21 @@
{
"name": "epg",
"scripts": {
- "lint": "node scripts/commands/lint.js",
- "validate": "node scripts/commands/validate.js",
+ "channels:validate": "node scripts/commands/channels/validate.js",
+ "channels:lint": "node scripts/commands/channels/lint.js",
+ "channels:parse": "node scripts/commands/channels/parse.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",
+ "readme:update": "node scripts/commands/readme/update.js",
"test": "npx jest --runInBand",
"test:commands": "npx jest --runInBand -- commands",
"test:sites": "npx jest --runInBand -- sites",
- "act": "act workflow_dispatch",
- "update-readme": "node scripts/commands/update-readme.js"
+ "act:check": "act workflow_dispatch -W .github/workflows/_check.yml",
+ "act:update-readme": "act workflow_dispatch -W .github/workflows/_update-readme.yml",
+ "act:update-api": "act workflow_dispatch -W .github/workflows/_update-api.yml"
},
"private": true,
"author": "Arhey",
@@ -25,6 +33,7 @@
"epg-grabber": "^0.20.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",
"jest": "^27.3.1",
@@ -32,7 +41,6 @@
"lodash": "^4.17.21",
"markdown-include": "^0.4.3",
"mockdate": "^3.0.5",
- "mz": "^2.7.0",
"nedb-promises": "^5.0.3",
"parse-duration": "^1.0.0",
"pdf-parse": "^1.1.1",
diff --git a/scripts/commands/api/update.js b/scripts/commands/api/update.js
new file mode 100644
index 00000000..d69e26ce
--- /dev/null
+++ b/scripts/commands/api/update.js
@@ -0,0 +1,42 @@
+const { file, parser, logger } = require('../../core')
+const { program } = require('commander')
+const _ = require('lodash')
+
+const CHANNELS_PATH = process.env.CHANNELS_PATH || 'sites/**/*.channels.xml'
+const OUTPUT_DIR = process.env.OUTPUT_DIR || '.api'
+
+async function main() {
+ let guides = []
+
+ try {
+ const files = await file.list(CHANNELS_PATH)
+ for (const filepath of files) {
+ const { site, channels } = await parser.parseChannels(filepath)
+ const dir = file.dirname(filepath)
+ const config = require(file.resolve(`${dir}/${site}.config.js`))
+ if (config.ignore) continue
+
+ const filename = file.basename(filepath)
+ const [__, suffix] = filename.match(/\_(.*)\.channels\.xml$/) || [null, null]
+
+ for (const channel of channels) {
+ guides.push({
+ channel: channel.xmltv_id,
+ site,
+ lang: channel.lang,
+ url: `https://iptv-org.github.io/epg/guides/${suffix}/${site}.epg.xml`
+ })
+ }
+ }
+ } catch (err) {
+ console.error(err)
+ }
+
+ guides = _.sortBy(guides, 'channel')
+
+ const outputFilepath = `${OUTPUT_DIR}/guides.json`
+ await file.create(outputFilepath, JSON.stringify(guides))
+ logger.info(`saved to "${outputFilepath}"...`)
+}
+
+main()
diff --git a/scripts/commands/lint.js b/scripts/commands/channels/lint.js
similarity index 94%
rename from scripts/commands/lint.js
rename to scripts/commands/channels/lint.js
index a970bb8c..c14453a9 100644
--- a/scripts/commands/lint.js
+++ b/scripts/commands/channels/lint.js
@@ -1,7 +1,7 @@
const chalk = require('chalk')
const libxml = require('libxmljs')
const { program } = require('commander')
-const { logger, file } = require('../core')
+const { logger, file } = require('../../core')
const xsd = `
diff --git a/scripts/commands/channels/parse.js b/scripts/commands/channels/parse.js
new file mode 100644
index 00000000..11b76958
--- /dev/null
+++ b/scripts/commands/channels/parse.js
@@ -0,0 +1,43 @@
+const { logger, file, xml } = require('../../core')
+const { Command } = require('commander')
+const path = require('path')
+const _ = require('lodash')
+
+const program = new Command()
+program
+ .requiredOption('-c, --config ', 'Config file')
+ .option('-s, --set [args...]', 'Set custom arguments', [])
+ .option('-o, --output