Add new sound files and update dependencies
- Added various sound files to the soundboard, including insults, quotes, and sound effects. - Introduced new dependencies: ffmpeg-python (version 0.2.0) and pydub (version 0.25.1) for audio processing. - Updated the lock file to reflect the new packages and their respective versions. - Added .gitignore files in the sounds/stream and sounds/temp directories to exclude unnecessary files.
This commit is contained in:
@@ -1,12 +1,13 @@
|
||||
"""Scheduler service for managing background tasks with APScheduler."""
|
||||
|
||||
import logging
|
||||
from typing import Optional
|
||||
|
||||
from apscheduler.schedulers.background import BackgroundScheduler
|
||||
from apscheduler.triggers.cron import CronTrigger
|
||||
from flask import current_app
|
||||
|
||||
from app.services.credit_service import CreditService
|
||||
from app.services.sound_scanner_service import SoundScannerService
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@@ -14,9 +15,10 @@ logger = logging.getLogger(__name__)
|
||||
class SchedulerService:
|
||||
"""Service for managing scheduled background tasks."""
|
||||
|
||||
def __init__(self) -> None:
|
||||
def __init__(self, app=None) -> None:
|
||||
"""Initialize the scheduler service."""
|
||||
self.scheduler: Optional[BackgroundScheduler] = None
|
||||
self.scheduler: BackgroundScheduler | None = None
|
||||
self.app = app
|
||||
|
||||
def start(self) -> None:
|
||||
"""Start the scheduler and add all scheduled jobs."""
|
||||
@@ -25,10 +27,13 @@ class SchedulerService:
|
||||
return
|
||||
|
||||
self.scheduler = BackgroundScheduler()
|
||||
|
||||
|
||||
# Add daily credit refill job
|
||||
self._add_daily_credit_refill_job()
|
||||
|
||||
|
||||
# Add sound scanning job
|
||||
self._add_sound_scanning_job()
|
||||
|
||||
# Start the scheduler
|
||||
self.scheduler.start()
|
||||
logger.info("Scheduler started successfully")
|
||||
@@ -47,7 +52,7 @@ class SchedulerService:
|
||||
|
||||
# Schedule daily at 00:00 UTC
|
||||
trigger = CronTrigger(hour=0, minute=0)
|
||||
|
||||
|
||||
self.scheduler.add_job(
|
||||
func=self._run_daily_credit_refill,
|
||||
trigger=trigger,
|
||||
@@ -55,47 +60,99 @@ class SchedulerService:
|
||||
name="Daily Credit Refill",
|
||||
replace_existing=True,
|
||||
)
|
||||
|
||||
|
||||
logger.info("Daily credit refill job scheduled for 00:00 UTC")
|
||||
|
||||
def _add_sound_scanning_job(self) -> None:
|
||||
"""Add the sound scanning job."""
|
||||
if self.scheduler is None:
|
||||
raise RuntimeError("Scheduler not initialized")
|
||||
|
||||
# Schedule every 5 minutes for sound scanning
|
||||
trigger = CronTrigger(minute="*/5")
|
||||
|
||||
self.scheduler.add_job(
|
||||
func=self._run_sound_scan,
|
||||
trigger=trigger,
|
||||
id="sound_scan",
|
||||
name="Sound Directory Scan",
|
||||
replace_existing=True,
|
||||
)
|
||||
|
||||
logger.info("Sound scanning job scheduled every 5 minutes")
|
||||
|
||||
def _run_daily_credit_refill(self) -> None:
|
||||
"""Execute the daily credit refill task."""
|
||||
logger.info("Starting daily credit refill task")
|
||||
|
||||
try:
|
||||
result = CreditService.refill_all_users_credits()
|
||||
|
||||
if result["success"]:
|
||||
logger.info(
|
||||
f"Daily credit refill completed successfully: "
|
||||
f"{result['users_processed']} users processed, "
|
||||
f"{result['credits_added']} credits added"
|
||||
)
|
||||
else:
|
||||
logger.error(f"Daily credit refill failed: {result['message']}")
|
||||
|
||||
except Exception as e:
|
||||
logger.exception(f"Error during daily credit refill: {e}")
|
||||
|
||||
app = self.app or current_app
|
||||
with app.app_context():
|
||||
try:
|
||||
result = CreditService.refill_all_users_credits()
|
||||
|
||||
if result["success"]:
|
||||
logger.info(
|
||||
f"Daily credit refill completed successfully: "
|
||||
f"{result['users_processed']} users processed, "
|
||||
f"{result['credits_added']} credits added",
|
||||
)
|
||||
else:
|
||||
logger.error(f"Daily credit refill failed: {result['message']}")
|
||||
|
||||
except Exception as e:
|
||||
logger.exception(f"Error during daily credit refill: {e}")
|
||||
|
||||
def _run_sound_scan(self) -> None:
|
||||
"""Execute the sound scanning task."""
|
||||
logger.info("Starting sound directory scan")
|
||||
|
||||
app = self.app or current_app
|
||||
with app.app_context():
|
||||
try:
|
||||
result = SoundScannerService.scan_soundboard_directory()
|
||||
|
||||
if result["success"]:
|
||||
if result["files_added"] > 0:
|
||||
logger.info(
|
||||
f"Sound scan completed: {result['files_added']} new sounds added",
|
||||
)
|
||||
else:
|
||||
logger.debug("Sound scan completed: no new files found")
|
||||
else:
|
||||
logger.error(f"Sound scan failed: {result.get('error', 'Unknown error')}")
|
||||
|
||||
except Exception as e:
|
||||
logger.exception(f"Error during sound scan: {e}")
|
||||
|
||||
def trigger_credit_refill_now(self) -> dict:
|
||||
"""Manually trigger credit refill for testing purposes."""
|
||||
logger.info("Manually triggering credit refill")
|
||||
return CreditService.refill_all_users_credits()
|
||||
app = self.app or current_app
|
||||
with app.app_context():
|
||||
return CreditService.refill_all_users_credits()
|
||||
|
||||
def trigger_sound_scan_now(self) -> dict:
|
||||
"""Manually trigger sound scan for testing purposes."""
|
||||
logger.info("Manually triggering sound scan")
|
||||
app = self.app or current_app
|
||||
with app.app_context():
|
||||
return SoundScannerService.scan_soundboard_directory()
|
||||
|
||||
def get_scheduler_status(self) -> dict:
|
||||
"""Get the current status of the scheduler."""
|
||||
if self.scheduler is None:
|
||||
return {"running": False, "jobs": []}
|
||||
|
||||
jobs = []
|
||||
for job in self.scheduler.get_jobs():
|
||||
jobs.append({
|
||||
jobs = [
|
||||
{
|
||||
"id": job.id,
|
||||
"name": job.name,
|
||||
"next_run": job.next_run_time.isoformat()
|
||||
"next_run": job.next_run_time.isoformat()
|
||||
if job.next_run_time else None,
|
||||
"trigger": str(job.trigger),
|
||||
})
|
||||
}
|
||||
for job in self.scheduler.get_jobs()
|
||||
]
|
||||
|
||||
return {
|
||||
"running": self.scheduler.running,
|
||||
@@ -104,4 +161,4 @@ class SchedulerService:
|
||||
|
||||
|
||||
# Global scheduler instance
|
||||
scheduler_service = SchedulerService()
|
||||
scheduler_service = SchedulerService()
|
||||
|
||||
Reference in New Issue
Block a user