ytmapi_rs/parse/
rate.rs

1use super::ParseFrom;
2use crate::query::rate::{RatePlaylistQuery, RateSongQuery};
3use json_crawler::{JsonCrawler, JsonCrawlerIterator, JsonCrawlerOwned};
4
5impl<'a> ParseFrom<RateSongQuery<'a>> for () {
6    fn parse_from(_: super::ProcessedResult<RateSongQuery<'a>>) -> crate::Result<Self> {
7        // Passing an invalid video ID with Like or Dislike will throw a 400 error which
8        // is caught by AuthToken. Youtube does no checking on Indifferent, even
9        // an invalid video ID will return no error code. Therefore, if we've
10        // passed error validation at AuthToken, it's OK to return ApiSuccess here.
11        Ok(())
12    }
13}
14impl<'a> ParseFrom<RatePlaylistQuery<'a>> for () {
15    fn parse_from(p: super::ProcessedResult<RatePlaylistQuery<'a>>) -> crate::Result<Self> {
16        // Passing an invalid playlist ID to Like or Indifferent will throw a 404 error
17        // which is caught by AuthToken. Youtube does no checking on
18        // Indifferent, even an invalid PlaylistID will return success.
19        let json_crawler = JsonCrawlerOwned::from(p);
20        // TODO: Error type
21        json_crawler
22            .navigate_pointer("/actions")?
23            .try_into_iter()?
24            .find_path("/addToToastAction")
25            .map(|_| ())
26            .map_err(Into::into)
27    }
28}
29#[cfg(test)]
30mod tests {
31    use crate::auth::BrowserToken;
32    use crate::common::{PlaylistID, VideoID, YoutubeID};
33    use crate::query::rate::{RatePlaylistQuery, RateSongQuery};
34
35    #[tokio::test]
36    async fn test_rate_song_like() {
37        parse_test_value!(
38            "./test_json/rate_song_like_20240710.json",
39            (),
40            RateSongQuery::new(VideoID::from_raw(""), crate::common::LikeStatus::Liked),
41            BrowserToken
42        );
43    }
44    #[tokio::test]
45    async fn test_rate_song_dislike() {
46        parse_test_value!(
47            "./test_json/rate_song_dislike_20240710.json",
48            (),
49            RateSongQuery::new(VideoID::from_raw(""), crate::common::LikeStatus::Disliked),
50            BrowserToken
51        );
52    }
53    #[tokio::test]
54    async fn test_rate_song_indifferent() {
55        parse_test_value!(
56            "./test_json/rate_song_indifferent_20240710.json",
57            (),
58            RateSongQuery::new(
59                VideoID::from_raw(""),
60                crate::common::LikeStatus::Indifferent
61            ),
62            BrowserToken
63        );
64    }
65    #[tokio::test]
66    async fn test_rate_playlist_like() {
67        parse_test_value!(
68            "./test_json/rate_playlist_like_20240710.json",
69            (),
70            RatePlaylistQuery::new(PlaylistID::from_raw(""), crate::common::LikeStatus::Liked),
71            BrowserToken
72        );
73    }
74    #[tokio::test]
75    async fn test_rate_playlist_dislike() {
76        parse_test_value!(
77            "./test_json/rate_playlist_dislike_20240710.json",
78            (),
79            RatePlaylistQuery::new(
80                PlaylistID::from_raw(""),
81                crate::common::LikeStatus::Disliked
82            ),
83            BrowserToken
84        );
85    }
86    #[tokio::test]
87    async fn test_rate_playlist_indifferent() {
88        parse_test_value!(
89            "./test_json/rate_playlist_indifferent_20240710.json",
90            (),
91            RatePlaylistQuery::new(
92                PlaylistID::from_raw(""),
93                crate::common::LikeStatus::Indifferent
94            ),
95            BrowserToken
96        );
97    }
98}