From b958d4521e28c070177fd4b3ca7717f96e4010da Mon Sep 17 00:00:00 2001 From: AB Date: Sun, 24 May 2026 15:08:56 +0300 Subject: [PATCH] Fixed worker job for cyrillyc names --- Cargo.lock | 2 +- Cargo.toml | 2 +- src/agent/metadata.rs | 3 ++- src/agent/mod.rs | 2 +- src/agent/normalize.rs | 5 +++-- src/jobs/inbox_process.rs | 28 ++++++++++++++++++++++++++-- 6 files changed, 34 insertions(+), 8 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 468cde7..d3e9ae8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1141,7 +1141,7 @@ dependencies = [ [[package]] name = "furumusic" -version = "0.1.0" +version = "0.1.1" dependencies = [ "anyhow", "async-trait", diff --git a/Cargo.toml b/Cargo.toml index e54337b..3df0f92 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "furumusic" -version = "0.1.0" +version = "0.1.1" edition = "2024" description = "Reusable web-app boilerplate: auth, OIDC/SSO, admin panel, user management, i18n, PostgreSQL" diff --git a/src/agent/metadata.rs b/src/agent/metadata.rs index 6983179..6e3f379 100644 --- a/src/agent/metadata.rs +++ b/src/agent/metadata.rs @@ -128,7 +128,8 @@ fn extract_tags(tags: &[symphonia::core::meta::Tag], meta: &mut RawMetadata) { } StandardTagKey::Date | StandardTagKey::OriginalDate => { if meta.year.is_none() { - meta.year = value[..4.min(value.len())].parse().ok(); + let year_prefix: String = value.chars().take(4).collect(); + meta.year = year_prefix.parse().ok(); } } StandardTagKey::Genre => { diff --git a/src/agent/mod.rs b/src/agent/mod.rs index f35655f..f69008f 100644 --- a/src/agent/mod.rs +++ b/src/agent/mod.rs @@ -85,7 +85,7 @@ pub async fn probe_llm( let body_text = resp.text().await.unwrap_or_default(); return AgentProbeResult { latency_ms, - error: format!("HTTP {status}: {}", &body_text[..body_text.len().min(300)]), + error: format!("HTTP {status}: {}", body_text.chars().take(300).collect::()), ..Default::default() }; } diff --git a/src/agent/normalize.rs b/src/agent/normalize.rs index 8fd3090..b1be4d6 100644 --- a/src/agent/normalize.rs +++ b/src/agent/normalize.rs @@ -90,7 +90,8 @@ async fn call_llm_chat( if !resp.status().is_success() { let status = resp.status(); let body = resp.text().await.unwrap_or_default(); - tracing::error!(%status, body = &body[..body.len().min(500)], "LLM API error"); + let body_preview: String = body.chars().take(500).collect(); + tracing::error!(%status, body = %body_preview, "LLM API error"); anyhow::bail!("LLM returned {}: {}", status, body); } @@ -440,7 +441,7 @@ fn parse_batch_response( anyhow::anyhow!( "Failed to parse batch LLM response: {} — raw: {}", e, - &response[..response.len().min(500)] + response.chars().take(500).collect::() ) })?; diff --git a/src/jobs/inbox_process.rs b/src/jobs/inbox_process.rs index e4b73bd..cb792a7 100644 --- a/src/jobs/inbox_process.rs +++ b/src/jobs/inbox_process.rs @@ -949,9 +949,33 @@ fn sanitize_filename(name: &str) -> String { } fn truncate_path(path: &str, max_len: usize) -> String { - if path.len() <= max_len { + let char_count = path.chars().count(); + if char_count <= max_len { path.to_owned() + } else if max_len <= 3 { + ".".repeat(max_len) } else { - format!("...{}", &path[path.len() - (max_len - 3)..]) + let suffix: String = path + .chars() + .skip(char_count - (max_len - 3)) + .collect(); + format!("...{suffix}") + } +} + +#[cfg(test)] +mod tests { + use super::truncate_path; + + #[test] + fn truncate_path_handles_unicode_boundaries() { + assert_eq!( + truncate_path("KUNTEYNIR/Блёвбургер", 20), + "KUNTEYNIR/Блёвбургер" + ); + assert_eq!( + truncate_path("KUNTEYNIR/ОченьДлинноеНазвание", 12), + "...еНазвание" + ); } }