Removed Silence skipper
This commit is contained in:
@@ -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.
|
||||
|
||||
@@ -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,6 +1,6 @@
|
||||
{
|
||||
"name": "Materialious",
|
||||
"version": "1.7.14",
|
||||
"version": "1.7.15",
|
||||
"description": "Modern material design for Invidious.",
|
||||
"author": {
|
||||
"name": "Ward Pearce",
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user