1+ from __future__ import annotations
2+
13from enum import Enum
2- from typing import Dict , Optional , Union
4+ from typing import Any , Dict , Mapping , Optional , Union
35
4- from pydantic import BaseModel , ConfigDict , Field
6+ from pydantic import BaseModel , ConfigDict , Field , PrivateAttr , computed_field
57
68from ...libs .media_api .params import MediaSearchParams , UserMediaListSearchParams
79from ...libs .media_api .types import MediaItem , PageInfo
810from ...libs .provider .anime .types import Anime , SearchResults , Server
911
1012
11- # TODO: is internal directive a good name
12- class InternalDirective (Enum ):
13- MAIN = "MAIN"
14-
15- BACK = "BACK"
16-
17- BACKX2 = "BACKX2"
18-
19- BACKX3 = "BACKX3"
20-
21- BACKX4 = "BACKX4"
22-
23- EXIT = "EXIT"
24-
25- CONFIG_EDIT = "CONFIG_EDIT"
26-
27- RELOAD = "RELOAD"
28-
29-
3013class MenuName (Enum ):
3114 MAIN = "MAIN"
3215 AUTH = "AUTH"
@@ -49,34 +32,116 @@ class MenuName(Enum):
4932 DOWNLOAD_EPISODES = "DOWNLOAD_EPISODES"
5033
5134
35+ class InternalDirective (Enum ):
36+ MAIN = "MAIN"
37+
38+ BACK = "BACK"
39+
40+ BACKX2 = "BACKX2"
41+
42+ BACKX3 = "BACKX3"
43+
44+ BACKX4 = "BACKX4"
45+
46+ EXIT = "EXIT"
47+
48+ CONFIG_EDIT = "CONFIG_EDIT"
49+
50+ RELOAD = "RELOAD"
51+
52+
5253class StateModel (BaseModel ):
5354 model_config = ConfigDict (frozen = True )
5455
5556
5657class MediaApiState (StateModel ):
57- search_result : Optional [Dict [int , MediaItem ]] = None
58- search_params : Optional [Union [MediaSearchParams , UserMediaListSearchParams ]] = None
59- page_info : Optional [PageInfo ] = None
60- media_id : Optional [int ] = None
58+ search_result_ : Optional [Dict [int , MediaItem ]] = Field (
59+ default = None , alias = "search_result"
60+ )
61+ search_params_ : Optional [Union [MediaSearchParams , UserMediaListSearchParams ]] = (
62+ Field (default = None , alias = "search_params" )
63+ )
64+ page_info_ : Optional [PageInfo ] = Field (default = None , alias = "page_info" )
65+ media_id_ : Optional [int ] = Field (default = None , alias = "media_id" )
66+
67+ @property
68+ def search_result (self ) -> dict [int , MediaItem ]:
69+ if not self .search_result_ :
70+ raise RuntimeError ("Malformed state, please report" )
71+ return self .search_result_
72+
73+ @property
74+ def search_params (self ) -> Union [MediaSearchParams , UserMediaListSearchParams ]:
75+ if not self .search_params_ :
76+ raise RuntimeError ("Malformed state, please report" )
77+ return self .search_params_
78+
79+ @property
80+ def page_info (self ) -> PageInfo | None :
81+ # if not self._page_info:
82+ # raise RuntimeError("Malformed state, please report")
83+ return self .page_info_
6184
6285 @property
63- def media_item (self ) -> Optional [MediaItem ]:
64- if self .search_result and self .media_id :
65- return self .search_result [self .media_id ]
86+ def media_id (self ) -> int :
87+ if not self .media_id_ :
88+ raise RuntimeError ("Malformed state, please report" )
89+ return self .media_id_
90+
91+ @property
92+ def media_item (self ) -> MediaItem :
93+ return self .search_result [self .media_id ]
6694
6795
6896class ProviderState (StateModel ):
69- search_results : Optional [SearchResults ] = None
70- anime : Optional [Anime ] = None
71- episode : Optional [str ] = None
72- servers : Optional [Dict [str , Server ]] = None
73- server_name : Optional [str ] = None
74- start_time : Optional [str ] = None
97+ search_results_ : Optional [SearchResults ] = Field (
98+ default = None , alias = "search_results"
99+ )
100+ anime_ : Optional [Anime ] = Field (default = None , alias = "anime" )
101+ episode_ : Optional [str ] = Field (default = None , alias = "episode" )
102+ servers_ : Optional [Dict [str , Server ]] = Field (default = None , alias = "servers" )
103+ server_name_ : Optional [str ] = Field (default = None , alias = "server_name" )
104+ start_time_ : Optional [str ] = Field (default = None , alias = "start_time" )
105+
106+ @property
107+ def search_results (self ) -> SearchResults :
108+ if not self .search_results_ :
109+ raise RuntimeError ("Malformed state, please report" )
110+ return self .search_results_
111+
112+ @property
113+ def anime (self ) -> Anime :
114+ if not self .anime_ :
115+ raise RuntimeError ("Malformed state, please report" )
116+ return self .anime_
117+
118+ @property
119+ def episode (self ) -> str | None :
120+ # if not self._episode:
121+ # raise RuntimeError("Malformed state, please report")
122+ return self .episode_
123+
124+ @property
125+ def servers (self ) -> Dict [str , Server ]:
126+ if not self .servers_ :
127+ raise RuntimeError ("Malformed state, please report" )
128+ return self .servers_
129+
130+ @property
131+ def server_name (self ) -> str :
132+ if not self .server_name_ :
133+ raise RuntimeError ("Malformed state, please report" )
134+ return self .server_name_
135+
136+ @property
137+ def start_time (self ) -> str | None :
138+ # if not self._start_time:
139+ # raise RuntimeError("Malformed state, please report")
140+ return self .start_time_
75141
76142 @property
77- def server (self ) -> Optional [Server ]:
78- if self .servers and self .server_name :
79- return self .servers [self .server_name ]
143+ def server (self ) -> Server :
144+ return self .servers [self .server_name ]
80145
81146
82147class State (StateModel ):
0 commit comments