处理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 buffer: Vec<SubtitleSegment> = Vec::new();
let mut translated_count: usize = 0; let mut translated_count: usize = 0;
let idle_flush_after = Duration::from_secs(3); let idle_flush_after = Duration::from_secs(3);
let mut translate_error: Option<String> = None;
let emit_translate_progress = let emit_translate_progress =
|window: &Window, task_id: &str, done: usize, total: usize| -> Result<()> { |window: &Window, task_id: &str, done: usize, total: usize| -> Result<()> {
@ -500,7 +501,10 @@ async fn incremental_translate(
buffer.push(segment); buffer.push(segment);
if buffer.len() >= batch_size { 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, &translator,
window, window,
app_state, app_state,
@ -512,17 +516,23 @@ async fn incremental_translate(
context_size, context_size,
"batch", "batch",
) )
.await?; .await
emit_translate_progress(window, task_id, translated_count, all_segments.len())?; {
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, Ok(None) => break,
Err(_) => { Err(_) => {
if buffer.is_empty() { if !buffer.is_empty() {
continue; if let Some(ref error) = translate_error {
} emit_log(window, task_id, format!("translation: skip idle batch due to previous error: {error}"))?;
buffer.clear();
translate_buffered_segments( } else if let Err(e) = translate_buffered_segments(
&translator, &translator,
window, window,
app_state, app_state,
@ -534,15 +544,25 @@ async fn incremental_translate(
context_size, context_size,
"idle batch", "idle batch",
) )
.await?; .await
emit_translate_progress(window, task_id, translated_count, all_segments.len())?; {
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 // Flush remaining segments below batch_size
if !buffer.is_empty() { 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, &translator,
window, window,
app_state, app_state,
@ -554,8 +574,21 @@ async fn incremental_translate(
context_size, context_size,
"final batch", "final batch",
) )
.await?; .await
emit_translate_progress(window, task_id, translated_count, all_segments.len())?; {
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 // Translation complete