Коротко — потому что веб‑клиент Telegram ожидает от «видеофайла» возможности прогрессивной (streaming) отдачи по HTTP, а при загрузке больших файлов через API (или при неподходящем контейнере) такой версии/индексации у файла может не быть. В результате Web не позволяет «открыть» видео прямо в браузере, хотя в метаданных (duration / w / h) всё может выглядеть правильно. Мобильные и Desktop‑клиенты либо по‑другому обрабатывают файл, либо скачивают и воспроизводят его локально — поэтому у них проблем нет. Ручная загрузка через UI запускает серверную обработку/оптимизацию и делает файл пригодным для веб‑проигрывания.
Причины более подробно
- Разный путь загрузки/обработки. Маленькие файлы или файлы, залитые через UI, Telegram может автоматически переработать (создать потоковую MP4‑версию, переставить индекс и т. п.). При загрузке больших файлов через MTProto/библиотеки (Telethon) серверной постобработки может не происходить.
- MP4 «индекс» (moov atom). Чтобы браузер мог начать воспроизведение до полной загрузки файла, moov‑атом должен быть в начале файла (так называемый faststart). Если moov в конце, web‑плеер не может начать просмотр до полной загрузки => Telegram Web ведёт себя «некликабельно».
- Отсутствие флага «streamable». Для правильного отображения как видео (а не просто как документа) нужно корректно передать атрибуты (DocumentAttributeVideo) и флаг supports_streaming. Иногда при «большой» загрузке эти атрибуты не выставляются сервером автоматически.
Как это исправить
- Переместить moov‑atom в начало (самый надёжный способ):
ffmpeg -i in.mp4 -c copy -movflags +faststart out.mp4
После этого файл обычно воспроизводится в веб‑клиенте.
- При отправке через Telethon явно указывать атрибуты видео и supports_streaming, а также миниатюру. Пример (русская идея, не точный copy‑paste API):
from telethon.tl.types import DocumentAttributeVideo
await client.send_file(chat, 'out.mp4',
attributes=[DocumentAttributeVideo(duration=..., w=..., h=..., supports_streaming=True)],
thumb='thumb.jpg'
)
- Если не хочется перерабатывать файл, можно залить его через веб‑интерфейс Telegram — там сервер выполнит нужную подготовку.
Подводя итог: проблема не в Telethon как таковом, а в том, что для отображения/прогрессивного воспроизведения в браузере файл должен быть «streamable» (или обработан сервером). Большие файлы, загруженные через API, иногда такой подготовки не получают — поэтому веб‑клиент не открывает их.