103 lines
3.4 KiB
Python
103 lines
3.4 KiB
Python
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"}
|
|
|
|
|
|
import json |