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.
Files changed (264) hide show
  1. magic_hour/README.md +34 -0
  2. magic_hour/__init__.py +1 -1
  3. magic_hour/client.py +8 -17
  4. magic_hour/environment.py +13 -1
  5. magic_hour/helpers/__init__.py +4 -0
  6. magic_hour/helpers/download.py +77 -0
  7. magic_hour/helpers/logger.py +8 -0
  8. magic_hour/resources/v1/README.md +32 -0
  9. magic_hour/resources/v1/ai_clothes_changer/README.md +94 -5
  10. magic_hour/resources/v1/ai_clothes_changer/client.py +161 -16
  11. magic_hour/resources/v1/ai_face_editor/README.md +195 -0
  12. magic_hour/resources/v1/ai_face_editor/__init__.py +4 -0
  13. magic_hour/resources/v1/ai_face_editor/client.py +324 -0
  14. magic_hour/resources/v1/ai_gif_generator/README.md +116 -0
  15. magic_hour/resources/v1/ai_gif_generator/__init__.py +4 -0
  16. magic_hour/resources/v1/ai_gif_generator/client.py +257 -0
  17. magic_hour/resources/v1/ai_headshot_generator/README.md +81 -3
  18. magic_hour/resources/v1/ai_headshot_generator/client.py +167 -18
  19. magic_hour/resources/v1/ai_image_editor/README.md +125 -0
  20. magic_hour/resources/v1/ai_image_editor/__init__.py +4 -0
  21. magic_hour/resources/v1/ai_image_editor/client.py +290 -0
  22. magic_hour/resources/v1/ai_image_generator/README.md +99 -5
  23. magic_hour/resources/v1/ai_image_generator/client.py +170 -24
  24. magic_hour/resources/v1/ai_image_upscaler/README.md +89 -3
  25. magic_hour/resources/v1/ai_image_upscaler/client.py +173 -20
  26. magic_hour/resources/v1/ai_meme_generator/README.md +129 -0
  27. magic_hour/resources/v1/ai_meme_generator/__init__.py +4 -0
  28. magic_hour/resources/v1/ai_meme_generator/client.py +253 -0
  29. magic_hour/resources/v1/ai_photo_editor/README.md +119 -4
  30. magic_hour/resources/v1/ai_photo_editor/client.py +199 -18
  31. magic_hour/resources/v1/ai_qr_code_generator/README.md +84 -3
  32. magic_hour/resources/v1/ai_qr_code_generator/client.py +140 -18
  33. magic_hour/resources/v1/ai_talking_photo/README.md +137 -0
  34. magic_hour/resources/v1/ai_talking_photo/__init__.py +4 -0
  35. magic_hour/resources/v1/ai_talking_photo/client.py +326 -0
  36. magic_hour/resources/v1/ai_voice_cloner/README.md +62 -0
  37. magic_hour/resources/v1/ai_voice_cloner/__init__.py +4 -0
  38. magic_hour/resources/v1/ai_voice_cloner/client.py +272 -0
  39. magic_hour/resources/v1/ai_voice_generator/README.md +112 -0
  40. magic_hour/resources/v1/ai_voice_generator/__init__.py +4 -0
  41. magic_hour/resources/v1/ai_voice_generator/client.py +241 -0
  42. magic_hour/resources/v1/animation/README.md +128 -6
  43. magic_hour/resources/v1/animation/client.py +247 -22
  44. magic_hour/resources/v1/audio_projects/README.md +135 -0
  45. magic_hour/resources/v1/audio_projects/__init__.py +12 -0
  46. magic_hour/resources/v1/audio_projects/client.py +310 -0
  47. magic_hour/resources/v1/audio_projects/client_test.py +520 -0
  48. magic_hour/resources/v1/auto_subtitle_generator/README.md +128 -0
  49. magic_hour/resources/v1/auto_subtitle_generator/__init__.py +4 -0
  50. magic_hour/resources/v1/auto_subtitle_generator/client.py +346 -0
  51. magic_hour/resources/v1/client.py +75 -1
  52. magic_hour/resources/v1/face_detection/README.md +157 -0
  53. magic_hour/resources/v1/face_detection/__init__.py +12 -0
  54. magic_hour/resources/v1/face_detection/client.py +380 -0
  55. magic_hour/resources/v1/face_swap/README.md +137 -9
  56. magic_hour/resources/v1/face_swap/client.py +329 -38
  57. magic_hour/resources/v1/face_swap_photo/README.md +118 -3
  58. magic_hour/resources/v1/face_swap_photo/client.py +199 -14
  59. magic_hour/resources/v1/files/README.md +39 -0
  60. magic_hour/resources/v1/files/client.py +351 -1
  61. magic_hour/resources/v1/files/client_test.py +414 -0
  62. magic_hour/resources/v1/files/upload_urls/README.md +38 -17
  63. magic_hour/resources/v1/files/upload_urls/client.py +38 -34
  64. magic_hour/resources/v1/image_background_remover/README.md +96 -5
  65. magic_hour/resources/v1/image_background_remover/client.py +151 -16
  66. magic_hour/resources/v1/image_projects/README.md +82 -10
  67. magic_hour/resources/v1/image_projects/__init__.py +10 -2
  68. magic_hour/resources/v1/image_projects/client.py +154 -16
  69. magic_hour/resources/v1/image_projects/client_test.py +527 -0
  70. magic_hour/resources/v1/image_to_video/README.md +96 -11
  71. magic_hour/resources/v1/image_to_video/client.py +282 -38
  72. magic_hour/resources/v1/lip_sync/README.md +112 -9
  73. magic_hour/resources/v1/lip_sync/client.py +288 -34
  74. magic_hour/resources/v1/photo_colorizer/README.md +107 -0
  75. magic_hour/resources/v1/photo_colorizer/__init__.py +4 -0
  76. magic_hour/resources/v1/photo_colorizer/client.py +248 -0
  77. magic_hour/resources/v1/text_to_video/README.md +96 -7
  78. magic_hour/resources/v1/text_to_video/client.py +204 -18
  79. magic_hour/resources/v1/video_projects/README.md +81 -9
  80. magic_hour/resources/v1/video_projects/__init__.py +10 -2
  81. magic_hour/resources/v1/video_projects/client.py +151 -14
  82. magic_hour/resources/v1/video_projects/client_test.py +527 -0
  83. magic_hour/resources/v1/video_to_video/README.md +119 -15
  84. magic_hour/resources/v1/video_to_video/client.py +299 -46
  85. magic_hour/types/models/__init__.py +92 -56
  86. magic_hour/types/models/v1_ai_clothes_changer_create_response.py +33 -0
  87. magic_hour/types/models/v1_ai_face_editor_create_response.py +33 -0
  88. magic_hour/types/models/v1_ai_gif_generator_create_response.py +33 -0
  89. magic_hour/types/models/v1_ai_headshot_generator_create_response.py +33 -0
  90. magic_hour/types/models/v1_ai_image_editor_create_response.py +33 -0
  91. magic_hour/types/models/v1_ai_image_generator_create_response.py +33 -0
  92. magic_hour/types/models/v1_ai_image_upscaler_create_response.py +33 -0
  93. magic_hour/types/models/v1_ai_meme_generator_create_response.py +33 -0
  94. magic_hour/types/models/v1_ai_photo_editor_create_response.py +33 -0
  95. magic_hour/types/models/v1_ai_qr_code_generator_create_response.py +33 -0
  96. magic_hour/types/models/v1_ai_talking_photo_create_response.py +35 -0
  97. magic_hour/types/models/v1_ai_voice_cloner_create_response.py +27 -0
  98. magic_hour/types/models/v1_ai_voice_generator_create_response.py +27 -0
  99. magic_hour/types/models/v1_animation_create_response.py +35 -0
  100. magic_hour/types/models/v1_audio_projects_get_response.py +72 -0
  101. magic_hour/types/models/v1_audio_projects_get_response_downloads_item.py +19 -0
  102. magic_hour/types/models/{get_v1_image_projects_id_response_error.py → v1_audio_projects_get_response_error.py} +2 -2
  103. magic_hour/types/models/v1_auto_subtitle_generator_create_response.py +35 -0
  104. magic_hour/types/models/v1_face_detection_create_response.py +25 -0
  105. magic_hour/types/models/v1_face_detection_get_response.py +45 -0
  106. magic_hour/types/models/v1_face_detection_get_response_faces_item.py +25 -0
  107. magic_hour/types/models/v1_face_swap_create_response.py +35 -0
  108. magic_hour/types/models/v1_face_swap_photo_create_response.py +33 -0
  109. magic_hour/types/models/v1_files_upload_urls_create_response.py +24 -0
  110. magic_hour/types/models/{post_v1_files_upload_urls_response_items_item.py → v1_files_upload_urls_create_response_items_item.py} +2 -2
  111. magic_hour/types/models/v1_image_background_remover_create_response.py +33 -0
  112. magic_hour/types/models/{get_v1_image_projects_id_response.py → v1_image_projects_get_response.py} +20 -18
  113. magic_hour/types/models/{get_v1_video_projects_id_response_downloads_item.py → v1_image_projects_get_response_downloads_item.py} +1 -1
  114. magic_hour/types/models/{get_v1_video_projects_id_response_error.py → v1_image_projects_get_response_error.py} +2 -2
  115. magic_hour/types/models/v1_image_to_video_create_response.py +35 -0
  116. magic_hour/types/models/v1_lip_sync_create_response.py +35 -0
  117. magic_hour/types/models/v1_photo_colorizer_create_response.py +33 -0
  118. magic_hour/types/models/v1_text_to_video_create_response.py +35 -0
  119. magic_hour/types/models/{get_v1_video_projects_id_response.py → v1_video_projects_get_response.py} +26 -23
  120. magic_hour/types/models/{get_v1_video_projects_id_response_download.py → v1_video_projects_get_response_download.py} +1 -1
  121. magic_hour/types/models/{get_v1_image_projects_id_response_downloads_item.py → v1_video_projects_get_response_downloads_item.py} +1 -1
  122. magic_hour/types/models/v1_video_projects_get_response_error.py +25 -0
  123. magic_hour/types/models/v1_video_to_video_create_response.py +35 -0
  124. magic_hour/types/params/__init__.py +422 -176
  125. magic_hour/types/params/v1_ai_clothes_changer_create_body.py +40 -0
  126. magic_hour/types/params/v1_ai_clothes_changer_create_body_assets.py +58 -0
  127. magic_hour/types/params/v1_ai_clothes_changer_generate_body_assets.py +33 -0
  128. magic_hour/types/params/v1_ai_face_editor_create_body.py +52 -0
  129. magic_hour/types/params/v1_ai_face_editor_create_body_assets.py +33 -0
  130. magic_hour/types/params/v1_ai_face_editor_create_body_style.py +137 -0
  131. magic_hour/types/params/v1_ai_face_editor_generate_body_assets.py +17 -0
  132. magic_hour/types/params/v1_ai_gif_generator_create_body.py +47 -0
  133. magic_hour/types/params/{post_v1_ai_image_generator_body_style.py → v1_ai_gif_generator_create_body_style.py} +5 -5
  134. magic_hour/types/params/v1_ai_headshot_generator_create_body.py +49 -0
  135. magic_hour/types/params/v1_ai_headshot_generator_create_body_assets.py +33 -0
  136. magic_hour/types/params/v1_ai_headshot_generator_create_body_style.py +27 -0
  137. magic_hour/types/params/v1_ai_headshot_generator_generate_body_assets.py +17 -0
  138. magic_hour/types/params/v1_ai_image_editor_create_body.py +49 -0
  139. magic_hour/types/params/v1_ai_image_editor_create_body_assets.py +47 -0
  140. magic_hour/types/params/v1_ai_image_editor_create_body_style.py +41 -0
  141. magic_hour/types/params/v1_ai_image_editor_generate_body_assets.py +28 -0
  142. magic_hour/types/params/{post_v1_ai_image_generator_body.py → v1_ai_image_generator_create_body.py} +17 -11
  143. magic_hour/types/params/v1_ai_image_generator_create_body_style.py +127 -0
  144. magic_hour/types/params/v1_ai_image_upscaler_create_body.py +59 -0
  145. magic_hour/types/params/v1_ai_image_upscaler_create_body_assets.py +33 -0
  146. magic_hour/types/params/{post_v1_ai_image_upscaler_body_style.py → v1_ai_image_upscaler_create_body_style.py} +4 -4
  147. magic_hour/types/params/v1_ai_image_upscaler_generate_body_assets.py +17 -0
  148. magic_hour/types/params/v1_ai_meme_generator_create_body.py +37 -0
  149. magic_hour/types/params/v1_ai_meme_generator_create_body_style.py +73 -0
  150. magic_hour/types/params/{post_v1_ai_photo_editor_body.py → v1_ai_photo_editor_create_body.py} +15 -15
  151. magic_hour/types/params/v1_ai_photo_editor_create_body_assets.py +33 -0
  152. magic_hour/types/params/{post_v1_ai_photo_editor_body_style.py → v1_ai_photo_editor_create_body_style.py} +20 -4
  153. magic_hour/types/params/v1_ai_photo_editor_generate_body_assets.py +17 -0
  154. magic_hour/types/params/v1_ai_qr_code_generator_create_body.py +45 -0
  155. magic_hour/types/params/{post_v1_ai_qr_code_generator_body_style.py → v1_ai_qr_code_generator_create_body_style.py} +4 -4
  156. magic_hour/types/params/v1_ai_talking_photo_create_body.py +68 -0
  157. magic_hour/types/params/v1_ai_talking_photo_create_body_assets.py +46 -0
  158. magic_hour/types/params/v1_ai_talking_photo_create_body_style.py +44 -0
  159. magic_hour/types/params/v1_ai_talking_photo_generate_body_assets.py +26 -0
  160. magic_hour/types/params/v1_ai_voice_cloner_create_body.py +49 -0
  161. magic_hour/types/params/v1_ai_voice_cloner_create_body_assets.py +33 -0
  162. magic_hour/types/params/v1_ai_voice_cloner_create_body_style.py +28 -0
  163. magic_hour/types/params/v1_ai_voice_cloner_generate_body_assets.py +28 -0
  164. magic_hour/types/params/v1_ai_voice_generator_create_body.py +40 -0
  165. magic_hour/types/params/v1_ai_voice_generator_create_body_style.py +440 -0
  166. magic_hour/types/params/{post_v1_animation_body.py → v1_animation_create_body.py} +16 -16
  167. magic_hour/types/params/{post_v1_animation_body_assets.py → v1_animation_create_body_assets.py} +15 -5
  168. magic_hour/types/params/{post_v1_animation_body_style.py → v1_animation_create_body_style.py} +13 -10
  169. magic_hour/types/params/v1_animation_generate_body_assets.py +39 -0
  170. magic_hour/types/params/v1_auto_subtitle_generator_create_body.py +78 -0
  171. magic_hour/types/params/v1_auto_subtitle_generator_create_body_assets.py +33 -0
  172. magic_hour/types/params/v1_auto_subtitle_generator_create_body_style.py +56 -0
  173. magic_hour/types/params/v1_auto_subtitle_generator_create_body_style_custom_config.py +86 -0
  174. magic_hour/types/params/v1_auto_subtitle_generator_generate_body_assets.py +17 -0
  175. magic_hour/types/params/v1_face_detection_create_body.py +44 -0
  176. magic_hour/types/params/v1_face_detection_create_body_assets.py +33 -0
  177. magic_hour/types/params/v1_face_detection_generate_body_assets.py +17 -0
  178. magic_hour/types/params/v1_face_swap_create_body.py +92 -0
  179. magic_hour/types/params/v1_face_swap_create_body_assets.py +91 -0
  180. magic_hour/types/params/v1_face_swap_create_body_assets_face_mappings_item.py +44 -0
  181. magic_hour/types/params/v1_face_swap_create_body_style.py +33 -0
  182. magic_hour/types/params/v1_face_swap_generate_body_assets.py +56 -0
  183. magic_hour/types/params/v1_face_swap_generate_body_assets_face_mappings_item.py +25 -0
  184. magic_hour/types/params/v1_face_swap_photo_create_body.py +40 -0
  185. magic_hour/types/params/v1_face_swap_photo_create_body_assets.py +76 -0
  186. magic_hour/types/params/v1_face_swap_photo_create_body_assets_face_mappings_item.py +44 -0
  187. magic_hour/types/params/v1_face_swap_photo_generate_body_assets.py +47 -0
  188. magic_hour/types/params/v1_face_swap_photo_generate_body_assets_face_mappings_item.py +25 -0
  189. magic_hour/types/params/v1_files_upload_urls_create_body.py +36 -0
  190. magic_hour/types/params/v1_files_upload_urls_create_body_items_item.py +38 -0
  191. magic_hour/types/params/v1_image_background_remover_create_body.py +40 -0
  192. magic_hour/types/params/v1_image_background_remover_create_body_assets.py +49 -0
  193. magic_hour/types/params/v1_image_background_remover_generate_body_assets.py +27 -0
  194. magic_hour/types/params/v1_image_to_video_create_body.py +101 -0
  195. magic_hour/types/params/v1_image_to_video_create_body_assets.py +33 -0
  196. magic_hour/types/params/v1_image_to_video_create_body_style.py +53 -0
  197. magic_hour/types/params/v1_image_to_video_generate_body_assets.py +17 -0
  198. magic_hour/types/params/v1_lip_sync_create_body.py +100 -0
  199. magic_hour/types/params/{post_v1_lip_sync_body_assets.py → v1_lip_sync_create_body_assets.py} +15 -5
  200. magic_hour/types/params/v1_lip_sync_create_body_style.py +37 -0
  201. magic_hour/types/params/v1_lip_sync_generate_body_assets.py +36 -0
  202. magic_hour/types/params/v1_photo_colorizer_create_body.py +40 -0
  203. magic_hour/types/params/v1_photo_colorizer_create_body_assets.py +33 -0
  204. magic_hour/types/params/v1_photo_colorizer_generate_body_assets.py +17 -0
  205. magic_hour/types/params/v1_text_to_video_create_body.py +78 -0
  206. magic_hour/types/params/v1_text_to_video_create_body_style.py +43 -0
  207. magic_hour/types/params/v1_video_to_video_create_body.py +101 -0
  208. magic_hour/types/params/{post_v1_video_to_video_body_assets.py → v1_video_to_video_create_body_assets.py} +9 -4
  209. magic_hour/types/params/{post_v1_video_to_video_body_style.py → v1_video_to_video_create_body_style.py} +68 -26
  210. magic_hour/types/params/v1_video_to_video_generate_body_assets.py +27 -0
  211. magic_hour-0.44.0.dist-info/METADATA +328 -0
  212. magic_hour-0.44.0.dist-info/RECORD +231 -0
  213. magic_hour/core/__init__.py +0 -52
  214. magic_hour/core/api_error.py +0 -56
  215. magic_hour/core/auth.py +0 -314
  216. magic_hour/core/base_client.py +0 -618
  217. magic_hour/core/binary_response.py +0 -23
  218. magic_hour/core/query.py +0 -106
  219. magic_hour/core/request.py +0 -156
  220. magic_hour/core/response.py +0 -293
  221. magic_hour/core/type_utils.py +0 -28
  222. magic_hour/core/utils.py +0 -55
  223. magic_hour/types/models/post_v1_ai_clothes_changer_response.py +0 -25
  224. magic_hour/types/models/post_v1_ai_headshot_generator_response.py +0 -25
  225. magic_hour/types/models/post_v1_ai_image_generator_response.py +0 -25
  226. magic_hour/types/models/post_v1_ai_image_upscaler_response.py +0 -25
  227. magic_hour/types/models/post_v1_ai_photo_editor_response.py +0 -25
  228. magic_hour/types/models/post_v1_ai_qr_code_generator_response.py +0 -25
  229. magic_hour/types/models/post_v1_animation_response.py +0 -25
  230. magic_hour/types/models/post_v1_face_swap_photo_response.py +0 -25
  231. magic_hour/types/models/post_v1_face_swap_response.py +0 -25
  232. magic_hour/types/models/post_v1_files_upload_urls_response.py +0 -21
  233. magic_hour/types/models/post_v1_image_background_remover_response.py +0 -25
  234. magic_hour/types/models/post_v1_image_to_video_response.py +0 -25
  235. magic_hour/types/models/post_v1_lip_sync_response.py +0 -25
  236. magic_hour/types/models/post_v1_text_to_video_response.py +0 -25
  237. magic_hour/types/models/post_v1_video_to_video_response.py +0 -25
  238. magic_hour/types/params/post_v1_ai_clothes_changer_body.py +0 -40
  239. magic_hour/types/params/post_v1_ai_clothes_changer_body_assets.py +0 -45
  240. magic_hour/types/params/post_v1_ai_headshot_generator_body.py +0 -40
  241. magic_hour/types/params/post_v1_ai_headshot_generator_body_assets.py +0 -28
  242. magic_hour/types/params/post_v1_ai_image_upscaler_body.py +0 -57
  243. magic_hour/types/params/post_v1_ai_image_upscaler_body_assets.py +0 -28
  244. magic_hour/types/params/post_v1_ai_photo_editor_body_assets.py +0 -28
  245. magic_hour/types/params/post_v1_ai_qr_code_generator_body.py +0 -45
  246. magic_hour/types/params/post_v1_face_swap_body.py +0 -72
  247. magic_hour/types/params/post_v1_face_swap_body_assets.py +0 -52
  248. magic_hour/types/params/post_v1_face_swap_photo_body.py +0 -40
  249. magic_hour/types/params/post_v1_face_swap_photo_body_assets.py +0 -36
  250. magic_hour/types/params/post_v1_files_upload_urls_body.py +0 -31
  251. magic_hour/types/params/post_v1_files_upload_urls_body_items_item.py +0 -38
  252. magic_hour/types/params/post_v1_image_background_remover_body.py +0 -40
  253. magic_hour/types/params/post_v1_image_background_remover_body_assets.py +0 -28
  254. magic_hour/types/params/post_v1_image_to_video_body.py +0 -73
  255. magic_hour/types/params/post_v1_image_to_video_body_assets.py +0 -28
  256. magic_hour/types/params/post_v1_image_to_video_body_style.py +0 -37
  257. magic_hour/types/params/post_v1_lip_sync_body.py +0 -80
  258. magic_hour/types/params/post_v1_text_to_video_body.py +0 -57
  259. magic_hour/types/params/post_v1_text_to_video_body_style.py +0 -28
  260. magic_hour/types/params/post_v1_video_to_video_body.py +0 -93
  261. magic_hour-0.9.5.dist-info/METADATA +0 -133
  262. magic_hour-0.9.5.dist-info/RECORD +0 -132
  263. {magic_hour-0.9.5.dist-info → magic_hour-0.44.0.dist-info}/LICENSE +0 -0
  264. {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.core import (
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
- from magic_hour.types import models, params
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.PostV1LipSyncBodyAssets,
134
+ assets: params.V1LipSyncCreateBodyAssets,
22
135
  end_seconds: float,
23
- height: int,
24
136
  start_seconds: float,
25
- width: int,
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.PostV1LipSyncResponse:
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
- 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
- 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._SerializerPostV1LipSyncBody,
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.PostV1LipSyncResponse,
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.PostV1LipSyncBodyAssets,
340
+ assets: params.V1LipSyncCreateBodyAssets,
107
341
  end_seconds: float,
108
- height: int,
109
342
  start_seconds: float,
110
- width: int,
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.PostV1LipSyncResponse:
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
- 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
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._SerializerPostV1LipSyncBody,
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.PostV1LipSyncResponse,
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
+ ```
@@ -0,0 +1,4 @@
1
+ from .client import AsyncPhotoColorizerClient, PhotoColorizerClient
2
+
3
+
4
+ __all__ = ["AsyncPhotoColorizerClient", "PhotoColorizerClient"]