diff --git a/package.json b/package.json index 76dc666acb252..0dd7609bd9543 100644 --- a/package.json +++ b/package.json @@ -63,7 +63,7 @@ "googlevideo": "^4.1.1", "marked": "^18.0.10", "process": "^0.11.10", - "shaka-player": "^5.1.12", + "shaka-player": "^5.2.7", "swiper": "^14.1.0", "vue": "^3.5.41", "vue-i18n": "^11.4.8", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9e55a45a72db8..fdf4b753a4be3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -51,8 +51,8 @@ importers: specifier: ^0.11.10 version: 0.11.10 shaka-player: - specifier: ^5.1.12 - version: 5.1.12 + specifier: ^5.2.7 + version: 5.2.7 swiper: specifier: ^14.1.0 version: 14.1.0 @@ -2867,6 +2867,10 @@ packages: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} + fs-extra@11.3.5: + resolution: {integrity: sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg==} + engines: {node: '>=14.14'} + fs-extra@11.4.0: resolution: {integrity: sha512-EQsFzMUJkCKGr1ePqlYADkIUmHW1s3ZXr5Yqy6wbGrfUCphpl2maM/kyOIRA2HpP3AaFQTZXD4ldjek+nccddA==} engines: {node: '>=14.14'} @@ -3597,8 +3601,8 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - meriyah@7.3.1: - resolution: {integrity: sha512-642iQ3T0ZBXw+qrFo9m50CsdzSz9Tn0HtSKN3WxWlTXfcHUZwunxU4gMoMDIQzzOhwtkLOLeBs9GXs7NwDI2nA==} + meriyah@7.3.2: + resolution: {integrity: sha512-uFPXbsoxaEd7PafMz3K/n/Z3kXz7iZBJtYU0VQB/kcV7i33+JghLTKweabLir480FUsyLz6gUIj4LW7kCQ35TA==} engines: {node: '>=20.0.0'} micromatch@4.0.8: @@ -4512,8 +4516,8 @@ packages: setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - shaka-player@5.1.12: - resolution: {integrity: sha512-luGIzJ/H201aY0Hobs5853vY1eRJXPHH+u3oSWiTAYoufq5s/yIbRZS1QwCsj3f3Fyxc2C3HfptfI0brjE+RIQ==} + shaka-player@5.2.7: + resolution: {integrity: sha512-4qFQcLdAa0sHnTaXZ7dDLLh/X0TffX8BUoW6+eD4JFkUssGVhzNZsMfqNivDwIrzLTcXXZefvFNYJUUikXJDrg==} shallow-clone@3.0.1: resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} @@ -5284,7 +5288,7 @@ snapshots: '@babel/helper-validator-option': 8.0.0 browserslist: 4.28.7 lru-cache: 11.5.1 - semver: 7.8.5 + semver: 7.8.4 '@babel/helper-create-class-features-plugin@8.0.1(@babel/core@8.0.1)': dependencies: @@ -5961,7 +5965,7 @@ snapshots: '@malept/cross-spawn-promise': 2.0.0 debug: 4.4.3 dir-compare: 4.2.0 - fs-extra: 11.4.0 + fs-extra: 11.3.5 minimatch: 9.0.9 plist: 3.1.0 transitivePeerDependencies: @@ -8248,11 +8252,18 @@ snapshots: jsonfile: 6.2.1 universalify: 2.0.1 + fs-extra@11.3.5: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.1 + universalify: 2.0.1 + fs-extra@11.4.0: dependencies: graceful-fs: 4.2.11 jsonfile: 6.2.1 universalify: 2.0.1 + optional: true fs-extra@7.0.1: dependencies: @@ -8941,7 +8952,7 @@ snapshots: merge2@1.4.1: {} - meriyah@7.3.1: {} + meriyah@7.3.2: {} micromatch@4.0.8: dependencies: @@ -9773,7 +9784,7 @@ snapshots: setprototypeof@1.2.0: {} - shaka-player@5.1.12: {} + shaka-player@5.2.7: {} shallow-clone@3.0.1: dependencies: @@ -10243,7 +10254,7 @@ snapshots: dependencies: bluebird: 3.7.2 duplexer2: 0.1.4 - fs-extra: 11.4.0 + fs-extra: 11.3.5 graceful-fs: 4.2.11 node-int64: 0.4.0 @@ -10578,4 +10589,4 @@ snapshots: dependencies: '@bufbuild/protobuf': 2.12.1 fflate: 0.8.3 - meriyah: 7.3.1 + meriyah: 7.3.2 diff --git a/src/renderer/components/ft-shaka-video-player/ft-shaka-video-player.js b/src/renderer/components/ft-shaka-video-player/ft-shaka-video-player.js index 44be4a89407a7..5fa82d63df74e 100644 --- a/src/renderer/components/ft-shaka-video-player/ft-shaka-video-player.js +++ b/src/renderer/components/ft-shaka-video-player/ft-shaka-video-player.js @@ -264,7 +264,8 @@ export default defineComponent({ watch(displayVideoPlayButton, (newValue) => { ui.configure({ - bigButtons: newValue ? ['play_pause'] : [] + bigButtons: newValue ? ['play_pause_buffering'] : [], + showBufferingSpinner: !newValue }) }) @@ -316,17 +317,29 @@ export default defineComponent({ return parseInt(store.getters.getMaxVideoPlaybackRate) }) + watch(maxVideoPlaybackRate, (newValue) => { + ui.configure({ + playbackRateSliderMax: newValue + }) + }) + const videoPlaybackRateInterval = computed(() => { return parseFloat(store.getters.getVideoPlaybackRateInterval) }) + watch(videoPlaybackRateInterval, (newValue) => { + ui.configure({ + playbackRateSliderMin: newValue + }) + }) + const playbackRates = computed(() => { const interval = videoPlaybackRateInterval.value const playbackRates = [] let i = interval while (i <= maxVideoPlaybackRate.value) { - playbackRates.unshift(i) + playbackRates.push(i) i += interval i = parseFloat(i.toFixed(2)) } @@ -634,7 +647,7 @@ export default defineComponent({ // Electron doesn't like YouTube's vp9 VR video streams and throws: // "CHUNK_DEMUXER_ERROR_APPEND_FAILED: Projection element is incomplete; ProjectionPoseYaw required." // So use the AV1 and h264 codecs instead which it doesn't reject - preferredVideoCodecs: typeof props.vrProjection === 'string' ? ['av01', 'avc1'] : [] + preferredVideo: typeof props.vrProjection === 'string' ? [{ codec: 'av01' }, { codec: 'avc1' }] : [] } } @@ -794,8 +807,7 @@ export default defineComponent({ 'ft_skip_previous', 'play_pause', 'ft_skip_next', - 'mute', - 'volume', + 'mute_volume', 'time_and_duration', 'spacer' ] @@ -940,8 +952,11 @@ export default defineComponent({ }, // these have their own watchers - bigButtons: displayVideoPlayButton.value ? ['play_pause'] : [], + bigButtons: displayVideoPlayButton.value ? ['play_pause_buffering'] : [], + showBufferingSpinner: !displayVideoPlayButton.value, enableFullscreenOnRotation: enterFullscreenOnDisplayRotate.value, + playbackRateSliderMax: maxVideoPlaybackRate.value, + playbackRateSliderMin: videoPlaybackRateInterval.value, playbackRates: playbackRates.value, tapSeekDistance: defaultSkipInterval.value, diff --git a/src/renderer/components/ft-shaka-video-player/player-components/AudioTrackSelection.js b/src/renderer/components/ft-shaka-video-player/player-components/AudioTrackSelection.js index 80d8352b921be..910ae972ac3af 100644 --- a/src/renderer/components/ft-shaka-video-player/player-components/AudioTrackSelection.js +++ b/src/renderer/components/ft-shaka-video-player/player-components/AudioTrackSelection.js @@ -44,21 +44,16 @@ export class AudioTrackSelection extends shaka.ui.SettingsMenu { this.updateAudioTracks_() }) - if (this.isSubMenu) { - this.eventManager.listen(this.controls, 'submenuopen', () => { - this.updateAudioTracks_() - }) - - this.eventManager.listen(this.controls, 'submenuclose', () => { - this.updateAudioTracks_() - }) - } - this.updateLocalisedStrings_() this.updateAudioTracks_() } + /** @override */ + checkAvailability() { + this.updateAudioTracks_() + } + /** * @private */ @@ -79,6 +74,7 @@ export class AudioTrackSelection extends shaka.ui.SettingsMenu { for (const track of tracks) { const button = document.createElement('button') + button.role = 'menuitemradio' button.addEventListener('click', () => { this.onAudioTrackSelected_(track) }) @@ -92,8 +88,10 @@ export class AudioTrackSelection extends shaka.ui.SettingsMenu { button.appendChild(this._checkmarkIcon) span.classList.add('shaka-chosen-item') - button.ariaSelected = 'true' + button.ariaChecked = 'true' this.currentSelection.textContent = span.textContent + } else { + button.ariaChecked = 'false' } menu.appendChild(button) diff --git a/src/renderer/components/ft-shaka-video-player/player-components/AutoplayToggle.js b/src/renderer/components/ft-shaka-video-player/player-components/AutoplayToggle.js index 6ce4988bea1f8..1d81e6fb28cee 100644 --- a/src/renderer/components/ft-shaka-video-player/player-components/AutoplayToggle.js +++ b/src/renderer/components/ft-shaka-video-player/player-components/AutoplayToggle.js @@ -62,16 +62,6 @@ export class AutoplayToggle extends shaka.ui.Element { this.updateLocalisedStrings_() }) - if (this.isSubMenu) { - this.eventManager.listen(this.controls, 'submenuopen', () => { - this.updateVisibility_() - }) - - this.eventManager.listen(this.controls, 'submenuclose', () => { - this.updateVisibility_() - }) - } - this.updateLocalisedStrings_() } @@ -86,8 +76,8 @@ export class AutoplayToggle extends shaka.ui.Element { this.button_.ariaLabel = this.autoplayEnabled_ ? i18n.global.t('Video.Player.Autoplay is on') : i18n.global.t('Video.Player.Autoplay is off') } - /** @private */ - updateVisibility_() { + /** @overide */ + checkAvailability() { if (this.isSubMenuOpened) { this.button_.classList.add('shaka-hidden') } else { diff --git a/src/renderer/components/ft-shaka-video-player/player-components/FullWindowButton.js b/src/renderer/components/ft-shaka-video-player/player-components/FullWindowButton.js index 95d462c810961..866eb4aaad302 100644 --- a/src/renderer/components/ft-shaka-video-player/player-components/FullWindowButton.js +++ b/src/renderer/components/ft-shaka-video-player/player-components/FullWindowButton.js @@ -62,16 +62,6 @@ export class FullWindowButton extends shaka.ui.Element { this.updateLocalisedStrings_() }) - if (this.isSubMenu) { - this.eventManager.listen(this.controls, 'submenuopen', () => { - this.updateVisibility_() - }) - - this.eventManager.listen(this.controls, 'submenuclose', () => { - this.updateVisibility_() - }) - } - this.updateLocalisedStrings_() } @@ -88,8 +78,8 @@ export class FullWindowButton extends shaka.ui.Element { this.nameSpan_.textContent = this.button_.ariaLabel = newLabel } - /** @private */ - updateVisibility_() { + /** @override */ + checkAvailability() { if (this.isSubMenuOpened) { this.button_.classList.add('shaka-hidden') } else { diff --git a/src/renderer/components/ft-shaka-video-player/player-components/LegacyQualitySelection.js b/src/renderer/components/ft-shaka-video-player/player-components/LegacyQualitySelection.js index 70179771be2ae..d46304f672c20 100644 --- a/src/renderer/components/ft-shaka-video-player/player-components/LegacyQualitySelection.js +++ b/src/renderer/components/ft-shaka-video-player/player-components/LegacyQualitySelection.js @@ -41,6 +41,8 @@ export class LegacyQualitySelection extends shaka.ui.SettingsMenu { for (const format of sortedLegacyFormats) { const button = document.createElement('button') + button.role = 'menuitemradio' + button.ariaChecked = 'false' button.classList.add('legacy-resolution') this.eventManager.listen(button, 'click', () => { @@ -65,17 +67,16 @@ export class LegacyQualitySelection extends shaka.ui.SettingsMenu { this.updateResolutionSelection_() }) - if (this.isSubMenu) { - this.eventManager.listen(this.controls, 'submenuopen', () => { - this.button.classList.add('shaka-hidden') - }) + this.updateResolutionSelection_() + } - this.eventManager.listen(this.controls, 'submenuclose', () => { - this.button.classList.remove('shaka-hidden') - }) + /** @overide */ + checkAvailability() { + if (this.isSubMenuOpened) { + this.button.classList.add('shaka-hidden') + } else { + this.button.classList.remove('shaka-hidden') } - - this.updateResolutionSelection_() } /** @private */ @@ -91,7 +92,7 @@ export class LegacyQualitySelection extends shaka.ui.SettingsMenu { previousSpan.classList.remove('shaka-chosen-item') const button = previousSpan.parentElement - button.ariaSelected = 'false' + button.ariaChecked = 'false' this._checkmarkIcon.remove() } @@ -102,7 +103,7 @@ export class LegacyQualitySelection extends shaka.ui.SettingsMenu { const button = this.menu.querySelectorAll('.legacy-resolution')[index] const span = button.querySelector('span') - button.ariaSelected = 'true' + button.ariaChecked = 'true' span.classList.add('shaka-chosen-item') diff --git a/src/renderer/components/ft-shaka-video-player/player-components/ScreenshotButton.js b/src/renderer/components/ft-shaka-video-player/player-components/ScreenshotButton.js index 0c083c8c6e9bf..b2084aa6e694b 100644 --- a/src/renderer/components/ft-shaka-video-player/player-components/ScreenshotButton.js +++ b/src/renderer/components/ft-shaka-video-player/player-components/ScreenshotButton.js @@ -45,16 +45,6 @@ export class ScreenshotButton extends shaka.ui.Element { this.updateLocalisedStrings_() }) - if (this.isSubMenu) { - this.eventManager.listen(this.controls, 'submenuopen', () => { - this.updateVisibility_() - }) - - this.eventManager.listen(this.controls, 'submenuclose', () => { - this.updateVisibility_() - }) - } - this.updateLocalisedStrings_() } @@ -67,8 +57,8 @@ export class ScreenshotButton extends shaka.ui.Element { this.nameSpan_.textContent = this.button_.ariaLabel = label } - /** @private */ - updateVisibility_() { + /** @override */ + checkAvailability() { if (this.isSubMenuOpened) { this.button_.classList.add('shaka-hidden') } else {