feat: add helper for userallmusicdetail

This commit is contained in:
mokurin000
2025-08-03 12:12:32 +08:00
parent 7e4dc9b978
commit 0d379bf248
4 changed files with 53 additions and 35 deletions

View File

@@ -0,0 +1,45 @@
use nyquest::AsyncClient;
use crate::{
ApiError,
title::{
MaiVersionExt as _, Sdgb1_50,
methods::APIMethod,
model::{GetUserMusicApi, GetUserMusicApiResp, UserMusicDetail},
},
};
pub async fn get_user_all_music(
client: &AsyncClient,
user_id: u32,
) -> Result<Vec<UserMusicDetail>, ApiError> {
let mut music_detail = Vec::new();
let mut index = None;
loop {
let GetUserMusicApiResp {
next_index,
mut user_music_list,
..
} = Sdgb1_50::request::<_, GetUserMusicApiResp>(
&client,
APIMethod::GetUserMusicApi,
user_id,
GetUserMusicApi {
user_id,
next_index: index.unwrap_or_default(),
max_count: 50,
},
)
.await?;
for list in &mut user_music_list {
music_detail.append(&mut list.user_music_detail_list);
}
if next_index == 0 || user_music_list.is_empty() {
break Ok(music_detail);
}
index = Some(next_index);
}
}

View File

@@ -6,6 +6,8 @@ pub mod encryption;
pub mod methods; pub mod methods;
pub mod model; pub mod model;
pub mod helper;
use super::ApiError; use super::ApiError;
use nyquest::{ use nyquest::{

View File

@@ -23,8 +23,7 @@ pub use get_user_rating_api::{
}; };
mod get_user_music_api; mod get_user_music_api;
pub use get_user_music_api::{GetUserMusicApi, GetUserMusicApiResp, UserMusic}; pub use get_user_music_api::{GetUserMusicApi, GetUserMusicApiResp, UserMusic, UserMusicDetail};
mod dxrating; mod dxrating;
pub use dxrating::{ pub use dxrating::{
@@ -34,4 +33,4 @@ pub use dxrating::{
DxMusicRecord, DxMusicRecord,
DxRatingNet, DxRatingNet,
DxSheetId, DxSheetId,
}; };

View File

@@ -15,12 +15,12 @@ use sdgb_api::{
auth_lite::{SDGB, SDHJ, delivery_raw}, auth_lite::{SDGB, SDHJ, delivery_raw},
title::{ title::{
MaiVersionExt, Sdgb1_50, MaiVersionExt, Sdgb1_50,
helper::get_user_all_music,
methods::APIMethod, methods::APIMethod,
model::{ model::{
DataVersion, DxCalculatedEntries, DxMusicRecord, DxRatingNet, GetUserDataApi, DataVersion, DxCalculatedEntries, DxMusicRecord, DxRatingNet, GetUserDataApi,
GetUserDataApiResp, GetUserMusicApi, GetUserMusicApiResp, GetUserPreviewApi, GetUserDataApiResp, GetUserPreviewApi, GetUserPreviewApiResp, GetUserRatingApi,
GetUserPreviewApiResp, GetUserRatingApi, GetUserRatingApiResp, Ping, PingResp, GetUserRatingApiResp, Ping, PingResp, UserLogoutApi, UserLogoutApiResp,
UserLogoutApi, UserLogoutApiResp,
}, },
}, },
}; };
@@ -79,35 +79,7 @@ async fn main() -> Result<(), Box<dyn snafu::Error>> {
// TODO: refactor via enum_dispatch // TODO: refactor via enum_dispatch
match command { match command {
Commands::MusicDetail { user_id, format } => { Commands::MusicDetail { user_id, format } => {
let mut music_detail = Vec::new(); let music_detail = get_user_all_music(&client, user_id).await?;
let mut index = None;
loop {
let GetUserMusicApiResp {
next_index,
mut user_music_list,
..
} = Sdgb1_50::request::<_, GetUserMusicApiResp>(
&client,
APIMethod::GetUserMusicApi,
user_id,
GetUserMusicApi {
user_id,
next_index: index.unwrap_or_default(),
max_count: 50,
},
)
.await?;
for list in &mut user_music_list {
music_detail.append(&mut list.user_music_detail_list);
}
if next_index == 0 || user_music_list.is_empty() {
break;
}
index = Some(next_index);
}
match (human_readable, format) { match (human_readable, format) {
(true, _) => { (true, _) => {