From c8c573b4c5383ad3b7477f7e9a7859e3322309d9 Mon Sep 17 00:00:00 2001 From: GentleBurr <144729351+GentleBurr@users.noreply.github.com> Date: Sun, 22 Mar 2026 23:11:32 +0100 Subject: [PATCH] fix(import): support avatar extraction for Pygmalion/Tavern JSON formats Previously, the legacy importer strictly looked for the `avatarPath` key when parsing JSON files for characters and personas. This caused avatar imports to fail for character cards generated by Pygmalion and other V2/Characterbook specifications. This commit introduces fallback checks for the avatar field. The parser will now sequentially check `avatarPath`, `avatar`, `image`, and `avatar_url` to ensure cross-platform compatibility when importing custom character data. --- src-tauri/src/storage_manager/importer.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src-tauri/src/storage_manager/importer.rs b/src-tauri/src/storage_manager/importer.rs index c8c0196f..9eff679b 100644 --- a/src-tauri/src/storage_manager/importer.rs +++ b/src-tauri/src/storage_manager/importer.rs @@ -202,6 +202,9 @@ fn import_characters(conn: &mut rusqlite::Connection, json: &str) -> Result<(), let name = c.get("name").and_then(|v| v.as_str()).unwrap_or("Unnamed"); let avatar_path = c .get("avatarPath") + .or_else(|| c.get("avatar")) + .or_else(|| c.get("image")) + .or_else(|| c.get("avatar_url")) .and_then(|v| v.as_str()) .map(|s| s.to_string()); let avatar_crop = c.get("avatarCrop").and_then(|v| v.as_object()); @@ -345,6 +348,9 @@ fn import_personas(conn: &mut rusqlite::Connection, json: &str) -> Result<(), St let description = p.get("description").and_then(|v| v.as_str()).unwrap_or(""); let avatar_path = p .get("avatarPath") + .or_else(|| p.get("avatar")) + .or_else(|| p.get("image")) + .or_else(|| p.get("avatar_url")) .and_then(|v| v.as_str()) .map(|s| s.to_string()); let avatar_crop = p.get("avatarCrop").and_then(|v| v.as_object());