Changelog
All notable changes to the FastPix Player is documented below.
Current version
[1.0.20]
Code sanitization & maintainability
Internal hardening and cleanup pass. No public API, attribute, or runtime behavior changes — existing integrations upgrade transparently.
- Safer numeric parsing – standardized on the
Numbernamespace (Number.parseFloat,Number.parseInt,Number.isNaN,Number.isFinite,Number.NaN) across the player, avoiding the loosely-coerced global variants for more predictable parsing of attributes, volumes, playback rates, and chapter/overlay timings. - Defensive property access – replaced manual existence checks with optional chaining and removed redundant guards in the HLS error handling, cast URL resolution, audio/subtitle track resolution, and quality-level code paths.
- DOM hygiene – switched node teardown to
childNode.remove(), batched repeatedclassListadd/remove calls, and moved todatasetfordata-*attributes during responsive layout and slot setup. - Reduced complexity – decomposed several large functions (playlist navigation, Chromecast session handling, HLS audio-track formatting, video-listener setup, thumbnail normalization) into focused helpers, improving readability without altering behavior.
- De-duplication & dead-code removal – consolidated repeated playlist-item overlay and audio-default-resolution logic into shared helpers, dropped unused imports/variables and an unreferenced module, and removed unnecessary type assertions.
- Hardened regex usage – trailing-slash normalization for spritesheet/poster hosts no longer relies on a backtracking-prone pattern.
Previous versions
[1.0.19]
Domain migration: fastpix.io → fastpix.com
All first-party endpoints baked into the player have moved from the .io TLD to .com. No attribute changes are required — existing integrations that rely on the built-in defaults will start hitting the new hosts on upgrade.
- HLS playback host – default stream base changed from
https://stream.fastpix.iotohttps://stream.fastpix.comfor both on-demand and live streams, and for episode switching in the playlist flow. - DRM endpoints – Widevine license, FairPlay license, and FairPlay certificate URLs now resolve under
https://api.fastpix.com/v1/on-demand/drm/...(previouslyapi.fastpix.io). - Spritesheet / poster host –
spritesheet-srcdefault updated fromimages.fastpix.iotoimages.fastpix.com. Consumers that explicitly setspritesheet-srcare unaffected. - Shoppable cart fallback – when
cart-goto-linkis not provided, the cart CTA now links tohttps://www.fastpix.cominstead ofhttps://www.fastpix.io.
Note: the
.iohosts continue to serve traffic for now and existing integrations will keep working, but they are slated for deprecation — please migrate to.com. Theimages.fastpix.iodefault referenced in the 1.0.18 entry below is nowimages.fastpix.com.
[1.0.18]
Spritesheet hover previews
spritesheet-src– overrides the host that serves the hover-preview spritesheet and posterthumbnail.jpg. Defaults toimages.fastpix.io. Accepts a bare host (e.g.images.fastpix.co) or a full URL; trailing slashes are stripped andhttps://is added when no scheme is supplied. Previously a bare host was concatenated as a relative path against the page origin, producing 404s likehttp://<your-site>/images.fastpix.co/<id>/thumbnail.jpg.enable-advanced-spritesheet– boolean. Switches hover previews from the default sheet to the higher-density advanced sheet (advanced-spritesheet.json/.jpg). More frame-accurate scrubbing at the cost of a larger image download.advanced-spritesheet-interval– integer1–10. Seconds between consecutive tiles on the advanced spritesheet (passed as?interval=Non the JSON and JPG requests). Out-of-range or non-numeric values are ignored and the API default of10is used. Has no effect unlessenable-advanced-spritesheetis also present.
Hover preview reliability
- Instant interactivity – the seekbar’s hover/scrub listeners now attach as soon as the spritesheet JSON arrives, instead of waiting for the entire spritesheet image (which can be several megabytes for the advanced variant) to finish downloading. The timestamp pill follows the cursor immediately; the frame fills in as the image streams.
- Tile dimensions derived from JSON –
backgroundSizeis now computed from the sheet’s declared dimensions rather thanimage.naturalWidth, so previews render correctly the first time, not only after the image fully decodes. - Two JSON schemas supported –
fetchThumbnailJsonnow normalizes both the legacytiles[]response and the newer grid response (columns,rows,interval,tileWidth,tileHeight) into a single shape. The grid variant was previously rejected as malformed and fell back to timestamp-only previews. - Deterministic image URL – the spritesheet image URL is reconstructed from the playback ID and variant rather than trusted from the JSON’s
urlfield, working around upstream responses that occasionally return a mis-cased filename (advanced-Spritesheet.jpg) that 404s on the CDN. - Cache key includes variant and interval – switching between normal and advanced spritesheets, or between intervals, no longer serves a stale cached JSON.
- Safer tile lookup –
findCurrentTileguards against missing or emptytilesso an unexpected response shape can no longer throwCannot read properties of undefined (reading 'length')during hover.
[1.0.17]
Custom quality API
getQualityLevels()– returns all available renditions (id,label,height,width,bitrate,frameRate).setQualityLevel(id)– locks playback to a specific rendition (manual mode).setQualityAuto()– re-enables ABR; clears any manual lock.getPlaybackQuality()– snapshot of current state:{ mode, lockedLevel, loadedLevel }.--resolution-selector: none– CSS variable to hide the built-in quality button when using a custom menu.
Quality events
fastpixqualitylevelsready– fires after manifest parse;detail.levelsis the full rendition ladder. Build your quality menu here.fastpixqualitychange– fires on every ABR or manual switch;detailincludesmode,lockedLevel,loadedLevel, andpreviousLoadedLevel.fastpixqualityfailed– fires on invalidlevelIdor rendition load error;detail.reasondescribes the failure.
Named overlay slots
- Eight slot regions (
top-left,top-center,top-right,center-left,center-right,bottom-left,bottom-center,bottom-right) let you place any HTML over the video as light-DOM children of<fastpix-player>. --user-slot-z– controls stacking order of the slot layer (default6).--user-slot-bottom-clearance– space between bottom-row slots and the seek bar (default64px).- Shadow part
part="user-slots"exposed for page-level::partstyling.
[1.0.16]
Updated
- Analytics / Video Data –
@fastpix/video-data-coredependency range updated to^1.0.7.
Live playback
- Cleaner live UI – For
stream-type="live-stream", the duration-style time readout stays hidden so the experience matches open-ended live viewing.
On-demand playback
- Smarter background loading on VOD – On-demand streams use settings tuned for typical recorded playback; live streams use a lighter profile suited to the live edge.
Performance & stability
- Smoother day-to-day use – Less chance of the browser reporting long scripting tasks during normal actions (timeline updates, audio track changes, subtitle changes, and Chromecast handoff).
- Programmatic audio – When you switch tracks via
setAudioTrack(...), the built-in audio menu stays aligned with fewer redundant updates.
[1.0.15]
Audio & Subtitle UX (tracks + subtitles)
— New attribute: hide-native-subtitles
-
When present, the internal subtitle container never paints text, so the built‑in overlay stays visually hidden even when a track is enabled.
-
All subtitle APIs still work as usual:
fastpixsubtitlecuecontinues to fire with{ text, language, startTime, endTime }and the nativeTextTrackstate is unchanged. -
Recommended when you render subtitles in your own UI (React overlay, custom HTML) and want to guarantee there is no duplicate text from the built‑in overlay.
-
Clarified behavior:
disable-hidden-captions- Now applied as an initial state only: on load, the player disables all subtitles/captions without emitting
fastpixsubtitlechange. - After load, users (or your code) can still turn subtitles on via the built‑in menu or
setSubtitleTrack(...); the internal overlay is allowed to show again unlesshide-native-subtitlesis also set.
- Now applied as an initial state only: on load, the player disables all subtitles/captions without emitting
Programmatic seek
seekForward(seconds)andseekBackward(seconds)– New methods on the<fastpix-player>element to jump the playhead forward or back by a given number of seconds (clamped to the media range). Use them for custom “+10s” / “−10s” buttons or app shortcuts; the built-in skip buttons still followforward-seek-offset/backward-seek-offsetwhen set. Documented in README (Programmatic playback control and section 1.3 custom-controls example).
v1.0.14
Audio & Subtitle Tracks
- Switch by name (label) –
setAudioTrack(languageName)/setSubtitleTrack(languageName | null)switch tracks by label/name (no numeric ids required). - Set defaults by name – New attributes:
default-audio-track="French"default-subtitle-track="English"
- Cleaner track lists –
getAudioTracks()/getSubtitleTracks()now avoid duplicate entries when multiple tracks share the same label. - Better events for integrations
fastpixtracksreadyincludes the full current track objects (currentAudioTrackLoaded,currentSubtitleLoaded) in addition to the track lists.fastpixaudiochange/fastpixsubtitlechangeinclude the current track object (currentTrack) so you can log/update UI easily.
v1.0.13
Readme.md
- Updated Readme.md file
v1.0.12
Changed
- Build & package – ESM build is now a single bundled file (
dist/player.esm.js), soimport '@fastpix/fp-player'works in React, Vite, and other bundlers without “Could not resolve ./utils/…” errors. CDN build stays atdist/player.jsfor backward compatibility with existing script-tag and CDN URLs. - Exports –
"import"resolves toplayer.esm.js;"require"andmainresolve toplayer.js(IIFE). - Build size – Stripped legal comments and debugger statements in both builds for slightly smaller output.
v1.0.11
Features you can use
- Programmatic playback control – JavaScript API:
play(),pause(),mute(), andunmute()for controlling playback and volume from your code (e.g. custom controls, Shorts-style UI, or framework integrations).mute()/unmute()sync with Chromecast when casting. - Seekbar position – Use CSS variable
--seekbar-bottom(e.g.0px) to move the progress bar to the very bottom. Thumbnail preview stays above it. - Invisible bar, keep preview & seek – Set
--progress-bar-invisible: 1to hide the bar visually while keeping hover thumbnail/timestamp preview and click-to-seek. Use your own progress bar on top. - Style the bar – Use
--progress-bar-track-unfilledto style the track. - Thumbnail hover on seekbar – Hover or drag on the seekbar to see a frame preview (spritesheet) or timestamp pill when no thumbnails are available.
- Shorts mode – Attribute
autoplay-shortsfor muted autoplay, loop, and feed-friendly behavior. - Free keyboard keys – Attribute
disable-keyboard-controlsso your app can use Arrow Up/Down (e.g. next/prev) without the player capturing them. - Accent color – Attribute
accent-coloror CSS--accent-colorfor theming; your app can read it to match a custom progress bar.
Fixed
- Chromecast – Fixed casting with m4s segments for both private and public playback;DRM playback casting remains unresolved and is still being worked on.
- DRM Playback - DRM Playback issue in player is fixed..
v1.0.10
Changed
- Updated npm authentication from Classic token to Granular token for improved security and fine-grained permissions.
v1.0.9
- Added
skip-intro-startandskip-intro-endandnext-episode-button-overlaybuttons support. - Fixed shoppable video hotspot issue
- Added
player-buttonsslot
v1.0.8
New & Improved: Playlist
- Added playlist APIs:
addPlaylist(playlist),next(),previous(),selectEpisodeByPlaybackId(playbackId) - Supported attributes:
default-playback-id,hide-default-playlist-panel,loop-next - Events:
playbackidchange,playlisttoggle - Custom navigation hooks:
customNext(handler),customPrev(handler); calli.next()/i.previous()inside your handlers - Default playlist panel can be hidden to build a fully custom panel via
slot="playlist-panel" - Introduced
destroy()for lightweight teardown before custom source-switching flows
iOS Volume Behavior
- When iOS-specific volume button is active, standard slider/button are hidden
Menu Bugs fixed
- Fixed playlist panel toggle inconsistencies (open/close state and pointer events)
- Ensured external custom panel shows/hides reliably with
playlisttoggle - Resolved menu overlap by closing rate/audio/subtitle/resolution menus when opening playlist panel
v1.0.7
- Fixed “OpenOnPlay” and “autoClose” issue for shoppable-video-player theme
v1.0.6
- Removed unnecessary console logs
v1.0.5
New Feature: Shoppable Video Support
- Shoppable Video Player Theme: Introduced
shoppable-video-playertheme with full-featured product sidebar, interactive hotspots, and comprehensive product catalog functionality - Shoppable Shorts Theme: Added
shoppable-shortstheme for simplified external link integration optimized for social media and mobile-first content - Product Integration: Support for product data configuration with hover effects, click actions, and time-based product activation
- Interactive Hotspots: Clickable markers on video timeline that link to specific products
- Post-Play Overlay: Product carousel that appears when video ends to encourage continued engagement
- Responsive Design: Cart button and sidebar adapt to different screen sizes with theme-specific visibility rules
- Developer Documentation: Comprehensive developer guide with configuration examples, troubleshooting section, and best practices
v1.0.4
DRM Support & Chapters updation
- DRM support included
- Chapters feature updated
v1.0.3
- Fixed the spritesheet issue.
v1.0.2
Beta Feature: Chromecast Integration
- Initial Chromecast Support (Beta): Added foundational support for Google Chromecast. This includes:
- Chromecast session detection and management.
- Remote playback toggling with fallback to local player.
- Volume and mute sync between player and Chromecast.
- Session cleanup on load and playback resume logic.
v1.0.1
Enhancements & Bug Fixes:
- PIP Control Removed in Firefox Mobile: Fixed an issue where the Picture-in-Picture (PIP) control was displayed on Firefox mobile browsers when it shouldn’t be.
- Subtitle Menu UI Fixes:
- Fixed an issue where the subtitle menu was cropped, and scrolling was unavailable for videos with over 10 subtitles.
- Ensured that if multiple subtitles exist, the list is scrollable and properly displayed in the UI.
- Subtitle Overlay Fix: Resolved an issue where, after turning off subtitles, the background overlay remained visible instead of disappearing.
- Data Metrics Integration: Added Quality of Experience (QoE) scoring in the FastPix dashboard, allowing users to monitor streaming quality.
- Enable Cache Busting (Beta): Introduced an experimental cache-busting feature to ensure that when tracks are added dynamically, the player checks for an updated manifest.
v1.0.0
Initial Release:
- Playback: Introduced basic video playback functionality.
- Signed Playback: Enabled secure signed playback options.
- Stream Types: Added support for various stream types.
- Responsiveness: Ensured responsive design for different devices.
- Error Handling: Implemented robust error handling mechanisms.
- Customizability: Provided extensive customization options for users.
- Keyboard Accessibility Controls: Added keyboard shortcuts for better accessibility.
- Lazy Loading: Implemented lazy loading for improved performance.
- Chapters: Enabled chapter functionality for video navigation.
- Script Support for Video Events:: Added support for listening to video events via scripts.
- Poster customizations: Allowed customization of video posters.
- Thumbnail Customization: Enabled custom thumbnails for videos.
- Forward and Rewind Playback Customizations:: Provided options for customizable forward and rewind playback.
- Playback Rates: Allowed adjustment of playback rates.
- Styling Options: Added various styling options for UI elements.
- Volume Management: Implemented advanced volume control features.
- Subtitle Switching: Enabled switching between available subtitles.
- Audio Track Switching:: Allowed switching between different audio tracks.
- Thumbnail Hover Previews: Introduced thumbnail previews on hover.
- Customizing Time Display: Allowed customization of time display formats.
- Start Time: Implemented functionality to set a specific start time for playback.
- Placeholder: Added placeholder support for loading states.
- offline/online control: Provided control mechanisms for offline/online scenarios.
- Title Display: Implemented title display options for videos.
- Overriding Default Behaviors: Allowed users to override default player behaviors.