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.video_projects.client import (
|
|
6
|
+
AsyncVideoProjectsClient,
|
|
7
|
+
VideoProjectsClient,
|
|
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,47 +15,173 @@ 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 LipSyncClient:
|
|
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.V1LipSyncGenerateBodyAssets,
|
|
31
|
+
end_seconds: float,
|
|
32
|
+
start_seconds: float,
|
|
33
|
+
height: typing.Union[
|
|
34
|
+
typing.Optional[int], type_utils.NotGiven
|
|
35
|
+
] = type_utils.NOT_GIVEN,
|
|
36
|
+
max_fps_limit: typing.Union[
|
|
37
|
+
typing.Optional[float], type_utils.NotGiven
|
|
38
|
+
] = type_utils.NOT_GIVEN,
|
|
39
|
+
name: typing.Union[
|
|
40
|
+
typing.Optional[str], type_utils.NotGiven
|
|
41
|
+
] = type_utils.NOT_GIVEN,
|
|
42
|
+
style: typing.Union[
|
|
43
|
+
typing.Optional[params.V1LipSyncCreateBodyStyle], type_utils.NotGiven
|
|
44
|
+
] = type_utils.NOT_GIVEN,
|
|
45
|
+
width: typing.Union[
|
|
46
|
+
typing.Optional[int], type_utils.NotGiven
|
|
47
|
+
] = type_utils.NOT_GIVEN,
|
|
48
|
+
wait_for_completion: bool = True,
|
|
49
|
+
download_outputs: bool = True,
|
|
50
|
+
download_directory: typing.Optional[str] = None,
|
|
51
|
+
request_options: typing.Optional[RequestOptions] = None,
|
|
52
|
+
):
|
|
53
|
+
"""
|
|
54
|
+
Generate lip sync video (alias for create with additional functionality).
|
|
55
|
+
|
|
56
|
+
Create a Lip Sync video. The estimated frame cost is calculated using 30 FPS. This amount is deducted from your account balance when a video is queued. Once the video is complete, the cost will be updated based on the actual number of frames rendered.
|
|
57
|
+
|
|
58
|
+
Args:
|
|
59
|
+
height: `height` is deprecated and no longer influences the output video's resolution.
|
|
60
|
+
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.
|
|
61
|
+
name: The name of video. This value is mainly used for your own identification of the video.
|
|
62
|
+
style: Attributes used to dictate the style of the output
|
|
63
|
+
width: `width` is deprecated and no longer influences the output video's resolution.
|
|
64
|
+
assets: Provide the assets for lip-sync. For video, The `video_source` field determines whether `video_file_path` or `youtube_url` field is used
|
|
65
|
+
end_seconds: The end time of the input video in seconds. This value is used to trim the input video. The value must be greater than 0.1, and more than the start_seconds.
|
|
66
|
+
start_seconds: The start time of the input video in seconds. This value is used to trim the input video. The value must be greater than 0.
|
|
67
|
+
wait_for_completion: Whether to wait for the video project to complete
|
|
68
|
+
download_outputs: Whether to download the outputs
|
|
69
|
+
download_directory: The directory to download the outputs to. If not provided, the outputs will be downloaded to the current working directory
|
|
70
|
+
request_options: Additional options to customize the HTTP request
|
|
71
|
+
|
|
72
|
+
Returns:
|
|
73
|
+
V1VideoProjectsGetResponseWithDownloads: The response from the Lip Sync API with the downloaded paths if `download_outputs` is True.
|
|
74
|
+
|
|
75
|
+
Examples:
|
|
76
|
+
```py
|
|
77
|
+
response = client.v1.lip_sync.generate(
|
|
78
|
+
assets={
|
|
79
|
+
"audio_file_path": "path/to/audio.mp3",
|
|
80
|
+
"video_file_path": "path/to/video.mp4",
|
|
81
|
+
"video_source": "file",
|
|
82
|
+
},
|
|
83
|
+
end_seconds=15.0,
|
|
84
|
+
start_seconds=0.0,
|
|
85
|
+
max_fps_limit=12.0,
|
|
86
|
+
wait_for_completion=True,
|
|
87
|
+
download_outputs=True,
|
|
88
|
+
download_directory="outputs/",
|
|
89
|
+
)
|
|
90
|
+
```
|
|
91
|
+
"""
|
|
92
|
+
|
|
93
|
+
file_client = FilesClient(base_client=self._base_client)
|
|
94
|
+
|
|
95
|
+
# Upload audio file (always required)
|
|
96
|
+
audio_file_path = assets["audio_file_path"]
|
|
97
|
+
assets["audio_file_path"] = file_client.upload_file(file=audio_file_path)
|
|
98
|
+
|
|
99
|
+
# Upload video file if video_source is "file" and video_file_path is provided
|
|
100
|
+
if (
|
|
101
|
+
assets.get("video_source") == "file"
|
|
102
|
+
and "video_file_path" in assets
|
|
103
|
+
and assets["video_file_path"]
|
|
104
|
+
):
|
|
105
|
+
video_file_path = assets["video_file_path"]
|
|
106
|
+
assets["video_file_path"] = file_client.upload_file(file=video_file_path)
|
|
107
|
+
|
|
108
|
+
create_response = self.create(
|
|
109
|
+
assets=assets,
|
|
110
|
+
end_seconds=end_seconds,
|
|
111
|
+
start_seconds=start_seconds,
|
|
112
|
+
height=height,
|
|
113
|
+
max_fps_limit=max_fps_limit,
|
|
114
|
+
name=name,
|
|
115
|
+
style=style,
|
|
116
|
+
width=width,
|
|
117
|
+
request_options=request_options,
|
|
118
|
+
)
|
|
119
|
+
logger.info(f"Lip Sync response: {create_response}")
|
|
120
|
+
|
|
121
|
+
video_projects_client = VideoProjectsClient(base_client=self._base_client)
|
|
122
|
+
response = video_projects_client.check_result(
|
|
123
|
+
id=create_response.id,
|
|
124
|
+
wait_for_completion=wait_for_completion,
|
|
125
|
+
download_outputs=download_outputs,
|
|
126
|
+
download_directory=download_directory,
|
|
127
|
+
)
|
|
128
|
+
|
|
129
|
+
return response
|
|
130
|
+
|
|
18
131
|
def create(
|
|
19
132
|
self,
|
|
20
133
|
*,
|
|
21
|
-
assets: params.
|
|
134
|
+
assets: params.V1LipSyncCreateBodyAssets,
|
|
22
135
|
end_seconds: float,
|
|
23
|
-
height: int,
|
|
24
136
|
start_seconds: float,
|
|
25
|
-
|
|
137
|
+
height: typing.Union[
|
|
138
|
+
typing.Optional[int], type_utils.NotGiven
|
|
139
|
+
] = type_utils.NOT_GIVEN,
|
|
26
140
|
max_fps_limit: typing.Union[
|
|
27
141
|
typing.Optional[float], type_utils.NotGiven
|
|
28
142
|
] = type_utils.NOT_GIVEN,
|
|
29
143
|
name: typing.Union[
|
|
30
144
|
typing.Optional[str], type_utils.NotGiven
|
|
31
145
|
] = type_utils.NOT_GIVEN,
|
|
146
|
+
style: typing.Union[
|
|
147
|
+
typing.Optional[params.V1LipSyncCreateBodyStyle], type_utils.NotGiven
|
|
148
|
+
] = type_utils.NOT_GIVEN,
|
|
149
|
+
width: typing.Union[
|
|
150
|
+
typing.Optional[int], type_utils.NotGiven
|
|
151
|
+
] = type_utils.NOT_GIVEN,
|
|
32
152
|
request_options: typing.Optional[RequestOptions] = None,
|
|
33
|
-
) -> models.
|
|
153
|
+
) -> models.V1LipSyncCreateResponse:
|
|
34
154
|
"""
|
|
35
155
|
Lip Sync
|
|
36
156
|
|
|
37
157
|
Create a Lip Sync video. The estimated frame cost is calculated using 30 FPS. This amount is deducted from your account balance when a video is queued. Once the video is complete, the cost will be updated based on the actual number of frames rendered.
|
|
38
158
|
|
|
39
|
-
Get more information about this mode at our [product page](/products/lip-sync).
|
|
159
|
+
Get more information about this mode at our [product page](https://magichour.ai/products/lip-sync).
|
|
40
160
|
|
|
41
161
|
|
|
42
162
|
POST /v1/lip-sync
|
|
43
163
|
|
|
44
164
|
Args:
|
|
165
|
+
height: `height` is deprecated and no longer influences the output video's resolution.
|
|
166
|
+
|
|
167
|
+
Output resolution is determined by the **minimum** of:
|
|
168
|
+
- The resolution of the input video
|
|
169
|
+
- The maximum resolution allowed by your subscription tier. See our [pricing page](https://magichour.ai/pricing) for more details.
|
|
170
|
+
|
|
171
|
+
This field is retained only for backward compatibility and will be removed in a future release.
|
|
45
172
|
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
|
-
name: The name of video
|
|
173
|
+
name: The name of video. This value is mainly used for your own identification of the video.
|
|
174
|
+
style: Attributes used to dictate the style of the output
|
|
175
|
+
width: `width` is deprecated and no longer influences the output video's resolution.
|
|
176
|
+
|
|
177
|
+
Output resolution is determined by the **minimum** of:
|
|
178
|
+
- The resolution of the input video
|
|
179
|
+
- The maximum resolution allowed by your subscription tier. See our [pricing page](https://magichour.ai/pricing) for more details.
|
|
180
|
+
|
|
181
|
+
This field is retained only for backward compatibility and will be removed in a future release.
|
|
47
182
|
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
|
-
end_seconds: The end time of the input video in seconds
|
|
49
|
-
|
|
50
|
-
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
|
|
183
|
+
end_seconds: The end time of the input video in seconds. This value is used to trim the input video. The value must be greater than 0.1, and more than the start_seconds.
|
|
184
|
+
start_seconds: The start time of the input video in seconds. This value is used to trim the input video. The value must be greater than 0.
|
|
52
185
|
request_options: Additional options to customize the HTTP request
|
|
53
186
|
|
|
54
187
|
Returns:
|
|
@@ -63,12 +196,11 @@ class LipSyncClient:
|
|
|
63
196
|
client.v1.lip_sync.create(
|
|
64
197
|
assets={
|
|
65
198
|
"audio_file_path": "api-assets/id/1234.mp3",
|
|
199
|
+
"video_file_path": "api-assets/id/1234.mp4",
|
|
66
200
|
"video_source": "file",
|
|
67
201
|
},
|
|
68
202
|
end_seconds=15.0,
|
|
69
|
-
height=960,
|
|
70
203
|
start_seconds=0.0,
|
|
71
|
-
width=512,
|
|
72
204
|
max_fps_limit=12.0,
|
|
73
205
|
name="Lip Sync video",
|
|
74
206
|
)
|
|
@@ -76,22 +208,23 @@ class LipSyncClient:
|
|
|
76
208
|
"""
|
|
77
209
|
_json = to_encodable(
|
|
78
210
|
item={
|
|
211
|
+
"height": height,
|
|
79
212
|
"max_fps_limit": max_fps_limit,
|
|
80
213
|
"name": name,
|
|
214
|
+
"style": style,
|
|
215
|
+
"width": width,
|
|
81
216
|
"assets": assets,
|
|
82
217
|
"end_seconds": end_seconds,
|
|
83
|
-
"height": height,
|
|
84
218
|
"start_seconds": start_seconds,
|
|
85
|
-
"width": width,
|
|
86
219
|
},
|
|
87
|
-
dump_with=params.
|
|
220
|
+
dump_with=params._SerializerV1LipSyncCreateBody,
|
|
88
221
|
)
|
|
89
222
|
return self._base_client.request(
|
|
90
223
|
method="POST",
|
|
91
224
|
path="/v1/lip-sync",
|
|
92
225
|
auth_names=["bearerAuth"],
|
|
93
226
|
json=_json,
|
|
94
|
-
cast_to=models.
|
|
227
|
+
cast_to=models.V1LipSyncCreateResponse,
|
|
95
228
|
request_options=request_options or default_request_options(),
|
|
96
229
|
)
|
|
97
230
|
|
|
@@ -100,40 +233,161 @@ class AsyncLipSyncClient:
|
|
|
100
233
|
def __init__(self, *, base_client: AsyncBaseClient):
|
|
101
234
|
self._base_client = base_client
|
|
102
235
|
|
|
236
|
+
async def generate(
|
|
237
|
+
self,
|
|
238
|
+
*,
|
|
239
|
+
assets: params.V1LipSyncGenerateBodyAssets,
|
|
240
|
+
end_seconds: float,
|
|
241
|
+
start_seconds: float,
|
|
242
|
+
height: typing.Union[
|
|
243
|
+
typing.Optional[int], type_utils.NotGiven
|
|
244
|
+
] = type_utils.NOT_GIVEN,
|
|
245
|
+
max_fps_limit: typing.Union[
|
|
246
|
+
typing.Optional[float], type_utils.NotGiven
|
|
247
|
+
] = type_utils.NOT_GIVEN,
|
|
248
|
+
name: typing.Union[
|
|
249
|
+
typing.Optional[str], type_utils.NotGiven
|
|
250
|
+
] = type_utils.NOT_GIVEN,
|
|
251
|
+
width: typing.Union[
|
|
252
|
+
typing.Optional[int], type_utils.NotGiven
|
|
253
|
+
] = type_utils.NOT_GIVEN,
|
|
254
|
+
wait_for_completion: bool = True,
|
|
255
|
+
download_outputs: bool = True,
|
|
256
|
+
download_directory: typing.Optional[str] = None,
|
|
257
|
+
request_options: typing.Optional[RequestOptions] = None,
|
|
258
|
+
):
|
|
259
|
+
"""
|
|
260
|
+
Generate lip sync video (alias for create with additional functionality).
|
|
261
|
+
|
|
262
|
+
Create a Lip Sync video. The estimated frame cost is calculated using 30 FPS. This amount is deducted from your account balance when a video is queued. Once the video is complete, the cost will be updated based on the actual number of frames rendered.
|
|
263
|
+
|
|
264
|
+
Args:
|
|
265
|
+
height: `height` is deprecated and no longer influences the output video's resolution.
|
|
266
|
+
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.
|
|
267
|
+
name: The name of video. This value is mainly used for your own identification of the video.
|
|
268
|
+
width: `width` is deprecated and no longer influences the output video's resolution.
|
|
269
|
+
assets: Provide the assets for lip-sync. For video, The `video_source` field determines whether `video_file_path` or `youtube_url` field is used
|
|
270
|
+
end_seconds: The end time of the input video in seconds. This value is used to trim the input video. The value must be greater than 0.1, and more than the start_seconds.
|
|
271
|
+
start_seconds: The start time of the input video in seconds. This value is used to trim the input video. The value must be greater than 0.
|
|
272
|
+
wait_for_completion: Whether to wait for the video project to complete
|
|
273
|
+
download_outputs: Whether to download the outputs
|
|
274
|
+
download_directory: The directory to download the outputs to. If not provided, the outputs will be downloaded to the current working directory
|
|
275
|
+
request_options: Additional options to customize the HTTP request
|
|
276
|
+
|
|
277
|
+
Returns:
|
|
278
|
+
V1VideoProjectsGetResponseWithDownloads: The response from the Lip Sync API with the downloaded paths if `download_outputs` is True.
|
|
279
|
+
|
|
280
|
+
Examples:
|
|
281
|
+
```py
|
|
282
|
+
response = await client.v1.lip_sync.generate(
|
|
283
|
+
assets={
|
|
284
|
+
"audio_file_path": "path/to/audio.mp3",
|
|
285
|
+
"video_file_path": "path/to/video.mp4",
|
|
286
|
+
"video_source": "file",
|
|
287
|
+
},
|
|
288
|
+
end_seconds=15.0,
|
|
289
|
+
start_seconds=0.0,
|
|
290
|
+
max_fps_limit=12.0,
|
|
291
|
+
wait_for_completion=True,
|
|
292
|
+
download_outputs=True,
|
|
293
|
+
download_directory="outputs/",
|
|
294
|
+
)
|
|
295
|
+
```
|
|
296
|
+
"""
|
|
297
|
+
|
|
298
|
+
file_client = AsyncFilesClient(base_client=self._base_client)
|
|
299
|
+
|
|
300
|
+
# Upload audio file (always required)
|
|
301
|
+
audio_file_path = assets["audio_file_path"]
|
|
302
|
+
assets["audio_file_path"] = await file_client.upload_file(file=audio_file_path)
|
|
303
|
+
|
|
304
|
+
# Upload video file if video_source is "file" and video_file_path is provided
|
|
305
|
+
if (
|
|
306
|
+
assets.get("video_source") == "file"
|
|
307
|
+
and "video_file_path" in assets
|
|
308
|
+
and assets["video_file_path"]
|
|
309
|
+
):
|
|
310
|
+
video_file_path = assets["video_file_path"]
|
|
311
|
+
assets["video_file_path"] = await file_client.upload_file(
|
|
312
|
+
file=video_file_path
|
|
313
|
+
)
|
|
314
|
+
|
|
315
|
+
create_response = await self.create(
|
|
316
|
+
assets=assets,
|
|
317
|
+
end_seconds=end_seconds,
|
|
318
|
+
start_seconds=start_seconds,
|
|
319
|
+
height=height,
|
|
320
|
+
max_fps_limit=max_fps_limit,
|
|
321
|
+
name=name,
|
|
322
|
+
width=width,
|
|
323
|
+
request_options=request_options,
|
|
324
|
+
)
|
|
325
|
+
logger.info(f"Lip Sync response: {create_response}")
|
|
326
|
+
|
|
327
|
+
video_projects_client = AsyncVideoProjectsClient(base_client=self._base_client)
|
|
328
|
+
response = await video_projects_client.check_result(
|
|
329
|
+
id=create_response.id,
|
|
330
|
+
wait_for_completion=wait_for_completion,
|
|
331
|
+
download_outputs=download_outputs,
|
|
332
|
+
download_directory=download_directory,
|
|
333
|
+
)
|
|
334
|
+
|
|
335
|
+
return response
|
|
336
|
+
|
|
103
337
|
async def create(
|
|
104
338
|
self,
|
|
105
339
|
*,
|
|
106
|
-
assets: params.
|
|
340
|
+
assets: params.V1LipSyncCreateBodyAssets,
|
|
107
341
|
end_seconds: float,
|
|
108
|
-
height: int,
|
|
109
342
|
start_seconds: float,
|
|
110
|
-
|
|
343
|
+
height: typing.Union[
|
|
344
|
+
typing.Optional[int], type_utils.NotGiven
|
|
345
|
+
] = type_utils.NOT_GIVEN,
|
|
111
346
|
max_fps_limit: typing.Union[
|
|
112
347
|
typing.Optional[float], type_utils.NotGiven
|
|
113
348
|
] = type_utils.NOT_GIVEN,
|
|
114
349
|
name: typing.Union[
|
|
115
350
|
typing.Optional[str], type_utils.NotGiven
|
|
116
351
|
] = type_utils.NOT_GIVEN,
|
|
352
|
+
style: typing.Union[
|
|
353
|
+
typing.Optional[params.V1LipSyncCreateBodyStyle], type_utils.NotGiven
|
|
354
|
+
] = type_utils.NOT_GIVEN,
|
|
355
|
+
width: typing.Union[
|
|
356
|
+
typing.Optional[int], type_utils.NotGiven
|
|
357
|
+
] = type_utils.NOT_GIVEN,
|
|
117
358
|
request_options: typing.Optional[RequestOptions] = None,
|
|
118
|
-
) -> models.
|
|
359
|
+
) -> models.V1LipSyncCreateResponse:
|
|
119
360
|
"""
|
|
120
361
|
Lip Sync
|
|
121
362
|
|
|
122
363
|
Create a Lip Sync video. The estimated frame cost is calculated using 30 FPS. This amount is deducted from your account balance when a video is queued. Once the video is complete, the cost will be updated based on the actual number of frames rendered.
|
|
123
364
|
|
|
124
|
-
Get more information about this mode at our [product page](/products/lip-sync).
|
|
365
|
+
Get more information about this mode at our [product page](https://magichour.ai/products/lip-sync).
|
|
125
366
|
|
|
126
367
|
|
|
127
368
|
POST /v1/lip-sync
|
|
128
369
|
|
|
129
370
|
Args:
|
|
371
|
+
height: `height` is deprecated and no longer influences the output video's resolution.
|
|
372
|
+
|
|
373
|
+
Output resolution is determined by the **minimum** of:
|
|
374
|
+
- The resolution of the input video
|
|
375
|
+
- The maximum resolution allowed by your subscription tier. See our [pricing page](https://magichour.ai/pricing) for more details.
|
|
376
|
+
|
|
377
|
+
This field is retained only for backward compatibility and will be removed in a future release.
|
|
130
378
|
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.
|
|
131
|
-
name: The name of video
|
|
379
|
+
name: The name of video. This value is mainly used for your own identification of the video.
|
|
380
|
+
style: Attributes used to dictate the style of the output
|
|
381
|
+
width: `width` is deprecated and no longer influences the output video's resolution.
|
|
382
|
+
|
|
383
|
+
Output resolution is determined by the **minimum** of:
|
|
384
|
+
- The resolution of the input video
|
|
385
|
+
- The maximum resolution allowed by your subscription tier. See our [pricing page](https://magichour.ai/pricing) for more details.
|
|
386
|
+
|
|
387
|
+
This field is retained only for backward compatibility and will be removed in a future release.
|
|
132
388
|
assets: Provide the assets for lip-sync. For video, The `video_source` field determines whether `video_file_path` or `youtube_url` field is used
|
|
133
|
-
end_seconds: The end time of the input video in seconds
|
|
134
|
-
|
|
135
|
-
start_seconds: The start time of the input video in seconds
|
|
136
|
-
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
|
|
389
|
+
end_seconds: The end time of the input video in seconds. This value is used to trim the input video. The value must be greater than 0.1, and more than the start_seconds.
|
|
390
|
+
start_seconds: The start time of the input video in seconds. This value is used to trim the input video. The value must be greater than 0.
|
|
137
391
|
request_options: Additional options to customize the HTTP request
|
|
138
392
|
|
|
139
393
|
Returns:
|
|
@@ -148,12 +402,11 @@ class AsyncLipSyncClient:
|
|
|
148
402
|
await client.v1.lip_sync.create(
|
|
149
403
|
assets={
|
|
150
404
|
"audio_file_path": "api-assets/id/1234.mp3",
|
|
405
|
+
"video_file_path": "api-assets/id/1234.mp4",
|
|
151
406
|
"video_source": "file",
|
|
152
407
|
},
|
|
153
408
|
end_seconds=15.0,
|
|
154
|
-
height=960,
|
|
155
409
|
start_seconds=0.0,
|
|
156
|
-
width=512,
|
|
157
410
|
max_fps_limit=12.0,
|
|
158
411
|
name="Lip Sync video",
|
|
159
412
|
)
|
|
@@ -161,21 +414,22 @@ class AsyncLipSyncClient:
|
|
|
161
414
|
"""
|
|
162
415
|
_json = to_encodable(
|
|
163
416
|
item={
|
|
417
|
+
"height": height,
|
|
164
418
|
"max_fps_limit": max_fps_limit,
|
|
165
419
|
"name": name,
|
|
420
|
+
"style": style,
|
|
421
|
+
"width": width,
|
|
166
422
|
"assets": assets,
|
|
167
423
|
"end_seconds": end_seconds,
|
|
168
|
-
"height": height,
|
|
169
424
|
"start_seconds": start_seconds,
|
|
170
|
-
"width": width,
|
|
171
425
|
},
|
|
172
|
-
dump_with=params.
|
|
426
|
+
dump_with=params._SerializerV1LipSyncCreateBody,
|
|
173
427
|
)
|
|
174
428
|
return await self._base_client.request(
|
|
175
429
|
method="POST",
|
|
176
430
|
path="/v1/lip-sync",
|
|
177
431
|
auth_names=["bearerAuth"],
|
|
178
432
|
json=_json,
|
|
179
|
-
cast_to=models.
|
|
433
|
+
cast_to=models.V1LipSyncCreateResponse,
|
|
180
434
|
request_options=request_options or default_request_options(),
|
|
181
435
|
)
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# v1.photo_colorizer
|
|
2
|
+
|
|
3
|
+
## Module Functions
|
|
4
|
+
|
|
5
|
+
<!-- CUSTOM DOCS START -->
|
|
6
|
+
|
|
7
|
+
### Photo Colorizer Generate Workflow <a name="generate"></a>
|
|
8
|
+
|
|
9
|
+
The workflow performs the following action
|
|
10
|
+
|
|
11
|
+
1. upload local assets to Magic Hour storage. So you can pass in a local path instead of having to upload files yourself
|
|
12
|
+
2. trigger a generation
|
|
13
|
+
3. poll for a completion status. This is configurable
|
|
14
|
+
4. if success, download the output to local directory
|
|
15
|
+
|
|
16
|
+
> [!TIP]
|
|
17
|
+
> This is the recommended way to use the SDK unless you have specific needs where it is necessary to split up the actions.
|
|
18
|
+
|
|
19
|
+
#### Parameters
|
|
20
|
+
|
|
21
|
+
In Additional to the parameters listed in the `.create` section below, `.generate` introduces 3 new parameters:
|
|
22
|
+
|
|
23
|
+
- `wait_for_completion` (bool, default True): Whether to wait for the project to complete.
|
|
24
|
+
- `download_outputs` (bool, default True): Whether to download the generated files
|
|
25
|
+
- `download_directory` (str, optional): Directory to save downloaded files (defaults to current directory)
|
|
26
|
+
|
|
27
|
+
#### Synchronous Client
|
|
28
|
+
|
|
29
|
+
```python
|
|
30
|
+
from magic_hour import Client
|
|
31
|
+
from os import getenv
|
|
32
|
+
|
|
33
|
+
client = Client(token=getenv("API_TOKEN"))
|
|
34
|
+
res = client.v1.photo_colorizer.generate(
|
|
35
|
+
assets={"image_file_path": "/path/to/1234.png"}, name="Photo Colorizer image"
|
|
36
|
+
wait_for_completion=True,
|
|
37
|
+
download_outputs=True,
|
|
38
|
+
download_directory="outputs"
|
|
39
|
+
)
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
#### Asynchronous Client
|
|
43
|
+
|
|
44
|
+
```python
|
|
45
|
+
from magic_hour import AsyncClient
|
|
46
|
+
from os import getenv
|
|
47
|
+
|
|
48
|
+
client = AsyncClient(token=getenv("API_TOKEN"))
|
|
49
|
+
res = await client.v1.photo_colorizer.generate(
|
|
50
|
+
assets={"image_file_path": "/path/to/1234.png"}, name="Photo Colorizer image"
|
|
51
|
+
wait_for_completion=True,
|
|
52
|
+
download_outputs=True,
|
|
53
|
+
download_directory="outputs"
|
|
54
|
+
)
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
<!-- CUSTOM DOCS END -->
|
|
58
|
+
|
|
59
|
+
### Photo Colorizer <a name="create"></a>
|
|
60
|
+
|
|
61
|
+
Colorize image. Each image costs 5 credits.
|
|
62
|
+
|
|
63
|
+
**API Endpoint**: `POST /v1/photo-colorizer`
|
|
64
|
+
|
|
65
|
+
#### Parameters
|
|
66
|
+
|
|
67
|
+
| Parameter | Required | Description | Example |
|
|
68
|
+
| -------------------- | :------: | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------- |
|
|
69
|
+
| `assets` | ✓ | Provide the assets for photo colorization | `{"image_file_path": "api-assets/id/1234.png"}` |
|
|
70
|
+
| `└─ image_file_path` | ✓ | The image used to generate the colorized image. This value is either - a direct URL to the video file - `file_path` field from the response of the [upload urls API](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls). Please refer to the [Input File documentation](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls#input-file) to learn more. | `"api-assets/id/1234.png"` |
|
|
71
|
+
| `name` | ✗ | The name of image. This value is mainly used for your own identification of the image. | `"Photo Colorizer image"` |
|
|
72
|
+
|
|
73
|
+
#### Synchronous Client
|
|
74
|
+
|
|
75
|
+
```python
|
|
76
|
+
from magic_hour import Client
|
|
77
|
+
from os import getenv
|
|
78
|
+
|
|
79
|
+
client = Client(token=getenv("API_TOKEN"))
|
|
80
|
+
res = client.v1.photo_colorizer.create(
|
|
81
|
+
assets={"image_file_path": "api-assets/id/1234.png"}, name="Photo Colorizer image"
|
|
82
|
+
)
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
#### Asynchronous Client
|
|
86
|
+
|
|
87
|
+
```python
|
|
88
|
+
from magic_hour import AsyncClient
|
|
89
|
+
from os import getenv
|
|
90
|
+
|
|
91
|
+
client = AsyncClient(token=getenv("API_TOKEN"))
|
|
92
|
+
res = await client.v1.photo_colorizer.create(
|
|
93
|
+
assets={"image_file_path": "api-assets/id/1234.png"}, name="Photo Colorizer image"
|
|
94
|
+
)
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
#### Response
|
|
98
|
+
|
|
99
|
+
##### Type
|
|
100
|
+
|
|
101
|
+
[V1PhotoColorizerCreateResponse](/magic_hour/types/models/v1_photo_colorizer_create_response.py)
|
|
102
|
+
|
|
103
|
+
##### Example
|
|
104
|
+
|
|
105
|
+
```python
|
|
106
|
+
{"credits_charged": 5, "frame_cost": 5, "id": "cuid-example"}
|
|
107
|
+
```
|