Removed Silence skipper

This commit is contained in:
WardPearce
2025-02-23 06:12:19 +13:00
parent 331771647d
commit 7c25f37ebc
10 changed files with 11 additions and 143 deletions
-1
View File
@@ -25,7 +25,6 @@
- [Invidious API extended integration!](https://github.com/Materialious/api-extended)
- Sync your watch progress between Invidious sessions.
- Watch sync parties!
- Silence skipper (Experimental.)
- [YouTube.js](https://github.com/LuanRT/YouTube.js) fallback if Invidious fails loading videos for Desktop & Android.
- Preview video on hover.
- Sponsorblock built-in.
+2 -2
View File
@@ -7,8 +7,8 @@ android {
applicationId "us.materialio.app"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 96
versionName "1.7.14"
versionCode 97
versionName "1.7.15"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
aaptOptions {
// Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps.
@@ -57,7 +57,11 @@
<release version="1.7.14" date="2025-2-21">
<release version="1.7.15" date="2025-2-23">
<url>https://github.com/Materialious/Materialious/releases/tag/1.7.15</url>
</release>
<release version="1.7.14" date="2025-2-21">
<url>https://github.com/Materialious/Materialious/releases/tag/1.7.14</url>
</release>
<release version="1.7.13" date="2025-2-21">
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "Materialious",
"version": "1.7.14",
"version": "1.7.15",
"description": "Modern material design for Invidious.",
"author": {
"name": "Ward Pearce",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "materialious",
"version": "1.7.14",
"version": "1.7.15",
"private": true,
"scripts": {
"dev": "vite dev",
@@ -29,7 +29,6 @@
playerDefaultLanguage,
playerProxyVideosStore,
playerSavePlaybackPositionStore,
silenceSkipperStore,
sponsorBlockCategoriesStore,
sponsorBlockDisplayToastStore,
sponsorBlockStore,
@@ -62,16 +61,8 @@
let snackBarAlert = $state('');
let playerIsLive = $state(false);
let playerPosSet = false;
let userVideoSpeed = 1;
let silenceIsFastForwarding = false;
let silenceSkipperInterval: NodeJS.Timeout;
let originalOrigination: ScreenOrientationResult | undefined;
let sponsorBlockElements: Element[] = [];
let watchProgressTimeout: NodeJS.Timeout;
function setSponsorTimeline() {
@@ -130,74 +121,8 @@
page.subscribe((pageUpdate) => loadTimeFromUrl(pageUpdate));
let initStoreSilence = true;
silenceSkipperStore.subscribe((value) => {
if (initStoreSilence) {
initStoreSilence = false;
return;
}
if (typeof silenceSkipperInterval !== 'undefined') {
clearInterval(silenceSkipperInterval);
}
if (value) {
initSilenceSkipper();
}
});
const proxyVideos = get(playerProxyVideosStore);
function fastForwardToSound(
videoElement: HTMLAudioElement,
threshold: number = 0.01,
checkInterval: number = 100,
fastForwardRate: number = 4
): void {
if (!(videoElement instanceof HTMLMediaElement)) {
console.error('Provided element is not a valid HTMLMediaElement');
return;
}
const audioContext = new AudioContext();
const source = audioContext.createMediaElementSource(videoElement);
const analyser = audioContext.createAnalyser();
source.connect(analyser);
analyser.connect(audioContext.destination);
analyser.fftSize = 256;
const dataArray = new Uint8Array(analyser.frequencyBinCount);
const checkForSound = () => {
analyser.getByteFrequencyData(dataArray);
const averageVolume = dataArray.reduce((a, b) => a + b, 0) / dataArray.length;
const volume = averageVolume / 255;
if (volume < threshold) {
if (!silenceIsFastForwarding) {
videoElement.playbackRate = fastForwardRate;
silenceIsFastForwarding = true;
}
} else {
if (silenceIsFastForwarding) {
videoElement.playbackRate = userVideoSpeed;
silenceIsFastForwarding = false;
}
}
};
silenceSkipperInterval = setInterval(checkForSound, checkInterval);
}
function initSilenceSkipper() {
const videoContainer = document.getElementById('video') as HTMLElement;
const videoElement = videoContainer.querySelector('video') as HTMLMediaElement;
fastForwardToSound(videoElement);
}
onMount(async () => {
if (!data.video.hlsUrl) {
playerIsLive = false;
@@ -244,39 +169,6 @@
// Auto save watch progress every minute.
watchProgressTimeout = setInterval(() => savePlayerPos(), 60000);
player.addEventListener('pause', () => {
savePlayerPos();
if (get(silenceSkipperStore)) {
clearInterval(silenceSkipperInterval);
}
});
player.addEventListener('end', () => {
savePlayerPos();
if (get(silenceSkipperStore)) {
clearInterval(silenceSkipperInterval);
}
});
player.addEventListener('play', () => {
if (get(silenceSkipperStore)) {
initSilenceSkipper();
}
});
player.addEventListener('seeked', () => {
if (get(silenceSkipperStore)) {
clearInterval(silenceSkipperInterval);
initSilenceSkipper();
}
});
player.addEventListener('rate-change', () => {
if (silenceIsFastForwarding) return;
userVideoSpeed = player.playbackRate;
});
player.addEventListener('provider-change', (event) => {
const provider = event.detail as any;
if (provider?.type === 'dash') {
@@ -582,9 +474,6 @@
});
}
}
if (typeof silenceSkipperInterval !== 'undefined') {
clearInterval(silenceSkipperInterval);
}
if (watchProgressTimeout) {
clearTimeout(watchProgressTimeout);
}
@@ -16,8 +16,7 @@
playerSavePlaybackPositionStore,
playerTheatreModeByDefaultStore,
playerYouTubeJsAlways,
playerYouTubeJsFallback,
silenceSkipperStore
playerYouTubeJsFallback
} from '../../store';
let defaultLanguage = $state(get(playerDefaultLanguage));
@@ -192,22 +191,6 @@
</nav>
</div>
<div class="field no-margin">
<nav class="no-padding">
<div class="max">
<div>{$_('layout.player.silenceSkipper')}</div>
</div>
<label class="switch">
<input
type="checkbox"
bind:checked={$silenceSkipperStore}
onclick={() => silenceSkipperStore.set(!$silenceSkipperStore)}
/>
<span></span>
</label>
</nav>
</div>
{#if Capacitor.isNativePlatform()}
<div class="field no-margin">
<nav class="no-padding">
-6
View File
@@ -25,7 +25,6 @@ import {
returnYTDislikesInstanceStore,
returnYtDislikesStore,
showWarningStore,
silenceSkipperStore,
sponsorBlockCategoriesStore,
sponsorBlockDisplayToastStore,
sponsorBlockStore,
@@ -167,11 +166,6 @@ const persistedStores: { name: string, store: Writable<any>, type: 'string' | 'b
store: sponsorBlockDisplayToastStore,
type: 'boolean'
},
{
name: 'silenceSkipper',
store: silenceSkipperStore,
type: 'boolean'
},
{
name: 'amoledTheme',
store: interfaceAmoledTheme,
-1
View File
@@ -101,7 +101,6 @@ export const syncPartyConnectionsStore: Writable<DataConnection[] | null> = writ
export const playlistSettingsStore: Writable<Record<string, { shuffle: boolean; loop: boolean; }>> =
writable({});
export const silenceSkipperStore: Writable<boolean> = persisted('silenceSkipper', false);
export const poTokenCacheStore: Writable<string> = writable();
+1 -1
View File
@@ -3,7 +3,7 @@ import os
import re
from datetime import datetime
LATEST_VERSION = "1.7.14"
LATEST_VERSION = "1.7.15"
RELEASE_DATE = datetime.now().strftime("%Y-%-m-%d") # Format: YYYY-M-D
WORKING_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), "materialious")