from __future__ import annotations import logging import os import time import httpx logger = logging.getLogger(__name__) class ViberMediaAdapter: TTL_SECONDS = 3600 def __init__(self, storage_path: str = "/tmp/forcepilot/viber_media"): self._storage_path = storage_path os.makedirs(storage_path, exist_ok=True) async def download(self, media_url: str, message_token: str | None = None) -> str | None: if not media_url: return None try: prefix = f"{message_token}_" if message_token else "" filename = f"{prefix}{media_url.rsplit('/', 1)[-1]}" filepath = f"{self._storage_path}/{filename}" if os.path.exists(filepath): mtime = os.path.getmtime(filepath) age = time.time() - mtime if age < self.TTL_SECONDS: logger.debug("Viber media cache hit: %s (age=%.0fs)", filepath, age) return filepath logger.info("Viber media cache expired: %s (age=%.0fs)", filepath, age) async with httpx.AsyncClient(timeout=httpx.Timeout(60.0)) as client: resp = await client.get(media_url) resp.raise_for_status() with open(filepath, "wb") as f: f.write(resp.content) logger.info("Viber media downloaded: %s → %s", media_url, filepath) return filepath except Exception: logger.exception("Viber media download failed: %s", media_url) return None