fix: ignore corrupted opus packets
This commit is contained in:
@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user