Skip to main content

async_openai/
video.rs

1#![allow(deprecated)]
2
3use crate::{
4    config::Config,
5    error::OpenAIError,
6    types::videos::{
7        CreateVideoCharacterRequest, CreateVideoEditRequest, CreateVideoExtendRequest,
8        CreateVideoRequest, DeletedVideoResource, RemixVideoRequest, VideoCharacterResource,
9        VideoListResource, VideoResource,
10    },
11    Client, RequestOptions,
12};
13use bytes::Bytes;
14
15/// Video generation with Sora
16/// Related guide: [Video generation](https://platform.openai.com/docs/guides/video-generation)
17#[deprecated(note = "The Videos API is deprecated.")]
18pub struct Videos<'c, C: Config> {
19    client: &'c Client<C>,
20    pub(crate) request_options: RequestOptions,
21}
22
23impl<'c, C: Config> Videos<'c, C> {
24    pub fn new(client: &'c Client<C>) -> Self {
25        Self {
26            client,
27            request_options: RequestOptions::new(),
28        }
29    }
30
31    /// Create a video
32    #[crate::byot(
33        T0 = Clone,
34        R = serde::de::DeserializeOwned,
35        where_clause =  "reqwest::multipart::Form: crate::traits::AsyncTryFrom<T0, Error = OpenAIError>, T0: crate::traits::MaybeSend + 'static",
36    )]
37    pub async fn create(&self, request: CreateVideoRequest) -> Result<VideoResource, OpenAIError> {
38        self.client
39            .post_form("/videos", request, &self.request_options)
40            .await
41    }
42
43    /// Create a video remix
44    #[crate::byot(T0 = std::fmt::Display, T1 = serde::Serialize, R = serde::de::DeserializeOwned)]
45    pub async fn remix(
46        &self,
47        video_id: &str,
48        request: RemixVideoRequest,
49    ) -> Result<VideoResource, OpenAIError> {
50        self.client
51            .post(
52                &format!("/videos/{video_id}/remix"),
53                request,
54                &self.request_options,
55            )
56            .await
57    }
58
59    /// Create a character from an uploaded video.
60    #[crate::byot(
61        T0 = Clone,
62        R = serde::de::DeserializeOwned,
63        where_clause = "reqwest::multipart::Form: crate::traits::AsyncTryFrom<T0, Error = OpenAIError>, T0: crate::traits::MaybeSend + 'static",
64    )]
65    pub async fn create_character(
66        &self,
67        request: CreateVideoCharacterRequest,
68    ) -> Result<VideoCharacterResource, OpenAIError> {
69        self.client
70            .post_form("/videos/characters", request, &self.request_options)
71            .await
72    }
73
74    /// Fetch a character by its ID.
75    #[crate::byot(T0 = std::fmt::Display, R = serde::de::DeserializeOwned)]
76    pub async fn get_character(
77        &self,
78        character_id: &str,
79    ) -> Result<VideoCharacterResource, OpenAIError> {
80        self.client
81            .get(
82                &format!("/videos/characters/{character_id}"),
83                &self.request_options,
84            )
85            .await
86    }
87
88    /// Create a new video generation job by editing a source video.
89    #[crate::byot(
90        T0 = Clone,
91        R = serde::de::DeserializeOwned,
92        where_clause = "reqwest::multipart::Form: crate::traits::AsyncTryFrom<T0, Error = OpenAIError>, T0: crate::traits::MaybeSend + 'static",
93    )]
94    pub async fn edit(
95        &self,
96        request: CreateVideoEditRequest,
97    ) -> Result<VideoResource, OpenAIError> {
98        self.client
99            .post_form("/videos/edits", request, &self.request_options)
100            .await
101    }
102
103    /// Create an extension of a completed video.
104    #[crate::byot(
105        T0 = Clone,
106        R = serde::de::DeserializeOwned,
107        where_clause = "reqwest::multipart::Form: crate::traits::AsyncTryFrom<T0, Error = OpenAIError>, T0: crate::traits::MaybeSend + 'static",
108    )]
109    pub async fn extend(
110        &self,
111        request: CreateVideoExtendRequest,
112    ) -> Result<VideoResource, OpenAIError> {
113        self.client
114            .post_form("/videos/extensions", request, &self.request_options)
115            .await
116    }
117
118    /// Retrieves a video by its ID.
119    #[crate::byot(T0 = std::fmt::Display, R = serde::de::DeserializeOwned)]
120    pub async fn retrieve(&self, video_id: &str) -> Result<VideoResource, OpenAIError> {
121        self.client
122            .get(&format!("/videos/{}", video_id), &self.request_options)
123            .await
124    }
125
126    /// Delete a Video
127    #[crate::byot(T0 = std::fmt::Display, R = serde::de::DeserializeOwned)]
128    pub async fn delete(&self, video_id: &str) -> Result<DeletedVideoResource, OpenAIError> {
129        self.client
130            .delete(&format!("/videos/{}", video_id), &self.request_options)
131            .await
132    }
133
134    /// List Videos
135    #[crate::byot(R = serde::de::DeserializeOwned)]
136    pub async fn list(&self) -> Result<VideoListResource, OpenAIError> {
137        self.client.get("/videos", &self.request_options).await
138    }
139
140    /// Download video content.
141    /// Variant can be provided as query parameter
142    pub async fn download_content(&self, video_id: &str) -> Result<Bytes, OpenAIError> {
143        let (bytes, _headers) = self
144            .client
145            .get_raw(
146                &format!("/videos/{video_id}/content"),
147                &self.request_options,
148            )
149            .await?;
150        Ok(bytes)
151    }
152}