Files
FastAnime/fastanime/libs/media_api/base.py
Benexl e8849940e1 feat: Add media airing schedule and character selection features
- Implemented media airing schedule functionality in `media_airing_schedule.py` to fetch and display upcoming episodes with air dates and countdown timers.
- Created character selection feature in `media_characters.py` to fetch and display a list of characters, showing details upon selection.
- Updated state management to include new menu options for characters and airing schedules.
- Enhanced preview functionality to support character and airing schedule previews.
- Added necessary API methods and data models for handling character and airing schedule data.
2025-07-28 13:37:27 +03:00

109 lines
2.7 KiB
Python

import abc
from typing import TYPE_CHECKING, Any, Dict, List, Optional
from ...core.config import AnilistConfig
from .params import (
MediaAiringScheduleParams,
MediaCharactersParams,
MediaRecommendationParams,
MediaRelationsParams,
MediaReviewsParams,
MediaSearchParams,
UpdateUserMediaListEntryParams,
UserMediaListSearchParams,
)
from .types import (
AiringScheduleResult,
Character,
CharacterSearchResult,
MediaItem,
MediaReview,
MediaSearchResult,
UserProfile,
)
if TYPE_CHECKING:
from httpx import Client
class BaseApiClient(abc.ABC):
"""
Abstract Base Class defining a generic contract for media database APIs.
"""
def __init__(self, config: AnilistConfig | Any, client: "Client"):
self.config = config
self.http_client = client
@abc.abstractmethod
def authenticate(self, token: str) -> Optional[UserProfile]:
pass
@abc.abstractmethod
def is_authenticated(self) -> bool:
pass
@abc.abstractmethod
def get_viewer_profile(self) -> Optional[UserProfile]:
pass
@abc.abstractmethod
def search_media(self, params: MediaSearchParams) -> Optional[MediaSearchResult]:
"""Searches for media based on a query and other filters."""
pass
@abc.abstractmethod
def search_media_list(
self, params: UserMediaListSearchParams
) -> Optional[MediaSearchResult]:
pass
@abc.abstractmethod
def update_list_entry(self, params: UpdateUserMediaListEntryParams) -> bool:
pass
@abc.abstractmethod
def delete_list_entry(self, media_id: int) -> bool:
pass
@abc.abstractmethod
def get_recommendation_for(
self, params: MediaRecommendationParams
) -> Optional[List[MediaItem]]:
pass
@abc.abstractmethod
def get_characters_of(self, params: MediaCharactersParams) -> Optional[CharacterSearchResult]:
pass
@abc.abstractmethod
def get_related_anime_for(
self, params: MediaRelationsParams
) -> Optional[List[MediaItem]]:
pass
@abc.abstractmethod
def get_airing_schedule_for(
self, params: MediaAiringScheduleParams
) -> Optional[AiringScheduleResult]:
pass
@abc.abstractmethod
def get_reviews_for(
self, params: MediaReviewsParams
) -> Optional[List[MediaReview]]:
pass
@abc.abstractmethod
def transform_raw_search_data(self, raw_data: Dict) -> Optional[MediaSearchResult]:
"""
Transform raw API response data into a MediaSearchResult.
Args:
raw_data: Raw response data from the API
Returns:
MediaSearchResult object or None if transformation fails
"""
pass