mirror of
https://github.com/wahyd4/you-music.git
synced 2026-08-08 20:59:47 +10:00
96 lines
2.9 KiB
Python
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()
|