https://iptv-org.github.io/iptv/${item.filepath}`
+ })
+ }
+
+ const table = createTable(rows, [
+ { name: 'Category' },
+ { name: 'Channels', align: 'right' },
+ { name: 'Playlist', nowrap: true }
+ ])
+
+ await file.create('./.readme/_categories.md', table)
+}
+
+async function createCountryTable() {
+ logger.info('creating country table...')
+ const rows = []
+ 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({
+ name: country ? `${country.flag} ${country.name}` : 'Undefined',
+ channels: item.count,
+ playlist: `https://iptv-org.github.io/iptv/${item.filepath}`
+ })
+ }
+
+ const table = createTable(rows, [
+ { name: 'Country' },
+ { name: 'Channels', align: 'right' },
+ { name: 'Playlist', nowrap: true }
+ ])
+
+ await file.create('./.readme/_countries.md', table)
+}
+
+async function createLanguageTable() {
+ logger.info('creating language table...')
+ const rows = []
+ 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({
+ name: language ? language.name : 'Undefined',
+ channels: item.count,
+ playlist: `https://iptv-org.github.io/iptv/${item.filepath}`
+ })
+ }
+
+ const table = createTable(rows, [
+ { name: 'Language', align: 'left' },
+ { name: 'Channels', align: 'right' },
+ { name: 'Playlist', align: 'left', nowrap: true }
+ ])
+
+ await file.create('./.readme/_languages.md', table)
+}
+
+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: `https://iptv-org.github.io/iptv/${item.filepath}`
+ })
+ }
+
+ 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)
+}
diff --git a/scripts/commands/update-database.js b/scripts/commands/update-database.js
deleted file mode 100644
index 7afa20bd15..0000000000
--- a/scripts/commands/update-database.js
+++ /dev/null
@@ -1,243 +0,0 @@
-const _ = require('lodash')
-const statuses = require('../data/statuses')
-const languages = require('../data/languages')
-const { db, store, parser, file, logger } = require('../core')
-
-let epgCodes = []
-let streams = []
-let checkResults = {}
-const origins = {}
-const items = []
-
-const LOGS_PATH = process.env.LOGS_PATH || 'scripts/logs'
-const EPG_CODES_FILEPATH = process.env.EPG_CODES_FILEPATH || 'scripts/data/codes.json'
-
-async function main() {
- await setUp()
- await loadDatabase()
- await removeDuplicates()
- await loadCheckResults()
- await findStreamOrigins()
- await updateStreams()
- await updateDatabase()
-}
-
-main()
-
-async function loadDatabase() {
- logger.info('Loading database...')
-
- streams = await db.find({})
-
- logger.info(`Found ${streams.length} streams`)
-}
-
-async function removeDuplicates() {
- logger.info('Removing duplicates...')
-
- const before = streams.length
- streams = _.uniqBy(streams, 'id')
- const after = streams.length
-
- logger.info(`Removed ${before - after} links`)
-}
-
-async function loadCheckResults() {
- logger.info('Loading check results from logs/...')
-
- const files = await file.list(`${LOGS_PATH}/check-streams/cluster_*.log`)
- for (const filepath of files) {
- const results = await parser.parseLogs(filepath)
- for (const result of results) {
- checkResults[result._id] = result
- }
- }
-
- logger.info(`Found ${Object.values(checkResults).length} results`)
-}
-
-async function findStreamOrigins() {
- logger.info('Searching for stream origins...')
-
- for (const { error, requests } of Object.values(checkResults)) {
- if (error || !Array.isArray(requests) || !requests.length) continue
-
- let origin = requests.shift()
- origin = new URL(origin.url)
- for (const request of requests) {
- const curr = new URL(request.url)
- const key = curr.href.replace(/(^\w+:|^)/, '')
- if (!origins[key] && curr.host === origin.host) {
- origins[key] = origin.href
- }
- }
- }
-
- logger.info(`Found ${_.uniq(Object.values(origins)).length} origins`)
-}
-
-async function updateStreams() {
- logger.info('Updating streams...')
-
- let updated = 0
- for (const item of streams) {
- const stream = store.create(item)
- const result = checkResults[item._id]
-
- if (result) {
- const { error, streams, requests } = result
- const resolution = parseResolution(streams)
- const origin = findOrigin(requests)
- let status = parseStatus(error)
-
- if (status) {
- const prevStatus = item.status
- if (prevStatus.code === 'not_247') // not_247 -> * = not_247
- status = item.status
- else if (prevStatus.code === 'geo_blocked') // geo_blocked -> * = geo_blocked
- status = item.status
- else if (status.code === 'geo_blocked') // * -> geo_blocked = *
- status = item.status
- else if (prevStatus.code === 'offline' && status.code === 'online') // offline -> online = not_247
- status = statuses['not_247']
-
-
- stream.set('status', { status })
- stream.set('is_broken', { status: stream.get('status') })
- }
-
- if (resolution) {
- stream.set('resolution', { resolution })
- }
-
- if (origin) {
- stream.set('url', { url: origin })
- }
- }
-
- if (!stream.has('logo')) {
- const logo = findLogo(stream.get('id'))
- stream.set('logo', { logo })
- }
-
- if (!stream.has('guides')) {
- const guides = findGuides(stream.get('id'))
- stream.set('guides', { guides })
- }
-
- if (!stream.has('countries') && stream.get('src_country')) {
- const countries = [stream.get('src_country')]
- stream.set('countries', { countries })
- }
-
- if (!stream.has('languages')) {
- const languages = findLanguages(stream.get('countries'), stream.get('src_country'))
- stream.set('languages', { languages })
- }
-
- if (stream.changed) {
- stream.set('updated', true)
- items.push(stream.data())
- updated++
- }
- }
-
- logger.info(`Updated ${updated} items`)
-}
-
-async function updateDatabase() {
- logger.info('Updating database...')
-
- for (const item of items) {
- await db.update({ _id: item._id }, item)
- }
- db.compact()
-
- logger.info('Done')
-}
-
-async function setUp() {
- try {
- const codes = await file.read(EPG_CODES_FILEPATH)
- epgCodes = JSON.parse(codes)
- } catch (err) {
- logger.error(err.message)
- }
-}
-
-function findLanguages(countries, src_country) {
- if (countries && Array.isArray(countries)) {
- let codes = countries.map(country => country.lang)
- codes = _.uniq(codes)
-
- return codes.map(code => languages.find(l => l.code === code)).filter(l => l)
- }
-
- if (src_country) {
- const code = src_country.lang
- const lang = languages.find(l => l.code === code)
-
- return lang ? [lang] : []
- }
-
- return []
-}
-
-function findOrigin(requests) {
- if (origins && Array.isArray(requests)) {
- requests = requests.map(r => r.url.replace(/(^\w+:|^)/, ''))
- for (const url of requests) {
- if (origins[url]) {
- return origins[url]
- }
- }
- }
-
- return null
-}
-
-function parseResolution(streams) {
- const resolution = streams
- .filter(s => s.codec_type === 'video')
- .reduce(
- (acc, curr) => {
- if (curr.height > acc.height) return { width: curr.width, height: curr.height }
- return acc
- },
- { width: 0, height: 0 }
- )
-
- if (resolution.width > 0 && resolution.height > 0) return resolution
- return null
-}
-
-function parseStatus(error) {
- if (error) {
- if (error.includes('timed out')) {
- return statuses['timeout']
- } else if (error.includes('403')) {
- return statuses['geo_blocked']
- }
- return statuses['offline']
- }
-
- return statuses['online']
-}
-
-function findLogo(id) {
- const item = epgCodes.find(i => i.tvg_id === id)
- if (item && item.logo) {
- return item.logo
- }
-
- return null
-}
-
-function findGuides(id) {
- const item = epgCodes.find(i => i.tvg_id === id)
- if (item && Array.isArray(item.guides)) {
- return item.guides
- }
-
- return []
-}
diff --git a/scripts/commands/update-playlists.js b/scripts/commands/update-playlists.js
deleted file mode 100644
index 648c27ee94..0000000000
--- a/scripts/commands/update-playlists.js
+++ /dev/null
@@ -1,16 +0,0 @@
-const _ = require('lodash')
-const { generator, db, logger } = require('../core')
-
-async function main() {
- let items = await db
- .find({})
- .sort({ name: 1, 'status.level': 1, 'resolution.height': -1, url: 1 })
- const files = _.groupBy(items, 'filepath')
-
- for (const filepath in files) {
- const items = files[filepath]
- await generator.saveAsM3U(filepath, items, { includeGuides: false })
- }
-}
-
-main()
diff --git a/scripts/commands/update-readme.js b/scripts/commands/update-readme.js
deleted file mode 100644
index 12a42d5ee0..0000000000
--- a/scripts/commands/update-readme.js
+++ /dev/null
@@ -1,140 +0,0 @@
-const { file, markdown, parser, logger } = require('../core')
-const { program } = require('commander')
-
-let categories = []
-let countries = []
-let languages = []
-let regions = []
-
-const LOGS_PATH = process.env.LOGS_PATH || 'scripts/logs'
-
-const options = program
- .option('-c, --config https://iptv-org.github.io/iptv/categories/${category.slug}.m3u`
- })
- }
-
- const table = markdown.createTable(rows, [
- { name: 'Category', align: 'left' },
- { name: 'Channels', align: 'right' },
- { name: 'Playlist', align: 'left', nowrap: true }
- ])
-
- await file.create('./.readme/_categories.md', table)
-}
-
-async function generateCountryTable() {
- logger.info('Generating country table...')
-
- const rows = []
- for (const country of countries) {
- const flag = getCountryFlag(country.code)
- const prefix = flag ? `${flag} ` : ''
-
- rows.push({
- country: prefix + country.name,
- channels: country.count,
- playlist: `https://iptv-org.github.io/iptv/countries/${country.code.toLowerCase()}.m3u`
- })
- }
-
- const table = markdown.createTable(rows, [
- { name: 'Country', align: 'left' },
- { name: 'Channels', align: 'right' },
- { name: 'Playlist', align: 'left', nowrap: true }
- ])
-
- await file.create('./.readme/_countries.md', table)
-}
-
-async function generateRegionTable() {
- logger.info('Generating region table...')
-
- const rows = []
- for (const region of regions) {
- rows.push({
- region: region.name,
- channels: region.count,
- playlist: `https://iptv-org.github.io/iptv/regions/${region.code.toLowerCase()}.m3u`
- })
- }
-
- 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: `https://iptv-org.github.io/iptv/languages/${language.code}.m3u`
- })
- }
-
- const table = markdown.createTable(rows, [
- { name: 'Language', align: 'left' },
- { name: 'Channels', align: 'right' },
- { name: 'Playlist', align: 'left', nowrap: true }
- ])
-
- await file.create('./.readme/_languages.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))
- }
-}
diff --git a/scripts/commands/validate.js b/scripts/commands/validate.js
deleted file mode 100644
index 0d2b716558..0000000000
--- a/scripts/commands/validate.js
+++ /dev/null
@@ -1,55 +0,0 @@
-const blocklist = require('../data/blocklist')
-const parser = require('iptv-playlist-parser')
-const { file, logger } = require('../core')
-const { program } = require('commander')
-
-const options = program
- .option('--input-dir | ${column.name} | ` - } - output += '
|---|
| ${item[prop]} | ` - i++ - } - output += '
| ${column.name} | ` + } + output += '
|---|
| ${item[prop]} | ` + i++ + } + output += '
| Category | Channels | Playlist |
|---|---|---|
| Auto | 0 | https://iptv-org.github.io/iptv/categories/auto.m3u |
| Animation | 0 | https://iptv-org.github.io/iptv/categories/animation.m3u |
| Business | 0 | https://iptv-org.github.io/iptv/categories/business.m3u |
| Classic | 0 | https://iptv-org.github.io/iptv/categories/classic.m3u |
| Comedy | 0 | https://iptv-org.github.io/iptv/categories/comedy.m3u |
| Cooking | 0 | https://iptv-org.github.io/iptv/categories/cooking.m3u |
| Culture | 0 | https://iptv-org.github.io/iptv/categories/culture.m3u |
| Documentary | 0 | https://iptv-org.github.io/iptv/categories/documentary.m3u |
| Education | 0 | https://iptv-org.github.io/iptv/categories/education.m3u |
| Entertainment | 0 | https://iptv-org.github.io/iptv/categories/entertainment.m3u |
| Family | 0 | https://iptv-org.github.io/iptv/categories/family.m3u |
| General | 2 | https://iptv-org.github.io/iptv/categories/general.m3u |
| Kids | 0 | https://iptv-org.github.io/iptv/categories/kids.m3u |
| Legislative | 0 | https://iptv-org.github.io/iptv/categories/legislative.m3u |
| Lifestyle | 0 | https://iptv-org.github.io/iptv/categories/lifestyle.m3u |
| Movies | 0 | https://iptv-org.github.io/iptv/categories/movies.m3u |
| Music | 0 | https://iptv-org.github.io/iptv/categories/music.m3u |
| News | 1 | https://iptv-org.github.io/iptv/categories/news.m3u |
| Outdoor | 0 | https://iptv-org.github.io/iptv/categories/outdoor.m3u |
| Relax | 0 | https://iptv-org.github.io/iptv/categories/relax.m3u |
| Religious | 0 | https://iptv-org.github.io/iptv/categories/religious.m3u |
| Series | 0 | https://iptv-org.github.io/iptv/categories/series.m3u |
| Science | 0 | https://iptv-org.github.io/iptv/categories/science.m3u |
| Shop | 0 | https://iptv-org.github.io/iptv/categories/shop.m3u |
| Sports | 0 | https://iptv-org.github.io/iptv/categories/sports.m3u |
| Travel | 0 | https://iptv-org.github.io/iptv/categories/travel.m3u |
| Weather | 1 | https://iptv-org.github.io/iptv/categories/weather.m3u |
| XXX | 1 | https://iptv-org.github.io/iptv/categories/xxx.m3u |
| Undefined | 3 | https://iptv-org.github.io/iptv/categories/undefined.m3u |
| Language | Channels | Playlist |
|---|---|---|
| Catalan | 1 | https://iptv-org.github.io/iptv/languages/cat.m3u |
| English | 1 | https://iptv-org.github.io/iptv/languages/eng.m3u |
| French | 1 | https://iptv-org.github.io/iptv/languages/fra.m3u |
| Russian | 1 | https://iptv-org.github.io/iptv/languages/rus.m3u |
| Undefined | 2 | https://iptv-org.github.io/iptv/languages/undefined.m3u |
| Country | Channels | Playlist |
|---|---|---|
| 🇦🇫 Afghanistan | 1 | https://iptv-org.github.io/iptv/countries/af.m3u |
| 🇦🇱 Albania | 1 | https://iptv-org.github.io/iptv/countries/al.m3u |
| 🇩🇿 Algeria | 1 | https://iptv-org.github.io/iptv/countries/dz.m3u |
| 🇦🇸 American Samoa | 1 | https://iptv-org.github.io/iptv/countries/as.m3u |
| 🇦🇩 Andorra | 2 | https://iptv-org.github.io/iptv/countries/ad.m3u |
| 🇦🇴 Angola | 1 | https://iptv-org.github.io/iptv/countries/ao.m3u |
| 🇦🇮 Anguilla | 1 | https://iptv-org.github.io/iptv/countries/ai.m3u |
| 🇦🇶 Antarctica | 1 | https://iptv-org.github.io/iptv/countries/aq.m3u |
| 🇦🇬 Antigua and Barbuda | 1 | https://iptv-org.github.io/iptv/countries/ag.m3u |
| 🇦🇷 Argentina | 1 | https://iptv-org.github.io/iptv/countries/ar.m3u |
| 🇦🇲 Armenia | 1 | https://iptv-org.github.io/iptv/countries/am.m3u |
| 🇦🇼 Aruba | 1 | https://iptv-org.github.io/iptv/countries/aw.m3u |
| 🇦🇺 Australia | 1 | https://iptv-org.github.io/iptv/countries/au.m3u |
| 🇦🇹 Austria | 1 | https://iptv-org.github.io/iptv/countries/at.m3u |
| 🇦🇿 Azerbaijan | 1 | https://iptv-org.github.io/iptv/countries/az.m3u |
| 🇧🇸 Bahamas | 1 | https://iptv-org.github.io/iptv/countries/bs.m3u |
| 🇧🇭 Bahrain | 1 | https://iptv-org.github.io/iptv/countries/bh.m3u |
| 🇧🇩 Bangladesh | 1 | https://iptv-org.github.io/iptv/countries/bd.m3u |
| 🇧🇧 Barbados | 1 | https://iptv-org.github.io/iptv/countries/bb.m3u |
| 🇧🇾 Belarus | 1 | https://iptv-org.github.io/iptv/countries/by.m3u |
| 🇧🇪 Belgium | 1 | https://iptv-org.github.io/iptv/countries/be.m3u |
| 🇧🇿 Belize | 1 | https://iptv-org.github.io/iptv/countries/bz.m3u |
| 🇧🇯 Benin | 1 | https://iptv-org.github.io/iptv/countries/bj.m3u |
| 🇧🇲 Bermuda | 1 | https://iptv-org.github.io/iptv/countries/bm.m3u |
| 🇧🇹 Bhutan | 1 | https://iptv-org.github.io/iptv/countries/bt.m3u |
| 🇧🇴 Bolivia | 1 | https://iptv-org.github.io/iptv/countries/bo.m3u |
| 🇧🇶 Bonaire | 1 | https://iptv-org.github.io/iptv/countries/bq.m3u |
| 🇧🇦 Bosnia and Herzegovina | 1 | https://iptv-org.github.io/iptv/countries/ba.m3u |
| 🇧🇼 Botswana | 1 | https://iptv-org.github.io/iptv/countries/bw.m3u |
| 🇧🇻 Bouvet Island | 1 | https://iptv-org.github.io/iptv/countries/bv.m3u |
| 🇧🇷 Brazil | 1 | https://iptv-org.github.io/iptv/countries/br.m3u |
| 🇮🇴 British Indian Ocean Territory | 1 | https://iptv-org.github.io/iptv/countries/io.m3u |
| 🇻🇬 British Virgin Islands | 1 | https://iptv-org.github.io/iptv/countries/vg.m3u |
| 🇧🇳 Brunei | 1 | https://iptv-org.github.io/iptv/countries/bn.m3u |
| 🇧🇬 Bulgaria | 1 | https://iptv-org.github.io/iptv/countries/bg.m3u |
| 🇧🇫 Burkina Faso | 1 | https://iptv-org.github.io/iptv/countries/bf.m3u |
| 🇧🇮 Burundi | 1 | https://iptv-org.github.io/iptv/countries/bi.m3u |
| 🇰🇭 Cambodia | 1 | https://iptv-org.github.io/iptv/countries/kh.m3u |
| 🇨🇲 Cameroon | 1 | https://iptv-org.github.io/iptv/countries/cm.m3u |
| 🇨🇦 Canada | 2 | https://iptv-org.github.io/iptv/countries/ca.m3u |
| 🇨🇻 Cape Verde | 1 | https://iptv-org.github.io/iptv/countries/cv.m3u |
| 🇰🇾 Cayman Islands | 1 | https://iptv-org.github.io/iptv/countries/ky.m3u |
| 🇨🇫 Central African Republic | 1 | https://iptv-org.github.io/iptv/countries/cf.m3u |
| 🇹🇩 Chad | 1 | https://iptv-org.github.io/iptv/countries/td.m3u |
| 🇨🇱 Chile | 1 | https://iptv-org.github.io/iptv/countries/cl.m3u |
| 🇨🇳 China | 1 | https://iptv-org.github.io/iptv/countries/cn.m3u |
| 🇨🇽 Christmas Island | 1 | https://iptv-org.github.io/iptv/countries/cx.m3u |
| 🇨🇨 Cocos (Keeling) Islands | 1 | https://iptv-org.github.io/iptv/countries/cc.m3u |
| 🇨🇴 Colombia | 1 | https://iptv-org.github.io/iptv/countries/co.m3u |
| 🇰🇲 Comoros | 1 | https://iptv-org.github.io/iptv/countries/km.m3u |
| 🇨🇰 Cook Islands | 1 | https://iptv-org.github.io/iptv/countries/ck.m3u |
| 🇨🇷 Costa Rica | 1 | https://iptv-org.github.io/iptv/countries/cr.m3u |
| 🇭🇷 Croatia | 1 | https://iptv-org.github.io/iptv/countries/hr.m3u |
| 🇨🇺 Cuba | 1 | https://iptv-org.github.io/iptv/countries/cu.m3u |
| 🇨🇼 Curacao | 1 | https://iptv-org.github.io/iptv/countries/cw.m3u |
| 🇨🇾 Cyprus | 1 | https://iptv-org.github.io/iptv/countries/cy.m3u |
| 🇨🇿 Czech Republic | 1 | https://iptv-org.github.io/iptv/countries/cz.m3u |
| 🇨🇩 Democratic Republic of the Congo | 1 | https://iptv-org.github.io/iptv/countries/cd.m3u |
| 🇩🇰 Denmark | 1 | https://iptv-org.github.io/iptv/countries/dk.m3u |
| 🇩🇯 Djibouti | 1 | https://iptv-org.github.io/iptv/countries/dj.m3u |
| 🇩🇲 Dominica | 1 | https://iptv-org.github.io/iptv/countries/dm.m3u |
| 🇩🇴 Dominican Republic | 1 | https://iptv-org.github.io/iptv/countries/do.m3u |
| 🇹🇱 East Timor | 1 | https://iptv-org.github.io/iptv/countries/tl.m3u |
| 🇪🇨 Ecuador | 1 | https://iptv-org.github.io/iptv/countries/ec.m3u |
| 🇪🇬 Egypt | 1 | https://iptv-org.github.io/iptv/countries/eg.m3u |
| 🇸🇻 El Salvador | 1 | https://iptv-org.github.io/iptv/countries/sv.m3u |
| 🇬🇶 Equatorial Guinea | 1 | https://iptv-org.github.io/iptv/countries/gq.m3u |
| 🇪🇷 Eritrea | 1 | https://iptv-org.github.io/iptv/countries/er.m3u |
| 🇪🇪 Estonia | 1 | https://iptv-org.github.io/iptv/countries/ee.m3u |
| 🇪🇹 Ethiopia | 1 | https://iptv-org.github.io/iptv/countries/et.m3u |
| 🇫🇰 Falkland Islands | 1 | https://iptv-org.github.io/iptv/countries/fk.m3u |
| 🇫🇴 Faroe Islands | 1 | https://iptv-org.github.io/iptv/countries/fo.m3u |
| 🇫🇯 Fiji | 1 | https://iptv-org.github.io/iptv/countries/fj.m3u |
| 🇫🇮 Finland | 1 | https://iptv-org.github.io/iptv/countries/fi.m3u |
| 🇫🇷 France | 1 | https://iptv-org.github.io/iptv/countries/fr.m3u |
| 🇬🇫 French Guiana | 1 | https://iptv-org.github.io/iptv/countries/gf.m3u |
| 🇵🇫 French Polynesia | 1 | https://iptv-org.github.io/iptv/countries/pf.m3u |
| 🇹🇫 French Southern Territories | 1 | https://iptv-org.github.io/iptv/countries/tf.m3u |
| 🇬🇦 Gabon | 1 | https://iptv-org.github.io/iptv/countries/ga.m3u |
| 🇬🇲 Gambia | 1 | https://iptv-org.github.io/iptv/countries/gm.m3u |
| 🇬🇪 Georgia | 1 | https://iptv-org.github.io/iptv/countries/ge.m3u |
| 🇩🇪 Germany | 1 | https://iptv-org.github.io/iptv/countries/de.m3u |
| 🇬🇭 Ghana | 1 | https://iptv-org.github.io/iptv/countries/gh.m3u |
| 🇬🇮 Gibraltar | 1 | https://iptv-org.github.io/iptv/countries/gi.m3u |
| 🇬🇷 Greece | 1 | https://iptv-org.github.io/iptv/countries/gr.m3u |
| 🇬🇱 Greenland | 1 | https://iptv-org.github.io/iptv/countries/gl.m3u |
| 🇬🇩 Grenada | 1 | https://iptv-org.github.io/iptv/countries/gd.m3u |
| 🇬🇵 Guadeloupe | 1 | https://iptv-org.github.io/iptv/countries/gp.m3u |
| 🇬🇺 Guam | 1 | https://iptv-org.github.io/iptv/countries/gu.m3u |
| 🇬🇹 Guatemala | 1 | https://iptv-org.github.io/iptv/countries/gt.m3u |
| 🇬🇬 Guernsey | 1 | https://iptv-org.github.io/iptv/countries/gg.m3u |
| 🇬🇳 Guinea | 1 | https://iptv-org.github.io/iptv/countries/gn.m3u |
| 🇬🇼 Guinea-Bissau | 1 | https://iptv-org.github.io/iptv/countries/gw.m3u |
| 🇬🇾 Guyana | 1 | https://iptv-org.github.io/iptv/countries/gy.m3u |
| 🇭🇹 Haiti | 1 | https://iptv-org.github.io/iptv/countries/ht.m3u |
| 🇭🇲 Heard Island and McDonald Islands | 1 | https://iptv-org.github.io/iptv/countries/hm.m3u |
| 🇭🇳 Honduras | 1 | https://iptv-org.github.io/iptv/countries/hn.m3u |
| 🇭🇰 Hong Kong | 1 | https://iptv-org.github.io/iptv/countries/hk.m3u |
| 🇭🇺 Hungary | 1 | https://iptv-org.github.io/iptv/countries/hu.m3u |
| 🇮🇸 Iceland | 1 | https://iptv-org.github.io/iptv/countries/is.m3u |
| 🇮🇳 India | 1 | https://iptv-org.github.io/iptv/countries/in.m3u |
| 🇮🇩 Indonesia | 1 | https://iptv-org.github.io/iptv/countries/id.m3u |
| 🇮🇷 Iran | 1 | https://iptv-org.github.io/iptv/countries/ir.m3u |
| 🇮🇶 Iraq | 1 | https://iptv-org.github.io/iptv/countries/iq.m3u |
| 🇮🇪 Ireland | 1 | https://iptv-org.github.io/iptv/countries/ie.m3u |
| 🇮🇲 Isle of Man | 1 | https://iptv-org.github.io/iptv/countries/im.m3u |
| 🇮🇱 Israel | 1 | https://iptv-org.github.io/iptv/countries/il.m3u |
| 🇮🇹 Italy | 1 | https://iptv-org.github.io/iptv/countries/it.m3u |
| 🇨🇮 Ivory Coast | 1 | https://iptv-org.github.io/iptv/countries/ci.m3u |
| 🇯🇲 Jamaica | 1 | https://iptv-org.github.io/iptv/countries/jm.m3u |
| 🇯🇵 Japan | 1 | https://iptv-org.github.io/iptv/countries/jp.m3u |
| 🇯🇪 Jersey | 1 | https://iptv-org.github.io/iptv/countries/je.m3u |
| 🇯🇴 Jordan | 1 | https://iptv-org.github.io/iptv/countries/jo.m3u |
| 🇰🇿 Kazakhstan | 1 | https://iptv-org.github.io/iptv/countries/kz.m3u |
| 🇰🇪 Kenya | 1 | https://iptv-org.github.io/iptv/countries/ke.m3u |
| 🇰🇮 Kiribati | 1 | https://iptv-org.github.io/iptv/countries/ki.m3u |
| 🇽🇰 Kosovo | 1 | https://iptv-org.github.io/iptv/countries/xk.m3u |
| 🇰🇼 Kuwait | 1 | https://iptv-org.github.io/iptv/countries/kw.m3u |
| 🇰🇬 Kyrgyzstan | 1 | https://iptv-org.github.io/iptv/countries/kg.m3u |
| 🇱🇦 Laos | 1 | https://iptv-org.github.io/iptv/countries/la.m3u |
| 🇱🇻 Latvia | 1 | https://iptv-org.github.io/iptv/countries/lv.m3u |
| 🇱🇧 Lebanon | 1 | https://iptv-org.github.io/iptv/countries/lb.m3u |
| 🇱🇸 Lesotho | 1 | https://iptv-org.github.io/iptv/countries/ls.m3u |
| 🇱🇷 Liberia | 1 | https://iptv-org.github.io/iptv/countries/lr.m3u |
| 🇱🇾 Libya | 1 | https://iptv-org.github.io/iptv/countries/ly.m3u |
| 🇱🇮 Liechtenstein | 1 | https://iptv-org.github.io/iptv/countries/li.m3u |
| 🇱🇹 Lithuania | 1 | https://iptv-org.github.io/iptv/countries/lt.m3u |
| 🇱🇺 Luxembourg | 1 | https://iptv-org.github.io/iptv/countries/lu.m3u |
| 🇲🇴 Macao | 1 | https://iptv-org.github.io/iptv/countries/mo.m3u |
| 🇲🇬 Madagascar | 1 | https://iptv-org.github.io/iptv/countries/mg.m3u |
| 🇲🇼 Malawi | 1 | https://iptv-org.github.io/iptv/countries/mw.m3u |
| 🇲🇾 Malaysia | 1 | https://iptv-org.github.io/iptv/countries/my.m3u |
| 🇲🇻 Maldives | 1 | https://iptv-org.github.io/iptv/countries/mv.m3u |
| 🇲🇱 Mali | 1 | https://iptv-org.github.io/iptv/countries/ml.m3u |
| 🇲🇹 Malta | 1 | https://iptv-org.github.io/iptv/countries/mt.m3u |
| 🇲🇭 Marshall Islands | 1 | https://iptv-org.github.io/iptv/countries/mh.m3u |
| 🇲🇶 Martinique | 1 | https://iptv-org.github.io/iptv/countries/mq.m3u |
| 🇲🇷 Mauritania | 1 | https://iptv-org.github.io/iptv/countries/mr.m3u |
| 🇲🇺 Mauritius | 1 | https://iptv-org.github.io/iptv/countries/mu.m3u |
| 🇾🇹 Mayotte | 1 | https://iptv-org.github.io/iptv/countries/yt.m3u |
| 🇲🇽 Mexico | 1 | https://iptv-org.github.io/iptv/countries/mx.m3u |
| 🇫🇲 Micronesia | 1 | https://iptv-org.github.io/iptv/countries/fm.m3u |
| 🇲🇩 Moldova | 1 | https://iptv-org.github.io/iptv/countries/md.m3u |
| 🇲🇨 Monaco | 1 | https://iptv-org.github.io/iptv/countries/mc.m3u |
| 🇲🇳 Mongolia | 1 | https://iptv-org.github.io/iptv/countries/mn.m3u |
| 🇲🇪 Montenegro | 1 | https://iptv-org.github.io/iptv/countries/me.m3u |
| 🇲🇸 Montserrat | 1 | https://iptv-org.github.io/iptv/countries/ms.m3u |
| 🇲🇦 Morocco | 1 | https://iptv-org.github.io/iptv/countries/ma.m3u |
| 🇲🇿 Mozambique | 1 | https://iptv-org.github.io/iptv/countries/mz.m3u |
| 🇲🇲 Myanmar (Burma) | 1 | https://iptv-org.github.io/iptv/countries/mm.m3u |
| 🇳🇦 Namibia | 1 | https://iptv-org.github.io/iptv/countries/na.m3u |
| 🇳🇷 Nauru | 1 | https://iptv-org.github.io/iptv/countries/nr.m3u |
| 🇳🇵 Nepal | 1 | https://iptv-org.github.io/iptv/countries/np.m3u |
| 🇳🇱 Netherlands | 1 | https://iptv-org.github.io/iptv/countries/nl.m3u |
| 🇳🇨 New Caledonia | 1 | https://iptv-org.github.io/iptv/countries/nc.m3u |
| 🇳🇿 New Zealand | 1 | https://iptv-org.github.io/iptv/countries/nz.m3u |
| 🇳🇮 Nicaragua | 1 | https://iptv-org.github.io/iptv/countries/ni.m3u |
| 🇳🇪 Niger | 1 | https://iptv-org.github.io/iptv/countries/ne.m3u |
| 🇳🇬 Nigeria | 1 | https://iptv-org.github.io/iptv/countries/ng.m3u |
| 🇳🇺 Niue | 1 | https://iptv-org.github.io/iptv/countries/nu.m3u |
| 🇳🇫 Norfolk Island | 1 | https://iptv-org.github.io/iptv/countries/nf.m3u |
| 🇰🇵 North Korea | 1 | https://iptv-org.github.io/iptv/countries/kp.m3u |
| 🇲🇰 North Macedonia | 1 | https://iptv-org.github.io/iptv/countries/mk.m3u |
| 🇲🇵 Northern Mariana Islands | 1 | https://iptv-org.github.io/iptv/countries/mp.m3u |
| 🇳🇴 Norway | 1 | https://iptv-org.github.io/iptv/countries/no.m3u |
| 🇴🇲 Oman | 1 | https://iptv-org.github.io/iptv/countries/om.m3u |
| 🇵🇰 Pakistan | 1 | https://iptv-org.github.io/iptv/countries/pk.m3u |
| 🇵🇼 Palau | 1 | https://iptv-org.github.io/iptv/countries/pw.m3u |
| 🇵🇸 Palestine | 1 | https://iptv-org.github.io/iptv/countries/ps.m3u |
| 🇵🇦 Panama | 1 | https://iptv-org.github.io/iptv/countries/pa.m3u |
| 🇵🇬 Papua New Guinea | 1 | https://iptv-org.github.io/iptv/countries/pg.m3u |
| 🇵🇾 Paraguay | 1 | https://iptv-org.github.io/iptv/countries/py.m3u |
| 🇵🇪 Peru | 1 | https://iptv-org.github.io/iptv/countries/pe.m3u |
| 🇵🇭 Philippines | 1 | https://iptv-org.github.io/iptv/countries/ph.m3u |
| 🇵🇳 Pitcairn Islands | 1 | https://iptv-org.github.io/iptv/countries/pn.m3u |
| 🇵🇱 Poland | 1 | https://iptv-org.github.io/iptv/countries/pl.m3u |
| 🇵🇹 Portugal | 1 | https://iptv-org.github.io/iptv/countries/pt.m3u |
| 🇵🇷 Puerto Rico | 1 | https://iptv-org.github.io/iptv/countries/pr.m3u |
| 🇶🇦 Qatar | 1 | https://iptv-org.github.io/iptv/countries/qa.m3u |
| 🇨🇬 Republic of the Congo | 1 | https://iptv-org.github.io/iptv/countries/cg.m3u |
| 🇷🇴 Romania | 1 | https://iptv-org.github.io/iptv/countries/ro.m3u |
| 🇷🇺 Russia | 2 | https://iptv-org.github.io/iptv/countries/ru.m3u |
| 🇷🇼 Rwanda | 1 | https://iptv-org.github.io/iptv/countries/rw.m3u |
| 🇷🇪 Réunion | 1 | https://iptv-org.github.io/iptv/countries/re.m3u |
| 🇧🇱 Saint Barthélemy | 1 | https://iptv-org.github.io/iptv/countries/bl.m3u |
| 🇸🇭 Saint Helena | 1 | https://iptv-org.github.io/iptv/countries/sh.m3u |
| 🇰🇳 Saint Kitts and Nevis | 1 | https://iptv-org.github.io/iptv/countries/kn.m3u |
| 🇱🇨 Saint Lucia | 1 | https://iptv-org.github.io/iptv/countries/lc.m3u |
| 🇲🇫 Saint Martin | 1 | https://iptv-org.github.io/iptv/countries/mf.m3u |
| 🇵🇲 Saint Pierre and Miquelon | 1 | https://iptv-org.github.io/iptv/countries/pm.m3u |
| 🇻🇨 Saint Vincent and the Grenadines | 1 | https://iptv-org.github.io/iptv/countries/vc.m3u |
| 🇼🇸 Samoa | 1 | https://iptv-org.github.io/iptv/countries/ws.m3u |
| 🇸🇲 San Marino | 1 | https://iptv-org.github.io/iptv/countries/sm.m3u |
| 🇸🇦 Saudi Arabia | 1 | https://iptv-org.github.io/iptv/countries/sa.m3u |
| 🇸🇳 Senegal | 1 | https://iptv-org.github.io/iptv/countries/sn.m3u |
| 🇷🇸 Serbia | 1 | https://iptv-org.github.io/iptv/countries/rs.m3u |
| 🇸🇨 Seychelles | 1 | https://iptv-org.github.io/iptv/countries/sc.m3u |
| 🇸🇱 Sierra Leone | 1 | https://iptv-org.github.io/iptv/countries/sl.m3u |
| 🇸🇬 Singapore | 1 | https://iptv-org.github.io/iptv/countries/sg.m3u |
| 🇸🇽 Sint Maarten | 1 | https://iptv-org.github.io/iptv/countries/sx.m3u |
| 🇸🇰 Slovakia | 1 | https://iptv-org.github.io/iptv/countries/sk.m3u |
| 🇸🇮 Slovenia | 1 | https://iptv-org.github.io/iptv/countries/si.m3u |
| 🇸🇧 Solomon Islands | 1 | https://iptv-org.github.io/iptv/countries/sb.m3u |
| 🇸🇴 Somalia | 1 | https://iptv-org.github.io/iptv/countries/so.m3u |
| 🇿🇦 South Africa | 1 | https://iptv-org.github.io/iptv/countries/za.m3u |
| 🇬🇸 South Georgia and the South Sandwich Islands | 1 | https://iptv-org.github.io/iptv/countries/gs.m3u |
| 🇰🇷 South Korea | 1 | https://iptv-org.github.io/iptv/countries/kr.m3u |
| 🇸🇸 South Sudan | 1 | https://iptv-org.github.io/iptv/countries/ss.m3u |
| 🇪🇸 Spain | 1 | https://iptv-org.github.io/iptv/countries/es.m3u |
| 🇱🇰 Sri Lanka | 1 | https://iptv-org.github.io/iptv/countries/lk.m3u |
| 🇸🇩 Sudan | 1 | https://iptv-org.github.io/iptv/countries/sd.m3u |
| 🇸🇷 Suriname | 1 | https://iptv-org.github.io/iptv/countries/sr.m3u |
| 🇸🇯 Svalbard and Jan Mayen | 1 | https://iptv-org.github.io/iptv/countries/sj.m3u |
| 🇸🇿 Swaziland | 1 | https://iptv-org.github.io/iptv/countries/sz.m3u |
| 🇸🇪 Sweden | 1 | https://iptv-org.github.io/iptv/countries/se.m3u |
| 🇨🇭 Switzerland | 1 | https://iptv-org.github.io/iptv/countries/ch.m3u |
| 🇸🇾 Syria | 1 | https://iptv-org.github.io/iptv/countries/sy.m3u |
| 🇸🇹 São Tomé and Príncipe | 1 | https://iptv-org.github.io/iptv/countries/st.m3u |
| 🇹🇼 Taiwan | 1 | https://iptv-org.github.io/iptv/countries/tw.m3u |
| 🇹🇯 Tajikistan | 1 | https://iptv-org.github.io/iptv/countries/tj.m3u |
| 🇹🇿 Tanzania | 1 | https://iptv-org.github.io/iptv/countries/tz.m3u |
| 🇹🇭 Thailand | 1 | https://iptv-org.github.io/iptv/countries/th.m3u |
| 🇹🇬 Togo | 1 | https://iptv-org.github.io/iptv/countries/tg.m3u |
| 🇹🇰 Tokelau | 1 | https://iptv-org.github.io/iptv/countries/tk.m3u |
| 🇹🇴 Tonga | 1 | https://iptv-org.github.io/iptv/countries/to.m3u |
| 🇹🇹 Trinidad and Tobago | 1 | https://iptv-org.github.io/iptv/countries/tt.m3u |
| 🇹🇳 Tunisia | 1 | https://iptv-org.github.io/iptv/countries/tn.m3u |
| 🇹🇷 Turkey | 1 | https://iptv-org.github.io/iptv/countries/tr.m3u |
| 🇹🇲 Turkmenistan | 1 | https://iptv-org.github.io/iptv/countries/tm.m3u |
| 🇹🇨 Turks and Caicos Islands | 1 | https://iptv-org.github.io/iptv/countries/tc.m3u |
| 🇹🇻 Tuvalu | 1 | https://iptv-org.github.io/iptv/countries/tv.m3u |
| 🇺🇲 U.S. Minor Outlying Islands | 1 | https://iptv-org.github.io/iptv/countries/um.m3u |
| 🇻🇮 U.S. Virgin Islands | 1 | https://iptv-org.github.io/iptv/countries/vi.m3u |
| 🇺🇬 Uganda | 1 | https://iptv-org.github.io/iptv/countries/ug.m3u |
| 🇺🇦 Ukraine | 1 | https://iptv-org.github.io/iptv/countries/ua.m3u |
| 🇦🇪 United Arab Emirates | 1 | https://iptv-org.github.io/iptv/countries/ae.m3u |
| 🇬🇧 United Kingdom | 1 | https://iptv-org.github.io/iptv/countries/uk.m3u |
| 🇺🇸 United States | 1 | https://iptv-org.github.io/iptv/countries/us.m3u |
| 🇺🇾 Uruguay | 1 | https://iptv-org.github.io/iptv/countries/uy.m3u |
| 🇺🇿 Uzbekistan | 1 | https://iptv-org.github.io/iptv/countries/uz.m3u |
| 🇻🇺 Vanuatu | 1 | https://iptv-org.github.io/iptv/countries/vu.m3u |
| 🇻🇦 Vatican City | 1 | https://iptv-org.github.io/iptv/countries/va.m3u |
| 🇻🇪 Venezuela | 1 | https://iptv-org.github.io/iptv/countries/ve.m3u |
| 🇻🇳 Vietnam | 1 | https://iptv-org.github.io/iptv/countries/vn.m3u |
| 🇼🇫 Wallis and Futuna | 1 | https://iptv-org.github.io/iptv/countries/wf.m3u |
| 🇪🇭 Western Sahara | 1 | https://iptv-org.github.io/iptv/countries/eh.m3u |
| 🇾🇪 Yemen | 1 | https://iptv-org.github.io/iptv/countries/ye.m3u |
| 🇿🇲 Zambia | 1 | https://iptv-org.github.io/iptv/countries/zm.m3u |
| 🇿🇼 Zimbabwe | 1 | https://iptv-org.github.io/iptv/countries/zw.m3u |
| 🇦🇽 Åland | 1 | https://iptv-org.github.io/iptv/countries/ax.m3u |
| Undefined | 2 | https://iptv-org.github.io/iptv/countries/undefined.m3u |
| Region | Channels | Playlist |
|---|---|---|
| Africa | 0 | https://iptv-org.github.io/iptv/regions/afr.m3u |
| Americas | 1 | https://iptv-org.github.io/iptv/regions/amer.m3u |
| Arab world | 0 | https://iptv-org.github.io/iptv/regions/arab.m3u |
| Asia | 1 | https://iptv-org.github.io/iptv/regions/asia.m3u |
| Asia-Pacific | 0 | https://iptv-org.github.io/iptv/regions/apac.m3u |
| Caribbean | 0 | https://iptv-org.github.io/iptv/regions/carib.m3u |
| Central Asia | 0 | https://iptv-org.github.io/iptv/regions/cas.m3u |
| Commonwealth of Independent States | 1 | https://iptv-org.github.io/iptv/regions/cis.m3u |
| Europe | 2 | https://iptv-org.github.io/iptv/regions/eur.m3u |
| Europe, the Middle East and Africa | 2 | https://iptv-org.github.io/iptv/regions/emea.m3u |
| Hispanic America | 0 | https://iptv-org.github.io/iptv/regions/hispam.m3u |
| Latin America | 0 | https://iptv-org.github.io/iptv/regions/latam.m3u |
| Latin America and the Caribbean | 0 | https://iptv-org.github.io/iptv/regions/lac.m3u |
| Maghreb | 0 | https://iptv-org.github.io/iptv/regions/maghreb.m3u |
| Middle East | 0 | https://iptv-org.github.io/iptv/regions/mideast.m3u |
| Middle East and North Africa | 0 | https://iptv-org.github.io/iptv/regions/mena.m3u |
| Nordics | 0 | https://iptv-org.github.io/iptv/regions/nord.m3u |
| North America | 1 | https://iptv-org.github.io/iptv/regions/noram.m3u |
| Northern America | 1 | https://iptv-org.github.io/iptv/regions/nam.m3u |
| Oceania | 0 | https://iptv-org.github.io/iptv/regions/oce.m3u |
| South Asia | 0 | https://iptv-org.github.io/iptv/regions/sas.m3u |
| Sub-Saharan Africa | 0 | https://iptv-org.github.io/iptv/regions/ssa.m3u |
| West Africa | 0 | https://iptv-org.github.io/iptv/regions/wafr.m3u |
| Worldwide | 4 | https://iptv-org.github.io/iptv/regions/int.m3u |
| Undefined | 2 | https://iptv-org.github.io/iptv/regions/undefined.m3u |
| Category | Channels | Playlist |
|---|---|---|
| General | 1 | https://iptv-org.github.io/iptv/categories/general.m3u |
| News | 1 | https://iptv-org.github.io/iptv/categories/news.m3u |
| Other | 0 | https://iptv-org.github.io/iptv/categories/other.m3u |
| Language | Channels | Playlist |
|---|---|---|
| Catalan | 0 | https://iptv-org.github.io/iptv/languages/cat.m3u |
| English | 1 | https://iptv-org.github.io/iptv/languages/eng.m3u |
| Russian | 1 | https://iptv-org.github.io/iptv/languages/rus.m3u |
| Undefined | 0 | https://iptv-org.github.io/iptv/languages/undefined.m3u |
| Region | Channels | Playlist |
|---|---|---|
| Asia | 1 | https://iptv-org.github.io/iptv/regions/asia.m3u |
| Commonwealth of Independent States | 1 | https://iptv-org.github.io/iptv/regions/cis.m3u |
| Europe | 2 | https://iptv-org.github.io/iptv/regions/eur.m3u |
| Europe, the Middle East and Africa | 2 | https://iptv-org.github.io/iptv/regions/emea.m3u |
| Worldwide | 1 | https://iptv-org.github.io/iptv/regions/int.m3u |
| Undefined | 0 | https://iptv-org.github.io/iptv/regions/undefined.m3u |
| Country | Channels | Playlist |
|---|---|---|
| 🇦🇩 Andorra | 0 | https://iptv-org.github.io/iptv/countries/ad.m3u |
| 🇷🇺 Russia | 1 | https://iptv-org.github.io/iptv/countries/ru.m3u |
| 🇬🇧 United Kingdom | 1 | https://iptv-org.github.io/iptv/countries/uk.m3u |
| Undefined | 0 | https://iptv-org.github.io/iptv/countries/undefined.m3u |