Initial commit
This commit is contained in:
58
backend/app/services/jellyfin_sync.py
Normal file
58
backend/app/services/jellyfin_sync.py
Normal file
@@ -0,0 +1,58 @@
|
||||
import logging
|
||||
|
||||
from fastapi import HTTPException
|
||||
|
||||
from ..clients.jellyfin import JellyfinClient
|
||||
from ..db import create_user_if_missing
|
||||
from ..runtime import get_runtime_settings
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
async def sync_jellyfin_users() -> int:
|
||||
runtime = get_runtime_settings()
|
||||
client = JellyfinClient(runtime.jellyfin_base_url, runtime.jellyfin_api_key)
|
||||
if not client.configured():
|
||||
raise HTTPException(status_code=400, detail="Jellyfin not configured")
|
||||
users = await client.get_users()
|
||||
if not isinstance(users, list):
|
||||
return 0
|
||||
imported = 0
|
||||
for user in users:
|
||||
if not isinstance(user, dict):
|
||||
continue
|
||||
name = user.get("Name")
|
||||
if not name:
|
||||
continue
|
||||
if create_user_if_missing(name, "jellyfin-user", role="user", auth_provider="jellyfin"):
|
||||
imported += 1
|
||||
return imported
|
||||
|
||||
|
||||
async def run_daily_jellyfin_sync() -> None:
|
||||
while True:
|
||||
delay = _seconds_until_midnight()
|
||||
await _sleep_seconds(delay)
|
||||
try:
|
||||
imported = await sync_jellyfin_users()
|
||||
logger.info("Jellyfin daily sync complete: imported=%s", imported)
|
||||
except HTTPException as exc:
|
||||
logger.warning("Jellyfin daily sync skipped: %s", exc.detail)
|
||||
except Exception:
|
||||
logger.exception("Jellyfin daily sync failed")
|
||||
|
||||
|
||||
def _seconds_until_midnight() -> float:
|
||||
from datetime import datetime, timedelta
|
||||
|
||||
now = datetime.now()
|
||||
next_midnight = (now + timedelta(days=1)).replace(
|
||||
hour=0, minute=0, second=0, microsecond=0
|
||||
)
|
||||
return max((next_midnight - now).total_seconds(), 0.0)
|
||||
|
||||
|
||||
async def _sleep_seconds(delay: float) -> None:
|
||||
import asyncio
|
||||
|
||||
await asyncio.sleep(delay)
|
||||
Reference in New Issue
Block a user