53 lines
1.6 KiB
Python
53 lines
1.6 KiB
Python
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})[/]"
|
|
)
|