feat: add waveform voice messages end-to-end
All checks were successful
CI / test (push) Successful in 23s

This commit is contained in:
2026-03-08 12:40:49 +03:00
parent 3b82b5e558
commit 30169a3a27
13 changed files with 361 additions and 19 deletions

View File

@@ -1,3 +1,5 @@
import json
from fastapi import HTTPException, status
from sqlalchemy.exc import IntegrityError
from sqlalchemy.ext.asyncio import AsyncSession
@@ -5,6 +7,7 @@ from sqlalchemy.ext.asyncio import AsyncSession
from app.chats import repository as chats_repository
from app.chats.models import ChatMemberRole, ChatType
from app.chats.service import ensure_chat_membership
from app.media import repository as media_repository
from app.messages import repository
from app.messages.models import Message
from app.messages.spam_guard import enforce_message_spam_policy
@@ -110,11 +113,32 @@ async def get_messages(
messages = await repository.list_chat_messages(db, chat_id, user_id=user_id, limit=safe_limit, before_id=before_id)
if not messages:
return messages
message_ids = [message.id for message in messages]
attachments = await media_repository.list_attachments_by_message_ids(db, message_ids=message_ids)
waveform_by_message_id: dict[int, list[int]] = {}
for attachment in attachments:
if not attachment.waveform_data:
continue
try:
parsed = json.loads(attachment.waveform_data)
except Exception:
continue
if not isinstance(parsed, list):
continue
values: list[int] = []
for item in parsed[:256]:
if isinstance(item, (int, float)):
values.append(max(0, min(31, int(item))))
if values:
waveform_by_message_id[attachment.message_id] = values
receipts = await repository.list_chat_receipts(db, chat_id=chat_id)
other_receipts = [receipt for receipt in receipts if receipt.user_id != user_id]
if not other_receipts:
return messages
for message in messages:
waveform = waveform_by_message_id.get(message.id)
if waveform:
setattr(message, "attachment_waveform", waveform)
if message.sender_id != user_id:
continue
is_read = any((receipt.last_read_message_id or 0) >= message.id for receipt in other_receipts)