Библиотека
Prism.Library собирает фильмы с нескольких хостов в общий каталог. По адресу библиотеки можно открыть список фильмов и смотреть их в браузере. Она также координирует запуск на телевизорах: получает выбор пользователя, находит источник и отправляет команду плееру.
Запуск из исходников
Нужны .NET 10 SDK и хотя бы один работающий хост. Для сборки веб-интерфейса установите Node.js 22.12 или новее и npm. Отдельный MSI-установщик библиотеки в проверенной версии проекта пока отсутствует.
Подключите хосты
В Prism.Library.Console/appsettings.json заполните раздел Hosts. Пример с двумя источниками:
"Hosts": [
{ "Name": "Сервер", "BaseUrl": "http://192.168.1.10:8080" },
{ "Name": "Компьютер", "BaseUrl": "http://192.168.1.20:8080" }
]Используйте адреса, доступные и библиотеке, и устройствам просмотра: видео поступает с хостов напрямую.
Для запуска на телевизорах заполните раздел Mqtt адресом вашего брокера:
"Mqtt": {
"Address": "192.168.1.10",
"Port": 1883
}Для каталога и просмотра в браузере настройку MQTT можно пропустить.
Установите веб-интерфейс
Из папки Prism.Client выполните:
npm ci
npm run buildСкопируйте содержимое полученной папки Prism.Client/dist в Prism.Library.Console/wwwroot, создав её при необходимости. Файл index.html должен лежать непосредственно в wwwroot.
Запустите библиотеку
Из корня репозитория:
dotnet run --project Prism.Library.ConsoleОткройте http://адрес-библиотеки:8081 в браузере. При запуске на своём компьютере можно открыть localhost:8081. Библиотека работает, пока запущен процесс.
Подключение Android-клиента
Установите Android-клиент библиотеки и укажите тот же адрес, по которому открываете библиотеку в браузере. Дополнительная копия каталога на телефоне или телевизоре не нужна.
Формат конфигурации
Настройки находятся в Prism.Library.Console/appsettings.json. Формат — JSON: объекты объединяют связанные параметры, массивы задают списки. После изменения перезапустите библиотеку.
Полный пример для одного хоста, SQLite и MQTT:
{
"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:Url | URL; в поставляемом конфиге http://0.0.0.0:8081 | Где библиотека принимает подключения |
Hosts | Массив объектов; без настройки список пуст | Источники видео |
Hosts[].Name | Строка | Имя хоста; используйте разные стабильные имена для разных хостов |
Hosts[].BaseUrl | Полный URL | Адрес хоста с протоколом и портом, доступный также устройствам просмотра |
При пустом имени хоста используется его URL. Записи с пустым BaseUrl пропускаются. Если один фильм есть на нескольких хостах, в общем каталоге он показывается один раз; приоритет имеет хост, указанный раньше.
Хранение каталога и веб-интерфейс
| Параметр | По умолчанию | Назначение |
|---|---|---|
Database:Provider | sqlite | sqlite или postgres |
Database:ConnectionString | Data Source=data/prism.db для SQLite | Строка подключения к базе |
Client:Path | wwwroot | Папка с собранным веб-интерфейсом |
Относительные пути к SQLite и веб-интерфейсу считаются от корня приложения. Папка для SQLite создаётся автоматически. Если папки веб-интерфейса нет, HTTP API продолжает работать, но страницы в браузере не открываются.
Для PostgreSQL укажите Provider: "postgres" и строку подключения, например Host=localhost;Port=5432;Database=prism;Username=prism;Password=ваш_пароль. Сам сервер PostgreSQL и базу нужно подготовить отдельно; таблицы Prism создаёт при запуске.
MQTT
| Параметр | По умолчанию | Назначение |
|---|---|---|
Mqtt:Address | Пустая строка | Имя или IP брокера без протокола; пусто — работа с плеерами отключена |
Mqtt:Port | 1883 | Порт брокера |
Mqtt:User | Пустая строка | Имя пользователя, если требуется |
Mqtt:Password | Пустая строка | Пароль пользователя |
Адрес вида tcp://… здесь не нужен: протокол и порт не входят в поле Address. Без MQTT доступны каталог и просмотр в браузере; API плееров возвращает 503.
Правила организации коллекции
Library:Rules — массив правил. Они назначают группы и сведения о фильмах по относительному пути файла без расширения:
"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. Два подчёркивания обозначают вложенность, число — индекс элемента массива.