From 474c3342543b34758553fa147fcf031f6261e62f Mon Sep 17 00:00:00 2001 From: sevenc-nanashi Date: Fri, 6 Oct 2023 20:30:41 +0900 Subject: [PATCH] =?UTF-8?q?Fix:=20=E4=B8=80=E9=83=A8=E3=82=AD=E3=83=A3?= =?UTF-8?q?=E3=83=A9=E3=81=A7=E5=8B=95=E3=81=8B=E3=81=AA=E3=81=84=E3=81=AE?= =?UTF-8?q?=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 +++--- src/icon_manager.rs | 52 +++++++++++++++++++++++++++++++++++++-------- src/main.rs | 31 +++++++++++++++++---------- 3 files changed, 66 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index f464f21..be1efb6 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,6 @@ AIVoiceVox は[A.I.Voice](https://aivoice.jp/)を[Voicevox](https://voicevox.hir ## ライセンス -MIT License で公開しています。詳しくは[LICENSE](LICENSE)をご覧ください。 -生成された音声については、A.I.Voice の利用規約に従ってください。 -このブリッジ自体にはクレジット表記は必要ありませんが、このリポジトリのリンクを貼ったりや紹介動画(TODO)をおや作品登録していただくと助かります。 +MIT License で公開しています。詳しくは[LICENSE](LICENSE)をご覧ください。 +生成された音声については、A.I.Voice の利用規約に従ってください。 +このブリッジ自体にはクレジット表記は必要ありませんが、このリポジトリのリンクを貼ったり紹介動画(TODO)を親作品登録していただくと助かります。 diff --git a/src/icon_manager.rs b/src/icon_manager.rs index 63fd265..56788ef 100644 --- a/src/icon_manager.rs +++ b/src/icon_manager.rs @@ -63,14 +63,24 @@ impl IconManager { ) .await .map_err(|e| Error::ReadImageFailed(e.into()))?; - { + + let root = { let mut images = zip_reader.file().entries().iter().enumerate(); - let icon = match images.find(|(_, x)| { + let (icon, root) = match images.find(|(_, x)| { let filename = x.entry().filename().as_str().unwrap_or(""); - filename == "images/icon.png" || filename == "icon.png" + filename.ends_with("icon.png") }) { - Some((icon, _)) => icon, + Some((icon, entry)) => { + let filename = entry + .entry() + .filename() + .as_str() + .unwrap_or("") + .replace('\\', "/"); + + (icon, filename.replace("icon.png", "")) + } None => return Err(Error::ReadImageFailed(anyhow!("Icon not found"))), }; @@ -141,7 +151,11 @@ impl IconManager { sorrow: sorrow_icon_buf, }, ); - } + + root + }; + + info!("{} root: {}", speaker.internal_name(), root); let mut portraits = StyleImages { normal: Vec::new(), @@ -152,10 +166,14 @@ impl IconManager { for emotion in ['A', 'J', 'N', 'S'].iter() { let mut images = zip_reader.file().entries().iter().enumerate(); let image_index = match images.find(|(_, x)| { - let name = x.entry().filename().as_str().unwrap_or(""); - - (name.starts_with(&format!("images/{}/OpenEyes", emotion)) - || name.starts_with(&format!("{}/OpenEyes", emotion))) + let name = x + .entry() + .filename() + .as_str() + .unwrap_or("") + .replace('\\', "/"); + + name.starts_with(&format!("{}{}/OpenEyes", root, emotion)) && name.split('/').last().and_then(|n| n.chars().nth(4)) == Some('0') }) { Some((i, _)) => i, @@ -189,6 +207,22 @@ impl IconManager { .write_to(&mut final_image_cursor, image::ImageOutputFormat::Png) .map_err(|e| Error::ReadImageFailed(e.into()))?; } + for (name, portrait) in [ + ("Normal", &portraits.normal), + ("Joy", &portraits.joy), + ("Anger", &portraits.anger), + ("Sorrow", &portraits.sorrow), + ] + .iter() + { + if portrait.is_empty() { + return Err(Error::ReadImageFailed(anyhow!( + "{}の{}の立ち絵が見つかりませんでした。", + speaker.internal_name(), + name, + ))); + } + } self.portraits .insert(speaker.internal_name().to_string(), portraits); diff --git a/src/main.rs b/src/main.rs index ffa8048..e929156 100644 --- a/src/main.rs +++ b/src/main.rs @@ -36,6 +36,26 @@ struct Cli { #[tokio::main] async fn main() -> Result<()> { let args = Cli::parse(); + + tracing_subscriber::fmt() + .with_writer(std::io::stderr) + .with_ansi(cfg!(debug_assertions)) + .init(); + + AIVOICE.lock().await.setup().await?; + + let result = main_impl(args).await; + + info!("Shutting down..."); + + AIVOICE.lock().await.shutdown().await?; + + result?; + + Ok(()) +} + +async fn main_impl(args: Cli) -> Result<()> { let app = Router::new() .route("/", get(get_index)) .route("/version", get(routes::info::get_version)) @@ -80,13 +100,6 @@ async fn main() -> Result<()> { .on_response(trace::DefaultOnResponse::new().level(Level::INFO)), ); - tracing_subscriber::fmt() - .with_writer(std::io::stderr) - .with_ansi(cfg!(debug_assertions)) - .init(); - - AIVOICE.lock().await.setup().await?; - ICON_MANAGER.lock().await.setup().await?; let port = args.port.unwrap_or(50201); @@ -119,10 +132,6 @@ async fn main() -> Result<()> { }) .await?; - info!("Shutting down..."); - - AIVOICE.lock().await.shutdown().await?; - Ok(()) }