deviantart/types/
media.rs1use std::collections::HashMap;
2use url::Url;
3
4#[derive(Debug, serde::Deserialize)]
6pub struct MediaType {
7 #[serde(rename = "c")]
9 pub content: Option<String>,
10
11 #[serde(rename = "h")]
13 pub height: u64,
14
15 #[serde(rename = "t")]
19 pub kind: String,
20
21 #[serde(rename = "w")]
23 pub width: u64,
24
25 pub b: Option<Url>,
29
30 #[serde(flatten)]
32 pub unknown: HashMap<String, serde_json::Value>,
33}
34
35impl MediaType {
36 pub fn is_fullview(&self) -> bool {
38 self.kind == "fullview"
39 }
40
41 pub fn is_gif(&self) -> bool {
43 self.kind == "gif"
44 }
45
46 pub fn is_video(&self) -> bool {
48 self.kind == "video"
49 }
50}
51
52#[derive(Debug, serde::Deserialize)]
56pub struct Media {
57 #[serde(rename = "baseUri")]
59 pub base_uri: Option<Url>,
60
61 #[serde(default)]
63 pub token: Vec<String>,
64
65 pub types: Vec<MediaType>,
67
68 #[serde(rename = "prettyName")]
70 pub pretty_name: Option<String>,
71
72 #[serde(flatten)]
74 pub unknown: HashMap<String, serde_json::Value>,
75}
76
77impl Media {
78 pub fn get_fullview_media_type(&self) -> Option<&MediaType> {
80 self.types.iter().find(|t| t.is_fullview())
81 }
82
83 pub fn get_gif_media_type(&self) -> Option<&MediaType> {
85 self.types.iter().find(|t| t.is_gif())
86 }
87
88 pub fn get_best_video_media_type(&self) -> Option<&MediaType> {
90 self.types
91 .iter()
92 .filter(|media_type| media_type.is_video())
93 .max_by_key(|media_type| media_type.width)
94 }
95
96 pub fn get_fullview_url(&self) -> Option<Url> {
98 let mut url = self.base_uri.as_ref()?.clone();
99
100 if let Some(path) = self.get_fullview_media_type()?.content.as_ref() {
102 let mut path_segments_mut = url.path_segments_mut().ok()?;
103
104 for path in path.split('/').filter(|p| !p.is_empty()) {
105 let pretty_name = self.pretty_name.as_ref()?;
107 let path = path.replace("<prettyName>", pretty_name);
108 path_segments_mut.push(&path);
109 }
110 }
111
112 if let Some(token) = self.token.first() {
117 url.query_pairs_mut().append_pair("token", token);
118 }
119
120 Some(url)
121 }
122}