--- name: puremusic description: Pure-music 项目开发指南,覆盖 Windows Flutter/Dart 前端、Rust 后端、音频播放、歌词解析与渲染、桌面歌词、主题背景、设置、FFI、文档和测试。处理此仓库的代码理解、问题诊断、功能开发、缺陷修复、性能优化或代码审查时使用。 --- # Pure-music 开发 ## 开始工作 1. 先读仓库根目录的 `AGENTS.md`,再检查 `git status --short`;把已有改动视为用户工作,不覆盖、不回退。 2. 先定位实际调用链和现有实现,再决定修改位置;代码与本 skill 不一致时,以当前代码为准,并同步修正本 skill 中的过时信息。 3. 控制修改范围,不顺手重构无关代码;不创建分支、不提交、不推送,除非用户在当前任务中明确要求。 ## 受保护功能 修改下列功能前先明确告知用户将涉及哪些文件和行为: - 原文、翻译、注音的分组管理。 - 音调调节。 - 流光背景的音频律动模式。 - 其他已经上线的特有功能;无法确定是否属于保护范围时,先询问用户。 告知后再编辑相关文件,不把相邻重构混入修改。 ## 代码导航 - 应用入口与路由:`lib/main.dart`、`lib/entry.dart`。 - 全局设置与播放偏好:`lib/core/settings.dart`、`lib/core/preference.dart`。 - 应用内快捷键与全局热键:`lib/core/hotkeys.dart`、`lib/core/hotkey_binding.dart`、`lib/page/settings_page/hotkey_settings.dart`;设置入口在「播放 → 应用内快捷键 / 全局热键」。 - 主题与颜色:`lib/core/theme.dart`、`lib/core/color_extraction.dart`、`lib/core/desktop_lyric_colors.dart`;封面取色实现位于 `rust/src/api/color_extraction.rs`。 - 歌词模型和解析:`lib/lyric/`;在线歌词获取与转换:`lib/services/online_lyric/`。 - 播放页和歌词 UI:`lib/page/now_playing_page/`,组件集中在其 `component/` 目录。 - 播放、歌词和桌面歌词服务:`lib/play_service/`;底层播放封装:`lib/native/bass/`。 - 详情页播放入口:`lib/page/uni_detail_page.dart`、`lib/page/uni_page_components.dart`;顺序播放使用 `PlayAll`,随机播放使用 `ShufflePlay`,当前只有专辑详情页启用 `enablePlayAll`。 - 播放页控件和歌词来源:`lib/page/now_playing_page/large_page.dart`、`small_page.dart`、`component/lyric_source_view.dart`;常驻控件设置由 `AppSettings.alwaysShowNowPlayingControls` 管理。 - 桌面歌词过渡与高亮:`lib/play_service/lyric_service.dart`、`desktop_lyric_service.dart`;显示组件的换行和逐词高亮在 `pure-player-lyric` 仓库维护。 - 演出模式:`lib/page/concert_page.dart`;节目单持久化在 `lib/services/concert_program_store.dart`,Dart 调用封装在 `lib/services/smart_sort_service.dart`,核心编排算法在 `rust/src/smart_sort/`。 - 单曲标签和歌词编辑:`lib/page/audio_detail_page.dart`;LRC 序列化在 `lib/lyric/lrc_serializer.dart`,实际标签读写通过 Rust tag API 完成。 - 任务栏缩略图与封面预览:`lib/play_service/taskbar_thumbnail_service.dart`、`windows/runner/taskbar_thumbnail.*`。 - Dart FFI 绑定:`lib/native/rust/`;Rust API:`rust/src/api/`。 - Windows 平台代码:`windows/`;独立桌面歌词模块:`desktop_lyric/`。 - 项目文档:`page/docs/`;测试:`test/` 和 `integration_test/`。 涉及播放页样式、动画、播放进度、歌词跟随、频谱或动态背景时,编辑前完整阅读 [播放页性能规则](references/player-performance.md)。 ## 既有模式 - 使用 `AppSettings.instance` 管理全局配置,使用 `AppPreference.instance` 管理播放偏好。 - 播放页显示设置通过 `AppSettings.rebuildNotifier` 通知控件重建;新增设置要同时接入读取、保存和设置页入口。 - 使用 `ThemeProvider` 下发主题;使用 `LyricRenderConfig` 和 `LyricViewController` 管理歌词视觉配置,不引入新的状态管理库。 - 封面主色和调色板由 Rust 提取,Dart 侧的 `ColorExtractionService` 只缓存提取结果,不增加重复的 Dart 取色链路。 - 使用 `Symbols.xxx` 图标;颜色透明度使用 `Color.withValues(alpha:)`。 - 不在 `build` 中启动动画、读配置或触发其他副作用;异步回调更新界面前检查 `mounted`。 - 把 `lib/native/rust/` 和 `rust/src/frb_generated.rs` 中的绑定视为生成代码;修改 Rust API 后通过项目现有生成配置更新,不手工维护生成结果。 - 桌面歌词只把歌词文件明确标出的长空白行视为过渡行;普通歌词行之间的时间间隔不自动生成插播空白。 - 演出模式的编排顺序只替换当前播放队列,不修改来源歌单;调整参数时复用已缓存的音频分析结果。 ## 播放页约束 - 复用现有同步信号、共享帧驱动和缓存,不为单个视觉组件新增常驻高频订阅、短周期定时器或独立 Ticker。 - 每帧路径不做 FFI、文件读取、图片解码、调色板提取、大集合分配或整页 `setState`。 - 仅让可见且需要动画的页面、歌词行和背景执行逐帧工作;暂停、隐藏、切换模式和销毁时停止或解绑。 - 为图片、Painter、Paragraph、滤镜、频谱和调色板缓存定义上限与清理时机;保留切歌过渡需要的新旧资源,过渡后释放旧资源。 - 没有相同条件下的运行态数据时,只陈述静态检查结果,不宣称内存、CPU、GPU 或帧率已经达标。 ## 修改与验证 1. 复用仓库已有写法,注释只说明做了什么和为什么做,不写来源,不增加无意义的空行。 2. 仅格式化本次修改的源文件;对改动范围执行静态分析,确保没有新增警告或错误。 3. 除非用户明确要求,不主动运行完整构建或完整测试套件;未运行的验证项目如实说明,不把静态分析写成编译或性能结论。 4. 完成后检查 `git diff --check`、相关 diff 和 `git status --short`,确认没有覆盖用户已有改动。 5. 最终回复不超过 3 句,说明改了哪些文件、做了什么,以及实际执行的验证,不粘贴 diff。 ## 发布文档 - GitHub Release 正文按用户能理解的功能分组书写,优先说明可感知的变化和使用位置。 - 拟定 Release 前,以最近一次由 Action 同步的版本提交为边界核对全部用户可见提交,不能只根据最近几条提交概括。 - `page/docs/guide/changelog.md`、`page/docs/public/latest-release.json` 和版本同步文件由 GitHub Action 根据 Release 自动更新,不在常规功能提交中手工维护。