# ViewIT Plugin Entwicklung (`addon/plugins/*_plugin.py`)

Diese Datei zeigt, wie Plugins im Projekt aufgebaut sind und wie sie mit dem Router zusammenarbeiten.

## Grundlagen
- Ein Plugin ist eine Python Datei in `addon/plugins/`.
- Dateien mit `_` Prefix werden nicht geladen.
- Plugin Klasse erbt von `BasisPlugin`.
- Optional: `Plugin = <Klasse>` als klarer Einstiegspunkt.

## Pflichtmethoden
Jedes Plugin implementiert:
- `async search_titles(query: str, progress_callback: Callable[[str, Optional[int]], Any] | None = None) -> list[str>`
- `seasons_for(title: str) -> list[str]`
- `episodes_for(title: str, season: str) -> list[str]`

## Wichtige optionale Methoden
- `capabilities()`
- `genres()`
- `popular_series()`
- `latest_episodes(page: int = 1)`
- `titles_for_genre(genre: str)`
- `titles_for_genre_page(genre: str, page: int)`
- `titles_for_genre_group_page(...)` / `genre_has_more(...)` (Paging / Alphabet-Gruppen)
- `stream_link_for(...)`
- `stream_link_for_url(...)`
- `available_hosters_for(...)`
- `available_hosters_for_url(...)`
- `episode_url_for(...)`
- `series_url_for_title(...)`
- `remember_series_url(...)`
- `metadata_for(...)`

## Film Provider Standard
Wenn keine echten Staffeln existieren:
- `seasons_for(title)` gibt `['Film']`
- `episodes_for(title, 'Film')` gibt `['Stream']`

## Capabilities
Ein Plugin kann Features melden ueber `capabilities()`.
Bekannte Werte:
- `popular_series`
- `genres`
- `latest_episodes`
- `new_titles`
- `alpha`
- `series_catalog`

## Suche
Aktuelle Regeln fuer Suchtreffer:
- Match auf Titel
- Wortbasiert
- Keine Teilwort Treffer im selben Wort
- Beschreibungen nicht fuer Match nutzen

Siehe als Referenz:
- `addon/plugins/_template_plugin.py` (Minimal-Template)
- `addon/plugins/serienstream_plugin.py`
- `addon/plugins/aniworld_plugin.py`
- `addon/plugins/topstreamfilm_plugin.py`

## Settings
Pro Plugin meist `*_base_url`.
Beispiele:
- `serienstream_base_url`
- `aniworld_base_url`
- `einschalten_base_url`
- `topstream_base_url`
- `filmpalast_base_url`
- `doku_streams_base_url`

## Playback Flow
1. Episode oder Film auswaehlen.
2. Optional Hosterliste anzeigen.
3. `stream_link_for` oder `stream_link_for_url` aufrufen.
4. `resolve_stream_link` aufrufen.
5. Finale URL an Kodi geben.

## Logging
Nutze Helper aus `addon/plugin_helpers.py`:
- `log_url(...)`
- `dump_response_html(...)`
- `notify_url(...)`

## Build und Checks
- ZIP: `./scripts/build_kodi_zip.sh`
- Addon Ordner: `./scripts/build_install_addon.sh`
- Manifest: `python3 scripts/generate_plugin_manifest.py`
- Snapshot Checks: `python3 qa/run_plugin_snapshots.py`

## Kurze Checkliste
- `name` gesetzt und korrekt
- `*_base_url` in Settings vorhanden
- Suche liefert nur passende Titel
- Playback Methoden vorhanden
- Fehler und Timeouts behandelt
- Cache nur da, wo er Zeit spart
