This commit is contained in:
2025-12-08 12:42:02 +00:00
parent a608684172
commit a6a527f15c
2 changed files with 30 additions and 4 deletions

28
main.py
View File

@@ -1,17 +1,33 @@
from fastapi import FastAPI, HTTPException, BackgroundTasks
from fastapi import FastAPI, HTTPException, BackgroundTasks, Request
from pydantic import BaseModel
from bot import MatrixBot
import asyncio
from contextlib import asynccontextmanager
import logging
import sys
# Configure logging to output to stdout
logging.basicConfig(
stream=sys.stdout,
level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
logger = logging.getLogger("matrix_manager")
bot = MatrixBot()
@asynccontextmanager
async def lifespan(app: FastAPI):
# Startup
await bot.login()
logger.info("Starting up Matrix Manager Service...")
try:
await bot.login()
logger.info("Bot logged in successfully.")
except Exception as e:
logger.error(f"Failed to login bot: {e}")
yield
# Shutdown
logger.info("Shutting down Matrix Manager Service...")
await bot.close()
app = FastAPI(lifespan=lifespan)
@@ -38,6 +54,7 @@ async def send_notification(notification: Notification, background_tasks: Backgr
"""
Send a notification to a Matrix room.
"""
logger.info(f"Received notification request from service: {notification.service_name}")
try:
# Format the message to include the service name
# Plain text fallback
@@ -46,9 +63,11 @@ async def send_notification(notification: Notification, background_tasks: Backgr
html_message = f"<b>[{notification.service_name}]</b><br>{notification.content}"
# We can send it in background to not block the API response
logger.info(f"Queueing message for room_id: {notification.room_id or 'Default'}")
background_tasks.add_task(bot.send_message, plain_message, html_message, notification.room_id)
return {"status": "queued"}
except Exception as e:
logger.error(f"Error in send_notification: {e}")
raise HTTPException(status_code=500, detail=str(e))
@app.post("/jellyfin")
@@ -56,8 +75,10 @@ async def receive_jellyfin_webhook(payload: JellyfinPayload, background_tasks: B
"""
Receive webhook from Jellyfin and forward to Matrix.
"""
logger.info(f"Received Jellyfin webhook. Type: {payload.notification_type}, Item: {payload.item_type}")
try:
if payload.notification_type != "ItemAdded":
logger.info("Ignored Jellyfin event (not ItemAdded)")
return {"status": "ignored", "reason": "Not an ItemAdded event"}
# content construction
@@ -80,13 +101,16 @@ async def receive_jellyfin_webhook(payload: JellyfinPayload, background_tasks: B
plain_message = f"[Jellyfin]\n{content}"
html_message = f"<b>[Jellyfin]</b><br>{content.replace(chr(10), '<br>')}"
logger.info(f"Queueing Jellyfin message for room_id: {payload.room_id or 'Default'}")
background_tasks.add_task(bot.send_message, plain_message, html_message, payload.room_id)
return {"status": "queued"}
except Exception as e:
logger.error(f"Error in receive_jellyfin_webhook: {e}")
raise HTTPException(status_code=500, detail=str(e))
@app.get("/health")
async def health_check():
logger.info("Health check requested")
return {"status": "ok"}