Merge branch 'master' into patch-9
This commit is contained in:
38
.eslintrc.json
Normal file
38
.eslintrc.json
Normal file
@@ -0,0 +1,38 @@
|
||||
{
|
||||
"env": {
|
||||
"browser": true,
|
||||
"es2021": true
|
||||
},
|
||||
"extends": [
|
||||
"eslint:recommended",
|
||||
"plugin:@typescript-eslint/recommended"
|
||||
],
|
||||
"parser": "@typescript-eslint/parser",
|
||||
"parserOptions": {
|
||||
"ecmaVersion": "latest",
|
||||
"sourceType": "module"
|
||||
},
|
||||
"plugins": [
|
||||
"@typescript-eslint"
|
||||
],
|
||||
"rules": {
|
||||
"no-case-declarations": "off",
|
||||
"indent": [
|
||||
"error",
|
||||
2,
|
||||
{ "SwitchCase": 1 }
|
||||
],
|
||||
"linebreak-style": [
|
||||
"error",
|
||||
"unix"
|
||||
],
|
||||
"quotes": [
|
||||
"error",
|
||||
"single"
|
||||
],
|
||||
"semi": [
|
||||
"error",
|
||||
"never"
|
||||
]
|
||||
}
|
||||
}
|
||||
2
.github/workflows/format.yml
vendored
2
.github/workflows/format.yml
vendored
@@ -12,7 +12,7 @@ jobs:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 2
|
||||
- uses: tibdex/github-app-token@v2
|
||||
- uses: tibdex/github-app-token@v1.8.2
|
||||
if: ${{ !env.ACT }}
|
||||
id: create-app-token
|
||||
with:
|
||||
|
||||
2
.github/workflows/update.yml
vendored
2
.github/workflows/update.yml
vendored
@@ -8,7 +8,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: tibdex/github-app-token@v2
|
||||
- uses: tibdex/github-app-token@v1.8.2
|
||||
if: ${{ !env.ACT }}
|
||||
id: create-app-token
|
||||
with:
|
||||
|
||||
@@ -141,6 +141,7 @@ To run scripts use the `npm run <script-name>` command.
|
||||
- `update`: (shorthand) sequentially runs the `api:load`, `playlist:generate`, `api:generate` and `readme:update` commands.
|
||||
- `deploy`: (shorthand) sequentially runs the `playlist:deploy` and `api:deploy` commands.
|
||||
- `report`: (shorthand) sequentially runs the `api:load` and `report:create` commands.
|
||||
- `lint`: сhecks the scripts for syntax errors.
|
||||
- `test`: runs a test of all the scripts described above.
|
||||
|
||||
## Workflows
|
||||
|
||||
168
README.md
168
README.md
@@ -59,35 +59,35 @@ Same thing, but split up into separate files:
|
||||
<tr><th align="left">Category</th><th align="left">Channels</th><th align="left">Playlist</th></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr><td>Animation</td><td align="right">50</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/animation.m3u</code></td></tr>
|
||||
<tr><td>Animation</td><td align="right">53</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/animation.m3u</code></td></tr>
|
||||
<tr><td>Auto</td><td align="right">15</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/auto.m3u</code></td></tr>
|
||||
<tr><td>Business</td><td align="right">57</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/business.m3u</code></td></tr>
|
||||
<tr><td>Classic</td><td align="right">55</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/classic.m3u</code></td></tr>
|
||||
<tr><td>Comedy</td><td align="right">57</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/comedy.m3u</code></td></tr>
|
||||
<tr><td>Classic</td><td align="right">54</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/classic.m3u</code></td></tr>
|
||||
<tr><td>Comedy</td><td align="right">58</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/comedy.m3u</code></td></tr>
|
||||
<tr><td>Cooking</td><td align="right">23</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/cooking.m3u</code></td></tr>
|
||||
<tr><td>Culture</td><td align="right">77</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/culture.m3u</code></td></tr>
|
||||
<tr><td>Documentary</td><td align="right">64</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/documentary.m3u</code></td></tr>
|
||||
<tr><td>Education</td><td align="right">115</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/education.m3u</code></td></tr>
|
||||
<tr><td>Entertainment</td><td align="right">354</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/entertainment.m3u</code></td></tr>
|
||||
<tr><td>Family</td><td align="right">40</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/family.m3u</code></td></tr>
|
||||
<tr><td>General</td><td align="right">1119</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/general.m3u</code></td></tr>
|
||||
<tr><td>Kids</td><td align="right">182</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/kids.m3u</code></td></tr>
|
||||
<tr><td>General</td><td align="right">1122</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/general.m3u</code></td></tr>
|
||||
<tr><td>Kids</td><td align="right">183</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/kids.m3u</code></td></tr>
|
||||
<tr><td>Legislative</td><td align="right">167</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/legislative.m3u</code></td></tr>
|
||||
<tr><td>Lifestyle</td><td align="right">78</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/lifestyle.m3u</code></td></tr>
|
||||
<tr><td>Movies</td><td align="right">274</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/movies.m3u</code></td></tr>
|
||||
<tr><td>Lifestyle</td><td align="right">77</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/lifestyle.m3u</code></td></tr>
|
||||
<tr><td>Movies</td><td align="right">275</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/movies.m3u</code></td></tr>
|
||||
<tr><td>Music</td><td align="right">484</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/music.m3u</code></td></tr>
|
||||
<tr><td>News</td><td align="right">705</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/news.m3u</code></td></tr>
|
||||
<tr><td>News</td><td align="right">703</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/news.m3u</code></td></tr>
|
||||
<tr><td>Outdoor</td><td align="right">44</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/outdoor.m3u</code></td></tr>
|
||||
<tr><td>Relax</td><td align="right">16</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/relax.m3u</code></td></tr>
|
||||
<tr><td>Religious</td><td align="right">438</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/religious.m3u</code></td></tr>
|
||||
<tr><td>Religious</td><td align="right">442</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/religious.m3u</code></td></tr>
|
||||
<tr><td>Science</td><td align="right">25</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/science.m3u</code></td></tr>
|
||||
<tr><td>Series</td><td align="right">159</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/series.m3u</code></td></tr>
|
||||
<tr><td>Shop</td><td align="right">74</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/shop.m3u</code></td></tr>
|
||||
<tr><td>Sports</td><td align="right">206</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/sports.m3u</code></td></tr>
|
||||
<tr><td>Sports</td><td align="right">205</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/sports.m3u</code></td></tr>
|
||||
<tr><td>Travel</td><td align="right">30</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/travel.m3u</code></td></tr>
|
||||
<tr><td>Weather</td><td align="right">14</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/weather.m3u</code></td></tr>
|
||||
<tr><td>XXX</td><td align="right">46</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/xxx.m3u</code></td></tr>
|
||||
<tr><td>Undefined</td><td align="right">5249</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/undefined.m3u</code></td></tr>
|
||||
<tr><td>Undefined</td><td align="right">5209</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/undefined.m3u</code></td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
@@ -118,7 +118,7 @@ Same thing, but split up into separate files:
|
||||
<tr><td align="left">Albanian</td><td align="right">58</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/sqi.m3u</code></td></tr>
|
||||
<tr><td align="left">Alemannic</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/gsw.m3u</code></td></tr>
|
||||
<tr><td align="left">Amharic</td><td align="right">5</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/amh.m3u</code></td></tr>
|
||||
<tr><td align="left">Arabic</td><td align="right">375</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/ara.m3u</code></td></tr>
|
||||
<tr><td align="left">Arabic</td><td align="right">368</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/ara.m3u</code></td></tr>
|
||||
<tr><td align="left">Armenian</td><td align="right">29</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/hye.m3u</code></td></tr>
|
||||
<tr><td align="left">Assamese</td><td align="right">7</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/asm.m3u</code></td></tr>
|
||||
<tr><td align="left">Assyrian Neo-Aramaic</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/aii.m3u</code></td></tr>
|
||||
@@ -134,29 +134,29 @@ Same thing, but split up into separate files:
|
||||
<tr><td align="left">Catalan</td><td align="right">50</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/cat.m3u</code></td></tr>
|
||||
<tr><td align="left">Chhattisgarhi</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/hne.m3u</code></td></tr>
|
||||
<tr><td align="left">Chinese</td><td align="right">150</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/zho.m3u</code></td></tr>
|
||||
<tr><td align="left">Croatian</td><td align="right">13</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/hrv.m3u</code></td></tr>
|
||||
<tr><td align="left">Croatian</td><td align="right">14</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/hrv.m3u</code></td></tr>
|
||||
<tr><td align="left">Czech</td><td align="right">36</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/ces.m3u</code></td></tr>
|
||||
<tr><td align="left">Danish</td><td align="right">20</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/dan.m3u</code></td></tr>
|
||||
<tr><td align="left">Dhanwar (Nepal)</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/dhw.m3u</code></td></tr>
|
||||
<tr><td align="left">Dhivehi</td><td align="right">3</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/div.m3u</code></td></tr>
|
||||
<tr><td align="left">Dholuo</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/luo.m3u</code></td></tr>
|
||||
<tr><td align="left">Dimili</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/zza.m3u</code></td></tr>
|
||||
<tr><td align="left">Dutch</td><td align="right">191</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/nld.m3u</code></td></tr>
|
||||
<tr><td align="left">English</td><td align="right">2171</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/eng.m3u</code></td></tr>
|
||||
<tr><td align="left">Dutch</td><td align="right">192</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/nld.m3u</code></td></tr>
|
||||
<tr><td align="left">English</td><td align="right">2182</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/eng.m3u</code></td></tr>
|
||||
<tr><td align="left">Estonian</td><td align="right">9</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/est.m3u</code></td></tr>
|
||||
<tr><td align="left">Ewe</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/ewe.m3u</code></td></tr>
|
||||
<tr><td align="left">Faroese</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/fao.m3u</code></td></tr>
|
||||
<tr><td align="left">Fataleka</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/far.m3u</code></td></tr>
|
||||
<tr><td align="left">Filipino</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/fil.m3u</code></td></tr>
|
||||
<tr><td align="left">Finnish</td><td align="right">25</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/fin.m3u</code></td></tr>
|
||||
<tr><td align="left">French</td><td align="right">383</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/fra.m3u</code></td></tr>
|
||||
<tr><td align="left">Finnish</td><td align="right">24</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/fin.m3u</code></td></tr>
|
||||
<tr><td align="left">French</td><td align="right">387</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/fra.m3u</code></td></tr>
|
||||
<tr><td align="left">Galician</td><td align="right">12</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/glg.m3u</code></td></tr>
|
||||
<tr><td align="left">Galolen</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/gal.m3u</code></td></tr>
|
||||
<tr><td align="left">Georgian</td><td align="right">8</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/kat.m3u</code></td></tr>
|
||||
<tr><td align="left">German</td><td align="right">280</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/deu.m3u</code></td></tr>
|
||||
<tr><td align="left">German</td><td align="right">278</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/deu.m3u</code></td></tr>
|
||||
<tr><td align="left">Gikuyu</td><td align="right">2</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/kik.m3u</code></td></tr>
|
||||
<tr><td align="left">Goan Konkani</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/gom.m3u</code></td></tr>
|
||||
<tr><td align="left">Greek</td><td align="right">122</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/ell.m3u</code></td></tr>
|
||||
<tr><td align="left">Greek</td><td align="right">121</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/ell.m3u</code></td></tr>
|
||||
<tr><td align="left">Greenlandic</td><td align="right">2</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/kal.m3u</code></td></tr>
|
||||
<tr><td align="left">Gujarati</td><td align="right">10</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/guj.m3u</code></td></tr>
|
||||
<tr><td align="left">Haitian</td><td align="right">5</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/hat.m3u</code></td></tr>
|
||||
@@ -169,15 +169,15 @@ Same thing, but split up into separate files:
|
||||
<tr><td align="left">Inuktitut</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/iku.m3u</code></td></tr>
|
||||
<tr><td align="left">Irish</td><td align="right">5</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/gle.m3u</code></td></tr>
|
||||
<tr><td align="left">Italian</td><td align="right">330</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/ita.m3u</code></td></tr>
|
||||
<tr><td align="left">Japanese</td><td align="right">41</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/jpn.m3u</code></td></tr>
|
||||
<tr><td align="left">Japanese</td><td align="right">34</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/jpn.m3u</code></td></tr>
|
||||
<tr><td align="left">Javanese</td><td align="right">3</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/jav.m3u</code></td></tr>
|
||||
<tr><td align="left">Kannada</td><td align="right">18</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/kan.m3u</code></td></tr>
|
||||
<tr><td align="left">Kazakh</td><td align="right">34</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/kaz.m3u</code></td></tr>
|
||||
<tr><td align="left">Khmer</td><td align="right">12</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/khm.m3u</code></td></tr>
|
||||
<tr><td align="left">Kinyarwanda</td><td align="right">3</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/kin.m3u</code></td></tr>
|
||||
<tr><td align="left">Kirghiz</td><td align="right">7</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/kir.m3u</code></td></tr>
|
||||
<tr><td align="left">Kirghiz</td><td align="right">6</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/kir.m3u</code></td></tr>
|
||||
<tr><td align="left">Konkani (macrolanguage)</td><td align="right">2</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/kok.m3u</code></td></tr>
|
||||
<tr><td align="left">Korean</td><td align="right">112</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/kor.m3u</code></td></tr>
|
||||
<tr><td align="left">Korean</td><td align="right">111</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/kor.m3u</code></td></tr>
|
||||
<tr><td align="left">Kurdish</td><td align="right">24</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/kur.m3u</code></td></tr>
|
||||
<tr><td align="left">Lahnda</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/lah.m3u</code></td></tr>
|
||||
<tr><td align="left">Lao</td><td align="right">9</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/lao.m3u</code></td></tr>
|
||||
@@ -207,7 +207,7 @@ Same thing, but split up into separate files:
|
||||
<tr><td align="left">Portuguese</td><td align="right">361</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/por.m3u</code></td></tr>
|
||||
<tr><td align="left">Romanian</td><td align="right">116</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/ron.m3u</code></td></tr>
|
||||
<tr><td align="left">Romany</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/rom.m3u</code></td></tr>
|
||||
<tr><td align="left">Russian</td><td align="right">302</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/rus.m3u</code></td></tr>
|
||||
<tr><td align="left">Russian</td><td align="right">304</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/rus.m3u</code></td></tr>
|
||||
<tr><td align="left">Saint Lucian Creole French</td><td align="right">2</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/acf.m3u</code></td></tr>
|
||||
<tr><td align="left">Santali</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/sat.m3u</code></td></tr>
|
||||
<tr><td align="left">Serbian</td><td align="right">82</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/srp.m3u</code></td></tr>
|
||||
@@ -217,7 +217,7 @@ Same thing, but split up into separate files:
|
||||
<tr><td align="left">Slovak</td><td align="right">44</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/slk.m3u</code></td></tr>
|
||||
<tr><td align="left">Slovenian</td><td align="right">16</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/slv.m3u</code></td></tr>
|
||||
<tr><td align="left">Somali</td><td align="right">8</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/som.m3u</code></td></tr>
|
||||
<tr><td align="left">Spanish</td><td align="right">1846</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/spa.m3u</code></td></tr>
|
||||
<tr><td align="left">Spanish</td><td align="right">1852</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/spa.m3u</code></td></tr>
|
||||
<tr><td align="left">Swahili</td><td align="right">14</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/swa.m3u</code></td></tr>
|
||||
<tr><td align="left">Swedish</td><td align="right">19</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/swe.m3u</code></td></tr>
|
||||
<tr><td align="left">Tagalog</td><td align="right">14</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/tgl.m3u</code></td></tr>
|
||||
@@ -238,7 +238,7 @@ Same thing, but split up into separate files:
|
||||
<tr><td align="left">Wolof</td><td align="right">2</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/wol.m3u</code></td></tr>
|
||||
<tr><td align="left">Yucatec Maya</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/yua.m3u</code></td></tr>
|
||||
<tr><td align="left">Yue Chinese</td><td align="right">10</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/yue.m3u</code></td></tr>
|
||||
<tr><td align="left">Undefined</td><td align="right">1275</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/undefined.m3u</code></td></tr>
|
||||
<tr><td align="left">Undefined</td><td align="right">1238</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/undefined.m3u</code></td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
@@ -272,7 +272,7 @@ Same thing, but split up into separate files:
|
||||
<tr><td>🇦🇴 Angola</td><td align="right">14</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/ao.m3u</code></td></tr>
|
||||
<tr><td>🇦🇮 Anguilla</td><td align="right">5</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/ai.m3u</code></td></tr>
|
||||
<tr><td>🇦🇬 Antigua and Barbuda</td><td align="right">7</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/ag.m3u</code></td></tr>
|
||||
<tr><td>🇦🇷 Argentina</td><td align="right">316</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/ar.m3u</code></td></tr>
|
||||
<tr><td>🇦🇷 Argentina</td><td align="right">318</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/ar.m3u</code></td></tr>
|
||||
<tr><td> Buenos Aires</td><td align="right">30</td><td nowrap><code>https://iptv-org.github.io/iptv/subdivisions/ar-b.m3u</code></td></tr>
|
||||
<tr><td> Catamarca</td><td align="right">2</td><td nowrap><code>https://iptv-org.github.io/iptv/subdivisions/ar-k.m3u</code></td></tr>
|
||||
<tr><td> Chaco</td><td align="right">5</td><td nowrap><code>https://iptv-org.github.io/iptv/subdivisions/ar-h.m3u</code></td></tr>
|
||||
@@ -298,8 +298,8 @@ Same thing, but split up into separate files:
|
||||
<tr><td> Tucuman</td><td align="right">7</td><td nowrap><code>https://iptv-org.github.io/iptv/subdivisions/ar-t.m3u</code></td></tr>
|
||||
<tr><td>🇦🇲 Armenia</td><td align="right">40</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/am.m3u</code></td></tr>
|
||||
<tr><td>🇦🇼 Aruba</td><td align="right">6</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/aw.m3u</code></td></tr>
|
||||
<tr><td>🇦🇺 Australia</td><td align="right">38</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/au.m3u</code></td></tr>
|
||||
<tr><td>🇦🇹 Austria</td><td align="right">48</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/at.m3u</code></td></tr>
|
||||
<tr><td>🇦🇺 Australia</td><td align="right">51</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/au.m3u</code></td></tr>
|
||||
<tr><td>🇦🇹 Austria</td><td align="right">47</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/at.m3u</code></td></tr>
|
||||
<tr><td>🇦🇿 Azerbaijan</td><td align="right">33</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/az.m3u</code></td></tr>
|
||||
<tr><td>🇧🇸 Bahamas</td><td align="right">7</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/bs.m3u</code></td></tr>
|
||||
<tr><td>🇧🇭 Bahrain</td><td align="right">38</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/bh.m3u</code></td></tr>
|
||||
@@ -311,7 +311,7 @@ Same thing, but split up into separate files:
|
||||
<tr><td>🇧🇯 Benin</td><td align="right">19</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/bj.m3u</code></td></tr>
|
||||
<tr><td>🇧🇲 Bermuda</td><td align="right">4</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/bm.m3u</code></td></tr>
|
||||
<tr><td>🇧🇹 Bhutan</td><td align="right">8</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/bt.m3u</code></td></tr>
|
||||
<tr><td>🇧🇴 Bolivia</td><td align="right">94</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/bo.m3u</code></td></tr>
|
||||
<tr><td>🇧🇴 Bolivia</td><td align="right">96</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/bo.m3u</code></td></tr>
|
||||
<tr><td> Cochabamba</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/subdivisions/bo-c.m3u</code></td></tr>
|
||||
<tr><td> La Paz</td><td align="right">2</td><td nowrap><code>https://iptv-org.github.io/iptv/subdivisions/bo-l.m3u</code></td></tr>
|
||||
<tr><td> Oruro</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/subdivisions/bo-o.m3u</code></td></tr>
|
||||
@@ -344,7 +344,7 @@ Same thing, but split up into separate files:
|
||||
<tr><td>🇻🇬 British Virgin Islands</td><td align="right">6</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/vg.m3u</code></td></tr>
|
||||
<tr><td>🇧🇳 Brunei</td><td align="right">31</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/bn.m3u</code></td></tr>
|
||||
<tr><td>🇧🇬 Bulgaria</td><td align="right">39</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/bg.m3u</code></td></tr>
|
||||
<tr><td>🇧🇫 Burkina Faso</td><td align="right">14</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/bf.m3u</code></td></tr>
|
||||
<tr><td>🇧🇫 Burkina Faso</td><td align="right">15</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/bf.m3u</code></td></tr>
|
||||
<tr><td>🇧🇮 Burundi</td><td align="right">12</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/bi.m3u</code></td></tr>
|
||||
<tr><td>🇰🇭 Cambodia</td><td align="right">42</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/kh.m3u</code></td></tr>
|
||||
<tr><td>🇨🇲 Cameroon</td><td align="right">39</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/cm.m3u</code></td></tr>
|
||||
@@ -376,7 +376,7 @@ Same thing, but split up into separate files:
|
||||
<tr><td> Nuble</td><td align="right">3</td><td nowrap><code>https://iptv-org.github.io/iptv/subdivisions/cl-nb.m3u</code></td></tr>
|
||||
<tr><td> Valparaiso</td><td align="right">2</td><td nowrap><code>https://iptv-org.github.io/iptv/subdivisions/cl-vs.m3u</code></td></tr>
|
||||
<tr><td>🇨🇳 China</td><td align="right">562</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/cn.m3u</code></td></tr>
|
||||
<tr><td>🇨🇴 Colombia</td><td align="right">137</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/co.m3u</code></td></tr>
|
||||
<tr><td>🇨🇴 Colombia</td><td align="right">139</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/co.m3u</code></td></tr>
|
||||
<tr><td> Antioquia</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/subdivisions/co-ant.m3u</code></td></tr>
|
||||
<tr><td> Atlantico</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/subdivisions/co-atl.m3u</code></td></tr>
|
||||
<tr><td> Bolivar</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/subdivisions/co-bol.m3u</code></td></tr>
|
||||
@@ -395,19 +395,19 @@ Same thing, but split up into separate files:
|
||||
<tr><td> Valle del Cauca</td><td align="right">5</td><td nowrap><code>https://iptv-org.github.io/iptv/subdivisions/co-vac.m3u</code></td></tr>
|
||||
<tr><td>🇰🇲 Comoros</td><td align="right">41</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/km.m3u</code></td></tr>
|
||||
<tr><td>🇨🇰 Cook Islands</td><td align="right">6</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/ck.m3u</code></td></tr>
|
||||
<tr><td>🇨🇷 Costa Rica</td><td align="right">96</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/cr.m3u</code></td></tr>
|
||||
<tr><td>🇨🇷 Costa Rica</td><td align="right">98</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/cr.m3u</code></td></tr>
|
||||
<tr><td> Puntarenas</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/subdivisions/cr-p.m3u</code></td></tr>
|
||||
<tr><td> San Jose</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/subdivisions/cr-sj.m3u</code></td></tr>
|
||||
<tr><td>🇭🇷 Croatia</td><td align="right">27</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/hr.m3u</code></td></tr>
|
||||
<tr><td>🇨🇺 Cuba</td><td align="right">53</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/cu.m3u</code></td></tr>
|
||||
<tr><td>🇭🇷 Croatia</td><td align="right">28</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/hr.m3u</code></td></tr>
|
||||
<tr><td>🇨🇺 Cuba</td><td align="right">55</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/cu.m3u</code></td></tr>
|
||||
<tr><td>🇨🇼 Curacao</td><td align="right">10</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/cw.m3u</code></td></tr>
|
||||
<tr><td>🇨🇾 Cyprus</td><td align="right">40</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/cy.m3u</code></td></tr>
|
||||
<tr><td>🇨🇾 Cyprus</td><td align="right">39</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/cy.m3u</code></td></tr>
|
||||
<tr><td>🇨🇿 Czech Republic</td><td align="right">43</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/cz.m3u</code></td></tr>
|
||||
<tr><td>🇨🇩 Democratic Republic of the Congo</td><td align="right">33</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/cd.m3u</code></td></tr>
|
||||
<tr><td>🇩🇰 Denmark</td><td align="right">34</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/dk.m3u</code></td></tr>
|
||||
<tr><td>🇩🇯 Djibouti</td><td align="right">46</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/dj.m3u</code></td></tr>
|
||||
<tr><td>🇩🇲 Dominica</td><td align="right">5</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/dm.m3u</code></td></tr>
|
||||
<tr><td>🇩🇴 Dominican Republic</td><td align="right">207</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/do.m3u</code></td></tr>
|
||||
<tr><td>🇩🇴 Dominican Republic</td><td align="right">209</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/do.m3u</code></td></tr>
|
||||
<tr><td> Distrito Nacional (Santo Domingo)</td><td align="right">2</td><td nowrap><code>https://iptv-org.github.io/iptv/subdivisions/do-01.m3u</code></td></tr>
|
||||
<tr><td> La Altagracia</td><td align="right">2</td><td nowrap><code>https://iptv-org.github.io/iptv/subdivisions/do-11.m3u</code></td></tr>
|
||||
<tr><td> La Vega</td><td align="right">3</td><td nowrap><code>https://iptv-org.github.io/iptv/subdivisions/do-13.m3u</code></td></tr>
|
||||
@@ -417,12 +417,12 @@ Same thing, but split up into separate files:
|
||||
<tr><td> Santiago</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/subdivisions/do-25.m3u</code></td></tr>
|
||||
<tr><td> Valverde</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/subdivisions/do-27.m3u</code></td></tr>
|
||||
<tr><td>🇹🇱 East Timor</td><td align="right">27</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/tl.m3u</code></td></tr>
|
||||
<tr><td>🇪🇨 Ecuador</td><td align="right">82</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/ec.m3u</code></td></tr>
|
||||
<tr><td>🇪🇨 Ecuador</td><td align="right">84</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/ec.m3u</code></td></tr>
|
||||
<tr><td> Azuay</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/subdivisions/ec-a.m3u</code></td></tr>
|
||||
<tr><td> Loja</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/subdivisions/ec-l.m3u</code></td></tr>
|
||||
<tr><td> Orellana</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/subdivisions/ec-d.m3u</code></td></tr>
|
||||
<tr><td>🇪🇬 Egypt</td><td align="right">77</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/eg.m3u</code></td></tr>
|
||||
<tr><td>🇸🇻 El Salvador</td><td align="right">67</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/sv.m3u</code></td></tr>
|
||||
<tr><td>🇸🇻 El Salvador</td><td align="right">69</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/sv.m3u</code></td></tr>
|
||||
<tr><td>🇬🇶 Equatorial Guinea</td><td align="right">14</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/gq.m3u</code></td></tr>
|
||||
<tr><td>🇪🇷 Eritrea</td><td align="right">12</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/er.m3u</code></td></tr>
|
||||
<tr><td>🇪🇪 Estonia</td><td align="right">24</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/ee.m3u</code></td></tr>
|
||||
@@ -430,24 +430,24 @@ Same thing, but split up into separate files:
|
||||
<tr><td>🇫🇰 Falkland Islands</td><td align="right">3</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/fk.m3u</code></td></tr>
|
||||
<tr><td>🇫🇴 Faroe Islands</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/fo.m3u</code></td></tr>
|
||||
<tr><td>🇫🇯 Fiji</td><td align="right">7</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/fj.m3u</code></td></tr>
|
||||
<tr><td>🇫🇮 Finland</td><td align="right">41</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/fi.m3u</code></td></tr>
|
||||
<tr><td>🇫🇮 Finland</td><td align="right">40</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/fi.m3u</code></td></tr>
|
||||
<tr><td> Keski-Suomi</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/subdivisions/fi-08.m3u</code></td></tr>
|
||||
<tr><td> Pohjanmaa</td><td align="right">3</td><td nowrap><code>https://iptv-org.github.io/iptv/subdivisions/fi-12.m3u</code></td></tr>
|
||||
<tr><td>🇫🇷 France</td><td align="right">262</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/fr.m3u</code></td></tr>
|
||||
<tr><td>🇫🇷 France</td><td align="right">265</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/fr.m3u</code></td></tr>
|
||||
<tr><td>🇬🇫 French Guiana</td><td align="right">7</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/gf.m3u</code></td></tr>
|
||||
<tr><td>🇵🇫 French Polynesia</td><td align="right">7</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/pf.m3u</code></td></tr>
|
||||
<tr><td>🇹🇫 French Southern Territories</td><td align="right">12</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/tf.m3u</code></td></tr>
|
||||
<tr><td>🇬🇦 Gabon</td><td align="right">14</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/ga.m3u</code></td></tr>
|
||||
<tr><td>🇬🇲 Gambia</td><td align="right">14</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/gm.m3u</code></td></tr>
|
||||
<tr><td>🇬🇪 Georgia</td><td align="right">20</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/ge.m3u</code></td></tr>
|
||||
<tr><td>🇩🇪 Germany</td><td align="right">265</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/de.m3u</code></td></tr>
|
||||
<tr><td>🇩🇪 Germany</td><td align="right">264</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/de.m3u</code></td></tr>
|
||||
<tr><td>🇬🇭 Ghana</td><td align="right">36</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/gh.m3u</code></td></tr>
|
||||
<tr><td>🇬🇷 Greece</td><td align="right">117</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/gr.m3u</code></td></tr>
|
||||
<tr><td>🇬🇱 Greenland</td><td align="right">6</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/gl.m3u</code></td></tr>
|
||||
<tr><td>🇬🇩 Grenada</td><td align="right">5</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/gd.m3u</code></td></tr>
|
||||
<tr><td>🇬🇵 Guadeloupe</td><td align="right">9</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/gp.m3u</code></td></tr>
|
||||
<tr><td>🇬🇺 Guam</td><td align="right">7</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/gu.m3u</code></td></tr>
|
||||
<tr><td>🇬🇹 Guatemala</td><td align="right">104</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/gt.m3u</code></td></tr>
|
||||
<tr><td>🇬🇹 Guatemala</td><td align="right">106</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/gt.m3u</code></td></tr>
|
||||
<tr><td> Escuintla</td><td align="right">2</td><td nowrap><code>https://iptv-org.github.io/iptv/subdivisions/gt-05.m3u</code></td></tr>
|
||||
<tr><td> Izabal</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/subdivisions/gt-18.m3u</code></td></tr>
|
||||
<tr><td> Quiche</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/subdivisions/gt-14.m3u</code></td></tr>
|
||||
@@ -461,7 +461,7 @@ Same thing, but split up into separate files:
|
||||
<tr><td>🇬🇼 Guinea-Bissau</td><td align="right">12</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/gw.m3u</code></td></tr>
|
||||
<tr><td>🇬🇾 Guyana</td><td align="right">4</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/gy.m3u</code></td></tr>
|
||||
<tr><td>🇭🇹 Haiti</td><td align="right">40</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/ht.m3u</code></td></tr>
|
||||
<tr><td>🇭🇳 Honduras</td><td align="right">110</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/hn.m3u</code></td></tr>
|
||||
<tr><td>🇭🇳 Honduras</td><td align="right">112</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/hn.m3u</code></td></tr>
|
||||
<tr><td>🇭🇰 Hong Kong</td><td align="right">21</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/hk.m3u</code></td></tr>
|
||||
<tr><td>🇭🇺 Hungary</td><td align="right">118</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/hu.m3u</code></td></tr>
|
||||
<tr><td>🇮🇸 Iceland</td><td align="right">16</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/is.m3u</code></td></tr>
|
||||
@@ -501,7 +501,7 @@ Same thing, but split up into separate files:
|
||||
<tr><td>🇮🇶 Iraq</td><td align="right">128</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/iq.m3u</code></td></tr>
|
||||
<tr><td>🇮🇪 Ireland</td><td align="right">22</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/ie.m3u</code></td></tr>
|
||||
<tr><td>🇮🇱 Israel</td><td align="right">21</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/il.m3u</code></td></tr>
|
||||
<tr><td>🇮🇹 Italy</td><td align="right">409</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/it.m3u</code></td></tr>
|
||||
<tr><td>🇮🇹 Italy</td><td align="right">408</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/it.m3u</code></td></tr>
|
||||
<tr><td>🇨🇮 Ivory Coast</td><td align="right">30</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/ci.m3u</code></td></tr>
|
||||
<tr><td>🇯🇲 Jamaica</td><td align="right">11</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/jm.m3u</code></td></tr>
|
||||
<tr><td>🇯🇵 Japan</td><td align="right">47</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/jp.m3u</code></td></tr>
|
||||
@@ -510,8 +510,8 @@ Same thing, but split up into separate files:
|
||||
<tr><td>🇰🇪 Kenya</td><td align="right">54</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/ke.m3u</code></td></tr>
|
||||
<tr><td>🇰🇮 Kiribati</td><td align="right">6</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/ki.m3u</code></td></tr>
|
||||
<tr><td>🇽🇰 Kosovo</td><td align="right">25</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/xk.m3u</code></td></tr>
|
||||
<tr><td>🇰🇼 Kuwait</td><td align="right">47</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/kw.m3u</code></td></tr>
|
||||
<tr><td>🇰🇬 Kyrgyzstan</td><td align="right">9</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/kg.m3u</code></td></tr>
|
||||
<tr><td>🇰🇼 Kuwait</td><td align="right">38</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/kw.m3u</code></td></tr>
|
||||
<tr><td>🇰🇬 Kyrgyzstan</td><td align="right">8</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/kg.m3u</code></td></tr>
|
||||
<tr><td>🇱🇦 Laos</td><td align="right">44</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/la.m3u</code></td></tr>
|
||||
<tr><td>🇱🇻 Latvia</td><td align="right">25</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/lv.m3u</code></td></tr>
|
||||
<tr><td>🇱🇧 Lebanon</td><td align="right">57</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/lb.m3u</code></td></tr>
|
||||
@@ -533,7 +533,7 @@ Same thing, but split up into separate files:
|
||||
<tr><td>🇲🇷 Mauritania</td><td align="right">43</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/mr.m3u</code></td></tr>
|
||||
<tr><td>🇲🇺 Mauritius</td><td align="right">13</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/mu.m3u</code></td></tr>
|
||||
<tr><td>🇾🇹 Mayotte</td><td align="right">13</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/yt.m3u</code></td></tr>
|
||||
<tr><td>🇲🇽 Mexico</td><td align="right">209</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/mx.m3u</code></td></tr>
|
||||
<tr><td>🇲🇽 Mexico</td><td align="right">211</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/mx.m3u</code></td></tr>
|
||||
<tr><td> Aguascalientes</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/subdivisions/mx-agu.m3u</code></td></tr>
|
||||
<tr><td> Baja California</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/subdivisions/mx-bcn.m3u</code></td></tr>
|
||||
<tr><td> Chihuahua</td><td align="right">4</td><td nowrap><code>https://iptv-org.github.io/iptv/subdivisions/mx-chh.m3u</code></td></tr>
|
||||
@@ -557,7 +557,7 @@ Same thing, but split up into separate files:
|
||||
<tr><td> Zacatecas</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/subdivisions/mx-zac.m3u</code></td></tr>
|
||||
<tr><td>🇫🇲 Micronesia</td><td align="right">6</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/fm.m3u</code></td></tr>
|
||||
<tr><td>🇲🇩 Moldova</td><td align="right">30</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/md.m3u</code></td></tr>
|
||||
<tr><td>🇲🇨 Monaco</td><td align="right">12</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/mc.m3u</code></td></tr>
|
||||
<tr><td>🇲🇨 Monaco</td><td align="right">13</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/mc.m3u</code></td></tr>
|
||||
<tr><td>🇲🇳 Mongolia</td><td align="right">26</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/mn.m3u</code></td></tr>
|
||||
<tr><td>🇲🇪 Montenegro</td><td align="right">18</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/me.m3u</code></td></tr>
|
||||
<tr><td> Ulcinj</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/subdivisions/me-20.m3u</code></td></tr>
|
||||
@@ -571,7 +571,7 @@ Same thing, but split up into separate files:
|
||||
<tr><td>🇳🇱 Netherlands</td><td align="right">201</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/nl.m3u</code></td></tr>
|
||||
<tr><td>🇳🇨 New Caledonia</td><td align="right">6</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/nc.m3u</code></td></tr>
|
||||
<tr><td>🇳🇿 New Zealand</td><td align="right">32</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/nz.m3u</code></td></tr>
|
||||
<tr><td>🇳🇮 Nicaragua</td><td align="right">62</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/ni.m3u</code></td></tr>
|
||||
<tr><td>🇳🇮 Nicaragua</td><td align="right">64</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/ni.m3u</code></td></tr>
|
||||
<tr><td>🇳🇪 Niger</td><td align="right">13</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/ne.m3u</code></td></tr>
|
||||
<tr><td>🇳🇬 Nigeria</td><td align="right">55</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/ng.m3u</code></td></tr>
|
||||
<tr><td>🇳🇺 Niue</td><td align="right">6</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/nu.m3u</code></td></tr>
|
||||
@@ -585,16 +585,16 @@ Same thing, but split up into separate files:
|
||||
<tr><td> Islamabad</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/subdivisions/pk-is.m3u</code></td></tr>
|
||||
<tr><td>🇵🇼 Palau</td><td align="right">6</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/pw.m3u</code></td></tr>
|
||||
<tr><td>🇵🇸 Palestine</td><td align="right">59</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/ps.m3u</code></td></tr>
|
||||
<tr><td>🇵🇦 Panama</td><td align="right">69</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/pa.m3u</code></td></tr>
|
||||
<tr><td>🇵🇦 Panama</td><td align="right">71</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/pa.m3u</code></td></tr>
|
||||
<tr><td>🇵🇬 Papua New Guinea</td><td align="right">6</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/pg.m3u</code></td></tr>
|
||||
<tr><td>🇵🇾 Paraguay</td><td align="right">88</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/py.m3u</code></td></tr>
|
||||
<tr><td>🇵🇾 Paraguay</td><td align="right">90</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/py.m3u</code></td></tr>
|
||||
<tr><td> Alto Parana</td><td align="right">2</td><td nowrap><code>https://iptv-org.github.io/iptv/subdivisions/py-10.m3u</code></td></tr>
|
||||
<tr><td> Boqueron</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/subdivisions/py-19.m3u</code></td></tr>
|
||||
<tr><td> Caaguazu</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/subdivisions/py-5.m3u</code></td></tr>
|
||||
<tr><td> Central</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/subdivisions/py-11.m3u</code></td></tr>
|
||||
<tr><td> Itapua</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/subdivisions/py-7.m3u</code></td></tr>
|
||||
<tr><td> Presidente Hayes</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/subdivisions/py-15.m3u</code></td></tr>
|
||||
<tr><td>🇵🇪 Peru</td><td align="right">200</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/pe.m3u</code></td></tr>
|
||||
<tr><td>🇵🇪 Peru</td><td align="right">202</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/pe.m3u</code></td></tr>
|
||||
<tr><td> Amazonas</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/subdivisions/pe-ama.m3u</code></td></tr>
|
||||
<tr><td> Ancash</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/subdivisions/pe-anc.m3u</code></td></tr>
|
||||
<tr><td> Apurimac</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/subdivisions/pe-apu.m3u</code></td></tr>
|
||||
@@ -611,7 +611,7 @@ Same thing, but split up into separate files:
|
||||
<tr><td>🇵🇳 Pitcairn Islands</td><td align="right">6</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/pn.m3u</code></td></tr>
|
||||
<tr><td>🇵🇱 Poland</td><td align="right">66</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/pl.m3u</code></td></tr>
|
||||
<tr><td>🇵🇹 Portugal</td><td align="right">53</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/pt.m3u</code></td></tr>
|
||||
<tr><td>🇵🇷 Puerto Rico</td><td align="right">85</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/pr.m3u</code></td></tr>
|
||||
<tr><td>🇵🇷 Puerto Rico</td><td align="right">87</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/pr.m3u</code></td></tr>
|
||||
<tr><td>🇶🇦 Qatar</td><td align="right">38</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/qa.m3u</code></td></tr>
|
||||
<tr><td>🇨🇬 Republic of the Congo</td><td align="right">16</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/cg.m3u</code></td></tr>
|
||||
<tr><td> Brazzaville</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/subdivisions/cg-bzv.m3u</code></td></tr>
|
||||
@@ -643,7 +643,7 @@ Same thing, but split up into separate files:
|
||||
<tr><td>🇸🇴 Somalia</td><td align="right">61</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/so.m3u</code></td></tr>
|
||||
<tr><td>🇿🇦 South Africa</td><td align="right">36</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/za.m3u</code></td></tr>
|
||||
<tr><td>🇬🇸 South Georgia and the South Sandwich Islands</td><td align="right">3</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/gs.m3u</code></td></tr>
|
||||
<tr><td>🇰🇷 South Korea</td><td align="right">112</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/kr.m3u</code></td></tr>
|
||||
<tr><td>🇰🇷 South Korea</td><td align="right">111</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/kr.m3u</code></td></tr>
|
||||
<tr><td> Busan-gwangyeoksi</td><td align="right">2</td><td nowrap><code>https://iptv-org.github.io/iptv/subdivisions/kr-26.m3u</code></td></tr>
|
||||
<tr><td> Chungcheongbuk-do</td><td align="right">2</td><td nowrap><code>https://iptv-org.github.io/iptv/subdivisions/kr-43.m3u</code></td></tr>
|
||||
<tr><td> Daegu-gwangyeoksi</td><td align="right">2</td><td nowrap><code>https://iptv-org.github.io/iptv/subdivisions/kr-27.m3u</code></td></tr>
|
||||
@@ -677,7 +677,7 @@ Same thing, but split up into separate files:
|
||||
<tr><td> Valenciana, Comunidad</td><td align="right">15</td><td nowrap><code>https://iptv-org.github.io/iptv/subdivisions/es-vc.m3u</code></td></tr>
|
||||
<tr><td>🇱🇰 Sri Lanka</td><td align="right">20</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/lk.m3u</code></td></tr>
|
||||
<tr><td>🇸🇩 Sudan</td><td align="right">50</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/sd.m3u</code></td></tr>
|
||||
<tr><td>🇸🇷 Suriname</td><td align="right">3</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/sr.m3u</code></td></tr>
|
||||
<tr><td>🇸🇷 Suriname</td><td align="right">4</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/sr.m3u</code></td></tr>
|
||||
<tr><td>🇸🇿 Swaziland</td><td align="right">13</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/sz.m3u</code></td></tr>
|
||||
<tr><td>🇸🇪 Sweden</td><td align="right">43</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/se.m3u</code></td></tr>
|
||||
<tr><td>🇨🇭 Switzerland</td><td align="right">71</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/ch.m3u</code></td></tr>
|
||||
@@ -701,10 +701,10 @@ Same thing, but split up into separate files:
|
||||
<tr><td>🇦🇪 United Arab Emirates</td><td align="right">76</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/ae.m3u</code></td></tr>
|
||||
<tr><td>🇬🇧 United Kingdom</td><td align="right">194</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/uk.m3u</code></td></tr>
|
||||
<tr><td> Wales</td><td align="right">2</td><td nowrap><code>https://iptv-org.github.io/iptv/subdivisions/gb-wls.m3u</code></td></tr>
|
||||
<tr><td>🇺🇸 United States</td><td align="right">1882</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/us.m3u</code></td></tr>
|
||||
<tr><td>🇺🇸 United States</td><td align="right">1845</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/us.m3u</code></td></tr>
|
||||
<tr><td> Alabama</td><td align="right">4</td><td nowrap><code>https://iptv-org.github.io/iptv/subdivisions/us-al.m3u</code></td></tr>
|
||||
<tr><td> Alaska</td><td align="right">2</td><td nowrap><code>https://iptv-org.github.io/iptv/subdivisions/us-ak.m3u</code></td></tr>
|
||||
<tr><td> Arizona</td><td align="right">12</td><td nowrap><code>https://iptv-org.github.io/iptv/subdivisions/us-az.m3u</code></td></tr>
|
||||
<tr><td> Arizona</td><td align="right">11</td><td nowrap><code>https://iptv-org.github.io/iptv/subdivisions/us-az.m3u</code></td></tr>
|
||||
<tr><td> Arkansas</td><td align="right">4</td><td nowrap><code>https://iptv-org.github.io/iptv/subdivisions/us-ar.m3u</code></td></tr>
|
||||
<tr><td> California</td><td align="right">146</td><td nowrap><code>https://iptv-org.github.io/iptv/subdivisions/us-ca.m3u</code></td></tr>
|
||||
<tr><td> Colorado</td><td align="right">19</td><td nowrap><code>https://iptv-org.github.io/iptv/subdivisions/us-co.m3u</code></td></tr>
|
||||
@@ -753,11 +753,11 @@ Same thing, but split up into separate files:
|
||||
<tr><td> Washington</td><td align="right">8</td><td nowrap><code>https://iptv-org.github.io/iptv/subdivisions/us-wa.m3u</code></td></tr>
|
||||
<tr><td> Wisconsin</td><td align="right">7</td><td nowrap><code>https://iptv-org.github.io/iptv/subdivisions/us-wi.m3u</code></td></tr>
|
||||
<tr><td> Wyoming</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/subdivisions/us-wy.m3u</code></td></tr>
|
||||
<tr><td>🇺🇾 Uruguay</td><td align="right">60</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/uy.m3u</code></td></tr>
|
||||
<tr><td>🇺🇾 Uruguay</td><td align="right">62</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/uy.m3u</code></td></tr>
|
||||
<tr><td>🇺🇿 Uzbekistan</td><td align="right">9</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/uz.m3u</code></td></tr>
|
||||
<tr><td>🇻🇺 Vanuatu</td><td align="right">6</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/vu.m3u</code></td></tr>
|
||||
<tr><td>🇻🇦 Vatican City</td><td align="right">19</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/va.m3u</code></td></tr>
|
||||
<tr><td>🇻🇪 Venezuela</td><td align="right">107</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/ve.m3u</code></td></tr>
|
||||
<tr><td>🇻🇪 Venezuela</td><td align="right">110</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/ve.m3u</code></td></tr>
|
||||
<tr><td> Aragua</td><td align="right">2</td><td nowrap><code>https://iptv-org.github.io/iptv/subdivisions/ve-d.m3u</code></td></tr>
|
||||
<tr><td> Lara</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/subdivisions/ve-k.m3u</code></td></tr>
|
||||
<tr><td>🇻🇳 Vietnam</td><td align="right">125</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/vn.m3u</code></td></tr>
|
||||
@@ -792,38 +792,38 @@ Same thing, but split up into separate files:
|
||||
<tr><th align="left">Region</th><th align="left">Channels</th><th align="left">Playlist</th></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr><td align="left">Africa</td><td align="right">423</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/regions/afr.m3u</code></td></tr>
|
||||
<tr><td align="left">Americas</td><td align="right">3801</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/regions/amer.m3u</code></td></tr>
|
||||
<tr><td align="left">Arab world</td><td align="right">426</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/regions/arab.m3u</code></td></tr>
|
||||
<tr><td align="left">Asia</td><td align="right">2947</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/regions/asia.m3u</code></td></tr>
|
||||
<tr><td align="left">Asia-Pacific</td><td align="right">1912</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/regions/apac.m3u</code></td></tr>
|
||||
<tr><td align="left">Africa</td><td align="right">424</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/regions/afr.m3u</code></td></tr>
|
||||
<tr><td align="left">Americas</td><td align="right">3765</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/regions/amer.m3u</code></td></tr>
|
||||
<tr><td align="left">Arab world</td><td align="right">417</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/regions/arab.m3u</code></td></tr>
|
||||
<tr><td align="left">Asia</td><td align="right">2935</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/regions/asia.m3u</code></td></tr>
|
||||
<tr><td align="left">Asia-Pacific</td><td align="right">1924</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/regions/apac.m3u</code></td></tr>
|
||||
<tr><td align="left">Association of Southeast Asian Nations</td><td align="right">471</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/regions/asean.m3u</code></td></tr>
|
||||
<tr><td align="left">Benelux</td><td align="right">240</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/regions/benelux.m3u</code></td></tr>
|
||||
<tr><td align="left">Caribbean</td><td align="right">251</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/regions/carib.m3u</code></td></tr>
|
||||
<tr><td align="left">Central America</td><td align="right">205</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/regions/cenamer.m3u</code></td></tr>
|
||||
<tr><td align="left">Central and Eastern Europe</td><td align="right">1019</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/regions/cee.m3u</code></td></tr>
|
||||
<tr><td align="left">Central Asia</td><td align="right">64</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/regions/cas.m3u</code></td></tr>
|
||||
<tr><td align="left">Commonwealth of Independent States</td><td align="right">460</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/regions/cis.m3u</code></td></tr>
|
||||
<tr><td align="left">Europe</td><td align="right">3241</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/regions/eur.m3u</code></td></tr>
|
||||
<tr><td align="left">Europe, the Middle East and Africa</td><td align="right">4056</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/regions/emea.m3u</code></td></tr>
|
||||
<tr><td align="left">Hispanic America</td><td align="right">1470</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/regions/hispam.m3u</code></td></tr>
|
||||
<tr><td align="left">Latin America</td><td align="right">1779</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/regions/latam.m3u</code></td></tr>
|
||||
<tr><td align="left">Latin America and the Caribbean</td><td align="right">1801</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/regions/lac.m3u</code></td></tr>
|
||||
<tr><td align="left">Central and Eastern Europe</td><td align="right">1020</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/regions/cee.m3u</code></td></tr>
|
||||
<tr><td align="left">Central Asia</td><td align="right">63</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/regions/cas.m3u</code></td></tr>
|
||||
<tr><td align="left">Commonwealth of Independent States</td><td align="right">459</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/regions/cis.m3u</code></td></tr>
|
||||
<tr><td align="left">Europe</td><td align="right">3240</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/regions/eur.m3u</code></td></tr>
|
||||
<tr><td align="left">Europe, the Middle East and Africa</td><td align="right">4047</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/regions/emea.m3u</code></td></tr>
|
||||
<tr><td align="left">Hispanic America</td><td align="right">1471</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/regions/hispam.m3u</code></td></tr>
|
||||
<tr><td align="left">Latin America</td><td align="right">1780</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/regions/latam.m3u</code></td></tr>
|
||||
<tr><td align="left">Latin America and the Caribbean</td><td align="right">1802</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/regions/lac.m3u</code></td></tr>
|
||||
<tr><td align="left">Maghreb</td><td align="right">60</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/regions/maghreb.m3u</code></td></tr>
|
||||
<tr><td align="left">Middle East</td><td align="right">698</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/regions/mideast.m3u</code></td></tr>
|
||||
<tr><td align="left">Middle East and North Africa</td><td align="right">749</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/regions/mena.m3u</code></td></tr>
|
||||
<tr><td align="left">Nordics</td><td align="right">97</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/regions/nord.m3u</code></td></tr>
|
||||
<tr><td align="left">North America</td><td align="right">2613</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/regions/noram.m3u</code></td></tr>
|
||||
<tr><td align="left">Northern America</td><td align="right">2016</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/regions/nam.m3u</code></td></tr>
|
||||
<tr><td align="left">Northern Europe</td><td align="right">126</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/regions/neur.m3u</code></td></tr>
|
||||
<tr><td align="left">Oceania</td><td align="right">55</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/regions/oce.m3u</code></td></tr>
|
||||
<tr><td align="left">South America</td><td align="right">1193</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/regions/southam.m3u</code></td></tr>
|
||||
<tr><td align="left">Middle East</td><td align="right">688</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/regions/mideast.m3u</code></td></tr>
|
||||
<tr><td align="left">Middle East and North Africa</td><td align="right">739</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/regions/mena.m3u</code></td></tr>
|
||||
<tr><td align="left">Nordics</td><td align="right">96</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/regions/nord.m3u</code></td></tr>
|
||||
<tr><td align="left">North America</td><td align="right">2576</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/regions/noram.m3u</code></td></tr>
|
||||
<tr><td align="left">Northern America</td><td align="right">1979</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/regions/nam.m3u</code></td></tr>
|
||||
<tr><td align="left">Northern Europe</td><td align="right">125</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/regions/neur.m3u</code></td></tr>
|
||||
<tr><td align="left">Oceania</td><td align="right">68</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/regions/oce.m3u</code></td></tr>
|
||||
<tr><td align="left">South America</td><td align="right">1195</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/regions/southam.m3u</code></td></tr>
|
||||
<tr><td align="left">South Asia</td><td align="right">593</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/regions/sas.m3u</code></td></tr>
|
||||
<tr><td align="left">Southeast Asia</td><td align="right">492</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/regions/sea.m3u</code></td></tr>
|
||||
<tr><td align="left">Southern Europe</td><td align="right">1097</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/regions/ser.m3u</code></td></tr>
|
||||
<tr><td align="left">Sub-Saharan Africa</td><td align="right">339</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/regions/ssa.m3u</code></td></tr>
|
||||
<tr><td align="left">West Africa</td><td align="right">139</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/regions/wafr.m3u</code></td></tr>
|
||||
<tr><td align="left">Western Europe</td><td align="right">1002</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/regions/wer.m3u</code></td></tr>
|
||||
<tr><td align="left">Southern Europe</td><td align="right">1095</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/regions/ser.m3u</code></td></tr>
|
||||
<tr><td align="left">Sub-Saharan Africa</td><td align="right">340</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/regions/ssa.m3u</code></td></tr>
|
||||
<tr><td align="left">West Africa</td><td align="right">140</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/regions/wafr.m3u</code></td></tr>
|
||||
<tr><td align="left">Western Europe</td><td align="right">1003</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/regions/wer.m3u</code></td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
|
||||
2212
package-lock.json
generated
2212
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
12
package.json
12
package.json
@@ -20,14 +20,15 @@
|
||||
"update": "npm run api:load && npm run playlist:generate && npm run api:generate && npm run readme:update",
|
||||
"deploy": "npm run playlist:deploy && npm run api:deploy",
|
||||
"report": "npm run api:load && npm run report:create",
|
||||
"lint": "npx eslint ./scripts/**/*.ts ./tests/**/*.ts",
|
||||
"test": "jest --runInBand",
|
||||
"ts-node": "node --no-warnings=ExperimentalWarning --experimental-specifier-resolution=node --loader ts-node/esm"
|
||||
},
|
||||
"jest": {
|
||||
"transform": {
|
||||
"^.*test.(ts|js)$": "ts-jest"
|
||||
"^.+\\.ts$": "ts-jest"
|
||||
},
|
||||
"testRegex": "tests/(.*?/)?.*test.(ts|js)$",
|
||||
"testRegex": "tests/(.*?/)?.*test.ts$",
|
||||
"setupFilesAfterEnv": [
|
||||
"jest-expect-message"
|
||||
]
|
||||
@@ -40,8 +41,8 @@
|
||||
"author": "Arhey",
|
||||
"private": true,
|
||||
"license": "MIT",
|
||||
"type": "module",
|
||||
"dependencies": {
|
||||
"@freearhey/core": "^0.1.2",
|
||||
"@octokit/core": "^4.2.1",
|
||||
"@octokit/plugin-paginate-rest": "^7.1.2",
|
||||
"@octokit/plugin-rest-endpoint-methods": "^7.1.3",
|
||||
@@ -68,5 +69,10 @@
|
||||
"transliteration": "^2.3.5",
|
||||
"ts-jest": "^29.1.1",
|
||||
"typescript": "^5.2.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@typescript-eslint/eslint-plugin": "^6.7.2",
|
||||
"@typescript-eslint/parser": "^6.7.2",
|
||||
"eslint": "^8.49.0"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import { Logger, Storage } from '@freearhey/core'
|
||||
import { API_DIR, STREAMS_DIR } from '../../constants'
|
||||
import { Logger, PlaylistParser, Storage } from '../../core'
|
||||
import { PlaylistParser } from '../../core'
|
||||
import { Stream } from '../../models'
|
||||
|
||||
async function main() {
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import { Logger, Storage, Collection } from '@freearhey/core'
|
||||
import { STREAMS_DIR, DATA_DIR } from '../../constants'
|
||||
import { Storage, Logger, PlaylistParser, Collection } from '../../core'
|
||||
import { PlaylistParser } from '../../core'
|
||||
import { Stream, Playlist, Channel } from '../../models'
|
||||
import { program } from 'commander'
|
||||
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
import { File, PlaylistParser, Storage } from '../../core'
|
||||
import { Logger, Storage, Collection, File } from '@freearhey/core'
|
||||
import { PlaylistParser } from '../../core'
|
||||
import { Stream, Category, Channel, Language, Country, Region, Subdivision } from '../../models'
|
||||
import { Collection } from '../../core/collection'
|
||||
import { Logger } from '../../core/logger'
|
||||
import _ from 'lodash'
|
||||
import {
|
||||
CategoriesGenerator,
|
||||
@@ -124,7 +123,7 @@ async function loadStreams({
|
||||
if (channel.logo) stream.logo = channel.logo
|
||||
} else {
|
||||
const file = new File(stream.filepath)
|
||||
const [_, countryCode] = file.getFilename().match(/^([a-z]{2})(_|$)/) || [null, null]
|
||||
const [_, countryCode] = file.name().match(/^([a-z]{2})(_|$)/) || [null, null]
|
||||
const defaultBroadcastArea = countryCode ? [`c/${countryCode.toUpperCase()}`] : []
|
||||
|
||||
stream.broadcastArea = new Collection(defaultBroadcastArea)
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import { Logger, Storage, Collection, Dictionary } from '@freearhey/core'
|
||||
import { DATA_DIR, STREAMS_DIR } from '../../constants'
|
||||
import { Storage, Logger, Collection, Dictionary, IssueLoader, PlaylistParser } from '../../core'
|
||||
import { IssueLoader, PlaylistParser } from '../../core'
|
||||
import { Stream, Playlist, Channel, Issue } from '../../models'
|
||||
|
||||
let processedIssues = new Collection()
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import { Logger, Storage, PlaylistParser, Collection, File, Dictionary } from '../../core'
|
||||
import { Logger, Storage, Collection, Dictionary, File } from '@freearhey/core'
|
||||
import { PlaylistParser } from '../../core'
|
||||
import { Channel, Stream, Blocked } from '../../models'
|
||||
import { program } from 'commander'
|
||||
import chalk from 'chalk'
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import { Logger } from '@freearhey/core'
|
||||
import { CategoryTable, CountryTable, LanguageTable, RegionTable } from '../../tables'
|
||||
import { Logger, Markdown } from '../../core'
|
||||
import { Markdown } from '../../core'
|
||||
import { README_DIR } from '../../constants'
|
||||
import path from 'path'
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import { Logger, Storage, Collection, Dictionary } from '@freearhey/core'
|
||||
import { DATA_DIR, STREAMS_DIR } from '../../constants'
|
||||
import { Collection, Dictionary, IssueLoader, Storage, Logger, PlaylistParser } from '../../core'
|
||||
import { IssueLoader, PlaylistParser } from '../../core'
|
||||
import { Blocked, Channel, Issue, Stream } from '../../models'
|
||||
|
||||
async function main() {
|
||||
@@ -27,22 +28,25 @@ async function main() {
|
||||
const streams = await parser.parse(files)
|
||||
const groupedStreams = streams.groupBy((stream: Stream) => stream.url)
|
||||
|
||||
logger.info('loading issue from github...')
|
||||
const issues = await loader.load({ labels: ['streams:add'] })
|
||||
|
||||
logger.info('creating report...')
|
||||
let report = new Collection()
|
||||
|
||||
logger.info('checking streams:add requests...')
|
||||
const addRequests = await loader.load({ labels: ['streams:add'] })
|
||||
const buffer = new Dictionary()
|
||||
const report = issues.map((issue: Issue) => {
|
||||
addRequests.forEach((issue: Issue) => {
|
||||
const channelId = issue.data.get('channel_id') || undefined
|
||||
const streamUrl = issue.data.get('stream_url') || undefined
|
||||
|
||||
const result = new Dictionary({
|
||||
issueNumber: issue.number,
|
||||
type: 'streams:add',
|
||||
channelId,
|
||||
status: undefined
|
||||
})
|
||||
|
||||
if (!channelId || !streamUrl) result.set('status', 'error')
|
||||
if (!channelId) result.set('status', 'missing_id')
|
||||
else if (!streamUrl) result.set('status', 'missing_link')
|
||||
else if (groupedBlocklist.has(channelId)) result.set('status', 'blocked')
|
||||
else if (groupedChannels.missing(channelId)) result.set('status', 'invalid_id')
|
||||
else if (groupedStreams.has(streamUrl)) result.set('status', 'fullfilled')
|
||||
@@ -51,9 +55,51 @@ async function main() {
|
||||
|
||||
buffer.set(streamUrl, true)
|
||||
|
||||
return result.data()
|
||||
report.add(result.data())
|
||||
})
|
||||
|
||||
logger.info('checking streams:edit requests...')
|
||||
const editRequests = await loader.load({ labels: ['streams:edit'] })
|
||||
editRequests.forEach((issue: Issue) => {
|
||||
const channelId = issue.data.get('channel_id') || undefined
|
||||
const streamUrl = issue.data.get('stream_url') || undefined
|
||||
|
||||
const result = new Dictionary({
|
||||
issueNumber: issue.number,
|
||||
type: 'streams:edit',
|
||||
channelId,
|
||||
status: undefined
|
||||
})
|
||||
|
||||
if (!streamUrl) result.set('status', 'missing_link')
|
||||
else if (groupedStreams.missing(streamUrl)) result.set('status', 'invalid_link')
|
||||
else if (channelId && groupedChannels.missing(channelId)) result.set('status', 'invalid_id')
|
||||
else result.set('status', 'pending')
|
||||
|
||||
report.add(result.data())
|
||||
})
|
||||
|
||||
logger.info('checking broken streams reports...')
|
||||
const brokenStreamReports = await loader.load({ labels: ['broken stream'] })
|
||||
brokenStreamReports.forEach((issue: Issue) => {
|
||||
const streamUrl = issue.data.get('stream_url') || undefined
|
||||
|
||||
const result = new Dictionary({
|
||||
issueNumber: issue.number,
|
||||
type: 'broken stream',
|
||||
channelId: undefined,
|
||||
status: undefined
|
||||
})
|
||||
|
||||
if (!streamUrl) result.set('status', 'missing_link')
|
||||
else if (groupedStreams.missing(streamUrl)) result.set('status', 'invalid_link')
|
||||
else result.set('status', 'pending')
|
||||
|
||||
report.add(result.data())
|
||||
})
|
||||
|
||||
report = report.orderBy(item => item.issueNumber)
|
||||
|
||||
console.table(report.all())
|
||||
}
|
||||
|
||||
|
||||
@@ -1,175 +0,0 @@
|
||||
import _ from 'lodash'
|
||||
import { orderBy, Order } from 'natural-orderby'
|
||||
import { Dictionary } from './'
|
||||
|
||||
type Iteratee = (value: any, value2?: any) => void
|
||||
|
||||
export class Collection {
|
||||
_items: any[]
|
||||
|
||||
constructor(items?: any[]) {
|
||||
this._items = Array.isArray(items) ? items : []
|
||||
}
|
||||
|
||||
first(predicate?: Iteratee) {
|
||||
if (predicate) {
|
||||
return this._items.find(predicate)
|
||||
}
|
||||
|
||||
return this._items[0]
|
||||
}
|
||||
|
||||
last(predicate?: Iteratee) {
|
||||
if (predicate) {
|
||||
return _.findLast(this._items, predicate)
|
||||
}
|
||||
|
||||
return this._items[this._items.length - 1]
|
||||
}
|
||||
|
||||
find(iteratee: Iteratee): Collection {
|
||||
const found = this._items.filter(iteratee)
|
||||
|
||||
return new Collection(found)
|
||||
}
|
||||
|
||||
add(data: any) {
|
||||
this._items.push(data)
|
||||
|
||||
return this
|
||||
}
|
||||
|
||||
intersects(collection: Collection): boolean {
|
||||
return _.intersection(this._items, collection.all()).length > 0
|
||||
}
|
||||
|
||||
count() {
|
||||
return this._items.length
|
||||
}
|
||||
|
||||
join(separator: string) {
|
||||
return this._items.join(separator)
|
||||
}
|
||||
|
||||
indexOf(value: string) {
|
||||
return this._items.indexOf(value)
|
||||
}
|
||||
|
||||
push(data: any) {
|
||||
this.add(data)
|
||||
}
|
||||
|
||||
uniq() {
|
||||
const items = _.uniq(this._items)
|
||||
|
||||
return new Collection(items)
|
||||
}
|
||||
|
||||
reduce(iteratee: Iteratee, accumulator: any) {
|
||||
const items = _.reduce(this._items, iteratee, accumulator)
|
||||
|
||||
return new Collection(items)
|
||||
}
|
||||
|
||||
filter(iteratee: Iteratee) {
|
||||
const items = _.filter(this._items, iteratee)
|
||||
|
||||
return new Collection(items)
|
||||
}
|
||||
|
||||
forEach(iteratee: Iteratee) {
|
||||
for (let item of this._items) {
|
||||
iteratee(item)
|
||||
}
|
||||
|
||||
return this
|
||||
}
|
||||
|
||||
remove(iteratee: Iteratee): Collection {
|
||||
const removed = _.remove(this._items, iteratee)
|
||||
|
||||
return new Collection(removed)
|
||||
}
|
||||
|
||||
concat(collection: Collection) {
|
||||
const items = this._items.concat(collection._items)
|
||||
|
||||
return new Collection(items)
|
||||
}
|
||||
|
||||
isEmpty(): boolean {
|
||||
return this._items.length === 0
|
||||
}
|
||||
|
||||
notEmpty(): boolean {
|
||||
return this._items.length > 0
|
||||
}
|
||||
|
||||
sort() {
|
||||
const items = this._items.sort()
|
||||
|
||||
return new Collection(items)
|
||||
}
|
||||
|
||||
orderBy(iteratees: Iteratee | Iteratee[], orders?: Order | Order[]) {
|
||||
const items = orderBy(this._items, iteratees, orders)
|
||||
|
||||
return new Collection(items)
|
||||
}
|
||||
|
||||
keyBy(iteratee: Iteratee) {
|
||||
const items = _.keyBy(this._items, iteratee)
|
||||
|
||||
return new Dictionary(items)
|
||||
}
|
||||
|
||||
empty() {
|
||||
return this._items.length === 0
|
||||
}
|
||||
|
||||
includes(value: any) {
|
||||
if (typeof value === 'function') {
|
||||
const found = this._items.find(value)
|
||||
|
||||
return !!found
|
||||
}
|
||||
|
||||
return this._items.includes(value)
|
||||
}
|
||||
|
||||
missing(value: any) {
|
||||
if (typeof value === 'function') {
|
||||
const found = this._items.find(value)
|
||||
|
||||
return !found
|
||||
}
|
||||
|
||||
return !this._items.includes(value)
|
||||
}
|
||||
|
||||
uniqBy(iteratee: Iteratee) {
|
||||
const items = _.uniqBy(this._items, iteratee)
|
||||
|
||||
return new Collection(items)
|
||||
}
|
||||
|
||||
groupBy(iteratee: Iteratee) {
|
||||
const object = _.groupBy(this._items, iteratee)
|
||||
|
||||
return new Dictionary(object)
|
||||
}
|
||||
|
||||
map(iteratee: Iteratee) {
|
||||
const items = this._items.map(iteratee)
|
||||
|
||||
return new Collection(items)
|
||||
}
|
||||
|
||||
all() {
|
||||
return this._items
|
||||
}
|
||||
|
||||
toJSON() {
|
||||
return JSON.stringify(this._items)
|
||||
}
|
||||
}
|
||||
@@ -1,31 +0,0 @@
|
||||
export class Dictionary {
|
||||
dict: any
|
||||
|
||||
constructor(dict?: any) {
|
||||
this.dict = dict || {}
|
||||
}
|
||||
|
||||
set(key: string, value: any) {
|
||||
this.dict[key] = value
|
||||
}
|
||||
|
||||
has(key: string): boolean {
|
||||
return !!this.dict[key]
|
||||
}
|
||||
|
||||
missing(key: string): boolean {
|
||||
return !this.dict[key]
|
||||
}
|
||||
|
||||
get(key: string): any {
|
||||
return this.dict[key] ? this.dict[key] : undefined
|
||||
}
|
||||
|
||||
keys(): string[] {
|
||||
return Object.keys(this.dict)
|
||||
}
|
||||
|
||||
data() {
|
||||
return this.dict
|
||||
}
|
||||
}
|
||||
@@ -1,31 +0,0 @@
|
||||
import * as path from 'path'
|
||||
|
||||
export class File {
|
||||
filepath: string
|
||||
content: string
|
||||
|
||||
constructor(filepath: string, content?: string) {
|
||||
this.filepath = path.normalize(filepath)
|
||||
this.content = content || ''
|
||||
}
|
||||
|
||||
getFilename() {
|
||||
return path.parse(this.filepath).name
|
||||
}
|
||||
|
||||
dirname() {
|
||||
return path.dirname(this.filepath)
|
||||
}
|
||||
|
||||
basename() {
|
||||
return path.basename(this.filepath)
|
||||
}
|
||||
|
||||
append(data: string) {
|
||||
this.content = this.content + data
|
||||
}
|
||||
|
||||
extension() {
|
||||
return this.filepath.split('.').pop()
|
||||
}
|
||||
}
|
||||
@@ -19,19 +19,19 @@ export class HTMLTable {
|
||||
let output = '<table>\n'
|
||||
|
||||
output += ' <thead>\n <tr>'
|
||||
for (let column of this.columns) {
|
||||
for (const column of this.columns) {
|
||||
output += `<th align="left">${column.name}</th>`
|
||||
}
|
||||
output += '</tr>\n </thead>\n'
|
||||
|
||||
output += ' <tbody>\n'
|
||||
for (let item of this.data) {
|
||||
for (const item of this.data) {
|
||||
output += ' <tr>'
|
||||
let i = 0
|
||||
for (let prop in item) {
|
||||
for (const prop in item) {
|
||||
const column = this.columns[i]
|
||||
let nowrap = column.nowrap ? ` nowrap` : ''
|
||||
let align = column.align ? ` align="${column.align}"` : ''
|
||||
const nowrap = column.nowrap ? ' nowrap' : ''
|
||||
const align = column.align ? ` align="${column.align}"` : ''
|
||||
output += `<td${align}${nowrap}>${item[prop]}</td>`
|
||||
i++
|
||||
}
|
||||
|
||||
@@ -1,13 +1,7 @@
|
||||
export * from './logger'
|
||||
export * from './playlistParser'
|
||||
export * from './numberParser'
|
||||
export * from './logParser'
|
||||
export * from './markdown'
|
||||
export * from './file'
|
||||
export * from './collection'
|
||||
export * from './dictionary'
|
||||
export * from './storage'
|
||||
export * from './url'
|
||||
export * from './issueLoader'
|
||||
export * from './issueParser'
|
||||
export * from './htmlTable'
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
import { Collection } from '@freearhey/core'
|
||||
import { restEndpointMethods } from '@octokit/plugin-rest-endpoint-methods'
|
||||
import { paginateRest } from '@octokit/plugin-paginate-rest'
|
||||
import { Octokit } from '@octokit/core'
|
||||
import { Collection, IssueParser } from './'
|
||||
import { IssueParser } from './'
|
||||
import { TESTING, OWNER, REPO } from '../constants'
|
||||
|
||||
const CustomOctokit = Octokit.plugin(paginateRest, restEndpointMethods)
|
||||
@@ -10,21 +11,26 @@ const octokit = new CustomOctokit()
|
||||
export class IssueLoader {
|
||||
async load({ labels }: { labels: string[] | string }) {
|
||||
labels = Array.isArray(labels) ? labels.join(',') : labels
|
||||
let issues: any[] = []
|
||||
let issues: object[] = []
|
||||
if (TESTING) {
|
||||
switch (labels) {
|
||||
case 'streams:add':
|
||||
issues = (await import('../../tests/__data__/input/issues/streams_add')).default
|
||||
issues = require('../../tests/__data__/input/issues/streams_add.js')
|
||||
break
|
||||
case 'streams:edit':
|
||||
issues = require('../../tests/__data__/input/issues/streams_edit.js')
|
||||
break
|
||||
case 'broken stream':
|
||||
issues = require('../../tests/__data__/input/issues/broken_stream.js')
|
||||
break
|
||||
case 'streams:add,approved':
|
||||
issues = (await import('../../tests/__data__/input/issues/streams_add_approved')).default
|
||||
issues = require('../../tests/__data__/input/issues/streams_add_approved.js')
|
||||
break
|
||||
case 'streams:edit,approved':
|
||||
issues = (await import('../../tests/__data__/input/issues/streams_edit_approved')).default
|
||||
issues = require('../../tests/__data__/input/issues/streams_edit_approved.js')
|
||||
break
|
||||
case 'streams:remove,approved':
|
||||
issues = (await import('../../tests/__data__/input/issues/streams_remove_approved'))
|
||||
.default
|
||||
issues = require('../../tests/__data__/input/issues/streams_remove_approved.js')
|
||||
break
|
||||
}
|
||||
} else {
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
import { Dictionary } from './'
|
||||
import { Dictionary } from '@freearhey/core'
|
||||
import { Issue } from '../models'
|
||||
import _ from 'lodash'
|
||||
|
||||
const FIELDS = new Dictionary({
|
||||
'Channel ID': 'channel_id',
|
||||
@@ -21,7 +20,7 @@ const FIELDS = new Dictionary({
|
||||
})
|
||||
|
||||
export class IssueParser {
|
||||
parse(issue: any): Issue {
|
||||
parse(issue: { number: number; body: string; labels: { name: string }[] }): Issue {
|
||||
const fields = issue.body.split('###')
|
||||
|
||||
const data = new Dictionary()
|
||||
@@ -40,6 +39,8 @@ export class IssueParser {
|
||||
data.set(id, value)
|
||||
})
|
||||
|
||||
return new Issue({ number: issue.number, data })
|
||||
const labels = issue.labels.map(label => label.name)
|
||||
|
||||
return new Issue({ number: issue.number, labels, data })
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@ export type LogItem = {
|
||||
}
|
||||
|
||||
export class LogParser {
|
||||
parse(content: string): any[] {
|
||||
parse(content: string): LogItem[] {
|
||||
if (!content) return []
|
||||
const lines = content.split('\n')
|
||||
|
||||
|
||||
@@ -1,9 +0,0 @@
|
||||
import signale from 'signale'
|
||||
|
||||
const { Signale } = signale
|
||||
|
||||
export class Logger extends Signale {
|
||||
constructor(options?: any) {
|
||||
super(options)
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
import { Collection, Storage } from '@freearhey/core'
|
||||
import parser from 'iptv-playlist-parser'
|
||||
import { Stream } from '../models'
|
||||
import { Collection, Storage } from './'
|
||||
import path from 'path'
|
||||
import { STREAMS_DIR } from '../constants'
|
||||
|
||||
@@ -14,7 +14,7 @@ export class PlaylistParser {
|
||||
async parse(files: string[]): Promise<Collection> {
|
||||
let streams = new Collection()
|
||||
|
||||
for (let filepath of files) {
|
||||
for (const filepath of files) {
|
||||
const relativeFilepath = filepath.replace(path.normalize(STREAMS_DIR), '')
|
||||
const _streams: Collection = await this.parseFile(relativeFilepath)
|
||||
streams = streams.concat(_streams)
|
||||
@@ -26,7 +26,7 @@ export class PlaylistParser {
|
||||
async parseFile(filepath: string): Promise<Collection> {
|
||||
const streams = new Collection()
|
||||
|
||||
const content = await this.storage.read(filepath)
|
||||
const content = await this.storage.load(filepath)
|
||||
const parsed: parser.Playlist = parser.parse(content)
|
||||
|
||||
parsed.items.forEach((item: parser.PlaylistItem) => {
|
||||
|
||||
@@ -1,84 +0,0 @@
|
||||
import { File, Collection } from './'
|
||||
import * as path from 'path'
|
||||
import fs from 'fs-extra'
|
||||
import { glob } from 'glob'
|
||||
|
||||
export class Storage {
|
||||
rootDir: string
|
||||
|
||||
constructor(rootDir?: string) {
|
||||
this.rootDir = path.normalize(rootDir || './')
|
||||
}
|
||||
|
||||
async list(pattern: string): Promise<string[]> {
|
||||
const files = await glob(pattern, {
|
||||
cwd: this.rootDir
|
||||
})
|
||||
|
||||
return files.sort()
|
||||
}
|
||||
|
||||
async createDir(dir: string): Promise<void> {
|
||||
if (await fs.exists(dir)) return
|
||||
|
||||
await fs.mkdir(dir, { recursive: true }).catch(console.error)
|
||||
}
|
||||
|
||||
async load(filepath: string): Promise<any> {
|
||||
return this.read(filepath)
|
||||
}
|
||||
|
||||
async read(filepath: string): Promise<any> {
|
||||
const absFilepath = path.join(this.rootDir, filepath)
|
||||
|
||||
return await fs.readFile(absFilepath, { encoding: 'utf8' })
|
||||
}
|
||||
|
||||
async json(filepath: string): Promise<any> {
|
||||
const absFilepath = path.join(this.rootDir, filepath)
|
||||
const content = await fs.readFile(absFilepath, { encoding: 'utf8' })
|
||||
|
||||
return JSON.parse(content)
|
||||
}
|
||||
|
||||
async exists(filepath: string): Promise<boolean> {
|
||||
const absFilepath = path.join(this.rootDir, filepath)
|
||||
|
||||
return await fs.exists(absFilepath)
|
||||
}
|
||||
|
||||
async write(filepath: string, data: string = ''): Promise<void> {
|
||||
const absFilepath = path.join(this.rootDir, filepath)
|
||||
const dir = path.dirname(absFilepath)
|
||||
|
||||
await this.createDir(dir)
|
||||
await fs.writeFile(absFilepath, data, { encoding: 'utf8', flag: 'w' })
|
||||
}
|
||||
|
||||
async append(filepath: string, data: string = ''): Promise<void> {
|
||||
const absFilepath = path.join(this.rootDir, filepath)
|
||||
|
||||
await fs.appendFile(absFilepath, data, { encoding: 'utf8', flag: 'w' })
|
||||
}
|
||||
|
||||
async clear(filepath: string): Promise<void> {
|
||||
await this.write(filepath)
|
||||
}
|
||||
|
||||
async createStream(filepath: string): Promise<NodeJS.WriteStream> {
|
||||
const absFilepath = path.join(this.rootDir, filepath)
|
||||
const dir = path.dirname(absFilepath)
|
||||
|
||||
await this.createDir(dir)
|
||||
|
||||
return fs.createWriteStream(absFilepath) as unknown as NodeJS.WriteStream
|
||||
}
|
||||
|
||||
async save(filepath: string, content: string): Promise<void> {
|
||||
await this.write(filepath, content)
|
||||
}
|
||||
|
||||
async saveFile(file: File): Promise<void> {
|
||||
await this.write(file.filepath, file.content)
|
||||
}
|
||||
}
|
||||
@@ -1,20 +0,0 @@
|
||||
import normalizeUrl from 'normalize-url'
|
||||
|
||||
export class URL {
|
||||
url: string
|
||||
|
||||
constructor(url: string) {
|
||||
this.url = url
|
||||
}
|
||||
|
||||
normalize(): URL {
|
||||
const normalized = normalizeUrl(this.url, { stripWWW: false })
|
||||
this.url = decodeURIComponent(normalized).replace(/\s/g, '+')
|
||||
|
||||
return this
|
||||
}
|
||||
|
||||
toString(): string {
|
||||
return this.url
|
||||
}
|
||||
}
|
||||
@@ -1,55 +1,53 @@
|
||||
import { Generator } from './generator'
|
||||
import { Collection, Storage, Logger } from '../core'
|
||||
import { Stream, Category, Playlist } from '../models'
|
||||
import { PUBLIC_DIR } from '../constants'
|
||||
|
||||
type CategoriesGeneratorProps = {
|
||||
streams: Collection
|
||||
categories: Collection
|
||||
logger: Logger
|
||||
}
|
||||
|
||||
export class CategoriesGenerator implements Generator {
|
||||
streams: Collection
|
||||
categories: Collection
|
||||
storage: Storage
|
||||
logger: Logger
|
||||
|
||||
constructor({ streams, categories, logger }: CategoriesGeneratorProps) {
|
||||
this.streams = streams
|
||||
this.categories = categories
|
||||
this.storage = new Storage(PUBLIC_DIR)
|
||||
this.logger = logger
|
||||
}
|
||||
|
||||
async generate() {
|
||||
const streams = this.streams.orderBy([(stream: Stream) => stream.getTitle()])
|
||||
|
||||
this.categories.forEach(async (category: Category) => {
|
||||
let categoryStreams = streams
|
||||
.filter((stream: Stream) => stream.hasCategory(category))
|
||||
.map((stream: Stream) => {
|
||||
const groupTitle = stream.categories
|
||||
? stream.categories
|
||||
.map((category: Category) => category.name)
|
||||
.sort()
|
||||
.join(';')
|
||||
: ''
|
||||
stream.groupTitle = groupTitle
|
||||
|
||||
return stream
|
||||
})
|
||||
|
||||
const playlist = new Playlist(categoryStreams, { public: true })
|
||||
const filepath = `categories/${category.id}.m3u`
|
||||
await this.storage.save(filepath, playlist.toString())
|
||||
this.logger.info(JSON.stringify({ filepath, count: playlist.streams.count() }))
|
||||
})
|
||||
|
||||
const undefinedStreams = streams.filter((stream: Stream) => stream.noCategories())
|
||||
const playlist = new Playlist(undefinedStreams, { public: true })
|
||||
const filepath = `categories/undefined.m3u`
|
||||
await this.storage.save(filepath, playlist.toString())
|
||||
this.logger.info(JSON.stringify({ filepath, count: playlist.streams.count() }))
|
||||
}
|
||||
}
|
||||
import { Generator } from './generator'
|
||||
import { Collection, Storage, Logger } from '@freearhey/core'
|
||||
import { Stream, Category, Playlist } from '../models'
|
||||
import { PUBLIC_DIR } from '../constants'
|
||||
|
||||
type CategoriesGeneratorProps = {
|
||||
streams: Collection
|
||||
categories: Collection
|
||||
logger: Logger
|
||||
}
|
||||
|
||||
export class CategoriesGenerator implements Generator {
|
||||
streams: Collection
|
||||
categories: Collection
|
||||
storage: Storage
|
||||
logger: Logger
|
||||
|
||||
constructor({ streams, categories, logger }: CategoriesGeneratorProps) {
|
||||
this.streams = streams
|
||||
this.categories = categories
|
||||
this.storage = new Storage(PUBLIC_DIR)
|
||||
this.logger = logger
|
||||
}
|
||||
|
||||
async generate() {
|
||||
const streams = this.streams.orderBy([(stream: Stream) => stream.getTitle()])
|
||||
|
||||
this.categories.forEach(async (category: Category) => {
|
||||
const categoryStreams = streams
|
||||
.filter((stream: Stream) => stream.hasCategory(category))
|
||||
.map((stream: Stream) => {
|
||||
const streamCategories = stream.categories
|
||||
.map((category: Category) => category.name)
|
||||
.sort()
|
||||
const groupTitle = stream.categories ? streamCategories.join(';') : ''
|
||||
stream.groupTitle = groupTitle
|
||||
|
||||
return stream
|
||||
})
|
||||
|
||||
const playlist = new Playlist(categoryStreams, { public: true })
|
||||
const filepath = `categories/${category.id}.m3u`
|
||||
await this.storage.save(filepath, playlist.toString())
|
||||
this.logger.info(JSON.stringify({ filepath, count: playlist.streams.count() }))
|
||||
})
|
||||
|
||||
const undefinedStreams = streams.filter((stream: Stream) => stream.noCategories())
|
||||
const playlist = new Playlist(undefinedStreams, { public: true })
|
||||
const filepath = 'categories/undefined.m3u'
|
||||
await this.storage.save(filepath, playlist.toString())
|
||||
this.logger.info(JSON.stringify({ filepath, count: playlist.streams.count() }))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,85 +1,85 @@
|
||||
import { Generator } from './generator'
|
||||
import { Collection, Storage, Logger } from '../core'
|
||||
import { Country, Region, Subdivision, Stream, Playlist } from '../models'
|
||||
import { PUBLIC_DIR } from '../constants'
|
||||
|
||||
type CountriesGeneratorProps = {
|
||||
streams: Collection
|
||||
regions: Collection
|
||||
subdivisions: Collection
|
||||
countries: Collection
|
||||
logger: Logger
|
||||
}
|
||||
|
||||
export class CountriesGenerator implements Generator {
|
||||
streams: Collection
|
||||
countries: Collection
|
||||
regions: Collection
|
||||
subdivisions: Collection
|
||||
storage: Storage
|
||||
logger: Logger
|
||||
|
||||
constructor({ streams, countries, regions, subdivisions, logger }: CountriesGeneratorProps) {
|
||||
this.streams = streams
|
||||
this.countries = countries
|
||||
this.regions = regions
|
||||
this.subdivisions = subdivisions
|
||||
this.storage = new Storage(PUBLIC_DIR)
|
||||
this.logger = logger
|
||||
}
|
||||
|
||||
async generate(): Promise<void> {
|
||||
let streams = this.streams
|
||||
.orderBy([stream => stream.getTitle()])
|
||||
.filter((stream: Stream) => stream.isSFW())
|
||||
let regions = this.regions.filter((region: Region) => region.code !== 'INT')
|
||||
|
||||
this.countries.forEach(async (country: Country) => {
|
||||
const countrySubdivisions = this.subdivisions.filter(
|
||||
(subdivision: Subdivision) => subdivision.country === country.code
|
||||
)
|
||||
|
||||
const countrySubdivisionsCodes = countrySubdivisions.map(
|
||||
(subdivision: Subdivision) => `s/${subdivision.code}`
|
||||
)
|
||||
|
||||
const countryAreaCodes = regions
|
||||
.filter((region: Region) => region.countries.includes(country.code))
|
||||
.map((region: Region) => `r/${region.code}`)
|
||||
.concat(countrySubdivisionsCodes)
|
||||
.add(`c/${country.code}`)
|
||||
|
||||
const countryStreams = streams.filter(stream =>
|
||||
stream.broadcastArea.intersects(countryAreaCodes)
|
||||
)
|
||||
|
||||
if (countryStreams.isEmpty()) return
|
||||
|
||||
const playlist = new Playlist(countryStreams, { public: true })
|
||||
const filepath = `countries/${country.code.toLowerCase()}.m3u`
|
||||
await this.storage.save(filepath, playlist.toString())
|
||||
this.logger.info(JSON.stringify({ filepath, count: playlist.streams.count() }))
|
||||
|
||||
countrySubdivisions.forEach(async (subdivision: Subdivision) => {
|
||||
const subdivisionStreams = streams.filter(stream =>
|
||||
stream.broadcastArea.includes(`s/${subdivision.code}`)
|
||||
)
|
||||
|
||||
if (subdivisionStreams.isEmpty()) return
|
||||
|
||||
const playlist = new Playlist(subdivisionStreams, { public: true })
|
||||
const filepath = `subdivisions/${subdivision.code.toLowerCase()}.m3u`
|
||||
await this.storage.save(filepath, playlist.toString())
|
||||
this.logger.info(JSON.stringify({ filepath, count: playlist.streams.count() }))
|
||||
})
|
||||
})
|
||||
|
||||
const internationalStreams = streams.filter(stream => stream.isInternational())
|
||||
if (internationalStreams.notEmpty()) {
|
||||
const playlist = new Playlist(internationalStreams, { public: true })
|
||||
const filepath = `countries/int.m3u`
|
||||
await this.storage.save(filepath, playlist.toString())
|
||||
this.logger.info(JSON.stringify({ filepath, count: playlist.streams.count() }))
|
||||
}
|
||||
}
|
||||
}
|
||||
import { Generator } from './generator'
|
||||
import { Collection, Storage, Logger } from '@freearhey/core'
|
||||
import { Country, Region, Subdivision, Stream, Playlist } from '../models'
|
||||
import { PUBLIC_DIR } from '../constants'
|
||||
|
||||
type CountriesGeneratorProps = {
|
||||
streams: Collection
|
||||
regions: Collection
|
||||
subdivisions: Collection
|
||||
countries: Collection
|
||||
logger: Logger
|
||||
}
|
||||
|
||||
export class CountriesGenerator implements Generator {
|
||||
streams: Collection
|
||||
countries: Collection
|
||||
regions: Collection
|
||||
subdivisions: Collection
|
||||
storage: Storage
|
||||
logger: Logger
|
||||
|
||||
constructor({ streams, countries, regions, subdivisions, logger }: CountriesGeneratorProps) {
|
||||
this.streams = streams
|
||||
this.countries = countries
|
||||
this.regions = regions
|
||||
this.subdivisions = subdivisions
|
||||
this.storage = new Storage(PUBLIC_DIR)
|
||||
this.logger = logger
|
||||
}
|
||||
|
||||
async generate(): Promise<void> {
|
||||
const streams = this.streams
|
||||
.orderBy([stream => stream.getTitle()])
|
||||
.filter((stream: Stream) => stream.isSFW())
|
||||
const regions = this.regions.filter((region: Region) => region.code !== 'INT')
|
||||
|
||||
this.countries.forEach(async (country: Country) => {
|
||||
const countrySubdivisions = this.subdivisions.filter(
|
||||
(subdivision: Subdivision) => subdivision.country === country.code
|
||||
)
|
||||
|
||||
const countrySubdivisionsCodes = countrySubdivisions.map(
|
||||
(subdivision: Subdivision) => `s/${subdivision.code}`
|
||||
)
|
||||
|
||||
const countryAreaCodes = regions
|
||||
.filter((region: Region) => region.countries.includes(country.code))
|
||||
.map((region: Region) => `r/${region.code}`)
|
||||
.concat(countrySubdivisionsCodes)
|
||||
.add(`c/${country.code}`)
|
||||
|
||||
const countryStreams = streams.filter(stream =>
|
||||
stream.broadcastArea.intersects(countryAreaCodes)
|
||||
)
|
||||
|
||||
if (countryStreams.isEmpty()) return
|
||||
|
||||
const playlist = new Playlist(countryStreams, { public: true })
|
||||
const filepath = `countries/${country.code.toLowerCase()}.m3u`
|
||||
await this.storage.save(filepath, playlist.toString())
|
||||
this.logger.info(JSON.stringify({ filepath, count: playlist.streams.count() }))
|
||||
|
||||
countrySubdivisions.forEach(async (subdivision: Subdivision) => {
|
||||
const subdivisionStreams = streams.filter(stream =>
|
||||
stream.broadcastArea.includes(`s/${subdivision.code}`)
|
||||
)
|
||||
|
||||
if (subdivisionStreams.isEmpty()) return
|
||||
|
||||
const playlist = new Playlist(subdivisionStreams, { public: true })
|
||||
const filepath = `subdivisions/${subdivision.code.toLowerCase()}.m3u`
|
||||
await this.storage.save(filepath, playlist.toString())
|
||||
this.logger.info(JSON.stringify({ filepath, count: playlist.streams.count() }))
|
||||
})
|
||||
})
|
||||
|
||||
const internationalStreams = streams.filter(stream => stream.isInternational())
|
||||
if (internationalStreams.notEmpty()) {
|
||||
const playlist = new Playlist(internationalStreams, { public: true })
|
||||
const filepath = 'countries/int.m3u'
|
||||
await this.storage.save(filepath, playlist.toString())
|
||||
this.logger.info(JSON.stringify({ filepath, count: playlist.streams.count() }))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
export * from './categoriesGenerator'
|
||||
export * from './countriesGenerator'
|
||||
export * from './languagesGenerator'
|
||||
export * from './regionsGenerator'
|
||||
export * from './indexGenerator'
|
||||
export * from './indexNsfwGenerator'
|
||||
export * from './indexCategoryGenerator'
|
||||
export * from './indexCountryGenerator'
|
||||
export * from './indexLanguageGenerator'
|
||||
export * from './indexRegionGenerator'
|
||||
export * from './categoriesGenerator'
|
||||
export * from './countriesGenerator'
|
||||
export * from './languagesGenerator'
|
||||
export * from './regionsGenerator'
|
||||
export * from './indexGenerator'
|
||||
export * from './indexNsfwGenerator'
|
||||
export * from './indexCategoryGenerator'
|
||||
export * from './indexCountryGenerator'
|
||||
export * from './indexLanguageGenerator'
|
||||
export * from './indexRegionGenerator'
|
||||
|
||||
@@ -1,53 +1,53 @@
|
||||
import { Generator } from './generator'
|
||||
import { Collection, Storage, Logger } from '../core'
|
||||
import { Stream, Playlist, Category } from '../models'
|
||||
import { PUBLIC_DIR } from '../constants'
|
||||
|
||||
type IndexCategoryGeneratorProps = {
|
||||
streams: Collection
|
||||
logger: Logger
|
||||
}
|
||||
|
||||
export class IndexCategoryGenerator implements Generator {
|
||||
streams: Collection
|
||||
storage: Storage
|
||||
logger: Logger
|
||||
|
||||
constructor({ streams, logger }: IndexCategoryGeneratorProps) {
|
||||
this.streams = streams
|
||||
this.storage = new Storage(PUBLIC_DIR)
|
||||
this.logger = logger
|
||||
}
|
||||
|
||||
async generate(): Promise<void> {
|
||||
const streams = this.streams
|
||||
.orderBy(stream => stream.getTitle())
|
||||
.filter(stream => stream.isSFW())
|
||||
|
||||
let groupedStreams = new Collection()
|
||||
streams.forEach((stream: Stream) => {
|
||||
if (stream.noCategories()) {
|
||||
const streamClone = stream.clone()
|
||||
streamClone.groupTitle = 'Undefined'
|
||||
groupedStreams.add(streamClone)
|
||||
return
|
||||
}
|
||||
|
||||
stream.categories.forEach((category: Category) => {
|
||||
const streamClone = stream.clone()
|
||||
streamClone.groupTitle = category.name
|
||||
groupedStreams.push(streamClone)
|
||||
})
|
||||
})
|
||||
|
||||
groupedStreams = groupedStreams.orderBy(stream => {
|
||||
if (stream.groupTitle === 'Undefined') return 'ZZ'
|
||||
return stream.groupTitle
|
||||
})
|
||||
|
||||
const playlist = new Playlist(groupedStreams, { public: true })
|
||||
const filepath = 'index.category.m3u'
|
||||
await this.storage.save(filepath, playlist.toString())
|
||||
this.logger.info(JSON.stringify({ filepath, count: playlist.streams.count() }))
|
||||
}
|
||||
}
|
||||
import { Generator } from './generator'
|
||||
import { Collection, Storage, Logger } from '@freearhey/core'
|
||||
import { Stream, Playlist, Category } from '../models'
|
||||
import { PUBLIC_DIR } from '../constants'
|
||||
|
||||
type IndexCategoryGeneratorProps = {
|
||||
streams: Collection
|
||||
logger: Logger
|
||||
}
|
||||
|
||||
export class IndexCategoryGenerator implements Generator {
|
||||
streams: Collection
|
||||
storage: Storage
|
||||
logger: Logger
|
||||
|
||||
constructor({ streams, logger }: IndexCategoryGeneratorProps) {
|
||||
this.streams = streams
|
||||
this.storage = new Storage(PUBLIC_DIR)
|
||||
this.logger = logger
|
||||
}
|
||||
|
||||
async generate(): Promise<void> {
|
||||
const streams = this.streams
|
||||
.orderBy(stream => stream.getTitle())
|
||||
.filter(stream => stream.isSFW())
|
||||
|
||||
let groupedStreams = new Collection()
|
||||
streams.forEach((stream: Stream) => {
|
||||
if (stream.noCategories()) {
|
||||
const streamClone = stream.clone()
|
||||
streamClone.groupTitle = 'Undefined'
|
||||
groupedStreams.add(streamClone)
|
||||
return
|
||||
}
|
||||
|
||||
stream.categories.forEach((category: Category) => {
|
||||
const streamClone = stream.clone()
|
||||
streamClone.groupTitle = category.name
|
||||
groupedStreams.push(streamClone)
|
||||
})
|
||||
})
|
||||
|
||||
groupedStreams = groupedStreams.orderBy(stream => {
|
||||
if (stream.groupTitle === 'Undefined') return 'ZZ'
|
||||
return stream.groupTitle
|
||||
})
|
||||
|
||||
const playlist = new Playlist(groupedStreams, { public: true })
|
||||
const filepath = 'index.category.m3u'
|
||||
await this.storage.save(filepath, playlist.toString())
|
||||
this.logger.info(JSON.stringify({ filepath, count: playlist.streams.count() }))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,104 +1,104 @@
|
||||
import { Generator } from './generator'
|
||||
import { Collection, Storage, Logger } from '../core'
|
||||
import { Stream, Playlist, Country, Subdivision, Region } from '../models'
|
||||
import { PUBLIC_DIR } from '../constants'
|
||||
|
||||
type IndexCountryGeneratorProps = {
|
||||
streams: Collection
|
||||
regions: Collection
|
||||
countries: Collection
|
||||
subdivisions: Collection
|
||||
logger: Logger
|
||||
}
|
||||
|
||||
export class IndexCountryGenerator implements Generator {
|
||||
streams: Collection
|
||||
countries: Collection
|
||||
regions: Collection
|
||||
subdivisions: Collection
|
||||
storage: Storage
|
||||
logger: Logger
|
||||
|
||||
constructor({ streams, regions, countries, subdivisions, logger }: IndexCountryGeneratorProps) {
|
||||
this.streams = streams
|
||||
this.countries = countries
|
||||
this.regions = regions
|
||||
this.subdivisions = subdivisions
|
||||
this.storage = new Storage(PUBLIC_DIR)
|
||||
this.logger = logger
|
||||
}
|
||||
|
||||
async generate(): Promise<void> {
|
||||
let groupedStreams = new Collection()
|
||||
|
||||
this.streams
|
||||
.orderBy(stream => stream.getTitle())
|
||||
.filter(stream => stream.isSFW())
|
||||
.forEach(stream => {
|
||||
if (stream.noBroadcastArea()) {
|
||||
const streamClone = stream.clone()
|
||||
streamClone.groupTitle = 'Undefined'
|
||||
groupedStreams.add(streamClone)
|
||||
return
|
||||
}
|
||||
|
||||
if (stream.isInternational()) {
|
||||
const streamClone = stream.clone()
|
||||
streamClone.groupTitle = 'International'
|
||||
groupedStreams.add(streamClone)
|
||||
}
|
||||
|
||||
this.getStreamBroadcastCountries(stream).forEach((country: Country) => {
|
||||
const streamClone = stream.clone()
|
||||
streamClone.groupTitle = country.name
|
||||
groupedStreams.add(streamClone)
|
||||
})
|
||||
})
|
||||
|
||||
groupedStreams = groupedStreams.orderBy((stream: Stream) => {
|
||||
if (stream.groupTitle === 'International') return 'ZZ'
|
||||
if (stream.groupTitle === 'Undefined') return 'ZZZ'
|
||||
|
||||
return stream.groupTitle
|
||||
})
|
||||
|
||||
const playlist = new Playlist(groupedStreams, { public: true })
|
||||
const filepath = 'index.country.m3u'
|
||||
await this.storage.save(filepath, playlist.toString())
|
||||
this.logger.info(JSON.stringify({ filepath, count: playlist.streams.count() }))
|
||||
}
|
||||
|
||||
getStreamBroadcastCountries(stream: Stream) {
|
||||
const groupedRegions = this.regions.keyBy((region: Region) => region.code)
|
||||
const groupedCountries = this.countries.keyBy((country: Country) => country.code)
|
||||
const groupedSubdivisions = this.subdivisions.keyBy(
|
||||
(subdivision: Subdivision) => subdivision.code
|
||||
)
|
||||
|
||||
let broadcastCountries = new Collection()
|
||||
|
||||
stream.broadcastArea.forEach(broadcastAreaCode => {
|
||||
const [type, code] = broadcastAreaCode.split('/')
|
||||
switch (type) {
|
||||
case 'c':
|
||||
broadcastCountries.add(code)
|
||||
break
|
||||
case 'r':
|
||||
if (code !== 'INT' && groupedRegions.has(code)) {
|
||||
broadcastCountries = broadcastCountries.concat(groupedRegions.get(code).countries)
|
||||
}
|
||||
break
|
||||
case 's':
|
||||
if (groupedSubdivisions.has(code)) {
|
||||
broadcastCountries.add(groupedSubdivisions.get(code).country)
|
||||
}
|
||||
break
|
||||
}
|
||||
})
|
||||
|
||||
return broadcastCountries
|
||||
.uniq()
|
||||
.map(code => groupedCountries.get(code))
|
||||
.filter(Boolean)
|
||||
}
|
||||
}
|
||||
import { Generator } from './generator'
|
||||
import { Collection, Storage, Logger } from '@freearhey/core'
|
||||
import { Stream, Playlist, Country, Subdivision, Region } from '../models'
|
||||
import { PUBLIC_DIR } from '../constants'
|
||||
|
||||
type IndexCountryGeneratorProps = {
|
||||
streams: Collection
|
||||
regions: Collection
|
||||
countries: Collection
|
||||
subdivisions: Collection
|
||||
logger: Logger
|
||||
}
|
||||
|
||||
export class IndexCountryGenerator implements Generator {
|
||||
streams: Collection
|
||||
countries: Collection
|
||||
regions: Collection
|
||||
subdivisions: Collection
|
||||
storage: Storage
|
||||
logger: Logger
|
||||
|
||||
constructor({ streams, regions, countries, subdivisions, logger }: IndexCountryGeneratorProps) {
|
||||
this.streams = streams
|
||||
this.countries = countries
|
||||
this.regions = regions
|
||||
this.subdivisions = subdivisions
|
||||
this.storage = new Storage(PUBLIC_DIR)
|
||||
this.logger = logger
|
||||
}
|
||||
|
||||
async generate(): Promise<void> {
|
||||
let groupedStreams = new Collection()
|
||||
|
||||
this.streams
|
||||
.orderBy(stream => stream.getTitle())
|
||||
.filter(stream => stream.isSFW())
|
||||
.forEach(stream => {
|
||||
if (stream.noBroadcastArea()) {
|
||||
const streamClone = stream.clone()
|
||||
streamClone.groupTitle = 'Undefined'
|
||||
groupedStreams.add(streamClone)
|
||||
return
|
||||
}
|
||||
|
||||
if (stream.isInternational()) {
|
||||
const streamClone = stream.clone()
|
||||
streamClone.groupTitle = 'International'
|
||||
groupedStreams.add(streamClone)
|
||||
}
|
||||
|
||||
this.getStreamBroadcastCountries(stream).forEach((country: Country) => {
|
||||
const streamClone = stream.clone()
|
||||
streamClone.groupTitle = country.name
|
||||
groupedStreams.add(streamClone)
|
||||
})
|
||||
})
|
||||
|
||||
groupedStreams = groupedStreams.orderBy((stream: Stream) => {
|
||||
if (stream.groupTitle === 'International') return 'ZZ'
|
||||
if (stream.groupTitle === 'Undefined') return 'ZZZ'
|
||||
|
||||
return stream.groupTitle
|
||||
})
|
||||
|
||||
const playlist = new Playlist(groupedStreams, { public: true })
|
||||
const filepath = 'index.country.m3u'
|
||||
await this.storage.save(filepath, playlist.toString())
|
||||
this.logger.info(JSON.stringify({ filepath, count: playlist.streams.count() }))
|
||||
}
|
||||
|
||||
getStreamBroadcastCountries(stream: Stream) {
|
||||
const groupedRegions = this.regions.keyBy((region: Region) => region.code)
|
||||
const groupedCountries = this.countries.keyBy((country: Country) => country.code)
|
||||
const groupedSubdivisions = this.subdivisions.keyBy(
|
||||
(subdivision: Subdivision) => subdivision.code
|
||||
)
|
||||
|
||||
let broadcastCountries = new Collection()
|
||||
|
||||
stream.broadcastArea.forEach(broadcastAreaCode => {
|
||||
const [type, code] = broadcastAreaCode.split('/')
|
||||
switch (type) {
|
||||
case 'c':
|
||||
broadcastCountries.add(code)
|
||||
break
|
||||
case 'r':
|
||||
if (code !== 'INT' && groupedRegions.has(code)) {
|
||||
broadcastCountries = broadcastCountries.concat(groupedRegions.get(code).countries)
|
||||
}
|
||||
break
|
||||
case 's':
|
||||
if (groupedSubdivisions.has(code)) {
|
||||
broadcastCountries.add(groupedSubdivisions.get(code).country)
|
||||
}
|
||||
break
|
||||
}
|
||||
})
|
||||
|
||||
return broadcastCountries
|
||||
.uniq()
|
||||
.map(code => groupedCountries.get(code))
|
||||
.filter(Boolean)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,32 +1,32 @@
|
||||
import { Collection, Logger, Storage } from '../core'
|
||||
import { Stream, Playlist } from '../models'
|
||||
import { Generator } from './generator'
|
||||
import { PUBLIC_DIR } from '../constants'
|
||||
|
||||
type IndexGeneratorProps = {
|
||||
streams: Collection
|
||||
logger: Logger
|
||||
}
|
||||
|
||||
export class IndexGenerator implements Generator {
|
||||
streams: Collection
|
||||
storage: Storage
|
||||
logger: Logger
|
||||
|
||||
constructor({ streams, logger }: IndexGeneratorProps) {
|
||||
this.streams = streams
|
||||
this.storage = new Storage(PUBLIC_DIR)
|
||||
this.logger = logger
|
||||
}
|
||||
|
||||
async generate(): Promise<void> {
|
||||
const sfwStreams = this.streams
|
||||
.orderBy(stream => stream.getTitle())
|
||||
.filter((stream: Stream) => stream.isSFW())
|
||||
|
||||
const playlist = new Playlist(sfwStreams, { public: true })
|
||||
const filepath = 'index.m3u'
|
||||
await this.storage.save(filepath, playlist.toString())
|
||||
this.logger.info(JSON.stringify({ filepath, count: playlist.streams.count() }))
|
||||
}
|
||||
}
|
||||
import { Collection, Logger, Storage } from '@freearhey/core'
|
||||
import { Stream, Playlist } from '../models'
|
||||
import { Generator } from './generator'
|
||||
import { PUBLIC_DIR } from '../constants'
|
||||
|
||||
type IndexGeneratorProps = {
|
||||
streams: Collection
|
||||
logger: Logger
|
||||
}
|
||||
|
||||
export class IndexGenerator implements Generator {
|
||||
streams: Collection
|
||||
storage: Storage
|
||||
logger: Logger
|
||||
|
||||
constructor({ streams, logger }: IndexGeneratorProps) {
|
||||
this.streams = streams
|
||||
this.storage = new Storage(PUBLIC_DIR)
|
||||
this.logger = logger
|
||||
}
|
||||
|
||||
async generate(): Promise<void> {
|
||||
const sfwStreams = this.streams
|
||||
.orderBy(stream => stream.getTitle())
|
||||
.filter((stream: Stream) => stream.isSFW())
|
||||
|
||||
const playlist = new Playlist(sfwStreams, { public: true })
|
||||
const filepath = 'index.m3u'
|
||||
await this.storage.save(filepath, playlist.toString())
|
||||
this.logger.info(JSON.stringify({ filepath, count: playlist.streams.count() }))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,52 +1,52 @@
|
||||
import { Generator } from './generator'
|
||||
import { Collection, Storage, Logger } from '../core'
|
||||
import { Stream, Playlist, Language } from '../models'
|
||||
import { PUBLIC_DIR } from '../constants'
|
||||
|
||||
type IndexLanguageGeneratorProps = {
|
||||
streams: Collection
|
||||
logger: Logger
|
||||
}
|
||||
|
||||
export class IndexLanguageGenerator implements Generator {
|
||||
streams: Collection
|
||||
storage: Storage
|
||||
logger: Logger
|
||||
|
||||
constructor({ streams, logger }: IndexLanguageGeneratorProps) {
|
||||
this.streams = streams
|
||||
this.storage = new Storage(PUBLIC_DIR)
|
||||
this.logger = logger
|
||||
}
|
||||
|
||||
async generate(): Promise<void> {
|
||||
let groupedStreams = new Collection()
|
||||
this.streams
|
||||
.orderBy(stream => stream.getTitle())
|
||||
.filter(stream => stream.isSFW())
|
||||
.forEach(stream => {
|
||||
if (stream.noLanguages()) {
|
||||
const streamClone = stream.clone()
|
||||
streamClone.groupTitle = 'Undefined'
|
||||
groupedStreams.add(streamClone)
|
||||
return
|
||||
}
|
||||
|
||||
stream.languages.forEach((language: Language) => {
|
||||
const streamClone = stream.clone()
|
||||
streamClone.groupTitle = language.name
|
||||
groupedStreams.add(streamClone)
|
||||
})
|
||||
})
|
||||
|
||||
groupedStreams = groupedStreams.orderBy((stream: Stream) => {
|
||||
if (stream.groupTitle === 'Undefined') return 'ZZ'
|
||||
return stream.groupTitle
|
||||
})
|
||||
|
||||
const playlist = new Playlist(groupedStreams, { public: true })
|
||||
const filepath = 'index.language.m3u'
|
||||
await this.storage.save(filepath, playlist.toString())
|
||||
this.logger.info(JSON.stringify({ filepath, count: playlist.streams.count() }))
|
||||
}
|
||||
}
|
||||
import { Generator } from './generator'
|
||||
import { Collection, Storage, Logger } from '@freearhey/core'
|
||||
import { Stream, Playlist, Language } from '../models'
|
||||
import { PUBLIC_DIR } from '../constants'
|
||||
|
||||
type IndexLanguageGeneratorProps = {
|
||||
streams: Collection
|
||||
logger: Logger
|
||||
}
|
||||
|
||||
export class IndexLanguageGenerator implements Generator {
|
||||
streams: Collection
|
||||
storage: Storage
|
||||
logger: Logger
|
||||
|
||||
constructor({ streams, logger }: IndexLanguageGeneratorProps) {
|
||||
this.streams = streams
|
||||
this.storage = new Storage(PUBLIC_DIR)
|
||||
this.logger = logger
|
||||
}
|
||||
|
||||
async generate(): Promise<void> {
|
||||
let groupedStreams = new Collection()
|
||||
this.streams
|
||||
.orderBy(stream => stream.getTitle())
|
||||
.filter(stream => stream.isSFW())
|
||||
.forEach(stream => {
|
||||
if (stream.noLanguages()) {
|
||||
const streamClone = stream.clone()
|
||||
streamClone.groupTitle = 'Undefined'
|
||||
groupedStreams.add(streamClone)
|
||||
return
|
||||
}
|
||||
|
||||
stream.languages.forEach((language: Language) => {
|
||||
const streamClone = stream.clone()
|
||||
streamClone.groupTitle = language.name
|
||||
groupedStreams.add(streamClone)
|
||||
})
|
||||
})
|
||||
|
||||
groupedStreams = groupedStreams.orderBy((stream: Stream) => {
|
||||
if (stream.groupTitle === 'Undefined') return 'ZZ'
|
||||
return stream.groupTitle
|
||||
})
|
||||
|
||||
const playlist = new Playlist(groupedStreams, { public: true })
|
||||
const filepath = 'index.language.m3u'
|
||||
await this.storage.save(filepath, playlist.toString())
|
||||
this.logger.info(JSON.stringify({ filepath, count: playlist.streams.count() }))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,30 +1,30 @@
|
||||
import { Collection, Logger, Storage } from '../core'
|
||||
import { Stream, Playlist } from '../models'
|
||||
import { Generator } from './generator'
|
||||
import { PUBLIC_DIR } from '../constants'
|
||||
|
||||
type IndexNsfwGeneratorProps = {
|
||||
streams: Collection
|
||||
logger: Logger
|
||||
}
|
||||
|
||||
export class IndexNsfwGenerator implements Generator {
|
||||
streams: Collection
|
||||
storage: Storage
|
||||
logger: Logger
|
||||
|
||||
constructor({ streams, logger }: IndexNsfwGeneratorProps) {
|
||||
this.streams = streams
|
||||
this.storage = new Storage(PUBLIC_DIR)
|
||||
this.logger = logger
|
||||
}
|
||||
|
||||
async generate(): Promise<void> {
|
||||
const allStreams = this.streams.orderBy((stream: Stream) => stream.getTitle())
|
||||
|
||||
const playlist = new Playlist(allStreams, { public: true })
|
||||
const filepath = 'index.nsfw.m3u'
|
||||
await this.storage.save(filepath, playlist.toString())
|
||||
this.logger.info(JSON.stringify({ filepath, count: playlist.streams.count() }))
|
||||
}
|
||||
}
|
||||
import { Collection, Logger, Storage } from '@freearhey/core'
|
||||
import { Stream, Playlist } from '../models'
|
||||
import { Generator } from './generator'
|
||||
import { PUBLIC_DIR } from '../constants'
|
||||
|
||||
type IndexNsfwGeneratorProps = {
|
||||
streams: Collection
|
||||
logger: Logger
|
||||
}
|
||||
|
||||
export class IndexNsfwGenerator implements Generator {
|
||||
streams: Collection
|
||||
storage: Storage
|
||||
logger: Logger
|
||||
|
||||
constructor({ streams, logger }: IndexNsfwGeneratorProps) {
|
||||
this.streams = streams
|
||||
this.storage = new Storage(PUBLIC_DIR)
|
||||
this.logger = logger
|
||||
}
|
||||
|
||||
async generate(): Promise<void> {
|
||||
const allStreams = this.streams.orderBy((stream: Stream) => stream.getTitle())
|
||||
|
||||
const playlist = new Playlist(allStreams, { public: true })
|
||||
const filepath = 'index.nsfw.m3u'
|
||||
await this.storage.save(filepath, playlist.toString())
|
||||
this.logger.info(JSON.stringify({ filepath, count: playlist.streams.count() }))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,83 +1,83 @@
|
||||
import { Generator } from './generator'
|
||||
import { Collection, Storage, Logger } from '../core'
|
||||
import { Stream, Playlist, Region } from '../models'
|
||||
import { PUBLIC_DIR } from '../constants'
|
||||
|
||||
type IndexRegionGeneratorProps = {
|
||||
streams: Collection
|
||||
regions: Collection
|
||||
logger: Logger
|
||||
}
|
||||
|
||||
export class IndexRegionGenerator implements Generator {
|
||||
streams: Collection
|
||||
regions: Collection
|
||||
storage: Storage
|
||||
logger: Logger
|
||||
|
||||
constructor({ streams, regions, logger }: IndexRegionGeneratorProps) {
|
||||
this.streams = streams
|
||||
this.regions = regions
|
||||
this.storage = new Storage(PUBLIC_DIR)
|
||||
this.logger = logger
|
||||
}
|
||||
|
||||
async generate(): Promise<void> {
|
||||
let groupedStreams = new Collection()
|
||||
this.streams
|
||||
.orderBy((stream: Stream) => stream.getTitle())
|
||||
.filter((stream: Stream) => stream.isSFW())
|
||||
.forEach((stream: Stream) => {
|
||||
if (stream.noBroadcastArea()) {
|
||||
const streamClone = stream.clone()
|
||||
streamClone.groupTitle = 'Undefined'
|
||||
groupedStreams.push(streamClone)
|
||||
return
|
||||
}
|
||||
|
||||
this.getStreamRegions(stream).forEach((region: Region) => {
|
||||
const streamClone = stream.clone()
|
||||
streamClone.groupTitle = region.name
|
||||
groupedStreams.push(streamClone)
|
||||
})
|
||||
})
|
||||
|
||||
groupedStreams = groupedStreams.orderBy((stream: Stream) => {
|
||||
if (stream.groupTitle === 'Undefined') return 'ZZ'
|
||||
return stream.groupTitle
|
||||
})
|
||||
|
||||
const playlist = new Playlist(groupedStreams, { public: true })
|
||||
const filepath = 'index.region.m3u'
|
||||
await this.storage.save(filepath, playlist.toString())
|
||||
this.logger.info(JSON.stringify({ filepath, count: playlist.streams.count() }))
|
||||
}
|
||||
|
||||
getStreamRegions(stream: Stream) {
|
||||
let streamRegions = new Collection()
|
||||
stream.broadcastArea.forEach(broadcastAreaCode => {
|
||||
const [type, code] = broadcastAreaCode.split('/')
|
||||
switch (type) {
|
||||
case 'r':
|
||||
const groupedRegions = this.regions.keyBy((region: Region) => region.code)
|
||||
streamRegions.add(groupedRegions.get(code))
|
||||
break
|
||||
case 's':
|
||||
const [countryCode] = code.split('-')
|
||||
const subdivisionRegions = this.regions.filter((region: Region) =>
|
||||
region.countries.includes(countryCode)
|
||||
)
|
||||
streamRegions = streamRegions.concat(subdivisionRegions)
|
||||
break
|
||||
case 'c':
|
||||
const countryRegions = this.regions.filter((region: Region) =>
|
||||
region.countries.includes(code)
|
||||
)
|
||||
streamRegions = streamRegions.concat(countryRegions)
|
||||
break
|
||||
}
|
||||
})
|
||||
|
||||
return streamRegions
|
||||
}
|
||||
}
|
||||
import { Generator } from './generator'
|
||||
import { Collection, Storage, Logger } from '@freearhey/core'
|
||||
import { Stream, Playlist, Region } from '../models'
|
||||
import { PUBLIC_DIR } from '../constants'
|
||||
|
||||
type IndexRegionGeneratorProps = {
|
||||
streams: Collection
|
||||
regions: Collection
|
||||
logger: Logger
|
||||
}
|
||||
|
||||
export class IndexRegionGenerator implements Generator {
|
||||
streams: Collection
|
||||
regions: Collection
|
||||
storage: Storage
|
||||
logger: Logger
|
||||
|
||||
constructor({ streams, regions, logger }: IndexRegionGeneratorProps) {
|
||||
this.streams = streams
|
||||
this.regions = regions
|
||||
this.storage = new Storage(PUBLIC_DIR)
|
||||
this.logger = logger
|
||||
}
|
||||
|
||||
async generate(): Promise<void> {
|
||||
let groupedStreams = new Collection()
|
||||
this.streams
|
||||
.orderBy((stream: Stream) => stream.getTitle())
|
||||
.filter((stream: Stream) => stream.isSFW())
|
||||
.forEach((stream: Stream) => {
|
||||
if (stream.noBroadcastArea()) {
|
||||
const streamClone = stream.clone()
|
||||
streamClone.groupTitle = 'Undefined'
|
||||
groupedStreams.push(streamClone)
|
||||
return
|
||||
}
|
||||
|
||||
this.getStreamRegions(stream).forEach((region: Region) => {
|
||||
const streamClone = stream.clone()
|
||||
streamClone.groupTitle = region.name
|
||||
groupedStreams.push(streamClone)
|
||||
})
|
||||
})
|
||||
|
||||
groupedStreams = groupedStreams.orderBy((stream: Stream) => {
|
||||
if (stream.groupTitle === 'Undefined') return 'ZZ'
|
||||
return stream.groupTitle
|
||||
})
|
||||
|
||||
const playlist = new Playlist(groupedStreams, { public: true })
|
||||
const filepath = 'index.region.m3u'
|
||||
await this.storage.save(filepath, playlist.toString())
|
||||
this.logger.info(JSON.stringify({ filepath, count: playlist.streams.count() }))
|
||||
}
|
||||
|
||||
getStreamRegions(stream: Stream) {
|
||||
let streamRegions = new Collection()
|
||||
stream.broadcastArea.forEach(broadcastAreaCode => {
|
||||
const [type, code] = broadcastAreaCode.split('/')
|
||||
switch (type) {
|
||||
case 'r':
|
||||
const groupedRegions = this.regions.keyBy((region: Region) => region.code)
|
||||
streamRegions.add(groupedRegions.get(code))
|
||||
break
|
||||
case 's':
|
||||
const [countryCode] = code.split('-')
|
||||
const subdivisionRegions = this.regions.filter((region: Region) =>
|
||||
region.countries.includes(countryCode)
|
||||
)
|
||||
streamRegions = streamRegions.concat(subdivisionRegions)
|
||||
break
|
||||
case 'c':
|
||||
const countryRegions = this.regions.filter((region: Region) =>
|
||||
region.countries.includes(code)
|
||||
)
|
||||
streamRegions = streamRegions.concat(countryRegions)
|
||||
break
|
||||
}
|
||||
})
|
||||
|
||||
return streamRegions
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,50 +1,52 @@
|
||||
import { Generator } from './generator'
|
||||
import { Collection, Storage, Logger } from '../core'
|
||||
import { Playlist, Language, Stream } from '../models'
|
||||
import { PUBLIC_DIR } from '../constants'
|
||||
|
||||
type LanguagesGeneratorProps = { streams: Collection; logger: Logger }
|
||||
|
||||
export class LanguagesGenerator implements Generator {
|
||||
streams: Collection
|
||||
storage: Storage
|
||||
logger: Logger
|
||||
|
||||
constructor({ streams, logger }: LanguagesGeneratorProps) {
|
||||
this.streams = streams
|
||||
this.storage = new Storage(PUBLIC_DIR)
|
||||
this.logger = logger
|
||||
}
|
||||
|
||||
async generate(): Promise<void> {
|
||||
let streams = this.streams.orderBy(stream => stream.getTitle()).filter(stream => stream.isSFW())
|
||||
|
||||
let languages = new Collection()
|
||||
streams.forEach((stream: Stream) => {
|
||||
languages = languages.concat(stream.languages)
|
||||
})
|
||||
|
||||
languages
|
||||
.uniqBy((language: Language) => language.code)
|
||||
.orderBy((language: Language) => language.name)
|
||||
.forEach(async (language: Language) => {
|
||||
const languageStreams = streams.filter(stream => stream.hasLanguage(language))
|
||||
|
||||
if (languageStreams.isEmpty()) return
|
||||
|
||||
const playlist = new Playlist(languageStreams, { public: true })
|
||||
const filepath = `languages/${language.code}.m3u`
|
||||
await this.storage.save(filepath, playlist.toString())
|
||||
this.logger.info(JSON.stringify({ filepath, count: playlist.streams.count() }))
|
||||
})
|
||||
|
||||
const undefinedStreams = streams.filter(stream => stream.noLanguages())
|
||||
|
||||
if (undefinedStreams.isEmpty()) return
|
||||
|
||||
const playlist = new Playlist(undefinedStreams, { public: true })
|
||||
const filepath = 'languages/undefined.m3u'
|
||||
await this.storage.save(filepath, playlist.toString())
|
||||
this.logger.info(JSON.stringify({ filepath, count: playlist.streams.count() }))
|
||||
}
|
||||
}
|
||||
import { Generator } from './generator'
|
||||
import { Collection, Storage, Logger } from '@freearhey/core'
|
||||
import { Playlist, Language, Stream } from '../models'
|
||||
import { PUBLIC_DIR } from '../constants'
|
||||
|
||||
type LanguagesGeneratorProps = { streams: Collection; logger: Logger }
|
||||
|
||||
export class LanguagesGenerator implements Generator {
|
||||
streams: Collection
|
||||
storage: Storage
|
||||
logger: Logger
|
||||
|
||||
constructor({ streams, logger }: LanguagesGeneratorProps) {
|
||||
this.streams = streams
|
||||
this.storage = new Storage(PUBLIC_DIR)
|
||||
this.logger = logger
|
||||
}
|
||||
|
||||
async generate(): Promise<void> {
|
||||
const streams = this.streams
|
||||
.orderBy(stream => stream.getTitle())
|
||||
.filter(stream => stream.isSFW())
|
||||
|
||||
let languages = new Collection()
|
||||
streams.forEach((stream: Stream) => {
|
||||
languages = languages.concat(stream.languages)
|
||||
})
|
||||
|
||||
languages
|
||||
.uniqBy((language: Language) => language.code)
|
||||
.orderBy((language: Language) => language.name)
|
||||
.forEach(async (language: Language) => {
|
||||
const languageStreams = streams.filter(stream => stream.hasLanguage(language))
|
||||
|
||||
if (languageStreams.isEmpty()) return
|
||||
|
||||
const playlist = new Playlist(languageStreams, { public: true })
|
||||
const filepath = `languages/${language.code}.m3u`
|
||||
await this.storage.save(filepath, playlist.toString())
|
||||
this.logger.info(JSON.stringify({ filepath, count: playlist.streams.count() }))
|
||||
})
|
||||
|
||||
const undefinedStreams = streams.filter(stream => stream.noLanguages())
|
||||
|
||||
if (undefinedStreams.isEmpty()) return
|
||||
|
||||
const playlist = new Playlist(undefinedStreams, { public: true })
|
||||
const filepath = 'languages/undefined.m3u'
|
||||
await this.storage.save(filepath, playlist.toString())
|
||||
this.logger.info(JSON.stringify({ filepath, count: playlist.streams.count() }))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,51 +1,53 @@
|
||||
import { Generator } from './generator'
|
||||
import { Collection, Storage, Logger } from '../core'
|
||||
import { Playlist, Subdivision, Region } from '../models'
|
||||
import { PUBLIC_DIR } from '../constants'
|
||||
|
||||
type RegionsGeneratorProps = {
|
||||
streams: Collection
|
||||
regions: Collection
|
||||
subdivisions: Collection
|
||||
logger: Logger
|
||||
}
|
||||
|
||||
export class RegionsGenerator implements Generator {
|
||||
streams: Collection
|
||||
regions: Collection
|
||||
subdivisions: Collection
|
||||
storage: Storage
|
||||
logger: Logger
|
||||
|
||||
constructor({ streams, regions, subdivisions, logger }: RegionsGeneratorProps) {
|
||||
this.streams = streams
|
||||
this.regions = regions
|
||||
this.subdivisions = subdivisions
|
||||
this.storage = new Storage(PUBLIC_DIR)
|
||||
this.logger = logger
|
||||
}
|
||||
|
||||
async generate(): Promise<void> {
|
||||
let streams = this.streams.orderBy(stream => stream.getTitle()).filter(stream => stream.isSFW())
|
||||
|
||||
this.regions.forEach(async (region: Region) => {
|
||||
if (region.code === 'INT') return
|
||||
|
||||
const regionSubdivisionsCodes = this.subdivisions
|
||||
.filter((subdivision: Subdivision) => region.countries.indexOf(subdivision.country) > -1)
|
||||
.map((subdivision: Subdivision) => `s/${subdivision.code}`)
|
||||
|
||||
const regionCodes = region.countries
|
||||
.map((code: string) => `c/${code}`)
|
||||
.concat(regionSubdivisionsCodes)
|
||||
.add(`r/${region.code}`)
|
||||
|
||||
const regionStreams = streams.filter(stream => stream.broadcastArea.intersects(regionCodes))
|
||||
|
||||
const playlist = new Playlist(regionStreams, { public: true })
|
||||
const filepath = `regions/${region.code.toLowerCase()}.m3u`
|
||||
await this.storage.save(filepath, playlist.toString())
|
||||
this.logger.info(JSON.stringify({ filepath, count: playlist.streams.count() }))
|
||||
})
|
||||
}
|
||||
}
|
||||
import { Generator } from './generator'
|
||||
import { Collection, Storage, Logger } from '@freearhey/core'
|
||||
import { Playlist, Subdivision, Region } from '../models'
|
||||
import { PUBLIC_DIR } from '../constants'
|
||||
|
||||
type RegionsGeneratorProps = {
|
||||
streams: Collection
|
||||
regions: Collection
|
||||
subdivisions: Collection
|
||||
logger: Logger
|
||||
}
|
||||
|
||||
export class RegionsGenerator implements Generator {
|
||||
streams: Collection
|
||||
regions: Collection
|
||||
subdivisions: Collection
|
||||
storage: Storage
|
||||
logger: Logger
|
||||
|
||||
constructor({ streams, regions, subdivisions, logger }: RegionsGeneratorProps) {
|
||||
this.streams = streams
|
||||
this.regions = regions
|
||||
this.subdivisions = subdivisions
|
||||
this.storage = new Storage(PUBLIC_DIR)
|
||||
this.logger = logger
|
||||
}
|
||||
|
||||
async generate(): Promise<void> {
|
||||
const streams = this.streams
|
||||
.orderBy(stream => stream.getTitle())
|
||||
.filter(stream => stream.isSFW())
|
||||
|
||||
this.regions.forEach(async (region: Region) => {
|
||||
if (region.code === 'INT') return
|
||||
|
||||
const regionSubdivisionsCodes = this.subdivisions
|
||||
.filter((subdivision: Subdivision) => region.countries.indexOf(subdivision.country) > -1)
|
||||
.map((subdivision: Subdivision) => `s/${subdivision.code}`)
|
||||
|
||||
const regionCodes = region.countries
|
||||
.map((code: string) => `c/${code}`)
|
||||
.concat(regionSubdivisionsCodes)
|
||||
.add(`r/${region.code}`)
|
||||
|
||||
const regionStreams = streams.filter(stream => stream.broadcastArea.intersects(regionCodes))
|
||||
|
||||
const playlist = new Playlist(regionStreams, { public: true })
|
||||
const filepath = `regions/${region.code.toLowerCase()}.m3u`
|
||||
await this.storage.save(filepath, playlist.toString())
|
||||
this.logger.info(JSON.stringify({ filepath, count: playlist.streams.count() }))
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { Collection } from '../core'
|
||||
import { Collection } from '@freearhey/core'
|
||||
|
||||
type ChannelProps = {
|
||||
id: string
|
||||
|
||||
@@ -1,16 +1,19 @@
|
||||
import { Dictionary } from '../core'
|
||||
import { Dictionary } from '@freearhey/core'
|
||||
|
||||
type IssueProps = {
|
||||
number: number
|
||||
labels: string[]
|
||||
data: Dictionary
|
||||
}
|
||||
|
||||
export class Issue {
|
||||
number: number
|
||||
labels: string[]
|
||||
data: Dictionary
|
||||
|
||||
constructor({ number, data }: IssueProps) {
|
||||
constructor({ number, labels, data }: IssueProps) {
|
||||
this.number = number
|
||||
this.labels = labels
|
||||
this.data = data
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { Collection } from '../core'
|
||||
import { Collection } from '@freearhey/core'
|
||||
import { Stream } from '../models'
|
||||
|
||||
type PlaylistOptions = {
|
||||
@@ -17,10 +17,10 @@ export class Playlist {
|
||||
}
|
||||
|
||||
toString() {
|
||||
let output = `#EXTM3U\n`
|
||||
let output = '#EXTM3U\n'
|
||||
|
||||
this.streams.forEach((stream: Stream) => {
|
||||
output += stream.toString(this.options) + `\n`
|
||||
output += stream.toString(this.options) + '\n'
|
||||
})
|
||||
|
||||
return output
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { Collection } from '../core'
|
||||
import { Collection } from '@freearhey/core'
|
||||
|
||||
type RegionProps = {
|
||||
code: string
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { URL, Collection } from '../core'
|
||||
import { URL, Collection } from '@freearhey/core'
|
||||
import { Category, Language } from './index'
|
||||
|
||||
type StreamProps = {
|
||||
@@ -86,7 +86,7 @@ export class Stream {
|
||||
}
|
||||
|
||||
noCategories(): boolean {
|
||||
return this.categories.empty()
|
||||
return this.categories.isEmpty()
|
||||
}
|
||||
|
||||
hasCategory(category: Category): boolean {
|
||||
@@ -94,7 +94,7 @@ export class Stream {
|
||||
}
|
||||
|
||||
noLanguages(): boolean {
|
||||
return this.languages.empty()
|
||||
return this.languages.isEmpty()
|
||||
}
|
||||
|
||||
hasLanguage(language: Language): boolean {
|
||||
@@ -102,7 +102,7 @@ export class Stream {
|
||||
}
|
||||
|
||||
noBroadcastArea(): boolean {
|
||||
return this.broadcastArea.empty()
|
||||
return this.broadcastArea.isEmpty()
|
||||
}
|
||||
|
||||
isInternational(): boolean {
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import { Storage, HTMLTable, Collection, LogParser, LogItem, File } from '../core'
|
||||
import { Storage, Collection, File } from '@freearhey/core'
|
||||
import { HTMLTable, LogParser, LogItem } from '../core'
|
||||
import { Category } from '../models'
|
||||
import { DATA_DIR, LOGS_DIR, README_DIR } from '../constants'
|
||||
import { Table } from './table'
|
||||
@@ -13,7 +14,7 @@ export class CategoryTable implements Table {
|
||||
|
||||
const parser = new LogParser()
|
||||
const logsStorage = new Storage(LOGS_DIR)
|
||||
const generatorsLog = await logsStorage.read('generators.log')
|
||||
const generatorsLog = await logsStorage.load('generators.log')
|
||||
|
||||
let data = new Collection()
|
||||
parser
|
||||
@@ -21,7 +22,7 @@ export class CategoryTable implements Table {
|
||||
.filter((logItem: LogItem) => logItem.filepath.includes('categories/'))
|
||||
.forEach((logItem: LogItem) => {
|
||||
const file = new File(logItem.filepath)
|
||||
const categoryId = file.getFilename()
|
||||
const categoryId = file.name()
|
||||
const category: Category = categories.first(
|
||||
(category: Category) => category.id === categoryId
|
||||
)
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import { Storage, HTMLTable, Collection, LogParser, LogItem, File } from '../core'
|
||||
import { Storage, Collection, File } from '@freearhey/core'
|
||||
import { HTMLTable, LogParser, LogItem } from '../core'
|
||||
import { Country, Subdivision } from '../models'
|
||||
import { DATA_DIR, LOGS_DIR, README_DIR } from '../constants'
|
||||
import { Table } from './table'
|
||||
@@ -17,7 +18,7 @@ export class CountryTable implements Table {
|
||||
|
||||
const parser = new LogParser()
|
||||
const logsStorage = new Storage(LOGS_DIR)
|
||||
const generatorsLog = await logsStorage.read('generators.log')
|
||||
const generatorsLog = await logsStorage.load('generators.log')
|
||||
|
||||
let data = new Collection()
|
||||
parser
|
||||
@@ -28,7 +29,7 @@ export class CountryTable implements Table {
|
||||
)
|
||||
.forEach((logItem: LogItem) => {
|
||||
const file = new File(logItem.filepath)
|
||||
const code = file.getFilename().toUpperCase()
|
||||
const code = file.name().toUpperCase()
|
||||
const [countryCode, subdivisionCode] = code.split('-') || ['', '']
|
||||
|
||||
if (subdivisionCode) {
|
||||
@@ -47,7 +48,7 @@ export class CountryTable implements Table {
|
||||
} else if (countryCode === 'INT') {
|
||||
data.add([
|
||||
'ZZ',
|
||||
`🌍 International`,
|
||||
'🌍 International',
|
||||
logItem.count,
|
||||
`<code>https://iptv-org.github.io/iptv/${logItem.filepath}</code>`
|
||||
])
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import { Storage, HTMLTable, Collection, LogParser, LogItem, File } from '../core'
|
||||
import { Storage, Collection, File } from '@freearhey/core'
|
||||
import { HTMLTable, LogParser, LogItem } from '../core'
|
||||
import { Language } from '../models'
|
||||
import { DATA_DIR, LOGS_DIR, README_DIR } from '../constants'
|
||||
import { Table } from './table'
|
||||
@@ -13,7 +14,7 @@ export class LanguageTable implements Table {
|
||||
|
||||
const parser = new LogParser()
|
||||
const logsStorage = new Storage(LOGS_DIR)
|
||||
const generatorsLog = await logsStorage.read('generators.log')
|
||||
const generatorsLog = await logsStorage.load('generators.log')
|
||||
|
||||
let data = new Collection()
|
||||
parser
|
||||
@@ -21,7 +22,7 @@ export class LanguageTable implements Table {
|
||||
.filter((logItem: LogItem) => logItem.filepath.includes('languages/'))
|
||||
.forEach((logItem: LogItem) => {
|
||||
const file = new File(logItem.filepath)
|
||||
const languageCode = file.getFilename()
|
||||
const languageCode = file.name()
|
||||
const language: Language = languages.first(
|
||||
(language: Language) => language.code === languageCode
|
||||
)
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import { Storage, HTMLTable, Collection, LogParser, LogItem, File } from '../core'
|
||||
import { Storage, Collection, File } from '@freearhey/core'
|
||||
import { HTMLTable, LogParser, LogItem } from '../core'
|
||||
import { Region } from '../models'
|
||||
import { DATA_DIR, LOGS_DIR, README_DIR } from '../constants'
|
||||
import { Table } from './table'
|
||||
@@ -13,7 +14,7 @@ export class RegionTable implements Table {
|
||||
|
||||
const parser = new LogParser()
|
||||
const logsStorage = new Storage(LOGS_DIR)
|
||||
const generatorsLog = await logsStorage.read('generators.log')
|
||||
const generatorsLog = await logsStorage.load('generators.log')
|
||||
|
||||
let data = new Collection()
|
||||
parser
|
||||
@@ -21,7 +22,7 @@ export class RegionTable implements Table {
|
||||
.filter((logItem: LogItem) => logItem.filepath.includes('regions/'))
|
||||
.forEach((logItem: LogItem) => {
|
||||
const file = new File(logItem.filepath)
|
||||
const regionCode = file.getFilename().toUpperCase()
|
||||
const regionCode = file.name().toUpperCase()
|
||||
const region: Region = regions.first((region: Region) => region.code === regionCode)
|
||||
|
||||
if (region) {
|
||||
|
||||
@@ -11,8 +11,6 @@ https://admdn5.cdn.mangomolo.com/adsports2/smil:adsports2.stream.smil/playlist.m
|
||||
https://dacastmmd.mmdlive.lldns.net/dacastmmd/d3e9fc3b874a46159ce3724d802e3f8d/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="AlAanTV.ae",Al Aan TV (1080p)
|
||||
https://shls-live-ak.akamaized.net/out/v1/dfbdea4c1bf149629764e58c6ff314c8/index.m3u8
|
||||
#EXTINF:-1 tvg-id="AlAanTV.ae",Al Aan TV (720p)
|
||||
http://mc-qs.lanesh4d0w.tech/iptv-query?streaming-ip=https://www.dailymotion.com/AlAanTV
|
||||
#EXTINF:-1 tvg-id="Alarabiya.ae",Al Arabiya (1080p)
|
||||
https://live.alarabiya.net/alarabiapublish/alarabiya.smil/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="Alarabiya.ae",Al Arabiya (1080p)
|
||||
@@ -52,8 +50,6 @@ https://shls-cartoon-net-prod-dub.shahid.net/out/v1/dc4aa87372374325a66be458f29e
|
||||
#EXTINF:-1 tvg-id="CitrussTV.ae",Citruss TV (720p) [Geo-blocked]
|
||||
https://d7km4gkevcbok.cloudfront.net/live/watch_720p30.m3u8
|
||||
#EXTINF:-1 tvg-id="CNBCArabiya.ae",CNBC Arabia (1080p)
|
||||
http://mc-qs.lanesh4d0w.tech/iptv-query?streaming-ip=https://www.dailymotion.com/CNBCArabia
|
||||
#EXTINF:-1 tvg-id="CNBCArabiya.ae",CNBC Arabia (1080p)
|
||||
https://ythls.onrender.com/channel/UCsHdPPJXT-yKVTLGkn3DSvQ.m3u8
|
||||
#EXTINF:-1 tvg-id="DubaiOne.ae",Dubai One (1080p)
|
||||
https://dminnvll.cdn.mangomolo.com/dubaione/smil:dubaione.stream.smil/playlist.m3u8
|
||||
@@ -159,7 +155,7 @@ https://weyyak-live.akamaized.net/weyyak_drama/index.m3u8
|
||||
https://weyyak-live.akamaized.net/weyyak_mix/index.m3u8
|
||||
#EXTINF:-1 tvg-id="WeyyakNawaem.ae",Weyyak Nawaem (720p)
|
||||
https://weyyak-live.akamaized.net/weyyak_nawaem/index.m3u8
|
||||
#EXTINF:-1 tvg-id="",Yas (1080p)
|
||||
#EXTINF:-1 tvg-id="YasTV.ae",Yas TV (1080p)
|
||||
https://admdn1.cdn.mangomolo.com/yastv/smil:yastv.stream.smil/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="ZeeAflam.in",Zee Aflam (720p) [Not 24/7]
|
||||
https://weyyak-live.akamaized.net/weyyak_zee_aflam/index.m3u8
|
||||
|
||||
@@ -9,9 +9,9 @@ https://stream.openplayout.org/hls/dorftv/live.m3u8
|
||||
http://stream.fs1.tv:8080/hls/webstream.m3u8
|
||||
#EXTINF:-1 tvg-id="FS1Salzburg.at",FS1 Salzburg (720p) [Not 24/7]
|
||||
https://stream.fs1.tv/hls/webstream.m3u8
|
||||
#EXTINF:-1 tvg-id="FUELTV.at",Fuel TV (1080p)
|
||||
#EXTINF:-1 tvg-id="FUELTV.at",FUEL TV (1080p)
|
||||
https://d35j504z0x2vu2.cloudfront.net/v1/manifest/0bc8e8376bd8417a1b6761138aa41c26c7309312/fuel-tv/606c2f67-acff-4152-975a-e5bfef54eb61/2.m3u8
|
||||
#EXTINF:-1 tvg-id="GoTV.at",GoTV (576p)
|
||||
#EXTINF:-1 tvg-id="GoTV.at",GoTV (576p) [Not 24/7]
|
||||
https://nstream17.gotv.at:1443/live/gotvlive/manifest.mpd
|
||||
#EXTINF:-1 tvg-id="HitradioO3.at",Hitradio Ö3 (720p) [Not 24/7]
|
||||
https://studiocam-oe3.mdn.ors.at/out/u/studiocam_oe3/q6a/manifest_1.m3u8
|
||||
@@ -23,12 +23,10 @@ https://kronetv.mdn.ors.at/out/u/kronetv-nodrm.m3u8
|
||||
https://bitcdn-kronehit.bitmovin.com/v2/hls/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="KurierTV.at",Kurier TV (720p)
|
||||
https://schautv.mdn.ors.at/out/u/schautv-nodrm.m3u8
|
||||
#EXTINF:-1 tvg-id="LandleTV.at",Ländle Tv (1080p)
|
||||
#EXTINF:-1 tvg-id="LandleTV.at",Ländle TV (1080p) [Not 24/7]
|
||||
https://streaming13.huberwebmedia.at/LiveApp/streams/985585225397790082777809.m3u8
|
||||
#EXTINF:-1 tvg-id="M4.at",M4 (1090p) [Not 24/7]
|
||||
https://5a32c05065c79.streamlock.net/live/stream/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="M4TV.at",M4TV [Geo-blocked]
|
||||
https://streaming.m4tv.at/live/m4tv.stream/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="M4.at",GemeindeTV (1080p) [Not 24/7]
|
||||
https://ythls.onrender.com/channel/UCbGaZEFvBLMe8eNgoBFDRZg.m3u8
|
||||
#EXTINF:-1 tvg-id="Oe24TV.at",oe24 TV (1080p)
|
||||
https://varoe24live.sf.apa.at/oe24-live1/oe24.smil/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="OktoTV.at",Okto TV (1080p)
|
||||
@@ -47,11 +45,11 @@ http://p3-6.mov.at:1935/live/weekstream/master.m3u8
|
||||
https://ms01.w24.at/R9/smil:liveeventR9.smil/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="RedBullTV.at",Red Bull TV (1080p)
|
||||
https://rbmn-live.akamaized.net/hls/live/590964/BoRB-AT/master.m3u8
|
||||
#EXTINF:-1 tvg-id="RTV.at",RTV (1080p)
|
||||
#EXTINF:-1 tvg-id="RTV.at",RTV (1080p) [Not 24/7]
|
||||
http://iptv.rtv-ooe.at/stream.m3u8
|
||||
#EXTINF:-1 tvg-id="SchladmingDachsteinTV.at",Schladming-Dachstein TV (720p)
|
||||
https://m317.video-stream-hosting.de/gzSoftware-live/_definst_/smil:livestream.smil/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="ServusTV.at",ServusTV [Geo-blocked]
|
||||
#EXTINF:-1 tvg-id="ServusTV.at",ServusTV (1080p) [Geo-blocked]
|
||||
https://stv-live.akamaized.net/hls/live/2031011/lingeoSTVATwebPri/master.m3u8
|
||||
#EXTINF:-1 tvg-id="SwamijiTV.at",Swamiji TV (720p) [Not 24/7]
|
||||
https://stream.swamiji.tv/YogaIPTV/smil:YogaStream.smil/playlist.m3u8
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
#EXTM3U
|
||||
#EXTINF:-1 tvg-id="ABCNewsAustralia.au",ABC News (720p)
|
||||
#EXTINF:-1 tvg-id="ABCNewsAustralia.au",ABC News Australia (720p)
|
||||
https://abc-iview-mediapackagestreams-2.akamaized.net/out/v1/6e1cc6d25ec0480ea099a5399d73bc4b/index.m3u8
|
||||
#EXTINF:-1 tvg-id="AUSTamilTV.au",Aus Tamil (720p) [Not 24/7]
|
||||
#EXTINF:-1 tvg-id="ABCNewsAustralia.au",ABC News Australia (720p) [Not 24/7]
|
||||
https://ythls.onrender.com/channel/UCVgO39Bk5sMo66-6o6Spn6Q.m3u8
|
||||
#EXTINF:-1 tvg-id="AUSTamilTV.au",AUS Tamil TV (720p) [Not 24/7]
|
||||
https://bk7l2pn7dx53-hls-live.5centscdn.com/austamil/fe01ce2a7fbac8fafaed7c982a04e229.sdp/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="AusbizTV.au",ausbiz TV (720p) [Geo-blocked]
|
||||
#EXTINF:-1 tvg-id="AusbizTV.au",ausbiz TV (720p) [Not 24/7]
|
||||
https://d9quh89lh7dtw.cloudfront.net/public-output/index.m3u8
|
||||
#EXTINF:-1 tvg-id="C31Melbourne.au",C31 Melbourne (240p)
|
||||
https://d1k6kax80wecy5.cloudfront.net/RLnAKY/index.m3u8
|
||||
@@ -12,17 +14,13 @@ https://d1k6kax80wecy5.cloudfront.net/WFqZJc/index.m3u8
|
||||
#EXTINF:-1 tvg-id="ExpoChannel.au",Expo Channel (360p)
|
||||
https://tvsnhlslivetest.akamaized.net/hls/live/2034711/EXPO-MSL4/master.m3u8
|
||||
#EXTINF:-1 tvg-id="JonmoBhumiTV.au",JonmoBhumi TV (720p) [Not 24/7]
|
||||
https://cdn.appv.jagobd.com:444/c3VydmVyX8RpbEU9Mi8xNy8yMDE0GIDU6RgzQ6NTAgdEoaeFzbF92YWxIZTO0U0ezN1IzMyfvcGVMZEJCTEFWeVN3PTOmdFsaWRtaW51aiPhnPTI/jonmobhumitv.stream/playlist.m3u8
|
||||
https://us170.jagobd.com:447/c3VydmVyX8RpbEU9Mi8xNy8yMDE0GIDU6RgzQ6NTAgdEoaeFzbF92YWxIZTO0U0ezN1IzMyfvcGVMZEJCTEFWeVN3PTOmdFsaWRtaW51aiPhnPTI/jonmobhumitv.stream/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="M4TVMalayalam.au",M4TV Malayalam (1080p) [Not 24/7]
|
||||
https://app.m4stream.live/mfourmalayalamhls/live.m3u8
|
||||
#EXTINF:-1 tvg-id="",Race Central TV (720p)
|
||||
#EXTINF:-1 tvg-id="",Race Central TV (720p) [Not 24/7]
|
||||
https://nrpus.bozztv.com/36bay2/gusa-racecentral/index.m3u8
|
||||
#EXTINF:-1 tvg-id="Racingcom.au",Racing.com (720p)
|
||||
https://racingvic-i.akamaized.net/hls/live/598695/racingvic/index1500.m3u8
|
||||
#EXTINF:-1 tvg-id="RTV.au",Rainbow TV Australia (720p)
|
||||
http://www.rtvcdn.com.au:8082/TV0002.m3u8
|
||||
#EXTINF:-1 tvg-id="SBSViceland.au",SBS Viceland [Geo-blocked]
|
||||
https://dai.google.com/linear/hls/event/nPy2IRtvQTWudFfYwdBgsg/master.m3u8
|
||||
#EXTINF:-1 tvg-id="SkyNewsExtra1.au",Sky News Extra 1 (540p)
|
||||
https://skynewsau-live.akamaized.net/hls/live/2002689/skynewsau-extra1/master.m3u8
|
||||
#EXTINF:-1 tvg-id="SkyNewsExtra2.au",Sky News Extra 2 (540p) [Not 24/7]
|
||||
@@ -37,3 +35,35 @@ https://cdn-uw2-prod.tsv2.amagi.tv/linear/amg01486-tickernews-tickernewsweb-ono/
|
||||
https://nrpus.bozztv.com/36bay2/gusa-moviemagictv/index.m3u8
|
||||
#EXTINF:-1 tvg-id="TVSN.au",TVSN (1080p)
|
||||
https://tvsnhlslivetest.akamaized.net/hls/live/2034711/TVSN-MSL4/master.m3u8
|
||||
#EXTINF:-1 tvg-id="TVSN.au",TVSN (1080p) [Not 24/7]
|
||||
https://ythls.onrender.com/channel/UCo4sch-fwKIeyzyPIWRXjdw.m3u8
|
||||
#EXTINF:-1 tvg-id="9Gem.au",9Gem (720p) [Geo-blocked]
|
||||
https://9now-livestreams.akamaized.net/hls/live/2007330/ch9-syd/master.m3u8
|
||||
#EXTINF:-1 tvg-id="9Go.au",9Go! (720p) [Geo-blocked]
|
||||
https://9now-livestreams.akamaized.net/hls/live/2008312/go-syd/master.m3u8
|
||||
#EXTINF:-1 tvg-id="9Life.au",9Life (720p) [Geo-blocked]
|
||||
https://9now-livestreams.akamaized.net/hls/live/2008313/life-syd/master.m3u8
|
||||
#EXTINF:-1 tvg-id="ADHTV.au",ADH TV (1080p) [Not 24/7]
|
||||
https://ythls.onrender.com/channel/UCtzTaKI8AkiSjyzm1_JbMUg.m3u8
|
||||
#EXTINF:-1 tvg-id="GuidanceTVAustralia.au",Guidance TV Australia (720p) [Not 24/7]
|
||||
https://ythls.onrender.com/channel/UC81VkX0QeICZw7o2jMwGThg.m3u8
|
||||
#EXTINF:-1 tvg-id="2GB.au",2GB Sydney (1080p)
|
||||
https://2gblive.akamaized.net/hls/live/2033805/2GB/index.m3u8
|
||||
#EXTINF:-1 tvg-id="HopeChannelAustralia.au",Hope Channel Australia (1080p)
|
||||
https://videodelivery.net/9fb3596948ddf463fde0ec4b85625b24/manifest/video.m3u8
|
||||
#EXTINF:-1 tvg-id="9Rush.au",9Rush (720p) [Geo-blocked]
|
||||
https://9now-livestreams.akamaized.net/hls/live/2010626/rush-syd/master.m3u8
|
||||
#EXTINF:-1 tvg-id="Channel9.au",Channel 9 (720p) [Geo-blocked]
|
||||
https://9now-livestreams.akamaized.net/hls/live/2008322/ch9-mel/master.m3u8
|
||||
#EXTINF:-1 tvg-id="Channel7.au",Channel 7 [Geo-blocked]
|
||||
https://npc.cdn.7livecloud.io/hls/live/SYD1/master.m3u8
|
||||
#EXTINF:-1 tvg-id="7two.au",7two [Geo-blocked]
|
||||
https://npc.cdn.7livecloud.io/hls/live/MEL2/master.m3u8
|
||||
#EXTINF:-1 tvg-id="7mate.au",7mate [Geo-blocked]
|
||||
https://npc.cdn.7livecloud.io/hls/live/MEL3/master.m3u8
|
||||
#EXTINF:-1 tvg-id="7flix.au",7flix [Geo-blocked]
|
||||
https://npc.cdn.7livecloud.io/hls/live/MEL6/master.m3u8
|
||||
#EXTINF:-1 tvg-id="SkyRacing1.au",Sky Racing 1 [Geo-blocked]
|
||||
https://skylivetab-new.akamaized.net/hls/live/2038780/sky1/index.m3u8
|
||||
#EXTINF:-1 tvg-id="SkyRacing2.au",Sky Racing 2 [Geo-blocked]
|
||||
https://skylivetab-new.akamaized.net/hls/live/2038781/sky2/index.m3u8
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
#EXTM3U
|
||||
#EXTINF:-1 tvg-id="RTB.bf",RTB (360p) [Not 24/7]
|
||||
https://edge.vedge.infomaniak.com/livecast/ik:rtbtvlive1/manifest.m3u8
|
||||
#EXTINF:-1 tvg-id="TVAlHouda.bf",TV Al Houda (360p) [Not 24/7]
|
||||
#EXTINF:-1 tvg-id="TVAlHouda.bf",TV Al Houda (720p) [Not 24/7]
|
||||
https://ssh101.bozztv.com/ssh101/alhoudatv/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="ImpactTV.bf",Impact TV (360p) [Not 24/7]
|
||||
https://edge20.vedge.infomaniak.com/livecast/ik:fluxtvimpact/manifest.m3u8
|
||||
|
||||
@@ -111,8 +111,6 @@ https://v2.tustreaming.cl/clicktv/playlist.m3u8
|
||||
https://mediacpstreamchile.com:1936/clubtv/clubtv/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="ConcepcionTV.cl",Concepción TV (1080p)
|
||||
http://live.mundogo.cl/mundo/concepciontv/index.m3u8
|
||||
#EXTINF:-1 tvg-id="Contivision.cl",Contivision (720p)
|
||||
https://unlimited2-cl-isp.dps.live/cm/cm.smil/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="CosmosTV.cl",Cosmos TV (720p)
|
||||
https://v1.tustreaming.cl/cosmostv/index.m3u8
|
||||
#EXTINF:-1 tvg-id="CRTV.cl",CRTV (720p)
|
||||
@@ -135,13 +133,13 @@ http://live.mundogo.cl/mundo/EquizTV/index.m3u8
|
||||
https://github.com/MachineSystems/archived_m3u8/raw/main/elpinguino_cl.m3u8
|
||||
#EXTINF:-1 tvg-id="ElTipografo.cl",El Tipógrafo (1080p)
|
||||
http://live.mundogo.cl/mundo/Tipografo/index.m3u8
|
||||
#EXTINF:-1 tvg-id="",EnerGeek Fanpop (720p) [Not 24/7]
|
||||
#EXTINF:-1 tvg-id="FanpopTV.cl",Fanpop TV (720p) [Not 24/7]
|
||||
https://wifispeed.trapemn.tv:1936/infantil/energeek-2/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="EnerGeekRadio.cl",EnerGeek Radio (936p)
|
||||
https://wifiexpert-1.energeek.cl/energeek/radio/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="",EnerGeek Retro (720p) [Not 24/7]
|
||||
https://stream.wifispeed.cl:3103/live/energeek1live.m3u8
|
||||
#EXTINF:-1 tvg-id="",EnerGeek Retro (720p) [Not 24/7]
|
||||
#EXTINF:-1 tvg-id="EnerGeek.cl",EnerGeek (720p) [Not 24/7]
|
||||
https://wifispeed.trapemn.tv:1936/infantil/energeek-1/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="EnfoqueDigitalTV.cl",Enfoque Digital TV (1080p)
|
||||
https://5eaccbab48461.streamlock.net:1936/8074/8074/playlist.m3u8
|
||||
@@ -449,3 +447,5 @@ https://zmlive.zappingtv.com/zm-free/zm.smil/playlist.m3u8
|
||||
http://38.131.11.9:1080/play/a00x
|
||||
#EXTINF:-1 tvg-id="ZonaPlayTV.cl",Zona Play TV (720p)
|
||||
https://paneltv.online:1936/8100/8100/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="Contivision.cl",Contivision (720p)
|
||||
https://unlimited6-cl.dps.live/cm/cm.smil/playlist.m3u8
|
||||
|
||||
@@ -5,8 +5,6 @@ https://sc-kuzeykibrissmarttv.ercdn.net/adatv/bant1/playlist.m3u8
|
||||
https://dev.aftermind.xyz/edge-hls/unitrust/alfasports/index.m3u8?token=8TXWzhY3h6jrzqEqu
|
||||
#EXTINF:-1 tvg-id="AlfaSport.cy",Alfa Sport (1080p) [Not 24/7]
|
||||
https://dev.aftermind.xyz/hls/unitrust/alfasports/index.m3u8?token=8TXWzhY3h6jrzqEqu
|
||||
#EXTINF:-1 tvg-id="AlphaTVCyprus.cy",Alpha TV Cyprus (1080p)
|
||||
http://l4.cloudskep.com/alphacyp/acy/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="ANT1Cyprus.cy",ANT1 Cyprus (1080p)
|
||||
http://l2.cloudskep.com/ant1cm2/abr/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="BRT1.cy",BRT 1 (720p) [Not 24/7]
|
||||
|
||||
@@ -414,8 +414,6 @@ https://bild-und-ton.stream/sophiatv-en/smil:sophia-tv-en.smil/playlist.m3u8
|
||||
https://bild-und-ton.stream/sophiatv-es/smil:sophia-tv-es.smil/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="SophiaTV.it",Sophia TV Italy (720p)
|
||||
https://bild-und-ton.stream/sophiatv-it/smil:sophia-tv-it.smil/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="Sport1.de",Sport 1 (1080p) [Geo-blocked]
|
||||
https://oz.sport1.de/api/ottv1/2/livestream/view/sport2.m3u8
|
||||
#EXTINF:-1 tvg-id="SRFernsehen.de",SR Fernsehen (720p)
|
||||
https://srfs.akamaized.net/hls/live/689649/srfsgeo/index.m3u8
|
||||
#EXTINF:-1 tvg-id="SRF.de",SRF (1080p)
|
||||
|
||||
@@ -33,8 +33,6 @@ https://ythls.onrender.com/channel/UCyDiTtktwmrc20Bvs_G4pow.m3u8
|
||||
https://vod.tv7.fi/tv7-ee/smil:tv7-ee.smil/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="TaivasTV7.fi",Taivas TV7 (720p)
|
||||
https://vod.tv7.fi/tv7-fi/smil:tv7-fi.smil/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="TLCFinland.fi",TLC Finland (720p)
|
||||
https://live-fi.tvkaista.net/tlc/live.m3u8
|
||||
#EXTINF:-1 tvg-id="TV5.fi",TV5 (720p) [Not 24/7]
|
||||
https://live-fi.tvkaista.net/tv5/live.m3u8
|
||||
#EXTINF:-1 tvg-id="WorTV.fi",WörTV (1080p) [Not 24/7]
|
||||
|
||||
@@ -373,3 +373,7 @@ https://ythls.onrender.com/channel/UCqvIdlrnd4DCcqp2DZwaZYw.m3u8
|
||||
https://live.digiteka.com/1/WGQ1NnhEN0lzM0NU/dk1EOHhw/hls/live/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="Weo.fr",Wéo (Picardie) (480p) [Not 24/7]
|
||||
https://live.digiteka.com/1/Zks2L0VsM2V0T242/QTBqcFly/hls/live/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="France3Lorraine.fr",France 3 Lorraine
|
||||
http://livetv.ktv.zone/225/play.m3u8
|
||||
#EXTINF:-1 tvg-id="France4.fr",France 4
|
||||
http://livetv.ktv.zone/116/play.m3u8
|
||||
|
||||
@@ -3,8 +3,6 @@
|
||||
https://origin2-6play.live.6cloud.fr/pool_rnpls9by/gulli/sixplaysd/hls_short_q2hyb21h_gulli/index.m3u8
|
||||
#EXTINF:-1 tvg-id="GulliBilArabi.fr",Gulli Bil Arabi (1080p)
|
||||
https://shls-gulli-bil-arabi-prod-dub.shahid.net/out/v1/5454d215afba410c90b233f400730958/index.m3u8
|
||||
#EXTINF:-1 tvg-id="M6.fr",M6
|
||||
https://raw.githubusercontent.com/Sphinxroot/HSL/main/M6.m3u8
|
||||
#EXTINF:-1 tvg-id="M6.fr",M6 (1080p)
|
||||
https://shls-m6-france-prod-dub.shahid.net/out/v1/c8a9f6e000cd4ebaa4d2fc7d18c15988/index.m3u8
|
||||
#EXTINF:-1 tvg-id="M6Music.fr",M6 Music (1080p)
|
||||
|
||||
@@ -526,3 +526,14 @@ https://cdn-telkomsel-01.akamaized.net/Content/HLS/Live/channel(18564c27-ff44-4d
|
||||
https://ams.juraganstreaming.com:5443/LiveApp/streams/wesaltv.m3u8
|
||||
#EXTINF:-1 tvg-id="ZeeBioskop.id",Zee Bioskop (360p) [Geo-blocked]
|
||||
http://edge.linknetott.swiftserve.com/Content/HLS/Live/Channel(ch161)/index.m3u8
|
||||
https://app-etslive-2.vidio.com/live/6399/master.m3u8
|
||||
#EXTINF:-1 tvg-id="CitraDangdut.id",Citra Dangdut [Geo-blocked]
|
||||
http://vod.linknetott.swiftcontent.com/Content/HLS/Live/Channel(ch377)/index.m3u8
|
||||
#EXTINF:-1 tvg-id="CitraMuslim.id",Citra Muslim [Geo-blocked]
|
||||
http://vod.linknetott.swiftcontent.com/Content/HLS/Live/Channel(ch334)/index.m3u8
|
||||
#EXTINF:-1 tvg-id="CitraDrama.id",Citra Drama (720p) [Geo-blocked]
|
||||
http://vod.linknetott.swiftcontent.com/Content/HLS/Live/Channel(ch378)/index.m3u8
|
||||
#EXTINF:-1 tvg-id="Horee.id",Horee! (720p) [Geo-blocked]
|
||||
http://vod.linknetott.swiftcontent.com/Content/HLS/Live/Channel(ch375)/index.m3u8
|
||||
#EXTINF:-1 tvg-id="IDXChannel.id",IDX Channel (720p) [Geo-blocked]
|
||||
http://vod.linknetott.swiftcontent.com/Content/HLS/Live/Channel(ch389)/index.m3u8
|
||||
|
||||
@@ -616,8 +616,6 @@ http://fms.tvavicenza.it:1935/live/diretta_1/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="TVL.it",TVL (720p) [Not 24/7]
|
||||
https://live.mariatvcdn.com/mariatvcdn/70564e1c6884c007c76f0c128d679eed.sdp/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="",TVR Sicilia HD (1080p) [Not 24/7]
|
||||
http://mc-qs.lanesh4d0w.tech/iptv-query?streaming-ip=https://www.twitch.tv/canale6tv
|
||||
#EXTINF:-1 tvg-id="",TVR Sicilia HD (1080p) [Not 24/7]
|
||||
https://ssh101.bozztv.com/ssh101/televita/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="TVRS.it",TVRS (576p) [Not 24/7]
|
||||
http://wms.shared.streamshow.it:1935/tvrs/tvrs/live.m3u8
|
||||
|
||||
@@ -1,19 +1,15 @@
|
||||
#EXTM3U
|
||||
#EXTINF:-1 tvg-id="AlaToo24.kg",Ala-Too 24 (576p)
|
||||
http://onlinetv.ktrk.kg:1935/live/myStream3/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="Balastan.kg",Balastan
|
||||
https://64e5ed58c00d4.streamlock.net/live/smil:balastan.smil/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="Balastan.kg",Balastan (576p)
|
||||
http://onlinetv.ktrk.kg:1935/live/myStream6/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="KTRK.kg",KTRK (720p)
|
||||
http://onlinetv.ktrk.kg:1935/live/myStream/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="Muzika.kg",KTRK Muzika (720p)
|
||||
http://onlinetv.ktrk.kg:1935/live/myStream2/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="KTRKSport.kg",KTRK Sport (576p)
|
||||
http://onlinetv.ktrk.kg:1935/live/myStream4/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="Madaniyat.kg",Madaniyat (576p)
|
||||
http://onlinetv.ktrk.kg:1935/live/myStream5/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="TV1KG.kg",TV1 KG (1080p)
|
||||
http://212.2.225.30:1935/live/site.stream/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="",Любимый HD/ТНТ4 (576p)
|
||||
http://92.245.103.126:1935/live/live.stream/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="Music.kg",Музыка (272p)
|
||||
https://64e5ed58c00d4.streamlock.net/live/smil:music.smil/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="AlaToo24.kg",Ала-тоо 24 (272p)
|
||||
https://64e5ed58c00d4.streamlock.net/live/smil:alatoo24.smil/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="KTRKSport.kg",УТРК Спорт (272p)
|
||||
https://64e5ed58c00d4.streamlock.net/live/smil:sport.smil/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="UTRK.kg",УТРК Кыргызстан (272p)
|
||||
https://64e5ed58c00d4.streamlock.net/live/smil:utrk.smil/playlist.m3u8
|
||||
|
||||
@@ -93,10 +93,6 @@ https://jcnonair-1108.acs.wecandeo.com/ms/3162/1108/index.m3u8
|
||||
http://live.worktv.or.kr:1935/live/wowtvlive1.sdp/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="JobplusTV.kr",Job Plus TV (한국직업방송) (480p)
|
||||
https://live.jobplustv.or.kr/live/wowtvlive1.sdp/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="KBS1TV.kr",KBS1 (720p)
|
||||
http://ye23.vip/z7z8/2021/kbs2020.php?id=1
|
||||
#EXTINF:-1 tvg-id="KBS2TV.kr",KBS2 (720p) [Not 24/7]
|
||||
http://ye23.vip/z7z8/2021/kbs2020.php?id=2
|
||||
#EXTINF:-1 tvg-id="KBSDrama.kr",KBS Drama (480p)
|
||||
http://mytv.dothome.co.kr/ch/catv/2.php
|
||||
#EXTINF:-1 tvg-id="KBSDrama.kr",KBS Drama (480p)
|
||||
@@ -265,3 +261,5 @@ https://ythls.onrender.com/channel/UC38IlqMxZ_YtFg3eSGmmJnQ.m3u8
|
||||
https://ythls.onrender.com/channel/UCizGMtU0Lt-O9X0tLJzyZ2Q.m3u8
|
||||
#EXTINF:-1 tvg-id="YTNScience.kr",YTN Science (720p)
|
||||
https://ythls.onrender.com/channel/UCZdBJIbJz0P9xyFipgOj1fA.m3u8
|
||||
#EXTINF:-1 tvg-id="Tooniverse.kr",Tooniverse
|
||||
http://code.vthanhtivi.pw/getlink/jptvvn/118/playlist.m3u8
|
||||
|
||||
@@ -5,23 +5,5 @@ https://kali.vdopanel.com:3986/live/mbashalive.m3u8
|
||||
https://5e74a9d684b2e.streamlock.net/liveTrans/ngrp:channel23_all/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="AlraiTV.kw",Alrai TV (1080p)
|
||||
https://svs.itworkscdn.net/alraitvlive/alraitv.smil/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="KTV1.kw",KTV 1 (1080p)
|
||||
http://mc-qs.lanesh4d0w.tech/iptv-query?streaming-ip=https://www.media.gov.kw/LiveTV.aspx?PanChannel=KTV1
|
||||
#EXTINF:-1 tvg-id="KTV2.kw",KTV 2 (1080p)
|
||||
http://mc-qs.lanesh4d0w.tech/iptv-query?streaming-ip=https://www.media.gov.kw/LiveTV.aspx?PanChannel=KTV2
|
||||
#EXTINF:-1 tvg-id="KTVAlMajlis.kw",KTV Al Majlis (1080p)
|
||||
http://mc-qs.lanesh4d0w.tech/iptv-query?streaming-ip=https://www.media.gov.kw/LiveTV.aspx?PanChannel=KTVSportExtra
|
||||
#EXTINF:-1 tvg-id="KTVAlQurain.kw",KTV Al Qurain (1080p) [Not 24/7]
|
||||
http://mc-qs.lanesh4d0w.tech/iptv-query?streaming-ip=https://www.media.gov.kw/LiveTV.aspx?PanChannel=KTVPlus
|
||||
#EXTINF:-1 tvg-id="KTVArabe.kw",KTV Arabe (1080p)
|
||||
http://mc-qs.lanesh4d0w.tech/iptv-query?streaming-ip=https://www.media.gov.kw/LiveTV.aspx?PanChannel=KTVArabe
|
||||
#EXTINF:-1 tvg-id="KTVKhallikBilbait.kw",KTV Drama (1080p)
|
||||
http://mc-qs.lanesh4d0w.tech/iptv-query?streaming-ip=https://www.media.gov.kw/LiveTV.aspx?PanChannel=KhallikBilbait
|
||||
#EXTINF:-1 tvg-id="KTVEthraa.kw",KTV Ethraa (1080p)
|
||||
http://mc-qs.lanesh4d0w.tech/iptv-query?streaming-ip=https://www.media.gov.kw/LiveTV.aspx?PanChannel=KTVEthraa
|
||||
#EXTINF:-1 tvg-id="KTVSport.kw",KTV Sport (1080p)
|
||||
http://mc-qs.lanesh4d0w.tech/iptv-query?streaming-ip=https://www.media.gov.kw/LiveTV.aspx?PanChannel=KTVSports
|
||||
#EXTINF:-1 tvg-id="KTVSportPlus.kw",KTV Sport Plus (1080p)
|
||||
http://mc-qs.lanesh4d0w.tech/iptv-query?streaming-ip=https://www.media.gov.kw/LiveTV.aspx?PanChannel=KTVSportPlus
|
||||
#EXTINF:-1 tvg-id="MarinaTV.kw",Marina TV (1080p) [Not 24/7]
|
||||
https://ythls.onrender.com/channel/UC1TelTm8bbY2jw0guInSvBA.m3u8
|
||||
|
||||
@@ -3,3 +3,5 @@
|
||||
https://webtvmonacoinfo.mc/live/prod_720/index.m3u8
|
||||
#EXTINF:-1 tvg-id="SuperyachtTV.mc",Superyacht TV (1080p)
|
||||
https://sy.wns.live/hls/stream.m3u8
|
||||
#EXTINF:-1 tvg-id="TVMonaco.mc",TV Monaco (1080p)
|
||||
https://production-fast-mcrtv.content.okast.tv/channels/2116dc08-1959-465d-857f-3619daefb66b/b702b2b9-aebd-436c-be69-2118f56f3d86/2024/media.m3u8
|
||||
|
||||
@@ -63,8 +63,6 @@ https://d25tgymtnqzu8s.cloudfront.net/smil:tv1/playlist.m3u8?id=1
|
||||
https://d25tgymtnqzu8s.cloudfront.net/smil:tv2/playlist.m3u8?id=2
|
||||
#EXTINF:-1 tvg-id="TV3.my",TV3
|
||||
https://live-streams-ssai-01.tonton.com.my/live/2dd2b7cd-1b34-4871-b669-57b5c9beca23/live.isml/.m3u8
|
||||
#EXTINF:-1 tvg-id="TV3.my",TV3 (720p) [Geo-blocked]
|
||||
https://live-sg1.global.ssl.fastly.net/live-hls/tonton1.m3u8
|
||||
#EXTINF:-1 tvg-id="",TV6 [Geo-blocked]
|
||||
#EXTVLCOPT:http-referrer=https://rtm-player.glueapi.io/
|
||||
https://d25tgymtnqzu8s.cloudfront.net/smil:tv6/playlist.m3u8?id=6
|
||||
|
||||
3
streams/sr.m3u
Normal file
3
streams/sr.m3u
Normal file
@@ -0,0 +1,3 @@
|
||||
#EXTM3U
|
||||
#EXTINF:-1 tvg-id="TrishulBroadcastingNetwork.sr",TBN TV (720p) [Not 24/7]
|
||||
https://live.suricloud.com/hls/tbntv/index.m3u8
|
||||
@@ -1,54 +1,40 @@
|
||||
#EXTM3U
|
||||
#EXTINF:-1 tvg-id="BBCAlba.uk",BBC Alba (720p) [Geo-blocked]
|
||||
https://vs-cmaf-pushb-uk.live.fastly.md.bbci.co.uk/x=3/i=urn:bbc:pips:service:bbc_alba/iptv_hd_abr_v1.mpd
|
||||
#EXTINF:-1 tvg-id="BBCAlba.uk",BBC Alba (540p) [Geo-blocked]
|
||||
https://vs-hls-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_alba/mobile_wifi_main_sd_abr_v2_akamai_hls_live_http.m3u8
|
||||
https://vs-cmaf-pushb-uk.live.fastly.md.bbci.co.uk/x=4/i=urn:bbc:pips:service:bbc_alba/iptv_hd_abr_v1.mpd
|
||||
#EXTINF:-1 tvg-id="BBCArabic.uk",BBC Arabic (720p)
|
||||
https://vs-cmaf-pushb-ww-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_arabic_tv/pc_hd_abr_v2.mpd
|
||||
https://vs-cmaf-pushb-ww-live.akamaized.net/x=4/i=urn:bbc:pips:service:bbc_arabic_tv/pc_hd_abr_v2.mpd
|
||||
#EXTINF:-1 tvg-id="BBCArabic.uk",BBC Arabic (720p)
|
||||
https://vs-cmaf-pushb-ww-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_arabic_tv/pc_hd_abr_v2_http.mpd
|
||||
https://vs-cmaf-pushb-ww-live.akamaized.net/x=4/i=urn:bbc:pips:service:bbc_arabic_tv/pc_hd_abr_v2_http.mpd
|
||||
#EXTINF:-1 tvg-id="BBCArabic.uk",BBC Arabic (720p)
|
||||
https://vs-cmaf-pushb-ww.live.cf.md.bbci.co.uk/x=3/i=urn:bbc:pips:service:bbc_arabic_tv/pc_hd_abr_v2.mpd
|
||||
https://vs-cmaf-pushb-ww.live.cf.md.bbci.co.uk/x=4/i=urn:bbc:pips:service:bbc_arabic_tv/pc_hd_abr_v2.mpd
|
||||
#EXTINF:-1 tvg-id="BBCArabic.uk",BBC Arabic (720p)
|
||||
https://vs-cmaf-pushb-ww.live.cf.md.bbci.co.uk/x=3/i=urn:bbc:pips:service:bbc_arabic_tv/pc_hd_abr_v2_cloudfrontms_live.mpd
|
||||
https://vs-cmaf-pushb-ww.live.cf.md.bbci.co.uk/x=4/i=urn:bbc:pips:service:bbc_arabic_tv/pc_hd_abr_v2_http.mpd
|
||||
#EXTINF:-1 tvg-id="BBCArabic.uk",BBC Arabic (720p)
|
||||
https://vs-cmaf-pushb-ww.live.cf.md.bbci.co.uk/x=3/i=urn:bbc:pips:service:bbc_arabic_tv/pc_hd_abr_v2_http.mpd
|
||||
https://vs-hls-pushb-ww-live.akamaized.net/x=4/i=urn:bbc:pips:service:bbc_arabic_tv/pc_hd_abr_v2.m3u8
|
||||
#EXTINF:-1 tvg-id="BBCArabic.uk",BBC Arabic (720p)
|
||||
https://vs-hls-pushb-ww-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_arabic_tv/pc_hd_abr_v2.m3u8
|
||||
#EXTINF:-1 tvg-id="BBCArabic.uk",BBC Arabic (720p)
|
||||
https://vs-hls-pushb-ww-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_arabic_tv/t=3840/v=pv14/b=5070016/main.m3u8
|
||||
https://vs-hls-pushb-ww-live.akamaized.net/x=4/i=urn:bbc:pips:service:bbc_arabic_tv/t=3840/v=pv14/b=5070016/main.m3u8
|
||||
#EXTINF:-1 tvg-id="BBCArabic.uk",BBC Arabic (540p)
|
||||
https://vs-hls-pushb-ww-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_arabic_tv/pc_hd_abr_v2_akamai_hls_live.m3u8
|
||||
#EXTINF:-1 tvg-id="BBCArabic.uk",BBC Arabic (540p)
|
||||
https://vs-hls-pushb-ww.live.cf.md.bbci.co.uk/x=3/i=urn:bbc:pips:service:bbc_arabic_tv/pc_hd_abr_v2.m3u8
|
||||
#EXTINF:-1 tvg-id="BBCArabic.uk",BBC Arabic (540p)
|
||||
https://vs-hls-pushb-ww.live.cf.md.bbci.co.uk/x=3/i=urn:bbc:pips:service:bbc_arabic_tv/pc_hd_abr_v2_cloudfrontms_live.m3u8
|
||||
https://vs-hls-pushb-ww.live.cf.md.bbci.co.uk/x=4/i=urn:bbc:pips:service:bbc_arabic_tv/pc_hd_abr_v2.m3u8
|
||||
#EXTINF:-1 tvg-id="BBCArabic.uk",BBC Arabic (480p)
|
||||
https://ythls.onrender.com/channel/UCelk6aHijZq-GJBBB9YpReA.m3u8
|
||||
#EXTINF:-1 tvg-id="BBCFour.uk",BBC Four (540p) [Geo-blocked]
|
||||
https://vs-hls-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_four_hd/mobile_wifi_main_sd_abr_v2_akamai_hls_live_http.m3u8
|
||||
#EXTINF:-1 tvg-id="BBCFour.uk",BBC Four HD (720p) [Geo-blocked]
|
||||
https://vs-cmaf-pushb-uk.live.fastly.md.bbci.co.uk/x=3/i=urn:bbc:pips:service:bbc_four_hd/iptv_hd_abr_v1.mpd
|
||||
https://vs-cmaf-pushb-uk.live.fastly.md.bbci.co.uk/x=4/i=urn:bbc:pips:service:bbc_four_hd/iptv_hd_abr_v1.mpd
|
||||
#EXTINF:-1 tvg-id="BBCFour.uk",BBC Four HD (720p) [Geo-blocked]
|
||||
https://vs-hls-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_four_hd/t=3840/v=pv14/b=5070016/main.m3u8
|
||||
https://vs-hls-pushb-uk-live.akamaized.net/x=4/i=urn:bbc:pips:service:bbc_four_hd/t=3840/v=pv14/b=5070016/main.m3u8
|
||||
#EXTINF:-1 tvg-id="BBCNews.uk",BBC News (540p) [Geo-blocked]
|
||||
https://vs-hls-push-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_news_channel_hd/mobile_wifi_main_sd_abr_v2.m3u8
|
||||
https://vs-hls-push-uk-live.akamaized.net/x=4/i=urn:bbc:pips:service:bbc_news_channel_hd/mobile_wifi_main_sd_abr_v2.m3u8
|
||||
#EXTINF:-1 tvg-id="BBCNews.uk",BBC News HD (720p) [Geo-blocked]
|
||||
https://vs-cmaf-push-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_news_channel_hd/iptv_hd_abr_v1.mpd
|
||||
https://vs-cmaf-push-uk-live.akamaized.net/x=4/i=urn:bbc:pips:service:bbc_news_channel_hd/iptv_hd_abr_v1.mpd
|
||||
#EXTINF:-1 tvg-id="BBCNews.uk",BBC News HD (720p) [Geo-blocked]
|
||||
https://vs-hls-push-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_news_channel_hd/t=3840/v=pv14/b=5070016/main.m3u8
|
||||
https://vs-hls-push-uk-live.akamaized.net/x=4/i=urn:bbc:pips:service:bbc_news_channel_hd/t=3840/v=pv14/b=5070016/main.m3u8
|
||||
#EXTINF:-1 tvg-id="BBCOneChannelIslands.uk",BBC One Channel Islands (720p) [Geo-blocked]
|
||||
https://vs-cmaf-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_one_channel_islands/pc_hd_abr_v2.mpd
|
||||
#EXTINF:-1 tvg-id="BBCOneChannelIslands.uk",BBC One Channel Islands (540p) [Geo-blocked]
|
||||
https://vs-hls-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_one_channel_islands/mobile_wifi_main_sd_abr_v2_akamai_hls_live_http.m3u8
|
||||
https://vs-cmaf-pushb-uk-live.akamaized.net/x=4/i=urn:bbc:pips:service:bbc_one_channel_islands/pc_hd_abr_v2.mpd
|
||||
#EXTINF:-1 tvg-id="BBCOneEast.uk",BBC One East (720p) [Geo-blocked]
|
||||
https://vs-cmaf-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_one_east/pc_hd_abr_v2.mpd
|
||||
#EXTINF:-1 tvg-id="BBCOneEast.uk",BBC One East (540p) [Geo-blocked]
|
||||
https://vs-hls-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_one_east/mobile_wifi_main_sd_abr_v2_akamai_hls_live_http.m3u8
|
||||
https://vs-cmaf-pushb-uk-live.akamaized.net/x=4/i=urn:bbc:pips:service:bbc_one_east/pc_hd_abr_v2.mpd
|
||||
#EXTINF:-1 tvg-id="BBCOneEastMidlands.uk",BBC One East Midlands (720p) [Geo-blocked]
|
||||
https://vs-cmaf-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_one_east_midlands/pc_hd_abr_v2.mpd
|
||||
#EXTINF:-1 tvg-id="BBCOneEastMidlands.uk",BBC One East Midlands (540p) [Geo-blocked]
|
||||
https://vs-hls-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_one_east_midlands/mobile_wifi_main_sd_abr_v2_akamai_hls_live_http.m3u8
|
||||
https://vs-cmaf-pushb-uk-live.akamaized.net/x=4/i=urn:bbc:pips:service:bbc_one_east_midlands/pc_hd_abr_v2.mpd
|
||||
#EXTINF:-1 tvg-id="BBCOneYorkshire.uk",BBC One East Yorkshire (720p) [Geo-blocked]
|
||||
https://vs-cmaf-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_one_east_yorkshire/pc_hd_abr_v2.mpd
|
||||
#EXTINF:-1 tvg-id="BBCOneYorkshire.uk",BBC One East Yorkshire (540p) [Geo-blocked]
|
||||
@@ -70,15 +56,11 @@ https://vs-cmaf-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_one_n
|
||||
#EXTINF:-1 tvg-id="BBCOneNorthEastCumbria.uk",BBC One North East (540p) [Geo-blocked]
|
||||
https://vs-hls-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_one_north_east/mobile_wifi_main_sd_abr_v2_akamai_hls_live_http.m3u8
|
||||
#EXTINF:-1 tvg-id="BBCOneNorthWest.uk",BBC One North West (720p) [Geo-blocked]
|
||||
https://vs-cmaf-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_one_north_west/pc_hd_abr_v2.mpd
|
||||
#EXTINF:-1 tvg-id="BBCOneNorthWest.uk",BBC One North West (540p) [Geo-blocked]
|
||||
https://vs-hls-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_one_north_west/mobile_wifi_main_sd_abr_v2_akamai_hls_live_http.m3u8
|
||||
#EXTINF:-1 tvg-id="BBCOneNorthernIreland.uk",BBC One Northern Ireland (540p) [Geo-blocked]
|
||||
https://vs-hls-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_one_northern_ireland_hd/mobile_wifi_main_sd_abr_v2_akamai_hls_live_http.m3u8
|
||||
https://vs-cmaf-pushb-uk-live.akamaized.net/x=4/i=urn:bbc:pips:service:bbc_one_north_west/pc_hd_abr_v2.mpd
|
||||
#EXTINF:-1 tvg-id="BBCOneNorthernIreland.uk",BBC One Northern Ireland HD (720p) [Geo-blocked]
|
||||
https://vs-cmaf-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_one_northern_ireland_hd/pc_hd_abr_v2.mpd
|
||||
https://vs-cmaf-pushb-uk-live.akamaized.net/x=4/i=urn:bbc:pips:service:bbc_one_northern_ireland_hd/pc_hd_abr_v2.mpd
|
||||
#EXTINF:-1 tvg-id="BBCOneNorthernIreland.uk",BBC One Northern Ireland HD (720p) [Geo-blocked]
|
||||
https://vs-hls-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_one_northern_ireland_hd/t=3840/v=pv14/b=5070016/main.m3u8
|
||||
https://vs-hls-pushb-uk-live.akamaized.net/x=4/i=urn:bbc:pips:service:bbc_one_northern_ireland_hd/t=3840/v=pv14/b=5070016/main.m3u8
|
||||
#EXTINF:-1 tvg-id="BBCOneScotland.uk",BBC One Scotland (540p) [Geo-blocked]
|
||||
https://vs-hls-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_one_scotland_hd/mobile_wifi_main_sd_abr_v2_akamai_hls_live_http.m3u8
|
||||
#EXTINF:-1 tvg-id="BBCOneScotland.uk",BBC One Scotland HD (720p) [Geo-blocked]
|
||||
@@ -94,17 +76,17 @@ https://vs-cmaf-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_one_s
|
||||
#EXTINF:-1 tvg-id="BBCOneSouthEast.uk",BBC One South East (540p) [Geo-blocked]
|
||||
https://vs-hls-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_one_south_east/mobile_wifi_main_sd_abr_v2_akamai_hls_live_http.m3u8
|
||||
#EXTINF:-1 tvg-id="BBCOneSouthWest.uk",BBC One South West (720p) [Geo-blocked]
|
||||
https://vs-cmaf-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_one_south_west/pc_hd_abr_v2.mpd
|
||||
https://vs-cmaf-pushb-uk-live.akamaized.net/x=4/i=urn:bbc:pips:service:bbc_one_south_west/pc_hd_abr_v2.mpd
|
||||
#EXTINF:-1 tvg-id="BBCOneSouthWest.uk",BBC One South West (540p) [Geo-blocked]
|
||||
https://vs-hls-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_one_south_west/mobile_wifi_main_sd_abr_v2_akamai_hls_live_http.m3u8
|
||||
#EXTINF:-1 tvg-id="BBCOneWales.uk",BBC One Wales (720p) [Geo-blocked]
|
||||
https://vs-cmaf-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_one_wales_hd/pc_hd_abr_v2.mpd
|
||||
#EXTINF:-1 tvg-id="BBCOneWales.uk",BBC One Wales (720p) [Geo-blocked]
|
||||
https://vs-hls-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_one_wales_hd/t=3840/v=pv14/b=5070016/main.m3u8
|
||||
https://vs-hls-pushb-uk-live.akamaized.net/x=4/i=urn:bbc:pips:service:bbc_one_wales_hd/t=3840/v=pv14/b=5070016/main.m3u8
|
||||
#EXTINF:-1 tvg-id="BBCOneWales.uk",BBC One Wales (540p) [Geo-blocked]
|
||||
https://vs-hls-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_one_wales_hd/mobile_wifi_main_sd_abr_v2_akamai_hls_live_http.m3u8
|
||||
#EXTINF:-1 tvg-id="BBCOneWest.uk",BBC One West (720p) [Geo-blocked]
|
||||
https://vs-cmaf-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_one_west/pc_hd_abr_v2.mpd
|
||||
https://vs-cmaf-pushb-uk-live.akamaized.net/x=4/i=urn:bbc:pips:service:bbc_one_west/pc_hd_abr_v2.mpd
|
||||
#EXTINF:-1 tvg-id="BBCOneWest.uk",BBC One West (540p) [Geo-blocked]
|
||||
https://vs-hls-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_one_west/mobile_wifi_main_sd_abr_v2_akamai_hls_live_http.m3u8
|
||||
#EXTINF:-1 tvg-id="BBCOneWestMidlands.uk",BBC One West Midlands (720p) [Geo-blocked]
|
||||
@@ -116,9 +98,7 @@ https://vs-cmaf-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_one_y
|
||||
#EXTINF:-1 tvg-id="BBCOneYorksLincs.uk",BBC One Yorks (540p) [Geo-blocked]
|
||||
https://vs-hls-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_one_yorks/mobile_wifi_main_sd_abr_v2_akamai_hls_live_http.m3u8
|
||||
#EXTINF:-1 tvg-id="BBCParliament.uk",BBC Parliament (720p) [Geo-blocked]
|
||||
https://vs-cmaf-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_parliament/iptv_hd_abr_v1.mpd
|
||||
#EXTINF:-1 tvg-id="BBCParliament.uk",BBC Parliament (540p) [Geo-blocked]
|
||||
https://vs-hls-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_parliament/mobile_wifi_main_sd_abr_v2_akamai_hls_live_http.m3u8
|
||||
https://vs-cmaf-pushb-uk-live.akamaized.net/x=4/i=urn:bbc:pips:service:bbc_parliament/iptv_hd_abr_v1.mpd
|
||||
#EXTINF:-1 tvg-id="BBCPersian.uk",BBC Persian (720p)
|
||||
https://vs-cmaf-pushb-ww-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_persian_tv/pc_hd_abr_v2_akamai_dash_live.mpd
|
||||
#EXTINF:-1 tvg-id="BBCPersian.uk",BBC Persian (720p)
|
||||
@@ -187,34 +167,30 @@ https://vs-cmaf-pushb-uk.live.cf.md.bbci.co.uk/x=3/i=urn:bbc:pips:service:red_bu
|
||||
https://vs-hls-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_scotland_hd/mobile_wifi_main_sd_abr_v2_akamai_hls_live_http.m3u8
|
||||
#EXTINF:-1 tvg-id="BBCScotland.uk",BBC Scotland HD (720p) [Geo-blocked]
|
||||
https://vs-cmaf-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_scotland_hd/iptv_hd_abr_v1.mpd
|
||||
#EXTINF:-1 tvg-id="BBCScotland.uk",BBC Scotland HD (720p) [Geo-blocked]
|
||||
https://vs-hls-pushb-uk-live.akamaized.net/content/x=3/v=pv14/b=5070016/t=3840/i=urn:bbc:pips:service:bbc_scotland_hd/main.m3u8
|
||||
#EXTINF:-1 tvg-id="BBCThree.uk",BBC Three (540p) [Geo-blocked]
|
||||
https://vs-hls-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_three_hd/t=3840/v=pv10/b=1604032/main.m3u8
|
||||
https://vs-hls-pushb-uk-live.akamaized.net/x=4/i=urn:bbc:pips:service:bbc_three_hd/t=3840/v=pv10/b=1604032/main.m3u8
|
||||
#EXTINF:-1 tvg-id="BBCThree.uk",BBC Three HD (720p) [Geo-blocked]
|
||||
https://vs-cmaf-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_three_hd/iptv_hd_abr_v1.mpd
|
||||
https://vs-cmaf-pushb-uk-live.akamaized.net/x=4/i=urn:bbc:pips:service:bbc_three_hd/iptv_hd_abr_v1.mpd
|
||||
#EXTINF:-1 tvg-id="BBCThree.uk",BBC Three HD (720p) [Geo-blocked]
|
||||
https://vs-cmaf-pushb-uk.live.fastly.md.bbci.co.uk/x=3/i=urn:bbc:pips:service:bbc_three_hd/iptv_hd_abr_v1.mpd
|
||||
https://vs-cmaf-pushb-uk.live.fastly.md.bbci.co.uk/x=4/i=urn:bbc:pips:service:bbc_three_hd/iptv_hd_abr_v1.mpd
|
||||
#EXTINF:-1 tvg-id="BBCThree.uk",BBC Three HD (720p) [Geo-blocked]
|
||||
https://vs-hls-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_three_hd/t=3840/v=pv14/b=5070016/main.m3u8
|
||||
https://vs-hls-pushb-uk-live.akamaized.net/x=4/i=urn:bbc:pips:service:bbc_three_hd/t=3840/v=pv14/b=5070016/main.m3u8
|
||||
#EXTINF:-1 tvg-id="BBCTwoEngland.uk",BBC Two HD (720p) [Geo-blocked]
|
||||
https://vs-cmaf-push-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_two_hd/iptv_hd_abr_v1.mpd
|
||||
https://vs-cmaf-push-uk-live.akamaized.net/x=4/i=urn:bbc:pips:service:bbc_two_hd/iptv_hd_abr_v1.mpd
|
||||
#EXTINF:-1 tvg-id="BBCTwoEngland.uk",BBC Two HD (720p) [Geo-blocked]
|
||||
https://vs-cmaf-push-uk.live.fastly.md.bbci.co.uk/x=3/i=urn:bbc:pips:service:bbc_two_hd/pc_hd_abr_v2.mpd
|
||||
https://vs-cmaf-push-uk.live.fastly.md.bbci.co.uk/x=4/i=urn:bbc:pips:service:bbc_two_hd/pc_hd_abr_v2.mpd
|
||||
#EXTINF:-1 tvg-id="BBCTwoEngland.uk",BBC Two HD (720p) [Geo-blocked]
|
||||
https://vs-hls-push-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_two_hd/t=3840/v=pv14/b=5070016/main.m3u8
|
||||
https://vs-hls-push-uk-live.akamaized.net/x=4/i=urn:bbc:pips:service:bbc_two_hd/t=3840/v=pv14/b=5070016/main.m3u8
|
||||
#EXTINF:-1 tvg-id="BBCTwoEngland.uk",BBC Two HD (540p) [Geo-blocked]
|
||||
https://vs-hls-push-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_two_hd/mobile_wifi_main_sd_abr_v2.m3u8
|
||||
https://vs-hls-push-uk-live.akamaized.net/x=4/i=urn:bbc:pips:service:bbc_two_hd/mobile_wifi_main_sd_abr_v2.m3u8
|
||||
#EXTINF:-1 tvg-id="BBCTwoNorthernIreland.uk",BBC Two Northen Ireland (540p) [Geo-blocked]
|
||||
https://vs-hls-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_two_northern_ireland_hd/mobile_wifi_main_sd_abr_v2_akamai_hls_live_http.m3u8
|
||||
#EXTINF:-1 tvg-id="BBCTwoNorthernIreland.uk",BBC Two Northern Ireland HD (720p) [Geo-blocked]
|
||||
https://vs-cmaf-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_two_northern_ireland_hd/iptv_hd_abr_v1.mpd
|
||||
https://vs-cmaf-pushb-uk-live.akamaized.net/x=4/i=urn:bbc:pips:service:bbc_two_northern_ireland_hd/iptv_hd_abr_v1.mpd
|
||||
#EXTINF:-1 tvg-id="BBCTwoNorthernIreland.uk",BBC Two Northern Ireland HD (720p) [Geo-blocked]
|
||||
https://vs-hls-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_two_northern_ireland_hd/t=3840/v=pv14/b=5070016/main.m3u8
|
||||
https://vs-hls-pushb-uk-live.akamaized.net/x=4/i=urn:bbc:pips:service:bbc_two_northern_ireland_hd/t=3840/v=pv14/b=5070016/main.m3u8
|
||||
#EXTINF:-1 tvg-id="BBCTwoWales.uk",BBC Two Wales (720p) [Geo-blocked]
|
||||
https://vs-cmaf-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_two_wales_digital/iptv_hd_abr_v1.mpd
|
||||
#EXTINF:-1 tvg-id="BBCTwoWales.uk",BBC Two Wales (540p) [Geo-blocked]
|
||||
https://vs-hls-push-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_two_wales_digital/mobile_wifi_main_sd_abr_v2_akamai_hls_live_http.m3u8
|
||||
https://vs-cmaf-pushb-uk-live.akamaized.net/x=4/i=urn:bbc:pips:service:bbc_two_wales_digital/iptv_hd_abr_v1.mpd
|
||||
#EXTINF:-1 tvg-id="BBCUHD1.uk",BBC UHD 1 (2160p) [Geo-blocked] [Not 24/7]
|
||||
https://ve-uhd-push-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:uhd_stream_01/iptv_uhd_v1.mpd
|
||||
#EXTINF:-1 tvg-id="BBCUHD2.uk",BBC UHD 2 (2160p) [Geo-blocked] [Not 24/7]
|
||||
@@ -225,22 +201,18 @@ https://ve-uhd-push-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:uhd_stream_
|
||||
https://ve-uhd-push-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:uhd_stream_04/iptv_uhd_v1.mpd
|
||||
#EXTINF:-1 tvg-id="BBCUHD5.uk",BBC UHD 5 (2160p) [Geo-blocked] [Not 24/7]
|
||||
https://ve-uhd-push-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:uhd_stream_05/iptv_uhd_v1.mpd
|
||||
#EXTINF:-1 tvg-id="CBBC.uk",CBBC (540p) [Geo-blocked]
|
||||
https://vs-hls-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:cbbc_hd/mobile_wifi_main_sd_abr_v2_akamai_hls_live_http.m3u8
|
||||
#EXTINF:-1 tvg-id="CBBC.uk",CBBC HD (720p) [Geo-blocked]
|
||||
https://vs-cmaf-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:cbbc_hd/iptv_hd_abr_v1.mpd
|
||||
https://vs-cmaf-pushb-uk-live.akamaized.net/x=4/i=urn:bbc:pips:service:cbbc_hd/iptv_hd_abr_v1.mpd
|
||||
#EXTINF:-1 tvg-id="CBBC.uk",CBBC HD (720p) [Geo-blocked]
|
||||
https://vs-cmaf-pushb-uk.live.fastly.md.bbci.co.uk/x=3/i=urn:bbc:pips:service:cbbc_hd/iptv_hd_abr_v1.mpd
|
||||
https://vs-cmaf-pushb-uk.live.fastly.md.bbci.co.uk/x=4/i=urn:bbc:pips:service:cbbc_hd/iptv_hd_abr_v1.mpd
|
||||
#EXTINF:-1 tvg-id="CBBC.uk",CBBC HD (720p) [Geo-blocked]
|
||||
https://vs-hls-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:cbbc_hd/t=3840/v=pv14/b=5070016/main.m3u8
|
||||
#EXTINF:-1 tvg-id="CBeebies.uk",CBeebies (540p) [Geo-blocked]
|
||||
https://vs-hls-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:cbeebies_hd/mobile_wifi_main_sd_abr_v2_akamai_hls_live_http.m3u8
|
||||
https://vs-hls-pushb-uk-live.akamaized.net/x=4/i=urn:bbc:pips:service:cbbc_hd/t=3840/v=pv14/b=5070016/main.m3u8
|
||||
#EXTINF:-1 tvg-id="CBeebies.uk",CBeebies HD (720p) [Geo-blocked]
|
||||
https://vs-cmaf-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:cbeebies_hd/iptv_hd_abr_v1.mpd
|
||||
https://vs-cmaf-pushb-uk-live.akamaized.net/x=4/i=urn:bbc:pips:service:cbeebies_hd/iptv_hd_abr_v1.mpd
|
||||
#EXTINF:-1 tvg-id="CBeebies.uk",CBeebies HD (720p) [Geo-blocked]
|
||||
https://vs-cmaf-pushb-uk.live.fastly.md.bbci.co.uk/x=3/i=urn:bbc:pips:service:cbeebies_hd/iptv_hd_abr_v1.mpd
|
||||
https://vs-cmaf-pushb-uk.live.fastly.md.bbci.co.uk/x=4/i=urn:bbc:pips:service:cbeebies_hd/iptv_hd_abr_v1.mpd
|
||||
#EXTINF:-1 tvg-id="CBeebies.uk",CBeebies HD (720p) [Geo-blocked]
|
||||
https://vs-hls-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:cbeebies_hd/t=3840/v=pv14/b=5070016/main.m3u8
|
||||
https://vs-hls-pushb-uk-live.akamaized.net/x=4/i=urn:bbc:pips:service:cbeebies_hd/t=3840/v=pv14/b=5070016/main.m3u8
|
||||
#EXTINF:-1 tvg-id="S4C.uk",S4C (1080p) [Geo-blocked]
|
||||
https://live-uk.s4c-cdn.co.uk/out/v1/a0134f1fd5a2461b9422b574566d4442/live_uk.m3u8
|
||||
#EXTINF:-1 tvg-id="S4C.uk",S4C (720p) [Geo-blocked]
|
||||
|
||||
@@ -181,12 +181,8 @@ https://cdn3.wowza.com/5/ZWQ1K2NYTmpFbGsr/BEK-WOWZA-1/smil:BEKPRIMEeast.smil/pla
|
||||
https://cdn3.wowza.com/5/ZWQ1K2NYTmpFbGsr/BEK-WOWZA-1/smil:BEKPRIMEW.smil/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="BetterHealthTV.us",Better Health TV (480p)
|
||||
https://tgn.bozztv.com/betterlife/betterhealth/betterhealth/index.m3u8
|
||||
#EXTINF:-1 tvg-id="BetterHealthTV.us",Better Health TV (480p)
|
||||
https://uni10rtmp.tulix.tv/betterhealth/betterhealth.stream/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="BetterLifeNatureChannel.us",Better Life Nature Channel (480p)
|
||||
https://tgn.bozztv.com/betterlife/betternature/betternature/index.m3u8
|
||||
#EXTINF:-1 tvg-id="BetterLifeNatureChannel.us",Better Life Nature Channel (480p)
|
||||
https://uni10rtmp.tulix.tv/betternature/betternature.stream/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="BetterLifeTV.us",Better Life TV (720p)
|
||||
https://tgn.bozztv.com/betterlife/betterlife/betterlife/index.m3u8
|
||||
#EXTINF:-1 tvg-id="",Big City TV
|
||||
@@ -402,8 +398,6 @@ https://cdn20.liveonlineservices.com/hls/eye95tv.m3u8
|
||||
https://biblescreen.faithlifecdn.com/biblescreen/bibleScreen/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="ChristmasMusic.us",Faithlife TV Christmas Music (720p)
|
||||
https://vse2-na-us-ne24.secdn.net/logos-channel/live/christmas/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="FastTV.us",Fast TV
|
||||
https://3fa797d5.wurl.com/manifest/f36d25e7e52f1ba8d7e56eb859c636563214f541/T05PX01vdG9yVHJlbmRGYXN0VFZfSExT/b5e5e0e2-12b3-4312-93c9-c0a7c50b41ca/4.m3u8
|
||||
#EXTINF:-1 tvg-id="" user-agent="Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148",Fast&Fun Box (Russian) (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/s79/index.m3u8
|
||||
@@ -1098,3 +1092,7 @@ https://thegateway.app/YouToo/CueTones/playlist.m3u8
|
||||
https://thegateway.app/YouToo/YTamerica/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="DisneyChannelRussia.ru",Канал Disney (576p) [Not 24/7]
|
||||
http://188.40.68.167/russia/disney/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="SUMtvLatino.us",SUMtv Latino (1080p)
|
||||
https://bozztv.com/uni10rtmp/ssstv2-cdn/smil:ssstv2web.smil/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="EVTVMiami.us",EVTV Miami (720p) [Not 24/7]
|
||||
https://streannliveevtv.cachefly.net/Protected/sp=1;dirmatch=true/3be25dc13406bf70ff0208230e6fa803b88b95013fad257c025e481e2be3e214/evtv1/evtv1/playlist.m3u8
|
||||
|
||||
@@ -11,19 +11,19 @@ https://stream.ads.ottera.tv/playlist.m3u8?network_id=654
|
||||
https://stream.ads.ottera.tv/playlist.m3u8?network_id=2548
|
||||
#EXTINF:-1 tvg-id="",Canela Telenovelas
|
||||
https://stream.ads.ottera.tv/playlist.m3u8?network_id=1152
|
||||
#EXTINF:-1 tvg-id="",CanelaTV
|
||||
#EXTINF:-1 tvg-id="CanelaTV.us",CanelaTV
|
||||
https://stream.ads.ottera.tv/playlist.m3u8?network_id=119
|
||||
#EXTINF:-1 tvg-id="",CHILL LATINO
|
||||
https://stream.ads.ottera.tv/playlist.m3u8?network_id=1085
|
||||
#EXTINF:-1 tvg-id="",Cine Romantico
|
||||
#EXTINF:-1 tvg-id="CineRomantico.us",Cine Romantico
|
||||
https://stream.ads.ottera.tv/playlist.m3u8?network_id=656
|
||||
#EXTINF:-1 tvg-id="",Combate Global
|
||||
https://stream.ads.ottera.tv/playlist.m3u8?network_id=960
|
||||
#EXTINF:-1 tvg-id="",El Rey
|
||||
#EXTINF:-1 tvg-id="ElRey.us",El Rey
|
||||
https://stream.ads.ottera.tv/playlist.m3u8?network_id=1544
|
||||
#EXTINF:-1 tvg-id="",El Talisman
|
||||
https://stream.ads.ottera.tv/playlist.m3u8?network_id=1079
|
||||
#EXTINF:-1 tvg-id="",Flou Cine
|
||||
#EXTINF:-1 tvg-id="FlouCine.us",Flou Cine
|
||||
https://amg01768-flou-flou-canelatv-yri41.amagi.tv/playlist/amg01768-flou-flou-canelatv/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="",Flow Caribe
|
||||
https://stream.ads.ottera.tv/playlist.m3u8?network_id=1083
|
||||
@@ -35,7 +35,7 @@ https://stream.ads.ottera.tv/playlist.m3u8?network_id=3010
|
||||
https://stream.ads.ottera.tv/playlist.m3u8?network_id=3366
|
||||
#EXTINF:-1 tvg-id="",Novelas Turcas
|
||||
https://stream.ads.ottera.tv/playlist.m3u8?network_id=5088
|
||||
#EXTINF:-1 tvg-id="",Novelisima
|
||||
#EXTINF:-1 tvg-id="Novelisima.us",Novelisima
|
||||
https://stream.ads.ottera.tv/playlist.m3u8?network_id=2380
|
||||
#EXTINF:-1 tvg-id="",Planeta de Aventuras
|
||||
https://stream.ads.ottera.tv/playlist.m3u8?network_id=4311
|
||||
@@ -47,7 +47,7 @@ https://stream.ads.ottera.tv/playlist.m3u8?network_id=1545
|
||||
https://stream.ads.ottera.tv/playlist.m3u8?network_id=1084
|
||||
#EXTINF:-1 tvg-id="",Ritmos Inolvidables
|
||||
https://stream.ads.ottera.tv/playlist.m3u8?network_id=1081
|
||||
#EXTINF:-1 tvg-id="",Sony Canal Novelas
|
||||
#EXTINF:-1 tvg-id="SonyCanalNovelas.us",Sony Canal Novelas
|
||||
https://a89829b8dca2471ab52ea9a57bc28a35.mediatailor.us-east-1.amazonaws.com/v1/master/0fb304b2320b25f067414d481a779b77db81760d/CanelaTV_SonyCanalNovelas/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="",Tierra De Amor Y Venganza
|
||||
https://stream.ads.ottera.tv/playlist.m3u8?network_id=1080
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#EXTM3U
|
||||
#EXTINF:-1 tvg-id="",ALF
|
||||
#EXTINF:-1 tvg-id="ALF.us",ALF
|
||||
https://97bd5884f7a348aa93b50e48d031be0e.mediatailor.us-east-1.amazonaws.com/v1/master/f4e8c53a8367a5b58e20ce054ea3ce25a3e904d3/ONO_ALF/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="AsianCrush.us",AsianCrush
|
||||
https://amg01201-cinedigmenterta-asiancrush-cineverse-x701o.amagi.tv/playlist/amg01201-cinedigmenterta-asiancrush-cineverse/playlist.m3u8
|
||||
@@ -13,9 +13,9 @@ https://amg01201-cinedigmenterta-crimehunters-cineverse-cnqvb.amagi.tv/playlist/
|
||||
https://cdn-uw2-prod.tsv2.amagi.tv/linear/amg01201-cinedigmenterta-docurama-cineverse/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="DoveChannel.us",Dove Channel
|
||||
https://amg01201-cinedigmenterta-dove-cineverse-1fck5.amagi.tv/playlist/amg01201-cinedigmenterta-dove-cineverse/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="",El Rey Network
|
||||
#EXTINF:-1 tvg-id="ElRey.us",El Rey Network
|
||||
https://cdn-uw2-prod.tsv2.amagi.tv/linear/amg01201-cinedigmenterta-elrey-cineverse/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="",Farscape
|
||||
#EXTINF:-1 tvg-id="Farscape.us",Farscape
|
||||
https://a8d3367c658948afb1901efdd9babe5b.mediatailor.us-east-1.amazonaws.com/v1/master/f4e8c53a8367a5b58e20ce054ea3ce25a3e904d3/ONO_Farscape/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="GustoTV.us",GustoTV
|
||||
https://amg01077-gustoworldwidem-gustotv-cineverse-h7u1r.amagi.tv/playlist/amg01077-gustoworldwidem-gustotv-cineverse/playlist.m3u8
|
||||
@@ -39,19 +39,19 @@ https://cdn-uw2-prod.tsv2.amagi.tv/linear/amg01201-cinedigmenterta-retrocrush-lg
|
||||
https://b1570a6919f94bcfa2f061daee64c70f.mediatailor.us-east-1.amazonaws.com/v1/master/04fd913bb278d8775298c26fdca9d9841f37601f/ONO_ScreamFactoryTV/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="ShoutFactoryTV.us",Shout Factory TV
|
||||
https://amg00163-shoutfactory-shoutfactory-dmr-maeqc.amagi.tv/playlist/amg00163-shoutfactory-shoutfactory-dmr/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="",Shout! Cult
|
||||
#EXTINF:-1 tvg-id="ShoutCult.us",Shout! Cult
|
||||
https://837dd61e3fed471fbbe33391a57920d4.mediatailor.us-east-1.amazonaws.com/v1/master/f4e8c53a8367a5b58e20ce054ea3ce25a3e904d3/ONO_ShoutCult/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="SoReal.us",So...Real
|
||||
https://cdn-uw2-prod.tsv2.amagi.tv/linear/amg01201-cinedigmenterta-soreal-cineverse/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="TheBobRossChannel.us",The Bob Ross Channel
|
||||
https://cdn-uw2-prod.tsv2.amagi.tv/linear/amg01201-cinedigmenterta-bobross-cineverse/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="",The Bob Ross Channel Spanish
|
||||
#EXTINF:-1 tvg-id="TheBobRossChannelenEspanol.us",The Bob Ross Channel Spanish
|
||||
https://cdn-uw2-prod.tsv2.amagi.tv/linear/amg01201-cinedigmenterta-bobrossspanish-lgus/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="TheCarolBurnettShow.us",The Carol Burnett Show
|
||||
https://amg00163-shoutfactory-carolburnett-dmr-cpk9r.amagi.tv/playlist/amg00163-shoutfactory-carolburnett-dmr/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="TheCountryNetwork.us",The Country Network
|
||||
https://cdn-uw2-prod.tsv2.amagi.tv/linear/amg01201-cinedigmenterta-countrynetwork-cineverse/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="",The Elvis Channel
|
||||
#EXTINF:-1 tvg-id="TheElvisPresleyChannel.us",The Elvis Presley Channel
|
||||
https://cdn-uw2-prod.tsv2.amagi.tv/linear/amg01201-cinedigmenterta-elvis-cineverse/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="TheFilmDetective.us",The Film Detective
|
||||
https://cdn-uw2-prod.tsv2.amagi.tv/linear/amg01201-cinedigmenterta-filmdetective-cineverse/playlist.m3u8
|
||||
|
||||
@@ -1,33 +0,0 @@
|
||||
#EXTM3U
|
||||
#EXTINF:-1 tvg-id="",Crime and Thrillers
|
||||
https://topic-crimeandthrillers-1-us.freemoviesplus.wurl.tv/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="",Ditty TV
|
||||
https://memphisstudios-dittytv-1-eu.freemoviesplus.wurl.tv/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="",Food
|
||||
https://food-us.freemoviesplus.wurl.tv/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="",Glory Kick Boxing
|
||||
https://glorykickboxing-glorykickboxing-1-eu.freemoviesplus.wurl.tv/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="",Intipacha
|
||||
https://bonudiemsa-intipacha-2-eu.freemoviesplus.wurl.tv/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="",Just for Laughs Gags
|
||||
https://distributionsjustepourrire-justforlaughsgags-1-eu.freemoviesplus.wurl.tv/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="",Nosey 2
|
||||
https://nosey-2-us.freemoviesplus.wurl.tv/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="",Pecan
|
||||
https://bold-tv-corp-pecan-tv-1-eu.freemoviesplus.wurl.tv/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="",Pelimex
|
||||
https://telecine-pelimex-1-eu.freemoviesplus.wurl.tv/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="",Real Nosey
|
||||
https://nosey-realnosey-1-us.freemoviesplus.wurl.tv/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="",Space Science Now
|
||||
https://magellan-space-science-now-1-us.freemoviesplus.wurl.tv/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="",Todays Homeowner
|
||||
https://janson-todayshomeowner-1-us.freemoviesplus.wurl.tv/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="",True Crime Now
|
||||
https://alliantcontent-truecrimenow-1-us.freemoviesplus.wurl.tv/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="",Vintage TV
|
||||
https://chestnut-vintagetv-1-us.freemoviesplus.wurl.tv/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="",War and Military Now
|
||||
https://alliantcontent-warandmilitarynow-1-us.freemoviesplus.wurl.tv/playlist.m3u8
|
||||
#EXTINF:-1 tvg-id="",WatchMojo
|
||||
https://watchmojo-1-eu.freemoviesplus.wurl.tv/playlist.m3u8
|
||||
@@ -595,8 +595,6 @@ https://reflect-tampa-bay-community.cablecast.tv/live-16/live/live.m3u8
|
||||
https://reflect-temecula.cablecast.tv/live-2/live/live.m3u8
|
||||
#EXTINF:-1 tvg-id="Tempe11.us",Tempe Channel 11
|
||||
https://cdn3.wowza.com/5/cFh0V0QwUVc4SDl2/tempe/G0355_003/chunklist.m3u8
|
||||
#EXTINF:-1 tvg-id="TUTV.us",Temple University TV (tutv) (720p)
|
||||
https://templeuni.secure.footprint.net/egress/bhandler/templeuni/streama/manifest.m3u8
|
||||
#EXTINF:-1 tvg-id="WCWNDT1.us",The CW (WCWN-DT1) Albamy NY (1080p)
|
||||
https://16live00.akamaized.net/CW/index.m3u8
|
||||
#EXTINF:-1 tvg-id="WJACDT4.us",The CW Altoona PA (WJAC4) (720p)
|
||||
|
||||
@@ -215,8 +215,6 @@ https://wsredt.lls.pbs.org/out/v1/d615170d96024c229c6ae2177dec84e5/index.m3u8
|
||||
https://wtvpdt.lls.pbs.org/out/v1/9e8f6bfce87a437d8a8a9aab016421e8/index.m3u8
|
||||
#EXTINF:-1 tvg-id="WHYYDT1.us",PBS Philadelphia PA (WHYY-DT1) (1080p)
|
||||
https://whyydt.lls.pbs.org/out/v1/40b7857a84ee4302be8ab755a719cc14/index.m3u8
|
||||
#EXTINF:-1 tvg-id="KAETDT1.us",PBS Phoenix AZ (KAET) (1080p)
|
||||
https://kaetdt.lls.pbs.org/out/v1/259f25e61b3d47ce8a7e2339a00c5561/index.m3u8
|
||||
#EXTINF:-1 tvg-id="WQEDDT1.us",PBS Pittsburgh PA (WQED) (1080p)
|
||||
https://wqeddt.lls.pbs.org/out/v1/1f10d52cea0f45ae88184800e9e6b79e/index.m3u8
|
||||
#EXTINF:-1 tvg-id="WCFEDT1.us",PBS Plattsburgh NY (WCFE) (1080p)
|
||||
|
||||
@@ -1,41 +0,0 @@
|
||||
#EXTM3U
|
||||
#EXTINF:-1 tvg-id="",2A Network (720p)
|
||||
https://simultv.s.llnwi.net/n4s4/2ANetwork/interlink.m3u8
|
||||
#EXTINF:-1 tvg-id="",Cowboy Theater (720p)
|
||||
https://simultv.s.llnwi.net/o054/CowboyTheater/interlink.m3u8
|
||||
#EXTINF:-1 tvg-id="",Cut Up N Cook (720p)
|
||||
https://simultv.s.llnwi.net/n4s4/CutUpNCook/interlink.m3u8
|
||||
#EXTINF:-1 tvg-id="",Dimensions
|
||||
https://simultv.s.llnwi.net/o054/Dimensions/interlink.m3u8
|
||||
#EXTINF:-1 tvg-id="",Funnybone (720p)
|
||||
https://simultv.s.llnwi.net/o054/FunnyBone/interlink.m3u8
|
||||
#EXTINF:-1 tvg-id="KartoonCircus.us",Kartoon Circus
|
||||
https://simultv.s.llnwi.net/o062/KartoonCircus/interlink.m3u8
|
||||
#EXTINF:-1 tvg-id="KartoonCircus.us",Kartoon Circus (720p)
|
||||
https://simultv.s.llnwi.net/n4s4/KartoonCircus/interlink.m3u8
|
||||
#EXTINF:-1 tvg-id="",Kid Central (720p)
|
||||
https://simultv.s.llnwi.net/o058/KidCentral/interlink.m3u8
|
||||
#EXTINF:-1 tvg-id="Lifestyle.us",Lifestyle
|
||||
https://simultv.s.llnwi.net/o058/Lifestyle/interlink.m3u8
|
||||
#EXTINF:-1 tvg-id="",Military Home Life (720p)
|
||||
https://simultv.s.llnwi.net/n4s4/MilitaryHomeLife/interlink.m3u8
|
||||
#EXTINF:-1 tvg-id="Mythos.us",Mythos
|
||||
https://simultv.s.llnwi.net/o058/Mythos/interlink.m3u8
|
||||
#EXTINF:-1 tvg-id="PrimeTimeDrama.us",Prime Time Drama
|
||||
https://simultv.s.llnwi.net/o064/PrimeTimeDrama/interlink.m3u8
|
||||
#EXTINF:-1 tvg-id="",Providence Christian Network
|
||||
https://simultv.s.llnwi.net/n4s4/ProvidenceNetwork/interlink.m3u8
|
||||
#EXTINF:-1 tvg-id="",Ready Set Action (720p)
|
||||
https://simultv.s.llnwi.net/o059/ReadySetAction/interlink.m3u8
|
||||
#EXTINF:-1 tvg-id="",Slap Tech
|
||||
https://simultv.s.llnwi.net/o061/SlapTech/interlink.m3u8
|
||||
#EXTINF:-1 tvg-id="SpydarTV.us",Spydar
|
||||
https://simultv.s.llnwi.net/o062/Spydar/interlink.m3u8
|
||||
#EXTINF:-1 tvg-id="SpydarTV.us",Spydar TV (720p)
|
||||
https://simultv.s.llnwi.net/n4s4/Spydar/interlink.m3u8
|
||||
#EXTINF:-1 tvg-id="",Switch (720p)
|
||||
https://simultv.s.llnwi.net/o062/Switch/interlink.m3u8
|
||||
#EXTINF:-1 tvg-id="Xcorps.us",Xcorps (720p)
|
||||
https://simultv.s.llnwi.net/n4s4/xcorps/interlink.m3u8
|
||||
#EXTINF:-1 tvg-id="",XZone (720p)
|
||||
https://simultv.s.llnwi.net/o060/xzone/interlink.m3u8
|
||||
81
tests/__data__/input/issues/broken_stream.js
Normal file
81
tests/__data__/input/issues/broken_stream.js
Normal file
@@ -0,0 +1,81 @@
|
||||
module.exports = [
|
||||
{
|
||||
url: 'https://api.github.com/repos/iptv-org/iptv/issues/14140',
|
||||
repository_url: 'https://api.github.com/repos/iptv-org/iptv',
|
||||
labels_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14140/labels{/name}',
|
||||
comments_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14140/comments',
|
||||
events_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14140/events',
|
||||
html_url: 'https://github.com/iptv-org/iptv/issues/14140',
|
||||
id: 1881649602,
|
||||
node_id: 'I_kwDOCWUK8M5wJ7HC',
|
||||
number: 14140,
|
||||
title: 'Broken: RIK HD Cyprus',
|
||||
user: {
|
||||
login: 'ROBGagn',
|
||||
id: 124619576,
|
||||
node_id: 'U_kgDOB22LOA',
|
||||
avatar_url: 'https://avatars.githubusercontent.com/u/124619576?v=4',
|
||||
gravatar_id: '',
|
||||
url: 'https://api.github.com/users/ROBGagn',
|
||||
html_url: 'https://github.com/ROBGagn',
|
||||
followers_url: 'https://api.github.com/users/ROBGagn/followers',
|
||||
following_url: 'https://api.github.com/users/ROBGagn/following{/other_user}',
|
||||
gists_url: 'https://api.github.com/users/ROBGagn/gists{/gist_id}',
|
||||
starred_url: 'https://api.github.com/users/ROBGagn/starred{/owner}{/repo}',
|
||||
subscriptions_url: 'https://api.github.com/users/ROBGagn/subscriptions',
|
||||
organizations_url: 'https://api.github.com/users/ROBGagn/orgs',
|
||||
repos_url: 'https://api.github.com/users/ROBGagn/repos',
|
||||
events_url: 'https://api.github.com/users/ROBGagn/events{/privacy}',
|
||||
received_events_url: 'https://api.github.com/users/ROBGagn/received_events',
|
||||
type: 'User',
|
||||
site_admin: false
|
||||
},
|
||||
labels: [
|
||||
{
|
||||
id: 1707513547,
|
||||
node_id: 'MDU6TGFiZWwxNzA3NTEzNTQ3',
|
||||
url: 'https://api.github.com/repos/iptv-org/iptv/labels/broken%20stream',
|
||||
name: 'broken stream',
|
||||
color: 'FBCA04',
|
||||
default: false,
|
||||
description: 'Stream is not working properly'
|
||||
},
|
||||
{
|
||||
id: 3241837512,
|
||||
node_id: 'MDU6TGFiZWwzMjQxODM3NTEy',
|
||||
url: 'https://api.github.com/repos/iptv-org/iptv/labels/CY',
|
||||
name: 'CY',
|
||||
color: '90FA7B',
|
||||
default: false,
|
||||
description: 'Cyprus'
|
||||
}
|
||||
],
|
||||
state: 'open',
|
||||
locked: false,
|
||||
assignee: null,
|
||||
assignees: [],
|
||||
milestone: null,
|
||||
comments: 0,
|
||||
created_at: '2023-09-05T10:09:04Z',
|
||||
updated_at: '2023-09-07T00:50:06Z',
|
||||
closed_at: null,
|
||||
author_association: 'NONE',
|
||||
active_lock_reason: null,
|
||||
body: '### Broken Link\n\nhttp://l6.cloudskep.com/rikcy/rikhd/playlist.m3u8\n\n### What happened to the stream?\n\nNot loading\n\n### Possible Replacement (optional)\n\nhttp://l6.cloudskep.com/rikcy/rikhd/playlist2.m3u8\n\n### Notes (optional)\n\nToken needed...\r\nSame issue with RIK 1 and 2. May happen in the future with ANT1 Cyprus, Sigma and Omega.\n\n### Contributing Guide\n\n- [X] I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md)',
|
||||
reactions: {
|
||||
url: 'https://api.github.com/repos/iptv-org/iptv/issues/14140/reactions',
|
||||
total_count: 0,
|
||||
'+1': 0,
|
||||
'-1': 0,
|
||||
laugh: 0,
|
||||
hooray: 0,
|
||||
confused: 0,
|
||||
heart: 0,
|
||||
rocket: 0,
|
||||
eyes: 0
|
||||
},
|
||||
timeline_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14140/timeline',
|
||||
performed_via_github_app: null,
|
||||
state_reason: null
|
||||
}
|
||||
]
|
||||
@@ -1,4 +1,4 @@
|
||||
export default [
|
||||
module.exports = [
|
||||
{
|
||||
url: 'https://api.github.com/repos/iptv-org/iptv/issues/14179',
|
||||
repository_url: 'https://api.github.com/repos/iptv-org/iptv',
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
export default [
|
||||
module.exports = [
|
||||
{
|
||||
url: 'https://api.github.com/repos/iptv-org/iptv/issues/14179',
|
||||
repository_url: 'https://api.github.com/repos/iptv-org/iptv',
|
||||
|
||||
160
tests/__data__/input/issues/streams_edit.js
Normal file
160
tests/__data__/input/issues/streams_edit.js
Normal file
@@ -0,0 +1,160 @@
|
||||
module.exports = [
|
||||
{
|
||||
url: 'https://api.github.com/repos/iptv-org/iptv/issues/14110',
|
||||
repository_url: 'https://api.github.com/repos/iptv-org/iptv',
|
||||
labels_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14110/labels{/name}',
|
||||
comments_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14110/comments',
|
||||
events_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14110/events',
|
||||
html_url: 'https://github.com/iptv-org/iptv/issues/14110',
|
||||
id: 1884922249,
|
||||
node_id: 'I_kwDOCWUK8M5wWaGJ',
|
||||
number: 14110,
|
||||
title: 'Edit: Tele2000',
|
||||
user: {
|
||||
login: 'freearhey',
|
||||
id: 7253922,
|
||||
node_id: 'MDQ6VXNlcjcyNTM5MjI=',
|
||||
avatar_url: 'https://avatars.githubusercontent.com/u/7253922?v=4',
|
||||
gravatar_id: '',
|
||||
url: 'https://api.github.com/users/freearhey',
|
||||
html_url: 'https://github.com/freearhey',
|
||||
followers_url: 'https://api.github.com/users/freearhey/followers',
|
||||
following_url: 'https://api.github.com/users/freearhey/following{/other_user}',
|
||||
gists_url: 'https://api.github.com/users/freearhey/gists{/gist_id}',
|
||||
starred_url: 'https://api.github.com/users/freearhey/starred{/owner}{/repo}',
|
||||
subscriptions_url: 'https://api.github.com/users/freearhey/subscriptions',
|
||||
organizations_url: 'https://api.github.com/users/freearhey/orgs',
|
||||
repos_url: 'https://api.github.com/users/freearhey/repos',
|
||||
events_url: 'https://api.github.com/users/freearhey/events{/privacy}',
|
||||
received_events_url: 'https://api.github.com/users/freearhey/received_events',
|
||||
type: 'User',
|
||||
site_admin: false
|
||||
},
|
||||
labels: [
|
||||
{
|
||||
id: 5923498886,
|
||||
node_id: 'LA_kwDOCWUK8M8AAAABYRFrhg',
|
||||
url: 'https://api.github.com/repos/iptv-org/iptv/labels/approved',
|
||||
name: 'approved',
|
||||
color: '85ddde',
|
||||
default: false,
|
||||
description: ''
|
||||
},
|
||||
{
|
||||
id: 5923508587,
|
||||
node_id: 'LA_kwDOCWUK8M8AAAABYRGRaw',
|
||||
url: 'https://api.github.com/repos/iptv-org/iptv/labels/streams:add',
|
||||
name: 'streams:edit',
|
||||
color: '017ff9',
|
||||
default: false,
|
||||
description: 'Request to add a new link to a playlist'
|
||||
}
|
||||
],
|
||||
state: 'open',
|
||||
locked: false,
|
||||
assignee: null,
|
||||
assignees: [],
|
||||
milestone: null,
|
||||
comments: 1,
|
||||
created_at: '2023-09-07T00:30:51Z',
|
||||
updated_at: '2023-09-07T00:48:23Z',
|
||||
closed_at: null,
|
||||
author_association: 'COLLABORATOR',
|
||||
active_lock_reason: null,
|
||||
body: '### Stream URL\n\nhttps://servilive.com:3126/live/tele2000live.m3u8\n\n### Channel ID\n\nBBCAmericaEast.us\n\n### Channel Name\n\nBBC America\n\n### Quality\n\n720p\n\n### Label\n\nGeo-blocked\n\n### HTTP User-Agent\n\nMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36 Edge/12.246\n\n### HTTP Referrer\n\n_No response_\n\n### Notes\n\n_No response_\n\n### Contributing Guide\n\n- [X] I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md)',
|
||||
reactions: {
|
||||
url: 'https://api.github.com/repos/iptv-org/iptv/issues/14110/reactions',
|
||||
total_count: 0,
|
||||
'+1': 0,
|
||||
'-1': 0,
|
||||
laugh: 0,
|
||||
hooray: 0,
|
||||
confused: 0,
|
||||
heart: 0,
|
||||
rocket: 0,
|
||||
eyes: 0
|
||||
},
|
||||
timeline_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14110/timeline',
|
||||
performed_via_github_app: null,
|
||||
state_reason: null
|
||||
},
|
||||
{
|
||||
url: 'https://api.github.com/repos/iptv-org/iptv/issues/14120',
|
||||
repository_url: 'https://api.github.com/repos/iptv-org/iptv',
|
||||
labels_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14120/labels{/name}',
|
||||
comments_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14120/comments',
|
||||
events_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14120/events',
|
||||
html_url: 'https://github.com/iptv-org/iptv/issues/14120',
|
||||
id: 1884922249,
|
||||
node_id: 'I_kwDOCWUK8M5wWaGJ',
|
||||
number: 14120,
|
||||
title: 'Edit: Tele2000',
|
||||
user: {
|
||||
login: 'freearhey',
|
||||
id: 7253922,
|
||||
node_id: 'MDQ6VXNlcjcyNTM5MjI=',
|
||||
avatar_url: 'https://avatars.githubusercontent.com/u/7253922?v=4',
|
||||
gravatar_id: '',
|
||||
url: 'https://api.github.com/users/freearhey',
|
||||
html_url: 'https://github.com/freearhey',
|
||||
followers_url: 'https://api.github.com/users/freearhey/followers',
|
||||
following_url: 'https://api.github.com/users/freearhey/following{/other_user}',
|
||||
gists_url: 'https://api.github.com/users/freearhey/gists{/gist_id}',
|
||||
starred_url: 'https://api.github.com/users/freearhey/starred{/owner}{/repo}',
|
||||
subscriptions_url: 'https://api.github.com/users/freearhey/subscriptions',
|
||||
organizations_url: 'https://api.github.com/users/freearhey/orgs',
|
||||
repos_url: 'https://api.github.com/users/freearhey/repos',
|
||||
events_url: 'https://api.github.com/users/freearhey/events{/privacy}',
|
||||
received_events_url: 'https://api.github.com/users/freearhey/received_events',
|
||||
type: 'User',
|
||||
site_admin: false
|
||||
},
|
||||
labels: [
|
||||
{
|
||||
id: 5923498886,
|
||||
node_id: 'LA_kwDOCWUK8M8AAAABYRFrhg',
|
||||
url: 'https://api.github.com/repos/iptv-org/iptv/labels/approved',
|
||||
name: 'approved',
|
||||
color: '85ddde',
|
||||
default: false,
|
||||
description: ''
|
||||
},
|
||||
{
|
||||
id: 5923508587,
|
||||
node_id: 'LA_kwDOCWUK8M8AAAABYRGRaw',
|
||||
url: 'https://api.github.com/repos/iptv-org/iptv/labels/streams:add',
|
||||
name: 'streams:edit',
|
||||
color: '017ff9',
|
||||
default: false,
|
||||
description: 'Request to add a new link to a playlist'
|
||||
}
|
||||
],
|
||||
state: 'open',
|
||||
locked: false,
|
||||
assignee: null,
|
||||
assignees: [],
|
||||
milestone: null,
|
||||
comments: 1,
|
||||
created_at: '2023-09-07T00:30:51Z',
|
||||
updated_at: '2023-09-07T00:48:23Z',
|
||||
closed_at: null,
|
||||
author_association: 'COLLABORATOR',
|
||||
active_lock_reason: null,
|
||||
body: '### Stream URL\n\nhttps://livestream.telvue.com/templeuni1/f7b44cfafd5c52223d5498196c8a2e7b.sdp/playlist.m3u8\n\n### Channel ID\n\nboo.us\n\n### Channel Name\n\nBBC America\n\n### Quality\n\n720p\n\n### Label\n\nGeo-blocked\n\n### HTTP User-Agent\n\nMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36 Edge/12.246\n\n### HTTP Referrer\n\n_No response_\n\n### Notes\n\n_No response_\n\n### Contributing Guide\n\n- [X] I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md)',
|
||||
reactions: {
|
||||
url: 'https://api.github.com/repos/iptv-org/iptv/issues/14120/reactions',
|
||||
total_count: 0,
|
||||
'+1': 0,
|
||||
'-1': 0,
|
||||
laugh: 0,
|
||||
hooray: 0,
|
||||
confused: 0,
|
||||
heart: 0,
|
||||
rocket: 0,
|
||||
eyes: 0
|
||||
},
|
||||
timeline_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14120/timeline',
|
||||
performed_via_github_app: null,
|
||||
state_reason: null
|
||||
}
|
||||
]
|
||||
@@ -1,4 +1,4 @@
|
||||
export default [
|
||||
module.exports = [
|
||||
{
|
||||
url: 'https://api.github.com/repos/iptv-org/iptv/issues/14110',
|
||||
repository_url: 'https://api.github.com/repos/iptv-org/iptv',
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
export default [
|
||||
module.exports = [
|
||||
{
|
||||
url: 'https://api.github.com/repos/iptv-org/iptv/issues/14151',
|
||||
repository_url: 'https://api.github.com/repos/iptv-org/iptv',
|
||||
|
||||
@@ -4,14 +4,14 @@ import fs from 'fs-extra'
|
||||
beforeEach(() => {
|
||||
fs.emptyDirSync('tests/__data__/output')
|
||||
|
||||
const stdout = execSync(
|
||||
execSync(
|
||||
'STREAMS_DIR=tests/__data__/input/streams_generate API_DIR=tests/__data__/output/.api npm run api:generate',
|
||||
{ encoding: 'utf8' }
|
||||
)
|
||||
})
|
||||
|
||||
it('can create streams.json', () => {
|
||||
expect(content(`output/.api/streams.json`)).toMatchObject(content(`expected/.api/streams.json`))
|
||||
expect(content('output/.api/streams.json')).toMatchObject(content('expected/.api/streams.json'))
|
||||
})
|
||||
|
||||
function content(filepath: string) {
|
||||
|
||||
@@ -8,7 +8,7 @@ beforeEach(() => {
|
||||
})
|
||||
|
||||
it('can format playlists', () => {
|
||||
const stdout = execSync('STREAMS_DIR=tests/__data__/output/streams npm run playlist:format', {
|
||||
execSync('STREAMS_DIR=tests/__data__/output/streams npm run playlist:format', {
|
||||
encoding: 'utf8'
|
||||
})
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@ import * as glob from 'glob'
|
||||
beforeEach(() => {
|
||||
fs.emptyDirSync('tests/__data__/output')
|
||||
|
||||
const stdout = execSync(
|
||||
execSync(
|
||||
'STREAMS_DIR=tests/__data__/input/streams_generate DATA_DIR=tests/__data__/input/data PUBLIC_DIR=tests/__data__/output/.gh-pages LOGS_DIR=tests/__data__/output/logs npm run playlist:generate',
|
||||
{ encoding: 'utf8' }
|
||||
)
|
||||
@@ -20,8 +20,8 @@ it('can generate playlists and logs', () => {
|
||||
expect(content(`output/${filepath}`), filepath).toBe(content(`expected/${filepath}`))
|
||||
})
|
||||
|
||||
expect(content(`output/logs/generators.log`).split('\n').sort()).toStrictEqual(
|
||||
content(`expected/logs/generators.log`).split('\n').sort()
|
||||
expect(content('output/logs/generators.log').split('\n').sort()).toStrictEqual(
|
||||
content('expected/logs/generators.log').split('\n').sort()
|
||||
)
|
||||
})
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@ beforeEach(() => {
|
||||
|
||||
it('can format playlists', () => {
|
||||
const stdout = execSync(
|
||||
'DEBUG=true DATA_DIR=tests/__data__/input/data STREAMS_DIR=tests/__data__/output/streams npm run playlist:update --silent',
|
||||
'DATA_DIR=tests/__data__/input/data STREAMS_DIR=tests/__data__/output/streams npm run playlist:update --silent',
|
||||
{
|
||||
encoding: 'utf8'
|
||||
}
|
||||
@@ -26,7 +26,7 @@ it('can format playlists', () => {
|
||||
})
|
||||
|
||||
expect(stdout).toBe(
|
||||
`OUTPUT=closes #14151, closes #14140, closes #14139, closes #14110, closes #14179, closes #14178\n`
|
||||
'OUTPUT=closes #14151, closes #14140, closes #14139, closes #14110, closes #14179, closes #14178\n'
|
||||
)
|
||||
})
|
||||
|
||||
|
||||
@@ -10,11 +10,13 @@ it('show an error if channel name in the blocklist', () => {
|
||||
)
|
||||
console.log(stdout)
|
||||
process.exit(1)
|
||||
} catch (error: any) {
|
||||
} catch (error: unknown) {
|
||||
// @ts-ignore
|
||||
expect(error.status).toBe(1)
|
||||
expect(
|
||||
// @ts-ignore
|
||||
error.stdout.includes(
|
||||
`us_blocked.m3u\n 2 error "Fox Sports 2 Asia (Thai)" is on the blocklist due to claims of copyright holders (https://github.com/iptv-org/iptv/issues/0000)\n\n1 problems (1 errors, 0 warnings)\n`
|
||||
'us_blocked.m3u\n 2 error "Fox Sports 2 Asia (Thai)" is on the blocklist due to claims of copyright holders (https://github.com/iptv-org/iptv/issues/0000)\n\n1 problems (1 errors, 0 warnings)\n'
|
||||
)
|
||||
).toBe(true)
|
||||
}
|
||||
@@ -30,7 +32,7 @@ it('show a warning if channel has wrong id', () => {
|
||||
|
||||
expect(
|
||||
stdout.includes(
|
||||
`wrong_id.m3u\n 2 warning "qib22lAq1L.us" is not in the database\n\n1 problems (0 errors, 1 warnings)\n`
|
||||
'wrong_id.m3u\n 2 warning "qib22lAq1L.us" is not in the database\n\n1 problems (0 errors, 1 warnings)\n'
|
||||
)
|
||||
).toBe(true)
|
||||
})
|
||||
|
||||
@@ -14,7 +14,7 @@ beforeEach(() => {
|
||||
'tests/__data__/output/.readme/template.md'
|
||||
)
|
||||
|
||||
const stdout = execSync(
|
||||
execSync(
|
||||
'DATA_DIR=tests/__data__/input/data LOGS_DIR=tests/__data__/input/logs README_DIR=tests/__data__/output/.readme npm run readme:update',
|
||||
{ encoding: 'utf8' }
|
||||
)
|
||||
|
||||
@@ -10,14 +10,17 @@ it('can create report', () => {
|
||||
|
||||
expect(
|
||||
stdout.includes(`
|
||||
┌─────────┬─────────────┬───────────────────┬──────────────┐
|
||||
│ (index) │ issueNumber │ channelId │ status │
|
||||
├─────────┼─────────────┼───────────────────┼──────────────┤
|
||||
│ 0 │ 14179 │ 'ManoramaNews.in' │ 'pending' │
|
||||
│ 1 │ 14178 │ 'TV3.my' │ 'blocked' │
|
||||
│ 2 │ 14177 │ 'TUTV.us' │ 'fullfilled' │
|
||||
│ 3 │ 14176 │ 'ManoramaNews.in' │ 'duplicate' │
|
||||
│ 4 │ 14175 │ 'TFX.fr' │ 'invalid_id' │
|
||||
└─────────┴─────────────┴───────────────────┴──────────────┘`)
|
||||
┌─────────┬─────────────┬─────────────────┬─────────────────────┬────────────────┐
|
||||
│ (index) │ issueNumber │ type │ channelId │ status │
|
||||
├─────────┼─────────────┼─────────────────┼─────────────────────┼────────────────┤
|
||||
│ 0 │ 14110 │ 'streams:edit' │ 'BBCAmericaEast.us' │ 'invalid_link' │
|
||||
│ 1 │ 14120 │ 'streams:edit' │ 'boo.us' │ 'invalid_id' │
|
||||
│ 2 │ 14140 │ 'broken stream' │ undefined │ 'invalid_link' │
|
||||
│ 3 │ 14175 │ 'streams:add' │ 'TFX.fr' │ 'invalid_id' │
|
||||
│ 4 │ 14176 │ 'streams:add' │ 'ManoramaNews.in' │ 'duplicate' │
|
||||
│ 5 │ 14177 │ 'streams:add' │ 'TUTV.us' │ 'fullfilled' │
|
||||
│ 6 │ 14178 │ 'streams:add' │ 'TV3.my' │ 'blocked' │
|
||||
│ 7 │ 14179 │ 'streams:add' │ 'ManoramaNews.in' │ 'pending' │
|
||||
└─────────┴─────────────┴─────────────────┴─────────────────────┴────────────────┘`)
|
||||
).toBe(true)
|
||||
})
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"strict": true,
|
||||
"target": "es2022",
|
||||
"module": "NodeNext",
|
||||
"moduleResolution": "NodeNext",
|
||||
"target": "es2020",
|
||||
"module": "nodeNext",
|
||||
"moduleResolution": "nodeNext",
|
||||
"typeRoots": [
|
||||
"./scripts/types",
|
||||
"./node_modules/@types"
|
||||
|
||||
660
yarn.lock
660
yarn.lock
@@ -2,6 +2,11 @@
|
||||
# yarn lockfile v1
|
||||
|
||||
|
||||
"@aashutoshrathi/word-wrap@^1.2.3":
|
||||
version "1.2.6"
|
||||
resolved "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz"
|
||||
integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==
|
||||
|
||||
"@ampproject/remapping@^2.0.0":
|
||||
version "2.1.1"
|
||||
resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.1.tgz"
|
||||
@@ -301,6 +306,71 @@
|
||||
dependencies:
|
||||
"@jridgewell/trace-mapping" "0.3.9"
|
||||
|
||||
"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0":
|
||||
version "4.4.0"
|
||||
resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz"
|
||||
integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==
|
||||
dependencies:
|
||||
eslint-visitor-keys "^3.3.0"
|
||||
|
||||
"@eslint-community/regexpp@^4.5.1", "@eslint-community/regexpp@^4.6.1":
|
||||
version "4.8.1"
|
||||
resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.1.tgz"
|
||||
integrity sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ==
|
||||
|
||||
"@eslint/eslintrc@^2.1.2":
|
||||
version "2.1.2"
|
||||
resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz"
|
||||
integrity sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==
|
||||
dependencies:
|
||||
ajv "^6.12.4"
|
||||
debug "^4.3.2"
|
||||
espree "^9.6.0"
|
||||
globals "^13.19.0"
|
||||
ignore "^5.2.0"
|
||||
import-fresh "^3.2.1"
|
||||
js-yaml "^4.1.0"
|
||||
minimatch "^3.1.2"
|
||||
strip-json-comments "^3.1.1"
|
||||
|
||||
"@eslint/js@8.49.0":
|
||||
version "8.49.0"
|
||||
resolved "https://registry.npmjs.org/@eslint/js/-/js-8.49.0.tgz"
|
||||
integrity sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==
|
||||
|
||||
"@freearhey/core@^0.1.2":
|
||||
version "0.1.2"
|
||||
resolved "https://registry.npmjs.org/@freearhey/core/-/core-0.1.2.tgz"
|
||||
integrity sha512-o6FaLHiKED0JkUXxqHcUUM2P+Jd4kvE96p0MZlLjhCFAPii/lVr5mTwrHehKMzve/r7AbDUX7kyNLNG8Qec6uw==
|
||||
dependencies:
|
||||
"@types/fs-extra" "^11.0.2"
|
||||
"@types/lodash" "^4.14.198"
|
||||
fs-extra "^11.1.1"
|
||||
glob "^10.3.4"
|
||||
lodash "^4.17.21"
|
||||
natural-orderby "^3.0.2"
|
||||
normalize-url "^6.1.0"
|
||||
signale "^1.4.0"
|
||||
|
||||
"@humanwhocodes/config-array@^0.11.11":
|
||||
version "0.11.11"
|
||||
resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz"
|
||||
integrity sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==
|
||||
dependencies:
|
||||
"@humanwhocodes/object-schema" "^1.2.1"
|
||||
debug "^4.1.1"
|
||||
minimatch "^3.0.5"
|
||||
|
||||
"@humanwhocodes/module-importer@^1.0.1":
|
||||
version "1.0.1"
|
||||
resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz"
|
||||
integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==
|
||||
|
||||
"@humanwhocodes/object-schema@^1.2.1":
|
||||
version "1.2.1"
|
||||
resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz"
|
||||
integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==
|
||||
|
||||
"@isaacs/cliui@^8.0.2":
|
||||
version "8.0.2"
|
||||
resolved "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz"
|
||||
@@ -555,6 +625,27 @@
|
||||
"@jridgewell/resolve-uri" "^3.1.0"
|
||||
"@jridgewell/sourcemap-codec" "^1.4.14"
|
||||
|
||||
"@nodelib/fs.scandir@2.1.5":
|
||||
version "2.1.5"
|
||||
resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz"
|
||||
integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==
|
||||
dependencies:
|
||||
"@nodelib/fs.stat" "2.0.5"
|
||||
run-parallel "^1.1.9"
|
||||
|
||||
"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5":
|
||||
version "2.0.5"
|
||||
resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz"
|
||||
integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
|
||||
|
||||
"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8":
|
||||
version "1.2.8"
|
||||
resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz"
|
||||
integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==
|
||||
dependencies:
|
||||
"@nodelib/fs.scandir" "2.1.5"
|
||||
fastq "^1.6.0"
|
||||
|
||||
"@octokit/auth-token@^3.0.0":
|
||||
version "3.0.4"
|
||||
resolved "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.4.tgz"
|
||||
@@ -742,10 +833,10 @@
|
||||
dependencies:
|
||||
"@babel/types" "^7.20.7"
|
||||
|
||||
"@types/fs-extra@^11.0.1":
|
||||
version "11.0.1"
|
||||
resolved "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.1.tgz"
|
||||
integrity sha512-MxObHvNl4A69ofaTRU8DFqvgzzv8s9yRtaPPm5gud9HDNvpB3GPQFvNuTWAI59B9huVGV5jXYJwbCsmBsOGYWA==
|
||||
"@types/fs-extra@^11.0.1", "@types/fs-extra@^11.0.2":
|
||||
version "11.0.2"
|
||||
resolved "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.2.tgz"
|
||||
integrity sha512-c0hrgAOVYr21EX8J0jBMXGLMgJqVf/v6yxi0dLaJboW9aQPh16Id+z6w2Tx1hm+piJOLv8xPfVKZCLfjPw/IMQ==
|
||||
dependencies:
|
||||
"@types/jsonfile" "*"
|
||||
"@types/node" "*"
|
||||
@@ -799,6 +890,11 @@
|
||||
expect "^29.0.0"
|
||||
pretty-format "^29.0.0"
|
||||
|
||||
"@types/json-schema@^7.0.12":
|
||||
version "7.0.13"
|
||||
resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.13.tgz"
|
||||
integrity sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==
|
||||
|
||||
"@types/jsonfile@*":
|
||||
version "6.1.1"
|
||||
resolved "https://registry.npmjs.org/@types/jsonfile/-/jsonfile-6.1.1.tgz"
|
||||
@@ -821,6 +917,11 @@
|
||||
resolved "https://registry.npmjs.org/@types/node/-/node-17.0.18.tgz"
|
||||
integrity sha512-eKj4f/BsN/qcculZiRSujogjvp5O/k4lOW5m35NopjZM/QwLOR075a8pJW5hD+Rtdm2DaCVPENS6KtSQnUD6BA==
|
||||
|
||||
"@types/semver@^7.5.0":
|
||||
version "7.5.2"
|
||||
resolved "https://registry.npmjs.org/@types/semver/-/semver-7.5.2.tgz"
|
||||
integrity sha512-7aqorHYgdNO4DM36stTiGO3DvKoex9TQRwsJU6vMaFGyqpBA1MNZkz+PG3gaNUPpTAOYhT1WR7M1JyA3fbS9Cw==
|
||||
|
||||
"@types/signale@^1.4.4":
|
||||
version "1.4.4"
|
||||
resolved "https://registry.npmjs.org/@types/signale/-/signale-1.4.4.tgz"
|
||||
@@ -845,15 +946,115 @@
|
||||
dependencies:
|
||||
"@types/yargs-parser" "*"
|
||||
|
||||
"@typescript-eslint/eslint-plugin@^6.7.2":
|
||||
version "6.7.2"
|
||||
resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.7.2.tgz"
|
||||
integrity sha512-ooaHxlmSgZTM6CHYAFRlifqh1OAr3PAQEwi7lhYhaegbnXrnh7CDcHmc3+ihhbQC7H0i4JF0psI5ehzkF6Yl6Q==
|
||||
dependencies:
|
||||
"@eslint-community/regexpp" "^4.5.1"
|
||||
"@typescript-eslint/scope-manager" "6.7.2"
|
||||
"@typescript-eslint/type-utils" "6.7.2"
|
||||
"@typescript-eslint/utils" "6.7.2"
|
||||
"@typescript-eslint/visitor-keys" "6.7.2"
|
||||
debug "^4.3.4"
|
||||
graphemer "^1.4.0"
|
||||
ignore "^5.2.4"
|
||||
natural-compare "^1.4.0"
|
||||
semver "^7.5.4"
|
||||
ts-api-utils "^1.0.1"
|
||||
|
||||
"@typescript-eslint/parser@^6.0.0 || ^6.0.0-alpha", "@typescript-eslint/parser@^6.7.2":
|
||||
version "6.7.2"
|
||||
resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.7.2.tgz"
|
||||
integrity sha512-KA3E4ox0ws+SPyxQf9iSI25R6b4Ne78ORhNHeVKrPQnoYsb9UhieoiRoJgrzgEeKGOXhcY1i8YtOeCHHTDa6Fw==
|
||||
dependencies:
|
||||
"@typescript-eslint/scope-manager" "6.7.2"
|
||||
"@typescript-eslint/types" "6.7.2"
|
||||
"@typescript-eslint/typescript-estree" "6.7.2"
|
||||
"@typescript-eslint/visitor-keys" "6.7.2"
|
||||
debug "^4.3.4"
|
||||
|
||||
"@typescript-eslint/scope-manager@6.7.2":
|
||||
version "6.7.2"
|
||||
resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.2.tgz"
|
||||
integrity sha512-bgi6plgyZjEqapr7u2mhxGR6E8WCzKNUFWNh6fkpVe9+yzRZeYtDTbsIBzKbcxI+r1qVWt6VIoMSNZ4r2A+6Yw==
|
||||
dependencies:
|
||||
"@typescript-eslint/types" "6.7.2"
|
||||
"@typescript-eslint/visitor-keys" "6.7.2"
|
||||
|
||||
"@typescript-eslint/type-utils@6.7.2":
|
||||
version "6.7.2"
|
||||
resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.7.2.tgz"
|
||||
integrity sha512-36F4fOYIROYRl0qj95dYKx6kybddLtsbmPIYNK0OBeXv2j9L5nZ17j9jmfy+bIDHKQgn2EZX+cofsqi8NPATBQ==
|
||||
dependencies:
|
||||
"@typescript-eslint/typescript-estree" "6.7.2"
|
||||
"@typescript-eslint/utils" "6.7.2"
|
||||
debug "^4.3.4"
|
||||
ts-api-utils "^1.0.1"
|
||||
|
||||
"@typescript-eslint/types@6.7.2":
|
||||
version "6.7.2"
|
||||
resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.2.tgz"
|
||||
integrity sha512-flJYwMYgnUNDAN9/GAI3l8+wTmvTYdv64fcH8aoJK76Y+1FCZ08RtI5zDerM/FYT5DMkAc+19E4aLmd5KqdFyg==
|
||||
|
||||
"@typescript-eslint/typescript-estree@6.7.2":
|
||||
version "6.7.2"
|
||||
resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.2.tgz"
|
||||
integrity sha512-kiJKVMLkoSciGyFU0TOY0fRxnp9qq1AzVOHNeN1+B9erKFCJ4Z8WdjAkKQPP+b1pWStGFqezMLltxO+308dJTQ==
|
||||
dependencies:
|
||||
"@typescript-eslint/types" "6.7.2"
|
||||
"@typescript-eslint/visitor-keys" "6.7.2"
|
||||
debug "^4.3.4"
|
||||
globby "^11.1.0"
|
||||
is-glob "^4.0.3"
|
||||
semver "^7.5.4"
|
||||
ts-api-utils "^1.0.1"
|
||||
|
||||
"@typescript-eslint/utils@6.7.2":
|
||||
version "6.7.2"
|
||||
resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.7.2.tgz"
|
||||
integrity sha512-ZCcBJug/TS6fXRTsoTkgnsvyWSiXwMNiPzBUani7hDidBdj1779qwM1FIAmpH4lvlOZNF3EScsxxuGifjpLSWQ==
|
||||
dependencies:
|
||||
"@eslint-community/eslint-utils" "^4.4.0"
|
||||
"@types/json-schema" "^7.0.12"
|
||||
"@types/semver" "^7.5.0"
|
||||
"@typescript-eslint/scope-manager" "6.7.2"
|
||||
"@typescript-eslint/types" "6.7.2"
|
||||
"@typescript-eslint/typescript-estree" "6.7.2"
|
||||
semver "^7.5.4"
|
||||
|
||||
"@typescript-eslint/visitor-keys@6.7.2":
|
||||
version "6.7.2"
|
||||
resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.2.tgz"
|
||||
integrity sha512-uVw9VIMFBUTz8rIeaUT3fFe8xIUx8r4ywAdlQv1ifH+6acn/XF8Y6rwJ7XNmkNMDrTW+7+vxFFPIF40nJCVsMQ==
|
||||
dependencies:
|
||||
"@typescript-eslint/types" "6.7.2"
|
||||
eslint-visitor-keys "^3.4.1"
|
||||
|
||||
acorn-jsx@^5.3.2:
|
||||
version "5.3.2"
|
||||
resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz"
|
||||
integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
|
||||
|
||||
acorn-walk@^8.1.1:
|
||||
version "8.2.0"
|
||||
resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz"
|
||||
integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==
|
||||
|
||||
acorn@^8.4.1:
|
||||
version "8.7.0"
|
||||
resolved "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz"
|
||||
integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==
|
||||
"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.4.1, acorn@^8.9.0:
|
||||
version "8.10.0"
|
||||
resolved "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz"
|
||||
integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==
|
||||
|
||||
ajv@^6.12.4:
|
||||
version "6.12.6"
|
||||
resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz"
|
||||
integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
|
||||
dependencies:
|
||||
fast-deep-equal "^3.1.1"
|
||||
fast-json-stable-stringify "^2.0.0"
|
||||
json-schema-traverse "^0.4.1"
|
||||
uri-js "^4.2.2"
|
||||
|
||||
ansi-escapes@^4.2.1:
|
||||
version "4.3.2"
|
||||
@@ -916,6 +1117,11 @@ argparse@^1.0.7:
|
||||
dependencies:
|
||||
sprintf-js "~1.0.2"
|
||||
|
||||
argparse@^2.0.1:
|
||||
version "2.0.1"
|
||||
resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz"
|
||||
integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
|
||||
|
||||
array-union@^1.0.1:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz"
|
||||
@@ -923,6 +1129,11 @@ array-union@^1.0.1:
|
||||
dependencies:
|
||||
array-uniq "^1.0.1"
|
||||
|
||||
array-union@^2.1.0:
|
||||
version "2.1.0"
|
||||
resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz"
|
||||
integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==
|
||||
|
||||
array-uniq@^1.0.1:
|
||||
version "1.0.3"
|
||||
resolved "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz"
|
||||
@@ -1201,7 +1412,7 @@ create-require@^1.1.0:
|
||||
resolved "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz"
|
||||
integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==
|
||||
|
||||
cross-spawn@^7.0.0, cross-spawn@^7.0.3:
|
||||
cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3:
|
||||
version "7.0.3"
|
||||
resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz"
|
||||
integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
|
||||
@@ -1210,10 +1421,10 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.3:
|
||||
shebang-command "^2.0.0"
|
||||
which "^2.0.1"
|
||||
|
||||
debug@^4.1.0, debug@^4.1.1:
|
||||
version "4.3.3"
|
||||
resolved "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz"
|
||||
integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==
|
||||
debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4:
|
||||
version "4.3.4"
|
||||
resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz"
|
||||
integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
|
||||
dependencies:
|
||||
ms "2.1.2"
|
||||
|
||||
@@ -1222,6 +1433,11 @@ dedent@^1.0.0:
|
||||
resolved "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz"
|
||||
integrity sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==
|
||||
|
||||
deep-is@^0.1.3:
|
||||
version "0.1.4"
|
||||
resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz"
|
||||
integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==
|
||||
|
||||
deepmerge@^4.2.2:
|
||||
version "4.3.1"
|
||||
resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz"
|
||||
@@ -1247,6 +1463,20 @@ diff@^4.0.1:
|
||||
resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz"
|
||||
integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==
|
||||
|
||||
dir-glob@^3.0.1:
|
||||
version "3.0.1"
|
||||
resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz"
|
||||
integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==
|
||||
dependencies:
|
||||
path-type "^4.0.0"
|
||||
|
||||
doctrine@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz"
|
||||
integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==
|
||||
dependencies:
|
||||
esutils "^2.0.2"
|
||||
|
||||
eastasianwidth@^0.2.0:
|
||||
version "0.2.0"
|
||||
resolved "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz"
|
||||
@@ -1304,11 +1534,105 @@ escape-string-regexp@^2.0.0:
|
||||
resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz"
|
||||
integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==
|
||||
|
||||
escape-string-regexp@^4.0.0:
|
||||
version "4.0.0"
|
||||
resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz"
|
||||
integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
|
||||
|
||||
eslint-scope@^7.2.2:
|
||||
version "7.2.2"
|
||||
resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz"
|
||||
integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==
|
||||
dependencies:
|
||||
esrecurse "^4.3.0"
|
||||
estraverse "^5.2.0"
|
||||
|
||||
eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3:
|
||||
version "3.4.3"
|
||||
resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz"
|
||||
integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==
|
||||
|
||||
"eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^7.0.0 || ^8.0.0", eslint@^8.49.0:
|
||||
version "8.49.0"
|
||||
resolved "https://registry.npmjs.org/eslint/-/eslint-8.49.0.tgz"
|
||||
integrity sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==
|
||||
dependencies:
|
||||
"@eslint-community/eslint-utils" "^4.2.0"
|
||||
"@eslint-community/regexpp" "^4.6.1"
|
||||
"@eslint/eslintrc" "^2.1.2"
|
||||
"@eslint/js" "8.49.0"
|
||||
"@humanwhocodes/config-array" "^0.11.11"
|
||||
"@humanwhocodes/module-importer" "^1.0.1"
|
||||
"@nodelib/fs.walk" "^1.2.8"
|
||||
ajv "^6.12.4"
|
||||
chalk "^4.0.0"
|
||||
cross-spawn "^7.0.2"
|
||||
debug "^4.3.2"
|
||||
doctrine "^3.0.0"
|
||||
escape-string-regexp "^4.0.0"
|
||||
eslint-scope "^7.2.2"
|
||||
eslint-visitor-keys "^3.4.3"
|
||||
espree "^9.6.1"
|
||||
esquery "^1.4.2"
|
||||
esutils "^2.0.2"
|
||||
fast-deep-equal "^3.1.3"
|
||||
file-entry-cache "^6.0.1"
|
||||
find-up "^5.0.0"
|
||||
glob-parent "^6.0.2"
|
||||
globals "^13.19.0"
|
||||
graphemer "^1.4.0"
|
||||
ignore "^5.2.0"
|
||||
imurmurhash "^0.1.4"
|
||||
is-glob "^4.0.0"
|
||||
is-path-inside "^3.0.3"
|
||||
js-yaml "^4.1.0"
|
||||
json-stable-stringify-without-jsonify "^1.0.1"
|
||||
levn "^0.4.1"
|
||||
lodash.merge "^4.6.2"
|
||||
minimatch "^3.1.2"
|
||||
natural-compare "^1.4.0"
|
||||
optionator "^0.9.3"
|
||||
strip-ansi "^6.0.1"
|
||||
text-table "^0.2.0"
|
||||
|
||||
espree@^9.6.0, espree@^9.6.1:
|
||||
version "9.6.1"
|
||||
resolved "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz"
|
||||
integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==
|
||||
dependencies:
|
||||
acorn "^8.9.0"
|
||||
acorn-jsx "^5.3.2"
|
||||
eslint-visitor-keys "^3.4.1"
|
||||
|
||||
esprima@^4.0.0:
|
||||
version "4.0.1"
|
||||
resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz"
|
||||
integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
|
||||
|
||||
esquery@^1.4.2:
|
||||
version "1.5.0"
|
||||
resolved "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz"
|
||||
integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==
|
||||
dependencies:
|
||||
estraverse "^5.1.0"
|
||||
|
||||
esrecurse@^4.3.0:
|
||||
version "4.3.0"
|
||||
resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz"
|
||||
integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==
|
||||
dependencies:
|
||||
estraverse "^5.2.0"
|
||||
|
||||
estraverse@^5.1.0, estraverse@^5.2.0:
|
||||
version "5.3.0"
|
||||
resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz"
|
||||
integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==
|
||||
|
||||
esutils@^2.0.2:
|
||||
version "2.0.3"
|
||||
resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz"
|
||||
integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
|
||||
|
||||
execa@^5.0.0:
|
||||
version "5.1.1"
|
||||
resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz"
|
||||
@@ -1340,11 +1664,39 @@ expect@^29.0.0, expect@^29.6.4:
|
||||
jest-message-util "^29.6.3"
|
||||
jest-util "^29.6.3"
|
||||
|
||||
fast-json-stable-stringify@^2.1.0, fast-json-stable-stringify@2.x:
|
||||
fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
|
||||
version "3.1.3"
|
||||
resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz"
|
||||
integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
|
||||
|
||||
fast-glob@^3.2.9:
|
||||
version "3.3.1"
|
||||
resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz"
|
||||
integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==
|
||||
dependencies:
|
||||
"@nodelib/fs.stat" "^2.0.2"
|
||||
"@nodelib/fs.walk" "^1.2.3"
|
||||
glob-parent "^5.1.2"
|
||||
merge2 "^1.3.0"
|
||||
micromatch "^4.0.4"
|
||||
|
||||
fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0, fast-json-stable-stringify@2.x:
|
||||
version "2.1.0"
|
||||
resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz"
|
||||
integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
|
||||
|
||||
fast-levenshtein@^2.0.6:
|
||||
version "2.0.6"
|
||||
resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz"
|
||||
integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==
|
||||
|
||||
fastq@^1.6.0:
|
||||
version "1.15.0"
|
||||
resolved "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz"
|
||||
integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==
|
||||
dependencies:
|
||||
reusify "^1.0.4"
|
||||
|
||||
fb-watchman@^2.0.0:
|
||||
version "2.0.2"
|
||||
resolved "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz"
|
||||
@@ -1359,6 +1711,13 @@ figures@^2.0.0:
|
||||
dependencies:
|
||||
escape-string-regexp "^1.0.5"
|
||||
|
||||
file-entry-cache@^6.0.1:
|
||||
version "6.0.1"
|
||||
resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz"
|
||||
integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==
|
||||
dependencies:
|
||||
flat-cache "^3.0.4"
|
||||
|
||||
filename-reserved-regex@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz"
|
||||
@@ -1404,6 +1763,28 @@ find-up@^4.0.0, find-up@^4.1.0:
|
||||
locate-path "^5.0.0"
|
||||
path-exists "^4.0.0"
|
||||
|
||||
find-up@^5.0.0:
|
||||
version "5.0.0"
|
||||
resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz"
|
||||
integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==
|
||||
dependencies:
|
||||
locate-path "^6.0.0"
|
||||
path-exists "^4.0.0"
|
||||
|
||||
flat-cache@^3.0.4:
|
||||
version "3.1.0"
|
||||
resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.0.tgz"
|
||||
integrity sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==
|
||||
dependencies:
|
||||
flatted "^3.2.7"
|
||||
keyv "^4.5.3"
|
||||
rimraf "^3.0.2"
|
||||
|
||||
flatted@^3.2.7:
|
||||
version "3.2.9"
|
||||
resolved "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz"
|
||||
integrity sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==
|
||||
|
||||
foreground-child@^3.1.0:
|
||||
version "3.1.1"
|
||||
resolved "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz"
|
||||
@@ -1478,6 +1859,20 @@ gh-pages@^5.0.0:
|
||||
fs-extra "^8.1.0"
|
||||
globby "^6.1.0"
|
||||
|
||||
glob-parent@^5.1.2:
|
||||
version "5.1.2"
|
||||
resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz"
|
||||
integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
|
||||
dependencies:
|
||||
is-glob "^4.0.1"
|
||||
|
||||
glob-parent@^6.0.2:
|
||||
version "6.0.2"
|
||||
resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz"
|
||||
integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==
|
||||
dependencies:
|
||||
is-glob "^4.0.3"
|
||||
|
||||
glob@^10.3.4:
|
||||
version "10.3.4"
|
||||
resolved "https://registry.npmjs.org/glob/-/glob-10.3.4.tgz"
|
||||
@@ -1542,6 +1937,25 @@ globals@^11.1.0:
|
||||
resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz"
|
||||
integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
|
||||
|
||||
globals@^13.19.0:
|
||||
version "13.22.0"
|
||||
resolved "https://registry.npmjs.org/globals/-/globals-13.22.0.tgz"
|
||||
integrity sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw==
|
||||
dependencies:
|
||||
type-fest "^0.20.2"
|
||||
|
||||
globby@^11.1.0:
|
||||
version "11.1.0"
|
||||
resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz"
|
||||
integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==
|
||||
dependencies:
|
||||
array-union "^2.1.0"
|
||||
dir-glob "^3.0.1"
|
||||
fast-glob "^3.2.9"
|
||||
ignore "^5.2.0"
|
||||
merge2 "^1.4.1"
|
||||
slash "^3.0.0"
|
||||
|
||||
globby@^6.1.0:
|
||||
version "6.1.0"
|
||||
resolved "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz"
|
||||
@@ -1558,6 +1972,11 @@ graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.9:
|
||||
resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz"
|
||||
integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==
|
||||
|
||||
graphemer@^1.4.0:
|
||||
version "1.4.0"
|
||||
resolved "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz"
|
||||
integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==
|
||||
|
||||
has-flag@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz"
|
||||
@@ -1585,6 +2004,19 @@ human-signals@^2.1.0:
|
||||
resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz"
|
||||
integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==
|
||||
|
||||
ignore@^5.2.0, ignore@^5.2.4:
|
||||
version "5.2.4"
|
||||
resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz"
|
||||
integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==
|
||||
|
||||
import-fresh@^3.2.1:
|
||||
version "3.3.0"
|
||||
resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz"
|
||||
integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==
|
||||
dependencies:
|
||||
parent-module "^1.0.0"
|
||||
resolve-from "^4.0.0"
|
||||
|
||||
import-local@^3.0.2:
|
||||
version "3.1.0"
|
||||
resolved "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz"
|
||||
@@ -1636,6 +2068,11 @@ is-extglob@^1.0.0:
|
||||
resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz"
|
||||
integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=
|
||||
|
||||
is-extglob@^2.1.1:
|
||||
version "2.1.1"
|
||||
resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz"
|
||||
integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==
|
||||
|
||||
is-fullwidth-code-point@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz"
|
||||
@@ -1653,6 +2090,27 @@ is-glob@^2.0.0:
|
||||
dependencies:
|
||||
is-extglob "^1.0.0"
|
||||
|
||||
is-glob@^4.0.0:
|
||||
version "4.0.3"
|
||||
resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz"
|
||||
integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
|
||||
dependencies:
|
||||
is-extglob "^2.1.1"
|
||||
|
||||
is-glob@^4.0.1:
|
||||
version "4.0.3"
|
||||
resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz"
|
||||
integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
|
||||
dependencies:
|
||||
is-extglob "^2.1.1"
|
||||
|
||||
is-glob@^4.0.3:
|
||||
version "4.0.3"
|
||||
resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz"
|
||||
integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
|
||||
dependencies:
|
||||
is-extglob "^2.1.1"
|
||||
|
||||
is-invalid-path@^0.1.0:
|
||||
version "0.1.0"
|
||||
resolved "https://registry.npmjs.org/is-invalid-path/-/is-invalid-path-0.1.0.tgz"
|
||||
@@ -1665,6 +2123,11 @@ is-number@^7.0.0:
|
||||
resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz"
|
||||
integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
|
||||
|
||||
is-path-inside@^3.0.3:
|
||||
version "3.0.3"
|
||||
resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz"
|
||||
integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==
|
||||
|
||||
is-plain-object@^5.0.0:
|
||||
version "5.0.0"
|
||||
resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz"
|
||||
@@ -2126,11 +2589,23 @@ js-yaml@^3.13.1:
|
||||
argparse "^1.0.7"
|
||||
esprima "^4.0.0"
|
||||
|
||||
js-yaml@^4.1.0:
|
||||
version "4.1.0"
|
||||
resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz"
|
||||
integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==
|
||||
dependencies:
|
||||
argparse "^2.0.1"
|
||||
|
||||
jsesc@^2.5.1:
|
||||
version "2.5.2"
|
||||
resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz"
|
||||
integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==
|
||||
|
||||
json-buffer@3.0.1:
|
||||
version "3.0.1"
|
||||
resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz"
|
||||
integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==
|
||||
|
||||
json-parse-better-errors@^1.0.1:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz"
|
||||
@@ -2141,6 +2616,16 @@ json-parse-even-better-errors@^2.3.0:
|
||||
resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz"
|
||||
integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==
|
||||
|
||||
json-schema-traverse@^0.4.1:
|
||||
version "0.4.1"
|
||||
resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz"
|
||||
integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
|
||||
|
||||
json-stable-stringify-without-jsonify@^1.0.1:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz"
|
||||
integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==
|
||||
|
||||
json5@^2.1.2, json5@^2.2.3:
|
||||
version "2.2.3"
|
||||
resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz"
|
||||
@@ -2162,6 +2647,13 @@ jsonfile@^6.0.1:
|
||||
optionalDependencies:
|
||||
graceful-fs "^4.1.6"
|
||||
|
||||
keyv@^4.5.3:
|
||||
version "4.5.3"
|
||||
resolved "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz"
|
||||
integrity sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==
|
||||
dependencies:
|
||||
json-buffer "3.0.1"
|
||||
|
||||
kleur@^3.0.3:
|
||||
version "3.0.3"
|
||||
resolved "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz"
|
||||
@@ -2172,6 +2664,14 @@ leven@^3.1.0:
|
||||
resolved "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz"
|
||||
integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==
|
||||
|
||||
levn@^0.4.1:
|
||||
version "0.4.1"
|
||||
resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz"
|
||||
integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==
|
||||
dependencies:
|
||||
prelude-ls "^1.2.1"
|
||||
type-check "~0.4.0"
|
||||
|
||||
lines-and-columns@^1.1.6:
|
||||
version "1.2.4"
|
||||
resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz"
|
||||
@@ -2202,11 +2702,23 @@ locate-path@^5.0.0:
|
||||
dependencies:
|
||||
p-locate "^4.1.0"
|
||||
|
||||
locate-path@^6.0.0:
|
||||
version "6.0.0"
|
||||
resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz"
|
||||
integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==
|
||||
dependencies:
|
||||
p-locate "^5.0.0"
|
||||
|
||||
lodash.memoize@4.x:
|
||||
version "4.1.2"
|
||||
resolved "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz"
|
||||
integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==
|
||||
|
||||
lodash.merge@^4.6.2:
|
||||
version "4.6.2"
|
||||
resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz"
|
||||
integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
|
||||
|
||||
lodash@^4.17.21:
|
||||
version "4.17.21"
|
||||
resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz"
|
||||
@@ -2271,6 +2783,11 @@ merge-stream@^2.0.0:
|
||||
resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz"
|
||||
integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
|
||||
|
||||
merge2@^1.3.0, merge2@^1.4.1:
|
||||
version "1.4.1"
|
||||
resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz"
|
||||
integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
|
||||
|
||||
micromatch@^4.0.4:
|
||||
version "4.0.5"
|
||||
resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz"
|
||||
@@ -2284,7 +2801,7 @@ mimic-fn@^2.1.0:
|
||||
resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz"
|
||||
integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
|
||||
|
||||
minimatch@^3.0.4, minimatch@^3.1.1:
|
||||
minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2:
|
||||
version "3.1.2"
|
||||
resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz"
|
||||
integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
|
||||
@@ -2340,6 +2857,11 @@ normalize-path@^3.0.0:
|
||||
resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz"
|
||||
integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
|
||||
|
||||
normalize-url@^6.1.0:
|
||||
version "6.1.0"
|
||||
resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz"
|
||||
integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==
|
||||
|
||||
normalize-url@^7.2.0:
|
||||
version "7.2.0"
|
||||
resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-7.2.0.tgz"
|
||||
@@ -2371,6 +2893,18 @@ onetime@^5.1.2:
|
||||
dependencies:
|
||||
mimic-fn "^2.1.0"
|
||||
|
||||
optionator@^0.9.3:
|
||||
version "0.9.3"
|
||||
resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz"
|
||||
integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==
|
||||
dependencies:
|
||||
"@aashutoshrathi/word-wrap" "^1.2.3"
|
||||
deep-is "^0.1.3"
|
||||
fast-levenshtein "^2.0.6"
|
||||
levn "^0.4.1"
|
||||
prelude-ls "^1.2.1"
|
||||
type-check "^0.4.0"
|
||||
|
||||
p-limit@^1.1.0:
|
||||
version "1.3.0"
|
||||
resolved "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz"
|
||||
@@ -2385,6 +2919,13 @@ p-limit@^2.2.0:
|
||||
dependencies:
|
||||
p-try "^2.0.0"
|
||||
|
||||
p-limit@^3.0.2:
|
||||
version "3.1.0"
|
||||
resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz"
|
||||
integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==
|
||||
dependencies:
|
||||
yocto-queue "^0.1.0"
|
||||
|
||||
p-limit@^3.1.0:
|
||||
version "3.1.0"
|
||||
resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz"
|
||||
@@ -2406,6 +2947,13 @@ p-locate@^4.1.0:
|
||||
dependencies:
|
||||
p-limit "^2.2.0"
|
||||
|
||||
p-locate@^5.0.0:
|
||||
version "5.0.0"
|
||||
resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz"
|
||||
integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==
|
||||
dependencies:
|
||||
p-limit "^3.0.2"
|
||||
|
||||
p-try@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz"
|
||||
@@ -2416,6 +2964,13 @@ p-try@^2.0.0:
|
||||
resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz"
|
||||
integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
|
||||
|
||||
parent-module@^1.0.0:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz"
|
||||
integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==
|
||||
dependencies:
|
||||
callsites "^3.0.0"
|
||||
|
||||
parse-json@^4.0.0:
|
||||
version "4.0.0"
|
||||
resolved "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz"
|
||||
@@ -2467,6 +3022,11 @@ path-scurry@^1.10.1:
|
||||
lru-cache "^9.1.1 || ^10.0.0"
|
||||
minipass "^5.0.0 || ^6.0.2 || ^7.0.0"
|
||||
|
||||
path-type@^4.0.0:
|
||||
version "4.0.0"
|
||||
resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz"
|
||||
integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
|
||||
|
||||
picocolors@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz"
|
||||
@@ -2519,6 +3079,11 @@ pkg-dir@^4.1.0, pkg-dir@^4.2.0:
|
||||
dependencies:
|
||||
find-up "^4.0.0"
|
||||
|
||||
prelude-ls@^1.2.1:
|
||||
version "1.2.1"
|
||||
resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz"
|
||||
integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==
|
||||
|
||||
pretty-format@^29.0.0, pretty-format@^29.6.3:
|
||||
version "29.6.3"
|
||||
resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.3.tgz"
|
||||
@@ -2536,6 +3101,11 @@ prompts@^2.0.1:
|
||||
kleur "^3.0.3"
|
||||
sisteransi "^1.0.5"
|
||||
|
||||
punycode@^2.1.0:
|
||||
version "2.3.0"
|
||||
resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz"
|
||||
integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==
|
||||
|
||||
pure-rand@^6.0.0:
|
||||
version "6.0.3"
|
||||
resolved "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.3.tgz"
|
||||
@@ -2546,6 +3116,11 @@ q@^1.2.0:
|
||||
resolved "https://registry.npmjs.org/q/-/q-1.5.1.tgz"
|
||||
integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=
|
||||
|
||||
queue-microtask@^1.2.2:
|
||||
version "1.2.3"
|
||||
resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz"
|
||||
integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
|
||||
|
||||
react-is@^18.0.0:
|
||||
version "18.2.0"
|
||||
resolved "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz"
|
||||
@@ -2563,6 +3138,11 @@ resolve-cwd@^3.0.0:
|
||||
dependencies:
|
||||
resolve-from "^5.0.0"
|
||||
|
||||
resolve-from@^4.0.0:
|
||||
version "4.0.0"
|
||||
resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz"
|
||||
integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
|
||||
|
||||
resolve-from@^5.0.0:
|
||||
version "5.0.0"
|
||||
resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz"
|
||||
@@ -2582,6 +3162,25 @@ resolve@^1.20.0:
|
||||
path-parse "^1.0.7"
|
||||
supports-preserve-symlinks-flag "^1.0.0"
|
||||
|
||||
reusify@^1.0.4:
|
||||
version "1.0.4"
|
||||
resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz"
|
||||
integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
|
||||
|
||||
rimraf@^3.0.2:
|
||||
version "3.0.2"
|
||||
resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz"
|
||||
integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
|
||||
dependencies:
|
||||
glob "^7.1.3"
|
||||
|
||||
run-parallel@^1.1.9:
|
||||
version "1.2.0"
|
||||
resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz"
|
||||
integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==
|
||||
dependencies:
|
||||
queue-microtask "^1.2.2"
|
||||
|
||||
safe-buffer@~5.1.1:
|
||||
version "5.1.2"
|
||||
resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz"
|
||||
@@ -2795,6 +3394,11 @@ test-exclude@^6.0.0:
|
||||
glob "^7.1.4"
|
||||
minimatch "^3.0.4"
|
||||
|
||||
text-table@^0.2.0:
|
||||
version "0.2.0"
|
||||
resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz"
|
||||
integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==
|
||||
|
||||
tmpl@1.0.5:
|
||||
version "1.0.5"
|
||||
resolved "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz"
|
||||
@@ -2831,6 +3435,11 @@ trim-repeated@^1.0.0:
|
||||
dependencies:
|
||||
escape-string-regexp "^1.0.2"
|
||||
|
||||
ts-api-utils@^1.0.1:
|
||||
version "1.0.3"
|
||||
resolved "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz"
|
||||
integrity sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==
|
||||
|
||||
ts-jest@^29.1.1:
|
||||
version "29.1.1"
|
||||
resolved "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.1.tgz"
|
||||
@@ -2864,17 +3473,29 @@ ts-node@>=9.0.0:
|
||||
v8-compile-cache-lib "^3.0.1"
|
||||
yn "3.1.1"
|
||||
|
||||
type-check@^0.4.0, type-check@~0.4.0:
|
||||
version "0.4.0"
|
||||
resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz"
|
||||
integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==
|
||||
dependencies:
|
||||
prelude-ls "^1.2.1"
|
||||
|
||||
type-detect@4.0.8:
|
||||
version "4.0.8"
|
||||
resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz"
|
||||
integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==
|
||||
|
||||
type-fest@^0.20.2:
|
||||
version "0.20.2"
|
||||
resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz"
|
||||
integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==
|
||||
|
||||
type-fest@^0.21.3:
|
||||
version "0.21.3"
|
||||
resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz"
|
||||
integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==
|
||||
|
||||
typescript@^5.2.2, typescript@>=2.7, "typescript@>=4.3 <6":
|
||||
typescript@^5.2.2, typescript@>=2.7, typescript@>=4.2.0, "typescript@>=4.3 <6":
|
||||
version "5.2.2"
|
||||
resolved "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz"
|
||||
integrity sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==
|
||||
@@ -2894,6 +3515,13 @@ universalify@^2.0.0:
|
||||
resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz"
|
||||
integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==
|
||||
|
||||
uri-js@^4.2.2:
|
||||
version "4.4.1"
|
||||
resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz"
|
||||
integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==
|
||||
dependencies:
|
||||
punycode "^2.1.0"
|
||||
|
||||
v8-compile-cache-lib@^3.0.1:
|
||||
version "3.0.1"
|
||||
resolved "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz"
|
||||
|
||||
Reference in New Issue
Block a user