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,71 @@
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="CategoryStatistic")
12
+
13
+
14
+ @_attrs_define
15
+ class CategoryStatistic:
16
+ """Statistics grouped by media category
17
+
18
+ Attributes:
19
+ category (int | Unset): Media category (1=Anime, 2=Unknown, 3=J-Drama, 4=Audiobook) Example: 1.
20
+ count (int | Unset): Number of entries in this category Example: 1523.
21
+ """
22
+
23
+ category: int | Unset = UNSET
24
+ count: 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
+ category = self.category
29
+
30
+ count = self.count
31
+
32
+ field_dict: dict[str, Any] = {}
33
+ field_dict.update(self.additional_properties)
34
+ field_dict.update({})
35
+ if category is not UNSET:
36
+ field_dict["category"] = category
37
+ if count is not UNSET:
38
+ field_dict["count"] = count
39
+
40
+ return field_dict
41
+
42
+ @classmethod
43
+ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
44
+ d = dict(src_dict)
45
+ category = d.pop("category", UNSET)
46
+
47
+ count = d.pop("count", UNSET)
48
+
49
+ category_statistic = cls(
50
+ category=category,
51
+ count=count,
52
+ )
53
+
54
+ category_statistic.additional_properties = d
55
+ return category_statistic
56
+
57
+ @property
58
+ def additional_keys(self) -> list[str]:
59
+ return list(self.additional_properties.keys())
60
+
61
+ def __getitem__(self, key: str) -> Any:
62
+ return self.additional_properties[key]
63
+
64
+ def __setitem__(self, key: str, value: Any) -> None:
65
+ self.additional_properties[key] = value
66
+
67
+ def __delitem__(self, key: str) -> None:
68
+ del self.additional_properties[key]
69
+
70
+ def __contains__(self, key: str) -> bool:
71
+ return key in self.additional_properties
@@ -0,0 +1,100 @@
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.seiyuu import Seiyuu
11
+
12
+
13
+ T = TypeVar("T", bound="Character")
14
+
15
+
16
+ @_attrs_define
17
+ class Character:
18
+ """Anime character
19
+
20
+ Attributes:
21
+ id (int): AniList character ID Example: 14545.
22
+ name_japanese (str): Japanese name of the character Example: 真城最高.
23
+ name_english (str): English name of the character Example: Moritaka Mashiro.
24
+ image_url (str): Character image URL Example: https://s4.anilist.co/file/anilistcdn/character/large/b14545.jpg.
25
+ seiyuu (Seiyuu): Japanese voice actor (seiyuu)
26
+ """
27
+
28
+ id: int
29
+ name_japanese: str
30
+ name_english: str
31
+ image_url: str
32
+ seiyuu: Seiyuu
33
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
34
+
35
+ def to_dict(self) -> dict[str, Any]:
36
+ id = self.id
37
+
38
+ name_japanese = self.name_japanese
39
+
40
+ name_english = self.name_english
41
+
42
+ image_url = self.image_url
43
+
44
+ seiyuu = self.seiyuu.to_dict()
45
+
46
+ field_dict: dict[str, Any] = {}
47
+ field_dict.update(self.additional_properties)
48
+ field_dict.update(
49
+ {
50
+ "id": id,
51
+ "nameJapanese": name_japanese,
52
+ "nameEnglish": name_english,
53
+ "imageUrl": image_url,
54
+ "seiyuu": seiyuu,
55
+ }
56
+ )
57
+
58
+ return field_dict
59
+
60
+ @classmethod
61
+ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
62
+ from ..models.seiyuu import Seiyuu
63
+
64
+ d = dict(src_dict)
65
+ id = d.pop("id")
66
+
67
+ name_japanese = d.pop("nameJapanese")
68
+
69
+ name_english = d.pop("nameEnglish")
70
+
71
+ image_url = d.pop("imageUrl")
72
+
73
+ seiyuu = Seiyuu.from_dict(d.pop("seiyuu"))
74
+
75
+ character = cls(
76
+ id=id,
77
+ name_japanese=name_japanese,
78
+ name_english=name_english,
79
+ image_url=image_url,
80
+ seiyuu=seiyuu,
81
+ )
82
+
83
+ character.additional_properties = d
84
+ return character
85
+
86
+ @property
87
+ def additional_keys(self) -> list[str]:
88
+ return list(self.additional_properties.keys())
89
+
90
+ def __getitem__(self, key: str) -> Any:
91
+ return self.additional_properties[key]
92
+
93
+ def __setitem__(self, key: str, value: Any) -> None:
94
+ self.additional_properties[key] = value
95
+
96
+ def __delitem__(self, key: str) -> None:
97
+ del self.additional_properties[key]
98
+
99
+ def __contains__(self, key: str) -> bool:
100
+ return key in self.additional_properties
@@ -0,0 +1,130 @@
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 ..models.character_input_character_role import CharacterInputCharacterRole
10
+
11
+ T = TypeVar("T", bound="CharacterInput")
12
+
13
+
14
+ @_attrs_define
15
+ class CharacterInput:
16
+ """Character data for creating/updating media
17
+
18
+ Attributes:
19
+ character_id (int): AniList character ID Example: 14545.
20
+ character_name_japanese (str): Japanese name of the character Example: 真城最高.
21
+ character_name_english (str): English name of the character Example: Moritaka Mashiro.
22
+ character_image_url (str): Character image URL Example:
23
+ https://s4.anilist.co/file/anilistcdn/character/large/b14545.jpg.
24
+ character_role (CharacterInputCharacterRole): Character's role in the media Example: MAIN.
25
+ seiyuu_id (int): AniList staff ID for the Japanese voice actor Example: 95991.
26
+ seiyuu_name_japanese (str): Japanese name of the voice actor Example: 阿部敦.
27
+ seiyuu_name_english (str): English name of the voice actor Example: Atsushi Abe.
28
+ seiyuu_image_url (str): Voice actor profile image URL Example:
29
+ https://s4.anilist.co/file/anilistcdn/staff/large/n95991.jpg.
30
+ """
31
+
32
+ character_id: int
33
+ character_name_japanese: str
34
+ character_name_english: str
35
+ character_image_url: str
36
+ character_role: CharacterInputCharacterRole
37
+ seiyuu_id: int
38
+ seiyuu_name_japanese: str
39
+ seiyuu_name_english: str
40
+ seiyuu_image_url: str
41
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
42
+
43
+ def to_dict(self) -> dict[str, Any]:
44
+ character_id = self.character_id
45
+
46
+ character_name_japanese = self.character_name_japanese
47
+
48
+ character_name_english = self.character_name_english
49
+
50
+ character_image_url = self.character_image_url
51
+
52
+ character_role = self.character_role.value
53
+
54
+ seiyuu_id = self.seiyuu_id
55
+
56
+ seiyuu_name_japanese = self.seiyuu_name_japanese
57
+
58
+ seiyuu_name_english = self.seiyuu_name_english
59
+
60
+ seiyuu_image_url = self.seiyuu_image_url
61
+
62
+ field_dict: dict[str, Any] = {}
63
+ field_dict.update(self.additional_properties)
64
+ field_dict.update(
65
+ {
66
+ "characterId": character_id,
67
+ "characterNameJapanese": character_name_japanese,
68
+ "characterNameEnglish": character_name_english,
69
+ "characterImageUrl": character_image_url,
70
+ "characterRole": character_role,
71
+ "seiyuuId": seiyuu_id,
72
+ "seiyuuNameJapanese": seiyuu_name_japanese,
73
+ "seiyuuNameEnglish": seiyuu_name_english,
74
+ "seiyuuImageUrl": seiyuu_image_url,
75
+ }
76
+ )
77
+
78
+ return field_dict
79
+
80
+ @classmethod
81
+ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
82
+ d = dict(src_dict)
83
+ character_id = d.pop("characterId")
84
+
85
+ character_name_japanese = d.pop("characterNameJapanese")
86
+
87
+ character_name_english = d.pop("characterNameEnglish")
88
+
89
+ character_image_url = d.pop("characterImageUrl")
90
+
91
+ character_role = CharacterInputCharacterRole(d.pop("characterRole"))
92
+
93
+ seiyuu_id = d.pop("seiyuuId")
94
+
95
+ seiyuu_name_japanese = d.pop("seiyuuNameJapanese")
96
+
97
+ seiyuu_name_english = d.pop("seiyuuNameEnglish")
98
+
99
+ seiyuu_image_url = d.pop("seiyuuImageUrl")
100
+
101
+ character_input = cls(
102
+ character_id=character_id,
103
+ character_name_japanese=character_name_japanese,
104
+ character_name_english=character_name_english,
105
+ character_image_url=character_image_url,
106
+ character_role=character_role,
107
+ seiyuu_id=seiyuu_id,
108
+ seiyuu_name_japanese=seiyuu_name_japanese,
109
+ seiyuu_name_english=seiyuu_name_english,
110
+ seiyuu_image_url=seiyuu_image_url,
111
+ )
112
+
113
+ character_input.additional_properties = d
114
+ return character_input
115
+
116
+ @property
117
+ def additional_keys(self) -> list[str]:
118
+ return list(self.additional_properties.keys())
119
+
120
+ def __getitem__(self, key: str) -> Any:
121
+ return self.additional_properties[key]
122
+
123
+ def __setitem__(self, key: str, value: Any) -> None:
124
+ self.additional_properties[key] = value
125
+
126
+ def __delitem__(self, key: str) -> None:
127
+ del self.additional_properties[key]
128
+
129
+ def __contains__(self, key: str) -> bool:
130
+ return key in self.additional_properties
@@ -0,0 +1,10 @@
1
+ from enum import Enum
2
+
3
+
4
+ class CharacterInputCharacterRole(str, Enum):
5
+ BACKGROUND = "BACKGROUND"
6
+ MAIN = "MAIN"
7
+ SUPPORTING = "SUPPORTING"
8
+
9
+ def __str__(self) -> str:
10
+ return str(self.value)
@@ -0,0 +1,124 @@
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.character_with_media_media_appearances_item import (
11
+ CharacterWithMediaMediaAppearancesItem,
12
+ )
13
+ from ..models.seiyuu import Seiyuu
14
+
15
+
16
+ T = TypeVar("T", bound="CharacterWithMedia")
17
+
18
+
19
+ @_attrs_define
20
+ class CharacterWithMedia:
21
+ """Character with all media appearances
22
+
23
+ Attributes:
24
+ id (int): AniList character ID Example: 14545.
25
+ name_japanese (str): Japanese name of the character Example: 真城最高.
26
+ name_english (str): English name of the character Example: Moritaka Mashiro.
27
+ image_url (str): Character image URL Example: https://s4.anilist.co/file/anilistcdn/character/large/b14545.jpg.
28
+ seiyuu (Seiyuu): Japanese voice actor (seiyuu)
29
+ media_appearances (list[CharacterWithMediaMediaAppearancesItem]): All media this character appears in
30
+ """
31
+
32
+ id: int
33
+ name_japanese: str
34
+ name_english: str
35
+ image_url: str
36
+ seiyuu: Seiyuu
37
+ media_appearances: list[CharacterWithMediaMediaAppearancesItem]
38
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
39
+
40
+ def to_dict(self) -> dict[str, Any]:
41
+ id = self.id
42
+
43
+ name_japanese = self.name_japanese
44
+
45
+ name_english = self.name_english
46
+
47
+ image_url = self.image_url
48
+
49
+ seiyuu = self.seiyuu.to_dict()
50
+
51
+ media_appearances = []
52
+ for media_appearances_item_data in self.media_appearances:
53
+ media_appearances_item = media_appearances_item_data.to_dict()
54
+ media_appearances.append(media_appearances_item)
55
+
56
+ field_dict: dict[str, Any] = {}
57
+ field_dict.update(self.additional_properties)
58
+ field_dict.update(
59
+ {
60
+ "id": id,
61
+ "nameJapanese": name_japanese,
62
+ "nameEnglish": name_english,
63
+ "imageUrl": image_url,
64
+ "seiyuu": seiyuu,
65
+ "mediaAppearances": media_appearances,
66
+ }
67
+ )
68
+
69
+ return field_dict
70
+
71
+ @classmethod
72
+ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
73
+ from ..models.character_with_media_media_appearances_item import (
74
+ CharacterWithMediaMediaAppearancesItem,
75
+ )
76
+ from ..models.seiyuu import Seiyuu
77
+
78
+ d = dict(src_dict)
79
+ id = d.pop("id")
80
+
81
+ name_japanese = d.pop("nameJapanese")
82
+
83
+ name_english = d.pop("nameEnglish")
84
+
85
+ image_url = d.pop("imageUrl")
86
+
87
+ seiyuu = Seiyuu.from_dict(d.pop("seiyuu"))
88
+
89
+ media_appearances = []
90
+ _media_appearances = d.pop("mediaAppearances")
91
+ for media_appearances_item_data in _media_appearances:
92
+ media_appearances_item = CharacterWithMediaMediaAppearancesItem.from_dict(
93
+ media_appearances_item_data
94
+ )
95
+
96
+ media_appearances.append(media_appearances_item)
97
+
98
+ character_with_media = cls(
99
+ id=id,
100
+ name_japanese=name_japanese,
101
+ name_english=name_english,
102
+ image_url=image_url,
103
+ seiyuu=seiyuu,
104
+ media_appearances=media_appearances,
105
+ )
106
+
107
+ character_with_media.additional_properties = d
108
+ return character_with_media
109
+
110
+ @property
111
+ def additional_keys(self) -> list[str]:
112
+ return list(self.additional_properties.keys())
113
+
114
+ def __getitem__(self, key: str) -> Any:
115
+ return self.additional_properties[key]
116
+
117
+ def __setitem__(self, key: str, value: Any) -> None:
118
+ self.additional_properties[key] = value
119
+
120
+ def __delitem__(self, key: str) -> None:
121
+ del self.additional_properties[key]
122
+
123
+ def __contains__(self, key: str) -> bool:
124
+ return key in self.additional_properties
@@ -0,0 +1,93 @@
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.character_with_media_media_appearances_item_role import (
10
+ CharacterWithMediaMediaAppearancesItemRole,
11
+ )
12
+ from ..types import UNSET, Unset
13
+
14
+ if TYPE_CHECKING:
15
+ from ..models.media import Media
16
+
17
+
18
+ T = TypeVar("T", bound="CharacterWithMediaMediaAppearancesItem")
19
+
20
+
21
+ @_attrs_define
22
+ class CharacterWithMediaMediaAppearancesItem:
23
+ """
24
+ Attributes:
25
+ media (Media | Unset): Media entry with full metadata
26
+ role (CharacterWithMediaMediaAppearancesItemRole | Unset): Character role in this media Example: MAIN.
27
+ """
28
+
29
+ media: Media | Unset = UNSET
30
+ role: CharacterWithMediaMediaAppearancesItemRole | Unset = UNSET
31
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
32
+
33
+ def to_dict(self) -> dict[str, Any]:
34
+ media: dict[str, Any] | Unset = UNSET
35
+ if not isinstance(self.media, Unset):
36
+ media = self.media.to_dict()
37
+
38
+ role: str | Unset = UNSET
39
+ if not isinstance(self.role, Unset):
40
+ role = self.role.value
41
+
42
+ field_dict: dict[str, Any] = {}
43
+ field_dict.update(self.additional_properties)
44
+ field_dict.update({})
45
+ if media is not UNSET:
46
+ field_dict["media"] = media
47
+ if role is not UNSET:
48
+ field_dict["role"] = role
49
+
50
+ return field_dict
51
+
52
+ @classmethod
53
+ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
54
+ from ..models.media import Media
55
+
56
+ d = dict(src_dict)
57
+ _media = d.pop("media", UNSET)
58
+ media: Media | Unset
59
+ if isinstance(_media, Unset):
60
+ media = UNSET
61
+ else:
62
+ media = Media.from_dict(_media)
63
+
64
+ _role = d.pop("role", UNSET)
65
+ role: CharacterWithMediaMediaAppearancesItemRole | Unset
66
+ if isinstance(_role, Unset):
67
+ role = UNSET
68
+ else:
69
+ role = CharacterWithMediaMediaAppearancesItemRole(_role)
70
+
71
+ character_with_media_media_appearances_item = cls(
72
+ media=media,
73
+ role=role,
74
+ )
75
+
76
+ character_with_media_media_appearances_item.additional_properties = d
77
+ return character_with_media_media_appearances_item
78
+
79
+ @property
80
+ def additional_keys(self) -> list[str]:
81
+ return list(self.additional_properties.keys())
82
+
83
+ def __getitem__(self, key: str) -> Any:
84
+ return self.additional_properties[key]
85
+
86
+ def __setitem__(self, key: str, value: Any) -> None:
87
+ self.additional_properties[key] = value
88
+
89
+ def __delitem__(self, key: str) -> None:
90
+ del self.additional_properties[key]
91
+
92
+ def __contains__(self, key: str) -> bool:
93
+ return key in self.additional_properties
@@ -0,0 +1,10 @@
1
+ from enum import Enum
2
+
3
+
4
+ class CharacterWithMediaMediaAppearancesItemRole(str, Enum):
5
+ BACKGROUND = "BACKGROUND"
6
+ MAIN = "MAIN"
7
+ SUPPORTING = "SUPPORTING"
8
+
9
+ def __str__(self) -> str:
10
+ return str(self.value)
@@ -0,0 +1,75 @@
1
+ from __future__ import annotations
2
+
3
+ from collections.abc import Mapping
4
+ from typing import Any, TypeVar, cast
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="CreateApiKeyRequest")
12
+
13
+
14
+ @_attrs_define
15
+ class CreateApiKeyRequest:
16
+ """Create API key request
17
+
18
+ Attributes:
19
+ name (str): Name for the API key
20
+ permissions (list[str] | Unset): List of permissions for the API key. Defaults to READ_MEDIA if not provided.
21
+ """
22
+
23
+ name: str
24
+ permissions: list[str] | Unset = UNSET
25
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
26
+
27
+ def to_dict(self) -> dict[str, Any]:
28
+ name = self.name
29
+
30
+ permissions: list[str] | Unset = UNSET
31
+ if not isinstance(self.permissions, Unset):
32
+ permissions = self.permissions
33
+
34
+ field_dict: dict[str, Any] = {}
35
+ field_dict.update(self.additional_properties)
36
+ field_dict.update(
37
+ {
38
+ "name": name,
39
+ }
40
+ )
41
+ if permissions is not UNSET:
42
+ field_dict["permissions"] = permissions
43
+
44
+ return field_dict
45
+
46
+ @classmethod
47
+ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
48
+ d = dict(src_dict)
49
+ name = d.pop("name")
50
+
51
+ permissions = cast(list[str], d.pop("permissions", UNSET))
52
+
53
+ create_api_key_request = cls(
54
+ name=name,
55
+ permissions=permissions,
56
+ )
57
+
58
+ create_api_key_request.additional_properties = d
59
+ return create_api_key_request
60
+
61
+ @property
62
+ def additional_keys(self) -> list[str]:
63
+ return list(self.additional_properties.keys())
64
+
65
+ def __getitem__(self, key: str) -> Any:
66
+ return self.additional_properties[key]
67
+
68
+ def __setitem__(self, key: str, value: Any) -> None:
69
+ self.additional_properties[key] = value
70
+
71
+ def __delitem__(self, key: str) -> None:
72
+ del self.additional_properties[key]
73
+
74
+ def __contains__(self, key: str) -> bool:
75
+ return key in self.additional_properties
@@ -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="CreateApiKeyResponse")
10
+
11
+
12
+ @_attrs_define
13
+ class CreateApiKeyResponse:
14
+ """Create API key response
15
+
16
+ Attributes:
17
+ message (str): Success message
18
+ key (str): The generated API key (only shown once)
19
+ """
20
+
21
+ message: str
22
+ key: str
23
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
24
+
25
+ def to_dict(self) -> dict[str, Any]:
26
+ message = self.message
27
+
28
+ key = self.key
29
+
30
+ field_dict: dict[str, Any] = {}
31
+ field_dict.update(self.additional_properties)
32
+ field_dict.update(
33
+ {
34
+ "message": message,
35
+ "key": key,
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
+ message = d.pop("message")
45
+
46
+ key = d.pop("key")
47
+
48
+ create_api_key_response = cls(
49
+ message=message,
50
+ key=key,
51
+ )
52
+
53
+ create_api_key_response.additional_properties = d
54
+ return create_api_key_response
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