You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
SoulSync/api/system.py

102 lines
3.4 KiB

"""
System endpoints — status, activity feed, stats.
"""
import time
from flask import current_app
from .auth import require_api_key
from .helpers import api_success, api_error
def register_routes(bp):
@bp.route("/system/status", methods=["GET"])
@require_api_key
def system_status():
"""Server status including uptime and service connectivity."""
try:
app = current_app._get_current_object()
ctx = app.soulsync
uptime_seconds = time.time() - getattr(app, "start_time", time.time())
hours, remainder = divmod(int(uptime_seconds), 3600)
minutes, seconds = divmod(remainder, 60)
spotify = ctx.get("spotify_client")
spotify_ok = bool(spotify and spotify.is_authenticated())
soulseek = ctx.get("soulseek_client")
soulseek_ok = bool(soulseek)
hydrabase = ctx.get("hydrabase_client")
hydrabase_ok = False
if hydrabase:
try:
ws, _ = hydrabase.get_ws_and_lock()
hydrabase_ok = ws is not None and ws.connected
except Exception:
pass
return api_success({
"uptime": f"{hours}h {minutes}m {seconds}s",
"uptime_seconds": int(uptime_seconds),
"services": {
"spotify": spotify_ok,
"soulseek": soulseek_ok,
"hydrabase": hydrabase_ok,
},
})
except Exception as e:
return api_error("SYSTEM_ERROR", str(e), 500)
@bp.route("/system/activity", methods=["GET"])
@require_api_key
def system_activity():
"""Recent activity feed."""
try:
from web_server import activity_feed
items = list(activity_feed) if activity_feed else []
return api_success({"activities": items})
except Exception as e:
return api_error("SYSTEM_ERROR", str(e), 500)
@bp.route("/system/stats", methods=["GET"])
@require_api_key
def system_stats():
"""Combined library + download statistics."""
try:
from database.music_database import get_database
db = get_database()
lib_stats = db.get_statistics_for_server()
db_info = db.get_database_info_for_server()
# Active download count
download_count = 0
try:
from web_server import download_tasks, tasks_lock
with tasks_lock:
download_count = sum(
1 for t in download_tasks.values()
if t.get("status") in ("downloading", "queued", "searching")
)
except ImportError:
pass
return api_success({
"library": {
"artists": lib_stats.get("artists", 0),
"albums": lib_stats.get("albums", 0),
"tracks": lib_stats.get("tracks", 0),
},
"database": {
"size_mb": db_info.get("database_size_mb"),
"last_update": db_info.get("last_update"),
},
"downloads": {
"active": download_count,
},
})
except Exception as e:
return api_error("SYSTEM_ERROR", str(e), 500)