From 0d379bf248d22c456ce0aa39a697fac3d473a47e Mon Sep 17 00:00:00 2001 From: mokurin000 <1348292515a@gmail.com> Date: Sun, 3 Aug 2025 12:12:32 +0800 Subject: [PATCH] feat: add helper for userallmusicdetail --- sdgb-api/src/title/helper/mod.rs | 45 ++++++++++++++++++++++++++++++++ sdgb-api/src/title/mod.rs | 2 ++ sdgb-api/src/title/model/mod.rs | 5 ++-- sdgb-cli/src/main.rs | 36 +++---------------------- 4 files changed, 53 insertions(+), 35 deletions(-) create mode 100644 sdgb-api/src/title/helper/mod.rs diff --git a/sdgb-api/src/title/helper/mod.rs b/sdgb-api/src/title/helper/mod.rs new file mode 100644 index 0000000..a87f78e --- /dev/null +++ b/sdgb-api/src/title/helper/mod.rs @@ -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, 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); + } +} diff --git a/sdgb-api/src/title/mod.rs b/sdgb-api/src/title/mod.rs index 07180ff..7b8f732 100644 --- a/sdgb-api/src/title/mod.rs +++ b/sdgb-api/src/title/mod.rs @@ -6,6 +6,8 @@ pub mod encryption; pub mod methods; pub mod model; +pub mod helper; + use super::ApiError; use nyquest::{ diff --git a/sdgb-api/src/title/model/mod.rs b/sdgb-api/src/title/model/mod.rs index 60d9185..d0d2388 100644 --- a/sdgb-api/src/title/model/mod.rs +++ b/sdgb-api/src/title/model/mod.rs @@ -23,8 +23,7 @@ pub use get_user_rating_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; pub use dxrating::{ @@ -34,4 +33,4 @@ pub use dxrating::{ DxMusicRecord, DxRatingNet, DxSheetId, -}; \ No newline at end of file +}; diff --git a/sdgb-cli/src/main.rs b/sdgb-cli/src/main.rs index f1f39af..c72c2d3 100644 --- a/sdgb-cli/src/main.rs +++ b/sdgb-cli/src/main.rs @@ -15,12 +15,12 @@ use sdgb_api::{ auth_lite::{SDGB, SDHJ, delivery_raw}, title::{ MaiVersionExt, Sdgb1_50, + helper::get_user_all_music, methods::APIMethod, model::{ DataVersion, DxCalculatedEntries, DxMusicRecord, DxRatingNet, GetUserDataApi, - GetUserDataApiResp, GetUserMusicApi, GetUserMusicApiResp, GetUserPreviewApi, - GetUserPreviewApiResp, GetUserRatingApi, GetUserRatingApiResp, Ping, PingResp, - UserLogoutApi, UserLogoutApiResp, + GetUserDataApiResp, GetUserPreviewApi, GetUserPreviewApiResp, GetUserRatingApi, + GetUserRatingApiResp, Ping, PingResp, UserLogoutApi, UserLogoutApiResp, }, }, }; @@ -79,35 +79,7 @@ async fn main() -> Result<(), Box> { // TODO: refactor via enum_dispatch match command { Commands::MusicDetail { user_id, format } => { - 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; - } - index = Some(next_index); - } + let music_detail = get_user_all_music(&client, user_id).await?; match (human_readable, format) { (true, _) => {