magic_hour 0.9.5__py3-none-any.whl → 0.44.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.
- magic_hour/README.md +34 -0
- magic_hour/__init__.py +1 -1
- magic_hour/client.py +8 -17
- magic_hour/environment.py +13 -1
- magic_hour/helpers/__init__.py +4 -0
- magic_hour/helpers/download.py +77 -0
- magic_hour/helpers/logger.py +8 -0
- magic_hour/resources/v1/README.md +32 -0
- magic_hour/resources/v1/ai_clothes_changer/README.md +94 -5
- magic_hour/resources/v1/ai_clothes_changer/client.py +161 -16
- magic_hour/resources/v1/ai_face_editor/README.md +195 -0
- magic_hour/resources/v1/ai_face_editor/__init__.py +4 -0
- magic_hour/resources/v1/ai_face_editor/client.py +324 -0
- magic_hour/resources/v1/ai_gif_generator/README.md +116 -0
- magic_hour/resources/v1/ai_gif_generator/__init__.py +4 -0
- magic_hour/resources/v1/ai_gif_generator/client.py +257 -0
- magic_hour/resources/v1/ai_headshot_generator/README.md +81 -3
- magic_hour/resources/v1/ai_headshot_generator/client.py +167 -18
- magic_hour/resources/v1/ai_image_editor/README.md +125 -0
- magic_hour/resources/v1/ai_image_editor/__init__.py +4 -0
- magic_hour/resources/v1/ai_image_editor/client.py +290 -0
- magic_hour/resources/v1/ai_image_generator/README.md +99 -5
- magic_hour/resources/v1/ai_image_generator/client.py +170 -24
- magic_hour/resources/v1/ai_image_upscaler/README.md +89 -3
- magic_hour/resources/v1/ai_image_upscaler/client.py +173 -20
- magic_hour/resources/v1/ai_meme_generator/README.md +129 -0
- magic_hour/resources/v1/ai_meme_generator/__init__.py +4 -0
- magic_hour/resources/v1/ai_meme_generator/client.py +253 -0
- magic_hour/resources/v1/ai_photo_editor/README.md +119 -4
- magic_hour/resources/v1/ai_photo_editor/client.py +199 -18
- magic_hour/resources/v1/ai_qr_code_generator/README.md +84 -3
- magic_hour/resources/v1/ai_qr_code_generator/client.py +140 -18
- magic_hour/resources/v1/ai_talking_photo/README.md +137 -0
- magic_hour/resources/v1/ai_talking_photo/__init__.py +4 -0
- magic_hour/resources/v1/ai_talking_photo/client.py +326 -0
- magic_hour/resources/v1/ai_voice_cloner/README.md +62 -0
- magic_hour/resources/v1/ai_voice_cloner/__init__.py +4 -0
- magic_hour/resources/v1/ai_voice_cloner/client.py +272 -0
- magic_hour/resources/v1/ai_voice_generator/README.md +112 -0
- magic_hour/resources/v1/ai_voice_generator/__init__.py +4 -0
- magic_hour/resources/v1/ai_voice_generator/client.py +241 -0
- magic_hour/resources/v1/animation/README.md +128 -6
- magic_hour/resources/v1/animation/client.py +247 -22
- magic_hour/resources/v1/audio_projects/README.md +135 -0
- magic_hour/resources/v1/audio_projects/__init__.py +12 -0
- magic_hour/resources/v1/audio_projects/client.py +310 -0
- magic_hour/resources/v1/audio_projects/client_test.py +520 -0
- magic_hour/resources/v1/auto_subtitle_generator/README.md +128 -0
- magic_hour/resources/v1/auto_subtitle_generator/__init__.py +4 -0
- magic_hour/resources/v1/auto_subtitle_generator/client.py +346 -0
- magic_hour/resources/v1/client.py +75 -1
- magic_hour/resources/v1/face_detection/README.md +157 -0
- magic_hour/resources/v1/face_detection/__init__.py +12 -0
- magic_hour/resources/v1/face_detection/client.py +380 -0
- magic_hour/resources/v1/face_swap/README.md +137 -9
- magic_hour/resources/v1/face_swap/client.py +329 -38
- magic_hour/resources/v1/face_swap_photo/README.md +118 -3
- magic_hour/resources/v1/face_swap_photo/client.py +199 -14
- magic_hour/resources/v1/files/README.md +39 -0
- magic_hour/resources/v1/files/client.py +351 -1
- magic_hour/resources/v1/files/client_test.py +414 -0
- magic_hour/resources/v1/files/upload_urls/README.md +38 -17
- magic_hour/resources/v1/files/upload_urls/client.py +38 -34
- magic_hour/resources/v1/image_background_remover/README.md +96 -5
- magic_hour/resources/v1/image_background_remover/client.py +151 -16
- magic_hour/resources/v1/image_projects/README.md +82 -10
- magic_hour/resources/v1/image_projects/__init__.py +10 -2
- magic_hour/resources/v1/image_projects/client.py +154 -16
- magic_hour/resources/v1/image_projects/client_test.py +527 -0
- magic_hour/resources/v1/image_to_video/README.md +96 -11
- magic_hour/resources/v1/image_to_video/client.py +282 -38
- magic_hour/resources/v1/lip_sync/README.md +112 -9
- magic_hour/resources/v1/lip_sync/client.py +288 -34
- magic_hour/resources/v1/photo_colorizer/README.md +107 -0
- magic_hour/resources/v1/photo_colorizer/__init__.py +4 -0
- magic_hour/resources/v1/photo_colorizer/client.py +248 -0
- magic_hour/resources/v1/text_to_video/README.md +96 -7
- magic_hour/resources/v1/text_to_video/client.py +204 -18
- magic_hour/resources/v1/video_projects/README.md +81 -9
- magic_hour/resources/v1/video_projects/__init__.py +10 -2
- magic_hour/resources/v1/video_projects/client.py +151 -14
- magic_hour/resources/v1/video_projects/client_test.py +527 -0
- magic_hour/resources/v1/video_to_video/README.md +119 -15
- magic_hour/resources/v1/video_to_video/client.py +299 -46
- magic_hour/types/models/__init__.py +92 -56
- magic_hour/types/models/v1_ai_clothes_changer_create_response.py +33 -0
- magic_hour/types/models/v1_ai_face_editor_create_response.py +33 -0
- magic_hour/types/models/v1_ai_gif_generator_create_response.py +33 -0
- magic_hour/types/models/v1_ai_headshot_generator_create_response.py +33 -0
- magic_hour/types/models/v1_ai_image_editor_create_response.py +33 -0
- magic_hour/types/models/v1_ai_image_generator_create_response.py +33 -0
- magic_hour/types/models/v1_ai_image_upscaler_create_response.py +33 -0
- magic_hour/types/models/v1_ai_meme_generator_create_response.py +33 -0
- magic_hour/types/models/v1_ai_photo_editor_create_response.py +33 -0
- magic_hour/types/models/v1_ai_qr_code_generator_create_response.py +33 -0
- magic_hour/types/models/v1_ai_talking_photo_create_response.py +35 -0
- magic_hour/types/models/v1_ai_voice_cloner_create_response.py +27 -0
- magic_hour/types/models/v1_ai_voice_generator_create_response.py +27 -0
- magic_hour/types/models/v1_animation_create_response.py +35 -0
- magic_hour/types/models/v1_audio_projects_get_response.py +72 -0
- magic_hour/types/models/v1_audio_projects_get_response_downloads_item.py +19 -0
- magic_hour/types/models/{get_v1_image_projects_id_response_error.py → v1_audio_projects_get_response_error.py} +2 -2
- magic_hour/types/models/v1_auto_subtitle_generator_create_response.py +35 -0
- magic_hour/types/models/v1_face_detection_create_response.py +25 -0
- magic_hour/types/models/v1_face_detection_get_response.py +45 -0
- magic_hour/types/models/v1_face_detection_get_response_faces_item.py +25 -0
- magic_hour/types/models/v1_face_swap_create_response.py +35 -0
- magic_hour/types/models/v1_face_swap_photo_create_response.py +33 -0
- magic_hour/types/models/v1_files_upload_urls_create_response.py +24 -0
- magic_hour/types/models/{post_v1_files_upload_urls_response_items_item.py → v1_files_upload_urls_create_response_items_item.py} +2 -2
- magic_hour/types/models/v1_image_background_remover_create_response.py +33 -0
- magic_hour/types/models/{get_v1_image_projects_id_response.py → v1_image_projects_get_response.py} +20 -18
- magic_hour/types/models/{get_v1_video_projects_id_response_downloads_item.py → v1_image_projects_get_response_downloads_item.py} +1 -1
- magic_hour/types/models/{get_v1_video_projects_id_response_error.py → v1_image_projects_get_response_error.py} +2 -2
- magic_hour/types/models/v1_image_to_video_create_response.py +35 -0
- magic_hour/types/models/v1_lip_sync_create_response.py +35 -0
- magic_hour/types/models/v1_photo_colorizer_create_response.py +33 -0
- magic_hour/types/models/v1_text_to_video_create_response.py +35 -0
- magic_hour/types/models/{get_v1_video_projects_id_response.py → v1_video_projects_get_response.py} +26 -23
- magic_hour/types/models/{get_v1_video_projects_id_response_download.py → v1_video_projects_get_response_download.py} +1 -1
- magic_hour/types/models/{get_v1_image_projects_id_response_downloads_item.py → v1_video_projects_get_response_downloads_item.py} +1 -1
- magic_hour/types/models/v1_video_projects_get_response_error.py +25 -0
- magic_hour/types/models/v1_video_to_video_create_response.py +35 -0
- magic_hour/types/params/__init__.py +422 -176
- magic_hour/types/params/v1_ai_clothes_changer_create_body.py +40 -0
- magic_hour/types/params/v1_ai_clothes_changer_create_body_assets.py +58 -0
- magic_hour/types/params/v1_ai_clothes_changer_generate_body_assets.py +33 -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 +33 -0
- magic_hour/types/params/v1_ai_face_editor_create_body_style.py +137 -0
- magic_hour/types/params/v1_ai_face_editor_generate_body_assets.py +17 -0
- magic_hour/types/params/v1_ai_gif_generator_create_body.py +47 -0
- magic_hour/types/params/{post_v1_ai_image_generator_body_style.py → v1_ai_gif_generator_create_body_style.py} +5 -5
- magic_hour/types/params/v1_ai_headshot_generator_create_body.py +49 -0
- magic_hour/types/params/v1_ai_headshot_generator_create_body_assets.py +33 -0
- magic_hour/types/params/v1_ai_headshot_generator_create_body_style.py +27 -0
- magic_hour/types/params/v1_ai_headshot_generator_generate_body_assets.py +17 -0
- magic_hour/types/params/v1_ai_image_editor_create_body.py +49 -0
- magic_hour/types/params/v1_ai_image_editor_create_body_assets.py +47 -0
- magic_hour/types/params/v1_ai_image_editor_create_body_style.py +41 -0
- magic_hour/types/params/v1_ai_image_editor_generate_body_assets.py +28 -0
- magic_hour/types/params/{post_v1_ai_image_generator_body.py → v1_ai_image_generator_create_body.py} +17 -11
- magic_hour/types/params/v1_ai_image_generator_create_body_style.py +127 -0
- magic_hour/types/params/v1_ai_image_upscaler_create_body.py +59 -0
- magic_hour/types/params/v1_ai_image_upscaler_create_body_assets.py +33 -0
- magic_hour/types/params/{post_v1_ai_image_upscaler_body_style.py → v1_ai_image_upscaler_create_body_style.py} +4 -4
- magic_hour/types/params/v1_ai_image_upscaler_generate_body_assets.py +17 -0
- magic_hour/types/params/v1_ai_meme_generator_create_body.py +37 -0
- magic_hour/types/params/v1_ai_meme_generator_create_body_style.py +73 -0
- magic_hour/types/params/{post_v1_ai_photo_editor_body.py → v1_ai_photo_editor_create_body.py} +15 -15
- magic_hour/types/params/v1_ai_photo_editor_create_body_assets.py +33 -0
- magic_hour/types/params/{post_v1_ai_photo_editor_body_style.py → v1_ai_photo_editor_create_body_style.py} +20 -4
- magic_hour/types/params/v1_ai_photo_editor_generate_body_assets.py +17 -0
- magic_hour/types/params/v1_ai_qr_code_generator_create_body.py +45 -0
- magic_hour/types/params/{post_v1_ai_qr_code_generator_body_style.py → v1_ai_qr_code_generator_create_body_style.py} +4 -4
- magic_hour/types/params/v1_ai_talking_photo_create_body.py +68 -0
- magic_hour/types/params/v1_ai_talking_photo_create_body_assets.py +46 -0
- magic_hour/types/params/v1_ai_talking_photo_create_body_style.py +44 -0
- magic_hour/types/params/v1_ai_talking_photo_generate_body_assets.py +26 -0
- magic_hour/types/params/v1_ai_voice_cloner_create_body.py +49 -0
- magic_hour/types/params/v1_ai_voice_cloner_create_body_assets.py +33 -0
- magic_hour/types/params/v1_ai_voice_cloner_create_body_style.py +28 -0
- magic_hour/types/params/v1_ai_voice_cloner_generate_body_assets.py +28 -0
- magic_hour/types/params/v1_ai_voice_generator_create_body.py +40 -0
- magic_hour/types/params/v1_ai_voice_generator_create_body_style.py +440 -0
- magic_hour/types/params/{post_v1_animation_body.py → v1_animation_create_body.py} +16 -16
- magic_hour/types/params/{post_v1_animation_body_assets.py → v1_animation_create_body_assets.py} +15 -5
- magic_hour/types/params/{post_v1_animation_body_style.py → v1_animation_create_body_style.py} +13 -10
- magic_hour/types/params/v1_animation_generate_body_assets.py +39 -0
- magic_hour/types/params/v1_auto_subtitle_generator_create_body.py +78 -0
- magic_hour/types/params/v1_auto_subtitle_generator_create_body_assets.py +33 -0
- magic_hour/types/params/v1_auto_subtitle_generator_create_body_style.py +56 -0
- magic_hour/types/params/v1_auto_subtitle_generator_create_body_style_custom_config.py +86 -0
- magic_hour/types/params/v1_auto_subtitle_generator_generate_body_assets.py +17 -0
- magic_hour/types/params/v1_face_detection_create_body.py +44 -0
- magic_hour/types/params/v1_face_detection_create_body_assets.py +33 -0
- magic_hour/types/params/v1_face_detection_generate_body_assets.py +17 -0
- magic_hour/types/params/v1_face_swap_create_body.py +92 -0
- magic_hour/types/params/v1_face_swap_create_body_assets.py +91 -0
- magic_hour/types/params/v1_face_swap_create_body_assets_face_mappings_item.py +44 -0
- magic_hour/types/params/v1_face_swap_create_body_style.py +33 -0
- magic_hour/types/params/v1_face_swap_generate_body_assets.py +56 -0
- magic_hour/types/params/v1_face_swap_generate_body_assets_face_mappings_item.py +25 -0
- magic_hour/types/params/v1_face_swap_photo_create_body.py +40 -0
- magic_hour/types/params/v1_face_swap_photo_create_body_assets.py +76 -0
- magic_hour/types/params/v1_face_swap_photo_create_body_assets_face_mappings_item.py +44 -0
- magic_hour/types/params/v1_face_swap_photo_generate_body_assets.py +47 -0
- magic_hour/types/params/v1_face_swap_photo_generate_body_assets_face_mappings_item.py +25 -0
- magic_hour/types/params/v1_files_upload_urls_create_body.py +36 -0
- magic_hour/types/params/v1_files_upload_urls_create_body_items_item.py +38 -0
- magic_hour/types/params/v1_image_background_remover_create_body.py +40 -0
- magic_hour/types/params/v1_image_background_remover_create_body_assets.py +49 -0
- magic_hour/types/params/v1_image_background_remover_generate_body_assets.py +27 -0
- magic_hour/types/params/v1_image_to_video_create_body.py +101 -0
- magic_hour/types/params/v1_image_to_video_create_body_assets.py +33 -0
- magic_hour/types/params/v1_image_to_video_create_body_style.py +53 -0
- magic_hour/types/params/v1_image_to_video_generate_body_assets.py +17 -0
- magic_hour/types/params/v1_lip_sync_create_body.py +100 -0
- magic_hour/types/params/{post_v1_lip_sync_body_assets.py → v1_lip_sync_create_body_assets.py} +15 -5
- magic_hour/types/params/v1_lip_sync_create_body_style.py +37 -0
- magic_hour/types/params/v1_lip_sync_generate_body_assets.py +36 -0
- magic_hour/types/params/v1_photo_colorizer_create_body.py +40 -0
- magic_hour/types/params/v1_photo_colorizer_create_body_assets.py +33 -0
- magic_hour/types/params/v1_photo_colorizer_generate_body_assets.py +17 -0
- magic_hour/types/params/v1_text_to_video_create_body.py +78 -0
- magic_hour/types/params/v1_text_to_video_create_body_style.py +43 -0
- magic_hour/types/params/v1_video_to_video_create_body.py +101 -0
- magic_hour/types/params/{post_v1_video_to_video_body_assets.py → v1_video_to_video_create_body_assets.py} +9 -4
- magic_hour/types/params/{post_v1_video_to_video_body_style.py → v1_video_to_video_create_body_style.py} +68 -26
- magic_hour/types/params/v1_video_to_video_generate_body_assets.py +27 -0
- magic_hour-0.44.0.dist-info/METADATA +328 -0
- magic_hour-0.44.0.dist-info/RECORD +231 -0
- magic_hour/core/__init__.py +0 -52
- magic_hour/core/api_error.py +0 -56
- magic_hour/core/auth.py +0 -314
- magic_hour/core/base_client.py +0 -618
- magic_hour/core/binary_response.py +0 -23
- magic_hour/core/query.py +0 -106
- magic_hour/core/request.py +0 -156
- magic_hour/core/response.py +0 -293
- magic_hour/core/type_utils.py +0 -28
- magic_hour/core/utils.py +0 -55
- magic_hour/types/models/post_v1_ai_clothes_changer_response.py +0 -25
- magic_hour/types/models/post_v1_ai_headshot_generator_response.py +0 -25
- magic_hour/types/models/post_v1_ai_image_generator_response.py +0 -25
- magic_hour/types/models/post_v1_ai_image_upscaler_response.py +0 -25
- magic_hour/types/models/post_v1_ai_photo_editor_response.py +0 -25
- magic_hour/types/models/post_v1_ai_qr_code_generator_response.py +0 -25
- magic_hour/types/models/post_v1_animation_response.py +0 -25
- magic_hour/types/models/post_v1_face_swap_photo_response.py +0 -25
- magic_hour/types/models/post_v1_face_swap_response.py +0 -25
- magic_hour/types/models/post_v1_files_upload_urls_response.py +0 -21
- magic_hour/types/models/post_v1_image_background_remover_response.py +0 -25
- magic_hour/types/models/post_v1_image_to_video_response.py +0 -25
- magic_hour/types/models/post_v1_lip_sync_response.py +0 -25
- magic_hour/types/models/post_v1_text_to_video_response.py +0 -25
- magic_hour/types/models/post_v1_video_to_video_response.py +0 -25
- magic_hour/types/params/post_v1_ai_clothes_changer_body.py +0 -40
- magic_hour/types/params/post_v1_ai_clothes_changer_body_assets.py +0 -45
- magic_hour/types/params/post_v1_ai_headshot_generator_body.py +0 -40
- magic_hour/types/params/post_v1_ai_headshot_generator_body_assets.py +0 -28
- magic_hour/types/params/post_v1_ai_image_upscaler_body.py +0 -57
- magic_hour/types/params/post_v1_ai_image_upscaler_body_assets.py +0 -28
- magic_hour/types/params/post_v1_ai_photo_editor_body_assets.py +0 -28
- magic_hour/types/params/post_v1_ai_qr_code_generator_body.py +0 -45
- magic_hour/types/params/post_v1_face_swap_body.py +0 -72
- magic_hour/types/params/post_v1_face_swap_body_assets.py +0 -52
- magic_hour/types/params/post_v1_face_swap_photo_body.py +0 -40
- magic_hour/types/params/post_v1_face_swap_photo_body_assets.py +0 -36
- magic_hour/types/params/post_v1_files_upload_urls_body.py +0 -31
- magic_hour/types/params/post_v1_files_upload_urls_body_items_item.py +0 -38
- magic_hour/types/params/post_v1_image_background_remover_body.py +0 -40
- magic_hour/types/params/post_v1_image_background_remover_body_assets.py +0 -28
- magic_hour/types/params/post_v1_image_to_video_body.py +0 -73
- magic_hour/types/params/post_v1_image_to_video_body_assets.py +0 -28
- magic_hour/types/params/post_v1_image_to_video_body_style.py +0 -37
- magic_hour/types/params/post_v1_lip_sync_body.py +0 -80
- magic_hour/types/params/post_v1_text_to_video_body.py +0 -57
- magic_hour/types/params/post_v1_text_to_video_body_style.py +0 -28
- magic_hour/types/params/post_v1_video_to_video_body.py +0 -93
- magic_hour-0.9.5.dist-info/METADATA +0 -133
- magic_hour-0.9.5.dist-info/RECORD +0 -132
- {magic_hour-0.9.5.dist-info → magic_hour-0.44.0.dist-info}/LICENSE +0 -0
- {magic_hour-0.9.5.dist-info → magic_hour-0.44.0.dist-info}/WHEEL +0 -0
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
import typing
|
|
2
2
|
|
|
3
|
-
from magic_hour.
|
|
3
|
+
from magic_hour.helpers.logger import get_sdk_logger
|
|
4
|
+
from magic_hour.resources.v1.files.client import AsyncFilesClient, FilesClient
|
|
5
|
+
from magic_hour.resources.v1.image_projects.client import (
|
|
6
|
+
AsyncImageProjectsClient,
|
|
7
|
+
ImageProjectsClient,
|
|
8
|
+
)
|
|
9
|
+
from magic_hour.types import models, params
|
|
10
|
+
from make_api_request import (
|
|
4
11
|
AsyncBaseClient,
|
|
5
12
|
RequestOptions,
|
|
6
13
|
SyncBaseClient,
|
|
@@ -8,31 +15,112 @@ from magic_hour.core import (
|
|
|
8
15
|
to_encodable,
|
|
9
16
|
type_utils,
|
|
10
17
|
)
|
|
11
|
-
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
logger = get_sdk_logger(__name__)
|
|
12
21
|
|
|
13
22
|
|
|
14
23
|
class FaceSwapPhotoClient:
|
|
15
24
|
def __init__(self, *, base_client: SyncBaseClient):
|
|
16
25
|
self._base_client = base_client
|
|
17
26
|
|
|
27
|
+
def generate(
|
|
28
|
+
self,
|
|
29
|
+
*,
|
|
30
|
+
assets: params.V1FaceSwapPhotoGenerateBodyAssets,
|
|
31
|
+
name: typing.Union[
|
|
32
|
+
typing.Optional[str], type_utils.NotGiven
|
|
33
|
+
] = type_utils.NOT_GIVEN,
|
|
34
|
+
wait_for_completion: bool = True,
|
|
35
|
+
download_outputs: bool = True,
|
|
36
|
+
download_directory: typing.Optional[str] = None,
|
|
37
|
+
request_options: typing.Optional[RequestOptions] = None,
|
|
38
|
+
):
|
|
39
|
+
"""
|
|
40
|
+
Generate face swap photo (alias for create with additional functionality).
|
|
41
|
+
|
|
42
|
+
Swap faces in a photo using AI. Each face swap costs 5 credits.
|
|
43
|
+
|
|
44
|
+
Args:
|
|
45
|
+
name: The name of image. This value is mainly used for your own identification of the image.
|
|
46
|
+
assets: Provide the assets for face swap photo
|
|
47
|
+
wait_for_completion: Whether to wait for the image project to complete
|
|
48
|
+
download_outputs: Whether to download the outputs
|
|
49
|
+
download_directory: The directory to download the outputs to. If not provided, the outputs will be downloaded to the current working directory
|
|
50
|
+
request_options: Additional options to customize the HTTP request
|
|
51
|
+
|
|
52
|
+
Returns:
|
|
53
|
+
V1ImageProjectsGetResponseWithDownloads: The response from the Face Swap Photo API with the downloaded paths if `download_outputs` is True.
|
|
54
|
+
|
|
55
|
+
Examples:
|
|
56
|
+
```py
|
|
57
|
+
client.v1.face_swap_photo.generate(
|
|
58
|
+
assets={
|
|
59
|
+
"face_swap_mode": "all-faces",
|
|
60
|
+
"source_file_path": "api-assets/id/1234.png",
|
|
61
|
+
"target_file_path": "api-assets/id/1234.png",
|
|
62
|
+
},
|
|
63
|
+
name="Face Swap image",
|
|
64
|
+
wait_for_completion=True,
|
|
65
|
+
download_outputs=True,
|
|
66
|
+
download_directory="./outputs/",
|
|
67
|
+
)
|
|
68
|
+
```
|
|
69
|
+
"""
|
|
70
|
+
|
|
71
|
+
file_client = FilesClient(base_client=self._base_client)
|
|
72
|
+
|
|
73
|
+
# Upload source image file if present
|
|
74
|
+
if "source_file_path" in assets and assets["source_file_path"]:
|
|
75
|
+
source_file_path = assets["source_file_path"]
|
|
76
|
+
assets["source_file_path"] = file_client.upload_file(file=source_file_path)
|
|
77
|
+
|
|
78
|
+
# Upload target image file
|
|
79
|
+
target_file_path = assets["target_file_path"]
|
|
80
|
+
assets["target_file_path"] = file_client.upload_file(file=target_file_path)
|
|
81
|
+
|
|
82
|
+
# Upload face mappings if present
|
|
83
|
+
if "face_mappings" in assets and assets["face_mappings"]:
|
|
84
|
+
for face_mapping in assets["face_mappings"]:
|
|
85
|
+
if "new_face" in face_mapping and face_mapping["new_face"]:
|
|
86
|
+
new_face_file_path = face_mapping["new_face"]
|
|
87
|
+
face_mapping["new_face"] = file_client.upload_file(
|
|
88
|
+
file=new_face_file_path
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
create_response = self.create(
|
|
92
|
+
assets=assets, name=name, request_options=request_options
|
|
93
|
+
)
|
|
94
|
+
logger.info(f"Face Swap Photo response: {create_response}")
|
|
95
|
+
|
|
96
|
+
image_projects_client = ImageProjectsClient(base_client=self._base_client)
|
|
97
|
+
response = image_projects_client.check_result(
|
|
98
|
+
id=create_response.id,
|
|
99
|
+
wait_for_completion=wait_for_completion,
|
|
100
|
+
download_outputs=download_outputs,
|
|
101
|
+
download_directory=download_directory,
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
return response
|
|
105
|
+
|
|
18
106
|
def create(
|
|
19
107
|
self,
|
|
20
108
|
*,
|
|
21
|
-
assets: params.
|
|
109
|
+
assets: params.V1FaceSwapPhotoCreateBodyAssets,
|
|
22
110
|
name: typing.Union[
|
|
23
111
|
typing.Optional[str], type_utils.NotGiven
|
|
24
112
|
] = type_utils.NOT_GIVEN,
|
|
25
113
|
request_options: typing.Optional[RequestOptions] = None,
|
|
26
|
-
) -> models.
|
|
114
|
+
) -> models.V1FaceSwapPhotoCreateResponse:
|
|
27
115
|
"""
|
|
28
116
|
Face Swap Photo
|
|
29
117
|
|
|
30
|
-
Create a face swap photo. Each photo costs 5
|
|
118
|
+
Create a face swap photo. Each photo costs 5 credits. The height/width of the output image depends on your subscription. Please refer to our [pricing](https://magichour.ai/pricing) page for more details
|
|
31
119
|
|
|
32
120
|
POST /v1/face-swap-photo
|
|
33
121
|
|
|
34
122
|
Args:
|
|
35
|
-
name: The name of image
|
|
123
|
+
name: The name of image. This value is mainly used for your own identification of the image.
|
|
36
124
|
assets: Provide the assets for face swap photo
|
|
37
125
|
request_options: Additional options to customize the HTTP request
|
|
38
126
|
|
|
@@ -47,6 +135,13 @@ class FaceSwapPhotoClient:
|
|
|
47
135
|
```py
|
|
48
136
|
client.v1.face_swap_photo.create(
|
|
49
137
|
assets={
|
|
138
|
+
"face_mappings": [
|
|
139
|
+
{
|
|
140
|
+
"new_face": "api-assets/id/1234.png",
|
|
141
|
+
"original_face": "api-assets/id/0-0.png",
|
|
142
|
+
}
|
|
143
|
+
],
|
|
144
|
+
"face_swap_mode": "all-faces",
|
|
50
145
|
"source_file_path": "api-assets/id/1234.png",
|
|
51
146
|
"target_file_path": "api-assets/id/1234.png",
|
|
52
147
|
},
|
|
@@ -56,14 +151,14 @@ class FaceSwapPhotoClient:
|
|
|
56
151
|
"""
|
|
57
152
|
_json = to_encodable(
|
|
58
153
|
item={"name": name, "assets": assets},
|
|
59
|
-
dump_with=params.
|
|
154
|
+
dump_with=params._SerializerV1FaceSwapPhotoCreateBody,
|
|
60
155
|
)
|
|
61
156
|
return self._base_client.request(
|
|
62
157
|
method="POST",
|
|
63
158
|
path="/v1/face-swap-photo",
|
|
64
159
|
auth_names=["bearerAuth"],
|
|
65
160
|
json=_json,
|
|
66
|
-
cast_to=models.
|
|
161
|
+
cast_to=models.V1FaceSwapPhotoCreateResponse,
|
|
67
162
|
request_options=request_options or default_request_options(),
|
|
68
163
|
)
|
|
69
164
|
|
|
@@ -72,24 +167,107 @@ class AsyncFaceSwapPhotoClient:
|
|
|
72
167
|
def __init__(self, *, base_client: AsyncBaseClient):
|
|
73
168
|
self._base_client = base_client
|
|
74
169
|
|
|
170
|
+
async def generate(
|
|
171
|
+
self,
|
|
172
|
+
*,
|
|
173
|
+
assets: params.V1FaceSwapPhotoGenerateBodyAssets,
|
|
174
|
+
name: typing.Union[
|
|
175
|
+
typing.Optional[str], type_utils.NotGiven
|
|
176
|
+
] = type_utils.NOT_GIVEN,
|
|
177
|
+
wait_for_completion: bool = True,
|
|
178
|
+
download_outputs: bool = True,
|
|
179
|
+
download_directory: typing.Optional[str] = None,
|
|
180
|
+
request_options: typing.Optional[RequestOptions] = None,
|
|
181
|
+
):
|
|
182
|
+
"""
|
|
183
|
+
Generate face swap photo (alias for create with additional functionality).
|
|
184
|
+
|
|
185
|
+
Swap faces in a photo using AI. Each face swap costs 5 credits.
|
|
186
|
+
|
|
187
|
+
Args:
|
|
188
|
+
name: The name of image. This value is mainly used for your own identification of the image.
|
|
189
|
+
assets: Provide the assets for face swap photo
|
|
190
|
+
wait_for_completion: Whether to wait for the image project to complete
|
|
191
|
+
download_outputs: Whether to download the outputs
|
|
192
|
+
download_directory: The directory to download the outputs to. If not provided, the outputs will be downloaded to the current working directory
|
|
193
|
+
request_options: Additional options to customize the HTTP request
|
|
194
|
+
|
|
195
|
+
Returns:
|
|
196
|
+
V1ImageProjectsGetResponseWithDownloads: The response from the Face Swap Photo API with the downloaded paths if `download_outputs` is True.
|
|
197
|
+
|
|
198
|
+
Examples:
|
|
199
|
+
```py
|
|
200
|
+
await client.v1.face_swap_photo.generate(
|
|
201
|
+
assets={
|
|
202
|
+
"face_swap_mode": "all-faces",
|
|
203
|
+
"source_file_path": "api-assets/id/1234.png",
|
|
204
|
+
"target_file_path": "api-assets/id/1234.png",
|
|
205
|
+
},
|
|
206
|
+
name="Face Swap image",
|
|
207
|
+
wait_for_completion=True,
|
|
208
|
+
download_outputs=True,
|
|
209
|
+
download_directory="./outputs/",
|
|
210
|
+
)
|
|
211
|
+
```
|
|
212
|
+
"""
|
|
213
|
+
|
|
214
|
+
file_client = AsyncFilesClient(base_client=self._base_client)
|
|
215
|
+
|
|
216
|
+
# Upload source image file if present
|
|
217
|
+
if "source_file_path" in assets and assets["source_file_path"]:
|
|
218
|
+
source_file_path = assets["source_file_path"]
|
|
219
|
+
assets["source_file_path"] = await file_client.upload_file(
|
|
220
|
+
file=source_file_path
|
|
221
|
+
)
|
|
222
|
+
|
|
223
|
+
# Upload target image file
|
|
224
|
+
target_file_path = assets["target_file_path"]
|
|
225
|
+
assets["target_file_path"] = await file_client.upload_file(
|
|
226
|
+
file=target_file_path
|
|
227
|
+
)
|
|
228
|
+
|
|
229
|
+
# Upload face mappings if present
|
|
230
|
+
if "face_mappings" in assets and assets["face_mappings"]:
|
|
231
|
+
for face_mapping in assets["face_mappings"]:
|
|
232
|
+
if "new_face" in face_mapping and face_mapping["new_face"]:
|
|
233
|
+
new_face_file_path = face_mapping["new_face"]
|
|
234
|
+
face_mapping["new_face"] = await file_client.upload_file(
|
|
235
|
+
file=new_face_file_path
|
|
236
|
+
)
|
|
237
|
+
|
|
238
|
+
create_response = await self.create(
|
|
239
|
+
assets=assets, name=name, request_options=request_options
|
|
240
|
+
)
|
|
241
|
+
logger.info(f"Face Swap Photo response: {create_response}")
|
|
242
|
+
|
|
243
|
+
image_projects_client = AsyncImageProjectsClient(base_client=self._base_client)
|
|
244
|
+
response = await image_projects_client.check_result(
|
|
245
|
+
id=create_response.id,
|
|
246
|
+
wait_for_completion=wait_for_completion,
|
|
247
|
+
download_outputs=download_outputs,
|
|
248
|
+
download_directory=download_directory,
|
|
249
|
+
)
|
|
250
|
+
|
|
251
|
+
return response
|
|
252
|
+
|
|
75
253
|
async def create(
|
|
76
254
|
self,
|
|
77
255
|
*,
|
|
78
|
-
assets: params.
|
|
256
|
+
assets: params.V1FaceSwapPhotoCreateBodyAssets,
|
|
79
257
|
name: typing.Union[
|
|
80
258
|
typing.Optional[str], type_utils.NotGiven
|
|
81
259
|
] = type_utils.NOT_GIVEN,
|
|
82
260
|
request_options: typing.Optional[RequestOptions] = None,
|
|
83
|
-
) -> models.
|
|
261
|
+
) -> models.V1FaceSwapPhotoCreateResponse:
|
|
84
262
|
"""
|
|
85
263
|
Face Swap Photo
|
|
86
264
|
|
|
87
|
-
Create a face swap photo. Each photo costs 5
|
|
265
|
+
Create a face swap photo. Each photo costs 5 credits. The height/width of the output image depends on your subscription. Please refer to our [pricing](https://magichour.ai/pricing) page for more details
|
|
88
266
|
|
|
89
267
|
POST /v1/face-swap-photo
|
|
90
268
|
|
|
91
269
|
Args:
|
|
92
|
-
name: The name of image
|
|
270
|
+
name: The name of image. This value is mainly used for your own identification of the image.
|
|
93
271
|
assets: Provide the assets for face swap photo
|
|
94
272
|
request_options: Additional options to customize the HTTP request
|
|
95
273
|
|
|
@@ -104,6 +282,13 @@ class AsyncFaceSwapPhotoClient:
|
|
|
104
282
|
```py
|
|
105
283
|
await client.v1.face_swap_photo.create(
|
|
106
284
|
assets={
|
|
285
|
+
"face_mappings": [
|
|
286
|
+
{
|
|
287
|
+
"new_face": "api-assets/id/1234.png",
|
|
288
|
+
"original_face": "api-assets/id/0-0.png",
|
|
289
|
+
}
|
|
290
|
+
],
|
|
291
|
+
"face_swap_mode": "all-faces",
|
|
107
292
|
"source_file_path": "api-assets/id/1234.png",
|
|
108
293
|
"target_file_path": "api-assets/id/1234.png",
|
|
109
294
|
},
|
|
@@ -113,13 +298,13 @@ class AsyncFaceSwapPhotoClient:
|
|
|
113
298
|
"""
|
|
114
299
|
_json = to_encodable(
|
|
115
300
|
item={"name": name, "assets": assets},
|
|
116
|
-
dump_with=params.
|
|
301
|
+
dump_with=params._SerializerV1FaceSwapPhotoCreateBody,
|
|
117
302
|
)
|
|
118
303
|
return await self._base_client.request(
|
|
119
304
|
method="POST",
|
|
120
305
|
path="/v1/face-swap-photo",
|
|
121
306
|
auth_names=["bearerAuth"],
|
|
122
307
|
json=_json,
|
|
123
|
-
cast_to=models.
|
|
308
|
+
cast_to=models.V1FaceSwapPhotoCreateResponse,
|
|
124
309
|
request_options=request_options or default_request_options(),
|
|
125
310
|
)
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# v1.files
|
|
2
|
+
|
|
3
|
+
<!-- CUSTOM DOCS START -->
|
|
4
|
+
|
|
5
|
+
### Upload File <a name="upload-file"></a>
|
|
6
|
+
|
|
7
|
+
Upload a local file to Magic Hour Storage. The returned value is used for subsequent API calls.
|
|
8
|
+
|
|
9
|
+
#### Parameters
|
|
10
|
+
|
|
11
|
+
| Parameter | Required | Description | Example |
|
|
12
|
+
| --------- | :------: | ------------------------------------------------------------------- | ------------------ |
|
|
13
|
+
| `file` | ✓ | A local file path, path like object, file URL, or file like object. | `"/tmp/image.png"` |
|
|
14
|
+
|
|
15
|
+
#### Synchronous Client
|
|
16
|
+
|
|
17
|
+
```python
|
|
18
|
+
from magic_hour import Client
|
|
19
|
+
from os import getenv
|
|
20
|
+
|
|
21
|
+
client = Client(token=getenv("API_TOKEN"))
|
|
22
|
+
file_path = client.v1.files.upload_file("/path/to/your/image.jpg")
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
#### Asynchronous Client
|
|
26
|
+
|
|
27
|
+
```python
|
|
28
|
+
from magic_hour import AsyncClient
|
|
29
|
+
from os import getenv
|
|
30
|
+
|
|
31
|
+
client = AsyncClient(token=getenv("API_TOKEN"))
|
|
32
|
+
file_path = await client.v1.files.upload_file("/path/to/your/image.jpg")
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
<!-- CUSTOM DOCS END -->
|
|
36
|
+
|
|
37
|
+
## Submodules
|
|
38
|
+
|
|
39
|
+
- [upload_urls](upload_urls/README.md) - upload_urls
|