尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证IPTV Playlist Generator
翻译准备中
取自仓库 README
正在加载完整 README。
查看完整 README ↗Apple-style statická webová aplikácia pre správu IPTV playlistov — bez backendu, bez cloud účtu, bez inštalácie.
Live demo: iptvplaylistgen.pages.dev
| Formát | Popis |
|---|---|
| M3U / M3U8 | EXTINF metadáta: tvg-id, tvg-name, tvg-logo, tvg-url, tvg-country, group-title |
| XSPF | XML Shareable Playlist Format (track title, location, image, annotation) |
| Zo súboru | File picker, max 50 MB |
| Z URL | Priame stiahnutie M3U/XSPF zo sieťovej URL |
4K / FHD / HD / SD)tvg-id, tvg-name, tvg-logo, tvg-url, group-title, tvg-country).xml, .xmltv) s parserom časových pásiem (±HH:MM)<channel> elementov pre display-name a icon/logoPoložka Úpravy → Autodetekcia otvorí modálne okno s automatickým priradením TVG metadát.
Podrobnosti pozri v sekcii EPG Autodetekcia — technické detaily.
select-all + individuálny výber riadkovhttp, https, rtmp, rtmps, rtsp, udp, rtptvg-logo URL s fade-in animácioulocalStorage, anti-FOUC inline skriptAplikácia nevyžaduje žiadnu inštaláciu. Otvor prehliadač:
https://iptvplaylistgen.pages.dev
.m3u alebo .m3u8 súborDôležité: Toto je čisto statický web. Nenastavuj žiadny build command.
Nahraj obsah repozitára na GitHub (fork alebo vlastný repo)
V Cloudflare Pages → Create a project → Connect to Git
Vyber repozitár a nastav:
| Pole | Hodnota |
|---|---|
| Framework preset | None |
| Build command | (nechaj prázdne!) |
| Build output directory | / |
Klikni Save and Deploy — Cloudflare automaticky rozpozná _headers a _redirects
Ak vidíš v CI
npm installalebowrangler deploy, máš nastavený nesprávny build command — vymaž ho v nastaveniach.
| Súbor | Účel |
|---|---|
_headers | Bezpečnostné hlavičky (CSP, HSTS, Permissions-Policy …) |
_redirects | SPA fallback routing (/* /index.html 200) |
manifest.json | PWA manifest |
sw.js | Service Worker — index.html network-first (nový deploy sa prejaví hneď), offline záloha z cache |
functions/epg-proxy.js | Cloudflare Pages Function — CORS proxy pre open-epg.com XMLTV súbory |
vendor/ | Vendorovaný a pinnutý Vue runtime (bez CDN, funguje offline) |
npm install
npm run start
# → http://localhost:3000
Používa npx serve . — priamy statický server, žiadny build krok.
npm install
npm run win:start # Spustí vývojový Electron
npm run win:build # Buildne portable + NSIS installer
Výstup: dist-electron/
npm install
npm run android:add # Pridaj Android platformu (raz)
npm run android:sync # Synchronizuj web assets do native projektu
npm run android:open # Otvor Android Studio
V Android Studio buildni APK (debug) alebo AAB (release pre Play Store).
npm test
Spúšťa scripts/verify-static.js + scripts/verify-autodetect.js (91 testov).
Autodetekcia priradí každému kanálu z playlistu správne tvg-id, tvg-name, tvg-logo a tvg-url na základe EPG XML zdrojov. Toto je komplikovaná logika — tu sú presné pravidlá.
Aplikácia pracuje s dvoma typmi zdrojov:
| Typ | Príklady | Popis |
|---|---|---|
Open EPG XML (allowTvgUrl: true) | open-epg.com/files/slovakia1.xml, czech1.xml, … | Plné XML s <channel> + <programme>. Poskytujú tvg-url aj metadáta. |
Globe EPG XML (metadataOnly: true) | globetvapp/epg/Slovakia/slovakia1.xml | Iba <channel> metadáta (streamujú sa len po prvý <programme>). Nepoužívajú sa ako tvg-url. |
Predvolene aktívne Open EPG zdroje: slovakia1/2/3.xml, czech1/3/4.xml.
Pri načítaní každého Open EPG XML súboru sa každý <channel id="..."> zaindexuje pod normalizovaným kľúčom (lowercase + bez diakritiky + bez medzier):
<channel id="Markíza Klasik.sk">
<display-name>Markíza Klasik.sk</display-name>
</channel>
Uloží sa:
epgXmlIndex["markizaklasik.sk"] → URL zdroja (napr. slovakia1.xml)epgXmlChannelIdIndex["markizaklasik.sk"] → "Markíza Klasik.sk" (presný originál vrátane diakritiky a .sk)epgXmlDisplayNameIndex["markizaklasik.sk"] → "Markíza Klasik.sk" (presný originál display-name vrátane .sk)Kľúčová zásada: .sk a .cz prípony v id aj display-name sú súčasťou originálnych XML dát — nie sú chybou. Aplikácia ich nijako neupravuje.
Pre každý kanál z playlistu:
Skontrolujú sa potvrdené mapovanie (z predchádzajúcich spustení), iptv-org API, a fuzzy zhoda voči indexovaným kandidátom z M3U zdrojov.
Krajina je absolútny hard-filter: ak tvg-id kanálu v playliste má príponu .sk, kandidáti s .cz tvg-id sú kompletne ignorovaní (a naopak). Žiadne bodové bonusy — buď kandidát má správnu krajinu, alebo je vyradený.
Porovnanie názvov prebieha cez normName(), ktorá dočasne odsekne .sk/.cz, HD, FHD, 4K atď. — takže "Markíza Klasik" sa porovná s "Markíza Klasik.sk" ako 100% zhoda.
Z nájdeného kandidáta sa extrahujú editId, editName, editTvgUrl. Ak kandidát má exact_tvg_id a platný tvg-url, použijú sa ako počiatočné hodnoty (vrátane presného display-name z XML bez akejkoľvek úpravy).
Pre každý kanál, ktorý má v tvg-id krajinu (.sk alebo .cz), sa vykoná lookup v epgXmlIndex pomocou normalizovaného kľúča odvodeného z tvg-id kanálu. Lookup filtruje výsledky podľa URL zdroja — pre .sk kanál akceptuje len URL zo slovakia*.xml.
Ak sa zhoda nájde:
editId ← presný id z XML (s diakritikou, vrátane .sk)editName ← presný display-name z XML (vrátane .sk — neorezáva sa!)editTvgUrl ← URL XML zdroja (ak ešte nebola nastavená alebo bola z nesprávnej krajiny)Ak editTvgUrl stále chýba, pokúsi sa o lookup v epgChannelIndex a epgXmlIndex. Záloha cez epgNameIndex (hľadanie podľa normalizovaného názvu).
Ak editTvgUrl nakoniec stále ukazuje na nesprávnu krajinu (napr. .sk kanál dostal czech*.xml), vykoná sa záverečný override z epgXmlIndex s filtrom pre správnu krajinu.
| Pole | Hodnota |
|---|---|
tvg-id | Presný atribút id z XML (napr. Markíza Klasik.sk) |
tvg-name | Presný element <display-name> z XML (napr. Markíza Klasik.sk) |
tvg-url | URL XML zdroja (napr. https://www.open-epg.com/files/slovakia1.xml) |
tvg-logo | Z iptv-org API alebo zo zdrojového XML <icon src="..."> |
Prípony
.sk/.czsú vtvg-idatvg-namezámerné — odrážajú presné hodnoty z EPG XML zdrojov.
Playlist obsahuje:
#EXTINF:-1 tvg-id="MarkizaKlasik.sk",Markiza Klasik
Slovakia XML (open-epg.com/files/slovakia1.xml) obsahuje:
<channel id="Markíza Klasik.sk">
<display-name>Markíza Klasik.sk</display-name>
</channel>
Výsledok po autodetekcia:
tvg-id = "Markíza Klasik.sk"
tvg-name = "Markíza Klasik.sk"
tvg-url = "https://www.open-epg.com/files/slovakia1.xml"
| Vrstva | Technológia | Verzia |
|---|---|---|
| UI Framework | Vue 3 Composition API (global build, vendorovaný v vendor/) | 3.5.44 |
| Štýly | Tailwind CSS CDN (Oxide/WASM engine) | v4 |
| Písmo | Inter via Google Fonts | — |
| Perzistencia | localStorage (žiadny backend, žiadna DB) | — |
| Offline / PWA | Service Worker + Web App Manifest | — |
| Desktop shell | Electron | ^31 |
| Mobile shell | Capacitor | ^8 |
| Hosting | Cloudflare Pages | — |
| Dev server | serve | ^14 |
Bez build kroku — žiadny webpack, vite ani transpilátory. Celá logika je v jedinom súbore index.html (~3 900 riadkov).
Každý kanál je uložený v localStorage (kľúč iptv-channels) ako JSON objekt:
{
"id": "ch_1234567890",
"name": "Televízia Markíza HD",
"tvg_id": "Markíza.sk",
"tvg_name": "Markíza.sk",
"tvg_logo": "https://cdn.example.com/logo/markiza.png",
"tvg_url": "https://www.open-epg.com/files/slovakia1.xml",
"tvg_country": "SK",
"group_title": "Slovenské",
"url": "https://stream.example.com/markiza/hls/stream.m3u8",
"quality": "HD",
"is_active": true
}
tvg_idatvg_nameobsahujú prípony.sk/.cz— toto je správny formát podľa XMLTV štandardu používaného EPG zdrojmi.
| Kvalita | Rozpoznané kľúčové slová |
|---|---|
4K | 4K, UHD, 2160 |
FHD | FHD, 1080, FULL HD |
HD | HD, 720 (nie UHD/FHD) |
SD | SD, 480, 360 |
| (prázdne) | Nerozpoznané |
_headers)default-src 'self'
script-src 'self' 'unsafe-inline' 'unsafe-eval'
style-src 'self' 'unsafe-inline'
https://fonts.googleapis.com
font-src https://fonts.gstatic.com data:
img-src * data: blob:
connect-src * blob: https:
worker-src 'self'
manifest-src 'self'
| Direktíva | Dôvod |
|---|---|
'unsafe-eval' | Vue 3 runtime template compiler (new Function()) |
data: v font-src | Kompatibilita s lokálnymi/inline font assetmi |
| Hlavička | Hodnota |
|---|---|
Strict-Transport-Security | max-age=31536000; includeSubDomains |
X-Frame-Options | SAMEORIGIN |
X-Content-Type-Options | nosniff |
Referrer-Policy | strict-origin-when-cross-origin |
Permissions-Policy | camera=(), microphone=(), geolocation=() |
xmlEsc() sanitizuje všetky hodnoty pri M3U/XSPF exporte (prevencia XSS)saveEdit() pred každým uloženímno-cache pre index.html a sw.js; Service Worker načítava index.html network-first — vždy čerstvá verzia po deployisha512 integrita v vendor/README.md) — žiadny skript z cudzej doményPozri CHANGELOG.md pre úplný zoznam zmien.
Posledná verzia: 2.6.0 — UI polish + Autodetekcia metadát z EPG.
git checkout -b feat/moja-funkciagit commit -m "feat: popis zmeny"git push origin feat/moja-funkcia| Prefix | Použitie |
|---|---|
feat: | Nová funkcionalita |
fix: | Oprava chyby |
chore: | Údržba, konfigurácia, závislosti |
docs: | Dokumentácia |
IPTV Playlist Generator je nástroj na správu playlistov — nenačítava, neukladá ani nehostuje žiadne video streamy. Obsah streamov pochádza priamo od poskytovateľov, ktorých URL si používateľ sám nastaví. Za zákonnosť zdrojov v playliste zodpovedá výhradne používateľ.