use std::path::PathBuf;
use std::sync::{
atomic::{AtomicBool, Ordering},
Arc,
};
use crate::config::NativeWhisperxReport;
use crate::translation::{CuratedLanguage, TranslationPlanProvenance};
#[derive(Debug, Clone, Default)]
pub struct CancellationHandle {
requested: Arc<AtomicBool>,
}
impl CancellationHandle {
pub fn new() -> Self {
Self::default()
}
pub fn cancel(&self) {
self.requested.store(true, Ordering::Release);
}
pub fn is_cancelled(&self) -> bool {
self.requested.load(Ordering::Acquire)
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum TranscriptionProgressTask {
Decode,
Vad,
Asr,
Alignment,
Diarization,
Translation,
Output,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct FiniteCancellation {
file_index: usize,
input: PathBuf,
task: Option<TranscriptionProgressTask>,
}
impl FiniteCancellation {
pub(crate) fn new(
file_index: usize,
input: PathBuf,
task: Option<TranscriptionProgressTask>,
) -> Self {
Self {
file_index,
input,
task,
}
}
pub const fn file_index(&self) -> usize {
self.file_index
}
pub fn input(&self) -> &std::path::Path {
&self.input
}
pub const fn task(&self) -> Option<TranscriptionProgressTask> {
self.task
}
}
#[derive(Debug)]
pub enum FiniteTranscriptionOutcome {
Completed(Box<NativeWhisperxReport>),
Cancelled(FiniteCancellation),
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct UnfinishedTranscription {
file_index: usize,
input: PathBuf,
}
impl UnfinishedTranscription {
pub(crate) fn new(file_index: usize, input: PathBuf) -> Self {
Self { file_index, input }
}
pub const fn file_index(&self) -> usize {
self.file_index
}
pub fn input(&self) -> &std::path::Path {
&self.input
}
}
#[derive(Debug)]
pub enum MultiInputTranscriptionOutcome {
Completed(Vec<NativeWhisperxReport>),
Cancelled {
completed: Vec<NativeWhisperxReport>,
cancellation: FiniteCancellation,
unfinished: Vec<UnfinishedTranscription>,
},
}
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq)]
pub enum TranscriptionProgressEvent {
RunStart {
total_files: usize,
},
RunEnd {
total_files: usize,
duration_seconds: f64,
},
FileStart {
file_index: usize,
total_files: usize,
input: PathBuf,
},
FileEnd {
file_index: usize,
total_files: usize,
input: PathBuf,
duration_seconds: f64,
},
TaskStart {
file_index: usize,
task: TranscriptionProgressTask,
},
TaskEnd {
file_index: usize,
task: TranscriptionProgressTask,
duration_seconds: f64,
},
ModelResolutionStart {
file_index: usize,
task: TranscriptionProgressTask,
provider: String,
model_id: String,
},
ModelResolutionEnd {
file_index: usize,
task: TranscriptionProgressTask,
provider: String,
model_id: String,
source: String,
},
ModelDownloadStart {
file_index: usize,
task: TranscriptionProgressTask,
provider: String,
model_id: String,
},
ModelDownloadEnd {
file_index: usize,
task: TranscriptionProgressTask,
provider: String,
model_id: String,
duration_seconds: f64,
},
ModelLoadStart {
file_index: usize,
task: TranscriptionProgressTask,
provider: String,
model_id: String,
},
ModelLoadEnd {
file_index: usize,
task: TranscriptionProgressTask,
provider: String,
model_id: String,
duration_seconds: f64,
},
ModelReuse {
file_index: usize,
task: TranscriptionProgressTask,
provider: String,
model_id: String,
},
TranslationLegStart {
file_index: usize,
leg_index: usize,
total_legs: usize,
provenance: TranslationPlanProvenance,
source: CuratedLanguage,
target: CuratedLanguage,
provider: String,
model_id: String,
},
TranslationLegEnd {
file_index: usize,
leg_index: usize,
total_legs: usize,
provenance: TranslationPlanProvenance,
source: CuratedLanguage,
target: CuratedLanguage,
provider: String,
model_id: String,
duration_seconds: f64,
},
Failure {
file_index: usize,
input: PathBuf,
task: Option<TranscriptionProgressTask>,
duration_seconds: f64,
message: String,
},
Cancelled {
file_index: usize,
input: PathBuf,
task: Option<TranscriptionProgressTask>,
duration_seconds: f64,
},
}
pub trait TranscriptionProgressObserver {
fn observe(&mut self, event: TranscriptionProgressEvent);
}
#[derive(Debug, Default)]
pub struct NoopTranscriptionProgressObserver;
impl TranscriptionProgressObserver for NoopTranscriptionProgressObserver {
fn observe(&mut self, _event: TranscriptionProgressEvent) {}
}
#[derive(Debug, Default)]
pub(crate) struct ProgressTaskTracker {
current: Option<TranscriptionProgressTask>,
}
impl ProgressTaskTracker {
pub(crate) fn set_current(&mut self, task: Option<TranscriptionProgressTask>) {
self.current = task;
}
pub(crate) fn current(&self) -> Option<TranscriptionProgressTask> {
self.current
}
}
pub(crate) struct NativeProgressContext<'a> {
pub(crate) observer: &'a mut dyn TranscriptionProgressObserver,
pub(crate) file_index: usize,
pub(crate) task_tracker: &'a mut ProgressTaskTracker,
pub(crate) cancellation: &'a CancellationHandle,
}