Об этом проекте

M3U Playlist Editor — это самостоятельно размещаемый менеджер плейлистов IPTV, построенный на Vue 3, Express и PostgreSQL (Node.js 22+, PostgreSQL 13+, PostgreSQL 16 в Docker и CI), выпущенный под лицензией MIT. Он импортирует, редактирует, организует, экспортирует и обменивается плейлистами M3U и Xtream через адаптивный веб-интерфейс с изоляцией пользователей и производственным стеком Docker. Основные возможности: импорт Xtream Codes для Live TV, VOD и Series; локальный или удалённый импорт M3U и экспорт с экранированием; источники гида XMLTV с сопоставлением каналов по источнику и просмотром гида с учётом часового пояса; сортировка категорий и каналов, массовые операции, загрузка логотипов, поиск и редактирование метаданных; трёхпанельный редактор каналов (боковая панель типа потока, список категорий, таблица каналов, панель редактирования канала); сетка редактора EPG на несколько дней с автоматическим сопоставлением по tvg-id; сортировка перетаскиванием, порядок которой сохраняется мгновенно; интерфейс на турецком и английском языках, темы светлая/тёмная/системная, навигация по клавиатуре и мобильные макеты. Учётные записи и безопасность: краткосрочные токены доступа с вращающимися сессиями обновления HttpOnly. Регистрация может быть отключена с помощью ALLOW_REGISTRATION=false, но первый пользователь всё равно может зарегистрироваться, пока таблица пользователей пуста, поэтому свежая установка не может заблокировать себя. Скрипты npm предоставляют или отзывают права администратора для зарегистрированного email, а также сбрасывают пароль пользователя (отзывая все активные сессии). JWT_SECRET и CREDENTIAL_ENCRYPTION_KEY должны быть двумя независимо сгенерированными значениями длиной не менее 32 символов; запуск в продакшене отклоняет заложенные по умолчанию заполнители, короткие или низкоэнтропийные значения, а также повторное использование одного значения для обоих. Развёртывание: стек Compose обслуживает только обычный HTTP — у него нет слушателя TLS, сертификата или перенаправления HTTP-to-HTTPS — поэтому TLS должен быть завершён перед ним (Caddy, Traefik, nginx или облачный балансировщик нагрузки) с сохранением опубликованного порта в приватном режиме или привязкой к loopback; куки обновления отмечены как Secure в продакшене. Контейнер API применяет ожидающие миграции перед запуском, PostgreSQL не выставляется на хост, загруженные логотипы и файлы базы данных используют именованные тома, API работает от имени не-root пользователя с read-only корневой файловой системой, а фронтенд обслуживается nginx с заголовками безопасности и кэширования. Удалённые URL-адреса частной сети заблокированы по умолчанию в качестве защиты от SSRF, с ALLOW_PRIVATE_NETWORK_URLS в качестве документированного разрешения для доверенных локальных сервисов. Настройки импорта Xtream по умолчанию (лимит байт, параллельность категорий и типов, размер кучи Node) рассчитаны на плейлисты примерно из 150 000 записей Live/VOD/Series. Вывод Xtream Codes: плейлист может быть опубликован через POST /api/playlists/:id/xtream-output, возвращая адрес сервера плюс случайное имя пользователя и пароль; пароль хранится зашифрованным AES-256-GCM, всегда показывается в открытом виде своему владельцу, может быть перегенерирован и удалён для отключения доступа плеера. Поддерживаемые корневые пути: /player_api.php, /xmltv.php, /get.php и /m3u.php. Более короткий адрес /m3u.php?id=...&secret=... несёт свою собственную пару учётных данных, поэтому его можно раздавать, не раскрывая имя пользователя и пароль Xtream, и он вращается при перегенерации вывода. Сервер никогда не является адресом потока: get.php публикует URL-адреса каналов самого провайдера, а player_api.php заполняет direct_source, поэтому воспроизведение никогда не затрагивает приложение, а предыдущий режим прокси был удалён вместе со своей колонкой. README предупреждает, что эти опубликованные URL-адреса могут содержать учётные данные провайдера, поэтому обмен учётными данными вывода фактически означает обмен учётной записью провайдера; используйте клиенты, которые учитывают direct_source. Библиотека логотипов: в панели канала есть кнопка Найти логотип, которая ищет в памяти индекс из 10 700+ логотипов из tv-logo/tv-logos по 48 странам и 16 другим группам. Индекс загружается с tree-эндпоинта GitHub раз в день и кэшируется, изображения обслуживаются jsDelivr, а сопоставление удаляет теги качества и страны и сворачивает турецкие символы (TRT 1 FHD находит trt-1-tr.png). Помощник может вызвать ту же функциональность и применить логотипы к каналам, которым их не хватает. Помощник на базе ИИ: опциональный запускатель чата на каждой аутентифицированной странице управляет приложением через 175 серверных инструментов, охватывающих плейлисты, категории, каналы, EPG, импорт и синхронизацию, экспорт и обмен, вложения и выходные файлы, запланированные задачи, а также информацию об учётной записи и системе. Он работает с любым провайдером, совместимым с OpenAI (базовый URL, зашифрованный API-ключ, получение списка моделей), транслирует ответы через Server-Sent Events с откатом на обычный эндпоинт, поддерживает ворота одобрения перед деструктивными действиями, принимает вложения файлов и может преобразовать голосовую инструкцию в повторяющуюся серверную задачу (минимальный интервал 15 минут), чьи запуски регистрируются, резервируются перед выполнением и могут быть отменены одним кликом. Веб-поиск поставляется без пользовательской конфигурации: внутренний экземпляр SearXNG (доступный только как searxng:8080, не выставляемый публично) поддерживает web_search и open_web_page, с включённым JSON-выводом в прилагаемых настройках; оба инструмента не регистрируются вообще, если SEARXNG_URL пуст. Вложения: .m3u, .m3u8, .txt, .xml, .xmltv, .json и .csv до 20 МБ каждый и 200 МБ на учётную запись обнаруживаются по содержанию, а не по расширению, хранятся на диске и просматриваются или ищутся помощником вместо того, чтобы передаваться целиком модели. Сообщения, превышающие 12 000 символов, автоматически преобразуются во вложения. Ремонт мёртвых каналов: repair_dead_channels сопоставляет сломанные каналы по терпимому сокращению имени с каталогом Xtream и перезаписывает только URL потока, тестируя каждого кандидата перед записью, исключая каналы, которые никогда не проверялись, и поддерживая сухой прогон; в паре с запланированной задачей он может работать без присмотра. Репозиторий: https://github.com/fyildirim-debug/M3uEditor