from pyrogram import Client, raw from pyrogram.types import Message from userbot.modules.capture.context import CaptureContext from userbot.modules.media import self_destruct_ttl from userbot.modules.stt import repository from utils.logging import logger def is_transcribable(message: Message) -> bool: if self_destruct_ttl(message) is not None: return False return message.voice is not None or message.video_note is not None def should_transcribe_on_backfill(message: Message, self_id: int | None) -> bool: if not is_transcribable(message): return False if message.outgoing: return True sender = message.from_user.id if message.from_user else None if sender is None and message.sender_chat is not None: sender = message.sender_chat.id if sender == self_id: return True return not message.unread_media async def transcribe_message( client: Client, ctx: CaptureContext, chat_id: int, message_id: int ) -> None: peer = await client.resolve_peer(chat_id) if peer is None: return result = await client.invoke( raw.functions.messages.TranscribeAudio(peer=peer, msg_id=message_id) ) if result.pending: logger.info( f"[yellow]STT pending {chat_id}/{message_id} " f"(trial_remains={result.trial_remains_num})[/]" ) return if result.text: await repository.set_extracted_text( ctx.pool, ctx.account_id, chat_id, message_id, result.text ) else: logger.info( f"[yellow]STT empty {chat_id}/{message_id} " f"(trial_remains={result.trial_remains_num})[/]" )