Development
Prerequisites
- .NET 8 SDK for the plugin and core tests.
- Node.js 18 or newer for the settings-controller tests.
- Python 3 for packaging; Python 3.12 is used for documentation builds.
./tools/check
./tools/package
The plugin and core library target .NET Standard 2.0. Tests and documentation tools run on .NET 8.
NuGet dependencies are locked in packages.lock.json. Restore uses locked mode.
tools/check runs compilation, core tests, UI controller tests, and an isolated plugin-loading smoke test.
SMTP tests use local test servers. They do not contact a production SMTP provider or send real user emails.
Structure
| Directory | Responsibility |
|---|---|
src/Emby.LibraryHub.Core/ |
Tracking, formatting, storage, subscriptions, SMTP, HTML |
src/Emby.LibraryHub/ |
Emby adapters, routes, scheduled task, settings UI |
tests/Emby.LibraryHub.Tests/ |
Calendar, persistence, delivery, HTML, and SMTP behavior |
tests/ui/ |
Browser-controller behavior with a mocked Emby API |
tests/PluginLoadSmoke/ |
Isolated dependency loading and Emby HTTP contracts |
docs/ |
Website content and installation guide |
.github/workflows/ |
Prepared CI, Pages, and release workflows |
Core source files are linked into the plugin assembly. Only one DLL needs to be installed.
Use server-matched references
The default SDK package matches the target Emby version.
For additional compatibility checks, provide a directory containing the target server's API assemblies:
dotnet build src/Emby.LibraryHub -c Release -p:EmbyReferencePath=/path/to/server-api
dotnet run --project tests/PluginLoadSmoke -c Release -- \
src/Emby.LibraryHub/bin/Release/netstandard2.0/Emby.LibraryHub.dll /path/to/server-api
Do not commit or redistribute copied server assemblies. They are verification inputs, not plugin dependencies to deploy.
Documentation
python3 -m venv .venv-docs
.venv-docs/bin/pip install -r docs/requirements.txt
.venv-docs/bin/mkdocs build --strict
python3 tools/check-docs.py
.venv-docs/bin/mkdocs serve
English pages use .md; French pages use .fr.md, with matching paths and internal links.
English is served at the root and French under /fr/. The language switch keeps the current page.
Navigation and search are localized. The theme uses system fonts, local assets, and no analytics.
See the official i18n documentation for configuration details.
Settings translations
Configuration/locale.js contains English and French messages. Pages mark translatable text with data-digest-*.
Controllers use Emby's active globalize locale and assign plain text, never translated HTML.
Tests cover user preferences, regional variants, fallback, and independence from report language.
Make a change
- Reproduce the behavior with focused tests or a documented runtime case.
- Keep private member views, subscriber delivery, and administrative controls separate.
- Run
tools/check, the strict documentation build, andtools/check-docs.py. - Package the DLL and verify it on a test server before a public release.
Use synthetic addresses and media in fixtures. Never commit a live server configuration or subscriber store.
Architecture · Release process · Security
Documentation visuals
The guides use committed bilingual diagrams and screenshots generated from fictional data.
The release version in Directory.Build.props also supplies plugin and documentation footers.
Emby HTTP handlers return Task<object> so delayed results remain available to its response decoder.