diff --git a/backend/app/routers/admin.py b/backend/app/routers/admin.py index 2ae2cbd..7413e68 100644 --- a/backend/app/routers/admin.py +++ b/backend/app/routers/admin.py @@ -168,6 +168,8 @@ async def update_settings( Accepts a JSON body with optional fields: - welcome_message: str + - default_video_format: str (auto, mp4, webm) + - default_audio_format: str (auto, mp3, m4a, flac, wav, opus) """ body = await request.json() @@ -188,4 +190,21 @@ async def update_settings( updated.append("welcome_message") logger.info("Admin updated welcome_message to: %s", msg[:80]) + valid_video_formats = {"auto", "mp4", "webm"} + valid_audio_formats = {"auto", "mp3", "m4a", "flac", "wav", "opus"} + + if "default_video_format" in body: + fmt = body["default_video_format"] + if fmt in valid_video_formats: + request.app.state.settings_overrides["default_video_format"] = fmt + updated.append("default_video_format") + logger.info("Admin updated default_video_format to: %s", fmt) + + if "default_audio_format" in body: + fmt = body["default_audio_format"] + if fmt in valid_audio_formats: + request.app.state.settings_overrides["default_audio_format"] = fmt + updated.append("default_audio_format") + logger.info("Admin updated default_audio_format to: %s", fmt) + return {"updated": updated, "status": "ok"} diff --git a/frontend/src/components/AppLayout.vue b/frontend/src/components/AppLayout.vue index 6f4f684..715ca4a 100644 --- a/frontend/src/components/AppLayout.vue +++ b/frontend/src/components/AppLayout.vue @@ -1,5 +1,10 @@ + + + + diff --git a/frontend/src/themes/cyberpunk.css b/frontend/src/themes/cyberpunk.css index 9810af2..f1150fb 100644 --- a/frontend/src/themes/cyberpunk.css +++ b/frontend/src/themes/cyberpunk.css @@ -79,50 +79,3 @@ --shadow-lg: 0 8px 24px rgba(0, 0, 0, 0.5); --shadow-glow: 0 0 20px rgba(0, 168, 255, 0.15); } - -/* Animated geometric background — cyberpunk only */ -:root[data-theme="cyberpunk"] body::after { - background: - /* Diagonal lines moving slowly */ - repeating-linear-gradient( - 45deg, - transparent, - transparent 60px, - rgba(0, 168, 255, 0.015) 60px, - rgba(0, 168, 255, 0.015) 61px - ), - repeating-linear-gradient( - -45deg, - transparent, - transparent 80px, - rgba(255, 107, 43, 0.01) 80px, - rgba(255, 107, 43, 0.01) 81px - ), - /* Base grid */ - linear-gradient(rgba(0, 168, 255, 0.025) 1px, transparent 1px), - linear-gradient(90deg, rgba(0, 168, 255, 0.025) 1px, transparent 1px); - background-size: 200px 200px, 240px 240px, 32px 32px, 32px 32px; - animation: grid-drift 60s linear infinite; -} - -@keyframes grid-drift { - 0% { - background-position: 0 0, 0 0, 0 0, 0 0; - } - 100% { - background-position: 200px 200px, -240px 240px, 32px 32px, 32px 32px; - } -} - -/* Subtle pulsing glow dot at intersections — extra depth */ -:root[data-theme="cyberpunk"] body { - background-image: - radial-gradient(circle at 50% 50%, rgba(0, 168, 255, 0.04) 0%, transparent 70%); - background-size: 100% 100%; - animation: bg-pulse 8s ease-in-out infinite alternate; -} - -@keyframes bg-pulse { - 0% { background-size: 100% 100%; } - 100% { background-size: 120% 120%; } -}