Skip to content

Библиотека ​

Prism.Library собирает фильмы с нескольких хостов в общий каталог. По адресу библиотеки можно открыть список фильмов и смотреть их в браузере. Она также координирует запуск на телевизорах: получает выбор пользователя, находит источник и отправляет команду плееру.

Запуск из исходников ​

Нужны .NET 10 SDK и хотя бы один работающий хост. Для сборки веб-интерфейса установите Node.js 22.12 или новее и npm. Отдельный MSI-установщик библиотеки в проверенной версии проекта пока отсутствует.

Подключите хосты ​

В Prism.Library.Console/appsettings.json заполните раздел Hosts. Пример с двумя источниками:

json
"Hosts": [
  { "Name": "Сервер", "BaseUrl": "http://192.168.1.10:8080" },
  { "Name": "Компьютер", "BaseUrl": "http://192.168.1.20:8080" }
]

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

Для запуска на телевизорах заполните раздел Mqtt адресом вашего брокера:

json
"Mqtt": {
  "Address": "192.168.1.10",
  "Port": 1883
}

Для каталога и просмотра в браузере настройку MQTT можно пропустить.

Установите веб-интерфейс ​

Из папки Prism.Client выполните:

sh
npm ci
npm run build

Скопируйте содержимое полученной папки Prism.Client/dist в Prism.Library.Console/wwwroot, создав её при необходимости. Файл index.html должен лежать непосредственно в wwwroot.

Запустите библиотеку ​

Из корня репозитория:

sh
dotnet run --project Prism.Library.Console

Откройте http://адрес-библиотеки:8081 в браузере. При запуске на своём компьютере можно открыть localhost:8081. Библиотека работает, пока запущен процесс.

Подключение Android-клиента ​

Установите Android-клиент библиотеки и укажите тот же адрес, по которому открываете библиотеку в браузере. Дополнительная копия каталога на телефоне или телевизоре не нужна.

Исходный код библиотеки

Формат конфигурации ​

Настройки находятся в Prism.Library.Console/appsettings.json. Формат — JSON: объекты объединяют связанные параметры, массивы задают списки. После изменения перезапустите библиотеку.

Полный пример для одного хоста, SQLite и MQTT:

json
{
  "Kestrel": {
    "Endpoints": {
      "Http": { "Url": "http://0.0.0.0:8081" }
    }
  },
  "Hosts": [
    { "Name": "Сервер", "BaseUrl": "http://192.168.1.10:8080" }
  ],
  "Database": {
    "Provider": "sqlite",
    "ConnectionString": "Data Source=data/prism.db"
  },
  "Mqtt": {
    "Address": "192.168.1.10",
    "Port": 1883,
    "User": "",
    "Password": ""
  },
  "Client": { "Path": "wwwroot" },
  "Library": { "Rules": [] },
  "Serilog": {
    "MinimumLevel": {
      "Default": "Information",
      "Override": {
        "Microsoft.AspNetCore": "Warning",
        "Microsoft.EntityFrameworkCore": "Warning"
      }
    }
  }
}

Адрес и источники ​

ПараметрФорматНазначение
Kestrel:Endpoints:Http:UrlURL; в поставляемом конфиге http://0.0.0.0:8081Где библиотека принимает подключения
HostsМассив объектов; без настройки список пустИсточники видео
Hosts[].NameСтрокаИмя хоста; используйте разные стабильные имена для разных хостов
Hosts[].BaseUrlПолный URLАдрес хоста с протоколом и портом, доступный также устройствам просмотра

При пустом имени хоста используется его URL. Записи с пустым BaseUrl пропускаются. Если один фильм есть на нескольких хостах, в общем каталоге он показывается один раз; приоритет имеет хост, указанный раньше.

Хранение каталога и веб-интерфейс ​

ПараметрПо умолчаниюНазначение
Database:Providersqlitesqlite или postgres
Database:ConnectionStringData Source=data/prism.db для SQLiteСтрока подключения к базе
Client:PathwwwrootПапка с собранным веб-интерфейсом

Относительные пути к SQLite и веб-интерфейсу считаются от корня приложения. Папка для SQLite создаётся автоматически. Если папки веб-интерфейса нет, HTTP API продолжает работать, но страницы в браузере не открываются.

Для PostgreSQL укажите Provider: "postgres" и строку подключения, например Host=localhost;Port=5432;Database=prism;Username=prism;Password=ваш_пароль. Сам сервер PostgreSQL и базу нужно подготовить отдельно; таблицы Prism создаёт при запуске.

MQTT ​

ПараметрПо умолчаниюНазначение
Mqtt:AddressПустая строкаИмя или IP брокера без протокола; пусто — работа с плеерами отключена
Mqtt:Port1883Порт брокера
Mqtt:UserПустая строкаИмя пользователя, если требуется
Mqtt:PasswordПустая строкаПароль пользователя

Адрес вида tcp://… здесь не нужен: протокол и порт не входят в поле Address. Без MQTT доступны каталог и просмотр в браузере; API плееров возвращает 503.

Правила организации коллекции ​

Library:Rules — массив правил. Они назначают группы и сведения о фильмах по относительному пути файла без расширения:

json
"Library": {
  "Rules": [
    {
      "Path": "Movies/{title}",
      "Node": "Фильмы",
      "Meta": { "title": "{title}" }
    },
    {
      "Path": "Series/{series}/s{season:#}e{episode:#}",
      "Node": "Сериалы/{series}/Сезон {season}",
      "Meta": { "season": "{season}", "episode": "{episode}" }
    }
  ]
}

Это фрагмент конфигурации: замените им секцию Library в полном файле.

ПолеНазначение
PathШаблон пути целиком; сравнение без учёта регистра
NodeПуть группы через /; недостающие группы создаются. Можно не задавать
MetaОбъект «ключ → строка-шаблон» со сведениями о файле. Можно не задавать

{title} и другие именованные подстановки захватывают непустую часть имени в пределах одного сегмента пути; {season:#} захватывает только цифры. * соответствует любому фрагменту одного сегмента, в том числе пустому. Подстановки из Path доступны в Node и Meta.

Правила применяются по порядку; один файл может соответствовать нескольким правилам. Они обрабатывают только файлы, у которых ещё нет ни групп, ни метаданных, чтобы не менять вручную оформленную коллекцию. Обслуживание запускается при старте и затем примерно раз в пять минут. Запустить его вручную можно через API библиотеки.

Журнал и переменные окружения ​

Serilog:MinimumLevel управляет подробностью журналов: Default задаёт общий уровень, Override — уровни отдельных категорий. Журналы сохраняются в папке logs и выводятся в консоль.

Переменные окружения переопределяют параметры файла. Например, Mqtt__Address=192.168.1.10 или Hosts__0__BaseUrl=http://192.168.1.10:8080. Два подчёркивания обозначают вложенность, число — индекс элемента массива.

Опубликовано под лицензией MIT