magic_hour 0.14.0__py3-none-any.whl → 0.16.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.
- magic_hour/environment.py +1 -1
- magic_hour/resources/v1/ai_face_editor/README.md +67 -0
- magic_hour/resources/v1/ai_face_editor/__init__.py +4 -0
- magic_hour/resources/v1/ai_face_editor/client.py +157 -0
- magic_hour/resources/v1/client.py +6 -0
- magic_hour/resources/v1/face_swap/README.md +4 -4
- magic_hour/resources/v1/face_swap/client.py +52 -16
- magic_hour/resources/v1/lip_sync/README.md +4 -4
- magic_hour/resources/v1/lip_sync/client.py +52 -16
- magic_hour/types/models/__init__.py +2 -0
- magic_hour/types/models/v1_ai_face_editor_create_response.py +25 -0
- magic_hour/types/params/__init__.py +18 -0
- magic_hour/types/params/v1_ai_face_editor_create_body.py +52 -0
- magic_hour/types/params/v1_ai_face_editor_create_body_assets.py +28 -0
- magic_hour/types/params/v1_ai_face_editor_create_body_style.py +140 -0
- magic_hour/types/params/v1_face_swap_create_body.py +20 -10
- magic_hour/types/params/v1_lip_sync_create_body.py +20 -10
- {magic_hour-0.14.0.dist-info → magic_hour-0.16.0.dist-info}/METADATA +5 -1
- {magic_hour-0.14.0.dist-info → magic_hour-0.16.0.dist-info}/RECORD +21 -14
- {magic_hour-0.14.0.dist-info → magic_hour-0.16.0.dist-info}/LICENSE +0 -0
- {magic_hour-0.14.0.dist-info → magic_hour-0.16.0.dist-info}/WHEEL +0 -0
magic_hour/environment.py
CHANGED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
|
|
2
|
+
### create <a name="create"></a>
|
|
3
|
+
AI Face Editor
|
|
4
|
+
|
|
5
|
+
Edit facial features of an image using AI. Each edit costs 1 frame. The height/width of the output image depends on your subscription. Please refer to our [pricing](/pricing) page for more details
|
|
6
|
+
|
|
7
|
+
**API Endpoint**: `POST /v1/ai-face-editor`
|
|
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_face_editor.create(
|
|
17
|
+
assets={"image_file_path": "api-assets/id/1234.png"},
|
|
18
|
+
style={
|
|
19
|
+
"enhance_face": False,
|
|
20
|
+
"eye_gaze_horizontal": 0.0,
|
|
21
|
+
"eye_gaze_vertical": 0.0,
|
|
22
|
+
"eye_open_ratio": 0.0,
|
|
23
|
+
"eyebrow_direction": 0.0,
|
|
24
|
+
"head_pitch": 0.0,
|
|
25
|
+
"head_roll": 0.0,
|
|
26
|
+
"head_yaw": 0.0,
|
|
27
|
+
"lip_open_ratio": 0.0,
|
|
28
|
+
"mouth_grim": 0.0,
|
|
29
|
+
"mouth_position_horizontal": 0.0,
|
|
30
|
+
"mouth_position_vertical": 0.0,
|
|
31
|
+
"mouth_pout": 0.0,
|
|
32
|
+
"mouth_purse": 0.0,
|
|
33
|
+
"mouth_smile": 0.0,
|
|
34
|
+
},
|
|
35
|
+
name="Face Editor image",
|
|
36
|
+
)
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
#### Asynchronous Client
|
|
40
|
+
|
|
41
|
+
```python
|
|
42
|
+
from magic_hour import AsyncClient
|
|
43
|
+
from os import getenv
|
|
44
|
+
|
|
45
|
+
client = AsyncClient(token=getenv("API_TOKEN"))
|
|
46
|
+
res = await client.v1.ai_face_editor.create(
|
|
47
|
+
assets={"image_file_path": "api-assets/id/1234.png"},
|
|
48
|
+
style={
|
|
49
|
+
"enhance_face": False,
|
|
50
|
+
"eye_gaze_horizontal": 0.0,
|
|
51
|
+
"eye_gaze_vertical": 0.0,
|
|
52
|
+
"eye_open_ratio": 0.0,
|
|
53
|
+
"eyebrow_direction": 0.0,
|
|
54
|
+
"head_pitch": 0.0,
|
|
55
|
+
"head_roll": 0.0,
|
|
56
|
+
"head_yaw": 0.0,
|
|
57
|
+
"lip_open_ratio": 0.0,
|
|
58
|
+
"mouth_grim": 0.0,
|
|
59
|
+
"mouth_position_horizontal": 0.0,
|
|
60
|
+
"mouth_position_vertical": 0.0,
|
|
61
|
+
"mouth_pout": 0.0,
|
|
62
|
+
"mouth_purse": 0.0,
|
|
63
|
+
"mouth_smile": 0.0,
|
|
64
|
+
},
|
|
65
|
+
name="Face Editor image",
|
|
66
|
+
)
|
|
67
|
+
```
|
|
@@ -0,0 +1,157 @@
|
|
|
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 AiFaceEditorClient:
|
|
15
|
+
def __init__(self, *, base_client: SyncBaseClient):
|
|
16
|
+
self._base_client = base_client
|
|
17
|
+
|
|
18
|
+
def create(
|
|
19
|
+
self,
|
|
20
|
+
*,
|
|
21
|
+
assets: params.V1AiFaceEditorCreateBodyAssets,
|
|
22
|
+
style: params.V1AiFaceEditorCreateBodyStyle,
|
|
23
|
+
name: typing.Union[
|
|
24
|
+
typing.Optional[str], type_utils.NotGiven
|
|
25
|
+
] = type_utils.NOT_GIVEN,
|
|
26
|
+
request_options: typing.Optional[RequestOptions] = None,
|
|
27
|
+
) -> models.V1AiFaceEditorCreateResponse:
|
|
28
|
+
"""
|
|
29
|
+
AI Face Editor
|
|
30
|
+
|
|
31
|
+
Edit facial features of an image using AI. Each edit costs 1 frame. The height/width of the output image depends on your subscription. Please refer to our [pricing](/pricing) page for more details
|
|
32
|
+
|
|
33
|
+
POST /v1/ai-face-editor
|
|
34
|
+
|
|
35
|
+
Args:
|
|
36
|
+
name: The name of image
|
|
37
|
+
assets: Provide the assets for face editor
|
|
38
|
+
style: Face editing parameters
|
|
39
|
+
request_options: Additional options to customize the HTTP request
|
|
40
|
+
|
|
41
|
+
Returns:
|
|
42
|
+
Success
|
|
43
|
+
|
|
44
|
+
Raises:
|
|
45
|
+
ApiError: A custom exception class that provides additional context
|
|
46
|
+
for API errors, including the HTTP status code and response body.
|
|
47
|
+
|
|
48
|
+
Examples:
|
|
49
|
+
```py
|
|
50
|
+
client.v1.ai_face_editor.create(
|
|
51
|
+
assets={"image_file_path": "api-assets/id/1234.png"},
|
|
52
|
+
style={
|
|
53
|
+
"enhance_face": False,
|
|
54
|
+
"eye_gaze_horizontal": 0.0,
|
|
55
|
+
"eye_gaze_vertical": 0.0,
|
|
56
|
+
"eye_open_ratio": 0.0,
|
|
57
|
+
"eyebrow_direction": 0.0,
|
|
58
|
+
"head_pitch": 0.0,
|
|
59
|
+
"head_roll": 0.0,
|
|
60
|
+
"head_yaw": 0.0,
|
|
61
|
+
"lip_open_ratio": 0.0,
|
|
62
|
+
"mouth_grim": 0.0,
|
|
63
|
+
"mouth_position_horizontal": 0.0,
|
|
64
|
+
"mouth_position_vertical": 0.0,
|
|
65
|
+
"mouth_pout": 0.0,
|
|
66
|
+
"mouth_purse": 0.0,
|
|
67
|
+
"mouth_smile": 0.0,
|
|
68
|
+
},
|
|
69
|
+
name="Face Editor image",
|
|
70
|
+
)
|
|
71
|
+
```
|
|
72
|
+
"""
|
|
73
|
+
_json = to_encodable(
|
|
74
|
+
item={"name": name, "assets": assets, "style": style},
|
|
75
|
+
dump_with=params._SerializerV1AiFaceEditorCreateBody,
|
|
76
|
+
)
|
|
77
|
+
return self._base_client.request(
|
|
78
|
+
method="POST",
|
|
79
|
+
path="/v1/ai-face-editor",
|
|
80
|
+
auth_names=["bearerAuth"],
|
|
81
|
+
json=_json,
|
|
82
|
+
cast_to=models.V1AiFaceEditorCreateResponse,
|
|
83
|
+
request_options=request_options or default_request_options(),
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
class AsyncAiFaceEditorClient:
|
|
88
|
+
def __init__(self, *, base_client: AsyncBaseClient):
|
|
89
|
+
self._base_client = base_client
|
|
90
|
+
|
|
91
|
+
async def create(
|
|
92
|
+
self,
|
|
93
|
+
*,
|
|
94
|
+
assets: params.V1AiFaceEditorCreateBodyAssets,
|
|
95
|
+
style: params.V1AiFaceEditorCreateBodyStyle,
|
|
96
|
+
name: typing.Union[
|
|
97
|
+
typing.Optional[str], type_utils.NotGiven
|
|
98
|
+
] = type_utils.NOT_GIVEN,
|
|
99
|
+
request_options: typing.Optional[RequestOptions] = None,
|
|
100
|
+
) -> models.V1AiFaceEditorCreateResponse:
|
|
101
|
+
"""
|
|
102
|
+
AI Face Editor
|
|
103
|
+
|
|
104
|
+
Edit facial features of an image using AI. Each edit costs 1 frame. The height/width of the output image depends on your subscription. Please refer to our [pricing](/pricing) page for more details
|
|
105
|
+
|
|
106
|
+
POST /v1/ai-face-editor
|
|
107
|
+
|
|
108
|
+
Args:
|
|
109
|
+
name: The name of image
|
|
110
|
+
assets: Provide the assets for face editor
|
|
111
|
+
style: Face editing parameters
|
|
112
|
+
request_options: Additional options to customize the HTTP request
|
|
113
|
+
|
|
114
|
+
Returns:
|
|
115
|
+
Success
|
|
116
|
+
|
|
117
|
+
Raises:
|
|
118
|
+
ApiError: A custom exception class that provides additional context
|
|
119
|
+
for API errors, including the HTTP status code and response body.
|
|
120
|
+
|
|
121
|
+
Examples:
|
|
122
|
+
```py
|
|
123
|
+
await client.v1.ai_face_editor.create(
|
|
124
|
+
assets={"image_file_path": "api-assets/id/1234.png"},
|
|
125
|
+
style={
|
|
126
|
+
"enhance_face": False,
|
|
127
|
+
"eye_gaze_horizontal": 0.0,
|
|
128
|
+
"eye_gaze_vertical": 0.0,
|
|
129
|
+
"eye_open_ratio": 0.0,
|
|
130
|
+
"eyebrow_direction": 0.0,
|
|
131
|
+
"head_pitch": 0.0,
|
|
132
|
+
"head_roll": 0.0,
|
|
133
|
+
"head_yaw": 0.0,
|
|
134
|
+
"lip_open_ratio": 0.0,
|
|
135
|
+
"mouth_grim": 0.0,
|
|
136
|
+
"mouth_position_horizontal": 0.0,
|
|
137
|
+
"mouth_position_vertical": 0.0,
|
|
138
|
+
"mouth_pout": 0.0,
|
|
139
|
+
"mouth_purse": 0.0,
|
|
140
|
+
"mouth_smile": 0.0,
|
|
141
|
+
},
|
|
142
|
+
name="Face Editor image",
|
|
143
|
+
)
|
|
144
|
+
```
|
|
145
|
+
"""
|
|
146
|
+
_json = to_encodable(
|
|
147
|
+
item={"name": name, "assets": assets, "style": style},
|
|
148
|
+
dump_with=params._SerializerV1AiFaceEditorCreateBody,
|
|
149
|
+
)
|
|
150
|
+
return await self._base_client.request(
|
|
151
|
+
method="POST",
|
|
152
|
+
path="/v1/ai-face-editor",
|
|
153
|
+
auth_names=["bearerAuth"],
|
|
154
|
+
json=_json,
|
|
155
|
+
cast_to=models.V1AiFaceEditorCreateResponse,
|
|
156
|
+
request_options=request_options or default_request_options(),
|
|
157
|
+
)
|
|
@@ -3,6 +3,10 @@ from magic_hour.resources.v1.ai_clothes_changer import (
|
|
|
3
3
|
AiClothesChangerClient,
|
|
4
4
|
AsyncAiClothesChangerClient,
|
|
5
5
|
)
|
|
6
|
+
from magic_hour.resources.v1.ai_face_editor import (
|
|
7
|
+
AiFaceEditorClient,
|
|
8
|
+
AsyncAiFaceEditorClient,
|
|
9
|
+
)
|
|
6
10
|
from magic_hour.resources.v1.ai_headshot_generator import (
|
|
7
11
|
AiHeadshotGeneratorClient,
|
|
8
12
|
AsyncAiHeadshotGeneratorClient,
|
|
@@ -71,6 +75,7 @@ class V1Client:
|
|
|
71
75
|
self.image_projects = ImageProjectsClient(base_client=self._base_client)
|
|
72
76
|
self.video_projects = VideoProjectsClient(base_client=self._base_client)
|
|
73
77
|
self.ai_clothes_changer = AiClothesChangerClient(base_client=self._base_client)
|
|
78
|
+
self.ai_face_editor = AiFaceEditorClient(base_client=self._base_client)
|
|
74
79
|
self.ai_headshot_generator = AiHeadshotGeneratorClient(
|
|
75
80
|
base_client=self._base_client
|
|
76
81
|
)
|
|
@@ -103,6 +108,7 @@ class AsyncV1Client:
|
|
|
103
108
|
self.ai_clothes_changer = AsyncAiClothesChangerClient(
|
|
104
109
|
base_client=self._base_client
|
|
105
110
|
)
|
|
111
|
+
self.ai_face_editor = AsyncAiFaceEditorClient(base_client=self._base_client)
|
|
106
112
|
self.ai_headshot_generator = AsyncAiHeadshotGeneratorClient(
|
|
107
113
|
base_client=self._base_client
|
|
108
114
|
)
|
|
@@ -23,10 +23,10 @@ res = client.v1.face_swap.create(
|
|
|
23
23
|
"video_source": "file",
|
|
24
24
|
},
|
|
25
25
|
end_seconds=15.0,
|
|
26
|
-
height=960,
|
|
27
26
|
start_seconds=0.0,
|
|
28
|
-
|
|
27
|
+
height=960,
|
|
29
28
|
name="Face Swap video",
|
|
29
|
+
width=512,
|
|
30
30
|
)
|
|
31
31
|
```
|
|
32
32
|
|
|
@@ -44,9 +44,9 @@ res = await client.v1.face_swap.create(
|
|
|
44
44
|
"video_source": "file",
|
|
45
45
|
},
|
|
46
46
|
end_seconds=15.0,
|
|
47
|
-
height=960,
|
|
48
47
|
start_seconds=0.0,
|
|
49
|
-
|
|
48
|
+
height=960,
|
|
50
49
|
name="Face Swap video",
|
|
50
|
+
width=512,
|
|
51
51
|
)
|
|
52
52
|
```
|
|
@@ -20,12 +20,16 @@ class FaceSwapClient:
|
|
|
20
20
|
*,
|
|
21
21
|
assets: params.V1FaceSwapCreateBodyAssets,
|
|
22
22
|
end_seconds: float,
|
|
23
|
-
height: int,
|
|
24
23
|
start_seconds: float,
|
|
25
|
-
|
|
24
|
+
height: typing.Union[
|
|
25
|
+
typing.Optional[int], type_utils.NotGiven
|
|
26
|
+
] = type_utils.NOT_GIVEN,
|
|
26
27
|
name: typing.Union[
|
|
27
28
|
typing.Optional[str], type_utils.NotGiven
|
|
28
29
|
] = type_utils.NOT_GIVEN,
|
|
30
|
+
width: typing.Union[
|
|
31
|
+
typing.Optional[int], type_utils.NotGiven
|
|
32
|
+
] = type_utils.NOT_GIVEN,
|
|
29
33
|
request_options: typing.Optional[RequestOptions] = None,
|
|
30
34
|
) -> models.V1FaceSwapCreateResponse:
|
|
31
35
|
"""
|
|
@@ -39,12 +43,26 @@ class FaceSwapClient:
|
|
|
39
43
|
POST /v1/face-swap
|
|
40
44
|
|
|
41
45
|
Args:
|
|
46
|
+
height: Used to determine the dimensions of the output video.
|
|
47
|
+
|
|
48
|
+
* If height is provided, width will also be required. The larger value between width and height will be used to determine the maximum output resolution while maintaining the original aspect ratio.
|
|
49
|
+
* If both height and width are omitted, the video will be resized according to your subscription's maximum resolution, while preserving aspect ratio.
|
|
50
|
+
|
|
51
|
+
Note: if the video's original resolution is less than the maximum, the video will not be resized.
|
|
52
|
+
|
|
53
|
+
See our [pricing page](https://magichour.ai/pricing) for more details.
|
|
42
54
|
name: The name of video
|
|
55
|
+
width: Used to determine the dimensions of the output video.
|
|
56
|
+
|
|
57
|
+
* If width is provided, height will also be required. The larger value between width and height will be used to determine the maximum output resolution while maintaining the original aspect ratio.
|
|
58
|
+
* If both height and width are omitted, the video will be resized according to your subscription's maximum resolution, while preserving aspect ratio.
|
|
59
|
+
|
|
60
|
+
Note: if the video's original resolution is less than the maximum, the video will not be resized.
|
|
61
|
+
|
|
62
|
+
See our [pricing page](https://magichour.ai/pricing) for more details.
|
|
43
63
|
assets: Provide the assets for face swap. For video, The `video_source` field determines whether `video_file_path` or `youtube_url` field is used
|
|
44
64
|
end_seconds: The end time of the input video in seconds
|
|
45
|
-
height: The height of the final output video. The maximum height depends on your subscription. Please refer to our [pricing page](https://magichour.ai/pricing) for more details
|
|
46
65
|
start_seconds: The start time of the input video in seconds
|
|
47
|
-
width: The width of the final output video. The maximum width depends on your subscription. Please refer to our [pricing page](https://magichour.ai/pricing) for more details
|
|
48
66
|
request_options: Additional options to customize the HTTP request
|
|
49
67
|
|
|
50
68
|
Returns:
|
|
@@ -63,21 +81,21 @@ class FaceSwapClient:
|
|
|
63
81
|
"video_source": "file",
|
|
64
82
|
},
|
|
65
83
|
end_seconds=15.0,
|
|
66
|
-
height=960,
|
|
67
84
|
start_seconds=0.0,
|
|
68
|
-
|
|
85
|
+
height=960,
|
|
69
86
|
name="Face Swap video",
|
|
87
|
+
width=512,
|
|
70
88
|
)
|
|
71
89
|
```
|
|
72
90
|
"""
|
|
73
91
|
_json = to_encodable(
|
|
74
92
|
item={
|
|
93
|
+
"height": height,
|
|
75
94
|
"name": name,
|
|
95
|
+
"width": width,
|
|
76
96
|
"assets": assets,
|
|
77
97
|
"end_seconds": end_seconds,
|
|
78
|
-
"height": height,
|
|
79
98
|
"start_seconds": start_seconds,
|
|
80
|
-
"width": width,
|
|
81
99
|
},
|
|
82
100
|
dump_with=params._SerializerV1FaceSwapCreateBody,
|
|
83
101
|
)
|
|
@@ -100,12 +118,16 @@ class AsyncFaceSwapClient:
|
|
|
100
118
|
*,
|
|
101
119
|
assets: params.V1FaceSwapCreateBodyAssets,
|
|
102
120
|
end_seconds: float,
|
|
103
|
-
height: int,
|
|
104
121
|
start_seconds: float,
|
|
105
|
-
|
|
122
|
+
height: typing.Union[
|
|
123
|
+
typing.Optional[int], type_utils.NotGiven
|
|
124
|
+
] = type_utils.NOT_GIVEN,
|
|
106
125
|
name: typing.Union[
|
|
107
126
|
typing.Optional[str], type_utils.NotGiven
|
|
108
127
|
] = type_utils.NOT_GIVEN,
|
|
128
|
+
width: typing.Union[
|
|
129
|
+
typing.Optional[int], type_utils.NotGiven
|
|
130
|
+
] = type_utils.NOT_GIVEN,
|
|
109
131
|
request_options: typing.Optional[RequestOptions] = None,
|
|
110
132
|
) -> models.V1FaceSwapCreateResponse:
|
|
111
133
|
"""
|
|
@@ -119,12 +141,26 @@ class AsyncFaceSwapClient:
|
|
|
119
141
|
POST /v1/face-swap
|
|
120
142
|
|
|
121
143
|
Args:
|
|
144
|
+
height: Used to determine the dimensions of the output video.
|
|
145
|
+
|
|
146
|
+
* If height is provided, width will also be required. The larger value between width and height will be used to determine the maximum output resolution while maintaining the original aspect ratio.
|
|
147
|
+
* If both height and width are omitted, the video will be resized according to your subscription's maximum resolution, while preserving aspect ratio.
|
|
148
|
+
|
|
149
|
+
Note: if the video's original resolution is less than the maximum, the video will not be resized.
|
|
150
|
+
|
|
151
|
+
See our [pricing page](https://magichour.ai/pricing) for more details.
|
|
122
152
|
name: The name of video
|
|
153
|
+
width: Used to determine the dimensions of the output video.
|
|
154
|
+
|
|
155
|
+
* If width is provided, height will also be required. The larger value between width and height will be used to determine the maximum output resolution while maintaining the original aspect ratio.
|
|
156
|
+
* If both height and width are omitted, the video will be resized according to your subscription's maximum resolution, while preserving aspect ratio.
|
|
157
|
+
|
|
158
|
+
Note: if the video's original resolution is less than the maximum, the video will not be resized.
|
|
159
|
+
|
|
160
|
+
See our [pricing page](https://magichour.ai/pricing) for more details.
|
|
123
161
|
assets: Provide the assets for face swap. For video, The `video_source` field determines whether `video_file_path` or `youtube_url` field is used
|
|
124
162
|
end_seconds: The end time of the input video in seconds
|
|
125
|
-
height: The height of the final output video. The maximum height depends on your subscription. Please refer to our [pricing page](https://magichour.ai/pricing) for more details
|
|
126
163
|
start_seconds: The start time of the input video in seconds
|
|
127
|
-
width: The width of the final output video. The maximum width depends on your subscription. Please refer to our [pricing page](https://magichour.ai/pricing) for more details
|
|
128
164
|
request_options: Additional options to customize the HTTP request
|
|
129
165
|
|
|
130
166
|
Returns:
|
|
@@ -143,21 +179,21 @@ class AsyncFaceSwapClient:
|
|
|
143
179
|
"video_source": "file",
|
|
144
180
|
},
|
|
145
181
|
end_seconds=15.0,
|
|
146
|
-
height=960,
|
|
147
182
|
start_seconds=0.0,
|
|
148
|
-
|
|
183
|
+
height=960,
|
|
149
184
|
name="Face Swap video",
|
|
185
|
+
width=512,
|
|
150
186
|
)
|
|
151
187
|
```
|
|
152
188
|
"""
|
|
153
189
|
_json = to_encodable(
|
|
154
190
|
item={
|
|
191
|
+
"height": height,
|
|
155
192
|
"name": name,
|
|
193
|
+
"width": width,
|
|
156
194
|
"assets": assets,
|
|
157
195
|
"end_seconds": end_seconds,
|
|
158
|
-
"height": height,
|
|
159
196
|
"start_seconds": start_seconds,
|
|
160
|
-
"width": width,
|
|
161
197
|
},
|
|
162
198
|
dump_with=params._SerializerV1FaceSwapCreateBody,
|
|
163
199
|
)
|
|
@@ -23,11 +23,11 @@ res = client.v1.lip_sync.create(
|
|
|
23
23
|
"video_source": "file",
|
|
24
24
|
},
|
|
25
25
|
end_seconds=15.0,
|
|
26
|
-
height=960,
|
|
27
26
|
start_seconds=0.0,
|
|
28
|
-
|
|
27
|
+
height=960,
|
|
29
28
|
max_fps_limit=12.0,
|
|
30
29
|
name="Lip Sync video",
|
|
30
|
+
width=512,
|
|
31
31
|
)
|
|
32
32
|
```
|
|
33
33
|
|
|
@@ -45,10 +45,10 @@ res = await client.v1.lip_sync.create(
|
|
|
45
45
|
"video_source": "file",
|
|
46
46
|
},
|
|
47
47
|
end_seconds=15.0,
|
|
48
|
-
height=960,
|
|
49
48
|
start_seconds=0.0,
|
|
50
|
-
|
|
49
|
+
height=960,
|
|
51
50
|
max_fps_limit=12.0,
|
|
52
51
|
name="Lip Sync video",
|
|
52
|
+
width=512,
|
|
53
53
|
)
|
|
54
54
|
```
|
|
@@ -20,15 +20,19 @@ class LipSyncClient:
|
|
|
20
20
|
*,
|
|
21
21
|
assets: params.V1LipSyncCreateBodyAssets,
|
|
22
22
|
end_seconds: float,
|
|
23
|
-
height: int,
|
|
24
23
|
start_seconds: float,
|
|
25
|
-
|
|
24
|
+
height: typing.Union[
|
|
25
|
+
typing.Optional[int], type_utils.NotGiven
|
|
26
|
+
] = type_utils.NOT_GIVEN,
|
|
26
27
|
max_fps_limit: typing.Union[
|
|
27
28
|
typing.Optional[float], type_utils.NotGiven
|
|
28
29
|
] = type_utils.NOT_GIVEN,
|
|
29
30
|
name: typing.Union[
|
|
30
31
|
typing.Optional[str], type_utils.NotGiven
|
|
31
32
|
] = type_utils.NOT_GIVEN,
|
|
33
|
+
width: typing.Union[
|
|
34
|
+
typing.Optional[int], type_utils.NotGiven
|
|
35
|
+
] = type_utils.NOT_GIVEN,
|
|
32
36
|
request_options: typing.Optional[RequestOptions] = None,
|
|
33
37
|
) -> models.V1LipSyncCreateResponse:
|
|
34
38
|
"""
|
|
@@ -42,13 +46,27 @@ class LipSyncClient:
|
|
|
42
46
|
POST /v1/lip-sync
|
|
43
47
|
|
|
44
48
|
Args:
|
|
49
|
+
height: Used to determine the dimensions of the output video.
|
|
50
|
+
|
|
51
|
+
* If height is provided, width will also be required. The larger value between width and height will be used to determine the maximum output resolution while maintaining the original aspect ratio.
|
|
52
|
+
* If both height and width are omitted, the video will be resized according to your subscription's maximum resolution, while preserving aspect ratio.
|
|
53
|
+
|
|
54
|
+
Note: if the video's original resolution is less than the maximum, the video will not be resized.
|
|
55
|
+
|
|
56
|
+
See our [pricing page](https://magichour.ai/pricing) for more details.
|
|
45
57
|
max_fps_limit: Defines the maximum FPS (frames per second) for the output video. If the input video's FPS is lower than this limit, the output video will retain the input FPS. This is useful for reducing unnecessary frame usage in scenarios where high FPS is not required.
|
|
46
58
|
name: The name of video
|
|
59
|
+
width: Used to determine the dimensions of the output video.
|
|
60
|
+
|
|
61
|
+
* If width is provided, height will also be required. The larger value between width and height will be used to determine the maximum output resolution while maintaining the original aspect ratio.
|
|
62
|
+
* If both height and width are omitted, the video will be resized according to your subscription's maximum resolution, while preserving aspect ratio.
|
|
63
|
+
|
|
64
|
+
Note: if the video's original resolution is less than the maximum, the video will not be resized.
|
|
65
|
+
|
|
66
|
+
See our [pricing page](https://magichour.ai/pricing) for more details.
|
|
47
67
|
assets: Provide the assets for lip-sync. For video, The `video_source` field determines whether `video_file_path` or `youtube_url` field is used
|
|
48
68
|
end_seconds: The end time of the input video in seconds
|
|
49
|
-
height: The height of the final output video. The maximum height depends on your subscription. Please refer to our [pricing page](https://magichour.ai/pricing) for more details
|
|
50
69
|
start_seconds: The start time of the input video in seconds
|
|
51
|
-
width: The width of the final output video. The maximum width depends on your subscription. Please refer to our [pricing page](https://magichour.ai/pricing) for more details
|
|
52
70
|
request_options: Additional options to customize the HTTP request
|
|
53
71
|
|
|
54
72
|
Returns:
|
|
@@ -67,23 +85,23 @@ class LipSyncClient:
|
|
|
67
85
|
"video_source": "file",
|
|
68
86
|
},
|
|
69
87
|
end_seconds=15.0,
|
|
70
|
-
height=960,
|
|
71
88
|
start_seconds=0.0,
|
|
72
|
-
|
|
89
|
+
height=960,
|
|
73
90
|
max_fps_limit=12.0,
|
|
74
91
|
name="Lip Sync video",
|
|
92
|
+
width=512,
|
|
75
93
|
)
|
|
76
94
|
```
|
|
77
95
|
"""
|
|
78
96
|
_json = to_encodable(
|
|
79
97
|
item={
|
|
98
|
+
"height": height,
|
|
80
99
|
"max_fps_limit": max_fps_limit,
|
|
81
100
|
"name": name,
|
|
101
|
+
"width": width,
|
|
82
102
|
"assets": assets,
|
|
83
103
|
"end_seconds": end_seconds,
|
|
84
|
-
"height": height,
|
|
85
104
|
"start_seconds": start_seconds,
|
|
86
|
-
"width": width,
|
|
87
105
|
},
|
|
88
106
|
dump_with=params._SerializerV1LipSyncCreateBody,
|
|
89
107
|
)
|
|
@@ -106,15 +124,19 @@ class AsyncLipSyncClient:
|
|
|
106
124
|
*,
|
|
107
125
|
assets: params.V1LipSyncCreateBodyAssets,
|
|
108
126
|
end_seconds: float,
|
|
109
|
-
height: int,
|
|
110
127
|
start_seconds: float,
|
|
111
|
-
|
|
128
|
+
height: typing.Union[
|
|
129
|
+
typing.Optional[int], type_utils.NotGiven
|
|
130
|
+
] = type_utils.NOT_GIVEN,
|
|
112
131
|
max_fps_limit: typing.Union[
|
|
113
132
|
typing.Optional[float], type_utils.NotGiven
|
|
114
133
|
] = type_utils.NOT_GIVEN,
|
|
115
134
|
name: typing.Union[
|
|
116
135
|
typing.Optional[str], type_utils.NotGiven
|
|
117
136
|
] = type_utils.NOT_GIVEN,
|
|
137
|
+
width: typing.Union[
|
|
138
|
+
typing.Optional[int], type_utils.NotGiven
|
|
139
|
+
] = type_utils.NOT_GIVEN,
|
|
118
140
|
request_options: typing.Optional[RequestOptions] = None,
|
|
119
141
|
) -> models.V1LipSyncCreateResponse:
|
|
120
142
|
"""
|
|
@@ -128,13 +150,27 @@ class AsyncLipSyncClient:
|
|
|
128
150
|
POST /v1/lip-sync
|
|
129
151
|
|
|
130
152
|
Args:
|
|
153
|
+
height: Used to determine the dimensions of the output video.
|
|
154
|
+
|
|
155
|
+
* If height is provided, width will also be required. The larger value between width and height will be used to determine the maximum output resolution while maintaining the original aspect ratio.
|
|
156
|
+
* If both height and width are omitted, the video will be resized according to your subscription's maximum resolution, while preserving aspect ratio.
|
|
157
|
+
|
|
158
|
+
Note: if the video's original resolution is less than the maximum, the video will not be resized.
|
|
159
|
+
|
|
160
|
+
See our [pricing page](https://magichour.ai/pricing) for more details.
|
|
131
161
|
max_fps_limit: Defines the maximum FPS (frames per second) for the output video. If the input video's FPS is lower than this limit, the output video will retain the input FPS. This is useful for reducing unnecessary frame usage in scenarios where high FPS is not required.
|
|
132
162
|
name: The name of video
|
|
163
|
+
width: Used to determine the dimensions of the output video.
|
|
164
|
+
|
|
165
|
+
* If width is provided, height will also be required. The larger value between width and height will be used to determine the maximum output resolution while maintaining the original aspect ratio.
|
|
166
|
+
* If both height and width are omitted, the video will be resized according to your subscription's maximum resolution, while preserving aspect ratio.
|
|
167
|
+
|
|
168
|
+
Note: if the video's original resolution is less than the maximum, the video will not be resized.
|
|
169
|
+
|
|
170
|
+
See our [pricing page](https://magichour.ai/pricing) for more details.
|
|
133
171
|
assets: Provide the assets for lip-sync. For video, The `video_source` field determines whether `video_file_path` or `youtube_url` field is used
|
|
134
172
|
end_seconds: The end time of the input video in seconds
|
|
135
|
-
height: The height of the final output video. The maximum height depends on your subscription. Please refer to our [pricing page](https://magichour.ai/pricing) for more details
|
|
136
173
|
start_seconds: The start time of the input video in seconds
|
|
137
|
-
width: The width of the final output video. The maximum width depends on your subscription. Please refer to our [pricing page](https://magichour.ai/pricing) for more details
|
|
138
174
|
request_options: Additional options to customize the HTTP request
|
|
139
175
|
|
|
140
176
|
Returns:
|
|
@@ -153,23 +189,23 @@ class AsyncLipSyncClient:
|
|
|
153
189
|
"video_source": "file",
|
|
154
190
|
},
|
|
155
191
|
end_seconds=15.0,
|
|
156
|
-
height=960,
|
|
157
192
|
start_seconds=0.0,
|
|
158
|
-
|
|
193
|
+
height=960,
|
|
159
194
|
max_fps_limit=12.0,
|
|
160
195
|
name="Lip Sync video",
|
|
196
|
+
width=512,
|
|
161
197
|
)
|
|
162
198
|
```
|
|
163
199
|
"""
|
|
164
200
|
_json = to_encodable(
|
|
165
201
|
item={
|
|
202
|
+
"height": height,
|
|
166
203
|
"max_fps_limit": max_fps_limit,
|
|
167
204
|
"name": name,
|
|
205
|
+
"width": width,
|
|
168
206
|
"assets": assets,
|
|
169
207
|
"end_seconds": end_seconds,
|
|
170
|
-
"height": height,
|
|
171
208
|
"start_seconds": start_seconds,
|
|
172
|
-
"width": width,
|
|
173
209
|
},
|
|
174
210
|
dump_with=params._SerializerV1LipSyncCreateBody,
|
|
175
211
|
)
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
from .v1_ai_clothes_changer_create_response import V1AiClothesChangerCreateResponse
|
|
2
|
+
from .v1_ai_face_editor_create_response import V1AiFaceEditorCreateResponse
|
|
2
3
|
from .v1_ai_headshot_generator_create_response import (
|
|
3
4
|
V1AiHeadshotGeneratorCreateResponse,
|
|
4
5
|
)
|
|
@@ -37,6 +38,7 @@ from .v1_video_to_video_create_response import V1VideoToVideoCreateResponse
|
|
|
37
38
|
|
|
38
39
|
__all__ = [
|
|
39
40
|
"V1AiClothesChangerCreateResponse",
|
|
41
|
+
"V1AiFaceEditorCreateResponse",
|
|
40
42
|
"V1AiHeadshotGeneratorCreateResponse",
|
|
41
43
|
"V1AiImageGeneratorCreateResponse",
|
|
42
44
|
"V1AiImageUpscalerCreateResponse",
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import pydantic
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class V1AiFaceEditorCreateResponse(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
|
+
"""
|
|
@@ -6,6 +6,18 @@ from .v1_ai_clothes_changer_create_body_assets import (
|
|
|
6
6
|
V1AiClothesChangerCreateBodyAssets,
|
|
7
7
|
_SerializerV1AiClothesChangerCreateBodyAssets,
|
|
8
8
|
)
|
|
9
|
+
from .v1_ai_face_editor_create_body import (
|
|
10
|
+
V1AiFaceEditorCreateBody,
|
|
11
|
+
_SerializerV1AiFaceEditorCreateBody,
|
|
12
|
+
)
|
|
13
|
+
from .v1_ai_face_editor_create_body_assets import (
|
|
14
|
+
V1AiFaceEditorCreateBodyAssets,
|
|
15
|
+
_SerializerV1AiFaceEditorCreateBodyAssets,
|
|
16
|
+
)
|
|
17
|
+
from .v1_ai_face_editor_create_body_style import (
|
|
18
|
+
V1AiFaceEditorCreateBodyStyle,
|
|
19
|
+
_SerializerV1AiFaceEditorCreateBodyStyle,
|
|
20
|
+
)
|
|
9
21
|
from .v1_ai_headshot_generator_create_body import (
|
|
10
22
|
V1AiHeadshotGeneratorCreateBody,
|
|
11
23
|
_SerializerV1AiHeadshotGeneratorCreateBody,
|
|
@@ -160,6 +172,9 @@ from .v1_video_to_video_create_body_style import (
|
|
|
160
172
|
__all__ = [
|
|
161
173
|
"V1AiClothesChangerCreateBody",
|
|
162
174
|
"V1AiClothesChangerCreateBodyAssets",
|
|
175
|
+
"V1AiFaceEditorCreateBody",
|
|
176
|
+
"V1AiFaceEditorCreateBodyAssets",
|
|
177
|
+
"V1AiFaceEditorCreateBodyStyle",
|
|
163
178
|
"V1AiHeadshotGeneratorCreateBody",
|
|
164
179
|
"V1AiHeadshotGeneratorCreateBodyAssets",
|
|
165
180
|
"V1AiHeadshotGeneratorCreateBodyStyle",
|
|
@@ -200,6 +215,9 @@ __all__ = [
|
|
|
200
215
|
"V1VideoToVideoCreateBodyStyle",
|
|
201
216
|
"_SerializerV1AiClothesChangerCreateBody",
|
|
202
217
|
"_SerializerV1AiClothesChangerCreateBodyAssets",
|
|
218
|
+
"_SerializerV1AiFaceEditorCreateBody",
|
|
219
|
+
"_SerializerV1AiFaceEditorCreateBodyAssets",
|
|
220
|
+
"_SerializerV1AiFaceEditorCreateBodyStyle",
|
|
203
221
|
"_SerializerV1AiHeadshotGeneratorCreateBody",
|
|
204
222
|
"_SerializerV1AiHeadshotGeneratorCreateBodyAssets",
|
|
205
223
|
"_SerializerV1AiHeadshotGeneratorCreateBodyStyle",
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import pydantic
|
|
2
|
+
import typing
|
|
3
|
+
import typing_extensions
|
|
4
|
+
|
|
5
|
+
from .v1_ai_face_editor_create_body_assets import (
|
|
6
|
+
V1AiFaceEditorCreateBodyAssets,
|
|
7
|
+
_SerializerV1AiFaceEditorCreateBodyAssets,
|
|
8
|
+
)
|
|
9
|
+
from .v1_ai_face_editor_create_body_style import (
|
|
10
|
+
V1AiFaceEditorCreateBodyStyle,
|
|
11
|
+
_SerializerV1AiFaceEditorCreateBodyStyle,
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class V1AiFaceEditorCreateBody(typing_extensions.TypedDict):
|
|
16
|
+
"""
|
|
17
|
+
V1AiFaceEditorCreateBody
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
assets: typing_extensions.Required[V1AiFaceEditorCreateBodyAssets]
|
|
21
|
+
"""
|
|
22
|
+
Provide the assets for face editor
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
name: typing_extensions.NotRequired[str]
|
|
26
|
+
"""
|
|
27
|
+
The name of image
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
style: typing_extensions.Required[V1AiFaceEditorCreateBodyStyle]
|
|
31
|
+
"""
|
|
32
|
+
Face editing parameters
|
|
33
|
+
"""
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class _SerializerV1AiFaceEditorCreateBody(pydantic.BaseModel):
|
|
37
|
+
"""
|
|
38
|
+
Serializer for V1AiFaceEditorCreateBody handling case conversions
|
|
39
|
+
and file omissions as dictated by the API
|
|
40
|
+
"""
|
|
41
|
+
|
|
42
|
+
model_config = pydantic.ConfigDict(
|
|
43
|
+
populate_by_name=True,
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
assets: _SerializerV1AiFaceEditorCreateBodyAssets = pydantic.Field(
|
|
47
|
+
alias="assets",
|
|
48
|
+
)
|
|
49
|
+
name: typing.Optional[str] = pydantic.Field(alias="name", default=None)
|
|
50
|
+
style: _SerializerV1AiFaceEditorCreateBodyStyle = pydantic.Field(
|
|
51
|
+
alias="style",
|
|
52
|
+
)
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import pydantic
|
|
2
|
+
import typing_extensions
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class V1AiFaceEditorCreateBodyAssets(typing_extensions.TypedDict):
|
|
6
|
+
"""
|
|
7
|
+
Provide the assets for face editor
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
image_file_path: typing_extensions.Required[str]
|
|
11
|
+
"""
|
|
12
|
+
This is the image whose face will be edited. This value can be either the `file_path` field from the response of the [upload urls API](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls), or the url of the file.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class _SerializerV1AiFaceEditorCreateBodyAssets(pydantic.BaseModel):
|
|
17
|
+
"""
|
|
18
|
+
Serializer for V1AiFaceEditorCreateBodyAssets handling case conversions
|
|
19
|
+
and file omissions as dictated by the API
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
model_config = pydantic.ConfigDict(
|
|
23
|
+
populate_by_name=True,
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
image_file_path: str = pydantic.Field(
|
|
27
|
+
alias="image_file_path",
|
|
28
|
+
)
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import pydantic
|
|
2
|
+
import typing_extensions
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class V1AiFaceEditorCreateBodyStyle(typing_extensions.TypedDict):
|
|
6
|
+
"""
|
|
7
|
+
Face editing parameters
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
enhance_face: typing_extensions.Required[bool]
|
|
11
|
+
"""
|
|
12
|
+
Enhance face features
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
eye_gaze_horizontal: typing_extensions.Required[float]
|
|
16
|
+
"""
|
|
17
|
+
Horizontal eye gaze (-100 to 100), in increments of 5
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
eye_gaze_vertical: typing_extensions.Required[float]
|
|
21
|
+
"""
|
|
22
|
+
Vertical eye gaze (-100 to 100), in increments of 5
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
eye_open_ratio: typing_extensions.Required[float]
|
|
26
|
+
"""
|
|
27
|
+
Eye open ratio (-100 to 100), in increments of 5
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
eyebrow_direction: typing_extensions.Required[float]
|
|
31
|
+
"""
|
|
32
|
+
Eyebrow direction (-100 to 100), in increments of 5
|
|
33
|
+
"""
|
|
34
|
+
|
|
35
|
+
head_pitch: typing_extensions.Required[float]
|
|
36
|
+
"""
|
|
37
|
+
Head pitch (-100 to 100), in increments of 5
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
head_roll: typing_extensions.Required[float]
|
|
41
|
+
"""
|
|
42
|
+
Head roll (-100 to 100), in increments of 5
|
|
43
|
+
"""
|
|
44
|
+
|
|
45
|
+
head_yaw: typing_extensions.Required[float]
|
|
46
|
+
"""
|
|
47
|
+
Head yaw (-100 to 100), in increments of 5
|
|
48
|
+
"""
|
|
49
|
+
|
|
50
|
+
lip_open_ratio: typing_extensions.Required[float]
|
|
51
|
+
"""
|
|
52
|
+
Lip open ratio (-100 to 100), in increments of 5
|
|
53
|
+
"""
|
|
54
|
+
|
|
55
|
+
mouth_grim: typing_extensions.Required[float]
|
|
56
|
+
"""
|
|
57
|
+
Mouth grim (-100 to 100), in increments of 5
|
|
58
|
+
"""
|
|
59
|
+
|
|
60
|
+
mouth_position_horizontal: typing_extensions.Required[float]
|
|
61
|
+
"""
|
|
62
|
+
Horizontal mouth position (-100 to 100), in increments of 5
|
|
63
|
+
"""
|
|
64
|
+
|
|
65
|
+
mouth_position_vertical: typing_extensions.Required[float]
|
|
66
|
+
"""
|
|
67
|
+
Vertical mouth position (-100 to 100), in increments of 5
|
|
68
|
+
"""
|
|
69
|
+
|
|
70
|
+
mouth_pout: typing_extensions.Required[float]
|
|
71
|
+
"""
|
|
72
|
+
Mouth pout (-100 to 100), in increments of 5
|
|
73
|
+
"""
|
|
74
|
+
|
|
75
|
+
mouth_purse: typing_extensions.Required[float]
|
|
76
|
+
"""
|
|
77
|
+
Mouth purse (-100 to 100), in increments of 5
|
|
78
|
+
"""
|
|
79
|
+
|
|
80
|
+
mouth_smile: typing_extensions.Required[float]
|
|
81
|
+
"""
|
|
82
|
+
Mouth smile (-100 to 100), in increments of 5
|
|
83
|
+
"""
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
class _SerializerV1AiFaceEditorCreateBodyStyle(pydantic.BaseModel):
|
|
87
|
+
"""
|
|
88
|
+
Serializer for V1AiFaceEditorCreateBodyStyle handling case conversions
|
|
89
|
+
and file omissions as dictated by the API
|
|
90
|
+
"""
|
|
91
|
+
|
|
92
|
+
model_config = pydantic.ConfigDict(
|
|
93
|
+
populate_by_name=True,
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
enhance_face: bool = pydantic.Field(
|
|
97
|
+
alias="enhance_face",
|
|
98
|
+
)
|
|
99
|
+
eye_gaze_horizontal: float = pydantic.Field(
|
|
100
|
+
alias="eye_gaze_horizontal",
|
|
101
|
+
)
|
|
102
|
+
eye_gaze_vertical: float = pydantic.Field(
|
|
103
|
+
alias="eye_gaze_vertical",
|
|
104
|
+
)
|
|
105
|
+
eye_open_ratio: float = pydantic.Field(
|
|
106
|
+
alias="eye_open_ratio",
|
|
107
|
+
)
|
|
108
|
+
eyebrow_direction: float = pydantic.Field(
|
|
109
|
+
alias="eyebrow_direction",
|
|
110
|
+
)
|
|
111
|
+
head_pitch: float = pydantic.Field(
|
|
112
|
+
alias="head_pitch",
|
|
113
|
+
)
|
|
114
|
+
head_roll: float = pydantic.Field(
|
|
115
|
+
alias="head_roll",
|
|
116
|
+
)
|
|
117
|
+
head_yaw: float = pydantic.Field(
|
|
118
|
+
alias="head_yaw",
|
|
119
|
+
)
|
|
120
|
+
lip_open_ratio: float = pydantic.Field(
|
|
121
|
+
alias="lip_open_ratio",
|
|
122
|
+
)
|
|
123
|
+
mouth_grim: float = pydantic.Field(
|
|
124
|
+
alias="mouth_grim",
|
|
125
|
+
)
|
|
126
|
+
mouth_position_horizontal: float = pydantic.Field(
|
|
127
|
+
alias="mouth_position_horizontal",
|
|
128
|
+
)
|
|
129
|
+
mouth_position_vertical: float = pydantic.Field(
|
|
130
|
+
alias="mouth_position_vertical",
|
|
131
|
+
)
|
|
132
|
+
mouth_pout: float = pydantic.Field(
|
|
133
|
+
alias="mouth_pout",
|
|
134
|
+
)
|
|
135
|
+
mouth_purse: float = pydantic.Field(
|
|
136
|
+
alias="mouth_purse",
|
|
137
|
+
)
|
|
138
|
+
mouth_smile: float = pydantic.Field(
|
|
139
|
+
alias="mouth_smile",
|
|
140
|
+
)
|
|
@@ -23,9 +23,16 @@ class V1FaceSwapCreateBody(typing_extensions.TypedDict):
|
|
|
23
23
|
The end time of the input video in seconds
|
|
24
24
|
"""
|
|
25
25
|
|
|
26
|
-
height: typing_extensions.
|
|
26
|
+
height: typing_extensions.NotRequired[int]
|
|
27
27
|
"""
|
|
28
|
-
|
|
28
|
+
Used to determine the dimensions of the output video.
|
|
29
|
+
|
|
30
|
+
* If height is provided, width will also be required. The larger value between width and height will be used to determine the maximum output resolution while maintaining the original aspect ratio.
|
|
31
|
+
* If both height and width are omitted, the video will be resized according to your subscription's maximum resolution, while preserving aspect ratio.
|
|
32
|
+
|
|
33
|
+
Note: if the video's original resolution is less than the maximum, the video will not be resized.
|
|
34
|
+
|
|
35
|
+
See our [pricing page](https://magichour.ai/pricing) for more details.
|
|
29
36
|
"""
|
|
30
37
|
|
|
31
38
|
name: typing_extensions.NotRequired[str]
|
|
@@ -38,9 +45,16 @@ class V1FaceSwapCreateBody(typing_extensions.TypedDict):
|
|
|
38
45
|
The start time of the input video in seconds
|
|
39
46
|
"""
|
|
40
47
|
|
|
41
|
-
width: typing_extensions.
|
|
48
|
+
width: typing_extensions.NotRequired[int]
|
|
42
49
|
"""
|
|
43
|
-
|
|
50
|
+
Used to determine the dimensions of the output video.
|
|
51
|
+
|
|
52
|
+
* If width is provided, height will also be required. The larger value between width and height will be used to determine the maximum output resolution while maintaining the original aspect ratio.
|
|
53
|
+
* If both height and width are omitted, the video will be resized according to your subscription's maximum resolution, while preserving aspect ratio.
|
|
54
|
+
|
|
55
|
+
Note: if the video's original resolution is less than the maximum, the video will not be resized.
|
|
56
|
+
|
|
57
|
+
See our [pricing page](https://magichour.ai/pricing) for more details.
|
|
44
58
|
"""
|
|
45
59
|
|
|
46
60
|
|
|
@@ -60,13 +74,9 @@ class _SerializerV1FaceSwapCreateBody(pydantic.BaseModel):
|
|
|
60
74
|
end_seconds: float = pydantic.Field(
|
|
61
75
|
alias="end_seconds",
|
|
62
76
|
)
|
|
63
|
-
height: int = pydantic.Field(
|
|
64
|
-
alias="height",
|
|
65
|
-
)
|
|
77
|
+
height: typing.Optional[int] = pydantic.Field(alias="height", default=None)
|
|
66
78
|
name: typing.Optional[str] = pydantic.Field(alias="name", default=None)
|
|
67
79
|
start_seconds: float = pydantic.Field(
|
|
68
80
|
alias="start_seconds",
|
|
69
81
|
)
|
|
70
|
-
width: int = pydantic.Field(
|
|
71
|
-
alias="width",
|
|
72
|
-
)
|
|
82
|
+
width: typing.Optional[int] = pydantic.Field(alias="width", default=None)
|
|
@@ -23,9 +23,16 @@ class V1LipSyncCreateBody(typing_extensions.TypedDict):
|
|
|
23
23
|
The end time of the input video in seconds
|
|
24
24
|
"""
|
|
25
25
|
|
|
26
|
-
height: typing_extensions.
|
|
26
|
+
height: typing_extensions.NotRequired[int]
|
|
27
27
|
"""
|
|
28
|
-
|
|
28
|
+
Used to determine the dimensions of the output video.
|
|
29
|
+
|
|
30
|
+
* If height is provided, width will also be required. The larger value between width and height will be used to determine the maximum output resolution while maintaining the original aspect ratio.
|
|
31
|
+
* If both height and width are omitted, the video will be resized according to your subscription's maximum resolution, while preserving aspect ratio.
|
|
32
|
+
|
|
33
|
+
Note: if the video's original resolution is less than the maximum, the video will not be resized.
|
|
34
|
+
|
|
35
|
+
See our [pricing page](https://magichour.ai/pricing) for more details.
|
|
29
36
|
"""
|
|
30
37
|
|
|
31
38
|
max_fps_limit: typing_extensions.NotRequired[float]
|
|
@@ -43,9 +50,16 @@ class V1LipSyncCreateBody(typing_extensions.TypedDict):
|
|
|
43
50
|
The start time of the input video in seconds
|
|
44
51
|
"""
|
|
45
52
|
|
|
46
|
-
width: typing_extensions.
|
|
53
|
+
width: typing_extensions.NotRequired[int]
|
|
47
54
|
"""
|
|
48
|
-
|
|
55
|
+
Used to determine the dimensions of the output video.
|
|
56
|
+
|
|
57
|
+
* If width is provided, height will also be required. The larger value between width and height will be used to determine the maximum output resolution while maintaining the original aspect ratio.
|
|
58
|
+
* If both height and width are omitted, the video will be resized according to your subscription's maximum resolution, while preserving aspect ratio.
|
|
59
|
+
|
|
60
|
+
Note: if the video's original resolution is less than the maximum, the video will not be resized.
|
|
61
|
+
|
|
62
|
+
See our [pricing page](https://magichour.ai/pricing) for more details.
|
|
49
63
|
"""
|
|
50
64
|
|
|
51
65
|
|
|
@@ -65,9 +79,7 @@ class _SerializerV1LipSyncCreateBody(pydantic.BaseModel):
|
|
|
65
79
|
end_seconds: float = pydantic.Field(
|
|
66
80
|
alias="end_seconds",
|
|
67
81
|
)
|
|
68
|
-
height: int = pydantic.Field(
|
|
69
|
-
alias="height",
|
|
70
|
-
)
|
|
82
|
+
height: typing.Optional[int] = pydantic.Field(alias="height", default=None)
|
|
71
83
|
max_fps_limit: typing.Optional[float] = pydantic.Field(
|
|
72
84
|
alias="max_fps_limit", default=None
|
|
73
85
|
)
|
|
@@ -75,6 +87,4 @@ class _SerializerV1LipSyncCreateBody(pydantic.BaseModel):
|
|
|
75
87
|
start_seconds: float = pydantic.Field(
|
|
76
88
|
alias="start_seconds",
|
|
77
89
|
)
|
|
78
|
-
width: int = pydantic.Field(
|
|
79
|
-
alias="width",
|
|
80
|
-
)
|
|
90
|
+
width: typing.Optional[int] = pydantic.Field(alias="width", default=None)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: magic_hour
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.16.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
|
|
@@ -63,6 +63,10 @@ client = AsyncClient(token="my api key")
|
|
|
63
63
|
|
|
64
64
|
* [create](magic_hour/resources/v1/ai_clothes_changer/README.md#create) - AI Clothes Changer
|
|
65
65
|
|
|
66
|
+
### [v1.ai_face_editor](magic_hour/resources/v1/ai_face_editor/README.md)
|
|
67
|
+
|
|
68
|
+
* [create](magic_hour/resources/v1/ai_face_editor/README.md#create) - AI Face Editor
|
|
69
|
+
|
|
66
70
|
### [v1.ai_headshot_generator](magic_hour/resources/v1/ai_headshot_generator/README.md)
|
|
67
71
|
|
|
68
72
|
* [create](magic_hour/resources/v1/ai_headshot_generator/README.md#create) - AI Headshots
|
|
@@ -10,11 +10,14 @@ 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=
|
|
13
|
+
magic_hour/environment.py,sha256=Ae3RUFor7zNNdoHfyzFhrTI9y8nn3jlMnVrhQpd4lxc,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
|
|
17
17
|
magic_hour/resources/v1/ai_clothes_changer/client.py,sha256=gnhqocjO0GjoGM6dFOKkRWwvDmcOoTV4snL0c96Vm8Y,4009
|
|
18
|
+
magic_hour/resources/v1/ai_face_editor/README.md,sha256=nhTRDxHPVqkd22FNZcZbtpEBqcV-t8-MavSqfuPh00w,1811
|
|
19
|
+
magic_hour/resources/v1/ai_face_editor/__init__.py,sha256=RY8GBMQcqsDFbFcUuK-4LPvablq-U9XmSSlQk4HLKmM,126
|
|
20
|
+
magic_hour/resources/v1/ai_face_editor/client.py,sha256=N5toTWe-Ag2iAhwk-CbWQxGnK6fZ2uHAFEKx15SPl-I,5315
|
|
18
21
|
magic_hour/resources/v1/ai_headshot_generator/README.md,sha256=CWihzwUuDVoLBItSDJKGBW1EQthz2REmkLkaaA68yao,705
|
|
19
22
|
magic_hour/resources/v1/ai_headshot_generator/__init__.py,sha256=4WZ3jfrL2yPhQaPalMJrUEykwUoF3KBtop2VJEij-0s,154
|
|
20
23
|
magic_hour/resources/v1/ai_headshot_generator/client.py,sha256=PoRzXFJCIyGA4PDOZyK6rQ1PHE6EUXSE7ilu_N9RTEc,4159
|
|
@@ -39,10 +42,10 @@ magic_hour/resources/v1/ai_talking_photo/client.py,sha256=TQNwMP3DhDj5jb51diMxcO
|
|
|
39
42
|
magic_hour/resources/v1/animation/README.md,sha256=uIVfUwD7iAOe2eJDgrxj4UyYmq9R30fdI3Z0JuEChc4,1477
|
|
40
43
|
magic_hour/resources/v1/animation/__init__.py,sha256=M6KUe6TEZl_DAdyn1HFQ2kHYanZo6xy3mvUdCN264hQ,114
|
|
41
44
|
magic_hour/resources/v1/animation/client.py,sha256=YYjggl_hszTW-Sn9SFs3m7bz7PvtRTruhHSSnrkkD9c,6401
|
|
42
|
-
magic_hour/resources/v1/client.py,sha256=
|
|
43
|
-
magic_hour/resources/v1/face_swap/README.md,sha256=
|
|
45
|
+
magic_hour/resources/v1/client.py,sha256=rJiIFCbwhYAOraALf0dBb0NmZUNmNYimK87gK5Ke6yQ,6055
|
|
46
|
+
magic_hour/resources/v1/face_swap/README.md,sha256=g5e_eZu3OsrIuc6ISpXbliIX1uVeYX7MwOfdw74dIoI,1306
|
|
44
47
|
magic_hour/resources/v1/face_swap/__init__.py,sha256=lyg5uAHyYHEUVAiAZtP3zwjGCEGqq8IWbQKexVdhr00,110
|
|
45
|
-
magic_hour/resources/v1/face_swap/client.py,sha256
|
|
48
|
+
magic_hour/resources/v1/face_swap/client.py,sha256=-BpJae7J4PZPUG45BMA3HBB2XhrbHpgWqwwyaDFH88A,8519
|
|
46
49
|
magic_hour/resources/v1/face_swap_photo/README.md,sha256=9iGINuGkWn60ZaZgZ4xz0Iho0lvfE-e_YVEA2vId6QU,964
|
|
47
50
|
magic_hour/resources/v1/face_swap_photo/__init__.py,sha256=NZEplYX5kDPL_0qY0Q5tuxhDevipN0otByTYKMmF_1k,130
|
|
48
51
|
magic_hour/resources/v1/face_swap_photo/client.py,sha256=wRkC3o5fJoATrCYvnlw4PfVoSXU_fPDyKtzBozn01Rk,4027
|
|
@@ -60,9 +63,9 @@ magic_hour/resources/v1/image_projects/client.py,sha256=FbqvgvoLFcAjBtqgGtQZMNT8
|
|
|
60
63
|
magic_hour/resources/v1/image_to_video/README.md,sha256=RHo1mqVzymPELMVroYrJN_F4VGzuWuTSufa94iKWcFw,1180
|
|
61
64
|
magic_hour/resources/v1/image_to_video/__init__.py,sha256=tY_ABo6evwKQBRSq-M84lNX-pXqmxoozukmrO6NhCgA,126
|
|
62
65
|
magic_hour/resources/v1/image_to_video/client.py,sha256=m512tJStl0prro97wyIetZ9jWqbVxI83HslnbBBu6Vs,6043
|
|
63
|
-
magic_hour/resources/v1/lip_sync/README.md,sha256=
|
|
66
|
+
magic_hour/resources/v1/lip_sync/README.md,sha256=ycNJtGNz5CXtEKw4XxYoAT2odUQ4TNy6X5c_RZLOcgY,1350
|
|
64
67
|
magic_hour/resources/v1/lip_sync/__init__.py,sha256=MlKUAoHNSKcuNzVyqNfLnLtD_PsqEn3l1TtVpPC1JqQ,106
|
|
65
|
-
magic_hour/resources/v1/lip_sync/client.py,sha256=
|
|
68
|
+
magic_hour/resources/v1/lip_sync/client.py,sha256=LnIzY3bTqSwB0h-44d9Escv7iQAiYsGOSzL4GKn3iMs,9475
|
|
66
69
|
magic_hour/resources/v1/text_to_video/README.md,sha256=ecMH9s8N7DrIL_DkDvrCElbvRGnNxNMvSoX8uHMxyP4,1052
|
|
67
70
|
magic_hour/resources/v1/text_to_video/__init__.py,sha256=F18iHSi9tuYSdgpatznBzb7lbSySNpK-82w96-Om_k4,122
|
|
68
71
|
magic_hour/resources/v1/text_to_video/client.py,sha256=HFFj6a9VaYEzEsa--5lI8HhsS9az-mpDtpIgjV_Nf6M,5028
|
|
@@ -72,8 +75,9 @@ magic_hour/resources/v1/video_projects/client.py,sha256=JvhYhf3phYkdVj8VpWxvxF8q
|
|
|
72
75
|
magic_hour/resources/v1/video_to_video/README.md,sha256=yOIRj1EPTVl8rl15SPWhpc2PZi1ddKGMix8WbaxlXzQ,1630
|
|
73
76
|
magic_hour/resources/v1/video_to_video/__init__.py,sha256=1SHaRLlsrlBkdxxKBYgdbHrGATlRvqlXc22RpjjHaOA,126
|
|
74
77
|
magic_hour/resources/v1/video_to_video/client.py,sha256=dYb2zi8MMhm1YUBFxGhFno4ikbMEjcLrs3JofapyP-s,8368
|
|
75
|
-
magic_hour/types/models/__init__.py,sha256=
|
|
78
|
+
magic_hour/types/models/__init__.py,sha256=YWP-NwqjIBbe7rSk7NtodSMMh5cSdcHkDBtyeu9rCv0,3188
|
|
76
79
|
magic_hour/types/models/v1_ai_clothes_changer_create_response.py,sha256=gpPZLGvSukhBSK2LzTckn4HFcNDseP_XtfwasxzE2uc,625
|
|
80
|
+
magic_hour/types/models/v1_ai_face_editor_create_response.py,sha256=mjeIlBOfcvHy9WrtOh0ZKFwrYZbA3gUY46fQ-fIGHuI,621
|
|
77
81
|
magic_hour/types/models/v1_ai_headshot_generator_create_response.py,sha256=s4OheUpwh5jW1XAP4x_M7j-Xafq_gq9Lbz3NbUsFhs8,628
|
|
78
82
|
magic_hour/types/models/v1_ai_image_generator_create_response.py,sha256=gqRQUTb1dznt9trj5i4vIc2GcPac910ti7EXzz49btc,625
|
|
79
83
|
magic_hour/types/models/v1_ai_image_upscaler_create_response.py,sha256=u5z8WHJA7iT3u3EsTcDuAzwJ9JL9wMi0K93JhahjpGk,624
|
|
@@ -98,9 +102,12 @@ magic_hour/types/models/v1_video_projects_get_response_download.py,sha256=nudDCN
|
|
|
98
102
|
magic_hour/types/models/v1_video_projects_get_response_downloads_item.py,sha256=DlUuLBSGa7jWoozxferkaOsGc4jASItcjjWbBXGu620,410
|
|
99
103
|
magic_hour/types/models/v1_video_projects_get_response_error.py,sha256=49QxnXAmYHcvSWuuhbQZeGlUfqVcO4YwZ414GczQnvA,568
|
|
100
104
|
magic_hour/types/models/v1_video_to_video_create_response.py,sha256=dRQql5qEQvcF0wbGO8M0yabgMef26w5T3JGtgnqLZ-Y,736
|
|
101
|
-
magic_hour/types/params/__init__.py,sha256=
|
|
105
|
+
magic_hour/types/params/__init__.py,sha256=kGSEG0jOI7MgFNwdVwS_viCTHCzATjr8qiAxyG5v30M,9370
|
|
102
106
|
magic_hour/types/params/v1_ai_clothes_changer_create_body.py,sha256=X5koqrTxYLiKcRMqPF7r-VwQzy4r_7k81o1289zHJvo,1006
|
|
103
107
|
magic_hour/types/params/v1_ai_clothes_changer_create_body_assets.py,sha256=GGnXOExxXtnHT9wQpDCEkLHQlQB5MbAbYuU47iHGf70,1509
|
|
108
|
+
magic_hour/types/params/v1_ai_face_editor_create_body.py,sha256=sF7mJbqratllYwQ3slqUTctOndAYnH9BDMJu-49Db-4,1313
|
|
109
|
+
magic_hour/types/params/v1_ai_face_editor_create_body_assets.py,sha256=lhfVPTuAEFWATi5Su0weYlM_Npd5qEu75LexlJP5UZA,843
|
|
110
|
+
magic_hour/types/params/v1_ai_face_editor_create_body_style.py,sha256=yNCL--4tDHR6eOltXh842YO0rcjBilJZxOXMcA6xaT4,3502
|
|
104
111
|
magic_hour/types/params/v1_ai_headshot_generator_create_body.py,sha256=Ydzqxzfo6mMEIUc8R_PTWJujfnTDdzt7Ze4ZYiWxWJM,1405
|
|
105
112
|
magic_hour/types/params/v1_ai_headshot_generator_create_body_assets.py,sha256=Zzb_CjU9PjGIugafxPIY59JiS1wABQRod29hPRm7xLc,908
|
|
106
113
|
magic_hour/types/params/v1_ai_headshot_generator_create_body_style.py,sha256=DrX20IwvAhoO0ETO3aNn4YLpfQM5nbUNyz0pm8AO_38,670
|
|
@@ -121,7 +128,7 @@ magic_hour/types/params/v1_ai_talking_photo_create_body_assets.py,sha256=_xNq6uV
|
|
|
121
128
|
magic_hour/types/params/v1_animation_create_body.py,sha256=QB0zxAhNDV8BEd6vuTAUoZaF2E0PNKwfzV7OrsdueGk,2221
|
|
122
129
|
magic_hour/types/params/v1_animation_create_body_assets.py,sha256=Iot5sbRKLlXCHZS1X5tGICSRKOneBcqaDijYm5_BaUA,1965
|
|
123
130
|
magic_hour/types/params/v1_animation_create_body_style.py,sha256=1ujex1BXQq70rp10Pxs8wkb6pkM7fP6fojTW5ATdXyo,8045
|
|
124
|
-
magic_hour/types/params/v1_face_swap_create_body.py,sha256=
|
|
131
|
+
magic_hour/types/params/v1_face_swap_create_body.py,sha256=ZLxWHSs5NHHeBxBAE-8AEgUwEpEhpYQC4fW9dkmDXxQ,2923
|
|
125
132
|
magic_hour/types/params/v1_face_swap_create_body_assets.py,sha256=CYcleQ4o_YLxRjRiVRwB-L_Cr0WTjsb6417uwdT0fas,1888
|
|
126
133
|
magic_hour/types/params/v1_face_swap_photo_create_body.py,sha256=OYsrz7d7i7eg28bR_YS5ucl6k_bMhmNrOt2dF7MYdM4,979
|
|
127
134
|
magic_hour/types/params/v1_face_swap_photo_create_body_assets.py,sha256=6UV78qJPwT9fgZ-26Zfko8alO4QlN88l5u7gm82Rz60,1279
|
|
@@ -132,14 +139,14 @@ magic_hour/types/params/v1_image_background_remover_create_body_assets.py,sha256
|
|
|
132
139
|
magic_hour/types/params/v1_image_to_video_create_body.py,sha256=jU1k75k6Q30RC1Hf41h2_e2fhQbSydiCKhF_ESTTZKc,2113
|
|
133
140
|
magic_hour/types/params/v1_image_to_video_create_body_assets.py,sha256=J39Jv5Bv9bjMaskHzMfbO5VE6QWh-saN3eWOUPRtuRk,830
|
|
134
141
|
magic_hour/types/params/v1_image_to_video_create_body_style.py,sha256=Q7KKr3i0ed7pj2HtwYW0dHQgY-Jjh9xTxUKxGYcBnU0,1535
|
|
135
|
-
magic_hour/types/params/v1_lip_sync_create_body.py,sha256=
|
|
142
|
+
magic_hour/types/params/v1_lip_sync_create_body.py,sha256=PkmNdjIq7RfS_qMBsbiFEEf7Wl841pggPhCgmY6y8VI,3358
|
|
136
143
|
magic_hour/types/params/v1_lip_sync_create_body_assets.py,sha256=UypixyrVpyyv2nysMgXFj1iyvALCE0D4WRy1D3XEWuI,1883
|
|
137
144
|
magic_hour/types/params/v1_text_to_video_create_body.py,sha256=ax7CQZQ7keVjOWIsYFTQ9lb_PhhwvfMBXzHWX4x1nB8,1436
|
|
138
145
|
magic_hour/types/params/v1_text_to_video_create_body_style.py,sha256=9NTboy7J4efsA8tVub2uOZpmgriiggfOyf5uAodBN3o,1065
|
|
139
146
|
magic_hour/types/params/v1_video_to_video_create_body.py,sha256=iOb3qGXySlI4unyWPAXDmiLMUSHH6ymuDHeiwpmhKeE,2942
|
|
140
147
|
magic_hour/types/params/v1_video_to_video_create_body_assets.py,sha256=_-6iA5d8ndka6iJWyWvlJwzRkQcmurJE6hkg-fDwBmQ,1531
|
|
141
148
|
magic_hour/types/params/v1_video_to_video_create_body_style.py,sha256=2jgpJ3A8LNXksTPQ5pp1tWXtd753zBuhBjA22qqCsTE,5697
|
|
142
|
-
magic_hour-0.
|
|
143
|
-
magic_hour-0.
|
|
144
|
-
magic_hour-0.
|
|
145
|
-
magic_hour-0.
|
|
149
|
+
magic_hour-0.16.0.dist-info/LICENSE,sha256=F3fxj7JXPgB2K0uj8YXRsVss4u-Dgt_-U3V4VXsivNI,1070
|
|
150
|
+
magic_hour-0.16.0.dist-info/METADATA,sha256=0bWtzLewOXK92pkdB3XhOPQ9CFh7sVZrSwfnQevyouE,5158
|
|
151
|
+
magic_hour-0.16.0.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
|
|
152
|
+
magic_hour-0.16.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|