15.7.2025, 17:56
[attachment=11815]Doplněk Command Macro, id script.macro je další z řady doplňků a řešení určených pro Kodi, které jsem zařadil do skupiny, kterou prezentuji jako Easy TOOLS.
Historie a návaznosti
Doplněk navazuje na řadu diskusí týkající se mapování tlačítek dálkových ovladačů, klávesnic a jiných I/O zařízení sloužících k ovládání Kodi, zejména pak případů, kdy je třeba stiskem jednoho tlačítka vykonat postupně více interních příkazů Kodi. Jistě, některé dálkové ovladače tuto funkci nabízejí (Logitech Harmony, Skip a celá řada dalších), ale ne vždy je takové zařízení k dispozici. Taková potřeba není nová, v minulosti již vzniko více řešení, které takovou funkci nabízeli a dají se i dnes ještě na internetu či v různých repozitářích najít. Jedno řešení je dokonce i z díny známého českého autora Romana Smolky a dá se ještě na Github najít. Já taková řešení v průběhu času používal také, vždycky šlo o mou vlastní produkci přizpůsobenou mým konkrétním potřebám, takže, když mě jeden z uživatelů požádal, zda bych něco takového nevytvořil i pro něj, sáhl jsme do vlastního šuplíku a jedno z mnou dříve používaných řešení jen mírně upravil do zveřejnitelné podoby.
Koncepce řešení
Koncepce řešení je velmi jednoduchá. Funkci vykonávání souboru příkazů/maker, zajišťuje jednoduchý doplněk typu script. Makra, která vykonává, se definují v rámci volání tohoto scriptu. Pro volání scriptu se v této základní verzi používá Kodi builtin příkaz RunScript(), jeho parametry, kromě identifikace vlastního scriptu, jsou všechny příkazy, které chceme po zavolání scriptu vykonat. Nejlepší to bude vysvětlit na dále uvedeném příkladu, kvůli kterému vlastně chtěl uživatel takový script mít k dispozici.
Požadavkem uživatele bylo, aby se před uspáním Kodi (resp. boxu, na kterém Kodi běží) zastavilo případné běžící přehrávání a teprve potom, ideálně po nějaké prodlevě, se vyslal samotný příkaz k uspání celého boxu. A to všechno by mělo fungovat tak, aby se taková sekvence dala spustit stiskem tlačítka POWER na dálkovém ovladači. Dosud uživatel používal mapování tlačítka POWER, které je namapované na Kodi builtin příkaz Shutdown, která jak známo vykonává příkaz definovaný v nastavení Kodi, tedy Nastavení > Systém > Úspora energie v položce Funkce vypínání, tedy buď Uspat nebo Vypnout. Podobně je možné box uspat i přímo, použitím builtin příkadu Suspend.
Principem použití script.macro je, že se v uživatelských parametrech mapování přemapuje tlačítko POWER a původně nastavená funkce se nahradí volnání scriptu script.macro s parametry odpovídající požadovanému chování při stisku tlačítka POWER. Nejlépe to asi vysvětlím právě na tom požadavku zmíněného uživatele, který chtěl, aby se po stisku POWER provedlo:
nebo takto:
V případě, budeme-li chtít zajistit výše uvedené chování podle požadavků uživatele, může při použítí script.macro mapovací soubor vypadat takto:
nebo takto:
Parametry volání script.macro
Myslím, že parametry volání jsou celkem jasné. Ale pro jistotu znova a pěkně popořádku:
Jaké příkazy můžeme na místě parametrů volání použít?
Jakýkoliv builtin příkaz Kodi, viz List of built-in functions a některý z aktuálně dostupných interních příkazů scriptu. V současné chvíli jsou k dispozici následujcíí interní příkazy:
Aktuální verze scriptu ke stažení je přiložena na konci tohoto příspěvku.
Historie a návaznosti
Doplněk navazuje na řadu diskusí týkající se mapování tlačítek dálkových ovladačů, klávesnic a jiných I/O zařízení sloužících k ovládání Kodi, zejména pak případů, kdy je třeba stiskem jednoho tlačítka vykonat postupně více interních příkazů Kodi. Jistě, některé dálkové ovladače tuto funkci nabízejí (Logitech Harmony, Skip a celá řada dalších), ale ne vždy je takové zařízení k dispozici. Taková potřeba není nová, v minulosti již vzniko více řešení, které takovou funkci nabízeli a dají se i dnes ještě na internetu či v různých repozitářích najít. Jedno řešení je dokonce i z díny známého českého autora Romana Smolky a dá se ještě na Github najít. Já taková řešení v průběhu času používal také, vždycky šlo o mou vlastní produkci přizpůsobenou mým konkrétním potřebám, takže, když mě jeden z uživatelů požádal, zda bych něco takového nevytvořil i pro něj, sáhl jsme do vlastního šuplíku a jedno z mnou dříve používaných řešení jen mírně upravil do zveřejnitelné podoby.
Koncepce řešení
Koncepce řešení je velmi jednoduchá. Funkci vykonávání souboru příkazů/maker, zajišťuje jednoduchý doplněk typu script. Makra, která vykonává, se definují v rámci volání tohoto scriptu. Pro volání scriptu se v této základní verzi používá Kodi builtin příkaz RunScript(), jeho parametry, kromě identifikace vlastního scriptu, jsou všechny příkazy, které chceme po zavolání scriptu vykonat. Nejlepší to bude vysvětlit na dále uvedeném příkladu, kvůli kterému vlastně chtěl uživatel takový script mít k dispozici.
Požadavkem uživatele bylo, aby se před uspáním Kodi (resp. boxu, na kterém Kodi běží) zastavilo případné běžící přehrávání a teprve potom, ideálně po nějaké prodlevě, se vyslal samotný příkaz k uspání celého boxu. A to všechno by mělo fungovat tak, aby se taková sekvence dala spustit stiskem tlačítka POWER na dálkovém ovladači. Dosud uživatel používal mapování tlačítka POWER, které je namapované na Kodi builtin příkaz Shutdown, která jak známo vykonává příkaz definovaný v nastavení Kodi, tedy Nastavení > Systém > Úspora energie v položce Funkce vypínání, tedy buď Uspat nebo Vypnout. Podobně je možné box uspat i přímo, použitím builtin příkadu Suspend.
Principem použití script.macro je, že se v uživatelských parametrech mapování přemapuje tlačítko POWER a původně nastavená funkce se nahradí volnání scriptu script.macro s parametry odpovídající požadovanému chování při stisku tlačítka POWER. Nejlépe to asi vysvětlím právě na tom požadavku zmíněného uživatele, který chtěl, aby se po stisku POWER provedlo:
- Zastavení případného přehrávání (video, hudba, TV, apod.).
- Nějaká kratší prodleva, např. 5 vteřin, aby se Kodi po skončení přehrávání dostalo do nějakého "klidného stavu". Je to vhodné (a doporučuje se to) zejména v případech, pokud se při přehrávání používá AFR.
- Vyslání finálního povelu k uspání či vypnutí.
Kód:
<keymap>
<global>
<keyboard>
<power>Shutdown()</power>
</keyboard>
</global>
</keymap>nebo takto:
Kód:
<keymap>
<global>
<keyboard>
<power>Suspend()</power>
</keyboard>
</global>
</keymap>V případě, budeme-li chtít zajistit výše uvedené chování podle požadavků uživatele, může při použítí script.macro mapovací soubor vypadat takto:
Kód:
<keymap>
<global>
<keyboard>
<power>RunScript(script.macro,Action(Stop),@Delay(5),Shutdown())</power>
</keyboard>
</global>
</keymap>nebo takto:
Kód:
<keymap>
<global>
<keyboard>
<power>RunScript(script.macro,Action(Stop),@Delay(5),Suspend())</power>
</keyboard>
</global>
</keymap>Parametry volání script.macro
Myslím, že parametry volání jsou celkem jasné. Ale pro jistotu znova a pěkně popořádku:
- RunScript() - builtin příkaz Kodi, kterým se spouští doplněk typu script
- script.macro - první parametr ve volání příkazu, kterým je vždy id doplňku, v našem případe tedy script.macro
- Action(Stop),
(5),Suspend() - následující příkazy (může jich být libovolně mnoho), které chceme, aby se spuštěním scriptu postupně vykonaly, kde: - Action(Stop) - builtin příkaz Kodi, který zastaví přehrávání
(5) - interní příkaz doplňku script.macro, který vloží do sekvence vykonávaných příkazů prodlevu danou hodnotou svého danou parametru, v tomto případě je to tedy 5 vteřin. Parametr je typu float, může to tedy být kladné reálné číslo větší než 0.
- Shutdown() nebo Suspend() - zajistí, že Kodi se uvede do stavu podle nastavení Kodi - v případě Shutdown() nebo se rovnou uspí - v případě Suspend().
- Action(Stop) - builtin příkaz Kodi, který zastaví přehrávání
Jaké příkazy můžeme na místě parametrů volání použít?
Jakýkoliv builtin příkaz Kodi, viz List of built-in functions a některý z aktuálně dostupných interních příkazů scriptu. V současné chvíli jsou k dispozici následujcíí interní příkazy:
(<time>) - s jedním parametrem <time>, kterým je čas čekání (prodleva) ve vteřinách, parametr je ve tvaru celé nebo reálné číslo >0, např. tedy 0.5, 1, 1.2, 5, ... Defaultní hodnota parametru, tedy pokud parametr chybí, je 0.5.
- NEW
(<time>) - s jedním parametrem <time>, kterým je čas čekání (prodleva) ve vteřinách, parametr je ve tvaru celé nebo reálné číslo >0, např. tedy 0.5, 1, 1.2, 5, ... Defaultní hodnota parametru, tedy pokud parametr chybí, je 0.5. Příkaz je kombinací builtin příkazu Action(Stop) a interního příkazu (<time>). V případě, pokud se v době spuštění scriptu něco přehrává, provede script příkaz k ukončení přehrávání a pak čeká zadaný čas. Pokud se ale nic nepřehrává, tak script nečeká.
- Script zásadně nekontroluje syntaxi Kodi builtin příkazů. Pokud patametr neobsahuje vedoucí znak @, posílá script celý řetězec do Kodi prostřednictvím knihovní metody xbmc.executebuiltin().
- V případě, pokud je parametr uvozen znakem @, považuje to script za interní příkaz a kontroluje jeho syntaxi a jeho vlastní parametry. Syntaxe je dána jednoduchou stuturou Command(parameter1, parameter2, ... parameterN). V rámci interního popisu syntaxe každého interního příkazu je definován počet a typy parametrů (integer, float, string, boolean). Pokud typ skutečného parametru neodpovídá typu definovanému v interním popisu syntaxe, jde o chybu a interní příkaz nebude vykonán a chyba se zapíše do logu Kodi. Podobné je to i v případě, pokud bude v paramtrech volání script.macro použito neznámý název interního příkazu.
- Název interních příkazů funkcí je tzv. case insensitive, tzn. že můžete napsa
, či jakkoliv jinak, např. .
- bude použita defaultní hodnota parametru, která je pro tento příkaz 0.5
() - bude použita defaultní hodnota parametru, která je pro tento příkaz 0.5
(0.5)
- Nezkoušejte zadávat do parametru
hodnotu 0. Pokud to uděláte, bude script čekat neomezeně dlouho a vysvobodí vás pouze jeho Zakázání/Povolení nebo restart Kodi.
- O žádných chybách nevím, budu ale rád, pokud mi je nahlásíte, pokud k nim dojde.
- Uvažoval o doplnění interních funkcí, které by uživatelům dovolily zadávat nějaký vlastní podmínky. Například čekej do ukončení nebo zahájení nějaké akce a pak pokračuj ve vykonávání makra. Ale tohle je při možnostech pouze lineárního zápisu docela složité, spíše půjdu cestou, že pokud se nějaký takový požadavek vyskytne, já ho s pomocí knihovních funkcí Kodi zakóduji do python a nadefinuji pro něj nový interní příkaz s odpovídajícími parametry.
- Protože parametrem volání může být interní příkaz, je možné ve volání scriptu zavolat i samotný script.macro s vlastními (i jinými) parametry. Vytvoří se nová instance, na té původní nezávislá. EDIT Toto bohužel tak úplně neplatí. Ona se sice nová instance vytvoří, ale ta stará poběží dál bez ohledu na stav té nové. Není to tedy tak, jak by člověk předpokládal, že se při vytvoření nové instance ta stará pozastaví a "počká" na dokončení té nové. Tím pádem to není úplně použitelné pokud člověk předpokládá, že se příkazy v obou instancích budou vykonávat postupně tak, jak jsou za sebou seřazené.
Aktuální verze scriptu ke stažení je přiložena na konci tohoto příspěvku.