• 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:
  • 10 Hlas(ů) - 2.6 Průměr
  • 1
  • 2
  • 3
  • 4
  • 5
Estuary Easy
@radoorech Vlastní Home stránka je definována v Home.xml, ale to víš, když jsi to už upravoval. 6 Widgety jsou definované také v tomto souboru, ale většinou je to formou volání includes, které jsou definované v souboru Inludes_Home.xml.
 
Citovat
@JiRo: Mam ešte jednu otázku. Pri sledovaní tv je možné zobraziť informácie s TVH.  SNR, Sila Signálu a ďalšie. 
Stlačením klávesy "o" (písmeno). Je to integrovane v skine alebo v tvh klientovi? Chcel by som to mat na hornej liste, Tam kde máš ty hw informácie a podobne.


Přiložené soubory Miniatury
   
 
Citovat
@jojox Jedná se o skupinu informací PVR. Nejlepší je podívat se do definičního souboru skinu DialogPlayerProcessInfo.xml, tam najdeš všechno, takže ti to bude myslím jasné.

Jen nevím, co se zobrazí v případě, když nepoběží Live TV, takže bych doporučoval podmínit zobrazení stavem VideoPlayer.Content(livetv). Takže do každého control bloku dát podmínku:
 
Kód:
<visible>VideoPlayer.Content(livetv)</visible>

(31.3.2022, 10:55)hardo12 Napsal(a): Potreboval by som opäť pomôcť vytvoril som si na novo skin lebo ten čo som mal strašne padal tak som si spravil jednoduchý ale chcel som tam mat widget info samozrejme som ho nahodil podlá návodu z príspevku  #9 a urobil aj opravu z príspevku #135 ale kodi na coreeleku stále padá vedel by mi s tým niekto pomôcť. Este by som sa chcel opýtať ako pridám názov filmu na hornú časť widgetu ako je to na obrázku nižšie (posledné sledovane: názov filmu).

Nějak se stalo, že jsem se k odpovědi na Tvůj příspěvek nedostal. Možná proto, že to není úplně jednoduché. Skinning vyžaduje (alespon já to tak dělám) specifický postup. Dělat úpravy postupně, a vždycky, když se dostane člověk do situace, kdy něco přestane fungovat, udělat krok zpět a zkoušet (klidně metodou pokus-omyl, co to způsobuje. Je to proto, že Kodi moc (či píše skoro vůbec) chyby v definičních souborech skinu neloguje. Znamená to, kromě jiného, že pokud člověk u toho stroje s Kodi přímo nesedí, tak se to ladí dost těžko, protože ani poslat log (díky absenci  informací v něm) většinou nestačí. Co vím, tak problémy u widget info způsobuje např. zobrazování sad filmů, protože tohle Kodi řeší docela komplikovaně (s prohledáváním databáze) a pokud se zobrazují sady např. z addon, tak tam použít kód z widgetu sad filmá z databáze dost dobře nejde. Doporučoval bych postupně, jeden po druhém, ty widget info odstraňovat, a až ti to přestane padat, tak se na ten widget, zaměřit. Nic lepšího ti teď bohužel nemohu poradit.

I na ten druhý požadavek není úplně jendoduchá odpověď. Tohle se řeší na třech místech a pro každý widget, ve kterém to chceš použít. Jednak se musí v Home.xml ve volání include widgetu předat nějak parametry definující, co v tom řádku zobrazovat. Pak se musí v každé definici widgetu v Include_Home.xml předat tyto parametry dalšímu volání include <include content="CategoryLabel"> no a nakonec se musí v tomto posledním include vytvořit to zobrazení podle předaných parametrů. Já jsem tohle řešil v několika verzích a různým způsobem. Nakonec jsem dospěl k celkem univerzálnímu řešení, až budu mít chvíli čas, popíšu to tu detailně.
 
Citovat
Barvy stránek nastavení CoreELEC

CoreELEC je znám tím, že pro výchozí skin Kodi (Estuary) volí defaultně netradiční barvy, "pekelně" červenou například. Barvu každého vzhledu lze samozřejmě kdykoliv změnit. Co je však problém, když použijete jiný skin, tak funkce barvy nastavení CoreELEC se vám, oproti default barvě výchozímu skinu (např. oné pekelně červené) nezmění. Nastavení CoreELEC je addon typu script/service, takže jeho zobrazení (definiční soubory skinu) je uloženo v něm. Což o to, tohle by změnit šlo, potíž je v tom, že tak jako u většiny *ELEC instalací, se do této části disku nedostanete tak snadno. Jak z tohto ven?

Řešení je jednoduché. Stačí nakopírovat adresář addon service.coreelec.settings z původního umístění /storage/.kodi/addons do umístění /storage/.kodi/userdata/addon_data. Kodi, jak známo, funguje v případě, kdy se v obou adresářích vyskytuje addon se stejným id tak, že dá přednost tomu umístěném v adresáři druhém. No a pak už je snadné najít v tomto umístění adresář .../service.coreelec.settings/resources/skins/ a provést v něm případné změny odpovídající vámi používanému skinu. Je-li tím skinem nějaký mod skinu Estuary, postačí většinou udělat kopii adresáře skin.estuary a přejmenovat ji na id (jméno adresáře) vašeho skinu.

Otázka je, co se stane, pokud si nainstalujete novou verzi CoreELEC. Tady se nedá jednozančně říci, jak postupovat, záleží na tom, jak moc se addon service.coreelec.settings změnil. Nejbezpečnější tedy je, celý ten postup zopakovat.

Adresář v addon service.coreelec.settings pak může vypadat třeba takto:
   
První dva soubory jsou součástí instalace addon, třetí je přejmenovaná kopie druhého. Patrně by místo kopie stačilo udělat symlink, to jsem ale nezkoušel.

Výsledek pak vypadá pro skin.estuary-easy takto:
   
Bez výše popisované úpravy by to ale bylo takto:
   
 
Citovat
Kopie Estuary

V souvislosti s přechozím příspěvkem, kde jsem popisoval možnost překopírování addon z adresáře /storage/.kodi/addons do adresáře /storage/.kodi/userdata/addon_data, jsem dostal dotaz, zda je totéž možné udělat i se skinem Estuary. A odpověď je celkem očekávaná. Samozřejmě, lze.

Skin se z tohoto pohledu chová jako každý addon a pokud tedy chcete u *ELEC instalací provést jen drobnou změnu a nechcete kvůli tomu zkopírované Estuary přejmenovávat a mít tak v Kodi další skin, lze to provést i takto jednoduše. Samozřejmě se zbavíte možnosti rychle se z upraveného Estuary přepnou do toho standardního a vystavíte se nutnosti složitějšímu postupu při změně verze Estuary po aktualizaci Kodi resp. *ELEC. Naštěstí k tomuhle nedochází tak často. Přesto je namístě otázka, zda je právě tohle ten ideální postup. Já osobně, při modifikacích skinu Estuary, vždycky postupuji tak, že si kopii přejmenuji.
 
Citovat
Kalendářové hrátky

Pod dojmem toho, že když už mívá člověk často spuštěné Kodi, mohl by na něm vidět i nějaké zajímavé informce (datum, čas, počasí, ...) jsem doplnil do datumové části i jiné často očekávané informace, zejména pak informaci o tom, kdo má svátek, zda je volno a nově i informaci o tom, zda velké obchody mají zavřeno. Záhy jsem byl upozorněn na to, že je sice hezké vědět, že dnes mají ty obchody zavřeno, ale že "taková informace je mi dnes už k prdu, daleko praktičtější informace je, zda obchody budou mít zavřeno zítra, kterou jsme ale měla dostat už včera". Proti tomu jsem nic namítat nemohl. Má, holka (jako ostatně většinou vždy), pravdu. 1

Kalendářové informace beru ze stránky Vanio a používám api ve formátu json https://svatky.vanio.cz/api/. Používám na to univerzální addon Monitor, který běží na pozadí jako addon typu service a sbírá mi celou řadu infromací, které pak zobrazuji v Kodi. Co se týče informací o kalendáři, tak je addon zapisuje do Kodi windows properties calendar_nameDaycalendar_weekendcalendar_holidaycalendar_holidayNamecalendar_shops a v poslední době přidaného calendar_shops_tomorrow.

Zobrazení data je ve skinu Estuary definováno v souboru includes.xml, konkrétně v include TopBar. Původní zobrazení data i dalších informací kolem něj sdružených jsem nahradil novým include DateTimeWheater. Uvedu ho tady celý, protože obsahuje pár zajímavých postupů a na jeden tady zvlášť upozorním.
 
Kód:
    <include name="DateTimeWheater"> <!-- EASY+ -->
        <definition>
            <control type="label">  <!-- EASY* [Monitor] System time - Monitor doesn't run -->
                <font>font_clock</font>
                <shadowcolor>text_shadow</shadowcolor>
                <height>200</height>
                <width>auto</width>
                <animation effect="fade" start="100" end="0" time="300" condition="Window.Next(screencalibration)">WindowClose</animation>
                <label>[B]$INFO[System.Time(hh)]:$INFO[System.Time(mm)][/B]</label>
                <!-- <visible>![Skin.HasSetting(show_monitor_runs) + String.IsEqual(Window(Home).Property(monitor_phase),ACTIVE) + Skin.HasSetting(kodi_monitor) + System.HasAddon(service.monitor)]</visible>  <!-- EASY+ Monitor doesn't runs --> -->
                <visible>![String.IsEqual(Window(Home).Property(monitor_phase),ACTIVE) + System.HasAddon(service.monitor)]</visible>
            </control>
            <control type="label">  <!-- EASY+ [Monitor] System time - Monitor runs -->
                <font>font_clock</font>
                <height>200</height>
                <width>auto</width>
                <animation effect="fade" start="100" end="0" time="300" condition="Window.Next(screencalibration)">WindowClose</animation>
                <shadowcolor>text_shadow</shadowcolor>
                <!-- <label>[COLOR red]$INFO[System.Time][/COLOR]</label> -->
                <label>[B]$INFO[System.Time(hh)][COLOR red]:[/COLOR]$INFO[System.Time(mm)][/B]</label>
                <!-- <visible>Skin.HasSetting(show_monitor_runs) + String.IsEqual(Window(Home).Property(monitor_phase),ACTIVE) + Skin.HasSetting(kodi_monitor) + System.HasAddon(service.monitor)</visible> -->
                <visible>String.IsEqual(Window(Home).Property(monitor_phase),ACTIVE) + System.HasAddon(service.monitor)</visible>
            </control>
            <control type="group">  <!-- EASY+ System time seconds -->
                <width>45</width>
                <control type="label">
                    <top>12</top>
                    <right>50</right>
                    <width>auto</width>
                    <animation effect="fade" start="100" end="0" time="300" condition="Window.Next(screencalibration)">WindowClose</animation>
                    <shadowcolor>text_shadow</shadowcolor>
                    <label>[B]$INFO[System.Time(ss),:][/B]</label>
                    <!-- <visible>Skin.HasSetting(show_seconds)</visible> -->
                </control>
            </control>
            <control type="group">  <!-- EASY+ Volume muted -->
                <width>-10</width>
                <control type="image" id="1">
                    <top>45</top>
                    <right>5</right>
                    <width>40</width>
                    <height>40</height>
                    <fadetime>300</fadetime>
                    <aspectratio aligny="center" align="center">keep</aspectratio>
                    <texture>dialogs/volume/mute.png</texture>
                    <visible>Player.Muted</visible>
                </control>
            </control>
            <control type="group">  <!-- EASY+ Shops closed indicator -->
                <visible>false</visible>
                <!-- <visible>String.IsEqual(Window(Home).Property(calendar_shops),CLOSED) + Skin.HasSetting(kodi_monitor) + System.HasAddon(service.monitor)</visible> -->
                <visible>String.IsEqual(Window(Home).Property(calendar_shops),CLOSED) + System.HasAddon(service.monitor)</visible>
                <width>16</width>
                <control type="image">
                    <top>24</top>
                    <width>16</width>
                    <height>16</height>
                    <aspectratio>keep</aspectratio>
                    <texture colordiffuse="button_focus">special://skin/extras/icons/status/lock.png</texture>
                </control>
            </control>
            <control type="group">  <!-- EASY+ Shops closed indicator -->
                <!-- <visible>String.IsEqual(Window(Home).Property(calendar_shops),CLOSED) + Skin.HasSetting(kodi_monitor) + System.HasAddon(service.monitor)</visible> -->
                <visible>[String.IsEqual(Window(Home).Property(calendar_shops),CLOSED) | String.IsEqual(Window(Home).Property(calendar_shops_tomorrow),CLOSED)] + System.HasAddon(service.monitor)</visible>
                <width>-10</width>
                <control type="image">
                    <top>24</top>
                    <width>16</width>
                    <height>16</height>
                    <aspectratio>keep</aspectratio>
                    <texture colordiffuse="button_focus">special://skin/extras/icons/status/lock.png</texture>
                    <visible>String.IsEqual(Window(Home).Property(calendar_shops),CLOSED) + !String.IsEqual(Window(Home).Property(calendar_shops_tomorrow),CLOSED)</visible>
                </control>
                <control type="image">
                    <top>24</top>
                    <width>16</width>
                    <height>16</height>
                    <aspectratio>keep</aspectratio>
                    <texture colordiffuse="grey">special://skin/extras/icons/status/lock.png</texture>
                    <visible>!String.IsEqual(Window(Home).Property(calendar_shops),CLOSED) + String.IsEqual(Window(Home).Property(calendar_shops_tomorrow),CLOSED)</visible>
                </control>
                <control type="group">
                    <visible>String.IsEqual(Window(Home).Property(calendar_shops),CLOSED) + String.IsEqual(Window(Home).Property(calendar_shops_tomorrow),CLOSED)</visible>
                    <control type="image">
                        <top>22</top>
                        <left>2</left>
                        <width>16</width>
                        <height>16</height>
                        <aspectratio>keep</aspectratio>
                        <texture colordiffuse="grey">special://skin/extras/icons/status/lock.png</texture>
                    </control>
                    <control type="image">
                        <top>24</top>
                        <left>-2</left>
                        <width>16</width>
                        <height>16</height>
                        <aspectratio>keep</aspectratio>
                        <texture colordiffuse="button_focus">special://skin/extras/icons/status/lock.png</texture>
                    </control>
                </control>
            </control>
            <control type="label">  <!-- EASY+ [Monitor] System Date - work day, not holiday -->
                <font>font10</font>
                <shadowcolor>text_shadow</shadowcolor>
                <height>95</height>
                <width>auto</width>
                <aligny>center</aligny>
                <animation effect="fade" start="100" end="0" time="300" condition="Window.Next(screencalibration)">WindowClose</animation>
                <label>$VAR[ShopsClosedSpace][B]$INFO[System.Date(dd. MMM)] $INFO[System.Date(DDD)][CR]$INFO[Window(Home).Property(calendar_nameDay),, ][/B]</label>
                <!-- <visible>Skin.HasSetting(show_date) + String.IsEqual(Window(Home).Property(calendar_weekend),NO) + String.IsEqual(Window(Home).Property(calendar_holiday),NO) + Skin.HasSetting(kodi_monitor) + System.HasAddon(service.monitor)</visible> -->
                <visible>String.IsEqual(Window(Home).Property(calendar_weekend),NO) + String.IsEqual(Window(Home).Property(calendar_holiday),NO) + System.HasAddon(service.monitor)</visible>
            </control>
            <control type="label">  <!-- EASY+ [Monitor] System Date - weekend day, not holiday -->
                <left>-25</left>
                <font>font10</font>
                <shadowcolor>text_shadow</shadowcolor>
                <height>95</height>
                <width>auto</width>
                <aligny>center</aligny>
                <animation effect="fade" start="100" end="0" time="300" condition="Window.Next(screencalibration)">WindowClose</animation>
                <label>$VAR[ShopsClosedSpace][B]$INFO[System.Date(dd. MMM)] [COLOR red]$INFO[System.Date(DDD)][/COLOR][CR]$INFO[Window(Home).Property(calendar_nameDay),,  ][/B]</label>
                <!-- <visible>Skin.HasSetting(show_date) + String.IsEqual(Window(Home).Property(calendar_weekend),YES) + String.IsEqual(Window(Home).Property(calendar_holiday),NO) + Skin.HasSetting(kodi_monitor) + System.HasAddon(service.monitor)</visible> -->
                <visible>String.IsEqual(Window(Home).Property(calendar_weekend),YES) + String.IsEqual(Window(Home).Property(calendar_holiday),NO) + System.HasAddon(service.monitor)</visible>
            </control>
            <control type="label">  <!-- EASY+ [Monitor] System Date - work day, holiday -->
                <font>font10</font>
                <shadowcolor>text_shadow</shadowcolor>
                <height>95</height>
                <width>auto</width>
                <aligny>center</aligny>
                <animation effect="fade" start="100" end="0" time="300" condition="Window.Next(screencalibration)">WindowClose</animation>
                <label>$VAR[ShopsClosedSpace][B][COLOR red]$INFO[System.Date(dd. MMM)][/COLOR] $INFO[System.Date(DDD)][CR]$INFO[Window(Home).Property(calendar_nameDay),, ][/B]</label>
                <!-- <visible>Skin.HasSetting(show_date) + String.IsEqual(Window(Home).Property(calendar_weekend),NO) + String.IsEqual(Window(Home).Property(calendar_holiday),YES) + Skin.HasSetting(kodi_monitor) + System.HasAddon(service.monitor)</visible> -->
                <visible>String.IsEqual(Window(Home).Property(calendar_weekend),NO) + String.IsEqual(Window(Home).Property(calendar_holiday),YES) + System.HasAddon(service.monitor)</visible>
            </control>
            <control type="label">  <!-- EASY+ [Monitor] System Date - weekend, holiday -->
                <font>font10</font>
                <shadowcolor>text_shadow</shadowcolor>
                <height>95</height>
                <width>auto</width>
                <aligny>center</aligny>
                <animation effect="fade" start="100" end="0" time="300" condition="Window.Next(screencalibration)">WindowClose</animation>
                <label>$VAR[ShopsClosedSpace][B][COLOR red]$INFO[System.Date(dd. MMM)][/COLOR] [COLOR red]$INFO[System.Date(DDD)][/COLOR][CR]$INFO[Window(Home).Property(calendar_nameDay),,  ][/B]</label>
                <!-- <visible>Skin.HasSetting(show_date) + String.IsEqual(Window(Home).Property(calendar_weekend),YES) + String.IsEqual(Window(Home).Property(calendar_holiday),YES) + Skin.HasSetting(kodi_monitor) + System.HasAddon(service.monitor)</visible> -->
                <visible>String.IsEqual(Window(Home).Property(calendar_weekend),YES) + String.IsEqual(Window(Home).Property(calendar_holiday),YES) + System.HasAddon(service.monitor)</visible>
            </control>
            <control type="group">  <!-- EASY+ Weather -->
                <visible>false</visible>
                <top>0</top>
                <right>15</right>
                <align>right</align>
                <width>80</width>
                <!-- <visible>Skin.HasSetting(show_weathericon) + Skin.HasSetting(show_weatherinfo) + Weather.IsFetched + ![String.IsEqual(Weather.FanartCode,na)] + !Window.IsVisible(extendedprogressdialog)</visible> -->
                <!-- <visible>Skin.HasSetting(show_weathericon) + Skin.HasSetting(show_weatherinfo) + Weather.IsFetched + ![String.IsEqual(Weather.FanartCode,na)]</visible> -->
                <visible>Weather.IsFetched + ![String.IsEqual(Weather.FanartCode,na)]</visible>
                <animation effect="fade" time="150">VisibleChange</animation>
                <control type="image">
                    <top>10</top>
                    <width>80</width>
                    <height>80</height>
                    <fadetime>300</fadetime>
                    <texture>$INFO[Weather.FanartCode,special://xbmc/addons/resource.images.weathericons.default/resources/,.png]</texture>
                </control>
            </control>
            <control type="label">  <!-- EASY+ Weather Temperature-->
                <font>font10</font>
                <height>95</height>
                <width>auto</width>
                <aligny>center</aligny>
                <animation effect="fade" start="100" end="0" time="300" condition="Window.Next(screencalibration)">WindowClose</animation>
                <shadowcolor>text_shadow</shadowcolor>
                <label>[B][CR]$INFO[Window(Weather).Property(Current.Temperature)]$INFO[System.TemperatureUnits, ][/B]</label>
                <!-- <visible>Skin.HasSetting(show_weathericon) + Skin.HasSetting(show_weatherinfo) + Weather.IsFetched + ![String.IsEqual(Weather.FanartCode,na)]</visible> -->
                <visible>Weather.IsFetched + ![String.IsEqual(Weather.FanartCode,na)]</visible>
            </control>
            <control type="group">  <!-- EASY+ Weather Icon -->
                <width>-10</width>
                <!-- <visible>Skin.HasSetting(show_weathericon) + Skin.HasSetting(show_weatherinfo) + Weather.IsFetched + ![String.IsEqual(Weather.FanartCode,na)]</visible> -->
                <visible>Weather.IsFetched + ![String.IsEqual(Weather.FanartCode,na)]</visible>
                <control type="image">
                    <top>10</top>
                    <right>5</right>
                    <align>right</align>
                    <width>40</width>
                    <height>40</height>
                    <fadetime>300</fadetime>
                    <texture>$INFO[Weather.FanartCode,special://xbmc/addons/resource.images.weathericons.default/resources/,.png]</texture>
                </control>
            </control>
            <control type="group">  <!-- EASY+ Weather -->
                <visible>false</visible>
                <top>0</top>
                <right>15</right>
                <align>right</align>
                <width>50</width>
                <!-- <visible>Skin.HasSetting(show_weathericon) + Skin.HasSetting(show_weatherinfo) + Weather.IsFetched + ![String.IsEqual(Weather.FanartCode,na)] + !Window.IsVisible(extendedprogressdialog)</visible> -->
                <visible>Skin.HasSetting(show_weathericon) + Skin.HasSetting(show_weatherinfo) + Weather.IsFetched + ![String.IsEqual(Weather.FanartCode,na)]</visible>
                <animation effect="fade" time="150">VisibleChange</animation>
                <control type="image">
                    <top>15</top>
                    <right>5</right>
                    <align>right</align>
                    <width>40</width>
                    <height>40</height>
                    <fadetime>300</fadetime>
                    <texture>$INFO[Weather.FanartCode,special://xbmc/addons/resource.images.weathericons.default/resources/,.png]</texture>
                </control>
                <control type="label">
                    <top>48</top>
                    <right>5</right>
                    <width>80</width>
                    <align>right</align>
                    <font>font10</font>
                    <shadowcolor>text_shadow</shadowcolor>
                    <label>[B]$INFO[Window(Weather).Property(Current.Temperature)]$INFO[System.TemperatureUnits, ][/B]</label>
                </control>
                <control type="label">
                    <top>48</top>
                    <right>5</right>
                    <width>80</width>
                    <align>right</align>
                    <font>font10</font>
                    <shadowcolor>text_shadow</shadowcolor>
                    <label>$INFO[Weather.Location] </label>
                    <visible>Skin.HasSetting(show_weatherlocation)</visible>
                    <visible>false</visible>
                </control>
            </control>
        </definition>
    </include>
Předně je tedy připomenout, že tento řádek informací je v Estuary koncipován jako grouplist, horizontálně řazený zprava do leva. Funguje tedy tak, že se jednotlivé informace řadí dynamicky zprava a jsou odděleny pevnou mezerou. To dynamicky znamená, že pokud je příslušná informace prázdná, tak se nezobrazí a ostatní se posunou tak, že po chybějící informaci nezvnikne mezera. Znamená to také, že pokud se šířka informace změní, příslušně se posunou i informace nalevo (protože seznam se řadí zprava) od ní.

Koncipoval jsem informace do skupin, z nichž jednu jsem vyhradil pro informace o datu, ve kterých by měly být zobrazeny postupně a ve dvou řádcích informace o zavřených obchodech dnes a zítra, den (číslo) a měsíc (text), den v týdnu (text) - to v prvním řádku - a jméno toho, kdo má v daný den svátek v řádku druhém. Zároveń jsem potřeboval, aby to celé bylo posuzováno jak jeden text a to i přesto, že symbol zavřených obchodů bude obrázek (ikona zámku). Rozdělení do dvou řádků nebyl problém, na to stačí do textu vložt metaznak [CR]. Skin engin si s tím poradí a pokud se v tagu <lenght> použije parametr auto, nastaví šířku celého elementu podle šířky nejdelšího (v tomto případě ze dvou řádků) řádku. Co bylo složitější, to na začátek toho textu, a jestě podmíněně, vložit obrázek (obrázky) symboliztující zavřené obchody dnes, zítra a nebo dnes i zítra. Nakonec pomohl malý trik a použití proměnné skinu $VAR. V proměnné, která je podmíněně naplněna, podle toho zda dnes a/nebo zítra jsou zavřené obchody, mezerami, odpovídající šířce místa pro umístění obrázku symbolu zámku.

Vlastní obsah labelu obsahujícího texty tedy vypadá takto:
 
Kód:
<label>$VAR[ShopsClosedSpace][B]$INFO[System.Date(dd. MMM)] $INFO[System.Date(DDD)][CR]$INFO[Window(Home).Property(calendar_nameDay),, ][/B]</label>
Tato definice je tam vícekrát, protože kromě jiného ještě obsahuje varianty barev textu pro svátky a volné dny. Volné místo pro symbol zámku je v místě, kde je zobrazena hodnota proměnné ShopsClosedSpace. Ta je plněná v definici proměnných, a to následovně:
 
Kód:
    <variable name="ShopsClosedSpace"> <!-- EASY+ Shops are closed -->
        <value condition="String.IsEqual(Window(Home).Property(calendar_shops),CLOSED) | String.IsEqual(Window(Home).Property(calendar_shops_tomorrow),CLOSED)">[B]    [/B]</value>
        <value></value>
    </variable>
Zbývá tedy popsat, jak je do prostoru, vyhrazeného mezerami v definici proměnné ShopsClosedSpace vložen příslušný symbol (-y). Tady jsme si pomohl trikem, který umožňuje v grouplist seznamu posunout pozici elementu. Použitím tagu <left> to nejde, ale stačí použít konstrukci se zápornou šířkou (v případě horizontálního seznamu)  a dosáhneme požadovaného výsledku. Vypadá to takto:
 
Kód:
            <control type="group">  <!-- EASY+ Shops closed indicator -->
                <!-- <visible>String.IsEqual(Window(Home).Property(calendar_shops),CLOSED) + Skin.HasSetting(kodi_monitor) + System.HasAddon(service.monitor)</visible> -->
                <visible>[String.IsEqual(Window(Home).Property(calendar_shops),CLOSED) | String.IsEqual(Window(Home).Property(calendar_shops_tomorrow),CLOSED)] + System.HasAddon(service.monitor)</visible>
                <width>-10</width>
                <control type="image">
                    <top>24</top>
                    <width>16</width>
                    <height>16</height>
                    <aspectratio>keep</aspectratio>
                    <texture colordiffuse="button_focus">special://skin/extras/icons/status/lock.png</texture>
                    <visible>String.IsEqual(Window(Home).Property(calendar_shops),CLOSED) + !String.IsEqual(Window(Home).Property(calendar_shops_tomorrow),CLOSED)</visible>
                </control>
                <control type="image">
                    <top>24</top>
                    <width>16</width>
                    <height>16</height>
                    <aspectratio>keep</aspectratio>
                    <texture colordiffuse="grey">special://skin/extras/icons/status/lock.png</texture>
                    <visible>!String.IsEqual(Window(Home).Property(calendar_shops),CLOSED) + String.IsEqual(Window(Home).Property(calendar_shops_tomorrow),CLOSED)</visible>
                </control>
                <control type="group">
                    <visible>String.IsEqual(Window(Home).Property(calendar_shops),CLOSED) + String.IsEqual(Window(Home).Property(calendar_shops_tomorrow),CLOSED)</visible>
                    <control type="image">
                        <top>22</top>
                        <left>2</left>
                        <width>16</width>
                        <height>16</height>
                        <aspectratio>keep</aspectratio>
                        <texture colordiffuse="grey">special://skin/extras/icons/status/lock.png</texture>
                    </control>
                    <control type="image">
                        <top>24</top>
                        <left>-2</left>
                        <width>16</width>
                        <height>16</height>
                        <aspectratio>keep</aspectratio>
                        <texture colordiffuse="button_focus">special://skin/extras/icons/status/lock.png</texture>
                    </control>
                </control>
            </control>
Výsledek je vidět na příložených screenshot-ech. Postupně zleva reálný stav, tedy dnes i zítra obchody otevřené, a simulované stavy, obchody zavřené dnes = modrý symbol zámku, zítra = šedý symbol zámku a dnes i zítra = modrý a pod ním částečně překrytý šedý symbol zámku.
               
Pokud by někoho zajímalo, jak ty stavy simuluji, tak k tomu mám vyrobenou definici uživatelského okna, do které si mohu vkládat různé definice pro simulované nastavení proměnných skinu a window properties. Momentálně okno vypadá takto:
   
A pokud by někoho zajímala definice tohoto testovacího okna, tak ta je zde (zatím bez dalšího komentáře a vysvětlení):
Kód:
<?xml version="1.0" encoding="utf-8"?>
<window type="dialog" id="1162"> <!-- EASY+ Skin & properties viewing and setting -->
    <defaultcontrol always="true">1100</defaultcontrol>
    <include>Animation_DialogPopupOpenClose</include>
    <controls>
        <control type="group">
            <centerleft>50%</centerleft>
            <width>1800</width>
            <centertop>50%</centertop>
            <height>780</height>
            <include content="DialogBackgroundCommons">
                <param name="width" value="100%" />
                <param name="height" value="100%" />
                <param name="header_label" value="Skin & properties viewing and setting" />
                <param name="header_id" value="1" />
            </include>
            <control type="group">
                <left>0</left>
                <top>75</top>
                <width>1800</width>
                <height>700</height>
                <control type="grouplist" id="1100">
                    <left>0</left>
                    <width>600</width>
                    <onleft>1300</onleft>
                    <onright>1200</onright>
                    <control type="radiobutton" id="1101">
                        <label>Master skin level</label>
                        <include>DefaultSettingButton</include>
                        <selected>Skin.HasSetting(skinlevel_master)</selected>
                        <onclick>Skin.ToggleSetting(skinlevel_master)</onclick>
                    </control>
                </control>
                <control type="grouplist" id="1200">
                    <left>600</left>
                    <width>600</width>
                    <onleft>1100</onleft>
                    <onright>1300</onright>
                    <control type="button" id="1201">
                        <label>Jmeniny</label>
                        <include>DefaultSettingButton</include>
                        <label2>$INFO[Window(Home).Property(calendar_nameDay)]</label2>
                    </control>
                    <control type="button" id="1202">
                        <label>St.svátek</label>
                        <include>DefaultSettingButton</include>
                        <label2>$INFO[Window(Home).Property(calendar_holidayName)]</label2>
                        <onclick>Skin.SetString(input,$INFO[Window(Home).Property(calendar_holidayName)])</onclick>
                        <onclick>Skin.SetString(input)</onclick>
                        <onclick>SetProperty(calendar_holidayName,$INFO[Skin.String(input)],Home)</onclick>
                    </control>
                    <control type="button" id="1203">
                        <label>Víkend</label>
                        <include>DefaultSettingButton</include>
                        <label2>$INFO[Window(Home).Property(calendar_weekend)]</label2>
                        <onclick condition="String.IsEmpty(Window(Home).Property(calendar_weekend)">SetProperty(calendar_weekend,YES,Home)</onclick>
                        <onclick condition="String.IsEqual(Window(Home).Property(calendar_weekend),YES">SetProperty(calendar_weekend,NO,Home)</onclick>
                        <onclick condition="String.IsEqual(Window(Home).Property(calendar_weekend),NO">ClearProperty(calendar_weekend,Home)</onclick>
                    </control>
                    <control type="button" id="1204">
                        <label>Svátek</label>
                        <include>DefaultSettingButton</include>
                        <label2>$INFO[Window(Home).Property(calendar_holiday)]</label2>
                        <onclick condition="String.IsEmpty(Window(Home).Property(calendar_holiday)">SetProperty(calendar_holiday,YES,Home)</onclick>
                        <onclick condition="String.IsEqual(Window(Home).Property(calendar_holiday),YES">SetProperty(calendar_holiday,NO,Home)</onclick>
                        <onclick condition="String.IsEqual(Window(Home).Property(calendar_holiday),NO">ClearProperty(calendar_holiday,Home)</onclick>
                    </control>
                    <control type="button" id="1205">
                        <label>Obchody</label>
                        <include>DefaultSettingButton</include>
                        <label2>$INFO[Window(Home).Property(calendar_shops)]</label2>
                        <onclick condition="String.IsEmpty(Window(Home).Property(calendar_shops)">SetProperty(calendar_shops,OPENED,Home)</onclick>
                        <onclick condition="String.IsEqual(Window(Home).Property(calendar_shops),OPENED">SetProperty(calendar_shops,CLOSED,Home)</onclick>
                        <onclick condition="String.IsEqual(Window(Home).Property(calendar_shops),CLOSED">ClearProperty(calendar_shops,Home)</onclick>
                    </control>
                    <control type="button" id="1206">
                        <label>Roční období</label>
                        <include>DefaultSettingButton</include>
                        <label2>$VAR[Season]</label2>
                    </control>
                </control>
                <control type="grouplist" id="1300">
                    <left>1200</left>
                    <width>600</width>
                    <onleft>1200</onleft>
                    <onright>1100</onright>
                </control>
            </control>
        </control>
    </controls>
</window>
 
Citovat
Vypnutí Skinu

I když se to nezdá, tak skin může být pro některý HW pěkným "žroutem" CPU. To, v kombinaci se situací, kdy nechceme/nemůžeme vypínat HW na kterém Kodi běží, může držet teplotu CPU na zbytečně vysoké hodnotě.

Když tedy nechceme CPU v době, kdy Kodi "nepotřebujeme", ohřívat více než je nezbytně nutné, a přitom nemůžeme vypnout/uspat kompletně celý HW, máme několik možností:
  • zastavit běh celého Kodi
  • vypnout skin
  • aktivovat vhodný screensaver
Zastavení běhu celého Kodi někdy není použitelné, pokud člověk nechce přijít o ty procesy, které běží v Kodi na pozadí. Aktivování vhodného screensaveru omezí spotřebu CPU poměrně výrazně, ale stále ještě ne tak, jak poslední způsob, a tím je deaktivování celého skinu.

Jak na to?

Nejjednodušší způsob je, přidat si odpovídající příkazy do Power Menu Kodi. To najdeme u Estuary v definičním souboru skinu DialogButtonMenu.xml. V případě používání DO jsou pak možné dva příklady. Pro jakýkoli typ je možné přidat odpovídající příkazy do mapování tlačítek, v případě DO s IR komunikací pak je možné využít vlastní definici zpracování tlačítek na úrovni systému, kde je to pro některé systémy jednodušší (Linux, např. viz irexec -d /storage/.config/keymaps.cfg), u některých to bude o něco složitější (Windows), ale jde to také.

Jaké použít příkazy?

V případě zastavení Kodi se můžeme inspirovat ve výše uvedeném souboru DialogButtonMenu.xml, kde pokud je možné v daném systému Kodi ukončit, použijeme tento příkaz. Není-li to možné (*ELEC), pak nám tu samou službu zajistí systémový příkaz, např. systemctl stop kodi.

Pro vypnutí a následné zapnutí skinu máme v Kodi dvojici builtin příkazů UnloadSkin() a ReloadSkin().

Pro aktivaci screensaveru najdeme pak vKodi příkaz ActivateScreensaver.

Bude jistě zajímavé vědět, jak se vám u které metody teplota sníží.

Já osobně používám právě vypínání skinu, a tam mi teplota CPU u mého Beelink GT King klesne o necelých 10 °C. Možná se to někomu bude zdát hodně, ale já mám s tímto typem HW zkušenost takovou, že nejvyšší teplotu CPU mám zpravidla ve chvíli, kdy mám zobrazenou Home stránku. Jakmile začnu přehrávat, a může to být například HEVC, 4K, HDR 10, teplota CPU významně klesne.

EDIT 2022-08-15
Aktuálně u mého Kodi používám řešení označené výše ve výčtu možností jako zastavit běh celého Kodi. Pokud to někoho zajímá, najde podrobnější popis v Trvale běžící *ELEC a ukončení Kodi.
 
Citovat
@JiRo: Ahoj chtěl jsem se zeptat je možné přidat do základního skinu spodní info dock? Pokud je to možné tak je to náročné a nebo to zvládnu i já? Děkuji

[Obrázek: ddd.jpg]
 
Citovat
@kevinlos Nevím, co je to spodní info dock? Pokud jde o ta ovládací tlačítka, tak ta v základním skinu jsou. Aktivují se ale pouze při full screen zobrazení přehrávaného obsahu po stisku ENTER/OK. Doplňující informace v OSD je pak třeba přidat do příslšného OSD zobrazení. Je to poměrně komplexní, to jednoduše nevysvětlím...
 
Citovat
Systémové informace - úprava zobrazení

Obsah zobrazení v části systémové informace se definuje poměrně specificky. Je definován v definičním souboru SettingsSystemInfo.xml. Na rozdíl od většiny podobných zobrazení není ale jeho obsahem (až na dále uvedené výjimky) odkaz do databáze Kodi nebo odpovídajících InfoLabels, ale je zvolen přesně opačný postup. Definiční soubor slouží pouze k definici formátování a vlastní hodnoty jsou dodány prostřednictvím odpovídajícího modulu Kodi, který adresuje jednotlivé id.

Zmíněnou výjimkou jsou pouze informace umístěné ve spodní části, kde se zobrazuje Využití systémové paměti a Využití procesoru systémem.

Já jsme si do zobrazení doplnil informace, které získávám pomocí jednoduchého addon Monitor, což je trvale běžící service, která cyklicky (v různých periodách) sbírá potřebná data. Tyto informace ukládám do Kodi properties, protože jsou využívávány i jinde (např. v horním stavovém řádku). Aby se daly tyto nové infromace začlenit do stávajícího zobrazení, je třeba pro jednotlivé části najít ty control block, které jsou na příslušné stránce použity. Identifikují se pomocí podmínky Contro.HasFocus() použité v tagu <visible></visible>.

Příkladem je například zobrazení doplňujcích infomací na stránce Síť, kam jsme přidal zobrazení aktuální veřejné IP adresy (property ip_address) a sadu informcí o aktuální rychlosti down a up-loadu a celkové objemy přenesených dat od startu Kodi. Výsledek pak vypadá nějak takto:
   

V kódu to vypadá takto (id 8 a 9 jsou formáty původních původních veličin, mezi ně je vložena nová definice):
Kód:
...
                <control type="label" id="8">
                    <height>47</height>
                    <width>1400</width>
                    <font>Mono26</font>
                </control>
                <control type="label"> <!-- EASY+ -->
                    <height>47</height>
                    <width>1400</width>
                    <font>Mono26</font>
                    <label>$INFO[Window(Home).Property(ip_address),Veřejná IP adresa: ]</label>            
                    <visible>Control.HasFocus(96)</visible>
                </control>
                <control type="label"> <!-- EASY+ -->
                    <height>47</height>
                    <width>1400</width>
                    <font>Mono26</font>
                    <label>Rychlost přenosu · $INFO[Window(Home).Property(rx_mbps),Download: ,Mbps] · $INFO[Window(Home).Property(tx_mbps),Upload: ,Mbps]</label>            
                    <visible>Control.HasFocus(96)</visible>
                </control>
                <control type="label"> <!-- EASY+ -->
                    <height>47</height>
                    <width>1400</width>
                    <font>Mono26</font>
                    <label>Přenesená data od spuštění Kodi · $INFO[Window(Home).Property(rx_dat),Download: ,MB] · $INFO[Window(Home).Property(tx_dat),Upload: ,MB]</label>            
                    <visible>Control.HasFocus(96)</visible>
                </control>
                <control type="label" id="9">
                    <height>47</height>
                    <width>1400</width>
                    <font>Mono26</font>
                </control>
...
Pozn. Jde pouze o výřez z definičního souboru.

Kromě toho jsme si ve spodní části doplnil zobrazení hodnoty User agent, pod kterým se identifikuje instalovaná verze Kodi. Tento údaj se občas hodí znát.
 
Citovat
(26.12.2022, 21:36)JiRo Napsal(a): @kevinlos Nevím, co je to spodní info dock? Pokud jde o ta ovládací tlačítka, tak ta v základním skinu jsou. Aktivují se ale pouze při full screen zobrazení přehrávaného obsahu po stisku ENTER/OK. Doplňující informace v OSD je pak třeba přidat do příslšného OSD zobrazení. Je to poměrně komplexní, to jednoduše nevysvětlím...

Ovládací tlačítka jdou nějak odstranit? Mám to nastavené, že se mi vždy skryje po 5 sekundách, ale je to docela otravné když znovu kliknu a vyskočí nabídka. Jinak první jsem měl na mysli osd informační panel zda jde okopírovat do jiného skinu.
 
Citovat
@kevinlos Tak upravit skin jde jakkoliv, jen je otázka jak. Pokud se ve skiningu nevyznáš, bude to ale složité. Jednoduše to popsat, to je samo o sobě docela práce.

Odstranit ovládací tlačítka ve skinu sice lze, ale v tvém případě by asi bylo lepší dosáhnout toho, že se jejich zobrazení vůbec neaktivuje. A to není ani tak záležitost skinu, ale spíše přemapování příslušných aktivit (klávesnice, myš, remote) které dané zobrazení aktivují pro daná okna zobrazení (např. FullscreenVideo).

Kopírovat definice z jednoho skinu do druhého přímo nelze. Každý skin definuje zobrazení trochu jinak. Lze se ale isnpirovat, tzn. najít si to, jak je to udělané v jednom skinu a pak to analogicky a odpovídajícím způsobem definovat v jiném. Ale opět, je to poměrně dsost práce a chce to jisté zkušenosti.
 
Citovat
(28.12.2022, 14:44)JiRo Napsal(a): @kevinlos Tak upravit skin jde jakkoliv, jen je otázka jak. Pokud se ve skiningu nevyznáš, bude to ale složité. Jednoduše to popsat, to je samo o sobě docela práce.

Odstranit ovládací tlačítka ve skinu sice lze, ale v tvém případě by asi bylo lepší dosáhnout toho, že se jejich zobrazení vůbec neaktivuje. A to není ani tak záležitost skinu, ale spíše přemapování příslušných aktivit (klávesnice, myš, remote) které dané zobrazení aktivují pro daná okna zobrazení (např. FullscreenVideo).

Kopírovat definice z jednoho skinu do druhého přímo nelze. Každý skin definuje zobrazení trochu jinak. Lze se ale isnpirovat, tzn. najít si to, jak je to udělané v jednom skinu a pak to analogicky a odpovídajícím způsobem definovat v jiném. Ale opět, je to poměrně dsost práce a chce to jisté zkušenosti.

@JiRo: Dobře děkuji a zkusím si pohrát s přemapováním.
 
Citovat
@JiRo: Zkoušel jsem smazat tlačítka v dialogseekbar ve skinu aeon.nox 5.

Smazal jsem tohle | Player.DisplayAfterSeek | Player.Paused | Player.Forwarding | Player.Rewinding | Player.Caching] | [Window.IsActive(fullscreenvideo)

A místo tlačítek mě to smazalo informační lištu. A zůstala jen spodní lišta s tlačítky.

Poradil by jsi co přesně musím smazat? Děkuji za pomoc

Tohle je original z Aeon skinu

String.IsEmpty(Window(Home).Property(Enable.ScreenshotMode)) + !Window.IsActive(visualisation) + !Player.HasGame + !Player.FrameAdvance + !Window.IsActive(pvrosdchannels) + ![Player.Paused + Window.IsActive(1134) + !Skin.HasSetting(Disable.Netflix.Pause)] VideoPlayer.IsFullscreen + [Window.IsActive(videoosd) | Window.IsActive(fullscreeninfo) | Player.ShowInfo | Player.Seeking | Player.DisplayAfterSeek | Player.Paused | Player.Forwarding | Player.Rewinding | Player.Caching] | [Window.IsActive(fullscreenvideo) + !String.IsEmpty(PVR.ChannelNumberInput)] 1 60 60 915 60 $INFO[PVR.ChannelNumberInput] font_MainMenu black !String.IsEmpty(PVR.ChannelNumberInput) !VideoPlayer.Content(LiveTV) + ![Player.Paused + Skin.HasSetting(CleanPauseScreen) + !Window.IsActive(fullscreeninfo)] 1014 !Window.IsVisible(SliderDialog) WindowOpen WindowClose Visible Hidden Conditional Conditional 25 100.1% 135 osd/texturebg.png 100% 135 bottombar.png 100% 135 bottombar.png 25 100% 40 osd/texturebg.png osd/midtexture_cache.png Player.ProgressCache 25 100% 36 osd/texturebg_cache.png osd/midtexture.png Player.Progress 27 100% 22 seekslider2.png slidernib_alt.png slidernib_alt.png Player.Seeking 24 Conditional 830 90 font14_title 15 grey shadow top -2 $VAR[PlayerTitleLabelVar] true 1020 900 90 font14_title 15 grey shadow right top -2 $VAR[OSDRightLabelVar] 24 100% 90 font14_title 15 grey shadow center top -2 $VAR[SeekLabelVar] 1460 -244 450 260 keep $VAR[PlayerArtworkVar] ! [Window.IsVisible(DialogSettings.xml) | Window.IsVisible(subtitlesearch) | Window.IsVisible(1115) | Window.IsVisible(fullscreeninfo)] Conditional Player.Paused 867 378 !Skin.HasSetting(PausedLabel) 186 186 osd/bg_play_large.png 186 186 osd/btn_pause.png 367 100% 200 center [UPPERCASE]$LOCALIZE[112][/UPPERCASE] BigAssTimeFont B3FFFFFF Skin.HasSetting(PausedLabel) 30 120 748 150 10 horizontal VisibleFadeAnimation Player.Forwarding | Player.Rewinding true 3 90 87 keep osd/ff.png FFe5e5e5 Conditional Player.Rewinding $VAR[VideoPlayerForwardRewindVar] auto 90 0 font_MainMenu 44000000 DDe5e5e5 3 90 87 keep osd/ff.png FFe5e5e5 Conditional Player.Forwarding !Window.IsVisible(pvrchannelguide) + !Window.IsVisible(pvrosdchannels) FullScreenInfoBarLiveTV
 
Citovat
@kevinlos Nevím, o jakou verzi či mod jde. Já vím pouze o té z Kodi Add-on repository, což je skin Aeon Nox: SiLVO s id skin.aeon.nox.silvo. Tím bys měl začít, tedy jasně identifikovat o jaký skin jde. Já je všechny zpaměti neznám.

To co jsi postnul je také k ničemu - fragment nějakého definičního kódu vložený navíc jako hromada textu bez jakéhokoliv formátování.

Pokud se podívám na výše uvedený skin, tak definice zobrazení lišty s tlačítky je obsažena v definičním souboru VideoOSD.xml v části volání include
 
Kód:
            <control type="group">
                <visible>false + ![Window.IsVisible(playerprocessinfo) | Window.IsVisible(SliderDialog) | Window.IsVisible(pvrchannelguide) | Window.IsVisible(PVROSDTeletext) | Window.IsVisible(PVROSDChannels) | Window.IsVisible(OSDVideoSettings) | Window.IsVisible(OSDAudioSettings) | Window.IsVisible(OSDSubtitleSettings) | Window.IsVisible(VideoBookmarks) | Window.IsVisible(SubtitleSearch) | Window.IsVisible(1115)]</visible>
                <animation effect="fade" end="100" time="239.76" condition="Skin.HasSetting(VideoOSDOnTop)">Visible</animation>
                <animation effect="fade" end="100" time="239.76" delay="239.76" condition="!Skin.HasSetting(VideoOSDOnTop)">Visible</animation>
                <include condition="!VideoPlayer.Content(LiveTV)">DefaultVideoOSD</include>
                <include condition="VideoPlayer.Content(LiveTV)">PVRVideoOSD</include>
            </control>

Jde o include DefaultVideoOSDPVRVideoOSD. První popisuje formát pro přehrávání obyčejného videa, druhé videa PVR. Máš několik možností. Buď jednouše zakázat celý výše uvedený control blok (smazat, zakomentovat nebo do jeho <visible></visible> tagu vložit logický výraz/hodnotu tak, aby celý tag měl hodnotu false. Ale musíš počítat s tím, že se to pak nebude chovat korektně. Ony ty definice spolu souvisí, obsahují ještě i popisy jiných akcí a jen prosté zrušením něčeho nemusíš dosáhnout ideálního výsledku. Další možností je, upravit ty výše uvedené include. Ale musíš si nalézt, kde jsou definovány. Do toho se mi nechce, to si už musíš nalézt sám... Chceš-li si upravovat skin, měl by sis něco o skiningu zjistit. Ideálně zde Skinning Manual.
 
Citovat
@JiRo: Super děkuji tohle jsem potřeboval a tlačítka jsou pryč. Jen když tohle smažu a chci kliknout OK pro zobrazeni informačního lišty tak se nezobrazi, ale to až tak zase nevadí. Je to tím, že jsem smazal tlačítka tak to asi nebude fungovat. Děkuji za pomoc
 
Citovat
@kevinlos Jo jo, to je důsledek jednoduché změny. Pokud bys to chtěl dokonaleji, musely by se upravit až definice v těch include DefaultVideoOSD a PVRVideoOSD, jak jsem psal i výše, což už by bylo zase o chlup složitější.
 
Citovat
Kalendář pro Skinnery

Už několikrát jsem v Kodi (a hlavně ve skinu) řešil akce nebo zobrazení, závislé na datu. Úplně první byla změna ikon počasí, podle ročních období, později pak rozšíření datových informací o jmeniny, státní svátky a dny volna nebo dny, kdy mají velké obchody zavřeno. Datové operace řeším ve spolupráci s jednoduchým addon, který z externího serveru načítá potřebná data. Zde v tématu jsem o tom už ostatně psal. Roční období jsem zase vyřešil jednoduchým dopočtem přímo ve skinu a jeho výsledky používám ke změně základního background obrázku (fanart-u). No a před časem jsme dopočet doplnil o zobrazení vánočního fanartu.

O Vánocích jsem přemýšleli, že by to jen u těch Vánoc skončil nemuselo. Zprvu jsem uvažoval o addon, ale pak jsem si řekl, že by přeci nemělo být složité, vytvořit celý zamýšlený kalendář v dopočtech skinu.

Zadání bylo celkem jednoduché. Jsou v zásadě potřeba dvě věci:
  • informaci o tom, že právě nastal významný den, skupina dní nebo roční období
  • jednoduše vygenerovaný odkaz na soubor nebo adresář, ve které lze nalézt k výše uvedenému časovémui období vhodné informace (ikony, fanarty, ...)
Aby to řešení bylo více univerzální, první jeho část, definici dní, skupin dní nebo ročních období jsme zobecnil a formalizoval pomocí tzv. expressions, např. tedy takto:
 
Kód:
    <expression name="day_valentinesday">System.Date(02-14,02-15)</expression>
    <expression name="period_easter">System.Date(04-03,04-11)</expression>
    <expression name="season_spring">System.Date(03-20,06-21)</expression>
Pro druhou část, které se nyní může díky té první velmi libovolně rozšiřovat o další funkce, jsem naopak využil tzv. variables, např. tedy takto:
 
Kód:
    <variable name="background_picture_path">
        <value condition="$EXP[day_newyear]">day/newyear</value>
    </variable>
Uvedený příklad vytváří na základě výsledku logické operace (v tomto případě pouze je to ale vyhodnocení jedné logické proměnné) část cesty k souboru nebo adresáři s uloženým obrázkem. Možnosti jsou rozmanité. S pomocí výsledku  logické operace můžeme například ve skinu definovat cestu k adresáři, ve kterém budou uloženy background obrázky a ve skinu je pak periodicky načítat (pomocí tzv. multiimage) a zobrazovat postupně jeden po druhém.

Vytvořil jsme první verzi kalendáře, a protože o něj měl zájem kamarád, který není původem od nás, přizpůsobil jsem ho jeho potřebám (angličtina). Má smíšenou, židovsko-křesťanskou rodinu, takže jsem tak trochu počítal s tím, co asi bude zajímat tu křesťanskou část (i když ani tady není úplně všechno). On si tam prý doplní tu část druhou. A pokud budu mít zájem , tak mi pak konečnou verzi taky dá. Doufám, že nebude hebrejsky... 3

Výsledek tedy vypadá takto:
 
Kód:
<?xml version="1.0" encoding="UTF-8"?>
<includes>
    <description>Valid for Czech calendar and 2023 Year only</description>
    <expression name="day_newyear">System.Date(01-01,01-02)</expression>
    <expression name="day_valentinesday">System.Date(02-14,02-15)</expression>
    <expression name="day_goodfriday">System.Date(04-07,04-08)</expression>
    <expression name="day_eastermonday">System.Date(04-10,04-11)</expression>
    <expression name="day_laborday">System.Date(05-01,05-02)</expression>
    <expression name="day_victoryday">System.Date(05-08,05-09)</expression>
    <expression name="day_cyrilandmethodius">System.Date(07-05,07-06)</expression>
    <expression name="day_johnhus">System.Date(07-06,07-07)</expression>
    <expression name="day_saintwenceslas">System.Date(09-28,09-29)</expression>
    <expression name="day_csrise">System.Date(10-28,10-29)</expression>
    <expression name="day_velvetrevolution">System.Date(11-17,11-18)</expression>
    <expression name="day_advent_sunday_1">System.Date(12-03,12-04)</expression>
    <expression name="day_advent_sunday_2">System.Date(12-10,12-11)</expression>
    <expression name="day_advent_sunday_3">System.Date(12-17,12-18)</expression>
    <expression name="day_advent_sunday_4">System.Date(12-24,12-25)</expression>
    <expression name="day_chanukach_candle_1">System.Date(12-07,12-08)</expression>
    <expression name="day_chanukach_candle_2">System.Date(12-08,12-09)</expression>
    <expression name="day_chanukach_candle_3">System.Date(12-09,12-10)</expression>
    <expression name="day_chanukach_candle_4">System.Date(12-10,12-11)</expression>
    <expression name="day_chanukach_candle_5">System.Date(12-11,12-12)</expression>
    <expression name="day_chanukach_candle_6">System.Date(12-12,12-13)</expression>
    <expression name="day_chanukach_candle_7">System.Date(12-13,12-14)</expression>
    <expression name="day_chanukach_candle_8">System.Date(12-14,12-15)</expression>
    <expression name="day_christmaseve">System.Date(12-24,12-25)</expression>
    <expression name="day_christmasday">System.Date(12-25,12-26)</expression>
    <expression name="day_saintstephen">System.Date(12-26,12-27)</expression>
    <expression name="day_newyearseve">System.Date(12-31)</expression>
    <expression name="period_easter">System.Date(04-03,04-11)</expression>
    <expression name="period_chanukach">System.Date(12-08,12-16)</expression>
    <expression name="period_advent">System.Date(12-03,12-25)</expression>
    <expression name="period_christmas">System.Date(12-24,12,27)</expression>
    <expression name="period_christmastree">System.Date(12-24) | System.Date(01-01,01-07)</expression>
    <expression name="season_spring">System.Date(03-20,06-21)</expression>
    <expression name="season_summer">System.Date(06-21,09-23)</expression>
    <expression name="season_autumn">System.Date(09-23,12-22)</expression>
    <expression name="season_winter">System.Date(12-22) | System.Date(01-01,03-21)</expression>
    <variable name="background_picture_path">
        <value condition="$EXP[day_newyear]">day/newyear</value>
        <value condition="$EXP[day_valentinesday]">day/valentinesday</value>
        <value condition="$EXP[day_goodfriday]">day/goodfriday</value>
        <value condition="$EXP[day_eastermonday]">day/eastermonday</value>
        <value condition="$EXP[day_laborday]">day/laborday</value>
        <value condition="$EXP[day_victoryday]">day/victoryday</value>
        <value condition="$EXP[day_cyrilandmethodius]">day/cyrilandmethodius</value>
        <value condition="$EXP[day_johnhus]">day/johnhus</value>
        <value condition="$EXP[day_saintwenceslas]">day/saintwenceslas</value>
        <value condition="$EXP[day_csrise]">day/csrise</value>
        <value condition="$EXP[day_velvetrevolution]">day/velvetrevolution</value>
        <value condition="$EXP[day_advent_sunday_1] + Skin.HasSetting(advent_sunday)">day/adventsunday1</value>
        <value condition="$EXP[day_advent_sunday_2] + Skin.HasSetting(advent_sunday)">day/adventsunday2</value>
        <value condition="$EXP[day_advent_sunday_3] + Skin.HasSetting(advent_sunday)">day/adventsunday3</value>
        <value condition="$EXP[day_chanukach_candle_1] + Skin.HasSetting(chanukach_candle)">day/chanukachcandle1</value>
        <value condition="$EXP[day_chanukach_candle_2] + Skin.HasSetting(chanukach_candle)">day/chanukachcandle2</value>
        <value condition="$EXP[day_chanukach_candle_3] + Skin.HasSetting(chanukach_candle)">day/chanukachcandle3</value>
        <value condition="$EXP[day_chanukach_candle_4] + Skin.HasSetting(chanukach_candle)">day/chanukachcandle4</value>
        <value condition="$EXP[day_chanukach_candle_5] + Skin.HasSetting(chanukach_candle)">day/chanukachcandle5</value>
        <value condition="$EXP[day_chanukach_candle_6] + Skin.HasSetting(chanukach_candle)">day/chanukachcandle6</value>
        <value condition="$EXP[day_chanukach_candle_7] + Skin.HasSetting(chanukach_candle)">day/chanukachcandle7</value>
        <value condition="$EXP[day_chanukach_candle_8] + Skin.HasSetting(chanukach_candle)">day/chanukachcandle8</value>
        <value condition="$EXP[day_christmaseve]">day/christmaseve</value>
        <value condition="$EXP[day_advent_sunday_4] + Skin.HasSetting(advent_sunday)">day/adventsunday4</value>
        <value condition="$EXP[day_christmasday]">day/christmasday</value>
        <value condition="$EXP[day_saintstephen]">day/saintstephen</value>
        <value condition="$EXP[day_newyearseve]">day/newyearseve</value>
        <value condition="$EXP[period_easter]">period/easter</value>
        <value condition="$EXP[period_chanukach]">period/chanukach</value>
        <value condition="$EXP[period_christmas]">period/christmas</value>
        <value condition="$EXP[period_advent]">period/advent</value>
        <value condition="$EXP[season_spring]">season/spring</value>
        <value condition="$EXP[season_summer]">season/summer</value>
        <value condition="$EXP[season_autumn]">season/autumn</value>
        <value condition="$EXP[season_winter]">season/winter</value>
    </variable>
</includes>
Protože je toto téma určeno pro skinnery, nebudu to nijak dlouze popisovat. Ve většině případů je ve výrazu pro condition pouze jedna proměnná. Vyjímkou jsou adventní neděle a jednotlivé "svíčky" chanuky, kde je možné si vybrat (pomocí proměnné skinu a logické operace), zda tyto dva typy dnů z obou období chceme do výsledku zahrnout. Jina připomínám, že výběr ve variables probíhá sekvenčně a první splněná podmínka výběr ukončí. Podle toho je obsah sestaven, aby se prioritně vyhodnocovaly jendotlivé dny, pak skupiny dní a nakonec roční období. Vyřešil jsem jednouše, vhodným řazením, i případné konflikty mezi dny, prioritizuji chanuku (je kratší) před adventem, ale zase jednotlivé významné dny adventu (neděle) před těmi chanukovými a nakonec Štědrý den před 4. adventní nedělí (které letos připadnou na stejný den). 

Kalendář je platný pouze pro rok 2023. Prozatím nepočítám s jeho úpravou do univerzálnější podoby, to bych už musel použít nějaký addon, protože na to už budu potřebovat externí zdroj, ze kterého si ty pohyblivé svátky rád stáhnu. Velikonoce a adventní čas sice umím spočítat, ale do chanuky (a ostatních židovských svátků) bych se pouštět nechtěl (vlastně bych se ani nechtěl pouštět ani do výpočtu Velikonoc 3). Prostě před koncem letošního roku vydám upravenou verzi pro rok 2024, ve které si těch pár řádků oedituji...

No a mezitím mi dorazil mail od kamarádat, že bude potřebovat do kalednáře doplnit i časové údaje. Na tohle jsou asi oni citliví a je to důležité. Takže odpověď byla jednoduchá, stačí do logických výrazů v expression doplnit pomocí funkce System.Time() i časové podmínky. No, nějaké povědomosti o židovském kalendáři mám, takže cítím, že tu bude fuška...

Tak nebude. Vzápětí přišla další zpráva, že ten čas byl prank...
 
Citovat
Nově zamýšlená modifikace Estuary Cinema by možná vyšla vstříc těm, kteří by rádi jednoduchý skin, ušitý na míru Stream Cinema Community (SCC), ve kterém nebude nic dalšího. Jednoduchá obsluha, minimální nároky na CPU i paměť. Hlavní menu Home stránky odpovídající hlavnímu menu doplňku SCC.

První pokusy nevypadají špatně, idea je jít cestou dvou verzí. Klasické (basic), pro velikost odpovídající obrazovce s rozměry 1920x1080 a také verze pro větší uhlopříčky (extend), která snese rozměr zobrazení 2560x1440 a je určená pro obrazovky 2K nebo 4K s větší uhlopříčkou. Z důvodů realizačních omezení není možné mít jeden skin a u něj přepínat rozměr zobrazení. Resp. jsem zatím nepřišel na to, jak toho dosáhnout. Skin tedy navrhuji tak, že přepnutí bude možné provést přímo v rámci nastavení jeho parametrů, ale dokud nepřijdu na to, jak ve skinu zjistit, jaké rozměry zobrazení jsou nastavené (definuje se to v addon.xml), tak to použít nebude možné. Pokud se to změní, budu rád a přepnutí uvolním, ale do té doby než na to přijdu, budou vždy existovat dvě verze vzhledu a bude na uživateli, který z nich si nainstaluje.

Takto to vypadá v Kodi 20 Windows 10 s rozlišením FHD a se standardními rozměry zobrazení 1920x1080:
   
A takto v Kodi 20 CoreELEC s rozlišením alespoň 2K nebo 4K a z rozměrem zobrazení 2560x1440 (jsou tam ještě chyby v uložení některých ikon, takže některé položky menu nejsou kompletní - teprve jsem s úpravami začal):
       

Počet úprav proti standardnímu Estuary by měl být (pokud možno) minimální. Typicky by to byly, proti výchozímu vzhledu, kromě změněného hlavního menu, hlavně widgety pro všechny seznamy (tedy tam, kde to má smysl), s jednoduchou možností jejich zapnutí/vypnutí přímo z Home stránky a také možnost nastavení Typu zobrazení pro každý typ seznamu, který by platil pro všechny jeho stránky.

To všechno bez dalších doplňků a závislostí samotného vzhledu a taky složitého a komplikovaného nastavování, které sice u jiných vzhledů nabízí přemíru možností, ale je pro některé uživatele nestravitelné. To je základní podmínka pro to, aby byl vzhled svižný, minimálně zatěžoval CPU a byl pro obsluhu jednoduchý pro nastavení. Prakticky by, kromě nastavení základního menu a vybraných funkcí doplňku a Kodi, uživatelé nepotřebovali žádné další znalosti.

Po instalaci by měl vzhled nabídnout všechny položky hlavního menu a pro ty z nich, které mají widgety, i všechny widgety, které jsou k dispozici. Uživatel si pak může vybrané položky nebo jednotlivé widgety patřící k nim jednoduše vypnout (a kdykoliv později zase zapnout). To je ostatně také hlavním cílem tohoto projektu a zadání, které jsem na jeho začátku dostal. Po krátkém váhání jsem se pak rozhodl se, že se ho pokusím zrealizovat...

Základní koncepce a úprava hlavního menu a způsob řešení widgetů jsou hotové (převzaté z Estuary Easy), nyní musím doladit některé věci, které se týkají specialit a nestandardních řešení vlastního doplňku SCC. Pak bude následovat část zapínání/vypínání položek menu a widgetů přímo z hlavního menu a nakonec to nejsložitější, tedy volba typu zobrazení pro jednotlivé seznamy a všechny jejich stránky. Tady to bude asi nejsložitější část, protože musím obejít (a zcela nahradit) nativní funkci v Kodi a nechci přitom použít (jako jiné vzhledy) další doplněk, který se pro tyto účely obvykle používá. To by bylo proti smyslu zadání, tzn. bez dalších doplňků (formulovaných zela jasně a konkrétně slovy: "pokud možno a v ideálním případě"). Zadání pak hovoří o maximálně jedné další service (kromě SCC, UpNext a nezbytných systémových service) a tu si potřebuji schovat na některá specifická řešení...

Kdy to bude? Podle dosavadního tempa a času, který jsem tomu ochoten věnovat, cca 1-2 měsíce práce. Začínám s verzí pro Nexus a nepředpokládám, že bych se vracel k Matrix nebo ještě dále do historie. To nepokládám za účelné.
 
Citovat
Dáte tento skin k dispozici i komunitě nebo to děláte jen pro kamaráda a pro sebe?
 
Citovat
  


Přejít na fórum:


Prochází: 2 host(ů)