nadeshiko-sdk 0.1.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (167) hide show
  1. nadeshiko/__init__.py +10 -0
  2. nadeshiko/_version.py +1 -0
  3. nadeshiko/api/__init__.py +1 -0
  4. nadeshiko/api/auth/__init__.py +3 -0
  5. nadeshiko/api/auth/internal/__init__.py +11 -0
  6. nadeshiko/api/auth/internal/get_discord_auth_url.py +176 -0
  7. nadeshiko/api/auth/internal/login.py +213 -0
  8. nadeshiko/api/auth/internal/login_discord.py +204 -0
  9. nadeshiko/api/auth/internal/login_google.py +204 -0
  10. nadeshiko/api/auth/internal/register.py +212 -0
  11. nadeshiko/api/auth_jwt/__init__.py +3 -0
  12. nadeshiko/api/auth_jwt/internal/__init__.py +7 -0
  13. nadeshiko/api/auth_jwt/internal/logout.py +151 -0
  14. nadeshiko/api/lists/__init__.py +8 -0
  15. nadeshiko/api/lists/internal/__init__.py +12 -0
  16. nadeshiko/api/lists/internal/list_add_item.py +215 -0
  17. nadeshiko/api/lists/internal/list_create.py +194 -0
  18. nadeshiko/api/lists/internal/list_destroy.py +193 -0
  19. nadeshiko/api/lists/internal/list_remove_item.py +207 -0
  20. nadeshiko/api/lists/internal/list_update.py +215 -0
  21. nadeshiko/api/lists/internal/list_update_item.py +229 -0
  22. nadeshiko/api/lists/list_index.py +257 -0
  23. nadeshiko/api/lists/list_show.py +193 -0
  24. nadeshiko/api/media/__init__.py +14 -0
  25. nadeshiko/api/media/character_show.py +193 -0
  26. nadeshiko/api/media/episode_index.py +229 -0
  27. nadeshiko/api/media/episode_show.py +207 -0
  28. nadeshiko/api/media/internal/__init__.py +16 -0
  29. nadeshiko/api/media/internal/episode_create.py +215 -0
  30. nadeshiko/api/media/internal/episode_destroy.py +205 -0
  31. nadeshiko/api/media/internal/episode_update.py +229 -0
  32. nadeshiko/api/media/internal/media_create.py +194 -0
  33. nadeshiko/api/media/internal/media_destroy.py +197 -0
  34. nadeshiko/api/media/internal/media_update.py +219 -0
  35. nadeshiko/api/media/internal/segment_create.py +229 -0
  36. nadeshiko/api/media/internal/segment_destroy.py +219 -0
  37. nadeshiko/api/media/internal/segment_index.py +243 -0
  38. nadeshiko/api/media/internal/segment_update.py +243 -0
  39. nadeshiko/api/media/media_index.py +232 -0
  40. nadeshiko/api/media/media_show.py +193 -0
  41. nadeshiko/api/media/segment_show.py +221 -0
  42. nadeshiko/api/media/segment_show_by_uuid.py +193 -0
  43. nadeshiko/api/media/seiyuu_show.py +193 -0
  44. nadeshiko/api/search/__init__.py +11 -0
  45. nadeshiko/api/search/fetch_media_info.py +278 -0
  46. nadeshiko/api/search/fetch_sentence_context.py +219 -0
  47. nadeshiko/api/search/internal/__init__.py +6 -0
  48. nadeshiko/api/search/search.py +295 -0
  49. nadeshiko/api/search/search_health_check.py +168 -0
  50. nadeshiko/api/search/search_multiple.py +238 -0
  51. nadeshiko/api/user/__init__.py +3 -0
  52. nadeshiko/api/user/internal/__init__.py +11 -0
  53. nadeshiko/api/user/internal/create_api_key.py +199 -0
  54. nadeshiko/api/user/internal/deactivate_api_key.py +194 -0
  55. nadeshiko/api/user/internal/get_api_keys.py +151 -0
  56. nadeshiko/api/user/internal/get_identity_me.py +156 -0
  57. nadeshiko/api/user/internal/get_user_info.py +156 -0
  58. nadeshiko/client.py +138 -0
  59. nadeshiko/errors.py +16 -0
  60. nadeshiko/models/__init__.py +215 -0
  61. nadeshiko/models/api_key.py +118 -0
  62. nadeshiko/models/api_key_permission.py +70 -0
  63. nadeshiko/models/auth_user.py +107 -0
  64. nadeshiko/models/basic_info.py +132 -0
  65. nadeshiko/models/category_statistic.py +71 -0
  66. nadeshiko/models/character.py +100 -0
  67. nadeshiko/models/character_input.py +130 -0
  68. nadeshiko/models/character_input_character_role.py +10 -0
  69. nadeshiko/models/character_with_media.py +124 -0
  70. nadeshiko/models/character_with_media_media_appearances_item.py +93 -0
  71. nadeshiko/models/character_with_media_media_appearances_item_role.py +10 -0
  72. nadeshiko/models/create_api_key_request.py +75 -0
  73. nadeshiko/models/create_api_key_response.py +70 -0
  74. nadeshiko/models/deactivate_api_key_request.py +62 -0
  75. nadeshiko/models/deactivate_api_key_response.py +62 -0
  76. nadeshiko/models/discord_auth_url_response.py +62 -0
  77. nadeshiko/models/discord_login_request.py +62 -0
  78. nadeshiko/models/episode.py +253 -0
  79. nadeshiko/models/episode_create_request.py +145 -0
  80. nadeshiko/models/episode_list_response.py +94 -0
  81. nadeshiko/models/episode_update_request.py +135 -0
  82. nadeshiko/models/error.py +128 -0
  83. nadeshiko/models/error_errors.py +46 -0
  84. nadeshiko/models/fetch_media_info_response.py +115 -0
  85. nadeshiko/models/fetch_media_info_type.py +10 -0
  86. nadeshiko/models/fetch_sentence_context_request.py +96 -0
  87. nadeshiko/models/fetch_sentence_context_response.py +75 -0
  88. nadeshiko/models/get_api_keys_response.py +86 -0
  89. nadeshiko/models/google_login_request.py +62 -0
  90. nadeshiko/models/list_.py +97 -0
  91. nadeshiko/models/list_add_item_body.py +69 -0
  92. nadeshiko/models/list_add_item_response_201.py +61 -0
  93. nadeshiko/models/list_create_request.py +107 -0
  94. nadeshiko/models/list_create_request_type.py +9 -0
  95. nadeshiko/models/list_create_request_visibility.py +9 -0
  96. nadeshiko/models/list_destroy_response_200.py +70 -0
  97. nadeshiko/models/list_index_type.py +9 -0
  98. nadeshiko/models/list_index_visibility.py +9 -0
  99. nadeshiko/models/list_input.py +138 -0
  100. nadeshiko/models/list_input_list_type.py +9 -0
  101. nadeshiko/models/list_input_list_visibility.py +9 -0
  102. nadeshiko/models/list_remove_item_response_200.py +61 -0
  103. nadeshiko/models/list_type.py +9 -0
  104. nadeshiko/models/list_update_body.py +78 -0
  105. nadeshiko/models/list_update_body_visibility.py +9 -0
  106. nadeshiko/models/list_update_item_body.py +61 -0
  107. nadeshiko/models/list_update_item_response_200.py +61 -0
  108. nadeshiko/models/list_visibility.py +9 -0
  109. nadeshiko/models/list_with_media.py +119 -0
  110. nadeshiko/models/list_with_media_media_item.py +83 -0
  111. nadeshiko/models/list_with_media_type.py +9 -0
  112. nadeshiko/models/list_with_media_visibility.py +9 -0
  113. nadeshiko/models/login_request.py +70 -0
  114. nadeshiko/models/login_response.py +84 -0
  115. nadeshiko/models/logout_response.py +73 -0
  116. nadeshiko/models/media.py +288 -0
  117. nadeshiko/models/media_category.py +11 -0
  118. nadeshiko/models/media_character.py +78 -0
  119. nadeshiko/models/media_character_role.py +10 -0
  120. nadeshiko/models/media_create_request.py +270 -0
  121. nadeshiko/models/media_create_request_category.py +11 -0
  122. nadeshiko/models/media_destroy_response_200.py +70 -0
  123. nadeshiko/models/media_index_category.py +9 -0
  124. nadeshiko/models/media_info_data.py +307 -0
  125. nadeshiko/models/media_info_path.py +83 -0
  126. nadeshiko/models/media_info_stats.py +89 -0
  127. nadeshiko/models/media_list_response.py +94 -0
  128. nadeshiko/models/media_update_request.py +297 -0
  129. nadeshiko/models/media_update_request_category.py +9 -0
  130. nadeshiko/models/quota_info.py +87 -0
  131. nadeshiko/models/quota_info_quota_limit_type_1.py +8 -0
  132. nadeshiko/models/register_request.py +78 -0
  133. nadeshiko/models/register_response.py +76 -0
  134. nadeshiko/models/register_response_user.py +46 -0
  135. nadeshiko/models/search_health_check_response.py +138 -0
  136. nadeshiko/models/search_multiple_request.py +72 -0
  137. nadeshiko/models/search_multiple_response.py +79 -0
  138. nadeshiko/models/search_request.py +253 -0
  139. nadeshiko/models/search_request_content_sort.py +13 -0
  140. nadeshiko/models/search_request_media_item.py +85 -0
  141. nadeshiko/models/search_request_media_item_seasons_item.py +69 -0
  142. nadeshiko/models/search_response.py +158 -0
  143. nadeshiko/models/segment.py +303 -0
  144. nadeshiko/models/segment_create_request.py +203 -0
  145. nadeshiko/models/segment_create_request_status.py +13 -0
  146. nadeshiko/models/segment_info.py +207 -0
  147. nadeshiko/models/segment_list_response.py +94 -0
  148. nadeshiko/models/segment_status.py +13 -0
  149. nadeshiko/models/segment_update_request.py +198 -0
  150. nadeshiko/models/segment_update_request_status.py +13 -0
  151. nadeshiko/models/seiyuu.py +86 -0
  152. nadeshiko/models/seiyuu_with_roles.py +108 -0
  153. nadeshiko/models/seiyuu_with_roles_roles_item.py +109 -0
  154. nadeshiko/models/seiyuu_with_roles_roles_item_role.py +10 -0
  155. nadeshiko/models/sentence.py +88 -0
  156. nadeshiko/models/statistic.py +132 -0
  157. nadeshiko/models/statistic_season_with_episode_hits.py +74 -0
  158. nadeshiko/models/statistic_season_with_episode_hits_additional_property.py +46 -0
  159. nadeshiko/models/user_info_response.py +79 -0
  160. nadeshiko/models/user_info_response_user.py +91 -0
  161. nadeshiko/models/user_role.py +71 -0
  162. nadeshiko/models/word_match.py +107 -0
  163. nadeshiko/models/word_match_media.py +98 -0
  164. nadeshiko/types.py +54 -0
  165. nadeshiko_sdk-0.1.0.dist-info/METADATA +147 -0
  166. nadeshiko_sdk-0.1.0.dist-info/RECORD +167 -0
  167. nadeshiko_sdk-0.1.0.dist-info/WHEEL +4 -0
@@ -0,0 +1,70 @@
1
+ from __future__ import annotations
2
+
3
+ from collections.abc import Mapping
4
+ from typing import Any, TypeVar
5
+
6
+ from attrs import define as _attrs_define
7
+ from attrs import field as _attrs_field
8
+
9
+ T = TypeVar("T", bound="LoginRequest")
10
+
11
+
12
+ @_attrs_define
13
+ class LoginRequest:
14
+ """Login request body
15
+
16
+ Attributes:
17
+ email (str): User's email address Example: admin@admin.com.
18
+ password (str): User's password Example: admin.
19
+ """
20
+
21
+ email: str
22
+ password: str
23
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
24
+
25
+ def to_dict(self) -> dict[str, Any]:
26
+ email = self.email
27
+
28
+ password = self.password
29
+
30
+ field_dict: dict[str, Any] = {}
31
+ field_dict.update(self.additional_properties)
32
+ field_dict.update(
33
+ {
34
+ "email": email,
35
+ "password": password,
36
+ }
37
+ )
38
+
39
+ return field_dict
40
+
41
+ @classmethod
42
+ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
43
+ d = dict(src_dict)
44
+ email = d.pop("email")
45
+
46
+ password = d.pop("password")
47
+
48
+ login_request = cls(
49
+ email=email,
50
+ password=password,
51
+ )
52
+
53
+ login_request.additional_properties = d
54
+ return login_request
55
+
56
+ @property
57
+ def additional_keys(self) -> list[str]:
58
+ return list(self.additional_properties.keys())
59
+
60
+ def __getitem__(self, key: str) -> Any:
61
+ return self.additional_properties[key]
62
+
63
+ def __setitem__(self, key: str, value: Any) -> None:
64
+ self.additional_properties[key] = value
65
+
66
+ def __delitem__(self, key: str) -> None:
67
+ del self.additional_properties[key]
68
+
69
+ def __contains__(self, key: str) -> bool:
70
+ return key in self.additional_properties
@@ -0,0 +1,84 @@
1
+ from __future__ import annotations
2
+
3
+ from collections.abc import Mapping
4
+ from typing import TYPE_CHECKING, Any, TypeVar
5
+
6
+ from attrs import define as _attrs_define
7
+ from attrs import field as _attrs_field
8
+
9
+ if TYPE_CHECKING:
10
+ from ..models.auth_user import AuthUser
11
+
12
+
13
+ T = TypeVar("T", bound="LoginResponse")
14
+
15
+
16
+ @_attrs_define
17
+ class LoginResponse:
18
+ """Login Response
19
+
20
+ Attributes:
21
+ message (str): Success message
22
+ user (AuthUser): Authenticated user information
23
+ token (str): JWT access token
24
+ """
25
+
26
+ message: str
27
+ user: AuthUser
28
+ token: str
29
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
30
+
31
+ def to_dict(self) -> dict[str, Any]:
32
+ message = self.message
33
+
34
+ user = self.user.to_dict()
35
+
36
+ token = self.token
37
+
38
+ field_dict: dict[str, Any] = {}
39
+ field_dict.update(self.additional_properties)
40
+ field_dict.update(
41
+ {
42
+ "message": message,
43
+ "user": user,
44
+ "token": token,
45
+ }
46
+ )
47
+
48
+ return field_dict
49
+
50
+ @classmethod
51
+ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
52
+ from ..models.auth_user import AuthUser
53
+
54
+ d = dict(src_dict)
55
+ message = d.pop("message")
56
+
57
+ user = AuthUser.from_dict(d.pop("user"))
58
+
59
+ token = d.pop("token")
60
+
61
+ login_response = cls(
62
+ message=message,
63
+ user=user,
64
+ token=token,
65
+ )
66
+
67
+ login_response.additional_properties = d
68
+ return login_response
69
+
70
+ @property
71
+ def additional_keys(self) -> list[str]:
72
+ return list(self.additional_properties.keys())
73
+
74
+ def __getitem__(self, key: str) -> Any:
75
+ return self.additional_properties[key]
76
+
77
+ def __setitem__(self, key: str, value: Any) -> None:
78
+ self.additional_properties[key] = value
79
+
80
+ def __delitem__(self, key: str) -> None:
81
+ del self.additional_properties[key]
82
+
83
+ def __contains__(self, key: str) -> bool:
84
+ return key in self.additional_properties
@@ -0,0 +1,73 @@
1
+ from __future__ import annotations
2
+
3
+ from collections.abc import Mapping
4
+ from typing import Any, TypeVar
5
+
6
+ from attrs import define as _attrs_define
7
+ from attrs import field as _attrs_field
8
+
9
+ from ..types import UNSET, Unset
10
+
11
+ T = TypeVar("T", bound="LogoutResponse")
12
+
13
+
14
+ @_attrs_define
15
+ class LogoutResponse:
16
+ """Logout response
17
+
18
+ Attributes:
19
+ message (str): Success message
20
+ status (int | Unset): HTTP status code
21
+ """
22
+
23
+ message: str
24
+ status: int | Unset = UNSET
25
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
26
+
27
+ def to_dict(self) -> dict[str, Any]:
28
+ message = self.message
29
+
30
+ status = self.status
31
+
32
+ field_dict: dict[str, Any] = {}
33
+ field_dict.update(self.additional_properties)
34
+ field_dict.update(
35
+ {
36
+ "message": message,
37
+ }
38
+ )
39
+ if status is not UNSET:
40
+ field_dict["status"] = status
41
+
42
+ return field_dict
43
+
44
+ @classmethod
45
+ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
46
+ d = dict(src_dict)
47
+ message = d.pop("message")
48
+
49
+ status = d.pop("status", UNSET)
50
+
51
+ logout_response = cls(
52
+ message=message,
53
+ status=status,
54
+ )
55
+
56
+ logout_response.additional_properties = d
57
+ return logout_response
58
+
59
+ @property
60
+ def additional_keys(self) -> list[str]:
61
+ return list(self.additional_properties.keys())
62
+
63
+ def __getitem__(self, key: str) -> Any:
64
+ return self.additional_properties[key]
65
+
66
+ def __setitem__(self, key: str, value: Any) -> None:
67
+ self.additional_properties[key] = value
68
+
69
+ def __delitem__(self, key: str) -> None:
70
+ del self.additional_properties[key]
71
+
72
+ def __contains__(self, key: str) -> bool:
73
+ return key in self.additional_properties
@@ -0,0 +1,288 @@
1
+ from __future__ import annotations
2
+
3
+ import datetime
4
+ from collections.abc import Mapping
5
+ from typing import TYPE_CHECKING, Any, TypeVar, cast
6
+
7
+ from attrs import define as _attrs_define
8
+ from attrs import field as _attrs_field
9
+ from dateutil.parser import isoparse
10
+
11
+ from ..models.media_category import MediaCategory
12
+ from ..types import UNSET, Unset
13
+
14
+ if TYPE_CHECKING:
15
+ from ..models.list_ import List
16
+ from ..models.media_character import MediaCharacter
17
+
18
+
19
+ T = TypeVar("T", bound="Media")
20
+
21
+
22
+ @_attrs_define
23
+ class Media:
24
+ """Media entry with full metadata
25
+
26
+ Attributes:
27
+ id (int): Unique identifier for the media Example: 7674.
28
+ anilist_id (int): AniList database ID for the media Example: 7674.
29
+ japanese_name (str): Original Japanese name of the media Example: バクマン。.
30
+ romaji_name (str): Romaji transliteration of the media name Example: Bakuman..
31
+ english_name (str): English translation of the media name Example: Bakuman..
32
+ airing_format (str): Format of the media release (e.g., TV, OVA, Movie) Example: TV.
33
+ airing_status (str): Current airing status (FINISHED, RELEASING, NOT_YET_RELEASED, CANCELLED) Example: FINISHED.
34
+ genres (list[str]): List of genres associated with the media Example: ['Comedy', 'Drama', 'Romance', 'Slice of
35
+ Life'].
36
+ cover_url (str): Full URL to the cover image Example: https://cdn.example.com/media/anime/bakuman/cover.webp.
37
+ banner_url (str): Full URL to the banner image Example: https://cdn.example.com/media/anime/bakuman/banner.webp.
38
+ start_date (datetime.datetime): Start date of the media (first airing/release) Example: 2010-10-02
39
+ 00:00:00+00:00.
40
+ category (MediaCategory): Media category Example: ANIME.
41
+ version (str): Version identifier for the media entry Example: 6.
42
+ studio (str): Animation studio that produced the media Example: J.C.STAFF.
43
+ season_name (str): Season when the media aired (WINTER, SPRING, SUMMER, FALL) Example: FALL.
44
+ season_year (int): Year when the media aired Example: 2010.
45
+ end_date (datetime.datetime | None | Unset): End date of the media (last airing/release) Example: 2011-04-02
46
+ 00:00:00+00:00.
47
+ num_segments (int | Unset): Total number of subtitle segments available
48
+ num_episodes (int | Unset): Total number of episodes available Example: 25.
49
+ characters (list[MediaCharacter] | Unset): Characters appearing in the media with their voice actors
50
+ lists (list[List] | Unset): Lists that contain this media
51
+ """
52
+
53
+ id: int
54
+ anilist_id: int
55
+ japanese_name: str
56
+ romaji_name: str
57
+ english_name: str
58
+ airing_format: str
59
+ airing_status: str
60
+ genres: list[str]
61
+ cover_url: str
62
+ banner_url: str
63
+ start_date: datetime.datetime
64
+ category: MediaCategory
65
+ version: str
66
+ studio: str
67
+ season_name: str
68
+ season_year: int
69
+ end_date: datetime.datetime | None | Unset = UNSET
70
+ num_segments: int | Unset = UNSET
71
+ num_episodes: int | Unset = UNSET
72
+ characters: list[MediaCharacter] | Unset = UNSET
73
+ lists: list[List] | Unset = UNSET
74
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
75
+
76
+ def to_dict(self) -> dict[str, Any]:
77
+ id = self.id
78
+
79
+ anilist_id = self.anilist_id
80
+
81
+ japanese_name = self.japanese_name
82
+
83
+ romaji_name = self.romaji_name
84
+
85
+ english_name = self.english_name
86
+
87
+ airing_format = self.airing_format
88
+
89
+ airing_status = self.airing_status
90
+
91
+ genres = self.genres
92
+
93
+ cover_url = self.cover_url
94
+
95
+ banner_url = self.banner_url
96
+
97
+ start_date = self.start_date.isoformat()
98
+
99
+ category = self.category.value
100
+
101
+ version = self.version
102
+
103
+ studio = self.studio
104
+
105
+ season_name = self.season_name
106
+
107
+ season_year = self.season_year
108
+
109
+ end_date: None | str | Unset
110
+ if isinstance(self.end_date, Unset):
111
+ end_date = UNSET
112
+ elif isinstance(self.end_date, datetime.datetime):
113
+ end_date = self.end_date.isoformat()
114
+ else:
115
+ end_date = self.end_date
116
+
117
+ num_segments = self.num_segments
118
+
119
+ num_episodes = self.num_episodes
120
+
121
+ characters: list[dict[str, Any]] | Unset = UNSET
122
+ if not isinstance(self.characters, Unset):
123
+ characters = []
124
+ for characters_item_data in self.characters:
125
+ characters_item = characters_item_data.to_dict()
126
+ characters.append(characters_item)
127
+
128
+ lists: list[dict[str, Any]] | Unset = UNSET
129
+ if not isinstance(self.lists, Unset):
130
+ lists = []
131
+ for lists_item_data in self.lists:
132
+ lists_item = lists_item_data.to_dict()
133
+ lists.append(lists_item)
134
+
135
+ field_dict: dict[str, Any] = {}
136
+ field_dict.update(self.additional_properties)
137
+ field_dict.update(
138
+ {
139
+ "id": id,
140
+ "anilistId": anilist_id,
141
+ "japaneseName": japanese_name,
142
+ "romajiName": romaji_name,
143
+ "englishName": english_name,
144
+ "airingFormat": airing_format,
145
+ "airingStatus": airing_status,
146
+ "genres": genres,
147
+ "coverUrl": cover_url,
148
+ "bannerUrl": banner_url,
149
+ "startDate": start_date,
150
+ "category": category,
151
+ "version": version,
152
+ "studio": studio,
153
+ "seasonName": season_name,
154
+ "seasonYear": season_year,
155
+ }
156
+ )
157
+ if end_date is not UNSET:
158
+ field_dict["endDate"] = end_date
159
+ if num_segments is not UNSET:
160
+ field_dict["numSegments"] = num_segments
161
+ if num_episodes is not UNSET:
162
+ field_dict["numEpisodes"] = num_episodes
163
+ if characters is not UNSET:
164
+ field_dict["characters"] = characters
165
+ if lists is not UNSET:
166
+ field_dict["lists"] = lists
167
+
168
+ return field_dict
169
+
170
+ @classmethod
171
+ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
172
+ from ..models.list_ import List
173
+ from ..models.media_character import MediaCharacter
174
+
175
+ d = dict(src_dict)
176
+ id = d.pop("id")
177
+
178
+ anilist_id = d.pop("anilistId")
179
+
180
+ japanese_name = d.pop("japaneseName")
181
+
182
+ romaji_name = d.pop("romajiName")
183
+
184
+ english_name = d.pop("englishName")
185
+
186
+ airing_format = d.pop("airingFormat")
187
+
188
+ airing_status = d.pop("airingStatus")
189
+
190
+ genres = cast(list[str], d.pop("genres"))
191
+
192
+ cover_url = d.pop("coverUrl")
193
+
194
+ banner_url = d.pop("bannerUrl")
195
+
196
+ start_date = isoparse(d.pop("startDate"))
197
+
198
+ category = MediaCategory(d.pop("category"))
199
+
200
+ version = d.pop("version")
201
+
202
+ studio = d.pop("studio")
203
+
204
+ season_name = d.pop("seasonName")
205
+
206
+ season_year = d.pop("seasonYear")
207
+
208
+ def _parse_end_date(data: object) -> datetime.datetime | None | Unset:
209
+ if data is None:
210
+ return data
211
+ if isinstance(data, Unset):
212
+ return data
213
+ try:
214
+ if not isinstance(data, str):
215
+ raise TypeError()
216
+ end_date_type_0 = isoparse(data)
217
+
218
+ return end_date_type_0
219
+ except (TypeError, ValueError, AttributeError, KeyError):
220
+ pass
221
+ return cast(datetime.datetime | None | Unset, data)
222
+
223
+ end_date = _parse_end_date(d.pop("endDate", UNSET))
224
+
225
+ num_segments = d.pop("numSegments", UNSET)
226
+
227
+ num_episodes = d.pop("numEpisodes", UNSET)
228
+
229
+ _characters = d.pop("characters", UNSET)
230
+ characters: list[MediaCharacter] | Unset = UNSET
231
+ if _characters is not UNSET:
232
+ characters = []
233
+ for characters_item_data in _characters:
234
+ characters_item = MediaCharacter.from_dict(characters_item_data)
235
+
236
+ characters.append(characters_item)
237
+
238
+ _lists = d.pop("lists", UNSET)
239
+ lists: list[List] | Unset = UNSET
240
+ if _lists is not UNSET:
241
+ lists = []
242
+ for lists_item_data in _lists:
243
+ lists_item = List.from_dict(lists_item_data)
244
+
245
+ lists.append(lists_item)
246
+
247
+ media = cls(
248
+ id=id,
249
+ anilist_id=anilist_id,
250
+ japanese_name=japanese_name,
251
+ romaji_name=romaji_name,
252
+ english_name=english_name,
253
+ airing_format=airing_format,
254
+ airing_status=airing_status,
255
+ genres=genres,
256
+ cover_url=cover_url,
257
+ banner_url=banner_url,
258
+ start_date=start_date,
259
+ category=category,
260
+ version=version,
261
+ studio=studio,
262
+ season_name=season_name,
263
+ season_year=season_year,
264
+ end_date=end_date,
265
+ num_segments=num_segments,
266
+ num_episodes=num_episodes,
267
+ characters=characters,
268
+ lists=lists,
269
+ )
270
+
271
+ media.additional_properties = d
272
+ return media
273
+
274
+ @property
275
+ def additional_keys(self) -> list[str]:
276
+ return list(self.additional_properties.keys())
277
+
278
+ def __getitem__(self, key: str) -> Any:
279
+ return self.additional_properties[key]
280
+
281
+ def __setitem__(self, key: str, value: Any) -> None:
282
+ self.additional_properties[key] = value
283
+
284
+ def __delitem__(self, key: str) -> None:
285
+ del self.additional_properties[key]
286
+
287
+ def __contains__(self, key: str) -> bool:
288
+ return key in self.additional_properties
@@ -0,0 +1,11 @@
1
+ from enum import Enum
2
+
3
+
4
+ class MediaCategory(str, Enum):
5
+ ANIME = "ANIME"
6
+ AUDIOBOOK = "AUDIOBOOK"
7
+ BOOK = "BOOK"
8
+ JDRAMA = "JDRAMA"
9
+
10
+ def __str__(self) -> str:
11
+ return str(self.value)
@@ -0,0 +1,78 @@
1
+ from __future__ import annotations
2
+
3
+ from collections.abc import Mapping
4
+ from typing import TYPE_CHECKING, Any, TypeVar
5
+
6
+ from attrs import define as _attrs_define
7
+ from attrs import field as _attrs_field
8
+
9
+ from ..models.media_character_role import MediaCharacterRole
10
+
11
+ if TYPE_CHECKING:
12
+ from ..models.character import Character
13
+
14
+
15
+ T = TypeVar("T", bound="MediaCharacter")
16
+
17
+
18
+ @_attrs_define
19
+ class MediaCharacter:
20
+ """Character appearing in a media with their role
21
+
22
+ Attributes:
23
+ character (Character): Anime character
24
+ role (MediaCharacterRole): Character's role in the media Example: MAIN.
25
+ """
26
+
27
+ character: Character
28
+ role: MediaCharacterRole
29
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
30
+
31
+ def to_dict(self) -> dict[str, Any]:
32
+ character = self.character.to_dict()
33
+
34
+ role = self.role.value
35
+
36
+ field_dict: dict[str, Any] = {}
37
+ field_dict.update(self.additional_properties)
38
+ field_dict.update(
39
+ {
40
+ "character": character,
41
+ "role": role,
42
+ }
43
+ )
44
+
45
+ return field_dict
46
+
47
+ @classmethod
48
+ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
49
+ from ..models.character import Character
50
+
51
+ d = dict(src_dict)
52
+ character = Character.from_dict(d.pop("character"))
53
+
54
+ role = MediaCharacterRole(d.pop("role"))
55
+
56
+ media_character = cls(
57
+ character=character,
58
+ role=role,
59
+ )
60
+
61
+ media_character.additional_properties = d
62
+ return media_character
63
+
64
+ @property
65
+ def additional_keys(self) -> list[str]:
66
+ return list(self.additional_properties.keys())
67
+
68
+ def __getitem__(self, key: str) -> Any:
69
+ return self.additional_properties[key]
70
+
71
+ def __setitem__(self, key: str, value: Any) -> None:
72
+ self.additional_properties[key] = value
73
+
74
+ def __delitem__(self, key: str) -> None:
75
+ del self.additional_properties[key]
76
+
77
+ def __contains__(self, key: str) -> bool:
78
+ return key in self.additional_properties
@@ -0,0 +1,10 @@
1
+ from enum import Enum
2
+
3
+
4
+ class MediaCharacterRole(str, Enum):
5
+ BACKGROUND = "BACKGROUND"
6
+ MAIN = "MAIN"
7
+ SUPPORTING = "SUPPORTING"
8
+
9
+ def __str__(self) -> str:
10
+ return str(self.value)