4.15.0 (2025-06-03)
Features
- ABR: Add abr.removeLatencyFromFirstPacketTime config (#8446) (a8bc7e2)
- Add additional codec & channel count configs to Adaptation Set Criteria (#8597) (ce830d7)
- Add backToLiveWhenOutsideOfLiveWindow config (#8575) (9406905)
- Add Device API (#8210) (970d775)
- Add getChaptersAsync method (#8541) (ba56bae)
- Add isVideoOnly method (#8641) (f86245c)
- Add more info on src= tracks when the browser support it (#8299) (9021bd8)
- Add more info on src= tracks when the browser support it (#8302) (77a3f56)
- Add oldEncrypted and newEncrypted to boundarycrossed event (#8421) (fe332bd)
- Add queue manager (#8649) (3daeac6)
- Add useTrickPlayTrackIfAvailable method (#8594) (ed69267)
- Added MetadataAdded event (#8282) (f3a8113)
- Ads: Add allowStartInMiddleOfInterstitial config (#8289) (c012b9c)
- Ads: Support latest spec of background in DASH overlays (#8556) (91034c4)
- Ads: Update DASH overlay implementation (#8503) (3fab47c)
- Cast: Transfer side-loaded text/thumbnail/chapter tracks (#8553) (1cf5cad)
- Create a new simple API for Video (#8454) (99a6f25)
- DASH: Add support for "Spoken Subtitles" in tva:metadata:cs:AudioPurpose (#8364) (ab01bb7)
- DASH: Parse ProducerReferenceTime nodes (#8439) (ce08da5)
- Demo: Modernize cast receiver demo (#8484) (22bc6aa)
- Expose Vast ad ID (#8477) (0a651cc)
- Handle audio focus events (#8427) (8dd330f)
- Improve stats when using src= in Safari (#8304) (251ff28)
- LCEVC: Add buffering support to dual track implementation (#8516) (39ae0e6)
- net: Add networking config (#8306) (36db472)
- new TextDisplayer implementation to allow selecting subtitles via native API and controls (#8520) (724b0b2)
- Offline: Allow no timeout when opening IndexedDB database (#8372) (8cd2c01)
- Offline: Make timeout for opening IndexedDB configurable (#8366) (5752a21)
- Preload: Allow use custom config when creating a PreloadManager (#8647) (6efaf53)
- provide option to disable usage of source elements in MSE (#8386) (b0cd08b)
- Provide Segment Reference to ABR Manager (via the request context) (#8316) (d9b0e85)
- Shrink the size of language-mapping-list.js (#8526) (7331e01)
- Simplicate Image/Thumbnails API (#8266) (d2f3657)
- Simplicate Text and Chapters APIs (#8264) (c0455d7)
- Simplify getStats to support MSE-AirPlay (#8309) (2d8ad94)
- Stats: Add current codecs to stats (#8418) (cbcba99)
- UI: Add scrollbar if necessary to statistics container (#8424) (eecf58f)
- UI: Allow config cast sender URL (#8485) (aa502ce)
- UI: Allow forceDisconnect when destroy the UI (#8472) (7c3df3b)
- UI: Allow hide/show controls on tap (#8398) (06a8785)
- UI: Customize scrollbar style (#8419) (a08d464)
- UI: Disable add a cast button automatically on new UI (#8449) (b0b556e)
- UI: Fix style of cast button on modern UI (#8451) (a2475e8)
- UI: Hide volume slider when not hovering over the mute button (#8426) (74fda8b)
- UI: Modernization of the UI (#8409) (1c85396)
- UI: Optimize default UI for small screens (#8436) (f760dbd)
- UI: Optimize the buttons that appear when using a Smart TV (#8429) (a8fc3bd)
- UI: Resolution selector should display width for vertical videos (#8502) (94bdb7c)
- UI: Show current playback rate and quality without hover (#8437) (9992d67)
- UI: Show the quality mark when using src= (#8511) (0aa886d)
- UI: Update some selectors after loading content always (#8465) (20659db)
- Use Date for playback start time (#8415) (fc59408)
Bug Fixes
- Add a small fudge to prefetch eviction (#8470) (9d3b586)
- Add new crossBoundaryStrategy for Apple browsers (#8345) (3c60254)
- Add new parameters to thumbnails in order to work with cast proxy (#8554) (023d06a)
- Add optional content workaround to force ENCA.ChannelCount to 2 for EAC-3 Audio init segments (#8517) (bd97fb1)
- Add support to crossBoundaryStrategy when using HLS (#8343) (6d5cdb6)
- Add vp9 to normalized codec list (#8416) (c6459d5)
- Ads: Destroy preloadManagers on stop interstitials (#8268) (ace6cb7)
- Ads: Fix overlay interstitial when the seeked is outside of the current window (#8288) (9fd5900)
- Allow use Chapter API on browsers without track element support (#8515) (6271282)
- Allow use isLive, seekRange and isAudioOnly when using remote playback (#8629) (dabb562)
- Avoid installing/uninstalling PatchedMediaKeysApple polyfill twice (#8593) (fb120f8)
- Avoid reset MSE engine when using remote playback (#8626) (ce9db86)
- Cancel trick play when current time catch the seek range (#8410) (e0770ff)
- Cast: Add response to async calls on cast proxy (#8549) (c6bfc34)
- Cast: Fix getChaptersTracks method while casting (#8552) (586051d)
- CEA: cache and restore cea decoders based on the period continuity for dash content that uses SegmentTemplate (#8378) (6e029d1)
- changelog: Add missing ref to PR #8156 in v4.14.0 (#8259) (b5a261a)
- Check addTextTrack in video (#8388) (70a8317)
- Closure compiler removes call to modifyCueCallback in src= mode (#8261) (b7865b4)
- Count line break characters as ASCII (#8376) (b809646), closes #8336
- DASH: Fix infinite buffering on end of content (#8677) (6b976db), closes #8672
- DASH: Fix live playback with Period duration (#8493) (a7abb29), closes #8481
- DASH: Inconsistent DRM across periods when using clearkeys (#8602) (3c32f7a), closes #8559
- Demo: Fix bad tooltip position of last control panel element (#8658) (8065cf9), closes #8655
- Detect and skip stall correctly (#8390) (fdd9652)
- Detect screen change to update ABR according HDR vs SDR (#8606) (5413b5f)
- Disable translate of cues when using UITextDisplayer (#8636) (b987662)
- Do not fire metadataadded event for duplicated cues (#8617) (ffd048c)
- Don't allow MSE reset in middle of a reset (#8338) (1c2c8c3)
- Don't return video tracks when using remote playback (#8627) (79e62bc)
- External text tracks in src mode related issues (#8527) (f9c8028)
- Fix audio selection by channel count (#8286) (b9625c7)
- Fix buffering event on native playback (#8310) (a18b37f)
- Fix cast proxy args for side-loaded tracks (#8560) (d7f056a)
- Fix config failures with multiple references to an input array (#8585) (5c94164), closes #8478
- Fix cross boundary when playing at higher playbackRates (#8392) (05f3318)
- Fix destroy CastProxy on browser without Cast support (#8294) (b2a1d35)
- Fix dispatch complete event when the percentage is greater than 100 (#8643) (81b2ff5)
- Fix exception updating partial config with deprecated fields (#8512) (9f18e9f)
- Fix Firefox PlayReady support (#8497) (f6df1f0)
- Fix garbage-collection issue in safari on mediaCapabilities polyfill (#8613) (394ed7b)
- Fix getAudioTracks when audioId is null but exists originalAudioId (#8462) (82b9541)
- Fix getAudioTracks when using remote playback (#8630) (952590e)
- Fix getVideoTracks when videoId is null but exists originalVideoId (#8463) (5627153)
- Fix initial buffering state when we load a stream (#8500) (ed48de9)
- Fix MediaCapabilities polyfill on Vizio (#8542) (d15e21c)
- Fix memory leak on Metadata and EMSG timelines (#8570) (59a1254), closes #8535
- Fix metadata timestamp when using raw segments (#8654) (602515c)
- Fix MSE recovery on Apple platform (#8341) (82da6b1)
- Fix NTP conversion on Tizen 3 (#8444) (89584bf)
- Fix onUpdateEnd when the MSE engine has been destroyed (#8591) (f5ea7ad)
- Fix race condition stoping timers (#8530) (45e7c39)
- Fix side-loaded track when resuming local and cast again (#8564) (9a17243)
- Fix text visibility when switching between stream with text and without text (#8572) (e1b96d3)
- Fixes eme-encryption-scheme-polyfill, null encryptionScheme is valid (#8599) (e3a438b), closes #8596
- FRMA generation (#8367) (9c517a9)
- Handle missing window.matchMedia API (#8385) (4d8f855)
- Handle null response body for fetch responses (#8384) (8e0d45f)
- Handle updateend event on duration reduction (#8403) (20bcfdd)
- HLS: Add key ids to Fairplay DRM parser (#8371) (25021bb)
- HLS: Avoid duplicate init segment request when using SAMPLE-AES (#8361) (4517999)
- HLS: Do not skip DateRanges based on ID (#8638) (c6b53b3)
- HLS: Fix disableAudio and disableVideo when loading a media playlist (#8642) (ccd31aa)
- HLS: Fix HLS live playback on older Webkit STBs (#8325) (02a29a0), closes #8324
- HLS: Fix MP4 data segment being parsed as MPEG2-TS (#8612) (a53f82b)
- HLS: Fix mp4 detection when the mimetype is application/octet-stream (#8459) (b4d9b43)
- HLS: Fix queryData to prevent url params percent encoding (#8346) (3b3c95a)
- HLS: Fix text tracks disappear after seek (#8494) (995da46)
- HLS: Fix variable substitution when using relative paths (#8350) (922dfee)
- HLS: Handle redirect URLs correctly (#8331) (8d4087e)
- HLS: Supports SUPPLEMENTAL-CODECS with muxed audio (#8323) (e7d1734)
- Improve boundary gap mitigation at DASH period transitions (#8344) (c46963f)
- Improve maxResolution detection on Tizen (#8365) (ee1926e)
- Keep unique references in getAudioTracks (#8460) (34b5b4a)
- LCEVC: Ensure unique originalVideoId for LCEVC dual-track (#8562) (4ef126b)
- Make shaka.util.Lazy work with null (#8267) (e0a57bb)
- Make sure we are calling setLiveSeekableRange and clearLiveSeekableRange at the correct time (#8523) (ddd97f0)
- Make sure we are calling setLiveSeekableRange and clearLiveSeekableRange at the correct time (#8569) (6a9ee08)
- Mixed clear/encrypted playback on Safari MSE (#8354) (5f18231)
- net: Fix "Payload length does not match range requested bytes" when using open end (#8651) (c19cbaf)
- Offline: Fix HLS-AES download (#8374) (60c6b19)
- Offline: Handle missing window.matchMedia API (#8442) (3dbf4c4)
- Only check key status changes when drm engine is available (#8589) (892be53)
- Only create shaka-text-container when necessary (#8581) (3618d4f)
- Only expand robustness on each stream once (#8458) (9ba8ceb), closes #8408
- Only schedule an update on reset when we are not clearing the buffer (#8340) (d1be137)
- Persist selected audio track role after variant update in
selectVariantTrack(#8249) (b30e0ce), closes #8248 - preload: Fix preload segments in some cases (#8401) (da271ac)
- Prevent unhandled rejections on segment fetch failures (#8313) (8ba2722)
- Read TRUN data_offset as signed int (#8383) (7e827ac)
- Remove active audio channel count from default pref based criteria (#8674) (b8ff4e9)
- Reset external tracks when unloading in cast proxy (#8573) (5ec05ca)
- Reset lastMediaSourceReset when seeking to unbuffered part (#8339) (deb53fc)
- Sony Bravia TV Playready DRM Failure (#8577) (f987f45)
- Subtitles appearing twice when switching to Fullscreen on iOS (#8476) (9042872)
- Support more Dolby codec notations (#8387) (933a4f2)
- Text tracks with src= on Safari & UITextDisplayer are sometimes rendered natively (#8256) (306b682)
- Try to reset MSE on STREAMING_NOT_ALLOWED error (#8625) (e1673cd)
- UI: Add missing replay icon to big play button (#8648) (f2cb927)
- UI: Avoid hide controls when seeking (#8303) (6cc035a)
- UI: Avoid show resolution bandwidth when it's not necessary (#8440) (bb1fdb4)
- UI: Avoid show resolution selector when using remote playback (#8628) (d60dbf3)
- UI: Check remote availability on remote button (#8453) (03fd784)
- UI: Create watermark element only when necessary (#8551) (95e6d01)
- UI: Disable doubleClickForFullscreen while casting (#8488) (12feb3f)
- UI: Disable save video frame button while casting (#8258) (e71d94c)
- UI: Display max segment duration in seconds (#8305) (1c42190)
- UI: Don't allow click on the buttons when the UI is not visible (#8396) (ea07907)
- UI: Don't cover useless space with the position in the thumbnail image (#8322) (30af37e)
- UI: Don't hide the UI when using the wheel over the UI (#8425) (d761dae)
- UI: Filter audio qualities when bandwidth is missing (#8650) (370b042)
- UI: Fix a11y issue with shaka.ui.AdInfo (#8420) (46c998d)
- UI: Fix display language when showing the codec name (#8455) (48f217e)
- UI: Fix duplicate visibility events (#8665) (b6ab228), closes #8656
- UI: Fix erroneous current time when dragging (#8558) (eb83157)
- UI: Fix get thumbnails while casting (#8509) (43389b2)
- UI: Fix position of menus and tooltips when the seekbar is missing (#8639) (9d4e4d0)
- UI: Fix seek on the seekbar at the init (#8555) (5d27b56)
- UI: Fix seekbar allows seeking even when hidden (#8540) (1a82e27)
- UI: Fix some bugs when joining an existing cast session (#8452) (9112ca1)
- UI: Fix thumbnail exception when the thumbnails doesn't exist (#8318) (9010483)
- UI: Fix transition from FullScreen to PiP in Safari (#8566) (42c08f6)
- UI: Fix UI behaviour when switching between PiP and fullscreen and vice versa (#8544) (d274d38)
- UI: Fix visibility events on the UI (#8619) (95cf682)
- UI: Fix visibility events while casting (#8574) (2693bc7)
- UI: honors singleClickForPlayAndPause when made a single tap with seekOnTaps = true (#8393) (0d7838e)
- UI: Improve layout of current time container above hovered seek bar (#8412) (a27434b), closes #8411
- UI: Keep the current position gradient when seeked (#8571) (7b98c10), closes #8548
- UI: Make UI display 4096x2160 (DCI 4k) video as also being "4k" (#8359) (00ae291)
- UI: Only create VR canvas when necessary (#8580) (6c3f71b)
- UI: Only show the volume bar on hover (#8433) (1faa11e)
- UI: Optimize portrait thumbnail display (#8274) (1f336dd)
- UI: Reset quality mark when switching from video stream to audio only stream (#8605) (1d04801)
- UI: Save track preferences for casting purposes (#8489) (e13e125)
- UI: Show the remote button when we already connected (#8461) (09d2041)
- UI: Show the video codec only when there are two codecs for the same resolution (#8407) (b93303c)
- UI: Show time when the thumbnail is not available (#8510) (fefe61f)
- UI: Sync volume and mute values when loading a new content or casting (#8487) (8555da7)
- Update eme-encryption-scheme-polyfill (#8546) (e54d2dc)
- Update region observer with new rules for small regions (#8275) (2f18b47)
- Use proper method for checking is object an array (#8644) (769ced5)
- WebOS: Do not throw error during parsing ID3 (#8623) (b2595ce)
Performance Improvements
- AdaptationSetCriteria improvements (#8287) (78a16d9)
- Ads: Improve presentation time of pre-roll interstitials (#8284) (fad638e)
- Ads: Preload images on interstitials (#8269) (c49102c)
- ContentWorkarounds: Do not override codec twice (#8358) (b9c5571)
- DASH: Release period combiner after parsing a VOD (#8443) (396bdf6)
- Do not process stream DRM info several times (#8505) (9678b1c)
- HLS: Make initial segment requests in parallel (#8337) (5f4d351)
- HLS: Reduce load time when loading in the player a media playlist (#8333) (aed6471)
- Init source buffers synchronously (#8646) (34827b4)
- net: Avoid parsing headers twice (#8618) (cd9c850)
- Optimize DRM compatibility check across streams (#8652) (784246b)
- Optimize getAllThumbnails() (#8525) (f15d627)
- Remove extendedType when checking isTypeSupported on Tizen (#8507) (e3d8140)
- Remove redundant collection in Streaming Engine (#8645) (c81e9a8)
- Stop parsing the mp4 when the init segment is encrypted on ContentWorkarounds (#8353) (fd61961)