feat: implement full user music fetch
This commit is contained in:
@@ -51,6 +51,10 @@ pub enum Commands {
|
||||
#[arg(short, long, default_value_t = RatingFormat::default())]
|
||||
format: RatingFormat,
|
||||
},
|
||||
MusicDetail {
|
||||
#[arg(short, long)]
|
||||
user_id: u32,
|
||||
},
|
||||
|
||||
// below requires login
|
||||
Userdata {
|
||||
|
||||
@@ -16,8 +16,9 @@ use sdgb_api::{
|
||||
methods::APIMethod,
|
||||
model::{
|
||||
DataVersion, DxCalculatedEntries, DxRatingNet, GetUserDataApi, GetUserDataApiResp,
|
||||
GetUserPreviewApi, GetUserPreviewApiResp, GetUserRatingApi, GetUserRatingApiResp, Ping,
|
||||
PingResp, UserLogoutApi, UserLogoutApiResp,
|
||||
GetUserMusicApi, GetUserMusicApiResp, GetUserPreviewApi, GetUserPreviewApiResp,
|
||||
GetUserRatingApi, GetUserRatingApiResp, Ping, PingResp, UserLogoutApi,
|
||||
UserLogoutApiResp,
|
||||
},
|
||||
},
|
||||
};
|
||||
@@ -77,6 +78,40 @@ async fn main() -> Result<(), Box<dyn snafu::Error>> {
|
||||
|
||||
// TODO: refactor via enum_dispatch
|
||||
match command {
|
||||
commands::Commands::MusicDetail { user_id } => {
|
||||
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);
|
||||
}
|
||||
|
||||
// TODO: `Display` support for MusicDetail
|
||||
json_display(music_detail)?;
|
||||
}
|
||||
commands::Commands::Rating { user_id, format } => {
|
||||
let rating: GetUserRatingApiResp = Sdgb1_50::request(
|
||||
&client,
|
||||
@@ -269,8 +304,6 @@ async fn main() -> Result<(), Box<dyn snafu::Error>> {
|
||||
#[cfg(file_lock_ready)]
|
||||
file.try_lock()?;
|
||||
|
||||
let writer = BufWriter::new(file);
|
||||
|
||||
let txn = read_txn()?;
|
||||
let table = open_table_read(&txn)?;
|
||||
|
||||
@@ -285,6 +318,7 @@ async fn main() -> Result<(), Box<dyn snafu::Error>> {
|
||||
.map(|(value, _)| value)
|
||||
.collect::<Vec<GetUserPreviewApiResp>>();
|
||||
|
||||
let writer = BufWriter::new(file);
|
||||
serde_json::to_writer(writer, &user_ids)?;
|
||||
info!("dumped {} user id", user_ids.len());
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user