use std::collections::HashMap;
use futures_util::stream::{self, StreamExt};
use suno_core::{Clip, Stem, SunoClient};
use crate::clock::TokioClock;
use crate::http::ReqwestHttp;
pub(crate) fn strip_format_ext(path: &str, format: suno_core::AudioFormat) -> &str {
path.strip_suffix(&format!(".{}", format.ext()))
.unwrap_or(path)
}
pub(crate) async fn list_existing_stems(
enabled: bool,
clips: &[&Clip],
client: &SunoClient<TokioClock>,
http: &ReqwestHttp,
concurrency: u32,
) -> HashMap<String, Vec<Stem>> {
let mut out = HashMap::new();
if !enabled {
return out;
}
let candidates: Vec<&Clip> = clips.iter().copied().filter(|clip| clip.has_stem).collect();
let fetched = stream::iter(candidates)
.map(|clip| async move {
(
clip.id.clone(),
client.list_stems(http, &clip.id).await.ok(),
)
})
.buffered(concurrency.max(1) as usize)
.collect::<Vec<_>>()
.await;
for (id, result) in fetched {
if let Some((stems, true)) = result
&& !stems.is_empty()
{
out.insert(id, stems);
}
}
out
}