diff --git a/materialious/android/app/build.gradle b/materialious/android/app/build.gradle index d7e3df73..ee7ad688 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 99 - versionName "1.7.17" + versionCode 100 + versionName "1.7.18" 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 87cfb0b5..401b7ee5 100644 --- a/materialious/electron/materialious.metainfo.xml +++ b/materialious/electron/materialious.metainfo.xml @@ -60,7 +60,11 @@ - + + + https://github.com/Materialious/Materialious/releases/tag/1.7.18 + + https://github.com/Materialious/Materialious/releases/tag/1.7.17 diff --git a/materialious/electron/package-lock.json b/materialious/electron/package-lock.json index 9af6e2c2..a13de3d1 100644 --- a/materialious/electron/package-lock.json +++ b/materialious/electron/package-lock.json @@ -1,12 +1,12 @@ { "name": "Materialious", - "version": "1.7.17", + "version": "1.7.18", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "Materialious", - "version": "1.7.17", + "version": "1.7.18", "license": "MIT", "dependencies": { "@capacitor-community/electron": "^5.0.0", diff --git a/materialious/electron/package.json b/materialious/electron/package.json index afebc13e..2de4195a 100644 --- a/materialious/electron/package.json +++ b/materialious/electron/package.json @@ -1,6 +1,6 @@ { "name": "Materialious", - "version": "1.7.17", + "version": "1.7.18", "description": "Modern material design for Invidious.", "author": { "name": "Ward Pearce", diff --git a/materialious/package.json b/materialious/package.json index 0a164a3d..40018caa 100644 --- a/materialious/package.json +++ b/materialious/package.json @@ -1,6 +1,6 @@ { "name": "materialious", - "version": "1.7.17", + "version": "1.7.18", "private": true, "scripts": { "dev": "vite dev", diff --git a/materialious/src/lib/components/Player.svelte b/materialious/src/lib/components/Player.svelte index 9f530ee2..59a65271 100644 --- a/materialious/src/lib/components/Player.svelte +++ b/materialious/src/lib/components/Player.svelte @@ -9,6 +9,7 @@ import { NavigationBar } from '@hugotomazi/capacitor-navigation-bar'; import { type Page } from '@sveltejs/kit'; import { GoogleVideo, Protos } from 'googlevideo'; + import ISO6391 from 'iso-639-1'; import 'shaka-player/dist/controls.css'; import shaka from 'shaka-player/dist/shaka-player.ui'; import { SponsorBlock, type Category, type Segment } from 'sponsorblock-api'; @@ -38,7 +39,6 @@ interface Props { data: { video: VideoPlay; content: PhasedDescription; playlistId: string | null }; - audioMode?: boolean; isSyncing?: boolean; isEmbed?: boolean; segments?: Segment[]; @@ -47,7 +47,6 @@ let { data, - audioMode = false, isEmbed = false, segments = $bindable([]), playerElement = $bindable() @@ -76,13 +75,13 @@ localStorage.setItem(STORAGE_KEY_VOLUME, playerElement.volume.toString()); } - function restorePreferences() { + function restoreQualityPreference() { const savedQuality = localStorage.getItem(STORAGE_KEY_QUALITY) ?? - (import.meta.env.VITE_DEFAULT_DASH_BITRATE as string); + (import.meta.env.VITE_DEFAULT_DASH_BITRATE as string | undefined); if (savedQuality) { - const qualityBandwidth = parseInt(savedQuality, 10); + const qualityBandwidth = parseInt(savedQuality); const tracks = player.getVariantTracks(); let preferredTrack = tracks.find((track) => track.bandwidth === qualityBandwidth); @@ -96,14 +95,8 @@ if (preferredTrack) { player.selectVariantTrack(preferredTrack, true); - player.configure({ abr: { enabled: false } }); } } - - const savedVolume = localStorage.getItem(STORAGE_KEY_VOLUME); - if (savedVolume) { - playerElement.volume = parseFloat(savedVolume); - } } function loadTimeFromUrl(page: Page): boolean { @@ -131,6 +124,12 @@ player = new shaka.Player(); playerElement = document.getElementById('player') as HTMLMediaElement; + // Change instantly to stop video from being loud for a second + const savedVolume = localStorage.getItem(STORAGE_KEY_VOLUME); + if (savedVolume) { + playerElement.volume = parseFloat(savedVolume); + } + await player.attach(playerElement); shakaUi = new shaka.ui.Overlay( player, @@ -138,20 +137,29 @@ playerElement ); - player.addEventListener('adaptation', () => setTimeout(saveQualityPreference, 10000)); - playerElement.addEventListener('volumechange', saveVolumePreference); - shakaUi.configure({ controlPanelElements: [ 'play_pause', + Capacitor.getPlatform() === 'android' ? '' : 'volume', 'spacer', - Capacitor.getPlatform() === 'electron' ? 'volume' : '', 'chapter', 'time_and_duration', + 'captions', 'overflow_menu', 'fullscreen' ], - overflowMenuButtons: ['cast', 'airplay', 'captions', 'quality', 'loop', 'language'] + overflowMenuButtons: [ + 'cast', + 'airplay', + 'captions', + 'quality', + 'playback_rate', + 'loop', + 'language', + 'save_video_frame', + 'statistics' + ], + enableTooltips: true }); player.configure({ @@ -401,14 +409,6 @@ await loadPlayerPos(); - const defaultLanguage = get(playerDefaultLanguage); - if (defaultLanguage) { - const audioLanguages = player.getAudioLanguages(); - if (audioLanguages.includes(defaultLanguage)) { - player.selectAudioLanguage(defaultLanguage); - } - } - if (Capacitor.getPlatform() === 'android' && data.video.adaptiveFormats.length > 0) { const videoFormats = data.video.adaptiveFormats.filter((format) => format.type.startsWith('video/') @@ -465,16 +465,32 @@ ui('#snackbar-alert'); } - restorePreferences(); + player.addEventListener('buffering', saveQualityPreference); + playerElement.addEventListener('volumechange', saveVolumePreference); + + player.addEventListener('loaded', () => { + restoreQualityPreference(); + + const defaultLanguage = get(playerDefaultLanguage); + if (defaultLanguage) { + const audioLanguages = player.getAudioLanguages(); + const langCode = ISO6391.getCode(defaultLanguage); + + for (const audioLanguage of audioLanguages) { + if (audioLanguage.startsWith(langCode)) { + player.selectAudioLanguage(audioLanguage); + break; + } + } + } + }); const overflowMenuButton = document.querySelector('.shaka-overflow-menu-button'); if (overflowMenuButton) { overflowMenuButton.innerHTML = 'settings'; } - const backToOverflowButton = document.querySelector( - '.shaka-back-to-overflow-button .material-icons-round' - ); + const backToOverflowButton = document.querySelector('.shaka-back-to-overflow-button'); if (backToOverflowButton) { backToOverflowButton.innerHTML = 'arrow_back_ios_new'; } @@ -556,10 +572,6 @@ }); -{#if audioMode} -
-{/if} -
-
- -
-