Update update-readme.js

This commit is contained in:
Aleksandr Statciuk 2022-02-07 08:39:55 +03:00
parent b9a093d816
commit 822e39dcf0
15 changed files with 870 additions and 419 deletions

View File

@ -2,23 +2,20 @@
[![auto-update](https://github.com/iptv-org/iptv/actions/workflows/auto-update.yml/badge.svg)](https://github.com/iptv-org/iptv/actions/workflows/auto-update.yml)
Collection of publicly available IPTV channels from all over the world.
Collection of publicly available IPTV (Internet Protocol television) channels from all over the world.
## Usage
To watch IPTV you just need to paste this link `https://iptv-org.github.io/iptv/index.m3u` to any player which supports M3U-playlists.
![VLC Network Panel](https://github.com/iptv-org/iptv/raw/master/.readme/preview.png)
![VLC Network Panel](.readme/preview.png)
To watch IPTV, simply insert one of the links below into any player that supports M3U playlists:
Also you can instead use one of these playlists:
- `https://iptv-org.github.io/iptv/index.category.m3u` (grouped by category)
- `https://iptv-org.github.io/iptv/index.language.m3u` (grouped by language)
- `https://iptv-org.github.io/iptv/index.country.m3u` (grouped by country)
- `https://iptv-org.github.io/iptv/index.region.m3u` (grouped by region)
- `https://iptv-org.github.io/iptv/index.m3u`
- `https://iptv-org.github.io/iptv/index.nsfw.m3u` (includes adult channels)
Or select one of the playlists from the list below.
- `https://iptv-org.github.io/iptv/index.category.m3u` (grouped by category)
- `https://iptv-org.github.io/iptv/index.country.m3u` (grouped by country)
- `https://iptv-org.github.io/iptv/index.language.m3u` (grouped by language)
- `https://iptv-org.github.io/iptv/index.region.m3u` (grouped by region)
### Playlists by category
@ -31,6 +28,17 @@ Or select one of the playlists from the list below.
</details>
### Playlists by country
<details>
<summary>Expand</summary>
<br>
<!-- prettier-ignore -->
#include "./.readme/_countries.md"
</details>
### Playlists by language
<details>
@ -53,76 +61,9 @@ Or select one of the playlists from the list below.
</details>
### Playlists by country
<details>
<summary>Expand</summary>
<br>
<!-- prettier-ignore -->
#include "./.readme/_countries.md"
</details>
## For Developers
In addition to the above methods, you can also get a list of all available channels in JSON format.
To do this, you just have to make a GET request to:
```
https://iptv-org.github.io/iptv/channels.json
```
If successful, you should get the following response:
<details>
<summary>Expand</summary>
<br>
```
[
...
{
"name": "CNN",
"logo": "https://i.imgur.com/ilZJT5s.png",
"url": "http://ott-cdn.ucom.am/s27/index.m3u8",
"categories": [
{
"name": "News",
"slug": "news"
}
],
"countries": [
{
"code": "us",
"name": "United States"
},
{
"code": "ca",
"name": "Canada"
}
],
"languages": [
{
"code": "eng",
"name": "English"
}
],
"tvg": {
"id": "cnn.us",
"name": "CNN",
"url": "http://epg.streamstv.me/epg/guide-usa.xml.gz"
}
},
...
]
```
</details>
## EPG
Playlists already have a built-in list of EPG, so players that support the `url-tvg` tag should load it automatically. If not, you can find a list of available programs here:
Playlists already have a built-in list of EPG, so players that support the `x-tvg-url` tag should load it automatically. If not, you can find a list of available programs here:
https://github.com/iptv-org/epg
@ -130,6 +71,10 @@ https://github.com/iptv-org/epg
You can find links to various IPTV related resources in this repository [iptv-org/awesome-iptv](https://github.com/iptv-org/awesome-iptv).
## API
The API documentation can be found in the [iptv-org/api](https://github.com/iptv-org/api) repository.
## Contribution
Please make sure to read the [Contributing Guide](CONTRIBUTING.md) before sending an issue or making a pull request.

View File

@ -1,12 +1,8 @@
const { file, markdown, parser, logger } = require('../core')
const { file, markdown, parser, logger, api } = require('../core')
const { create: createTable } = require('../core/table')
const { program } = require('commander')
let categories = []
let countries = []
let languages = []
let regions = []
const LOGS_PATH = process.env.LOGS_PATH || 'scripts/logs'
const LOGS_DIR = process.env.LOGS_DIR || 'scripts/logs/generators'
const options = program
.option('-c, --config <config>', 'Set path to config file', '.readme/config.json')
@ -14,97 +10,79 @@ const options = program
.opts()
async function main() {
await setUp()
await generateCategoryTable()
await generateLanguageTable()
await generateRegionTable()
await generateCountryTable()
await createCategoryTable()
await createCountryTable()
await createLanguageTable()
await createRegionTable()
await updateReadme()
}
main()
async function generateCategoryTable() {
logger.info('Generating category table...')
async function createCategoryTable() {
logger.info('creating category table...')
const rows = []
for (const category of categories) {
await api.categories.load()
const items = await parser.parseLogs(`${LOGS_DIR}/categories.log`)
for (const item of items) {
const id = file.getFilename(item.filepath)
const category = await api.categories.find({ id })
rows.push({
category: category.name,
channels: category.count,
playlist: `<code>https://iptv-org.github.io/iptv/categories/${category.slug}.m3u</code>`
name: category ? category.name : 'Undefined',
channels: item.count,
playlist: `<code>https://iptv-org.github.io/iptv/${item.filepath}</code>`
})
}
const table = markdown.createTable(rows, [
{ name: 'Category', align: 'left' },
const table = createTable(rows, [
{ name: 'Category' },
{ name: 'Channels', align: 'right' },
{ name: 'Playlist', align: 'left', nowrap: true }
{ name: 'Playlist', nowrap: true }
])
await file.create('./.readme/_categories.md', table)
}
async function generateCountryTable() {
logger.info('Generating country table...')
async function createCountryTable() {
logger.info('creating country table...')
const rows = []
for (const country of countries) {
const flag = getCountryFlag(country.code)
const prefix = flag ? `${flag} ` : ''
await api.countries.load()
const items = await parser.parseLogs(`${LOGS_DIR}/countries.log`)
for (const item of items) {
const code = file.getFilename(item.filepath)
const country = await api.countries.find({ code: code.toUpperCase() })
rows.push({
country: prefix + country.name,
channels: country.count,
playlist: `<code>https://iptv-org.github.io/iptv/countries/${country.code.toLowerCase()}.m3u</code>`
name: country ? `${country.flag} ${country.name}` : 'Undefined',
channels: item.count,
playlist: `<code>https://iptv-org.github.io/iptv/${item.filepath}</code>`
})
}
const table = markdown.createTable(rows, [
{ name: 'Country', align: 'left' },
const table = createTable(rows, [
{ name: 'Country' },
{ name: 'Channels', align: 'right' },
{ name: 'Playlist', align: 'left', nowrap: true }
{ name: 'Playlist', nowrap: true }
])
await file.create('./.readme/_countries.md', table)
}
async function generateRegionTable() {
logger.info('Generating region table...')
async function createLanguageTable() {
logger.info('creating language table...')
const rows = []
for (const region of regions) {
await api.languages.load()
const items = await parser.parseLogs(`${LOGS_DIR}/languages.log`)
for (const item of items) {
const code = file.getFilename(item.filepath)
const language = await api.languages.find({ code })
rows.push({
region: region.name,
channels: region.count,
playlist: `<code>https://iptv-org.github.io/iptv/regions/${region.code.toLowerCase()}.m3u</code>`
name: language ? language.name : 'Undefined',
channels: item.count,
playlist: `<code>https://iptv-org.github.io/iptv/${item.filepath}</code>`
})
}
const table = markdown.createTable(rows, [
{ name: 'Region', align: 'left' },
{ name: 'Channels', align: 'right' },
{ name: 'Playlist', align: 'left', nowrap: true }
])
await file.create('./.readme/_regions.md', table)
}
async function generateLanguageTable() {
logger.info('Generating language table...')
const rows = []
for (const language of languages) {
rows.push({
language: language.name,
channels: language.count,
playlist: `<code>https://iptv-org.github.io/iptv/languages/${language.code}.m3u</code>`
})
}
const table = markdown.createTable(rows, [
const table = createTable(rows, [
{ name: 'Language', align: 'left' },
{ name: 'Channels', align: 'right' },
{ name: 'Playlist', align: 'left', nowrap: true }
@ -113,28 +91,33 @@ async function generateLanguageTable() {
await file.create('./.readme/_languages.md', table)
}
async function updateReadme() {
logger.info('Updating README.md...')
async function createRegionTable() {
logger.info('creating region table...')
const rows = []
await api.regions.load()
const items = await parser.parseLogs(`${LOGS_DIR}/regions.log`)
for (const item of items) {
const code = file.getFilename(item.filepath)
const region = await api.regions.find({ code: code.toUpperCase() })
rows.push({
name: region ? region.name : 'Undefined',
channels: item.count,
playlist: `<code>https://iptv-org.github.io/iptv/${item.filepath}</code>`
})
}
const table = createTable(rows, [
{ name: 'Region', align: 'left' },
{ name: 'Channels', align: 'right' },
{ name: 'Playlist', align: 'left', nowrap: true }
])
await file.create('./.readme/_regions.md', table)
}
async function updateReadme() {
logger.info('updating readme.md...')
const config = require(file.resolve(options.config))
await file.createDir(file.dirname(config.build))
await markdown.compile(options.config)
}
async function setUp() {
categories = await parser.parseLogs(`${LOGS_PATH}/generate-playlists/categories.log`)
countries = await parser.parseLogs(`${LOGS_PATH}/generate-playlists/countries.log`)
languages = await parser.parseLogs(`${LOGS_PATH}/generate-playlists/languages.log`)
regions = await parser.parseLogs(`${LOGS_PATH}/generate-playlists/regions.log`)
}
function getCountryFlag(code) {
switch (code) {
case 'UK':
return '🇬🇧'
case 'UNDEFINED':
return ''
default:
return code.replace(/./g, char => String.fromCodePoint(char.charCodeAt(0) + 127397))
}
}

View File

@ -3,35 +3,6 @@ const file = require('./file')
const markdown = {}
markdown.createTable = function (data, cols) {
let output = '<table>\n'
output += ' <thead>\n <tr>'
for (let column of cols) {
output += `<th align="${column.align}">${column.name}</th>`
}
output += '</tr>\n </thead>\n'
output += ' <tbody>\n'
for (let item of data) {
output += ' <tr>'
let i = 0
for (let prop in item) {
const column = cols[i]
let nowrap = column.nowrap
let align = column.align
output += `<td align="${align}"${nowrap ? ' nowrap' : ''}>${item[prop]}</td>`
i++
}
output += '</tr>\n'
}
output += ' </tbody>\n'
output += '</table>'
return output
}
markdown.compile = function (filepath) {
markdownInclude.compileFiles(file.resolve(filepath))
}

32
scripts/core/table.js Normal file
View File

@ -0,0 +1,32 @@
const table = {}
table.create = function (data, cols) {
let output = '<table>\n'
output += ' <thead>\n <tr>'
for (let column of cols) {
output += `<th align="left">${column.name}</th>`
}
output += '</tr>\n </thead>\n'
output += ' <tbody>\n'
for (let item of data) {
output += ' <tr>'
let i = 0
for (let prop in item) {
const column = cols[i]
let nowrap = column.nowrap ? ` nowrap` : ''
let align = column.align ? ` align="${column.align}"` : ''
output += `<td${align}${nowrap}>${item[prop]}</td>`
i++
}
output += '</tr>\n'
}
output += ' </tbody>\n'
output += '</table>'
return output
}
module.exports = table

View File

@ -0,0 +1,418 @@
# IPTV
[![auto-update](https://github.com/iptv-org/iptv/actions/workflows/auto-update.yml/badge.svg)](https://github.com/iptv-org/iptv/actions/workflows/auto-update.yml)
Collection of publicly available IPTV (Internet Protocol television) channels from all over the world.
## Usage
![VLC Network Panel](https://github.com/iptv-org/iptv/raw/master/.readme/preview.png)
To watch IPTV, simply insert one of the links below into any player that supports M3U playlists:
- `https://iptv-org.github.io/iptv/index.m3u`
- `https://iptv-org.github.io/iptv/index.nsfw.m3u` (includes adult channels)
- `https://iptv-org.github.io/iptv/index.category.m3u` (grouped by category)
- `https://iptv-org.github.io/iptv/index.country.m3u` (grouped by country)
- `https://iptv-org.github.io/iptv/index.language.m3u` (grouped by language)
- `https://iptv-org.github.io/iptv/index.region.m3u` (grouped by region)
### Playlists by category
<details>
<summary>Expand</summary>
<br>
<!-- prettier-ignore -->
<table>
<thead>
<tr><th align="left">Category</th><th align="left">Channels</th><th align="left">Playlist</th></tr>
</thead>
<tbody>
<tr><td>Auto</td><td align="right">0</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/auto.m3u</code></td></tr>
<tr><td>Animation</td><td align="right">0</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/animation.m3u</code></td></tr>
<tr><td>Business</td><td align="right">0</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/business.m3u</code></td></tr>
<tr><td>Classic</td><td align="right">0</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/classic.m3u</code></td></tr>
<tr><td>Comedy</td><td align="right">0</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/comedy.m3u</code></td></tr>
<tr><td>Cooking</td><td align="right">0</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/cooking.m3u</code></td></tr>
<tr><td>Culture</td><td align="right">0</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/culture.m3u</code></td></tr>
<tr><td>Documentary</td><td align="right">0</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/documentary.m3u</code></td></tr>
<tr><td>Education</td><td align="right">0</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/education.m3u</code></td></tr>
<tr><td>Entertainment</td><td align="right">0</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/entertainment.m3u</code></td></tr>
<tr><td>Family</td><td align="right">0</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/family.m3u</code></td></tr>
<tr><td>General</td><td align="right">2</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/general.m3u</code></td></tr>
<tr><td>Kids</td><td align="right">0</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/kids.m3u</code></td></tr>
<tr><td>Legislative</td><td align="right">0</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/legislative.m3u</code></td></tr>
<tr><td>Lifestyle</td><td align="right">0</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/lifestyle.m3u</code></td></tr>
<tr><td>Movies</td><td align="right">0</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/movies.m3u</code></td></tr>
<tr><td>Music</td><td align="right">0</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/music.m3u</code></td></tr>
<tr><td>News</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/news.m3u</code></td></tr>
<tr><td>Outdoor</td><td align="right">0</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/outdoor.m3u</code></td></tr>
<tr><td>Relax</td><td align="right">0</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/relax.m3u</code></td></tr>
<tr><td>Religious</td><td align="right">0</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/religious.m3u</code></td></tr>
<tr><td>Series</td><td align="right">0</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/series.m3u</code></td></tr>
<tr><td>Science</td><td align="right">0</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/science.m3u</code></td></tr>
<tr><td>Shop</td><td align="right">0</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/shop.m3u</code></td></tr>
<tr><td>Sports</td><td align="right">0</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/sports.m3u</code></td></tr>
<tr><td>Travel</td><td align="right">0</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/travel.m3u</code></td></tr>
<tr><td>Weather</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/weather.m3u</code></td></tr>
<tr><td>XXX</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/xxx.m3u</code></td></tr>
<tr><td>Undefined</td><td align="right">3</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/undefined.m3u</code></td></tr>
</tbody>
</table>
</details>
### Playlists by country
<details>
<summary>Expand</summary>
<br>
<!-- prettier-ignore -->
<table>
<thead>
<tr><th align="left">Country</th><th align="left">Channels</th><th align="left">Playlist</th></tr>
</thead>
<tbody>
<tr><td>🇦🇫 Afghanistan</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/af.m3u</code></td></tr>
<tr><td>🇦🇱 Albania</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/al.m3u</code></td></tr>
<tr><td>🇩🇿 Algeria</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/dz.m3u</code></td></tr>
<tr><td>🇦🇸 American Samoa</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/as.m3u</code></td></tr>
<tr><td>🇦🇩 Andorra</td><td align="right">2</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/ad.m3u</code></td></tr>
<tr><td>🇦🇴 Angola</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/ao.m3u</code></td></tr>
<tr><td>🇦🇮 Anguilla</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/ai.m3u</code></td></tr>
<tr><td>🇦🇶 Antarctica</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/aq.m3u</code></td></tr>
<tr><td>🇦🇬 Antigua and Barbuda</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/ag.m3u</code></td></tr>
<tr><td>🇦🇷 Argentina</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/ar.m3u</code></td></tr>
<tr><td>🇦🇲 Armenia</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/am.m3u</code></td></tr>
<tr><td>🇦🇼 Aruba</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/aw.m3u</code></td></tr>
<tr><td>🇦🇺 Australia</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/au.m3u</code></td></tr>
<tr><td>🇦🇹 Austria</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/at.m3u</code></td></tr>
<tr><td>🇦🇿 Azerbaijan</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/az.m3u</code></td></tr>
<tr><td>🇧🇸 Bahamas</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/bs.m3u</code></td></tr>
<tr><td>🇧🇭 Bahrain</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/bh.m3u</code></td></tr>
<tr><td>🇧🇩 Bangladesh</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/bd.m3u</code></td></tr>
<tr><td>🇧🇧 Barbados</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/bb.m3u</code></td></tr>
<tr><td>🇧🇾 Belarus</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/by.m3u</code></td></tr>
<tr><td>🇧🇪 Belgium</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/be.m3u</code></td></tr>
<tr><td>🇧🇿 Belize</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/bz.m3u</code></td></tr>
<tr><td>🇧🇯 Benin</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/bj.m3u</code></td></tr>
<tr><td>🇧🇲 Bermuda</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/bm.m3u</code></td></tr>
<tr><td>🇧🇹 Bhutan</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/bt.m3u</code></td></tr>
<tr><td>🇧🇴 Bolivia</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/bo.m3u</code></td></tr>
<tr><td>🇧🇶 Bonaire</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/bq.m3u</code></td></tr>
<tr><td>🇧🇦 Bosnia and Herzegovina</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/ba.m3u</code></td></tr>
<tr><td>🇧🇼 Botswana</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/bw.m3u</code></td></tr>
<tr><td>🇧🇻 Bouvet Island</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/bv.m3u</code></td></tr>
<tr><td>🇧🇷 Brazil</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/br.m3u</code></td></tr>
<tr><td>🇮🇴 British Indian Ocean Territory</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/io.m3u</code></td></tr>
<tr><td>🇻🇬 British Virgin Islands</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/vg.m3u</code></td></tr>
<tr><td>🇧🇳 Brunei</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/bn.m3u</code></td></tr>
<tr><td>🇧🇬 Bulgaria</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/bg.m3u</code></td></tr>
<tr><td>🇧🇫 Burkina Faso</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/bf.m3u</code></td></tr>
<tr><td>🇧🇮 Burundi</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/bi.m3u</code></td></tr>
<tr><td>🇰🇭 Cambodia</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/kh.m3u</code></td></tr>
<tr><td>🇨🇲 Cameroon</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/cm.m3u</code></td></tr>
<tr><td>🇨🇦 Canada</td><td align="right">2</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/ca.m3u</code></td></tr>
<tr><td>🇨🇻 Cape Verde</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/cv.m3u</code></td></tr>
<tr><td>🇰🇾 Cayman Islands</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/ky.m3u</code></td></tr>
<tr><td>🇨🇫 Central African Republic</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/cf.m3u</code></td></tr>
<tr><td>🇹🇩 Chad</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/td.m3u</code></td></tr>
<tr><td>🇨🇱 Chile</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/cl.m3u</code></td></tr>
<tr><td>🇨🇳 China</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/cn.m3u</code></td></tr>
<tr><td>🇨🇽 Christmas Island</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/cx.m3u</code></td></tr>
<tr><td>🇨🇨 Cocos (Keeling) Islands</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/cc.m3u</code></td></tr>
<tr><td>🇨🇴 Colombia</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/co.m3u</code></td></tr>
<tr><td>🇰🇲 Comoros</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/km.m3u</code></td></tr>
<tr><td>🇨🇰 Cook Islands</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/ck.m3u</code></td></tr>
<tr><td>🇨🇷 Costa Rica</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/cr.m3u</code></td></tr>
<tr><td>🇭🇷 Croatia</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/hr.m3u</code></td></tr>
<tr><td>🇨🇺 Cuba</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/cu.m3u</code></td></tr>
<tr><td>🇨🇼 Curacao</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/cw.m3u</code></td></tr>
<tr><td>🇨🇾 Cyprus</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/cy.m3u</code></td></tr>
<tr><td>🇨🇿 Czech Republic</td><td align="right">1</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">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/cd.m3u</code></td></tr>
<tr><td>🇩🇰 Denmark</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/dk.m3u</code></td></tr>
<tr><td>🇩🇯 Djibouti</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/dj.m3u</code></td></tr>
<tr><td>🇩🇲 Dominica</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/dm.m3u</code></td></tr>
<tr><td>🇩🇴 Dominican Republic</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/do.m3u</code></td></tr>
<tr><td>🇹🇱 East Timor</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/tl.m3u</code></td></tr>
<tr><td>🇪🇨 Ecuador</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/ec.m3u</code></td></tr>
<tr><td>🇪🇬 Egypt</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/eg.m3u</code></td></tr>
<tr><td>🇸🇻 El Salvador</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/sv.m3u</code></td></tr>
<tr><td>🇬🇶 Equatorial Guinea</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/gq.m3u</code></td></tr>
<tr><td>🇪🇷 Eritrea</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/er.m3u</code></td></tr>
<tr><td>🇪🇪 Estonia</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/ee.m3u</code></td></tr>
<tr><td>🇪🇹 Ethiopia</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/et.m3u</code></td></tr>
<tr><td>🇫🇰 Falkland Islands</td><td align="right">1</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">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/fj.m3u</code></td></tr>
<tr><td>🇫🇮 Finland</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/fi.m3u</code></td></tr>
<tr><td>🇫🇷 France</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/fr.m3u</code></td></tr>
<tr><td>🇬🇫 French Guiana</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/gf.m3u</code></td></tr>
<tr><td>🇵🇫 French Polynesia</td><td align="right">1</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">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/tf.m3u</code></td></tr>
<tr><td>🇬🇦 Gabon</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/ga.m3u</code></td></tr>
<tr><td>🇬🇲 Gambia</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/gm.m3u</code></td></tr>
<tr><td>🇬🇪 Georgia</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/ge.m3u</code></td></tr>
<tr><td>🇩🇪 Germany</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/de.m3u</code></td></tr>
<tr><td>🇬🇭 Ghana</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/gh.m3u</code></td></tr>
<tr><td>🇬🇮 Gibraltar</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/gi.m3u</code></td></tr>
<tr><td>🇬🇷 Greece</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/gr.m3u</code></td></tr>
<tr><td>🇬🇱 Greenland</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/gl.m3u</code></td></tr>
<tr><td>🇬🇩 Grenada</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/gd.m3u</code></td></tr>
<tr><td>🇬🇵 Guadeloupe</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/gp.m3u</code></td></tr>
<tr><td>🇬🇺 Guam</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/gu.m3u</code></td></tr>
<tr><td>🇬🇹 Guatemala</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/gt.m3u</code></td></tr>
<tr><td>🇬🇬 Guernsey</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/gg.m3u</code></td></tr>
<tr><td>🇬🇳 Guinea</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/gn.m3u</code></td></tr>
<tr><td>🇬🇼 Guinea-Bissau</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/gw.m3u</code></td></tr>
<tr><td>🇬🇾 Guyana</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/gy.m3u</code></td></tr>
<tr><td>🇭🇹 Haiti</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/ht.m3u</code></td></tr>
<tr><td>🇭🇲 Heard Island and McDonald Islands</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/hm.m3u</code></td></tr>
<tr><td>🇭🇳 Honduras</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/hn.m3u</code></td></tr>
<tr><td>🇭🇰 Hong Kong</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/hk.m3u</code></td></tr>
<tr><td>🇭🇺 Hungary</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/hu.m3u</code></td></tr>
<tr><td>🇮🇸 Iceland</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/is.m3u</code></td></tr>
<tr><td>🇮🇳 India</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/in.m3u</code></td></tr>
<tr><td>🇮🇩 Indonesia</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/id.m3u</code></td></tr>
<tr><td>🇮🇷 Iran</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/ir.m3u</code></td></tr>
<tr><td>🇮🇶 Iraq</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/iq.m3u</code></td></tr>
<tr><td>🇮🇪 Ireland</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/ie.m3u</code></td></tr>
<tr><td>🇮🇲 Isle of Man</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/im.m3u</code></td></tr>
<tr><td>🇮🇱 Israel</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/il.m3u</code></td></tr>
<tr><td>🇮🇹 Italy</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/it.m3u</code></td></tr>
<tr><td>🇨🇮 Ivory Coast</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/ci.m3u</code></td></tr>
<tr><td>🇯🇲 Jamaica</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/jm.m3u</code></td></tr>
<tr><td>🇯🇵 Japan</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/jp.m3u</code></td></tr>
<tr><td>🇯🇪 Jersey</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/je.m3u</code></td></tr>
<tr><td>🇯🇴 Jordan</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/jo.m3u</code></td></tr>
<tr><td>🇰🇿 Kazakhstan</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/kz.m3u</code></td></tr>
<tr><td>🇰🇪 Kenya</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/ke.m3u</code></td></tr>
<tr><td>🇰🇮 Kiribati</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/ki.m3u</code></td></tr>
<tr><td>🇽🇰 Kosovo</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/xk.m3u</code></td></tr>
<tr><td>🇰🇼 Kuwait</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/kw.m3u</code></td></tr>
<tr><td>🇰🇬 Kyrgyzstan</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/kg.m3u</code></td></tr>
<tr><td>🇱🇦 Laos</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/la.m3u</code></td></tr>
<tr><td>🇱🇻 Latvia</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/lv.m3u</code></td></tr>
<tr><td>🇱🇧 Lebanon</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/lb.m3u</code></td></tr>
<tr><td>🇱🇸 Lesotho</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/ls.m3u</code></td></tr>
<tr><td>🇱🇷 Liberia</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/lr.m3u</code></td></tr>
<tr><td>🇱🇾 Libya</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/ly.m3u</code></td></tr>
<tr><td>🇱🇮 Liechtenstein</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/li.m3u</code></td></tr>
<tr><td>🇱🇹 Lithuania</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/lt.m3u</code></td></tr>
<tr><td>🇱🇺 Luxembourg</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/lu.m3u</code></td></tr>
<tr><td>🇲🇴 Macao</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/mo.m3u</code></td></tr>
<tr><td>🇲🇬 Madagascar</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/mg.m3u</code></td></tr>
<tr><td>🇲🇼 Malawi</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/mw.m3u</code></td></tr>
<tr><td>🇲🇾 Malaysia</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/my.m3u</code></td></tr>
<tr><td>🇲🇻 Maldives</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/mv.m3u</code></td></tr>
<tr><td>🇲🇱 Mali</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/ml.m3u</code></td></tr>
<tr><td>🇲🇹 Malta</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/mt.m3u</code></td></tr>
<tr><td>🇲🇭 Marshall Islands</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/mh.m3u</code></td></tr>
<tr><td>🇲🇶 Martinique</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/mq.m3u</code></td></tr>
<tr><td>🇲🇷 Mauritania</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/mr.m3u</code></td></tr>
<tr><td>🇲🇺 Mauritius</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/mu.m3u</code></td></tr>
<tr><td>🇾🇹 Mayotte</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/yt.m3u</code></td></tr>
<tr><td>🇲🇽 Mexico</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/mx.m3u</code></td></tr>
<tr><td>🇫🇲 Micronesia</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/fm.m3u</code></td></tr>
<tr><td>🇲🇩 Moldova</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/md.m3u</code></td></tr>
<tr><td>🇲🇨 Monaco</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/mc.m3u</code></td></tr>
<tr><td>🇲🇳 Mongolia</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/mn.m3u</code></td></tr>
<tr><td>🇲🇪 Montenegro</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/me.m3u</code></td></tr>
<tr><td>🇲🇸 Montserrat</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/ms.m3u</code></td></tr>
<tr><td>🇲🇦 Morocco</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/ma.m3u</code></td></tr>
<tr><td>🇲🇿 Mozambique</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/mz.m3u</code></td></tr>
<tr><td>🇲🇲 Myanmar (Burma)</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/mm.m3u</code></td></tr>
<tr><td>🇳🇦 Namibia</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/na.m3u</code></td></tr>
<tr><td>🇳🇷 Nauru</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/nr.m3u</code></td></tr>
<tr><td>🇳🇵 Nepal</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/np.m3u</code></td></tr>
<tr><td>🇳🇱 Netherlands</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/nl.m3u</code></td></tr>
<tr><td>🇳🇨 New Caledonia</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/nc.m3u</code></td></tr>
<tr><td>🇳🇿 New Zealand</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/nz.m3u</code></td></tr>
<tr><td>🇳🇮 Nicaragua</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/ni.m3u</code></td></tr>
<tr><td>🇳🇪 Niger</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/ne.m3u</code></td></tr>
<tr><td>🇳🇬 Nigeria</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/ng.m3u</code></td></tr>
<tr><td>🇳🇺 Niue</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/nu.m3u</code></td></tr>
<tr><td>🇳🇫 Norfolk Island</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/nf.m3u</code></td></tr>
<tr><td>🇰🇵 North Korea</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/kp.m3u</code></td></tr>
<tr><td>🇲🇰 North Macedonia</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/mk.m3u</code></td></tr>
<tr><td>🇲🇵 Northern Mariana Islands</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/mp.m3u</code></td></tr>
<tr><td>🇳🇴 Norway</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/no.m3u</code></td></tr>
<tr><td>🇴🇲 Oman</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/om.m3u</code></td></tr>
<tr><td>🇵🇰 Pakistan</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/pk.m3u</code></td></tr>
<tr><td>🇵🇼 Palau</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/pw.m3u</code></td></tr>
<tr><td>🇵🇸 Palestine</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/ps.m3u</code></td></tr>
<tr><td>🇵🇦 Panama</td><td align="right">1</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">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/pg.m3u</code></td></tr>
<tr><td>🇵🇾 Paraguay</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/py.m3u</code></td></tr>
<tr><td>🇵🇪 Peru</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/pe.m3u</code></td></tr>
<tr><td>🇵🇭 Philippines</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/ph.m3u</code></td></tr>
<tr><td>🇵🇳 Pitcairn Islands</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/pn.m3u</code></td></tr>
<tr><td>🇵🇱 Poland</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/pl.m3u</code></td></tr>
<tr><td>🇵🇹 Portugal</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/pt.m3u</code></td></tr>
<tr><td>🇵🇷 Puerto Rico</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/pr.m3u</code></td></tr>
<tr><td>🇶🇦 Qatar</td><td align="right">1</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">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/cg.m3u</code></td></tr>
<tr><td>🇷🇴 Romania</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/ro.m3u</code></td></tr>
<tr><td>🇷🇺 Russia</td><td align="right">2</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/ru.m3u</code></td></tr>
<tr><td>🇷🇼 Rwanda</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/rw.m3u</code></td></tr>
<tr><td>🇷🇪 Réunion</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/re.m3u</code></td></tr>
<tr><td>🇧🇱 Saint Barthélemy</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/bl.m3u</code></td></tr>
<tr><td>🇸🇭 Saint Helena</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/sh.m3u</code></td></tr>
<tr><td>🇰🇳 Saint Kitts and Nevis</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/kn.m3u</code></td></tr>
<tr><td>🇱🇨 Saint Lucia</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/lc.m3u</code></td></tr>
<tr><td>🇲🇫 Saint Martin</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/mf.m3u</code></td></tr>
<tr><td>🇵🇲 Saint Pierre and Miquelon</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/pm.m3u</code></td></tr>
<tr><td>🇻🇨 Saint Vincent and the Grenadines</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/vc.m3u</code></td></tr>
<tr><td>🇼🇸 Samoa</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/ws.m3u</code></td></tr>
<tr><td>🇸🇲 San Marino</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/sm.m3u</code></td></tr>
<tr><td>🇸🇦 Saudi Arabia</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/sa.m3u</code></td></tr>
<tr><td>🇸🇳 Senegal</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/sn.m3u</code></td></tr>
<tr><td>🇷🇸 Serbia</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/rs.m3u</code></td></tr>
<tr><td>🇸🇨 Seychelles</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/sc.m3u</code></td></tr>
<tr><td>🇸🇱 Sierra Leone</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/sl.m3u</code></td></tr>
<tr><td>🇸🇬 Singapore</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/sg.m3u</code></td></tr>
<tr><td>🇸🇽 Sint Maarten</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/sx.m3u</code></td></tr>
<tr><td>🇸🇰 Slovakia</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/sk.m3u</code></td></tr>
<tr><td>🇸🇮 Slovenia</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/si.m3u</code></td></tr>
<tr><td>🇸🇧 Solomon Islands</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/sb.m3u</code></td></tr>
<tr><td>🇸🇴 Somalia</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/so.m3u</code></td></tr>
<tr><td>🇿🇦 South Africa</td><td align="right">1</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">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/gs.m3u</code></td></tr>
<tr><td>🇰🇷 South Korea</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/kr.m3u</code></td></tr>
<tr><td>🇸🇸 South Sudan</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/ss.m3u</code></td></tr>
<tr><td>🇪🇸 Spain</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/es.m3u</code></td></tr>
<tr><td>🇱🇰 Sri Lanka</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/lk.m3u</code></td></tr>
<tr><td>🇸🇩 Sudan</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/sd.m3u</code></td></tr>
<tr><td>🇸🇷 Suriname</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/sr.m3u</code></td></tr>
<tr><td>🇸🇯 Svalbard and Jan Mayen</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/sj.m3u</code></td></tr>
<tr><td>🇸🇿 Swaziland</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/sz.m3u</code></td></tr>
<tr><td>🇸🇪 Sweden</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/se.m3u</code></td></tr>
<tr><td>🇨🇭 Switzerland</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/ch.m3u</code></td></tr>
<tr><td>🇸🇾 Syria</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/sy.m3u</code></td></tr>
<tr><td>🇸🇹 São Tomé and Príncipe</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/st.m3u</code></td></tr>
<tr><td>🇹🇼 Taiwan</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/tw.m3u</code></td></tr>
<tr><td>🇹🇯 Tajikistan</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/tj.m3u</code></td></tr>
<tr><td>🇹🇿 Tanzania</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/tz.m3u</code></td></tr>
<tr><td>🇹🇭 Thailand</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/th.m3u</code></td></tr>
<tr><td>🇹🇬 Togo</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/tg.m3u</code></td></tr>
<tr><td>🇹🇰 Tokelau</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/tk.m3u</code></td></tr>
<tr><td>🇹🇴 Tonga</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/to.m3u</code></td></tr>
<tr><td>🇹🇹 Trinidad and Tobago</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/tt.m3u</code></td></tr>
<tr><td>🇹🇳 Tunisia</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/tn.m3u</code></td></tr>
<tr><td>🇹🇷 Turkey</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/tr.m3u</code></td></tr>
<tr><td>🇹🇲 Turkmenistan</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/tm.m3u</code></td></tr>
<tr><td>🇹🇨 Turks and Caicos Islands</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/tc.m3u</code></td></tr>
<tr><td>🇹🇻 Tuvalu</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/tv.m3u</code></td></tr>
<tr><td>🇺🇲 U.S. Minor Outlying Islands</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/um.m3u</code></td></tr>
<tr><td>🇻🇮 U.S. Virgin Islands</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/vi.m3u</code></td></tr>
<tr><td>🇺🇬 Uganda</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/ug.m3u</code></td></tr>
<tr><td>🇺🇦 Ukraine</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/ua.m3u</code></td></tr>
<tr><td>🇦🇪 United Arab Emirates</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/ae.m3u</code></td></tr>
<tr><td>🇬🇧 United Kingdom</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/uk.m3u</code></td></tr>
<tr><td>🇺🇸 United States</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/us.m3u</code></td></tr>
<tr><td>🇺🇾 Uruguay</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/uy.m3u</code></td></tr>
<tr><td>🇺🇿 Uzbekistan</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/uz.m3u</code></td></tr>
<tr><td>🇻🇺 Vanuatu</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/vu.m3u</code></td></tr>
<tr><td>🇻🇦 Vatican City</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/va.m3u</code></td></tr>
<tr><td>🇻🇪 Venezuela</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/ve.m3u</code></td></tr>
<tr><td>🇻🇳 Vietnam</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/vn.m3u</code></td></tr>
<tr><td>🇼🇫 Wallis and Futuna</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/wf.m3u</code></td></tr>
<tr><td>🇪🇭 Western Sahara</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/eh.m3u</code></td></tr>
<tr><td>🇾🇪 Yemen</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/ye.m3u</code></td></tr>
<tr><td>🇿🇲 Zambia</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/zm.m3u</code></td></tr>
<tr><td>🇿🇼 Zimbabwe</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/zw.m3u</code></td></tr>
<tr><td>🇦🇽 Åland</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/ax.m3u</code></td></tr>
<tr><td>Undefined</td><td align="right">2</td><td nowrap><code>https://iptv-org.github.io/iptv/countries/undefined.m3u</code></td></tr>
</tbody>
</table>
</details>
### Playlists by language
<details>
<summary>Expand</summary>
<br>
<!-- prettier-ignore -->
<table>
<thead>
<tr><th align="left">Language</th><th align="left">Channels</th><th align="left">Playlist</th></tr>
</thead>
<tbody>
<tr><td align="left">Catalan</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/cat.m3u</code></td></tr>
<tr><td align="left">English</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/eng.m3u</code></td></tr>
<tr><td align="left">French</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/fra.m3u</code></td></tr>
<tr><td align="left">Russian</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/rus.m3u</code></td></tr>
<tr><td align="left">Undefined</td><td align="right">2</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/undefined.m3u</code></td></tr>
</tbody>
</table>
</details>
### Playlists by region
<details>
<summary>Expand</summary>
<br>
<!-- prettier-ignore -->
<table>
<thead>
<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">0</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">1</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">0</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">1</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">0</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/regions/apac.m3u</code></td></tr>
<tr><td align="left">Caribbean</td><td align="right">0</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/regions/carib.m3u</code></td></tr>
<tr><td align="left">Central Asia</td><td align="right">0</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">1</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">2</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">2</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">0</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">0</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">0</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">0</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">0</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">0</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">0</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">1</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">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/regions/nam.m3u</code></td></tr>
<tr><td align="left">Oceania</td><td align="right">0</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/regions/oce.m3u</code></td></tr>
<tr><td align="left">South Asia</td><td align="right">0</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/regions/sas.m3u</code></td></tr>
<tr><td align="left">Sub-Saharan Africa</td><td align="right">0</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">0</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/regions/wafr.m3u</code></td></tr>
<tr><td align="left">Worldwide</td><td align="right">4</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/regions/int.m3u</code></td></tr>
<tr><td align="left">Undefined</td><td align="right">2</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/regions/undefined.m3u</code></td></tr>
</tbody>
</table>
</details>
## EPG
Playlists already have a built-in list of EPG, so players that support the `x-tvg-url` tag should load it automatically. If not, you can find a list of available programs here:
https://github.com/iptv-org/epg
## Resources
You can find links to various IPTV related resources in this repository [iptv-org/awesome-iptv](https://github.com/iptv-org/awesome-iptv).
## API
The API documentation can be found in the [iptv-org/api](https://github.com/iptv-org/api) repository.
## Contribution
Please make sure to read the [Contributing Guide](CONTRIBUTING.md) before sending an issue or making a pull request.
## Legal
No video files are stored in this repository. The repository simply contains user-submitted links to publicly available video stream URLs, which to the best of our knowledge have been intentionally made publicly by the copyright holders. If any links in these playlists infringe on your rights as a copyright holder, they may be removed by sending a pull request or opening an issue. However, note that we have **no control** over the destination of the link, and just removing the link from the playlist will not remove its contents from the web. Note that linking does not directly infringe copyright because no copy is made on the site providing the link, and thus this is **not** a valid reason to send a DMCA notice to GitHub. To remove this content from the web, you should contact the web host that's actually hosting the content (**not** GitHub, nor the maintainers of this repository).

View File

@ -1,5 +0,0 @@
{"channel_name":"ЛДПР ТВ","channel_id":"LDPRTV.ru","filepath":"tests/__data__/output/channels/ru.m3u","resolution":{"height":1080,"width":null},"status":{"label":"","code":"online","level":1},"url":"http://46.46.143.222:1935/live/mp4:ldpr.stream/playlist.m3u8","http":{"referrer":"","user-agent":""},"is_broken":false,"updated":false,"cluster_id":1,"_id":"2ST8btby3mmsgPF0"}
{"channel_name":"BBC News HD","channel_id":"BBCNews.uk","filepath":"tests/__data__/output/channels/uk.m3u","resolution":{"height":720,"width":null},"status":{"label":"Not 24/7","code":"not_247","level":3},"url":"http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8","http":{"referrer":"","user-agent":""},"is_broken":false,"updated":false,"cluster_id":3,"_id":"3TbieV1ptnZVCIdn"}
{"channel_name":"ATV","channel_id":"AndorraTV.ad","filepath":"tests/__data__/output/channels/ad.m3u","resolution":{"height":720,"width":null},"status":{"label":"Offline","code":"offline","level":5},"url":"https://iptv-all.lanesh4d0w.repl.co/andorra/atv","http":{"referrer":"","user-agent":""},"is_broken":true,"updated":false,"cluster_id":1,"_id":"I6cjG2xCBRFFP4sz"}
{"channel_name":"Kayhan TV","channel_id":"KayhanTV.af","filepath":"channels/af.m3u","resolution":{"height":720,"width":null},"status":{"label":"Geo-blocked","code":"geo_blocked","level":2},"url":"http://208.93.117.113/live/Stream1/playlist.m3u8","http":{"referrer":"","user-agent":""},"is_broken":false,"updated":false,"cluster_id":1,"_id":"cFFpFVzSn6xFMUF3"}
{"channel_name":"Sharq","channel_id":"Sharq.af","filepath":"channels/af.m3u","resolution":{"height":576,"width":null},"status":{"label":"Offline","code":"offline","level":5},"url":"http://51.210.199.50/hls/stream.m3u8","http":{"referrer":"","user-agent":""},"is_broken":true,"updated":false,"cluster_id":1,"_id":"u7iyA6cjtf1iWWAZ"}

View File

@ -1,6 +0,0 @@
{"channel_name":"ЛДПР ТВ","channel_id":"LDPRTV.ru","filepath":"tests/__data__/output/channels/ru.m3u","resolution":{"width":1920,"height":1080},"status":{"label":"","code":"online","level":1},"url":"http://46.46.143.222:1935/live/mp4:ldpr.stream/playlist.m3u8","http":{"referrer":"","user-agent":""},"is_broken":false,"updated":true,"cluster_id":1,"_id":"2ST8btby3mmsgPF0"}
{"channel_name":"BBC News HD","channel_id":"BBCNews.uk","filepath":"tests/__data__/output/channels/uk.m3u","resolution":{"height":720,"width":null},"status":{"label":"Not 24/7","code":"not_247","level":3},"url":"http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8","http":{"referrer":"","user-agent":""},"is_broken":false,"updated":false,"cluster_id":3,"_id":"3TbieV1ptnZVCIdn"}
{"channel_name":"ATV","channel_id":"AndorraTV.ad","filepath":"tests/__data__/output/channels/ad.m3u","resolution":{"height":720,"width":null},"status":{"label":"Offline","code":"offline","level":5},"url":"https://iptv-all.lanesh4d0w.repl.co/andorra/atv","http":{"referrer":"","user-agent":""},"is_broken":true,"updated":false,"cluster_id":1,"_id":"I6cjG2xCBRFFP4sz"}
{"channel_name":"BBC News HD","channel_id":"AndorraTV.ad","filepath":"tests/__data__/output/channels/uk.m3u","resolution":{"height":720,"width":null},"status":{"label":"Not 24/7","code":"not_247","level":3},"url":"http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8","http":{"referrer":"","user-agent":""},"is_broken":false,"updated":false,"cluster_id":3,"_id":"WTbieV1ptnZVCIdn"}
{"channel_name":"Kayhan TV","channel_id":"KayhanTV.af","filepath":"channels/af.m3u","resolution":{"height":720,"width":null},"status":{"label":"Geo-blocked","code":"geo_blocked","level":2},"url":"http://208.93.117.113/live/Stream1/playlist.m3u8","http":{"referrer":"","user-agent":""},"is_broken":false,"updated":false,"cluster_id":1,"_id":"cFFpFVzSn6xFMUF3"}
{"channel_name":"Sharq","channel_id":"Sharq.af","filepath":"channels/af.m3u","resolution":{"height":576,"width":null},"status":{"label":"Offline","code":"offline","level":5},"url":"http://51.210.199.50/hls/stream.m3u8","http":{"referrer":"","user-agent":""},"is_broken":true,"updated":false,"cluster_id":1,"_id":"u7iyA6cjtf1iWWAZ"}

View File

@ -1,3 +0,0 @@
{"channel_name":"ATV","channel_id":"ATV.ad","filepath":"tests/__data__/input/channels/ad.m3u","resolution":{"height":720,"width":null},"status":{"label":"Offline","code":"offline","level":5},"url":"https://iptv-all.lanesh4d0w.repl.co/andorra/atv","http":{"referrer":"","user-agent":""},"is_broken":true,"updated":false,"cluster_id":1,"_id":"verufR2ehwdsfou3"}
{"channel_name":"Fox Sports 2 Asia (Thai)","channel_id":"FoxSports2AsiaThai.us","filepath":"tests/__data__/input/channels/us_blocked.m3u","resolution":{"height":720,"width":null},"status":{"label":"","code":"online","level":1},"url":"https://example.com/playlist.m3u8","http":{"referrer":"","user-agent":""},"is_broken":false,"updated":true,"cluster_id":1,"_id":"sLG04kZhqlEcYc25"}
{"channel_id":null,"channel_name":"1A Network","filepath":"tests/__data__/input/channels/unsorted.m3u","resolution":{"height":720,"width":null},"status":{"label":"","code":"online","level":1},"url":"https://simultv.s.llnwi.net/n4s4/2ANetwork/interlink.m3u8","http":{"referrer":"","user-agent":""},"is_broken":false,"updated":true,"cluster_id":1,"_id":"Jruf9KFXRsa5BjYj"}

View File

@ -1,3 +1,29 @@
{"name":"General","slug":"general","count":1}
{"name":"News","slug":"news","count":1}
{"name":"Other","slug":"other","count":0}
{"filepath":"categories/auto.m3u","count":0}
{"filepath":"categories/animation.m3u","count":0}
{"filepath":"categories/business.m3u","count":0}
{"filepath":"categories/classic.m3u","count":0}
{"filepath":"categories/comedy.m3u","count":0}
{"filepath":"categories/cooking.m3u","count":0}
{"filepath":"categories/culture.m3u","count":0}
{"filepath":"categories/documentary.m3u","count":0}
{"filepath":"categories/education.m3u","count":0}
{"filepath":"categories/entertainment.m3u","count":0}
{"filepath":"categories/family.m3u","count":0}
{"filepath":"categories/general.m3u","count":2}
{"filepath":"categories/kids.m3u","count":0}
{"filepath":"categories/legislative.m3u","count":0}
{"filepath":"categories/lifestyle.m3u","count":0}
{"filepath":"categories/movies.m3u","count":0}
{"filepath":"categories/music.m3u","count":0}
{"filepath":"categories/news.m3u","count":1}
{"filepath":"categories/outdoor.m3u","count":0}
{"filepath":"categories/relax.m3u","count":0}
{"filepath":"categories/religious.m3u","count":0}
{"filepath":"categories/series.m3u","count":0}
{"filepath":"categories/science.m3u","count":0}
{"filepath":"categories/shop.m3u","count":0}
{"filepath":"categories/sports.m3u","count":0}
{"filepath":"categories/travel.m3u","count":0}
{"filepath":"categories/weather.m3u","count":1}
{"filepath":"categories/xxx.m3u","count":1}
{"filepath":"categories/undefined.m3u","count":3}

View File

@ -1,4 +1,251 @@
{"name":"Andorra","code":"AD","count":0}
{"name":"Russia","code":"RU","count":1}
{"name":"United Kingdom","code":"UK","count":1}
{"name":"Undefined","code":"UNDEFINED","count":0}
{"filepath":"countries/af.m3u","count":1}
{"filepath":"countries/al.m3u","count":1}
{"filepath":"countries/dz.m3u","count":1}
{"filepath":"countries/as.m3u","count":1}
{"filepath":"countries/ad.m3u","count":2}
{"filepath":"countries/ao.m3u","count":1}
{"filepath":"countries/ai.m3u","count":1}
{"filepath":"countries/aq.m3u","count":1}
{"filepath":"countries/ag.m3u","count":1}
{"filepath":"countries/ar.m3u","count":1}
{"filepath":"countries/am.m3u","count":1}
{"filepath":"countries/aw.m3u","count":1}
{"filepath":"countries/au.m3u","count":1}
{"filepath":"countries/at.m3u","count":1}
{"filepath":"countries/az.m3u","count":1}
{"filepath":"countries/bs.m3u","count":1}
{"filepath":"countries/bh.m3u","count":1}
{"filepath":"countries/bd.m3u","count":1}
{"filepath":"countries/bb.m3u","count":1}
{"filepath":"countries/by.m3u","count":1}
{"filepath":"countries/be.m3u","count":1}
{"filepath":"countries/bz.m3u","count":1}
{"filepath":"countries/bj.m3u","count":1}
{"filepath":"countries/bm.m3u","count":1}
{"filepath":"countries/bt.m3u","count":1}
{"filepath":"countries/bo.m3u","count":1}
{"filepath":"countries/bq.m3u","count":1}
{"filepath":"countries/ba.m3u","count":1}
{"filepath":"countries/bw.m3u","count":1}
{"filepath":"countries/bv.m3u","count":1}
{"filepath":"countries/br.m3u","count":1}
{"filepath":"countries/io.m3u","count":1}
{"filepath":"countries/vg.m3u","count":1}
{"filepath":"countries/bn.m3u","count":1}
{"filepath":"countries/bg.m3u","count":1}
{"filepath":"countries/bf.m3u","count":1}
{"filepath":"countries/bi.m3u","count":1}
{"filepath":"countries/kh.m3u","count":1}
{"filepath":"countries/cm.m3u","count":1}
{"filepath":"countries/ca.m3u","count":2}
{"filepath":"countries/cv.m3u","count":1}
{"filepath":"countries/ky.m3u","count":1}
{"filepath":"countries/cf.m3u","count":1}
{"filepath":"countries/td.m3u","count":1}
{"filepath":"countries/cl.m3u","count":1}
{"filepath":"countries/cn.m3u","count":1}
{"filepath":"countries/cx.m3u","count":1}
{"filepath":"countries/cc.m3u","count":1}
{"filepath":"countries/co.m3u","count":1}
{"filepath":"countries/km.m3u","count":1}
{"filepath":"countries/ck.m3u","count":1}
{"filepath":"countries/cr.m3u","count":1}
{"filepath":"countries/hr.m3u","count":1}
{"filepath":"countries/cu.m3u","count":1}
{"filepath":"countries/cw.m3u","count":1}
{"filepath":"countries/cy.m3u","count":1}
{"filepath":"countries/cz.m3u","count":1}
{"filepath":"countries/cd.m3u","count":1}
{"filepath":"countries/dk.m3u","count":1}
{"filepath":"countries/dj.m3u","count":1}
{"filepath":"countries/dm.m3u","count":1}
{"filepath":"countries/do.m3u","count":1}
{"filepath":"countries/tl.m3u","count":1}
{"filepath":"countries/ec.m3u","count":1}
{"filepath":"countries/eg.m3u","count":1}
{"filepath":"countries/sv.m3u","count":1}
{"filepath":"countries/gq.m3u","count":1}
{"filepath":"countries/er.m3u","count":1}
{"filepath":"countries/ee.m3u","count":1}
{"filepath":"countries/et.m3u","count":1}
{"filepath":"countries/fk.m3u","count":1}
{"filepath":"countries/fo.m3u","count":1}
{"filepath":"countries/fj.m3u","count":1}
{"filepath":"countries/fi.m3u","count":1}
{"filepath":"countries/fr.m3u","count":1}
{"filepath":"countries/gf.m3u","count":1}
{"filepath":"countries/pf.m3u","count":1}
{"filepath":"countries/tf.m3u","count":1}
{"filepath":"countries/ga.m3u","count":1}
{"filepath":"countries/gm.m3u","count":1}
{"filepath":"countries/ge.m3u","count":1}
{"filepath":"countries/de.m3u","count":1}
{"filepath":"countries/gh.m3u","count":1}
{"filepath":"countries/gi.m3u","count":1}
{"filepath":"countries/gr.m3u","count":1}
{"filepath":"countries/gl.m3u","count":1}
{"filepath":"countries/gd.m3u","count":1}
{"filepath":"countries/gp.m3u","count":1}
{"filepath":"countries/gu.m3u","count":1}
{"filepath":"countries/gt.m3u","count":1}
{"filepath":"countries/gg.m3u","count":1}
{"filepath":"countries/gn.m3u","count":1}
{"filepath":"countries/gw.m3u","count":1}
{"filepath":"countries/gy.m3u","count":1}
{"filepath":"countries/ht.m3u","count":1}
{"filepath":"countries/hm.m3u","count":1}
{"filepath":"countries/hn.m3u","count":1}
{"filepath":"countries/hk.m3u","count":1}
{"filepath":"countries/hu.m3u","count":1}
{"filepath":"countries/is.m3u","count":1}
{"filepath":"countries/in.m3u","count":1}
{"filepath":"countries/id.m3u","count":1}
{"filepath":"countries/ir.m3u","count":1}
{"filepath":"countries/iq.m3u","count":1}
{"filepath":"countries/ie.m3u","count":1}
{"filepath":"countries/im.m3u","count":1}
{"filepath":"countries/il.m3u","count":1}
{"filepath":"countries/it.m3u","count":1}
{"filepath":"countries/ci.m3u","count":1}
{"filepath":"countries/jm.m3u","count":1}
{"filepath":"countries/jp.m3u","count":1}
{"filepath":"countries/je.m3u","count":1}
{"filepath":"countries/jo.m3u","count":1}
{"filepath":"countries/kz.m3u","count":1}
{"filepath":"countries/ke.m3u","count":1}
{"filepath":"countries/ki.m3u","count":1}
{"filepath":"countries/xk.m3u","count":1}
{"filepath":"countries/kw.m3u","count":1}
{"filepath":"countries/kg.m3u","count":1}
{"filepath":"countries/la.m3u","count":1}
{"filepath":"countries/lv.m3u","count":1}
{"filepath":"countries/lb.m3u","count":1}
{"filepath":"countries/ls.m3u","count":1}
{"filepath":"countries/lr.m3u","count":1}
{"filepath":"countries/ly.m3u","count":1}
{"filepath":"countries/li.m3u","count":1}
{"filepath":"countries/lt.m3u","count":1}
{"filepath":"countries/lu.m3u","count":1}
{"filepath":"countries/mo.m3u","count":1}
{"filepath":"countries/mg.m3u","count":1}
{"filepath":"countries/mw.m3u","count":1}
{"filepath":"countries/my.m3u","count":1}
{"filepath":"countries/mv.m3u","count":1}
{"filepath":"countries/ml.m3u","count":1}
{"filepath":"countries/mt.m3u","count":1}
{"filepath":"countries/mh.m3u","count":1}
{"filepath":"countries/mq.m3u","count":1}
{"filepath":"countries/mr.m3u","count":1}
{"filepath":"countries/mu.m3u","count":1}
{"filepath":"countries/yt.m3u","count":1}
{"filepath":"countries/mx.m3u","count":1}
{"filepath":"countries/fm.m3u","count":1}
{"filepath":"countries/md.m3u","count":1}
{"filepath":"countries/mc.m3u","count":1}
{"filepath":"countries/mn.m3u","count":1}
{"filepath":"countries/me.m3u","count":1}
{"filepath":"countries/ms.m3u","count":1}
{"filepath":"countries/ma.m3u","count":1}
{"filepath":"countries/mz.m3u","count":1}
{"filepath":"countries/mm.m3u","count":1}
{"filepath":"countries/na.m3u","count":1}
{"filepath":"countries/nr.m3u","count":1}
{"filepath":"countries/np.m3u","count":1}
{"filepath":"countries/nl.m3u","count":1}
{"filepath":"countries/nc.m3u","count":1}
{"filepath":"countries/nz.m3u","count":1}
{"filepath":"countries/ni.m3u","count":1}
{"filepath":"countries/ne.m3u","count":1}
{"filepath":"countries/ng.m3u","count":1}
{"filepath":"countries/nu.m3u","count":1}
{"filepath":"countries/nf.m3u","count":1}
{"filepath":"countries/kp.m3u","count":1}
{"filepath":"countries/mk.m3u","count":1}
{"filepath":"countries/mp.m3u","count":1}
{"filepath":"countries/no.m3u","count":1}
{"filepath":"countries/om.m3u","count":1}
{"filepath":"countries/pk.m3u","count":1}
{"filepath":"countries/pw.m3u","count":1}
{"filepath":"countries/ps.m3u","count":1}
{"filepath":"countries/pa.m3u","count":1}
{"filepath":"countries/pg.m3u","count":1}
{"filepath":"countries/py.m3u","count":1}
{"filepath":"countries/pe.m3u","count":1}
{"filepath":"countries/ph.m3u","count":1}
{"filepath":"countries/pn.m3u","count":1}
{"filepath":"countries/pl.m3u","count":1}
{"filepath":"countries/pt.m3u","count":1}
{"filepath":"countries/pr.m3u","count":1}
{"filepath":"countries/qa.m3u","count":1}
{"filepath":"countries/cg.m3u","count":1}
{"filepath":"countries/ro.m3u","count":1}
{"filepath":"countries/ru.m3u","count":2}
{"filepath":"countries/rw.m3u","count":1}
{"filepath":"countries/re.m3u","count":1}
{"filepath":"countries/bl.m3u","count":1}
{"filepath":"countries/sh.m3u","count":1}
{"filepath":"countries/kn.m3u","count":1}
{"filepath":"countries/lc.m3u","count":1}
{"filepath":"countries/mf.m3u","count":1}
{"filepath":"countries/pm.m3u","count":1}
{"filepath":"countries/vc.m3u","count":1}
{"filepath":"countries/ws.m3u","count":1}
{"filepath":"countries/sm.m3u","count":1}
{"filepath":"countries/sa.m3u","count":1}
{"filepath":"countries/sn.m3u","count":1}
{"filepath":"countries/rs.m3u","count":1}
{"filepath":"countries/sc.m3u","count":1}
{"filepath":"countries/sl.m3u","count":1}
{"filepath":"countries/sg.m3u","count":1}
{"filepath":"countries/sx.m3u","count":1}
{"filepath":"countries/sk.m3u","count":1}
{"filepath":"countries/si.m3u","count":1}
{"filepath":"countries/sb.m3u","count":1}
{"filepath":"countries/so.m3u","count":1}
{"filepath":"countries/za.m3u","count":1}
{"filepath":"countries/gs.m3u","count":1}
{"filepath":"countries/kr.m3u","count":1}
{"filepath":"countries/ss.m3u","count":1}
{"filepath":"countries/es.m3u","count":1}
{"filepath":"countries/lk.m3u","count":1}
{"filepath":"countries/sd.m3u","count":1}
{"filepath":"countries/sr.m3u","count":1}
{"filepath":"countries/sj.m3u","count":1}
{"filepath":"countries/sz.m3u","count":1}
{"filepath":"countries/se.m3u","count":1}
{"filepath":"countries/ch.m3u","count":1}
{"filepath":"countries/sy.m3u","count":1}
{"filepath":"countries/st.m3u","count":1}
{"filepath":"countries/tw.m3u","count":1}
{"filepath":"countries/tj.m3u","count":1}
{"filepath":"countries/tz.m3u","count":1}
{"filepath":"countries/th.m3u","count":1}
{"filepath":"countries/tg.m3u","count":1}
{"filepath":"countries/tk.m3u","count":1}
{"filepath":"countries/to.m3u","count":1}
{"filepath":"countries/tt.m3u","count":1}
{"filepath":"countries/tn.m3u","count":1}
{"filepath":"countries/tr.m3u","count":1}
{"filepath":"countries/tm.m3u","count":1}
{"filepath":"countries/tc.m3u","count":1}
{"filepath":"countries/tv.m3u","count":1}
{"filepath":"countries/um.m3u","count":1}
{"filepath":"countries/vi.m3u","count":1}
{"filepath":"countries/ug.m3u","count":1}
{"filepath":"countries/ua.m3u","count":1}
{"filepath":"countries/ae.m3u","count":1}
{"filepath":"countries/uk.m3u","count":1}
{"filepath":"countries/us.m3u","count":1}
{"filepath":"countries/uy.m3u","count":1}
{"filepath":"countries/uz.m3u","count":1}
{"filepath":"countries/vu.m3u","count":1}
{"filepath":"countries/va.m3u","count":1}
{"filepath":"countries/ve.m3u","count":1}
{"filepath":"countries/vn.m3u","count":1}
{"filepath":"countries/wf.m3u","count":1}
{"filepath":"countries/eh.m3u","count":1}
{"filepath":"countries/ye.m3u","count":1}
{"filepath":"countries/zm.m3u","count":1}
{"filepath":"countries/zw.m3u","count":1}
{"filepath":"countries/ax.m3u","count":1}
{"filepath":"countries/undefined.m3u","count":2}

View File

@ -1,4 +1,5 @@
{"name":"Catalan","code":"cat","count":0}
{"name":"English","code":"eng","count":1}
{"name":"Russian","code":"rus","count":1}
{"name":"Undefined","code":"undefined","count":0}
{"filepath":"languages/cat.m3u","count":1}
{"filepath":"languages/eng.m3u","count":1}
{"filepath":"languages/fra.m3u","count":1}
{"filepath":"languages/rus.m3u","count":1}
{"filepath":"languages/undefined.m3u","count":2}

View File

@ -1,6 +1,25 @@
{"name":"Asia","code":"ASIA","count":1}
{"name":"Commonwealth of Independent States","code":"CIS","count":1}
{"name":"Europe","code":"EUR","count":2}
{"name":"Europe, the Middle East and Africa","code":"EMEA","count":2}
{"name":"Worldwide","code":"INT","count":1}
{"name":"Undefined","code":"UNDEFINED","count":0}
{"filepath":"regions/afr.m3u","count":0}
{"filepath":"regions/amer.m3u","count":1}
{"filepath":"regions/arab.m3u","count":0}
{"filepath":"regions/asia.m3u","count":1}
{"filepath":"regions/apac.m3u","count":0}
{"filepath":"regions/carib.m3u","count":0}
{"filepath":"regions/cas.m3u","count":0}
{"filepath":"regions/cis.m3u","count":1}
{"filepath":"regions/eur.m3u","count":2}
{"filepath":"regions/emea.m3u","count":2}
{"filepath":"regions/hispam.m3u","count":0}
{"filepath":"regions/latam.m3u","count":0}
{"filepath":"regions/lac.m3u","count":0}
{"filepath":"regions/maghreb.m3u","count":0}
{"filepath":"regions/mideast.m3u","count":0}
{"filepath":"regions/mena.m3u","count":0}
{"filepath":"regions/nord.m3u","count":0}
{"filepath":"regions/noram.m3u","count":1}
{"filepath":"regions/nam.m3u","count":1}
{"filepath":"regions/oce.m3u","count":0}
{"filepath":"regions/sas.m3u","count":0}
{"filepath":"regions/ssa.m3u","count":0}
{"filepath":"regions/wafr.m3u","count":0}
{"filepath":"regions/int.m3u","count":4}
{"filepath":"regions/undefined.m3u","count":2}

View File

@ -1,180 +0,0 @@
# IPTV
[![auto-update](https://github.com/iptv-org/iptv/actions/workflows/auto-update.yml/badge.svg)](https://github.com/iptv-org/iptv/actions/workflows/auto-update.yml)
Collection of publicly available IPTV channels from all over the world.
## Usage
To watch IPTV you just need to paste this link `https://iptv-org.github.io/iptv/index.m3u` to any player which supports M3U-playlists.
![VLC Network Panel](.readme/preview.png)
Also you can instead use one of these playlists:
- `https://iptv-org.github.io/iptv/index.category.m3u` (grouped by category)
- `https://iptv-org.github.io/iptv/index.language.m3u` (grouped by language)
- `https://iptv-org.github.io/iptv/index.country.m3u` (grouped by country)
- `https://iptv-org.github.io/iptv/index.region.m3u` (grouped by region)
- `https://iptv-org.github.io/iptv/index.nsfw.m3u` (includes adult channels)
Or select one of the playlists from the list below.
### Playlists by category
<details>
<summary>Expand</summary>
<br>
<!-- prettier-ignore -->
<table>
<thead>
<tr><th align="left">Category</th><th align="right">Channels</th><th align="left">Playlist</th></tr>
</thead>
<tbody>
<tr><td align="left">General</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/categories/general.m3u</code></td></tr>
<tr><td align="left">News</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/categories/news.m3u</code></td></tr>
<tr><td align="left">Other</td><td align="right">0</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/categories/other.m3u</code></td></tr>
</tbody>
</table>
</details>
### Playlists by language
<details>
<summary>Expand</summary>
<br>
<!-- prettier-ignore -->
<table>
<thead>
<tr><th align="left">Language</th><th align="right">Channels</th><th align="left">Playlist</th></tr>
</thead>
<tbody>
<tr><td align="left">Catalan</td><td align="right">0</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/cat.m3u</code></td></tr>
<tr><td align="left">English</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/eng.m3u</code></td></tr>
<tr><td align="left">Russian</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/rus.m3u</code></td></tr>
<tr><td align="left">Undefined</td><td align="right">0</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/undefined.m3u</code></td></tr>
</tbody>
</table>
</details>
### Playlists by region
<details>
<summary>Expand</summary>
<br>
<!-- prettier-ignore -->
<table>
<thead>
<tr><th align="left">Region</th><th align="right">Channels</th><th align="left">Playlist</th></tr>
</thead>
<tbody>
<tr><td align="left">Asia</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/regions/asia.m3u</code></td></tr>
<tr><td align="left">Commonwealth of Independent States</td><td align="right">1</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">2</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">2</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/regions/emea.m3u</code></td></tr>
<tr><td align="left">Worldwide</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/regions/int.m3u</code></td></tr>
<tr><td align="left">Undefined</td><td align="right">0</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/regions/undefined.m3u</code></td></tr>
</tbody>
</table>
</details>
### Playlists by country
<details>
<summary>Expand</summary>
<br>
<!-- prettier-ignore -->
<table>
<thead>
<tr><th align="left">Country</th><th align="right">Channels</th><th align="left">Playlist</th></tr>
</thead>
<tbody>
<tr><td align="left">🇦🇩 Andorra</td><td align="right">0</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/countries/ad.m3u</code></td></tr>
<tr><td align="left">🇷🇺 Russia</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/countries/ru.m3u</code></td></tr>
<tr><td align="left">🇬🇧 United Kingdom</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/countries/uk.m3u</code></td></tr>
<tr><td align="left">Undefined</td><td align="right">0</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/countries/undefined.m3u</code></td></tr>
</tbody>
</table>
</details>
## For Developers
In addition to the above methods, you can also get a list of all available channels in JSON format.
To do this, you just have to make a GET request to:
```
https://iptv-org.github.io/iptv/channels.json
```
If successful, you should get the following response:
<details>
<summary>Expand</summary>
<br>
```
[
...
{
"name": "CNN",
"logo": "https://i.imgur.com/ilZJT5s.png",
"url": "http://ott-cdn.ucom.am/s27/index.m3u8",
"categories": [
{
"name": "News",
"slug": "news"
}
],
"countries": [
{
"code": "us",
"name": "United States"
},
{
"code": "ca",
"name": "Canada"
}
],
"languages": [
{
"code": "eng",
"name": "English"
}
],
"tvg": {
"id": "cnn.us",
"name": "CNN",
"url": "http://epg.streamstv.me/epg/guide-usa.xml.gz"
}
},
...
]
```
</details>
## EPG
Playlists already have a built-in list of EPG, so players that support the `url-tvg` tag should load it automatically. If not, you can find a list of available programs here:
https://github.com/iptv-org/epg
## Resources
You can find links to various IPTV related resources in this repository [iptv-org/awesome-iptv](https://github.com/iptv-org/awesome-iptv).
## Contribution
Please make sure to read the [Contributing Guide](CONTRIBUTING.md) before sending an issue or making a pull request.
## Legal
No video files are stored in this repository. The repository simply contains user-submitted links to publicly available video stream URLs, which to the best of our knowledge have been intentionally made publicly by the copyright holders. If any links in these playlists infringe on your rights as a copyright holder, they may be removed by sending a pull request or opening an issue. However, note that we have **no control** over the destination of the link, and just removing the link from the playlist will not remove its contents from the web. Note that linking does not directly infringe copyright because no copy is made on the site providing the link, and thus this is **not** a valid reason to send a DMCA notice to GitHub. To remove this content from the web, you should contact the web host that's actually hosting the content (**not** GitHub, nor the maintainers of this repository).

View File

@ -1,23 +1,26 @@
const fs = require('fs')
const fs = require('fs-extra')
const path = require('path')
const { execSync } = require('child_process')
beforeEach(() => {
fs.rmdirSync(path.resolve('tests/__data__/output'), { recursive: true })
fs.emptyDirSync('tests/__data__/output')
const stdout = execSync(
'DATA_DIR=tests/__data__/input/data LOGS_DIR=tests/__data__/input/logs/generators node scripts/commands/update-readme.js --config=tests/__data__/input/_readme.json',
{ encoding: 'utf8' }
)
})
it('can update readme.md', () => {
const result = execSync(
'LOGS_PATH=tests/__data__/input/logs node scripts/commands/update-readme.js --config=tests/__data__/input/readme.json',
{ encoding: 'utf8' }
expect(content('tests/__data__/output/readme.md')).toEqual(
content('tests/__data__/expected/_readme.md')
)
const readme = fs.readFileSync(path.resolve('tests/__data__/output/readme.md'), {
encoding: 'utf8'
})
const expected = fs.readFileSync(path.resolve('tests/__data__/input/readme.md'), {
encoding: 'utf8'
})
expect(readme).toBe(expected)
})
function content(filepath) {
const data = fs.readFileSync(path.resolve(filepath), {
encoding: 'utf8'
})
return JSON.stringify(data)
}