основные возможности скрипта TMH by TCSE
основные возможности скрипта TMH by TCSE

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

? github.com/tcse/php-TMH

Что такое TMH?

TMH by TCSE — это не просто плеер. Это система управления контентом, где:

  • Telegram — источник контента (канал + бот)

  • PHP — движок

  • Веб-сайт — финальная точка потребления

Вы публикуете трек или пост в Telegram — и он автоматически появляется на вашем сайте, как в стриминге.

Возможности

веб-плеер TMH проигрывающий треки напрямую из Telegram
веб-плеер TMH проигрывающий треки напрямую из Telegram

Функция

Описание

? Потоковое прослушивание

Веб-плеер с поддержкой PWA (можно установить как приложение)

? Автоматический блог

Посты из Telegram-канала отображаются как красивый мобильный сайт

? Плейлисты

M3U, PLS, XSPF — для VLC, Winamp, Foobar и других плееров

?️ Галерея фото

Альбомы из Telegram — как слайдер в блоге

? Безопасность

Никаких прямых ссылок с токенами бота — только через прокси

? PWA

Работает как нативное приложение, в том числе на iPhone с выключенным экраном

Автоматический блог из сообщений telegram канала на вашем сайте
Автоматический блог из сообщений telegram канала на вашем сайте

Почему 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)
  1. Вы отправляете аудио боту → он сохраняет file_id в music_db.json

  2. Вы публикуете пост в канале → он сохраняется в posts.json

  3. stream.php и blog_cover.php возвращают медиа по file_id (без токена!)

  4. 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 минут)

  1. Скачайте релиз с GitHub

  2. Загрузите папку /tmh/ на хостинг через FTP

  3. Откройте /tmh/data/config.php и укажите:

    • bot_token

    • base_url

    • channel_username

  4. Запустите /tmh/core/set_webhook.php

  5. Добавьте бота администратором в канал

Готово! Бот начинает слушать.

Итог

TMH by TCSE — это не просто скрипт.
Это демонстрация силы простоты.

Вы не нуждаетесь в дорогом сервере, базе данных или команде разработчиков.
Вам нужно:

  • PHP 7.4+

  • SSL

  • Telegram

И вы получаете полноценное цифровое пространство.

Попробуйте: github.com/tcse/php-TMH
Star, Fork, PR — приветствуются.

Ваша музыка заслуживает лучшего способа быть услышанной.

? Хотите посмотреть, как это работает в реальных проектах?

Вот несколько примеров, где php-TMH уже используется:

? Демо-сайт разработчика
Полный функционал: блог с фотоальбомами, веб-плеер с поддержкой PWA, потоковое воспроизведение.

диалог с ботом для гостей, без возможности добавлять свои треки
диалог с ботом для гостей, без возможности добавлять свои треки


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

отображение telegram mini app из блога (который на самом деле лента записей в канале)
отображение telegram mini app из блога (который на самом деле лента записей в канале)

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

интерфейс диалога с ботом для добавления своих треков
интерфейс диалога с ботом для добавления своих треков

Эти проекты показывают, как один и тот же скрипт может работать и как персональный хаб, и как платформа для сообщества.

? Исходный код: github.com/tcse/php-TMH

Комментарии (18)


  1. mitzury
    05.09.2025 08:41

    Интересная идея но вся статья как реклама где в конце ожидаешь "купи всего за 200 рублей, первым 10 покупателем"


    1. talik Автор
      05.09.2025 08:41

      за 200 рублей купи хостинг если его еще нет. Если хостинг уже есть (с доменным именем ясное дело) то больше ничего и не надо.

      вероятно не очень верная фраза вышла.

      Скрипт сделан в первую очередь для себя "по фану". Скачивайте, тестируйте, используйте.


  1. koreychenko
    05.09.2025 08:41

    Идея интересная, но держать базу данных в json и постоянно её туда-сюда перекодировать и сохранять целиком - такое себе решение. В случае нескольких одновременных запросов вы потеряете часть данных. Ну и это сильно медленнее и менее удобно, чем какой-нибудь sqllite. Представьте у вас загружено 1000 треков и вы постоянно все их грузите и декодируете, вместо того, чтобы сделать: SELECT * FROM tracks WHERE file_id = :fileId.


    1. talik Автор
      05.09.2025 08:41

      Это все верно, но до размера в 1000 треков надо дожить.

      С SQLite тестировал - мне не понравилась сама идея того, что оперативно такую базу не открыть не поправить (без специального софта).

      А задача была - сделать максимально просто, что бы при желании открыл исходный json и руками поправил все тексты, названия и прочие данные.

      Да и где вы видел инди-музыканта с 1000 треков?

      Сделайте форк, прикрутите SQLite - вместе погоняем на тысячах треков.


      1. trawl
        05.09.2025 08:41

        Можно где-то рядом adminer положить, если очень уж нужно оперативно открыть.


    1. IgnatF
      05.09.2025 08:41

      Треки вводит тут наверное только один человек. Так что одновременной записи данных в теории нет. Насчет поиска кто то может удивлен будет, но быстрей найти информацию в текстовом файле, чем в базе данных. Ибо большое время уходит на само подключение к ней. До какого то количества конечно. Искать в текстовом файле примерно до 300 строк выгодней по времени.


      1. koreychenko
        05.09.2025 08:41

        Скорость поиска информации в текстовом файле зависит, сюрприз, от структуры текстового файла.
        Если вы посмотрите реализацию автора статьи, то увидите, что такой поиск сильно дольше, чем грепнуть файлик. Сначала весь файл загружается в память, потом он декодируется с помощью json_decode. Это все не бесплатные операции.
        Если совсем придираться, то sqllite это такой же файлик, только определенной структуры. И сделан он исключительно для того, чтобы по нему было быстрее искать, чем просто по текстовому файлу.


        1. IgnatF
          05.09.2025 08:41

          Честно не смотрел, как там автор сделал. В любом случае, если кому будет интересно проект в открытом доступе Любой может все по своему сделать.


      1. FanatPHP
        05.09.2025 08:41

        Вводит один, а слушают многие. И при каждом прослушивании перезаписывается весь файл.


  1. talik Автор
    05.09.2025 08:41

    Собственно мне очень долгое время была не понятна идея мини-апп внутри Телеги. Пытался по разному придумать для чего оно нужно обычному пользователю у которого уже есть сайт.

    Идея с плеером и блогом (просто переделанной под себя лентой из канала) показалась более понятной, чем любые демо которые есть в анонсах телеграм про сам формат mini app


  1. FanatPHP
    05.09.2025 08:41

    А чем продиктован выбор JSON файлов, а не SQLite?


    1. talik Автор
      05.09.2025 08:41

      Удобством работы как с текстовым форматом.

      Легко перемещать между хостингами.

      Кроме этого, изначально планировалась разработка telegram mini app, а в телеге все через json происходит. Так зачем изобретать что-то новое, если это формат донора на основе которого все и работает?

      Так же предполагается, что статический файл (при условии что новые треки не появляются и их не более сотни) более быстрый способ для выдачи контента.

      При большом размере базы треков придется переходить на SQLite. Но пока до этого надо еще дорасти.


      1. FanatPHP
        05.09.2025 08:41

        Не очень понятно, если честно

        • о каком удобстве "текстового формата" идёт речь? Удобнее в чём? Вы имеете в виду разглядывать содержимое БД или работу в коде? Первое владельцу бота вряд ли когда-либо потребуется, а второе очевидно проще в SQL, один простой запрос вместо бороды кода на 20 строчек.

        • в чём сложность перемещения бд sqlite между хостингами?

        • непонятно, при чём тут mini app, если вы всё равно получаете из файла массив, а потом пакуете его для отправки в телегу. Какая разница, откуда получать массив - из БД или файла?

        • статический файл, может, и быстрее на пару наносекунд, но рисковать полностью затереть базу из-за банального состояния гонки при записи количества прослушиваний?..


        1. koreychenko
          05.09.2025 08:41

          Коллега, там в репе целый велосипедный завод :-)


        1. 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 вместо нормальной БД это дело вкуса и удобства тестирования.


          1. FanatPHP
            05.09.2025 08:41

            Странно, вы оправдываете выбор JSON умозрительной задачей, которую, как я понимаю, на данный момент вам решать не требуется :)

            Не поймите меня неправильно, я не критикую ваш выбор, просто спросил про причины. И если бы вы сразу написали про дело вкуса, то и вопросов бы не было. Но вот ваши объяснения действительно вызывают скорее недоумение.


            1. talik Автор
              05.09.2025 08:41

              Вы будите смеяться, но изначально была идея иметь возможность быстро данные между любыми будущими сущностями гонять. И казалось, что json оптимален. Сегодня веб-плеер, завтра он же, но уже внутри android приложения.

              Но раз этот скрипт MVP - то json самое оно. Даже без вкусовщины.

              Почитал что пишут про проблемы json vs sqlite действительно надо уже сейчас учитывать потенциальные проблемы с потерей данных.

              добавлю отключение записи количества скачиваний и выбор типа хранения данных.

              Для того и нужны обсуждения - находить решения и смотреть под другим углом.

              Спасибо.


  1. mopsicus
    05.09.2025 08:41

    В году наверно 2012 делали приложение для iOS которое из твоей группы в ВК делало полноценный сайт/блог. Принцип такой же был: всё что постится в группу появлялось на сайте. Но идея не прижилась в то время.