ytmapi_rs/query/
upload.rs

1use std::borrow::Cow;
2
3use super::{get_sort_order_params, GetLibrarySortOrder, PostMethod, PostQuery, Query};
4use crate::{
5    auth::AuthToken,
6    common::{UploadAlbumID, UploadArtistID, UploadEntityID},
7    parse::{GetLibraryUploadAlbum, TableListUploadSong, UploadAlbum, UploadArtist},
8};
9use serde_json::json;
10
11#[derive(Default, Clone)]
12pub struct GetLibraryUploadSongsQuery {
13    sort_order: GetLibrarySortOrder,
14}
15#[derive(Default, Clone)]
16pub struct GetLibraryUploadArtistsQuery {
17    sort_order: GetLibrarySortOrder,
18}
19#[derive(Default, Clone)]
20pub struct GetLibraryUploadAlbumsQuery {
21    sort_order: GetLibrarySortOrder,
22}
23#[derive(Clone)]
24pub struct GetLibraryUploadArtistQuery<'a> {
25    upload_artist_id: UploadArtistID<'a>,
26}
27#[derive(Clone)]
28pub struct GetLibraryUploadAlbumQuery<'a> {
29    upload_album_id: UploadAlbumID<'a>,
30}
31#[derive(Clone)]
32/// Deletes a previously uploaded song or album.
33pub struct DeleteUploadEntityQuery<'a> {
34    upload_entity_id: UploadEntityID<'a>,
35}
36impl GetLibraryUploadSongsQuery {
37    pub fn new(sort_order: GetLibrarySortOrder) -> Self {
38        Self { sort_order }
39    }
40}
41impl GetLibraryUploadArtistsQuery {
42    pub fn new(sort_order: GetLibrarySortOrder) -> Self {
43        Self { sort_order }
44    }
45}
46impl GetLibraryUploadAlbumsQuery {
47    pub fn new(sort_order: GetLibrarySortOrder) -> Self {
48        Self { sort_order }
49    }
50}
51impl<'a> GetLibraryUploadArtistQuery<'a> {
52    pub fn new(upload_artist_id: UploadArtistID<'a>) -> Self {
53        Self { upload_artist_id }
54    }
55}
56impl<'a> GetLibraryUploadAlbumQuery<'a> {
57    pub fn new(upload_album_id: UploadAlbumID<'a>) -> Self {
58        Self { upload_album_id }
59    }
60}
61impl<'a> DeleteUploadEntityQuery<'a> {
62    pub fn new(upload_entity_id: UploadEntityID<'a>) -> Self {
63        Self { upload_entity_id }
64    }
65}
66// Auth required
67impl<A: AuthToken> Query<A> for GetLibraryUploadAlbumQuery<'_> {
68    type Output = GetLibraryUploadAlbum;
69    type Method = PostMethod;
70}
71impl PostQuery for GetLibraryUploadAlbumQuery<'_> {
72    fn header(&self) -> serde_json::Map<String, serde_json::Value> {
73        serde_json::Map::from_iter([("browseId".to_string(), json!(self.upload_album_id))])
74    }
75    fn params(&self) -> Vec<(&str, Cow<str>)> {
76        vec![]
77    }
78    fn path(&self) -> &str {
79        "browse"
80    }
81}
82// Auth required
83impl<A: AuthToken> Query<A> for GetLibraryUploadArtistQuery<'_> {
84    type Output = Vec<TableListUploadSong>;
85    type Method = PostMethod;
86}
87impl PostQuery for GetLibraryUploadArtistQuery<'_> {
88    fn header(&self) -> serde_json::Map<String, serde_json::Value> {
89        serde_json::Map::from_iter([("browseId".to_string(), json!(self.upload_artist_id))])
90    }
91    fn params(&self) -> Vec<(&str, Cow<str>)> {
92        vec![]
93    }
94    fn path(&self) -> &str {
95        "browse"
96    }
97}
98// Auth required
99impl<A: AuthToken> Query<A> for GetLibraryUploadSongsQuery {
100    type Output = Vec<TableListUploadSong>;
101    type Method = PostMethod;
102}
103impl PostQuery for GetLibraryUploadSongsQuery {
104    fn header(&self) -> serde_json::Map<String, serde_json::Value> {
105        let params = get_sort_order_params(&self.sort_order);
106        if let Some(params) = params {
107            serde_json::Map::from_iter([
108                (
109                    "browseId".to_string(),
110                    json!("FEmusic_library_privately_owned_tracks"),
111                ),
112                ("params".to_string(), json!(params)),
113            ])
114        } else {
115            serde_json::Map::from_iter([(
116                "browseId".to_string(),
117                json!("FEmusic_library_privately_owned_tracks"),
118            )])
119        }
120    }
121    fn params(&self) -> Vec<(&str, Cow<str>)> {
122        vec![]
123    }
124    fn path(&self) -> &str {
125        "browse"
126    }
127}
128// Auth required
129impl<A: AuthToken> Query<A> for GetLibraryUploadAlbumsQuery {
130    type Output = Vec<UploadAlbum>;
131    type Method = PostMethod;
132}
133impl PostQuery for GetLibraryUploadAlbumsQuery {
134    fn header(&self) -> serde_json::Map<String, serde_json::Value> {
135        let params = get_sort_order_params(&self.sort_order);
136        if let Some(params) = params {
137            serde_json::Map::from_iter([
138                (
139                    "browseId".to_string(),
140                    json!("FEmusic_library_privately_owned_releases"),
141                ),
142                ("params".to_string(), json!(params)),
143            ])
144        } else {
145            serde_json::Map::from_iter([(
146                "browseId".to_string(),
147                json!("FEmusic_library_privately_owned_releases"),
148            )])
149        }
150    }
151    fn params(&self) -> Vec<(&str, Cow<str>)> {
152        vec![]
153    }
154    fn path(&self) -> &str {
155        "browse"
156    }
157}
158// Auth required
159impl<A: AuthToken> Query<A> for GetLibraryUploadArtistsQuery {
160    type Output = Vec<UploadArtist>;
161    type Method = PostMethod;
162}
163impl PostQuery for GetLibraryUploadArtistsQuery {
164    fn header(&self) -> serde_json::Map<String, serde_json::Value> {
165        let params = get_sort_order_params(&self.sort_order);
166        if let Some(params) = params {
167            serde_json::Map::from_iter([
168                (
169                    "browseId".to_string(),
170                    json!("FEmusic_library_privately_owned_artists"),
171                ),
172                ("params".to_string(), json!(params)),
173            ])
174        } else {
175            serde_json::Map::from_iter([(
176                "browseId".to_string(),
177                json!("FEmusic_library_privately_owned_artists"),
178            )])
179        }
180    }
181    fn params(&self) -> Vec<(&str, Cow<str>)> {
182        vec![]
183    }
184    fn path(&self) -> &str {
185        "browse"
186    }
187}
188// Auth required
189impl<A: AuthToken> Query<A> for DeleteUploadEntityQuery<'_> {
190    type Output = ();
191    type Method = PostMethod;
192}
193impl PostQuery for DeleteUploadEntityQuery<'_> {
194    fn header(&self) -> serde_json::Map<String, serde_json::Value> {
195        serde_json::Map::from_iter([("entityId".to_string(), json!(self.upload_entity_id))])
196    }
197    fn params(&self) -> Vec<(&str, Cow<str>)> {
198        vec![]
199    }
200    fn path(&self) -> &str {
201        "music/delete_privately_owned_entity"
202    }
203}