音乐模块调整

This commit is contained in:
zhongluofeng
2026-09-15 17:17:16 +08:00
parent 4f574cb5fa
commit 8f853f7ef3
31 changed files with 3819 additions and 936 deletions
+30 -2
View File
@@ -254,7 +254,18 @@ export const commands = {
musicStopBridge: () => __TAURI_INVOKE<null>("music_stop_bridge"),
/** 读取音乐模块设置 */
musicGetSettings: () => __TAURI_INVOKE<MusicSettings>("music_get_settings"),
/** 保存音乐模块设置(立即生效) */
/**
* 保存音乐模块设置(立即生效)
*
* 飞牛音乐**连接相关字段一律以磁盘为准**,不接受前端传值:
* 连接列表 / 激活连接 / 旧版单连接字段只由 `feiniu_save_connection`、
* `feiniu_activate_connection`、`feiniu_delete_connection`、`feiniu_login`
* 等专用命令维护。
*
* 原因:前端 `musicStore` 只在 init 时读一次整份设置并长期复用快照,
* 若允许它整份回写,删除连接后任意一次设置保存(哪怕是切页触发的)
* 都会把已删除的连接从旧快照里写回来。
*/
musicSaveSettings: (settings: MusicSettings) => __TAURI_INVOKE<null>("music_save_settings", { settings }),
/** 禁用指定窗口(按 label 查找)的显示/隐藏过渡动画,消除覆盖层出现/消失时的缩放动画 */
screenshotDisableTransitions: (label: string) => __TAURI_INVOKE<null>("screenshot_disable_transitions", { label }),
@@ -567,6 +578,11 @@ export type FeiniuConnection = {
insecure: boolean,
/** fnconnect 连接的 fnId(如 fnos.net/<id> 或裸 id */
fnId?: string,
/**
* 是否经由 FnConnect 中继链路(`<fnId>.fnos.net`)。
* 中继要求所有请求携带 `Cookie: mode=relay`,否则网关 302 回登录页。
*/
relay?: boolean,
};
export type FileEntry = {
@@ -623,6 +639,13 @@ export type MusicEnvStatus = {
musicdlInstalled: boolean,
/** musicdl 版本 */
musicdlVersion: string | null,
/** 本应用锁定的 musicdl 版本(`MUSICDL_VERSION`):是否过期、更新到哪个版本都以它为准 */
musicdlExpected: string,
/**
* 已装 musicdl 是否与锁定版本不一致。
* 未安装时恒为 false(那是「安装」引导的事,不是「更新」)。
*/
musicdlOutdated: boolean,
/** FFmpeg 是否可用(部分音源需要,非必需) */
ffmpeg: string | null,
/** 桥接进程是否在运行 */
@@ -651,6 +674,11 @@ export type MusicSettings = {
selectQualityOnDownload: boolean,
/** 下载时默认音质:"" 表示最高;否则为搜索音质档位 label(如 "无损"、"320K" */
defaultDownloadQuality: string,
/**
* QQ 音乐 Cookie(可选):用于解析需要登录的歌单(含自己的隐私歌单)与 VIP 音质。
* 传给 musicdl 的 default_search/parse/download_cookies;空=游客身份。
*/
qqCookie?: string,
/** 飞牛音乐(NAS)连接:服务器地址(如 http://192.168.1.10:5666,空=未配置) */
feiniuBaseUrl?: string,
/** 飞牛音乐登录 token(登录成功后保存) */
@@ -661,7 +689,7 @@ export type MusicSettings = {
feiniuDeviceId?: string,
/** 飞牛音乐访问安全码(可选;仅需访问码的库才填,LAN 通常为空) */
feiniuAccessCode?: string,
/** 飞牛音乐连接列表(多连接:本地 / frp / 预留 fnconnect */
/** 飞牛音乐连接列表(多连接:局域网 / FnConnect */
feiniuConnections?: FeiniuConnection[],
/** 当前激活连接的 id */
feiniuActiveId?: string,
+9 -5
View File
@@ -29,16 +29,18 @@ import { useModuleTabsStore, type ModuleTab } from '@/stores/moduleTabsStore'
* ```
*
* ## 工作原理
* 1. onMounted 时注册标签到 moduleTabsStoreTitleBar 据此渲染浮动切换器
* 1. onMounted 时注册标签到 moduleTabsStore(**并复用该模块上次停留的 tab**),
* TitleBar 据此渲染浮动切换器
* 2. 用 IntersectionObserver 监听 TabsList 可见性(rootMargin 裁剪 TitleBar 高度)
* 3. 双向 watch 同步本地 activeTab 与 store.activeTab
* 4. 消费搜索导航的待跳转 tab(模块尚未挂载的场景)
* 5. onUnmounted 时清理 observer 并注销标签
* 5. onUnmounted 时清理 observer 并把当前 tab 记到 store(按模块)后注销标签
*
* ## 约束
* - TitleBar 高度固定为 40px (h-10)composable 内部已用 44px 裁剪(含缓冲)
* - 一个模块同一时间只能注册一组标签(store 是单例)
* - 模块卸载时务必让 composable 的 onUnmounted 执行(已自动处理,无需手动调用)
* - tab 记忆只保内存、不落盘:tab 集合可能随版本变化,跨重启恢复旧值风险更大
*/
export function useModuleTabs(
moduleId: string,
@@ -97,10 +99,12 @@ export function useModuleTabs(
})
onMounted(async () => {
tabsStore.registerTabs(tabs, activeTab.value)
// 注册时带上模块 id:store 据此复用「上次停留的 tab」(模块卸载时保存)
const restored = tabsStore.registerTabs(moduleId, tabs, activeTab.value)
if (restored !== activeTab.value) activeTab.value = restored
await nextTick()
setupObserver()
// 搜索导航跳转:模块刚挂载,消费待跳转 tab
// 搜索导航跳转:模块刚挂载,消费待跳转 tab(优先级高于上次停留)
applyPendingTab()
})
@@ -109,7 +113,7 @@ export function useModuleTabs(
observer.disconnect()
observer = null
}
tabsStore.unregisterTabs()
tabsStore.unregisterTabs(moduleId)
})
return tabsListRef