Pink Floyd - Atom Heart MotherВключите этот трек, пока читаете, он над постом.
Это не просто одна из моих любимых композиций Pink Floyd, это ещё и чудесный пример песни-трипа.
Песня-трип — это не просто музыка, это долгое путешествие.
Слушать такое надо с закрытыми глазами и в наушниках, представляя себя плывущим по музыкальному течению и разделяя в уме партии разных инструментов.
Время будто останавливается, вы выпадаете из реальности, а музыка окутывает всё сознание.
Такие трипы доступны в любое время, бесплатно и без риска сесть по 228.
Когда-нибудь я обязательно составлю плейлист из таких композиций. У меня их совсем мало, но всё равно хочу собрать их в одном месте.
И всё же, сейчас об Atom Heart Mother.
Каково же было моё удивление, когда оказалось, что я не могу отправить эту песню с помощью моего же
@nowplaybot!
Бот предательски выплёвывал ошибку "Request Entity Too Large", потому что Telegram Bot API не позволяет отправить файл больше 50 МБ, а наша песенка весит все 56.
Такие длинные треки встречаются довольно редко, но ситуация меня возмутила, а значит проблему надо решать.
Возможно, для кого-то сейчас раскрою секрет.
Боты — это такие же аккаунты, как и обычные человеческие, разве что некоторые методы MTProto API для них недоступны.
Bot API — это лишь мост между HTTP и MTProto, работающий на
TDLib.
Так вот лимит в 50 МБ для файлов — это всего лишь ограничение моста.
Если обращаться к MTProto API напрямую, лимит повышается до 1.5 ГБ, как и у обычных аккаунтов.
Обычно для таких задач я использую TDLib прямо из Go, но мне стало лень работать с асинхронной загрузкой файлов, поэтому решила взять что-нибудь другое.
Практически никогда не писала на Python, но сейчас выбрала именно его, чтобы по-быстрому накодить этот небольшой микросервис.
К сожалению, классная библиотека Pyrogram не подошла, потому что не умеет загружать файлы из памяти, только по пути с диска.
Взяла Telethon и написала вот
это. Да, код там ужасный, но не ругайте, это не мой язык.
Микросервис запускается в отдельном контейнере и поднимает веб-сервер с единственным методом sendAudio, который принимает те же параметры, что и аналогичный метод из Bot API.
@nowplaybot определяет размер файла после скачивания из Deezer и если видит, что он больше 50 МБ, задействует питоновый микросервис для отправки аудио.
Если же файл маленький, используется стандартный способ (хочется использовать костыли как можно реже).
Теперь Atom Heart Mother и другие длинные треки отправляются правильно. Я спокойна.