import json from fastapi import APIRouter, Depends, HTTPException from sqlalchemy.orm import Session from typing import List, Optional from ..db.database import get_db from ..models.settings import UserSetting from ..schemas.settings import UserSettingsResponse, ServerConfigResponse router = APIRouter(prefix="/api/settings", tags=["settings"]) @router.get("", response_model=UserSettingsResponse) def get_settings(db: Session = Depends(get_db)): settings = db.query(UserSetting).all() data = {s.key: s.value for s in settings} return UserSettingsResponse( audio_quality=data.get("audio_quality", "high"), theme=data.get("theme", "dark"), scan_directories=json.loads(data.get("scan_directories", "[]")), user_name=data.get("user_name", "User"), user_avatar=data.get("user_avatar"), radio_browser_instance=data.get("radio_browser_instance", "https://de1.api.radio-browser.info"), auto_transcode=data.get("auto_transcode", "true").lower() == "true", default_mood=data.get("default_mood"), ) @router.put("") def update_settings(settings: UserSettingsResponse, db: Session = Depends(get_db)): data = settings.model_dump() for key, value in data.items(): if value is not None: setting = db.query(UserSetting).filter(UserSetting.key == key).first() if setting: setting.value = str(value) else: setting = UserSetting(key=key, value=str(value)) db.add(setting) db.commit() return {"message": "Settings updated"} @router.get("/servers", response_model=List[ServerConfigResponse]) def get_servers(db: Session = Depends(get_db)): setting = db.query(UserSetting).filter(UserSetting.key == "scan_directories").first() import json dirs = json.loads(setting.value) if setting else [] import os servers = [] for i, d in enumerate(dirs): song_count = sum(1 for _ in os.walk(d)) if os.path.exists(d) else 0 servers.append(ServerConfigResponse( id=str(i), path=d, name=os.path.basename(d) or d, song_count=song_count, )) return servers @router.post("/servers") def add_server(path: str, name: Optional[str] = None, db: Session = Depends(get_db)): import os if not os.path.exists(path): raise HTTPException(status_code=400, detail="Path does not exist") setting = db.query(UserSetting).filter(UserSetting.key == "scan_directories").first() import json dirs = json.loads(setting.value) if setting else [] dirs.append(path) if setting: setting.value = json.dumps(dirs) else: setting = UserSetting(key="scan_directories", value=json.dumps(dirs)) db.add(setting) db.commit() return {"message": "Server added", "path": path} @router.delete("/servers/{server_id}") def remove_server(server_id: str, db: Session = Depends(get_db)): setting = db.query(UserSetting).filter(UserSetting.key == "scan_directories").first() if not setting: raise HTTPException(status_code=404, detail="No servers configured") import json dirs = json.loads(setting.value) idx = int(server_id) if 0 <= idx < len(dirs): dirs.pop(idx) setting.value = json.dumps(dirs) db.commit() return {"message": "Server removed"}