|
|
|
from apscheduler.schedulers.asyncio import AsyncIOScheduler |
|
from apscheduler.triggers.interval import IntervalTrigger |
|
from config import SETTINGS, load_feeds |
|
import logging |
|
|
|
logger = logging.getLogger(__name__) |
|
|
|
class NewsScheduler: |
|
def __init__(self): |
|
self.scheduler = AsyncIOScheduler() |
|
self.processed_links = set() |
|
self.max_history = 1000 |
|
|
|
def cleanup_processed_links(self): |
|
|
|
if len(self.processed_links) > self.max_history: |
|
self.processed_links = set(list(self.processed_links)[-self.max_history:]) |
|
|
|
async def job_wrapper(self): |
|
try: |
|
await process_and_send_news() |
|
self.cleanup_processed_links() |
|
except Exception as e: |
|
logger.error(f"Scheduler-Job fehlgeschlagen: {str(e)}") |
|
|
|
def start(self): |
|
feeds = load_feeds() |
|
|
|
for feed in feeds: |
|
trigger = IntervalTrigger( |
|
minutes=feed.get("interval", SETTINGS["check_interval"]) |
|
self.scheduler.add_job( |
|
self.job_wrapper, |
|
trigger=trigger, |
|
kwargs={"feed": feed}, |
|
max_instances=3 |
|
) |
|
self.scheduler.start() |
|
logger.info("Scheduler gestartet mit %d Jobs", len(self.scheduler.get_jobs())) |
|
|
|
async def process_and_send_news(feed=None): |
|
|
|
pass |