diff --git a/bot.py b/bot.py index 6e0d5a7..289b367 100644 --- a/bot.py +++ b/bot.py @@ -1,6 +1,7 @@ from __future__ import annotations import asyncio +import logging import os import shutil import uuid @@ -9,6 +10,8 @@ from pathlib import Path import discord from discord import app_commands from discord.ext import commands, voice_recv +from discord.ext.voice_recv import opus as voice_recv_opus +from discord.opus import OpusError from dotenv import load_dotenv import config @@ -16,6 +19,29 @@ from helpers import chunk_message, command_channel_error from openrouter_client import summarize, transcribe from voice import MeetingRecorder +log = logging.getLogger(__name__) + +_original_decode_packet = voice_recv_opus.PacketDecoder._decode_packet + + +def _safe_decode_packet(self, packet): + try: + return _original_decode_packet(self, packet) + except OpusError as exc: + log.warning("Dropping corrupted opus packet for ssrc %s: %s", self.ssrc, exc) + if packet: + return packet, b"" + try: + next_packet = self._buffer.peek_next() + if next_packet is not None: + return packet, self._decoder.decode(next_packet.decrypted_data, fec=True) + return packet, self._decoder.decode(None, fec=False) + except Exception: + return packet, b"" + + +voice_recv_opus.PacketDecoder._decode_packet = _safe_decode_packet + load_dotenv() TOKEN = os.getenv("DISCORD_BOT_TOKEN")