3.9 KiB
ViewIt Plugin-System
Dieses Dokument beschreibt, wie das Plugin-System von ViewIt funktioniert und wie die Community neue Integrationen hinzufügen kann.
Überblick
ViewIt lädt Provider-Integrationen dynamisch aus addon/plugins/*.py. Jede Datei enthält eine Klasse, die von BasisPlugin erbt. Beim Start werden alle Plugins instanziiert und nur aktiv genutzt, wenn sie verfügbar sind.
Weitere Details:
docs/DEFAULT_ROUTER.md(Hauptlogik inaddon/default.py)docs/PLUGIN_DEVELOPMENT.md(Entwicklerdoku für Plugins)
Aktuelle Plugins
serienstream_plugin.py– Serienstream (s.to)topstreamfilm_plugin.py– Topstreamfilmeinschalten_plugin.py– Einschaltenaniworld_plugin.py– Aniworldfilmpalast_plugin.py– Filmpalastdokustreams_plugin.py– Doku-Streams_template_plugin.py– Vorlage für neue Plugins
Plugin-Discovery (Ladeprozess)
Der Loader in addon/default.py:
- Sucht alle
*.pyinaddon/plugins/ - Überspringt Dateien, die mit
_beginnen - Lädt Module dynamisch
- Nutzt
Plugin = <Klasse>als bevorzugten Einstiegspunkt (falls vorhanden) - Fallback: instanziert Klassen, die von
BasisPluginerben (deterministisch sortiert) - Ignoriert Plugins mit
is_available = False
Damit bleiben fehlerhafte Plugins isoliert und blockieren nicht das gesamte Add-on.
BasisPlugin – verpflichtende Methoden
Definiert in addon/plugin_interface.py:
async search_titles(query: str) -> list[str]seasons_for(title: str) -> list[str]episodes_for(title: str, season: str) -> list[str]- optional
metadata_for(title: str) -> (info_labels, art, cast)
Optionale Features (Capabilities)
Plugins können zusätzliche Features anbieten:
capabilities() -> set[str]popular_series: liefert beliebte Seriengenres: Genre-Liste verfügbarlatest_episodes: neue Episoden verfügbarnew_titles: neue Titel verfügbaralpha: A-Z Index verfügbarseries_catalog: Serienkatalog verfügbarpopular_series() -> list[str]genres() -> list[str]titles_for_genre(genre: str) -> list[str]latest_episodes(page: int = 1) -> list[LatestEpisode](wenn angeboten)new_titles_page(page: int = 1) -> list[str](wenn angeboten)alpha_index() -> list[str](wenn angeboten)series_catalog_page(page: int = 1) -> list[str](wenn angeboten)
Metadaten:
prefer_source_metadata = Truebedeutet: Plugin-Metadaten gehen vor TMDB, TMDB dient nur als Fallback.
ViewIt zeigt im UI nur die Features an, die ein Plugin tatsächlich liefert.
Plugin-Struktur (empfohlen)
Eine Integration sollte typischerweise bieten:
- Konstante
BASE_URL search_titles()mit Provider-Sucheseasons_for()undepisodes_for()mit HTML-Parsingstream_link_for()optional für direkte Playback-Linksmetadata_for()optional für Plot/Poster aus der Quelle- Optional:
available_hosters_for()oder Provider-spezifische Helfer
Als Startpunkt dient addon/plugins/_template_plugin.py.
Community-Erweiterungen (Workflow)
- Fork/Branch erstellen
- Neue Datei unter
addon/plugins/hinzufügen (z. B.meinprovider_plugin.py) - Klasse erstellen, die
BasisPluginimplementiert - In Kodi testen (ZIP bauen, installieren)
- PR öffnen
Qualitätsrichtlinien
- Keine Netzwerkzugriffe im Import-Top-Level
- Netzwerkzugriffe nur in Methoden (z. B.
search_titles) - Fehler sauber abfangen und verständliche Fehlermeldungen liefern
- Kein globaler Zustand, der über Instanzen hinweg überrascht
- Provider-spezifische Parser in Helper-Funktionen kapseln
- Reproduzierbare Reihenfolge:
Plugin-Alias nutzen oder Klassenname eindeutig halten
Debugging & Logs
Hilfreiche Logs werden nach userdata/addon_data/plugin.video.viewit/logs/ geschrieben.
Provider sollten URL-Logging optional halten (Settings).
ZIP-Build
./scripts/build_kodi_zip.sh
Das ZIP liegt anschließend unter dist/plugin.video.viewit-<version>.zip.