# 012 - Skin Milionář (skin.milionar)

**Status:** COMPLETED (viz TODO)
**Updated:** 2026-10-01 (skin 1.3.1; Home sloty, Filmy / Seriály, kontextové menu a vzhled seznamů: viz `docs/features/013-milionar-library.md`)

---

## Účel

Kodi skin `skin.milionar` je fork Estuary 4.0.0 (`xbmc/xbmc` tag `21.3-Omega`, commit `a3a448d26b`), který se dodává uvnitř addonu a staví Home kolem Milionáře: MyTV, MyCinema, Pokračovat, Milionář (hra), AI doporučení, Kraska a TMDb/ČSFD mají vlastní položky menu a řady widgetů. Všechno ostatní vypadá a chová se jako Estuary (pixelově shodné, ověřeno na seznamech, info dialogu, kontextovém menu, OSD). Plán a rozhodnutí: `docs/plan/skin-milionar/` (`000-index.md`, `900-decisions.md`).

---

## Architektura

```
resources/skin.milionar/  (zdroj skinu, kopie Estuary + změny z plánu 030 §4)
      |  service.py -> wcs/skin/installer.py: kopie do special://home/addons/skin.milionar,
      |  povolení přes JSON-RPC, nabídka přepnutí (1x za verzi addonu)
      v
Home.xml řady --plugin://...?action=widget_*&reload=<token>--> main.py (rychlá cesta)
                                                               -> wcs/skin/widgets.py
Home.xml / okna 1108,1120,1121,1122 --RunPlugin(...?action=...)--> wcs/router.py
                                                               -> wcs/skin/{actions,search,library_actions}.py
service.py -> wcs/skin/refresher.py (TMDb/Kraska/doporučené do skin_cache) + okenní vlastnosti
```

Widget položky, které spouštějí akci, jsou přehratelné URL `action=skin_run&run=<dotaz>`: Kodi je "přehraje", handler vyřeší prázdný výsledek a spustí `RunPlugin` (Estuary include `WidgetListEpisodes` nemá parametry `onclick_*`, includes se nemění).

---

## File Map

| Soubor | Role |
|--------|------|
| `resources/skin.milionar/addon.xml`, `changelog.txt` | id, verze skinu (vlastní semver, při změně skinu zvýšit), popisy cs/sk/en |
| `resources/skin.milionar/xml/Home.xml` | položky menu (id 22000–28000), řady widgetů, logo, tlačítka 801/806 (hledání), 802 (nastavení → okno 1108), `onload` s výchozím skrytím položek Estuary |
| `xml/Custom_1108_MilionarSettingsMenu.xml` | menu nastavení (Kodi / vzhled / Milionář) |
| `xml/Custom_1120_MilionarSearch.xml` | okno hledání (řady 1100–1600, prázdný stav) |
| `xml/Custom_1121_MilionarActions.xml` | menu akcí nad info dialogem |
| `xml/Custom_1122_MilionarGame.xml` | výběr tématu hry |
| `xml/DialogVideoInfo.xml` | jedno tlačítko id 4500 "Milionář" (raketa) |
| `xml/SkinSettings.xml` | kategorie "Milionář" (id 5, ovladače 650–6xx) |
| `media/milionar/logo.png`, `resources/media/generate_skin_logo.py` | logo Home (384x112) a generátor z ikony addonu |
| `wcs/skin/installer.py` | instalace/aktualizace skinu, nabídka přepnutí, `switch()` |
| `wcs/skin/widgets.py` | řady Home a okna hledání, `skin_run`, `invalidate()` |
| `wcs/skin/refresher.py` | cache pro síťové řady (služba) |
| `wcs/skin/actions.py` | `skin_browse`, `skin_game`, `lib_resume`, `search` (vstup), provider vlastnosti |
| `wcs/skin/search.py` | tok hledání: klávesnice → historie → TMDb `search/multi` → cache → okno 1120 |
| `wcs/skin/library_actions.py` | `lib_sources`, `lib_game`, `lib_similar`, `lib_add_channel` |
| `context.py` + `addon.xml` (`kodi.context.item`) | kontextové menu "Milionář" pro knihovní položky (všechny skiny) |
| `wcs/ai/RecommendationHistory.py` | historie AI doporučení (`ai_recommendations.json`, max 30) |
| `main.py` | rychlá cesta pro `widget_*` a `skin_run` (neimportuje router) |
| `service.py` | `start_skin_installer()`, `start_skin_properties()` (monitor, plánovač cache) |
| `scripts/skin_harness/` | `baseline.py` (capture/compare/difftree), `screens.json`, `deploy_check.py` |

---

## Klíčová rozhraní

- `installer.run(addon)` – služba: instalace, povolení, `ReloadSkin()` u aktivního skinu, nabídka přepnutí (`skin_offer_version` = verze addonu, kdy se naposledy ptalo). Symlink `addons/skin.milionar` = vývojový režim (nic se nekopíruje ani nenabízí).
- `installer.switch(addon)` – akce `skin_switch` (tlačítko v nastavení addonu, kategorie Obecné).
- `widgets.run(handle, params)` – `widget_mytv_channels|mytv_next|mycinema_channels|mycinema_recommended|in_progress|recently_played|game_topics|ai_recent|kraska_root|tmdb_popular_movies|tmdb_popular_series|csfd_charts|search`, `skin_run`. Rychlost 50–130 ms.
- `widgets.invalidate(names)` – posune `Window(Home).Property(milionar.widgets.token)`; volá se při uložení kanálů, nové AI historii a z monitoru služby při `Player.OnStop` / `VideoLibrary.OnUpdate`.
- Router akce: `skin_run`, `skin_search[&query=]`, `skin_browse`, `skin_game&topic=movie|tvshow|random`, `lib_resume`, `lib_sources|lib_game|lib_similar|lib_add_channel&dbtype=&dbid=`, `skin_switch`; `my_tv_dialog` / `my_cinema_dialog` berou `channel_id` (otevřou dialog na daném kanálu).
- Vlastnosti Home: `milionar.provider.kraska|ai|webshare`, `milionar.widgets.token`, `milionar.search.query|token|lib_movies|lib_tvshows`, `milionar.dbtype|dbid` (info dialog → okno 1121).

---

## UI

- Menu (pořadí): Pokračovat, MyTV, MyCinema, Filmy, Seriály, Milionář, AI doporučení, Kraska (ve výchozím stavu skrytá, `MilionarDefaultsV2`), TMDb / ČSFD, Videa, Doplňky. Ikony jsou originální z Estuary, hlavní menu používá `icons/sidemenu/*` (95x95); Pokračovat `DefaultMusicRecentlyPlayed.png`. Nic se nekreslí.
- Každá položka menu a řada má skin přepínač (`HomeMenuNoMil*Button`, `HomeWidgetNoMil*`, výchozí zapnuto) v Nastavení vzhledu → Milionář; tlačítko obnoví výchozí rozložení. Výchozí skrytí Music, Music videos, TV, Radio, Pictures, Games, Weather, Favourites řeší `MilionarDefaultsV1` v `onload`.
- Řady a okna používají Estuary includes (`WidgetListPoster|Episodes|Categories`, `ImageWidget`, `IconButton`, `DialogBackgroundCommons`, `ButtonMenuList`).
- Řetězce skinu od `#31900` (cs, sk, en), addonu `#32230–32254`.

---

## Závislosti

- Skin → addon: jen `plugin://` obsah, `RunPlugin`, Home vlastnosti. Bez zapnutého addonu (`System.AddonIsEnabled`) jsou položky Milionáře skryté a tlačítko hledání je Estuary (801).
- Addon → skin: `service.py` a `wcs/skin/*`; addon funguje i v jiných skinech (kontextové menu funguje všude).

---

## Jak rozšířit

- Nová řada: builder `widget_<jméno>()` ve `widgets.py` (vrací `xbmcgui.ListItem` přes `_item`), include v `Home.xml` v dané skupině, bool `HomeWidgetNoMil*` + přepínač v `SkinSettings.xml`, řetězce.
- Nová položka menu: item v `Home.xml` + skupina widgetů (`menu_id`), přepínač, řetězce, ikona z `icons/sidemenu`.
- Po každé změně v `resources/skin.milionar/` zvýšit verzi v jeho `addon.xml` + `changelog.txt` (`/deploy` to hlídá: `scripts/skin_harness/deploy_check.py`).
- Ověření: `kodi_live.py reload` (XML), cílená kontrola dotčené obrazovky (`baseline.py capture --only`), `baseline.py difftree` (fork vůči tagu, soubory mimo plán 030 §4 selžou).

---

## TODO

- Kraska řady jsou prázdné, dokud Stream Cinema API odpovídá 404 (stejně selhává procházení v addonu).
- Neověřeno živě: `lib_resume` (spustilo by přehrávání), "Hledat zdroje" celé, kliknutí na osobu/titul ve výsledcích hledání.
- Čistá instalace ze ZIPu po `/deploy` (skin uvnitř ZIPu) – otestovat při prvním nasazení.
- Plný srovnávací běh Estuary vs skin se spouští jen na vyžádání (rozhodnutí 2026-10-01).
