diff --git a/main.py b/main.py index 20f01cd..a278e62 100644 --- a/main.py +++ b/main.py @@ -8,6 +8,7 @@ import asyncio import re from datetime import datetime, timedelta, timezone import aiodocker +from aiodocker.connector import DockerConnector import aiohttp import random import string @@ -153,8 +154,15 @@ async def main(): Monitors Navidrome container logs for rapid star/unstar events. """ docker = None + session = None try: - docker = aiodocker.Docker() + # We need a custom session with no timeout for the long-polling log stream. + # We also need to use aiodocker's connector to handle Unix sockets correctly. + connector = DockerConnector() + timeout = aiohttp.ClientTimeout(total=None, sock_read=None) + session = connector.aiohttp_session(timeout=timeout) + docker = aiodocker.Docker(session=session) + container = await docker.containers.get(settings.NAVIDROME_CONTAINER) logging.info(f"Monitoring logs for container '{settings.NAVIDROME_CONTAINER}'...") @@ -163,7 +171,6 @@ async def main(): stderr=True, follow=True, since=datetime.now(timezone.utc).timestamp(), - timeout=0, # Disable timeout for long-polling ) async for line in logs: @@ -194,7 +201,10 @@ async def main(): logging.exception("An unexpected error occurred") finally: if docker: + # aiodocker doesn't close sessions it doesn't own. await docker.close() + if session: + await session.close() if __name__ == "__main__":