magic_hour 0.12.1__py3-none-any.whl → 0.14.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.

Potentially problematic release.


This version of magic_hour might be problematic. Click here for more details.

Files changed (29) hide show
  1. magic_hour/environment.py +1 -1
  2. magic_hour/resources/v1/ai_meme_generator/README.md +41 -0
  3. magic_hour/resources/v1/ai_meme_generator/__init__.py +4 -0
  4. magic_hour/resources/v1/ai_meme_generator/client.py +127 -0
  5. magic_hour/resources/v1/ai_photo_editor/client.py +4 -0
  6. magic_hour/resources/v1/animation/client.py +10 -2
  7. magic_hour/resources/v1/client.py +8 -0
  8. magic_hour/resources/v1/face_swap/client.py +10 -2
  9. magic_hour/resources/v1/image_to_video/README.md +2 -2
  10. magic_hour/resources/v1/image_to_video/client.py +4 -4
  11. magic_hour/resources/v1/lip_sync/client.py +2 -0
  12. magic_hour/resources/v1/text_to_video/README.md +2 -2
  13. magic_hour/resources/v1/text_to_video/client.py +2 -2
  14. magic_hour/resources/v1/video_to_video/README.md +2 -2
  15. magic_hour/resources/v1/video_to_video/client.py +8 -2
  16. magic_hour/types/models/__init__.py +2 -0
  17. magic_hour/types/models/v1_ai_meme_generator_create_response.py +25 -0
  18. magic_hour/types/models/v1_image_projects_get_response.py +4 -10
  19. magic_hour/types/models/v1_video_projects_get_response.py +4 -10
  20. magic_hour/types/params/__init__.py +12 -0
  21. magic_hour/types/params/v1_ai_meme_generator_create_body.py +37 -0
  22. magic_hour/types/params/v1_ai_meme_generator_create_body_style.py +73 -0
  23. magic_hour/types/params/v1_image_to_video_create_body.py +3 -0
  24. magic_hour/types/params/v1_image_to_video_create_body_style.py +14 -5
  25. magic_hour/types/params/v1_text_to_video_create_body_style.py +12 -0
  26. {magic_hour-0.12.1.dist-info → magic_hour-0.14.0.dist-info}/METADATA +5 -1
  27. {magic_hour-0.12.1.dist-info → magic_hour-0.14.0.dist-info}/RECORD +29 -23
  28. {magic_hour-0.12.1.dist-info → magic_hour-0.14.0.dist-info}/LICENSE +0 -0
  29. {magic_hour-0.12.1.dist-info → magic_hour-0.14.0.dist-info}/WHEEL +0 -0
magic_hour/environment.py CHANGED
@@ -5,4 +5,4 @@ class Environment(enum.Enum):
5
5
  """Pre-defined base URLs for the API"""
6
6
 
7
7
  ENVIRONMENT = "https://api.magichour.ai"
8
- MOCK_SERVER = "https://api.sideko.dev/v1/mock/magichour/magic-hour/0.12.1"
8
+ MOCK_SERVER = "https://api.sideko.dev/v1/mock/magichour/magic-hour/0.14.0"
@@ -0,0 +1,41 @@
1
+
2
+ ### create <a name="create"></a>
3
+ AI Meme Generator
4
+
5
+ Create an AI generated meme. Each meme costs 10 frames.
6
+
7
+ **API Endpoint**: `POST /v1/ai-meme-generator`
8
+
9
+ #### Synchronous Client
10
+
11
+ ```python
12
+ from magic_hour import Client
13
+ from os import getenv
14
+
15
+ client = Client(token=getenv("API_TOKEN"))
16
+ res = client.v1.ai_meme_generator.create(
17
+ style={
18
+ "search_web": False,
19
+ "template": "Drake Hotline Bling",
20
+ "topic": "When the code finally works",
21
+ },
22
+ name="My Funny Meme",
23
+ )
24
+ ```
25
+
26
+ #### Asynchronous Client
27
+
28
+ ```python
29
+ from magic_hour import AsyncClient
30
+ from os import getenv
31
+
32
+ client = AsyncClient(token=getenv("API_TOKEN"))
33
+ res = await client.v1.ai_meme_generator.create(
34
+ style={
35
+ "search_web": False,
36
+ "template": "Drake Hotline Bling",
37
+ "topic": "When the code finally works",
38
+ },
39
+ name="My Funny Meme",
40
+ )
41
+ ```
@@ -0,0 +1,4 @@
1
+ from .client import AiMemeGeneratorClient, AsyncAiMemeGeneratorClient
2
+
3
+
4
+ __all__ = ["AiMemeGeneratorClient", "AsyncAiMemeGeneratorClient"]
@@ -0,0 +1,127 @@
1
+ import typing
2
+
3
+ from magic_hour.core import (
4
+ AsyncBaseClient,
5
+ RequestOptions,
6
+ SyncBaseClient,
7
+ default_request_options,
8
+ to_encodable,
9
+ type_utils,
10
+ )
11
+ from magic_hour.types import models, params
12
+
13
+
14
+ class AiMemeGeneratorClient:
15
+ def __init__(self, *, base_client: SyncBaseClient):
16
+ self._base_client = base_client
17
+
18
+ def create(
19
+ self,
20
+ *,
21
+ style: params.V1AiMemeGeneratorCreateBodyStyle,
22
+ name: typing.Union[
23
+ typing.Optional[str], type_utils.NotGiven
24
+ ] = type_utils.NOT_GIVEN,
25
+ request_options: typing.Optional[RequestOptions] = None,
26
+ ) -> models.V1AiMemeGeneratorCreateResponse:
27
+ """
28
+ AI Meme Generator
29
+
30
+ Create an AI generated meme. Each meme costs 10 frames.
31
+
32
+ POST /v1/ai-meme-generator
33
+
34
+ Args:
35
+ name: The name of the meme.
36
+ style: V1AiMemeGeneratorCreateBodyStyle
37
+ request_options: Additional options to customize the HTTP request
38
+
39
+ Returns:
40
+ Success
41
+
42
+ Raises:
43
+ ApiError: A custom exception class that provides additional context
44
+ for API errors, including the HTTP status code and response body.
45
+
46
+ Examples:
47
+ ```py
48
+ client.v1.ai_meme_generator.create(
49
+ style={
50
+ "search_web": False,
51
+ "template": "Drake Hotline Bling",
52
+ "topic": "When the code finally works",
53
+ },
54
+ name="My Funny Meme",
55
+ )
56
+ ```
57
+ """
58
+ _json = to_encodable(
59
+ item={"name": name, "style": style},
60
+ dump_with=params._SerializerV1AiMemeGeneratorCreateBody,
61
+ )
62
+ return self._base_client.request(
63
+ method="POST",
64
+ path="/v1/ai-meme-generator",
65
+ auth_names=["bearerAuth"],
66
+ json=_json,
67
+ cast_to=models.V1AiMemeGeneratorCreateResponse,
68
+ request_options=request_options or default_request_options(),
69
+ )
70
+
71
+
72
+ class AsyncAiMemeGeneratorClient:
73
+ def __init__(self, *, base_client: AsyncBaseClient):
74
+ self._base_client = base_client
75
+
76
+ async def create(
77
+ self,
78
+ *,
79
+ style: params.V1AiMemeGeneratorCreateBodyStyle,
80
+ name: typing.Union[
81
+ typing.Optional[str], type_utils.NotGiven
82
+ ] = type_utils.NOT_GIVEN,
83
+ request_options: typing.Optional[RequestOptions] = None,
84
+ ) -> models.V1AiMemeGeneratorCreateResponse:
85
+ """
86
+ AI Meme Generator
87
+
88
+ Create an AI generated meme. Each meme costs 10 frames.
89
+
90
+ POST /v1/ai-meme-generator
91
+
92
+ Args:
93
+ name: The name of the meme.
94
+ style: V1AiMemeGeneratorCreateBodyStyle
95
+ request_options: Additional options to customize the HTTP request
96
+
97
+ Returns:
98
+ Success
99
+
100
+ Raises:
101
+ ApiError: A custom exception class that provides additional context
102
+ for API errors, including the HTTP status code and response body.
103
+
104
+ Examples:
105
+ ```py
106
+ await client.v1.ai_meme_generator.create(
107
+ style={
108
+ "search_web": False,
109
+ "template": "Drake Hotline Bling",
110
+ "topic": "When the code finally works",
111
+ },
112
+ name="My Funny Meme",
113
+ )
114
+ ```
115
+ """
116
+ _json = to_encodable(
117
+ item={"name": name, "style": style},
118
+ dump_with=params._SerializerV1AiMemeGeneratorCreateBody,
119
+ )
120
+ return await self._base_client.request(
121
+ method="POST",
122
+ path="/v1/ai-meme-generator",
123
+ auth_names=["bearerAuth"],
124
+ json=_json,
125
+ cast_to=models.V1AiMemeGeneratorCreateResponse,
126
+ request_options=request_options or default_request_options(),
127
+ )
@@ -61,8 +61,10 @@ class AiPhotoEditorClient:
61
61
  style={
62
62
  "image_description": "A photo of a person",
63
63
  "likeness_strength": 5.2,
64
+ "negative_prompt": "painting, cartoon, sketch",
64
65
  "prompt": "A photo portrait of a person wearing a hat",
65
66
  "prompt_strength": 3.75,
67
+ "steps": 4,
66
68
  },
67
69
  name="Photo Editor image",
68
70
  )
@@ -138,8 +140,10 @@ class AsyncAiPhotoEditorClient:
138
140
  style={
139
141
  "image_description": "A photo of a person",
140
142
  "likeness_strength": 5.2,
143
+ "negative_prompt": "painting, cartoon, sketch",
141
144
  "prompt": "A photo portrait of a person wearing a hat",
142
145
  "prompt_strength": 3.75,
146
+ "steps": 4,
143
147
  },
144
148
  name="Photo Editor image",
145
149
  )
@@ -56,7 +56,11 @@ class AnimationClient:
56
56
  Examples:
57
57
  ```py
58
58
  client.v1.animation.create(
59
- assets={"audio_source": "file"},
59
+ assets={
60
+ "audio_file_path": "api-assets/id/1234.mp3",
61
+ "audio_source": "file",
62
+ "image_file_path": "api-assets/id/1234.png",
63
+ },
60
64
  end_seconds=15.0,
61
65
  fps=12.0,
62
66
  height=960,
@@ -139,7 +143,11 @@ class AsyncAnimationClient:
139
143
  Examples:
140
144
  ```py
141
145
  await client.v1.animation.create(
142
- assets={"audio_source": "file"},
146
+ assets={
147
+ "audio_file_path": "api-assets/id/1234.mp3",
148
+ "audio_source": "file",
149
+ "image_file_path": "api-assets/id/1234.png",
150
+ },
143
151
  end_seconds=15.0,
144
152
  fps=12.0,
145
153
  height=960,
@@ -15,6 +15,10 @@ from magic_hour.resources.v1.ai_image_upscaler import (
15
15
  AiImageUpscalerClient,
16
16
  AsyncAiImageUpscalerClient,
17
17
  )
18
+ from magic_hour.resources.v1.ai_meme_generator import (
19
+ AiMemeGeneratorClient,
20
+ AsyncAiMemeGeneratorClient,
21
+ )
18
22
  from magic_hour.resources.v1.ai_photo_editor import (
19
23
  AiPhotoEditorClient,
20
24
  AsyncAiPhotoEditorClient,
@@ -72,6 +76,7 @@ class V1Client:
72
76
  )
73
77
  self.ai_image_generator = AiImageGeneratorClient(base_client=self._base_client)
74
78
  self.ai_image_upscaler = AiImageUpscalerClient(base_client=self._base_client)
79
+ self.ai_meme_generator = AiMemeGeneratorClient(base_client=self._base_client)
75
80
  self.ai_photo_editor = AiPhotoEditorClient(base_client=self._base_client)
76
81
  self.ai_qr_code_generator = AiQrCodeGeneratorClient(
77
82
  base_client=self._base_client
@@ -107,6 +112,9 @@ class AsyncV1Client:
107
112
  self.ai_image_upscaler = AsyncAiImageUpscalerClient(
108
113
  base_client=self._base_client
109
114
  )
115
+ self.ai_meme_generator = AsyncAiMemeGeneratorClient(
116
+ base_client=self._base_client
117
+ )
110
118
  self.ai_photo_editor = AsyncAiPhotoEditorClient(base_client=self._base_client)
111
119
  self.ai_qr_code_generator = AsyncAiQrCodeGeneratorClient(
112
120
  base_client=self._base_client
@@ -57,7 +57,11 @@ class FaceSwapClient:
57
57
  Examples:
58
58
  ```py
59
59
  client.v1.face_swap.create(
60
- assets={"image_file_path": "image/id/1234.png", "video_source": "file"},
60
+ assets={
61
+ "image_file_path": "image/id/1234.png",
62
+ "video_file_path": "api-assets/id/1234.mp4",
63
+ "video_source": "file",
64
+ },
61
65
  end_seconds=15.0,
62
66
  height=960,
63
67
  start_seconds=0.0,
@@ -133,7 +137,11 @@ class AsyncFaceSwapClient:
133
137
  Examples:
134
138
  ```py
135
139
  await client.v1.face_swap.create(
136
- assets={"image_file_path": "image/id/1234.png", "video_source": "file"},
140
+ assets={
141
+ "image_file_path": "image/id/1234.png",
142
+ "video_file_path": "api-assets/id/1234.mp4",
143
+ "video_source": "file",
144
+ },
137
145
  end_seconds=15.0,
138
146
  height=960,
139
147
  start_seconds=0.0,
@@ -20,7 +20,7 @@ res = client.v1.image_to_video.create(
20
20
  assets={"image_file_path": "api-assets/id/1234.png"},
21
21
  end_seconds=5.0,
22
22
  height=960,
23
- style={"prompt": None},
23
+ style={"prompt": "a dog running"},
24
24
  width=512,
25
25
  name="Image To Video video",
26
26
  )
@@ -37,7 +37,7 @@ res = await client.v1.image_to_video.create(
37
37
  assets={"image_file_path": "api-assets/id/1234.png"},
38
38
  end_seconds=5.0,
39
39
  height=960,
40
- style={"prompt": None},
40
+ style={"prompt": "a dog running"},
41
41
  width=512,
42
42
  name="Image To Video video",
43
43
  )
@@ -43,7 +43,7 @@ class ImageToVideoClient:
43
43
  assets: Provide the assets for image-to-video.
44
44
  end_seconds: The total duration of the output video in seconds.
45
45
  height: The height of the input video. This value will help determine the final orientation of the output video. The output video resolution may not match the input.
46
- style: V1ImageToVideoCreateBodyStyle
46
+ style: Attributed used to dictate the style of the output
47
47
  width: The width of the input video. This value will help determine the final orientation of the output video. The output video resolution may not match the input.
48
48
  request_options: Additional options to customize the HTTP request
49
49
 
@@ -60,7 +60,7 @@ class ImageToVideoClient:
60
60
  assets={"image_file_path": "api-assets/id/1234.png"},
61
61
  end_seconds=5.0,
62
62
  height=960,
63
- style={"prompt": "string"},
63
+ style={"prompt": "a dog running"},
64
64
  width=512,
65
65
  name="Image To Video video",
66
66
  )
@@ -119,7 +119,7 @@ class AsyncImageToVideoClient:
119
119
  assets: Provide the assets for image-to-video.
120
120
  end_seconds: The total duration of the output video in seconds.
121
121
  height: The height of the input video. This value will help determine the final orientation of the output video. The output video resolution may not match the input.
122
- style: V1ImageToVideoCreateBodyStyle
122
+ style: Attributed used to dictate the style of the output
123
123
  width: The width of the input video. This value will help determine the final orientation of the output video. The output video resolution may not match the input.
124
124
  request_options: Additional options to customize the HTTP request
125
125
 
@@ -136,7 +136,7 @@ class AsyncImageToVideoClient:
136
136
  assets={"image_file_path": "api-assets/id/1234.png"},
137
137
  end_seconds=5.0,
138
138
  height=960,
139
- style={"prompt": "string"},
139
+ style={"prompt": "a dog running"},
140
140
  width=512,
141
141
  name="Image To Video video",
142
142
  )
@@ -63,6 +63,7 @@ class LipSyncClient:
63
63
  client.v1.lip_sync.create(
64
64
  assets={
65
65
  "audio_file_path": "api-assets/id/1234.mp3",
66
+ "video_file_path": "api-assets/id/1234.mp4",
66
67
  "video_source": "file",
67
68
  },
68
69
  end_seconds=15.0,
@@ -148,6 +149,7 @@ class AsyncLipSyncClient:
148
149
  await client.v1.lip_sync.create(
149
150
  assets={
150
151
  "audio_file_path": "api-assets/id/1234.mp3",
152
+ "video_file_path": "api-assets/id/1234.mp4",
151
153
  "video_source": "file",
152
154
  },
153
155
  end_seconds=15.0,
@@ -19,7 +19,7 @@ client = Client(token=getenv("API_TOKEN"))
19
19
  res = client.v1.text_to_video.create(
20
20
  end_seconds=5.0,
21
21
  orientation="landscape",
22
- style={"prompt": "string"},
22
+ style={"prompt": "a dog running"},
23
23
  name="Text To Video video",
24
24
  )
25
25
  ```
@@ -34,7 +34,7 @@ client = AsyncClient(token=getenv("API_TOKEN"))
34
34
  res = await client.v1.text_to_video.create(
35
35
  end_seconds=5.0,
36
36
  orientation="landscape",
37
- style={"prompt": "string"},
37
+ style={"prompt": "a dog running"},
38
38
  name="Text To Video video",
39
39
  )
40
40
  ```
@@ -56,7 +56,7 @@ class TextToVideoClient:
56
56
  client.v1.text_to_video.create(
57
57
  end_seconds=5.0,
58
58
  orientation="landscape",
59
- style={"prompt": "string"},
59
+ style={"prompt": "a dog running"},
60
60
  name="Text To Video video",
61
61
  )
62
62
  ```
@@ -124,7 +124,7 @@ class AsyncTextToVideoClient:
124
124
  await client.v1.text_to_video.create(
125
125
  end_seconds=5.0,
126
126
  orientation="landscape",
127
- style={"prompt": "string"},
127
+ style={"prompt": "a dog running"},
128
128
  name="Text To Video video",
129
129
  )
130
130
  ```
@@ -24,7 +24,7 @@ res = client.v1.video_to_video.create(
24
24
  style={
25
25
  "art_style": "3D Render",
26
26
  "model": "Absolute Reality",
27
- "prompt": None,
27
+ "prompt": "string",
28
28
  "prompt_type": "append_default",
29
29
  "version": "default",
30
30
  },
@@ -49,7 +49,7 @@ res = await client.v1.video_to_video.create(
49
49
  style={
50
50
  "art_style": "3D Render",
51
51
  "model": "Absolute Reality",
52
- "prompt": None,
52
+ "prompt": "string",
53
53
  "prompt_type": "append_default",
54
54
  "version": "default",
55
55
  },
@@ -67,7 +67,10 @@ class VideoToVideoClient:
67
67
  Examples:
68
68
  ```py
69
69
  client.v1.video_to_video.create(
70
- assets={"video_source": "file"},
70
+ assets={
71
+ "video_file_path": "api-assets/id/1234.mp4",
72
+ "video_source": "file",
73
+ },
71
74
  end_seconds=15.0,
72
75
  height=960,
73
76
  start_seconds=0.0,
@@ -162,7 +165,10 @@ class AsyncVideoToVideoClient:
162
165
  Examples:
163
166
  ```py
164
167
  await client.v1.video_to_video.create(
165
- assets={"video_source": "file"},
168
+ assets={
169
+ "video_file_path": "api-assets/id/1234.mp4",
170
+ "video_source": "file",
171
+ },
166
172
  end_seconds=15.0,
167
173
  height=960,
168
174
  start_seconds=0.0,
@@ -4,6 +4,7 @@ from .v1_ai_headshot_generator_create_response import (
4
4
  )
5
5
  from .v1_ai_image_generator_create_response import V1AiImageGeneratorCreateResponse
6
6
  from .v1_ai_image_upscaler_create_response import V1AiImageUpscalerCreateResponse
7
+ from .v1_ai_meme_generator_create_response import V1AiMemeGeneratorCreateResponse
7
8
  from .v1_ai_photo_editor_create_response import V1AiPhotoEditorCreateResponse
8
9
  from .v1_ai_qr_code_generator_create_response import V1AiQrCodeGeneratorCreateResponse
9
10
  from .v1_ai_talking_photo_create_response import V1AiTalkingPhotoCreateResponse
@@ -39,6 +40,7 @@ __all__ = [
39
40
  "V1AiHeadshotGeneratorCreateResponse",
40
41
  "V1AiImageGeneratorCreateResponse",
41
42
  "V1AiImageUpscalerCreateResponse",
43
+ "V1AiMemeGeneratorCreateResponse",
42
44
  "V1AiPhotoEditorCreateResponse",
43
45
  "V1AiQrCodeGeneratorCreateResponse",
44
46
  "V1AiTalkingPhotoCreateResponse",
@@ -0,0 +1,25 @@
1
+ import pydantic
2
+
3
+
4
+ class V1AiMemeGeneratorCreateResponse(pydantic.BaseModel):
5
+ """
6
+ Success
7
+ """
8
+
9
+ model_config = pydantic.ConfigDict(
10
+ arbitrary_types_allowed=True,
11
+ populate_by_name=True,
12
+ )
13
+
14
+ frame_cost: int = pydantic.Field(
15
+ alias="frame_cost",
16
+ )
17
+ """
18
+ The frame cost of the image generation
19
+ """
20
+ id: str = pydantic.Field(
21
+ alias="id",
22
+ )
23
+ """
24
+ Unique ID of the image. This value can be used in the [get image project API](https://docs.magichour.ai/api-reference/image-projects/get-image-details) to fetch additional details such as status
25
+ """
@@ -68,15 +68,9 @@ class V1ImageProjectsGetResponse(pydantic.BaseModel):
68
68
  """
69
69
  The amount of frames used to generate the image.
70
70
  """
71
- type_: typing_extensions.Literal[
72
- "AI_HEADSHOT",
73
- "AI_IMAGE",
74
- "BACKGROUND_REMOVER",
75
- "CLOTHES_CHANGER",
76
- "FACE_SWAP",
77
- "IMAGE_UPSCALER",
78
- "PHOTO_EDITOR",
79
- "QR_CODE",
80
- ] = pydantic.Field(
71
+ type_: str = pydantic.Field(
81
72
  alias="type",
82
73
  )
74
+ """
75
+ The type of the image project. Possible values are AI_HEADSHOT, AI_IMAGE, IMAGE_UPSCALER, FACE_SWAP, PHOTO_EDITOR, QR_CODE, BACKGROUND_REMOVER, CLOTHES_CHANGER, AI_MEME, FACE_EDITOR, PHOTO_COLORIZER
76
+ """
@@ -93,18 +93,12 @@ class V1VideoProjectsGetResponse(pydantic.BaseModel):
93
93
  """
94
94
  The amount of frames used to generate the video. If the status is not 'complete', the cost is an estimate and will be adjusted when the video completes.
95
95
  """
96
- type_: typing_extensions.Literal[
97
- "ANIMATION",
98
- "AUTO_SUBTITLE",
99
- "FACE_SWAP",
100
- "IMAGE_TO_VIDEO",
101
- "LIP_SYNC",
102
- "TALKING_PHOTO",
103
- "TEXT_TO_VIDEO",
104
- "VIDEO_TO_VIDEO",
105
- ] = pydantic.Field(
96
+ type_: str = pydantic.Field(
106
97
  alias="type",
107
98
  )
99
+ """
100
+ The type of the video project. Possible values are ANIMATION, IMAGE_TO_VIDEO, VIDEO_TO_VIDEO, TEXT_TO_VIDEO, FACE_SWAP, LIP_SYNC, AUTO_SUBTITLE, TALKING_PHOTO
101
+ """
108
102
  width: int = pydantic.Field(
109
103
  alias="width",
110
104
  )
@@ -38,6 +38,14 @@ from .v1_ai_image_upscaler_create_body_style import (
38
38
  V1AiImageUpscalerCreateBodyStyle,
39
39
  _SerializerV1AiImageUpscalerCreateBodyStyle,
40
40
  )
41
+ from .v1_ai_meme_generator_create_body import (
42
+ V1AiMemeGeneratorCreateBody,
43
+ _SerializerV1AiMemeGeneratorCreateBody,
44
+ )
45
+ from .v1_ai_meme_generator_create_body_style import (
46
+ V1AiMemeGeneratorCreateBodyStyle,
47
+ _SerializerV1AiMemeGeneratorCreateBodyStyle,
48
+ )
41
49
  from .v1_ai_photo_editor_create_body import (
42
50
  V1AiPhotoEditorCreateBody,
43
51
  _SerializerV1AiPhotoEditorCreateBody,
@@ -160,6 +168,8 @@ __all__ = [
160
168
  "V1AiImageUpscalerCreateBody",
161
169
  "V1AiImageUpscalerCreateBodyAssets",
162
170
  "V1AiImageUpscalerCreateBodyStyle",
171
+ "V1AiMemeGeneratorCreateBody",
172
+ "V1AiMemeGeneratorCreateBodyStyle",
163
173
  "V1AiPhotoEditorCreateBody",
164
174
  "V1AiPhotoEditorCreateBodyAssets",
165
175
  "V1AiPhotoEditorCreateBodyStyle",
@@ -198,6 +208,8 @@ __all__ = [
198
208
  "_SerializerV1AiImageUpscalerCreateBody",
199
209
  "_SerializerV1AiImageUpscalerCreateBodyAssets",
200
210
  "_SerializerV1AiImageUpscalerCreateBodyStyle",
211
+ "_SerializerV1AiMemeGeneratorCreateBody",
212
+ "_SerializerV1AiMemeGeneratorCreateBodyStyle",
201
213
  "_SerializerV1AiPhotoEditorCreateBody",
202
214
  "_SerializerV1AiPhotoEditorCreateBodyAssets",
203
215
  "_SerializerV1AiPhotoEditorCreateBodyStyle",
@@ -0,0 +1,37 @@
1
+ import pydantic
2
+ import typing
3
+ import typing_extensions
4
+
5
+ from .v1_ai_meme_generator_create_body_style import (
6
+ V1AiMemeGeneratorCreateBodyStyle,
7
+ _SerializerV1AiMemeGeneratorCreateBodyStyle,
8
+ )
9
+
10
+
11
+ class V1AiMemeGeneratorCreateBody(typing_extensions.TypedDict):
12
+ """
13
+ V1AiMemeGeneratorCreateBody
14
+ """
15
+
16
+ name: typing_extensions.NotRequired[str]
17
+ """
18
+ The name of the meme.
19
+ """
20
+
21
+ style: typing_extensions.Required[V1AiMemeGeneratorCreateBodyStyle]
22
+
23
+
24
+ class _SerializerV1AiMemeGeneratorCreateBody(pydantic.BaseModel):
25
+ """
26
+ Serializer for V1AiMemeGeneratorCreateBody handling case conversions
27
+ and file omissions as dictated by the API
28
+ """
29
+
30
+ model_config = pydantic.ConfigDict(
31
+ populate_by_name=True,
32
+ )
33
+
34
+ name: typing.Optional[str] = pydantic.Field(alias="name", default=None)
35
+ style: _SerializerV1AiMemeGeneratorCreateBodyStyle = pydantic.Field(
36
+ alias="style",
37
+ )
@@ -0,0 +1,73 @@
1
+ import pydantic
2
+ import typing
3
+ import typing_extensions
4
+
5
+
6
+ class V1AiMemeGeneratorCreateBodyStyle(typing_extensions.TypedDict):
7
+ """
8
+ V1AiMemeGeneratorCreateBodyStyle
9
+ """
10
+
11
+ search_web: typing_extensions.NotRequired[bool]
12
+ """
13
+ Whether to search the web for meme content.
14
+ """
15
+
16
+ template: typing_extensions.Required[
17
+ typing_extensions.Literal[
18
+ "Bike Fall",
19
+ "Change My Mind",
20
+ "Disappointed Guy",
21
+ "Drake Hotline Bling",
22
+ "Galaxy Brain",
23
+ "Gru's Plan",
24
+ "Is This a Pigeon",
25
+ "Panik Kalm Panik",
26
+ "Random",
27
+ "Side Eyeing Chloe",
28
+ "Tuxedo Winnie The Pooh",
29
+ "Two Buttons",
30
+ "Waiting Skeleton",
31
+ ]
32
+ ]
33
+ """
34
+ To use our templates, pass in one of the enum values.
35
+ """
36
+
37
+ topic: typing_extensions.Required[str]
38
+ """
39
+ The topic of the meme.
40
+ """
41
+
42
+
43
+ class _SerializerV1AiMemeGeneratorCreateBodyStyle(pydantic.BaseModel):
44
+ """
45
+ Serializer for V1AiMemeGeneratorCreateBodyStyle handling case conversions
46
+ and file omissions as dictated by the API
47
+ """
48
+
49
+ model_config = pydantic.ConfigDict(
50
+ populate_by_name=True,
51
+ )
52
+
53
+ search_web: typing.Optional[bool] = pydantic.Field(alias="searchWeb", default=None)
54
+ template: typing_extensions.Literal[
55
+ "Bike Fall",
56
+ "Change My Mind",
57
+ "Disappointed Guy",
58
+ "Drake Hotline Bling",
59
+ "Galaxy Brain",
60
+ "Gru's Plan",
61
+ "Is This a Pigeon",
62
+ "Panik Kalm Panik",
63
+ "Random",
64
+ "Side Eyeing Chloe",
65
+ "Tuxedo Winnie The Pooh",
66
+ "Two Buttons",
67
+ "Waiting Skeleton",
68
+ ] = pydantic.Field(
69
+ alias="template",
70
+ )
71
+ topic: str = pydantic.Field(
72
+ alias="topic",
73
+ )
@@ -38,6 +38,9 @@ class V1ImageToVideoCreateBody(typing_extensions.TypedDict):
38
38
  """
39
39
 
40
40
  style: typing_extensions.Required[V1ImageToVideoCreateBodyStyle]
41
+ """
42
+ Attributed used to dictate the style of the output
43
+ """
41
44
 
42
45
  width: typing_extensions.Required[int]
43
46
  """
@@ -5,19 +5,27 @@ import typing_extensions
5
5
 
6
6
  class V1ImageToVideoCreateBodyStyle(typing_extensions.TypedDict):
7
7
  """
8
- V1ImageToVideoCreateBodyStyle
8
+ Attributed used to dictate the style of the output
9
9
  """
10
10
 
11
11
  high_quality: typing_extensions.NotRequired[bool]
12
12
  """
13
- High Quality mode enhances detail, sharpness, and realism, making it ideal for portraits, animals, and intricate landscapes.
13
+ Deprecated: Please use `quality_mode` instead. For backward compatibility, setting `high_quality: true` and `quality_mode: quick` will map to `quality_mode: studio`. Note: `quality_mode: studio` offers the same quality as `high_quality: true`.
14
14
  """
15
15
 
16
- prompt: typing_extensions.Required[typing.Optional[str]]
16
+ prompt: typing_extensions.NotRequired[str]
17
17
  """
18
18
  The prompt used for the video.
19
19
  """
20
20
 
21
+ quality_mode: typing_extensions.NotRequired[
22
+ typing_extensions.Literal["quick", "studio"]
23
+ ]
24
+ """
25
+ * `quick` - Fastest option for rapid results. Takes ~3 minutes per 5s of video.
26
+ * `studio` - Polished visuals with longer runtime. Takes ~8.5 minutes per 5s of video.
27
+ """
28
+
21
29
 
22
30
  class _SerializerV1ImageToVideoCreateBodyStyle(pydantic.BaseModel):
23
31
  """
@@ -32,6 +40,7 @@ class _SerializerV1ImageToVideoCreateBodyStyle(pydantic.BaseModel):
32
40
  high_quality: typing.Optional[bool] = pydantic.Field(
33
41
  alias="high_quality", default=None
34
42
  )
35
- prompt: typing.Optional[str] = pydantic.Field(
36
- alias="prompt",
43
+ prompt: typing.Optional[str] = pydantic.Field(alias="prompt", default=None)
44
+ quality_mode: typing.Optional[typing_extensions.Literal["quick", "studio"]] = (
45
+ pydantic.Field(alias="quality_mode", default=None)
37
46
  )
@@ -1,4 +1,5 @@
1
1
  import pydantic
2
+ import typing
2
3
  import typing_extensions
3
4
 
4
5
 
@@ -12,6 +13,14 @@ class V1TextToVideoCreateBodyStyle(typing_extensions.TypedDict):
12
13
  The prompt used for the video.
13
14
  """
14
15
 
16
+ quality_mode: typing_extensions.NotRequired[
17
+ typing_extensions.Literal["quick", "studio"]
18
+ ]
19
+ """
20
+ * `quick` - Fastest option for rapid results. Takes ~3 minutes per 5s of video.
21
+ * `studio` - Polished visuals with longer runtime. Takes ~8.5 minutes per 5s of video.
22
+ """
23
+
15
24
 
16
25
  class _SerializerV1TextToVideoCreateBodyStyle(pydantic.BaseModel):
17
26
  """
@@ -26,3 +35,6 @@ class _SerializerV1TextToVideoCreateBodyStyle(pydantic.BaseModel):
26
35
  prompt: str = pydantic.Field(
27
36
  alias="prompt",
28
37
  )
38
+ quality_mode: typing.Optional[typing_extensions.Literal["quick", "studio"]] = (
39
+ pydantic.Field(alias="quality_mode", default=None)
40
+ )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: magic_hour
3
- Version: 0.12.1
3
+ Version: 0.14.0
4
4
  Summary: Python SDK for Magic Hour API
5
5
  Requires-Python: >=3.8,<4.0
6
6
  Classifier: Programming Language :: Python :: 3
@@ -75,6 +75,10 @@ client = AsyncClient(token="my api key")
75
75
 
76
76
  * [create](magic_hour/resources/v1/ai_image_upscaler/README.md#create) - AI Image Upscaler
77
77
 
78
+ ### [v1.ai_meme_generator](magic_hour/resources/v1/ai_meme_generator/README.md)
79
+
80
+ * [create](magic_hour/resources/v1/ai_meme_generator/README.md#create) - AI Meme Generator
81
+
78
82
  ### [v1.ai_photo_editor](magic_hour/resources/v1/ai_photo_editor/README.md)
79
83
 
80
84
  * [create](magic_hour/resources/v1/ai_photo_editor/README.md#create) - AI Photo Editor
@@ -10,7 +10,7 @@ magic_hour/core/request.py,sha256=lyHrh2VWY238D7JPbgZJlodTqBlHSmQn4fBJiBfE1Es,50
10
10
  magic_hour/core/response.py,sha256=Sl7nPL2axmz7em_6d9TkFSnQQKUpalWaVWbPPWoXJgM,10180
11
11
  magic_hour/core/type_utils.py,sha256=4bU9WXnMXJ6YTtuqOMiB8t6Xw0RlfVWJ-IDBONlqEtQ,461
12
12
  magic_hour/core/utils.py,sha256=34SiC1vw2A0TkYHONgMA_d09soIIYiiBWRXCZGdwGIk,1669
13
- magic_hour/environment.py,sha256=tqH9ZaxIF0YLgdIaWnfq-blet6WZjApoo6VRUzbsu2U,213
13
+ magic_hour/environment.py,sha256=f6sXlVm-SfxzdDLBMF2uFwouyMuLK7wm329NvbtRwRA,213
14
14
  magic_hour/resources/v1/__init__.py,sha256=Aj0sjVcoijjQyieNBxv2_uewPYC2vO2UG-ehoBgCz5E,86
15
15
  magic_hour/resources/v1/ai_clothes_changer/README.md,sha256=KQTvbttct5GcdOJW3NG5gCsWF6G2qlwIoBjBd92TjUs,977
16
16
  magic_hour/resources/v1/ai_clothes_changer/__init__.py,sha256=6W_Y2HxG2sDOBiJyzngK3Q2S3xfQgpK-j8xFRmBAhbQ,142
@@ -24,9 +24,12 @@ magic_hour/resources/v1/ai_image_generator/client.py,sha256=QKTbP9uyU0aCis70eKUR
24
24
  magic_hour/resources/v1/ai_image_upscaler/README.md,sha256=MNmxGtfnow27ukASpD5GC_JTMg5c9WF6VvCZktteQI4,877
25
25
  magic_hour/resources/v1/ai_image_upscaler/__init__.py,sha256=9b1-2XfnAVa4qE3S-4WL8vN3wuqLkUuHKjdl_km8hUc,138
26
26
  magic_hour/resources/v1/ai_image_upscaler/client.py,sha256=h06UydWxHm2axdCK7fnENB3qSveBPO9lfWrB9j-20XI,4531
27
+ magic_hour/resources/v1/ai_meme_generator/README.md,sha256=apoW6OAAuK6DJh43ZZt1SwGsjawkVl-IQTiqqMNrDOA,864
28
+ magic_hour/resources/v1/ai_meme_generator/__init__.py,sha256=x4vtin1KKvoA-va7vhaQ91c__M2z3PmDySLX7yJpRDA,138
29
+ magic_hour/resources/v1/ai_meme_generator/client.py,sha256=koIrShmzJ5duMoNFe28gli9temiSReKTDv24s2CcB9g,3831
27
30
  magic_hour/resources/v1/ai_photo_editor/README.md,sha256=H5mahQ4cU15c_ISYSxIwBCx4pROxUtaOSseZCq2ZcF4,1434
28
31
  magic_hour/resources/v1/ai_photo_editor/__init__.py,sha256=RPG6WaL2KN_DmgrtxImA_jNnEDMm-Ku2o2m2EnNwxts,130
29
- magic_hour/resources/v1/ai_photo_editor/client.py,sha256=sgoGs68vduah23tIdmRHi5XQwFBUvQUhbmnwQEru3W0,6049
32
+ magic_hour/resources/v1/ai_photo_editor/client.py,sha256=oNXR7XhA_pzUpUJ6n0aDJ3mWo8mIyqL-kXFv8GBGCZ0,6233
30
33
  magic_hour/resources/v1/ai_qr_code_generator/README.md,sha256=w6IE0mm_D-PnW-bDsIu9k8oPePekZ2TuW3gOFhi95_w,734
31
34
  magic_hour/resources/v1/ai_qr_code_generator/__init__.py,sha256=HnSTg7tB8M5LibZoCDRdE5Q71efmiqZIkNEve5SO1Mg,146
32
35
  magic_hour/resources/v1/ai_qr_code_generator/client.py,sha256=jeqU-1cDWHTpYrfeEq-ABIQqC-jO2elusrfo69Q6pDI,3849
@@ -35,11 +38,11 @@ magic_hour/resources/v1/ai_talking_photo/__init__.py,sha256=ZTDD_IRBoR7GSdGWCVEK
35
38
  magic_hour/resources/v1/ai_talking_photo/client.py,sha256=TQNwMP3DhDj5jb51diMxcONDbdMPsIe_GSnNahZg8AM,4623
36
39
  magic_hour/resources/v1/animation/README.md,sha256=uIVfUwD7iAOe2eJDgrxj4UyYmq9R30fdI3Z0JuEChc4,1477
37
40
  magic_hour/resources/v1/animation/__init__.py,sha256=M6KUe6TEZl_DAdyn1HFQ2kHYanZo6xy3mvUdCN264hQ,114
38
- magic_hour/resources/v1/animation/client.py,sha256=LQcUmFJEmO-0syfJPU14ck-n9VGZ-KRy4AyKyxMaaAw,6095
39
- magic_hour/resources/v1/client.py,sha256=5Dysdx4DmtBsAZlmODOaWNMOpDSR3CuyiUd6mme3JBs,5466
41
+ magic_hour/resources/v1/animation/client.py,sha256=YYjggl_hszTW-Sn9SFs3m7bz7PvtRTruhHSSnrkkD9c,6401
42
+ magic_hour/resources/v1/client.py,sha256=ml5WQYIOi5GMw6fAa1e1JXJaRoA19U5ZYBcPoERILGM,5782
40
43
  magic_hour/resources/v1/face_swap/README.md,sha256=7b6OeNBhMHJkxaQ7NFEuGUtgDUHOkpasXlU05KE5jkQ,1306
41
44
  magic_hour/resources/v1/face_swap/__init__.py,sha256=lyg5uAHyYHEUVAiAZtP3zwjGCEGqq8IWbQKexVdhr00,110
42
- magic_hour/resources/v1/face_swap/client.py,sha256=iwWbDqqYDFWCUoGDz3tPPbvc_1w0PsHubFyantCd4lM,6167
45
+ magic_hour/resources/v1/face_swap/client.py,sha256=yhBmF1CrYZQfd4W_oerU96W7z-2oza_D83aqliEOsxY,6383
43
46
  magic_hour/resources/v1/face_swap_photo/README.md,sha256=9iGINuGkWn60ZaZgZ4xz0Iho0lvfE-e_YVEA2vId6QU,964
44
47
  magic_hour/resources/v1/face_swap_photo/__init__.py,sha256=NZEplYX5kDPL_0qY0Q5tuxhDevipN0otByTYKMmF_1k,130
45
48
  magic_hour/resources/v1/face_swap_photo/client.py,sha256=wRkC3o5fJoATrCYvnlw4PfVoSXU_fPDyKtzBozn01Rk,4027
@@ -54,26 +57,27 @@ magic_hour/resources/v1/image_background_remover/client.py,sha256=xhinD3VIPOFamp
54
57
  magic_hour/resources/v1/image_projects/README.md,sha256=-mcL1vJbk9PI3bT1VAmq7XWl7hruM73PbCURdndz-f4,1589
55
58
  magic_hour/resources/v1/image_projects/__init__.py,sha256=oBlV4e5IVYe8SclhoEy2VOYB53kKP2DORXwcztAwU3E,130
56
59
  magic_hour/resources/v1/image_projects/client.py,sha256=FbqvgvoLFcAjBtqgGtQZMNT8jG5f2bJH7Poxod446sw,5527
57
- magic_hour/resources/v1/image_to_video/README.md,sha256=fX9SoSaUG-cO9krlzhiFsJi9qn6Nxs3EvasCNi8bUZg,1158
60
+ magic_hour/resources/v1/image_to_video/README.md,sha256=RHo1mqVzymPELMVroYrJN_F4VGzuWuTSufa94iKWcFw,1180
58
61
  magic_hour/resources/v1/image_to_video/__init__.py,sha256=tY_ABo6evwKQBRSq-M84lNX-pXqmxoozukmrO6NhCgA,126
59
- magic_hour/resources/v1/image_to_video/client.py,sha256=ETKE0ODjwGor_niYt3A5Y24GSF479UgVmiqzjPNVUjE,5987
62
+ magic_hour/resources/v1/image_to_video/client.py,sha256=m512tJStl0prro97wyIetZ9jWqbVxI83HslnbBBu6Vs,6043
60
63
  magic_hour/resources/v1/lip_sync/README.md,sha256=uNZzAXARbUTmq9CcM3uYFhtfpJbM6xICqxkE6woL0BU,1350
61
64
  magic_hour/resources/v1/lip_sync/__init__.py,sha256=MlKUAoHNSKcuNzVyqNfLnLtD_PsqEn3l1TtVpPC1JqQ,106
62
- magic_hour/resources/v1/lip_sync/client.py,sha256=Z0mSi6TUYdG-ABxSAFFn572DdLhFoOHZ4J3vrWB9lQY,7217
63
- magic_hour/resources/v1/text_to_video/README.md,sha256=Ug9HDXxOE0L_4sY6M4vmP041m8mPCxpabM4QbQoGMjY,1038
65
+ magic_hour/resources/v1/lip_sync/client.py,sha256=jVP-RrJSKJSdhLp-FZLnMWWhmxdA45upCzPfiSUV6ao,7339
66
+ magic_hour/resources/v1/text_to_video/README.md,sha256=ecMH9s8N7DrIL_DkDvrCElbvRGnNxNMvSoX8uHMxyP4,1052
64
67
  magic_hour/resources/v1/text_to_video/__init__.py,sha256=F18iHSi9tuYSdgpatznBzb7lbSySNpK-82w96-Om_k4,122
65
- magic_hour/resources/v1/text_to_video/client.py,sha256=vtF-noowrL4Fw4516Qz-jegxm_iNEGKhvVDuPK8V_GI,5014
68
+ magic_hour/resources/v1/text_to_video/client.py,sha256=HFFj6a9VaYEzEsa--5lI8HhsS9az-mpDtpIgjV_Nf6M,5028
66
69
  magic_hour/resources/v1/video_projects/README.md,sha256=8z3EpBwXMR1nZL-ba34DAkoCfRZ0S2CyMaYCwLBYCEo,1589
67
70
  magic_hour/resources/v1/video_projects/__init__.py,sha256=1aj_tE-GAf8BuQ76RQvjGVn8Y39CjdAJDlcsCPucX0w,130
68
71
  magic_hour/resources/v1/video_projects/client.py,sha256=JvhYhf3phYkdVj8VpWxvxF8qWBRU-WaZYi-8lhVgpSQ,5511
69
- magic_hour/resources/v1/video_to_video/README.md,sha256=yzTvpH-7hwXiuwNDykzVIfzrKpFgZPe3E0nNahjgOG0,1622
72
+ magic_hour/resources/v1/video_to_video/README.md,sha256=yOIRj1EPTVl8rl15SPWhpc2PZi1ddKGMix8WbaxlXzQ,1630
70
73
  magic_hour/resources/v1/video_to_video/__init__.py,sha256=1SHaRLlsrlBkdxxKBYgdbHrGATlRvqlXc22RpjjHaOA,126
71
- magic_hour/resources/v1/video_to_video/client.py,sha256=kfKdA1ESV-h3GyPfiet3zlVcFgNs0GdXXNM_3eS4V7Q,8184
72
- magic_hour/types/models/__init__.py,sha256=4o_3nWmvGp_nPZTkCsdOTh-ktsvvqDf-y5uHjUOexoA,2955
74
+ magic_hour/resources/v1/video_to_video/client.py,sha256=dYb2zi8MMhm1YUBFxGhFno4ikbMEjcLrs3JofapyP-s,8368
75
+ magic_hour/types/models/__init__.py,sha256=7LI5u95pRS5knhfmPXR-zl4Y2ZWAvL29uH30_SeRDac,3076
73
76
  magic_hour/types/models/v1_ai_clothes_changer_create_response.py,sha256=gpPZLGvSukhBSK2LzTckn4HFcNDseP_XtfwasxzE2uc,625
74
77
  magic_hour/types/models/v1_ai_headshot_generator_create_response.py,sha256=s4OheUpwh5jW1XAP4x_M7j-Xafq_gq9Lbz3NbUsFhs8,628
75
78
  magic_hour/types/models/v1_ai_image_generator_create_response.py,sha256=gqRQUTb1dznt9trj5i4vIc2GcPac910ti7EXzz49btc,625
76
79
  magic_hour/types/models/v1_ai_image_upscaler_create_response.py,sha256=u5z8WHJA7iT3u3EsTcDuAzwJ9JL9wMi0K93JhahjpGk,624
80
+ magic_hour/types/models/v1_ai_meme_generator_create_response.py,sha256=l71aVk0golbDVn3UjIML0NqGWYiBTPDVQkzKsQ2k7Uc,624
77
81
  magic_hour/types/models/v1_ai_photo_editor_create_response.py,sha256=6a72cPZeaMUxIwbViir682fOBYDpy-REcIQOQHv_Yd8,622
78
82
  magic_hour/types/models/v1_ai_qr_code_generator_create_response.py,sha256=N38DZ71d3w2DumFlsj48D8ItRxb_AybRL1znBR-X7tM,626
79
83
  magic_hour/types/models/v1_ai_talking_photo_create_response.py,sha256=2R3_2-1KkDZCMOcm4pMM0RxUFb0Qqoch_-wkcXzZO0Q,738
@@ -83,18 +87,18 @@ magic_hour/types/models/v1_face_swap_photo_create_response.py,sha256=d68oxwceXya
83
87
  magic_hour/types/models/v1_files_upload_urls_create_response.py,sha256=ecdnxoo-ZBTa2kAusHq4nyz6RdugzyN7w4oazJt5ri0,460
84
88
  magic_hour/types/models/v1_files_upload_urls_create_response_items_item.py,sha256=AjW1Myj-dB10IdM3zTMEsXouY3tnx8vdN5CW3HLQX_M,799
85
89
  magic_hour/types/models/v1_image_background_remover_create_response.py,sha256=jK_RVF3V0VSZn70FzsEjCrA_SEbpvcDdxy1RSlvsygw,631
86
- magic_hour/types/models/v1_image_projects_get_response.py,sha256=DAjdXYIAsBGLaHvRJQaLNt9lz__hO2r4e7JFHRW2NDU,2141
90
+ magic_hour/types/models/v1_image_projects_get_response.py,sha256=FEt7O6Z_C2pDzFnjkBciC2Cq6A9OfRsq-u8db4JTEqY,2141
87
91
  magic_hour/types/models/v1_image_projects_get_response_downloads_item.py,sha256=kC0UhiMug52kxN6Ib1H_u_JQGUbeRc91gjuVaXYaM-c,410
88
92
  magic_hour/types/models/v1_image_projects_get_response_error.py,sha256=R1qg-aIt63h6Q7bQ4AvgeC0lbUg5u35rwFXFvU_gvZs,568
89
93
  magic_hour/types/models/v1_image_to_video_create_response.py,sha256=9I3MptKUR2gdQW6SbGSZr5Usdte9PRSniq-pjwJySk4,736
90
94
  magic_hour/types/models/v1_lip_sync_create_response.py,sha256=YtxDlPf9LdW8awpxoahwrleIeqOsrbpHQFQE0DgOKUg,731
91
95
  magic_hour/types/models/v1_text_to_video_create_response.py,sha256=B7Lx3XNbqZIVA5SESc_g-ShktN9uC-bGtdgeXKKCww0,735
92
- magic_hour/types/models/v1_video_projects_get_response.py,sha256=tHxM7JKNfR5Xj4ULRHMz6HOmjepYG489-GLgTFWt4cQ,3291
96
+ magic_hour/types/models/v1_video_projects_get_response.py,sha256=4uoH6xRhI_G2b9zl1NR4gairyU0EDBQhDW8rraY8es4,3252
93
97
  magic_hour/types/models/v1_video_projects_get_response_download.py,sha256=nudDCN30TsVk9UE_uXMtTT0JHIAGlWgjDeHpkZ0vIfU,450
94
98
  magic_hour/types/models/v1_video_projects_get_response_downloads_item.py,sha256=DlUuLBSGa7jWoozxferkaOsGc4jASItcjjWbBXGu620,410
95
99
  magic_hour/types/models/v1_video_projects_get_response_error.py,sha256=49QxnXAmYHcvSWuuhbQZeGlUfqVcO4YwZ414GczQnvA,568
96
100
  magic_hour/types/models/v1_video_to_video_create_response.py,sha256=dRQql5qEQvcF0wbGO8M0yabgMef26w5T3JGtgnqLZ-Y,736
97
- magic_hour/types/params/__init__.py,sha256=gO9OjzbbTV8YAoBT1eieRukaXfkxX5_lasGP5QvJp4M,8292
101
+ magic_hour/types/params/__init__.py,sha256=MK23bdbkHemaWLPy2Cbkip5Wu7olb9tH0WoyfetdiVA,8734
98
102
  magic_hour/types/params/v1_ai_clothes_changer_create_body.py,sha256=X5koqrTxYLiKcRMqPF7r-VwQzy4r_7k81o1289zHJvo,1006
99
103
  magic_hour/types/params/v1_ai_clothes_changer_create_body_assets.py,sha256=GGnXOExxXtnHT9wQpDCEkLHQlQB5MbAbYuU47iHGf70,1509
100
104
  magic_hour/types/params/v1_ai_headshot_generator_create_body.py,sha256=Ydzqxzfo6mMEIUc8R_PTWJujfnTDdzt7Ze4ZYiWxWJM,1405
@@ -105,6 +109,8 @@ magic_hour/types/params/v1_ai_image_generator_create_body_style.py,sha256=IJ5utg
105
109
  magic_hour/types/params/v1_ai_image_upscaler_create_body.py,sha256=aoD7r6Vkho__ZvzXlhr8neNdxETISr6B9hRRjFQnXxs,1511
106
110
  magic_hour/types/params/v1_ai_image_upscaler_create_body_assets.py,sha256=M1RgIPdfvTz4Eu7fLi-47hXTaTTFelEKoEHuVoA3M8M,827
107
111
  magic_hour/types/params/v1_ai_image_upscaler_create_body_style.py,sha256=XRNxQslCeMQ9RD6gV-bqOGB62tVE-u_mlBYmBzgPRyA,993
112
+ magic_hour/types/params/v1_ai_meme_generator_create_body.py,sha256=aYbnLZcqeIL4vPKkH6CePFTmCyVcnoQxl-n9dEu9Yds,934
113
+ magic_hour/types/params/v1_ai_meme_generator_create_body_style.py,sha256=olHEhM1LlYDjqcRYXglayUfxklnVBThCv86QP9s28no,1822
108
114
  magic_hour/types/params/v1_ai_photo_editor_create_body.py,sha256=KrlvaPla47WKbH79y_NWruDNEcF4Xl4l3_zw7MqrkF0,1940
109
115
  magic_hour/types/params/v1_ai_photo_editor_create_body_assets.py,sha256=xoDh4VwV-VapU8zUYV6Xnq5LDeE7z-OxNmsmlMlfre0,841
110
116
  magic_hour/types/params/v1_ai_photo_editor_create_body_style.py,sha256=VPBkdZRjQ7rAFLBcwWt7I-sWmD_oApCa0gyMM0P2-DQ,2073
@@ -123,17 +129,17 @@ magic_hour/types/params/v1_files_upload_urls_create_body.py,sha256=X6-ZcUqVVTM3w
123
129
  magic_hour/types/params/v1_files_upload_urls_create_body_items_item.py,sha256=I26O2Jx5_uhsCOrQCL_-wPeenu0rzhNwCDy0AEI6YuQ,962
124
130
  magic_hour/types/params/v1_image_background_remover_create_body.py,sha256=l3sb8UTXjie3gMd4ZJhHik-N1o3zaVzsZ7xDaS_uTG4,1063
125
131
  magic_hour/types/params/v1_image_background_remover_create_body_assets.py,sha256=aw9P_bdBTi8YMvgJxH8G0adwn1YswQzvtc0LgNAPQ8s,873
126
- magic_hour/types/params/v1_image_to_video_create_body.py,sha256=EooTD50DPBCAYcQCVcDeN8jHIju9cXKLh0g8RbZHDJg,2042
132
+ magic_hour/types/params/v1_image_to_video_create_body.py,sha256=jU1k75k6Q30RC1Hf41h2_e2fhQbSydiCKhF_ESTTZKc,2113
127
133
  magic_hour/types/params/v1_image_to_video_create_body_assets.py,sha256=J39Jv5Bv9bjMaskHzMfbO5VE6QWh-saN3eWOUPRtuRk,830
128
- magic_hour/types/params/v1_image_to_video_create_body_style.py,sha256=H9z0vGz6ke8SVz7i22rNFa28UXSzja3sTo9iIjwJO_A,960
134
+ magic_hour/types/params/v1_image_to_video_create_body_style.py,sha256=Q7KKr3i0ed7pj2HtwYW0dHQgY-Jjh9xTxUKxGYcBnU0,1535
129
135
  magic_hour/types/params/v1_lip_sync_create_body.py,sha256=U5mk_4Oy_e3NyfQIt-Av_FDvt4EYed10hvZZ6tMcEP4,2448
130
136
  magic_hour/types/params/v1_lip_sync_create_body_assets.py,sha256=UypixyrVpyyv2nysMgXFj1iyvALCE0D4WRy1D3XEWuI,1883
131
137
  magic_hour/types/params/v1_text_to_video_create_body.py,sha256=ax7CQZQ7keVjOWIsYFTQ9lb_PhhwvfMBXzHWX4x1nB8,1436
132
- magic_hour/types/params/v1_text_to_video_create_body_style.py,sha256=rMzJdsin-C9hdbMOt6VqGySTTClcVbICqwlw2OZQiW0,601
138
+ magic_hour/types/params/v1_text_to_video_create_body_style.py,sha256=9NTboy7J4efsA8tVub2uOZpmgriiggfOyf5uAodBN3o,1065
133
139
  magic_hour/types/params/v1_video_to_video_create_body.py,sha256=iOb3qGXySlI4unyWPAXDmiLMUSHH6ymuDHeiwpmhKeE,2942
134
140
  magic_hour/types/params/v1_video_to_video_create_body_assets.py,sha256=_-6iA5d8ndka6iJWyWvlJwzRkQcmurJE6hkg-fDwBmQ,1531
135
141
  magic_hour/types/params/v1_video_to_video_create_body_style.py,sha256=2jgpJ3A8LNXksTPQ5pp1tWXtd753zBuhBjA22qqCsTE,5697
136
- magic_hour-0.12.1.dist-info/LICENSE,sha256=F3fxj7JXPgB2K0uj8YXRsVss4u-Dgt_-U3V4VXsivNI,1070
137
- magic_hour-0.12.1.dist-info/METADATA,sha256=7FhwlTUojEI5LB-mJyAcLLANx3Rs4eJi2Uw8CIH4c5I,4824
138
- magic_hour-0.12.1.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
139
- magic_hour-0.12.1.dist-info/RECORD,,
142
+ magic_hour-0.14.0.dist-info/LICENSE,sha256=F3fxj7JXPgB2K0uj8YXRsVss4u-Dgt_-U3V4VXsivNI,1070
143
+ magic_hour-0.14.0.dist-info/METADATA,sha256=eLoBI-qD410IkJndKZydTo7CTO141nMZmvS7_NabfVg,4997
144
+ magic_hour-0.14.0.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
145
+ magic_hour-0.14.0.dist-info/RECORD,,