chore: collect structured GetUserMusicApiResp

This commit is contained in:
mokurin000
2025-08-03 18:08:50 +08:00
parent 81c8f21729
commit 497c67ff89
3 changed files with 30 additions and 14 deletions

View File

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

View File

@@ -17,7 +17,7 @@ pub struct GetUserMusicApi {
pub max_count: u32, pub max_count: u32,
} }
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] #[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize, Encode, Decode)]
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
pub struct GetUserMusicApiResp { pub struct GetUserMusicApiResp {
pub user_id: u32, pub user_id: u32,
@@ -26,7 +26,7 @@ pub struct GetUserMusicApiResp {
pub user_music_list: Vec<UserMusic>, pub user_music_list: Vec<UserMusic>,
} }
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] #[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize, Encode, Decode)]
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
pub struct UserMusic { pub struct UserMusic {
pub user_music_detail_list: Vec<UserMusicDetail>, pub user_music_detail_list: Vec<UserMusicDetail>,

View File

@@ -80,21 +80,27 @@ async fn main() -> Result<(), Box<dyn snafu::Error>> {
match command { match command {
Commands::MusicDetail { user_id, format } => { Commands::MusicDetail { user_id, format } => {
let music_detail = get_user_all_music(&client, user_id).await?; 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) { match (human_readable, format) {
(true, _) => { (true, _) => {
for detail in &music_detail { let mut count = 0;
for detail in details {
println!("{detail}"); println!("{detail}");
println!("----------"); println!("----------");
count += 1;
} }
println!("共查询到 {} 条记录!", music_detail.len()); println!("共查询到 {count} 条记录!");
} }
(false, RatingFormat::Origin) => json_display(music_detail)?, (false, RatingFormat::Origin) => json_display(music_detail)?,
(false, RatingFormat::DxRatingNet) => { (false, RatingFormat::DxRatingNet) => {
let dx_export = Vec::from_iter( let dx_export = Vec::from_iter(
music_detail details
.iter()
.map(|music| { .map(|music| {
DxMusicRecord::try_from(music).inspect_err(|e| { DxMusicRecord::try_from(music).inspect_err(|e| {
warn!("failed to process {}: {e}", music.music_id) warn!("failed to process {}: {e}", music.music_id)