use serde_json::{json, Value}; use crate::sidecar::messages::IPCMessage; use crate::sidecar::SidecarManager; /// Start transcription of an audio file via the Python sidecar. /// /// This is a blocking command — it starts the sidecar if needed, /// sends the transcribe request, and waits for the result. #[tauri::command] pub fn transcribe_file( file_path: String, model: Option, device: Option, language: Option, ) -> Result { // Determine Python sidecar path (relative to app) let python_path = std::env::current_dir() .map_err(|e| e.to_string())? .join("../python") .canonicalize() .map_err(|e| format!("Cannot find python directory: {e}"))?; let python_path_str = python_path.to_string_lossy().to_string(); let manager = SidecarManager::new(); manager.start(&python_path_str)?; let request_id = uuid::Uuid::new_v4().to_string(); let msg = IPCMessage::new( &request_id, "transcribe.start", json!({ "file": file_path, "model": model.unwrap_or_else(|| "base".to_string()), "device": device.unwrap_or_else(|| "cpu".to_string()), "compute_type": "int8", "language": language, }), ); let response = manager.send_and_receive(&msg)?; if response.msg_type == "error" { return Err(format!( "Transcription error: {}", response.payload.get("message").and_then(|v| v.as_str()).unwrap_or("unknown") )); } Ok(response.payload) } /// Run the full transcription + diarization pipeline via the Python sidecar. #[tauri::command] pub fn run_pipeline( file_path: String, model: Option, device: Option, language: Option, num_speakers: Option, min_speakers: Option, max_speakers: Option, skip_diarization: Option, ) -> Result { let python_path = std::env::current_dir() .map_err(|e| e.to_string())? .join("../python") .canonicalize() .map_err(|e| format!("Cannot find python directory: {e}"))?; let python_path_str = python_path.to_string_lossy().to_string(); let manager = SidecarManager::new(); manager.start(&python_path_str)?; let request_id = uuid::Uuid::new_v4().to_string(); let msg = IPCMessage::new( &request_id, "pipeline.start", json!({ "file": file_path, "model": model.unwrap_or_else(|| "base".to_string()), "device": device.unwrap_or_else(|| "cpu".to_string()), "compute_type": "int8", "language": language, "num_speakers": num_speakers, "min_speakers": min_speakers, "max_speakers": max_speakers, "skip_diarization": skip_diarization.unwrap_or(false), }), ); let response = manager.send_and_receive(&msg)?; if response.msg_type == "error" { return Err(format!( "Pipeline error: {}", response.payload.get("message").and_then(|v| v.as_str()).unwrap_or("unknown") )); } Ok(response.payload) }