From e6758759f2cd14ec57e7b0a38abb3f826ffabd41 Mon Sep 17 00:00:00 2001 From: DemonGatanjieu <1027066412@qq.com> Date: Wed, 23 Sep 2026 00:10:40 +0800 Subject: [PATCH] fix(audio): eliminate browser media caching with timestamp cache-buster and HTTP no-cache headers --- api/audio_catalog.py | 11 +++++++++-- web/main.js | 2 +- web/modules/browser.js | 4 ++-- web/modules/ui_audio_gallery.js | 3 ++- web/modules/ui_audio_studio.js | 3 ++- web/modules/ui_sidebar.js | 4 ++-- 6 files changed, 18 insertions(+), 9 deletions(-) diff --git a/api/audio_catalog.py b/api/audio_catalog.py index 5a15ca6..35b7905 100644 --- a/api/audio_catalog.py +++ b/api/audio_catalog.py @@ -76,6 +76,7 @@ def _scan_single_audio_dir(directory, relative_prefix=""): file_size = os.path.getsize(full_path) rel_path = os.path.join(relative_prefix, name).replace("\\", "/") + mtime = int(os.path.getmtime(full_path)) stem_map[stem] = { "ext": ext, "slice": { @@ -87,7 +88,7 @@ def _scan_single_audio_dir(directory, relative_prefix=""): "text": ref_text, "size_bytes": file_size, "syntax_tag": f"{{{stem}}}", - "audio_url": f"/anomalous/audio_stream?path={rel_path}" + "audio_url": f"/anomalous/audio_stream?path={rel_path}&v={mtime}" } } return [item["slice"] for item in stem_map.values()] @@ -163,7 +164,13 @@ async def api_serve_audio(request): content_type = content_types.get(ext, 'application/octet-stream') return web.FileResponse( resolved_path, - headers={"Content-Type": content_type, "Accept-Ranges": "bytes"} + headers={ + "Content-Type": content_type, + "Accept-Ranges": "bytes", + "Cache-Control": "no-store, no-cache, must-revalidate, max-age=0", + "Pragma": "no-cache", + "Expires": "0" + } ) diff --git a/web/main.js b/web/main.js index ef1c4d9..3f2d01d 100644 --- a/web/main.js +++ b/web/main.js @@ -6,7 +6,7 @@ try { } catch (_) {} import { app } from "../../scripts/app.js"; -import { createBrowserEntry } from "./modules/browser_entry.js?v=20260921-flicker-free-1"; +import { createBrowserEntry } from "./modules/browser_entry.js?v=20260923-nocache-1"; import { createInterfaceSettings, getCurrentLanguage, setAbyssalScarletTheme, t } from "./modules/interface_settings.js"; export { setAbyssalScarletTheme }; diff --git a/web/modules/browser.js b/web/modules/browser.js index 15c6a0d..a04157e 100644 --- a/web/modules/browser.js +++ b/web/modules/browser.js @@ -21,8 +21,8 @@ import { showImageWorkbench } from './ui_gallery_detail.js'; import { initDoctorPanel, diagnoseNode, renderGlobalDashboard, openLoraInsertionPicker, runGlobalDoctorScan } from './ui_doctor.js'; import { initAssistantPanel, renderAssistantModelCard, _loadAssistantHistory } from './ui_node_assistant.js'; import { _openGalleryReplacer } from './ui_node_model_picker.js'; -import { renderAudioStudio, stopAudioStudioPlayback } from './ui_audio_studio.js'; -import { renderAudioGallery, stopGalleryAudio } from './ui_audio_gallery.js'; +import { renderAudioStudio, stopAudioStudioPlayback } from './ui_audio_studio.js?v=20260923-cache-kill'; +import { renderAudioGallery, stopGalleryAudio } from './ui_audio_gallery.js?v=20260923-cache-kill'; import { getActiveDomain } from './ui_domain_switcher.js'; export class AnomalousBrowser { diff --git a/web/modules/ui_audio_gallery.js b/web/modules/ui_audio_gallery.js index 733faee..a599f22 100644 --- a/web/modules/ui_audio_gallery.js +++ b/web/modules/ui_audio_gallery.js @@ -73,7 +73,8 @@ function startPlayback(url, playBtn, fillEl, timeEl) { } stopGalleryAudio(); - const audio = new Audio(url); + const freshUrl = url.includes('?') ? `${url}&_t=${Date.now()}` : `${url}?_t=${Date.now()}`; + const audio = new Audio(freshUrl); activeAudio = audio; activePlayBtn = playBtn; activeProgressFill = fillEl; diff --git a/web/modules/ui_audio_studio.js b/web/modules/ui_audio_studio.js index 6b215b6..b788dea 100644 --- a/web/modules/ui_audio_studio.js +++ b/web/modules/ui_audio_studio.js @@ -46,7 +46,8 @@ function playAudio(url, playBtn, eqBars) { stopAudioStudioPlayback(); if (typeof stopGalleryAudio === 'function') stopGalleryAudio(); - const audio = new Audio(url); + const freshUrl = url.includes('?') ? `${url}&_t=${Date.now()}` : `${url}?_t=${Date.now()}`; + const audio = new Audio(freshUrl); globalAudioPlayer = audio; currentPlayingBtn = playBtn; currentPlayingBar = eqBars; diff --git a/web/modules/ui_sidebar.js b/web/modules/ui_sidebar.js index 232b62f..a743e34 100644 --- a/web/modules/ui_sidebar.js +++ b/web/modules/ui_sidebar.js @@ -12,8 +12,8 @@ import { createSettingsHub } from './ui_settings_hub.js'; import { createToolbox } from './ui_toolbox.js'; import { createDomainSwitcher, getActiveDomain } from './ui_domain_switcher.js'; import { renderAudioSidebar } from './ui_audio_sidebar.js'; -import { renderAudioStudio } from './ui_audio_studio.js'; -import { renderAudioGallery } from './ui_audio_gallery.js'; +import { renderAudioStudio } from './ui_audio_studio.js?v=20260923-cache-kill'; +import { renderAudioGallery } from './ui_audio_gallery.js?v=20260923-cache-kill'; const t = (key, params) => translate(key, params);