34 lines
1.3 KiB
Python
34 lines
1.3 KiB
Python
from fastapi import APIRouter, HTTPException
|
|
|
|
from ..metadata import PROVIDERS, SERIES_PROVIDERS
|
|
from ..metadata.base import MetadataResult
|
|
|
|
router = APIRouter(prefix="/api/search", tags=["search"])
|
|
|
|
|
|
@router.get("", response_model=list[MetadataResult])
|
|
async def search(media_type: str, q: str, language: str = "", fallback: bool = True):
|
|
provider = PROVIDERS.get(media_type)
|
|
if not provider:
|
|
raise HTTPException(400, f"invalid media_type: {media_type}")
|
|
try:
|
|
return await provider(q, language, fallback)
|
|
except Exception as exc:
|
|
raise HTTPException(502, f"metadata provider error: {exc}")
|
|
|
|
|
|
@router.get("/series", response_model=list[MetadataResult])
|
|
async def series(series_id: str, title: str = "", media_type: str = "audiobook",
|
|
language: str = ""):
|
|
"""All parts of a series, by number. Audible has no series endpoint, so
|
|
audiobooks are a keyword crawl that may miss episodes; Hardcover is exact."""
|
|
lookup = SERIES_PROVIDERS.get(media_type)
|
|
if not lookup:
|
|
raise HTTPException(400, f"no series lookup for media_type: {media_type}")
|
|
if not series_id:
|
|
raise HTTPException(400, "series_id required")
|
|
try:
|
|
return await lookup(series_id, title, language)
|
|
except Exception as exc:
|
|
raise HTTPException(502, f"metadata provider error: {exc}")
|