diff --git a/src/plugins/built-in/backgroundMusic/BackgroundMusicSetting.svelte b/src/plugins/built-in/backgroundMusic/BackgroundMusicSetting.svelte index 2b92b906..be608ff2 100644 --- a/src/plugins/built-in/backgroundMusic/BackgroundMusicSetting.svelte +++ b/src/plugins/built-in/backgroundMusic/BackgroundMusicSetting.svelte @@ -24,10 +24,11 @@ async function handleFiles(files: FileList | null) { const file = files?.[0] if (!file) return - // Restrict to WAV only for best responsiveness - const isWav = file.type === 'audio/wav' || file.name.toLowerCase().endsWith('.wav') - if (!isWav) { - alert('Please select a .wav audio file') + // Accept WAV and MP3 files + const isSupported = file.type === 'audio/wav' || file.type === 'audio/mpeg' || + file.name.toLowerCase().endsWith('.wav') || file.name.toLowerCase().endsWith('.mp3') + if (!isSupported) { + alert('Please select a .wav or .mp3 audio file') return } @@ -76,7 +77,7 @@
triggerSelect()} ondragover={(e) => { e.stopPropagation(); dragging = true }} ondragleave={() => dragging = false} @@ -90,25 +91,27 @@ role="button" tabindex="0" > -
-
- {'\ued47'} - {filename ? 'Change audio' : 'Upload audio'} -
+
{#if filename} -
- {filename}{#if durationText} • {durationText}{/if} +
+
+ {filename} +

{durationText}

+
+ +
+ {:else} +
+ {'\ued47'} + Upload audio
{/if}
- {#if filename} - - {/if} - + {#if dragging}
{/if} diff --git a/src/plugins/built-in/backgroundMusic/index.ts b/src/plugins/built-in/backgroundMusic/index.ts index e383adea..50712066 100644 --- a/src/plugins/built-in/backgroundMusic/index.ts +++ b/src/plugins/built-in/backgroundMusic/index.ts @@ -1,5 +1,5 @@ import type { Plugin } from "@/plugins/core/types"; -import { componentSetting, defineSettings, numberSetting } from "@/plugins/core/settingsHelpers"; +import { componentSetting, defineSettings, numberSetting, booleanSetting } from "@/plugins/core/settingsHelpers"; import styles from "./styles.css?inline"; import BackgroundMusicSetting from "./BackgroundMusicSetting.svelte"; import localforage from "localforage"; @@ -7,7 +7,7 @@ import localforage from "localforage"; const settings = defineSettings({ uploader: componentSetting({ title: "Background Music", - description: "Upload a .wav audio file to play in the background.", + description: "Upload a .wav or .mp3 audio file to play in the background.", component: BackgroundMusicSetting, }), volume: numberSetting({ @@ -18,6 +18,11 @@ const settings = defineSettings({ max: 1, step: 0.05, }), + pauseOnHidden: booleanSetting({ + title: "Pause when tab hidden", + description: "Pause music when switching to another tab or minimizing the browser", + default: true, + }), }); const store = localforage.createInstance({ @@ -110,6 +115,14 @@ const backgroundMusicPlugin: Plugin = { if (currentAudio) currentAudio.volume = Math.max(0, Math.min(1, vol)); }); + api.settings.onChange("pauseOnHidden" as any, (value: any) => { + const pauseOnHidden = (typeof value === "boolean" ? value : true) as boolean; + // If the setting is disabled and audio is currently paused due to tab being hidden, resume it + if (!pauseOnHidden && currentAudio && currentAudio.paused && document.visibilityState === "hidden") { + currentAudio.play().catch(() => {}); + } + }); + // Note: Stop button/event removed by user; no stop handling needed // Start if we have audio and autoplay is enabled @@ -124,9 +137,12 @@ const backgroundMusicPlugin: Plugin = { (window as any).__betterseqta_bg_music_cancel__ = cancel; tryStart(); - // Pause on tab hide, resume on show with a small delay + // Pause on tab hide, resume on show with a small delay (if enabled) const visHandler = () => { if (!currentAudio) return; + const pauseOnHidden = (api.settings as any).pauseOnHidden ?? true; + if (!pauseOnHidden) return; + if (document.visibilityState === "hidden") { if (visibilityResumeTimeout !== null) { clearTimeout(visibilityResumeTimeout);