处理api失败频繁channel closed

This commit is contained in:
kura 2026-05-06 17:46:06 +08:00
parent 735c9ffcfc
commit 6520e49066

View File

@ -455,6 +455,7 @@ async fn incremental_translate(
let mut buffer: Vec<SubtitleSegment> = Vec::new();
let mut translated_count: usize = 0;
let idle_flush_after = Duration::from_secs(3);
let mut translate_error: Option<String> = None;
let emit_translate_progress =
|window: &Window, task_id: &str, done: usize, total: usize| -> Result<()> {
@ -500,7 +501,10 @@ async fn incremental_translate(
buffer.push(segment);
if buffer.len() >= batch_size {
translate_buffered_segments(
if let Some(ref error) = translate_error {
emit_log(window, task_id, format!("translation: skip batch due to previous error: {error}"))?;
buffer.clear();
} else if let Err(e) = translate_buffered_segments(
&translator,
window,
app_state,
@ -512,17 +516,23 @@ async fn incremental_translate(
context_size,
"batch",
)
.await?;
emit_translate_progress(window, task_id, translated_count, all_segments.len())?;
.await
{
eprintln!("translation error: {e:#}");
translate_error = Some(e.to_string());
let _ = emit_log(window, task_id, format!("translation: batch failed: {e}"));
} else {
let _ = emit_translate_progress(window, task_id, translated_count, all_segments.len());
}
}
}
Ok(None) => break,
Err(_) => {
if buffer.is_empty() {
continue;
}
translate_buffered_segments(
if !buffer.is_empty() {
if let Some(ref error) = translate_error {
emit_log(window, task_id, format!("translation: skip idle batch due to previous error: {error}"))?;
buffer.clear();
} else if let Err(e) = translate_buffered_segments(
&translator,
window,
app_state,
@ -534,15 +544,25 @@ async fn incremental_translate(
context_size,
"idle batch",
)
.await?;
emit_translate_progress(window, task_id, translated_count, all_segments.len())?;
.await
{
eprintln!("translation error: {e:#}");
translate_error = Some(e.to_string());
let _ = emit_log(window, task_id, format!("translation: idle batch failed: {e}"));
} else {
let _ = emit_translate_progress(window, task_id, translated_count, all_segments.len());
}
}
}
}
}
// Flush remaining segments below batch_size
if !buffer.is_empty() {
translate_buffered_segments(
if let Some(ref error) = translate_error {
let _ = emit_log(window, task_id, format!("translation: skip final batch due to previous error: {error}"));
buffer.clear();
} else if let Err(e) = translate_buffered_segments(
&translator,
window,
app_state,
@ -554,8 +574,21 @@ async fn incremental_translate(
context_size,
"final batch",
)
.await?;
emit_translate_progress(window, task_id, translated_count, all_segments.len())?;
.await
{
eprintln!("translation error: {e:#}");
translate_error = Some(e.to_string());
let _ = emit_log(window, task_id, format!("translation: final batch failed: {e}"));
} else {
let _ = emit_translate_progress(window, task_id, translated_count, all_segments.len());
}
}
if let Some(ref error) = translate_error {
emit_log(window, task_id, format!("translation: completed with error: {error}"))?;
// Return Ok to keep the channel receiver alive until all
// whisper segment callback send tasks have completed
return Ok(());
}
// Translation complete