Files
you-music/backend/app/services/scheduler.py
T
2025-10-30 22:35:02 +11:00

96 lines
2.9 KiB
Python

import logging
from datetime import datetime
from apscheduler.schedulers.asyncio import AsyncIOScheduler
from apscheduler.triggers.interval import IntervalTrigger
from sqlalchemy.ext.asyncio import AsyncSession
from app.core.config import settings
from app.services.scanner import full_scan
from app.db.session import async_session_maker
logger = logging.getLogger(__name__)
scheduler = AsyncIOScheduler()
current_interval = settings.SCAN_INTERVAL
async def scheduled_scan_job():
"""Background job for scheduled scanning"""
logger.info("⏰ Running scheduled music library scan...")
async with async_session_maker() as db:
try:
# Get delete_missing setting from database
from sqlalchemy import select
from app.models.models import AppSettings
result = await db.execute(
select(AppSettings).where(AppSettings.key == "delete_missing_files")
)
setting = result.scalar_one_or_none()
delete_missing = setting.value.lower() == "true" if setting else settings.DELETE_MISSING_FILES
await full_scan(db, delete_missing)
except Exception as e:
logger.error(f"Error in scheduled scan: {e}")
def start_scheduler():
"""Start the background scheduler"""
if not settings.AUTO_SCAN_ENABLED:
logger.info("📅 Auto-scan is disabled, scheduler not started")
return
logger.info(f"📅 Starting scheduler with interval: {settings.SCAN_INTERVAL} seconds")
# Add the scan job
scheduler.add_job(
scheduled_scan_job,
trigger=IntervalTrigger(seconds=settings.SCAN_INTERVAL),
id='music_scan',
name='Music Library Scan',
replace_existing=True
)
scheduler.start()
logger.info("✅ Scheduler started successfully")
def stop_scheduler():
"""Stop the background scheduler"""
if scheduler.running:
scheduler.shutdown()
logger.info("📅 Scheduler stopped")
def update_scan_interval(new_interval: int):
"""Update the scan interval dynamically"""
global current_interval
if not settings.AUTO_SCAN_ENABLED:
logger.info("Auto-scan is disabled, not updating interval")
return
if new_interval == current_interval:
return
logger.info(f"Updating scan interval from {current_interval}s to {new_interval}s")
current_interval = new_interval
# Reschedule the job with new interval
scheduler.reschedule_job(
'music_scan',
trigger=IntervalTrigger(seconds=new_interval)
)
def enable_auto_scan(enabled: bool, interval: int = None):
"""Enable or disable automatic scanning"""
if enabled:
if not scheduler.running:
start_scheduler()
if interval:
update_scan_interval(interval)
else:
if scheduler.running:
stop_scheduler()