
Telegram Music Hub (TMH) — это open-source решение, которое превращает ваш Telegram-канал в единое цифровое пространство для музыки, блога и сообщества.
И всё это — на самом обычном виртуальном хостинге, без баз данных, без сложных зависимостей, без дорогих серверов.
Что такое TMH?
TMH by TCSE — это не просто плеер. Это система управления контентом, где:
Telegram — источник контента (канал + бот)
PHP — движок
Веб-сайт — финальная точка потребления
Вы публикуете трек или пост в Telegram — и он автоматически появляется на вашем сайте, как в стриминге.
Возможности

Функция |
Описание |
---|---|
? Потоковое прослушивание |
Веб-плеер с поддержкой PWA (можно установить как приложение) |
? Автоматический блог |
Посты из Telegram-канала отображаются как красивый мобильный сайт |
? Плейлисты |
M3U, PLS, XSPF — для VLC, Winamp, Foobar и других плееров |
?️ Галерея фото |
Альбомы из Telegram — как слайдер в блоге |
? Безопасность |
Никаких прямых ссылок с токенами бота — только через прокси |
? PWA |
Работает как нативное приложение, в том числе на iPhone с выключенным экраном |

Почему PHP, а не Python или Node.js?
Отличный вопрос.
Когда я начинал разработку, я действительно рассматривал:
Node.js — для асинхронности
Python — для чистоты кода
Docker — для контейнеризации
Но цель была другой: сделать решение, которое может установить любой, даже без технических навыков.
И вот почему я выбрал PHP:
✅ Доступность
PHP 7.4+ — стандарт на 99% виртуальных хостингов
Никаких npm, pip, node_modules
Нет нужды в VPS или выделенном сервере
✅ Простота развёртывания
Скачали архив → загрузили по FTP → открыли ссылку → готово
Никаких
npm install
,pip install
,docker-compose up
✅ Без баз данных
Все данные — в
.json
файлах:music_db.json
,posts.json
,user_states.json
Нет MySQL, нет PostgreSQL, нет Redis
Легко бэкапить, редактировать, переносить
✅ SSL — и всё работает
Даже бесплатный Let's Encrypt подойдёт для вебхука
Никаких прокси, nginx, certbot — хостинг сам всё настроит
Дешево и эффективно
Сколько стоит запустить TMH?
Хостинг: от 100–200 руб/мес (например, Masterhost, Timeweb, Beget и прочие )
Домен: опционально (можно использовать поддомен)
SSL: бесплатный (всегда включён)
Telegram: бесплатно
Итого: от 0 до 200 рублей в месяц.
Вы получаете:
? Музыкальный стриминг
? Блог с фото и аудио
? PWA-приложение
? Автоматическую синхронизацию с Telegram
Как это работает?
Telegram-бот
↓
bot.php (вебхук)
↓
music_db.json, posts.json
↓
Веб-сайт (HTML + JS)
Вы отправляете аудио боту → он сохраняет
file_id
вmusic_db.json
Вы публикуете пост в канале → он сохраняется в
posts.json
stream.php
иblog_cover.php
возвращают медиа поfile_id
(без токена!)blog.html
иplayer.html
показывают всё красиво
Безопасность: никаких токенов в коде
Многие решения показывают токен бота в music_db.json
или stream.php
— это опасно.
В TMH:
stream.php?id=file_id
→ возвращает аудио черезheader('Location: ...')
blog_cover.php?file_id=...
→ возвращает фотоТокен бота никогда не попадает в браузер
Почему это важно?
Telegram становится новой платформой, как веб в 2000-х.
Но большая часть мира всё ещё живёт в обычном вебе.
TMH — это мост между ними.
Вы не просто делаете плеер.
Вы показываете, что контент в Telegram может быть виден везде — в поиске, в соцсетях, в браузере.
Кому подойдёт?
Музыкантам, которые хотят слушать свою музыку как в Spotify
Поэтам и писателям, ведущим литературный дневник
Продюсерам, собирающим архивы и референсы
Блогерам, ведущим визуальные заметки
Сообществам, которые хотят быть видны вне Telegram
Установка (5 минут)
Скачайте релиз с GitHub
Загрузите папку
/tmh/
на хостинг через FTP-
Откройте
/tmh/data/config.php
и укажите:bot_token
base_url
channel_username
Запустите
/tmh/core/set_webhook.php
Добавьте бота администратором в канал
Готово! Бот начинает слушать.
Итог
TMH by TCSE — это не просто скрипт.
Это демонстрация силы простоты.
Вы не нуждаетесь в дорогом сервере, базе данных или команде разработчиков.
Вам нужно:
PHP 7.4+
SSL
Telegram
И вы получаете полноценное цифровое пространство.
Попробуйте: github.com/tcse/php-TMH
Star, Fork, PR — приветствуются.
Ваша музыка заслуживает лучшего способа быть услышанной.
? Хотите посмотреть, как это работает в реальных проектах?
Вот несколько примеров, где php-TMH уже используется:
? Демо-сайт разработчика
Полный функционал: блог с фотоальбомами, веб-плеер с поддержкой PWA, потоковое воспроизведение.

Треки загружаются только автором канала — идеально подходит для артистов и личных проектов.
Вы можете послушать, посмотреть галерею и почувствовать, как работает система.

? Музыка сообщества «Dongfeng»
Открытый доступ: любой пользователь может загрузить трек через бота @DongfengAeolusRu_Bot.
Отличный пример работы с модерацией, ролями пользователей и Telegram Mini App.
Можно протестировать весь процесс — от загрузки до прослушивания в вебе.

Эти проекты показывают, как один и тот же скрипт может работать и как персональный хаб, и как платформа для сообщества.
? Исходный код: github.com/tcse/php-TMH
Комментарии (18)
koreychenko
05.09.2025 08:41Идея интересная, но держать базу данных в json и постоянно её туда-сюда перекодировать и сохранять целиком - такое себе решение. В случае нескольких одновременных запросов вы потеряете часть данных. Ну и это сильно медленнее и менее удобно, чем какой-нибудь sqllite. Представьте у вас загружено 1000 треков и вы постоянно все их грузите и декодируете, вместо того, чтобы сделать: SELECT * FROM tracks WHERE file_id = :fileId.
talik Автор
05.09.2025 08:41Это все верно, но до размера в 1000 треков надо дожить.
С SQLite тестировал - мне не понравилась сама идея того, что оперативно такую базу не открыть не поправить (без специального софта).
А задача была - сделать максимально просто, что бы при желании открыл исходный json и руками поправил все тексты, названия и прочие данные.
Да и где вы видел инди-музыканта с 1000 треков?
Сделайте форк, прикрутите SQLite - вместе погоняем на тысячах треков.
IgnatF
05.09.2025 08:41Треки вводит тут наверное только один человек. Так что одновременной записи данных в теории нет. Насчет поиска кто то может удивлен будет, но быстрей найти информацию в текстовом файле, чем в базе данных. Ибо большое время уходит на само подключение к ней. До какого то количества конечно. Искать в текстовом файле примерно до 300 строк выгодней по времени.
koreychenko
05.09.2025 08:41Скорость поиска информации в текстовом файле зависит, сюрприз, от структуры текстового файла.
Если вы посмотрите реализацию автора статьи, то увидите, что такой поиск сильно дольше, чем грепнуть файлик. Сначала весь файл загружается в память, потом он декодируется с помощью json_decode. Это все не бесплатные операции.
Если совсем придираться, то sqllite это такой же файлик, только определенной структуры. И сделан он исключительно для того, чтобы по нему было быстрее искать, чем просто по текстовому файлу.IgnatF
05.09.2025 08:41Честно не смотрел, как там автор сделал. В любом случае, если кому будет интересно проект в открытом доступе Любой может все по своему сделать.
FanatPHP
05.09.2025 08:41Вводит один, а слушают многие. И при каждом прослушивании перезаписывается весь файл.
talik Автор
05.09.2025 08:41Собственно мне очень долгое время была не понятна идея мини-апп внутри Телеги. Пытался по разному придумать для чего оно нужно обычному пользователю у которого уже есть сайт.
Идея с плеером и блогом (просто переделанной под себя лентой из канала) показалась более понятной, чем любые демо которые есть в анонсах телеграм про сам формат mini app
FanatPHP
05.09.2025 08:41А чем продиктован выбор JSON файлов, а не SQLite?
talik Автор
05.09.2025 08:41Удобством работы как с текстовым форматом.
Легко перемещать между хостингами.
Кроме этого, изначально планировалась разработка telegram mini app, а в телеге все через json происходит. Так зачем изобретать что-то новое, если это формат донора на основе которого все и работает?
Так же предполагается, что статический файл (при условии что новые треки не появляются и их не более сотни) более быстрый способ для выдачи контента.
При большом размере базы треков придется переходить на SQLite. Но пока до этого надо еще дорасти.
FanatPHP
05.09.2025 08:41Не очень понятно, если честно
о каком удобстве "текстового формата" идёт речь? Удобнее в чём? Вы имеете в виду разглядывать содержимое БД или работу в коде? Первое владельцу бота вряд ли когда-либо потребуется, а второе очевидно проще в SQL, один простой запрос вместо бороды кода на 20 строчек.
в чём сложность перемещения бд sqlite между хостингами?
непонятно, при чём тут mini app, если вы всё равно получаете из файла массив, а потом пакуете его для отправки в телегу. Какая разница, откуда получать массив - из БД или файла?
статический файл, может, и быстрее на пару наносекунд, но рисковать полностью затереть базу из-за банального состояния гонки при записи количества прослушиваний?..
talik Автор
05.09.2025 08:41Если нужно делать "все по взрослому" Вы безусловно правы - надо подключать SQLite или сразу MySQL
Строить проект "на вырост" так сказать.
Но когда задача стоит в максимально простой форме хранить информацию о контенте, в формате универсальном для популярных сейчас языков разработки (я про json), то зачем самому себе усложнять жизнь?
Вот потребуется накопленные данные по трекам куда наружу импортировать для анализа или создания новых сущностей.
Надо выгружать из БД, а при работе с исходным json это будет уже забота сервиса которому эти данные будут предоставлены.
Пример текущей записи о треке:
"CQAzzgIAAxkBAAMGaI49qVFoJEGIzQ8sDySck95IwMAAAsZ4AAK37HhIrg9CqI-A_202BA": { "title": "Никогда и навсегда (drift phonk v5)", "performer": "Chuyakov Project", "genre": "drift phonk, dubstep, breaks, phonk", "music_playlist": "ЛОманые ритмы", "album": "Никогда и навсегда", "user_uploader": "1234567890", "username": "VitalyChuyakov", "first_name": "Talik", "date_uploaded": "2025-08-02 19:33:44", "file_id": "CQAzzgIAAxkBAAMGaI49qVFoJEGIzQ8sDySck95IwMAAAsZ4AAK37HhIrg9CqI-A_202BA", "file_unique_id": "AgADxngAArfseEg", "url": "https:\/\/api.telegram.org\/file\/bot1234567890:abcdefghijklmnopqrstuvwxyzABCDE12345\/music\/file_2183.mp3", "duration": 99, "file_size": 2689760, "count_play": 97, "count_downloads": 0, "tags": [], "status": "approved", "photo_file_id": "AgACAgIAAxkBAAIF32iQaOg3j_VQXplk-YbDP0irYNkuAAK8-TEbBf-JSDvqwrX6LvuTAQADAgADeAADNgQ", "photo_url": "https:\/\/api.telegram.org\/file\/bot1234567890:abcdefghijklmnopqrstuvwxyzABCDE12345\/photos\/file_2184" }
На текущий момент можете считать выбор хранения данных в Json вместо нормальной БД это дело вкуса и удобства тестирования.
FanatPHP
05.09.2025 08:41Странно, вы оправдываете выбор JSON умозрительной задачей, которую, как я понимаю, на данный момент вам решать не требуется :)
Не поймите меня неправильно, я не критикую ваш выбор, просто спросил про причины. И если бы вы сразу написали про дело вкуса, то и вопросов бы не было. Но вот ваши объяснения действительно вызывают скорее недоумение.
talik Автор
05.09.2025 08:41Вы будите смеяться, но изначально была идея иметь возможность быстро данные между любыми будущими сущностями гонять. И казалось, что json оптимален. Сегодня веб-плеер, завтра он же, но уже внутри android приложения.
Но раз этот скрипт MVP - то json самое оно. Даже без вкусовщины.
Почитал что пишут про проблемы json vs sqlite действительно надо уже сейчас учитывать потенциальные проблемы с потерей данных.
добавлю отключение записи количества скачиваний и выбор типа хранения данных.
Для того и нужны обсуждения - находить решения и смотреть под другим углом.
Спасибо.
mopsicus
05.09.2025 08:41В году наверно 2012 делали приложение для iOS которое из твоей группы в ВК делало полноценный сайт/блог. Принцип такой же был: всё что постится в группу появлялось на сайте. Но идея не прижилась в то время.
mitzury
Интересная идея но вся статья как реклама где в конце ожидаешь "купи всего за 200 рублей, первым 10 покупателем"
talik Автор
за 200 рублей купи хостинг если его еще нет. Если хостинг уже есть (с доменным именем ясное дело) то больше ничего и не надо.
вероятно не очень верная фраза вышла.
Скрипт сделан в первую очередь для себя "по фану". Скачивайте, тестируйте, используйте.