diff --git a/materialious/android/app/build.gradle b/materialious/android/app/build.gradle index dcbeaf08..148758fd 100644 --- a/materialious/android/app/build.gradle +++ b/materialious/android/app/build.gradle @@ -7,8 +7,8 @@ android { applicationId "us.materialio.app" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 178 - versionName "1.12.6" + versionCode 179 + versionName "1.12.7" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" aaptOptions { // Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps. diff --git a/materialious/electron/materialious.metainfo.xml b/materialious/electron/materialious.metainfo.xml index 678490f0..a58770e5 100644 --- a/materialious/electron/materialious.metainfo.xml +++ b/materialious/electron/materialious.metainfo.xml @@ -75,7 +75,11 @@ - + + + https://github.com/Materialious/Materialious/releases/tag/1.12.7 + + https://github.com/Materialious/Materialious/releases/tag/1.12.6 diff --git a/materialious/electron/package.json b/materialious/electron/package.json index d5df0fe8..bd9f030f 100644 --- a/materialious/electron/package.json +++ b/materialious/electron/package.json @@ -1,6 +1,6 @@ { "name": "Materialious", - "version": "1.12.6", + "version": "1.12.7", "description": "Modern material design for Invidious.", "author": { "name": "Ward Pearce", diff --git a/materialious/electron/src/setup.ts b/materialious/electron/src/setup.ts index 6af16323..6a3cb751 100644 --- a/materialious/electron/src/setup.ts +++ b/materialious/electron/src/setup.ts @@ -187,7 +187,6 @@ export class ElectronCapacitorApp { } else { this.loadMainWindow(this); } - globalShortcut.register('Control+Shift+I', () => { this.MainWindow.webContents.toggleDevTools(); }); diff --git a/materialious/package.json b/materialious/package.json index 0e8a6af8..b5db1c46 100644 --- a/materialious/package.json +++ b/materialious/package.json @@ -1,6 +1,6 @@ { "name": "materialious", - "version": "1.12.6", + "version": "1.12.7", "private": true, "scripts": { "dev": "vite dev", diff --git a/materialious/src/lib/components/Player.svelte b/materialious/src/lib/components/Player.svelte index 0f00bdbe..b03a256b 100644 --- a/materialious/src/lib/components/Player.svelte +++ b/materialious/src/lib/components/Player.svelte @@ -78,7 +78,6 @@ let playerCurrentPlaybackState = $state(false); let playerCurrentTime = $state(0); let playerMaxKnownTime = $state(0); - let playerIsSeeking = $state(false); let playerIsBuffering = $state(false); let playerVolume = $state(0); let playerSettings: 'quality' | 'speed' | 'language' | 'root' = $state('root'); @@ -86,6 +85,10 @@ let playerCurrentVideoTrack: shaka.extern.VideoTrack | undefined = $state(undefined); let playerCurrentAudioTrack: shaka.extern.AudioTrack | undefined = $state(undefined); let playerLoop = $state($playerAlwaysLoopStore); + let playerTimelineTooltipVisible: boolean = $state(false); + let playerTimelineTimeHover: number = $state(0); + let playerTimelineMouseX: number = $state(0); + let playerTimelineLastUpdate: number = 0; const STORAGE_KEY_VOLUME = 'shaka-preferred-volume'; @@ -332,6 +335,11 @@ playerCurrentAudioTrack = audioTracks.find((track) => track.active); } + function handleTimeChange(event: Event) { + playerCurrentTime = parseFloat((event.target as HTMLInputElement).value); + if (playerElement) playerElement.currentTime = playerCurrentTime; + } + async function loadVideo() { showVideoRetry = false; @@ -775,8 +783,9 @@ }); playerElement?.addEventListener('timeupdate', () => { - if (playerIsSeeking) return; - playerCurrentTime = playerElement?.currentTime ?? 0; + if (!playerElement) return; + + playerCurrentTime = playerElement.currentTime ?? 0; if (playerMaxKnownTime === 0 || playerCurrentTime > playerMaxKnownTime) { playerMaxKnownTime = Number(playerElement?.currentTime); @@ -863,6 +872,24 @@ } } + function handleMouseMove(event: MouseEvent) { + const currentTime = Date.now(); + if (currentTime - playerTimelineLastUpdate < 60) return; + playerTimelineLastUpdate = currentTime; + + const input = event.target as HTMLInputElement; + const boundingRect = input.getBoundingClientRect(); + playerTimelineMouseX = event.clientX - boundingRect.left; + + const percent = playerTimelineMouseX / input.clientWidth; + playerTimelineTimeHover = Math.round(percent * (data.video.lengthSeconds || 0)); + playerTimelineTooltipVisible = true; + } + + function handleMouseLeave(): void { + playerTimelineTooltipVisible = false; + } + onDestroy(async () => { if (Capacitor.getPlatform() === 'android') { if (!$isAndroidTvStore) { @@ -888,13 +915,9 @@ Mousetrap.unbind(['left', 'right', 'space', 'c', 'f', 'shift+left', 'shift+right']); - if (watchProgressTimeout) { - clearTimeout(watchProgressTimeout); - } + if (watchProgressTimeout) clearTimeout(watchProgressTimeout); - if (sabrAdapter) { - sabrAdapter.dispose(); - } + if (sabrAdapter) sabrAdapter.dispose(); if (player) { player.unload(); @@ -930,13 +953,15 @@ {data.video.title} {/if} -

- {#if data.video.liveNow} - {$_('thumbnail.live')} - {:else} - {videoLength(playerCurrentTime)} / {videoLength(data.video.lengthSeconds)} - {/if} -

+ {#if !hideControls} +

+ {#if data.video.liveNow} + {$_('thumbnail.live')} + {:else} + {videoLength(playerCurrentTime)} / {videoLength(data.video.lengthSeconds)} + {/if} +

+ {/if}
{#if playerIsBuffering} @@ -950,21 +975,28 @@
+ {#if playerTimelineTooltipVisible} +
+ {videoLength(playerTimelineTimeHover)} +
+ {/if} +