From 676541457bd307d05f92b945d86865f7e981a4de Mon Sep 17 00:00:00 2001 From: Jocay <1579649885@qq.com> Date: Sun, 11 Oct 2026 11:31:29 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20P7=20=E5=9C=A8=E7=BA=BF=E6=92=AD?= =?UTF-8?q?=E6=94=BE=EF=BC=88=E6=92=AD=E6=94=BE=E9=98=9F=E5=88=97=E3=80=81?= =?UTF-8?q?=E5=AA=92=E4=BD=93=E6=8E=A7=E5=88=B6=EF=BC=89=E4=B8=8E=E8=87=AA?= =?UTF-8?q?=E5=BB=BA=E6=AD=8C=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 播放器:统一 PlayItem 队列,顺序 / 列表循环 / 单曲循环 / 随机,滚动歌词含翻译,Media Session,队列与进度存 localStorage - 在线播放音质可在设置中选择;曲库已有的歌优先播放本地文件 - 自建歌单:混排在线曲目与本地文件,拖动排序,一键下载曲库缺失曲目 Co-Authored-By: Claude Opus 5.5 --- CLAUDE.md | 10 +- README.md | 6 +- server/src/app.ts | 3 +- server/src/db.ts | 25 + server/src/library.ts | 54 +++ server/src/playlists.ts | 257 ++++++++++ server/src/routes/api.ts | 65 ++- server/src/settings.ts | 15 +- server/src/stream.ts | 20 +- web/src/App.vue | 2 + web/src/components/CoverMosaic.vue | 55 +++ web/src/components/DetailHeader.vue | 18 +- web/src/components/Icon.vue | 12 + web/src/components/PlayPanel.vue | 318 +++++++++++++ web/src/components/PlayerBar.vue | 293 +++++++++--- web/src/components/PlaylistPicker.vue | 246 ++++++++++ web/src/components/TrackList.vue | 68 ++- web/src/lib/api.ts | 78 ++++ web/src/lib/format.ts | 7 + web/src/lib/player.ts | 538 ++++++++++++++++++--- web/src/lib/playlists.ts | 76 +++ web/src/lib/store.ts | 3 + web/src/router.ts | 3 + web/src/views/AlbumView.vue | 11 +- web/src/views/HistoryView.vue | 2 +- web/src/views/LibraryView.vue | 80 +++- web/src/views/MyPlaylistView.vue | 648 ++++++++++++++++++++++++++ web/src/views/PlaylistView.vue | 6 + web/src/views/PlaylistsView.vue | 225 +++++++++ web/src/views/SettingsView.vue | 25 +- 30 files changed, 2995 insertions(+), 174 deletions(-) create mode 100644 server/src/playlists.ts create mode 100644 web/src/components/CoverMosaic.vue create mode 100644 web/src/components/PlayPanel.vue create mode 100644 web/src/components/PlaylistPicker.vue create mode 100644 web/src/lib/playlists.ts create mode 100644 web/src/views/MyPlaylistView.vue create mode 100644 web/src/views/PlaylistsView.vue diff --git a/CLAUDE.md b/CLAUDE.md index 168af25..9710aae 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -22,10 +22,12 @@ - `core/providers/{netease,qq}/` 实现 `MusicProvider`(`core/types.ts`),在 `providers/index.ts` 注册;`resolveLink` 处理分享短链 - QQ:`qq/client.ts` 的 `musicu()` 在 comm 中带 `uin` + `authst` 并附 Cookie —— 缺这一步拿不到 VIP 音源 - `queue.ts` — 任务存 SQLite `tasks` 表,进度只在内存,经 `events.ts` 的 bus 推送;`routes/api.ts` 的 `/api/events` 是 SSE - - `accounts.ts`(Cookie 用 `secret.ts` AES-GCM 加密存储)、`settings.ts`(运行时设置)、`auth.ts`(可选访问密码)、`library.ts`(曲库工具)、`stream.ts`(试听代理) - - `db.ts` — `node:sqlite`;history / tasks / settings 表 + - `playlists.ts` — 自建歌单(`playlists` / `playlist_items` 表);条目要么是在线曲目(source + track_id)要么是曲库文件(path),`item_key` 去重。读取时给在线曲目补 `localFile`、给文件补 `missing` + - `accounts.ts`(Cookie 用 `secret.ts` AES-GCM 加密存储)、`settings.ts`(运行时设置)、`auth.ts`(可选访问密码)、`library.ts`(曲库工具)、`stream.ts`(在线播放代理,音质取设置 `playQuality`) + - `db.ts` — `node:sqlite`;history / tasks / settings / playlists / playlist_items 表 - `web/` — Vite 8 + Vue 3.5 + Vue Router 5,无 UI 库 - - `lib/store.ts` 全局状态 + SSE;`lib/player.ts` 试听;`lib/api.ts` 类型与请求 + - `lib/store.ts` 全局状态 + SSE;`lib/api.ts` 类型与请求 + - `lib/player.ts` 播放器:单个 `