Pour toi : fallback sans Sonarr et amorçage sans historique
- Sans Sonarr, les séries/films téléchargés donnent leurs genres via leur fiche French-Stream (page_url des téléchargements), convertis vers les catégories Kitsu (mapping FR→EN ; genres sans équivalent ignorés) - Aucun historique (ni téléchargement, ni favori, ni Sonarr) : réponse cold_start non cachée → carte d'amorçage « téléchargez un premier titre » - Fin de téléchargement → invalidation immédiate des recommandations - genres_of_page ignore les fiches hors French-Stream (URLs d'animés)
This commit is contained in:
+35
-2
@@ -326,10 +326,43 @@ async def test_for_you_aggregates_genres_and_excludes_owned(history):
|
||||
assert "Konosuba" in titles
|
||||
|
||||
|
||||
async def test_for_you_empty_without_history(monkeypatch):
|
||||
async def test_for_you_cold_start_without_history(monkeypatch):
|
||||
"""Aucun téléchargement/favori/Sonarr : amorçage signalé (non caché)."""
|
||||
service = DiscoverService()
|
||||
result = await service.for_you(user_id=42)
|
||||
assert result == {"based_on": [], "items": []}
|
||||
assert result == {"based_on": [], "items": [], "cold_start": True}
|
||||
assert service._cache.get("for_you:42:20") is None # pas de cache : bon marché, change au 1er téléchargement
|
||||
|
||||
async def test_for_you_uses_series_page_genres_without_sonarr(monkeypatch):
|
||||
"""Sans Sonarr, les séries téléchargées donnent leurs genres via leur fiche
|
||||
source (libellés FR convertis en catégories Kitsu)."""
|
||||
cursor = await db.execute(
|
||||
"INSERT INTO users (username, password_hash) VALUES (?, ?)",
|
||||
("serie-user", "x" * 64),
|
||||
)
|
||||
user_id = cursor.lastrowid
|
||||
await db.execute(
|
||||
"INSERT INTO downloads (source_key, video_url, page_url, title, status) VALUES (?,?,?,?,?)",
|
||||
("k9", "https://v/9", "https://french-stream.lat/15138132-stat-saison-5.html",
|
||||
"STAT - Saison 5", "done"),
|
||||
)
|
||||
|
||||
async def fake_no_match(title: str):
|
||||
return None # série réelle : aucun match Kitsu
|
||||
|
||||
async def fake_genres_of_page(self, page_url: str):
|
||||
assert "15138132" in page_url
|
||||
return ["Drame", "Médical"] # Médical : sans équivalent Kitsu → ignoré
|
||||
|
||||
service = DiscoverService()
|
||||
monkeypatch.setattr(service._kitsu, "search_anime", fake_no_match)
|
||||
monkeypatch.setattr(
|
||||
"app.scrapers.sources.french_stream.FrenchStreamScraper.genres_of_page",
|
||||
fake_genres_of_page,
|
||||
)
|
||||
result = await service.for_you(user_id=user_id, limit=10)
|
||||
assert result["based_on"] == ["Drama"] # « Drame » converti, « Médical » écarté
|
||||
assert result["items"] # des recommandations issues de la catégorie drama
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user