openjutsu
One-click character swap for videos: an open-source, local Higgsfield Genjutsu alternative built on ComfyUI and MiniMax H3, with FLUX.3 Klein relighting.
IPTV Playlist Generator – import, edit and export M3U / XSPF playlists. PWA ready, offline support.
Translation pending
MediaGitHub @bucalaOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Repository information has not been collected yet.
No updates detected yet. GitHub releases will appear here.
IPTV Playlist Generator
Translation pending
Taken from the repository README
Loading the full README.
Read the full 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ľ.