appname               = musicmate
version               = 0.20.6
display_name          = MusicMate 音乐管家
desc                  = 飞牛 fnOS 音乐管理工具：① ID3/FLAC 标签编码修复（GBK/Big5 乱码→UTF-8，自动择优解码，预览/应用/回滚）；② 重复文件去重（SHA-256 精确去重 + Chromaprint 音频指纹识别同曲不同码率/格式，音质评分自动保留最佳版本）；③ 按标签整理目录（Artist/Album/Title 结构重排，移动或复制，可回滚）；④ 批量标签编辑与封面管理（字段修改、文件名→标签补全、封面嵌入/删除）；⑤ 按目录生成 .m3u8 播放列表。零依赖 Python 实现，安装向导设置访问令牌。
arch                  = x86_64
platform              = x86
source                = thirdparty
maintainer            = 集家嘴的壳玛🐸
maintainer_url        = https://kyeo.top
distributor           = 集家嘴的壳玛🐸
distributor_url       = https://kyeo.top
os_min_version        = 0.8.25
# 171c25 改为浅色 rgba(255,255,255,.16)（7px 高度 + 增强发光），已播放蓝色填充在浅色轨道上醒目可辨。v0.18.0：播放器增强全量交付（P10）。① 播放队列 + 上一首/下一首 + 自动连播 + 播放模式（顺序/列表循环/单曲循环/随机，localStorage 记忆）：点歌曲行以当前可见列表为队列快照，顺序播完停止、列表循环回绕、单曲循环重播、随机一轮播完重洗；上一首 >3s 回本曲开头；播放器新增 ⏮/⏭ 切歌与模式按钮、队列位置显示。② 全屏播放界面：播放器 ⛶/封面/信息区点击打开，大封面 + 模糊渐变背景 + 同步歌词逐行高亮 + 可拖动进度条 + 播放模式/切歌控制，Esc/✕ 关闭。③ 悬浮歌词（桌面歌词样式）：一句歌词大字置顶、透明无框、文字阴影任意背景可读，整层拖动（位置记忆），点击歌词跳转进度，播放器/全屏 💬 开关 + Esc 控制。④ 音量控制：底部播放器与全屏双滑块（🔇/🔉/🔊 图标分级），localStorage 记忆默认 80%。⑤ 快捷键：Space 播放暂停、←/→ 切歌、↑/↓ 音量 ±5%、F 全屏（输入框聚焦忽略），Esc 关全屏→关悬浮歌词→关歌词弹窗。⑥ Media Session 系统集成：锁屏/通知栏显示封面与标题，系统媒体控件可播放/暂停/切歌，无 mediaSession 自动降级。⑦ 播放队列面板：📋 查看队列、点击跳播、✕ 移除（索引修正）、清空、HTML5 拖拽排序（shuffle 时禁用）。⑧ 播放历史：localStorage 100 条去重置顶，音乐库新增「最近播放」视图（清空/单条删除）。⑨ 收藏：歌曲行 ♡/♥ 切换，音乐库新增「收藏」视图。⑩ 播放进度条已播放/未播放颜色对比增强（底色改暗 + 内阴影凹陷、已播放提亮发光）。全部为前端实现、后端 API 零改动；303 项测试全绿。v0.17.0：播放队列 + 上一首/下一首 + 自动连播 + 播放模式（P10 开始）。v0.16.0：单曲编辑新增「数据库查询」（iTunes 为主 + MusicBrainz 兜底，免费免 KEY）。单曲编辑弹窗新增 🌐 数据库查询按钮：读取当前标签（歌手/歌名缺失时回退文件名解析）→ 查询 iTunes Search API（country=CN 返回中文标签，华语覆盖好）→ 未命中时 MusicBrainz 兜底 → 展示命中来源徽章与评分、字段 diff（当前值 → 数据库值，逐项勾选采纳）、封面预览可一键写入（iTunes cover_url / MB cover_mbid，复用 AI 封面接口 + manifest 回滚）。权威数据库结果优先于 AI 识别（AI 存在幻觉风险，如将《玫瑰花的葬礼》误判为周杰伦），数据库未命中时再提示尝试 AI。新增 /api/tags/lookup/single 端点（同步单文件查询）；修复 test_lyrics 批量歌词测试自包含构造最小 FLAC 样本，不再依赖真实音乐库文件；255 项测试全绿。v0.15.9：目录模板自定义（设置页统一管理）。新增 patterns 模块：预设 6 种常用目录模板 + 用户自定义模板（JSON 持久化到应用数据目录，各端共享）。设置页新增「📁 目录模板」卡片：展示预设、自定义新增/删除；「整理」页与单曲编辑的目录模板改为下拉选择（预设 ✨ + 自定义 📝，选中填入，仍可手动修改）。新增 /api/patterns/list|save|delete 端点；测试 7 用例，255 项全绿。v0.15.8：标签编辑页布局重构（更清晰易懂）。重新分区：🎯 编辑范围（统一定义目录，供各功能共享）→ ✏️ 手动编辑字段 → 🖼 封面管理 → 🔎 自动补全缺失标签（数据库补全 iTunes/MB 与 AI 补全合并为一个卡片内的两个子分区）→ 🕓 历史备份（统一放最后）。所有功能 id 不变、后端 API 不变，仅重组前端布局。v0.15.7：目录选择与令牌体验修复。① 修复目录选择弹窗被 tab 面板隐藏（仅音乐库能弹出，其它界面点选择目录无反应）——弹窗移到 </main> 之外；② 页顶令牌提示改为「⚙️ 前往设置管理令牌」跳转，自动切换到设置页并高亮令牌卡片；③ 侧边栏「工具」组按处理流程先后重排（文件修复→编码修复→标签编辑→一键歌词→去重→整理）。v0.15.6：新增「一键歌词」批量工具。左侧工具栏新增 📝 一键歌词：扫描目录下无内嵌歌词的歌曲，逐首 LRCLIB 在线检索（免费免 KEY，间隔限速，可设检索上限/仅同步歌词），命中后勾选批量写入内嵌标签，合并备份清单可整批回滚；未命中的歌曲列出可后续单曲检索。v0.15.5：无歌词歌曲可检索下载歌词。此前只有内嵌歌词的歌曲才能点开 📝 歌词按钮；现在所有歌曲均可点开歌词弹窗，无歌词时显示"无内嵌歌词"，可直接 🔍 在线检索（LRCLIB）并写入，播放器底部歌词按钮同样放开。v0.15.4：目录输入体验升级（选择 + 记忆）。① 全部 8 个音乐目录输入框（编码修复/标签编辑/去重/整理/播放列表/文件修复/音乐库/一键整理）新增「📂」选择按钮，弹出目录浏览弹窗：可手工输入路径、点击子目录逐级进入、⬆ 返回上级、✅ 选择当前目录；② 每个目录输入框自动记忆上次输入（localStorage），刷新/重开页面自动回填；③ 后端新增只读 /api/fs/list 目录浏览端点（列子目录/上级，跳过隐藏目录）。v0.15.3：修复标签清洗误伤缩写专辑名（G.E.M → Unknown Album）。专辑/歌手名如 G.E.M、U.S.A（全单字母点分段）此前被域名残留规则误判为广告域名清空，导致整理回退 Unknown Album；现改为全单字母段缩写保留、多字符段域名仍清理，并顺带清理 a.b.com 拆分后的孤立点残留。v0.15.2：单曲整理支持自定义目录模板（修复 0.15.1）。单曲编辑弹窗「整理到标签位置」新增目录模板输入框，默认沿用「整理」页的 pattern（如去掉 {track} 轨道号前缀），plan/apply 透传自定义模板，预览与实际一致；修复 /api/organize/single/plan 未透传 pattern 导致预览与执行不一致的问题。v0.15.1：单曲整理（P9 补充）。单曲编辑弹窗新增「📁 整理到标签位置」：按当前标签计算目标目录并移动文件（如 多多高品质/Unknown Album/说好的幸福呢.mp3 → 周杰伦/魔杰座/00 说好的幸福呢.mp3），两步确认（先预览目标路径 → 再次点击执行），复用 organize manifest 可一键回滚，目标重名自动追加后缀，支持 move/copy 模式。v0.15.0：P9 整体 UI 全盘重设计（完整交付）。① 设计系统：styles.css 重构为统一 CSS 变量 + 组件类（按钮/卡片/输入/表格/消息/进度/弹窗/徽章），深色主题 + 氛围光 + 阴影动效；② 布局：左侧主导航（音乐/工具/系统分组）+ 右侧内容区，全部 9 个 tab 统一视觉；③ 各 tab 卡片化：编码修复/标签编辑/去重/整理/播放列表/文件修复/设置 分区卡片；④ 歌词同步高亮：LRC 时间戳解析，试听时逐行高亮当前句并自动滚动（纯文本歌词退化为整段）；⑤ 帮助文档：help.md 重排为规范 markdown + 零依赖渲染器（标题/列表/表格/代码块/引用）；⑥ 广告位：侧栏/页脚预留优雅占位（默认隐藏，可配置启用）；⑦ 响应式：PC/平板/手机三档断点，移动端侧栏转横向、播放器重排、小屏精简列表列。v0.14.0：P8 歌词支持（读取/展示/在线检索/写入，完整交付）。⑤ 在线检索：歌词弹窗新增「🔍 在线检索（LRCLIB）」——公共 API 免费免 key、免注册，按歌手+歌名自动匹配（先精确 get，未命中走模糊 search 评分），命中展示来源与同步/纯文本标记；⑥ 写入：确认后点「💾 写入内嵌歌词」，复用单曲编辑 manifest（tagedit-single-*.json）可一键回滚；⑦ 歌词弹窗新增 /api/lyrics/search 与/api/lyrics/save 端点。① 读取：common.read_lyrics 按容器读取内嵌歌词——MP3 ID3 USLT/SYLT、FLAC/OGG/Opus Vorbis LYRICS 键、M4A/AAC ©lyr 原子，零新增依赖；② 展示：音乐库歌曲列表有歌词的行显示 📝 入口，底部播放器在播放含歌词歌曲时显示歌词按钮，歌词弹窗展示歌名-歌手与可滚动歌词文本；③ 写入：common.write_lyrics 预留（空文本=删除），供后续编辑与在线检索使用；④ 数据：library.tree 的 song 增加 has_lyrics/lyrics 字段。v0.13.1：修复 AI 识别失败（endpoint 规范化）。设置页 AI 端点允许填 base URL（如 https://api.deepseek.com），模块自动补全 /chat/completions 路径；此前填 base URL 会请求 404 并被静默吞掉，前端误显示"AI 未能识别，请用文件名回填"。已含完整路径（如 .../v1/chat/completions）不受影响。v0.13.0：AI 单曲识别增强（P7.1 完成）。音乐库单曲编辑弹窗的「AI 识别」一次查全：① 字段 diff 展示——每条建议显示「当前值 → AI 建议」并可独立勾选是否采纳，允许修正已有错误字段（不只填空），人工确认后填入、保存时生效；② AI 封面——模型给出封面 URL 时展示缩略图预览，确认后点「应用封面」下载写入（复用单曲编辑 manifest，可一键回滚），仅接受 http(s) 图片、限 20MB 防异常；③ 识别失败/无新建议时给出可读提示，不静默；④ 新增 /api/tags/ai/cover 端点（下载 AI 封面 → set_cover → 回滚清单）。v0.12.1：新增 iTunes 标签补全备选源（UI 完成）。当 MusicBrainz 未命中时，标签编辑页新增「iTunes 补全」区可用 iTunes Search 公共 API（免费免 KEY、无需注册）再查一次，country=CN 返回中文标签，华语曲库覆盖更好；同样只回填缺失的专辑/年份/流派并下载封面，命中/未命中列表预览，写入独立备份清单（itunes-backup-*.json）可回滚。另：因网络问题彻底取消 AcoustID 指纹识别方案（原 P6 规划，不再实施，设置页/API 不再包含 acoustid 配置）。v0.12.0：AI 兜底补全（P7 完成）。① 冷门歌 AI 识别：OpenAI 兼容 chat/completions 接口（设置页配置 AI Key/端点/模型），根据文件名+已有标签智能推断歌名/歌手/专辑/年份/流派，结构化 JSON 输出、容错解析，无法推断的字段一律留空绝不编造；② 单曲模式：单曲编辑弹窗新增「🤖 AI 识别」按钮，结果一键填入空缺字段（已有值不覆盖，走备份可回滚）；③ 批量模式：标签编辑页新增「AI 补全」区，先免费扫描缺失歌名/歌手的文件并显示预估调用次数（成本控制），确认后才逐首调用 LLM，命中/未命中列表预览，确认后统一回填（仅填空字段，写入备份清单可回滚）；④ 与 MusicBrainz 补全互为兜底：冷门歌文本查询失败可用 AI 兜底。v0.10.1：试听与播放器修复优化。① 修复试听 401 未授权：播放请求改用与其它接口一致的令牌来源（原存储键名不一致导致取不到令牌）；② 修复含内嵌封面的 FLAC 试听失败：ffmpeg 转码命令加 -vn 忽略封面视频流（mjpeg 封面被当作视频流转入 mp3 容器导致整段转码失败，龙卷风/伊斯坦堡等带封面 FLAC 此前无法试听）；③ FLAC 全曲试听：现代浏览器原生支持 audio/flac，FLAC 不再转码 30 秒而是直出完整文件（可拖动进度），旧浏览器自动回退 30 秒转码；④ 单曲编辑保存/撤销后自动重新加载音乐库并按新标签重排（不再需手动刷新，详情视图目标因标签重组消失时自动回退列表）；⑤ 底部播放器进度条美化：标签蓝渐变填充 + 滑动圆点 + hover 增高的可拖动滑块，支持点击跳转与拖动预览（松手才 seek）。v0.10.0：新增单曲标签编辑（P5 完成）。音乐库歌曲列表每行新增 ✏️ 编辑按钮：① 单曲编辑弹窗——标题/歌手/专辑/专辑艺术家/音轨/年份/流派 七个字段直接编辑，留空即删除该字段；② 封面管理——更换封面（本地图片）/删除封面，保存即生效；③ 从文件名回填——解析"歌手 - 专辑 - 歌名"只补当前为空字段，不覆盖已有值；④ 每次保存写入独立备份清单 tagedit-single-*.json，弹窗内"撤销本次修改"一键回滚（还原字段与旧封面）；⑤ 新增 /api/tagedit/single/info（读取单曲标签+文件名解析结果）与 /api/tagedit/single/apply（单曲编辑应用）接口；⑥ 修复 delete_field 对 Vorbis 标签删除字段时 mutagen VCommentDict.pop 的兼容问题（改用 del，回滚删字段不再报错）。v0.9.1：音乐库界面改版（样图风格）。① 新布局：左侧导航（全部/歌手/专辑/年份/流派）+ 顶部搜索框（实时过滤歌曲/歌手/专辑/流派）+ 卡片网格视图（歌手首字母头像、专辑封面、年份、流派）+ 详情视图（大封面头图 + 歌曲列表）+ 底部播放器（封面/歌名/进度条/播放暂停/停止/点击跳转）；② 歌曲列表对齐样图：序号/封面/歌名/歌手/专辑/时长/大小/格式/操作；③ /api/library/tree 的 song 增加 size（文件大小）与 fmt（格式）字段。v0.9.0：新增音乐库分类浏览与试听（P4 完成）。① 新 tab 音乐库：按 歌手（歌手→专辑→歌曲）/专辑/年份/流派 四种分类浏览，每首歌显示封面缩略图（懒加载）、时长与标签信息，缺失字段归 Unknown；② 试听：每首歌可试听 30 秒——MP3/AAC/M4A/OGG/WAV 直接播放，FLAC/APE/WMA 用系统 ffmpeg 流式转码为 MP3（解决浏览器不播 FLAC 的问题）；③ 新增 /api/library/tree（只读分类聚合）与 /api/stream/preview（路径白名单防目录穿越、仅限音频扩展名）。v0.8.0：新增"一键整理"懒人流程（P3 完成）。新 tab 一键整理：按默认流程 文件修复→编码修复（可转简体）→标签编辑（从文件名补全）→去重清理→整理 自动编排执行；每步可独立勾选；执行前两步确认风险弹窗（明示改写标签/移动文件/多余版本进回收站，全部可回滚）；一键预览（只读）先展示每步影响数量；执行后生成汇总报告，每步含独立回滚入口（去重清单写入回收站目录，与去重 tab 一致保证可解析）。v0.7.0：新增 MusicBrainz 标签补全与设置/帮助系统（P2 完成）。① 标签编辑页新增"MusicBrainz 补全"：扫描缺失专辑/年份/流派的文件，用 MB 公共 API（免费免 KEY）查询候选（简繁统一匹配、排除 live/remix/演唱会/精选版本、优先录音室专辑），预览候选后一键回填字段并下载封面，写入备份清单可回滚；② 新增设置页：外部服务 KEY 分级配置（MusicBrainz 免 KEY 默认启用、AcoustID/AI 为可选增强，KEY 存 config.conf 不回显，可热加载）；③ 新增帮助页（help.md 单一内容源：快速上手/KEY 申请指导/常见问题/数据安全）。v0.6.1：修复简繁转换误改歌名。0.6.0 使用 zhconv 的 zh-cn（大陆地区词转换），会把官方歌名中的专有名词替换成大陆用语（爱在西元前→爱在公元前、伊斯坦堡→伊斯坦布尔）。现改用 zh-hans（通用简体字形转换）：只把繁体字形映射为简体（陳奕迅→陈奕迅、講男講女→讲男讲女），保留歌名/专有名词用词（西元前、伊斯坦堡 均保持不动）。v0.6.0：编码修复新增"同时转为简体中文"（可选开关）。使用 vendored zhconv（纯 Python 零依赖）在乱码修复后逐字段将繁体中文转为简体；仅结果变化才列入计划，纯简体文本不受影响；预览/应用均支持该选项，备份清单可回滚。v0.5.6：修复无标签文件编辑"报成功但未写入"。部分 MP3 没有 ID3 标签容器（tags=None，纯 MPEG 帧），此前 write_field/封面读写按 tag_kind 分支判断会静默无效，save_tags 又吞掉异常，导致 apply 谎报成功、整理仍显示 Unknown Artist。现修复：tag_kind 在无容器时按文件类型推断；写入前 ensure_tags() 先创建 ID3/Vorbis/MP4 容器；save_tags 返回成功与否，所有保存点（字段/封面/回滚）失败时记录 error 且不写入回滚清单。v0.5.5：修复标签编辑误报与误改。① 占位符判定不再按长度：正常两字歌名/歌手名（如"倒影""许嵩"）此前被 len<=2 规则误判为占位符，导致 fill_from_filename 对全库生成 208 项"无变化"误报，并把正常标签误改（如"屋顶"→"温岚 高质量版本"），现仅按黑名单（kuwo/unknown/未知 等）判定；② 清洗新增 NAS 下载冲突后缀（"野人_DiskStation_Mar-13-2216-2024_DownloadConflict" → "野人"）。修复后全库预览：误报归零，仅保留真实修正（35 项广告噪音 + 4 项占位 + 13 项缺失补全）。v0.5.4：整理与标签编辑抗广告噪音。① 整理：目标目录的歌手/专辑/标题在生成路径前先清洗广告噪音（"认了吧 搜啦EP - 全球华语Demo音乐网 www.sosolala.com" → "认了吧"、"六月飞霜 角落音乐bbs.in-corner" → "六月飞霜"、未闭合方括号 [DoN @ M 一并去除），不再产生带水印的错误目录；② 标签编辑：从文件名补全（fill_from_filename）增强——字段已有值但含广告噪音（清洗后与文件名一致）或为占位标签（kuwo 等）时也生成修正项，不再因"已有（错误）标签"而漏掉编辑；③ 文件名解析统一复用 common.split_artist_title_text（支持中文连字符、广告清洗），并保留"歌手 - 专辑 - 歌名"三段式的专辑解析。v0.5.3：去重清理回收站迁移与风险加固。回收站从应用数据目录（卸载/升级应用会被清空，曾导致已清理文件无法还原）迁移到音乐库根目录的隐藏目录 .musicmate-trash：不随应用生命周期删除、scan 自动跳过隐藏目录不会误扫；清理确认框明确提示回收站位置。v0.5.2：同曲识别抗广告噪音。下载站/下载工具常把水印写进标签与文件名（如"六月飞霜 角落音乐bbs.in-corner"、"认了吧 搜啦EP - 全球华语Demo音乐网 www.sosolala.com"），导致同一首歌的两个版本匹配不上。本版新增文本清洗：匹配前去除 URL、方括号水印（含未闭合 [DoN @ M）、下载站广告词与残留域名；文件名解析支持无空格中文连字符（陈奕迅-六月飞霜）；歌手缺失（无标签）的文件按歌名与同名版本匹配，不同歌手的同名歌不合并。v0.5.1：修复同名同曲误判。部分下载工具（如酷我）会把 kuwo 等占位符写入标签 artist/title，导致"歌手+歌名"匹配把无关歌曲误判为同曲。现改为：标签 title 必须与文件名解析结果一致（出现在文件名中）才采信标签，否则回退文件名；标签 artist 为占位符时回退文件名歌手。v0.5.0：去重功能增强。① 一键清理：扫描结果新增"一键清理多余版本"，把每组建议删除的文件移入回收站目录（不直接删除，清单可回滚还原）；② 同名同曲识别：新增按标签/文件名的"歌手+歌名"匹配分组，可识别不同音源转码、指纹不同的 flac/mp3 重名版本；③ 垃圾头文件评分修正：头部含垃圾字节的 FLAC 按格式权重参与音质评分，不再因 0 分被误淘汰。v0.4.0：新增"文件头修复"功能。部分下载工具失败重试时会把 JSON 错误响应写进文件头，文件变为"垃圾字节 + 完整音频"：PotPlayer 等播放器可跳过播放，但标签工具无法解析。本版检测此类文件（扫描音频魔数偏移），提供一键剥离垃圾头（自动备份可回滚），修复后标签立即可读、整理/编辑全部可用；整理与标签编辑对这类文件标记"可修复"而非误判为损坏。v0.3.1：修复损坏/下载失败占位音频文件被误判的问题。整理与标签编辑不再把无法解析的文件当作 Unknown Artist/无标签处理：这类文件在预览中明确标记"无法解析（文件损坏或下载失败占位文件）"并跳过，不再被打包进 Unknown 目录，也不会被静默忽略。v0.3.0：新增"仅网关模式"开关（config.conf 设置 auth_enabled=false 后仅信任飞牛桌面/统一网关访问，浏览器直连一律拒绝）；明确访问令牌告知：安装向导提示令牌查看位置（config.conf / 应用日志 info.log），前端显示当前鉴权模式与令牌存放路径。v0.2.0：新增批量标签编辑（字段修改/文件名→标签补全/封面嵌入删除，预览应用回滚）、按目录生成 .m3u8 播放列表、排除子目录规则、封面缩略图展示；性能重构：去重指纹计算多线程并行、所有长任务后台化并支持进度与取消、单次扫描复用；修复 FLAC/OGG/Opus 标签从未被处理、MP3 音质评分失真、回滚接口失效等问题；新增 55 项自动化测试。v0.1.0：首个版本。编码修复（GBK/Big5/GB18030 择优解码、截断字节兜底、备份清单回滚）、去重（SHA-256 + fpcalc 音频指纹 + 音质评分保留最佳）、整理（标签→目录重排，移动/复制可回滚）。
changelog             = """v0.20.6：修复音乐库加载崩溃与编码修复三个用户反馈崩溃。根因：① common.get_cover() 对无标签文件（tags=None 的 MP3/截断文件）直接调用 t.tags.getall('APIC')，tag_kind 对 tags=None 的 MP3 按类型名推断为 'id3' → 'NoneType' object has no attribute 'getall'；② encoding iter_text_fields() 的 Vorbis 分支对 MP4 标签（MP4Tags 无 getall 落入此分支）执行 [str(x) for x in tags.get(key)]，MP4 的 cpil/pgap/pcst 原子键值是 bool → 'bool' object is not iterable；③ library tree() 对个别异常文件（网盘挂载/损坏/特殊编码文件名）无 try/except 保护，整个加载失败 → 前端 libData.by_artist undefined 报错。修复：① get_cover 开头加 tags=None 保护（无标签容器安全返回 None）；② iter_text_fields 跳过 bool/int/float 非文本原子键；③ tree 单文件解析包 try/except 失败跳过不中断整库；④ 前端 api() 识别 200+error 响应、allSongs() 结构防护。新增 4 个回归单测（test_common/test_library）。v0.20.5：修复侧栏版本号不显示（fpk 安装场景）。根因：fpk 打包时 manifest 只落在 fpk 根部（安装后到系统侧 /var/apps/），应用运行目录无 manifest；server.py _app_version() 只查应用目录及其父目录 → 返回空 → health version 为空 → UI 侧栏版本号不渲染。修复：① _app_version() 优先读 fnOS 注入的 TRIM_APPVER 环境变量，并增加系统侧 /var/apps/<appname>/manifest 候选路径；② build.sh 打包时复制 manifest 进应用包（app/manifest），安装后应用目录即可读到版本号。v0.20.4：修复启动「端口被占用」误报（真正根治）。根因：fnOS 启动前预检 manifest 固定 service_port=4534（checkport=true），与用户可配置的 wizard_app_port 脱节——4534 被其他应用占用时 fnOS 直接拦截报占用，用户换端口无效。修复：① manifest checkport 改为 false，改由应用自身绑定 wizard_app_port（用户可在应用设置改端口，config_callback 已持久化）；② cmd/main cleanup_port 不再用 lsof 杀端口占用者（此前会误杀占用同端口的其他应用），只清理 MusicMate 自身残留进程；③ server.py 端口绑定失败时输出明确错误到日志（提示改端口或停占用进程）。v0.20.3：修复去重页封面显示过大 + 部署同步固化。① 去重结果表格封面（.cover-thumb）此前无尺寸约束按原图渲染，补统一样式 40×40（音乐库列表一并统一）；② 部署同步固化：sync-ui.sh 现同步 manifest 到正式服务目录（server.py _app_version 依赖应用目录的 manifest，缺失会致 /api/health version 为空、UI 侧栏版本号不显示），post-commit 在提交含 manifest 改动时自动触发。v0.20.2：修复安装后启动提示「端口被占用」/换端口无效。根因：① cmd/main 用 source 读 config.conf 取端口，config.conf 中 ai_endpoint 等值含 &、空格等 shell 特殊字符时会破坏 source（端口读取失效）；② config_callback 为空脚本，用户在应用设置改端口后 wizard_app_port 不持久化（换端口无效）；③ install_callback 用 `>` 覆盖写 config.conf，重装清空用户在设置页保存的配置。修复：cmd/main 改为 grep 只提取 wizard_app_port；config_callback 实现端口合并持久化；install_callback 改为合并写保留既有配置；server.py 端口绑定失败时输出明确错误到日志。v0.20.1：开发者/发布者信息更新。maintainer/distributor 改为「集家嘴的壳玛🐸」，maintainer_url/distributor_url 指向 https://kyeo.top（fpk 安装包元数据随包生效）。v0.20.0：优化清单 18 项全部落地（OPTIMIZATION.md 闭环，17 次提交）。① 功能：音乐库歌曲列表新增「🤖 AI 识别」入口（P7.1，点击打开单曲编辑并自动 AI 识别，diff 勾选采纳）；设置页 ShazamIO 安装状态自检提示（未安装显示「勾选无效」）；侧栏版本号与后端不一致时显示 ⚠ 提示；歌手头像磁盘缓存（跨会话复用，减少 iTunes 重复请求）；/api/cover 在线兜底按场景开关（online 参数，列表缩略图不再批量打 iTunes）；歌手列表页头像说明小字。② 安全：config.conf 启动时收紧 0600（/api/settings 返回 config_secure）；/api/cover 路径白名单（realpath 规范化，拒绝符号链接逃逸/.. 穿越）。③ 重构：配置对象化（CONFIG dict 原地更新，删除全部 global 声明，根治 UnboundLocalError 隐患）；server.py 路由拆分（_api 分派器 + core/batch/tagedit/tags/library 五组子方法）；公共 http.py（统一 UA/超时/限速/强制 IPv4，itunes/musicbrainz/lyrics/recognize 四模块迁移）；main.js 顶部 38 项分区索引；前端纯逻辑抽取（selectedRecognizeModules/collectSongDiff 消除重复）。④ 工程：pre-commit 钩子（提交前跑全量测试 + JS 语法检查）；测试音频 fixture 生成（ffmpeg 合成，不再依赖绝对路径）；前端 JS 结构测试（test_js_structure）；help.md 补封面/歌手头像章节；0.17.3 队列/历史/收藏明确为已完成；虚拟列表评估暂缓（库 390 首无瓶颈，等规模达数千首再启用）。319 项测试全绿。v0.19.0：听歌识曲（P11）。单曲编辑新增「🎵 听歌识曲」按钮：以音频内容识别歌曲、纠正错误标签。AcoustID（Chromaprint 指纹，免费非商业，需注册应用 KEY）为主：fpcalc 生成音频指纹 → AcoustID /v2/lookup 查库 → 返回歌名/歌手/专辑/年份/封面；未命中且已装 ShazamIO 时自动兜底（逆向 Shazam API，免费免 KEY，曲库大华语覆盖好；可选依赖，未安装静默降级）。识别结果字段 diff 勾选采纳（可修正已有错误字段）+ 封面预览/应用（可回滚），交互与「数据库查询」一致。设置页新增「🎵 听歌识曲（AcoustID）」卡片配置 KEY（未配置时按钮隐藏）。新增 /api/tags/recognize 端点；308 项测试全绿。v0.18.1：音乐库播放器体验修复。① 播放器固定视口底部：原 position:sticky 在内容不足一屏时（收藏/最近播放/空结果等）会随内容上移，改为 position:fixed 底部居中限宽，.lib-app 预留 88px 底部空间防遮挡列表最后一行；② 底部进度条颜色对齐全屏：轨道底色由纯黑"""
desktop_uidir         = ui
desktop_applaunchname = musicmate.Application
ctl_stop              = true
service_port          = 4534
checkport             = false
checksum              = 8b9a5f227aec9074225ecf01f8864852
