Skip to main content

ytmapi_rs/query/
upload.rs

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