Модули

Вкладка 🧪 Модули — marketplace-интерфейс для JS-модулей источников. Ставим, включаем/выключаем, редактируем код прямо в браузере, смотрим live-логи.

JS-модули — новая, рекомендованная альтернатива Go-балансерам для большинства источников. Подробнее о том, как они устроены и как писать свои — в разделе «JS-модули источников».

Интерфейс

Вкладка состоит из трёх блоков:

  1. Верхняя панель — кнопки ↻ Обновить и ➕ Установить
  2. Поиск + фильтр — быстрая фильтрация по названию/тегу и по состоянию (Включённые / Выключенные / С ошибкой / Украинские / Аниме)
  3. Сетка карточек — все установленные модули

Карточка модуля

Каждая карточка показывает:

  • Название + бейдж качества (FHD, 4K и т.п.)
  • Автор / версия
  • Route/lite/<id> — это адрес по которому Lampa будет дёргать модуль
  • Описание
  • Теги (ukrainian, anime, custom…)
  • Статистика (после первых запросов): ✓ 142 (успешных), ✗ 3 (ошибок), среднее время ответа
  • Кнопки: [toggle] · ✎ Редактировать · (перезагрузить) · 🗑 (удалить)

Если модуль выключен — карточка полупрозрачная.

Если у модуля ошибка парсинга — рамка красная, внутри — текст ошибки с номером строки.

Установка модуля

Нажмите ➕ Установить в верхней панели — откроется drawer с двумя вариантами.

Из URL (zip-архив)

Введите URL https://...zip в поле, нажмите Установить с URL. Сервер скачает архив, распакует, валидирует манифест и загрузит модуль. Имя модуля берётся из manifest.jsonid.

URL должен отдавать .zip с папкой модуля внутри (содержащей manifest.json и index.js). Архив читается прямо в память — ограничение 32 МБ.

Пример с GitHub-репозиторием:

https://github.com/user/my-lampac-modules/archive/refs/heads/main.zip

Если в корне архива несколько папок — возьмётся первая с manifest.json.

Загрузить файл

Нажмите Выбрать файл → выберите локальный .zip. Работает так же, но без сети.

Откат

Если модуль с таким id уже установлен, он архивируется как modules/<id>.backup-<timestamp> перед перезаписью. Вручную откатить — удалить новый и переименовать бекап.

Drawer редактирования

Нажмите ✎ Редактировать на карточке — откроется боковая панель с четырьмя табами:

Обзор

Читабельная сводка: ID, версия, автор, типы контента, ссылка на репозиторий, описание, статистика. Ошибка парсинга (если есть) — здесь же.

Настройки

Поля из manifest.jsonconfig_schema. Каждое поле — с названием, описанием, типом:

  • string / textarea — обычное текстовое поле
  • int / number — числовое (валидируется клиентом)
  • bool — toggle-свитч
  • secret — пароль, маскируется, не показывается в общем списке

Кнопка Сохранить пишет modules/<id>/config.json и тут же подхватывается модулем при следующем запросе (кэш Goja не сохраняет значения между invoke).

Код

Textarea с подсветкой на моноширинном шрифте — ваш index.js. При нажатии Сохранить и перезагрузить файл перезаписывается на диске, Goja пересобирает программу. Если синтаксис битый — карточка пометится как «С ошибкой», а модуль выключится до исправления.

Для серьёзной работы редактируйте в своей IDE, а вкладка в админке — для быстрых хотфиксов прямо на проде.

Логи

Live-консоль Server-Sent Events. Показывает все console.log/warn/error/info из вашего JS-кода плюс ошибки runtime (timeout, panic из Go).

Формат строки:

HH:MM:SS [info] module_id: your log message here

Цвета:

  • info — синий
  • warn — жёлтый
  • error — красный

Буфер — 500 строк на модуль. Кнопка Очистить сбрасывает отображение (не трогает ring-buffer на сервере).

API admin-endpoints

Всё, что делает вкладка, доступно и через HTTP — можно автоматизировать.

Базовый путь: /{admin_path}/api/modules (авторизация как в остальной админке).

Метод Путь Что делает
GET /api/modules Список всех модулей
GET /api/modules/{id} Детали одного
POST /api/modules/install {"url":"..."} или raw application/zip body
DELETE /api/modules/{id} Удалить
POST /api/modules/{id}/toggle {"enabled":true/false}
POST /api/modules/{id}/reload Перечитать с диска
GET /api/modules/{id}/source Исходный код
PUT /api/modules/{id}/source {"source":"..."} — обновить и перекомпилировать
PUT /api/modules/{id}/config Любой JSON — сохранить как config.json
GET /api/modules/logs?module={id}&n=200 Прочитать последние N строк
GET /api/modules/logs/stream?module={id} SSE-поток логов

Пример: установить пачку модулей скриптом

ADMIN=http://lampac:888/cp_XXXXX
TOKEN=...  # lampac_token cookie

for mod in starlight bamboo unimay mikai; do
  curl -s -X POST \
    -H "Cookie: lampac_token=$TOKEN" \
    -H "Content-Type: application/json" \
    -d "{\"url\":\"https://github.com/user/lampac-modules/raw/main/$mod.zip\"}" \
    "$ADMIN/api/modules/install"
done

Типичные сценарии

Ставлю плагин с GitHub

  1. Найдите URL .zip-архива модуля (релиз или просто archive/main.zip)
  2. Админка → Модули → Установить → вставить URL → готово
  3. Убедитесь что карточка появилась и включена
  4. Откройте какой-нибудь фильм/сериал — модуль появится в выдаче Lampa

Отлаживаю свой модуль

  1. Положите папку modules/mymodule/ на сервере (через git, scp или админку)
  2. Админка → Модули → Обновить список
  3. Откройте карточку → Логи — оставьте во вкладке
  4. Параллельно делайте запросы через curl или прямо через Lampa
  5. Правьте код в «Код» → Сохранить и перезагрузить
  6. Повторяйте

Отключаю модуль — хочу использовать Go-балансер

Просто выключите toggle на карточке. Go-балансер с тем же именем (starlight, bamboo…) автоматически перехватит маршрут. Включите обратно — JS снова активен.

Переношу модуль на другой сервер

Скопируйте папку modules/<id>/ целиком (с config.json если есть) на другой сервер в modules/. Перезапустите lampac-go или нажмите Обновить в админке.

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

  • Модули исполняются в Goja-песочнице — нет доступа к файловой системе, процессам, другим модулям
  • Сетевые запросы идут через http.DefaultClient — лимит 30 сек / 8 МБ на запрос
  • Таймаут модуля — 30 сек на один invoke, после чего runtime прерывает выполнение (Interrupt: timeout)
  • Секретные поля (secret:true) маскируются в списке, но доступны модулю в inv.config

Устанавливайте модули только из источников, которым доверяете. Несмотря на песочницу, модуль может:

  • делать произвольные HTTP-запросы наружу (утечка данных, DoS внешних сервисов)
  • перенаправлять пользователя на фишинг через method: 'link'
  • возвращать вредоносные стримы (подмена CDN)

Сравнение с другими вкладками

Вкладка Назначение
Балансеры Встроенные Go-источники — включить, задать хост, токен
Модули (эта) JS-модули: ставить, редактировать, удалять
Плагины Серверные фичи: DLNA, tmdb-proxy, transcoding…

Разница коротко: Балансеры — хардкод, только настройки. Модули — код + настройки, динамически. Плагины — не про источники вообще.