mirror of
https://github.com/Benexl/FastAnime.git
synced 2026-01-26 11:14:42 -08:00
feat: improve api types
This commit is contained in:
@@ -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}
|
||||
|
||||
@@ -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():
|
||||
|
||||
@@ -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}"
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user