1use url::Url;
2
3#[derive(Debug, serde::Deserialize, serde::Serialize)]
5pub struct FeedCursor {
6 pub aweme_list: Vec<Post>,
8}
9
10#[derive(Debug, serde::Deserialize, serde::Serialize)]
12pub struct Post {
13 #[serde(with = "serde_as_string")]
15 pub aweme_id: u64,
16
17 pub desc: Box<str>,
19
20 pub video: Video,
21}
22
23#[derive(Debug, serde::Deserialize, serde::Serialize)]
25pub struct Video {
26 pub play_addr: VideoSource,
28
29 pub download_addr: VideoSource,
31
32 pub width: u32,
34
35 pub height: u32,
37
38 pub duration: u64,
40}
41
42#[derive(Debug, serde::Deserialize, serde::Serialize)]
44pub struct VideoSource {
45 pub url_list: Vec<Url>,
47}
48
49mod serde_as_string {
50 pub(crate) fn deserialize<'de, D, T>(deserializer: D) -> Result<T, D::Error>
51 where
52 D: serde::Deserializer<'de>,
53 T: std::str::FromStr,
54 <T as std::str::FromStr>::Err: std::fmt::Display,
55 {
56 use serde::de::Error;
57 use serde::Deserialize;
58
59 let value = String::deserialize(deserializer)?;
60 value.parse::<T>().map_err(D::Error::custom)
61 }
62
63 pub(crate) fn serialize<S, T>(value: &T, serializer: S) -> Result<S::Ok, S::Error>
64 where
65 S: serde::Serializer,
66 T: std::fmt::Display,
67 {
68 let value = value.to_string();
69 serializer.serialize_str(&value)
70 }
71}