fix: таймаут на TTS-запрос, чтобы зависший edge-tts не вешал бота навсегда
All checks were successful
CI/CD Pipeline / build-and-deploy (push) Successful in 2m53s
All checks were successful
CI/CD Pipeline / build-and-deploy (push) Successful in 2m53s
При concurrent_updates=False (дефолт PTB) зависший без таймаута вызов edge_tts.save() блокировал всю очередь апдейтов — бот переставал отвечать до ручного перезапуска контейнера. Особенно проявлялось на проде при пачке из нескольких сообщений подряд.
This commit is contained in:
parent
4b79899967
commit
8d51373ec4
1 changed files with 9 additions and 1 deletions
10
app/bot.py
10
app/bot.py
|
|
@ -21,6 +21,7 @@ logger = logging.getLogger(__name__)
|
|||
USER_TOKEN = os.environ['USER_BOT_TOKEN']
|
||||
ADMIN_TOKEN = os.environ['ADMIN_BOT_TOKEN']
|
||||
TTS_VOICE = os.environ.get('TTS_VOICE', 'ru-RU-DmitryNeural')
|
||||
TTS_TIMEOUT = int(os.environ.get('TTS_TIMEOUT', '30'))
|
||||
DATA_DIR = os.environ.get('DATA_DIR', '/app/data')
|
||||
os.makedirs(DATA_DIR, exist_ok=True)
|
||||
|
||||
|
|
@ -160,7 +161,14 @@ async def handle_user_message(update: Update, context):
|
|||
|
||||
try:
|
||||
communicate = edge_tts.Communicate(text, voice=TTS_VOICE)
|
||||
await communicate.save(tmp_path)
|
||||
try:
|
||||
await asyncio.wait_for(communicate.save(tmp_path), timeout=TTS_TIMEOUT)
|
||||
except asyncio.TimeoutError:
|
||||
logger.error(f"TTS timed out after {TTS_TIMEOUT}s for user {user.id}")
|
||||
await update.message.reply_text(
|
||||
'⚠️ Сервис озвучки не отвечает. Попробуй ещё раз через минуту.'
|
||||
)
|
||||
return
|
||||
|
||||
# ── 1. Send voice back to user ──
|
||||
duration = get_ogg_duration(tmp_path)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue