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,270 @@
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_create_request_category import MediaCreateRequestCategory
12
+ from ..types import UNSET, Unset
13
+
14
+ if TYPE_CHECKING:
15
+ from ..models.character_input import CharacterInput
16
+ from ..models.list_input import ListInput
17
+
18
+
19
+ T = TypeVar("T", bound="MediaCreateRequest")
20
+
21
+
22
+ @_attrs_define
23
+ class MediaCreateRequest:
24
+ """Request body for creating a new media entry
25
+
26
+ Attributes:
27
+ anilist_id (int): AniList database ID for the media Example: 7674.
28
+ japanese_name (str): Original Japanese name of the media Example: バクマン。.
29
+ romaji_name (str): Romaji transliteration of the media name Example: Bakuman..
30
+ english_name (str): English translation of the media name Example: Bakuman..
31
+ airing_format (str): Format of the media release (e.g., TV, OVA, Movie) Example: TV.
32
+ airing_status (str): Current airing status (FINISHED, RELEASING, NOT_YET_RELEASED, CANCELLED) Example: FINISHED.
33
+ genres (list[str]): List of genres associated with the media Example: ['Comedy', 'Drama', 'Romance', 'Slice of
34
+ Life'].
35
+ category (MediaCreateRequestCategory): Media category Example: ANIME.
36
+ version (str): Version of the media-sub-splitter used Example: 6.
37
+ studio (str): Animation studio that produced the media Example: J.C.STAFF.
38
+ season_name (str): Season when the media aired (WINTER, SPRING, SUMMER, FALL) Example: FALL.
39
+ season_year (int): Year when the media aired Example: 2010.
40
+ cover_url (str | Unset): Full URL to the cover image Example:
41
+ https://cdn.example.com/media/anime/bakuman/cover.webp.
42
+ banner_url (str | Unset): Full URL to the banner image Example:
43
+ https://cdn.example.com/media/anime/bakuman/banner.webp.
44
+ start_date (datetime.datetime | Unset): Start date of the media (first airing/release) Example: 2010-10-02
45
+ 00:00:00+00:00.
46
+ end_date (datetime.datetime | Unset): End date of the media (last airing/release) Example: 2011-04-02
47
+ 00:00:00+00:00.
48
+ hash_salt (str | Unset): Hash salt used when generating the hash for the related media assets Example:
49
+ ba0cbe173ed310528f16130273662a60.
50
+ characters (list[CharacterInput] | Unset): List of characters appearing in the media with their voice actors
51
+ lists (list[ListInput] | Unset): Lists to add this media to (e.g., series, franchise)
52
+ """
53
+
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
+ category: MediaCreateRequestCategory
62
+ version: str
63
+ studio: str
64
+ season_name: str
65
+ season_year: int
66
+ cover_url: str | Unset = UNSET
67
+ banner_url: str | Unset = UNSET
68
+ start_date: datetime.datetime | Unset = UNSET
69
+ end_date: datetime.datetime | Unset = UNSET
70
+ hash_salt: str | Unset = UNSET
71
+ characters: list[CharacterInput] | Unset = UNSET
72
+ lists: list[ListInput] | Unset = UNSET
73
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
74
+
75
+ def to_dict(self) -> dict[str, Any]:
76
+ anilist_id = self.anilist_id
77
+
78
+ japanese_name = self.japanese_name
79
+
80
+ romaji_name = self.romaji_name
81
+
82
+ english_name = self.english_name
83
+
84
+ airing_format = self.airing_format
85
+
86
+ airing_status = self.airing_status
87
+
88
+ genres = self.genres
89
+
90
+ category = self.category.value
91
+
92
+ version = self.version
93
+
94
+ studio = self.studio
95
+
96
+ season_name = self.season_name
97
+
98
+ season_year = self.season_year
99
+
100
+ cover_url = self.cover_url
101
+
102
+ banner_url = self.banner_url
103
+
104
+ start_date: str | Unset = UNSET
105
+ if not isinstance(self.start_date, Unset):
106
+ start_date = self.start_date.isoformat()
107
+
108
+ end_date: str | Unset = UNSET
109
+ if not isinstance(self.end_date, Unset):
110
+ end_date = self.end_date.isoformat()
111
+
112
+ hash_salt = self.hash_salt
113
+
114
+ characters: list[dict[str, Any]] | Unset = UNSET
115
+ if not isinstance(self.characters, Unset):
116
+ characters = []
117
+ for characters_item_data in self.characters:
118
+ characters_item = characters_item_data.to_dict()
119
+ characters.append(characters_item)
120
+
121
+ lists: list[dict[str, Any]] | Unset = UNSET
122
+ if not isinstance(self.lists, Unset):
123
+ lists = []
124
+ for lists_item_data in self.lists:
125
+ lists_item = lists_item_data.to_dict()
126
+ lists.append(lists_item)
127
+
128
+ field_dict: dict[str, Any] = {}
129
+ field_dict.update(self.additional_properties)
130
+ field_dict.update(
131
+ {
132
+ "anilistId": anilist_id,
133
+ "japaneseName": japanese_name,
134
+ "romajiName": romaji_name,
135
+ "englishName": english_name,
136
+ "airingFormat": airing_format,
137
+ "airingStatus": airing_status,
138
+ "genres": genres,
139
+ "category": category,
140
+ "version": version,
141
+ "studio": studio,
142
+ "seasonName": season_name,
143
+ "seasonYear": season_year,
144
+ }
145
+ )
146
+ if cover_url is not UNSET:
147
+ field_dict["coverUrl"] = cover_url
148
+ if banner_url is not UNSET:
149
+ field_dict["bannerUrl"] = banner_url
150
+ if start_date is not UNSET:
151
+ field_dict["startDate"] = start_date
152
+ if end_date is not UNSET:
153
+ field_dict["endDate"] = end_date
154
+ if hash_salt is not UNSET:
155
+ field_dict["hashSalt"] = hash_salt
156
+ if characters is not UNSET:
157
+ field_dict["characters"] = characters
158
+ if lists is not UNSET:
159
+ field_dict["lists"] = lists
160
+
161
+ return field_dict
162
+
163
+ @classmethod
164
+ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
165
+ from ..models.character_input import CharacterInput
166
+ from ..models.list_input import ListInput
167
+
168
+ d = dict(src_dict)
169
+ anilist_id = d.pop("anilistId")
170
+
171
+ japanese_name = d.pop("japaneseName")
172
+
173
+ romaji_name = d.pop("romajiName")
174
+
175
+ english_name = d.pop("englishName")
176
+
177
+ airing_format = d.pop("airingFormat")
178
+
179
+ airing_status = d.pop("airingStatus")
180
+
181
+ genres = cast(list[str], d.pop("genres"))
182
+
183
+ category = MediaCreateRequestCategory(d.pop("category"))
184
+
185
+ version = d.pop("version")
186
+
187
+ studio = d.pop("studio")
188
+
189
+ season_name = d.pop("seasonName")
190
+
191
+ season_year = d.pop("seasonYear")
192
+
193
+ cover_url = d.pop("coverUrl", UNSET)
194
+
195
+ banner_url = d.pop("bannerUrl", UNSET)
196
+
197
+ _start_date = d.pop("startDate", UNSET)
198
+ start_date: datetime.datetime | Unset
199
+ if isinstance(_start_date, Unset):
200
+ start_date = UNSET
201
+ else:
202
+ start_date = isoparse(_start_date)
203
+
204
+ _end_date = d.pop("endDate", UNSET)
205
+ end_date: datetime.datetime | Unset
206
+ if isinstance(_end_date, Unset):
207
+ end_date = UNSET
208
+ else:
209
+ end_date = isoparse(_end_date)
210
+
211
+ hash_salt = d.pop("hashSalt", UNSET)
212
+
213
+ _characters = d.pop("characters", UNSET)
214
+ characters: list[CharacterInput] | Unset = UNSET
215
+ if _characters is not UNSET:
216
+ characters = []
217
+ for characters_item_data in _characters:
218
+ characters_item = CharacterInput.from_dict(characters_item_data)
219
+
220
+ characters.append(characters_item)
221
+
222
+ _lists = d.pop("lists", UNSET)
223
+ lists: list[ListInput] | Unset = UNSET
224
+ if _lists is not UNSET:
225
+ lists = []
226
+ for lists_item_data in _lists:
227
+ lists_item = ListInput.from_dict(lists_item_data)
228
+
229
+ lists.append(lists_item)
230
+
231
+ media_create_request = cls(
232
+ anilist_id=anilist_id,
233
+ japanese_name=japanese_name,
234
+ romaji_name=romaji_name,
235
+ english_name=english_name,
236
+ airing_format=airing_format,
237
+ airing_status=airing_status,
238
+ genres=genres,
239
+ category=category,
240
+ version=version,
241
+ studio=studio,
242
+ season_name=season_name,
243
+ season_year=season_year,
244
+ cover_url=cover_url,
245
+ banner_url=banner_url,
246
+ start_date=start_date,
247
+ end_date=end_date,
248
+ hash_salt=hash_salt,
249
+ characters=characters,
250
+ lists=lists,
251
+ )
252
+
253
+ media_create_request.additional_properties = d
254
+ return media_create_request
255
+
256
+ @property
257
+ def additional_keys(self) -> list[str]:
258
+ return list(self.additional_properties.keys())
259
+
260
+ def __getitem__(self, key: str) -> Any:
261
+ return self.additional_properties[key]
262
+
263
+ def __setitem__(self, key: str, value: Any) -> None:
264
+ self.additional_properties[key] = value
265
+
266
+ def __delitem__(self, key: str) -> None:
267
+ del self.additional_properties[key]
268
+
269
+ def __contains__(self, key: str) -> bool:
270
+ return key in self.additional_properties
@@ -0,0 +1,11 @@
1
+ from enum import Enum
2
+
3
+
4
+ class MediaCreateRequestCategory(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,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
+ from ..types import UNSET, Unset
10
+
11
+ T = TypeVar("T", bound="MediaDestroyResponse200")
12
+
13
+
14
+ @_attrs_define
15
+ class MediaDestroyResponse200:
16
+ """
17
+ Attributes:
18
+ message (str | Unset): Example: Media deleted successfully.
19
+ id (int | Unset): Example: 7674.
20
+ """
21
+
22
+ message: str | Unset = UNSET
23
+ id: int | Unset = UNSET
24
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
25
+
26
+ def to_dict(self) -> dict[str, Any]:
27
+ message = self.message
28
+
29
+ id = self.id
30
+
31
+ field_dict: dict[str, Any] = {}
32
+ field_dict.update(self.additional_properties)
33
+ field_dict.update({})
34
+ if message is not UNSET:
35
+ field_dict["message"] = message
36
+ if id is not UNSET:
37
+ field_dict["id"] = id
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
+ message = d.pop("message", UNSET)
45
+
46
+ id = d.pop("id", UNSET)
47
+
48
+ media_destroy_response_200 = cls(
49
+ message=message,
50
+ id=id,
51
+ )
52
+
53
+ media_destroy_response_200.additional_properties = d
54
+ return media_destroy_response_200
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,9 @@
1
+ from enum import Enum
2
+
3
+
4
+ class MediaIndexCategory(str, Enum):
5
+ ANIME = "ANIME"
6
+ JDRAMA = "JDRAMA"
7
+
8
+ def __str__(self) -> str:
9
+ return str(self.value)
@@ -0,0 +1,307 @@
1
+ from __future__ import annotations
2
+
3
+ import datetime
4
+ from collections.abc import Mapping
5
+ from typing import 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 ..types import UNSET, Unset
12
+
13
+ T = TypeVar("T", bound="MediaInfoData")
14
+
15
+
16
+ @_attrs_define
17
+ class MediaInfoData:
18
+ """Complete information about a media/anime entry
19
+
20
+ Attributes:
21
+ id (int): Unique identifier for the media Example: 110316.
22
+ anilist_id (int | None | Unset): AniList database ID for the media Example: 21459.
23
+ tmdb_id (int | None | Unset): TMDB (The Movie Database) ID for the media Example: 63726.
24
+ category (int | Unset): Media category (1=Anime, 2=Unknown, 3=J-Drama, 4=Audiobook) Example: 1.
25
+ created_at (datetime.datetime | Unset): Timestamp when the media entry was created in the database Example:
26
+ 2024-01-15 10:30:00+00:00.
27
+ updated_at (int | Unset): Timestamp when the media entry was last updated Example: 1705769100.
28
+ romaji_name (str | Unset): Romaji transliteration of the media name Example: Steins;Gate.
29
+ english_name (str | Unset): English translation of the media name Example: Steins;Gate.
30
+ japanese_name (str | Unset): Original Japanese name of the media Example: シュタインズ・ゲート.
31
+ airing_format (str | Unset): Format of the media release (e.g., TV, OVA, Movie) Example: TV.
32
+ airing_status (str | Unset): Current airing status (FINISHED, RELEASING) Example: FINISHED.
33
+ start_date (datetime.datetime | Unset): Start date of the media Example: 2011-04-06 00:00:00+00:00.
34
+ end_date (datetime.datetime | None | Unset): End date of the media (null if unknown) Example: 2011-09-14
35
+ 00:00:00+00:00.
36
+ folder_media_name (str | Unset): Folder name used for storing media files Example: steins-gate.
37
+ genres (list[str] | Unset): List of genres associated with the media Example: ['Sci-Fi', 'Thriller', 'Romance'].
38
+ cover (str | Unset): URL to the cover image Example: https://example.com/media/anime/steins-gate/cover.jpg.
39
+ banner (str | Unset): URL to the banner image Example: https://example.com/media/anime/steins-gate/banner.jpg.
40
+ version (str | Unset): Version identifier for the media entry Example: v1.0.
41
+ num_segments (int | Unset): Total number of subtitle segments available Example: 18542.
42
+ num_seasons (int | Unset): Total number of seasons available Example: 1.
43
+ num_episodes (int | Unset): Total number of episodes available Example: 24.
44
+ """
45
+
46
+ id: int
47
+ anilist_id: int | None | Unset = UNSET
48
+ tmdb_id: int | None | Unset = UNSET
49
+ category: int | Unset = UNSET
50
+ created_at: datetime.datetime | Unset = UNSET
51
+ updated_at: int | Unset = UNSET
52
+ romaji_name: str | Unset = UNSET
53
+ english_name: str | Unset = UNSET
54
+ japanese_name: str | Unset = UNSET
55
+ airing_format: str | Unset = UNSET
56
+ airing_status: str | Unset = UNSET
57
+ start_date: datetime.datetime | Unset = UNSET
58
+ end_date: datetime.datetime | None | Unset = UNSET
59
+ folder_media_name: str | Unset = UNSET
60
+ genres: list[str] | Unset = UNSET
61
+ cover: str | Unset = UNSET
62
+ banner: str | Unset = UNSET
63
+ version: str | Unset = UNSET
64
+ num_segments: int | Unset = UNSET
65
+ num_seasons: int | Unset = UNSET
66
+ num_episodes: int | Unset = UNSET
67
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
68
+
69
+ def to_dict(self) -> dict[str, Any]:
70
+ id = self.id
71
+
72
+ anilist_id: int | None | Unset
73
+ if isinstance(self.anilist_id, Unset):
74
+ anilist_id = UNSET
75
+ else:
76
+ anilist_id = self.anilist_id
77
+
78
+ tmdb_id: int | None | Unset
79
+ if isinstance(self.tmdb_id, Unset):
80
+ tmdb_id = UNSET
81
+ else:
82
+ tmdb_id = self.tmdb_id
83
+
84
+ category = self.category
85
+
86
+ created_at: str | Unset = UNSET
87
+ if not isinstance(self.created_at, Unset):
88
+ created_at = self.created_at.isoformat()
89
+
90
+ updated_at = self.updated_at
91
+
92
+ romaji_name = self.romaji_name
93
+
94
+ english_name = self.english_name
95
+
96
+ japanese_name = self.japanese_name
97
+
98
+ airing_format = self.airing_format
99
+
100
+ airing_status = self.airing_status
101
+
102
+ start_date: str | Unset = UNSET
103
+ if not isinstance(self.start_date, Unset):
104
+ start_date = self.start_date.isoformat()
105
+
106
+ end_date: None | str | Unset
107
+ if isinstance(self.end_date, Unset):
108
+ end_date = UNSET
109
+ elif isinstance(self.end_date, datetime.datetime):
110
+ end_date = self.end_date.isoformat()
111
+ else:
112
+ end_date = self.end_date
113
+
114
+ folder_media_name = self.folder_media_name
115
+
116
+ genres: list[str] | Unset = UNSET
117
+ if not isinstance(self.genres, Unset):
118
+ genres = self.genres
119
+
120
+ cover = self.cover
121
+
122
+ banner = self.banner
123
+
124
+ version = self.version
125
+
126
+ num_segments = self.num_segments
127
+
128
+ num_seasons = self.num_seasons
129
+
130
+ num_episodes = self.num_episodes
131
+
132
+ field_dict: dict[str, Any] = {}
133
+ field_dict.update(self.additional_properties)
134
+ field_dict.update(
135
+ {
136
+ "id": id,
137
+ }
138
+ )
139
+ if anilist_id is not UNSET:
140
+ field_dict["anilist_id"] = anilist_id
141
+ if tmdb_id is not UNSET:
142
+ field_dict["tmdb_id"] = tmdb_id
143
+ if category is not UNSET:
144
+ field_dict["category"] = category
145
+ if created_at is not UNSET:
146
+ field_dict["created_at"] = created_at
147
+ if updated_at is not UNSET:
148
+ field_dict["updated_at"] = updated_at
149
+ if romaji_name is not UNSET:
150
+ field_dict["romaji_name"] = romaji_name
151
+ if english_name is not UNSET:
152
+ field_dict["english_name"] = english_name
153
+ if japanese_name is not UNSET:
154
+ field_dict["japanese_name"] = japanese_name
155
+ if airing_format is not UNSET:
156
+ field_dict["airing_format"] = airing_format
157
+ if airing_status is not UNSET:
158
+ field_dict["airing_status"] = airing_status
159
+ if start_date is not UNSET:
160
+ field_dict["start_date"] = start_date
161
+ if end_date is not UNSET:
162
+ field_dict["end_date"] = end_date
163
+ if folder_media_name is not UNSET:
164
+ field_dict["folder_media_name"] = folder_media_name
165
+ if genres is not UNSET:
166
+ field_dict["genres"] = genres
167
+ if cover is not UNSET:
168
+ field_dict["cover"] = cover
169
+ if banner is not UNSET:
170
+ field_dict["banner"] = banner
171
+ if version is not UNSET:
172
+ field_dict["version"] = version
173
+ if num_segments is not UNSET:
174
+ field_dict["num_segments"] = num_segments
175
+ if num_seasons is not UNSET:
176
+ field_dict["num_seasons"] = num_seasons
177
+ if num_episodes is not UNSET:
178
+ field_dict["num_episodes"] = num_episodes
179
+
180
+ return field_dict
181
+
182
+ @classmethod
183
+ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
184
+ d = dict(src_dict)
185
+ id = d.pop("id")
186
+
187
+ def _parse_anilist_id(data: object) -> int | None | Unset:
188
+ if data is None:
189
+ return data
190
+ if isinstance(data, Unset):
191
+ return data
192
+ return cast(int | None | Unset, data)
193
+
194
+ anilist_id = _parse_anilist_id(d.pop("anilist_id", UNSET))
195
+
196
+ def _parse_tmdb_id(data: object) -> int | None | Unset:
197
+ if data is None:
198
+ return data
199
+ if isinstance(data, Unset):
200
+ return data
201
+ return cast(int | None | Unset, data)
202
+
203
+ tmdb_id = _parse_tmdb_id(d.pop("tmdb_id", UNSET))
204
+
205
+ category = d.pop("category", UNSET)
206
+
207
+ _created_at = d.pop("created_at", UNSET)
208
+ created_at: datetime.datetime | Unset
209
+ if isinstance(_created_at, Unset):
210
+ created_at = UNSET
211
+ else:
212
+ created_at = isoparse(_created_at)
213
+
214
+ updated_at = d.pop("updated_at", UNSET)
215
+
216
+ romaji_name = d.pop("romaji_name", UNSET)
217
+
218
+ english_name = d.pop("english_name", UNSET)
219
+
220
+ japanese_name = d.pop("japanese_name", UNSET)
221
+
222
+ airing_format = d.pop("airing_format", UNSET)
223
+
224
+ airing_status = d.pop("airing_status", UNSET)
225
+
226
+ _start_date = d.pop("start_date", UNSET)
227
+ start_date: datetime.datetime | Unset
228
+ if isinstance(_start_date, Unset):
229
+ start_date = UNSET
230
+ else:
231
+ start_date = isoparse(_start_date)
232
+
233
+ def _parse_end_date(data: object) -> datetime.datetime | None | Unset:
234
+ if data is None:
235
+ return data
236
+ if isinstance(data, Unset):
237
+ return data
238
+ try:
239
+ if not isinstance(data, str):
240
+ raise TypeError()
241
+ end_date_type_0 = isoparse(data)
242
+
243
+ return end_date_type_0
244
+ except (TypeError, ValueError, AttributeError, KeyError):
245
+ pass
246
+ return cast(datetime.datetime | None | Unset, data)
247
+
248
+ end_date = _parse_end_date(d.pop("end_date", UNSET))
249
+
250
+ folder_media_name = d.pop("folder_media_name", UNSET)
251
+
252
+ genres = cast(list[str], d.pop("genres", UNSET))
253
+
254
+ cover = d.pop("cover", UNSET)
255
+
256
+ banner = d.pop("banner", UNSET)
257
+
258
+ version = d.pop("version", UNSET)
259
+
260
+ num_segments = d.pop("num_segments", UNSET)
261
+
262
+ num_seasons = d.pop("num_seasons", UNSET)
263
+
264
+ num_episodes = d.pop("num_episodes", UNSET)
265
+
266
+ media_info_data = cls(
267
+ id=id,
268
+ anilist_id=anilist_id,
269
+ tmdb_id=tmdb_id,
270
+ category=category,
271
+ created_at=created_at,
272
+ updated_at=updated_at,
273
+ romaji_name=romaji_name,
274
+ english_name=english_name,
275
+ japanese_name=japanese_name,
276
+ airing_format=airing_format,
277
+ airing_status=airing_status,
278
+ start_date=start_date,
279
+ end_date=end_date,
280
+ folder_media_name=folder_media_name,
281
+ genres=genres,
282
+ cover=cover,
283
+ banner=banner,
284
+ version=version,
285
+ num_segments=num_segments,
286
+ num_seasons=num_seasons,
287
+ num_episodes=num_episodes,
288
+ )
289
+
290
+ media_info_data.additional_properties = d
291
+ return media_info_data
292
+
293
+ @property
294
+ def additional_keys(self) -> list[str]:
295
+ return list(self.additional_properties.keys())
296
+
297
+ def __getitem__(self, key: str) -> Any:
298
+ return self.additional_properties[key]
299
+
300
+ def __setitem__(self, key: str, value: Any) -> None:
301
+ self.additional_properties[key] = value
302
+
303
+ def __delitem__(self, key: str) -> None:
304
+ del self.additional_properties[key]
305
+
306
+ def __contains__(self, key: str) -> bool:
307
+ return key in self.additional_properties