From 816f8fbd2fe108a61f0dd0802009cece145a1917 Mon Sep 17 00:00:00 2001 From: Kagamine Rin Date: Sun, 31 May 2026 09:45:22 -0400 Subject: [PATCH] =?UTF-8?q?refactor:=20rename=20project=20Lyria=20Studio?= =?UTF-8?q?=20=E2=86=92=20Kithara=20Studio?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - App name, UI text, page titles → Kithara Studio - Python module: lyria_client.py → kithara_client.py - Tailwind color classes: lyria-* → kithara-* - CSS custom properties: --lyria-* → --kithara-* - Database: lyria.db → kithara.db - Package name: kithara-studio-frontend - localStorage key: kithara-saved-searches - Add project logo (lyre icon, black on transparent, invert via CSS) Preserved as Google's property: - LYRIA_API_KEY, LYRIA_BASE_URL, LYRIA_DEFAULT_MODEL env vars - LYRIA_MODELS dict and model IDs (lyria-3-clip-preview, lyria-3-pro-preview) - Google Lyria API references in error messages and docstrings --- README.md | 10 +- backend/src/database.py | 2 +- .../{lyria_client.py => kithara_client.py} | 8 +- backend/src/main.py | 8 +- backend/tests/conftest.py | 4 +- backend/tests/test_api.py | 2 +- frontend/index.html | 4 +- frontend/package-lock.json | 4 +- frontend/package.json | 2 +- frontend/public/logo.png | Bin 0 -> 63754 bytes frontend/src/App.tsx | 12 +- .../src/components/ArtworkGenerationModal.tsx | 12 +- frontend/src/components/DetailPanel.tsx | 64 ++++----- frontend/src/components/Gallery.tsx | 122 +++++++++--------- frontend/src/components/Generator.tsx | 32 ++--- frontend/src/components/Player.tsx | 26 ++-- frontend/src/components/SettingsModal.tsx | 28 ++-- .../src/components/StructuredPromptEditor.tsx | 12 +- frontend/src/components/SuggestionsModal.tsx | 20 +-- frontend/tailwind.config.js | 12 +- 20 files changed, 191 insertions(+), 193 deletions(-) rename backend/src/{lyria_client.py => kithara_client.py} (93%) create mode 100644 frontend/public/logo.png diff --git a/README.md b/README.md index f0a0852..3ece571 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Lyria Studio +# Kithara Studio A webapp for generating, playing, and storing music clips using Google's Lyria music generation models. @@ -23,7 +23,7 @@ npm run dev ## Architecture -- **Backend**: FastAPI (Python) — async Lyria API client, SQLite metadata, file storage +- **Backend**: FastAPI (Python) — async API client for Google's Lyria models, SQLite metadata, file storage - **Frontend**: React + Vite + TypeScript + Tailwind — dark theme, audio player - **Storage**: SQLite for clip metadata, local filesystem for MP3 files @@ -40,9 +40,9 @@ npm run dev ## Models -- **v0.1**: Lyria 3 Clip Preview (30s, REST) -- **v0.2**: Lyria 3 Pro (structure-aware, ~3min) -- **v0.3**: Lyria RealTime (WebSocket streaming) +- **v0.1**: Google Lyria 3 Clip Preview (30s, REST) +- **v0.2**: Google Lyria 3 Pro (structure-aware, ~3min) +- **v0.3**: Google Lyria RealTime (WebSocket streaming) ## License diff --git a/backend/src/database.py b/backend/src/database.py index fb0f4c6..108f667 100644 --- a/backend/src/database.py +++ b/backend/src/database.py @@ -4,7 +4,7 @@ import uuid from datetime import datetime, timezone from pathlib import Path -DB_PATH = Path(__file__).parent.parent / "data" / "lyria.db" +DB_PATH = Path(__file__).parent.parent / "data" / "kithara.db" DB_PATH.parent.mkdir(parents=True, exist_ok=True) # Timezone from TZ env var (default: America/New_York) diff --git a/backend/src/lyria_client.py b/backend/src/kithara_client.py similarity index 93% rename from backend/src/lyria_client.py rename to backend/src/kithara_client.py index 4753eb7..e1f7670 100644 --- a/backend/src/lyria_client.py +++ b/backend/src/kithara_client.py @@ -4,7 +4,7 @@ import os import logging from pathlib import Path -logger = logging.getLogger("lyria_client") +logger = logging.getLogger("kithara_client") LYRIA_API_KEY = os.getenv("LYRIA_API_KEY", "") LYRIA_BASE_URL = "https://generativelanguage.googleapis.com/v1beta" @@ -50,11 +50,11 @@ async def generate_clip(prompt: str, model: str = "lyria-3-clip-preview", durati block_reason = data.get("blockReason", "") if block_reason: block_message = data.get("blockReasonMessage", "") - logger.warning(f"Lyria API blocked: {block_reason} — {block_message}") + logger.warning(f"Google Lyria API blocked: {block_reason} — {block_message}") return {"success": False, "error": f"Prompt was filtered. Try describing the sound using mood, instruments, and tempo instead of genre names. ({block_message or block_reason})"} # Extract base64 audio from response - # Lyria returns parts array: first part may be text (e.g. ""), + # Google Lyria returns parts array: first part may be text (e.g. ""), # audio is in inlineData of a subsequent part. candidates = data.get("candidates", []) if not candidates: @@ -103,7 +103,7 @@ async def generate_clip(prompt: str, model: str = "lyria-3-clip-preview", durati error_detail = e.response.json().get("error", {}).get("message", str(e)) except: error_detail = str(e) - return {"success": False, "error": f"Lyria API error: {error_detail}"} + return {"success": False, "error": f"Google Lyria API error: {error_detail}"} except Exception as e: return {"success": False, "error": f"Client error: {str(e)}"} diff --git a/backend/src/main.py b/backend/src/main.py index 660eb31..6ab029d 100644 --- a/backend/src/main.py +++ b/backend/src/main.py @@ -6,18 +6,18 @@ import os import shutil from dotenv import load_dotenv -# Load environment variables BEFORE importing lyria_client (it reads env at module level) +# Load environment variables BEFORE importing kithara_client (it reads env at module level) load_dotenv(Path(__file__).parent.parent / ".env") from models import GenerateRequest, GenerateResponse, ClipList, RenameRequest, MetadataRequest, GenerateArtworkRequest, LYRIA_MODELS, DEFAULT_MODEL from database import init_db, create_clip, get_clips, get_clip, delete_clip, update_clip_status, rename_clip, set_artwork, remove_artwork, delete_all_clips, set_analysis, update_metadata -from lyria_client import generate_clip, save_clip_file +from kithara_client import generate_clip, save_clip_file from waveform import generate_waveform_svg, get_waveform_path from analysis import analyze_clip from image_gen import generate_artwork, get_image_gen_config, get_available_models, SAFETY_LEVELS from text_gen import suggest_prompts, get_text_gen_config, get_available_models as get_text_models -app = FastAPI(title="Lyria Studio", version="0.1.0") +app = FastAPI(title="Kithara Studio", version="0.1.0") app.add_middleware( CORSMiddleware, @@ -49,7 +49,7 @@ async def list_models(): return {"models": LYRIA_MODELS, "default": DEFAULT_MODEL} async def _generate_and_save(clip_id: str, prompt: str, model: str, duration: int): - """Background task: call Lyria API and save the result. + """Background task: call Google Lyria API and save the result. DR-LYRIA-001: Pre-generates waveform SVG after clip is ready, so users never wait for on-demand generation. diff --git a/backend/tests/conftest.py b/backend/tests/conftest.py index 45e5766..37bdce4 100644 --- a/backend/tests/conftest.py +++ b/backend/tests/conftest.py @@ -1,4 +1,4 @@ -"""Shared test fixtures for Lyria Studio backend.""" +"""Shared test fixtures for Kithara Studio backend.""" import asyncio import os @@ -39,7 +39,7 @@ async def app_client(tmp_path): waveforms_dir.mkdir() artwork_dir = data_dir / "artwork" artwork_dir.mkdir() - test_db = data_dir / "lyria.db" + test_db = data_dir / "kithara.db" # Set env vars BEFORE import so module-level Path() calls use test dirs # (image_gen.py reads ARTWORK_DIR from env, main.py uses __file__-relative paths) diff --git a/backend/tests/test_api.py b/backend/tests/test_api.py index 09de8be..5f16696 100644 --- a/backend/tests/test_api.py +++ b/backend/tests/test_api.py @@ -1,4 +1,4 @@ -"""Tests for Lyria Studio API endpoints.""" +"""Tests for Kithara Studio API endpoints.""" import subprocess import sys diff --git a/frontend/index.html b/frontend/index.html index d8470a8..336ab83 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -4,9 +4,9 @@ - Lyria Studio + Kithara Studio - +
diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 857bf53..50cc99d 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1,11 +1,11 @@ { - "name": "lyria-studio-frontend", + "name": "kithara-studio-frontend", "version": "0.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "lyria-studio-frontend", + "name": "kithara-studio-frontend", "version": "0.1.0", "dependencies": { "fuse.js": "^7.0.0", diff --git a/frontend/package.json b/frontend/package.json index 01fc174..ddf79ec 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,5 +1,5 @@ { - "name": "lyria-studio-frontend", + "name": "kithara-studio-frontend", "private": true, "version": "0.1.0", "type": "module", diff --git a/frontend/public/logo.png b/frontend/public/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..85c5b737b5020ec100d4148a201eb85ba1445f63 GIT binary patch literal 63754 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 R|INP}DapT+tC2Ae{Xe*so{9hf literal 0 HcmV?d00001 diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 32d483b..32d1ef0 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -237,19 +237,17 @@ function App() { } return ( -
+
-
- L -
-

Lyria Studio

- v0.1 + Kithara Studio +

Kithara Studio

+ v0.1
@@ -82,7 +82,7 @@ export default function ArtworkGenerationModal({ isOpen, onClose, onGenerate, tr @@ -191,7 +191,7 @@ export default function DetailPanel({ clip, isPlaying, currentClipId, onClose, o
) : (
{ if (currentClipId === clip.id && isPlaying) { onTogglePlay?.() @@ -203,7 +203,7 @@ export default function DetailPanel({ clip, isPlaying, currentClipId, onClose, o 𝄞 - No album art + No album art
{currentClipId === clip.id && isPlaying ? ( @@ -246,11 +246,11 @@ export default function DetailPanel({ clip, isPlaying, currentClipId, onClose, o {/* Title — inline editable */}
- + {!isEditingTitle && ( @@ -264,7 +264,7 @@ export default function DetailPanel({ clip, isPlaying, currentClipId, onClose, o onChange={(e) => setEditTitle(e.target.value)} onBlur={saveTitle} onKeyDown={handleTitleKeyDown} - className="w-full bg-white/5 border border-lyria-accent/50 rounded-md px-3 py-2 text-white text-lg font-medium outline-none focus:border-lyria-accent focus:ring-1 focus:ring-lyria-accent/30 transition-all" + className="w-full bg-white/5 border border-kithara-accent/50 rounded-md px-3 py-2 text-white text-lg font-medium outline-none focus:border-kithara-accent focus:ring-1 focus:ring-kithara-accent/30 transition-all" placeholder="Track title..." /> ) : ( @@ -272,14 +272,14 @@ export default function DetailPanel({ clip, isPlaying, currentClipId, onClose, o onClick={startEditing} title="Click to rename" > - {clip.title || Untitled} + {clip.title || Untitled}

)}
{/* Prompt */}
- +

{clip.prompt}

@@ -288,7 +288,7 @@ export default function DetailPanel({ clip, isPlaying, currentClipId, onClose, o {/* Structured Prompt Breakdown */} {clip.prompt_structure && (
- +
{[ { key: 'style', label: 'Style' }, @@ -304,7 +304,7 @@ export default function DetailPanel({ clip, isPlaying, currentClipId, onClose, o if (!val) return null return (
- {label}: + {label}: {val}
) @@ -315,7 +315,7 @@ export default function DetailPanel({ clip, isPlaying, currentClipId, onClose, o {/* Status */}
- + {statusLabel(clip.status)} @@ -324,7 +324,7 @@ export default function DetailPanel({ clip, isPlaying, currentClipId, onClose, o {/* Error message */} {clip.status === 'failed' && clip.error_message && (
- +

{clip.error_message}

@@ -334,16 +334,16 @@ export default function DetailPanel({ clip, isPlaying, currentClipId, onClose, o {/* Metadata grid */}
- +

{modelName(clip.model)}

- +

{clip.duration_seconds}s

{clip.file_size_bytes && (
- +

{(clip.file_size_bytes / 1024).toFixed(0)} KB

)} @@ -351,7 +351,7 @@ export default function DetailPanel({ clip, isPlaying, currentClipId, onClose, o const c = getBPMColor(clip.bpm) return c ? (
- + - + - +

{formatDate(clip.created_at)}

@@ -405,8 +405,8 @@ export default function DetailPanel({ clip, isPlaying, currentClipId, onClose, o {/* ID (for reference) */}
- -

{clip.id}

+ +

{clip.id}

{/* Actions */} @@ -414,7 +414,7 @@ export default function DetailPanel({ clip, isPlaying, currentClipId, onClose, o @@ -466,7 +466,7 @@ function MetadataField({ label, value, placeholder, onSave }: { if (editing) { return (
- +
@@ -491,13 +491,13 @@ function MetadataField({ label, value, placeholder, onSave }: { className="group cursor-pointer" onClick={() => setEditing(true)} > - +
- + {value || placeholder} {parts.map((part, i) => part.toLowerCase() === query.toLowerCase() ? ( - {part} + {part} ) : ( {part} ) @@ -104,7 +104,7 @@ export default function Gallery({ clips, onPlay, onDelete, onRename, onSelect, o // Saved searches const [savedSearches, setSavedSearches] = useState(() => { try { - const raw = localStorage.getItem('lyria-saved-searches') + const raw = localStorage.getItem('kithara-saved-searches') return raw ? JSON.parse(raw) : [] } catch { return [] @@ -195,7 +195,7 @@ export default function Gallery({ clips, onPlay, onDelete, onRename, onSelect, o } const updated = [...savedSearches, newSearch] setSavedSearches(updated) - localStorage.setItem('lyria-saved-searches', JSON.stringify(updated)) + localStorage.setItem('kithara-saved-searches', JSON.stringify(updated)) }, [search, filters, savedSearches]) const loadSearch = useCallback((saved: SavedSearch) => { @@ -207,7 +207,7 @@ export default function Gallery({ clips, onPlay, onDelete, onRename, onSelect, o const deleteSearch = useCallback((id: string) => { const updated = savedSearches.filter(s => s.id !== id) setSavedSearches(updated) - localStorage.setItem('lyria-saved-searches', JSON.stringify(updated)) + localStorage.setItem('kithara-saved-searches', JSON.stringify(updated)) }, [savedSearches]) const clearFilters = () => { @@ -261,14 +261,14 @@ export default function Gallery({ clips, onPlay, onDelete, onRename, onSelect, o if (clips.length === 0) { return ( -
-

No clips yet. Generate your first one!

+
+

No clips yet. Generate your first one!

) } return ( -
+
{/* Header: title, search, view toggle */}
@@ -279,7 +279,7 @@ export default function Gallery({ clips, onPlay, onDelete, onRename, onSelect, o {/* Search bar */}
@@ -289,12 +289,12 @@ export default function Gallery({ clips, onPlay, onDelete, onRename, onSelect, o placeholder="Search tracks, artists, albums..." value={search} onChange={(e) => setSearch(e.target.value)} - className="w-full bg-white/5 border border-white/10 rounded-md pl-8 pr-3 py-1.5 text-sm text-white placeholder-lyria-muted focus:outline-none focus:border-lyria-accent/50 focus:ring-1 focus:ring-lyria-accent/30 transition-colors" + className="w-full bg-white/5 border border-white/10 rounded-md pl-8 pr-3 py-1.5 text-sm text-white placeholder-kithara-muted focus:outline-none focus:border-kithara-accent/50 focus:ring-1 focus:ring-kithara-accent/30 transition-colors" /> {search && (
@@ -391,7 +391,7 @@ export default function Gallery({ clips, onPlay, onDelete, onRename, onSelect, o {/* Results count */} {(search || hasActiveFilters) && ( -

+

Showing {filtered.length} of {clips.length} clips

)} @@ -402,7 +402,7 @@ export default function Gallery({ clips, onPlay, onDelete, onRename, onSelect, o
- +
- +
- +
- +
setFilters(f => ({ ...f, bpmMin: e.target.value }))} placeholder="Min" - className="w-full bg-black/30 border border-white/10 rounded-md px-2 py-1.5 text-sm text-white placeholder:text-lyria-muted/30" + className="w-full bg-black/30 border border-white/10 rounded-md px-2 py-1.5 text-sm text-white placeholder:text-kithara-muted/30" /> - - + - setFilters(f => ({ ...f, bpmMax: e.target.value }))} placeholder="Max" - className="w-full bg-black/30 border border-white/10 rounded-md px-2 py-1.5 text-sm text-white placeholder:text-lyria-muted/30" + className="w-full bg-black/30 border border-white/10 rounded-md px-2 py-1.5 text-sm text-white placeholder:text-kithara-muted/30" />
- +
- + @@ -499,19 +499,19 @@ export default function Gallery({ clips, onPlay, onDelete, onRename, onSelect, o {/* Saved searches dropdown */} {showSaved && savedSearches.length > 0 && (
-

Saved Searches

+

Saved Searches

{savedSearches.map(saved => (
@@ -606,9 +606,9 @@ export default function Gallery({ clips, onPlay, onDelete, onRename, onSelect, o }`}> {clip.status} - {clip.duration_seconds}s - {modelName(clip.model)} - {formatDate(clip.created_at)} + {clip.duration_seconds}s + {modelName(clip.model)} + {formatDate(clip.created_at)} {clip.bpm && (() => { const c = getBPMColor(clip.bpm) return c ? ( @@ -645,7 +645,7 @@ export default function Gallery({ clips, onPlay, onDelete, onRename, onSelect, o @@ -198,7 +198,7 @@ export default function Generator({ onGenerate }: Props) { value={prompt} onChange={(e) => setPrompt(e.target.value)} placeholder="Dark distorted kickdrum with atmospheric synth pads, 180 BPM..." - className="w-full h-24 bg-lyria-dark border border-white/10 rounded-md px-3 py-2 text-sm text-white placeholder:text-lyria-muted/50 focus:outline-none focus:border-lyria-accent resize-none" + className="w-full h-24 bg-kithara-dark border border-white/10 rounded-md px-3 py-2 text-sm text-white placeholder:text-kithara-muted/50 focus:outline-none focus:border-kithara-accent resize-none" />
)} @@ -207,12 +207,12 @@ export default function Generator({ onGenerate }: Props) { {promptMode === 'advanced' && isPro && (
- + @@ -231,7 +231,7 @@ export default function Generator({ onGenerate }: Props) { diff --git a/frontend/src/components/Player.tsx b/frontend/src/components/Player.tsx index ad2ddae..0bd4e91 100644 --- a/frontend/src/components/Player.tsx +++ b/frontend/src/components/Player.tsx @@ -167,12 +167,12 @@ export default function Player({ clip, isPlaying, onTogglePlay, onStop, onClose return ( <> -
+
{/* Play/Pause */}
{/* Model Selection */}
- + gen.update(key, e.target.value)} > @@ -228,7 +228,7 @@ export default function SettingsModal({ isOpen, onClose, onClearWaveforms, onDel @@ -238,7 +238,7 @@ export default function SettingsModal({ isOpen, onClose, onClearWaveforms, onDel )}
-

+

Changes apply immediately but reset on server restart. Set .env for persistence.

@@ -255,13 +255,13 @@ export default function SettingsModal({ isOpen, onClose, onClearWaveforms, onDel /> {/* Modal */} -
+
{/* Header */}

Settings

@@ -75,11 +75,11 @@ export default function StructuredPromptEditor({ value, onChange }: Props) { }`} >
- - {label} + + {label}
updateField(key, e.target.value)} placeholder={placeholder} - className="w-full h-20 bg-black/20 border border-white/5 rounded-md px-3 py-2 text-sm text-white placeholder:text-lyria-muted/30 focus:outline-none focus:border-lyria-accent/50 resize-none" + className="w-full h-20 bg-black/20 border border-white/5 rounded-md px-3 py-2 text-sm text-white placeholder:text-kithara-muted/30 focus:outline-none focus:border-kithara-accent/50 resize-none" />
)} diff --git a/frontend/src/components/SuggestionsModal.tsx b/frontend/src/components/SuggestionsModal.tsx index 358a6af..21851a2 100644 --- a/frontend/src/components/SuggestionsModal.tsx +++ b/frontend/src/components/SuggestionsModal.tsx @@ -53,16 +53,16 @@ export default function SuggestionsModal({ isOpen, onClose, onSelect, userInput onClick={onClose} /> -
+
{/* Header */}

Prompt Suggestions

-

{userInput}

+

{userInput}

@@ -95,10 +95,10 @@ export default function SuggestionsModal({ isOpen, onClose, onSelect, userInput {!loading && !error && suggestions.length === 0 && (
-

No suggestions yet. Click below to generate.

+

No suggestions yet. Click below to generate.

@@ -113,13 +113,13 @@ export default function SuggestionsModal({ isOpen, onClose, onSelect, userInput onSelect(suggestion) onClose() }} - className="w-full text-left p-4 bg-white/5 hover:bg-white/10 border border-white/5 hover:border-lyria-accent/30 rounded-lg transition-all group" + className="w-full text-left p-4 bg-white/5 hover:bg-white/10 border border-white/5 hover:border-kithara-accent/30 rounded-lg transition-all group" >
- {i + 1}. + {i + 1}.

{suggestion}

-
+
Click to use this prompt →
diff --git a/frontend/tailwind.config.js b/frontend/tailwind.config.js index 7dc31f6..39b34c0 100644 --- a/frontend/tailwind.config.js +++ b/frontend/tailwind.config.js @@ -7,12 +7,12 @@ export default { theme: { extend: { colors: { - 'lyria-dark': '#0a0a0f', - 'lyria-panel': '#12121a', - 'lyria-surface': '#1a1a24', - 'lyria-accent': '#ff6b35', - 'lyria-text': '#e0e0e0', - 'lyria-muted': '#6b6b7b', + 'kithara-dark': '#0a0a0f', + 'kithara-panel': '#12121a', + 'kithara-surface': '#1a1a24', + 'kithara-accent': '#ff6b35', + 'kithara-text': '#e0e0e0', + 'kithara-muted': '#6b6b7b', }, keyframes: { 'marquee-scroll': {