60 lines
1.8 KiB
Python
60 lines
1.8 KiB
Python
"""Search TV show use case."""
|
|
|
|
import logging
|
|
|
|
from alfred.infrastructure.api_TO_CHECK.tmdb import (
|
|
TMDBAPIError,
|
|
TMDBClient,
|
|
TMDBConfigurationError,
|
|
)
|
|
|
|
from .dto import SearchShowResponse, ShowHit
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
class SearchShowUseCase:
|
|
"""List TV shows matching a free-text query via TMDB ``/search/tv``.
|
|
|
|
Symmetric to :class:`alfred.application.movies.SearchMovieUseCase`:
|
|
thin orchestrator, flattens domain VOs into agent-friendly
|
|
primitives, no ``imdb_id`` enrichment (caller follows up with
|
|
:meth:`TMDBClient.get_tv_show_info` on a chosen ``tmdb_id``).
|
|
"""
|
|
|
|
def __init__(self, tmdb_client: TMDBClient):
|
|
self.tmdb_client = tmdb_client
|
|
|
|
def execute(self, show_title: str) -> SearchShowResponse:
|
|
try:
|
|
results = self.tmdb_client.search_shows(show_title)
|
|
|
|
hits = [
|
|
ShowHit(
|
|
tmdb_id=r.tmdb_id.value,
|
|
name=r.name,
|
|
first_air_year=r.first_air_year,
|
|
)
|
|
for r in results
|
|
]
|
|
logger.info(f"search_shows({show_title!r}) → {len(hits)} hits")
|
|
return SearchShowResponse(status="ok", hits=hits)
|
|
|
|
except TMDBConfigurationError as e:
|
|
logger.error(f"TMDB configuration error: {e}")
|
|
return SearchShowResponse(
|
|
status="error", error="configuration_error", message=str(e)
|
|
)
|
|
|
|
except TMDBAPIError as e:
|
|
logger.error(f"TMDB API error: {e}")
|
|
return SearchShowResponse(
|
|
status="error", error="api_error", message=str(e)
|
|
)
|
|
|
|
except ValueError as e:
|
|
logger.error(f"Validation error: {e}")
|
|
return SearchShowResponse(
|
|
status="error", error="validation_failed", message=str(e)
|
|
)
|