Changelog
Jellyfin Family module WHMCS
Order now | Download | Community
v3.0 (01-07-2026)
Full rewrite onto the PUQ module skeleton (shared with the other PUQ WHMCS modules).
Added
- AJAX, card-based client area with a gradient status hero, a two-column account/usage layout, usage progress bars (sessions, failed logins), library chips, an active-devices table and a media-accounts card — plus toast notifications and confirm dialogs.
-
AJAX media accounts (Family). Clients add, edit and delete media accounts in a modal, pick their libraries with checkboxes, toggle each on/off and drop its devices — all without a page reload. The old
?action_m=sub-pages are replaced. The number of media accounts is set per product (Media Accounts Configuration → Count of media accounts). - Suspend / Unsuspend / Change package / Terminate now cascade to every media account (disable, re-enable to the stored state, re-apply policy, or delete).
- Admin service tab shows a Media Accounts table (enabled state, username, enabled libraries).
- Self-service Drop all devices and Unblock actions in the client area (no page reload).
- Dynamic library picker in the product configuration form: the library list is loaded live from the assigned Jellyfin server as checkboxes, with a Select all toggle and a Reload button (with a manual text-box fallback when the server is unreachable). The separate Use all libraries switch is kept.
- Product configuration form injected on the WHMCS product page via
AdminAreaFooterOutput. - Admin homepage license alert listing products with invalid or missing licenses.
- Automatic schema setup — the module self-creates its
puq_licenseandpuqJellyfinFamily_media_accounttables on load (no SQL to run). - Diagnostic logging throughout. Every lifecycle action, hook and AJAX call records its result and any exception to the WHMCS Module Log; all Jellyfin API calls log their request/response on error (and every write call on success), with the HTTP status code and the real Jellyfin message. Passwords are redacted in the log.
Changed
-
Jellyfin 10.11.10+ compatibility. Switched to the modern
Authorization: MediaBrowserheader (withVersion) as the primary scheme and dropped the deprecatedX-Emby-Token/X-MediaBrowser-Tokenheaders that Jellyfin removes in 10.12/10.13. The password endpoint now uses the current routeUsers/Password?userId=instead of the deprecatedUsers/{id}/Password. -
CreateAccountnow reads the new user'sIddirectly from theUsers/Newresponse instead of re-listing all users and matching by name (faster and robust against special characters). - API error handling now inspects the HTTP status code and extracts the real Jellyfin error message (ProblemDetails / validation errors) instead of occasionally treating a 4xx as success.
- All product settings are now stored as a single JSON document in
configoption24. Existing v2 installs are read transparently from the legacyconfigoption2–configoption8slots (including Media Accounts Configuration inconfigoption2), so no reconfiguration is required after upgrading. - License verification moved to a block-based hash with online/offline caching.
- Jellyfin admin API token is cached per instance instead of re-authenticating on every call.
- PHP 7.4 / 8.1 / 8.2+ compatible source; hardened with null-safe reads,
try/catcharound all external calls, andhtmlspecialcharson every API-sourced string.
Fixed
- Web-interface URL no longer mishandled the plain-HTTP/port-80 case (operator-precedence bug in the default-port check).
- Empty text fields (e.g. an intentionally blank username suffix) are now preserved instead of reverting to their default on save.
Removed
- Legacy
lib/functions.php,lib/puqJellyfinFamilyLicense.php,lib/puqJellyfinFamilyPackageOption.phpand the oldtemplates/include/header.tpl(folded into the new skeleton).
v2.1
- Previous public release.