twitter_v2/data/
media.rs

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}