Core & Architektur: - Neues Verzeichnis addon/core/ mit router.py, trakt.py, metadata.py, gui.py, playstate.py, plugin_manager.py, updater.py - Tests-Verzeichnis hinzugefügt (24 Tests, pytest + Coverage) Trakt-Integration: - OAuth Device Flow, Scrobbling, Watchlist, History, Calendar - Upcoming Episodes, Weiterschauen (Continue Watching) - Watched-Status in Episodenlisten - _trakt_find_in_plugins() mit 5-Min-Cache Serienstream-Suche: - API-Ergebnisse werden immer mit Katalog-Cache ergänzt (serverseitiges 10-Treffer-Limit) - Katalog-Cache wird beim Addon-Start im Daemon-Thread vorgewärmt - Notification nach Cache-Load via xbmc.executebuiltin() (thread-sicher) Bugfixes (Code-Review): - Race Condition auf _TRAKT_WATCHED_CACHE: _TRAKT_WATCHED_CACHE_LOCK hinzugefügt - GUI-Dialog aus Daemon-Thread: xbmcgui -> xbmc.executebuiltin() - ValueError in Trakt-Watchlist-Routen abgesichert - Token expires_at==0 Check korrigiert - get_setting_bool() Kontrollfluss in gui.py bereinigt - topstreamfilm_plugin: try-finally um xbmcvfs.File.close() Cleanup: - default.py.bak und refactor_router.py entfernt - .gitignore: /tests/ Eintrag entfernt - Type-Hints vereinheitlicht (Dict/List/Tuple -> dict/list/tuple)
46 lines
1.5 KiB
Python
46 lines
1.5 KiB
Python
import asyncio
|
|
|
|
from addon.plugins.filmpalast_plugin import FilmpalastPlugin, SearchHit
|
|
|
|
|
|
def _fake_hits(_query: str) -> list[SearchHit]:
|
|
return [
|
|
SearchHit(title="Star Trek S01E01 Pilot", url="https://filmpalast.to/stream/star-trek-s01e01"),
|
|
SearchHit(title="Star Trek S01E02 Zweiter Kontakt", url="https://filmpalast.to/stream/star-trek-s01e02"),
|
|
SearchHit(title="Ein Hund namens Palma", url="https://filmpalast.to/stream/ein-hund-namens-palma"),
|
|
]
|
|
|
|
|
|
def test_search_groups_series_and_movies(monkeypatch):
|
|
plugin = FilmpalastPlugin()
|
|
monkeypatch.setattr(plugin, "_search_hits", _fake_hits)
|
|
|
|
titles = asyncio.run(plugin.search_titles("trek"))
|
|
|
|
assert titles == ["Ein Hund namens Palma", "Star Trek"]
|
|
|
|
|
|
def test_series_seasons_and_episodes(monkeypatch):
|
|
plugin = FilmpalastPlugin()
|
|
monkeypatch.setattr(plugin, "_search_hits", _fake_hits)
|
|
|
|
asyncio.run(plugin.search_titles("trek"))
|
|
|
|
assert plugin.is_movie("Star Trek") is False
|
|
assert plugin.seasons_for("Star Trek") == ["Staffel 1"]
|
|
assert plugin.episodes_for("Star Trek", "Staffel 1") == [
|
|
"Episode 1 - Pilot",
|
|
"Episode 2 - Zweiter Kontakt",
|
|
]
|
|
|
|
|
|
def test_movie_path_stays_unchanged(monkeypatch):
|
|
plugin = FilmpalastPlugin()
|
|
monkeypatch.setattr(plugin, "_search_hits", _fake_hits)
|
|
|
|
asyncio.run(plugin.search_titles("hund"))
|
|
|
|
assert plugin.is_movie("Ein Hund namens Palma") is True
|
|
assert plugin.seasons_for("Ein Hund namens Palma") == ["Film"]
|
|
assert plugin.episodes_for("Ein Hund namens Palma", "Film") == ["Stream"]
|