En mode séries, le rail Nouveautés était vide : discover.latest() triait par date de sortie Kitsu (catalogue animés uniquement) puis tronquait à 24 AVANT le filtrage — les séries et films réels, absents de Kitsu (donc sans date), étaient systématiquement évincés. - allowed (types autorisés par préférence) descend dans discover.latest() et filtre dès la collecte des sources - remplissage du rail équilibré par type (round-robin) : en mode « les deux », 8 animés / 8 séries / 8 films au lieu de 24 animés - test de non-régression : 9 séries conservées face à 30 animés datés
36 lines
1.4 KiB
Python
36 lines
1.4 KiB
Python
"""Découverte : nouveautés des sources, incontournables, recommandations."""
|
|
|
|
import logging
|
|
from typing import Annotated
|
|
|
|
from fastapi import APIRouter, Depends, Query
|
|
|
|
from app.routers.auth import CurrentUser, current_user
|
|
from app.routers.search import _allowed_media_types
|
|
from app.services.discover import discover
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
router = APIRouter(prefix="/api", tags=["discover"], dependencies=[Depends(current_user)])
|
|
|
|
|
|
@router.get("/discover")
|
|
async def get_discover(
|
|
user: CurrentUser,
|
|
latest_limit: Annotated[int, Query(ge=1, le=50)] = 24,
|
|
must_watch_limit: Annotated[int, Query(ge=1, le=20)] = 20,
|
|
for_you_limit: Annotated[int, Query(ge=1, le=20)] = 20,
|
|
) -> dict:
|
|
"""Les trois sections de découverte en une requête (sections vides si source KO)."""
|
|
allowed = _allowed_media_types(user.content_preference)
|
|
latest = await discover.latest(latest_limit, allowed)
|
|
# Incontournables et Pour toi sont issus de Kitsu (catalogue animés) :
|
|
# en mode séries, elles n'ont pas de sens — on ne les calcule même pas.
|
|
if "anime" in allowed:
|
|
must_watch = await discover.must_watch(must_watch_limit)
|
|
for_you = await discover.for_you(user.id, for_you_limit)
|
|
else:
|
|
must_watch = []
|
|
for_you = {"based_on": [], "items": []}
|
|
return {"latest": latest, "must_watch": must_watch, "for_you": for_you}
|