Showing preview only (3,063K chars total). Download the full file or copy to clipboard to get everything.
Repository: iptv-org/iptv
Branch: master
Commit: 19463bdbb9c3
Files: 534
Total size: 2.8 MB
Directory structure:
gitextract_akwh5u4h/
├── .github/
│ ├── CODE_OF_CONDUCT.md
│ ├── FUNDING.yml
│ ├── ISSUE_TEMPLATE/
│ │ ├── 1_streams_add.yml
│ │ ├── 2_streams_edit.yml
│ │ ├── 3_streams_report.yml
│ │ ├── 4_channel-search.yml
│ │ ├── 5_bug-report.yml
│ │ ├── 6_copyright-claim.yml
│ │ └── config.yml
│ └── workflows/
│ ├── check.yml
│ ├── format.yml
│ ├── stale.yml
│ └── update.yml
├── .gitignore
├── .prettierrc
├── .readme/
│ ├── .gitignore
│ └── template.md
├── CONTRIBUTING.md
├── FAQ.md
├── LICENSE
├── PLAYLISTS.md
├── README.md
├── eslint.config.mjs
├── m3u-linter.json
├── package.json
├── scripts/
│ ├── api.ts
│ ├── commands/
│ │ ├── api/
│ │ │ └── load.ts
│ │ ├── playlist/
│ │ │ ├── edit.ts
│ │ │ ├── export.ts
│ │ │ ├── format.ts
│ │ │ ├── generate.ts
│ │ │ ├── test.ts
│ │ │ ├── update.ts
│ │ │ └── validate.ts
│ │ ├── readme/
│ │ │ └── update.ts
│ │ └── report/
│ │ └── create.ts
│ ├── constants.ts
│ ├── core/
│ │ ├── cliTable.ts
│ │ ├── htmlTable.ts
│ │ ├── index.ts
│ │ ├── issueData.ts
│ │ ├── issueLoader.ts
│ │ ├── issueParser.ts
│ │ ├── logParser.ts
│ │ ├── markdown.ts
│ │ ├── numberParser.ts
│ │ ├── playlistParser.ts
│ │ ├── proxyParser.ts
│ │ └── streamTester.ts
│ ├── generators/
│ │ ├── categoriesGenerator.ts
│ │ ├── citiesGenerator.ts
│ │ ├── countriesGenerator.ts
│ │ ├── generator.ts
│ │ ├── index.ts
│ │ ├── indexCategoryGenerator.ts
│ │ ├── indexCountryGenerator.ts
│ │ ├── indexGenerator.ts
│ │ ├── indexLanguageGenerator.ts
│ │ ├── languagesGenerator.ts
│ │ ├── rawGenerator.ts
│ │ ├── regionsGenerator.ts
│ │ ├── sourcesGenerator.ts
│ │ └── subdivisionsGenerator.ts
│ ├── models/
│ │ ├── index.ts
│ │ ├── issue.ts
│ │ ├── playlist.ts
│ │ └── stream.ts
│ ├── tables/
│ │ ├── categoriesTable.ts
│ │ ├── countriesTable.ts
│ │ ├── index.ts
│ │ ├── languagesTable.ts
│ │ ├── regionsTable.ts
│ │ └── table.ts
│ └── utils.ts
├── streams/
│ ├── ad.m3u
│ ├── ae.m3u
│ ├── af.m3u
│ ├── ag.m3u
│ ├── al.m3u
│ ├── am.m3u
│ ├── ao.m3u
│ ├── ar.m3u
│ ├── at.m3u
│ ├── at_pluto.m3u
│ ├── at_samsung.m3u
│ ├── au.m3u
│ ├── au_samsung.m3u
│ ├── aw.m3u
│ ├── az.m3u
│ ├── ba.m3u
│ ├── ba_morescreens.m3u
│ ├── bb.m3u
│ ├── bd.m3u
│ ├── be.m3u
│ ├── be_samsung.m3u
│ ├── bf.m3u
│ ├── bg.m3u
│ ├── bh.m3u
│ ├── bi.m3u
│ ├── bj.m3u
│ ├── bm.m3u
│ ├── bn.m3u
│ ├── bo.m3u
│ ├── bq.m3u
│ ├── br.m3u
│ ├── br_pluto.m3u
│ ├── br_samsung.m3u
│ ├── bs.m3u
│ ├── bw.m3u
│ ├── by.m3u
│ ├── bz.m3u
│ ├── bz_nexgen.m3u
│ ├── ca.m3u
│ ├── ca_pluto.m3u
│ ├── ca_samsung.m3u
│ ├── ca_stingray.m3u
│ ├── cd.m3u
│ ├── cf.m3u
│ ├── cg.m3u
│ ├── ch.m3u
│ ├── ch_netplus.m3u
│ ├── ch_pluto.m3u
│ ├── ch_samsung.m3u
│ ├── ci.m3u
│ ├── cl.m3u
│ ├── cm.m3u
│ ├── cn.m3u
│ ├── cn_112114.m3u
│ ├── cn_cctv.m3u
│ ├── cn_cgtn.m3u
│ ├── cn_yeslivetv.m3u
│ ├── co.m3u
│ ├── cr.m3u
│ ├── cu.m3u
│ ├── cv.m3u
│ ├── cw.m3u
│ ├── cy.m3u
│ ├── cz.m3u
│ ├── de.m3u
│ ├── de_pluto.m3u
│ ├── de_rakuten.m3u
│ ├── de_samsung.m3u
│ ├── dj.m3u
│ ├── dk.m3u
│ ├── dk_pluto.m3u
│ ├── dk_samsung.m3u
│ ├── dm.m3u
│ ├── do.m3u
│ ├── dz.m3u
│ ├── ec.m3u
│ ├── ee.m3u
│ ├── eg.m3u
│ ├── eh.m3u
│ ├── er.m3u
│ ├── es.m3u
│ ├── es_pluto.m3u
│ ├── es_rakuten.m3u
│ ├── es_samsung.m3u
│ ├── es_yowi.m3u
│ ├── et.m3u
│ ├── fi.m3u
│ ├── fi_rakuten.m3u
│ ├── fi_samsung.m3u
│ ├── fj.m3u
│ ├── fm.m3u
│ ├── fo.m3u
│ ├── fr.m3u
│ ├── fr_bfm.m3u
│ ├── fr_fashiontv.m3u
│ ├── fr_groupecanalplus.m3u
│ ├── fr_groupem6.m3u
│ ├── fr_persiana.m3u
│ ├── fr_pluto.m3u
│ ├── fr_rakuten.m3u
│ ├── fr_samsung.m3u
│ ├── ga.m3u
│ ├── ge.m3u
│ ├── gf.m3u
│ ├── gh.m3u
│ ├── gl.m3u
│ ├── gm.m3u
│ ├── gn.m3u
│ ├── gp.m3u
│ ├── gq.m3u
│ ├── gr.m3u
│ ├── gt.m3u
│ ├── gu.m3u
│ ├── gy.m3u
│ ├── hk.m3u
│ ├── hn.m3u
│ ├── hr.m3u
│ ├── ht.m3u
│ ├── hu.m3u
│ ├── id.m3u
│ ├── id_denstv.m3u
│ ├── ie.m3u
│ ├── ie_samsung.m3u
│ ├── il.m3u
│ ├── in.m3u
│ ├── in_distro.m3u
│ ├── in_doordarshan.m3u
│ ├── in_pishow.m3u
│ ├── in_samsung.m3u
│ ├── in_tango.m3u
│ ├── iq.m3u
│ ├── ir.m3u
│ ├── ir_telewebion.m3u
│ ├── ir_wnslive.m3u
│ ├── is.m3u
│ ├── it.m3u
│ ├── it_pluto.m3u
│ ├── it_rakuten.m3u
│ ├── it_samsung.m3u
│ ├── jm.m3u
│ ├── jo.m3u
│ ├── jp.m3u
│ ├── jp_primehome.m3u
│ ├── ke.m3u
│ ├── kg.m3u
│ ├── kh.m3u
│ ├── kh_happywatch99.m3u
│ ├── km.m3u
│ ├── kn.m3u
│ ├── kp.m3u
│ ├── kr.m3u
│ ├── kw.m3u
│ ├── kz.m3u
│ ├── la.m3u
│ ├── lb.m3u
│ ├── lc.m3u
│ ├── li.m3u
│ ├── lk.m3u
│ ├── lr.m3u
│ ├── lt.m3u
│ ├── lu.m3u
│ ├── lu_samsung.m3u
│ ├── lv.m3u
│ ├── ly.m3u
│ ├── ma.m3u
│ ├── mc.m3u
│ ├── md.m3u
│ ├── me.m3u
│ ├── mg.m3u
│ ├── mk.m3u
│ ├── ml.m3u
│ ├── mm.m3u
│ ├── mn.m3u
│ ├── mn_skygo.m3u
│ ├── mo.m3u
│ ├── mq.m3u
│ ├── mr.m3u
│ ├── mt.m3u
│ ├── mt_smashplus.m3u
│ ├── mu.m3u
│ ├── mv.m3u
│ ├── mw.m3u
│ ├── mx.m3u
│ ├── mx_amagi.m3u
│ ├── mx_multimedios.m3u
│ ├── mx_pluto.m3u
│ ├── mx_samsung.m3u
│ ├── my.m3u
│ ├── mz.m3u
│ ├── na.m3u
│ ├── ne.m3u
│ ├── ng.m3u
│ ├── ni.m3u
│ ├── nl.m3u
│ ├── nl_samsung.m3u
│ ├── no.m3u
│ ├── no_pluto.m3u
│ ├── no_samsung.m3u
│ ├── np.m3u
│ ├── nz.m3u
│ ├── nz_samsung.m3u
│ ├── om.m3u
│ ├── pa.m3u
│ ├── pe.m3u
│ ├── pe_opencaster.m3u
│ ├── pf.m3u
│ ├── pg.m3u
│ ├── ph.m3u
│ ├── ph_comclark.m3u
│ ├── pk.m3u
│ ├── pl.m3u
│ ├── pl_mediateka.m3u
│ ├── pl_rakuten.m3u
│ ├── pr.m3u
│ ├── ps.m3u
│ ├── pt.m3u
│ ├── pt_samsung.m3u
│ ├── py.m3u
│ ├── qa.m3u
│ ├── ro.m3u
│ ├── rs.m3u
│ ├── ru.m3u
│ ├── ru_15plusmg.m3u
│ ├── ru_bonustv.m3u
│ ├── ru_catcast.m3u
│ ├── ru_mylifeisgood.m3u
│ ├── ru_ntv.m3u
│ ├── ru_rt.m3u
│ ├── ru_smotrim.m3u
│ ├── ru_televizor24.m3u
│ ├── ru_tvbricks.m3u
│ ├── ru_tvteleport.m3u
│ ├── ru_zabava.m3u
│ ├── rw.m3u
│ ├── sa.m3u
│ ├── sd.m3u
│ ├── se.m3u
│ ├── se_pluto.m3u
│ ├── se_samsung.m3u
│ ├── sg.m3u
│ ├── si.m3u
│ ├── si_xploretv.m3u
│ ├── sk.m3u
│ ├── sk_antik.m3u
│ ├── sl.m3u
│ ├── sm.m3u
│ ├── sn.m3u
│ ├── so.m3u
│ ├── so_premiumfree.m3u
│ ├── sr.m3u
│ ├── st.m3u
│ ├── sv.m3u
│ ├── sx.m3u
│ ├── sy.m3u
│ ├── td.m3u
│ ├── tg.m3u
│ ├── th.m3u
│ ├── th_v2hcdn.m3u
│ ├── tj.m3u
│ ├── tl.m3u
│ ├── tm.m3u
│ ├── tn.m3u
│ ├── tr.m3u
│ ├── tr_gem.m3u
│ ├── tr_onetv.m3u
│ ├── tt.m3u
│ ├── tw.m3u
│ ├── tz.m3u
│ ├── ua.m3u
│ ├── ug.m3u
│ ├── uk.m3u
│ ├── uk_bbc.m3u
│ ├── uk_distro.m3u
│ ├── uk_pluto.m3u
│ ├── uk_rakuten.m3u
│ ├── uk_samsung.m3u
│ ├── uk_sportstribal.m3u
│ ├── us.m3u
│ ├── us_30a.m3u
│ ├── us_3abn.m3u
│ ├── us_abcnews.m3u
│ ├── us_amagi.m3u
│ ├── us_canelatv.m3u
│ ├── us_cbsn.m3u
│ ├── us_cineversetv.m3u
│ ├── us_distro.m3u
│ ├── us_firetv.m3u
│ ├── us_frequency.m3u
│ ├── us_glewedtv.m3u
│ ├── us_klowdtv.m3u
│ ├── us_local.m3u
│ ├── us_malimartv.m3u
│ ├── us_pbs.m3u
│ ├── us_plex.m3u
│ ├── us_pluto.m3u
│ ├── us_roku.m3u
│ ├── us_samsung.m3u
│ ├── us_sofast.m3u
│ ├── us_ssh101.m3u
│ ├── us_stirr.m3u
│ ├── us_tcl.m3u
│ ├── us_tubi.m3u
│ ├── us_tvpass.m3u
│ ├── us_uplynk.m3u
│ ├── us_vegasplus.m3u
│ ├── us_vizio.m3u
│ ├── us_wfmz.m3u
│ ├── us_wowza.m3u
│ ├── us_xumo.m3u
│ ├── uy.m3u
│ ├── uz.m3u
│ ├── va.m3u
│ ├── ve.m3u
│ ├── vg.m3u
│ ├── vi.m3u
│ ├── vn.m3u
│ ├── ws.m3u
│ ├── xk.m3u
│ ├── ye.m3u
│ ├── yt.m3u
│ ├── za.m3u
│ ├── za_freevisiontv.m3u
│ ├── zm.m3u
│ └── zw.m3u
├── tests/
│ ├── __data__/
│ │ ├── .gitignore
│ │ ├── expected/
│ │ │ ├── playlist_export/
│ │ │ │ └── .api/
│ │ │ │ └── streams.json
│ │ │ ├── playlist_format/
│ │ │ │ ├── at.m3u
│ │ │ │ ├── in.m3u
│ │ │ │ └── nl.m3u
│ │ │ ├── playlist_generate/
│ │ │ │ ├── .gh-pages/
│ │ │ │ │ ├── categories/
│ │ │ │ │ │ ├── general.m3u
│ │ │ │ │ │ ├── legislative.m3u
│ │ │ │ │ │ ├── news.m3u
│ │ │ │ │ │ ├── undefined.m3u
│ │ │ │ │ │ ├── weather.m3u
│ │ │ │ │ │ └── xxx.m3u
│ │ │ │ │ ├── cities/
│ │ │ │ │ │ └── adcan.m3u
│ │ │ │ │ ├── countries/
│ │ │ │ │ │ ├── ad.m3u
│ │ │ │ │ │ ├── ca.m3u
│ │ │ │ │ │ ├── int.m3u
│ │ │ │ │ │ ├── ru.m3u
│ │ │ │ │ │ └── undefined.m3u
│ │ │ │ │ ├── index.category.m3u
│ │ │ │ │ ├── index.country.m3u
│ │ │ │ │ ├── index.language.m3u
│ │ │ │ │ ├── index.m3u
│ │ │ │ │ ├── languages/
│ │ │ │ │ │ ├── cat.m3u
│ │ │ │ │ │ ├── eng.m3u
│ │ │ │ │ │ ├── rus.m3u
│ │ │ │ │ │ └── undefined.m3u
│ │ │ │ │ ├── raw/
│ │ │ │ │ │ ├── ad.m3u
│ │ │ │ │ │ ├── ca.m3u
│ │ │ │ │ │ ├── in.m3u
│ │ │ │ │ │ ├── kg.m3u
│ │ │ │ │ │ ├── uk.m3u
│ │ │ │ │ │ └── unsorted.m3u
│ │ │ │ │ ├── regions/
│ │ │ │ │ │ ├── afr.m3u
│ │ │ │ │ │ ├── amer.m3u
│ │ │ │ │ │ ├── apac.m3u
│ │ │ │ │ │ ├── arab.m3u
│ │ │ │ │ │ ├── asean.m3u
│ │ │ │ │ │ ├── asia.m3u
│ │ │ │ │ │ ├── carib.m3u
│ │ │ │ │ │ ├── cas.m3u
│ │ │ │ │ │ ├── cenamer.m3u
│ │ │ │ │ │ ├── cis.m3u
│ │ │ │ │ │ ├── emea.m3u
│ │ │ │ │ │ ├── eur.m3u
│ │ │ │ │ │ ├── hispam.m3u
│ │ │ │ │ │ ├── lac.m3u
│ │ │ │ │ │ ├── latam.m3u
│ │ │ │ │ │ ├── maghreb.m3u
│ │ │ │ │ │ ├── mena.m3u
│ │ │ │ │ │ ├── mideast.m3u
│ │ │ │ │ │ ├── nam.m3u
│ │ │ │ │ │ ├── noram.m3u
│ │ │ │ │ │ ├── nord.m3u
│ │ │ │ │ │ ├── oce.m3u
│ │ │ │ │ │ ├── sas.m3u
│ │ │ │ │ │ ├── southam.m3u
│ │ │ │ │ │ ├── ssa.m3u
│ │ │ │ │ │ ├── wafr.m3u
│ │ │ │ │ │ └── ww.m3u
│ │ │ │ │ ├── sources/
│ │ │ │ │ │ ├── ad.m3u
│ │ │ │ │ │ ├── ca.m3u
│ │ │ │ │ │ ├── in.m3u
│ │ │ │ │ │ ├── kg.m3u
│ │ │ │ │ │ ├── uk.m3u
│ │ │ │ │ │ └── unsorted.m3u
│ │ │ │ │ └── subdivisions/
│ │ │ │ │ ├── ad-02.m3u
│ │ │ │ │ ├── ad-07.m3u
│ │ │ │ │ └── ca-on.m3u
│ │ │ │ └── logs/
│ │ │ │ └── generators.log
│ │ │ ├── playlist_test/
│ │ │ │ ├── af.m3u
│ │ │ │ └── ag.m3u
│ │ │ ├── playlist_update/
│ │ │ │ ├── br_example.m3u
│ │ │ │ ├── bz.m3u
│ │ │ │ ├── cy.m3u
│ │ │ │ ├── fr.m3u
│ │ │ │ ├── uk.m3u
│ │ │ │ └── us.m3u
│ │ │ └── readme_update/
│ │ │ └── playlists.md
│ │ └── input/
│ │ ├── data/
│ │ │ ├── blocklist.json
│ │ │ ├── categories.json
│ │ │ ├── channels.json
│ │ │ ├── cities.json
│ │ │ ├── countries.json
│ │ │ ├── feeds.json
│ │ │ ├── guides.json
│ │ │ ├── languages.json
│ │ │ ├── logos.json
│ │ │ ├── regions.json
│ │ │ ├── streams.json
│ │ │ ├── subdivisions.json
│ │ │ └── timezones.json
│ │ ├── issues.js
│ │ ├── playlist_edit/
│ │ │ └── playlist.m3u
│ │ ├── playlist_export/
│ │ │ ├── ad.m3u
│ │ │ ├── ca.m3u
│ │ │ ├── in.m3u
│ │ │ ├── uk.m3u
│ │ │ └── unsorted.m3u
│ │ ├── playlist_format/
│ │ │ ├── at.m3u
│ │ │ ├── in.m3u
│ │ │ └── nl.m3u
│ │ ├── playlist_generate/
│ │ │ ├── ad.m3u
│ │ │ ├── ca.m3u
│ │ │ ├── id_denstv.m3u
│ │ │ ├── in.m3u
│ │ │ ├── kg.m3u
│ │ │ ├── qa.m3u
│ │ │ ├── uk.m3u
│ │ │ └── unsorted.m3u
│ │ ├── playlist_test/
│ │ │ ├── results.js
│ │ │ └── streams/
│ │ │ ├── af.m3u
│ │ │ └── ag.m3u
│ │ ├── playlist_update/
│ │ │ ├── manifest.mpd
│ │ │ ├── playlist.m3u8
│ │ │ └── streams/
│ │ │ ├── br.m3u
│ │ │ ├── br_example.m3u
│ │ │ ├── bz.m3u
│ │ │ ├── cy.m3u
│ │ │ └── uk.m3u
│ │ ├── playlist_validate/
│ │ │ ├── invalid_url.m3u
│ │ │ ├── us_blocked.m3u
│ │ │ └── wrong_id.m3u
│ │ ├── readme_update/
│ │ │ └── generators.log
│ │ └── report_create/
│ │ ├── br.m3u
│ │ ├── cy.m3u
│ │ ├── uk.m3u
│ │ └── us.m3u
│ └── commands/
│ ├── playlist/
│ │ ├── edit.test.ts
│ │ ├── export.test.ts
│ │ ├── format.test.ts
│ │ ├── generate.test.ts
│ │ ├── test.test.ts
│ │ ├── update.test.ts
│ │ └── validate.test.ts
│ ├── readme/
│ │ └── update.test.ts
│ └── report/
│ └── create.test.ts
└── tsconfig.json
================================================
FILE CONTENTS
================================================
================================================
FILE: .github/CODE_OF_CONDUCT.md
================================================
# Contributor Code of Conduct
As contributors and maintainers of this project, we pledge to respect all people who contribute through reporting issues, posting feature requests, updating documentation, submitting pull requests or patches, and other activities.
We are committed to making participation in this project a harassment-free experience for everyone, regardless of level of experience, gender, gender identity and expression, sexual orientation, disability, personal appearance, body size, race, ethnicity, age, or religion.
Examples of unacceptable behavior by participants include the use of sexual language or imagery, derogatory comments or personal attacks, trolling, public or private harassment, insults, or other unprofessional conduct.
Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct. Project maintainers who do not follow the Code of Conduct may be removed from the project team.
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by opening an issue or contacting one or more of the project maintainers.
This Code of Conduct is adapted from the [Contributor Covenant](http:contributor-covenant.org), version 1.0.0, available at https://www.contributor-covenant.org/version/1/0/0/code-of-conduct.html
================================================
FILE: .github/FUNDING.yml
================================================
# These are supported funding model platforms
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
patreon: # Replace with a single Patreon username
open_collective: iptv-org
ko_fi: # Replace with a single Ko-fi username
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
================================================
FILE: .github/ISSUE_TEMPLATE/1_streams_add.yml
================================================
name: ➕ Add stream
description: Request to add a new stream link into the playlist
title: 'Add: '
labels: ['streams:add']
body:
- type: input
id: stream_id
attributes:
label: Stream ID (required)
description: "ID of the stream consisting of `<channel_id>` or `<channel_id>@<feed_id>`. Full list of supported channels with corresponding ID could be found on [iptv-org.github.io](https://iptv-org.github.io/). If you can't find the channel you want in the list, please let us know through this [form](https://github.com/iptv-org/database/issues/new?assignees=&labels=channels%3Aadd&projects=&template=channels_add.yml&title=Add%3A+) before posting your request."
placeholder: 'BBCAmerica.us@East'
validations:
required: true
- type: input
id: stream_url
attributes:
label: Stream URL (required)
description: Link to be added to the playlist
placeholder: 'https://example.com/playlist.m3u8'
validations:
required: true
- type: dropdown
id: quality
attributes:
label: Quality
description: Maximum video resolution available on the link
options:
- 2160p
- 1280p
- 1080p
- 1080i
- 720p
- 576p
- 576i
- 480p
- 480i
- 360p
- type: dropdown
id: label
attributes:
label: Label
description: Is there any reason why the broadcast may not work?
options:
- 'Not 24/7'
- 'Geo-blocked'
- type: input
id: http_user_agent
attributes:
label: HTTP User Agent
placeholder: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36 Edge/12.246'
- type: input
id: http_referrer
attributes:
label: HTTP Referrer
placeholder: 'https://example.com/'
- type: textarea
id: notes
attributes:
label: Notes
description: 'Anything else we should know about this broadcast?'
- type: checkboxes
attributes:
label: Contributing Guide
description: 'Please read this guide before posting your request'
options:
- label: I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md)
required: true
================================================
FILE: .github/ISSUE_TEMPLATE/2_streams_edit.yml
================================================
name: ✏️ Edit stream
description: Request to edit stream description
title: 'Edit: '
labels: ['streams:edit']
body:
- type: input
id: stream_url
attributes:
label: Stream URL (required)
description: Link to the stream to be updated
placeholder: 'https://lnc-kdfw-fox-aws.tubi.video/index.m3u8'
validations:
required: true
- type: markdown
attributes:
value: |
What exactly needs to be changed? To delete an existing value without replacement use the `~` symbol.
- type: input
id: stream_id
attributes:
label: Stream ID
description: "ID of the stream consisting of `<channel_id>` or `<channel_id>@<feed_id>`. Full list of supported channels with corresponding ID could be found on [iptv-org.github.io](https://iptv-org.github.io/). If you can't find the channel you want in the list, please let us know through this [form](https://github.com/iptv-org/database/issues/new?assignees=&labels=channels%3Aadd&projects=&template=channels_add.yml&title=Add%3A+) before posting your request."
placeholder: 'BBCAmerica.us@East'
- type: dropdown
id: quality
attributes:
label: Quality
description: Maximum video resolution available on the link
options:
- 2160p
- 1280p
- 1080p
- 1080i
- 720p
- 576p
- 576i
- 480p
- 480i
- 360p
- '~'
- type: dropdown
id: label
attributes:
label: Label
description: Is there any reason why the broadcast may not work?
options:
- 'Not 24/7'
- 'Geo-blocked'
- '~'
- type: input
id: http_user_agent
attributes:
label: HTTP User Agent
placeholder: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36 Edge/12.246'
- type: input
id: http_referrer
attributes:
label: HTTP Referrer
placeholder: 'https://example.com/'
- type: textarea
id: notes
attributes:
label: Notes
placeholder: 'Anything else we should know?'
- type: checkboxes
attributes:
label: Contributing Guide
description: 'Please read this guide before posting your request'
options:
- label: I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md)
required: true
================================================
FILE: .github/ISSUE_TEMPLATE/3_streams_report.yml
================================================
name: 🚧 Report a stream
description: Report a broken or unstable stream
title: 'Report: '
labels: ['streams:remove']
body:
- type: markdown
attributes:
value: |
Please fill out the form as much as you can so we could efficiently process your request. To suggest a new replacement link, use this [form](https://github.com/iptv-org/iptv/issues/new?assignees=&labels=streams:add&projects=&template=1_streams_add.yml&title=Add%3A+).
- type: textarea
id: stream_url
attributes:
label: Stream URL
description: List all links in question (one per line)
placeholder: 'https://lnc-kdfw-fox-aws.tubi.video/index.m3u8'
validations:
required: true
- type: dropdown
id: reason
attributes:
label: What happened to the stream?
options:
- Not loading
- Constantly interrupts/lagging
- Stuck at a single frame
- I see visual artifacts
- Shows looped video
- No sound
- Displays a message asking to renew subscription
- Other
validations:
required: true
- type: textarea
id: notes
attributes:
label: Notes (optional)
placeholder: 'Anything else we should know?'
- type: checkboxes
attributes:
label: Contributing Guide
description: 'Please read this guide before posting your request'
options:
- label: I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md)
required: true
================================================
FILE: .github/ISSUE_TEMPLATE/4_channel-search.yml
================================================
name: 🔍 Channel search
description: Ask for help in finding a link to the channel stream.
title: 'Find: '
labels: ['channel search']
body:
- type: input
id: stream_id
attributes:
label: Stream ID (required)
description: Unique ID of the channel and feed from [iptv-org.github.io](https://iptv-org.github.io/). If you cannot find the channel or feed you are looking for in the list, please let us know via one of the [forms](https://github.com/iptv-org/database/issues/new/choose) before posting your request.
placeholder: 'BBCAmerica.us@East'
validations:
required: true
- type: textarea
id: notes
attributes:
label: Notes
description: 'Any additional information that may help find a link to the stream faster?'
- type: checkboxes
attributes:
label: Contributing Guide
description: 'Please read this guide before posting your request'
options:
- label: I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md)
required: true
================================================
FILE: .github/ISSUE_TEMPLATE/5_bug-report.yml
================================================
name: 🐞 Bug report
description: Report an error in this repository
labels: ['bug']
body:
- type: textarea
attributes:
label: Describe your issue
description: Please describe the error in as much detail as possible so that we can fix it quickly.
validations:
required: true
- type: checkboxes
attributes:
label: Contributing Guide
description: 'Please read this guide before posting your request'
options:
- label: I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md)
required: true
================================================
FILE: .github/ISSUE_TEMPLATE/6_copyright-claim.yml
================================================
name: ©️ Copyright removal request
description: Request to remove content
labels: ['removal request']
body:
- type: input
attributes:
label: Your full legal name
validations:
required: true
- type: dropdown
attributes:
label: Are you the copyright holder or authorized to act on the copyright owner's behalf?
description: We cannot process your request unless it is submitted by the copyright owner or an agent authorized to act on behalf of the copyright owner.
options:
- Yes, I am the copyright holder.
- Yes, I am authorized to act on the copyright owner's behalf.
- No.
validations:
required: true
- type: textarea
attributes:
label: Please describe the nature of your copyright ownership or authorization to act on the owner's behalf.
validations:
required: true
- type: textarea
attributes:
label: Please provide a detailed description of the original copyrighted work that has allegedly been infringed. If possible, include a URL to where it is posted online.
validations:
required: true
- type: textarea
attributes:
label: What content should be removed? Please specify the URL for each item or, if it is an entire file, the file's URL.
validations:
required: true
- type: textarea
attributes:
label: Any additional information we need to know?
- type: checkboxes
attributes:
label: Contributing Guide
description: 'Please read this guide before posting your request'
options:
- label: I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md)
required: true
================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false
contact_links:
- name: 💡 Ideas
url: https://github.com/orgs/iptv-org/discussions/categories/ideas
about: Share ideas for new features
- name: 🙌 Show and tell
url: https://github.com/orgs/iptv-org/discussions/categories/show-and-tell
about: Show off something you've made
- name: ❓ Q&A
url: https://github.com/orgs/iptv-org/discussions/categories/q-a
about: Ask the community for help
================================================
FILE: .github/workflows/check.yml
================================================
name: check
on:
workflow_dispatch:
pull_request:
types: [opened, synchronize, reopened]
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
jobs:
check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Get list of changed files
id: files
run: |
git fetch origin master:master
ANY_CHANGED=false
ALL_CHANGED_FILES=$(git diff --diff-filter=ACMRT --name-only master -- streams/ | tr '\n' ' ')
if [ -n "${ALL_CHANGED_FILES}" ]; then
ANY_CHANGED=true
fi
echo "all_changed_files=$ALL_CHANGED_FILES" >> "$GITHUB_OUTPUT"
echo "any_changed=$ANY_CHANGED" >> "$GITHUB_OUTPUT"
- uses: actions/setup-node@v6
if: steps.files.outputs.any_changed == 'true'
with:
node-version: 22
cache: 'npm'
- name: Install dependencies
if: steps.files.outputs.any_changed == 'true'
run: npm install
- name: Validate changed files
if: steps.files.outputs.any_changed == 'true'
run: |
npm run playlist:lint -- ${{ steps.files.outputs.all_changed_files }}
npm run playlist:validate -- ${{ steps.files.outputs.all_changed_files }}
================================================
FILE: .github/workflows/format.yml
================================================
name: format
on:
workflow_dispatch:
# schedule:
# - cron: "0 12 * * *"
jobs:
main:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: tibdex/github-app-token@v1.8.2
if: ${{ !env.ACT }}
id: create-app-token
with:
app_id: ${{ secrets.APP_ID }}
private_key: ${{ secrets.APP_PRIVATE_KEY }}
- uses: actions/checkout@v6
if: ${{ !env.ACT }}
with:
token: ${{ steps.create-app-token.outputs.token }}
- uses: actions/setup-node@v6
with:
node-version: 22
cache: 'npm'
- name: Install dependencies
run: npm install
- name: Format internal playlists
run: npm run playlist:format
- name: Check internal playlists
run: |
npm run playlist:lint
npm run playlist:validate
- name: Get list of changed files
id: files_after
run: |
ANY_CHANGED=false
ALL_CHANGED_FILES=$(git diff --diff-filter=ACMRT --name-only master -- streams/ | tr '\n' ' ')
if [ -n "${ALL_CHANGED_FILES}" ]; then
ANY_CHANGED=true
fi
echo "all_changed_files=$ALL_CHANGED_FILES" >> "$GITHUB_OUTPUT"
echo "any_changed=$ANY_CHANGED" >> "$GITHUB_OUTPUT"
- name: Setup git
run: |
git config user.name "iptv-bot[bot]"
git config user.email "84861620+iptv-bot[bot]@users.noreply.github.com"
- name: Commit changes to /streams
if: steps.files_after.outputs.any_changed == 'true'
run: |
git add streams
git status
git commit -m "[Bot] Format /streams" -m "Committed by [iptv-bot](https://github.com/apps/iptv-bot) via [format](https://github.com/iptv-org/iptv/actions/runs/${{ github.run_id }}) workflow." --no-verify
- name: Push all changes to the repository
if: ${{ !env.ACT && github.ref == 'refs/heads/master' && steps.files_after.outputs.any_changed == 'true' }}
run: git push
================================================
FILE: .github/workflows/stale.yml
================================================
name: stale
on:
workflow_dispatch:
schedule:
- cron: '0 0 * * *'
permissions:
actions: write
issues: write
jobs:
stale:
runs-on: ubuntu-latest
steps:
- uses: tibdex/github-app-token@v1.8.2
id: create-app-token
with:
app_id: ${{ secrets.APP_ID }}
private_key: ${{ secrets.APP_PRIVATE_KEY }}
- uses: actions/stale@v10
with:
repo-token: ${{ steps.create-app-token.outputs.token }}
days-before-stale: 180
days-before-close: 7
operations-per-run: 500
stale-issue-label: 'stale'
any-of-issue-labels: 'channel search'
close-issue-message: 'This request has been closed because it has been inactive for more than 180 days.'
================================================
FILE: .github/workflows/update.yml
================================================
name: update
on:
workflow_dispatch:
schedule:
- cron: '0 0 * * *'
jobs:
main:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: tibdex/github-app-token@v1.8.2
if: ${{ !env.ACT }}
id: create-app-token
with:
app_id: ${{ secrets.APP_ID }}
private_key: ${{ secrets.APP_PRIVATE_KEY }}
- uses: actions/checkout@v6
if: ${{ !env.ACT }}
with:
token: ${{ steps.create-app-token.outputs.token }}
- uses: actions/setup-node@v6
with:
node-version: 22
cache: 'npm'
- name: Install dependencies
run: npm install
- name: Update internal playlists
run: npm run playlist:update --silent >> $GITHUB_OUTPUT
id: playlist-update
- name: Check internal playlists
run: |
npm run playlist:lint
npm run playlist:validate
- name: Generate public playlists
run: npm run playlist:generate
- name: Create .api/streams.json
run: npm run playlist:export
- name: Update readme
run: npm run readme:update
- name: Setup git
run: |
git config user.name "iptv-bot[bot]"
git config user.email "84861620+iptv-bot[bot]@users.noreply.github.com"
- name: Commit changes to /streams
run: |
git add streams
git status
git commit --allow-empty -m "[Bot] Update /streams" -m "Committed by [iptv-bot](https://github.com/apps/iptv-bot) via [update](https://github.com/iptv-org/iptv/actions/runs/${{ github.run_id }}) workflow." -m "${{ steps.playlist-update.outputs.OUTPUT }}" --no-verify
- name: Commit changes to PLAYLIST.md
run: |
git add PLAYLISTS.md
git status
git commit --allow-empty -m "[Bot] Update PLAYLISTS.md" -m "Committed by [iptv-bot](https://github.com/apps/iptv-bot) via [update](https://github.com/iptv-org/iptv/actions/runs/${{ github.run_id }}) workflow." --no-verify
- name: Push all changes to the repository
if: ${{ !env.ACT && github.ref == 'refs/heads/master' }}
run: git push
- name: Deploy public playlists to GitHub Pages
uses: JamesIves/github-pages-deploy-action@4.1.1
if: ${{ !env.ACT && github.ref == 'refs/heads/master' }}
with:
repository-name: iptv-org/iptv
branch: gh-pages
folder: .gh-pages
token: ${{ steps.create-app-token.outputs.token }}
git-config-name: iptv-bot[bot]
git-config-email: 84861620+iptv-bot[bot]@users.noreply.github.com
commit-message: '[Bot] Deploy to GitHub Pages'
clean: true
- name: Move .api/streams.json to iptv-org/api
uses: JamesIves/github-pages-deploy-action@4.1.1
if: ${{ !env.ACT && github.ref == 'refs/heads/master' }}
with:
repository-name: iptv-org/api
branch: gh-pages
folder: .api
token: ${{ steps.create-app-token.outputs.token }}
git-config-name: iptv-bot[bot]
git-config-email: 84861620+iptv-bot[bot]@users.noreply.github.com
commit-message: '[Bot] Deploy to iptv-org/api'
clean: false
================================================
FILE: .gitignore
================================================
node_modules
.artifacts
.secrets
.actrc
.DS_Store
/.gh-pages/
/.api/
.env
/temp/
================================================
FILE: .prettierrc
================================================
{
"singleQuote": true,
"semi": false,
"printWidth": 100,
"trailingComma": "none",
"arrowParens": "avoid"
}
================================================
FILE: .readme/.gitignore
================================================
_categories.md
_countries.md
_languages.md
_regions.md
================================================
FILE: .readme/template.md
================================================
## Playlists
There are several versions of playlists that differ in the way they are grouped. As of January 30th, 2024, we have stopped distributing NSFW channels. For more information, please look at [this issue](https://github.com/iptv-org/iptv/issues/15723).
### Grouped by category
Playlists in which channels are grouped by category.
<details>
<summary>Expand</summary>
<br>
```
https://iptv-org.github.io/iptv/index.category.m3u
```
Same thing, but split up into separate files:
<!-- prettier-ignore -->
#include "./.readme/_categories.md"
</details>
### Grouped by language
Playlists in which channels are grouped by the language in which they are broadcast.
<details>
<summary>Expand</summary>
<br>
```
https://iptv-org.github.io/iptv/index.language.m3u
```
Same thing, but split up into separate files:
<!-- prettier-ignore -->
#include "./.readme/_languages.md"
</details>
### Grouped by broadcast area
Playlists in which channels are grouped by broadcast area.
<details>
<summary>Expand</summary>
#### Countries
```
https://iptv-org.github.io/iptv/index.country.m3u
```
Same thing, but split up into separate files:
<!-- prettier-ignore -->
#include "./.readme/_countries.md"
#### Regions
<!-- prettier-ignore -->
#include "./.readme/_regions.md"
</details>
### Grouped by sources
Playlists in which channels are grouped by broadcast source.
<details>
<summary>Expand</summary>
<br>
To use the playlist, simply replace `<FILENAME>` in the link below with the name of one of the files in the [streams](streams) folder.
```
https://iptv-org.github.io/iptv/sources/<FILENAME>.m3u
```
</details>
Also, any of our internal playlists are available in raw form (without any filtering or sorting) at this link:
```
https://iptv-org.github.io/iptv/raw/<FILENAME>.m3u
```
================================================
FILE: CONTRIBUTING.md
================================================
# Contributing Guide
- [How to?](#how-to)
- [Stream Description Scheme](#stream-description-scheme)
- [Project Structure](#project-structure)
- [Scripts](#scripts)
- [Workflows](#workflows)
## How to?
### How to add a new stream link to a playlists?
You have several options:
1. Create a new request using this [form](https://github.com/iptv-org/iptv/issues/new?assignees=&labels=streams:add&projects=&template=1_streams_add.yml&title=Add%3A+) and if approved, the link will automatically be added to the playlist on the next update.
2. Add the link to the playlist directly using a [pull request](https://github.com/iptv-org/iptv/pulls).
Regardless of which option you choose, before posting your request please do the following:
- Make sure the link you want to add works stably. To check this, open it in one of the players (for example, [VLC player](https://www.videolan.org/vlc/index.html)) and watch the broadcast for at least a minute (some test streams are interrupted after 15-30 seconds).
- Make sure the link is not already in the playlist. This can be done by [searching](https://github.com/search?q=repo%3Aiptv-org%2Fiptv+http%3A%2F%2Fexample.com&type=code) the repository.
- Make sure the link does not lead to the Xtream Codes server. [Why don't you accept links to Xtream Codes server?](FAQ.md#why-dont-you-accept-links-to-xtream-codes-server)
- Make sure that the link leads directly to the broadcast, without unnecessary redirects.
- Find the ID of the channel you want on [iptv-org.github.io](https://iptv-org.github.io/). If your desired channel is not on the list you can leave a request to add it [here](https://github.com/iptv-org/database/issues/new/choose).
- Make sure the channel is not blocklisted. It can also be done through [iptv-org.github.io](https://iptv-org.github.io/).
- If you know that the broadcast only works in certain countries or it is periodically interrupted, do not forget to indicate this in the request.
A requests without a valid stream ID or working link to the stream will be closed immediately.
Note all links in playlists are sorted automatically by scripts so there is no need to sort them manually. For more info, see [Scripts](#scripts).
### How to fix the stream description?
Most of the stream description (channel name, feed name, categories, languages, broadcast area, logo) we load from the [iptv-org/database](https://github.com/iptv-org/database) using the stream ID.
So first of all, make sure that the desired stream has the correct ID. A full list of all supported channels and their corresponding IDs can be found on [iptv-org.github.io](https://iptv-org.github.io/). To change the stream ID of any link in the playlist, just fill out this [form](https://github.com/iptv-org/iptv/issues/new?assignees=&labels=streams%3Aedit&projects=&template=2_streams_edit.yml&title=Edit%3A+).
If, however, you have found an error in the database itself, this is the place to go: [How to edit channel description?](https://github.com/iptv-org/database/blob/master/CONTRIBUTING.md#how-to-edit-channel-description)
### How to distinguish a link to an Xtream Codes server from a regular one?
Most of them have this form:
`http(s)://{hostname}:{port}/{username}/{password}/{channelID}` (port is often `25461`)
To make sure that the link leads to the Xtream Codes server, copy the `hostname`, `port`, `username` and `password` into the link below and try to open it in a browser:
`http(s)://{hostname}:{port}/panel_api.php?username={username}&password={password}`
If the link answers, you're with an Xtream Codes server.
### How to report a broken stream?
Fill out this [form](https://github.com/iptv-org/iptv/issues/new?assignees=&labels=streams:remove&projects=&template=3_streams_report.yml&title=Broken%3A+) and as soon as a working replacement appears, we will add it to the playlist or at least remove the non-working one.
The only thing before publishing your report is to make sure that:
- The link is still in our playlists. You can verify this by [searching](https://github.com/search?q=repo%3Aiptv-org%2Fiptv+http%3A%2F%2Fexample.com&type=code) the repository.
- The link really doesn't work and is not just [geo-blocked](https://en.wikipedia.org/wiki/Geo-blocking). To check this, you can either use a [VPN](https://en.wikipedia.org/wiki/Virtual_private_network) or services such as [streamtest.in](https://streamtest.in/).
An issue without a valid link will be closed immediately.
### How to find a broken stream?
For starters, you can just try to open the playlist in [VLC player](https://www.videolan.org/vlc/). The player outputs all errors to the log (Tools -> Messages) so you'll be able to determine pretty accurately why a link isn't working.
Another way to test links is to use the NPM script. To do this, first make sure you have [Node.js](https://nodejs.org/en) installed on your system. Then go to the `iptv` folder using [Console](https://en.wikipedia.org/wiki/Windows_Console) (or [Terminal](<https://en.wikipedia.org/wiki/Terminal_(macOS)>) if you have macOS) and run the command:
```sh
npm run playlist:test path/to/playlist.m3u
```
This command will run an automatic check of all links in the playlist and display their status:
```sh
npm run playlist:test streams/fr.m3u
streams/fr.m3u
┌─────┬───────────────────────────┬──────────────────────────────────────────────────────────────────────────────────────────────────────┬────────────────┬───────────────────────────┐
│ │ tvg-id │ url │ label │ status │
├─────┼───────────────────────────┼──────────────────────────────────────────────────────────────────────────────────────────────────────┼────────────────┼───────────────────────────┤
│ 0 │ 6ter.fr │ https://origin-caf900c010ea8046.live.6cloud.fr/out/v1/29c7a579af3348b48230f76cd75699a5/dash_short... │ │ LOADING... │
│ 1 │ 20MinutesTV.fr │ https://lives.digiteka.com/stream/86d3e867-a272-496b-8412-f59aa0104771/index.m3u8 │ │ FFMPEG_STREAMS_NOT_FOUND │
│ 2 │ │ https://video1.getstreamhosting.com:1936/8420/8420/playlist.m3u8 │ │ OK │
│ 3 │ ADNTVPlus.fr │ https://samsunguk-adn-samsung-fre-qfrlc.amagi.tv/playlist/samsunguk-adn-samsung-fre/playlist.m3u8 │ Geo-blocked │ HTTP_FORBIDDEN │
│ 4 │ Africa24.fr │ https://edge12.vedge.infomaniak.com/livecast/ik:africa24/manifest.m3u8 │ │ OK │
│ 5 │ Africa24English.fr │ https://edge17.vedge.infomaniak.com/livecast/ik:africa24sport/manifest.m3u8 │ │ OK │
│ 6 │ AfricanewsEnglish.fr │ https://37c774660687468c821a51190046facf.mediatailor.us-east-1.amazonaws.com/v1/master/04fd913bb2... │ │ HTTP_GATEWAY_TIMEOUT │
│ 7 │ AlpedHuezTV.fr │ https://edge.vedge.infomaniak.com/livecast/ik:adhtv/chunklist.m3u8 │ Not 24/7 │ HTTP_NOT_FOUND │
```
Also, if you add the `--fix` option to the command, the script will automatically remove all broken streams it finds from your local copy of playlists:
```sh
npm run playlist:test streams/fr.m3u --- --fix
```
After that, all you need to do is report the broken streams you found via the [form](https://github.com/iptv-org/iptv/issues/new?assignees=&labels=streams:remove&projects=&template=3_streams_report.yml&title=Broken%3A+) or create a [pull request](https://github.com/iptv-org/iptv/pulls) with updated playlists.
### How to remove my channel from playlist?
To request removal of a link to a channel from the repository, you need to fill out this [form](https://github.com/iptv-org/iptv/issues/new?assignees=&labels=removal+request&projects=&template=6_copyright-claim.yml&title=Remove%3A+) and wait for the request to be reviewed (this usually takes no more than 1 business day). And if the request is approved, links to the channel will be immediately removed from the repository.
The channel will also be added to our [blocklist](https://github.com/iptv-org/database/blob/master/data/blocklist.csv) to avoid its appearance in our playlists in the future.
Please note that we only accept removal requests from channel owners and their official representatives, all other requests will be closed immediately.
## Stream Description Scheme
For a stream to be approved, its description must follow this template:
```
#EXTINF:-1 tvg-id="STREAM_ID",STREAM_TITLE (QUALITY) [LABEL]
STREAM_URL
```
| Attribute | Description | Required | Valid values |
| -------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | -------------------------------------------- |
| `STREAM_ID` | Stream ID consisting of channel ID and feed ID. Full list of supported channels with corresponding ID could be found on [iptv-org.github.io](https://iptv-org.github.io/). | Optional | `<channel_id>` or `<channel_id>@<feed_id>` |
| `STREAM_TITLE` | Stream title consisting of channel name and feed name. May contain any characters except: `,`, `[`, `]`. | Required | - |
| `QUALITY` | Maximum stream quality. | Optional | `2160p`, `1080p`, `720p`, `480p`, `360p` etc |
| `LABEL` | Specified in cases where the broadcast for some reason may not be available to some users. | Optional | `Geo-blocked` or `Not 24/7` |
| `STREAM_URL` | Stream URL. | Required | - |
Example:
```xml
#EXTINF:-1 tvg-id="ExampleTV.us@East",Example TV East (720p) [Not 24/7]
https://example.com/playlist.m3u8
```
Also, if necessary, you can specify custom [HTTP User-Agent](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/User-Agent) and [HTTP Referrer](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referer) through `#EXTVLCOPT` directive:
```xml
#EXTINF:-1 tvg-id="ExampleTV.us",Example TV
#EXTVLCOPT:http-referrer=http://example.com/
#EXTVLCOPT:http-user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64)
http://example.com/stream.m3u8
```
## Project Structure
- `.github/`
- `ISSUE_TEMPLATE/`: issue templates for the repository.
- `workflows`: contains [GitHub actions](https://docs.github.com/en/actions/quickstart) workflows.
- `CODE_OF_CONDUCT.md`: rules you shouldn't break if you don't want to get banned.
- `.readme/`
- `config.json`: config for the `markdown-include` package, which is used to compile everything into one `PLAYLISTS.md` file.
- `preview.png`: image displayed in the `README.md`.
- `template.md`: template for `PLAYLISTS.md`.
- `scripts/`: contains all scripts used in the repository.
- `streams/`: contains all streams broken down by the country from which they are broadcast.
- `tests/`: contains tests to check the scripts.
- `CONTRIBUTING.md`: file you are currently reading.
- `PLAYLISTS.md`: auto-updated list of available playlists.
- `README.md`: project description.
## Scripts
These scripts are created to automate routine processes in the repository and make it a bit easier to maintain.
For scripts to work, you must have [Node.js](https://nodejs.org/en) installed on your computer.
To run scripts use the `npm run <script-name>` command.
- `act:check`: allows to run the [check](https://github.com/iptv-org/iptv/blob/master/.github/workflows/check.yml) workflow locally. Depends on [nektos/gh-act](https://github.com/nektos/gh-act).
- `act:format`: allows to test the [format](https://github.com/iptv-org/iptv/blob/master/.github/workflows/update.yml) workflow locally. Depends on [nektos/gh-act](https://github.com/nektos/gh-act).
- `act:update`: allows to test the [update](https://github.com/iptv-org/iptv/blob/master/.github/workflows/update.yml) workflow locally. Depends on [nektos/gh-act](https://github.com/nektos/gh-act).
- `api:load`: downloads the latest channel and stream data from the [iptv-org/api](https://github.com/iptv-org/api).
- `playlist:format`: formats internal playlists. The process includes [URL normalization](https://en.wikipedia.org/wiki/URI_normalization), duplicate removal, removing invalid id's and sorting links by channel name, quality, and label.
- `playlist:update`: triggers an update of internal playlists. The process involves processing approved requests from issues.
- `playlist:generate`: generates all public playlists.
- `playlist:validate`: сhecks ids and links in internal playlists for errors.
- `playlist:lint`: сhecks internal playlists for syntax errors.
- `playlist:test`: tests links in internal playlists.
- `playlist:edit`: utility for quick streams mapping.
- `playlist:export`: creates a JSON file with all streams for the [iptv-org/api](https://github.com/iptv-org/api) repository.
- `readme:update`: updates the list of playlists in [README.md](README.md).
- `report:create`: creates a report on current issues.
- `lint`: сhecks the scripts for syntax errors.
- `test`: runs a test of all the scripts described above.
## Workflows
To automate the run of the scripts described above, we use the [GitHub Actions workflows](https://docs.github.com/en/actions/using-workflows).
Each workflow includes its own set of scripts that can be run either manually or in response to an event.
- `check`: sequentially runs the `api:load`, `playlist:check` and `playlist:validate` scripts when a new pull request appears, and blocks the merge if it detects an error in it.
- `format`: sequentially runs `api:load`, `playlist:format`, `playlist:lint` and `playlist:validate` scripts.
- `update`: every day at 0:00 UTC sequentially runs `api:load`, `playlist:update`, `playlist:lint`, `playlist:validate`, `playlist:generate`, `playlist:export` and `readme:update` scripts and deploys the output files if successful.
================================================
FILE: FAQ.md
================================================
# Frequently Asked Questions
### My favorite channel is not on the playlist.
Start by asking our community for help via [Discussions](https://github.com/orgs/iptv-org/discussions). It is quite possible that someone already has a link to the channel you need and they just haven't added it to our playlist yet.
But keep in mind that not all TV channels are available for viewing online, and in this case there is little we can do about it.
### Are you planning to include a Video On Demand (VOD) to the playlist?
No.
### Why is the channel on the iptv-org.github.io but not in the playlist?
The site contains a list of all TV channels in the world and only those of them for which we have working stream links are included in the playlists.
### Can I add a radio broadcast?
Yes, if it is a [visual radio](https://en.wikipedia.org/wiki/Visual_radio) in which a video and audio are shown at the same time.
### Why don't you accept links to Xtream Codes server?
Xtream Codes streams tend to be very unstable, and often links to them fail very quickly, so it's easier for us to initially exclude them from the playlist than to search for expired ones every day.
================================================
FILE: LICENSE
================================================
This is free and unencumbered software released into the public domain.
Anyone is free to copy, modify, publish, use, compile, sell, or
distribute this software, either in source code form or as a compiled
binary, for any purpose, commercial or non-commercial, and by any
means.
In jurisdictions that recognize copyright laws, the author or authors
of this software dedicate any and all copyright interest in the
software to the public domain. We make this dedication for the benefit
of the public at large and to the detriment of our heirs and
successors. We intend this dedication to be an overt act of
relinquishment in perpetuity of all present and future rights to this
software under copyright law.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
For more information, please refer to <http://unlicense.org/>
================================================
FILE: PLAYLISTS.md
================================================
## Playlists
There are several versions of playlists that differ in the way they are grouped. As of January 30th, 2024, we have stopped distributing NSFW channels. For more information, please look at [this issue](https://github.com/iptv-org/iptv/issues/15723).
### Grouped by category
Playlists in which channels are grouped by category.
<details>
<summary>Expand</summary>
<br>
```
https://iptv-org.github.io/iptv/index.category.m3u
```
Same thing, but split up into separate files:
<!-- 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>Animation</td><td align="right">74</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/animation.m3u</code></td></tr>
<tr><td>Auto</td><td align="right">18</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/auto.m3u</code></td></tr>
<tr><td>Business</td><td align="right">73</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/business.m3u</code></td></tr>
<tr><td>Classic</td><td align="right">49</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/classic.m3u</code></td></tr>
<tr><td>Comedy</td><td align="right">64</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/comedy.m3u</code></td></tr>
<tr><td>Cooking</td><td align="right">33</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/cooking.m3u</code></td></tr>
<tr><td>Culture</td><td align="right">160</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/culture.m3u</code></td></tr>
<tr><td>Documentary</td><td align="right">124</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/documentary.m3u</code></td></tr>
<tr><td>Education</td><td align="right">185</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/education.m3u</code></td></tr>
<tr><td>Entertainment</td><td align="right">606</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/entertainment.m3u</code></td></tr>
<tr><td>Family</td><td align="right">51</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/family.m3u</code></td></tr>
<tr><td>General</td><td align="right">2360</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/general.m3u</code></td></tr>
<tr><td>Interactive</td><td align="right">1</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/interactive.m3u</code></td></tr>
<tr><td>Kids</td><td align="right">220</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/kids.m3u</code></td></tr>
<tr><td>Legislative</td><td align="right">177</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/legislative.m3u</code></td></tr>
<tr><td>Lifestyle</td><td align="right">93</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/lifestyle.m3u</code></td></tr>
<tr><td>Movies</td><td align="right">391</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/movies.m3u</code></td></tr>
<tr><td>Music</td><td align="right">626</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/music.m3u</code></td></tr>
<tr><td>News</td><td align="right">905</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/news.m3u</code></td></tr>
<tr><td>Outdoor</td><td align="right">52</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/outdoor.m3u</code></td></tr>
<tr><td>Public</td><td align="right">39</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/public.m3u</code></td></tr>
<tr><td>Relax</td><td align="right">6</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/relax.m3u</code></td></tr>
<tr><td>Religious</td><td align="right">697</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/religious.m3u</code></td></tr>
<tr><td>Science</td><td align="right">19</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/science.m3u</code></td></tr>
<tr><td>Series</td><td align="right">185</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/series.m3u</code></td></tr>
<tr><td>Shop</td><td align="right">78</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/shop.m3u</code></td></tr>
<tr><td>Sports</td><td align="right">286</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/sports.m3u</code></td></tr>
<tr><td>Travel</td><td align="right">43</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/travel.m3u</code></td></tr>
<tr><td>Weather</td><td align="right">16</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/weather.m3u</code></td></tr>
<tr><td>XXX</td><td align="right">0</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/xxx.m3u</code></td></tr>
<tr><td>Undefined</td><td align="right">4670</td><td nowrap><code>https://iptv-org.github.io/iptv/categories/undefined.m3u</code></td></tr>
</tbody>
</table>
</details>
### Grouped by language
Playlists in which channels are grouped by the language in which they are broadcast.
<details>
<summary>Expand</summary>
<br>
```
https://iptv-org.github.io/iptv/index.language.m3u
```
Same thing, but split up into separate files:
<!-- 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">Acoli</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/ach.m3u</code></td></tr>
<tr><td align="left">Adhola</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/adh.m3u</code></td></tr>
<tr><td align="left">Afar</td><td align="right">2</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/aar.m3u</code></td></tr>
<tr><td align="left">Afrikaans</td><td align="right">7</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/afr.m3u</code></td></tr>
<tr><td align="left">Ahom</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/aho.m3u</code></td></tr>
<tr><td align="left">Albanian</td><td align="right">42</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/sqi.m3u</code></td></tr>
<tr><td align="left">Alemannic</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/gsw.m3u</code></td></tr>
<tr><td align="left">Algerian Sign Language</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/asp.m3u</code></td></tr>
<tr><td align="left">Alur</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/alz.m3u</code></td></tr>
<tr><td align="left">Amharic</td><td align="right">5</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/amh.m3u</code></td></tr>
<tr><td align="left">Arabic</td><td align="right">345</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/ara.m3u</code></td></tr>
<tr><td align="left">Armenian</td><td align="right">6</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/hye.m3u</code></td></tr>
<tr><td align="left">Assamese</td><td align="right">13</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/asm.m3u</code></td></tr>
<tr><td align="left">Assyrian Neo-Aramaic</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/aii.m3u</code></td></tr>
<tr><td align="left">Ayizo Gbe</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/ayb.m3u</code></td></tr>
<tr><td align="left">Aymara</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/aym.m3u</code></td></tr>
<tr><td align="left">Azerbaijani</td><td align="right">17</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/aze.m3u</code></td></tr>
<tr><td align="left">Baatonum</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/bba.m3u</code></td></tr>
<tr><td align="left">Bambara</td><td align="right">5</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/bam.m3u</code></td></tr>
<tr><td align="left">Bashkir</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/bak.m3u</code></td></tr>
<tr><td align="left">Basque</td><td align="right">6</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/eus.m3u</code></td></tr>
<tr><td align="left">Belarusian</td><td align="right">3</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/bel.m3u</code></td></tr>
<tr><td align="left">Bengali</td><td align="right">85</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/ben.m3u</code></td></tr>
<tr><td align="left">Bhojpuri</td><td align="right">9</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/bho.m3u</code></td></tr>
<tr><td align="left">Bisa</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/bib.m3u</code></td></tr>
<tr><td align="left">Bosnian</td><td align="right">13</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/bos.m3u</code></td></tr>
<tr><td align="left">Buamu</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/box.m3u</code></td></tr>
<tr><td align="left">Bulgarian</td><td align="right">20</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/bul.m3u</code></td></tr>
<tr><td align="left">Burmese</td><td align="right">9</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/mya.m3u</code></td></tr>
<tr><td align="left">Catalan</td><td align="right">62</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/cat.m3u</code></td></tr>
<tr><td align="left">Cebuano</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/ceb.m3u</code></td></tr>
<tr><td align="left">Central Atlas Tamazight</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/tzm.m3u</code></td></tr>
<tr><td align="left">Central Kurdish</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/ckb.m3u</code></td></tr>
<tr><td align="left">Chhattisgarhi</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/hne.m3u</code></td></tr>
<tr><td align="left">Chiga</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/cgg.m3u</code></td></tr>
<tr><td align="left">Chinese</td><td align="right">205</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/zho.m3u</code></td></tr>
<tr><td align="left">Croatian</td><td align="right">25</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/hrv.m3u</code></td></tr>
<tr><td align="left">Czech</td><td align="right">27</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/ces.m3u</code></td></tr>
<tr><td align="left">Danish</td><td align="right">11</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/dan.m3u</code></td></tr>
<tr><td align="left">Dari (Parsi)</td><td align="right">15</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/prd.m3u</code></td></tr>
<tr><td align="left">Dhivehi</td><td align="right">10</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/div.m3u</code></td></tr>
<tr><td align="left">Dholuo</td><td align="right">2</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/luo.m3u</code></td></tr>
<tr><td align="left">Dimili</td><td align="right">2</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/zza.m3u</code></td></tr>
<tr><td align="left">Dutch</td><td align="right">175</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/nld.m3u</code></td></tr>
<tr><td align="left">Dyula</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/dyu.m3u</code></td></tr>
<tr><td align="left">Egyptian Arabic</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/arz.m3u</code></td></tr>
<tr><td align="left">English</td><td align="right">2275</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/eng.m3u</code></td></tr>
<tr><td align="left">Estonian</td><td align="right">9</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/est.m3u</code></td></tr>
<tr><td align="left">Ewe</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/ewe.m3u</code></td></tr>
<tr><td align="left">Faroese</td><td align="right">2</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/fao.m3u</code></td></tr>
<tr><td align="left">Fataleka</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/far.m3u</code></td></tr>
<tr><td align="left">Filipino</td><td align="right">2</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/fil.m3u</code></td></tr>
<tr><td align="left">Finnish</td><td align="right">26</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/fin.m3u</code></td></tr>
<tr><td align="left">Fon</td><td align="right">2</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/fon.m3u</code></td></tr>
<tr><td align="left">French</td><td align="right">414</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/fra.m3u</code></td></tr>
<tr><td align="left">Fulah</td><td align="right">2</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/ful.m3u</code></td></tr>
<tr><td align="left">Gaelic</td><td align="right">2</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/gla.m3u</code></td></tr>
<tr><td align="left">Galician</td><td align="right">2</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/glg.m3u</code></td></tr>
<tr><td align="left">Ganda</td><td align="right">5</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/lug.m3u</code></td></tr>
<tr><td align="left">Gen</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/gej.m3u</code></td></tr>
<tr><td align="left">Georgian</td><td align="right">22</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/kat.m3u</code></td></tr>
<tr><td align="left">German</td><td align="right">320</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/deu.m3u</code></td></tr>
<tr><td align="left">Gikuyu</td><td align="right">3</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/kik.m3u</code></td></tr>
<tr><td align="left">Goan Konkani</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/gom.m3u</code></td></tr>
<tr><td align="left">Gourmanchéma</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/gux.m3u</code></td></tr>
<tr><td align="left">Greek</td><td align="right">94</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/ell.m3u</code></td></tr>
<tr><td align="left">Guadeloupean Creole French</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/gcf.m3u</code></td></tr>
<tr><td align="left">Guarani</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/grn.m3u</code></td></tr>
<tr><td align="left">Gujarati</td><td align="right">11</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/guj.m3u</code></td></tr>
<tr><td align="left">Gun</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/guw.m3u</code></td></tr>
<tr><td align="left">Haitian</td><td align="right">19</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/hat.m3u</code></td></tr>
<tr><td align="left">Hausa</td><td align="right">2</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/hau.m3u</code></td></tr>
<tr><td align="left">Hebrew</td><td align="right">11</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/heb.m3u</code></td></tr>
<tr><td align="left">Hindi</td><td align="right">280</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/hin.m3u</code></td></tr>
<tr><td align="left">Hmong</td><td align="right">2</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/hmn.m3u</code></td></tr>
<tr><td align="left">Hungarian</td><td align="right">91</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/hun.m3u</code></td></tr>
<tr><td align="left">Icelandic</td><td align="right">4</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/isl.m3u</code></td></tr>
<tr><td align="left">Indonesian</td><td align="right">181</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/ind.m3u</code></td></tr>
<tr><td align="left">Inuktitut</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/iku.m3u</code></td></tr>
<tr><td align="left">Irish</td><td align="right">2</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/gle.m3u</code></td></tr>
<tr><td align="left">Isekiri</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/its.m3u</code></td></tr>
<tr><td align="left">Islander Creole English</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/icr.m3u</code></td></tr>
<tr><td align="left">Italian</td><td align="right">268</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/ita.m3u</code></td></tr>
<tr><td align="left">Japanese</td><td align="right">67</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/jpn.m3u</code></td></tr>
<tr><td align="left">Javanese</td><td align="right">5</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/jav.m3u</code></td></tr>
<tr><td align="left">Kabiyè</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/kbp.m3u</code></td></tr>
<tr><td align="left">Kabyle</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/kab.m3u</code></td></tr>
<tr><td align="left">Kannada</td><td align="right">29</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/kan.m3u</code></td></tr>
<tr><td align="left">Kapampangan</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/pam.m3u</code></td></tr>
<tr><td align="left">Kazakh</td><td align="right">28</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/kaz.m3u</code></td></tr>
<tr><td align="left">Khmer</td><td align="right">30</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/khm.m3u</code></td></tr>
<tr><td align="left">Khorasani Turkish</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/kmz.m3u</code></td></tr>
<tr><td align="left">Kinyarwanda</td><td align="right">8</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/kin.m3u</code></td></tr>
<tr><td align="left">Kirghiz</td><td align="right">13</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/kir.m3u</code></td></tr>
<tr><td align="left">Kituba (Congo)</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/mkw.m3u</code></td></tr>
<tr><td align="left">Konabéré</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/bbo.m3u</code></td></tr>
<tr><td align="left">Kongo</td><td align="right">2</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/kon.m3u</code></td></tr>
<tr><td align="left">Konkani (macrolanguage)</td><td align="right">3</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/kok.m3u</code></td></tr>
<tr><td align="left">Korean</td><td align="right">80</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/kor.m3u</code></td></tr>
<tr><td align="left">Kumam</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/kdi.m3u</code></td></tr>
<tr><td align="left">Kurdish</td><td align="right">33</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/kur.m3u</code></td></tr>
<tr><td align="left">Lahnda</td><td align="right">2</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/lah.m3u</code></td></tr>
<tr><td align="left">Lango (Uganda)</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/laj.m3u</code></td></tr>
<tr><td align="left">Lao</td><td align="right">6</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/lao.m3u</code></td></tr>
<tr><td align="left">Latin</td><td align="right">4</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/lat.m3u</code></td></tr>
<tr><td align="left">Latvian</td><td align="right">8</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/lav.m3u</code></td></tr>
<tr><td align="left">Letzeburgesch</td><td align="right">12</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/ltz.m3u</code></td></tr>
<tr><td align="left">Lingala</td><td align="right">5</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/lin.m3u</code></td></tr>
<tr><td align="left">Lithuanian</td><td align="right">10</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/lit.m3u</code></td></tr>
<tr><td align="left">Lobi</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/lob.m3u</code></td></tr>
<tr><td align="left">Luba-Lulua</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/lua.m3u</code></td></tr>
<tr><td align="left">Lushai</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/lus.m3u</code></td></tr>
<tr><td align="left">Lyélé</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/lee.m3u</code></td></tr>
<tr><td align="left">Macedonian</td><td align="right">26</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/mkd.m3u</code></td></tr>
<tr><td align="left">Maithili</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/mai.m3u</code></td></tr>
<tr><td align="left">Malay</td><td align="right">17</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/msa.m3u</code></td></tr>
<tr><td align="left">Malayalam</td><td align="right">69</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/mal.m3u</code></td></tr>
<tr><td align="left">Maltese</td><td align="right">6</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/mlt.m3u</code></td></tr>
<tr><td align="left">Mandarin Chinese</td><td align="right">3</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/cmn.m3u</code></td></tr>
<tr><td align="left">Mandinka</td><td align="right">2</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/mnk.m3u</code></td></tr>
<tr><td align="left">Maori</td><td align="right">2</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/mri.m3u</code></td></tr>
<tr><td align="left">Marathi</td><td align="right">21</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/mar.m3u</code></td></tr>
<tr><td align="left">Marka</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/rkm.m3u</code></td></tr>
<tr><td align="left">Matya Samo</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/stj.m3u</code></td></tr>
<tr><td align="left">Maya Samo</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/sym.m3u</code></td></tr>
<tr><td align="left">Min Nan Chinese</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/nan.m3u</code></td></tr>
<tr><td align="left">Mongolian</td><td align="right">38</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/mon.m3u</code></td></tr>
<tr><td align="left">Moroccan Sign Language</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/xms.m3u</code></td></tr>
<tr><td align="left">Mossi</td><td align="right">2</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/mos.m3u</code></td></tr>
<tr><td align="left">Nepali</td><td align="right">6</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/nep.m3u</code></td></tr>
<tr><td align="left">Northern Dagara</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/dgi.m3u</code></td></tr>
<tr><td align="left">Norwegian</td><td align="right">9</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/nor.m3u</code></td></tr>
<tr><td align="left">Nyankole</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/nyn.m3u</code></td></tr>
<tr><td align="left">Nyoro</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/nyo.m3u</code></td></tr>
<tr><td align="left">Oriya (macrolanguage)</td><td align="right">12</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/ori.m3u</code></td></tr>
<tr><td align="left">Panjabi</td><td align="right">36</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/pan.m3u</code></td></tr>
<tr><td align="left">Papiamento</td><td align="right">15</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/pap.m3u</code></td></tr>
<tr><td align="left">Paraguayan Guaraní</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/gug.m3u</code></td></tr>
<tr><td align="left">Pashto</td><td align="right">24</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/pus.m3u</code></td></tr>
<tr><td align="left">Persian</td><td align="right">213</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/fas.m3u</code></td></tr>
<tr><td align="left">Polish</td><td align="right">100</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/pol.m3u</code></td></tr>
<tr><td align="left">Portuguese</td><td align="right">266</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/por.m3u</code></td></tr>
<tr><td align="left">Pulaar</td><td align="right">3</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/fuc.m3u</code></td></tr>
<tr><td align="left">Quechua</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/que.m3u</code></td></tr>
<tr><td align="left">Romanian</td><td align="right">103</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/ron.m3u</code></td></tr>
<tr><td align="left">Romany</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/rom.m3u</code></td></tr>
<tr><td align="left">Russian</td><td align="right">383</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/rus.m3u</code></td></tr>
<tr><td align="left">Saint Lucian Creole French</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/acf.m3u</code></td></tr>
<tr><td align="left">Samoan</td><td align="right">2</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/smo.m3u</code></td></tr>
<tr><td align="left">Santali</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/sat.m3u</code></td></tr>
<tr><td align="left">Serbian</td><td align="right">40</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/srp.m3u</code></td></tr>
<tr><td align="left">Sindhi</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/snd.m3u</code></td></tr>
<tr><td align="left">Sinhala</td><td align="right">11</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/sin.m3u</code></td></tr>
<tr><td align="left">Slovak</td><td align="right">35</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/slk.m3u</code></td></tr>
<tr><td align="left">Slovenian</td><td align="right">12</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/slv.m3u</code></td></tr>
<tr><td align="left">Somali</td><td align="right">13</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/som.m3u</code></td></tr>
<tr><td align="left">South African Sign Language</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/sfs.m3u</code></td></tr>
<tr><td align="left">South Ndebele</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/nbl.m3u</code></td></tr>
<tr><td align="left">Southern Samo</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/sbd.m3u</code></td></tr>
<tr><td align="left">Spanish</td><td align="right">1572</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/spa.m3u</code></td></tr>
<tr><td align="left">Standard Arabic</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/arb.m3u</code></td></tr>
<tr><td align="left">Sundanese</td><td align="right">4</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/sun.m3u</code></td></tr>
<tr><td align="left">Swahili</td><td align="right">17</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/swa.m3u</code></td></tr>
<tr><td align="left">Swati</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/ssw.m3u</code></td></tr>
<tr><td align="left">Swedish</td><td align="right">12</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/swe.m3u</code></td></tr>
<tr><td align="left">Tachawit</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/shy.m3u</code></td></tr>
<tr><td align="left">Tachelhit</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/shi.m3u</code></td></tr>
<tr><td align="left">Tagalog</td><td align="right">11</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/tgl.m3u</code></td></tr>
<tr><td align="left">Tahitian</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/tah.m3u</code></td></tr>
<tr><td align="left">Tajik</td><td align="right">15</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/tgk.m3u</code></td></tr>
<tr><td align="left">Tamashek</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/tmh.m3u</code></td></tr>
<tr><td align="left">Tamasheq</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/taq.m3u</code></td></tr>
<tr><td align="left">Tamil</td><td align="right">115</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/tam.m3u</code></td></tr>
<tr><td align="left">Tarifit</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/rif.m3u</code></td></tr>
<tr><td align="left">Tatar</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/tat.m3u</code></td></tr>
<tr><td align="left">Telugu</td><td align="right">66</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/tel.m3u</code></td></tr>
<tr><td align="left">Thai</td><td align="right">63</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/tha.m3u</code></td></tr>
<tr><td align="left">Tibetan</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/bod.m3u</code></td></tr>
<tr><td align="left">Tigre</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/tig.m3u</code></td></tr>
<tr><td align="left">Tigrinya</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/tir.m3u</code></td></tr>
<tr><td align="left">Tooro</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/ttj.m3u</code></td></tr>
<tr><td align="left">Tsonga</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/tso.m3u</code></td></tr>
<tr><td align="left">Turkish</td><td align="right">206</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/tur.m3u</code></td></tr>
<tr><td align="left">Turkmen</td><td align="right">9</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/tuk.m3u</code></td></tr>
<tr><td align="left">Uighur</td><td align="right">3</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/uig.m3u</code></td></tr>
<tr><td align="left">Ukrainian</td><td align="right">53</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/ukr.m3u</code></td></tr>
<tr><td align="left">Urdu</td><td align="right">78</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/urd.m3u</code></td></tr>
<tr><td align="left">Uzbek</td><td align="right">23</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/uzb.m3u</code></td></tr>
<tr><td align="left">Venda</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/ven.m3u</code></td></tr>
<tr><td align="left">Vietnamese</td><td align="right">56</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/vie.m3u</code></td></tr>
<tr><td align="left">Welsh</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/cym.m3u</code></td></tr>
<tr><td align="left">Western Frisian</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/fry.m3u</code></td></tr>
<tr><td align="left">Wolof</td><td align="right">9</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/wol.m3u</code></td></tr>
<tr><td align="left">Xhosa</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/xho.m3u</code></td></tr>
<tr><td align="left">Yakut</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/sah.m3u</code></td></tr>
<tr><td align="left">Yoruba</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/yor.m3u</code></td></tr>
<tr><td align="left">Yucatec Maya</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/yua.m3u</code></td></tr>
<tr><td align="left">Yue Chinese</td><td align="right">6</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/yue.m3u</code></td></tr>
<tr><td align="left">Zarma</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/dje.m3u</code></td></tr>
<tr><td align="left">Zulu</td><td align="right">1</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/zul.m3u</code></td></tr>
<tr><td align="left">Undefined</td><td align="right">3345</td><td align="left" nowrap><code>https://iptv-org.github.io/iptv/languages/undefined.m3u</code></td></tr>
</tbody>
</table>
</details>
### Grouped by broadcast area
Playlists in which channels are grouped by broadcast area.
<details>
<summary>Expand</summary>
#### Countries
```
https://iptv-org.github.io/iptv/index.country.m3u
```
Same thing, but split up into separate files:
<!-- prettier-ignore -->
- 🇦🇫 Afghanistan <code>https://iptv-org.github.io/iptv/countries/af.m3u</code>
- 🇦🇱 Albania <code>https://iptv-org.github.io/iptv/countries/al.m3u</code>
- 🇩🇿 Algeria <code>https://iptv-org.github.io/iptv/countries/dz.m3u</code>
- 🇦🇩 Andorra <code>https://iptv-org.github.io/iptv/countries/ad.m3u</code>
- 🇦🇴 Angola <code>https://iptv-org.github.io/iptv/countries/ao.m3u</code>
- 🇦🇷 Argentina <code>https://iptv-org.github.io/iptv/countries/ar.m3u</code>
- Buenos Aires <code>https://iptv-org.github.io/iptv/subdivisions/ar-b.m3u</code>
- La Plata <code>https://iptv-org.github.io/iptv/cities/arlpg.m3u</code>
- Mar del Plata <code>https://iptv-org.github.io/iptv/cities/armdq.m3u</code>
- San Miguel <code>https://iptv-org.github.io/iptv/cities/arsmg.m3u</code>
- San Pedro <code>https://iptv-org.github.io/iptv/cities/arsnp.m3u</code>
- Santa Teresita <code>https://iptv-org.github.io/iptv/cities/arsst.m3u</code>
- Tres Arroyos <code>https://iptv-org.github.io/iptv/cities/aroyo.m3u</code>
- Catamarca <code>https://iptv-org.github.io/iptv/subdivisions/ar-k.m3u</code>
- San Fernando del Valle de Catamarca <code>https://iptv-org.github.io/iptv/cities/arsfv.m3u</code>
- Chaco <code>https://iptv-org.github.io/iptv/subdivisions/ar-h.m3u</code>
- Resistencia <code>https://iptv-org.github.io/iptv/cities/arres.m3u</code>
- Chubut <code>https://iptv-org.github.io/iptv/subdivisions/ar-u.m3u</code>
- Trelew <code>https://iptv-org.github.io/iptv/cities/arrel.m3u</code>
- Ciudad Autonoma de Buenos Aires <code>https://iptv-org.github.io/iptv/subdivisions/ar-c.m3u</code>
- Buenos Aires <code>https://iptv-org.github.io/iptv/cities/arbue.m3u</code>
- Cordoba <code>https://iptv-org.github.io/iptv/subdivisions/ar-x.m3u</code>
- Villa María <code>https://iptv-org.github.io/iptv/cities/arvmr.m3u</code>
- Entre Rios <code>https://iptv-org.github.io/iptv/subdivisions/ar-e.m3u</code>
- Jujuy <code>https://iptv-org.github.io/iptv/subdivisions/ar-y.m3u</code>
- San Salvador de Jujuy <code>https://iptv-org.github.io/iptv/cities/arssj.m3u</code>
- La Pampa <code>https://iptv-org.github.io/iptv/subdivisions/ar-l.m3u</code>
- Santa Rosa <code>https://iptv-org.github.io/iptv/cities/arrsa.m3u</code>
- La Rioja <code>https://iptv-org.github.io/iptv/subdivisions/ar-f.m3u</code>
- Misiones <code>https://iptv-org.github.io/iptv/subdivisions/ar-n.m3u</code>
- Posadas <code>https://iptv-org.github.io/iptv/cities/arpss.m3u</code>
- Neuquén <code>https://iptv-org.github.io/iptv/subdivisions/ar-q.m3u</code>
- Neuquén <code>https://iptv-org.github.io/iptv/cities/arnqn.m3u</code>
- Salta <code>https://iptv-org.github.io/iptv/subdivisions/ar-a.m3u</code>
- Salta <code>https://iptv-org.github.io/iptv/cities/arsla.m3u</code>
- San Juan <code>https://iptv-org.github.io/iptv/subdivisions/ar-j.m3u</code>
- San Juan <code>https://iptv-org.github.io/iptv/cities/aruaq.m3u</code>
- San Luis <code>https://iptv-org.github.io/iptv/subdivisions/ar-d.m3u</code>
- San Luis <code>https://iptv-org.github.io/iptv/cities/arluq.m3u</code>
- Santa Cruz <code>https://iptv-org.github.io/iptv/subdivisions/ar-z.m3u</code>
- Las Heras <code>https://iptv-org.github.io/iptv/cities/arlhs.m3u</code>
- Santa Fe <code>https://iptv-org.github.io/iptv/subdivisions/ar-s.m3u</code>
- Rosario <code>https://iptv-org.github.io/iptv/cities/arros.m3u</code>
- Santa Fe <code>https://iptv-org.github.io/iptv/cities/arsfn.m3u</code>
- Venado Tuerto <code>https://iptv-org.github.io/iptv/cities/arvnt.m3u</code>
- Santiago del Estero <code>https://iptv-org.github.io/iptv/subdivisions/ar-g.m3u</code>
- Santiago del Estero <code>https://iptv-org.github.io/iptv/cities/arsde.m3u</code>
- Tucuman <code>https://iptv-org.github.io/iptv/subdivisions/ar-t.m3u</code>
- San Miguel de Tucumán <code>https://iptv-org.github.io/iptv/cities/arsmc.m3u</code>
- 🇦🇲 Armenia <code>https://iptv-org.github.io/iptv/countries/am.m3u</code>
- 🇦🇼 Aruba <code>https://iptv-org.github.io/iptv/countries/aw.m3u</code>
- 🇦🇺 Australia <code>https://iptv-org.github.io/iptv/countries/au.m3u</code>
- Australian Capital Territory <code>https://iptv-org.github.io/iptv/subdivisions/au-act.m3u</code>
- New South Wales <code>https://iptv-org.github.io/iptv/subdivisions/au-nsw.m3u</code>
- Sydney <code>https://iptv-org.github.io/iptv/cities/ausyd.m3u</code>
- Northern Territory <code>https://iptv-org.github.io/iptv/subdivisions/au-nt.m3u</code>
- Queensland <code>https://iptv-org.github.io/iptv/subdivisions/au-qld.m3u</code>
- South Australia <code>https://iptv-org.github.io/iptv/subdivisions/au-sa.m3u</code>
- Tasmania <code>https://iptv-org.github.io/iptv/subdivisions/au-tas.m3u</code>
- Victoria <code>https://iptv-org.github.io/iptv/subdivisions/au-vic.m3u</code>
- Western Australia <code>https://iptv-org.github.io/iptv/subdivisions/au-wa.m3u</code>
- 🇦🇹 Austria <code>https://iptv-org.github.io/iptv/countries/at.m3u</code>
- Kärnten <code>https://iptv-org.github.io/iptv/subdivisions/at-2.m3u</code>
- Klagenfurt <code>https://iptv-org.github.io/iptv/cities/atklu.m3u</code>
- Steiermark <code>https://iptv-org.github.io/iptv/subdivisions/at-6.m3u</code>
- Graz <code>https://iptv-org.github.io/iptv/cities/atgrz.m3u</code>
- Tirol <code>https://iptv-org.github.io/iptv/subdivisions/at-7.m3u</code>
- Innsbruck <code>https://iptv-org.github.io/iptv/cities/atinn.m3u</code>
- Vorarlberg <code>https://iptv-org.github.io/iptv/subdivisions/at-8.m3u</code>
- 🇦🇿 Azerbaijan <code>https://iptv-org.github.io/iptv/countries/az.m3u</code>
- 🇧🇸 Bahamas <code>https://iptv-org.github.io/iptv/countries/bs.m3u</code>
- 🇧🇭 Bahrain <code>https://iptv-org.github.io/iptv/countries/bh.m3u</code>
- 🇧🇩 Bangladesh <code>https://iptv-org.github.io/iptv/countries/bd.m3u</code>
- 🇧🇧 Barbados <code>https://iptv-org.github.io/iptv/countries/bb.m3u</code>
- 🇧🇾 Belarus <code>https://iptv-org.github.io/iptv/countries/by.m3u</code>
- 🇧🇪 Belgium <code>https://iptv-org.github.io/iptv/countries/be.m3u</code>
- Antwerpen <code>https://iptv-org.github.io/iptv/subdivisions/be-van.m3u</code>
- Vlaams Gewest <code>https://iptv-org.github.io/iptv/subdivisions/be-vlg.m3u</code>
- 🇧🇿 Belize <code>https://iptv-org.github.io/iptv/countries/bz.m3u</code>
- 🇧🇯 Benin <code>https://iptv-org.github.io/iptv/countries/bj.m3u</code>
- 🇧🇹 Bhutan <code>https://iptv-org.github.io/iptv/countries/bt.m3u</code>
- 🇧🇴 Bolivia <code>https://iptv-org.github.io/iptv/countries/bo.m3u</code>
- Cochabamba <code>https://iptv-org.github.io/iptv/subdivisions/bo-c.m3u</code>
- Cochabamba <code>https://iptv-org.github.io/iptv/cities/bocbb.m3u</code>
- La Paz <code>https://iptv-org.github.io/iptv/subdivisions/bo-l.m3u</code>
- Oruro <code>https://iptv-org.github.io/iptv/subdivisions/bo-o.m3u</code>
- Oruro <code>https://iptv-org.github.io/iptv/cities/booru.m3u</code>
- Santa Cruz <code>https://iptv-org.github.io/iptv/subdivisions/bo-s.m3u</code>
- Santa Cruz de la Sierra <code>https://iptv-org.github.io/iptv/cities/boscs.m3u</code>
- 🇧🇶 Bonaire <code>https://iptv-org.github.io/iptv/countries/bq.m3u</code>
- 🇧🇦 Bosnia and Herzegovina <code>https://iptv-org.github.io/iptv/countries/ba.m3u</code>
- 🇧🇷 Brazil <code>https://iptv-org.github.io/iptv/countries/br.m3u</code>
- Amazonas <code>https://iptv-org.github.io/iptv/subdivisions/br-am.m3u</code>
- Bahia <code>https://iptv-org.github.io/iptv/subdivisions/br-ba.m3u</code>
- Ceara <code>https://iptv-org.github.io/iptv/subdivisions/br-ce.m3u</code>
- Distrito Federal <code>https://iptv-org.github.io/iptv/subdivisions/br-df.m3u</code>
- Brasília <code>https://iptv-org.github.io/iptv/cities/brbsb.m3u</code>
- Espirito Santo <code>https://iptv-org.github.io/iptv/subdivisions/br-es.m3u</code>
- Cachoeiro de Itapemirim <code>https://iptv-org.github.io/iptv/cities/brcdi.m3u</code>
- Colatina <code>https://iptv-org.github.io/iptv/cities/brctn.m3u</code>
- São Mateus <code>https://iptv-org.github.io/iptv/cities/brsms.m3u</code>
- Maranhao <code>https://iptv-org.github.io/iptv/subdivisions/br-ma.m3u</code>
- Caxias <code>https://iptv-org.github.io/iptv/cities/brcxs.m3u</code>
- Mato Grosso <code>https://iptv-org.github.io/iptv/subdivisions/br-mt.m3u</code>
- Cuiabá <code>https://iptv-org.github.io/iptv/cities/brcba.m3u</code>
- Minas Gerais <code>https://iptv-org.github.io/iptv/subdivisions/br-mg.m3u</code>
- Uberlândia <code>https://iptv-org.github.io/iptv/cities/brudi.m3u</code>
- Viçosa <code>https://iptv-org.github.io/iptv/cities/brvis.m3u</code>
- Para <code>https://iptv-org.github.io/iptv/subdivisions/br-pa.m3u</code>
- Castanhal <code>https://iptv-org.github.io/iptv/cities/brcas.m3u</code>
- Paraiba <code>https://iptv-org.github.io/iptv/subdivisions/br-pb.m3u</code>
- João Pessoa <code>https://iptv-org.github.io/iptv/cities/brjpa.m3u</code>
- Parana <code>https://iptv-org.github.io/iptv/subdivisions/br-pr.m3u</code>
- Curitiba <code>https://iptv-org.github.io/iptv/cities/brcwb.m3u</code>
- Pernambuco <code>https://iptv-org.github.io/iptv/subdivisions/br-pe.m3u</code>
- Surubim <code>https://iptv-org.github.io/iptv/cities/brsrb.m3u</code>
- Rio de Janeiro <code>https://iptv-org.github.io/iptv/subdivisions/br-rj.m3u</code>
- Cabo Frio <code>https://iptv-org.github.io/iptv/cities/brcfo.m3u</code>
- Maricá <code>https://iptv-org.github.io/iptv/cities/brmrc.m3u</code>
- Nova Friburgo <code>https://iptv-org.github.io/iptv/cities/brnfu.m3u</code>
- Rio Grande do Norte <code>https://iptv-org.github.io/iptv/subdivisions/br-rn.m3u</code>
- Natal <code>https://iptv-org.github.io/iptv/cities/brnat.m3u</code>
- Rio Grande do Sul <code>https://iptv-org.github.io/iptv/subdivisions/br-rs.m3u</code>
- Passo Fundo <code>https://iptv-org.github.io/iptv/cities/brpfo.m3u</code>
- Porto Alegre <code>https://iptv-org.github.io/iptv/cities/brpoa.m3u</code>
- Rondonia <code>https://iptv-org.github.io/iptv/subdivisions/br-ro.m3u</code>
- Santa Catarina <code>https://iptv-org.github.io/iptv/subdivisions/br-sc.m3u</code>
- Balneário Camboriú <code>https://iptv-org.github.io/iptv/cities/brbac.m3u</code>
- São José <code>https://iptv-org.github.io/iptv/cities/brsje.m3u</code>
- Sao Paulo <code>https://iptv-org.github.io/iptv/subdivisions/br-sp.m3u</code>
- Araçatuba <code>https://iptv-org.github.io/iptv/cities/braru.m3u</code>
- Guarulhos <code>https://iptv-org.github.io/iptv/cities/brgus.m3u</code>
- Itapetininga <code>https://iptv-org.github.io/iptv/cities/briig.m3u</code>
- Sao Paulo <code>https://iptv-org.github.io/iptv/cities/brsao.m3u</code>
- Sertãozinho <code>https://iptv-org.github.io/iptv/cities/brszo.m3u</code>
- 🇻🇬 British Virgin Islands <code>https://iptv-org.github.io/iptv/countries/vg.m3u</code>
- 🇧🇳 Brunei <code>https://iptv-org.github.io/iptv/countries/bn.m3u</code>
- 🇧🇬 Bulgaria <code>https://iptv-org.github.io/iptv/countries/bg.m3u</code>
- 🇧🇫 Burkina Faso <code>https://iptv-org.github.io/iptv/countries/bf.m3u</code>
- 🇰🇭 Cambodia <code>https://iptv-org.github.io/iptv/countries/kh.m3u</code>
- 🇨🇲 Cameroon <code>https://iptv-org.github.io/iptv/countries/cm.m3u</code>
- 🇨🇦 Canada <code>https://iptv-org.github.io/iptv/countries/ca.m3u</code>
- Alberta <code>https://iptv-org.github.io/iptv/subdivisions/ca-ab.m3u</code>
- Calgary <code>https://iptv-org.github.io/iptv/cities/cacal.m3u</code>
- Edmonton <code>https://iptv-org.github.io/iptv/cities/caedm.m3u</code>
- British Columbia <code>https://iptv-org.github.io/iptv/subdivisions/ca-bc.m3u</code>
- Langley <code>https://iptv-org.github.io/iptv/cities/calng.m3u</code>
- Vancouver <code>https://iptv-org.github.io/iptv/cities/cavan.m3u</code>
- Victoria <code>https://iptv-org.github.io/iptv/cities/cavic.m3u</code>
- Manitoba <code>https://iptv-org.github.io/iptv/subdivisions/ca-mb.m3u</code>
- Neepawa <code>https://iptv-org.github.io/iptv/cities/canee.m3u</code>
- Winnipeg <code>https://iptv-org.github.io/iptv/cities/cawnp.m3u</code>
- New Brunswick <code>https://iptv-org.github.io/iptv/subdivisions/ca-nb.m3u</code>
- Fredericton <code>https://iptv-org.github.io/iptv/cities/cafre.m3u</code>
- Moncton <code>https://iptv-org.github.io/iptv/cities/camnt.m3u</code>
- Newfoundland and Labrador <code>https://iptv-org.github.io/iptv/subdivisions/ca-nl.m3u</code>
- St. John's <code>https://iptv-org.github.io/iptv/cities/casjf.m3u</code>
- Northwest Territories <code>https://iptv-org.github.io/iptv/subdivisions/ca-nt.m3u</code>
- Yellowknife <code>https://iptv-org.github.io/iptv/cities/cayzf.m3u</code>
- Nova Scotia <code>https://iptv-org.github.io/iptv/subdivisions/ca-ns.m3u</code>
- Halifax <code>https://iptv-org.github.io/iptv/cities/cahal.m3u</code>
- Nunavut <code>https://iptv-org.github.io/iptv/subdivisions/ca-nu.m3u</code>
- Iqaluit <code>https://iptv-org.github.io/iptv/cities/caiql.m3u</code>
- Ontario <code>https://iptv-org.github.io/iptv/subdivisions/ca-on.m3u</code>
- Ottawa <code>https://iptv-org.github.io/iptv/cities/caott.m3u</code>
- Toronto <code>https://iptv-org.github.io/iptv/cities/cator.m3u</code>
- Windsor <code>https://iptv-org.github.io/iptv/cities/cawnd.m3u</code>
- Prince Edward Island <code>https://iptv-org.github.io/iptv/subdivisions/ca-pe.m3u</code>
- Charlottetown <code>https://iptv-org.github.io/iptv/cities/cacha.m3u</code>
- Quebec <code>https://iptv-org.github.io/iptv/subdivisions/ca-qc.m3u</code>
- Montréal <code>https://iptv-org.github.io/iptv/cities/camtr.m3u</code>
- Québec <code>https://iptv-org.github.io/iptv/cities/caque.m3u</code>
- Rimouski <code>https://iptv-org.github.io/iptv/cities/carim.m3u</code>
- Saguenay <code>https://iptv-org.github.io/iptv/cities/casag.m3u</code>
- Sherbrooke <code>https://iptv-org.github.io/iptv/cities/casbr.m3u</code>
- Trois-Rivières <code>https://iptv-org.github.io/iptv/cities/catrr.m3u</code>
- Saskatchewan <code>https://iptv-org.github.io/iptv/subdivisions/ca-sk.m3u</code>
- Regina <code>https://iptv-org.github.io/iptv/cities/careg.m3u</code>
- 🇨🇻 Cape Verde <code>https://iptv-org.github.io/iptv/countries/cv.m3u</code>
- 🇹🇩 Chad <code>https://iptv-org.github.io/iptv/countries/td.m3u</code>
- 🇨🇱 Chile <code>https://iptv-org.github.io/iptv/countries/cl.m3u</code>
- La Araucania <code>https://iptv-org.github.io/iptv/subdivisions/cl-ar.m3u</code>
- Libertador General Bernardo O'Higgins <code>https://iptv-org.github.io/iptv/subdivisions/cl-li.m3u</code>
- Pichilemu <code>https://iptv-org.github.io/iptv/cities/clplm.m3u</code>
- 🇨🇳 China <code>https://iptv-org.github.io/iptv/countries/cn.m3u</code>
- 🇨🇴 Colombia <code>https://iptv-org.github.io/iptv/countries/co.m3u</code>
- Antioquia <code>https://iptv-org.github.io/iptv/subdivisions/co-ant.m3u</code>
- Atlantico <code>https://iptv-org.github.io/iptv/subdivisions/co-atl.m3u</code>
- Barranquilla <code>https://iptv-org.github.io/iptv/cities/cobaq.m3u</code>
- Caldas <code>https://iptv-org.github.io/iptv/subdivisions/co-cal.m3u</code>
- Manizales <code>https://iptv-org.github.io/iptv/cities/comzl.m3u</code>
- Cauca <code>https://iptv-org.github.io/iptv/subdivisions/co-cau.m3u</code>
- Choco <code>https://iptv-org.github.io/iptv/subdivisions/co-cho.m3u</code>
- Huila <code>https://iptv-org.github.io/iptv/subdivisions/co-hui.m3u</code>
- Neiva <code>https://iptv-org.github.io/iptv/cities/conva.m3u</code>
- Narino <code>https://iptv-org.github.io/iptv/subdivisions/co-nar.m3u</code>
- Norte de Santander <code>https://iptv-org.github.io/iptv/subdivisions/co-nsa.m3u</code>
- Cúcuta <code>https://iptv-org.github.io/iptv/cities/cocuc.m3u</code>
- San Andres <code>https://iptv-org.github.io/iptv/subdivisions/co-sap.m3u</code>
- San Andrés <code>https://iptv-org.github.io/iptv/cities/cosac.m3u</code>
- Tolima <code>https://iptv-org.github.io/iptv/subdivisions/co-tol.m3u</code>
- Ibagué <code>https://iptv-org.github.io/iptv/cities/coibe.m3u</code>
- Valle del Cauca <code>https://iptv-org.github.io/iptv/subdivisions/co-vac.m3u</code>
- Cali <code>https://iptv-org.github.io/iptv/cities/coclo.m3u</code>
- Tuluá <code>https://iptv-org.github.io/iptv/cities/coulq.m3u</code>
- 🇰🇲 Comoros <code>https://iptv-org.github.io/iptv/countries/km.m3u</code>
- 🇨🇷 Costa Rica <code>https://iptv-org.github.io/iptv/countries/cr.m3u</code>
- Cartago <code>https://iptv-org.github.io/iptv/subdivisions/cr-c.m3u</code>
- San Jose <code>https://iptv-org.github.io/iptv/subdivisions/cr-sj.m3u</code>
- San Marcos de Tarrazú <code>https://iptv-org.github.io/iptv/cities/crmtz.m3u</code>
- 🇭🇷 Croatia <code>https://iptv-org.github.io/iptv/countries/hr.m3u</code>
- 🇨🇺 Cuba <code>https://iptv-org.github.io/iptv/countries/cu.m3u</code>
- 🇨🇼 Curacao <code>https://iptv-org.github.io/iptv/countries/cw.m3u</code>
- 🇨🇾 Cyprus <code>https://iptv-org.github.io/iptv/countries/cy.m3u</code>
- 🇨🇿 Czech Republic <code>https://iptv-org.github.io/iptv/countries/cz.m3u</code>
- 🇨🇩 Democratic Republic of the Congo <code>https://iptv-org.github.io/iptv/countries/cd.m3u</code>
- 🇩🇰 Denmark <code>https://iptv-org.github.io/iptv/countries/dk.m3u</code>
- 🇩🇯 Djibouti <code>https://iptv-org.github.io/iptv/countries/dj.m3u</code>
- 🇩🇴 Dominican Republic <code>https://iptv-org.github.io/iptv/countries/do.m3u</code>
- Cibao Noroeste <code>https://iptv-org.github.io/iptv/subdivisions/do-34.m3u</code>
- Cibao Norte <code>https://iptv-org.github.io/iptv/subdivisions/do-35.m3u</code>
- Cibao Sur <code>https://iptv-org.github.io/iptv/subdivisions/do-36.m3u</code>
- Distrito Nacional <code>https://iptv-org.github.io/iptv/subdivisions/do-01.m3u</code>
- El Seibo <code>https://iptv-org.github.io/iptv/subdivisions/do-08.m3u</code>
- El Valle <code>https://iptv-org.github.io/iptv/subdivisions/do-37.m3u</code>
- La Altagracia <code>https://iptv-org.github.io/iptv/subdivisions/do-11.m3u</code>
- Higuey <code>https://iptv-org.github.io/iptv/cities/dohig.m3u</code>
- La Vega <code>https://iptv-org.github.io/iptv/subdivisions/do-13.m3u</code>
- Constanza <code>https://iptv-org.github.io/iptv/cities/dolvc.m3u</code>
- Monseñor Nouel <code>https://iptv-org.github.io/iptv/subdivisions/do-28.m3u</code>
- Bonao <code>https://iptv-org.github.io/iptv/cities/dobno.m3u</code>
- Ozama <code>https://iptv-org.github.io/iptv/subdivisions/do-40.m3u</code>
- Puerto Plata <code>https://iptv-org.github.io/iptv/subdivisions/do-18.m3u</code>
- Puerto Plata <code>https://iptv-org.github.io/iptv/cities/dopop.m3u</code>
- San Juan <code>https://iptv-org.github.io/iptv/subdivisions/do-22.m3u</code>
- Santiago <code>https://iptv-org.github.io/iptv/subdivisions/do-25.m3u</code>
- Santiago de los Caballeros <code>https://iptv-org.github.io/iptv/cities/dosti.m3u</code>
- Valverde <code>https://iptv-org.github.io/iptv/subdivisions/do-27.m3u</code>
- Yuma <code>https://iptv-org.github.io/iptv/subdivisions/do-42.m3u</code>
- 🇪🇨 Ecuador <code>https://iptv-org.github.io/iptv/countries/ec.m3u</code>
- Azuay <code>https://iptv-org.github.io/iptv/subdivisions/ec-a.m3u</code>
- Cuenca <code>https://iptv-org.github.io/iptv/cities/eccue.m3u</code>
- Loja <code>https://iptv-org.github.io/iptv/subdivisions/ec-l.m3u</code>
- Loja <code>https://iptv-org.github.io/iptv/cities/ecloh.m3u</code>
- Orellana <code>https://iptv-org.github.io/iptv/subdivisions/ec-d.m3u</code>
- 🇪🇬 Egypt <code>https://iptv-org.github.io/iptv/countries/eg.m3u</code>
- 🇸🇻 El Salvador <code>https://iptv-org.github.io/iptv/countries/sv.m3u</code>
- 🇬🇶 Equatorial Guinea <code>https://iptv-org.github.io/iptv/countries/gq.m3u</code>
- 🇪🇷 Eritrea <code>https://iptv-org.github.io/iptv/countries/er.m3u</code>
- 🇪🇪 Estonia <code>https://iptv-org.github.io/iptv/countries/ee.m3u</code>
- 🇪🇹 Ethiopia <code>https://iptv-org.github.io/iptv/countries/et.m3u</code>
- 🇫🇴 Faroe Islands <code>https://iptv-org.github.io/iptv/countries/fo.m3u</code>
- 🇫🇮 Finland <code>https://iptv-org.github.io/iptv/countries/fi.m3u</code>
- Keski-Suomi <code>https://iptv-org.github.io/iptv/subdivisions/fi-08.m3u</code>
- Kyyjärvi <code>https://iptv-org.github.io/iptv/cities/fikyy.m3u</code>
- Pohjanmaa <code>https://iptv-org.github.io/iptv/subdivisions/fi-12.m3u</code>
- 🇫🇷 France <code>https://iptv-org.github.io/iptv/countries/fr.m3u</code>
- Alsace <code>https://iptv-org.github.io/iptv/subdivisions/fr-6ae.m3u</code>
- Grand-Est <code>https://iptv-org.github.io/iptv/subdivisions/fr-ges.m3u</code>
- 🇬🇫 French Guiana <code>https://iptv-org.github.io/iptv/countries/gf.m3u</code>
- 🇵🇫 French Polynesia <code>https://iptv-org.github.io/iptv/countries/pf.m3u</code>
- 🇬🇲 Gambia <code>https://iptv-org.github.io/iptv/countries/gm.m3u</code>
- 🇬🇪 Georgia <code>https://iptv-org.github.io/iptv/countries/ge.m3u</code>
- Abkhazia <code>https://iptv-org.github.io/iptv/subdivisions/ge-ab.m3u</code>
- 🇩🇪 Germany <code>https://iptv-org.github.io/iptv/countries/de.m3u</code>
- Bayern <code>https://iptv-org.github.io/iptv/subdivisions/de-by.m3u</code>
- Berlin <code>https://iptv-org.github.io/iptv/subdivisions/de-be.m3u</code>
- Brandenburg <code>https://iptv-org.github.io/iptv/subdivisions/de-bb.m3u</code>
- Hamburg <code>https://iptv-org.github.io/iptv/subdivisions/de-hh.m3u</code>
- Mecklenburg-Vorpommern <code>https://iptv-org.github.io/iptv/subdivisions/de-mv.m3u</code>
- Niedersachsen <code>https://iptv-org.github.io/iptv/subdivisions/de-ni.m3u</code>
- Munster <code>https://iptv-org.github.io/iptv/cities/demun.m3u</code>
- Nordrhein-Westfalen <code>https://iptv-org.github.io/iptv/subdivisions/de-nw.m3u</code>
- Aachen <code>https://iptv-org.github.io/iptv/cities/deaah.m3u</code>
- Bielefeld <code>https://iptv-org.github.io/iptv/cities/debfe.m3u</code>
- Bonn <code>https://iptv-org.github.io/iptv/cities/debon.m3u</code>
- Dortmund <code>https://iptv-org.github.io/iptv/cities/dedtm.m3u</code>
- Duisburg <code>https://iptv-org.github.io/iptv/cities/dedui.m3u</code>
- Düsseldorf <code>https://iptv-org.github.io/iptv/cities/dedus.m3u</code>
- Essen <code>https://iptv-org.github.io/iptv/cities/deess.m3u</code>
- Köln <code>https://iptv-org.github.io/iptv/cities/decgn.m3u</code>
- Siegen <code>https://iptv-org.github.io/iptv/cities/desge.m3u</code>
- Wuppertal <code>https://iptv-org.github.io/iptv/cities/dewup.m3u</code>
- Sachsen <code>https://iptv-org.github.io/iptv/subdivisions/de-sn.m3u</code>
- Sachsen-Anhalt <code>https://iptv-org.github.io/iptv/subdivisions/de-st.m3u</code>
- Schleswig-Holstein <code>https://iptv-org.github.io/iptv/subdivisions/de-sh.m3u</code>
- Thüringen <code>https://iptv-org.github.io/iptv/subdivisions/de-th.m3u</code>
- 🇬🇭 Ghana <code>https://iptv-org.github.io/iptv/countries/gh.m3u</code>
- 🇬🇷 Greece <code>https://iptv-org.github.io/iptv/countries/gr.m3u</code>
- Attiki <code>https://iptv-org.github.io/iptv/subdivisions/gr-i.m3u</code>
- Athens <code>https://iptv-org.github.io/iptv/cities/grath.m3u</code>
- Dytiki Ellada <code>https://iptv-org.github.io/iptv/subdivisions/gr-g.m3u</code>
- Dytiki Makedonia <code>https://iptv-org.github.io/iptv/subdivisions/gr-c.m3u</code>
- Kozáni <code>https://iptv-org.github.io/iptv/cities/grkzi.m3u</code>
- Ionia Nisia <code>https://iptv-org.github.io/iptv/subdivisions/gr-f.m3u</code>
- Ipeiros <code>https://iptv-org.github.io/iptv/subdivisions/gr-d.m3u</code>
- Árta <code>https://iptv-org.github.io/iptv/cities/grart.m3u</code>
- Ioánnina <code>https://iptv-org.github.io/iptv/cities/grioa.m3u</code>
- Kentriki Makedonia <code>https://iptv-org.github.io/iptv/subdivisions/gr-b.m3u</code>
- Giannitsá <code>https://iptv-org.github.io/iptv/cities/grgak.m3u</code>
- Thessaloníki <code>https://iptv-org.github.io/iptv/cities/grskg.m3u</code>
- Notio Aigaio <code>https://iptv-org.github.io/iptv/subdivisions/gr-l.m3u</code>
- Sterea Ellada <code>https://iptv-org.github.io/iptv/subdivisions/gr-h.m3u</code>
- Lamía <code>https://iptv-org.github.io/iptv/cities/grlam.m3u</code>
- Thessalia <code>https://iptv-org.github.io/iptv/subdivisions/gr-e.m3u</code>
- Lárisa <code>https://iptv-org.github.io/iptv/cities/grlra.m3u</code>
- 🇬🇵 Guadeloupe <code>https://iptv-org.github.io/iptv/countries/gp.m3u</code>
- 🇬🇺 Guam <code>https://iptv-org.github.io/iptv/countries/gu.m3u</code>
- 🇬🇹 Guatemala <code>https://iptv-org.github.io/iptv/countries/gt.m3u</code>
- Escuintla <code>https://iptv-org.github.io/iptv/subdivisions/gt-05.m3u</code>
- Quiche <code>https://iptv-org.github.io/iptv/subdivisions/gt-14.m3u</code>
- San Marcos <code>https://iptv-org.github.io/iptv/subdivisions/gt-12.m3u</code>
- Santa Rosa <code>https://iptv-org.github.io/iptv/subdivisions/gt-06.m3u</code>
- Barberena <code>https://iptv-org.github.io/iptv/cities/gtbab.m3u</code>
- Solola <code>https://iptv-org.github.io/iptv/subdivisions/gt-07.m3u</code>
- Sololá <code>https://iptv-org.github.io/iptv/cities/gtsol.m3u</code>
- 🇬🇬 Guernsey <code>https://iptv-org.github.io/iptv/countries/gg.m3u</code>
- 🇬🇳 Guinea <code>https://iptv-org.github.io/iptv/countries/gn.m3u</code>
- 🇬🇾 Guyana <code>https://iptv-org.github.io/iptv/countries/gy.m3u</code>
- 🇭🇹 Haiti <code>https://iptv-org.github.io/iptv/countries/ht.m3u</code>
- 🇭🇳 Honduras <code>https://iptv-org.github.io/iptv/countries/hn.m3u</code>
- 🇭🇰 Hong Kong <code>https://iptv-org.github.io/iptv/countries/hk.m3u</code>
- 🇭🇺 Hungary <code>https://iptv-org.github.io/iptv/countries/hu.m3u</code>
- 🇮🇸 Iceland <code>https://iptv-org.github.io/iptv/countries/is.m3u</code>
- 🇮🇳 India <code>https://iptv-org.github.io/iptv/countries/in.m3u</code>
- Delhi <code>https://iptv-org.github.io/iptv/subdivisions/in-dl.m3u</code>
- Delhi <code>https://iptv-org.github.io/iptv/cities/indel.m3u</code>
- Kerala <code>https://iptv-org.github.io/iptv/subdivisions/in-kl.m3u</code>
- Kannur <code>https://iptv-org.github.io/iptv/cities/inknn.m3u</code>
- Kozhikode <code>https://iptv-org.github.io/iptv/cities/inccj.m3u</code>
- Maharashtra <code>https://iptv-org.github.io/iptv/subdivisions/in-mh.m3u</code>
- Tamil Nadu <code>https://iptv-org.github.io/iptv/subdivisions/in-tn.m3u</code>
- Coimbatore <code>https://iptv-org.github.io/iptv/cities/incjb.m3u</code>
- Dharmapuri <code>https://iptv-org.github.io/iptv/cities/indpi.m3u</code>
- Tenkasi <code>https://iptv-org.github.io/iptv/cities/intks.m3u</code>
- Thanjavur <code>https://iptv-org.github.io/iptv/cities/intjv.m3u</code>
- Tiruchirappalli <code>https://iptv-org.github.io/iptv/cities/intri.m3u</code>
- 🇮🇩 Indonesia <code>https://iptv-org.github.io/iptv/countries/id.m3u</code>
- Aceh <code>https://iptv-org.github.io/iptv/subdivisions/id-ac.m3u</code>
- Bali <code>https://iptv-org.github.io/iptv/subdivisions/id-ba.m3u</code>
- Bengkulu <code>https://iptv-org.github.io/iptv/subdivisions/id-be.m3u</code>
- Bengkulu <code>https://iptv-org.github.io/iptv/subdivisions/id-bt.m3u</code>
- Serang <code>https://iptv-org.github.io/iptv/cities/idser.m3u</code>
- Gorontalo <code>https://iptv-org.github.io/iptv/subdivisions/id-go.m3u</code>
- Jakarta Raya <code>https://iptv-org.github.io/iptv/subdivisions/id-jk.m3u</code>
- Jakarta <code>https://iptv-org.github.io/iptv/cities/idjkt.m3u</code>
- Jambi <code>https://iptv-org.github.io/iptv/subdivisions/id-ja.m3u</code>
- Jawa <code>https://iptv-org.github.io/iptv/subdivisions/id-jw.m3u</code>
- Jawa Barat <code>https://iptv-org.github.io/iptv/subdivisions/id-jb.m3u</code>
- Sumedang <code>https://iptv-org.github.io/iptv/cities/id5su.m3u</code>
- Tasikmalaya <code>https://iptv-org.github.io/iptv/cities/idtsy.m3u</code>
- Jawa Tengah <code>https://iptv-org.github.io/iptv/subdivisions/id-jt.m3u</code>
- Purwokerto <code>https://iptv-org.github.io/iptv/cities/idpwl.m3u</code>
- Semarang <code>https://iptv-org.github.io/iptv/cities/idsrg.m3u</code>
- Surakarta <code>https://iptv-org.github.io/iptv/cities/idskt.m3u</code>
- Jawa Timur <code>https://iptv-org.github.io/iptv/subdivisions/id-ji.m3u</code>
- Kediri <code>https://iptv-org.github.io/iptv/cities/idkdr.m3u</code>
- Madiun <code>https://iptv-org.github.io/iptv/cities/idmdi.m3u</code>
- Malang <code>https://iptv-org.github.io/iptv/cities/idmlg.m3u</code>
- Surabaya <code>https://iptv-org.github.io/iptv/cities/idsub.m3u</code>
- Tulungagung <code>https://iptv-org.github.io/iptv/cities/idtlu.m3u</code>
- Kalimantan <code>https://iptv-org.github.io/iptv/subdivisions/id-ka.m3u</code>
- Kalimantan Barat <code>https://iptv-org.github.io/iptv/subdivisions/id-kb.m3u</code>
- Kalimantan Selatan <code>https://iptv-org.github.io/iptv/subdivisions/id-ks.m3u</code>
- Banjarmasin <code>https://iptv-org.github.io/iptv/cities/idbdj.m3u</code>
- Kalimantan Tengah <code>https://iptv-org.github.io/iptv/subdivisions/id-kt.m3u</code>
- Kalimantan Timur <code>https://iptv-org.github.io/iptv/subdivisions/id-ki.m3u</code>
- Balikpapan <code>https://iptv-org.github.io/iptv/cities/idbpn.m3u</code>
- Kepulauan Bangka Belitung <code>https://iptv-org.github.io/iptv/subdivisions/id-bb.m3u</code>
- Lampung <code>https://iptv-org.github.io/iptv/subdivisions/id-la.m3u</code>
- Bandar Lampung <code>https://iptv-org.github.io/iptv/cities/idtkg.m3u</code>
- Maluku <code>https://iptv-org.github.io/iptv/subdivisions/id-ml.m3u</code>
- Maluku Utara <code>https://iptv-org.github.io/iptv/subdivisions/id-mu.m3u</code>
- Nusa Tenggara <code>https://iptv-org.github.io/iptv/subdivisions/id-nu.m3u</code>
- Nusa Tenggara Barat <code>https://iptv-org.github.io/iptv/subdivisions/id-nb.m3u</code>
- Nusa Tenggara Timur <code>https://iptv-org.github.io/iptv/subdivisions/id-nt.m3u</code>
- Atambua <code>https://iptv-org.github.io/iptv/cities/idabu.m3u</code>
- Papua <code>https://iptv-org.github.io/iptv/subdivisions/id-pp.m3u</code>
- Papua Barat <code>https://iptv-org.github.io/iptv/subdivisions/id-pb.m3u</code>
- Riau <code>https://iptv-org.github.io/iptv/subdivisions/id-ri.m3u</code>
- Sulawesi <code>https://iptv-org.github.io/iptv/subdivisions/id-sl.m3u</code>
- Sulawesi Barat <code>https://iptv-org.github.io/iptv/subdivisions/id-sr.m3u</code>
- Sulawesi Selatan <code>https://iptv-org.github.io/iptv/subdivisions/id-sn.m3u</code>
- Makassar <code>https://iptv-org.github.io/iptv/cities/idmak.m3u</code>
- Sulawesi Tengah <code>https://iptv-org.github.io/iptv/subdivisions/id-st.m3u</code>
- Sulawesi Tenggara <code>https://iptv-org.github.io/iptv/subdivisions/id-sg.m3u</code>
- Sulawesi Utara <code>https://iptv-org.github.io/iptv/subdivisions/id-sa.m3u</code>
- Manado <code>https://iptv-org.github.io/iptv/cities/idmdc.m3u</code>
- Sumatera <code>https://iptv-org.github.io/iptv/subdivisions/id-sm.m3u</code>
- Sumatera Barat <code>https://iptv-org.github.io/iptv/subdivisions/id-sb.m3u</code>
- Padang <code>https://iptv-org.github.io/iptv/cities/idpdg.m3u</code>
- Sumatera Selatan <code>https://iptv-org.github.io/iptv/subdivisions/id-ss.m3u</code>
- Sumatera Utara <code>https://iptv-org.github.io/iptv/subdivisions/id-su.m3u</code>
- Yogyakarta <code>https://iptv-org.github.io/iptv/subdivisions/id-yo.m3u</code>
- Yogyakarta <code>https://iptv-org.github.io/iptv/cities/idjog.m3u</code>
- 🇮🇷 Iran <code>https://iptv-org.github.io/iptv/countries/ir.m3u</code>
- 🇮🇶 Iraq <code>https://iptv-org.github.io/iptv/countries/iq.m3u</code>
- 🇮🇪 Ireland <code>https://iptv-org.github.io/iptv/countries/ie.m3u</code>
- 🇮🇱 Israel <code>https://iptv-org.github.io/iptv/countries/il.m3u</code>
- 🇮🇹 Italy <code>https://iptv-org.github.io/iptv/countries/it.m3u</code>
- Calabria <code>https://iptv-org.github.io/iptv/subdivisions/it-78.m3u</code>
- Trentino-Alto Adige <code>https://iptv-org.github.io/iptv/subdivisions/it-32.m3u</code>
- 🇨🇮 Ivory Coast <code>https://iptv-org.github.io/iptv/countries/ci.m3u</code>
- 🇯🇲 Jamaica <code>https://iptv-org.github.io/iptv/countries/jm.m3u</code>
- 🇯🇵 Japan <code>https://iptv-org.github.io/iptv/countries/jp.m3u</code>
- Chiba <code>https://iptv-org.github.io/iptv/subdivisions/jp-12.m3u</code>
- Gunma <code>https://iptv-org.github.io/iptv/subdivisions/jp-10.m3u</code>
- Ibaraki <code>https://iptv-org.github.io/iptv/subdivisions/jp-08.m3u</code>
- Kanagawa <code>https://iptv-org.github.io/iptv/subdivisions/jp-14.m3u</code>
- Osaka <code>https://iptv-org.github.io/iptv/subdivisions/jp-27.m3u</code>
- Osaka <code>https://iptv-org.github.io/iptv/cities/jposa.m3u</code>
- Saitama <code>https://iptv-org.github.io/iptv/subdivisions/jp-11.m3u</code>
- Tochigi <code>https://iptv-org.github.io/iptv/subdivisions/jp-09.m3u</code>
- 🇯🇴 Jordan <code>https://iptv-org.github.io/iptv/countries/jo.m3u</code>
- 🇰🇿 Kazakhstan <code>https://iptv-org.github.io/iptv/countries/kz.m3u</code>
- 🇰🇪 Kenya <code>https://iptv-org.github.io/iptv/countries/ke.m3u</code>
- 🇽🇰 Kosovo <code>https://iptv-org.github.io/iptv/countries/xk.m3u</code>
- 🇰🇼 Kuwait <code>https://iptv-org.github.io/iptv/countries/kw.m3u</code>
- 🇰🇬 Kyrgyzstan <code>https://iptv-org.github.io/iptv/countries/kg.m3u</code>
- 🇱🇦 Laos <code>https://iptv-org.github.io/iptv/countries/la.m3u</code>
- 🇱🇻 Latvia <code>https://iptv-org.github.io/iptv/countries/lv.m3u</code>
- 🇱🇧 Lebanon <code>https://iptv-org.github.io/iptv/countries/lb.m3u</code>
- 🇱🇾 Libya <code>https://iptv-org.github.io/iptv/countries/ly.m3u</code>
- 🇱🇮 Liechtenstein <code>https://iptv-org.github.io/iptv/countries/li.m3u</code>
- 🇱🇹 Lithuania <code>https://iptv-org.github.io/iptv/countries/lt.m3u</code>
- 🇱🇺 Luxembourg <code>https://iptv-org.github.io/iptv/countries/lu.m3u</code>
- 🇲🇴 Macao <code>https://iptv-org.github.io/iptv/countries/mo.m3u</code>
- 🇲🇬 Madagascar <code>https://iptv-org.github.io/iptv/countries/mg.m3u</code>
- 🇲🇾 Malaysia <code>https://iptv-org.github.io/iptv/countries/my.m3u</code>
- 🇲🇻 Maldives <code>https://iptv-org.github.io/iptv/countries/mv.m3u</code>
- 🇲🇱 Mali <code>https://iptv-org.github.io/iptv/countries/ml.m3u</code>
- 🇲🇹 Malta <code>https://iptv-org.github.io/iptv/countries/mt.m3u</code>
- 🇲🇶 Martinique <code>https://iptv-org.github.io/iptv/countries/mq.m3u</code>
- 🇲🇷 Mauritania <code>https://iptv-org.github.io/iptv/countries/mr.m3u</code>
- 🇲🇺 Mauritius <code>https://iptv-org.github.io/iptv/countries/mu.m3u</code>
- 🇲🇽 Mexico <code>https://iptv-org.github.io/iptv/countries/mx.m3u</code>
- Baja California <code>https://iptv-org.github.io/iptv/subdivisions/mx-bcn.m3u</code>
- Tijuana <code>https://iptv-org.github.io/iptv/cities/mxtij.m3u</code>
- Chihuahua <code>https://iptv-org.github.io/iptv/subdivisions/mx-chh.m3u</code>
- Ciudad Juárez <code>https://iptv-org.github.io/iptv/cities/mxcjs.m3u</code>
- Coahuila de Zaragoza <code>https://iptv-org.github.io/iptv/subdivisions/mx-coa.m3u</code>
- Sabinas <code>https://iptv-org.github.io/iptv/cities/mxsbn.m3u</code>
- Durango <code>https://iptv-org.github.io/iptv/subdivisions/mx-dur.m3u</code>
- Morelos <code>https://iptv-org.github.io/iptv/subdivisions/mx-mor.m3u</code>
- Cuernavaca <code>https://iptv-org.github.io/iptv/cities/mxcvc.m3u</code>
- Nuevo Leon <code>https://iptv-org.github.io/iptv/subdivisions/mx-nle.m3u</code>
- Puebla <code>https://iptv-org.github.io/iptv/subdivisions/mx-pue.m3u</code>
- Queretaro <code>https://iptv-org.github.io/iptv/subdivisions/mx-que.m3u</code>
- Santiago de Querétaro <code>https://iptv-org.github.io/iptv/cities/mxsqe.m3u</code>
- Quintana Roo <code>https://iptv-org.github.io/iptv/subdivisions/mx-roo.m3u</code>
- Cancún <code>https://iptv-org.github.io/iptv/cities/mxcun.m3u</code>
- San Luis Potosi <code>https://iptv-org.github.io/iptv/subdivisions/mx-slp.m3u</code>
- Yucatan <code>https://iptv-org.github.io/iptv/subdivisions/mx-yuc.m3u</code>
- Mérida <code>https://iptv-org.github.io/iptv/cities/mxmid.m3u</code>
- 🇲🇩 Moldova <code>https://iptv-org.github.io/iptv/countries/md.m3u</code>
- 🇲🇨 Monaco <code>https://iptv-org.github.io/iptv/countries/mc.m3u</code>
- 🇲🇳 Mongolia <code>https://iptv-org.github.io/iptv/countries/mn.m3u</code>
- 🇲🇪 Montenegro <code>https://iptv-org.github.io/iptv/countries/me.m3u</code>
- 🇲🇦 Morocco <code>https://iptv-org.github.io/iptv/countries/ma.m3u</code>
- 🇲🇿 Mozambique <code>https://iptv-org.github.io/iptv/countries/mz.m3u</code>
- 🇲🇲 Myanmar <code>https://iptv-org.github.io/iptv/countries/mm.m3u</code>
- 🇳🇦 Namibia <code>https://iptv-org.github.io/iptv/countries/na.m3u</code>
- 🇳🇵 Nepal <code>https://iptv-org.github.io/iptv/countries/np.m3u</code>
- 🇳🇱 Netherlands <code>https://iptv-org.github.io/iptv/countries/nl.m3u</code>
- 🇳🇿 New Zealand <code>https://iptv-org.github.io/iptv/countries/nz.m3u</code>
- 🇳🇮 Nicaragua <code>https://iptv-org.github.io/iptv/countries/ni.m3u</code>
- 🇳🇪 Niger <code>https://iptv-org.github.io/iptv/countries/ne.m3u</code>
- 🇳🇬 Nigeria <code>https://iptv-org.github.io/iptv/countries/ng.m3u</code>
- 🇰🇵 North Korea <code>https://iptv-org.github.io/iptv/countries/kp.m3u</code>
- 🇲🇰 North Macedonia <code>https://iptv-org.github.io/iptv/countries/mk.m3u</code>
- 🇳🇴 Norway <code>https://iptv-org.github.io/iptv/countries/no.m3u</code>
- 🇴🇲 Oman <code>https://iptv-org.github.io/iptv/countries/om.m3u</code>
- 🇵🇰 Pakistan <code>https://iptv-org.github.io/iptv/countries/pk.m3u</code>
- Islamabad <code>https://iptv-org.github.io/iptv/subdivisions/pk-is.m3u</code>
- Islamabad <code>https://iptv-org.github.io/iptv/cities/pkisb.m3u</code>
- 🇵🇸 Palestine <code>https://iptv-org.github.io/iptv/countries/ps.m3u</code>
- 🇵🇦 Panama <code>https://iptv-org.github.io/iptv/countries/pa.m3u</code>
- 🇵🇬 Papua New Guinea <code>https://iptv-org.github.io/iptv/countries/pg.m3u</code>
- 🇵🇾 Paraguay <code>https://iptv-org.github.io/iptv/countries/py.m3u</code>
- Itapua <code>https://iptv-org.github.io/iptv/subdivisions/py-7.m3u</code>
- Encarnacion <code>https://iptv-org.github.io/iptv/cities/pyeno.m3u</code>
- 🇵🇪 Peru <code>https://iptv-org.github.io/iptv/countries/pe.m3u</code>
- Arequipa <code>https://iptv-org.github.io/iptv/subdivisions/pe-are.m3u</code>
- Arequipa <code>https://iptv-org.github.io/iptv/cities/peaqp.m3u</code>
- Junin <code>https://iptv-org.github.io/iptv/subdivisions/pe-jun.m3u</code>
- Huancayo <code>https://iptv-org.github.io/iptv/cities/pejhy.m3u</code>
- Satipo <code>https://iptv-org.github.io/iptv/cities/pesip.m3u</code>
- Lima <code>https://iptv-org.github.io/iptv/subdivisions/pe-lim.m3u</code>
- Lima <code>https://iptv-org.github.io/iptv/cities/pelim.m3u</code>
- Moquegua <code>https://iptv-org.github.io/iptv/subdivisions/pe-moq.m3u</code>
- Moquegua <code>https://iptv-org.github.io/iptv/cities/pemoq.m3u</code>
- San Martin <code>https://iptv-org.github.io/iptv/subdivisions/pe-sam.m3u</code>
- 🇵🇭 Philippines <code>https://iptv-org.github.io/iptv/countries/ph.m3u</code>
- 🇵🇱 Poland <code>https://iptv-org.github.io/iptv/countries/pl.m3u</code>
- 🇵🇹 Portugal <code>https://iptv-org.github.io/iptv/countries/pt.m3u</code>
- 🇵🇷 Puerto Rico <code>https://iptv-org.github.io/iptv/countries/pr.m3u</code>
- 🇶🇦 Qatar <code>https://iptv-org.github.io/iptv/countries/qa.m3u</code>
- 🇨🇬 Republic of the Congo <code>https://iptv-org.github.io/iptv/countries/cg.m3u</code>
- Brazzaville <code>https://iptv-org.github.io/iptv/subdivisions/cg-bzv.m3u</code>
- Brazzaville <code>https://iptv-org.github.io/iptv/cities/cgbzv.m3u</code>
- 🇷🇪 Reunion <code>https://iptv-org.github.io/iptv/countries/re.m3u</code>
- 🇷🇴 Romania <code>https://iptv-org.github.io/iptv/countries/ro.m3u</code>
- Gorj <code>https://iptv-org.github.io/iptv/subdivisions/ro-gj.m3u</code>
- Târgu Jiu <code>https://iptv-org.github.io/iptv/cities/rotgu.m3u</code>
- 🇷🇺 Russia <code>https://iptv-org.github.io/iptv/countries/ru.m3u</code>
- Adygeya, Respublika <code>https://iptv-org.github.io/iptv/subdivisions/ru-ad.m3u</code>
- Altay, Respublika <code>https://iptv-org.github.io/iptv/subdivisions/ru-al.m3u</code>
- Altayskiy kray <code>https://iptv-org.github.io/iptv/subdivisions/ru-alt.m3u</code>
- Arkhangel'skaya oblast' <code>https://iptv-org.github.io/iptv/subdivisions/ru-ark.m3u</code>
- Astrakhanskaya oblast' <code>https://iptv-org.github.io/iptv/subdivisions/ru-ast.m3u</code>
- Bashkortostan, Respublika <code>https://iptv-org.github.io/iptv/subdivisions/ru-ba.m3u</code>
- Belgorodskaya oblast' <code>https://iptv-org.github.io/iptv/subdivisions/ru-bel.m3u</code>
- Chechenskaya Respublika <code>https://iptv-org.github.io/iptv/subdivisions/ru-ce.m3u</code>
- Chelyabinskaya oblast' <code>https://iptv-org.github.io/iptv/subdivisions/ru-che.m3u</code>
- Dagestan, Respublika <code>https://iptv-org.github.io/iptv/subdivisions/ru-da.m3u</code>
- Ingushetiya, Respublika <code>https://iptv-org.github.io/iptv/subdivisions/ru-in.m3u</code>
- Irkutskaya oblast' <code>https://iptv-org.github.io/iptv/subdivisions/ru-irk.m3u</code>
- Kabardino-Balkarskaya Respublika <code>https://iptv-org.github.io/iptv/subdivisions/ru-kb.m3u</code>
- Kaliningradskaya oblast' <code>https://iptv-org.github.io/iptv/subdivisions/ru-kgd.m3u</code>
- Kaluzhskaya oblast' <code>https://iptv-org.github.io/iptv/subdivisions/ru-klu.m3u</code>
- Karachayevo-Cherkesskaya Respublika <code>https://iptv-org.github.io/iptv/subdivisions/ru-kc.m3u</code>
- Kemerovskaya oblast' <code>https://iptv-org.github.io/iptv/subdivisions/ru-kem.m3u</code>
- Khabarovskiy kray <code>https://iptv-org.github.io/iptv/subdivisions/ru-kha.m3u</code>
- Khakasiya, Respublika <code>https://iptv-org.github.io/iptv/subdivisions/ru-kk.m3u</code>
- Khanty-Mansiyskiy avtonomnyy okrug <code>https://iptv-org.github.io/iptv/subdivisions/ru-khm.m3u</code>
- Krasnodarskiy kray <code>https://iptv-org.github.io/iptv/subdivisions/ru-kda.m3u</code>
- Krasnodar <code>https://iptv-org.github.io/iptv/cities/rukrr.m3u</code>
- Krasnoyarskiy kray <code>https://iptv-org.github.io/iptv/subdivisions/ru-kya.m3u</code>
- Kurganskaya oblast' <code>https://iptv-org.github.io/iptv/subdivisions/ru-kgn.m3u</code>
- Leningradskaya oblast' <code>https://iptv-org.github.io/iptv/subdivisions/ru-len.m3u</code>
- Mordoviya, Respublika <code>https://iptv-org.github.io/iptv/subdivisions/ru-mo.m3u</code>
- Moskovskaya oblast' <code>https://iptv-org.github.io/iptv/subdivisions/ru-mos.m3u</code>
- Moskva <code>https://iptv-org.github.io/iptv/subdivisions/ru-mow.m3u</code>
- Nenetskiy avtonomnyy okrug <code>https://iptv-org.github.io/iptv/subdivisions/ru-nen.m3u</code>
- Nizhegorodskaya oblast' <code>https://iptv-org.github.io/iptv/subdivisions/ru-niz.m3u</code>
- Novgorodskaya oblast' <code>https://iptv-org.github.io/iptv/subdivisions/ru-ngr.m3u</code>
- Novosibirskaya oblast' <code>https://iptv-org.github.io/iptv/subdivisions/ru-nvs.m3u</code>
- Omskaya oblast' <code>https://iptv-org.github.io/iptv/subdivisions/ru-oms.m3u</code>
- Orenburgskaya oblast' <code>https://iptv-org.github.io/iptv/subdivisions/ru-ore.m3u</code>
- Permskiy kray <code>https://iptv-org.github.io/iptv/subdivisions/ru-per.m3u</code>
- Primorskiy kray <code>https://iptv-org.github.io/iptv/subdivisions/ru-pri.m3u</code>
- Vladivostok <code>https://iptv-org.github.io/iptv/cities/ruvms.m3u</code>
- Rostovskaya oblast' <code>https://iptv-org.github.io/iptv/subdivisions/ru-ros.m3u</code>
- Ryazanskaya oblast' <code>https://iptv-org.github.io/iptv/subdivisions/ru-rya.m3u</code>
- Saha, Respublika <code>https://iptv-org.github.io/iptv/subdivisions/ru-sa.m3u</code>
- Samarskaya oblast' <code>https://iptv-org.github.io/iptv/subdivisions/ru-sam.m3u</code>
- Sankt-Peterburg <code>https://iptv-org.github.io/iptv/subdivisions/ru-spe.m3u</code>
- Severnaya Osetiya, Respublika <code>https://iptv-org.github.io/iptv/subdivisions/ru-se.m3u</code>
- Stavropol'skiy kray <code>https://iptv-org.github.io/iptv/subdivisions/ru-sta.m3u</code>
- Sverdlovskaya oblast' <code>https://iptv-org.github.io/iptv/subdivisions/ru-sve.m3u</code>
- Tambovskaya oblast' <code>https://iptv-org.github.io/iptv/subdivisions/ru-tam.m3u</code>
- Tatarstan, Respublika <code>https://iptv-org.github.io/iptv/subdivisions/ru-ta.m3u</code>
- Tomskaya oblast' <code>https://iptv-org.github.io/iptv/subdivisions/ru-tom.m3u</code>
- Tyumenskaya oblast' <code>https://iptv-org.github.io/iptv/subdivisions/ru-tyu.m3u</code>
- Tyva, Respublika <code>https://iptv-org.github.io/iptv/subdivisions/ru-ty.m3u</code>
- Volgogradskaya oblast' <code>https://iptv-org.github.io/iptv/subdivisions/ru-vgg.m3u</code>
- Yamalo-Nenetskiy avtonomnyy okrug <code>https://iptv-org.github.io/iptv/subdivisions/ru-yan.m3u</code>
- Yaroslavskaya oblast' <code>https://iptv-org.github.io/iptv/subdivisions/ru-yar.m3u</code>
- Yevreyskaya avtonomnaya oblast' <code>https://iptv-org.github.io/iptv/subdivisions/ru-yev.m3u</code>
- 🇷🇼 Rwanda <code>https://iptv-org.github.io/iptv/countries/rw.m3u</code>
- 🇰🇳 Saint Kitts and Nevis <code>https://iptv-org.github.io/iptv/countries/kn.m3u</code>
- 🇱🇨 Saint Lucia <code>https://iptv-org.github.io/iptv/countries/lc.m3u</code>
- 🇼🇸 Samoa <code>https://iptv-org.github.io/iptv/countries/ws.m3u</code>
- 🇸🇲 San Marino <code>https://iptv-org.github.io/iptv/countries/sm.m3u</code>
- 🇸🇦 Saudi Arabia <code>https://iptv-org.github.io/iptv/countries/sa.m3u</code>
- 🇸🇳 Senegal <code>https://iptv-org.github.io/iptv/countries/sn.m3u</code>
- 🇷🇸 Serbia <code>https://iptv-org.github.io/iptv/countries/rs.m3u</code>
- 🇸🇬 Singapore <code>https://iptv-org.github.io/iptv/countries/sg.m3u</code>
- 🇸🇽 Sint Maarten <code>https://iptv-org.github.io/iptv/countries/sx.m3u</code>
- 🇸🇰 Slovakia <code>https://iptv-org.github.io/iptv/countries/sk.m3u</code>
- 🇸🇮 Slovenia <code>https://iptv-org.github.io/iptv/countries/si.m3u</code>
- 🇸🇴 Somalia <code>https://iptv-org.github.io/iptv/countries/so.m3u</code>
- 🇿🇦 South Africa <code>https://iptv-org.github.io/iptv/countries/za.m3u</code>
- 🇰🇷 South Korea <code>https://iptv-org.github.io/iptv/countries/kr.m3u</code>
- Busan-gwangyeoksi <code>https://iptv-org.github.io/iptv/subdivisions/kr-26.m3u</code>
- Busan <code>https://iptv-org.github.io/iptv/cities/krpus.m3u</code>
- Chungcheongbuk-do <code>https://iptv-org.github.io/iptv/subdivisions/kr-43.m3u</code>
- Cheongju <code>https://iptv-org.github.io/iptv/cities/krcoj.m3u</code>
- Daegu-gwangyeoksi <code>https://iptv-org.github.io/iptv/subdivisions/kr-27.m3u</code>
- Daegu <code>https://iptv-org.github.io/iptv/cities/krtae.m3u</code>
- Daejeon-gwangyeoksi <code>https://iptv-org.github.io/iptv/subdivisions/kr-30.m3u</code>
- Daejeon <code>https://iptv-org.github.io/iptv/cities/krtjn.m3u</code>
- Gangwon-do <code>https://iptv-org.github.io/iptv/subdivisions/kr-42.m3u</code>
- Chuncheon <code>https://iptv-org.github.io/iptv/cities/krchc.m3u</code>
- Gyeonggi-do <code>https://iptv-org.github.io/iptv/subdivisions/kr-41.m3u</code>
- Bucheon <code>https://iptv-org.github.io/iptv/cities/krbcn.m3u</code>
- Gyeongsangbuk-do <code>https://iptv-org.github.io/iptv/subdivisions/kr-47.m3u</code>
- Andong <code>https://iptv-org.github.io/iptv/cities/kradg.m3u</code>
- Gyeongsangnam-do <code>https://iptv-org.github.io/iptv/subdivisions/kr-48.m3u</code>
- Jeju-teukbyeoljachido <code>https://iptv-org.github.io/iptv/subdivisions/kr-49.m3u</code>
- Jeju <code>https://iptv-org.github.io/iptv/cities/krcha.m3u</code>
- Jeollabuk-do <code>https://iptv-org.github.io/iptv/subdivisions/kr-45.m3u</code>
- Jeonju <code>https://iptv-org.github.io/iptv/cities/krjnj.m3u</code>
- Jeollanam-do <code>https://iptv-org.github.io/iptv/subdivisions/kr-46.m3u</code>
- Mokpo <code>https://iptv-org.github.io/iptv/cities/krmok.m3u</code>
- Yeosu <code>https://iptv-org.github.io/iptv/cities/kryos.m3u</code>
- Seoul-teukbyeolsi <code>https://iptv-org.github.io/iptv/subdivisions/kr-11.m3u</code>
- Ulsan-gwangyeoksi <code>https://iptv-org.github.io/iptv/subdivisions/kr-31.m3u</code>
- Ulsan <code>https://iptv-org.github.io/iptv/cities/krusn.m3u</code>
- 🇪🇸 Spain <code>https://iptv-org.github.io/iptv/countries/es.m3u</code>
- Andalucía <code>https://iptv-org.github.io/iptv/subdivisions/es-an.m3u</code>
- Aragón <code>https://iptv-org.github.io/iptv/subdivisions/es-ar.m3u</code>
- Barcelona <code>https://iptv-org.github.io/iptv/subdivisions/es-b.m3u</code>
- Cabrils <code>https://iptv-org.github.io/iptv/cities/escbi.m3u</code>
- Cardedeu <code>https://iptv-org.github.io/iptv/cities/escdd.m3u</code>
- Mataró <code>https://iptv-org.github.io/iptv/cities/esmto.m3u</code>
- Sabadell <code>https://iptv-org.github.io/iptv/cities/essbp.m3u</code>
- Vic <code>https://iptv-org.github.io/iptv/cities/esvic.m3u</code>
- Bizkaia <code>https://iptv-org.github.io/iptv/subdivisions/es-bi.m3u</code>
- Bilbao <code>https://iptv-org.github.io/iptv/cities/esbio.m3u</code>
- Cádiz <code>https://iptv-org.github.io/iptv/subdivisions/es-ca.m3u</code>
- Algeciras <code>https://iptv-org.github.io/iptv/cities/esalg.m3u</code>
- Canarias <code>https://iptv-org.github.io/iptv/subdivisions/es-cn.m3u</code>
- Castilla-La Mancha <code>https://iptv-org.github.io/iptv/subdivisions/es-cm.m3u</code>
- Catalunya <code>https://iptv-org.github.io/iptv/subdivisions/es-ct.m3u</code>
- Córdoba <code>https://iptv-org.github.io/iptv/subdivisions/es-co.m3u</code>
- Córdoba <code>https://iptv-org.github.io/iptv/cities/esodb.m3u</code>
- Galicia <code>https://iptv-org.github.io/iptv/subdivisions/es-ga.m3u</code>
- Girona <code>https://iptv-org.github.io/iptv/subdivisions/es-gi.m3u</code>
- Olot <code>https://iptv-org.github.io/iptv/cities/esooe.m3u</code>
- Palafrugell <code>https://iptv-org.github.io/iptv/cities/espfl.m3u</code>
- Granada <code>https://iptv-org.github.io/iptv/subdivisions/es-gr.m3u</code>
- Granada <code>https://iptv-org.github.io/iptv/cities/esgrx.m3u</code>
- Huelva <code>https://iptv-org.github.io/iptv/subdivisions/es-h.m3u</code>
- Huelva <code>https://iptv-org.github.io/iptv/cities/eshuv.m3u</code>
- Huesca <code>https://iptv-org.github.io/iptv/subdivisions/es-hu.m3u</code>
- Barbastro <code>https://iptv-org.github.io/iptv/cities/esbrb.m3u</code>
- Illes Balears <code>https://iptv-org.github.io/iptv/subdivisions/es-ib.m3u</code>
- Jaén <code>https://iptv-org.github.io/iptv/subdivisions/es-j.m3u</code>
- Jaén <code>https://iptv-org.github.io/iptv/cities/esjae.m3u</code>
- La Rioja <code>https://iptv-org.github.io/iptv/subdivisions/es-ri.m3u</code>
- Logroño <code>https://iptv-org.github.io/iptv/cities/eslgr.m3u</code>
- Lleida <code>https://iptv-org.github.io/iptv/subdivisions/es-l.m3u</code>
- La Seu d'Urgell <code>https://iptv-org.github.io/iptv/cities/eslsl.m3u</code>
- Lleida <code>https://iptv-org.github.io/iptv/cities/eslle.m3u</code>
- Madrid <code>https://iptv-org.github.io/iptv/subdivisions/es-md.m3u</code>
- Málaga <code>https://iptv-org.github.io/iptv/subdivisions/es-ma.m3u</code>
- Fuengirola <code>https://iptv-org.github.io/iptv/cities/esfgl.m3u</code>
- Marbella <code>https://iptv-org.github.io/iptv/cities/esmqe.m3u</code>
- Murcia <code>https://iptv-org.github.io/iptv/subdivisions/es-mc.m3u</code>
- Navarra <code>https://iptv-org.github.io/iptv/subdivisions/es-na.m3u</code>
- Pamplona <code>https://iptv-org.github.io/iptv/cities/espna.m3u</code>
- Navarra <code>https://iptv-org.github.io/iptv/subdivisions/es-nc.m3u</code>
- País Vasco <code>https://iptv-org.github.io/iptv/subdivisions/es-pv.m3u</code>
- Santa Cruz de Tenerife <code>https://iptv-org.github.io/iptv/subdivisions/es-tf.m3u</code>
- Las Palmas <code>https://iptv-org.github.io/iptv/cities/eslpg.m3u</code>
- Tarragona <code>https://iptv-org.github.io/iptv/subdivisions/es-t.m3u</code>
- El Vendrell <code>https://iptv-org.github.io/iptv/cities/esdre.m3u</code>
- Toledo <code>https://iptv-org.github.io/iptv/subdivisions/es-to.m3u</code>
- Toledo <code>https://iptv-org.github.io/iptv/cities/estol.m3u</code>
- Valencia <code>https://iptv-org.github.io/iptv/subdivisions/es-v.m3u</code>
- Alzira <code>https://iptv-org.github.io/iptv/cities/esazj.m3u</code>
- Bocairente <code>https://iptv-org.github.io/iptv/cities/esboi.m3u</code>
- Valenciana <code>https://iptv-org.github.io/iptv/subdivisions/es-vc.m3u</code>
- 🇱🇰 Sri Lanka <code>https://iptv-org.github.io/iptv/countries/lk.m3u</code>
- 🇸🇩 Sudan <code>https://iptv-org.github.io/iptv/countries/sd.m3u</code>
- 🇸🇷 Suriname <code>https://iptv-org.github.io/iptv/countries/sr.m3u</code>
- 🇸🇪 Sweden <code>https://iptv-org.github.io/iptv/countries/se.m3u</code>
- 🇨🇭 Switzerland <code>https://iptv-org.github.io/iptv/countries/ch.m3u</code>
- 🇸🇾 Syria <code>https://iptv-org.github.io/iptv/countries/sy.m3u</code>
- 🇹🇼 Taiwan <code>https://iptv-org.github.io/iptv/countries/tw.m3u</code>
- 🇹🇯 Tajikistan <code>https://iptv-org.github.io/iptv/countries/tj.m3u</code>
- 🇹🇿 Tanzania <code>https://iptv-org.github.io/iptv/countries/tz.m3u</code>
- 🇹🇭 Thailand <code>https://iptv-org.github.io/iptv/countries/th.m3u</code>
- 🇹🇬 Togo <code>https://iptv-org.github.io/iptv/countries/tg.m3u</code>
- 🇹🇹 Trinidad and Tobago <code>https://iptv-org.github.io/iptv/countries/tt.m3u</code>
- 🇹🇳 Tunisia <code>https://iptv-org.github.io/iptv/countries/tn.m3u</code>
- 🇹🇷 Turkiye <code>https://iptv-org.github.io/iptv/countries/tr.m3u</code>
- 🇹🇲 Turkmenistan <code>https://iptv-org.github.io/iptv/countries/tm.m3u</code>
- 🇺🇬 Uganda <code>https://iptv-org.github.io/iptv/countries/ug.m3u</code>
- 🇺🇦 Ukraine <code>https://iptv-org.github.io/iptv/countries/ua.m3u</code>
- Avtonomna Respublika Krym <code>https://iptv-org.github.io/iptv/subdivisions/ua-43.m3u</code>
- Donetska oblast <code>https://iptv-org.github.io/iptv/subdivisions/ua-14.m3u</code>
- Khersonska oblast <code>https://iptv-org.github.io/iptv/subdivisions/ua-65.m3u</code>
- Zaporizka oblast <code>https://iptv-org.github.io/iptv/subdivisions/ua-23.m3u</code>
- 🇦🇪 United Arab Emirates <code>https://iptv-org.github.io/iptv/countries/ae.m3u</code>
- 🇬🇧 United Kingdom <code>https://iptv-org.github.io/iptv/countries/uk.m3u</code>
- Wales <code>https://iptv-org.github.io/iptv/subdivisions/gb-wls.m3u</code>
- 🇺🇸 United States <code>https://iptv-org.github.io/iptv/countries/us.m3u</code>
- Alabama <code>https://iptv-org.github.io/iptv/subdivisions/us-al.m3u</code>
- Mobile <code>https://iptv-org.github.io/iptv/cities/usmob.m3u</code>
- Alaska <code>https://iptv-org.github.io/iptv/subdivisions/us-ak.m3u</code>
- Juneau <code>https://iptv-org.github.io/iptv/cities/usjnu.m3u</code>
- Arizona <code>https://iptv-org.github.io/iptv/subdivisions/us-az.m3u</code>
- Bullhead City <code>https://iptv-org.github.io/iptv/cities/usifp.m3u</code>
- Glendale <code>https://iptv-org.github.io/iptv/cities/usgda.m3u</code>
- Phoenix <code>https://iptv-org.github.io/iptv/cities/usphx.m3u</code>
- Scottsdale <code>https://iptv-org.github.io/iptv/cities/usstz.m3u</code>
- Tucson <code>https://iptv-org.github.io/iptv/cities/ustuz.m3u</code>
- Yuma <code>https://iptv-org.github.io/iptv/cities/usyum.m3u</code>
- Arkansas <code>https://iptv-org.github.io/iptv/subdivisions/us-ar.m3u</code>
- Little Rock <code>https://iptv-org.github.io/iptv/cities/uslit.m3u</code>
- Pine Bluff <code>https://iptv-org.github.io/iptv/cities/uspbf.m3u</code>
- California <code>https://iptv-org.github.io/iptv/subdivisions/us-ca.m3u</code>
- Bakersfield <code>https://iptv-org.github.io/iptv/cities/usbfl.m3u</code>
- Beverly Hills <code>https://iptv-org.github.io/iptv/cities/usbvh.m3u</code>
- Buena Park <code>https://iptv-org.github.io/iptv/cities/usbun.m3u</code>
- Burbank <code>https://iptv-org.github.io/iptv/cities/usbur.m3u</code>
- Calabasas <code>https://iptv-org.github.io/iptv/cities/uslbj.m3u</code>
- Carlsbad <code>https://iptv-org.github.io/iptv/cities/uscld.m3u</code>
- Ceres <code>https://iptv-org.github.io/iptv/cities/uscrz.m3u</code>
- Cerritos <code>https://iptv-org.github.io/iptv/cities/uscek.m3u</code>
- Chatsworth <code>https://iptv-org.github.io/iptv/cities/uscwh.m3u</code>
- Chino Hills <code>https://iptv-org.github.io/iptv/cities/usch3.m3u</code>
- Concord <code>https://iptv-org.github.io/iptv/cities/usccr.m3u</code>
- Corona <code>https://iptv-org.github.io/iptv/cities/uscze.m3u</code>
- Costa Mesa <code>https://iptv-org.github.io/iptv/cities/usczm.m3u</code>
- Cupertino <code>https://iptv-org.github.io/iptv/cities/uscuo.m3u</code>
- Cypress <code>https://iptv-org.github.io/iptv/cities/uscyq.m3u</code>
- Del Mar <code>https://iptv-org.github.io/iptv/cities/usdma.m3u</code>
- Eureka <code>https://iptv-org.github.io/iptv/cities/useka.m3u</code>
- Fairfield <code>https://iptv-org.github.io/iptv/cities/ussuu.m3u</code>
- Fontana <code>https://iptv-org.github.io/iptv/cities/usxfr.m3u</code>
- Fort Bragg <code>https://iptv-org.github.io/iptv/cities/usfob.m3u</code>
- Fresno <code>https://iptv-org.github.io/iptv/cities/usfat.m3u</code>
- Gilroy <code>https://iptv-org.github.io/iptv/cities/usgir.m3u</code>
- Glendale <code>https://iptv-org.github.io/iptv/cities/usjgx.m3u</code>
- Huntington Beach <code>https://iptv-org.github.io/iptv/cities/ushtd.m3u</code>
- Lakewood <code>https://iptv-org.github.io/iptv/cities/uslqq.m3u</code>
- Lawndale <code>https://iptv-org.github.io/iptv/cities/uslwj.m3u</code>
- Lompoc <code>https://iptv-org.github.io/iptv/cities/uslpc.m3u</code>
- Long Beach <code>https://iptv-org.github.io/iptv/cities/uslgb.m3u</code>
- Los Angeles <code>https://iptv-org.github.io/iptv/cities/uslax.m3u</code>
- Los Gatos <code>https://iptv-org.github.io/iptv/cities/uslxx.m3u</code>
- Lucerne Valley <code>https://iptv-org.github.io/iptv/cities/uslcb.m3u</code>
- Millbrae <code>https://iptv-org.github.io/iptv/cities/usmba.m3u</code>
- Monterey <code>https://iptv-org.github.io/iptv/cities/usmy3.m3u</code>
- Moorpark <code>https://iptv-org.github.io/iptv/cities/usmqk.m3u</code>
- Morro Bay <code>https://iptv-org.github.io/iptv/cities/usmjk.m3u</code>
- Nevada City <code>https://iptv-org.github.io/iptv/cities/usnfc.m3u</code>
- Newport Beach <code>https://iptv-org.github.io/iptv/cities/usjnp.m3u</code>
- Oakland <code>https://iptv-org.github.io/iptv/cities/usoak.m3u</code>
- Oceanside <code>https://iptv-org.github.io/iptv/cities/usocn.m3u</code>
- Ontario <code>https://iptv-org.github.io/iptv/cities/usont.m3u</code>
- Pacifica <code>https://iptv-org.github.io/iptv/cities/uspfq.m3u</code>
- Palo Alto <code>https://iptv-org.github.io/iptv/cities/uspao.m3u</code>
- Pinole <code>https://iptv-org.github.io/iptv/cities/usp2c.m3u</code>
- Pomona <code>https://iptv-org.github.io/iptv/cities/uspqc.m3u</code>
- Rancho Cucamonga <code>https://iptv-org.github.io/iptv/cities/usrcu.m3u</code>
- Riverside <code>https://iptv-org.github.io/iptv/cities/usral.m3u</code>
- Sacramento <code>https://iptv-org.github.io/iptv/cities/ussac.m3u</code>
- San Bernardino <code>https://iptv-org.github.io/iptv/cities/ussbt.m3u</code>
- San Diego <code>https://iptv-org.github.io/iptv/cities/ussan.m3u</code>
- San Francisco <code>https://iptv-org.github.io/iptv/cities/ussfo.m3u</code>
- San Jose <code>https://iptv-org.github.io/iptv/cities/ussjc.m3u</code>
- San Luis Obispo <code>https://iptv-org.github.io/iptv/cities/uscsl.m3u</code>
- Santa Clara <code>https://iptv-org.github.io/iptv/cities/usscz.m3u</code>
- Santa Cruz <code>https://iptv-org.github.io/iptv/cities/ussru.m3u</code>
- Santa Maria <code>https://iptv-org.github.io/iptv/cities/ussmx.m3u</code>
- Santa Monica <code>https://iptv-org.github.io/iptv/cities/ussmo.m3u</code>
- Seaside <code>https://iptv-org.github.io/iptv/cities/usxlu.m3u</code>
- Sherman Oaks <code>https://iptv-org.github.io/iptv/cities/ussjj.m3u</code>
- Sonora <code>https://iptv-org.github.io/iptv/cities/ussor.m3u</code>
- Stockton <code>https://iptv-org.github.io/iptv/cities/ussck.m3u</code>
- Temecula <code>https://iptv-org.github.io/iptv/cities/ustmc.m3u</code>
- Torrance <code>https://iptv-org.github.io/iptv/cities/ustoa.m3u</code>
- Vallejo <code>https://iptv-org.github.io/iptv/cities/usvlo.m3u</code>
- Visalia <code>https://iptv-org.github.io/iptv/cities/usvis.m3u</code>
- West Hollywood <code>https://iptv-org.github.io/iptv/cities/uswwu.m3u</code>
- Whittier <code>https://iptv-org.github.io/iptv/cities/uswhr.m3u</code>
- Colorado <code>https://iptv-org.github.io/iptv/subdivisions/us-co.m3u</code>
- Aurora <code>https://iptv-org.github.io/iptv/cities/usauc.m3u</code>
- Brighton <code>https://iptv-org.github.io/iptv/cities/usbgk.m3u</code>
- Denver <code>https://iptv-org.github.io/iptv/cities/usden.m3u</code>
- Fort Collins <code>https://iptv-org.github.io/iptv/cities/usfnl.m3u</code>
- Golden <code>https://iptv-org.github.io/iptv/cities/usgoe.m3u</code>
- Lakewood <code>https://iptv-org.github.io/iptv/cities/usljk.m3u</code>
- Littleton <code>https://iptv-org.github.io/iptv/cities/uslto.m3u</code>
- Loveland <code>https://iptv-org.github.io/iptv/cities/uslov.m3u</code>
- Rifle <code>https://iptv-org.github.io/iptv/cities/usril.m3u</code>
- Thornton <code>https://iptv-org.github.io/iptv/cities/ustht.m3u</code>
- Connecticut <code>https://iptv-org.github.io/iptv/subdivisions/us-ct.m3u</code>
- Bloomfield <code>https://iptv-org.github.io/iptv/cities/usaac.m3u</code>
- Bolton <code>https://iptv-org.github.io/iptv/cities/usbl8.m3u</code>
- Bridgeport <code>https://iptv-org.github.io/iptv/cities/usbdr.m3u</code>
- Clinton <code>https://iptv-org.github.io/iptv/cities/usclb.m3u</code>
- Higganum <code>https://iptv-org.github.io/iptv/cities/ushig.m3u</code>
- New Canaan <code>https://iptv-org.github.io/iptv/cities/usnwc.m3u</code>
- New Haven <code>https://iptv-org.github.io/iptv/cities/ushvn.m3u</code>
- Orange <code>https://iptv-org.github.io/iptv/cities/usorb.m3u</code>
- Rocky Hill <code>https://iptv-org.github.io/iptv/cities/usrok.m3u</code>
- Wolcott <code>https://iptv-org.github.io/iptv/cities/usxwo.m3u</code>
- Delaware <code>https://iptv-org.github.io/iptv/subdivisions/us-de.m3u</code>
- Georgetown <code>https://iptv-org.github.io/iptv/cities/usged.m3u</code>
- Wilmington <code>https://iptv-org.github.io/iptv/cities/usilg.m3u</code>
- District of Columbia <code>https://iptv-org.github.io/iptv/subdivisions/us-dc.m3u</code>
- Washington <code>https://iptv-org.github.io/iptv/cities/uswas.m3u</code>
- Florida <code>https://iptv-org.github.io/iptv/subdivisions/us-fl.m3u</code>
- Bradenton <code>https://iptv-org.github.io/iptv/cities/usbbi.m3u</code>
- Cape Coral <code>https://iptv-org.github.io/iptv/cities/uscc2.m3u</code>
- Coral Gables <code>https://iptv-org.github.io/iptv/cities/uscgb.m3u</code>
- Daytona Beach <code>https://iptv-org.github.io/iptv/cities/usdab.m3u</code>
- Fernandina Beach <code>https://iptv-org.github.io/iptv/cities/usfeb.m3u</code>
- Fort Lauderdale <code>https://iptv-org.github.io/iptv/cities/usfll.m3u</code>
- Fort Myers <code>https://iptv-org.github.io/iptv/cities/usfmy.m3u</code>
- Fort Pierce <code>https://iptv-org.github.io/iptv/cities/usfpr.m3u</code>
- Gainesville <code>https://iptv-org.github.io/iptv/cities/usgnv.m3u</code>
- Jacksonville <code>https://iptv-org.github.io/iptv/cities/usjax.m3u</code>
- Key West <code>https://iptv-org.github.io/iptv/cities/useyw.m3u</code>
- Leesburg <code>https://iptv-org.github.io/iptv/cities/uslee.m3u</code>
- Miami <code>https://iptv-org.github.io/iptv/cities/usmia.m3u</code>
- Miami Beach <code>https://iptv-org.github.io/iptv/cities/usiyh.m3u</code>
- Naples <code>https://iptv-org.github.io/iptv/cities/usapf.m3u</code>
- New Port Richey <code>https://iptv-org.github.io/iptv/cities/usnrh.m3u</code>
- North Miami Beach <code>https://iptv-org.github.io/iptv/cities/uszgv.m3u</code>
- Orlando <code>https://iptv-org.github.io/iptv/cities/usorl.m3u</code>
- Pompano Beach <code>https://iptv-org.github.io/iptv/cities/usppm.m3u</code>
- Sanford <code>https://iptv-org.github.io/iptv/cities/ussfb.m3u</code>
- Sebastian <code>https://iptv-org.github.io/iptv/cities/usszg.m3u</code>
- Tallahassee <code>https://iptv-org.github.io/iptv/cities/ustlh.m3u</code>
- Tampa <code>https://iptv-org.github.io/iptv/cities/ustpa.m3u</code>
- West Palm Beach <code>https://iptv-org.github.io/iptv/cities/uspbi.m3u</code>
- Georgia <code>https://iptv-org.github.io/iptv/subdivisions/us-ga.m3u</code>
- Athens <code>https://iptv-org.github.io/iptv/cities/usahn.m3u</code>
- Atlanta <code>https://iptv-org.github.io/iptv/cities/usatl.m3u</code>
- Cleveland <code>https://iptv-org.github.io/iptv/cities/uscqv.m3u</code>
- Duluth <code>https://iptv-org.github.io/iptv/cities/usdga.m3u</code>
- Kingsland <code>https://iptv-org.github.io/iptv/cities/usknl.m3u</code>
- Macon <code>https://iptv-org.github.io/iptv/cities/usmcn.m3u</code>
- Monroe <code>https://iptv-org.github.io/iptv/cities/usmoe.m3u</code>
- Hawaii <code>https://iptv-org.github.io/iptv/subdivisions/us-hi.m3u</code>
- Honolulu <code>https://iptv-org.github.io/iptv/cities/ushnl.m3u</code>
- Kahului <code>https://iptv-org.github.io/iptv/cities/usogg.m3u</code>
- Illinois <code>https://iptv-org.github.io/iptv/subdivisions/us-il.m3u</code>
- Champaign <code>https://iptv-org.github.io/iptv/cities/uscmi.m3u</code>
- Chicago <code>https://iptv-org.github.io/iptv/cities/uschi.m3u</code>
- West Frankfort <code>https://iptv-org.github.io/iptv/cities/uskft.m3u</code>
- Indiana <code>https://iptv-org.github.io/iptv/subdivisions/us-in.m3u</code>
- Indianapolis <code>https://iptv-org.github.io/iptv/cities/usind.m3u</code>
- South Bend <code>https://iptv-org.github.io/iptv/cities/ussbn.m3u</code>
- Iowa <code>https://iptv-org.github.io/iptv/subdivisions/us-ia.m3u</code>
- Des Moines <code>https://iptv-org.github.io/iptv/cities/usdsm.m3u</code>
- Ottumwa <code>https://iptv-org.github.io/iptv/cities/usotm.m3u</code>
- Sioux City <code>https://iptv-org.github.io/iptv/cities/ussux.m3u</code>
- Kansas <code>https://iptv-org.github.io/iptv/subdivisions/us-ks.m3u</code>
- Lawrence <code>https://iptv-org.github.io/iptv/cities/uslwc.m3u</code>
- Wichita <code>https://iptv-org.github.io/iptv/cities/usict.m3u</code>
- Kentucky <code>https://iptv-org.github.io/iptv/subdivisions/us-ky.m3u</code>
- Lexington <code>https://iptv-org.github.io/iptv/cities/uslex.m3u</code>
- Louisville <code>https://iptv-org.github.io/iptv/cities/uslui.m3u</code>
- Louisiana <code>https://iptv-org.github.io/iptv/subdivisions/us-la.m3u</code>
- Baton Rouge <code>https://iptv-org.github.io/iptv/cities/usbtr.m3u</code>
- Hammond <code>https://iptv-org.github.io/iptv/cities/ushlo.m3u</code>
- New Orleans <code>https://iptv-org.github.io/iptv/cities/usmsy.m3u</code>
- West Monroe <code>https://iptv-org.github.io/iptv/cities/uswmx.m3u</code>
- Maryland <code>https://iptv-org.github.io/iptv/subdivisions/us-md.m3u</code>
- Annapolis <code>https://iptv-org.github.io/iptv/cities/usanp.m3u</code>
- Baltimore <code>https://iptv-org.github.io/iptv/cities/usbal.m3u</code>
- Salisbury <code>https://iptv-org.github.io/iptv/cities/ussby.m3u</code>
- Massachusetts <code>https://iptv-org.github.io/iptv/subdivisions/us-ma.m3u</code>
- Belmont <code>https://iptv-org.github.io/iptv/cities/usjgt.m3u</code>
- Boston <code>https://iptv-org.github.io/iptv/cities/usbos.m3u</code>
- Brookline <code>https://iptv-org.github.io/iptv/cities/usbma.m3u</code>
- Framingham <code>https://iptv-org.github.io/iptv/cities/usfhm.m3u</code>
- Leominster <code>https://iptv-org.github.io/iptv/cities/uslmr.m3u</code>
- Lexington <code>https://iptv-org.github.io/iptv/cities/uslxi.m3u</code>
- Natick <code>https://iptv-org.github.io/iptv/cities/usnak.m3u</code>
- Worcester <code>https://iptv-org.github.io/iptv/cities/usorh.m3u</code>
- Michigan <code>https://iptv-org.github.io/iptv/subdivisions/us-mi.m3u</code>
- Battle Creek <code>https://iptv-org.github.io/iptv/cities/usbtl.m3u</code>
- Detroit <code>https://iptv-org.github.io/iptv/cities/usdet.m3u</code>
- Kalamazoo <code>https://iptv-org.github.io/iptv/cities/usazo.m3u</code>
- Traverse City <code>https://iptv-org.github.io/iptv/cities/ustvc.m3u</code>
- Minnesota <code>https://iptv-org.github.io/iptv/subdivisions/us-mn.m3u</code>
- Apple Valley <code>https://iptv-org.github.io/iptv/cities/usyaw.m3u</code>
- Austin <code>https://iptv-org.github.io/iptv/cities/usaum.m3u</code>
- Duluth <code>https://iptv-org.github.io/iptv/cities/usdlh.m3u</code>
- Maple Grove <code>https://iptv-org.github.io/iptv/cities/usxmg.m3u</code>
- Minneapolis <code>https://iptv-org.github.io/iptv/cities/usmes.m3u</code>
- Saint Paul <code>https://iptv-org.github.io/iptv/cities/usstp.m3u</code>
- Mississippi <code>https://iptv-org.github.io/iptv/subdivisions/us-ms.m3u</code>
- Columbus <code>https://iptv-org.github.io/iptv/cities/usubs.m3u</code>
- Gulfport <code>https://iptv-org.github.io/iptv/cities/usgpt.m3u</code>
- Missouri <code>https://iptv-org.github.io/iptv/subdivisions/us-mo.m3u</code>
- Cape Girardeau <code>https://iptv-org.github.io/iptv/cities/uscgi.m3u</code>
- Columbia <code>https://iptv-org.github.io/iptv/cities/uscou.m3u</code>
- Jefferson City <code>https://iptv-org.github.io/iptv/cities/usjef.m3u</code>
- Kansas City <code>https://iptv-org.github.io/iptv/cities/usmkc.m3u</code>
- Sedalia <code>https://iptv-org.github.io/iptv/cities/usdmo.m3u</code>
- Nebraska <code>https://iptv-org.github.io/iptv/subdivisions/us-ne.m3u</code>
- Lincoln <code>https://iptv-org.github.io/iptv/cities/uslnk.m3u</code>
- Omaha <code>https://iptv-org.github.io/iptv/cities/usoma.m3u</code>
- Nevada <code>https://iptv-org.github.io/iptv/subdivisions/us-nv.m3u</code>
- Las Vegas <code>https://iptv-org.github.io/iptv/cities/uslas.m3u</code>
- New Hampshire <code>https://iptv-org.github.io/iptv/subdivisions/us-nh.m3u</code>
- Derry <code>https://iptv-org.github.io/iptv/cities/usdnp.m3u</code>
- Manchester <code>https://iptv-org.github.io/iptv/cities/usmht.m3u</code>
- Nashua <code>https://iptv-org.github.io/iptv/cities/usash.m3u</code>
- New Jersey <code>https://iptv-org.github.io/iptv/subdivisions/us-nj.m3u</code>
- Newark <code>https://iptv-org.github.io/iptv/cities/usewr.m3u</code>
- Newton <code>https://iptv-org.github.io/iptv/cities/usnwn.m3u</code>
- Paterson <code>https://iptv-org.github.io/iptv/cities/uspat.m3u</code>
- Teterboro <code>https://iptv-org.github.io/iptv/cities/usteb.m3u</code>
- Trenton <code>https://iptv-org.github.io/iptv/cities/usttn.m3u</code>
- New Mexico <code>https://iptv-org.github.io/iptv/subdivisions/us-nm.m3u</code>
- Albuquerque <code>https://iptv-org.github.io/iptv/cities/usabq.m3u</code>
- New York <code>https://iptv-org.github.io/iptv/subdivisions/us-ny.m3u</code>
- Albany <code>https://iptv-org.github.io/iptv/cities/usalb.m3u</code>
- New York City <code>https://iptv-org.github.io/iptv/cities/usnyc.m3u</code>
- Rochester <code>https://iptv-org.github.io/iptv/cities/usroc.m3u</code>
- North Carolina <code>https://iptv-org.github.io/iptv/subdivisions/us-nc.m3u</code>
- Asheville <code>https://iptv-org.github.io/iptv/cities/usaev.m3u</code>
- Charlotte <code>https://iptv-org.github.io/iptv/cities/usclt.m3u</code>
- Jacksonville <code>https://iptv-org.github.io/iptv/cities/usoaj.m3u</code>
- Wilmington <code>https://iptv-org.github.io/iptv/cities/usilm.m3u</code>
- Winston-Salem <code>https://iptv-org.github.io/iptv/cities/usint.m3u</code>
- North Dakota <code>https://iptv-org.github.io/iptv/subdivisions/us-nd.m3u</code>
- Steele <code>https://iptv-org.github.io/iptv/cities/usndz.m3u</code>
- Ohio <code>https://iptv-org.github.io/iptv/subdivisions/us-oh.m3u</code>
- Cincinnati <code>https://iptv-org.github.io/iptv/cities/uscvg.m3u</code>
- Cleveland <code>https://iptv-org.github.io/iptv/cities/uscle.m3u</code>
- Columbus <code>https://iptv-org.github.io/iptv/cities/uscmh.m3u</code>
- Dayton <code>https://iptv-org.github.io/iptv/cities/usday.m3u</code>
- Lima <code>https://iptv-org.github.io/iptv/cities/uslia.m3u</code>
- Steubenville <code>https://iptv-org.github.io/iptv/cities/usuyj.m3u</code>
- Toledo <code>https://iptv-org.github.io/iptv/cities/ustol.m3u</code>
- Oklahoma <code>https://iptv-org.github.io/iptv/subdivisions/us-ok.m3u</code>
- Oklahoma City <code>https://iptv-org.github.io/iptv/cities/usokc.m3u</code>
- Tulsa <code>https://iptv-org.github.io/iptv/cities/ustul.m3u</code>
- Oregon <code>https://iptv-org.github.io/iptv/subdivisions/us-or.m3u</code>
- Ashland <code>https://iptv-org.github.io/iptv/cities/usasi.m3u</code>
- Coos Bay <code>https://iptv-org.github.io/iptv/cities/uscob.m3u</code>
- Grants Pass <code>https://iptv-org.github.io/iptv/cities/usxfx.m3u</code>
- Portland <code>https://iptv-org.github.io/iptv/cities/uspdx.m3u</code>
- Pennsylvania <code>https://iptv-org.github.io/iptv/subdivisions/us-pa.m3u</code>
- Harrisburg <code>https://iptv-org.github.io/iptv/cities/ushar.m3u</code>
- Johnstown <code>https://iptv-org.github.io/iptv/cities/usjst.m3u</code>
- Lancaster <code>https://iptv-org.github.io/iptv/cities/uslns.m3u</code>
- Philadelphia <code>https://iptv-org.github.io/iptv/cities/usphl.m3u</code>
- Pittsburgh <code>https://iptv-org.github.io/iptv/cities/uspit.m3u</code>
- Reading <code>https://iptv-org.github.io/iptv/cities/usrdg.m3u</code>
- West Chester <code>https://iptv-org.github.io/iptv/cities/uswct.m3u</code>
- Rhode Island <code>https://iptv-org.github.io/iptv/subdivisions/us-ri.m3u</code>
- Cranston <code>https://iptv-org.github.io/iptv/cities/uscqh.m3u</code>
- South Carolina <code>https://iptv-org.github.io/iptv/subdivisions/us-sc.m3u</code>
- Charleston <code>https://iptv-org.github.io/iptv/cities/uschs.m3u</code>
- Columbia <code>https://iptv-org.github.io/iptv/cities/uscae.m3u</code>
- Greenville <code>https://iptv-org.github.io/iptv/cities/usgv9.m3u</code>
- Tennessee <code>https://iptv-org.github.io/iptv/subdivisions/us-tn.m3u</code>
- Chattanooga <code>https://iptv-org.github.io/iptv/cities/uscha.m3u</code>
- Jackson <code>https://iptv-org.github.io/iptv/cities/usmkl.m3u</code>
- Memphis <code>https://iptv-org.github.io/iptv/cities/usmem.m3u</code>
- Texas <code>https://iptv-org.github.io/iptv/subdivisions/us-tx.m3u</code>
- Austin <code>https://iptv-org.github.io/iptv/cities/usaus.m3u</code>
- Corpus Christi <code>https://iptv-org.github.io/iptv/cities/uscrp.m3u</code>
- Dallas <code>https://iptv-org.github.io/iptv/cities/usdal.m3u</code>
- El Paso <code>https://iptv-org.github.io/iptv/cities/uselp.m3u</code>
- Fort Worth <code>https://iptv-org.github.io/iptv/cities/usfwt.m3u</code>
- Fredericksburg <code>https://iptv-org.github.io/iptv/cities/usfxg.m3u</code>
- Galveston <code>https://iptv-org.github.io/iptv/cities/usgls.m3u</code>
- Garland <code>https://iptv-org.github.io/iptv/cities/usgrx.m3u</code>
- Houston <code>https://iptv-org.github.io/iptv/cities/ushou.m3u</code>
- San Antonio <code>https://iptv-org.github.io/iptv/cities/ussat.m3u</code>
- Snyder <code>https://iptv-org.github.io/iptv/cities/ussnk.m3u</code>
- Waco <code>https://iptv-org.github.io/iptv/cities/usact.m3u</code>
- Weslaco <code>https://iptv-org.github.io/iptv/cities/uswko.m3u</code>
- Utah <code>https://iptv-org.github.io/iptv/subdivisions/us-ut.m3u</code>
- Salt Lake City <code>https://iptv-org.github.io/iptv/cities/usslc.m3u</code>
- Vermont <code>https://iptv-org.github.io/iptv/subdivisions/us-vt.m3u</code>
- Barre <code>https://iptv-org.github.io/iptv/cities/usvbr.m3u</code>
- Waitsfield <code>https://iptv-org.github.io/iptv/cities/uswai.m3u</code>
- Virginia <code>https://iptv-org.github.io/iptv/subdivisions/us-va.m3u</code>
- Harrisonburg <code>https://iptv-org.github.io/iptv/cities/ushbv.m3u</code>
- Richmond <code>https://iptv-org.github.io/iptv/cities/usric.m3u</code>
- Roanoke <code>https://iptv-org.github.io/iptv/cities/usroa.m3u</code>
- Washington <code>https://iptv-org.github.io/iptv/subdivisions/us-wa.m3u</code>
- Seattle <code>https://iptv-org.github.io/iptv/cities/ussea.m3u</code>
- Tacoma <code>https://iptv-org.github.io/iptv/cities/ustiw.m3u</code>
- Wisconsin <code>https://iptv-org.github.io/iptv/subdivisions/us-wi.m3u</code>
- Green Bay <code>https://iptv-org.github.io/iptv/cities/usgrb.m3u</code>
- Milwaukee <code>https://iptv-org.github.io/iptv/cities/usmke.m3u</code>
- 🇺🇾 Uruguay <code>https://iptv-org.github.io/iptv/countries/uy.m3u</code>
- 🇺🇿 Uzbekistan <code>https://iptv-org.github.io/iptv/countries/uz.m3u</code>
- 🇻🇦 Vatican City <code>https://iptv-org.github.io/iptv/countries/va.m3u</code>
- 🇻🇪 Venezuela <code>https://iptv-org.github.io/iptv/countries/ve.m3u</code>
- Aragua <code>https://iptv-org.github.io/iptv/subdivisions/ve-d.m3u</code>
- Maracay <code>https://iptv-org.github.io/iptv/cities/vemyc.m3u</code>
- Lara <code>https://iptv-org.github.io/iptv/subdivisions/ve-k.m3u</code>
- 🇻🇳 Vietnam <code>https://iptv-org.github.io/iptv/countries/vn.m3u</code>
- 🇪🇭 Western Sahara <code>https://iptv-org.github.io/iptv/countries/eh.m3u</code>
- 🇾🇪 Yemen <code>https://iptv-org.github.io/iptv/countries/ye.m3u</code>
- 🇿🇼 Zimbabwe <code>https://iptv-org.github.io/iptv/countries/zw.m3u</code>
- 🌐 International <code>https://iptv-org.github.io/iptv/countries/int.m3u</code>
- Undefined <code>https://iptv-org.github.io/iptv/countries/undefined.m3u</code>
#### Regions
<!-- prettier-ignore -->
- Africa <code>https://iptv-org.github.io/iptv/regions/afr.m3u</code>
- Americas <code>https://iptv-org.github.io/iptv/regions/amer.m3u</code>
- Arab world <code>https://iptv-org.github.io/iptv/regions/arab.m3u</code>
- Asia <code>https://iptv-org.github.io/iptv/regions/asia.m3u</code>
- Asia-Pacific <code>https://iptv-org.github.io/iptv/regions/apac.m3u</code>
- Association of Southeast Asian Nations <code>https://iptv-org.github.io/iptv/regions/asean.m3u</code>
- Balkan <code>https://iptv-org.github.io/iptv/regions/balkan.m3u</code>
- Benelux <code>https://iptv-org.github.io/iptv/regions/benelux.m3u</code>
- Caribbean <code>https://iptv-org.github.io/iptv/regions/carib.m3u</code>
- Central America <code>https://iptv-org.github.io/iptv/regions/cenamer.m3u</code>
- Central and Eastern Europe <code>https://iptv-org.github.io/iptv/regions/cee.m3u</code>
- Central Asia <code>https://iptv-org.github.io/iptv/regions/cas.m3u</code>
- Central Europe <code>https://iptv-org.github.io/iptv/regions/ceu.m3u</code>
- Commonwealth of Independent States <code>https://iptv-org.github.io/iptv/regions/cis.m3u</code>
- East Africa <code>https://iptv-org.github.io/iptv/regions/eaf.m3u</code>
- East Asia <code>https://iptv-org.github.io/iptv/regions/eas.m3u</code>
- Europe <code>https://iptv-org.github.io/iptv/regions/eur.m3u</code>
- Europe, the Middle East and Africa <code>https://iptv-org.github.io/iptv/regions/emea.m3u</code>
- European Union <code>https://iptv-org.github.io/iptv/regions/eu.m3u</code>
- Gulf Cooperation Council <code>https://iptv-org.github.io/iptv/regions/gcc.m3u</code>
- Hispanic America <code>https://iptv-org.github.io/iptv/regions/hispam.m3u</code>
- Latin America <code>https://iptv-org.github.io/iptv/regions/latam.m3u</code>
- Latin America and the Caribbean <code>https://iptv-org.github.io/iptv/regions/lac.m3u</code>
- Maghreb <code>https://iptv-org.github.io/iptv/regions/maghreb.m3u</code>
- Middle East <code>https://iptv-org.github.io/iptv/regions/mideast.m3u</code>
- Middle East and North Africa <code>https://iptv-org.github.io/iptv/regions/mena.m3u</code>
- Nordics <code>https://iptv-org.github.io/iptv/regions/nord.m3u</code>
- North America <code>https://iptv-org.github.io/iptv/regions/noram.m3u</code>
- Northern America <code>https://iptv-org.github.io/iptv/regions/nam.m3u</code>
- Northern Europe <code>https://iptv-org.github.io/iptv/regions/neu.m3u</code>
- Oceania <code>https://iptv-org.github.io/iptv/regions/oce.m3u</code>
- South America <code>https://iptv-org.github.io/iptv/regions/southam.m3u</code>
- South Asia <code>https://iptv-org.github.io/iptv/regions/sas.m3u</code>
- Southeast Asia <code>https://iptv-org.github.io/iptv/regions/sea.m3u</code>
- Southern Africa <code>https://iptv-org.github.io/iptv/regions/saf.m3u</code>
- Southern Europe <code>https://iptv-org.github.io/iptv/regions/ser.m3u</code>
- Sub-Saharan Africa <code>https://iptv-org.github.io/iptv/regions/ssa.m3u</code>
- United Nations <code>https://iptv-org.github.io/iptv/regions/un.m3u</code>
- West Africa <code>https://iptv-org.github.io/iptv/regions/waf.m3u</code>
- West Asia <code>https://iptv-org.github.io/iptv/regions/was.m3u</code>
- Western Europe <code>https://iptv-org.github.io/iptv/regions/wer.m3u</code>
- Worldwide <code>https://iptv-org.github.io/iptv/regions/ww.m3u</code>
</details>
### Grouped by sources
Playlists in which channels are grouped by broadcast source.
<details>
<summary>Expand</summary>
<br>
To use the playlist, simply replace `<FILENAME>` in the link below with the name of one of the files in the [streams](streams) folder.
```
https://iptv-org.github.io/iptv/sources/<FILENAME>.m3u
```
</details>
Also, any of our internal playlists are available in raw form (without any filtering or sorting) at this link:
```
https://iptv-org.github.io/iptv/raw/<FILENAME>.m3u
```
================================================
FILE: README.md
================================================
# IPTV [](https://github.com/iptv-org/iptv/actions/workflows/update.yml)
Collection of publicly available IPTV (Internet Protocol television) channels from all over the world.
## Table of contents
- 🚀 [How to use?](#how-to-use)
- 📺 [Playlists](#playlists)
- 🗓 [EPG](#epg)
- 🗄 [Database](#database)
- 👨💻 [API](#api)
- 📚 [Resources](#resources)
- 💬 [Discussions](#discussions)
- ❓ [FAQ](#faq)
- 🛠 [Contribution](#contribution)
- ⚖ [Legal](#legal)
- © [License](#license)
## How to use?
Simply paste the link to one of the playlists into [any video player](https://github.com/iptv-org/awesome-iptv#apps) that supports live streaming and press _Open_.

## Playlists
The main playlist containing all channels available in the repository can be found at:
```
https://iptv-org.github.io/iptv/index.m3u
```
Links to other playlists can be found in the [PLAYLISTS.md](PLAYLISTS.md) file.
## EPG
[Electronic Program Guide](https://en.wikipedia.org/wiki/Electronic_program_guide) for most of the channels can be downloaded using utilities published in the [iptv-org/epg](https://github.com/iptv-org/epg) repository.
## Database
All channel data is taken from the [iptv-org/database](https://github.com/iptv-org/database) repository. If you find any errors please open a new [issue](https://github.com/iptv-org/database/issues) there.
## API
The API documentation can be found in the [iptv-org/api](https://github.com/iptv-org/api) repository.
## Resources
Links to other useful IPTV-related resources can be found in the [iptv-org/awesome-iptv](https://github.com/iptv-org/awesome-iptv) repository.
## Discussions
If you have a question or idea, welcome to the [Discussions](https://github.com/orgs/iptv-org/discussions).
## FAQ
The answers to the most popular questions can be found in the [FAQ.md](FAQ.md) file.
## Contribution
Please make sure to read the [Contributing Guide](CONTRIBUTING.md) before sending an issue or making a pull request.
And thank you to everyone who has already contributed!
### Backers
<a href="https://opencollective.com/iptv-org"><img src="https://opencollective.com/iptv-org/backers.svg?width=890" /></a>
### Contributors
<a href="https://github.com/iptv-org/iptv/graphs/contributors"><img src="https://opencollective.com/iptv-org/contributors.svg?width=890" /></a>
## 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 opening an [issue](https://github.com/iptv-org/iptv/issues/new?template=6_copyright-claim.yml). 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).
## License
[](LICENSE)
================================================
FILE: eslint.config.mjs
================================================
import typescriptEslint from '@typescript-eslint/eslint-plugin'
import stylistic from '@stylistic/eslint-plugin'
import tsParser from '@typescript-eslint/parser'
import { FlatCompat } from '@eslint/eslintrc'
import { fileURLToPath } from 'node:url'
import globals from 'globals'
import path from 'node:path'
import js from '@eslint/js'
const __filename = fileURLToPath(import.meta.url)
const __dirname = path.dirname(__filename)
const compat = new FlatCompat({
baseDirectory: __dirname,
recommendedConfig: js.configs.recommended,
allConfig: js.configs.all
})
export default [
...compat.extends('eslint:recommended', 'plugin:@typescript-eslint/recommended'),
{
plugins: {
'@typescript-eslint': typescriptEslint,
'@stylistic': stylistic
},
languageOptions: {
globals: {
...globals.browser
},
parser: tsParser,
ecmaVersion: 'latest',
sourceType: 'module'
},
rules: {
'no-case-declarations': 'off',
indent: [
'error',
2,
{
SwitchCase: 1
}
],
'@stylistic/linebreak-style': ['error', 'windows'],
quotes: ['error', 'single'],
semi: ['error', 'never']
}
},
{
ignores: ['tests/__data__/**']
}
]
================================================
FILE: m3u-linter.json
================================================
{
"files": ["streams/*.m3u"],
"rules": {
"no-empty-lines": true,
"require-header": true,
"attribute-quotes": true,
"require-info": true,
"require-title": true,
"no-trailing-spaces": false,
"no-whitespace-before-title": true,
"no-multi-spaces": true,
"no-extra-comma": true,
"space-before-paren": true,
"no-dash": true,
"require-link": true
}
}
================================================
FILE: package.json
================================================
{
"name": "iptv",
"scripts": {
"act:check": "gh act pull_request -W .github/workflows/check.yml",
"act:format": "gh act workflow_dispatch -W .github/workflows/format.yml",
"act:update": "gh act workflow_dispatch -W .github/workflows/update.yml",
"api:load": "tsx scripts/commands/api/load.ts",
"playlist:format": "tsx scripts/commands/playlist/format.ts",
"playlist:update": "tsx scripts/commands/playlist/update.ts",
"playlist:generate": "tsx scripts/commands/playlist/generate.ts",
"playlist:validate": "tsx scripts/commands/playlist/validate.ts",
"playlist:lint": "npx m3u-linter -c m3u-linter.json",
"playlist:test": "tsx scripts/commands/playlist/test.ts",
"playlist:edit": "tsx scripts/commands/playlist/edit.ts",
"playlist:export": "tsx scripts/commands/playlist/export.ts",
"readme:update": "tsx scripts/commands/readme/update.ts",
"report:create": "tsx scripts/commands/report/create.ts",
"lint": "npx eslint \"scripts/**/*.{ts,js}\" \"tests/**/*.{ts,js}\"",
"test": "jest --runInBand",
"postinstall": "npm run api:load"
},
"jest": {
"transform": {
"^.+\\.ts$": "@swc/jest"
},
"testRegex": "tests/(.*?/)?.*test.ts$",
"setupFilesAfterEnv": [
"jest-expect-message"
]
},
"author": "Arhey",
"private": true,
"license": "MIT",
"dependencies": {
"@alex_neo/jest-expect-message": "^1.0.5",
"@eslint/eslintrc": "^3.3.1",
"@eslint/js": "^9.32.0",
"@freearhey/core": "^0.14.3",
"@freearhey/storage-js": "^0.1.0",
"@inquirer/prompts": "^7.8.0",
"@iptv-org/sdk": "^1.1.4",
"@octokit/core": "^7.0.3",
"@octokit/plugin-paginate-rest": "^13.1.1",
"@octokit/plugin-rest-endpoint-methods": "^16.0.0",
"@octokit/types": "^14.1.0",
"@stylistic/eslint-plugin": "^5.2.2",
"@swc/jest": "^0.2.39",
"@types/async": "^3.2.25",
"@types/cli-progress": "^3.11.6",
"@types/fs-extra": "^11.0.4",
"@types/jest": "^30.0.0",
"@types/lodash.uniqueid": "^4.0.9",
"@types/node-cleanup": "^2.1.5",
"@typescript-eslint/eslint-plugin": "^8.38.0",
"@typescript-eslint/parser": "^8.38.0",
"async": "^3.2.6",
"axios": "^1.11.0",
"chalk": "^5.4.1",
"cli-progress": "^3.12.0",
"commander": "^14.0.0",
"console-table-printer": "^2.14.6",
"cross-env": "^10.0.0",
"es-toolkit": "^1.45.1",
"eslint": "^9.32.0",
"glob": "^11.0.3",
"globals": "^16.3.0",
"hls-parser": "^0.16.0",
"iptv-playlist-parser": "^0.15.1",
"jest": "^30.0.5",
"jest-expect-message": "^1.1.3",
"lodash.uniqueid": "^4.0.1",
"m3u-linter": "^0.4.2",
"mediainfo.js": "^0.3.6",
"mpd-parser": "^1.3.1",
"node-cleanup": "^2.1.2",
"normalize-url": "^8.1.0",
"socks-proxy-agent": "^8.0.5",
"tsx": "^4.20.3"
}
}
================================================
FILE: scripts/api.ts
================================================
import { Collection, Dictionary } from '@freearhey/core'
import { DATA_DIR } from './constants'
import cliProgress from 'cli-progress'
import * as sdk from '@iptv-org/sdk'
const data = {
categoriesKeyById: new Dictionary<sdk.Models.Category>(),
countriesKeyByCode: new Dictionary<sdk.Models.Country>(),
subdivisionsKeyByCode: new Dictionary<sdk.Models.Subdivision>(),
citiesKeyByCode: new Dictionary<sdk.Models.City>(),
regionsKeyByCode: new Dictionary<sdk.Models.Region>(),
languagesKeyByCode: new Dictionary<sdk.Models.Language>(),
channelsKeyById: new Dictionary<sdk.Models.Channel>(),
feedsKeyByStreamId: new Dictionary<sdk.Models.Feed>(),
feedsGroupedByChannel: new Dictionary<sdk.Models.Feed[]>(),
blocklistRecordsGroupedByChannel: new Dictionary<sdk.Models.BlocklistRecord[]>(),
categories: new Collection<sdk.Models.Category>(),
countries: new Collection<sdk.Models.Country>(),
subdivisions: new Collection<sdk.Models.Subdivision>(),
cities: new Collection<sdk.Models.City>(),
regions: new Collection<sdk.Models.Region>()
}
let searchIndex
async function loadData() {
const dataManager = new sdk.DataManager({ dataDir: DATA_DIR })
await dataManager.loadFromDisk()
dataManager.processData()
const {
channels,
feeds,
categories,
languages,
countries,
subdivisions,
cities,
regions,
blocklist
} = dataManager.getProcessedData()
const searchableData = channels.map((channel: sdk.Models.Channel) => channel.getSearchable())
searchIndex = sdk.SearchEngine.createIndex<sdk.Types.ChannelSearchableData>(searchableData.all())
data.categoriesKeyById = categories.keyBy((category: sdk.Models.Category) => category.id)
data.countriesKeyByCode = countries.keyBy((country: sdk.Models.Country) => country.code)
data.subdivisionsKeyByCode = subdivisions.keyBy(
(subdivision: sdk.Models.Subdivision) => subdivision.code
)
data.citiesKeyByCode = cities.keyBy((city: sdk.Models.City) => city.code)
data.regionsKeyByCode = regions.keyBy((region: sdk.Models.Region) => region.code)
data.languagesKeyByCode = languages.keyBy((language: sdk.Models.Language) => language.code)
data.channelsKeyById = channels.keyBy((channel: sdk.Models.Channel) => channel.id)
data.feedsKeyByStreamId = feeds.keyBy((feed: sdk.Models.Feed) => feed.getStreamId())
data.feedsGroupedByChannel = feeds.groupBy((feed: sdk.Models.Feed) => feed.channel)
data.blocklistRecordsGroupedByChannel = blocklist.groupBy(
(blocklistRecord: sdk.Models.BlocklistRecord) => blocklistRecord.channel
)
data.categories = categories
data.countries = countries
data.subdivisions = subdivisions
data.cities = cities
data.regions = regions
}
async function downloadData() {
function formatBytes(bytes: number) {
if (bytes === 0) return '0 B'
const k = 1024
const sizes = ['B', 'KB', 'MB', 'GB']
const i = Math.floor(Math.log(bytes) / Math.log(k))
return parseFloat((bytes / Math.pow(k, i)).toFixed(1)) + ' ' + sizes[i]
}
const files = [
'blocklist',
'categories',
'channels',
'cities',
'countries',
'feeds',
'guides',
'languages',
'logos',
'regions',
'streams',
'subdivisions',
'timezones'
]
const multiBar = new cliProgress.MultiBar({
stopOnComplete: true,
hideCursor: true,
forceRedraw: true,
barsize: 36,
format(options, params, payload) {
const filename = payload.filename.padEnd(18, ' ')
const barsize = options.barsize || 40
const percent = (params.progress * 100).toFixed(2)
const speed = payload.speed ? formatBytes(payload.speed) + '/s' : 'N/A'
const total = formatBytes(params.total)
const completeSize = Math.round(params.progress * barsize)
const incompleteSize = barsize - completeSize
const bar =
options.barCompleteString && options.barIncompleteString
? options.barCompleteString.substr(0, completeSize) +
options.barGlue +
options.barIncompleteString.substr(0, incompleteSize)
: '-'.repeat(barsize)
return `${filename} [${bar}] ${percent}% | ETA: ${params.eta}s | ${total} | ${speed}`
}
})
const dataManager = new sdk.DataManager({ dataDir: DATA_DIR })
const requests: Promise<unknown>[] = []
for (const basename of files) {
const filename = `${basename}.json`
const progressBar = multiBar.create(0, 0, { filename })
const request = dataManager.downloadFileToDisk(basename, {
onDownloadProgress({ total, loaded, rate }) {
if (total) progressBar.setTotal(total)
progressBar.update(loaded, { speed: rate })
}
})
requests.push(request)
}
await Promise.allSettled(requests).catch(console.error)
}
function searchChannels(query: string): Collection<sdk.Models.Channel> {
if (!searchIndex) return new Collection<sdk.Models.Channel>()
const results = searchIndex.search(query)
const channels = new Collection<sdk.Models.Channel>()
new Collection<sdk.Types.ChannelSearchableData>(results).forEach(
(item: sdk.Types.ChannelSearchableData) => {
const channel = data.channelsKeyById.get(item.id)
if (channel) channels.add(channel)
}
)
return channels
}
export { data, loadData, downloadData, searchChannels }
================================================
FILE: scripts/commands/api/load.ts
================================================
import { downloadData } from '../../api'
async function main() {
await downloadData()
}
main()
================================================
FILE: scripts/commands/playlist/edit.ts
================================================
import { loadData, data, searchChannels } from '../../api'
import { Collection, Logger } from '@freearhey/core'
import { select, input } from '@inquirer/prompts'
import { Playlist, Stream } from '../../models'
import { Storage } from '@freearhey/storage-js'
import { PlaylistParser } from '../../core'
import nodeCleanup from 'node-cleanup'
import * as sdk from '@iptv-org/sdk'
import { truncate } from '../../utils'
import { Command } from 'commander'
import readline from 'readline'
type ChoiceValue = { type: string; value?: sdk.Models.Feed | sdk.Models.Channel }
type Choice = { name: string; short?: string; value: ChoiceValue; default?: boolean }
if (process.platform === 'win32') {
readline
.createInterface({
input: process.stdin,
output: process.stdout
})
.on('SIGINT', function () {
process.emit('SIGINT')
})
}
const program = new Command()
program.argument('<filepath>', 'Path to *.channels.xml file to edit').parse(process.argv)
const filepath = program.args[0]
const logger = new Logger()
const storage = new Storage()
let parsedStreams = new Collection<Stream>()
main(filepath)
nodeCleanup(() => {
save(filepath)
})
export default async function main(filepath: string) {
if (!(await storage.exists(filepath))) {
throw new Error(`File "${filepath}" does not exists`)
}
logger.info('loading data from api...')
await loadData()
logger.info('loading streams...')
const parser = new PlaylistParser({
storage
})
parsedStreams = await parser.parseFile(filepath)
const streamsWithoutId = parsedStreams.filter((stream: Stream) => !stream.tvgId)
logger.info(
`found ${parsedStreams.count()} streams (including ${streamsWithoutId.count()} without ID)`
)
logger.info('starting...\n')
for (const stream of streamsWithoutId.all()) {
try {
stream.tvgId = await selectChannel(stream)
} catch (err) {
logger.info(err.message)
break
}
}
streamsWithoutId.forEach((stream: Stream) => {
if (stream.tvgId === '-') {
stream.tvgId = ''
}
})
}
async function selectChannel(stream: Stream): Promise<string> {
const similarChannels = searchChannels(stream.title)
const url = truncate(stream.url, 50)
const selected: ChoiceValue = await select({
message: `Select channel ID for "${stream.title}" (${url}):`,
choices: getChannelChoises(similarChannels),
pageSize: 10
})
switch (selected.type) {
case 'skip':
return '-'
case 'type': {
const typedChannelId = await input({ message: ' Channel ID:' })
if (!typedChannelId) return ''
const selectedFeedId = await selectFeed(typedChannelId)
if (selectedFeedId === '-') return typedChannelId
return [typedChannelId, selectedFeedId].join('@')
}
case 'channel': {
const selectedChannel = selected.value
if (!selectedChannel) return ''
const selectedFeedId = await selectFeed(selectedChannel.id)
if (selectedFeedId === '-') return selectedChannel.id
return [selectedChannel.id, selectedFeedId].join('@')
}
}
return ''
}
async function selectFeed(channelId: string): Promise<string> {
const channelFeeds = new Collection(data.feedsGroupedByChannel.get(channelId))
const choices = getFeedChoises(channelFeeds)
const selected: ChoiceValue = await select({
message: `Select feed ID for "${channelId}":`,
choices,
pageSize: 10
})
switch (selected.type) {
case 'skip':
return '-'
case 'type':
return await input({ message: ' Feed ID:', default: 'SD' })
case 'feed':
const selectedFeed = selected.value
if (!selectedFeed) return ''
return selectedFeed.id
}
return ''
}
function getChannelChoises(channels: Collection<sdk.Models.Channel>): Choice[] {
const choises: Choice[] = []
channels.forEach((channel: sdk.Models.Channel) => {
const names = new Collection([channel.name, ...channel.alt_names]).uniq().join(', ')
choises.push({
value: {
type: 'channel',
value: channel
},
name: `${channel.id} (${names})`,
short: `${channel.id}`
})
})
choises.push({ name: 'Type...', value: { type: 'type' } })
choises.push({ name: 'Skip', value: { type: 'skip' } })
return choises
}
function getFeedChoises(feeds: Collection<sdk.Models.Feed>): Choice[] {
const choises: Choice[] = []
feeds.forEach((feed: sdk.Models.Feed) => {
let name = `${feed.id} (${feed.name})`
if (feed.is_main) name += ' [main]'
choises.push({
value: {
type: 'feed',
value: feed
},
default: feed.is_main,
name,
short: feed.id
})
})
choises.push({ name: 'Type...', value: { type: 'type' } })
choises.push({ name: 'Skip', value: { type: 'skip' } })
return choises
}
function save(filepath: string) {
if (!storage.existsSync(filepath)) return
const playlist = new Playlist(parsedStreams)
storage.saveSync(filepath, playlist.toString())
logger.info(`\nFile '${filepath}' successfully saved`)
}
================================================
FILE: scripts/commands/playlist/export.ts
================================================
import { API_DIR, STREAMS_DIR } from '../../constants'
import { Storage } from '@freearhey/storage-js'
import { PlaylistParser } from '../../core'
import { Logger } from '@freearhey/core'
import { Stream } from '../../models'
import { loadData } from '../../api'
async function main() {
const logger = new Logger()
logger.info('loading data from api...')
await loadData()
logger.info('loading streams...')
const streamsStorage = new Storage(STREAMS_DIR)
const parser = new PlaylistParser({
storage: streamsStorage
})
const files = await streamsStorage.list('**/*.m3u')
const parsed = await parser.parse(files)
const _streams = parsed
.sortBy((stream: Stream) => stream.getId())
.map((stream: Stream) => stream.toObject())
logger.info(`found ${_streams.count()} streams`)
logger.info('saving to .api/streams.json...')
const apiStorage = new Storage(API_DIR)
await apiStorage.save('streams.json', _streams.toJSON())
}
main()
================================================
FILE: scripts/commands/playlist/format.ts
================================================
import { Collection, Logger } from '@freearhey/core'
import { OptionValues, program } from 'commander'
import { Stream, Playlist } from '../../models'
import { Storage } from '@freearhey/storage-js'
import { STREAMS_DIR } from '../../constants'
import { PlaylistParser } from '../../core'
import { getStreamInfo } from '../../utils'
import cliProgress from 'cli-progress'
import { loadData } from '../../api'
import { eachLimit } from 'async'
import path from 'node:path'
import os from 'node:os'
program
.argument('[filepath...]', 'Path to file to format')
.option(
'-p, --parallel <number>',
'Batch size of streams to test concurrently',
(value: string) => parseInt(value),
os.cpus().length
)
.option('-x, --proxy <url>', 'Use the specified proxy')
.option(
'-t, --timeout <number>',
'The number of milliseconds before the request will be aborted',
(value: string) => parseInt(value),
1000
)
.parse(process.argv)
const options: OptionValues = program.opts()
async function main() {
const logger = new Logger()
logger.info('loading data from api...')
await loadData()
logger.info('loading streams...')
const streamsStorage = new Storage(STREAMS_DIR)
const parser = new PlaylistParser({
storage: streamsStorage
})
let files = program.args.length ? program.args : await streamsStorage.list('**/*.m3u')
files = files.map((filepath: string) => path.basename(filepath))
let streams = await parser.parse(files)
logger.info(`found ${streams.count()} streams`)
logger.info('normalizing links...')
streams = streams.map(stream => {
stream.normalizeURL()
return stream
})
logger.info('removing duplicates...')
streams = streams.uniqBy(stream => stream.url)
logger.info('removing wrong id...')
streams = streams.map((stream: Stream) => {
const channel = stream.getChannel()
if (channel) return stream
stream.tvgId = ''
stream.channel = ''
stream.feed = ''
return stream
})
logger.info('adding the missing feed id...')
streams = streams.map((stream: Stream) => {
const feed = stream.getFeed()
if (feed) {
stream.feed = feed.id
stream.tvgId = stream.getId()
}
return stream
})
logger.info('adding the missing quality...')
const progressBar = new cliProgress.SingleBar({
clearOnComplete: true,
format: `[{bar}] {percentage}% | {value}/{total}`
})
progressBar.start(streams.count(), 0)
await eachLimit(streams.all(), options.parallel, async (stream: Stream) => {
progressBar.increment()
if (stream.quality) return
const streamInfo = await getStreamInfo(stream.url, {
httpUserAgent: stream.user_agent,
httpReferrer: stream.referrer,
timeout: options.timeout,
proxy: options.proxy
})
if (streamInfo) {
const height = streamInfo?.resolution?.height
if (height) {
stream.quality = `${height}p`
}
}
})
progressBar.stop()
logger.info('sorting links...')
streams = streams.sortBy(
[
(stream: Stream) => stream.title,
(stream: Stream) => stream.getVerticalResolution(),
(stream: Stream) => stream.label,
(stream: Stream) => stream.url
],
['asc', 'desc', 'asc', 'asc']
)
logger.info('saving...')
const groupedStreams = streams.groupBy((stream: Stream) => stream.getFilepath())
for (const filepath of groupedStreams.keys()) {
const streams = new Collection(groupedStreams.get(filepath))
if (streams.isEmpty()) return
const playlist = new Playlist(streams, { public: false })
await streamsStorage.save(filepath, playlist.toString())
}
}
main()
================================================
FILE: scripts/commands/playlist/generate.ts
================================================
import { LOGS_DIR, STREAMS_DIR } from '../../constants'
import { Storage, File } from '@freearhey/storage-js'
import { PlaylistParser } from '../../core'
import { loadData, data } from '../../api'
import { Logger } from '@freearhey/core'
import uniqueId from 'lodash.uniqueid'
import { Stream } from '../../models'
import {
IndexCategoryGenerator,
IndexLanguageGenerator,
IndexCountryGenerator,
SubdivisionsGenerator,
CategoriesGenerator,
CountriesGenerator,
LanguagesGenerator,
RegionsGenerator,
SourcesGenerator,
CitiesGenerator,
IndexGenerator,
RawGenerator
} from '../../generators'
async function main() {
const logger = new Logger()
const logFile = new File('generators.log')
logger.info('loading data from api...')
await loadData()
logger.info('loading streams...')
const streamsStorage = new Storage(STREAMS_DIR)
const parser = new PlaylistParser({
storage: streamsStorage
})
const files = await streamsStorage.list('**/*.m3u')
let streams = await parser.parse(files)
const totalStreams = streams.count()
logger.info(`found ${totalStreams} streams`)
logger.info('generating raw/...')
await new RawGenerator({ streams, logFile }).generate()
logger.info('sorting streams...')
streams = streams.sortBy(
[
(stream: Stream) => stream.getId(),
(stream: Stream) => stream.getVerticalResolution(),
(stream: Stream) => stream.label
],
['asc', 'desc', 'desc']
)
logger.info('filtering streams...')
streams = streams.uniqBy((stream: Stream) => stream.getId() || uniqueId())
const { categories, countries, subdivisions, cities, regions } = data
logger.info('generating categories/...')
await new CategoriesGenerator({ categories, streams, logFile }).generate()
logger.info('generating languages/...')
await new LanguagesGenerator({ streams, logFile }).generate()
logger.info('generating countries/...')
await new CountriesGenerator({
countries,
streams,
logFile
}).generate()
logger.info('generating subdivisions/...')
await new SubdivisionsGenerator({
subdivisions,
streams,
logFile
}).generate()
logger.info('generating cities/...')
await new CitiesGenerator({
cities,
streams,
logFile
}).generate()
logger.info('generating regions/...')
await new RegionsGenerator({
streams,
regions,
logFile
}).generate()
logger.info('generating sources/...')
await new SourcesGenerator({ streams, logFile }).generate()
logger.info('generating index.m3u...')
await new IndexGenerator({ streams, logFile }).generate()
logger.info('generating index.category.m3u...')
await new IndexCategoryGenerator({ streams, logFile }).generate()
logger.info('generating index.country.m3u...')
await new IndexCountryGenerator({
streams,
logFile
}).generate()
logger.info('generating index.language.m3u...')
await new IndexLanguageGenerator({ streams, logFile }).generate()
logger.info('saving generators.log...')
const logStorage = new Storage(LOGS_DIR)
logStorage.saveFile(logFile)
}
main()
================================================
FILE: scripts/commands/playlist/test.ts
================================================
import { PlaylistParser, StreamTester, CliTable } from '../../core'
import type { StreamTesterResult } from '../../core/streamTester'
import { ROOT_DIR, STREAMS_DIR } from '../../constants'
import { Logger, Collection } from '@freearhey/core'
import { program, OptionValues } from 'commander'
import { Storage } from '@freearhey/storage-js'
import { Playlist, Stream } from '../../models'
import { truncate } from '../../utils'
import { loadData } from '../../api'
import { eachLimit } from 'async'
import dns from 'node:dns'
import chalk from 'chalk'
import os from 'node:os'
const LIVE_UPDATE_INTERVAL = 5000
const LIVE_UPDATE_MAX_STREAMS = 100
let errors = 0
let warnings = 0
let interval: string | number | NodeJS.Timeout | undefined
let streams = new Collection<Stream>()
let isLiveUpdateEnabled = true
const errorStatusCodes = [
'ECONNREFUSED',
'ENOTFOUND',
'ENETUNREACH',
'EPROTO',
'HTTP_404_',
'HTTP_404_NOT_FOUND',
'HTTP_404_UNKNOWN_ERROR',
'HTTP_410_GONE'
]
program
.argument('[filepath...]', 'Path to file to test')
.option(
'-p, --parallel <number>',
'Batch size of streams to test concurrently',
(value: string) => parseInt(value),
os.cpus().length
)
.option('-x, --proxy <url>', 'Use the specified proxy')
.option(
'-t, --timeout <number>',
'The number of milliseconds before the request will be aborted',
(value: string) => parseInt(value),
30000
)
.option('--fix', 'Remove all broken links found from files')
.parse(process.argv)
const options: OptionValues = program.opts()
const logger = new Logger()
const tester = new StreamTester({ options })
const rootStorage = new Storage(ROOT_DIR)
async function main() {
if (await isOffline()) {
logger.error(chalk.red('Internet connection is required for the script to work'))
return
}
logger.info('loading data from api...')
await loadData()
logger.info('loading streams...')
const parser = new PlaylistParser({
storage: rootStorage
})
const files = program.args.length ? program.args : await rootStorage.list(`${STREAMS_DIR}/*.m3u`)
streams = await parser.parse(files)
logger.info(`found ${streams.count()} streams`)
if (streams.count() > LIVE_UPDATE_MAX_STREAMS) isLiveUpdateEnabled = false
logger.info('starting...')
if (!isLiveUpdateEnabled) {
drawTable()
interval = setInterval(() => {
drawTable()
}, LIVE_UPDATE_INTERVAL)
}
eachLimit(
streams.all(),
options.parallel,
async (stream: Stream) => {
await runTest(stream)
if (isLiveUpdateEnabled) {
drawTable()
}
},
onFinish
)
}
main()
async function runTest(stream: Stream) {
stream.statusCode = 'LOADING...'
const result: StreamTesterResult = await tester.test(stream)
stream.statusCode = result.status.code
if (stream.statusCode === 'OK') return
if (errorStatusCodes.includes(stream.statusCode) && !stream.label) {
errors++
} else {
warnings++
}
}
function drawTable() {
process.stdout.write('\u001b[3J\u001b[1J')
console.clear()
const streamsGrouped = streams.groupBy((stream: Stream) => stream.filepath)
for (const filepath of streamsGrouped.keys()) {
const streams: Stream[] = streamsGrouped.get(filepath) || []
const table = new CliTable({
columns: [
{ name: '', alignment: 'center', minLen: 3, maxLen: 3 },
{ name: 'tvg-id', alignment: 'left', color: 'green', minLen: 25, maxLen: 25 },
{ name: 'url', alignment: 'left', color: 'green', minLen: 100, maxLen: 100 },
{ name: 'label', alignment: 'left', color: 'yellow', minLen: 13, maxLen: 13 },
{ name: 'status', alignment: 'left', minLen: 25, maxLen: 25 }
]
})
streams.forEach((stream: Stream, index: number) => {
const tvgId = truncate(stream.getTvgId(), 25)
const url = truncate(stream.url, 100)
const color = getColor(stream)
const label = stream.label || ''
const status = stream.statusCode || 'PENDING'
const row = {
'': index,
'tvg-id': chalk[color](tvgId),
url: chalk[color](url),
label: chalk[color](label),
status: chalk[color](status)
}
table.append(row)
})
process.stdout.write(`\n${chalk.underline(filepath)}\n`)
process.stdout.write(table.toString())
}
}
async function removeBrokenLinks() {
const streamsGrouped = streams.groupBy((stream: Stream) => stream.filepath)
for (const filepath of streamsGrouped.keys()) {
let streams: Collection<Stream> = new Collection(streamsGrouped.get(filepath))
streams = streams.filter((stream: Stream) => !isBroken(stream))
const playlist = new Playlist(streams, { public: false })
await rootStorage.save(filepath, playlist.toString())
}
}
async function onFinish(error: Error | null | undefined) {
clearInterval(interval)
if (error) {
console.error(error)
process.exit(1)
}
if (options.fix) {
await removeBrokenLinks()
}
drawTable()
if (errors > 0 || warnings > 0) {
console.log(
chalk.red(`\n${errors + warnings} problems (${errors} errors, ${warnings} warnings)`)
)
if (errors > 0) {
process.exit(1)
}
}
process.exit(0)
}
async function isOffline() {
return new Promise((resolve, reject) => {
dns.lookup('info.cern.ch', err => {
if (err) resolve(true)
reject(false)
})
}).catch(() => {})
}
function getColor(stream: Stream): string {
if (!stream.statusCode) return 'gray'
if (stream.statusCode === 'LOADING...') return 'white'
if (stream.statusCode === 'OK') return 'green'
if (errorStatusCodes.includes(stream.statusCode) && !stream.label) return 'red'
return 'yellow'
}
function isBroken(stream: Stream): boolean {
if (!stream.statusCode) return false
if (stream.label) return false
if (!errorStatusCodes.includes(stream.statusCode)) return false
return true
}
================================================
FILE: scripts/commands/playlist/update.ts
================================================
import { IssueLoader, PlaylistParser } from '../../core'
import { Playlist, Issue, Stream } from '../../models'
import { loadData, data as apiData } from '../../api'
import { Logger, Collection } from '@freearhey/core'
import { isURI, getStreamInfo } from '../../utils'
import { Storage } from '@freearhey/storage-js'
import { STREAMS_DIR } from '../../constants'
import * as sdk from '@iptv-org/sdk'
const processedIssues = new Collection()
async function main() {
const logger = new Logger({ level: -999 })
const issueLoader = new IssueLoader()
logger.info('loading issues...')
const issues = await issueLoader.load()
logger.info('loading data from api...')
await loadData()
logger.info('loading streams...')
const streamsStorage = new Storage(STREAMS_DIR)
const parser = new PlaylistParser({
storage: streamsStorage
})
const files = await streamsStorage.list(
gitextract_akwh5u4h/ ├── .github/ │ ├── CODE_OF_CONDUCT.md │ ├── FUNDING.yml │ ├── ISSUE_TEMPLATE/ │ │ ├── 1_streams_add.yml │ │ ├── 2_streams_edit.yml │ │ ├── 3_streams_report.yml │ │ ├── 4_channel-search.yml │ │ ├── 5_bug-report.yml │ │ ├── 6_copyright-claim.yml │ │ └── config.yml │ └── workflows/ │ ├── check.yml │ ├── format.yml │ ├── stale.yml │ └── update.yml ├── .gitignore ├── .prettierrc ├── .readme/ │ ├── .gitignore │ └── template.md ├── CONTRIBUTING.md ├── FAQ.md ├── LICENSE ├── PLAYLISTS.md ├── README.md ├── eslint.config.mjs ├── m3u-linter.json ├── package.json ├── scripts/ │ ├── api.ts │ ├── commands/ │ │ ├── api/ │ │ │ └── load.ts │ │ ├── playlist/ │ │ │ ├── edit.ts │ │ │ ├── export.ts │ │ │ ├── format.ts │ │ │ ├── generate.ts │ │ │ ├── test.ts │ │ │ ├── update.ts │ │ │ └── validate.ts │ │ ├── readme/ │ │ │ └── update.ts │ │ └── report/ │ │ └── create.ts │ ├── constants.ts │ ├── core/ │ │ ├── cliTable.ts │ │ ├── htmlTable.ts │ │ ├── index.ts │ │ ├── issueData.ts │ │ ├── issueLoader.ts │ │ ├── issueParser.ts │ │ ├── logParser.ts │ │ ├── markdown.ts │ │ ├── numberParser.ts │ │ ├── playlistParser.ts │ │ ├── proxyParser.ts │ │ └── streamTester.ts │ ├── generators/ │ │ ├── categoriesGenerator.ts │ │ ├── citiesGenerator.ts │ │ ├── countriesGenerator.ts │ │ ├── generator.ts │ │ ├── index.ts │ │ ├── indexCategoryGenerator.ts │ │ ├── indexCountryGenerator.ts │ │ ├── indexGenerator.ts │ │ ├── indexLanguageGenerator.ts │ │ ├── languagesGenerator.ts │ │ ├── rawGenerator.ts │ │ ├── regionsGenerator.ts │ │ ├── sourcesGenerator.ts │ │ └── subdivisionsGenerator.ts │ ├── models/ │ │ ├── index.ts │ │ ├── issue.ts │ │ ├── playlist.ts │ │ └── stream.ts │ ├── tables/ │ │ ├── categoriesTable.ts │ │ ├── countriesTable.ts │ │ ├── index.ts │ │ ├── languagesTable.ts │ │ ├── regionsTable.ts │ │ └── table.ts │ └── utils.ts ├── streams/ │ ├── ad.m3u │ ├── ae.m3u │ ├── af.m3u │ ├── ag.m3u │ ├── al.m3u │ ├── am.m3u │ ├── ao.m3u │ ├── ar.m3u │ ├── at.m3u │ ├── at_pluto.m3u │ ├── at_samsung.m3u │ ├── au.m3u │ ├── au_samsung.m3u │ ├── aw.m3u │ ├── az.m3u │ ├── ba.m3u │ ├── ba_morescreens.m3u │ ├── bb.m3u │ ├── bd.m3u │ ├── be.m3u │ ├── be_samsung.m3u │ ├── bf.m3u │ ├── bg.m3u │ ├── bh.m3u │ ├── bi.m3u │ ├── bj.m3u │ ├── bm.m3u │ ├── bn.m3u │ ├── bo.m3u │ ├── bq.m3u │ ├── br.m3u │ ├── br_pluto.m3u │ ├── br_samsung.m3u │ ├── bs.m3u │ ├── bw.m3u │ ├── by.m3u │ ├── bz.m3u │ ├── bz_nexgen.m3u │ ├── ca.m3u │ ├── ca_pluto.m3u │ ├── ca_samsung.m3u │ ├── ca_stingray.m3u │ ├── cd.m3u │ ├── cf.m3u │ ├── cg.m3u │ ├── ch.m3u │ ├── ch_netplus.m3u │ ├── ch_pluto.m3u │ ├── ch_samsung.m3u │ ├── ci.m3u │ ├── cl.m3u │ ├── cm.m3u │ ├── cn.m3u │ ├── cn_112114.m3u │ ├── cn_cctv.m3u │ ├── cn_cgtn.m3u │ ├── cn_yeslivetv.m3u │ ├── co.m3u │ ├── cr.m3u │ ├── cu.m3u │ ├── cv.m3u │ ├── cw.m3u │ ├── cy.m3u │ ├── cz.m3u │ ├── de.m3u │ ├── de_pluto.m3u │ ├── de_rakuten.m3u │ ├── de_samsung.m3u │ ├── dj.m3u │ ├── dk.m3u │ ├── dk_pluto.m3u │ ├── dk_samsung.m3u │ ├── dm.m3u │ ├── do.m3u │ ├── dz.m3u │ ├── ec.m3u │ ├── ee.m3u │ ├── eg.m3u │ ├── eh.m3u │ ├── er.m3u │ ├── es.m3u │ ├── es_pluto.m3u │ ├── es_rakuten.m3u │ ├── es_samsung.m3u │ ├── es_yowi.m3u │ ├── et.m3u │ ├── fi.m3u │ ├── fi_rakuten.m3u │ ├── fi_samsung.m3u │ ├── fj.m3u │ ├── fm.m3u │ ├── fo.m3u │ ├── fr.m3u │ ├── fr_bfm.m3u │ ├── fr_fashiontv.m3u │ ├── fr_groupecanalplus.m3u │ ├── fr_groupem6.m3u │ ├── fr_persiana.m3u │ ├── fr_pluto.m3u │ ├── fr_rakuten.m3u │ ├── fr_samsung.m3u │ ├── ga.m3u │ ├── ge.m3u │ ├── gf.m3u │ ├── gh.m3u │ ├── gl.m3u │ ├── gm.m3u │ ├── gn.m3u │ ├── gp.m3u │ ├── gq.m3u │ ├── gr.m3u │ ├── gt.m3u │ ├── gu.m3u │ ├── gy.m3u │ ├── hk.m3u │ ├── hn.m3u │ ├── hr.m3u │ ├── ht.m3u │ ├── hu.m3u │ ├── id.m3u │ ├── id_denstv.m3u │ ├── ie.m3u │ ├── ie_samsung.m3u │ ├── il.m3u │ ├── in.m3u │ ├── in_distro.m3u │ ├── in_doordarshan.m3u │ ├── in_pishow.m3u │ ├── in_samsung.m3u │ ├── in_tango.m3u │ ├── iq.m3u │ ├── ir.m3u │ ├── ir_telewebion.m3u │ ├── ir_wnslive.m3u │ ├── is.m3u │ ├── it.m3u │ ├── it_pluto.m3u │ ├── it_rakuten.m3u │ ├── it_samsung.m3u │ ├── jm.m3u │ ├── jo.m3u │ ├── jp.m3u │ ├── jp_primehome.m3u │ ├── ke.m3u │ ├── kg.m3u │ ├── kh.m3u │ ├── kh_happywatch99.m3u │ ├── km.m3u │ ├── kn.m3u │ ├── kp.m3u │ ├── kr.m3u │ ├── kw.m3u │ ├── kz.m3u │ ├── la.m3u │ ├── lb.m3u │ ├── lc.m3u │ ├── li.m3u │ ├── lk.m3u │ ├── lr.m3u │ ├── lt.m3u │ ├── lu.m3u │ ├── lu_samsung.m3u │ ├── lv.m3u │ ├── ly.m3u │ ├── ma.m3u │ ├── mc.m3u │ ├── md.m3u │ ├── me.m3u │ ├── mg.m3u │ ├── mk.m3u │ ├── ml.m3u │ ├── mm.m3u │ ├── mn.m3u │ ├── mn_skygo.m3u │ ├── mo.m3u │ ├── mq.m3u │ ├── mr.m3u │ ├── mt.m3u │ ├── mt_smashplus.m3u │ ├── mu.m3u │ ├── mv.m3u │ ├── mw.m3u │ ├── mx.m3u │ ├── mx_amagi.m3u │ ├── mx_multimedios.m3u │ ├── mx_pluto.m3u │ ├── mx_samsung.m3u │ ├── my.m3u │ ├── mz.m3u │ ├── na.m3u │ ├── ne.m3u │ ├── ng.m3u │ ├── ni.m3u │ ├── nl.m3u │ ├── nl_samsung.m3u │ ├── no.m3u │ ├── no_pluto.m3u │ ├── no_samsung.m3u │ ├── np.m3u │ ├── nz.m3u │ ├── nz_samsung.m3u │ ├── om.m3u │ ├── pa.m3u │ ├── pe.m3u │ ├── pe_opencaster.m3u │ ├── pf.m3u │ ├── pg.m3u │ ├── ph.m3u │ ├── ph_comclark.m3u │ ├── pk.m3u │ ├── pl.m3u │ ├── pl_mediateka.m3u │ ├── pl_rakuten.m3u │ ├── pr.m3u │ ├── ps.m3u │ ├── pt.m3u │ ├── pt_samsung.m3u │ ├── py.m3u │ ├── qa.m3u │ ├── ro.m3u │ ├── rs.m3u │ ├── ru.m3u │ ├── ru_15plusmg.m3u │ ├── ru_bonustv.m3u │ ├── ru_catcast.m3u │ ├── ru_mylifeisgood.m3u │ ├── ru_ntv.m3u │ ├── ru_rt.m3u │ ├── ru_smotrim.m3u │ ├── ru_televizor24.m3u │ ├── ru_tvbricks.m3u │ ├── ru_tvteleport.m3u │ ├── ru_zabava.m3u │ ├── rw.m3u │ ├── sa.m3u │ ├── sd.m3u │ ├── se.m3u │ ├── se_pluto.m3u │ ├── se_samsung.m3u │ ├── sg.m3u │ ├── si.m3u │ ├── si_xploretv.m3u │ ├── sk.m3u │ ├── sk_antik.m3u │ ├── sl.m3u │ ├── sm.m3u │ ├── sn.m3u │ ├── so.m3u │ ├── so_premiumfree.m3u │ ├── sr.m3u │ ├── st.m3u │ ├── sv.m3u │ ├── sx.m3u │ ├── sy.m3u │ ├── td.m3u │ ├── tg.m3u │ ├── th.m3u │ ├── th_v2hcdn.m3u │ ├── tj.m3u │ ├── tl.m3u │ ├── tm.m3u │ ├── tn.m3u │ ├── tr.m3u │ ├── tr_gem.m3u │ ├── tr_onetv.m3u │ ├── tt.m3u │ ├── tw.m3u │ ├── tz.m3u │ ├── ua.m3u │ ├── ug.m3u │ ├── uk.m3u │ ├── uk_bbc.m3u │ ├── uk_distro.m3u │ ├── uk_pluto.m3u │ ├── uk_rakuten.m3u │ ├── uk_samsung.m3u │ ├── uk_sportstribal.m3u │ ├── us.m3u │ ├── us_30a.m3u │ ├── us_3abn.m3u │ ├── us_abcnews.m3u │ ├── us_amagi.m3u │ ├── us_canelatv.m3u │ ├── us_cbsn.m3u │ ├── us_cineversetv.m3u │ ├── us_distro.m3u │ ├── us_firetv.m3u │ ├── us_frequency.m3u │ ├── us_glewedtv.m3u │ ├── us_klowdtv.m3u │ ├── us_local.m3u │ ├── us_malimartv.m3u │ ├── us_pbs.m3u │ ├── us_plex.m3u │ ├── us_pluto.m3u │ ├── us_roku.m3u │ ├── us_samsung.m3u │ ├── us_sofast.m3u │ ├── us_ssh101.m3u │ ├── us_stirr.m3u │ ├── us_tcl.m3u │ ├── us_tubi.m3u │ ├── us_tvpass.m3u │ ├── us_uplynk.m3u │ ├── us_vegasplus.m3u │ ├── us_vizio.m3u │ ├── us_wfmz.m3u │ ├── us_wowza.m3u │ ├── us_xumo.m3u │ ├── uy.m3u │ ├── uz.m3u │ ├── va.m3u │ ├── ve.m3u │ ├── vg.m3u │ ├── vi.m3u │ ├── vn.m3u │ ├── ws.m3u │ ├── xk.m3u │ ├── ye.m3u │ ├── yt.m3u │ ├── za.m3u │ ├── za_freevisiontv.m3u │ ├── zm.m3u │ └── zw.m3u ├── tests/ │ ├── __data__/ │ │ ├── .gitignore │ │ ├── expected/ │ │ │ ├── playlist_export/ │ │ │ │ └── .api/ │ │ │ │ └── streams.json │ │ │ ├── playlist_format/ │ │ │ │ ├── at.m3u │ │ │ │ ├── in.m3u │ │ │ │ └── nl.m3u │ │ │ ├── playlist_generate/ │ │ │ │ ├── .gh-pages/ │ │ │ │ │ ├── categories/ │ │ │ │ │ │ ├── general.m3u │ │ │ │ │ │ ├── legislative.m3u │ │ │ │ │ │ ├── news.m3u │ │ │ │ │ │ ├── undefined.m3u │ │ │ │ │ │ ├── weather.m3u │ │ │ │ │ │ └── xxx.m3u │ │ │ │ │ ├── cities/ │ │ │ │ │ │ └── adcan.m3u │ │ │ │ │ ├── countries/ │ │ │ │ │ │ ├── ad.m3u │ │ │ │ │ │ ├── ca.m3u │ │ │ │ │ │ ├── int.m3u │ │ │ │ │ │ ├── ru.m3u │ │ │ │ │ │ └── undefined.m3u │ │ │ │ │ ├── index.category.m3u │ │ │ │ │ ├── index.country.m3u │ │ │ │ │ ├── index.language.m3u │ │ │ │ │ ├── index.m3u │ │ │ │ │ ├── languages/ │ │ │ │ │ │ ├── cat.m3u │ │ │ │ │ │ ├── eng.m3u │ │ │ │ │ │ ├── rus.m3u │ │ │ │ │ │ └── undefined.m3u │ │ │ │ │ ├── raw/ │ │ │ │ │ │ ├── ad.m3u │ │ │ │ │ │ ├── ca.m3u │ │ │ │ │ │ ├── in.m3u │ │ │ │ │ │ ├── kg.m3u │ │ │ │ │ │ ├── uk.m3u │ │ │ │ │ │ └── unsorted.m3u │ │ │ │ │ ├── regions/ │ │ │ │ │ │ ├── afr.m3u │ │ │ │ │ │ ├── amer.m3u │ │ │ │ │ │ ├── apac.m3u │ │ │ │ │ │ ├── arab.m3u │ │ │ │ │ │ ├── asean.m3u │ │ │ │ │ │ ├── asia.m3u │ │ │ │ │ │ ├── carib.m3u │ │ │ │ │ │ ├── cas.m3u │ │ │ │ │ │ ├── cenamer.m3u │ │ │ │ │ │ ├── cis.m3u │ │ │ │ │ │ ├── emea.m3u │ │ │ │ │ │ ├── eur.m3u │ │ │ │ │ │ ├── hispam.m3u │ │ │ │ │ │ ├── lac.m3u │ │ │ │ │ │ ├── latam.m3u │ │ │ │ │ │ ├── maghreb.m3u │ │ │ │ │ │ ├── mena.m3u │ │ │ │ │ │ ├── mideast.m3u │ │ │ │ │ │ ├── nam.m3u │ │ │ │ │ │ ├── noram.m3u │ │ │ │ │ │ ├── nord.m3u │ │ │ │ │ │ ├── oce.m3u │ │ │ │ │ │ ├── sas.m3u │ │ │ │ │ │ ├── southam.m3u │ │ │ │ │ │ ├── ssa.m3u │ │ │ │ │ │ ├── wafr.m3u │ │ │ │ │ │ └── ww.m3u │ │ │ │ │ ├── sources/ │ │ │ │ │ │ ├── ad.m3u │ │ │ │ │ │ ├── ca.m3u │ │ │ │ │ │ ├── in.m3u │ │ │ │ │ │ ├── kg.m3u │ │ │ │ │ │ ├── uk.m3u │ │ │ │ │ │ └── unsorted.m3u │ │ │ │ │ └── subdivisions/ │ │ │ │ │ ├── ad-02.m3u │ │ │ │ │ ├── ad-07.m3u │ │ │ │ │ └── ca-on.m3u │ │ │ │ └── logs/ │ │ │ │ └── generators.log │ │ │ ├── playlist_test/ │ │ │ │ ├── af.m3u │ │ │ │ └── ag.m3u │ │ │ ├── playlist_update/ │ │ │ │ ├── br_example.m3u │ │ │ │ ├── bz.m3u │ │ │ │ ├── cy.m3u │ │ │ │ ├── fr.m3u │ │ │ │ ├── uk.m3u │ │ │ │ └── us.m3u │ │ │ └── readme_update/ │ │ │ └── playlists.md │ │ └── input/ │ │ ├── data/ │ │ │ ├── blocklist.json │ │ │ ├── categories.json │ │ │ ├── channels.json │ │ │ ├── cities.json │ │ │ ├── countries.json │ │ │ ├── feeds.json │ │ │ ├── guides.json │ │ │ ├── languages.json │ │ │ ├── logos.json │ │ │ ├── regions.json │ │ │ ├── streams.json │ │ │ ├── subdivisions.json │ │ │ └── timezones.json │ │ ├── issues.js │ │ ├── playlist_edit/ │ │ │ └── playlist.m3u │ │ ├── playlist_export/ │ │ │ ├── ad.m3u │ │ │ ├── ca.m3u │ │ │ ├── in.m3u │ │ │ ├── uk.m3u │ │ │ └── unsorted.m3u │ │ ├── playlist_format/ │ │ │ ├── at.m3u │ │ │ ├── in.m3u │ │ │ └── nl.m3u │ │ ├── playlist_generate/ │ │ │ ├── ad.m3u │ │ │ ├── ca.m3u │ │ │ ├── id_denstv.m3u │ │ │ ├── in.m3u │ │ │ ├── kg.m3u │ │ │ ├── qa.m3u │ │ │ ├── uk.m3u │ │ │ └── unsorted.m3u │ │ ├── playlist_test/ │ │ │ ├── results.js │ │ │ └── streams/ │ │ │ ├── af.m3u │ │ │ └── ag.m3u │ │ ├── playlist_update/ │ │ │ ├── manifest.mpd │ │ │ ├── playlist.m3u8 │ │ │ └── streams/ │ │ │ ├── br.m3u │ │ │ ├── br_example.m3u │ │ │ ├── bz.m3u │ │ │ ├── cy.m3u │ │ │ └── uk.m3u │ │ ├── playlist_validate/ │ │ │ ├── invalid_url.m3u │ │ │ ├── us_blocked.m3u │ │ │ └── wrong_id.m3u │ │ ├── readme_update/ │ │ │ └── generators.log │ │ └── report_create/ │ │ ├── br.m3u │ │ ├── cy.m3u │ │ ├── uk.m3u │ │ └── us.m3u │ └── commands/ │ ├── playlist/ │ │ ├── edit.test.ts │ │ ├── export.test.ts │ │ ├── format.test.ts │ │ ├── generate.test.ts │ │ ├── test.test.ts │ │ ├── update.test.ts │ │ └── validate.test.ts │ ├── readme/ │ │ └── update.test.ts │ └── report/ │ └── create.test.ts └── tsconfig.json
SYMBOL INDEX (208 symbols across 54 files)
FILE: scripts/api.ts
function loadData (line 26) | async function loadData() {
function downloadData (line 67) | async function downloadData() {
function searchChannels (line 135) | function searchChannels(query: string): Collection<sdk.Models.Channel> {
FILE: scripts/commands/api/load.ts
function main (line 3) | async function main() {
FILE: scripts/commands/playlist/edit.ts
type ChoiceValue (line 13) | type ChoiceValue = { type: string; value?: sdk.Models.Feed | sdk.Models....
type Choice (line 14) | type Choice = { name: string; short?: string; value: ChoiceValue; defaul...
function main (line 41) | async function main(filepath: string) {
function selectChannel (line 78) | async function selectChannel(stream: Stream): Promise<string> {
function selectFeed (line 110) | async function selectFeed(channelId: string): Promise<string> {
function getChannelChoises (line 134) | function getChannelChoises(channels: Collection<sdk.Models.Channel>): Ch...
function getFeedChoises (line 156) | function getFeedChoises(feeds: Collection<sdk.Models.Feed>): Choice[] {
function save (line 180) | function save(filepath: string) {
FILE: scripts/commands/playlist/export.ts
function main (line 8) | async function main() {
FILE: scripts/commands/playlist/format.ts
function main (line 33) | async function main() {
FILE: scripts/commands/playlist/generate.ts
function main (line 23) | async function main() {
FILE: scripts/commands/playlist/test.ts
constant LIVE_UPDATE_INTERVAL (line 15) | const LIVE_UPDATE_INTERVAL = 5000
constant LIVE_UPDATE_MAX_STREAMS (line 16) | const LIVE_UPDATE_MAX_STREAMS = 100
function main (line 58) | async function main() {
function runTest (line 101) | async function runTest(stream: Stream) {
function drawTable (line 114) | function drawTable() {
function removeBrokenLinks (line 155) | async function removeBrokenLinks() {
function onFinish (line 167) | async function onFinish(error: Error | null | undefined) {
function isOffline (line 194) | async function isOffline() {
function getColor (line 203) | function getColor(stream: Stream): string {
function isBroken (line 212) | function isBroken(stream: Stream): boolean {
FILE: scripts/commands/playlist/update.ts
function main (line 12) | async function main() {
function removeStreams (line 61) | async function removeStreams({
function editStreams (line 94) | async function editStreams({
function addStreams (line 129) | async function addStreams({
FILE: scripts/commands/playlist/validate.ts
type LogItem (line 14) | type LogItem = {
function main (line 20) | async function main() {
FILE: scripts/commands/readme/update.ts
function main (line 7) | async function main() {
FILE: scripts/commands/report/create.ts
function main (line 23) | async function main() {
FILE: scripts/constants.ts
constant ROOT_DIR (line 1) | const ROOT_DIR = process.env.ROOT_DIR || './'
constant STREAMS_DIR (line 2) | const STREAMS_DIR = process.env.STREAMS_DIR || './streams'
constant PUBLIC_DIR (line 3) | const PUBLIC_DIR = process.env.PUBLIC_DIR || './.gh-pages'
constant README_DIR (line 4) | const README_DIR = process.env.README_DIR || './.readme'
constant API_DIR (line 5) | const API_DIR = process.env.API_DIR || './.api'
constant DATA_DIR (line 6) | const DATA_DIR = process.env.DATA_DIR || './temp/data'
constant LOGS_DIR (line 7) | const LOGS_DIR = process.env.LOGS_DIR || './temp/logs'
constant TESTING (line 8) | const TESTING = process.env.NODE_ENV === 'test' ? true : false
constant OWNER (line 9) | const OWNER = 'iptv-org'
constant REPO (line 10) | const REPO = 'iptv'
constant EOL (line 11) | const EOL = '\r\n'
FILE: scripts/core/cliTable.ts
class CliTable (line 4) | class CliTable {
method constructor (line 7) | constructor(options?: ComplexOptions | string[]) {
method append (line 11) | append(row) {
method render (line 15) | render() {
method toString (line 19) | toString() {
FILE: scripts/core/htmlTable.ts
type HTMLTableColumn (line 3) | type HTMLTableColumn = {
type HTMLTableItem (line 9) | type HTMLTableItem = string[]
class HTMLTable (line 11) | class HTMLTable {
method constructor (line 15) | constructor(data: Collection<HTMLTableItem>, columns: Collection<HTMLT...
method toString (line 20) | toString() {
FILE: scripts/core/issueData.ts
class IssueData (line 3) | class IssueData {
method constructor (line 5) | constructor(data: Dictionary<string>) {
method has (line 9) | has(key: string): boolean {
method missing (line 13) | missing(key: string): boolean {
method getBoolean (line 17) | getBoolean(key: string): boolean {
method getString (line 21) | getString(key: string): string | undefined {
method getArray (line 27) | getArray(key: string): string[] | undefined {
FILE: scripts/core/issueLoader.ts
class IssueLoader (line 11) | class IssueLoader {
method load (line 12) | async load(props?: { labels: string | string[] }) {
FILE: scripts/core/issueParser.ts
constant FIELDS (line 5) | const FIELDS = new Dictionary({
class IssueParser (line 20) | class IssueParser {
method parse (line 21) | parse(issue: { number: number; body: string; labels: { name: string }[...
FILE: scripts/core/logParser.ts
type LogItem (line 1) | type LogItem = {
class LogParser (line 7) | class LogParser {
method parse (line 8) | parse(content: string): LogItem[] {
FILE: scripts/core/markdown.ts
type MarkdownConfig (line 4) | type MarkdownConfig = {
class Markdown (line 9) | class Markdown {
method constructor (line 13) | constructor(config: MarkdownConfig) {
method compile (line 18) | compile() {
method processIncludes (line 31) | private processIncludes(template: string, baseDir: string): string {
FILE: scripts/core/numberParser.ts
class NumberParser (line 1) | class NumberParser {
method parse (line 2) | async parse(number: string) {
FILE: scripts/core/playlistParser.ts
type PlaylistPareserProps (line 6) | type PlaylistPareserProps = {
class PlaylistParser (line 10) | class PlaylistParser {
method constructor (line 13) | constructor({ storage }: PlaylistPareserProps) {
method parse (line 17) | async parse(files: string[]): Promise<Collection<Stream>> {
method parseFile (line 31) | async parseFile(filepath: string): Promise<Collection<Stream>> {
FILE: scripts/core/proxyParser.ts
type ProxyParserResult (line 3) | interface ProxyParserResult {
class ProxyParser (line 13) | class ProxyParser {
method parse (line 14) | parse(_url: string): ProxyParserResult {
FILE: scripts/core/streamTester.ts
type StreamTesterResult (line 9) | type StreamTesterResult = {
type StreamTesterError (line 16) | type StreamTesterError = {
type StreamTesterProps (line 23) | type StreamTesterProps = {
class StreamTester (line 27) | class StreamTester {
method constructor (line 31) | constructor({ options }: StreamTesterProps) {
method test (line 56) | async test(stream: Stream): Promise<StreamTesterResult> {
FILE: scripts/generators/categoriesGenerator.ts
type CategoriesGeneratorProps (line 8) | type CategoriesGeneratorProps = {
class CategoriesGenerator (line 14) | class CategoriesGenerator implements Generator {
method constructor (line 20) | constructor({ streams, categories, logFile }: CategoriesGeneratorProps) {
method generate (line 27) | async generate() {
FILE: scripts/generators/citiesGenerator.ts
type CitiesGeneratorProps (line 8) | type CitiesGeneratorProps = {
class CitiesGenerator (line 14) | class CitiesGenerator implements Generator {
method constructor (line 20) | constructor({ streams, cities, logFile }: CitiesGeneratorProps) {
method generate (line 27) | async generate(): Promise<void> {
FILE: scripts/generators/countriesGenerator.ts
type CountriesGeneratorProps (line 8) | type CountriesGeneratorProps = {
class CountriesGenerator (line 14) | class CountriesGenerator implements Generator {
method constructor (line 20) | constructor({ streams, countries, logFile }: CountriesGeneratorProps) {
method generate (line 27) | async generate(): Promise<void> {
FILE: scripts/generators/generator.ts
type Generator (line 1) | interface Generator {
FILE: scripts/generators/indexCategoryGenerator.ts
type IndexCategoryGeneratorProps (line 8) | type IndexCategoryGeneratorProps = {
class IndexCategoryGenerator (line 13) | class IndexCategoryGenerator implements Generator {
method constructor (line 18) | constructor({ streams, logFile }: IndexCategoryGeneratorProps) {
method generate (line 24) | async generate(): Promise<void> {
FILE: scripts/generators/indexCountryGenerator.ts
type IndexCountryGeneratorProps (line 8) | type IndexCountryGeneratorProps = {
class IndexCountryGenerator (line 13) | class IndexCountryGenerator implements Generator {
method constructor (line 18) | constructor({ streams, logFile }: IndexCountryGeneratorProps) {
method generate (line 24) | async generate(): Promise<void> {
FILE: scripts/generators/indexGenerator.ts
type IndexGeneratorProps (line 7) | type IndexGeneratorProps = {
class IndexGenerator (line 12) | class IndexGenerator implements Generator {
method constructor (line 17) | constructor({ streams, logFile }: IndexGeneratorProps) {
method generate (line 23) | async generate(): Promise<void> {
FILE: scripts/generators/indexLanguageGenerator.ts
type IndexLanguageGeneratorProps (line 8) | type IndexLanguageGeneratorProps = {
class IndexLanguageGenerator (line 13) | class IndexLanguageGenerator implements Generator {
method constructor (line 18) | constructor({ streams, logFile }: IndexLanguageGeneratorProps) {
method generate (line 24) | async generate(): Promise<void> {
FILE: scripts/generators/languagesGenerator.ts
type LanguagesGeneratorProps (line 8) | type LanguagesGeneratorProps = { streams: Collection<Stream>; logFile: F...
class LanguagesGenerator (line 10) | class LanguagesGenerator implements Generator {
method constructor (line 15) | constructor({ streams, logFile }: LanguagesGeneratorProps) {
method generate (line 21) | async generate(): Promise<void> {
FILE: scripts/generators/rawGenerator.ts
type RawGeneratorProps (line 7) | type RawGeneratorProps = {
class RawGenerator (line 12) | class RawGenerator implements Generator {
method constructor (line 17) | constructor({ streams, logFile }: RawGeneratorProps) {
method generate (line 23) | async generate() {
FILE: scripts/generators/regionsGenerator.ts
type RegionsGeneratorProps (line 8) | type RegionsGeneratorProps = {
class RegionsGenerator (line 14) | class RegionsGenerator implements Generator {
method constructor (line 20) | constructor({ streams, regions, logFile }: RegionsGeneratorProps) {
method generate (line 27) | async generate(): Promise<void> {
FILE: scripts/generators/sourcesGenerator.ts
type SourcesGeneratorProps (line 7) | type SourcesGeneratorProps = {
class SourcesGenerator (line 12) | class SourcesGenerator implements Generator {
method constructor (line 17) | constructor({ streams, logFile }: SourcesGeneratorProps) {
method generate (line 23) | async generate() {
FILE: scripts/generators/subdivisionsGenerator.ts
type SubdivisionsGeneratorProps (line 8) | type SubdivisionsGeneratorProps = {
class SubdivisionsGenerator (line 14) | class SubdivisionsGenerator implements Generator {
method constructor (line 20) | constructor({ streams, subdivisions, logFile }: SubdivisionsGeneratorP...
method generate (line 27) | async generate(): Promise<void> {
FILE: scripts/models/issue.ts
type IssueProps (line 3) | type IssueProps = {
class Issue (line 9) | class Issue {
method constructor (line 14) | constructor({ number, labels, data }: IssueProps) {
FILE: scripts/models/playlist.ts
type PlaylistOptions (line 4) | type PlaylistOptions = {
class Playlist (line 8) | class Playlist {
method constructor (line 14) | constructor(streams: Collection<Stream>, options?: PlaylistOptions) {
method toString (line 19) | toString() {
FILE: scripts/models/stream.ts
class Stream (line 9) | class Stream extends sdk.Models.Stream {
method updateWithIssue (line 18) | updateWithIssue(issueData: IssueData): this {
method fromPlaylistItem (line 34) | static fromPlaylistItem(data: parser.PlaylistItem): Stream {
method isSFW (line 76) | isSFW(): boolean {
method getUniqKey (line 84) | getUniqKey(): string {
method getVerticalResolution (line 91) | getVerticalResolution(): number {
method getBroadcastCountries (line 99) | getBroadcastCountries(): Collection<sdk.Models.Country> {
method getBroadcastSubdivisions (line 135) | getBroadcastSubdivisions(): Collection<sdk.Models.Subdivision> {
method getBroadcastCities (line 174) | getBroadcastCities(): Collection<sdk.Models.City> {
method getBroadcastRegions (line 194) | getBroadcastRegions(): Collection<sdk.Models.Region> {
method isInternational (line 265) | isInternational(): boolean {
method hasCategory (line 276) | hasCategory(category: sdk.Models.Category): boolean {
method hasLanguage (line 286) | hasLanguage(language: sdk.Models.Language): boolean {
method updateTvgId (line 294) | updateTvgId(): this {
method updateFilepath (line 305) | updateFilepath(): this {
method updateTitle (line 316) | updateTitle(): this {
method normalizeURL (line 331) | normalizeURL() {
method getLogos (line 335) | getLogos(): Collection<sdk.Models.Logo> {
method getFilepath (line 353) | getFilepath(): string {
method getFilename (line 357) | getFilename(): string {
method getLine (line 361) | getLine(): number {
method getTvgId (line 365) | getTvgId(): string {
method getTvgLogo (line 371) | getTvgLogo(): string {
method getFullTitle (line 377) | getFullTitle(): string {
method toString (line 391) | toString(options: { public?: boolean } = {}) {
method toObject (line 425) | toObject(): sdk.Types.StreamData {
method clone (line 444) | clone(): Stream {
FILE: scripts/tables/categoriesTable.ts
class CategoriesTable (line 9) | class CategoriesTable implements Table {
method create (line 10) | async create() {
FILE: scripts/tables/countriesTable.ts
type ListItem (line 9) | type ListItem = {
class CountriesTable (line 17) | class CountriesTable implements Table {
method create (line 18) | async create() {
FILE: scripts/tables/languagesTable.ts
class LanguagesTable (line 9) | class LanguagesTable implements Table {
method create (line 10) | async create() {
FILE: scripts/tables/regionsTable.ts
type ListItem (line 9) | type ListItem = {
class RegionsTable (line 15) | class RegionsTable implements Table {
method create (line 16) | async create() {
FILE: scripts/tables/table.ts
type Table (line 1) | interface Table {
FILE: scripts/utils.ts
function isURI (line 12) | function isURI(string: string): boolean {
function normalizeURL (line 21) | function normalizeURL(url: string): string {
function truncate (line 27) | function truncate(string: string, limit: number = 100) {
type StreamInfo (line 34) | type StreamInfo = {
function getStreamInfo (line 41) | async function getStreamInfo(
FILE: tests/commands/playlist/edit.test.ts
type ExecError (line 4) | type ExecError = {
constant ENV_VAR (line 9) | const ENV_VAR = 'cross-env DATA_DIR=tests/__data__/input/data'
function checkStdout (line 34) | function checkStdout(stdout: string) {
FILE: tests/commands/playlist/export.test.ts
constant ENV_VAR (line 5) | const ENV_VAR =
function content (line 24) | function content(filepath: string) {
FILE: tests/commands/playlist/format.test.ts
constant ENV_VAR (line 6) | const ENV_VAR =
function content (line 35) | function content(filepath: string) {
FILE: tests/commands/playlist/generate.test.ts
constant ENV_VAR (line 7) | const ENV_VAR =
function content (line 41) | function content(filepath: string) {
FILE: tests/commands/playlist/test.test.ts
type ExecError (line 9) | type ExecError = {
constant ENV_VAR (line 14) | const ENV_VAR = 'cross-env DATA_DIR=tests/__data__/input/data ROOT_DIR=t...
function content (line 60) | function content(filepath: string) {
FILE: tests/commands/playlist/update.test.ts
constant ENV_VAR (line 6) | const ENV_VAR =
function content (line 47) | function content(filepath: string) {
FILE: tests/commands/playlist/validate.test.ts
type ExecError (line 3) | type ExecError = {
constant ENV_VAR (line 8) | const ENV_VAR =
FILE: tests/commands/readme/update.test.ts
constant ENV_VAR (line 5) | const ENV_VAR =
function content (line 24) | function content(filepath: string) {
FILE: tests/commands/report/create.test.ts
constant ENV_VAR (line 3) | const ENV_VAR =
Condensed preview — 534 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (3,239K chars).
[
{
"path": ".github/CODE_OF_CONDUCT.md",
"chars": 1420,
"preview": "# Contributor Code of Conduct\r\n\r\nAs contributors and maintainers of this project, we pledge to respect all people who co"
},
{
"path": ".github/FUNDING.yml",
"chars": 683,
"preview": "# These are supported funding model platforms\r\n\r\ngithub: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., "
},
{
"path": ".github/ISSUE_TEMPLATE/1_streams_add.yml",
"chars": 2371,
"preview": "name: ➕ Add stream\r\ndescription: Request to add a new stream link into the playlist\r\ntitle: 'Add: '\r\nlabels: ['streams:a"
},
{
"path": ".github/ISSUE_TEMPLATE/2_streams_edit.yml",
"chars": 2496,
"preview": "name: ✏️ Edit stream\r\ndescription: Request to edit stream description\r\ntitle: 'Edit: '\r\nlabels: ['streams:edit']\r\n\r\nbody"
},
{
"path": ".github/ISSUE_TEMPLATE/3_streams_report.yml",
"chars": 1567,
"preview": "name: 🚧 Report a stream\r\ndescription: Report a broken or unstable stream\r\ntitle: 'Report: '\r\nlabels: ['streams:remove']\r"
},
{
"path": ".github/ISSUE_TEMPLATE/4_channel-search.yml",
"chars": 1099,
"preview": "name: 🔍 Channel search\r\ndescription: Ask for help in finding a link to the channel stream.\r\ntitle: 'Find: '\r\nlabels: ['c"
},
{
"path": ".github/ISSUE_TEMPLATE/5_bug-report.yml",
"chars": 613,
"preview": "name: 🐞 Bug report\r\ndescription: Report an error in this repository\r\nlabels: ['bug']\r\n\r\nbody:\r\n - type: textarea\r\n a"
},
{
"path": ".github/ISSUE_TEMPLATE/6_copyright-claim.yml",
"chars": 1761,
"preview": "name: ©️ Copyright removal request\r\ndescription: Request to remove content\r\nlabels: ['removal request']\r\nbody:\r\n - type"
},
{
"path": ".github/ISSUE_TEMPLATE/config.yml",
"chars": 453,
"preview": "blank_issues_enabled: false\r\ncontact_links:\r\n - name: 💡 Ideas\r\n url: https://github.com/orgs/iptv-org/discussions/ca"
},
{
"path": ".github/workflows/check.yml",
"chars": 1356,
"preview": "name: check\r\non:\r\n workflow_dispatch:\r\n pull_request:\r\n types: [opened, synchronize, reopened]\r\nconcurrency:\r\n gro"
},
{
"path": ".github/workflows/format.yml",
"chars": 2095,
"preview": "name: format\r\non:\r\n workflow_dispatch:\r\n # schedule:\r\n # - cron: \"0 12 * * *\"\r\njobs:\r\n main:\r\n runs-on: ubuntu-"
},
{
"path": ".github/workflows/stale.yml",
"chars": 788,
"preview": "name: stale\r\non:\r\n workflow_dispatch:\r\n schedule:\r\n - cron: '0 0 * * *'\r\npermissions:\r\n actions: write\r\n issues: "
},
{
"path": ".github/workflows/update.yml",
"chars": 3326,
"preview": "name: update\r\non:\r\n workflow_dispatch:\r\n schedule:\r\n - cron: '0 0 * * *'\r\njobs:\r\n main:\r\n runs-on: ubuntu-lates"
},
{
"path": ".gitignore",
"chars": 88,
"preview": "node_modules\r\n.artifacts\r\n.secrets\r\n.actrc\r\n.DS_Store\r\n/.gh-pages/\r\n/.api/\r\n.env\r\n/temp/"
},
{
"path": ".prettierrc",
"chars": 116,
"preview": "{\n \"singleQuote\": true,\n \"semi\": false,\n \"printWidth\": 100,\n \"trailingComma\": \"none\",\n \"arrowParens\": \"avoid\"\n}"
},
{
"path": ".readme/.gitignore",
"chars": 57,
"preview": "_categories.md\r\n_countries.md\r\n_languages.md\r\n_regions.md"
},
{
"path": ".readme/template.md",
"chars": 1894,
"preview": "## Playlists\r\n\r\nThere are several versions of playlists that differ in the way they are grouped. As of January 30th, 202"
},
{
"path": "CONTRIBUTING.md",
"chars": 15034,
"preview": "# Contributing Guide\r\n\r\n- [How to?](#how-to)\r\n- [Stream Description Scheme](#stream-description-scheme)\r\n- [Project Stru"
},
{
"path": "FAQ.md",
"chars": 1191,
"preview": "# Frequently Asked Questions\r\n\r\n### My favorite channel is not on the playlist.\r\n\r\nStart by asking our community for hel"
},
{
"path": "LICENSE",
"chars": 1235,
"preview": "This is free and unencumbered software released into the public domain.\r\n\r\nAnyone is free to copy, modify, publish, use,"
},
{
"path": "PLAYLISTS.md",
"chars": 121869,
"preview": "## Playlists\r\n\r\nThere are several versions of playlists that differ in the way they are grouped. As of January 30th, 202"
},
{
"path": "README.md",
"chars": 3628,
"preview": "# IPTV [](https://github.com/iptv-org/"
},
{
"path": "eslint.config.mjs",
"chars": 1322,
"preview": "import typescriptEslint from '@typescript-eslint/eslint-plugin'\r\nimport stylistic from '@stylistic/eslint-plugin'\r\nimpor"
},
{
"path": "m3u-linter.json",
"chars": 415,
"preview": "{\r\n \"files\": [\"streams/*.m3u\"],\r\n \"rules\": {\r\n \"no-empty-lines\": true,\r\n \"require-header\": true,\r\n \"attribute"
},
{
"path": "package.json",
"chars": 2909,
"preview": "{\r\n \"name\": \"iptv\",\r\n \"scripts\": {\r\n \"act:check\": \"gh act pull_request -W .github/workflows/check.yml\",\r\n \"act:f"
},
{
"path": "scripts/api.ts",
"chars": 5453,
"preview": "import { Collection, Dictionary } from '@freearhey/core'\r\nimport { DATA_DIR } from './constants'\r\nimport cliProgress fro"
},
{
"path": "scripts/commands/api/load.ts",
"chars": 106,
"preview": "import { downloadData } from '../../api'\r\n\r\nasync function main() {\r\n await downloadData()\r\n}\r\n\r\nmain()\r\n"
},
{
"path": "scripts/commands/playlist/edit.ts",
"chars": 5239,
"preview": "import { loadData, data, searchChannels } from '../../api'\r\nimport { Collection, Logger } from '@freearhey/core'\r\nimport"
},
{
"path": "scripts/commands/playlist/export.ts",
"chars": 999,
"preview": "import { API_DIR, STREAMS_DIR } from '../../constants'\r\nimport { Storage } from '@freearhey/storage-js'\r\nimport { Playli"
},
{
"path": "scripts/commands/playlist/format.ts",
"chars": 3789,
"preview": "import { Collection, Logger } from '@freearhey/core'\r\nimport { OptionValues, program } from 'commander'\r\nimport { Stream"
},
{
"path": "scripts/commands/playlist/generate.ts",
"chars": 3208,
"preview": "import { LOGS_DIR, STREAMS_DIR } from '../../constants'\r\nimport { Storage, File } from '@freearhey/storage-js'\r\nimport {"
},
{
"path": "scripts/commands/playlist/test.ts",
"chars": 6133,
"preview": "import { PlaylistParser, StreamTester, CliTable } from '../../core'\r\nimport type { StreamTesterResult } from '../../core"
},
{
"path": "scripts/commands/playlist/update.ts",
"chars": 5239,
"preview": "import { IssueLoader, PlaylistParser } from '../../core'\r\nimport { Playlist, Issue, Stream } from '../../models'\r\nimport"
},
{
"path": "scripts/commands/playlist/validate.ts",
"chars": 4519,
"preview": "import { Logger, Collection, Dictionary } from '@freearhey/core'\r\nimport { Storage } from '@freearhey/storage-js'\r\nimpor"
},
{
"path": "scripts/commands/readme/update.ts",
"chars": 934,
"preview": "import { CategoriesTable, CountriesTable, LanguagesTable, RegionsTable } from '../../tables'\r\nimport { README_DIR, ROOT_"
},
{
"path": "scripts/commands/report/create.ts",
"chars": 6415,
"preview": "import { Logger, Collection, Dictionary } from '@freearhey/core'\r\nimport { IssueLoader, PlaylistParser } from '../../cor"
},
{
"path": "scripts/constants.ts",
"chars": 594,
"preview": "export const ROOT_DIR = process.env.ROOT_DIR || './'\r\nexport const STREAMS_DIR = process.env.STREAMS_DIR || './streams'\r"
},
{
"path": "scripts/core/cliTable.ts",
"chars": 435,
"preview": "import { ComplexOptions } from 'console-table-printer/dist/src/models/external-table'\r\nimport { Table } from 'console-ta"
},
{
"path": "scripts/core/htmlTable.ts",
"chars": 1225,
"preview": "import { Collection } from '@freearhey/core'\r\n\r\nexport type HTMLTableColumn = {\r\n name: string\r\n nowrap?: boolean\r\n a"
},
{
"path": "scripts/core/index.ts",
"chars": 334,
"preview": "export * from './cliTable'\r\nexport * from './htmlTable'\r\nexport * from './issueData'\r\nexport * from './issueLoader'\r\nexp"
},
{
"path": "scripts/core/issueData.ts",
"chars": 865,
"preview": "import { Dictionary } from '@freearhey/core'\r\n\r\nexport class IssueData {\r\n _data: Dictionary<string>\r\n constructor(dat"
},
{
"path": "scripts/core/issueLoader.ts",
"chars": 1183,
"preview": "import { restEndpointMethods } from '@octokit/plugin-rest-endpoint-methods'\r\nimport { paginateRest } from '@octokit/plug"
},
{
"path": "scripts/core/issueParser.ts",
"chars": 1495,
"preview": "import { Dictionary } from '@freearhey/core'\r\nimport { IssueData } from './issueData'\r\nimport { Issue } from '../models'"
},
{
"path": "scripts/core/logParser.ts",
"chars": 305,
"preview": "export type LogItem = {\r\n type: string\r\n filepath: string\r\n count: number\r\n}\r\n\r\nexport class LogParser {\r\n parse(con"
},
{
"path": "scripts/core/markdown.ts",
"chars": 1262,
"preview": "import path from 'path'\r\nimport fs from 'fs'\r\n\r\ntype MarkdownConfig = {\r\n build: string\r\n template: string\r\n}\r\n\r\nexpor"
},
{
"path": "scripts/core/numberParser.ts",
"chars": 244,
"preview": "export default class NumberParser {\r\n async parse(number: string) {\r\n const parsed = parseInt(number)\r\n if (isNaN"
},
{
"path": "scripts/core/playlistParser.ts",
"chars": 1205,
"preview": "import { Storage } from '@freearhey/storage-js'\r\nimport { Collection } from '@freearhey/core'\r\nimport parser from 'iptv-"
},
{
"path": "scripts/core/proxyParser.ts",
"chars": 743,
"preview": "import { URL } from 'node:url'\r\n\r\ninterface ProxyParserResult {\r\n protocol: string | null\r\n auth?: {\r\n username?: s"
},
{
"path": "scripts/core/streamTester.ts",
"chars": 3587,
"preview": "import axios, { AxiosInstance, AxiosProxyConfig, AxiosRequestConfig, AxiosResponse } from 'axios'\r\nimport { SocksProxyAg"
},
{
"path": "scripts/generators/categoriesGenerator.ts",
"chars": 2127,
"preview": "import { Storage, File } from '@freearhey/storage-js'\r\nimport { PUBLIC_DIR, EOL } from '../constants'\r\nimport { Collecti"
},
{
"path": "scripts/generators/citiesGenerator.ts",
"chars": 1798,
"preview": "import { Storage, File } from '@freearhey/storage-js'\r\nimport { PUBLIC_DIR, EOL } from '../constants'\r\nimport { Stream, "
},
{
"path": "scripts/generators/countriesGenerator.ts",
"chars": 2930,
"preview": "import { Storage, File } from '@freearhey/storage-js'\r\nimport { PUBLIC_DIR, EOL } from '../constants'\r\nimport { Stream, "
},
{
"path": "scripts/generators/generator.ts",
"chars": 62,
"preview": "export interface Generator {\r\n generate(): Promise<void>\r\n}\r\n"
},
{
"path": "scripts/generators/index.ts",
"chars": 454,
"preview": "export * from './categoriesGenerator'\r\nexport * from './citiesGenerator'\r\nexport * from './countriesGenerator'\r\nexport *"
},
{
"path": "scripts/generators/indexCategoryGenerator.ts",
"chars": 1846,
"preview": "import { Storage, File } from '@freearhey/storage-js'\r\nimport { PUBLIC_DIR, EOL } from '../constants'\r\nimport { Stream, "
},
{
"path": "scripts/generators/indexCountryGenerator.ts",
"chars": 2186,
"preview": "import { Storage, File } from '@freearhey/storage-js'\r\nimport { PUBLIC_DIR, EOL } from '../constants'\r\nimport { Stream, "
},
{
"path": "scripts/generators/indexGenerator.ts",
"chars": 1346,
"preview": "import { Storage, File } from '@freearhey/storage-js'\r\nimport { PUBLIC_DIR, EOL } from '../constants'\r\nimport { Stream, "
},
{
"path": "scripts/generators/indexLanguageGenerator.ts",
"chars": 1891,
"preview": "import { Storage, File } from '@freearhey/storage-js'\r\nimport { PUBLIC_DIR, EOL } from '../constants'\r\nimport { Stream, "
},
{
"path": "scripts/generators/languagesGenerator.ts",
"chars": 2267,
"preview": "import { Storage, File } from '@freearhey/storage-js'\r\nimport { PUBLIC_DIR, EOL } from '../constants'\r\nimport { Playlist"
},
{
"path": "scripts/generators/rawGenerator.ts",
"chars": 1395,
"preview": "import { Storage, File } from '@freearhey/storage-js'\r\nimport { PUBLIC_DIR, EOL } from '../constants'\r\nimport { Stream, "
},
{
"path": "scripts/generators/regionsGenerator.ts",
"chars": 1846,
"preview": "import { Storage, File } from '@freearhey/storage-js'\r\nimport { PUBLIC_DIR, EOL } from '../constants'\r\nimport { Playlist"
},
{
"path": "scripts/generators/sourcesGenerator.ts",
"chars": 1502,
"preview": "import { Collection, Dictionary } from '@freearhey/core'\r\nimport { Storage, File } from '@freearhey/storage-js'\r\nimport "
},
{
"path": "scripts/generators/subdivisionsGenerator.ts",
"chars": 1991,
"preview": "import { Storage, File } from '@freearhey/storage-js'\r\nimport { PUBLIC_DIR, EOL } from '../constants'\r\nimport { Stream, "
},
{
"path": "scripts/models/index.ts",
"chars": 79,
"preview": "export * from './issue'\r\nexport * from './playlist'\r\nexport * from './stream'\r\n"
},
{
"path": "scripts/models/issue.ts",
"chars": 340,
"preview": "import { IssueData } from '../core'\r\n\r\ntype IssueProps = {\r\n number: number\r\n labels: string[]\r\n data: IssueData\r\n}\r\n"
},
{
"path": "scripts/models/playlist.ts",
"chars": 580,
"preview": "import { Collection } from '@freearhey/core'\r\nimport { Stream } from '../models'\r\n\r\ntype PlaylistOptions = {\r\n public: "
},
{
"path": "scripts/models/stream.ts",
"chars": 12701,
"preview": "import { Collection } from '@freearhey/core'\r\nimport parser from 'iptv-playlist-parser'\r\nimport { normalizeURL } from '."
},
{
"path": "scripts/tables/categoriesTable.ts",
"chars": 1973,
"preview": "import { HTMLTable, HTMLTableItem, LogParser, LogItem, HTMLTableColumn } from '../core'\r\nimport { Storage, File } from '"
},
{
"path": "scripts/tables/countriesTable.ts",
"chars": 6189,
"preview": "import { LOGS_DIR, README_DIR } from '../constants'\r\nimport { Storage } from '@freearhey/storage-js'\r\nimport { Collectio"
},
{
"path": "scripts/tables/index.ts",
"chars": 135,
"preview": "export * from './categoriesTable'\r\nexport * from './countriesTable'\r\nexport * from './languagesTable'\r\nexport * from './"
},
{
"path": "scripts/tables/languagesTable.ts",
"chars": 2006,
"preview": "import { HTMLTable, LogParser, LogItem, HTMLTableColumn, HTMLTableItem } from '../core'\r\nimport { Storage, File } from '"
},
{
"path": "scripts/tables/regionsTable.ts",
"chars": 1470,
"preview": "import { LOGS_DIR, README_DIR } from '../constants'\r\nimport { Storage } from '@freearhey/storage-js'\r\nimport { LogParser"
},
{
"path": "scripts/tables/table.ts",
"chars": 47,
"preview": "export interface Table {\r\n create(): void\r\n}\r\n"
},
{
"path": "scripts/utils.ts",
"chars": 4134,
"preview": "import axios, { AxiosProxyConfig, AxiosRequestConfig } from 'axios'\r\nimport { parse as parsePlaylist, setOptions } from "
},
{
"path": "streams/ad.m3u",
"chars": 304,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"AndorraTV.ad@Web\",Andorra TV (1080p)\r\nhttps://live-edge-eu-1.cdn.enetres.net/56495F77FD124FE"
},
{
"path": "streams/ae.m3u",
"chars": 6288,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"AjmanTV.ae@SD\",Ajman TV (1080p)\r\nhttps://cdn1.logichost.in/ajmantv/live/playlist.m3u8\r\n#EXTI"
},
{
"path": "streams/af.m3u",
"chars": 2229,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"AMC.af@SD\",AMC (1080p)\r\nhttps://amchls.wns.live/hls/stream.m3u8\r\n#EXTINF:-1 tvg-id=\"BaharTV."
},
{
"path": "streams/ag.m3u",
"chars": 8,
"preview": "#EXTM3U\n"
},
{
"path": "streams/al.m3u",
"chars": 2922,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"AlbKanaleMusicTV.al@SD\",AlbKanale Music TV (720p)\r\nhttps://albportal.net/albkanalemusic.m3u8"
},
{
"path": "streams/am.m3u",
"chars": 453,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"Armenia1.am@SD\",Armenia 1 (1080p)\r\nhttps://amtv.tulixcdn.com/amtv2/am2abr/index.m3u8\r\n#EXTIN"
},
{
"path": "streams/ao.m3u",
"chars": 384,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"KKTV.ao@SD\",KK TV Angola (1080p)\r\nhttps://w1.manasat.com/ktv-angola/smil:ktv-angola.smil/pla"
},
{
"path": "streams/ar.m3u",
"chars": 14239,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"5tv.ar@SD\",5TV Corrientes (480p) [Not 24/7]\r\nhttp://www.coninfo.net:1935/tvcinco/live1/playl"
},
{
"path": "streams/at.m3u",
"chars": 6880,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"AntenneKaernten.at@SD\",Antenne Kaernten (720p)\r\nhttps://60efd7a2b4d02.streamlock.net/a_kaern"
},
{
"path": "streams/at_pluto.m3u",
"chars": 9,
"preview": "#EXTM3U\r\n"
},
{
"path": "streams/at_samsung.m3u",
"chars": 1076,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"RakutenTVActionMovies.es@Austria\",Rakuten TV Action Movies Austria (720p)\r\nhttps://0f8466275"
},
{
"path": "streams/au.m3u",
"chars": 5689,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"2GB.au@SD\",2GB Sydney (1080p)\r\nhttps://2gblive.akamaized.net/hls/live/2033805/2GB/index.m3u8"
},
{
"path": "streams/au_samsung.m3u",
"chars": 14016,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"\",8 Out of 10 Cats (1080p) [Geo-blocked]\r\nhttps://amg00627-amg00627c37-samsung-au-4294.playo"
},
{
"path": "streams/aw.m3u",
"chars": 1551,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"ArubaTV.aw@SD\",Aruba.TV (1080p)\r\nhttps://cdn01.setar.aw/Canal49/canal49/playlist.m3u8\r\n#EXTI"
},
{
"path": "streams/az.m3u",
"chars": 2795,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"AlvinChannelTV.az@SD\",Alvin Channel TV (360p) [Not 24/7]\r\nhttps://cdn10-alvinchannel.yayin.c"
},
{
"path": "streams/ba.m3u",
"chars": 2645,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"BHRT.ba@SD\",BHRT (720p) [Geo-blocked]\r\nhttps://bhrtstream.bhtelecom.ba/bhrtportal.m3u8\r\n#EXT"
},
{
"path": "streams/ba_morescreens.m3u",
"chars": 127,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"SenatoTV.it@SD\",Senato TV (1080p)\r\nhttps://senato-live.morescreens.com/SENATO_1_001/playlist"
},
{
"path": "streams/bb.m3u",
"chars": 126,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"CBCTV8.bb@SD\",CBC TV8 (1080p) [Not 24/7]\r\nhttps://1740288887.rsc.cdn77.org/1740288887/index."
},
{
"path": "streams/bd.m3u",
"chars": 3446,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"AnandaTV.bd@SD\",Ananda TV (1080p)\r\nhttps://bozztv.com/rongo/rongo-AnandaTV/index.m3u8\r\n#EXTI"
},
{
"path": "streams/be.m3u",
"chars": 5770,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"ACTV.be@SD\",ACTV [Geo-blocked]\r\nhttps://tvlocales-live.freecaster.com/live/95d2f733-1bc2-4bd"
},
{
"path": "streams/be_samsung.m3u",
"chars": 521,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"GoUSATV.us@SD\",Go USA TV (720p)\r\nhttps://brandusa-gousa-1-be.samsung.wurl.tv/playlist.m3u8\r\n"
},
{
"path": "streams/bf.m3u",
"chars": 712,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"BurkinaInfoTV.bf@SD\",Burkina Info TV (540p)\r\nhttp://69.64.57.208/burkinainfo/index.m3u8\r\n#EX"
},
{
"path": "streams/bg.m3u",
"chars": 1921,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"100AutoMotoTV.bg@SD\",100% Auto Moto TV (406p) [Not 24/7]\r\nhttp://100automoto.tv:1935/bgtv1/a"
},
{
"path": "streams/bh.m3u",
"chars": 794,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"BahrainInternational.bh@SD\",Bahrain International (720p) [Not 24/7]\r\nhttps://5c7b683162943.s"
},
{
"path": "streams/bi.m3u",
"chars": 9,
"preview": "#EXTM3U\r\n"
},
{
"path": "streams/bj.m3u",
"chars": 794,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"ADOTV.bj@SD\",ADO TV (720p)\r\nhttps://strhls.streamakaci.tv/ortb/ortb2-multi/playlist.m3u8\r\n#E"
},
{
"path": "streams/bm.m3u",
"chars": 9,
"preview": "#EXTM3U\r\n"
},
{
"path": "streams/bn.m3u",
"chars": 364,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"RTBAneka.bn@SD\",RTB Aneka (720p)\r\nhttps://d1211whpimeups.cloudfront.net/smil:rtb2/playlist.m"
},
{
"path": "streams/bo.m3u",
"chars": 4096,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"AbyaYalaTV.bo@SD\",Abya Yala TV\r\nhttps://seo.tv.bo/tv/LIpSEO-TV-8.m3u8\r\n#EXTINF:-1 tvg-id=\"AT"
},
{
"path": "streams/bq.m3u",
"chars": 625,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"Bonairetv.bq@SD\",Bonaire.tv (1080p) [Not 24/7]\r\nhttps://media.streambrothers.com:1936/8506/8"
},
{
"path": "streams/br.m3u",
"chars": 23905,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"1001Noites.br@SD\",1001 Noites (720p) [Not 24/7]\r\nhttps://cdn.jmvstream.com/w/LVW-8155/ngrp:L"
},
{
"path": "streams/br_pluto.m3u",
"chars": 16887,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"\",A Caçadora de Relíquias\r\nhttps://jmp2.uk/plu-67e59a6557487a8b7fe73e23.m3u8\r\n#EXTINF:-1 tvg"
},
{
"path": "streams/br_samsung.m3u",
"chars": 153,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"MyTimeMovieNetwork.br@SD\",MyTime Movie Network Brazil (720p)\r\nhttps://appletree-mytime-samsu"
},
{
"path": "streams/bs.m3u",
"chars": 490,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"GuardianTalkRadio.bs@SD\",Guardian Talk Radio (1080p)\r\nhttps://cdn-edge1.streamcomedia.com/ab"
},
{
"path": "streams/bw.m3u",
"chars": 9,
"preview": "#EXTM3U\r\n"
},
{
"path": "streams/by.m3u",
"chars": 2329,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"Belarus2.by@SD\",Беларусь 2 (1080p)\r\n#EXTVLCOPT:http-referrer=https://belarus2.by/\r\nhttps://n"
},
{
"path": "streams/bz.m3u",
"chars": 2040,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"BBNTV.bz@SD\",BBN TV (720p)\r\nhttps://streamer2.nexgen.bz/06-BBN/index.m3u8\r\n#EXTINF:-1 tvg-id"
},
{
"path": "streams/bz_nexgen.m3u",
"chars": 8,
"preview": "#EXTM3U\n"
},
{
"path": "streams/ca.m3u",
"chars": 17708,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"5AABTV.ca@SD\",5AAB TV (720p) [Not 24/7]\r\nhttp://158.69.124.9:1935/5aabtv/5aabtv/playlist.m3u"
},
{
"path": "streams/ca_pluto.m3u",
"chars": 18328,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"48Hours.us@CA\",48 Hours\r\nhttps://jmp2.uk/plu-62e925bc68d18a00077bb990.m3u8\r\n#EXTINF:-1 tvg-i"
},
{
"path": "streams/ca_samsung.m3u",
"chars": 699,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"DryBarComedyPlus.us@SD\",DryBar Comedy\r\nhttps://drybar-drybarcomedy-1-ca.samsung.wurl.tv/play"
},
{
"path": "streams/ca_stingray.m3u",
"chars": 4482,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"\",Holidayscapes (1080p)\r\nhttps://plextv.ott-channels.stingray.com/holidayscapes/master.m3u8\r"
},
{
"path": "streams/cd.m3u",
"chars": 2540,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"AntenneA.cd@SD\",Antenne A\r\nhttp://51.254.199.122:8080/antenne_a-plus/index.m3u8\r\n#EXTINF:-1 "
},
{
"path": "streams/cf.m3u",
"chars": 9,
"preview": "#EXTM3U\r\n"
},
{
"path": "streams/cg.m3u",
"chars": 783,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"BebTV.cg@SD\",Beb TV (720p)\r\nhttps://live-hls-qunv.livepush.io/live_cdn/em8A-kbzIfHqu73/index"
},
{
"path": "streams/ch.m3u",
"chars": 4443,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"Canal9.ch@SD\",Canal 9 en Français (1080p)\r\nhttps://livehd.vedge.infomaniak.com/livecast/live"
},
{
"path": "streams/ch_netplus.m3u",
"chars": 32386,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"3sat.de@HD\",3sat HD (1080p) [Geo-Blocked]\r\nhttps://viamotionhsi.netplus.ch/live/eds/3sathd/b"
},
{
"path": "streams/ch_pluto.m3u",
"chars": 98,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"\",Pluto TV Polar+\r\nhttps://jmp2.uk/plu-5ffebbeabd18520007b37709.m3u8\r\n"
},
{
"path": "streams/ch_samsung.m3u",
"chars": 274,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"RakutenTVFamilyMovies.es@Switzerland\",Rakuten TV Family Switzerland (720p)\r\nhttps://a24daf11"
},
{
"path": "streams/ci.m3u",
"chars": 3489,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"A12TV.ci@SD\",A12 TV\r\nhttps://video1.getstreamhosting.com:1936/8250/8250/manifest.m3u8\r\n#EXTI"
},
{
"path": "streams/cl.m3u",
"chars": 11567,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"13C.cl@SD\",13C (1080p)\r\nhttps://origin.dpsgo.com/ssai/event/GI-9cp_bT8KcerLpZwkuhw/master.m3"
},
{
"path": "streams/cm.m3u",
"chars": 1591,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"Afrique54TV.cm@SD\",Afrique54 TV (720p)\r\nhttps://video1.getstreamhosting.com:1936/8318/8318/p"
},
{
"path": "streams/cn.m3u",
"chars": 58967,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"AndoTV.cn@SD\",Ando TV\r\nhttp://play.kankanlive.com/live/1711956137852982.m3u8\r\n#EXTINF:-1 tvg"
},
{
"path": "streams/cn_112114.m3u",
"chars": 1044,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"\",douyu8\r\nhttp://epg.112114.xyz/douyu/4332\r\n#EXTINF:-1 tvg-id=\"\",douyu9\r\nhttp://epg.112114.x"
},
{
"path": "streams/cn_cctv.m3u",
"chars": 2279,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"CCTVPlus1.cn@SD\",CCTV+ 1 (600p) [Not 24/7]\r\nhttps://cd-live-stream.news.cctvplus.com/live/sm"
},
{
"path": "streams/cn_cgtn.m3u",
"chars": 1717,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"CGTN.cn@SD\",CGTN (576p)\r\nhttp://223.110.245.149/ott.js.chinamobile.com/PLTV/3/224/3221225917"
},
{
"path": "streams/cn_yeslivetv.m3u",
"chars": 94,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"\",博斯高球台\r\nhttps://yeslivetv.com/twiptv/litv-longturn05/index.m3u8\r\n"
},
{
"path": "streams/co.m3u",
"chars": 16711,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"ATNTelevision.co@SD\",ATN Televisión (720p) [Not 24/7]\r\nhttps://streaming5.globalhostla.com/r"
},
{
"path": "streams/cr.m3u",
"chars": 9421,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"88Stereo.cr@SD\",88 Stereo (720p) [Not 24/7]\r\nhttp://k3.usastreams.com/CableLatino/88stereo/p"
},
{
"path": "streams/cu.m3u",
"chars": 1480,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"CanalClave.cu@SD\",Canal Clave (480p) [Not 24/7]\r\nhttps://tv.picta.cu/clave/clave_0.m3u8\r\n#EX"
},
{
"path": "streams/cv.m3u",
"chars": 147,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"RadioTVSalOne.cv@SD\",Radio TV Sal One (720p)\r\nhttps://lon.rtsp.me/r3ZnG6WN2HIRxPARhAirIQ/171"
},
{
"path": "streams/cw.m3u",
"chars": 691,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"BonceTV.cw@SD\",Bonce TV (480p) [Not 24/7]\r\nhttps://seswa.bonce.tv/hls/bonceswa.m3u8\r\n#EXTINF"
},
{
"path": "streams/cy.m3u",
"chars": 2513,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"AlfaSport.cy@SD\",Alfa Sport (1080p) [Not 24/7]\r\nhttps://dev.aftermind.xyz/edge-hls/unitrust/"
},
{
"path": "streams/cz.m3u",
"chars": 3783,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"CT1.cz@SD\",ČT 1\r\nhttp://88.212.15.19/live/test_ct1_25p/playlist.m3u8\r\n#EXTINF:-1 tvg-id=\"CT2"
},
{
"path": "streams/de.m3u",
"chars": 32185,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"123tv.de@SD\",1-2-3 TV (270p)\r\nhttps://123tv-mx1.flex-cdn.net/index.m3u8\r\n#EXTINF:-1 tvg-id=\""
},
{
"path": "streams/de_pluto.m3u",
"chars": 18764,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"\",21 Jump Street\r\nhttps://jmp2.uk/plu-686cffbf3ffa5e0c91cdcfb3.m3u8\r\n#EXTINF:-1 tvg-id=\"\",90"
},
{
"path": "streams/de_rakuten.m3u",
"chars": 5586,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"\",Amasia (720p)\r\nhttps://splendid-film-amasia-1-eu.rakuten.wurl.tv/playlist.m3u8\r\n#EXTINF:-1"
},
{
"path": "streams/de_samsung.m3u",
"chars": 187,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"ZeeOne.uk@German\",Zee One German (720p)\r\nhttps://e4955b54.wurl.com/master/f36d25e7e52f1ba8d7"
},
{
"path": "streams/dj.m3u",
"chars": 189,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"RTD.dj@SD\",RTD\r\nhttps://dvrfl06.bozztv.com/astv-djibouti/index.m3u8\r\n#EXTINF:-1 tvg-id=\"RTD4"
},
{
"path": "streams/dk.m3u",
"chars": 1532,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"TVStorbyen.dk@SD\",BL-TV/TV Storbyen (720p) [Not 24/7]\r\nhttps://5eeb3940cfaa0.streamlock.net/"
},
{
"path": "streams/dk_pluto.m3u",
"chars": 21248,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"\",3point.dk\r\nhttps://jmp2.uk/plu-65b915780cb1a1000889b837.m3u8\r\n#EXTINF:-1 tvg-id=\"\",7th Hea"
},
{
"path": "streams/dk_samsung.m3u",
"chars": 1252,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"FailArmy.us@US\",Failarmy International (720p)\r\nhttps://failarmy-international-dk.samsung.wur"
},
{
"path": "streams/dm.m3u",
"chars": 8,
"preview": "#EXTM3U\n"
},
{
"path": "streams/do.m3u",
"chars": 33639,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"AcentoTV.do@SD\",Acento TV\r\n#EXTVLCOPT:http-referrer=https://acentotv01.streamprolive.com/i/c"
},
{
"path": "streams/dz.m3u",
"chars": 269,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"AmouYazidTV.dz@SD\",Amou Yazid TV (576p)\r\nhttp://mkstream.servehttp.com:1940/AmouYazid/ay1/pl"
},
{
"path": "streams/ec.m3u",
"chars": 10585,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"AmericaEstereoGuayaquil.ec@SD\",América Estéreo Guayaquil (360p)\r\nhttps://video.makrodigital."
},
{
"path": "streams/ee.m3u",
"chars": 2969,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"BestofDanceTV.ee@SD\",Best of Dance TV (1080p)\r\nhttps://m1b2.worldcast.tv/dancetelevisionone/"
},
{
"path": "streams/eg.m3u",
"chars": 2292,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"AghapyTV.eg@SD\",Aghapy TV (1080p) [Not 24/7]\r\nhttps://5b622f07944df.streamlock.net/aghapy.tv"
},
{
"path": "streams/eh.m3u",
"chars": 346,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"RASDTV.eh@SD\",RASD TV (1080i)\r\nhttps://cloud.streamingconnect.tv/hls/rasdtv2/rasdtv.m3u8\r\n#E"
},
{
"path": "streams/er.m3u",
"chars": 112,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"ERiTV1.er@SD\",ERi-TV 1 (576p)\r\nhttps://jmc-live.ercdn.net/eritreatv/eritreatv.m3u8\r\n"
},
{
"path": "streams/es.m3u",
"chars": 40467,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"3CatCameresdeltemps.es@SD\",3Cat Càmeres del temps (1080p)\r\nhttps://directes-tv-int.3catdirec"
},
{
"path": "streams/es_pluto.m3u",
"chars": 13220,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"\",Actualidad 360\r\nhttps://jmp2.uk/plu-67517fae5534bb0008187997.m3u8\r\n#EXTINF:-1 tvg-id=\"\",Ág"
},
{
"path": "streams/es_rakuten.m3u",
"chars": 6753,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"BBCDrama.uk@Spain\",BBC Drama (1080p)\r\nhttps://amg00793-amg00793c40-rakuten-es-5444.playouts."
},
{
"path": "streams/es_samsung.m3u",
"chars": 477,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"PeopleAreAwesome.us@SD\",People are Awesome\r\nhttps://jukin-peopleareawesome-2-es.samsung.wurl"
},
{
"path": "streams/es_yowi.m3u",
"chars": 8,
"preview": "#EXTM3U\n"
},
{
"path": "streams/et.m3u",
"chars": 701,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"AddisTV.et@SD\",Addis TV (720p)\r\nhttps://rrsatrtmp.tulix.tv/addis1/addis1multi.smil/playlist."
},
{
"path": "streams/fi.m3u",
"chars": 3730,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"Eveo.fi@SD\",Eveo (720p) [Not 24/7]\r\nhttps://live-fi.tvkaista.net/eveo/live.m3u8?hd=true\r\n#EX"
},
{
"path": "streams/fi_rakuten.m3u",
"chars": 3450,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"\",5-Minute Craft (1080p)\r\nhttps://soul-5mincrafteng-rakuten.amagi.tv/playlist.m3u8\r\n#EXTINF:"
},
{
"path": "streams/fi_samsung.m3u",
"chars": 1252,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"FailArmy.us@US\",Failarmy International (720p)\r\nhttps://failarmy-international-fi.samsung.wur"
},
{
"path": "streams/fj.m3u",
"chars": 8,
"preview": "#EXTM3U\n"
},
{
"path": "streams/fm.m3u",
"chars": 8,
"preview": "#EXTM3U\n"
},
{
"path": "streams/fo.m3u",
"chars": 273,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"KringvarpForoya.fo@SD\",KVF (720p) [Not 24/7]\r\nhttps://w-live-edge1.kringvarp.fo/uttanlands/_"
},
{
"path": "streams/fr.m3u",
"chars": 21608,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"20MinutesTV.fr@SD\",20 Minutes TV (1080p)\r\nhttps://live-20minutestv.digiteka.com/1961167769/i"
},
{
"path": "streams/fr_bfm.m3u",
"chars": 4216,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"BFM2.fr@HD\",BFM 2 (1080p)\r\n#EXTVLCOPT:http-user-agent=Mozilla/5.0 (X11; Linux x86_64) AppleW"
},
{
"path": "streams/fr_fashiontv.m3u",
"chars": 9,
"preview": "#EXTM3U\r\n"
},
{
"path": "streams/fr_groupecanalplus.m3u",
"chars": 8,
"preview": "#EXTM3U\n"
},
{
"path": "streams/fr_groupem6.m3u",
"chars": 9,
"preview": "#EXTM3U\r\n"
},
{
"path": "streams/fr_persiana.m3u",
"chars": 2376,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"4Afghanistan.fr@SD\",4 Afghanistan\r\nhttps://4afghls.persiana.live/hls/stream.m3u8\r\n#EXTINF:-1"
},
{
"path": "streams/fr_pluto.m3u",
"chars": 12210,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"\",Adjugé vendu !\r\nhttps://jmp2.uk/plu-64bab8ba5dc1660008969b5a.m3u8\r\n#EXTINF:-1 tvg-id=\"\",Al"
},
{
"path": "streams/fr_rakuten.m3u",
"chars": 12719,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"\",100% Docs\r\nhttps://amg02162-newenconnect-amg02162c2-rakuten-us-1981.playouts.now.amagi.tv/"
},
{
"path": "streams/fr_samsung.m3u",
"chars": 622,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"\",Mytime Movies (1080p)\r\nhttps://mytimefrance-rakuten-samsung.amagi.tv/playlist.m3u8\r\n#EXTIN"
},
{
"path": "streams/ga.m3u",
"chars": 9,
"preview": "#EXTM3U\r\n"
},
{
"path": "streams/ge.m3u",
"chars": 2758,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"1TV.ge@SD\",1TV (720p)\r\nhttps://tv.cdn.xsg.ge/gpb-1tv/index.m3u8\r\n#EXTINF:-1 tvg-id=\"2TV.ge@S"
},
{
"path": "streams/gf.m3u",
"chars": 132,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"TelePeyi.gf@SD\",Télé Péyi (720p)\r\nhttps://edge20.vedge.infomaniak.com/livecast/ik:33dm06/man"
},
{
"path": "streams/gh.m3u",
"chars": 1420,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"AdinkraTV.gh@SD\",Adinkra TV (1080p)\r\nhttps://59d39900ebfb8.streamlock.net/adinkratvny/adinkr"
},
{
"path": "streams/gl.m3u",
"chars": 8,
"preview": "#EXTM3U\n"
},
{
"path": "streams/gm.m3u",
"chars": 223,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"ParadiseTV.gm@SD\",Paradise TV\r\nhttps://dvrfl06.bozztv.com/astv-ptvgambia/index.m3u8\r\n#EXTINF"
},
{
"path": "streams/gn.m3u",
"chars": 926,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"ATV.gn@SD\",ATV (400p) [Not 24/7]\r\nhttps://guineetvdirect.online:3320/live/atvguineelive.m3u8"
},
{
"path": "streams/gp.m3u",
"chars": 607,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"ETV.gp@SD\",ETV (1080p)\r\nhttps://edge12.vedge.infomaniak.com/livecast/ik:etvgp/manifest.m3u8\r"
},
{
"path": "streams/gq.m3u",
"chars": 275,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"SolTV.gq@SD\",SolTV (720p)\r\nhttps://stream.solmediaeg.com/soltv/soltv.m3u8\r\n#EXTINF:-1 tvg-id"
},
{
"path": "streams/gr.m3u",
"chars": 11176,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"4E.gr@SD\",4E (1080p)\r\nhttp://eu2.tv4e.gr:554/live/smil:myStream.sdp.smil/playlist.m3u8\r\n#EXT"
},
{
"path": "streams/gt.m3u",
"chars": 6970,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"AmigosTVChiquimula.gt@SD\",Amigos TV Chiquimula (480p)\r\nhttps://antmedia.cablevisionrobles.co"
},
{
"path": "streams/gu.m3u",
"chars": 140,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"Star101FM.gu@SD\",Star 101 FM (KNUT Guam) [Not 24/7]\r\nhttps://live2.tensila.com/knut-v-1.choi"
},
{
"path": "streams/gy.m3u",
"chars": 597,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"HGPTV.gy@SD\",HGPTV (720p) [Not 24/7]\r\nhttps://cdn-us-east-prod-ingest-infra-dacast-com.akama"
},
{
"path": "streams/hk.m3u",
"chars": 2277,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"BloombergTV.us@Asia\",Bloomberg TV Asia (720p)\r\nhttps://bloomberg.com/media-manifest/streams/"
},
{
"path": "streams/hn.m3u",
"chars": 8541,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"APlus.mx@SD\",A+ [Geo-blocked]\r\nhttps://mdstrm.com/live-stream-playlist/60b56be1000ea50835fa1"
},
{
"path": "streams/hr.m3u",
"chars": 3121,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"BravoKidsTV.hr@SD\",Bravo! Kids TV (1080p)\r\nhttps://streaming.social3.hr/play/r3CK_tdsFIFL3bN"
},
{
"path": "streams/ht.m3u",
"chars": 3692,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"CanalPlusHaiti.ht@SD\",Canal+ Haiti [Geo-blocked]\r\nhttps://vdo.pro-fhi.net:3605/live/dgenlcpm"
},
{
"path": "streams/hu.m3u",
"chars": 12031,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"16tvBudapest.hu@SD\",16tv Budapest (360p)\r\nhttps://cloudfront44.lexanetwork.com:1344/freerela"
},
{
"path": "streams/id.m3u",
"chars": 22803,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"AlBahjahTV.id@SD\",Al-Bahjah TV (1080p)\r\nhttp://202.150.161.117:8000/play/AlBahjahTV\r\n#EXTINF"
},
{
"path": "streams/id_denstv.m3u",
"chars": 16143,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"AlJazeera.qa@Arabic\",Al Jazeera Arabic [Geo-blocked]\r\n#EXTVLCOPT:http-referrer=https://www.d"
},
{
"path": "streams/ie.m3u",
"chars": 1670,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"F1Channel.ie@US\",F1 Channel (1080p) [Geo-blocked]\r\nhttps://amg12058-c15studio-amg12058c1-lg-"
},
{
"path": "streams/ie_samsung.m3u",
"chars": 120,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"GoUSATV.us@SD\",Go USA TV (720p)\r\nhttps://brandusa-gousa-1-ie.samsung.wurl.tv/playlist.m3u8\r\n"
},
{
"path": "streams/il.m3u",
"chars": 3000,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"Channel9.il@SD\",Channel 9 (540p) [Not 24/7]\r\nhttp://50.7.231.221:8081/185/index.m3u8?wmsAuth"
},
{
"path": "streams/in.m3u",
"chars": 71992,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"9XJalwa.in@SD\",9X Jalwa (1080p)\r\nhttps://b.jsrdn.com/strm/channels/9xjalwa/master.m3u8\r\n#EXT"
},
{
"path": "streams/in_distro.m3u",
"chars": 63136,
"preview": "#EXTM3U\r\n#EXTINF:-1 tvg-id=\"\",4ACETV (1080p)\r\n#EXTVLCOPT:http-user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) Apple"
}
]
// ... and 334 more files (download for full content)
About this extraction
This page contains the full source code of the iptv-org/iptv GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 534 files (2.8 MB), approximately 763.3k tokens, and a symbol index with 208 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.