from pathlib import Path
import re
import unicodedata

# ==========================================
# CID + NÁZVY KANÁLOV
# ==========================================

channels = {
    "3422": "Smurfs HD (3422) PL",
    "3602": "Paw Patrol HD (3602) PL",
    "3932": "Tvp Sport HD (3932) PL",
    "3926": "Tvp Info HD (3926) PL",
    "1191": "Tvn24 HD (1191) PL",
    "1294": "Tv Republika HD (1294) PL",
    "3794": "Polsat News HD (3794) PL",
    "3904": "Mega Hit HD (3904) PL",
    "3350": "Cinema Scope HD (3350) PL",
    "3543": "Lombard Zycie Pod Zastaw HD (3543) PL",
    "1554": "Polsat HD (1554) PL",
    "1555": "Tv4 HD (1555) PL",
    "1531": "Tvn (1531) PL",
    "1502": "Tvp 1 HD (1502) PL",
    "1503": "Tvp 2 HD (1503) PL",
    "3646": "Big Travels HD (3646) PL",
    "2611": "Travel Adventures HD (2611) PL",
    "3814": "Wydarzenia24 HD (3814) PL",
    "3837": "Premium Action HD (3837) PL",
    "3888": "Premium Comedy HD (3888) PL",
    "3889": "Premium Thriller HD (3889) PL",
    "3890": "Premium Drama HD (3890) PL",
    "3903": "Premiere HD (3903) PL",
    "3349": "Comedy World HD (3349) PL",
    "1188": "Tv Puls HD (1188) PL",
    "1190": "Puls 2 HD (1190) PL",
    "1040": "Zoom Tv HD (1040) PL",
    "3806": "Tv6 HD (3806) PL",
    "3792": "Super Polsat HD (3792) PL",
    "3791": "Polsat 2 HD (3791) PL",
    "3938": "Tvp Seriale HD (3938) PL",
    "3916": "Tv Puls Lekarze HD (3916) PL",
    "3545": "Kabarety Tv Puls HD (3545) PL",
    "3548": "Rodzinny Interes HD (3548) PL",
    "3576": "Reporterzy I Kurierzy HD (3576) PL",
    "3575": "Miasteczko I Prawdziwe Motywy HD (3575) PL",
    "1041": "Kino Polska HD (1041) PL",
    "1042": "Kino Tv HD (1042) PL",
    "1039": "Stopklatka Tv HD (1039) PL",
    "3797": "Polsat Film HD (3797) PL",
    "3799": "Polsat Cafe HD (3799) PL",
    "1118": "Eleven Sports 1 4K (1118) PL",
    "3809": "Polsat Sport 1 HD (3809) PL",
    "3810": "Polsat Sport 2 HD (3810) PL",
    "3811": "Polsat Sport 3 HD (3811) PL",
    "988": "Amc HD (988) PL",
    "1038": "Filmbox Premium HD (1038) PL",
    "1019": "Filmbox Action (1019) PL",
    "3798": "Polsat Film 2 HD (3798) PL",
    "3440": "Kino Akcji HD (3440) PL",
    "1010": "Fx HD (1010) PL",
    "942": "Fx Comedy HD (942) PL",
    "3804": "Polsat Seriale HD (3804) PL",
    "1090": "Antena HD (1090) PL",
    "2089": "Wirtualna Polska HD (2089) PL",
    "3816": "Nowa Tv HD (3816) PL",
    "3927": "Tvp Polonia HD (3927) PL",
    "3939": "Tvp HD (3939) PL",
    "3793": "Polsat Rodzina HD (3793) PL",
    "3812": "Polo Tv HD (3812) PL",
    "3800": "Polsat Reality HD (3800) PL",
    "3930": "Tvp Rozrywka HD (3930) PL",
    "3928": "Tvp Kultura HD (3928) PL",
    "3934": "Tvp Kobieta HD (3934) PL",
    "1027": "Eleven Sports 1 HD (1027) PL",
    "1023": "Eleven Sports 2 HD (1023) PL",
    "1021": "Eleven Sports 3 HD (1021) PL",
    "1020": "Eleven Sports 4 HD (1020) PL",
    "1486": "Canal Sport5 HD (1486) PL",
    "1192": "Tvn24 Bis HD (1192) PL",
    "3795": "Polsat News Polityka HD (3795) PL",
    "3796": "Polsat News 2 HD (3796) PL",
    "1556": "Wpolsce24 HD (1556) PL",
    "3933": "Tvp Dokument HD (3933) PL",
    "1049": "National Geographic HD (1049) PL",
    "1055": "National Geographic Wild HD (1055) PL",
    "3815": "Fokus Tv HD (3815) PL",
    "3929": "Tvp Historia HD (3929) PL",
    "991": "History (991) PL",
    "992": "History 2 HD (992) PL",
    "3801": "Polsat Play HD (3801) PL",
    "3803": "Polsat Doku HD (3803) PL",
    "1044": "Polsat Viasat History HD (1044) PL",
    "3931": "Tvp Abc HD (3931) PL",
    "3936": "Alfa Tvp HD (3936) PL",
    "946": "Disney Junior (946) PL",
    "940": "Disney Channel HD (940) PL",
    "931": "Disney Xd (931) PL",
    "1485": "Minimini HD (1485) PL",
    "1050": "Cbeebies (1050) PL",
    "1085": "Top Kids HD (1085) PL",
    "3822": "4Fun Kids (3822) PL",
    "1119": "Tele 5 HD (1119) PL",
    "1121": "Polonia 1 HD (1121) PL",
    "1081": "Tvs HD (1081) PL",
    "1089": "Tvc HD (1089) PL",
    "1519": "Tvp 3 Warszawa (1519) PL",
    "1025": "Filmbox Extra HD (1025) PL",
    "1482": "Ale Kino HD (1482) PL",
    "1489": "Novelas HD (1489) PL",
    "1026": "Filmbox Family (1026) PL",
    "1022": "Filmbox Arthouse HD (1022) PL",
    "3892": "Family Fun HD (3892) PL",
    "3891": "Real Drama HD (3891) PL",
    "1052": "Bbc First HD (1052) PL",
    "1014": "Epic Drama HD (1014) PL",
    "1080": "Sundance HD (1080) PL",
    "1013": "Novela Tv HD (1013) PL",
    "1082": "Filmax HD (1082) PL",
    "1088": "Filmax 4K (1088) PL",
    "1015": "Vidoctv HD (1015) PL",
    "1510": "Vidoctv 4K (1510) PL",
    "3639": "Filmoteka HD (3639) PL",
    "3902": "Sci Fi Fantasy HD (3902) PL",
    "3900": "Crime Tv HD (3900) PL",
    "3774": "Romance HD (3774) PL",
    "3348": "Thriller Zone HD (3348) PL",
    "3858": "Burza Uczyc HD (3858) PL",
    "3313": "Saving Hope HD (3313) PL",
    "2966": "Medical Series HD (2966) PL",
    "3441": "Seriale Kryminalne HD (3441) PL",
    "3317": "Anger Management HD (3317) PL",
    "3306": "Ransom HD (3306) PL",
    "3437": "Top Serials HD (3437) PL",
    "3473": "The Bridge HD (3473) PL",
    "3307": "Hell On Wheels HD (3307) PL",
    "3538": "The Sniffer HD (3538) PL",
    "3523": "The Goddess (3523) PL",
    "3506": "Big Steps HD (3506) PL",
    "2971": "Films Reality HD (2971) PL",
    "3333": "Bollywood HD (3333) PL",
    "1046": "Polsat Viasat Explore HD (1046) PL",
    "1487": "Planete HD (1487) PL",
    "3802": "Polsat X HD (3802) PL",
    "1051": "Bbc Earth HD (1051) PL",
    "1483": "Canal Domo HD (1483) PL",
    "941": "Nat Geo People HD (941) PL",
    "1024": "Polsat Viasat Nature HD (1024) PL",
    "1035": "Crime Investigation Polsat HD (1035) PL",
    "1048": "Docubox HD (1048) PL",
    "3935": "Tvp Nauka HD (3935) PL",
    "3753": "The World Inside Out HD (3753) PL",
    "3501": "Check In Klaudia I Michal HD (3501) PL",
    "2351": "Murder Maps HD (2351) PL",
    "2360": "Presidents Leaders HD (2360) PL",
    "1006": "Studiomed Tv HD (1006) PL",
    "1079": "English Club Tv HD (1079) PL",
    "1083": "Adventure HD (1083) PL",
    "1011": "Water Planet HD (1011) PL",
    "3614": "Movie Legends HD (3614) PL",
    "2873": "Hollywood Stories HD (2873) PL",
    "2353": "Movie Stars HD (2353) PL",
    "2369": "Video Killed The Radio Star HD (2369) PL",
    "2362": "Fashion History HD (2362) PL",
    "2389": "World S Personalities HD (2389) PL",
    "2361": "Myths Monsters HD (2361) PL",
    "3389": "Do Roboty HD (3389) PL",
    "3496": "Remont Na 5 HD (3496) PL",
    "3562": "Science And Innovation HD (3562) PL",
    "2617": "Pure Nature HD (2617) PL",
    "2368": "Historical Figures HD (2368) PL",
    "2367": "Monarchies Dynasties HD (2367) PL",
    "2388": "Raiders Of The Lost Art HD (2388) PL",
    "2363": "Legends Of The Opera HD (2363) PL",
    "3577": "Aranzacja Wnetrz HD (3577) PL",
    "1053": "Bbc Lifestyle HD (1053) PL",
    "1047": "Bbc Brit HD (1047) PL",
    "3920": "Tv Puls Inspiracje HD (3920) PL",
    "3499": "Moontalk HD (3499) PL",
    "3563": "Przemyslaw Gorczyk Podcast HD (3563) PL",
    "1484": "Canal Kuchnia HD (1484) PL",
    "3946": "Tvs Kulinaria HD (3946) PL",
    "3405": "Foxx Gotuje HD (3405) PL",
    "2649": "Men With The Pot HD (2649) PL",
    "3322": "Cooking With Byron Talbott HD (3322) PL",
    "3624": "Undersea Adventures HD (3624) PL",
    "3636": "Toon Town HD (3636) PL",
    "3843": "Little Monkey HD (3843) PL",
    "1488": "Teletoon HD (1488) PL",
    "1120": "Polsat Jim Jam (1120) PL",
    "3521": "Mattel Junior HD (3521) PL",
    "3522": "Barbie And Friends HD (3522) PL",
    "3609": "Ninja Action Channel HD (3609) PL",
    "3431": "Talking Tom Friends HD (3431) PL",
    "3445": "Talking Tom Shorts HD (3445) PL",
    "3590": "Baby Shark Tv HD (3590) PL",
    "3537": "Pingu HD (3537) PL",
    "3771": "Rodzina Treflikow HD (3771) PL",
    "1029": "Baby Tv (1029) PL",
    "1087": "Duck Tv HD (1087) PL",
    "1086": "Duck Tv Plus HD (1086) PL",
    "1084": "Junior Music HD (1084) PL",
    "3114": "Cocobi Tv Song HD (3114) PL",
    "3113": "Cocobi Tv Fun Play HD (3113) PL",
    "2091": "Da Vinci Operation Ouch HD (2091) PL",
    "2085": "Davinci Explore The World HD (2085) PL",
    "2096": "Da Vinci Fun To Learn HD (2096) PL",
    "3456": "Blip Tv HD (3456) PL",
    "3492": "Magical Smile Tv HD (3492) PL",
    "3813": "Polsat Sport Fight HD (3813) PL",
    "1033": "Fightbox HD (1033) PL",
    "1034": "Gametoon HD (1034) PL",
    "3805": "Polsat Games HD (3805) PL",
    "3669": "Trace Sport Stars HD (3669) PL",
    "3785": "World Of Free Sports HD (3785) PL",
    "3101": "Unbeaten Channel HD (3101) PL",
    "3010": "Truth About Sports HD (3010) PL",
    "3129": "Sport Fishing HD (3129) PL",
    "1355": "Cars Stars HD (1355) PL",
    "1193": "Biznes24 HD (1193) PL",
    "1263": "News24 HD (1263) PL",
    "1028": "Bbc World News HD (1028) PL",
    "3940": "Tvp World HD (3940) PL",
    "1604": "Current Time HD (1604) PL",
    "3553": "Biznes Misja HD (3553) PL",
    "3566": "France 24 HD (3566) PL",
    "1327": "France 24 English (1327) PL",
    "1328": "France 24 Arabic HD (1328) PL",
    "1362": "Trt World HD (1362) PL",
    "1330": "Euronews HD (1330) PL",
    "1045": "Kino Polska Muzyka (1045) PL",
    "1092": "Musicbox Polska HD (1092) PL",
    "3808": "Polsat Music HD (3808) PL",
    "3807": "Disco Polo Music HD (3807) PL",
    "3921": "Tv Puls Muzyka HD (3921) PL",
    "3947": "Tvs Muzyka HD (3947) PL",
    "3691": "Trace Urban HD (3691) PL",
    "3720": "Trace Uk HD (3720) PL",
    "3717": "Trace Brasil HD (3717) PL",
    "3688": "Trace Latina HD (3688) PL",
    "3818": "Eska Tv HD (3818) PL",
    "3817": "Eska Rock HD (3817) PL",
    "3819": "Eska Tv Extra HD (3819) PL",
    "3820": "Music Vox Tv HD (3820) PL",
    "3821": "4Fun Tv (3821) PL",
    "3823": "4Fun Dance (3823) PL",
    "2310": "London Live Music HD (2310) PL",
    "2314": "Livepop Concerts HD (2314) PL",
    "1018": "Stars Tv HD (1018) PL",
    "1091": "Nuta Tv HD (1091) PL",
    "1096": "Nuta Gold HD (1096) PL",
    "1097": "Power Tv HD (1097) PL",
    "1332": "Deluxe Music (1332) PL",
    "1078": "Active Family HD (1078) PL",
    "1095": "Home Tv HD (1095) PL",
    "1094": "Xtreme Tv HD (1094) PL",
    "1093": "Ultra Tv 4K (1093) PL",
    "1017": "Red Carpet Tv HD (1017) PL",
    "3937": "Belsat Tv HD (3937) PL",
    "1441": "Freedom HD (1441) PL",
    "1446": "Espreso Tv HD (1446) PL",
    "1504": "Tvp 3 Bialystok (1504) PL",
    "1505": "Tvp 3 Bydgoszcz (1505) PL",
    "1506": "Tvp 3 Gdansk (1506) PL",
    "1507": "Tvp 3 Gorzow (1507) PL",
    "1508": "Tvp 3 Katowice (1508) PL",
    "1509": "Tvp 3 Kielce (1509) PL",
    "1511": "Tvp 3 Krakow (1511) PL",
    "1512": "Tvp 3 Lublin (1512) PL",
    "1513": "Tvp 3 Lodz (1513) PL",
    "1514": "Tvp 3 Olsztyn (1514) PL",
    "1515": "Tvp 3 Opole (1515) PL",
    "1516": "Tvp 3 Poznan (1516) PL",
    "1517": "Tvp 3 Rzeszow (1517) PL",
    "1518": "Tvp 3 Szczecin (1518) PL",
    "1520": "Tvp 3 Wroclaw (1520) PL",
    "1436": "Fireplace 4K (1436) PL",
    "1437": "Aquarium 4K (1437) PL",
    "3941": "Kanal Zero HD (3941) PL"
}
# ==========================================
# NASTAVENIE
# ==========================================

BASE = "https://staticeu.sweet.tv/images/v2/icons/channels/v2"
OUTPUT = "/opt/epg/hu1.m3u"


# ==========================================
# VYTVORÍ SLUG
# ==========================================

def make_slug(name):
    text = unicodedata.normalize("NFKD", name)
    text = "".join(c for c in text if not unicodedata.combining(c))

    text = text.lower()
    text = text.replace("&", "-and-")
    text = re.sub(r"[^a-z0-9]+", "-", text)
    text = re.sub(r"-+", "-", text)

    return text.strip("-")


# ==========================================
# ŠPECIÁLNE SLUGY PRE HU LOGÁ
# ==========================================

logo_slugs = {
    "3373": "smurfs-hd",
    # sem môžeme doplniť ďalšie HU kanály
}


# ==========================================
# VYTVORENIE M3U
# ==========================================

Path(OUTPUT).parent.mkdir(parents=True, exist_ok=True)

seen = set()

with open(OUTPUT, "w", encoding="utf-8") as f:

    f.write("#EXTM3U\n")

    for cid, name in channels.items():

        if cid in seen:
            continue

        seen.add(cid)

        # odstráni napr. "(3924) UA" alebo "(3373) HU"
        logo_name = re.sub(
            r"\s*\(\d+\)\s*[A-Z]{2}$",
            "",
            name
        ).strip()

        # ak existuje špeciálny slug, použije sa
        # inak sa slug vytvorí automaticky z názvu
        slug = logo_slugs.get(cid)

        if not slug:
            slug = make_slug(logo_name)

        logo = f"{BASE}/{cid}-{slug}.png"

        f.write(
            f'#EXTINF:-1 cid="{cid}" '
            f'tvg-name="{name}" '
            f'tvg-logo="{logo}" '
            f'group-title="Live",{name}\n'
        )

        print(f"{cid} | {name} | {logo}")

print()
print("======================================")
print("HOTOVO")
print("======================================")
print(f"Kanály: {len(seen)}")
print(f"Výstup: {OUTPUT}")