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:
JSC
2025-07-02 17:09:43 +02:00
parent 1b597f4047
commit 7128ca727b
181 changed files with 1278 additions and 62 deletions

View File

@@ -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()