tiktok/model/
feed.rs

1use url::Url;
2
3/// A cursor for a feed.
4#[derive(Debug, serde::Deserialize, serde::Serialize)]
5pub struct FeedCursor {
6    /// The list of posts
7    pub aweme_list: Vec<Post>,
8}
9
10/// A Post
11#[derive(Debug, serde::Deserialize, serde::Serialize)]
12pub struct Post {
13    /// The post id
14    #[serde(with = "serde_as_string")]
15    pub aweme_id: u64,
16
17    /// The description
18    pub desc: Box<str>,
19
20    pub video: Video,
21}
22
23/// Video data
24#[derive(Debug, serde::Deserialize, serde::Serialize)]
25pub struct Video {
26    /// The default video source?
27    pub play_addr: VideoSource,
28
29    /// The download video source?
30    pub download_addr: VideoSource,
31
32    /// The video width
33    pub width: u32,
34
35    /// The video height
36    pub height: u32,
37
38    /// The video duration
39    pub duration: u64,
40}
41
42/// A video source
43#[derive(Debug, serde::Deserialize, serde::Serialize)]
44pub struct VideoSource {
45    /// A list of urls?
46    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}