pixabay_sdk/
models.rs

1use serde::{Deserialize, Serialize};
2
3/// 图片搜索响应
4///
5/// 包含图片搜索结果的总数量和图片列表。
6#[derive(Debug, Clone, Serialize, Deserialize)]
7pub struct ImageResponse {
8    /// 结果总数
9    pub total: u32,
10    #[serde(rename = "totalHits")]
11    /// 匹配结果总数
12    pub total_hits: u32,
13    /// 图片列表
14    pub hits: Vec<Image>,
15}
16
17/// Pixabay 图片数据结构
18///
19/// 包含图片的所有信息,包括预览图、缩略图、高清图链接等。
20#[derive(Debug, Clone, Serialize, Deserialize)]
21pub struct Image {
22    /// 图片唯一标识符
23    pub id: u64,
24    #[serde(rename = "pageURL")]
25    /// 图片在 Pixabay 上的页面 URL
26    pub page_url: String,
27    #[serde(rename = "type")]
28    /// 图片类型(如 photo、illustration、vector)
29    pub image_type: String,
30    /// 图片标签
31    pub tags: String,
32    #[serde(rename = "previewURL")]
33    /// 预览图 URL(小尺寸)
34    pub preview_url: String,
35    #[serde(rename = "previewWidth")]
36    /// 预览图宽度
37    pub preview_width: u32,
38    #[serde(rename = "previewHeight")]
39    /// 预览图高度
40    pub preview_height: u32,
41    #[serde(rename = "webformatURL")]
42    /// 缩略图 URL(中等尺寸)
43    pub webformat_url: String,
44    #[serde(rename = "webformatWidth")]
45    /// 缩略图宽度
46    pub webformat_width: u32,
47    #[serde(rename = "webformatHeight")]
48    /// 缩略图高度
49    pub webformat_height: u32,
50    #[serde(rename = "largeImageURL")]
51    /// 大图 URL(高清分辨率)
52    pub large_image_url: String,
53    #[serde(rename = "fullHDURL", skip_serializing_if = "Option::is_none")]
54    /// 全高清图 URL
55    pub full_hd_url: Option<String>,
56    #[serde(rename = "imageURL", skip_serializing_if = "Option::is_none")]
57    /// 原始图片 URL
58    pub image_url: Option<String>,
59    #[serde(rename = "vectorURL", skip_serializing_if = "Option::is_none")]
60    /// 矢量图 URL
61    pub vector_url: Option<String>,
62    #[serde(rename = "imageWidth")]
63    /// 图片宽度
64    pub image_width: u32,
65    #[serde(rename = "imageHeight")]
66    /// 图片高度
67    pub image_height: u32,
68    #[serde(rename = "imageSize")]
69    /// 图片大小(字节)
70    pub image_size: u64,
71    /// 浏览次数
72    pub views: u32,
73    /// 下载次数
74    pub downloads: u32,
75    #[serde(skip_serializing_if = "Option::is_none")]
76    /// 收藏次数
77    pub collections: Option<u32>,
78    /// 点赞次数
79    pub likes: u32,
80    /// 评论次数
81    pub comments: u32,
82    #[serde(rename = "user_id")]
83    /// 上传用户 ID
84    pub user_id: u64,
85    /// 上传用户名
86    pub user: String,
87    #[serde(rename = "userImageURL")]
88    /// 用户头像 URL
89    pub user_image_url: String,
90}
91
92/// 视频搜索响应
93///
94/// 包含视频搜索结果的总数量和视频列表。
95#[derive(Debug, Clone, Serialize, Deserialize)]
96pub struct VideoResponse {
97    /// 结果总数
98    pub total: u32,
99    #[serde(rename = "totalHits")]
100    /// 匹配结果总数
101    pub total_hits: u32,
102    /// 视频列表
103    pub hits: Vec<Video>,
104}
105
106/// Pixabay 视频数据结构
107///
108/// 包含视频的所有信息,包括不同分辨率的视频文件链接、时长、预览图等。
109#[derive(Debug, Clone, Serialize, Deserialize)]
110pub struct Video {
111    /// 视频唯一标识符
112    pub id: u64,
113    #[serde(rename = "pageURL")]
114    /// 视频在 Pixabay 上的页面 URL
115    pub page_url: String,
116    #[serde(rename = "type")]
117    /// 视频类型(如 film、animation)
118    pub video_type: String,
119    /// 视频标签
120    pub tags: String,
121    /// 视频时长(秒)
122    pub duration: u32,
123    /// 视频文件链接(包含不同分辨率)
124    pub videos: VideoFiles,
125    /// 浏览次数
126    pub views: u32,
127    /// 下载次数
128    pub downloads: u32,
129    /// 点赞次数
130    pub likes: u32,
131    /// 评论次数
132    pub comments: u32,
133    #[serde(rename = "user_id")]
134    /// 上传用户 ID
135    pub user_id: u64,
136    /// 上传用户名
137    pub user: String,
138    #[serde(rename = "userImageURL")]
139    /// 用户头像 URL
140    pub user_image_url: String,
141}
142
143/// 视频文件集合
144///
145/// 包含不同分辨率的视频文件链接。
146#[derive(Debug, Clone, Serialize, Deserialize)]
147pub struct VideoFiles {
148    /// 高分辨率视频(最大尺寸)
149    pub large: Option<VideoFile>,
150    /// 中等分辨率视频
151    pub medium: Option<VideoFile>,
152    /// 小分辨率视频
153    pub small: Option<VideoFile>,
154    /// 最小分辨率视频
155    pub tiny: Option<VideoFile>,
156}
157
158/// 单个视频文件信息
159///
160/// 包含视频文件的具体信息,包括 URL、分辨率、文件大小和预览图。
161#[derive(Debug, Clone, Serialize, Deserialize)]
162pub struct VideoFile {
163    /// 视频文件 URL
164    pub url: String,
165    /// 视频宽度
166    pub width: u32,
167    /// 视频高度
168    pub height: u32,
169    /// 文件大小(字节)
170    pub size: u64,
171    /// 视频预览图
172    pub thumbnail: String,
173}
174
175/// 图片类型枚举
176///
177/// 用于筛选搜索结果的图片类型。
178#[derive(Debug, Clone, Serialize, Deserialize)]
179#[serde(rename_all = "snake_case")]
180pub enum ImageType {
181    /// 所有类型
182    All,
183    /// 照片
184    Photo,
185    /// 插画
186    Illustration,
187    /// 矢量图
188    Vector,
189}
190
191impl std::fmt::Display for ImageType {
192    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
193        let s = match self {
194            ImageType::All => "all",
195            ImageType::Photo => "photo",
196            ImageType::Illustration => "illustration",
197            ImageType::Vector => "vector",
198        };
199        f.write_str(s)
200    }
201}
202
203/// 视频类型枚举
204///
205/// 用于筛选搜索结果的视频类型。
206#[derive(Debug, Clone, Serialize, Deserialize)]
207#[serde(rename_all = "snake_case")]
208pub enum VideoType {
209    /// 所有类型
210    All,
211    /// 影片
212    Film,
213    /// 动画
214    Animation,
215}
216
217impl std::fmt::Display for VideoType {
218    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
219        let s = match self {
220            VideoType::All => "all",
221            VideoType::Film => "film",
222            VideoType::Animation => "animation",
223        };
224        f.write_str(s)
225    }
226}
227
228#[derive(Debug, Clone, Serialize, Deserialize)]
229#[serde(rename_all = "snake_case")]
230pub enum Orientation {
231    All,
232    Horizontal,
233    Vertical,
234}
235
236impl std::fmt::Display for Orientation {
237    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
238        let s = match self {
239            Orientation::All => "all",
240            Orientation::Horizontal => "horizontal",
241            Orientation::Vertical => "vertical",
242        };
243        f.write_str(s)
244    }
245}
246
247/// 图片分类枚举
248///
249/// 用于筛选搜索结果的图片分类。
250#[derive(Debug, Clone, Serialize, Deserialize)]
251#[serde(rename_all = "snake_case")]
252pub enum Category {
253    /// 背景
254    Backgrounds,
255    /// 时尚
256    Fashion,
257    /// 自然
258    Nature,
259    /// 科学
260    Science,
261    /// 教育
262    Education,
263    /// 情感
264    Feelings,
265    /// 健康
266    Health,
267    /// 人物
268    People,
269    /// 宗教
270    Religion,
271    /// 地点
272    Places,
273    /// 动物
274    Animals,
275    /// 工业
276    Industry,
277    /// 计算机
278    Computer,
279    /// 食物
280    Food,
281    /// 体育
282    Sports,
283    /// 交通
284    Transportation,
285    /// 旅行
286    Travel,
287    /// 建筑
288    Buildings,
289    /// 商业
290    Business,
291    /// 音乐
292    Music,
293}
294
295impl std::fmt::Display for Category {
296    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
297        let s = match self {
298            Category::Backgrounds => "backgrounds",
299            Category::Fashion => "fashion",
300            Category::Nature => "nature",
301            Category::Science => "science",
302            Category::Education => "education",
303            Category::Feelings => "feelings",
304            Category::Health => "health",
305            Category::People => "people",
306            Category::Religion => "religion",
307            Category::Places => "places",
308            Category::Animals => "animals",
309            Category::Industry => "industry",
310            Category::Computer => "computer",
311            Category::Food => "food",
312            Category::Sports => "sports",
313            Category::Transportation => "transportation",
314            Category::Travel => "travel",
315            Category::Buildings => "buildings",
316            Category::Business => "business",
317            Category::Music => "music",
318        };
319        f.write_str(s)
320    }
321}
322
323/// 结果排序枚举
324///
325/// 用于设置搜索结果的排序方式。
326#[derive(Debug, Clone, Serialize, Deserialize)]
327#[serde(rename_all = "snake_case")]
328pub enum Order {
329    /// 热门优先
330    Popular,
331    /// 最新优先
332    Latest,
333}
334
335impl std::fmt::Display for Order {
336    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
337        let s = match self {
338            Order::Popular => "popular",
339            Order::Latest => "latest",
340        };
341        f.write_str(s)
342    }
343}
344
345/// 搜索语言枚举
346///
347/// 用于设置搜索请求的语言(影响结果的语言偏好)。
348#[derive(Debug, Clone, Serialize, Deserialize)]
349#[serde(rename_all = "snake_case")]
350pub enum Language {
351    /// 捷克语
352    Cs,
353    /// 丹麦语
354    Da,
355    /// 德语
356    De,
357    /// 英语
358    En,
359    /// 西班牙语
360    Es,
361    /// 法语
362    Fr,
363    /// 印尼语
364    Id,
365    /// 意大利语
366    It,
367    /// 匈牙利语
368    Hu,
369    /// 荷兰语
370    Nl,
371    /// 挪威语
372    No,
373    /// 波兰语
374    Pl,
375    /// 葡萄牙语
376    Pt,
377    /// 罗马尼亚语
378    Ro,
379    /// 斯洛伐克语
380    Sk,
381    /// 芬兰语
382    Fi,
383    /// 瑞典语
384    Sv,
385    /// 土耳其语
386    Tr,
387    /// 越南语
388    Vi,
389    /// 泰语
390    Th,
391    /// 保加利亚语
392    Bg,
393    /// 俄语
394    Ru,
395    /// 希腊语
396    El,
397    /// 日语
398    Ja,
399    /// 韩语
400    Ko,
401    /// 中文
402    Zh,
403}
404
405impl std::fmt::Display for Language {
406    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
407        let s = match self {
408            Language::Cs => "cs",
409            Language::Da => "da",
410            Language::De => "de",
411            Language::En => "en",
412            Language::Es => "es",
413            Language::Fr => "fr",
414            Language::Id => "id",
415            Language::It => "it",
416            Language::Hu => "hu",
417            Language::Nl => "nl",
418            Language::No => "no",
419            Language::Pl => "pl",
420            Language::Pt => "pt",
421            Language::Ro => "ro",
422            Language::Sk => "sk",
423            Language::Fi => "fi",
424            Language::Sv => "sv",
425            Language::Tr => "tr",
426            Language::Vi => "vi",
427            Language::Th => "th",
428            Language::Bg => "bg",
429            Language::Ru => "ru",
430            Language::El => "el",
431            Language::Ja => "ja",
432            Language::Ko => "ko",
433            Language::Zh => "zh",
434        };
435        f.write_str(s)
436    }
437}