diff --git a/.github/workflows/auto-update.yml b/.github/workflows/auto-update.yml index 213deb39b0..51cf6df50f 100644 --- a/.github/workflows/auto-update.yml +++ b/.github/workflows/auto-update.yml @@ -20,90 +20,6 @@ jobs: format: runs-on: ubuntu-latest needs: create-branch - steps: - - name: Checkout - uses: actions/checkout@v2 - with: - ref: bot/auto-update - - name: Install Dependencies - run: npm install - - name: Format Playlists - run: node scripts/format.js - - name: Commit Changes - uses: stefanzweifel/git-auto-commit-action@v4 - with: - commit_message: '[Bot] Formate playlists' - commit_user_name: iptv-bot - commit_user_email: 84861620+iptv-bot[bot]@users.noreply.github.com - commit_author: 'iptv-bot[bot] <84861620+iptv-bot[bot]@users.noreply.github.com>' - branch: bot/auto-update - file_pattern: channels/* - sort: - runs-on: ubuntu-latest - needs: format - steps: - - name: Checkout - uses: actions/checkout@v2 - with: - ref: bot/auto-update - - name: Install Dependencies - run: npm install - - name: Sort Channels - run: node scripts/sort.js - - name: Commit Changes - uses: stefanzweifel/git-auto-commit-action@v4 - with: - commit_message: '[Bot] Sort channels' - commit_user_name: iptv-bot - commit_user_email: 84861620+iptv-bot[bot]@users.noreply.github.com - commit_author: 'iptv-bot[bot] <84861620+iptv-bot[bot]@users.noreply.github.com>' - branch: bot/auto-update - file_pattern: channels/* - remove-duplicates: - runs-on: ubuntu-latest - needs: sort - steps: - - name: Checkout - uses: actions/checkout@v2 - with: - ref: bot/auto-update - - name: Install Dependencies - run: npm install - - name: Remove Duplicates - run: node scripts/remove-duplicates.js - - name: Commit Changes - uses: stefanzweifel/git-auto-commit-action@v4 - with: - commit_message: '[Bot] Remove duplicates' - commit_user_name: iptv-bot - commit_user_email: 84861620+iptv-bot[bot]@users.noreply.github.com - commit_author: 'iptv-bot[bot] <84861620+iptv-bot[bot]@users.noreply.github.com>' - branch: bot/auto-update - file_pattern: channels/* - filter: - runs-on: ubuntu-latest - needs: remove-duplicates - steps: - - name: Checkout - uses: actions/checkout@v2 - with: - ref: bot/auto-update - - name: Install Dependencies - run: npm install - - name: Filter Playlists - run: node scripts/filter.js - - name: Commit Changes - uses: stefanzweifel/git-auto-commit-action@v4 - with: - commit_message: '[Bot] Filter channels' - commit_user_name: iptv-bot - commit_user_email: 84861620+iptv-bot[bot]@users.noreply.github.com - commit_author: 'iptv-bot[bot] <84861620+iptv-bot[bot]@users.noreply.github.com>' - branch: bot/auto-update - file_pattern: channels/* - detect-resolution: - runs-on: ubuntu-latest - needs: filter continue-on-error: true strategy: fail-fast: false @@ -277,10 +193,12 @@ jobs: uses: actions/checkout@v2 with: ref: bot/auto-update + - name: Setup FFmpeg + uses: FedericoCarboni/setup-ffmpeg@v1 - name: Install Dependencies run: npm install - - name: Detect Resolution - run: node scripts/detect-resolution.js --country=${{ matrix.country }} + - name: Format Playlists + run: node scripts/format.js --country=${{ matrix.country }} --status --resolution --debug - name: Upload Artifact uses: actions/upload-artifact@v2 with: @@ -288,7 +206,7 @@ jobs: path: channels/${{ matrix.country }}.m3u commit-changes: runs-on: ubuntu-latest - needs: detect-resolution + needs: format steps: - name: Checkout uses: actions/checkout@v2 @@ -302,7 +220,70 @@ jobs: - name: Commit Changes uses: stefanzweifel/git-auto-commit-action@v4 with: - commit_message: '[Bot] Detect resolution' + commit_message: '[Bot] Format playlists' + commit_user_name: iptv-bot + commit_user_email: 84861620+iptv-bot[bot]@users.noreply.github.com + commit_author: 'iptv-bot[bot] <84861620+iptv-bot[bot]@users.noreply.github.com>' + branch: bot/auto-update + file_pattern: channels/* + remove-duplicates: + runs-on: ubuntu-latest + needs: commit-changes + steps: + - name: Checkout + uses: actions/checkout@v2 + with: + ref: bot/auto-update + - name: Install Dependencies + run: npm install + - name: Remove Duplicates + run: node scripts/remove-duplicates.js + - name: Commit Changes + uses: stefanzweifel/git-auto-commit-action@v4 + with: + commit_message: '[Bot] Remove duplicates' + commit_user_name: iptv-bot + commit_user_email: 84861620+iptv-bot[bot]@users.noreply.github.com + commit_author: 'iptv-bot[bot] <84861620+iptv-bot[bot]@users.noreply.github.com>' + branch: bot/auto-update + file_pattern: channels/* + sort: + runs-on: ubuntu-latest + needs: remove-duplicates + steps: + - name: Checkout + uses: actions/checkout@v2 + with: + ref: bot/auto-update + - name: Install Dependencies + run: npm install + - name: Sort Channels + run: node scripts/sort.js + - name: Commit Changes + uses: stefanzweifel/git-auto-commit-action@v4 + with: + commit_message: '[Bot] Sort channels' + commit_user_name: iptv-bot + commit_user_email: 84861620+iptv-bot[bot]@users.noreply.github.com + commit_author: 'iptv-bot[bot] <84861620+iptv-bot[bot]@users.noreply.github.com>' + branch: bot/auto-update + file_pattern: channels/* + filter: + runs-on: ubuntu-latest + needs: sort + steps: + - name: Checkout + uses: actions/checkout@v2 + with: + ref: bot/auto-update + - name: Install Dependencies + run: npm install + - name: Filter Playlists + run: node scripts/filter.js + - name: Commit Changes + uses: stefanzweifel/git-auto-commit-action@v4 + with: + commit_message: '[Bot] Filter channels' commit_user_name: iptv-bot commit_user_email: 84861620+iptv-bot[bot]@users.noreply.github.com commit_author: 'iptv-bot[bot] <84861620+iptv-bot[bot]@users.noreply.github.com>' @@ -310,7 +291,7 @@ jobs: file_pattern: channels/* generate: runs-on: ubuntu-latest - needs: commit-changes + needs: filter steps: - name: Checkout uses: actions/checkout@v2 @@ -376,6 +357,7 @@ jobs: branch: bot/auto-update file_pattern: README.md pull-request: + if: ${{ github.ref == 'refs/heads/master' }} needs: update-readme runs-on: ubuntu-latest steps: @@ -408,7 +390,6 @@ jobs: pull-request-number: ${{ steps.pr.outputs.pr_number }} merge-method: squash - name: Approve Pull Request - if: github.ref == 'refs/heads/master' uses: juliangruber/approve-pull-request-action@v1 with: github-token: ${{ secrets.PAT }} diff --git a/.github/workflows/clean.yml b/.github/workflows/clean.yml deleted file mode 100644 index 3c1f9a4520..0000000000 --- a/.github/workflows/clean.yml +++ /dev/null @@ -1,257 +0,0 @@ -name: clean -on: - workflow_dispatch: - schedule: - - cron: '0 6 * * 0' -jobs: - create-branch: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v2 - with: - ref: ${{ github.ref }} - - name: Create Branch - uses: peterjgrainger/action-create-branch@v2.0.1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - branch: 'bot/remove-broken-links' - check: - runs-on: ubuntu-latest - needs: create-branch - continue-on-error: true - strategy: - fail-fast: false - matrix: - country: - [ - ad, - ae, - af, - ag, - al, - am, - an, - ao, - ar, - at, - au, - aw, - az, - ba, - bb, - bd, - be, - bf, - bg, - bh, - bn, - bo, - br, - bs, - by, - ca, - cd, - cg, - ch, - ci, - cl, - cm, - cn, - co, - cr, - cu, - cw, - cy, - cz, - de, - dk, - do, - dz, - ec, - ee, - eg, - es, - et, - fi, - fj, - fo, - fr, - pf, - ge, - gh, - gm, - gn, - gp, - gq, - gr, - gt, - hk, - hn, - hr, - ht, - hu, - id, - ie, - il, - in, - iq, - ir, - is, - it, - jm, - jo, - jp, - ke, - kg, - kh, - kp, - kr, - kw, - kz, - la, - lb, - li, - lk, - lt, - lu, - lv, - ly, - ma, - mc, - md, - me, - mk, - ml, - mm, - mn, - mo, - mt, - mv, - mx, - my, - mz, - ne, - ng, - ni, - nl, - no, - np, - nz, - om, - pa, - pe, - ph, - pk, - pl, - pr, - ps, - pt, - py, - qa, - ro, - rs, - ru, - rw, - sa, - sd, - se, - sg, - si, - sk, - sl, - sm, - sn, - so, - sv, - sy, - th, - tj, - tm, - tn, - tr, - tt, - tw, - tz, - ua, - ug, - uk, - us, - uy, - uz, - va, - ve, - vi, - vn, - xk, - ye, - zm, - unsorted - ] - steps: - - name: Checkout - uses: actions/checkout@v2 - with: - ref: bot/remove-broken-links - - name: Setup FFmpeg - uses: FedericoCarboni/setup-ffmpeg@v1 - - name: Install Dependencies - run: npm install - - name: Remove Broken Links - run: node scripts/clean.js --country=${{ matrix.country }} --debug - - name: Upload Artifact - uses: actions/upload-artifact@v2 - with: - name: channels - path: channels/${{ matrix.country }}.m3u - commit-changes: - runs-on: ubuntu-latest - needs: check - steps: - - name: Checkout - uses: actions/checkout@v2 - with: - ref: bot/remove-broken-links - - name: Download Artifacts - uses: actions/download-artifact@v2 - - name: Commit Changes - uses: stefanzweifel/git-auto-commit-action@v4 - with: - commit_message: '[Bot] Remove broken links' - commit_user_name: iptv-bot - commit_user_email: 84861620+iptv-bot[bot]@users.noreply.github.com - commit_author: 'iptv-bot[bot] <84861620+iptv-bot[bot]@users.noreply.github.com>' - branch: bot/remove-broken-links - file_pattern: channels/* - pull-request: - if: ${{ github.ref == 'refs/heads/master' }} - runs-on: ubuntu-latest - needs: commit-changes - steps: - - name: Checkout - uses: actions/checkout@v2 - with: - ref: bot/remove-broken-links - - name: Generate Token - uses: tibdex/github-app-token@v1 - id: generate-token - with: - app_id: ${{ secrets.APP_ID }} - private_key: ${{ secrets.APP_PRIVATE_KEY }} - - name: Create Pull Request - uses: repo-sync/pull-request@v2 - with: - source_branch: 'bot/remove-broken-links' - destination_branch: 'master' - pr_title: '[Bot] Remove broken links' - pr_body: | - This pull request is created by [clean][1] workflow. - - The script checks all links except those with labels `[Geo-blocked]`, `[Offline]` or `[Not 24/7]` in the title. - - **IMPORTANT:** Before merging all links should be checked manually to make sure that the response from the server has not changed. If the link works for you but occasionally return an HTTP code 403 (Forbidden) then it should be marked as `[Geo-blocked]`. If the link does not work but has no alternative, you can mark it as `[Offline]` to save it in the playlist along with a description. Working links should be marked as `[Not 24/7]` so that the script will skip them next time. - - [1]: https://github.com/iptv-org/iptv/actions/runs/${{ github.run_id }} - pr_draft: true - github_token: ${{ steps.generate-token.outputs.token }} diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a111b67135..ef08f6c077 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -125,7 +125,7 @@ STREAM_URL | `LANGUAGE` | Channel language. The name of the language must conform to the standard [ISO 639-3](https://iso639-3.sil.org/code_tables/639/data?title=&field_iso639_cd_st_mmbrshp_639_1_tid=94671&name_3=&field_iso639_element_scope_tid=All&field_iso639_language_type_tid=51&items_per_page=500). If the channel is broadcast in several languages you can list them separated by a semicolon. (optional) | | `LOGO_URL` | The logo of the channel that will be displayed if the player supports it. Supports files in png, jpeg and gif format. (optional) | | `CATEGORY` | The category to which the channel belongs. The list of currently supported categories can be found [here](https://github.com/iptv-org/iptv#playlists-by-category). (optional) | -| `FULL_NAME` | Full name of the channel. It is recommended to use the name listed on [lyngsat](https://www.lyngsat.com/search.html) or [wikipedia](https://www.wikipedia.org/) if possible. May contain any characters except plus sign, minus sign, round and square brackets. | +| `FULL_NAME` | Full name of the channel. It is recommended to use the name listed on [lyngsat](https://www.lyngsat.com/search.html) or [wikipedia](https://www.wikipedia.org/) if possible. May contain any characters except round and square brackets. | | `STREAM_TIME_SHIFT` | Must be specified if the channel is broadcast with a shift in time relative to the main stream. Should only contain a number and a sign. (optional) | | `ALTERNATIVE_NAME` | Can be used to specify a short name or name in another language. May contain any characters except round and square brackets. (optional) | | `STREAM_RESOLUTION` | The maximum height of the frame with a "p" at the end. In case of VLC Player this information can be found in `Window > Media Information... > Codec Details`. (optional) | @@ -153,7 +153,8 @@ http://example.com/stream.m3u8 - `.github/` - `ISSUE_TEMPLATE/`: issue templates for this repository. - `workflows/` - - `auto-update.yml`: contain actions that automatically updates all playlists every day. + - `auto-update.yml`: GitHub Action that automatically updates all playlists every day. + - `check.yml`: GitHub Action that automatically checks every pull request for syntax errors. - `CODE_OF_CONDUCT.md`: rules you shouldn't break if you don't want to get banned. - `.readme/` - `_categories.md`: automatically generated list of all categories and their corresponding playlists. @@ -168,8 +169,6 @@ http://example.com/stream.m3u8 - `unsorted.m3u`: playlist with channels not yet sorted. - `scripts/` - `helpers/`: helper scripts used in GitHub Actions. - - `clean.js`: used in GitHub Action to check all links and remove broken ones. - - `detect-resolution.js`: used in GitHub Action to detect resolution of the streams. - `filter.js`: used within GitHub Action to remove blacklisted channels from playlists. - `format.js`: used within GitHub Action to format channel descriptions. - `generate.js`: used within GitHub Action to generate all additional playlists. diff --git a/README.md b/README.md index f8bad600ce..19431a44fe 100644 --- a/README.md +++ b/README.md @@ -40,19 +40,19 @@ Or select one of the playlists from the list below. Classic78https://iptv-org.github.io/iptv/categories/classic.m3u Comedy89https://iptv-org.github.io/iptv/categories/comedy.m3u Cooking54https://iptv-org.github.io/iptv/categories/cooking.m3u - Culture12https://iptv-org.github.io/iptv/categories/culture.m3u - Documentary70https://iptv-org.github.io/iptv/categories/documentary.m3u + Culture13https://iptv-org.github.io/iptv/categories/culture.m3u + Documentary68https://iptv-org.github.io/iptv/categories/documentary.m3u Education22https://iptv-org.github.io/iptv/categories/education.m3u Entertainment212https://iptv-org.github.io/iptv/categories/entertainment.m3u Family54https://iptv-org.github.io/iptv/categories/family.m3u - General339https://iptv-org.github.io/iptv/categories/general.m3u + General338https://iptv-org.github.io/iptv/categories/general.m3u Kids213https://iptv-org.github.io/iptv/categories/kids.m3u Legislative61https://iptv-org.github.io/iptv/categories/legislative.m3u Lifestyle94https://iptv-org.github.io/iptv/categories/lifestyle.m3u - Local543https://iptv-org.github.io/iptv/categories/local.m3u - Movies277https://iptv-org.github.io/iptv/categories/movies.m3u + Local549https://iptv-org.github.io/iptv/categories/local.m3u + Movies278https://iptv-org.github.io/iptv/categories/movies.m3u Music410https://iptv-org.github.io/iptv/categories/music.m3u - News491https://iptv-org.github.io/iptv/categories/news.m3u + News492https://iptv-org.github.io/iptv/categories/news.m3u Outdoor52https://iptv-org.github.io/iptv/categories/outdoor.m3u Relax19https://iptv-org.github.io/iptv/categories/relax.m3u Religious287https://iptv-org.github.io/iptv/categories/religious.m3u @@ -63,7 +63,7 @@ Or select one of the playlists from the list below. Travel28https://iptv-org.github.io/iptv/categories/travel.m3u Weather19https://iptv-org.github.io/iptv/categories/weather.m3u XXX59https://iptv-org.github.io/iptv/categories/xxx.m3u - Other4923https://iptv-org.github.io/iptv/categories/other.m3u + Other4877https://iptv-org.github.io/iptv/categories/other.m3u @@ -93,17 +93,17 @@ Or select one of the playlists from the list below. Bosnian11https://iptv-org.github.io/iptv/languages/bos.m3u Bulgarian10https://iptv-org.github.io/iptv/languages/bul.m3u Burmese1https://iptv-org.github.io/iptv/languages/mya.m3u - Catalan10https://iptv-org.github.io/iptv/languages/cat.m3u - Chinese670https://iptv-org.github.io/iptv/languages/zho.m3u + Catalan11https://iptv-org.github.io/iptv/languages/cat.m3u + Chinese659https://iptv-org.github.io/iptv/languages/zho.m3u Croatian14https://iptv-org.github.io/iptv/languages/hrv.m3u Czech21https://iptv-org.github.io/iptv/languages/ces.m3u Danish4https://iptv-org.github.io/iptv/languages/dan.m3u Dutch60https://iptv-org.github.io/iptv/languages/nld.m3u - English2439https://iptv-org.github.io/iptv/languages/eng.m3u + English2438https://iptv-org.github.io/iptv/languages/eng.m3u Estonian3https://iptv-org.github.io/iptv/languages/est.m3u Faroese1https://iptv-org.github.io/iptv/languages/fao.m3u Finnish1https://iptv-org.github.io/iptv/languages/fin.m3u - French194https://iptv-org.github.io/iptv/languages/fra.m3u + French193https://iptv-org.github.io/iptv/languages/fra.m3u Galician9https://iptv-org.github.io/iptv/languages/glg.m3u Georgian8https://iptv-org.github.io/iptv/languages/kat.m3u German206https://iptv-org.github.io/iptv/languages/deu.m3u @@ -130,7 +130,7 @@ Or select one of the playlists from the list below. Malay (macrolanguage)7https://iptv-org.github.io/iptv/languages/msa.m3u Malayalam24https://iptv-org.github.io/iptv/languages/mal.m3u Maltese3https://iptv-org.github.io/iptv/languages/mlt.m3u - Mandarin Chinese77https://iptv-org.github.io/iptv/languages/cmn.m3u + Mandarin Chinese78https://iptv-org.github.io/iptv/languages/cmn.m3u Maori2https://iptv-org.github.io/iptv/languages/mri.m3u Min Nan Chinese3https://iptv-org.github.io/iptv/languages/nan.m3u Modern Greek (1453-)31https://iptv-org.github.io/iptv/languages/ell.m3u @@ -144,13 +144,13 @@ Or select one of the playlists from the list below. Polish33https://iptv-org.github.io/iptv/languages/pol.m3u Portuguese108https://iptv-org.github.io/iptv/languages/por.m3u Romanian64https://iptv-org.github.io/iptv/languages/ron.m3u - Russian300https://iptv-org.github.io/iptv/languages/rus.m3u + Russian302https://iptv-org.github.io/iptv/languages/rus.m3u Serbian17https://iptv-org.github.io/iptv/languages/srp.m3u Sinhala5https://iptv-org.github.io/iptv/languages/sin.m3u Slovak26https://iptv-org.github.io/iptv/languages/slk.m3u Slovenian6https://iptv-org.github.io/iptv/languages/slv.m3u Somali6https://iptv-org.github.io/iptv/languages/som.m3u - Spanish626https://iptv-org.github.io/iptv/languages/spa.m3u + Spanish624https://iptv-org.github.io/iptv/languages/spa.m3u Sundanese1https://iptv-org.github.io/iptv/languages/sun.m3u Swedish11https://iptv-org.github.io/iptv/languages/swe.m3u Tagalog6https://iptv-org.github.io/iptv/languages/tgl.m3u @@ -165,7 +165,7 @@ Or select one of the playlists from the list below. Vietnamese69https://iptv-org.github.io/iptv/languages/vie.m3u Western Frisian1https://iptv-org.github.io/iptv/languages/fry.m3u Yue Chinese10https://iptv-org.github.io/iptv/languages/yue.m3u - Undefined2688https://iptv-org.github.io/iptv/languages/undefined.m3u + Undefined2659https://iptv-org.github.io/iptv/languages/undefined.m3u @@ -187,10 +187,10 @@ Or select one of the playlists from the list below. 🇦🇱 Albania24https://iptv-org.github.io/iptv/countries/al.m3u 🇩🇿 Algeria72https://iptv-org.github.io/iptv/countries/dz.m3u 🇦🇸 American Samoa3https://iptv-org.github.io/iptv/countries/as.m3u - 🇦🇩 Andorra10https://iptv-org.github.io/iptv/countries/ad.m3u + 🇦🇩 Andorra11https://iptv-org.github.io/iptv/countries/ad.m3u 🇦🇴 Angola3https://iptv-org.github.io/iptv/countries/ao.m3u 🇦🇬 Antigua & Barbuda1https://iptv-org.github.io/iptv/countries/ag.m3u - 🇦🇷 Argentina77https://iptv-org.github.io/iptv/countries/ar.m3u + 🇦🇷 Argentina72https://iptv-org.github.io/iptv/countries/ar.m3u 🇦🇲 Armenia35https://iptv-org.github.io/iptv/countries/am.m3u 🇦🇼 Aruba2https://iptv-org.github.io/iptv/countries/aw.m3u 🇦🇺 Australia99https://iptv-org.github.io/iptv/countries/au.m3u @@ -204,10 +204,10 @@ Or select one of the playlists from the list below. 🇧🇪 Belgium29https://iptv-org.github.io/iptv/countries/be.m3u 🇧🇯 Benin1https://iptv-org.github.io/iptv/countries/bj.m3u 🇧🇹 Bhutan7https://iptv-org.github.io/iptv/countries/bt.m3u - 🇧🇴 Bolivia33https://iptv-org.github.io/iptv/countries/bo.m3u + 🇧🇴 Bolivia28https://iptv-org.github.io/iptv/countries/bo.m3u 🇧🇦 Bosnia16https://iptv-org.github.io/iptv/countries/ba.m3u 🇧🇼 Botswana1https://iptv-org.github.io/iptv/countries/bw.m3u - 🇧🇷 Brazil162https://iptv-org.github.io/iptv/countries/br.m3u + 🇧🇷 Brazil157https://iptv-org.github.io/iptv/countries/br.m3u 🇧🇳 Brunei5https://iptv-org.github.io/iptv/countries/bn.m3u 🇧🇬 Bulgaria33https://iptv-org.github.io/iptv/countries/bg.m3u 🇧🇫 Burkina Faso5https://iptv-org.github.io/iptv/countries/bf.m3u @@ -218,16 +218,16 @@ Or select one of the playlists from the list below. 🇨🇻 Cape Verde1https://iptv-org.github.io/iptv/countries/cv.m3u 🇨🇫 Central African Republic1https://iptv-org.github.io/iptv/countries/cf.m3u 🇹🇩 Chad1https://iptv-org.github.io/iptv/countries/td.m3u - 🇨🇱 Chile93https://iptv-org.github.io/iptv/countries/cl.m3u - 🇨🇳 China790https://iptv-org.github.io/iptv/countries/cn.m3u - 🇨🇴 Colombia54https://iptv-org.github.io/iptv/countries/co.m3u + 🇨🇱 Chile88https://iptv-org.github.io/iptv/countries/cl.m3u + 🇨🇳 China772https://iptv-org.github.io/iptv/countries/cn.m3u + 🇨🇴 Colombia49https://iptv-org.github.io/iptv/countries/co.m3u 🇰🇲 Comoros43https://iptv-org.github.io/iptv/countries/km.m3u 🇨🇬 Congo - Brazzaville9https://iptv-org.github.io/iptv/countries/cg.m3u 🇨🇩 Congo - Kinshasa6https://iptv-org.github.io/iptv/countries/cd.m3u 🇨🇰 Cook Islands3https://iptv-org.github.io/iptv/countries/ck.m3u - 🇨🇷 Costa Rica52https://iptv-org.github.io/iptv/countries/cr.m3u + 🇨🇷 Costa Rica47https://iptv-org.github.io/iptv/countries/cr.m3u 🇭🇷 Croatia18https://iptv-org.github.io/iptv/countries/hr.m3u - 🇨🇺 Cuba29https://iptv-org.github.io/iptv/countries/cu.m3u + 🇨🇺 Cuba24https://iptv-org.github.io/iptv/countries/cu.m3u 🇨🇼 Curaçao5https://iptv-org.github.io/iptv/countries/cw.m3u 🇦🇳 Curaçao1https://iptv-org.github.io/iptv/countries/an.m3u 🇨🇾 Cyprus15https://iptv-org.github.io/iptv/countries/cy.m3u @@ -235,10 +235,10 @@ Or select one of the playlists from the list below. 🇨🇮 Côte d’Ivoire2https://iptv-org.github.io/iptv/countries/ci.m3u 🇩🇰 Denmark16https://iptv-org.github.io/iptv/countries/dk.m3u 🇩🇯 Djibouti45https://iptv-org.github.io/iptv/countries/dj.m3u - 🇩🇴 Dominican Republic88https://iptv-org.github.io/iptv/countries/do.m3u - 🇪🇨 Ecuador27https://iptv-org.github.io/iptv/countries/ec.m3u + 🇩🇴 Dominican Republic83https://iptv-org.github.io/iptv/countries/do.m3u + 🇪🇨 Ecuador22https://iptv-org.github.io/iptv/countries/ec.m3u 🇪🇬 Egypt75https://iptv-org.github.io/iptv/countries/eg.m3u - 🇸🇻 El Salvador37https://iptv-org.github.io/iptv/countries/sv.m3u + 🇸🇻 El Salvador32https://iptv-org.github.io/iptv/countries/sv.m3u 🇬🇶 Equatorial Guinea4https://iptv-org.github.io/iptv/countries/gq.m3u 🇪🇷 Eritrea1https://iptv-org.github.io/iptv/countries/er.m3u 🇪🇪 Estonia14https://iptv-org.github.io/iptv/countries/ee.m3u @@ -247,8 +247,8 @@ Or select one of the playlists from the list below. 🇫🇴 Faroe Islands1https://iptv-org.github.io/iptv/countries/fo.m3u 🇫🇯 Fiji4https://iptv-org.github.io/iptv/countries/fj.m3u 🇫🇮 Finland10https://iptv-org.github.io/iptv/countries/fi.m3u - 🇫🇷 France219https://iptv-org.github.io/iptv/countries/fr.m3u - 🇬🇫 French Guiana23https://iptv-org.github.io/iptv/countries/gf.m3u + 🇫🇷 France218https://iptv-org.github.io/iptv/countries/fr.m3u + 🇬🇫 French Guiana18https://iptv-org.github.io/iptv/countries/gf.m3u 🇵🇫 French Polynesia4https://iptv-org.github.io/iptv/countries/pf.m3u 🇹🇫 French Southern Territories1https://iptv-org.github.io/iptv/countries/tf.m3u 🇬🇦 Gabon1https://iptv-org.github.io/iptv/countries/ga.m3u @@ -257,13 +257,13 @@ Or select one of the playlists from the list below. 🇩🇪 Germany258https://iptv-org.github.io/iptv/countries/de.m3u 🇬🇭 Ghana3https://iptv-org.github.io/iptv/countries/gh.m3u 🇬🇷 Greece122https://iptv-org.github.io/iptv/countries/gr.m3u - 🇬🇵 Guadeloupe24https://iptv-org.github.io/iptv/countries/gp.m3u + 🇬🇵 Guadeloupe19https://iptv-org.github.io/iptv/countries/gp.m3u 🇬🇺 Guam3https://iptv-org.github.io/iptv/countries/gu.m3u - 🇬🇹 Guatemala28https://iptv-org.github.io/iptv/countries/gt.m3u + 🇬🇹 Guatemala23https://iptv-org.github.io/iptv/countries/gt.m3u 🇬🇳 Guinea2https://iptv-org.github.io/iptv/countries/gn.m3u 🇬🇼 Guinea-Bissau1https://iptv-org.github.io/iptv/countries/gw.m3u - 🇭🇹 Haiti26https://iptv-org.github.io/iptv/countries/ht.m3u - 🇭🇳 Honduras36https://iptv-org.github.io/iptv/countries/hn.m3u + 🇭🇹 Haiti21https://iptv-org.github.io/iptv/countries/ht.m3u + 🇭🇳 Honduras31https://iptv-org.github.io/iptv/countries/hn.m3u 🇭🇰 Hong Kong21https://iptv-org.github.io/iptv/countries/hk.m3u 🇭🇺 Hungary36https://iptv-org.github.io/iptv/countries/hu.m3u 🇮🇸 Iceland9https://iptv-org.github.io/iptv/countries/is.m3u @@ -298,14 +298,14 @@ Or select one of the playlists from the list below. 🇲🇼 Malawi1https://iptv-org.github.io/iptv/countries/mw.m3u 🇲🇾 Malaysia44https://iptv-org.github.io/iptv/countries/my.m3u 🇲🇻 Maldives8https://iptv-org.github.io/iptv/countries/mv.m3u - 🇲🇱 Mali1https://iptv-org.github.io/iptv/countries/ml.m3u + 🇲🇱 Mali2https://iptv-org.github.io/iptv/countries/ml.m3u 🇲🇹 Malta7https://iptv-org.github.io/iptv/countries/mt.m3u 🇲🇭 Marshall Islands3https://iptv-org.github.io/iptv/countries/mh.m3u - 🇲🇶 Martinique23https://iptv-org.github.io/iptv/countries/mq.m3u + 🇲🇶 Martinique18https://iptv-org.github.io/iptv/countries/mq.m3u 🇲🇷 Mauritania43https://iptv-org.github.io/iptv/countries/mr.m3u 🇲🇺 Mauritius2https://iptv-org.github.io/iptv/countries/mu.m3u 🇾🇹 Mayotte1https://iptv-org.github.io/iptv/countries/yt.m3u - 🇲🇽 Mexico80https://iptv-org.github.io/iptv/countries/mx.m3u + 🇲🇽 Mexico75https://iptv-org.github.io/iptv/countries/mx.m3u 🇫🇲 Micronesia3https://iptv-org.github.io/iptv/countries/fm.m3u 🇲🇩 Moldova21https://iptv-org.github.io/iptv/countries/md.m3u 🇲🇨 Monaco7https://iptv-org.github.io/iptv/countries/mc.m3u @@ -320,7 +320,7 @@ Or select one of the playlists from the list below. 🇳🇱 Netherlands135https://iptv-org.github.io/iptv/countries/nl.m3u 🇳🇨 New Caledonia3https://iptv-org.github.io/iptv/countries/nc.m3u 🇳🇿 New Zealand22https://iptv-org.github.io/iptv/countries/nz.m3u - 🇳🇮 Nicaragua34https://iptv-org.github.io/iptv/countries/ni.m3u + 🇳🇮 Nicaragua29https://iptv-org.github.io/iptv/countries/ni.m3u 🇳🇪 Niger2https://iptv-org.github.io/iptv/countries/ne.m3u 🇳🇬 Nigeria7https://iptv-org.github.io/iptv/countries/ng.m3u 🇳🇺 Niue3https://iptv-org.github.io/iptv/countries/nu.m3u @@ -333,18 +333,18 @@ Or select one of the playlists from the list below. 🇵🇰 Pakistan29https://iptv-org.github.io/iptv/countries/pk.m3u 🇵🇼 Palau3https://iptv-org.github.io/iptv/countries/pw.m3u 🇵🇸 Palestine68https://iptv-org.github.io/iptv/countries/ps.m3u - 🇵🇦 Panama35https://iptv-org.github.io/iptv/countries/pa.m3u + 🇵🇦 Panama30https://iptv-org.github.io/iptv/countries/pa.m3u 🇵🇬 Papua New Guinea3https://iptv-org.github.io/iptv/countries/pg.m3u - 🇵🇾 Paraguay33https://iptv-org.github.io/iptv/countries/py.m3u - 🇵🇪 Peru107https://iptv-org.github.io/iptv/countries/pe.m3u + 🇵🇾 Paraguay28https://iptv-org.github.io/iptv/countries/py.m3u + 🇵🇪 Peru106https://iptv-org.github.io/iptv/countries/pe.m3u 🇵🇭 Philippines20https://iptv-org.github.io/iptv/countries/ph.m3u 🇵🇳 Pitcairn Islands3https://iptv-org.github.io/iptv/countries/pn.m3u 🇵🇱 Poland45https://iptv-org.github.io/iptv/countries/pl.m3u 🇵🇹 Portugal41https://iptv-org.github.io/iptv/countries/pt.m3u - 🇵🇷 Puerto Rico33https://iptv-org.github.io/iptv/countries/pr.m3u + 🇵🇷 Puerto Rico28https://iptv-org.github.io/iptv/countries/pr.m3u 🇶🇦 Qatar56https://iptv-org.github.io/iptv/countries/qa.m3u 🇷🇴 Romania76https://iptv-org.github.io/iptv/countries/ro.m3u - 🇷🇺 Russia396https://iptv-org.github.io/iptv/countries/ru.m3u + 🇷🇺 Russia386https://iptv-org.github.io/iptv/countries/ru.m3u 🇷🇼 Rwanda5https://iptv-org.github.io/iptv/countries/rw.m3u 🇷🇪 Réunion1https://iptv-org.github.io/iptv/countries/re.m3u 🇼🇸 Samoa3https://iptv-org.github.io/iptv/countries/ws.m3u @@ -362,11 +362,11 @@ Or select one of the playlists from the list below. 🇿🇦 South Africa1https://iptv-org.github.io/iptv/countries/za.m3u 🇰🇷 South Korea83https://iptv-org.github.io/iptv/countries/kr.m3u 🇸🇸 South Sudan1https://iptv-org.github.io/iptv/countries/ss.m3u - 🇪🇸 Spain357https://iptv-org.github.io/iptv/countries/es.m3u + 🇪🇸 Spain343https://iptv-org.github.io/iptv/countries/es.m3u 🇱🇰 Sri Lanka17https://iptv-org.github.io/iptv/countries/lk.m3u - 🇧🇱 St. Barthélemy23https://iptv-org.github.io/iptv/countries/bl.m3u + 🇧🇱 St. Barthélemy18https://iptv-org.github.io/iptv/countries/bl.m3u 🇸🇭 St. Helena1https://iptv-org.github.io/iptv/countries/sh.m3u - 🇲🇫 St. Martin23https://iptv-org.github.io/iptv/countries/mf.m3u + 🇲🇫 St. Martin18https://iptv-org.github.io/iptv/countries/mf.m3u 🇸🇩 Sudan47https://iptv-org.github.io/iptv/countries/sd.m3u 🇸🇪 Sweden23https://iptv-org.github.io/iptv/countries/se.m3u 🇨🇭 Switzerland124https://iptv-org.github.io/iptv/countries/ch.m3u @@ -391,11 +391,11 @@ Or select one of the playlists from the list below. 🇦🇪 United Arab Emirates88https://iptv-org.github.io/iptv/countries/ae.m3u 🇬🇧 United Kingdom229https://iptv-org.github.io/iptv/countries/uk.m3u 🇺🇸 United States2266https://iptv-org.github.io/iptv/countries/us.m3u - 🇺🇾 Uruguay27https://iptv-org.github.io/iptv/countries/uy.m3u + 🇺🇾 Uruguay22https://iptv-org.github.io/iptv/countries/uy.m3u 🇺🇿 Uzbekistan3https://iptv-org.github.io/iptv/countries/uz.m3u 🇻🇺 Vanuatu3https://iptv-org.github.io/iptv/countries/vu.m3u 🇻🇦 Vatican City5https://iptv-org.github.io/iptv/countries/va.m3u - 🇻🇪 Venezuela49https://iptv-org.github.io/iptv/countries/ve.m3u + 🇻🇪 Venezuela44https://iptv-org.github.io/iptv/countries/ve.m3u 🇻🇳 Vietnam71https://iptv-org.github.io/iptv/countries/vn.m3u 🇼🇫 Wallis & Futuna3https://iptv-org.github.io/iptv/countries/wf.m3u 🇪🇭 Western Sahara3https://iptv-org.github.io/iptv/countries/eh.m3u diff --git a/channels/cl.m3u b/channels/cl.m3u index bb2ed89fb8..1c5a921810 100644 --- a/channels/cl.m3u +++ b/channels/cl.m3u @@ -87,9 +87,9 @@ http://server1.oklanet.cl:1935/maximavideo1/maximavideo1/playlist.m3u8 https://unlimited1-cl.dps.live/radioztv/radioztv.smil/playlist.m3u8 #EXTINF:-1 tvg-id="RadioZetaTV.cl" tvg-name="Radio Zeta TV" tvg-country="CL" tvg-language="Spanish" tvg-logo="http://ik.imagekit.io/ulangotv/image/upload/3788384_logo_radio_zeta.png" group-title="",Radio Zeta TV (480p) [Not 24/7] https://unlimited1-us.dps.live/radioztv/radioztv.smil/playlist.m3u8 -#EXTINF:-1 tvg-id="RetroPlus2HD.cl" tvg-name="Retro Plus 2 HD" tvg-country="CL" tvg-language="" tvg-logo="https://i.imgur.com/i0rZsgG.png" group-title="Music",Retro Plus 2 HD (720p) +#EXTINF:-1 tvg-id="RetroPlus2HD.cl" tvg-name="Retro Plus 2 HD" tvg-country="CL;PE" tvg-language="" tvg-logo="https://i.imgur.com/i0rZsgG.png" group-title="Music",Retro Plus 2 HD (720p) https://59f1cbe63db89.streamlock.net:1443/retroplussenal2/retroplussenal2/playlist.m3u8 -#EXTINF:-1 tvg-id="RetroPlusHD.cl" tvg-name="Retro Plus HD" tvg-country="CL" tvg-language="" tvg-logo="https://i.imgur.com/i0rZsgG.png" group-title="Music",Retro Plus HD (720p) +#EXTINF:-1 tvg-id="RetroPlusHD.cl" tvg-name="Retro Plus HD" tvg-country="CL;PE" tvg-language="" tvg-logo="https://i.imgur.com/i0rZsgG.png" group-title="Music",Retro Plus HD (720p) https://59f1cbe63db89.streamlock.net:1443/retroplustv/retroplustv/playlist.m3u8 #EXTINF:-1 tvg-id="RewindHD.cl" tvg-name="Rewind HD" tvg-country="CL" tvg-language="" tvg-logo="https://i.imgur.com/Ni2jlBi.png" group-title="Music",Rewind HD (720p) [Not 24/7] https://tls.cdnz.cl/rewindtv/rewindtv/playlist.m3u8 diff --git a/channels/cn.m3u b/channels/cn.m3u index 2c552b66a8..35593a4eda 100644 --- a/channels/cn.m3u +++ b/channels/cn.m3u @@ -1,6 +1,22 @@ #EXTM3U #EXTINF:-1 tvg-id="BlueMeiJuPinDao.cn" tvg-name="Blue 美剧频道" tvg-country="CN" tvg-language="Chinese" tvg-logo="https://parco-zh.github.io/demo/BLUE.png" group-title="",Blue 美剧频道 [Geo-blocked] http://210.210.155.35:80/dr9445/h/h16/02.m3u8 +#EXTINF:-1 tvg-id="BTVWeiShi.cn" tvg-name="BTV卫视" tvg-country="CN" tvg-language="Chinese" tvg-logo="" group-title="",BTV卫视HD +http://ivi.bupt.edu.cn/hls/btv1hd.m3u8 +#EXTINF:-1 tvg-id="BTVYingShi.cn" tvg-name="BTV影视" tvg-country="CN" tvg-language="Chinese" tvg-logo="" group-title="",BTV影视 [Not 24/7] +http://ivi.bupt.edu.cn/hls/btv4.m3u8 +#EXTINF:-1 tvg-id="BTVWenYi.cn" tvg-name="BTV文艺" tvg-country="CN" tvg-language="Chinese" tvg-logo="" group-title="",BTV文艺 [Not 24/7] +http://ivi.bupt.edu.cn/hls/btv2.m3u8 +#EXTINF:-1 tvg-id="BTVWenYi.cn" tvg-name="BTV文艺" tvg-country="CN" tvg-language="Chinese" tvg-logo="" group-title="",BTV文艺HD +http://ivi.bupt.edu.cn/hls/btv2hd.m3u8 +#EXTINF:-1 tvg-id="BTVXinWen.cn" tvg-name="BTV新闻" tvg-country="CN" tvg-language="Chinese" tvg-logo="" group-title="",BTV新闻 +http://ivi.bupt.edu.cn/hls/btv9.m3u8 +#EXTINF:-1 tvg-id="BTVShengHuo.cn" tvg-name="BTV生活" tvg-country="CN" tvg-language="Chinese" tvg-logo="" group-title="",BTV生活 [Not 24/7] +http://ivi.bupt.edu.cn/hls/btv7.m3u8 +#EXTINF:-1 tvg-id="BTVKeJiao.cn" tvg-name="BTV科教" tvg-country="CN" tvg-language="Chinese" tvg-logo="" group-title="",BTV科教 [Not 24/7] +http://ivi.bupt.edu.cn/hls/btv3.m3u8 +#EXTINF:-1 tvg-id="BTVJiShi.cn" tvg-name="BTV纪实" tvg-country="CN" tvg-language="Chinese" tvg-logo="" group-title="",BTV纪实HD +http://ivi.bupt.edu.cn/hls/btv11hd.m3u8 #EXTINF:-1 tvg-id="CCTV3.cn" tvg-name="CCTV 3" tvg-country="CN" tvg-language="Chinese" tvg-logo="https://i.imgur.com/HqScjKW.jpg" group-title="",CCTV 3 http://183.207.249.14/PLTV/3/224/3221225588/index.m3u8 #EXTINF:-1 tvg-id="CCTV4.cn" tvg-name="CCTV 4" tvg-country="CN" tvg-language="Chinese" tvg-logo="https://i.imgur.com/l8PQ7fy.jpg" group-title="",CCTV 4 @@ -133,16 +149,16 @@ http://ivi.bupt.edu.cn/hls/cctv8hd.m3u8 http://117.148.187.37/PLTV/88888888/224/3221226156/index.m3u8 #EXTINF:-1 tvg-id="CCTV9.cn" tvg-name="CCTV9" tvg-country="CN" tvg-language="Chinese;Mandarin Chinese" tvg-logo="https://upload.wikimedia.org/wikipedia/zh/1/11/CCTV-9_Logo.png" group-title="Documentary",CCTV中国中央电视台-9 纪录 http://121.31.30.90:8085/ysten-business/live/cctv-9/yst.m3u8 +#EXTINF:-1 tvg-id="CGTNArabic.cn" tvg-name="CGTN Arabic" tvg-country="CN" tvg-language="Arabic" tvg-logo="https://ui.cgtn.com/static/resource/images/icon_new/live/live_AR.png" group-title="News",CGTN Arabic (720p) +https://news.cgtn.com/resource/live/arabic/cgtn-a.m3u8 +#EXTINF:-1 tvg-id="CGTNDocumentary.cn" tvg-name="CGTN Documentary" tvg-country="CN" tvg-language="English" tvg-logo="https://upload.wikimedia.org/wikipedia/commons/d/d6/CGTN_Documentary_logo.png" group-title="Documentary",CGTN Documentary (English) (720p) +https://news.cgtn.com/resource/live/document/cgtn-doc.m3u8 #EXTINF:-1 tvg-id="CGTNEnglish.cn" tvg-name="CGTN English" tvg-country="CN" tvg-language="English" tvg-logo="https://upload.wikimedia.org/wikipedia/commons/thumb/8/81/CGTN.svg/800px-CGTN.svg.png" group-title="News",CGTN English (720p) https://dai.google.com/linear/hls/event/r4sa-f6GSN2XIvzKv5jVng/master.m3u8 #EXTINF:-1 tvg-id="CGTNEnglish.cn" tvg-name="CGTN English" tvg-country="CN" tvg-language="English" tvg-logo="https://upload.wikimedia.org/wikipedia/commons/thumb/8/81/CGTN.svg/800px-CGTN.svg.png" group-title="News",CGTN English (720p) https://news.cgtn.com/resource/live/english/cgtn-news.m3u8 #EXTINF:-1 tvg-id="CGTNEspanol.cn" tvg-name="CGTN Español" tvg-country="CN" tvg-language="Spanish" tvg-logo="https://upload.wikimedia.org/wikipedia/commons/thumb/8/81/CGTN.svg/800px-CGTN.svg.png" group-title="News",CGTN Español (720p) https://news.cgtn.com/resource/live/espanol/cgtn-e.m3u8 -#EXTINF:-1 tvg-id="CGTNArabic.cn" tvg-name="CGTN Arabic" tvg-country="CN" tvg-language="Arabic" tvg-logo="https://ui.cgtn.com/static/resource/images/icon_new/live/live_AR.png" group-title="News",CGTN Arabic (720p) -https://news.cgtn.com/resource/live/arabic/cgtn-a.m3u8 -#EXTINF:-1 tvg-id="CGTNDocumentary.cn" tvg-name="CGTN Documentary" tvg-country="CN" tvg-language="English" tvg-logo="https://upload.wikimedia.org/wikipedia/commons/d/d6/CGTN_Documentary_logo.png" group-title="Documentary",CGTN Documentary (English) -https://news.cgtn.com/resource/live/document/cgtn-doc.m3u8 #EXTINF:-1 tvg-id="CGTNFrancais.cn" tvg-name="CGTN Français" tvg-country="CN" tvg-language="French" tvg-logo="" group-title="",CGTN Français (720p) https://news.cgtn.com/resource/live/french/cgtn-f.m3u8 #EXTINF:-1 tvg-id="ChannelV.cn" tvg-name="Channel V" tvg-country="APAC" tvg-language="Chinese" tvg-logo="https://upload.wikimedia.org/wikipedia/commons/thumb/4/4b/Channel_V_Logo.svg/1200px-Channel_V_Logo.svg.png" group-title="Music",Channel V @@ -235,6 +251,8 @@ http://l.cztvcloud.com/channels/lantian/SXshangyu1/720p.m3u8 http://l.cztvcloud.com/channels/lantian/SXshangyu3/720p.m3u8 #EXTINF:-1 tvg-id="DongXiangDianShiTai.cn" tvg-name="东乡电视台" tvg-country="CN" tvg-language="Chinese" tvg-logo="https://upload.wikimedia.org/wikipedia/zh/2/28/%E7%94%98%E8%82%83%E5%8D%AB%E8%A7%86.png" group-title="",东乡电视台 http://117.156.28.119/270000001111/1110000131/index.m3u8 +#EXTINF:-1 tvg-id="DongNanTV.cn" tvg-name="东南卫视" tvg-country="CN" tvg-language="Chinese" tvg-logo="" group-title="",东南卫视 +http://117.169.120.140:8080/live/dongnanstv/.m3u8 #EXTINF:-1 tvg-id="DongnanTV.cn" tvg-name="东南卫视" tvg-country="CN" tvg-language="Chinese" tvg-logo="" group-title="",东南卫视 http://121.31.30.90:8085/ysten-business/live/dongnanstv/1.m3u8 #EXTINF:-1 tvg-id="DongnanTV.cn" tvg-name="东南卫视" tvg-country="CN" tvg-language="Chinese" tvg-logo="" group-title="",东南卫视 @@ -243,8 +261,6 @@ http://121.31.30.90:8085/ysten-business/live/dongnanstv/yst.m3u8 http://ivi.bupt.edu.cn/hls/dntv.m3u8 #EXTINF:-1 tvg-id="DongnanTV.cn" tvg-name="东南卫视" tvg-country="CN" tvg-language="Chinese" tvg-logo="" group-title="",东南卫视 http://m-tvlmedia.public.bcs.ysten.com/ysten-business/live/dongnanstv/1.m3u8 -#EXTINF:-1 tvg-id="DongNanTV.cn" tvg-name="东南卫视" tvg-country="CN" tvg-language="Chinese" tvg-logo="" group-title="",东南卫视 -http://117.169.120.140:8080/live/dongnanstv/.m3u8 #EXTINF:-1 tvg-id="DongFangWeiShi.cn" tvg-name="东方卫视" tvg-country="CN" tvg-language="Chinese" tvg-logo="https://parco-zh.github.io/demo/dongfang.jpg" group-title="",东方卫视 http://121.31.30.90:8085/ysten-business/live/dongfangstv/1.m3u8 #EXTINF:-1 tvg-id="DongFangWeiShi.cn" tvg-name="东方卫视" tvg-country="CN" tvg-language="Chinese" tvg-logo="https://parco-zh.github.io/demo/dongfang.jpg" group-title="",东方卫视 @@ -349,7 +365,7 @@ http://121.31.30.90:8085/ysten-business/live/youmankaton/1.m3u8 http://121.31.30.90:8085/ysten-business/live/youmankaton/yst.m3u8 #EXTINF:-1 tvg-id="YouManKaTon.cn" tvg-name="优漫卡通" tvg-country="CN" tvg-language="Chinese" tvg-logo="" group-title="Kids",优漫卡通 http://m-tvlmedia.public.bcs.ysten.com/ysten-business/live/youmankaton/1.m3u8 -#EXTINF:-1 tvg-id="YouShiPinDao.cn" tvg-name="优视频道" tvg-country="CN" tvg-language="Chinese" tvg-logo="" group-title="",优视频道 +#EXTINF:-1 tvg-id="YouShiPinDao.cn" tvg-name="优视频道" tvg-country="CN" tvg-language="Chinese" tvg-logo="" group-title="",优视频道 (720p) http://1-fss24-s0.streamhoster.com/lv_uchannel/broadcast1/playlist.m3u8 #EXTINF:-1 tvg-id="YuYaoXinWenZongHe.cn" tvg-name="余姚新闻综合" tvg-country="CN" tvg-language="Chinese" tvg-logo="" group-title="",余姚新闻综合 http://l.cztvcloud.com/channels/lantian/SXyuyao1/720p.m3u8 @@ -376,11 +392,11 @@ http://v.btzx.com.cn:1935/live/news.stream/playlist.m3u8 #EXTINF:-1 tvg-id="NeiMengGuWeiShi.cn" tvg-name="内蒙古卫视" tvg-country="CN" tvg-language="Chinese" tvg-logo="http://epg.51zmt.top:8000/tb1/ws/neimeng.png" group-title="",内蒙古卫视 http://117.169.120.140:8080/live/neimenggustv/.m3u8 #EXTINF:-1 tvg-id="NeiMengGuWeiShi.cn" tvg-name="内蒙古卫视" tvg-country="CN" tvg-language="Chinese" tvg-logo="http://epg.51zmt.top:8000/tb1/ws/neimeng.png" group-title="",内蒙古卫视 +http://live.m2oplus.nmtv.cn/1/playlist.m3u8 +#EXTINF:-1 tvg-id="NeiMengGuWeiShi.cn" tvg-name="内蒙古卫视" tvg-country="CN" tvg-language="Chinese" tvg-logo="http://epg.51zmt.top:8000/tb1/ws/neimeng.png" group-title="",内蒙古卫视 http://m-tvlmedia.public.bcs.ysten.com/ysten-business/live/neimenggustv/1.m3u8 #EXTINF:-1 tvg-id="NeiMengGuWeiShi.cn" tvg-name="内蒙古卫视" tvg-country="CN" tvg-language="Chinese" tvg-logo="http://epg.51zmt.top:8000/tb1/ws/neimeng.png" group-title="",内蒙古卫视 http://m-tvlmedia.public.bcs.ysten.com/ysten-business/live/neimenggustv/yst.m3u8 -#EXTINF:-1 tvg-id="NeiMengGuWeiShi.cn" tvg-name="内蒙古卫视" tvg-country="CN" tvg-language="Chinese" tvg-logo="http://epg.51zmt.top:8000/tb1/ws/neimeng.png" group-title="",内蒙古卫视 -http://live.m2oplus.nmtv.cn/1/playlist.m3u8 #EXTINF:-1 tvg-id="MianNingDianShiTai.cn" tvg-name="冕宁电视台" tvg-country="CN" tvg-language="Chinese" tvg-logo="http://www.sichuanmianning.com/images/mianlin_tv/img/logo.png" group-title="",冕宁电视台 http://live.sichuanmianning.com/live/xwpd.m3u8 #EXTINF:-1 tvg-id="JunShiPingLun.cn" tvg-name="军事评论" tvg-country="CN" tvg-language="Chinese" tvg-logo="https://parco-zh.github.io/demo/new13.png" group-title="",军事评论 @@ -435,22 +451,6 @@ http://121.31.30.90:8085/ysten-business/live/hdbeijingstv/1.m3u8 http://121.31.30.90:8085/ysten-business/live/hdbeijingstv/yst.m3u8 #EXTINF:-1 tvg-id="BeiJingWeiShi.cn" tvg-name="北京卫视" tvg-country="CN" tvg-language="Chinese" tvg-logo="https://parco-zh.github.io/demo/bjbtv.jpg" group-title="",北京卫视HD http://223.82.250.72/live/hdbeijingstv/1.m3u8 -#EXTINF:-1 tvg-id="BTVWeiShi.cn" tvg-name="BTV卫视" tvg-country="CN" tvg-language="Chinese" tvg-logo="" group-title="",BTV卫视HD -http://ivi.bupt.edu.cn/hls/btv1hd.m3u8 -#EXTINF:-1 tvg-id="BTVYingShi.cn" tvg-name="BTV影视" tvg-country="CN" tvg-language="Chinese" tvg-logo="" group-title="",BTV影视 [Not 24/7] -http://ivi.bupt.edu.cn/hls/btv4.m3u8 -#EXTINF:-1 tvg-id="BTVWenYi.cn" tvg-name="BTV文艺" tvg-country="CN" tvg-language="Chinese" tvg-logo="" group-title="",BTV文艺 [Not 24/7] -http://ivi.bupt.edu.cn/hls/btv2.m3u8 -#EXTINF:-1 tvg-id="BTVWenYi.cn" tvg-name="BTV文艺" tvg-country="CN" tvg-language="Chinese" tvg-logo="" group-title="",BTV文艺HD -http://ivi.bupt.edu.cn/hls/btv2hd.m3u8 -#EXTINF:-1 tvg-id="BTVXinWen.cn" tvg-name="BTV新闻" tvg-country="CN" tvg-language="Chinese" tvg-logo="" group-title="",BTV新闻 -http://ivi.bupt.edu.cn/hls/btv9.m3u8 -#EXTINF:-1 tvg-id="BTVShengHuo.cn" tvg-name="BTV生活" tvg-country="CN" tvg-language="Chinese" tvg-logo="" group-title="",BTV生活 [Not 24/7] -http://ivi.bupt.edu.cn/hls/btv7.m3u8 -#EXTINF:-1 tvg-id="BTVKeJiao.cn" tvg-name="BTV科教" tvg-country="CN" tvg-language="Chinese" tvg-logo="" group-title="",BTV科教 [Not 24/7] -http://ivi.bupt.edu.cn/hls/btv3.m3u8 -#EXTINF:-1 tvg-id="BTVJiShi.cn" tvg-name="BTV纪实" tvg-country="CN" tvg-language="Chinese" tvg-logo="" group-title="",BTV纪实HD -http://ivi.bupt.edu.cn/hls/btv11hd.m3u8 #EXTINF:-1 tvg-id="BTVCaiJing.cn" tvg-name="BTV财经" tvg-country="CN" tvg-language="Chinese" tvg-logo="" group-title="",北京财经 [Not 24/7] http://ivi.bupt.edu.cn/hls/btv5.m3u8 #EXTINF:-1 tvg-id="BTVQingNian.cn" tvg-name="BTV青年" tvg-country="CN" tvg-language="Chinese" tvg-logo="" group-title="",北京青年 [Not 24/7] @@ -595,7 +595,7 @@ http://scgctvshow.sctv.com/hdlive/sctv5/index.m3u8 http://scgctvshow.sctv.com/hdlive/sctv2/index.m3u8 #EXTINF:-1 tvg-id="SCTV4.cn" tvg-name="SCTV4" tvg-country="CN" tvg-language="" tvg-logo="http://epg.51zmt.top:8000/tb1/sheng/sctv4.png" group-title="",四川新闻 (720p) http://scgctvshow.sctv.com/hdlive/sctv4/index.m3u8 -#EXTINF:-1 tvg-id="SCTV6.cn" tvg-name="SCTV6" tvg-country="CN" tvg-language="" tvg-logo="http://epg.51zmt.top:8000/tb1/sheng/sctv6.png" group-title="",四川星空购物 +#EXTINF:-1 tvg-id="SCTV6.cn" tvg-name="SCTV6" tvg-country="CN" tvg-language="" tvg-logo="http://epg.51zmt.top:8000/tb1/sheng/sctv6.png" group-title="",四川星空购物 (720p) http://scgctvshow.sctv.com/hdlive/sctv6/index.m3u8 #EXTINF:-1 tvg-id="SCTV3.cn" tvg-name="SCTV3" tvg-country="CN" tvg-language="" tvg-logo="http://epg.51zmt.top:8000/tb1/sheng/sctv3.png" group-title="",四川经济 (720p) http://scgctvshow.sctv.com/hdlive/sctv3/index.m3u8 @@ -630,13 +630,13 @@ http://121.31.30.90:8085/ysten-business/live/tianjinstv/yst.m3u8 #EXTINF:-1 tvg-id="TianJinWeiShi.cn" tvg-name="天津卫视" tvg-country="CN" tvg-language="Chinese" tvg-logo="" group-title="",天津卫视 http://ivi.bupt.edu.cn/hls/tjtv.m3u8 #EXTINF:-1 tvg-id="TianJinWeiShi.cn" tvg-name="天津卫视" tvg-country="CN" tvg-language="Chinese" tvg-logo="" group-title="",天津卫视HD -http://m-tvlmedia.public.bcs.ysten.com/ysten-business/live/hdtianjinstv/1.m3u8 +http://117.169.120.140:8080/live/hdtianjinstv/.m3u8 #EXTINF:-1 tvg-id="TianJinWeiShi.cn" tvg-name="天津卫视" tvg-country="CN" tvg-language="Chinese" tvg-logo="" group-title="",天津卫视HD http://121.31.30.90:8085/ysten-business/live/hdtianjinstv/1.m3u8 #EXTINF:-1 tvg-id="TianJinWeiShi.cn" tvg-name="天津卫视" tvg-country="CN" tvg-language="Chinese" tvg-logo="" group-title="",天津卫视HD http://121.31.30.90:8085/ysten-business/live/hdtianjinstv/yst.m3u8 #EXTINF:-1 tvg-id="TianJinWeiShi.cn" tvg-name="天津卫视" tvg-country="CN" tvg-language="Chinese" tvg-logo="" group-title="",天津卫视HD -http://117.169.120.140:8080/live/hdtianjinstv/.m3u8 +http://m-tvlmedia.public.bcs.ysten.com/ysten-business/live/hdtianjinstv/1.m3u8 #EXTINF:-1 tvg-id="TianJinWeiShiGaoQing.cn" tvg-name="天津卫视高清" tvg-country="CN" tvg-language="Chinese" tvg-logo="https://parco-zh.github.io/demo/TJWS.png" group-title="",天津卫视高清 http://ivi.bupt.edu.cn/hls/tjhd.m3u8 #EXTINF:-1 tvg-id="YangShiTiYuPinDaoCCTV5FHD100.cn" tvg-name="央视体育频道-CCTV5FHD100" tvg-country="CN" tvg-language="" tvg-logo="" group-title="",央视体育频道-CCTV5FHD100 @@ -682,15 +682,15 @@ http://121.31.30.90:8085/ysten-business/live/anhuistv/1.m3u8 #EXTINF:-1 tvg-id="AnHuiWeiShi.cn" tvg-name="安徽卫视" tvg-country="CN" tvg-language="Chinese" tvg-logo="http://s.wasu.cn/data/images/201512/24/567b9d7479d83.png" group-title="",安徽卫视 http://121.31.30.90:8085/ysten-business/live/anhuistv/yst.m3u8 #EXTINF:-1 tvg-id="AnHuiWeiShi.cn" tvg-name="安徽卫视" tvg-country="CN" tvg-language="Chinese" tvg-logo="http://s.wasu.cn/data/images/201512/24/567b9d7479d83.png" group-title="",安徽卫视 +http://125.210.152.10:8060/live/AHWSHD_H265.m3u8 +#EXTINF:-1 tvg-id="AnHuiWeiShi.cn" tvg-name="安徽卫视" tvg-country="CN" tvg-language="Chinese" tvg-logo="http://s.wasu.cn/data/images/201512/24/567b9d7479d83.png" group-title="",安徽卫视 +http://219.153.252.50/PLTV/88888888/224/3221225534/playlist.m3u8 +#EXTINF:-1 tvg-id="AnHuiWeiShi.cn" tvg-name="安徽卫视" tvg-country="CN" tvg-language="Chinese" tvg-logo="http://s.wasu.cn/data/images/201512/24/567b9d7479d83.png" group-title="",安徽卫视 http://223.110.245.143/ott.js.chinamobile.com/PLTV/3/224/3221225800/index.m3u8 #EXTINF:-1 tvg-id="AnHuiWeiShi.cn" tvg-name="安徽卫视" tvg-country="CN" tvg-language="Chinese" tvg-logo="http://s.wasu.cn/data/images/201512/24/567b9d7479d83.png" group-title="",安徽卫视 http://ivi.bupt.edu.cn/hls/ahhd.m3u8 #EXTINF:-1 tvg-id="AnHuiWeiShi.cn" tvg-name="安徽卫视" tvg-country="CN" tvg-language="Chinese" tvg-logo="http://s.wasu.cn/data/images/201512/24/567b9d7479d83.png" group-title="",安徽卫视 http://ivi.bupt.edu.cn/hls/ahtv.m3u8 -#EXTINF:-1 tvg-id="AnHuiWeiShi.cn" tvg-name="安徽卫视" tvg-country="CN" tvg-language="Chinese" tvg-logo="http://s.wasu.cn/data/images/201512/24/567b9d7479d83.png" group-title="",安徽卫视 -http://125.210.152.10:8060/live/AHWSHD_H265.m3u8 -#EXTINF:-1 tvg-id="AnHuiWeiShi.cn" tvg-name="安徽卫视" tvg-country="CN" tvg-language="Chinese" tvg-logo="http://s.wasu.cn/data/images/201512/24/567b9d7479d83.png" group-title="",安徽卫视 -http://219.153.252.50/PLTV/88888888/224/3221225534/playlist.m3u8 #EXTINF:-1 tvg-id="AnHuiXiaoShuoPingShuGuangBo.cn" tvg-name="安徽小说评书广播" tvg-country="CN" tvg-language="Chinese" tvg-logo="" group-title="",安徽小说评书广播 http://stream1.ahrtv.cn/xspsgb/sd/live.m3u8 #EXTINF:-1 tvg-id="AnHuiYingShi.cn" tvg-name="安徽影视" tvg-country="CN" tvg-language="" tvg-logo="http://www.tvyan.com/uploads/dianshi/anhys.jpg" group-title="",安徽影视 @@ -814,11 +814,11 @@ http://149.129.100.78/guangdong.php?id=47 #EXTINF:-1 tvg-id="GuangDongWeiShi.cn" tvg-name="广东卫视" tvg-country="CN" tvg-language="Chinese" tvg-logo="https://parco-zh.github.io/demo/guangdong.jpg" group-title="",广东卫视 http://121.31.30.90:8085/ysten-business/live/guangdongstv/1.m3u8 #EXTINF:-1 tvg-id="GuangDongWeiShi.cn" tvg-name="广东卫视" tvg-country="CN" tvg-language="Chinese" tvg-logo="https://parco-zh.github.io/demo/guangdong.jpg" group-title="",广东卫视HD -http://m-tvlmedia.public.bcs.ysten.com/ysten-business/live/hdguangdongstv/1.m3u8 -#EXTINF:-1 tvg-id="GuangDongWeiShi.cn" tvg-name="广东卫视" tvg-country="CN" tvg-language="Chinese" tvg-logo="https://parco-zh.github.io/demo/guangdong.jpg" group-title="",广东卫视HD http://121.31.30.90:8085/ysten-business/live/hdguangdongstv/1.m3u8 #EXTINF:-1 tvg-id="GuangDongWeiShi.cn" tvg-name="广东卫视" tvg-country="CN" tvg-language="Chinese" tvg-logo="https://parco-zh.github.io/demo/guangdong.jpg" group-title="",广东卫视HD http://ivi.bupt.edu.cn/hls/gdhd.m3u8 +#EXTINF:-1 tvg-id="GuangDongWeiShi.cn" tvg-name="广东卫视" tvg-country="CN" tvg-language="Chinese" tvg-logo="https://parco-zh.github.io/demo/guangdong.jpg" group-title="",广东卫视HD +http://m-tvlmedia.public.bcs.ysten.com/ysten-business/live/hdguangdongstv/1.m3u8 #EXTINF:-1 tvg-id="GuangDongGuoJi.cn" tvg-name="广东国际" tvg-country="CN" tvg-language="" tvg-logo="" group-title="",广东国际 http://149.129.100.78/guangdong.php?id=46 #EXTINF:-1 tvg-id="GuangDongShaoEr.cn" tvg-name="广东少儿" tvg-country="CN" tvg-language="" tvg-logo="" group-title="",广东少儿 diff --git a/channels/es.m3u b/channels/es.m3u index 35a6a3ba80..b6391cdbef 100644 --- a/channels/es.m3u +++ b/channels/es.m3u @@ -81,7 +81,7 @@ https://streamtv.mediasector.es/hls/activatv/.m3u8 https://streaming01.gestec-video.com/hls/artequatreAlacanti.m3u8 #EXTINF:-1 tvg-id="AlcarriaTV.es" tvg-name="Alcarria TV" tvg-country="ES" tvg-language="Spanish" tvg-logo="https://i.imgur.com/pzJAYan.png" group-title="",Alcarria TV http://217.182.77.27/live/alcarriatv-livestream.m3u8 -#EXTINF:-1 tvg-id="AlcarriaTV.es" tvg-name="Alcarria TV" tvg-country="ES" tvg-language="Spanish" tvg-logo="https://i.imgur.com/pzJAYan.png" group-title="",Alcarria TV +#EXTINF:-1 tvg-id="AlcarriaTV.es" tvg-name="Alcarria TV" tvg-country="ES" tvg-language="Spanish" tvg-logo="https://i.imgur.com/pzJAYan.png" group-title="",Alcarria TV (576p) http://cls.alcarria.tv/alcarriatv/livestream/playlist.m3u8 #EXTINF:-1 tvg-id="AlcarriaTV.es" tvg-name="Alcarria TV" tvg-country="ES" tvg-language="Spanish" tvg-logo="https://i.imgur.com/pzJAYan.png" group-title="",Alcarria TV https://cls.alcarria.tv/live/alcarriatv-livestream.m3u8 @@ -105,7 +105,7 @@ https://cloudvideo.servers10.com:8081/8004/index.m3u8 https://cdn01.yowi.tv/4131RI73I9/master.m3u8 #EXTINF:-1 tvg-id="Canal10Emporda.es" tvg-name="Canal 10 Empordà" tvg-country="ES" tvg-language="" tvg-logo="" group-title="",Canal 10 Empordà http://ventdelnord.tv:8080/escala/directe.m3u8 -#EXTINF:-1 tvg-id="Canal2000LaSolana.es" tvg-name="Canal 2000 La Solana" tvg-country="ES" tvg-language="" tvg-logo="" group-title="",Canal 2000 La Solana +#EXTINF:-1 tvg-id="Canal2000LaSolana.es" tvg-name="Canal 2000 La Solana" tvg-country="ES" tvg-language="" tvg-logo="" group-title="",Canal 2000 La Solana (720p) http://canal2000.berkano-systems.net/streaming/streams/canal2000.m3u8 #EXTINF:-1 tvg-id="Canal25TV.es" tvg-name="Canal 25 TV" tvg-country="ES" tvg-language="Spanish" tvg-logo="https://i.imgur.com/2BBGZ1H.png" group-title="Local",Canal 25 TV (Barbastro) [Not 24/7] https://common01.todostreaming.es/live/tvbarbastro-livestream.m3u8 diff --git a/channels/pe.m3u b/channels/pe.m3u index 0e7c3b903a..0d589d481f 100644 --- a/channels/pe.m3u +++ b/channels/pe.m3u @@ -31,12 +31,8 @@ http://cdnh4.iblups.com/hls/OVJNKV4pSr.m3u8 https://live.obslivestream.com:1936/crtv/ngrp:crtv_all/playlist.m3u8 #EXTINF:-1 tvg-id="Cultura24tv.pe" tvg-name="Cultura 24" tvg-country="PE" tvg-language="Spanish" tvg-logo="https://i.imgur.com/2mSwwpH.png" group-title="Culture",Cultura 24 (720p) https://vs8.live.opencaster.com/cultura24/smil:cultura24/playlist.m3u8 -#EXTINF:-1 tvg-id="DiarioHechiceraTumbes.pe" tvg-name="Diario Hechicera (Tumbes)" tvg-country="PE" tvg-language="Spanish" tvg-logo="https://graph.facebook.com/diariohechicera/picture?width=320&height=320" group-title="Local",Diario Hechicera (Tumbes) [Not 24/7] +#EXTINF:-1 tvg-id="DiarioHechiceraTumbes.pe" tvg-name="Diario Hechicera (Tumbes)" tvg-country="PE" tvg-language="Spanish" tvg-logo="https://graph.facebook.com/diariohechicera/picture?width=320&height=320" group-title="Local",Diario Hechicera (Tumbes) (720p) [Not 24/7] https://panel.streamingtv-mediacp.online:1936/8108/8108/playlist.m3u8 -#EXTINF:-1 tvg-id="GoldValleyTV.pe" tvg-name="Gold Valley TV (Cafsma)" tvg-country="PE" tvg-language="Spanish" tvg-logo="https://graph.facebook.com/Goldvalleytvcasma/picture?width=320&height=320" group-title="Local",Gold Valley TV (Casma) [Not 24/7] -https://stmv.panel.grupolimalive.com/gold/gold/chunklist_w210808895.m3u8 -#EXTINF:-1 tvg-id="Studio97TV.pe" tvg-name="Studio97 TV (Moquegua)" tvg-country="PE" tvg-language="Spanish" tvg-logo="https://graph.facebook.com/radiostudio97/picture?width=320&height=320" group-title="Music",Studio97 TV (Moquegua) [Not 24/7] -https://stmv.panel.grupolimalive.com/gold/gold/chunklist_w210808895.m3u8 #EXTINF:-1 tvg-id="ExitosaTV.pe" tvg-name="Exitosa TV" tvg-country="PE" tvg-language="Spanish" tvg-logo="https://graph.facebook.com/Exitosanoticias/picture?width=320&height=320" group-title="News",Exitosa TV https://cu.onliv3.com/livevd1/user2.m3u8 #EXTINF:-1 tvg-id="Expresion.pe" tvg-name="Expresión (Tacna)" tvg-country="PE" tvg-language="Spanish" tvg-logo="https://graph.facebook.com/telesurexpresion/picture?width=320&height=320" group-title="Local",Expresión (Tacna) [Not 24/7] @@ -47,10 +43,8 @@ https://tvsource.gacetaucayalina.com/hls/prueba.m3u8 https://envivo.galacticatv.com:3913/stream/play.m3u8 #EXTINF:-1 tvg-id="GeniosTVMoyobamba.pe" tvg-name="Genios TV (Moyobamba)" tvg-country="PE" tvg-language="Spanish" tvg-logo="https://graph.facebook.com/geniostvmoyobamba/picture?width=320&height=320" group-title="Local",Genios TV (Moyobamba) (720p) [Not 24/7] https://live.obslivestream.com:1936/geniostv/ngrp:geniostv_all/playlist.m3u8?DVR -#EXTINF:-1 tvg-id="PeruvianRadioTV.pe" tvg-name="Peruvian Radio TV" tvg-country="PE" tvg-language="Spanish" tvg-logo="https://peruvianradiotv.pe/wp-content/uploads/2021/03/Logo-Peruvian-6.png" group-title="Local",PeruvianRadio TV (720p) [Not 24/7] -https://stmv.panel.grupolimalive.com/peruviantv/peruviantv/playlist.m3u8 -#EXTINF:-1 tvg-id="SurTVIlo.pe" tvg-name="SurTV (Ilo)" tvg-country="PE" tvg-language="Spanish" tvg-logo="https://graph.facebook.com/surtvilo/picture?width=320&height=320" group-title="Local",SurTV (Ilo) (720p) [Not 24/7] -https://stmv.panel.grupolimalive.com/surtv/surtv/playlist.m3u8 +#EXTINF:-1 tvg-id="GoldValleyTV.pe" tvg-name="Gold Valley TV (Cafsma)" tvg-country="PE" tvg-language="Spanish" tvg-logo="https://graph.facebook.com/Goldvalleytvcasma/picture?width=320&height=320" group-title="Local",Gold Valley TV (Casma) [Not 24/7] +https://stmv.panel.grupolimalive.com/gold/gold/chunklist_w210808895.m3u8 #EXTINF:-1 tvg-id="HatunTV.pe" tvg-name="Hatun TV" tvg-country="PE" tvg-language="Spanish" tvg-logo="https://yt3.ggpht.com/ytc/AAUvwnhI0HKESXrVQ8-ktPCeRap6-cP_4upPtEpAlwPa=s88-c-k-c0x00ffffff-no-rj" group-title="Music",Hatun TV (720p) https://tv.siete.us/bestcablehatuntv/bestcablehatuntv/index.m3u8 #EXTINF:-1 tvg-id="JNETV.pe" tvg-name="JNE TV" tvg-country="PE" tvg-language="Spanish" tvg-logo="https://graph.facebook.com/JNE.Peru/picture?width=320&height=320" group-title="Legislative",JNE TV [Not 24/7] @@ -65,7 +59,7 @@ https://mdstrm.com/live-stream-playlist/5ce7109c7398b977dc0744cd.m3u8 https://tv.oyotunstream.com/master/master/playlist.m3u8 #EXTINF:-1 tvg-id="MegaTV.pe" tvg-name="Mega TV" tvg-country="PE" tvg-language="Spanish" tvg-logo="https://graph.facebook.com/MTVAQP/picture?width=320&height=320" group-title="Local",Mega TV (360p) [Not 24/7] https://cp.sradiotv.com:1936/Stream/Stream/playlist.m3u8 -#EXTINF:-1 tvg-id="Millenium49TVPucallpa.pe" tvg-name="Millenium 49 TV (Pucallpa)" tvg-country="PE" tvg-language="Spanish" tvg-logo="https://i.imgur.com/zYpMHhQ.png" group-title="Local",Millenium 49 TV (Pucallpa) [Not 24/7] +#EXTINF:-1 tvg-id="Millenium49TVPucallpa.pe" tvg-name="Millenium 49 TV (Pucallpa)" tvg-country="PE" tvg-language="Spanish" tvg-logo="https://i.imgur.com/zYpMHhQ.png" group-title="Local",Millenium 49 TV (Pucallpa) (720p) [Not 24/7] https://stmv.panel.grupolimalive.com/milleniuntv/milleniuntv/playlist.m3u8 #EXTINF:-1 tvg-id="ModaHuancayo.pe" tvg-name="Moda Huancayo" tvg-country="PE" tvg-language="Spanish" tvg-logo="https://graph.facebook.com/ModaHuancayoTv/picture?width=320&height=320" group-title="Local",Moda Huancayo TV [Not 24/7] https://tvdatta.com:3383/live/huancayotvlive.m3u8 @@ -95,10 +89,12 @@ https://linkastream.co/headless?url=https://www.dailymotion.com/PanamericanaPTV https://d2fxrfbiedz1tm.cloudfront.net/livepaxtv/smil:PC.smil/playlist.m3u8 #EXTINF:-1 tvg-id="PBO.pe" tvg-name="PBO Digital" tvg-country="PE" tvg-language="Spanish" tvg-logo="https://graph.facebook.com/PBOPeru/picture?width=320&height=320" group-title="News",PBO Digital [Not 24/7] https://linkastream.co/headless?url=https://www.youtube.com/channel/UCgR0st4ZLABi-LQcWNu3wnQ/live -#EXTINF:-1 tvg-id="PlanetaTVMoyobamba.pe" tvg-name="Planeta TV (Moyobamba)" tvg-country="PE" tvg-language="Spanish" tvg-logo="https://graph.facebook.com/PlanetaTeleInformativo/picture?width=320&height=320" group-title="Local",Planeta TV (Moyobamba) (720p) [Not 24/7] -https://live.obslivestream.com:1936/planetatv/ngrp:planetatv_all/playlist.m3u8?DVR +#EXTINF:-1 tvg-id="PeruvianRadioTV.pe" tvg-name="Peruvian Radio TV" tvg-country="PE" tvg-language="Spanish" tvg-logo="https://peruvianradiotv.pe/wp-content/uploads/2021/03/Logo-Peruvian-6.png" group-title="Local",PeruvianRadio TV (720p) [Not 24/7] +https://stmv.panel.grupolimalive.com/peruviantv/peruviantv/playlist.m3u8 #EXTINF:-1 tvg-id="PlanetaTVBagua.pe" tvg-name="Planeta TV (Bagua)" tvg-country="PE" tvg-language="Spanish" tvg-logo="https://graph.facebook.com/planeatvperu/picture?width=320&height=320" group-title="Local",Planeta TV (Bagua) (720p) [Not 24/7] https://stmv.panel.grupolimalive.com/planeatv/planeatv/playlist.m3u8 +#EXTINF:-1 tvg-id="PlanetaTVMoyobamba.pe" tvg-name="Planeta TV (Moyobamba)" tvg-country="PE" tvg-language="Spanish" tvg-logo="https://graph.facebook.com/PlanetaTeleInformativo/picture?width=320&height=320" group-title="Local",Planeta TV (Moyobamba) (720p) [Not 24/7] +https://live.obslivestream.com:1936/planetatv/ngrp:planetatv_all/playlist.m3u8?DVR #EXTINF:-1 tvg-id="Primavera15RadiotelevisionMoquegua.pe" tvg-name="Primavera 15 Radiotelevisión (Moquegua)" tvg-country="PE" tvg-language="Spanish" tvg-logo="https://graph.facebook.com/radioprimaveramoquegua/picture?width=320&height=320" group-title="Local",Primavera 15 Radiotelevisión (Moquegua) (720p) https://rtmp02.portalexpress.es/primaveratv/primaveratv/playlist.m3u8 #EXTINF:-1 tvg-id="QTTelevision.pe" tvg-name="QT Televisión" tvg-country="PE" tvg-language="Spanish" tvg-logo="https://graph.facebook.com/QTTelevision/picture?width=320&height=320" group-title="Local",QT Televisión (Cuzco) [Not 24/7] @@ -127,6 +123,8 @@ https://query-streamlink.lanesh4d0w.repl.co/iptv-query?streaming-ip=https://www. https://servers.amelbasoluciones.co:19360/5medialive/5medialive.m3u8 #EXTINF:-1 tvg-id="SuperCanalYurimaguas.pe" tvg-name="Super Canal (Yurimaguas)" tvg-country="PE" tvg-language="Spanish" tvg-logo="https://graph.facebook.com/supercanalyuri/picture?width=320&height=320" group-title="Local",Super Canal (Yurimaguas) [Not 24/7] https://7.innovatestream.pe:19360/supercanal/supercanal.m3u8 +#EXTINF:-1 tvg-id="SurTVIlo.pe" tvg-name="SurTV (Ilo)" tvg-country="PE" tvg-language="Spanish" tvg-logo="https://graph.facebook.com/surtvilo/picture?width=320&height=320" group-title="Local",SurTV (Ilo) (720p) [Not 24/7] +https://stmv.panel.grupolimalive.com/surtv/surtv/playlist.m3u8 #EXTINF:-1 tvg-id="TelesurCamana.pe" tvg-name="Telesur (Camana)" tvg-country="PE" tvg-language="Spanish" tvg-logo="https://graph.facebook.com/telesurexpresion/picture?width=320&height=320" group-title="Local",Telesur (Camana) [Not 24/7] https://qlobbidev.s.llnwi.net/telesur3/hls/camana.m3u8 #EXTINF:-1 tvg-id="TelesurIlo.pe" tvg-name="Telesur (Ilo)" tvg-country="PE" tvg-language="Spanish" tvg-logo="https://graph.facebook.com/telesurexpresion/picture?width=320&height=320" group-title="Local",Telesur (Ilo) diff --git a/channels/ru.m3u b/channels/ru.m3u index 7bc1d46711..7a93158f4c 100644 --- a/channels/ru.m3u +++ b/channels/ru.m3u @@ -331,8 +331,6 @@ https://edge2.uk.kab.tv/live/tvrus-rus-medium/playlist.m3u8 https://strm.yandex.ru/kal/kavkaz24_supres/kavkaz24_supres0.m3u8 #EXTINF:-1 tvg-id="KarapuzTV.ru" tvg-name="Карапуз ТВ" tvg-country="RU" tvg-language="Russian" tvg-logo="" group-title="Kids",Карапуз ТВ https://karapuztv.fenixplustv.xyz/content/33418/index.m3u8 -#EXTINF:-1 tvg-id="TVKvarc.ru" tvg-name="ТВ Кварц" tvg-country="RU" tvg-language="" tvg-logo="" group-title="Local",ТВ Кварц (576p) -https://video.quartztelecom.ru:18080/hls/2386168/71fe656b993c510f39a5/playlist.m3u8 #EXTINF:-1 tvg-id="KinozalVHS90s.ru" tvg-name="Кинозал (VHS 90s)" tvg-country="RU" tvg-language="" tvg-logo="" group-title="",Кинозал (VHS 90s) https://v2.catcast.tv/content/37925/index.m3u8 #EXTINF:-1 tvg-id="Kinokomediya.ru" tvg-name="Кинокомедия" tvg-country="RU" tvg-language="Russian" tvg-logo="" group-title="Comedy",Кинокомедия @@ -653,11 +651,11 @@ https://gtrkchita.ru:8081/hls/r1-chita_360p.m3u8 http://cdnmg.secure.live.rtr-vesti.ru/hls/russia_hd/playlist.m3u8 #EXTINF:-1 tvg-id="Rossiya1HD.ru" tvg-name="Россия 1 HD" tvg-country="RU" tvg-language="Russian" tvg-logo="" group-title="General",Россия 1 HD https://a3569458063-s26881.cdn.ngenix.net/hls/russia_hd/playlist_4.m3u8 -#EXTINF:-1 tvg-id="Rossiya24.ru" tvg-name="Россия 24" tvg-country="RU" tvg-language="Russian" tvg-logo="https://i.imgur.com/wu7O85f.png" group-title="News",Россия 24 (576p) -http://radio-live-mg.rtr-vesti.ru/hls/russia_24/playlist.m3u8 #EXTINF:-1 tvg-id="Rossiya24.ru" tvg-name="Россия 24" tvg-country="RU" tvg-language="Russian" tvg-logo="https://i.imgur.com/wu7O85f.png" group-title="News",Россия 24 (480p) #EXTVLCOPT:http-user-agent=Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 http://ott-cdn.ucom.am/s21/index.m3u8 +#EXTINF:-1 tvg-id="Rossiya24.ru" tvg-name="Россия 24" tvg-country="RU" tvg-language="Russian" tvg-logo="https://i.imgur.com/wu7O85f.png" group-title="News",Россия 24 (576p) +http://radio-live-mg.rtr-vesti.ru/hls/russia_24/playlist.m3u8 #EXTINF:-1 tvg-id="Rossiya24.ru" tvg-name="Россия 24" tvg-country="RU" tvg-language="Russian" tvg-logo="https://i.imgur.com/wu7O85f.png" group-title="News",Россия 24 (576p) [Not 24/7] http://uiptv.do.am/1ufc/000000006/playlist.m3u8 #EXTINF:-1 tvg-id="Rossiya24NNovgorod.ru" tvg-name="Россия 24 (Н.Новгород)" tvg-country="RU" tvg-language="Russian" tvg-logo="" group-title="News",Россия 24 (Н.Новгород) (576p) @@ -752,6 +750,8 @@ http://stream.efir24.tv:1935/live/efir24tv/playlist.m3u8 http://62.32.67.187:1935/WEB_TBN/TBN.stream/playlist.m3u8 #EXTINF:-1 tvg-id="TVEvropa.ru" tvg-name="ТВ Европа" tvg-country="RU" tvg-language="" tvg-logo="" group-title="",ТВ Европа https://cdn1.mobiletv.bg/T10/tvevropa/tvevropa_794613_850k.m3u8 +#EXTINF:-1 tvg-id="TVKvarc.ru" tvg-name="ТВ Кварц" tvg-country="RU" tvg-language="" tvg-logo="" group-title="Local",ТВ Кварц (576p) +https://video.quartztelecom.ru:18080/hls/2386168/71fe656b993c510f39a5/playlist.m3u8 #EXTINF:-1 tvg-id="TVCentr.ru" tvg-name="ТВ Центр" tvg-country="RU" tvg-language="Russian" tvg-logo="https://i.imgur.com/fIkd01t.png" group-title="",ТВ Центр (480p) #EXTVLCOPT:http-user-agent=Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 http://ott-cdn.ucom.am/s54/index.m3u8 diff --git a/channels/tz.m3u b/channels/tz.m3u index 50f6dea011..20074e47e6 100644 --- a/channels/tz.m3u +++ b/channels/tz.m3u @@ -1,7 +1,7 @@ #EXTM3U #EXTINF:-1 tvg-id="AzamSports1.tz" tvg-name="Azam Sports 1" tvg-country="TZ" tvg-language="" tvg-logo="https://azamtv.co.tz/tan/thumb/c/124/70/channels/channel_image1444752374.jpg" group-title="Sports",Azam Sports 1 https://1446000130.rsc.cdn77.org/1446000130/index.m3u8 -#EXTINF:-1 tvg-id="AzamSports2.tz" tvg-name="Azam Sports 2" tvg-country="TZ" tvg-language="" tvg-logo="https://azamtv.co.tz/tan/thumb/c/124/70/channels/channel_image1508329528.png" group-title="Sports",Azam Sports 2 +#EXTINF:-1 tvg-id="AzamSports2.tz" tvg-name="Azam Sports 2" tvg-country="TZ" tvg-language="" tvg-logo="https://azamtv.co.tz/tan/thumb/c/124/70/channels/channel_image1508329528.png" group-title="Sports",Azam Sports 2 (540p) https://1326605225.rsc.cdn77.org/1326605225/index.m3u8 #EXTINF:-1 tvg-id="ChannelTen.tz" tvg-name="Channel Ten" tvg-country="TZ" tvg-language="" tvg-logo="https://encrypted-tbn0.gstatic.com/images?q=tbn%3AANd9GcSlgi36jeSD2_aTBenoZYVRo53N_WjRVK9EcA&usqp=CAU" group-title="",Channel Ten http://hls-pull-switchinternational.speedws.com/live/test1/playlist.m3u8 diff --git a/channels/us.m3u b/channels/us.m3u index 4f34faf5e4..97931dd202 100644 --- a/channels/us.m3u +++ b/channels/us.m3u @@ -5716,7 +5716,7 @@ https://bcovlive-a.akamaihd.net/e64d564b9275484f85981d8c146fb915/us-east-1/59940 http://45.179.140.242:8000/play/a0h5 #EXTINF:-1 tvg-id="STARLife.us" tvg-name="STAR Life (Spain)" tvg-country="ES" tvg-language="Spanish;English" tvg-logo="https://i.imgur.com/e4izZbC.png" group-title="",STAR Life (Spain) http://45.179.140.242:8000/play/a0h4 -#EXTINF:-1 tvg-id="STARMOVIEMIHDSTIRR.us" tvg-name="STAR MOVIEMI HD (STIRR)" tvg-country="US" tvg-language="English" tvg-logo="https://encrypted-tbn0.gstatic.com/images?q=tbn%3AANd9GcT2kTZnEQilym8ptRCEoFwFHsTvp0m_y-VOdvWZSFErs4Nyke_m&usqp=CAU" group-title="",STAR MOVIEMI HD (STIRR) +#EXTINF:-1 tvg-id="STARMOVIEMIHDSTIRR.us" tvg-name="STAR MOVIEMI HD (STIRR)" tvg-country="US" tvg-language="English" tvg-logo="https://encrypted-tbn0.gstatic.com/images?q=tbn%3AANd9GcT2kTZnEQilym8ptRCEoFwFHsTvp0m_y-VOdvWZSFErs4Nyke_m&usqp=CAU" group-title="",STAR MOVIEMI HD (STIRR) (720p) https://sonar.sinclair.wurl.com/manifest/playlist.m3u8 #EXTINF:-1 tvg-id="KVBCLP2.us" tvg-name="StartTV West (13.2 KVBC-LP2)" tvg-country="US" tvg-language="English" tvg-logo="https://media-usba.mybtv.net/logos/starttv.png" group-title="Entertainment",StartTV West (13.2 KVBC-LP2) (432p) https://streams.the6tv.duckdns.org:2443/locals/Fresno/kvbc-13.2.m3u8 @@ -5808,7 +5808,7 @@ https://tastemade-freetv16min-plex.amagi.tv/hls/amagi_hls_data_tastemade-tastema https://tastemade-xumo.amagi.tv/hls/amagi_hls_data_tastemade-tastemadefreetv16xumo/CDN/master.m3u8 #EXTINF:-1 tvg-id="Tastemade.us" tvg-name="Tastemade" tvg-country="US" tvg-language="English" tvg-logo="https://i.imgur.com/8s6aRwv.png" group-title="Cooking",Tastemade (720p) https://tastemade.samsung.wurl.com/manifest/playlist.m3u8 -#EXTINF:-1 tvg-id="Tastemade.us" tvg-name="Tastemade" tvg-country="US" tvg-language="English" tvg-logo="https://i.imgur.com/8s6aRwv.png" group-title="Cooking",Tastemade +#EXTINF:-1 tvg-id="Tastemade.us" tvg-name="Tastemade" tvg-country="US" tvg-language="English" tvg-logo="https://i.imgur.com/8s6aRwv.png" group-title="Cooking",Tastemade (1080p) https://tastemadefr16min-redbox.amagi.tv/hls/amagi_hls_data_tastemade-tastemadefreetv16-redbox/CDN/playlist.m3u8 #EXTINF:-1 tvg-id="Tastemade.us" tvg-name="Tastemade" tvg-country="US" tvg-language="English" tvg-logo="https://i.imgur.com/8s6aRwv.png" group-title="Cooking",Tastemade (1080p) https://tastemadessai.akamaized.net/amagi_hls_data_tastemade-tastemade/CDN/playlist.m3u8 diff --git a/package-lock.json b/package-lock.json index 06cebc1d6c..ffc2acf870 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,14 +7,12 @@ "license": "MIT", "dependencies": { "@freearhey/iso-639-3": "^1.0.0", - "axios": "^0.21.1", - "chalk": "^4.1.1", "commander": "^7.0.0", - "escape-string-regexp": "^2.0.0", "iptv-checker": "^0.20.2", "iptv-playlist-parser": "^0.5.4", "m3u-linter": "^0.1.3", "markdown-include": "^0.4.3", + "normalize-url": "^6.1.0", "pre-push": "^0.1.1", "progress": "^2.0.3", "transliteration": "^2.2.0" @@ -2963,6 +2961,17 @@ "node": ">=0.10.0" } }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", @@ -6045,6 +6054,11 @@ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" }, + "normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==" + }, "npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", diff --git a/package.json b/package.json index ea37000635..64d55e8f7b 100644 --- a/package.json +++ b/package.json @@ -11,14 +11,12 @@ "license": "MIT", "dependencies": { "@freearhey/iso-639-3": "^1.0.0", - "axios": "^0.21.1", - "chalk": "^4.1.1", "commander": "^7.0.0", - "escape-string-regexp": "^2.0.0", "iptv-checker": "^0.20.2", "iptv-playlist-parser": "^0.5.4", "m3u-linter": "^0.1.3", "markdown-include": "^0.4.3", + "normalize-url": "^6.1.0", "pre-push": "^0.1.1", "progress": "^2.0.3", "transliteration": "^2.2.0" diff --git a/scripts/clean.js b/scripts/clean.js deleted file mode 100644 index d1ab7c2e7e..0000000000 --- a/scripts/clean.js +++ /dev/null @@ -1,74 +0,0 @@ -const IPTVChecker = require('iptv-checker') -const { program } = require('commander') -const ProgressBar = require('progress') -const parser = require('./helpers/parser') -const utils = require('./helpers/utils') -const log = require('./helpers/log') - -program - .usage('[OPTIONS]...') - .option('-d, --debug', 'Enable debug mode') - .option('-c, --country ', 'Comma-separated list of country codes', '') - .option('-e, --exclude ', 'Comma-separated list of country codes to be excluded', '') - .option('--timeout ', 'Set timeout for each request', 5000) - .parse(process.argv) - -let bar -const config = program.opts() -const ignoreStatus = ['Geo-blocked', 'Not 24/7', 'Offline'] -const checker = new IPTVChecker({ - timeout: config.timeout -}) - -async function main() { - log.start() - - if (config.debug) log.print(`Debug mode enabled\n`) - - let playlists = parser.parseIndex() - playlists = utils.filterPlaylists(playlists, config.country, config.exclude) - for (const playlist of playlists) { - await parser - .parsePlaylist(playlist.url) - .then(checkPlaylist) - .then(p => p.save()) - } - - log.finish() -} - -async function checkPlaylist(playlist) { - if (!config.debug) { - bar = new ProgressBar(`Checking '${playlist.url}': [:bar] :current/:total (:percent) `, { - total: playlist.channels.length - }) - } - const channels = [] - const total = playlist.channels.length - for (const [index, channel] of playlist.channels.entries()) { - const skipChannel = - channel.status && - ignoreStatus.map(i => i.toLowerCase()).includes(channel.status.toLowerCase()) - if (skipChannel) { - channels.push(channel) - } else { - const result = await checker.checkStream(channel.data) - if (result.status.ok || result.status.reason.includes('timed out')) { - channels.push(channel) - } else { - if (config.debug) log.print(`ERR: ${channel.url} (${result.status.reason})\n`) - } - } - if (!config.debug) bar.tick() - } - - if (playlist.channels.length !== channels.length) { - log.print(`File '${playlist.url}' has been updated\n`) - playlist.channels = channels - playlist.updated = true - } - - return playlist -} - -main() diff --git a/scripts/detect-resolution.js b/scripts/detect-resolution.js deleted file mode 100644 index 5da6a282f5..0000000000 --- a/scripts/detect-resolution.js +++ /dev/null @@ -1,114 +0,0 @@ -const { program } = require('commander') -const ProgressBar = require('progress') -const axios = require('axios') -const https = require('https') -const parser = require('./helpers/parser') -const utils = require('./helpers/utils') -const log = require('./helpers/log') - -program - .usage('[OPTIONS]...') - .option('-c, --country ', 'Comma-separated list of country codes', '') - .option('-e, --exclude ', 'Comma-separated list of country codes to be excluded', '') - .option('--delay ', 'Delay between parser requests', 1000) - .option('--timeout ', 'Set timeout for each request', 5000) - .parse(process.argv) - -const config = program.opts() -const ignoreStatus = ['Offline'] -const instance = axios.create({ - timeout: config.timeout, - maxContentLength: 200000, - httpsAgent: new https.Agent({ - rejectUnauthorized: false - }) -}) - -async function main() { - log.start() - - log.print(`Parsing 'index.m3u'...\n`) - let playlists = parser.parseIndex() - playlists = utils - .filterPlaylists(playlists, config.country, config.exclude) - .filter(i => i.url !== 'channels/unsorted.m3u') - - for (const playlist of playlists) { - await parser - .parsePlaylist(playlist.url) - .then(detectResolution) - .then(p => p.save()) - } - - log.finish() -} - -async function detectResolution(playlist) { - const channels = [] - const bar = new ProgressBar(`Processing '${playlist.url}': [:bar] :current/:total (:percent) `, { - total: playlist.channels.length - }) - let updated = false - for (const channel of playlist.channels) { - bar.tick() - const skipChannel = - channel.status && - ignoreStatus.map(i => i.toLowerCase()).includes(channel.status.toLowerCase()) - if (!channel.resolution.height && !skipChannel) { - const CancelToken = axios.CancelToken - const source = CancelToken.source() - const timeout = setTimeout(() => { - source.cancel() - }, config.timeout) - - const response = await instance - .get(channel.url, { cancelToken: source.token }) - .then(res => { - clearTimeout(timeout) - - return res - }) - .then(utils.sleep(config.delay)) - .catch(err => { - clearTimeout(timeout) - }) - - if (response && response.status === 200) { - if (/^#EXTM3U/.test(response.data)) { - const resolution = parseResolution(response.data) - if (resolution) { - channel.resolution = resolution - updated = true - } - } - } - } - - channels.push(channel) - } - - if (updated) { - log.print(`File '${playlist.url}' has been updated\n`) - playlist.channels = channels - playlist.updated = true - } - - return playlist -} - -function parseResolution(string) { - const regex = /RESOLUTION=(\d+)x(\d+)/gm - const match = string.matchAll(regex) - const arr = Array.from(match).map(m => ({ - width: parseInt(m[1]), - height: parseInt(m[2]) - })) - - return arr.length - ? arr.reduce(function (prev, current) { - return prev.height > current.height ? prev : current - }) - : undefined -} - -main() diff --git a/scripts/format.js b/scripts/format.js index fb77cab20f..acc2fca3c8 100644 --- a/scripts/format.js +++ b/scripts/format.js @@ -1,21 +1,46 @@ +const IPTVChecker = require('iptv-checker') +const normalize = require('normalize-url') +const { program } = require('commander') +const ProgressBar = require('progress') const parser = require('./helpers/parser') const utils = require('./helpers/utils') const file = require('./helpers/file') const log = require('./helpers/log') +program + .usage('[OPTIONS]...') + .option('-d, --debug', 'Enable debug mode') + .option('-s, --status', 'Update stream status') + .option('-r, --resolution', 'Detect stream resolution') + .option('-c, --country ', 'Comma-separated list of country codes', '') + .option('-e, --exclude ', 'Comma-separated list of country codes to be excluded', '') + .option('--timeout ', 'Set timeout for each request', 5000) + .parse(process.argv) + +let bar +const ignoreStatus = ['Geo-blocked', 'Not 24/7'] +const config = program.opts() +const checker = new IPTVChecker({ + timeout: config.timeout +}) + async function main() { log.start() - log.print(`Parsing 'index.m3u'...`) + if (config.debug) log.print(`Debug mode enabled\n`) + if (config.status) log.print(`Status check enabled\n`) + if (config.resolution) log.print(`Resolution detection enabled\n`) + let playlists = parser.parseIndex().filter(i => i.url !== 'channels/unsorted.m3u') + playlists = utils.filterPlaylists(playlists, config.country, config.exclude) + if (!playlists.length) log.print(`No playlist is selected\n`) for (const playlist of playlists) { - log.print(`\nProcessing '${playlist.url}'...`) await parser .parsePlaylist(playlist.url) - .then(formatPlaylist) + .then(updatePlaylist) .then(playlist => { if (file.read(playlist.url) !== playlist.toString()) { - log.print('updated') + log.print(`File '${playlist.url}' has been updated\n`) playlist.updated = true } @@ -23,33 +48,115 @@ async function main() { }) } - log.print('\n') log.finish() } -async function formatPlaylist(playlist) { +async function updatePlaylist(playlist) { + if (!config.debug) { + bar = new ProgressBar(`Processing '${playlist.url}': [:bar] :current/:total (:percent) `, { + total: playlist.channels.length + }) + } else { + log.print(`Processing '${playlist.url}'...\n`) + } + for (const channel of playlist.channels) { - const code = file.getBasename(playlist.url) - // add missing tvg-name - if (!channel.tvg.name && code !== 'unsorted' && channel.name) { - channel.tvg.name = channel.name.replace(/\"/gi, '') + addMissingData(channel) + updateGroupTitle(channel) + normalizeUrl(channel) + + const checkOnline = config.status || config.resolution + const skipChannel = + channel.status && + ignoreStatus.map(i => i.toLowerCase()).includes(channel.status.toLowerCase()) + if (checkOnline && !skipChannel) { + await checker + .checkStream(channel.data) + .then(result => { + const status = parseStatus(result.status) + + if (config.status) { + updateStatus(channel, status) + } + + if (config.resolution && status === 'online') { + updateResolution(channel, result.status.metadata) + } + + if (config.debug && status === 'offline') { + log.print(` ERR: ${channel.url} (${result.status.reason})\n`) + } + }) + .catch(err => { + if (config.debug) log.print(` ERR: ${channel.url} (${err.message})\n`) + }) } - // add missing tvg-id - if (!channel.tvg.id && code !== 'unsorted' && channel.tvg.name) { - const id = utils.name2id(channel.tvg.name) - channel.tvg.id = id ? `${id}.${code}` : '' - } - // add missing country - if (!channel.countries.length) { - const name = utils.code2name(code) - channel.countries = name ? [{ code, name }] : [] - channel.tvg.country = channel.countries.map(c => c.code.toUpperCase()).join(';') - } - // update group-title - channel.group.title = channel.category + if (!config.debug) bar.tick() } return playlist } +function parseStatus(status) { + if (status.ok) { + return 'online' + } else if (status.reason.includes('timed out')) { + return 'timeout' + } else if (status.reason.includes('403')) { + return 'error_403' + } else if (status.reason.includes('not one of 40{0,1,3,4}')) { + return 'error_40x' // 402, 451 + } else { + return 'offline' + } +} + +function updateStatus(channel, status) { + switch (status) { + case 'online': + channel.status = null + break + case 'offline': + channel.status = 'Offline' + break + } +} + +function addMissingData(channel) { + // tvg-name + if (!channel.tvg.name && channel.name) { + channel.tvg.name = channel.name.replace(/\"/gi, '') + } + // tvg-id + if (!channel.tvg.id && channel.tvg.name) { + const id = utils.name2id(channel.tvg.name) + channel.tvg.id = id ? `${id}.${code}` : '' + } + // country + if (!channel.countries.length) { + const name = utils.code2name(code) + channel.countries = name ? [{ code, name }] : [] + channel.tvg.country = channel.countries.map(c => c.code.toUpperCase()).join(';') + } +} + +function updateGroupTitle(channel) { + channel.group.title = channel.category +} + +function normalizeUrl(channel) { + const normalized = normalize(channel.url, { stripWWW: false }) + channel.updateUrl(normalized) +} + +function updateResolution(channel, metadata) { + const streams = metadata ? metadata.streams.filter(stream => stream.codec_type === 'video') : [] + if (!channel.resolution.height && streams.length) { + channel.resolution = streams.reduce((acc, curr) => { + if (curr.height > acc.height) return { width: curr.width, height: curr.height } + return acc + }) + } +} + main() diff --git a/scripts/helpers/Channel.js b/scripts/helpers/Channel.js index 043f7886f3..8c4b0c397a 100644 --- a/scripts/helpers/Channel.js +++ b/scripts/helpers/Channel.js @@ -22,6 +22,11 @@ module.exports = class Channel { this.languages = this.parseLanguages(data.tvg.language) } + updateUrl(url) { + this.url = url + this.data.url = url + } + parseName(title) { return title .trim() diff --git a/scripts/helpers/utils.js b/scripts/helpers/utils.js index 7a2bae0633..f0d9b3e50d 100644 --- a/scripts/helpers/utils.js +++ b/scripts/helpers/utils.js @@ -1,4 +1,3 @@ -const escapeStringRegexp = require('escape-string-regexp') const transliteration = require('transliteration') const iso6393 = require('@freearhey/iso-639-3') const categories = require('./categories') @@ -71,16 +70,6 @@ utils.sortBy = function (arr, fields) { }) } -utils.escapeStringRegexp = function (scring) { - return escapeStringRegexp(string) -} - -utils.sleep = function (ms) { - return function (x) { - return new Promise(resolve => setTimeout(() => resolve(x), ms)) - } -} - utils.removeProtocol = function (string) { return string.replace(/(^\w+:|^)\/\//, '') }