• Vítejte na XBMC-Kodi.cz
  • Česko-slovenská komunita fanoušků XBMC/Kodi
Vítejte návštevníku! Přihlášení Registrace


Hodnocení tématu:
  • 0 Hlas(ů) - 0 Průměr
  • 1
  • 2
  • 3
  • 4
  • 5
Programátorské hrátky nejen s Kodi
#1
Úvodem

Protože na fóru vázne komunikace s administrátorem a v té souvislosti (kromě jiného) se nepodařilo uvést do praxe subfórum Téma/subfórum pro tvůrce, rozhodl jsem se jeho funkce substituovat tímto tématem. Pokud se nakonec subfórum podaří založit, bude to jedině dobře a pak tam můžeme zde prezentovaný obsah přenést.

Potřebujeme takové téma?

Tuhle otázku si položit je samozřejěm legitimní. Já osobně si myslím, že ano. Chápání významu Kodi a s ním tohoto fóra, totiž prodělalo v poslední době několik zásadních změn. Lidé ho začali vnímat jako více či méně komerční nástroj, s jehož pomocí si dokáží doma spustit nějakou, velmi často nepříliš legální, službu a to pomocí doplňku, který pro ně někdo napsal někdi z komunity a udržuje ho. To mělo poměrně neblahé následky, o kterých tady snad psát nemusím. Většinou asi budete vědět jaké. To zřejmě na jedné straně odstartovalo tolik vítané snížení zájmu o Kodi, na straně druhé ale, více než kdy jindy, přivedlo nové lidi k tomu, že se o doplňky Kodi a cesty, jak Kodi naplnit obsahem, zajímali stále více. Své pro to udělala i stále se rozvíjejích AI, s jejíž pomocí není dnes problém napsat doplněk do Kodi i člověku, který byl v této oblasti spíše jen mírně poučeným laikem. Svým způsobem se vlastně vracíme k původnímu účelu Kodi, jen s tím rozdílem, že teď více než dříve to bude záležitost individuální. Komunita už nebude tím místem, kde se tvoří doplňky, ale kde se lidé radí a diskutují, jak si ty doplňky napsat vlatními silami.

Co by v tématu mělo být obsaženo?
  • nápady a postřehy týkající se konkrétního programování, zejména v python, případně systémových scriptovacích jazycích, hlavně pro Linux, tedy sh a bash
  • dtto jako v předchozím bodě, ale orientované na programování doplňků Kodi
  • ukázky (pochlubení se 3) nebo i pro ostatní použitelné procedury a funkce, či v případě python spíše třídy a metody, které v sobě ponesou zajímavé funkce použitelné pro další porgramování v rámci systému, Tvheadend a Kodi
  • užitečné tipy a triky případně zjištěné problémy a nezvyklá chování nebo naopak to, co je zajímavé a užitečné, zejména v případě použití Kodi python knihoven a jejich implementace v doplňcích Kodi
  • jednoduché kompletní nástroje (programy) v python či systémových scriptech, které mohou usnadnit život se systémem, Tvheadend nebo Kodi
  • no a v neposlední řadě dotazy k existujícím příspěvkům, případně dotazy týkající se výše uvedeného typu porgramování.
    • Nechápejte ale prosím toto téma jako poradnu programovacího jazyka.
    • Jasně, pro pár jednoduchých dotazů, když si nebudete vědět rady, tady klidně položte, ale nedisktujte tady o jednotlivých chybách při ladění kódu vašeho scriptu nebo doplňku. Na to je k dispozici na internetu plno zdrojů.
    • Nehledě na to, že dnes se dá pro programování velmi efektivně použít některý z AI modelů. Není to žádná ostuda, nechat si od AI poradit či dokonce napsat kód nebo jen jeho část.
A co by se v tomto tématu nemělo vyskytovat?
  • vytvořené kompletní doplňky Kodi. Ty prosím prezentujte přímo v příslušných subfórech pro ně určených
  • dotazy na jakékoliv exitující doplňky. Ty prosím, jako v předchozím případě, pokládejte přímo v příslušných subfórech pro ně určených a tématech konkrétních doplňků, pokud existují nebo pokud je tam vytvoříte.
Jak v tomto tématu uvádět konkrétní příspěvky?
  1. Ideálně tak, že příspěvek zahájíte dostatečně rerezentativním a výrazným názvem (ideálně bold), který bude stručně charakterizovat o co jde.
  2. Poté by měl následovat krátký odstavec, ve kterém vysvětlíte, co vás k napsání kódu, metody nebo celého scriptu vedlo a co je jeho cílem.
  3. Pak vše popište tak, aby to ostatním dávalo smysl. A pokud budete do příspěvku umisťovat kód, prosím vždy pomocí funkce Vložit úryvek kódu.
  4. Pokud budete na nějaké předchozí příspěvky navazovat, zbytečně je necitujte. A pokud ano, tak pokud možno jenom ty důležité části. Případně na takové příspěvky umístěte do textu nového příspěvku rozumně pojmenovaný odkaz.
  5. A poslední zásada, která by měla být samozřejmostí (ale jak všichni vidíme, stálenení), dodržujte Pravidla fóra, včetně pravidel slušného chování a vůbec...
Jsem (až na výjimky) pouhým čtenářem fóra.
Nepokračuji tedy ani v tématech, která jsem založil.
To platí i pro doplňky Kodi a další aplikace, které jsou s takovými tématy spojené.
 
Citovat
#2
EPG a úpravy v xmltv souboru.

Občas máte k dispozici xmltv soubor, obvykle velmi rozsáhlý, a chcete z něj použít jen data pro určitý kanál nebo kanály. A občas se také stává, že identifikace kanálů je v tom konkrétním xmltv souboru jiná, než by se vám hodilo, resp. než má v sobě například playlist, na který se odkazujete. Možností, jak tohle řešit je více. Já jsem v průběhu doby narazil na několik situací, kdy jsem to řešil a vždy to bylo účelově vztažené jak ke konkrétnímu zdroji xmltv tak i ke konkrétnímu zdroji playlistu a způsobu jejich zpracování. Když jsem se nad tím zamyslel, uvědomil jsme si, že nejčastější řešení mělo následujcící atributy:
  • ze staženého xmltv.xml souboru jsem potřeboval pouze epg pro část kanálů,
  • ve staženém xmltv jsem potřeboval změnit id některých kanálů.
Základní řešení

Definoval jsem si metodu (proceduru), která:
  1. načte soubor xmltv
  2. vybere z něj pouze ty kanály, které mě zajímají - použije se pro to seznam id kanálů a zvolí se metodoa filtrace, "include" nebo "exclude"
  3. podle předem definovaného slovníku (relace původní id - nové id) změní id těch kanálů, které ve slovníku najde (ostatní ponechá nezměněná)
  4. uloží xmltv do souboru
V současné chvíli mám takovou metodu vytvořenou a ověřenou na reálném xmltv.
 
Kód:
from lxml import etree

def filter_xmltv(input_path, output_path, channel_ids, mode="include", replace_dict=None):
    """
    Filtruje XMLTV soubor podle seznamu ID kanálů a volitelně nahrazuje ID.

    :param input_path: cesta ke vstupnímu XMLTV souboru
    :param output_path: cesta pro výstupní XMLTV soubor
    :param channel_ids: seznam ID kanálů
    :param mode: "include" nebo "exclude"
    :param replace_dict: slovník pro nahrazení ID {původní_id: nové_id}, default None
    """
    assert mode in ("include", "exclude"), "mode musí být 'include' nebo 'exclude'"

    parser = etree.XMLParser(remove_blank_text=False)
    tree = etree.parse(input_path, parser)
    root = tree.getroot()

    # Funkce rozhodující, zda kanál/program zůstanou
    def keep_channel(cid):
        if mode == "include":
            return cid in channel_ids
        else:
            return cid not in channel_ids

    # Filtruj <channel> a nahraď ID, pokud je ve slovníku
    kept_channels = set()  # uložení zachovaných ID po nahrazení
    for ch in root.findall("channel"):
        original_id = ch.get("id")
        if not keep_channel(original_id):
            root.remove(ch)
            continue
        new_id = replace_dict.get(original_id, original_id) if replace_dict else original_id
        ch.set("id", new_id)
        kept_channels.add(new_id)

    # Filtruj <programme> a nahraď channel ID podle slovníku
    for prog in root.findall("programme"):
        original_id = prog.get("channel")
        if not keep_channel(original_id):
            root.remove(prog)
            continue
        new_id = replace_dict.get(original_id, original_id) if replace_dict else original_id
        # pouze pokud nový ID stále patří mezi zachované kanály
        if new_id in kept_channels:
            prog.set("channel", new_id)
        else:
            root.remove(prog)

    # Ulož XMLTV se zachováním formátování
    tree.write(
        output_path,
        encoding="utf-8",
        xml_declaration=True,
        pretty_print=True
    )
 
Její použití je možné např. v jednouchém (testovacím) python scriptu, který najdete v zip souboru na konci příspěvku. Všechny parametry jsou zadné v kódu, protože to je jen test!

Já metodu předpokládám použít jako součást cílového řešení scriptu, který bude peridodicky spouštěn na serveru, kde mi běží Tvheadend, ke získání EPG pro některé exotické kanály, které jsem našel v jednom existujícím xmltv. Script doplním o:
  • možnost zadání parametrů z příkazového řádku nebo z json souboru
  • zadávané parametry budou tyto:
    • vstupní soubor
    • výstupní soubor
    • seznam filtrovaných kanálů (volitelně jako přímo zadaný seznam nebo odkaz na soubor se seznamen)
    • volba include/exclude
    • slovník pro přejmenování id kanálů (volitelně jako přímo zadaný slovník nebo odkaz na soubor se slovníkem)
  • možnost načtení xmltv přímo z url adresy
  • vložení výsledného xmltv do Tvheadend pomocí externího graberu
Takže jakmile se k tomu dostanu, tak uvedený script dořeším a zveřejním v subfóru Tvheadend. Ještě mě napadá další možnost, využít metodu přímo v Kodi, pro script/service doplněk s podobnými vlastnostmi a funkcemi, jak jsem je popsal v případě použití pro Tvheadend. Ale tohle už berte spíše jako inspiraci a námět na využití i další rozvoj, kterého se třeba ujme někdo další.


Přiložené soubory
.zip   xmltv.zip (Velikost: 1,1 KB / Stažení: 3)
Jsem (až na výjimky) pouhým čtenářem fóra.
Nepokračuji tedy ani v tématech, která jsem založil.
To platí i pro doplňky Kodi a další aplikace, které jsou s takovými tématy spojené.
 
Citovat
  


Přejít na fórum:


Prochází: 1 host(ů)