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:
Roman
2026-09-25 15:14:14 +00:00
parent c45f1b79fd
commit d5fa546dd7
7 changed files with 174 additions and 12 deletions
+35 -2
View File
@@ -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