diff --git a/crates/api_clients/seedance2pro_client/src/requests/poll_characters/poll_characters.rs b/crates/api_clients/seedance2pro_client/src/requests/poll_characters/poll_characters.rs index 08d998254c..06d2f248ce 100644 --- a/crates/api_clients/seedance2pro_client/src/requests/poll_characters/poll_characters.rs +++ b/crates/api_clients/seedance2pro_client/src/requests/poll_characters/poll_characters.rs @@ -14,9 +14,13 @@ use wreq_util::Emulation; pub struct PollCharactersArgs<'a> { pub session: &'a Seedance2ProSession, - /// Maximum number of characters to return. + /// Maximum number of characters to return per page. pub limit: u32, + /// Optional cursor from a previous `PollCharactersResponse::next_cursor`. + /// When `None`, the most recent characters are returned. + pub cursor: Option, + /// Override the default host (kinovi.ai). pub host_override: Option, } @@ -25,6 +29,10 @@ pub struct PollCharactersArgs<'a> { pub struct PollCharactersResponse { pub characters: Vec, + + /// Present when there are more characters to fetch. + /// Pass this value as `PollCharactersArgs::cursor` in the next call. + pub next_cursor: Option, } // --- Public types --- @@ -102,11 +110,17 @@ pub async fn poll_characters(args: PollCharactersArgs<'_>) -> Result format!( + r#"{{"0":{{"json":{{"limit":{},"cursor":{}}}}}}}"#, + args.limit, cursor + ), + None => format!( + r#"{{"0":{{"json":{{"limit":{}}}}}}}"#, + args.limit + ), + }; let encoded_input: String = url::form_urlencoded::byte_serialize(input.as_bytes()).collect(); @@ -116,7 +130,7 @@ pub async fn poll_characters(args: PollCharactersArgs<'_>) -> Result) -> Result AnyhowResult<()> { + setup_test_logging(LevelFilter::Trace); + let session = test_session()?; + + let mut cursor: Option = None; + let mut page = 0usize; + let mut total_characters = 0usize; + + loop { + page += 1; + let result = poll_characters(PollCharactersArgs { + session: &session, + limit: 2, + cursor, + host_override: None, + }).await?; + + let page_count = result.characters.len(); + total_characters += page_count; + + println!("Page {}: {} characters, next_cursor: {:?}", page, page_count, result.next_cursor); + for ch in &result.characters { + println!(" {} | {} | {:?} | asset_id={:?}", ch.character_id, ch.name, ch.status, ch.asset_id); + } + + cursor = result.next_cursor; + if cursor.is_none() { + break; + } + } + + println!("Total characters across {} pages: {}", page, total_characters); + assert_eq!(1, 2); // NB: Intentional failure to inspect output. + Ok(()) + } + #[tokio::test] #[ignore] // manually test — requires real cookies; logs all character details async fn test_poll_all_characters_verbose() -> AnyhowResult<()> { @@ -280,6 +340,7 @@ mod tests { let result = poll_characters(PollCharactersArgs { session: &session, limit: 50, + cursor: None, host_override: None, }).await?;