diff --git a/sdgb-api/src/title/helper/mod.rs b/sdgb-api/src/title/helper/mod.rs index a87f78e..6a3a449 100644 --- a/sdgb-api/src/title/helper/mod.rs +++ b/sdgb-api/src/title/helper/mod.rs @@ -5,21 +5,21 @@ use crate::{ title::{ MaiVersionExt as _, Sdgb1_50, methods::APIMethod, - model::{GetUserMusicApi, GetUserMusicApiResp, UserMusicDetail}, + model::{GetUserMusicApi, GetUserMusicApiResp}, }, }; pub async fn get_user_all_music( client: &AsyncClient, user_id: u32, -) -> Result, ApiError> { - let mut music_detail = Vec::new(); +) -> Result { + let mut user_music_list = Vec::new(); let mut index = None; loop { let GetUserMusicApiResp { next_index, - mut user_music_list, + user_music_list: mut new_list, .. } = Sdgb1_50::request::<_, GetUserMusicApiResp>( &client, @@ -33,13 +33,23 @@ pub async fn get_user_all_music( ) .await?; - for list in &mut user_music_list { - music_detail.append(&mut list.user_music_detail_list); + if new_list.is_empty() { + break; } - if next_index == 0 || user_music_list.is_empty() { - break Ok(music_detail); + user_music_list.append(&mut new_list); + + if next_index == 0 { + break; } + index = Some(next_index); } + + Ok(GetUserMusicApiResp { + user_id, + next_index: 0, + length: user_music_list.len() as _, + user_music_list, + }) } diff --git a/sdgb-api/src/title/model/get_user_music_api/mod.rs b/sdgb-api/src/title/model/get_user_music_api/mod.rs index 0393f0e..deb41ea 100644 --- a/sdgb-api/src/title/model/get_user_music_api/mod.rs +++ b/sdgb-api/src/title/model/get_user_music_api/mod.rs @@ -17,7 +17,7 @@ pub struct GetUserMusicApi { pub max_count: u32, } -#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] +#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize, Encode, Decode)] #[serde(rename_all = "camelCase")] pub struct GetUserMusicApiResp { pub user_id: u32, @@ -26,7 +26,7 @@ pub struct GetUserMusicApiResp { pub user_music_list: Vec, } -#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] +#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize, Encode, Decode)] #[serde(rename_all = "camelCase")] pub struct UserMusic { pub user_music_detail_list: Vec, diff --git a/sdgb-cli/src/main.rs b/sdgb-cli/src/main.rs index d727609..918d9d2 100644 --- a/sdgb-cli/src/main.rs +++ b/sdgb-cli/src/main.rs @@ -80,21 +80,27 @@ async fn main() -> Result<(), Box> { match command { Commands::MusicDetail { user_id, format } => { let music_detail = get_user_all_music(&client, user_id).await?; + let details = music_detail + .user_music_list + .iter() + .map(|m| &m.user_music_detail_list) + .flatten(); match (human_readable, format) { (true, _) => { - for detail in &music_detail { + let mut count = 0; + for detail in details { println!("{detail}"); println!("----------"); + count += 1; } - println!("共查询到 {} 条记录!", music_detail.len()); + println!("共查询到 {count} 条记录!"); } (false, RatingFormat::Origin) => json_display(music_detail)?, (false, RatingFormat::DxRatingNet) => { let dx_export = Vec::from_iter( - music_detail - .iter() + details .map(|music| { DxMusicRecord::try_from(music).inspect_err(|e| { warn!("failed to process {}: {e}", music.music_id)