You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: CHANGELOG.md
+54-2Lines changed: 54 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -5,7 +5,59 @@ All notable changes to this project will be documented in this file.
5
5
This project adheres to [Semantic Versioning](https://semver.org) and follows the [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) format.
6
6
7
7
---
8
-
## [1.2.3] - 2026-11-09
8
+
9
+
## [1.3.0] - 2025-12-19
10
+
11
+
### Added
12
+
13
+
-**Multi-Engine Architecture**: New pluggable engine system with capability-based selection and runtime switching. Engines can be registered and dynamically selected based on media type and capabilities.
14
+
-**Engine API**: New player methods `addEngine()`, `removeEngine()`, `getEngine()`, `setEngine()`, and `canPlay()` for managing media engines.
15
+
-**Engine Events**: New events `player/engine/set` and `player/engine/switched` for tracking engine changes.
16
+
-**Engine Docs**: New `docs/guides/Engines.md` covering multi-engine usage, capabilities, suspend/resume, events, and namespaced APIs.
17
+
-**YouTube Provider**: Built-in engine for YouTube video playback with full player UI integration.
18
+
-**Vimeo Provider**: Built-in engine for Vimeo video playback with full player UI integration.
19
+
-**Capability-aware Components**: The following components now support the engine capability system, and update themselves on engine switches: `Play`, `PlayOverlay`, `PlaybackRate`, `Loop`, `PictureInPicture`, `Time`, `Title`, `Keyboard`, `Scrubber`, `Subtitles`, `AudioChain`, `AudioControls`, `VideoControls` and `AnalyserVideo`.
20
+
-**Data update-aware components**: the following components are reacting to the new `data/update`event: `Chapters`, `Title` and the new `SubtitlesUi`
21
+
-**State Preservation**: Player state (playback position, paused state, volume, muted state, picture-in-picture) is now preserved (if possible) when switching between media items in playlists.
22
+
-**Data API**: New `data.updateMediaData` API allows for partial media data updates.
23
+
-**Media Session Component**: This new component uses the Media Session API for better support for system media controls, including artwork and playlist support.
24
+
-**UI Wake Lock**: Optional Screen Wake Lock integration to keep the display on while playing and release it on pause/end/errors or when the tab is hidden.
25
+
-**Orientation Lock**: A new option for the Fullscreen Conmponent that controls the screen orientation when entering FS mode.
26
+
-**Script Loader Utility**: New centralized `scriptLoader` utility for loading external JavaScript libraries (Dash.js, Hls.js, ChromeCast API) with deduplication, cancellation support, and improved error handling.
27
+
-**SubtitleUi**: New component which provides subtitle settings independently from the Subtitles component.
28
+
-**Demo Page**: New demo examples for YouTube and Vimeo providers.
29
+
-**Notifications**: New "Warning" display state supported.
30
+
-**Automatic Workspace Folders**: Direct source editing in chrome support via `vite-plugin-devtools-json`.
31
+
32
+
### Changed
33
+
34
+
-**ChromeCast Refactoring**: Completely refactored ChromeCast component to work as a media engine with improved state management, better error handling, and unified API integration. In addition, ChromeCCast now also works in secure mode.
35
+
-**Media Component**: Refactored to work as the default `video` engine with capability-based registration.
36
+
-**Data Component**: `data.setMediaIndex` now preserves current media state when options are omitted.
37
+
-**Subtitles Component**: Simplified subtitles component by removing internal menu system.
38
+
-**Streaming Plugins**: Dash.js and Hls.js plugins now use the centralized script loader utility for more reliable library loading with deduplication.
39
+
-**Playlist Navigation**: Playlist now preserves player state (playback position, paused state, volume, muted) when switching between media items.
40
+
-**API Namespace**: Engine-specific APIs now use namespace prefix format (e.g., `video:media.load`, `chromecast:media.play`) to support multiple engines.
41
+
-**Locale Error Messages**: Updated error messages for library loading failures to use dynamic library names and improved messaging.
42
+
-**Enhanced Locale Messages**: Changed locale strings for script loader errors and Picture-in-Picture browser restrictions in all supported languages.
43
+
-**CSS Library**: Updated CSS with various improvements and fixes.
44
+
-**JSDoc Formatting**: Cleaned up JSDoc formatting across the codebase.
45
+
-**JSDoc Configuration**: Updated to version 1.3.0, added canonical URL and sitemap configuration for better SEO.
46
+
-**Know Issues Page**: Moved the "Known Issues" Section in the readme to a dedicated page.
47
+
-**Dependencies**: Updated development dependencies.
48
+
49
+
### Fixed
50
+
51
+
-**Script Loading**: Fixed duplicate script loading issues when multiple player instances or components request the same external library.
52
+
-**State Management**: Fixed state not being preserved correctly when switching between different media types (native video, YouTube, Vimeo, etc.).
53
+
-**ChromeCast State**: Fixed ChromeCast state synchronization issues and improved connection handling.
54
+
-**Picture-in-Picture**: Improved Picture-in-Picture support detection and error handling, especially for iframe-embedded videos.
55
+
-**Playlist State**: Fixed playlist not preserving playback state when navigating between items.
56
+
-**Subtitles Rendering**: Improved subtitle rendering when switching between engines.
57
+
-**domSmithInputRange**: Touch interactions now properly respect the `disabled` state.
58
+
-**Mobile UI**: Fixed problem where media would play on first touch inadvertently.
59
+
60
+
## [1.2.3] - 2025-11-09
9
61
10
62
### Added
11
63
@@ -147,4 +199,4 @@ This project adheres to [Semantic Versioning](https://semver.org) and follows th
147
199
-**Single, zero dependency bundle File** — VisionPlayer bundles all code, styles, SVG assets and language files into a zero-dependency single build artifact – making integration seamless.
148
200
-**Optimized Performance** — GPU-accelerated transitions, minimal reflows, and efficient DOM updates.
149
201
-**Security Features** — Optional Secure Mode with Shadow DOM, API protection and XSS prevention.
150
-
-**1-Minute Setup** — Get from `npm install` to working demo in under 60 seconds with vite dev server.
202
+
-**1-Minute Setup** — Get from `npm install` to working demo in under 60 seconds with vite dev server.
Copy file name to clipboardExpand all lines: README.md
+10-4Lines changed: 10 additions & 4 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -17,12 +17,18 @@ The **VisionPlayer** by **[alphanull](https://alphanull.de)** is a highly modula
17
17
18
18
## Features
19
19
20
+
> 🎉 **MAJOR UPDATE** 🎉 VisionPlayer 1.3 introduces a new multi-engine architecture with added YouTube and Vimeo support, along with significant improvements including state preservation
21
+
> when switching media, enhanced third-party script loading, a completely refactored ChromeCast component, support for the Media Session, Orientation & Wake Lock APIs and more.
22
+
> For further information about the new engine architecture, see the [Engines documentation](docs/guides/Engines.md).
23
+
20
24
-**Fully modular architecture** — Components can be easily added, removed, or replaced without modifying the core, with nearly 50 components already provided.
25
+
-**Multi-Engine Support** — Pluggable engines with capability-based selection and runtime switching.
21
26
-**Native HTML5 video support** — Plays MP4, WebM, and other browser-supported formats.
22
27
-**Multi-language and multi-quality stream selection** — Each stream can offer multiple languages, resolutions, and encodings. Quality can be automatically selected depending on screen resolution.
23
28
-**Streaming support** — DASH and HLS support, both VOD and Live Streaming, fully integrated into the player UI including subtitles, audio and quality selection.
24
29
-**FairPlay, Widevine, and PlayReady DRM** — Encrypted media playback for premium content.
25
30
-**Chromecast and AirPlay** — External device playback handling with full UI synchronization.
31
+
-**External Providers** — Built-in engines for YouTube and Vimeo alongside native playback.
26
32
-**Playback Controls** — Play/pause, scrubber, volume, playback rate, fullscreen, loop and more.
27
33
-**Playlist Management** — Seamless navigation between multiple media items, with optional shuffle and loop modes.
28
34
-**Subtitle support** — WebVTT rendering with support for positioning, all writing modes and built in HTML sanitiser, TTML (IMSC1/EBU-TT-D) handling, and native `<track>` integration for iOS compatibility.
@@ -32,6 +38,7 @@ The **VisionPlayer** by **[alphanull](https://alphanull.de)** is a highly modula
32
38
-**Picture-in-Picture** — Play video in a separate overlay window.
33
39
-**Picture and Audio Controls** — Adjust video brightness, contrast, and more, or fine-tune your audio with a multiband equalizer.
34
40
-**Advanced Accessibility** — Comprehensive accessibility features including Picture & Audio Controls for visual/auditory impairments, keyboard navigation, and screen reader support.
41
+
-**Advanced System Integration**: Wakelock prevents screen from dimming down while playing. Media Session support for system media controls, including artwork and playlists.
35
42
-**Local playback** — Play local media by selecting or dragging and dropping files.
36
43
-**Audio and Video Visualizations** — Including bar visualizer, ambient light effects, and waveform displays.
37
44
-**Extensive Media Data Format** — With support for extensible metadata and multiple media variants, representations, and encodings.
@@ -132,22 +139,21 @@ Additional docs cover the following topics:
-[**Developing for VisionPlayer**](docs/guides/Development.md)
139
147
140
-
In addition, a detailed JSDoc documentation covering all modules and their methods, members and events can be generated using `npm run doc`, which then will reside in `/docs/jsdoc`. This generated documentation can also be accessed via the microsite: [VisionPlayer JSDoc](https://visionplayer.io/docs)
148
+
In addition, a detailed JSDoc documentation covering all modules and their methods, members and events can be generated using `npm run doc`, which then will reside in `/docs/jsdoc`. This generated documentation can also be accessed via the microsite: [VisionPlayer JSDoc](https://visionplayer.io/docs/)
141
149
142
150
## Browser Support
143
151
144
152
VisionPlayer supports all major browsers on all platforms (i.e. macOS, iOS, Windows, Android & Linux) released since ~2019-2020 and later, including Chrome (v79+), Firefox (v75+) and Safari (v13+). **Note:** The [Secure Build](docs/guides/Security.md) requires native ES2022 support.
145
153
146
154
### Known Issues
147
155
148
-
- Sharpen Video Filter does not work on Safari - see [https://bugs.webkit.org](https://bugs.webkit.org/show_bug.cgi?id=184601). Not solvable unless Apple gets its act together - and it is generally recommended to use a "proper" browser anyways, like Firefox or Chrome.
149
-
150
-
- If the ambient visualizer is enabled (as in the demo), you may get the warning *Canvas2D: Multiple readback operations using getImageData are faster with the willReadFrequently attribute set to true.* Actually, with that setting enabled, performance gets **worse** (up to five times!) on both a windows and a mac laptop. However, an Android tablet showed better performance with this setting, while an iPad did not show much difference. Not sure why exactly this is the case - seems like different rendering pipelines are triggered - and what would be the best heuristics to select the optimal setting. So for now, `willReadFrequently` is disabled until the situation is resolved.
156
+
Despite best efforts to make the VisionPlayer a perfect experience there are some known issues which can not be resolved (yet). For a list of current issues, see the [Know Issues Page](docs/guides/KnownIssues.md).
Copy file name to clipboardExpand all lines: assets/locale/VisionPlayer.de.json
+5-4Lines changed: 5 additions & 4 deletions
Original file line number
Diff line number
Diff line change
@@ -68,9 +68,8 @@
68
68
"accessError": "Auf das Medium konnte nicht zugegriffen werden."
69
69
},
70
70
"library": {
71
-
"header": "Bibliotheksfehler",
72
-
"dashLoadError": "Die Dash.js-Bibliothek konnte nicht geladen werden.",
73
-
"hlsLoadError": "Die Hls.js-Bibliothek konnte nicht geladen werden."
71
+
"scriptLoaderErrorTitle": "Ladefehler",
72
+
"scriptLoaderErrorMessage": "${libraryName} konnte nicht geladen werden. Bitte überprüfen Sie Ihre Verbindung und versuchen Sie es erneut."
74
73
},
75
74
"supportMessage": ""
76
75
},
@@ -109,7 +108,9 @@
109
108
"pip": {
110
109
"title": "Bild-in-Bild-Modus",
111
110
"placeholder": "Dieses Video wird gerade im „Bild-in-Bild“-Modus abgespielt.",
112
-
"cancel": "Bild-in-Bild-Modus verlassen"
111
+
"cancel": "Bild-in-Bild-Modus verlassen",
112
+
"iFrameNotEnabled": "Bild-in-Bild wird vom Browser blockiert.",
113
+
"enableIframe": "Ihr Browser verlangt eine direkte Interaktion mit dem Video, bevor Bild-in-Bild gestartet werden kann. Bitte klicken Sie einmal in den Videobereich und versuchen Sie es erneut."
Copy file name to clipboardExpand all lines: assets/locale/VisionPlayer.en.json
+5-4Lines changed: 5 additions & 4 deletions
Original file line number
Diff line number
Diff line change
@@ -68,9 +68,8 @@
68
68
"accessError": "The media could not be accessed."
69
69
},
70
70
"library": {
71
-
"header": "Library Error",
72
-
"dashLoadError": "The Dash.js library could not be loaded.",
73
-
"hlsLoadError": "The Hls.js library could not be loaded."
71
+
"scriptLoaderErrorTitle": "Load Error",
72
+
"scriptLoaderErrorMessage": "${libraryName} could not be loaded. Please check your connection and try again."
74
73
},
75
74
"supportMessage": ""
76
75
},
@@ -109,7 +108,9 @@
109
108
"pip": {
110
109
"title": "Picture in Picture",
111
110
"placeholder": "This video is currently playing in Picture-in-Picture mode.",
112
-
"cancel": "Close Picture in Picture"
111
+
"cancel": "Close Picture in Picture",
112
+
"iFrameNotEnabled": "Picture-in-Picture blocked by the browser.",
113
+
"enableIframe": "Your browser requires a direct user interaction with the video before Picture-in-Picture can start. Please click the video area once and then try again."
Copy file name to clipboardExpand all lines: assets/locale/VisionPlayer.es.json
+5-4Lines changed: 5 additions & 4 deletions
Original file line number
Diff line number
Diff line change
@@ -68,9 +68,8 @@
68
68
"accessError": "No se pudo acceder al medio."
69
69
},
70
70
"library": {
71
-
"header": "Error de biblioteca",
72
-
"dashLoadError": "No se pudo cargar la biblioteca Dash.js.",
73
-
"hlsLoadError": "No se pudo cargar la biblioteca Hls.js."
71
+
"scriptLoaderErrorTitle": "Error de carga",
72
+
"scriptLoaderErrorMessage": "No se pudo cargar ${libraryName}. Por favor, verifique su conexión e intente nuevamente."
74
73
},
75
74
"supportMessage": ""
76
75
},
@@ -109,7 +108,9 @@
109
108
"pip": {
110
109
"title": "Imagen en imagen",
111
110
"placeholder": "No hay vídeo para mostrar",
112
-
"cancel": "Cerrar PiP"
111
+
"cancel": "Cerrar PiP",
112
+
"iFrameNotEnabled": "El modo Imagen en imagen está bloqueado por el navegador.",
113
+
"enableIframe": "Tu navegador requiere una interacción directa con el vídeo antes de iniciar Imagen en imagen. Haz clic una vez en el área del vídeo y vuelve a intentarlo."
Copy file name to clipboardExpand all lines: assets/locale/VisionPlayer.fr.json
+6-5Lines changed: 6 additions & 5 deletions
Original file line number
Diff line number
Diff line change
@@ -68,9 +68,8 @@
68
68
"accessError": "Impossible d’accéder au média."
69
69
},
70
70
"library": {
71
-
"header": "Erreur de bibliothèque",
72
-
"dashLoadError": "La bibliothèque Dash.js n’a pas pu être chargée.",
73
-
"hlsLoadError": "La bibliothèque Hls.js n’a pas pu être chargée."
71
+
"scriptLoaderErrorTitle": "Erreur de chargement",
72
+
"scriptLoaderErrorMessage": "${libraryName} n'a pas pu être chargé. Veuillez vérifier votre connexion et réessayer."
74
73
},
75
74
"supportMessage": ""
76
75
},
@@ -109,7 +108,9 @@
109
108
"pip": {
110
109
"title": "Image dans l’image",
111
110
"placeholder": "Aucune vidéo à afficher",
112
-
"cancel": "Fermer le PiP"
111
+
"cancel": "Fermer le PiP",
112
+
"iFrameNotEnabled": "Le mode Image dans l’image est bloqué par le navigateur.",
113
+
"enableIframe": "Votre navigateur exige une interaction directe avec la vidéo avant de lancer l’Image dans l’image. Cliquez une fois sur la zone vidéo, puis réessayez."
Copy file name to clipboardExpand all lines: assets/locale/VisionPlayer.hi.json
+5-4Lines changed: 5 additions & 4 deletions
Original file line number
Diff line number
Diff line change
@@ -68,9 +68,8 @@
68
68
"accessError": "मीडिया तक पहुँच नहीं सका।"
69
69
},
70
70
"library": {
71
-
"header": "लाइब्रेरी त्रुटि",
72
-
"dashLoadError": "Dash.js लाइब्रेरी लोड नहीं हो सकी.",
73
-
"hlsLoadError": "Hls.js लाइब्रेरी लोड नहीं हो सकी."
71
+
"scriptLoaderErrorTitle": "लोड त्रुटि",
72
+
"scriptLoaderErrorMessage": "${libraryName} लोड नहीं हो सका। कृपया अपना कनेक्शन जांचें और पुनः प्रयास करें।"
74
73
},
75
74
"supportMessage": ""
76
75
},
@@ -109,7 +108,9 @@
109
108
"pip": {
110
109
"title": "पिक्चर‑इन‑पिक्चर",
111
110
"placeholder": "दिखाने के लिए कोई वीडियो नहीं",
112
-
"cancel": "PiP बंद करें"
111
+
"cancel": "PiP बंद करें",
112
+
"iFrameNotEnabled": "पिक्चर-इन-पिक्चर ब्राउज़र द्वारा अवरुद्ध है।",
113
+
"enableIframe": "पिक्चर-इन-पिक्चर शुरू होने से पहले आपका ब्राउज़र वीडियो के साथ प्रत्यक्ष इंटरैक्शन चाहता है। कृपया वीडियो क्षेत्र पर एक बार क्लिक करें और फिर से प्रयास करें।"
0 commit comments