1use std::collections::BTreeMap;
2
3use serde::{Deserialize, Serialize, de};
4
5use super::super::common::Extra;
6use super::{
7 VideoContentVariant, VideoExtensionSeconds, VideoListOrder, VideoModelId, VideoSeconds,
8 VideoSize,
9};
10
11#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
12#[non_exhaustive]
13pub struct CreateVideoRequest {
14 pub prompt: String,
15 #[serde(skip_serializing_if = "Option::is_none")]
16 pub input_reference: Option<VideoInputReference>,
17 #[serde(skip_serializing_if = "Option::is_none")]
18 pub model: Option<VideoModelId>,
19 #[serde(skip_serializing_if = "Option::is_none")]
20 pub seconds: Option<VideoSeconds>,
21 #[serde(skip_serializing_if = "Option::is_none")]
22 pub size: Option<VideoSize>,
23 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
24 pub extra: Extra,
25}
26
27#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
31#[serde(untagged)]
32#[non_exhaustive]
33pub enum VideoInputReference {
34 File(String),
35 Image(VideoImageReference),
36}
37
38#[derive(Debug, Clone, PartialEq, Serialize, gproxy_protocol_macros::WireBuilder)]
39#[non_exhaustive]
40pub struct VideoImageReference {
41 #[serde(skip_serializing_if = "Option::is_none")]
42 pub file_id: Option<String>,
43 #[serde(skip_serializing_if = "Option::is_none")]
44 pub image_url: Option<String>,
45 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
46 pub extra: Extra,
47}
48
49impl<'de> Deserialize<'de> for VideoImageReference {
50 fn deserialize<D: serde::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
51 #[derive(Deserialize)]
52 struct Raw {
53 file_id: Option<String>,
54 image_url: Option<String>,
55 #[serde(default, flatten)]
56 extra: Extra,
57 }
58
59 let raw = Raw::deserialize(deserializer)?;
60 match (raw.file_id.is_some(), raw.image_url.is_some()) {
61 (true, false) | (false, true) => Ok(Self {
62 file_id: raw.file_id,
63 image_url: raw.image_url,
64 extra: raw.extra,
65 }),
66 (true, true) => Err(de::Error::custom(
67 "video image reference must contain exactly one of file_id or image_url",
68 )),
69 (false, false) => Err(de::Error::custom(
70 "video image reference must contain file_id or image_url",
71 )),
72 }
73 }
74}
75
76#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
77#[non_exhaustive]
78pub struct RetrieveVideoRequest {
79 pub video_id: String,
80 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
81 pub extra: Extra,
82}
83
84#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
85#[non_exhaustive]
86pub struct ListVideosRequest {
87 #[serde(skip_serializing_if = "Option::is_none")]
88 pub after: Option<String>,
89 #[serde(skip_serializing_if = "Option::is_none")]
90 pub limit: Option<u32>,
91 #[serde(skip_serializing_if = "Option::is_none")]
92 pub order: Option<VideoListOrder>,
93 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
94 pub extra: Extra,
95}
96
97#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
98#[non_exhaustive]
99pub struct DeleteVideoRequest {
100 pub video_id: String,
101 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
102 pub extra: Extra,
103}
104
105#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
106#[non_exhaustive]
107pub struct DownloadVideoContentRequest {
108 pub video_id: String,
109 #[serde(skip_serializing_if = "Option::is_none")]
110 pub variant: Option<VideoContentVariant>,
111 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
112 pub extra: Extra,
113}
114
115#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
116#[non_exhaustive]
117pub struct RemixVideoRequest {
118 pub video_id: String,
119 pub prompt: String,
120 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
121 pub extra: Extra,
122}
123
124#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
125#[non_exhaustive]
126pub struct CreateVideoCharacterRequest {
127 pub name: String,
128 pub video: String,
130 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
131 pub extra: Extra,
132}
133
134#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
135#[non_exhaustive]
136pub struct GetVideoCharacterRequest {
137 pub character_id: String,
138 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
139 pub extra: Extra,
140}
141
142#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
143#[non_exhaustive]
144pub struct EditVideoRequest {
145 pub prompt: String,
146 pub video: VideoReference,
147 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
148 pub extra: Extra,
149}
150
151#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
152#[non_exhaustive]
153pub struct ExtendVideoRequest {
154 pub prompt: String,
155 pub seconds: VideoExtensionSeconds,
156 pub video: VideoReference,
157 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
158 pub extra: Extra,
159}
160
161#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
163#[serde(untagged)]
164#[non_exhaustive]
165pub enum VideoReference {
166 File(String),
167 Existing(VideoIdReference),
168}
169
170#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
171#[non_exhaustive]
172pub struct VideoIdReference {
173 pub id: String,
174 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
175 pub extra: Extra,
176}