1use crate::id::StringId;
2use serde::{Deserialize, Serialize};
3use time::Duration;
4use url::Url;
5
6#[derive(Serialize, Deserialize, Debug, Clone, Eq, PartialEq)]
7#[serde(rename_all = "snake_case")]
8pub enum MediaType {
9 AnimatedGif,
10 Photo,
11 Video,
12}
13#[derive(Serialize, Deserialize, Debug, Clone, Eq, PartialEq)]
14pub struct MediaVariant {
15 #[serde(skip_serializing_if = "Option::is_none")]
16 pub bit_rate: Option<i32>,
17 #[serde(skip_serializing_if = "Option::is_none")]
18 pub content_type: Option<String>,
19 #[serde(skip_serializing_if = "Option::is_none")]
20 pub url : Option<Url>
21}
22#[derive(Serialize, Deserialize, Debug, Clone, Eq, PartialEq)]
23pub struct MediaPublicMetrics {
24 #[serde(skip_serializing_if = "Option::is_none")]
25 pub view_count: Option<usize>,
26}
27
28#[derive(Serialize, Deserialize, Debug, Clone, Eq, PartialEq)]
29pub struct MediaNonPublicMetrics {
30 #[serde(skip_serializing_if = "Option::is_none")]
31 pub playback_0_count: Option<usize>,
32 #[serde(skip_serializing_if = "Option::is_none")]
33 pub playback_25_count: Option<usize>,
34 #[serde(skip_serializing_if = "Option::is_none")]
35 pub playback_50_count: Option<usize>,
36 #[serde(skip_serializing_if = "Option::is_none")]
37 pub playback_75_count: Option<usize>,
38 #[serde(skip_serializing_if = "Option::is_none")]
39 pub playback_100_count: Option<usize>,
40}
41
42#[derive(Serialize, Deserialize, Debug, Clone, Eq, PartialEq)]
43pub struct MediaPromotedOrOrganicMetrics {
44 #[serde(skip_serializing_if = "Option::is_none")]
45 pub playback_0_count: Option<usize>,
46 #[serde(skip_serializing_if = "Option::is_none")]
47 pub playback_25_count: Option<usize>,
48 #[serde(skip_serializing_if = "Option::is_none")]
49 pub playback_50_count: Option<usize>,
50 #[serde(skip_serializing_if = "Option::is_none")]
51 pub playback_75_count: Option<usize>,
52 #[serde(skip_serializing_if = "Option::is_none")]
53 pub playback_100_count: Option<usize>,
54 #[serde(skip_serializing_if = "Option::is_none")]
55 pub view_count: Option<usize>,
56}
57
58#[derive(Serialize, Deserialize, Debug, Clone, Eq, PartialEq)]
59pub struct Media {
60 pub media_key: StringId,
61 #[serde(rename = "type")]
62 pub kind: MediaType,
63 #[serde(skip_serializing_if = "Option::is_none")]
64 pub url: Option<Url>,
65 #[serde(skip_serializing_if = "Option::is_none")]
66 pub alt_text: Option<String>,
67 #[serde(
68 with = "crate::utils::serde::option_duration_ms",
69 rename = "duration_ms",
70 skip_serializing_if = "Option::is_none",
71 default
72 )]
73 pub duration: Option<Duration>,
74 #[serde(skip_serializing_if = "Option::is_none")]
75 pub height: Option<usize>,
76 #[serde(skip_serializing_if = "Option::is_none")]
77 pub width: Option<usize>,
78 #[serde(skip_serializing_if = "Option::is_none")]
79 pub public_metrics: Option<MediaPublicMetrics>,
80 #[serde(skip_serializing_if = "Option::is_none")]
81 pub non_public_metrics: Option<MediaNonPublicMetrics>,
82 #[serde(skip_serializing_if = "Option::is_none")]
83 pub organic_metrics: Option<MediaPromotedOrOrganicMetrics>,
84 #[serde(skip_serializing_if = "Option::is_none")]
85 pub promoted_metrics: Option<MediaPromotedOrOrganicMetrics>,
86 #[serde(skip_serializing_if = "Option::is_none")]
87 pub preview_image_url: Option<Url>,
88 #[serde(skip_serializing_if = "Option::is_none")]
89 pub variants: Option<Vec<MediaVariant>>,
90}