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 7afa20bd1..000000000
--- 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 648c27ee9..000000000
--- 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 12a42d5ee..000000000
--- 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 0d2b71655..000000000
--- 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 |