feat: improve api types

This commit is contained in:
Benexl
2025-07-23 18:48:57 +03:00
parent 6c30cf808b
commit d78b62fcee
19 changed files with 807 additions and 700 deletions

View File

@@ -18,7 +18,7 @@ from rich.table import Table
from rich.text import Text
from ....libs.api.params import UpdateListEntryParams, UserListParams
from ....libs.api.types import MediaItem, MediaSearchResult, UserListStatusType
from ....libs.api.types import MediaItem, MediaSearchResult, UserListItem
from ...utils.feedback import create_feedback_manager, execute_with_feedback
from ..session import Context, session
from ..state import ControlFlow, MediaApiState, State
@@ -373,7 +373,7 @@ def _display_anime_list_details(console: Console, anime: MediaItem, icons: bool)
console.print(panel)
def _navigate_to_list(ctx: Context, list_status: UserListStatusType) -> State:
def _navigate_to_list(ctx: Context, list_status: UserListItem) -> State:
"""Navigate to a specific list view."""
return State(
menu_name="ANILIST_LIST_VIEW", data={"list_status": list_status, "page": 1}

View File

@@ -3,7 +3,12 @@ import random
from typing import Callable, Dict, Tuple
from ....libs.api.params import ApiSearchParams, UserListParams
from ....libs.api.types import MediaSearchResult, MediaStatus, UserListStatusType
from ....libs.api.types import (
MediaSearchResult,
MediaSort,
MediaStatus,
UserMediaListStatus,
)
from ..session import Context, session
from ..state import ControlFlow, MediaApiState, State
@@ -28,36 +33,44 @@ def main(ctx: Context, state: State) -> State | ControlFlow:
options: Dict[str, MenuAction] = {
# --- Search-based Actions ---
f"{'🔥 ' if icons else ''}Trending": _create_media_list_action(
ctx, "TRENDING_DESC"
ctx, MediaSort.TRENDING_DESC
),
f"{'' if icons else ''}Popular": _create_media_list_action(
ctx, "POPULARITY_DESC"
ctx, MediaSort.POPULARITY_DESC
),
f"{'💖 ' if icons else ''}Favourites": _create_media_list_action(
ctx, "FAVOURITES_DESC"
ctx, MediaSort.FAVOURITES_DESC
),
f"{'💯 ' if icons else ''}Top Scored": _create_media_list_action(
ctx, "SCORE_DESC"
ctx, MediaSort.SCORE_DESC
),
f"{'🎬 ' if icons else ''}Upcoming": _create_media_list_action(
ctx, "POPULARITY_DESC", "NOT_YET_RELEASED"
ctx, MediaSort.POPULARITY_DESC, MediaStatus.NOT_YET_RELEASED
),
f"{'🔔 ' if icons else ''}Recently Updated": _create_media_list_action(
ctx, "UPDATED_AT_DESC"
ctx, MediaSort.UPDATED_AT_DESC
),
# --- special case media list --
f"{'🎲 ' if icons else ''}Random": _create_random_media_list(ctx),
f"{'🔎 ' if icons else ''}Search": _create_search_media_list(ctx),
# --- Authenticated User List Actions ---
f"{'📺 ' if icons else ''}Watching": _create_user_list_action(ctx, "watching"),
f"{'📑 ' if icons else ''}Planned": _create_user_list_action(ctx, "planning"),
f"{'' if icons else ''}Completed": _create_user_list_action(
ctx, "completed"
f"{'📺 ' if icons else ''}Watching": _create_user_list_action(
ctx, UserMediaListStatus.WATCHING
),
f"{'📑 ' if icons else ''}Planned": _create_user_list_action(
ctx, UserMediaListStatus.PLANNING
),
f"{'' if icons else ''}Completed": _create_user_list_action(
ctx, UserMediaListStatus.COMPLETED
),
f"{'⏸️ ' if icons else ''}Paused": _create_user_list_action(
ctx, UserMediaListStatus.PAUSED
),
f"{'🚮 ' if icons else ''}Dropped": _create_user_list_action(
ctx, UserMediaListStatus.DROPPED
),
f"{'⏸️ ' if icons else ''}Paused": _create_user_list_action(ctx, "paused"),
f"{'🚮 ' if icons else ''}Dropped": _create_user_list_action(ctx, "dropped"),
f"{'🔁 ' if icons else ''}Rewatching": _create_user_list_action(
ctx, "repeating"
ctx, UserMediaListStatus.REPEATING
),
f"{'🔁 ' if icons else ''}Recent": lambda: (
"RESULTS",
@@ -123,7 +136,7 @@ def main(ctx: Context, state: State) -> State | ControlFlow:
def _create_media_list_action(
ctx: Context, sort, status: MediaStatus | None = None
ctx: Context, sort: MediaSort, status: MediaStatus | None = None
) -> MenuAction:
"""A factory to create menu actions for fetching media lists"""
@@ -163,7 +176,7 @@ def _create_search_media_list(ctx: Context) -> MenuAction:
return action
def _create_user_list_action(ctx: Context, status: UserListStatusType) -> MenuAction:
def _create_user_list_action(ctx: Context, status: UserMediaListStatus) -> MenuAction:
"""A factory to create menu actions for fetching user lists, handling authentication."""
def action():

View File

@@ -1,6 +1,5 @@
from typing import Callable, Dict
import click
from rich.console import Console
from ....libs.api.params import UpdateListEntryParams
@@ -152,7 +151,7 @@ def _view_info(ctx: Context, state: State) -> MenuAction:
console = Console()
title = Text(anime.title.english or anime.title.romaji or "", style="bold cyan")
description = Text(anime.description or "NO description")
genres = Text(f"Genres: {', '.join(anime.genres)}")
genres = Text(f"Genres: {', '.join([v.value for v in anime.genres])}")
panel_content = f"{genres}\n\n{description}"

View File

@@ -1,5 +1,5 @@
from ....libs.api.params import ApiSearchParams, UserListParams
from ....libs.api.types import MediaItem
from ....libs.api.types import MediaItem, MediaStatus, UserMediaListStatus
from ..session import Context, session
from ..state import ControlFlow, MediaApiState, State
@@ -96,10 +96,10 @@ def _format_anime_choice(anime: MediaItem, config) -> str:
# Add a visual indicator for new episodes if applicable
if (
anime.status == "RELEASING"
anime.status == MediaStatus.RELEASING
and anime.next_airing
and anime.user_status
and anime.user_status.status == "CURRENT"
and anime.user_status.status == UserMediaListStatus.WATCHING
):
last_aired = anime.next_airing.episode - 1
unwatched = last_aired - (anime.user_status.progress or 0)

View File

@@ -8,7 +8,7 @@ from ...libs.api.types import (
MediaItem,
MediaSearchResult,
MediaStatus,
UserListStatusType,
UserListItem,
)
from ...libs.players.types import PlayerResult
from ...libs.providers.anime.types import Anime, SearchResults, Server
@@ -80,7 +80,7 @@ class MediaApiState(BaseModel):
search_results_type: Optional[Literal["MEDIA_LIST", "USER_MEDIA_LIST"]] = None
sort: Optional[str] = None
query: Optional[str] = None
user_media_status: Optional[UserListStatusType] = None
user_media_status: Optional[UserListItem] = None
media_status: Optional[MediaStatus] = None
anime: Optional[MediaItem] = None