videos.py 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851
  1. # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
  2. from __future__ import annotations
  3. from typing import TYPE_CHECKING, Mapping, cast
  4. from typing_extensions import Literal, assert_never
  5. import httpx
  6. from .. import _legacy_response
  7. from ..types import (
  8. VideoSize,
  9. VideoModel,
  10. VideoSeconds,
  11. video_list_params,
  12. video_remix_params,
  13. video_create_params,
  14. video_download_content_params,
  15. )
  16. from .._types import Body, Omit, Query, Headers, NotGiven, FileTypes, omit, not_given
  17. from .._utils import extract_files, maybe_transform, deepcopy_minimal, async_maybe_transform
  18. from .._compat import cached_property
  19. from .._resource import SyncAPIResource, AsyncAPIResource
  20. from .._response import (
  21. StreamedBinaryAPIResponse,
  22. AsyncStreamedBinaryAPIResponse,
  23. to_streamed_response_wrapper,
  24. async_to_streamed_response_wrapper,
  25. to_custom_streamed_response_wrapper,
  26. async_to_custom_streamed_response_wrapper,
  27. )
  28. from ..pagination import SyncConversationCursorPage, AsyncConversationCursorPage
  29. from ..types.video import Video
  30. from .._base_client import AsyncPaginator, make_request_options
  31. from .._utils._utils import is_given
  32. from ..types.video_size import VideoSize
  33. from ..types.video_model import VideoModel
  34. from ..types.video_seconds import VideoSeconds
  35. from ..types.video_delete_response import VideoDeleteResponse
  36. __all__ = ["Videos", "AsyncVideos"]
  37. class Videos(SyncAPIResource):
  38. @cached_property
  39. def with_raw_response(self) -> VideosWithRawResponse:
  40. """
  41. This property can be used as a prefix for any HTTP method call to return
  42. the raw response object instead of the parsed content.
  43. For more information, see https://www.github.com/openai/openai-python#accessing-raw-response-data-eg-headers
  44. """
  45. return VideosWithRawResponse(self)
  46. @cached_property
  47. def with_streaming_response(self) -> VideosWithStreamingResponse:
  48. """
  49. An alternative to `.with_raw_response` that doesn't eagerly read the response body.
  50. For more information, see https://www.github.com/openai/openai-python#with_streaming_response
  51. """
  52. return VideosWithStreamingResponse(self)
  53. def create(
  54. self,
  55. *,
  56. prompt: str,
  57. input_reference: FileTypes | Omit = omit,
  58. model: VideoModel | Omit = omit,
  59. seconds: VideoSeconds | Omit = omit,
  60. size: VideoSize | Omit = omit,
  61. # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
  62. # The extra values given here take precedence over values defined on the client or passed to this method.
  63. extra_headers: Headers | None = None,
  64. extra_query: Query | None = None,
  65. extra_body: Body | None = None,
  66. timeout: float | httpx.Timeout | None | NotGiven = not_given,
  67. ) -> Video:
  68. """
  69. Create a video
  70. Args:
  71. prompt: Text prompt that describes the video to generate.
  72. input_reference: Optional image reference that guides generation.
  73. model: The video generation model to use (allowed values: sora-2, sora-2-pro). Defaults
  74. to `sora-2`.
  75. seconds: Clip duration in seconds (allowed values: 4, 8, 12). Defaults to 4 seconds.
  76. size: Output resolution formatted as width x height (allowed values: 720x1280,
  77. 1280x720, 1024x1792, 1792x1024). Defaults to 720x1280.
  78. extra_headers: Send extra headers
  79. extra_query: Add additional query parameters to the request
  80. extra_body: Add additional JSON properties to the request
  81. timeout: Override the client-level default timeout for this request, in seconds
  82. """
  83. body = deepcopy_minimal(
  84. {
  85. "prompt": prompt,
  86. "input_reference": input_reference,
  87. "model": model,
  88. "seconds": seconds,
  89. "size": size,
  90. }
  91. )
  92. files = extract_files(cast(Mapping[str, object], body), paths=[["input_reference"]])
  93. if files:
  94. # It should be noted that the actual Content-Type header that will be
  95. # sent to the server will contain a `boundary` parameter, e.g.
  96. # multipart/form-data; boundary=---abc--
  97. extra_headers = {"Content-Type": "multipart/form-data", **(extra_headers or {})}
  98. return self._post(
  99. "/videos",
  100. body=maybe_transform(body, video_create_params.VideoCreateParams),
  101. files=files,
  102. options=make_request_options(
  103. extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
  104. ),
  105. cast_to=Video,
  106. )
  107. def create_and_poll(
  108. self,
  109. *,
  110. prompt: str,
  111. input_reference: FileTypes | Omit = omit,
  112. model: VideoModel | Omit = omit,
  113. seconds: VideoSeconds | Omit = omit,
  114. size: VideoSize | Omit = omit,
  115. poll_interval_ms: int | Omit = omit,
  116. # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
  117. # The extra values given here take precedence over values defined on the client or passed to this method.
  118. extra_headers: Headers | None = None,
  119. extra_query: Query | None = None,
  120. extra_body: Body | None = None,
  121. timeout: float | httpx.Timeout | None | NotGiven = not_given,
  122. ) -> Video:
  123. """Create a video and wait for it to be processed."""
  124. video = self.create(
  125. model=model,
  126. prompt=prompt,
  127. input_reference=input_reference,
  128. seconds=seconds,
  129. size=size,
  130. extra_headers=extra_headers,
  131. extra_query=extra_query,
  132. extra_body=extra_body,
  133. timeout=timeout,
  134. )
  135. return self.poll(
  136. video.id,
  137. poll_interval_ms=poll_interval_ms,
  138. )
  139. def poll(
  140. self,
  141. video_id: str,
  142. *,
  143. poll_interval_ms: int | Omit = omit,
  144. ) -> Video:
  145. """Wait for the vector store file to finish processing.
  146. Note: this will return even if the file failed to process, you need to check
  147. file.last_error and file.status to handle these cases
  148. """
  149. headers: dict[str, str] = {"X-Stainless-Poll-Helper": "true"}
  150. if is_given(poll_interval_ms):
  151. headers["X-Stainless-Custom-Poll-Interval"] = str(poll_interval_ms)
  152. while True:
  153. response = self.with_raw_response.retrieve(
  154. video_id,
  155. extra_headers=headers,
  156. )
  157. video = response.parse()
  158. if video.status == "in_progress" or video.status == "queued":
  159. if not is_given(poll_interval_ms):
  160. from_header = response.headers.get("openai-poll-after-ms")
  161. if from_header is not None:
  162. poll_interval_ms = int(from_header)
  163. else:
  164. poll_interval_ms = 1000
  165. self._sleep(poll_interval_ms / 1000)
  166. elif video.status == "completed" or video.status == "failed":
  167. return video
  168. else:
  169. if TYPE_CHECKING: # type: ignore[unreachable]
  170. assert_never(video.status)
  171. else:
  172. return video
  173. def retrieve(
  174. self,
  175. video_id: str,
  176. *,
  177. # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
  178. # The extra values given here take precedence over values defined on the client or passed to this method.
  179. extra_headers: Headers | None = None,
  180. extra_query: Query | None = None,
  181. extra_body: Body | None = None,
  182. timeout: float | httpx.Timeout | None | NotGiven = not_given,
  183. ) -> Video:
  184. """
  185. Retrieve a video
  186. Args:
  187. extra_headers: Send extra headers
  188. extra_query: Add additional query parameters to the request
  189. extra_body: Add additional JSON properties to the request
  190. timeout: Override the client-level default timeout for this request, in seconds
  191. """
  192. if not video_id:
  193. raise ValueError(f"Expected a non-empty value for `video_id` but received {video_id!r}")
  194. return self._get(
  195. f"/videos/{video_id}",
  196. options=make_request_options(
  197. extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
  198. ),
  199. cast_to=Video,
  200. )
  201. def list(
  202. self,
  203. *,
  204. after: str | Omit = omit,
  205. limit: int | Omit = omit,
  206. order: Literal["asc", "desc"] | Omit = omit,
  207. # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
  208. # The extra values given here take precedence over values defined on the client or passed to this method.
  209. extra_headers: Headers | None = None,
  210. extra_query: Query | None = None,
  211. extra_body: Body | None = None,
  212. timeout: float | httpx.Timeout | None | NotGiven = not_given,
  213. ) -> SyncConversationCursorPage[Video]:
  214. """
  215. List videos
  216. Args:
  217. after: Identifier for the last item from the previous pagination request
  218. limit: Number of items to retrieve
  219. order: Sort order of results by timestamp. Use `asc` for ascending order or `desc` for
  220. descending order.
  221. extra_headers: Send extra headers
  222. extra_query: Add additional query parameters to the request
  223. extra_body: Add additional JSON properties to the request
  224. timeout: Override the client-level default timeout for this request, in seconds
  225. """
  226. return self._get_api_list(
  227. "/videos",
  228. page=SyncConversationCursorPage[Video],
  229. options=make_request_options(
  230. extra_headers=extra_headers,
  231. extra_query=extra_query,
  232. extra_body=extra_body,
  233. timeout=timeout,
  234. query=maybe_transform(
  235. {
  236. "after": after,
  237. "limit": limit,
  238. "order": order,
  239. },
  240. video_list_params.VideoListParams,
  241. ),
  242. ),
  243. model=Video,
  244. )
  245. def delete(
  246. self,
  247. video_id: str,
  248. *,
  249. # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
  250. # The extra values given here take precedence over values defined on the client or passed to this method.
  251. extra_headers: Headers | None = None,
  252. extra_query: Query | None = None,
  253. extra_body: Body | None = None,
  254. timeout: float | httpx.Timeout | None | NotGiven = not_given,
  255. ) -> VideoDeleteResponse:
  256. """
  257. Delete a video
  258. Args:
  259. extra_headers: Send extra headers
  260. extra_query: Add additional query parameters to the request
  261. extra_body: Add additional JSON properties to the request
  262. timeout: Override the client-level default timeout for this request, in seconds
  263. """
  264. if not video_id:
  265. raise ValueError(f"Expected a non-empty value for `video_id` but received {video_id!r}")
  266. return self._delete(
  267. f"/videos/{video_id}",
  268. options=make_request_options(
  269. extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
  270. ),
  271. cast_to=VideoDeleteResponse,
  272. )
  273. def download_content(
  274. self,
  275. video_id: str,
  276. *,
  277. variant: Literal["video", "thumbnail", "spritesheet"] | Omit = omit,
  278. # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
  279. # The extra values given here take precedence over values defined on the client or passed to this method.
  280. extra_headers: Headers | None = None,
  281. extra_query: Query | None = None,
  282. extra_body: Body | None = None,
  283. timeout: float | httpx.Timeout | None | NotGiven = not_given,
  284. ) -> _legacy_response.HttpxBinaryResponseContent:
  285. """Download video content
  286. Args:
  287. variant: Which downloadable asset to return.
  288. Defaults to the MP4 video.
  289. extra_headers: Send extra headers
  290. extra_query: Add additional query parameters to the request
  291. extra_body: Add additional JSON properties to the request
  292. timeout: Override the client-level default timeout for this request, in seconds
  293. """
  294. if not video_id:
  295. raise ValueError(f"Expected a non-empty value for `video_id` but received {video_id!r}")
  296. extra_headers = {"Accept": "application/binary", **(extra_headers or {})}
  297. return self._get(
  298. f"/videos/{video_id}/content",
  299. options=make_request_options(
  300. extra_headers=extra_headers,
  301. extra_query=extra_query,
  302. extra_body=extra_body,
  303. timeout=timeout,
  304. query=maybe_transform({"variant": variant}, video_download_content_params.VideoDownloadContentParams),
  305. ),
  306. cast_to=_legacy_response.HttpxBinaryResponseContent,
  307. )
  308. def remix(
  309. self,
  310. video_id: str,
  311. *,
  312. prompt: str,
  313. # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
  314. # The extra values given here take precedence over values defined on the client or passed to this method.
  315. extra_headers: Headers | None = None,
  316. extra_query: Query | None = None,
  317. extra_body: Body | None = None,
  318. timeout: float | httpx.Timeout | None | NotGiven = not_given,
  319. ) -> Video:
  320. """
  321. Create a video remix
  322. Args:
  323. prompt: Updated text prompt that directs the remix generation.
  324. extra_headers: Send extra headers
  325. extra_query: Add additional query parameters to the request
  326. extra_body: Add additional JSON properties to the request
  327. timeout: Override the client-level default timeout for this request, in seconds
  328. """
  329. if not video_id:
  330. raise ValueError(f"Expected a non-empty value for `video_id` but received {video_id!r}")
  331. return self._post(
  332. f"/videos/{video_id}/remix",
  333. body=maybe_transform({"prompt": prompt}, video_remix_params.VideoRemixParams),
  334. options=make_request_options(
  335. extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
  336. ),
  337. cast_to=Video,
  338. )
  339. class AsyncVideos(AsyncAPIResource):
  340. @cached_property
  341. def with_raw_response(self) -> AsyncVideosWithRawResponse:
  342. """
  343. This property can be used as a prefix for any HTTP method call to return
  344. the raw response object instead of the parsed content.
  345. For more information, see https://www.github.com/openai/openai-python#accessing-raw-response-data-eg-headers
  346. """
  347. return AsyncVideosWithRawResponse(self)
  348. @cached_property
  349. def with_streaming_response(self) -> AsyncVideosWithStreamingResponse:
  350. """
  351. An alternative to `.with_raw_response` that doesn't eagerly read the response body.
  352. For more information, see https://www.github.com/openai/openai-python#with_streaming_response
  353. """
  354. return AsyncVideosWithStreamingResponse(self)
  355. async def create(
  356. self,
  357. *,
  358. prompt: str,
  359. input_reference: FileTypes | Omit = omit,
  360. model: VideoModel | Omit = omit,
  361. seconds: VideoSeconds | Omit = omit,
  362. size: VideoSize | Omit = omit,
  363. # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
  364. # The extra values given here take precedence over values defined on the client or passed to this method.
  365. extra_headers: Headers | None = None,
  366. extra_query: Query | None = None,
  367. extra_body: Body | None = None,
  368. timeout: float | httpx.Timeout | None | NotGiven = not_given,
  369. ) -> Video:
  370. """
  371. Create a video
  372. Args:
  373. prompt: Text prompt that describes the video to generate.
  374. input_reference: Optional image reference that guides generation.
  375. model: The video generation model to use (allowed values: sora-2, sora-2-pro). Defaults
  376. to `sora-2`.
  377. seconds: Clip duration in seconds (allowed values: 4, 8, 12). Defaults to 4 seconds.
  378. size: Output resolution formatted as width x height (allowed values: 720x1280,
  379. 1280x720, 1024x1792, 1792x1024). Defaults to 720x1280.
  380. extra_headers: Send extra headers
  381. extra_query: Add additional query parameters to the request
  382. extra_body: Add additional JSON properties to the request
  383. timeout: Override the client-level default timeout for this request, in seconds
  384. """
  385. body = deepcopy_minimal(
  386. {
  387. "prompt": prompt,
  388. "input_reference": input_reference,
  389. "model": model,
  390. "seconds": seconds,
  391. "size": size,
  392. }
  393. )
  394. files = extract_files(cast(Mapping[str, object], body), paths=[["input_reference"]])
  395. if files:
  396. # It should be noted that the actual Content-Type header that will be
  397. # sent to the server will contain a `boundary` parameter, e.g.
  398. # multipart/form-data; boundary=---abc--
  399. extra_headers = {"Content-Type": "multipart/form-data", **(extra_headers or {})}
  400. return await self._post(
  401. "/videos",
  402. body=await async_maybe_transform(body, video_create_params.VideoCreateParams),
  403. files=files,
  404. options=make_request_options(
  405. extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
  406. ),
  407. cast_to=Video,
  408. )
  409. async def create_and_poll(
  410. self,
  411. *,
  412. prompt: str,
  413. input_reference: FileTypes | Omit = omit,
  414. model: VideoModel | Omit = omit,
  415. seconds: VideoSeconds | Omit = omit,
  416. size: VideoSize | Omit = omit,
  417. poll_interval_ms: int | Omit = omit,
  418. # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
  419. # The extra values given here take precedence over values defined on the client or passed to this method.
  420. extra_headers: Headers | None = None,
  421. extra_query: Query | None = None,
  422. extra_body: Body | None = None,
  423. timeout: float | httpx.Timeout | None | NotGiven = not_given,
  424. ) -> Video:
  425. """Create a video and wait for it to be processed."""
  426. video = await self.create(
  427. model=model,
  428. prompt=prompt,
  429. input_reference=input_reference,
  430. seconds=seconds,
  431. size=size,
  432. extra_headers=extra_headers,
  433. extra_query=extra_query,
  434. extra_body=extra_body,
  435. timeout=timeout,
  436. )
  437. return await self.poll(
  438. video.id,
  439. poll_interval_ms=poll_interval_ms,
  440. )
  441. async def poll(
  442. self,
  443. video_id: str,
  444. *,
  445. poll_interval_ms: int | Omit = omit,
  446. ) -> Video:
  447. """Wait for the vector store file to finish processing.
  448. Note: this will return even if the file failed to process, you need to check
  449. file.last_error and file.status to handle these cases
  450. """
  451. headers: dict[str, str] = {"X-Stainless-Poll-Helper": "true"}
  452. if is_given(poll_interval_ms):
  453. headers["X-Stainless-Custom-Poll-Interval"] = str(poll_interval_ms)
  454. while True:
  455. response = await self.with_raw_response.retrieve(
  456. video_id,
  457. extra_headers=headers,
  458. )
  459. video = response.parse()
  460. if video.status == "in_progress" or video.status == "queued":
  461. if not is_given(poll_interval_ms):
  462. from_header = response.headers.get("openai-poll-after-ms")
  463. if from_header is not None:
  464. poll_interval_ms = int(from_header)
  465. else:
  466. poll_interval_ms = 1000
  467. await self._sleep(poll_interval_ms / 1000)
  468. elif video.status == "completed" or video.status == "failed":
  469. return video
  470. else:
  471. if TYPE_CHECKING: # type: ignore[unreachable]
  472. assert_never(video.status)
  473. else:
  474. return video
  475. async def retrieve(
  476. self,
  477. video_id: str,
  478. *,
  479. # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
  480. # The extra values given here take precedence over values defined on the client or passed to this method.
  481. extra_headers: Headers | None = None,
  482. extra_query: Query | None = None,
  483. extra_body: Body | None = None,
  484. timeout: float | httpx.Timeout | None | NotGiven = not_given,
  485. ) -> Video:
  486. """
  487. Retrieve a video
  488. Args:
  489. extra_headers: Send extra headers
  490. extra_query: Add additional query parameters to the request
  491. extra_body: Add additional JSON properties to the request
  492. timeout: Override the client-level default timeout for this request, in seconds
  493. """
  494. if not video_id:
  495. raise ValueError(f"Expected a non-empty value for `video_id` but received {video_id!r}")
  496. return await self._get(
  497. f"/videos/{video_id}",
  498. options=make_request_options(
  499. extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
  500. ),
  501. cast_to=Video,
  502. )
  503. def list(
  504. self,
  505. *,
  506. after: str | Omit = omit,
  507. limit: int | Omit = omit,
  508. order: Literal["asc", "desc"] | Omit = omit,
  509. # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
  510. # The extra values given here take precedence over values defined on the client or passed to this method.
  511. extra_headers: Headers | None = None,
  512. extra_query: Query | None = None,
  513. extra_body: Body | None = None,
  514. timeout: float | httpx.Timeout | None | NotGiven = not_given,
  515. ) -> AsyncPaginator[Video, AsyncConversationCursorPage[Video]]:
  516. """
  517. List videos
  518. Args:
  519. after: Identifier for the last item from the previous pagination request
  520. limit: Number of items to retrieve
  521. order: Sort order of results by timestamp. Use `asc` for ascending order or `desc` for
  522. descending order.
  523. extra_headers: Send extra headers
  524. extra_query: Add additional query parameters to the request
  525. extra_body: Add additional JSON properties to the request
  526. timeout: Override the client-level default timeout for this request, in seconds
  527. """
  528. return self._get_api_list(
  529. "/videos",
  530. page=AsyncConversationCursorPage[Video],
  531. options=make_request_options(
  532. extra_headers=extra_headers,
  533. extra_query=extra_query,
  534. extra_body=extra_body,
  535. timeout=timeout,
  536. query=maybe_transform(
  537. {
  538. "after": after,
  539. "limit": limit,
  540. "order": order,
  541. },
  542. video_list_params.VideoListParams,
  543. ),
  544. ),
  545. model=Video,
  546. )
  547. async def delete(
  548. self,
  549. video_id: str,
  550. *,
  551. # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
  552. # The extra values given here take precedence over values defined on the client or passed to this method.
  553. extra_headers: Headers | None = None,
  554. extra_query: Query | None = None,
  555. extra_body: Body | None = None,
  556. timeout: float | httpx.Timeout | None | NotGiven = not_given,
  557. ) -> VideoDeleteResponse:
  558. """
  559. Delete a video
  560. Args:
  561. extra_headers: Send extra headers
  562. extra_query: Add additional query parameters to the request
  563. extra_body: Add additional JSON properties to the request
  564. timeout: Override the client-level default timeout for this request, in seconds
  565. """
  566. if not video_id:
  567. raise ValueError(f"Expected a non-empty value for `video_id` but received {video_id!r}")
  568. return await self._delete(
  569. f"/videos/{video_id}",
  570. options=make_request_options(
  571. extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
  572. ),
  573. cast_to=VideoDeleteResponse,
  574. )
  575. async def download_content(
  576. self,
  577. video_id: str,
  578. *,
  579. variant: Literal["video", "thumbnail", "spritesheet"] | Omit = omit,
  580. # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
  581. # The extra values given here take precedence over values defined on the client or passed to this method.
  582. extra_headers: Headers | None = None,
  583. extra_query: Query | None = None,
  584. extra_body: Body | None = None,
  585. timeout: float | httpx.Timeout | None | NotGiven = not_given,
  586. ) -> _legacy_response.HttpxBinaryResponseContent:
  587. """Download video content
  588. Args:
  589. variant: Which downloadable asset to return.
  590. Defaults to the MP4 video.
  591. extra_headers: Send extra headers
  592. extra_query: Add additional query parameters to the request
  593. extra_body: Add additional JSON properties to the request
  594. timeout: Override the client-level default timeout for this request, in seconds
  595. """
  596. if not video_id:
  597. raise ValueError(f"Expected a non-empty value for `video_id` but received {video_id!r}")
  598. extra_headers = {"Accept": "application/binary", **(extra_headers or {})}
  599. return await self._get(
  600. f"/videos/{video_id}/content",
  601. options=make_request_options(
  602. extra_headers=extra_headers,
  603. extra_query=extra_query,
  604. extra_body=extra_body,
  605. timeout=timeout,
  606. query=await async_maybe_transform(
  607. {"variant": variant}, video_download_content_params.VideoDownloadContentParams
  608. ),
  609. ),
  610. cast_to=_legacy_response.HttpxBinaryResponseContent,
  611. )
  612. async def remix(
  613. self,
  614. video_id: str,
  615. *,
  616. prompt: str,
  617. # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
  618. # The extra values given here take precedence over values defined on the client or passed to this method.
  619. extra_headers: Headers | None = None,
  620. extra_query: Query | None = None,
  621. extra_body: Body | None = None,
  622. timeout: float | httpx.Timeout | None | NotGiven = not_given,
  623. ) -> Video:
  624. """
  625. Create a video remix
  626. Args:
  627. prompt: Updated text prompt that directs the remix generation.
  628. extra_headers: Send extra headers
  629. extra_query: Add additional query parameters to the request
  630. extra_body: Add additional JSON properties to the request
  631. timeout: Override the client-level default timeout for this request, in seconds
  632. """
  633. if not video_id:
  634. raise ValueError(f"Expected a non-empty value for `video_id` but received {video_id!r}")
  635. return await self._post(
  636. f"/videos/{video_id}/remix",
  637. body=await async_maybe_transform({"prompt": prompt}, video_remix_params.VideoRemixParams),
  638. options=make_request_options(
  639. extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
  640. ),
  641. cast_to=Video,
  642. )
  643. class VideosWithRawResponse:
  644. def __init__(self, videos: Videos) -> None:
  645. self._videos = videos
  646. self.create = _legacy_response.to_raw_response_wrapper(
  647. videos.create,
  648. )
  649. self.retrieve = _legacy_response.to_raw_response_wrapper(
  650. videos.retrieve,
  651. )
  652. self.list = _legacy_response.to_raw_response_wrapper(
  653. videos.list,
  654. )
  655. self.delete = _legacy_response.to_raw_response_wrapper(
  656. videos.delete,
  657. )
  658. self.download_content = _legacy_response.to_raw_response_wrapper(
  659. videos.download_content,
  660. )
  661. self.remix = _legacy_response.to_raw_response_wrapper(
  662. videos.remix,
  663. )
  664. class AsyncVideosWithRawResponse:
  665. def __init__(self, videos: AsyncVideos) -> None:
  666. self._videos = videos
  667. self.create = _legacy_response.async_to_raw_response_wrapper(
  668. videos.create,
  669. )
  670. self.retrieve = _legacy_response.async_to_raw_response_wrapper(
  671. videos.retrieve,
  672. )
  673. self.list = _legacy_response.async_to_raw_response_wrapper(
  674. videos.list,
  675. )
  676. self.delete = _legacy_response.async_to_raw_response_wrapper(
  677. videos.delete,
  678. )
  679. self.download_content = _legacy_response.async_to_raw_response_wrapper(
  680. videos.download_content,
  681. )
  682. self.remix = _legacy_response.async_to_raw_response_wrapper(
  683. videos.remix,
  684. )
  685. class VideosWithStreamingResponse:
  686. def __init__(self, videos: Videos) -> None:
  687. self._videos = videos
  688. self.create = to_streamed_response_wrapper(
  689. videos.create,
  690. )
  691. self.retrieve = to_streamed_response_wrapper(
  692. videos.retrieve,
  693. )
  694. self.list = to_streamed_response_wrapper(
  695. videos.list,
  696. )
  697. self.delete = to_streamed_response_wrapper(
  698. videos.delete,
  699. )
  700. self.download_content = to_custom_streamed_response_wrapper(
  701. videos.download_content,
  702. StreamedBinaryAPIResponse,
  703. )
  704. self.remix = to_streamed_response_wrapper(
  705. videos.remix,
  706. )
  707. class AsyncVideosWithStreamingResponse:
  708. def __init__(self, videos: AsyncVideos) -> None:
  709. self._videos = videos
  710. self.create = async_to_streamed_response_wrapper(
  711. videos.create,
  712. )
  713. self.retrieve = async_to_streamed_response_wrapper(
  714. videos.retrieve,
  715. )
  716. self.list = async_to_streamed_response_wrapper(
  717. videos.list,
  718. )
  719. self.delete = async_to_streamed_response_wrapper(
  720. videos.delete,
  721. )
  722. self.download_content = async_to_custom_streamed_response_wrapper(
  723. videos.download_content,
  724. AsyncStreamedBinaryAPIResponse,
  725. )
  726. self.remix = async_to_streamed_response_wrapper(
  727. videos.remix,
  728. )