fix: JobQueue optional — asyncio Fallback für Filmtipp-Cronjob
This commit is contained in:
parent
1d92679c14
commit
973eb4653e
1 changed files with 35 additions and 10 deletions
|
|
@ -758,10 +758,14 @@ async def handle_callback(update: Update, ctx: ContextTypes.DEFAULT_TYPE):
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def _send_daily_filmtipps(app_context: ContextTypes.DEFAULT_TYPE):
|
async def _send_daily_filmtipps(context):
|
||||||
"""Täglicher Cronjob: Filmtipps via Telegram senden."""
|
"""Täglicher Cronjob: Filmtipps via Telegram senden.
|
||||||
|
|
||||||
|
context kann ein CallbackContext (JobQueue) oder eine Application (asyncio-Loop) sein.
|
||||||
|
"""
|
||||||
if not CHAT_ID:
|
if not CHAT_ID:
|
||||||
return
|
return
|
||||||
|
bot = getattr(context, "bot", None) or context
|
||||||
try:
|
try:
|
||||||
from tools import savetv
|
from tools import savetv
|
||||||
telecasts = savetv._scrape_epg()
|
telecasts = savetv._scrape_epg()
|
||||||
|
|
@ -772,7 +776,7 @@ async def _send_daily_filmtipps(app_context: ContextTypes.DEFAULT_TYPE):
|
||||||
return
|
return
|
||||||
|
|
||||||
header = f"🎬 TV-Filmtipps für heute ({datetime.now().strftime('%d.%m.%Y')})\n"
|
header = f"🎬 TV-Filmtipps für heute ({datetime.now().strftime('%d.%m.%Y')})\n"
|
||||||
await app_context.bot.send_message(chat_id=CHAT_ID, text=header)
|
await bot.send_message(chat_id=CHAT_ID, text=header)
|
||||||
|
|
||||||
for f in films[:6]:
|
for f in films[:6]:
|
||||||
tid = int(f.get("ITELECASTID", 0))
|
tid = int(f.get("ITELECASTID", 0))
|
||||||
|
|
@ -793,7 +797,7 @@ async def _send_daily_filmtipps(app_context: ContextTypes.DEFAULT_TYPE):
|
||||||
InlineKeyboardButton("⏭ Nein", callback_data=f"savetv_skip_{tid}"),
|
InlineKeyboardButton("⏭ Nein", callback_data=f"savetv_skip_{tid}"),
|
||||||
]
|
]
|
||||||
])
|
])
|
||||||
await app_context.bot.send_message(
|
await bot.send_message(
|
||||||
chat_id=CHAT_ID,
|
chat_id=CHAT_ID,
|
||||||
text=text,
|
text=text,
|
||||||
reply_markup=keyboard,
|
reply_markup=keyboard,
|
||||||
|
|
@ -838,17 +842,38 @@ def main():
|
||||||
app.add_handler(MessageHandler(filters.Document.ALL, handle_document))
|
app.add_handler(MessageHandler(filters.Document.ALL, handle_document))
|
||||||
app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, handle_message))
|
app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, handle_message))
|
||||||
|
|
||||||
|
if app.job_queue is not None:
|
||||||
app.job_queue.run_daily(
|
app.job_queue.run_daily(
|
||||||
_send_daily_filmtipps,
|
_send_daily_filmtipps,
|
||||||
time=dtime(hour=14, minute=0),
|
time=dtime(hour=14, minute=0),
|
||||||
name="daily_filmtipps",
|
name="daily_filmtipps",
|
||||||
)
|
)
|
||||||
log.info("Täglicher Filmtipp-Job registriert (14:00 Uhr)")
|
log.info("Täglicher Filmtipp-Job registriert (14:00 Uhr)")
|
||||||
|
else:
|
||||||
|
log.warning("JobQueue nicht verfügbar — Filmtipps werden per asyncio-Loop gesendet")
|
||||||
|
|
||||||
|
async def _filmtipp_loop(application):
|
||||||
|
"""Fallback: asyncio-basierter täglicher Filmtipp (wenn kein JobQueue)."""
|
||||||
|
while True:
|
||||||
|
now = datetime.now()
|
||||||
|
target = now.replace(hour=14, minute=0, second=0, microsecond=0)
|
||||||
|
if now >= target:
|
||||||
|
from datetime import timedelta
|
||||||
|
target += timedelta(days=1)
|
||||||
|
wait_secs = (target - now).total_seconds()
|
||||||
|
log.info("Filmtipp-Loop: nächster Run in %.0f Sek (%s)", wait_secs, target)
|
||||||
|
await asyncio.sleep(wait_secs)
|
||||||
|
try:
|
||||||
|
await _send_daily_filmtipps(application)
|
||||||
|
except Exception:
|
||||||
|
log.exception("Fehler im Filmtipp-Loop")
|
||||||
|
|
||||||
async def post_init(application):
|
async def post_init(application):
|
||||||
await application.bot.set_my_commands(BOT_COMMANDS)
|
await application.bot.set_my_commands(BOT_COMMANDS)
|
||||||
log.info("Kommandomenü registriert")
|
log.info("Kommandomenü registriert")
|
||||||
asyncio.create_task(_watchdog_loop())
|
asyncio.create_task(_watchdog_loop())
|
||||||
|
if application.job_queue is None:
|
||||||
|
asyncio.create_task(_filmtipp_loop(application))
|
||||||
_sd_notify("READY=1")
|
_sd_notify("READY=1")
|
||||||
log.info("Systemd Watchdog aktiv (50s Intervall)")
|
log.info("Systemd Watchdog aktiv (50s Intervall)")
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue