76 lines
2.3 KiB
Rust
76 lines
2.3 KiB
Rust
//! HTTP-клиент DUB-AI (путь А: сервис `python -m src.service`).
|
|
//!
|
|
//! Запуск:
|
|
//! cargo run -- --text "Перевод: Дублированный | MovieDalen"
|
|
//! cargo run -- --html page.html
|
|
//! DUB_URL=http://host:8000 cargo run -- --text "..."
|
|
|
|
use serde::Deserialize;
|
|
|
|
#[derive(Debug, Deserialize)]
|
|
struct Track {
|
|
segment: String,
|
|
translation_type: String,
|
|
#[serde(default)]
|
|
type_confidence: Option<f32>,
|
|
#[serde(default)]
|
|
studio_span: Option<String>,
|
|
#[serde(default)]
|
|
studio: Option<String>,
|
|
#[serde(default)]
|
|
studio_confidence: Option<f32>,
|
|
#[serde(default)]
|
|
is_18plus: bool,
|
|
#[serde(default)]
|
|
age_confidence: Option<f32>,
|
|
}
|
|
|
|
#[derive(Debug, Deserialize)]
|
|
struct PredictResponse {
|
|
tracks: Vec<Track>,
|
|
}
|
|
|
|
#[tokio::main]
|
|
async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|
let base_url =
|
|
std::env::var("DUB_URL").unwrap_or_else(|_| "http://127.0.0.1:8000".into());
|
|
|
|
let args: Vec<String> = std::env::args().collect();
|
|
let body = if let Some(i) = args.iter().position(|a| a == "--text") {
|
|
serde_json::json!({ "text": args.get(i + 1).ok_or("--text требует значение")? })
|
|
} else if let Some(i) = args.iter().position(|a| a == "--html") {
|
|
let path = args.get(i + 1).ok_or("--html требует путь к файлу")?;
|
|
let html = std::fs::read_to_string(path)?;
|
|
serde_json::json!({ "html": html })
|
|
} else {
|
|
eprintln!("использование: cargo run -- --text \"...\" | --html файл.html");
|
|
std::process::exit(1);
|
|
};
|
|
|
|
let client = reqwest::Client::new();
|
|
let resp: PredictResponse = client
|
|
.post(format!("{base_url}/predict"))
|
|
.json(&body)
|
|
.send()
|
|
.await?
|
|
.error_for_status()?
|
|
.json()
|
|
.await?;
|
|
|
|
for t in &resp.tracks {
|
|
let age = if t.is_18plus { " 18+" } else { "" };
|
|
println!(
|
|
"{} — {}{} (conf {:.2})",
|
|
t.translation_type,
|
|
t.studio.clone().unwrap_or_else(|| "—".into()),
|
|
age,
|
|
t.type_confidence.unwrap_or(0.0)
|
|
);
|
|
println!(" текст: {}", t.segment);
|
|
if let Some(span) = &t.studio_span {
|
|
println!(" спан: «{span}»");
|
|
}
|
|
}
|
|
Ok(())
|
|
}
|