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 Number namespace (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 repeated classList add/remove calls, and moved to dataset for data-* 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.iofastpix.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.io to https://stream.fastpix.com for 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/... (previously api.fastpix.io).
  • Spritesheet / poster hostspritesheet-src default updated from images.fastpix.io to images.fastpix.com. Consumers that explicitly set spritesheet-src are unaffected.
  • Shoppable cart fallback – when cart-goto-link is not provided, the cart CTA now links to https://www.fastpix.com instead of https://www.fastpix.io.

Note: the .io hosts continue to serve traffic for now and existing integrations will keep working, but they are slated for deprecation — please migrate to .com. The images.fastpix.io default referenced in the 1.0.18 entry below is now images.fastpix.com.

[1.0.18]

Spritesheet hover previews

  • spritesheet-src – overrides the host that serves the hover-preview spritesheet and poster thumbnail.jpg. Defaults to images.fastpix.io. Accepts a bare host (e.g. images.fastpix.co) or a full URL; trailing slashes are stripped and https:// is added when no scheme is supplied. Previously a bare host was concatenated as a relative path against the page origin, producing 404s like http://<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 – integer 110. Seconds between consecutive tiles on the advanced spritesheet (passed as ?interval=N on the JSON and JPG requests). Out-of-range or non-numeric values are ignored and the API default of 10 is used. Has no effect unless enable-advanced-spritesheet is 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 JSONbackgroundSize is now computed from the sheet’s declared dimensions rather than image.naturalWidth, so previews render correctly the first time, not only after the image fully decodes.
  • Two JSON schemas supportedfetchThumbnailJson now normalizes both the legacy tiles[] 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 url field, 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 lookupfindCurrentTile guards against missing or empty tiles so an unexpected response shape can no longer throw Cannot 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.levels is the full rendition ladder. Build your quality menu here.
  • fastpixqualitychange – fires on every ABR or manual switch; detail includes mode, lockedLevel, loadedLevel, and previousLoadedLevel.
  • fastpixqualityfailed – fires on invalid levelId or rendition load error; detail.reason describes 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 (default 6).
  • --user-slot-bottom-clearance – space between bottom-row slots and the seek bar (default 64px).
  • Shadow part part="user-slots" exposed for page-level ::part styling.

[1.0.16]

Updated

  • Analytics / Video Data@fastpix/video-data-core dependency 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: fastpixsubtitlecue continues to fire with { text, language, startTime, endTime } and the native TextTrack state 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 unless hide-native-subtitles is also set.

Programmatic seek

  • seekForward(seconds) and seekBackward(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 follow forward-seek-offset / backward-seek-offset when 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 listsgetAudioTracks() / getSubtitleTracks() now avoid duplicate entries when multiple tracks share the same label.
  • Better events for integrations
    • fastpixtracksready includes the full current track objects (currentAudioTrackLoaded, currentSubtitleLoaded) in addition to the track lists.
    • fastpixaudiochange / fastpixsubtitlechange include 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), so import '@fastpix/fp-player' works in React, Vite, and other bundlers without “Could not resolve ./utils/…” errors. CDN build stays at dist/player.js for backward compatibility with existing script-tag and CDN URLs.
  • Exports"import" resolves to player.esm.js; "require" and main resolve to player.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(), and unmute() 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: 1 to 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-shorts for muted autoplay, loop, and feed-friendly behavior.
  • Free keyboard keys – Attribute disable-keyboard-controls so your app can use Arrow Up/Down (e.g. next/prev) without the player capturing them.
  • Accent color – Attribute accent-color or CSS --accent-color for 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-start and skip-intro-end and next-episode-button-overlay buttons support.
  • Fixed shoppable video hotspot issue
  • Added player-buttons slot

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); call i.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
  • 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-player theme with full-featured product sidebar, interactive hotspots, and comprehensive product catalog functionality
  • Shoppable Shorts Theme: Added shoppable-shorts theme 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.