Repository navigation
Releases: ReelVault/sdk
Releases · ReelVault/sdk
Release list
v1.3.0
Full Changelog: v1.2.2...v1.3.0
Features
- Completed plays in admin analytics —
AdminAnalyticsSchema(GET /admin/analytics) carriescompletedPlaysCount, the plays intotalPlaysCountthat finished their title.totalPlaysCountnow also counts interrupted playback sessions that reached the minimum play time (server settingsystem.analytics.minPlaySeconds). - Trickplay regeneration for several titles —
admin.regenerateTrickplay({ scope: "titles", ids, force })queues the previews of up to 50 titles as one operation.TrickplayRegenerateRequestSchemaaccepts that shape next to the single library, title and season scopes. - Live session log link —
admin.getLiveSessionLogUrl(sessionId)returns the URL of a playback session's log archive (ZIP), served byGET /admin/live-activity/:sessionId/log. - Library scan progress —
libraries.getScanProgress()forGET /libraries/scan-progresslists the queued and running library scans withprogressPercent, which is null while a scan discovers files.LibraryScanProgressResponseSchema/LibraryScanProgressResponsedescribe the reply. - Scan findings can be ignored —
libraries.getScanFindings(libraryId, status)lists theactiveorignoredfindings and returnscountsfor both.libraries.setScanFindingIgnored(libraryId, { filePath, ignored })ignores a finding until it is restored, and a rescan keeps it ignored.libraries.getScanFindingCandidates(libraryId, filePath)searches the providers for the title parsed from the file name; a scan never runs that search. TheScanFinding*schemas and types describe the replies. - Playback view limits —
PlaybackViewResponse.effectivePreferencesreports the bitrate cap that applies to the profile's streams (the lower of the profile and server caps,nullwhen neither is set) and the HDR mode. - Overwrite locked fields on rematch — the rematch body accepts
overwriteLocked(defaultfalse). Locked fields keep their values unless it istrue. - Notify every administrator —
host.notifications.createForAdmins({ type, title, message?, data?, link? })sends one notification to each administrator. Each recipient counts against the plugin's daily notification limit. - Code block for plugin UI — a
codeschema node shows read-only, preformatted text that keeps its line breaks and scrolls. Plugin authors get thecode()helper from@reelvault/sdk/ui/schema. - Profile bitrate cap —
ProfilePreferences,UpdateProfilePreferencesandProfilePreferenceDefaultscarrymaxStreamingBitrateKbps(0 = no limit, up to 50 000 kbps). - Profile HDR mode —
ProfilePreferences,UpdateProfilePreferencesandProfilePreferenceDefaultscarryhdrMode(autoortoneMapToSdr).autokeeps passing HDR through where the device supports it;toneMapToSdralways converts HDR sources to SDR. - Backup code count —
auth.getBackupCodesStatus()forGET /auth/two-factor/backup-codes, typed byTwoFactorBackupCodesStatusSchema/TwoFactorBackupCodesStatus({ remaining: number | null }). - Rating badge preference —
hideRatingOverlayinProfilePreferencesSchema,UpdateProfilePreferencesSchemaandProfilePreferenceDefaultsSchema. It hides the rating badge on poster cards and defaults to off. - Catalog statuses —
metadata.getStatuses()forGET /metadata/statuses, withMetadataStatusesResponseSchema/MetadataStatusesResponse({ statuses: string[] }). - Dry runs for log cleanup and trickplay deletes —
admin.cleanupLogs(retentionDays, { dryRun })andadmin.deleteTrickplayMany(ids, { dryRun }).TrickplayDeleteResultand the log cleanup result carrydryRun; a dry run reports what would be removed and removes nothing. - Worker history purge dry run —
PurgeWorkerHistoryOptions.dryRunandPurgeWorkerHistoryResponse.dryRun; a dry run reports the counts a purge would delete and removes nothing. - Cancel an update —
admin.cancelUpdate(target)forPOST /admin/update/cancel.AdminUpdateCancelResponseSchema/AdminUpdateCancelResponsedescribe the reply, and an update history entry may now have statuscancelled. - Forced server updates —
admin.installUpdate(target, { force })andadmin.rollbackUpdate(target, { force }). A server install or rollback is refused withupdate.blocked_active_streamswhile streams play, unlessforceis set. - Plugin configuration reset, export and import —
admin.resetPluginConfig(id, { keys? }),admin.exportPluginConfig(id)andadmin.importPluginConfig(id, file)withResetPluginConfigBodySchemaandPluginConfigExportSchema. Exports never contain secret fields. - Catalog reports unavailable repositories —
admin.getPluginCatalog()returns{ plugins, unavailableRepositories }; each unavailable repository has itsrepositoryId,repositoryNameand anerrorCode.PluginCatalogResultSchema/PluginCatalogResultdescribe it. - Bulk plugin state and version pinning —
admin.setPluginsEnabled({ enabled, pluginIds })returns an outcome per plugin;admin.setPluginPinned(id, pinned);PluginAdminStatus.pinned. - Refuse a plugin's CSP sources —
PluginAdminStatus.cspDisabledandadmin.setPluginCsp(id, enabled)forPUT /admin/plugins/:id/csp. - Setting metadata —
SystemSettingItemViewreports theunitof a number setting andrestartRequiredfor settings that take effect only after a restart. - Server capabilities —
ServerCapabilitiesSchema/ServerCapabilitiesandreelvault.capabilities.get()for the publicGET /capabilitiesendpoint (trickplay, downloads). - Profile PIN status —
profiles.getPinStatus(id)returns{ hasPin }for the owner's profile (ProfilePinStatusSchema/ProfilePinStatus), so settings can offer removing the PIN without ever receiving it. - Filtered marker list —
media.getAllMarkers({ type, source, q, limit })narrows the admin marker list on the server;MediaMarkerFiltersSchema/MediaMarkerFiltersdescribe the filters. Calls without arguments behave as before. - Subtitle text search —
SubtitleFiltersSchematakesq(up to 200 characters);subtitles.getAll({ q })matches it against the label, the language and the media file id. - Safer database restore —
admin.restoreDatabase(fileName, { force? })sends the optionalforce, andAdminDatabaseRestoreResponsecarriespreRestoreBackup, the copy taken just before the swap. - Audit filter options —
admin.getAuditOptions()returns the resource types in the audit log and the administrators who wrote entries (AdminAuditOptionsSchema/AdminAuditOptions), for the filter dropdowns.nameis null when the account no longer exists. - User list filters —
admin.getUsers({ role, status })narrows the account list by role (adminoruser) and by status (activeorblocked), next to the search. - Download title link —
DownloadJob.metadataId(nullable, also onAdminDownloadJobSchema) names the title the download's media file belongs to, so a download can link to its title. - Watchlist auto-removal preference — profile preferences gain
watchlistAutoRemoveWatched(boolean, off by default). When it is on, a title leaves the watchlist once the profile has watched it. The field is part ofProfilePreferencesSchema,UpdateProfilePreferencesSchemaandProfilePreferenceDefaultsSchema. - Watch state controls —
me.resetPlaybackProgress(mediaFileId, { scope })takesscope:fileresets only that file,title(the default) resets every file of its title.me.setWatchStateBulk({ mediaFileIds, watched })marks up to 500 files watched or unwatched in one call (WatchStateBulkSchema/WatchStateBulk,WatchStateScopeSchema/WatchStateScope). - Update history and environment —
admin.getUpdateHistory({ page, limit })pages through the installs and rollbacks (AdminUpdateHistoryPageSchema/AdminUpdateHistoryPage).AdminUpdateStatus.environmentreports the container engine (docker,podmanor none), whether the server runs without root and whether systemd manages it as auserorsystemunit (AdminUpdateEnvironmentSchema). - Subtitle extractability —
Subtitle.extractableisfalsefor image-based embedded tracks (PGS, VobSub), which cannot be served as text. - Migration status —
admin.getDatabaseMigrations()returnsDatabaseMigrationStatus(total,applied,pending,latest,migrations). - Paginated marker list —
media.getAllMarkers(query)takespagenext tolimitand returnsPaginatedResponse<MediaMarker>(data,total,totalPages) instead of a bare array. - Mark all read by type —
notifications.markAllRead(type?)marks only the notifications of the given type when one is passed. - Live activity capacity —
AdminLiveActivityResponsegainscapacity({ limit, active }): the server-wide stream limit and the number of slots in use. - Remove notifications —
notifications.delete(id)andnotifications.deleteMany(ids)(up to 200) remove notifications from the caller's list and return{ deleted }. - Trickplay regeneration by scope —
admin.regenerateTrickplay({ scope, id, force? })(scopeislibrary,titleorseason) returnsTrickplayRegenerationQueued({ operationId?, matching, enqueued, remaining });admin.getTrickplayRegenerationReport(operationId)returnsTrickplayRegenerationReportwith the generated, budget-skipped, other-skipped, failed, cancelled and unfinished counts. - Worker schedule pause, job retry and watchdog state —
admin.setWorkerScheduleEnabled(workerId, enabled)returnsWorkerScheduleState({ workerId, enabled, nextRunAt });admin.retryWorkerJob(jobId)returnsWorkerRetryResponse({ success, jobId }of the new job);admin.getWorkerWatchdog()returnsWorkerWatchdogState...
v1.2.2
Full Changelog: v1.2.1...v1.2.2
Features
- Plugin-declared CSP sources —
PluginManifest.csp(typed viaPluginCspDirectives, allowlisted byPLUGIN_CSP_DIRECTIVES) lets a plugin declare extraimg-src/media-src/connect-src/font-src/frame-srcsources for host UI content. The server validates them and appends them to the web UI Content-Security-Policy, so provider artwork and embedded players load without widening script or style execution.
v1.2.1
Full Changelog: v1.2.0...v1.2.1
Features
- Trickplay storage stats —
getTrickplayStats()andTrickplayStatsSchemanow carrystorageBytesandstorageBudgetBytes, so clients can show how much of the core artifact budget (system.artifacts.coreMaxStorageGb) is used.
Fixes
- Dashboard view library contract —
AdminDashboardViewResponseSchema.librariesnow usesLibraryWithRelationsSchema(paths+ file/size stats). The previous baseLibrarySchemastripped relations during response validation, which crashed the admin libraries page that reads the dashboard-seeded cache.
v1.2.0
Full Changelog: v1.1.1...v1.2.0
Highlights
- Richer playback contracts — hydrated watchlist items, batch playback suggestions, and a full-row playback view.
- One-call admin dashboard —
getDashboardView()returns stats, libraries, worker operations, audit feed, error logs and update status together. - Explicit pagination contracts — one flat envelope everywhere (admin pages included) and a clear split between offset and cursor endpoints.
- Codes, not text — remote-access checks now return stable machine codes with params; clients own all translated text.
- Typed request/response schemas for playback progress, stream prefs, heartbeat, watchlist statuses and the worker status filter.
Breaking changes
- Admin page envelopes are flat
- Before:
{ data, pagination: { total, page, limit, totalPages } } - After:
{ page, limit, total, totalPages, data } - Affects
AdminUsersPage,AdminLogsPage,AdminAuditPageand theaudit/logsfields insideAdminDashboardViewResponse. - Empty pages now report
totalPages: 0.
- Before:
- Cursor contracts split from offset contracts
PaginationQueryis offset-only (page,limit); cursor endpoints use the newCursorPaginationQuery(cursor).PaginatedResponse<T>no longer carriesnextCursor; cursor endpoints return the newCursorPaginatedResponse<T>.me.getWatchedHistorynow acceptsCursorPaginationQuery; the deadperPageparameter is gone.- Cursor mode applies to
GET /v1/metadataandGET /v1/me/watched-historyonly.
- Remote-access checks return codes
RemoteAccessCheckchanged from{ id, ok, title, detail }to{ id, ok, code, params? }.- Translate
remote_access.*codes on the client (website already does).
New in 1.2.0
BatchSmartPlayResponseSchema+me.getPlaybackSuggestionsBatch(metadataIds)(up to 50 ids) — suggestion + watchlist flag per card in one request.HydratedWatchlistItemSchema+me.getWatchlist({ hydrate: true })overload — each item carries its full metadata card.PlaybackViewResponseSchema.mediaFileis now the complete row (no projection) so the player UI works on the strict shape.worker:progressrealtime event (throttled to at most one message per second per running job).AdminDashboardViewResponseSchema+admin.getDashboardView()— replaces six parallel dashboard requests.- New typed schemas:
UpdatePlaybackProgressSchema,StreamPrefsSchema,HeartbeatBodySchema,WatchlistStatusSchema,WatchlistStatusesResponseSchema,WorkerStatusFilterSchema. PaginationMetaSchemais now the single source for every page envelope.
Upgrade notes
- Bump
@reelvault/sdkto^1.2.0. - Update consumers that read
.paginationon admin endpoints (see breaking change 1) and translate remote-access codes (breaking change 3). - Everything else is wire-compatible; the remaining changes are schema deduplication and type exports.