Releases: NoMercy-Entertainment/nomercy-player-core
Release list
v2.0.3
Fixed: item(target) picked between setup() and ready() survives the playlist seeding, so a deep link naming a start item no longer opens on the first item.
Added: detectDisplayHdr(), HdrOnSdrFallback, the hdrOnSdr config field and sizeAbrCeiling().
v2.0.2
Fixes the queue's track-change listener.
_wireQueue subscribed to MediaList's current event, which was renamed to item — so emit('item') never fired on a track change and consumers got no track-change feedback. The player warned about it at runtime; nothing acted on the warning because the fix was never released.
Consumers must also take music-player and video-player 2.0.2: both bundle this code into their IIFE builds, so a core bump alone does not reach them.
v2.0.1
First published stable of the v2 player core, under the latest dist-tag: npm install @nomercy-entertainment/nomercy-player-core now resolves 2.0.1. (2.0.0 was withdrawn before release.) Promotes the 2.0.0-rc.33 surface to stable with no runtime or signature changes. See CHANGELOG.md.
v2.0.0-rc.33
Fixed
bandwidth()now returns the live estimate instead of permanently reporting0. The getter read a_bandwidthEstimatecache field that nothing ever wrote, whilebandwidthEstimator(fn)wrote a same-looking_bandwidthEstimatorfield that nothing ever read — the two names never met. The dead cache field is gone;bandwidth()resolves on every read, honoring a consumer'sbandwidthEstimator()override first, else the backend's optionalbandwidthEstimate?()capability. Return type and unit (bits per second) are unchanged — additive fix, no signature change.
Full changelog: https://github.com/NoMercy-Entertainment/nomercy-player-core/blob/master/CHANGELOG.md
v2.0.0-rc.32
fix(player-core): subtitle(idx) resolves against the same deduped list subtitles() returns — fixes off-by-one subtitle selection when an HLS/CEA backend track is displaced by a sidecar. Mirrors the shipped quality-menu raw-index fix.
v2.0.0-rc.31
Correctness fixes across the shared spine (bottom of the v2 player trio).
- dispatch: a before-hook delay that rejects with
undefinedis now correctly treated as prevented - plugin-registration: a throwing plugin constructor/initialize is contained instead of aborting the whole setup pipeline
- tab-leader: abort a queued Web Lock request on dispose (no cross-tab playback stall)
- auth: insert access_token before the URL #fragment, not after
- auth-fetch: route an abort during retry backoff through the NetworkError contract
- storage: LocalStorageBackend.get() falls back to the in-memory map on a null read
- audio-output: read the bound element's live sinkId, not a stale cache
- cast-sender: stop a spurious cast:media-changed on self-load
- spectrum: propagate runtime fftSize/smoothing to stereo L/R analysers; disconnect shared analyser from splitter on stereo dispose
- core: fix RAF id leak, enhanced-LRC word parsing, HLS/native #fragment matching, HLS content-type matching, VTT whitespace-only line splitting, and volume re-push on unmute
- i18n: separate dedup namespaces for static translations vs the loadTranslations hook
v2.0.0-rc.30
Ship runtime sidecar subtitle injection (addSubtitleTrack/removeSubtitleTrack, SidecarSubtitleInput) that the video player's committed source depends on. CI: drop the forced npm@latest global upgrade that broke provenance publishing.
v2.0.0-rc.29
Fixed
- The typed
subtitlesplaylist-item field is now actually read bysubtitles()/subtitle(idx)(typed field first, wiretracksafter, URL-deduped). Previously only the v1 wire shape was consulted. chapters()no longer requires a non-empty wiretracksarray before returning the item's typedchapters.
v2.0.0-rc.28
Changed
- The
timeevent now carries the fullTimeStatesnapshot —time,position,duration,buffered,remaining,percentage— instead of{ time }alone.TimeStategainstime(alias ofposition), andtimeData()returns the same widened shape. Existing listeners are unaffected; manual emitters build the payload viatimeData()/ the internal_timeStateAt(position).
2.0.0-rc.27
Built-in activity tracker hides controls on container mouseleave while playing (same rule as the desktop UI); paused keeps controls up. See CHANGELOG.md.