5439af1955
- Add Gitea Actions workflows: test.yml (lint + test on push/PR) and release.yml (build + NSIS installer + upload on v* tags) - Add NSIS installer with optional desktop shortcut and auto-start - Add esbuild bundler: ES module migration with IIFE bundle output - Add build-dist-windows.sh for cross-building Windows distribution - Fix all ruff lint errors (import sorting, unused imports, line length) - Remove redundant scripts (start-server.bat, stop-server.bat, start-server-background.vbs) - Update CLAUDE.md with CI/CD and release documentation
59 lines
1.6 KiB
Python
59 lines
1.6 KiB
Python
"""Display brightness and power control API endpoints."""
|
|
|
|
import logging
|
|
|
|
from fastapi import APIRouter, Depends
|
|
from pydantic import BaseModel, Field
|
|
|
|
from ..auth import verify_token
|
|
from ..services.display_service import (
|
|
list_monitors,
|
|
set_brightness,
|
|
set_power,
|
|
)
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
router = APIRouter(prefix="/api/display", tags=["display"])
|
|
|
|
|
|
class BrightnessRequest(BaseModel):
|
|
brightness: int = Field(ge=0, le=100)
|
|
|
|
|
|
class PowerRequest(BaseModel):
|
|
on: bool
|
|
|
|
|
|
@router.get("/monitors")
|
|
async def get_monitors(
|
|
refresh: bool = False, _: str = Depends(verify_token)
|
|
) -> list[dict]:
|
|
"""List all connected monitors with brightness and power info."""
|
|
monitors = list_monitors(force_refresh=refresh)
|
|
logger.debug("Found %d monitors", len(monitors))
|
|
return [m.to_dict() for m in monitors]
|
|
|
|
|
|
@router.post("/brightness/{monitor_id}")
|
|
async def set_monitor_brightness(
|
|
monitor_id: int, request: BrightnessRequest, _: str = Depends(verify_token)
|
|
) -> dict:
|
|
"""Set brightness for a specific monitor."""
|
|
success = set_brightness(monitor_id, request.brightness)
|
|
if success:
|
|
logger.info("Set monitor %d brightness to %d", monitor_id, request.brightness)
|
|
return {"success": success}
|
|
|
|
|
|
@router.post("/power/{monitor_id}")
|
|
async def set_monitor_power(
|
|
monitor_id: int, request: PowerRequest, _: str = Depends(verify_token)
|
|
) -> dict:
|
|
"""Turn a monitor on or off."""
|
|
action = "on" if request.on else "off"
|
|
success = set_power(monitor_id, request.on)
|
|
if success:
|
|
logger.info("Set monitor %d power %s", monitor_id, action)
|
|
return {"success": success}
|