Skip to main content
Lampac NextGen использует динамическую систему модулей на базе Roslyn. Вместо статической сборки всех компонентов в один бинарник сервер компилирует исходный код модулей прямо при запуске, а для отмеченных модулей поддерживает горячую пересборку при изменении .cs-файлов без перезапуска. Это позволяет добавлять собственные модули в папку mods/ и переопределять поведение без пересборки всего решения. На этой странице описан полный порядок загрузки, формат manifest.json, фильтры SkipModules/LoadModules и таблица всех встроенных модулей.

Динамическая загрузка через Roslyn

Lampac использует Roslyn (CSharpEval) для компиляции модулей при запуске. Все .cs-файлы из module/ и mods/ компилируются динамически. Папки с manifest.json собираются в отдельные сборки, а готовые .dll из references/ подгружаются как части приложения MVC. Эта архитектура позволяет распространять модули в виде исходного кода и пересобирать их на лету.

Порядок загрузки модулей

1

Каталоги mods/ и module/

Сначала обрабатывается каталог mods/ (пользовательские модули), затем module/ (встроенные модули, включая Online, SISI и Modules).
2

Загрузка DLL из references/

Из подкаталога references/ подгружаются готовые .dll как части приложения MVC. Собственные .dll в корне mods/ / module/ подключаются как сборки модулей.
3

Фильтрация по SkipModules и LoadModules

Перед компиляцией применяются фильтры из init.conf:
  • BaseModule.SkipModules — имена модулей, которые игнорируются полностью
  • BaseModule.LoadModules — белый список: точное имя, имя группы (OnlineUKR), регулярное выражение ("LME.*") или ".*" для загрузки всего
  • enable в manifest.json — если false, модуль пропускается
4

Roslyn-компиляция

Папки с manifest.json компилируются через Roslyn (CSharpEval.Compilation). В компиляцию включаются ссылки из TPAs и дополнительные DLL.
5

Регистрация в DI (IModuleConfigure)

Для каждого скомпилированного модуля вызывается IModuleConfigure.Configure — модуль регистрирует свои сервисы в контейнере зависимостей.
6

Инициализация после старта (IModuleLoaded)

После запуска приложения вызывается IModuleLoaded.Loaded — модуль может выполнить пост-инициализацию, подписаться на события или запустить фоновые задачи.
7

Горячая пересборка (dynamic: true)

Если в manifest.json указан флаг "dynamic": true, включается watcher. При изменении .cs-файлов модуль пересобирается на лету без перезапуска сервера.

Таблица всех модулей

Модули DLNA, Tracks, Transcoding, GStreamer и Catalog не выполняют экранирование входящих запросов. Не включайте их на публично доступном VPS без ограничения доступа через firewall или reverse proxy.
В example.init.conf (шаблон из репозитория) в SkipModules по умолчанию также указаны: JacRed, Sync, TimeCode, TorrServer. Это означает, что для этих модулей пользователь должен явно убрать их из SkipModules, чтобы они загрузились.

Формат manifest.json

Каждый модуль обязан содержать manifest.json в корне своего каталога. Минимальный пример для пользовательского модуля:

LoadModules и SkipModules паттерны

Параметр BaseModule.LoadModules в init.conf задает белый список загружаемых модулей. Поддерживаются несколько форматов записи: Пример конфигурации в init.conf:
Часть модулей поставляется с "enable": false в manifest.json (например, AdminPanel и ExternalBind). Даже если имя модуля присутствует в LoadModules, он не загрузится, пока вы не измените manifest.json или не скопируете модуль в mods/ с исправленным манифестом.

Пользовательские модули

Чтобы создать собственный модуль, добавьте каталог в mods/ с manifest.json и .cs-файлами. Roslyn скомпилирует их при запуске. Для включения горячей пересборки установите "dynamic": true.
Ориентируйтесь на примеры в Modules/*/manifest.json и TestModules/ (последние копируются в mods/ при публикации).