[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-84151":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":8,"language":10,"languages":8,"totalLinesOfCode":8,"stars":11,"forks":12,"watchers":13,"openIssues":14,"contributorsCount":15,"subscribersCount":15,"size":15,"stars1d":16,"stars7d":17,"stars30d":17,"stars90d":15,"forks30d":15,"starsTrendScore":18,"compositeScore":19,"rankGlobal":8,"rankLanguage":8,"license":20,"archived":21,"fork":21,"defaultBranch":22,"hasWiki":23,"hasPages":21,"topics":24,"createdAt":8,"pushedAt":8,"updatedAt":30,"readmeContent":31,"aiSummary":8,"trendingCount":15,"starSnapshotCount":15,"syncStatus":32,"lastSyncTime":33,"discoverSource":34},84151,"Sollin-Music-Desktop","Ryderwe\u002FSollin-Music-Desktop","Ryderwe",null,"https:\u002F\u002Fwww.223210.xyz","TypeScript",84,12,55,1,0,6,17,29,62.54,"MIT License",false,"main",true,[25,26,27,28,29],"applemusic","electron","lx-music-desktop","music","musicplayer","2026-06-12 04:01:43","# Sollin｜一款兼容在线和本地的音乐播放客户端\n\n\u003Cp>\n  \u003Ca href=\"LICENSE\">\u003Cimg alt=\"License: MIT\" src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Flicense-MIT-blue.svg?style=flat-square\">\u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FRyderwe\u002FSollin-Music-Desktop\u002Fstargazers\">\u003Cimg alt=\"GitHub stars\" src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fstars\u002FRyderwe\u002FSollin-Music-Desktop?style=flat-square\">\u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FRyderwe\u002FSollin-Music-Desktop\u002Freleases\">\u003Cimg alt=\"GitHub release\" src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fv\u002Frelease\u002FRyderwe\u002FSollin-Music-Desktop?include_prereleases&style=flat-square\">\u003C\u002Fa>\n  \u003Cimg alt=\"Electron 28\" src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FElectron-28-47848F?logo=electron&logoColor=white&style=flat-square\">\n  \u003Cimg alt=\"React 18\" src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FReact-18-61DAFB?logo=react&logoColor=20232A&style=flat-square\">\n  \u003Cimg alt=\"TypeScript\" src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FTypeScript-5-3178C6?logo=typescript&logoColor=white&style=flat-square\">\n  \u003Cimg alt=\"Platform\" src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fplatform-Windows%20%7C%20macOS%20%7C%20Linux-lightgrey?style=flat-square\">\n\u003C\u002Fp>\n\n博客： [月明星稀](https:\u002F\u002Fwww.ymxx.net)\n\n中文 | [English](README.en.md)\n\nSollin 是一个基于 Electron、React、TypeScript、Vite 和 Tailwind CSS 构建的跨平台桌面音乐播放器。它主要面向本地播放和在线播放：本地播放负责本地曲库、歌单、歌词、下载和备份；在线播放依赖用户自行导入的 LX JS 音源脚本。\n\nSollin 桌面端从 `1.3.1` 版本开始开源。本开源版本不包含私有后端账号、激活、服务端云备份等功能，也不包含私有音源脚本或私有音乐 API。公告可选使用公开 GitHub Issue 评论获取，不依赖私有后端。\n\n## 目录\n\n- [环境要求](#环境要求)\n- [配置说明](#配置说明)\n- [安装依赖](#安装依赖)\n- [本地开发](#本地开发)\n- [构建](#构建)\n- [桌面端打包](#桌面端打包)\n- [GitHub Actions 打包](#github-actions-打包)\n- [更新检查](#更新检查)\n- [公告配置](#公告配置)\n- [音源配置](#音源配置)\n- [预览图](#预览图)\n- [功能清单](#功能清单)\n- [技术栈](#技术栈)\n- [项目结构](#项目结构)\n- [原生模块](#原生模块)\n- [常见问题](#常见问题)\n- [开源注意事项](#开源注意事项)\n- [致谢](#致谢)\n- [许可证](#许可证)\n- [Star 趋势](#star-趋势)\n\n## 环境要求\n\n- 推荐 Node.js 20，Node.js 18 或更新版本通常也可以运行。\n- npm 9 或更新版本。\n- Git。\n- 各系统打包建议在目标系统上执行：\n  - Windows 安装包建议在 Windows 上打包。\n  - macOS 安装包建议在 macOS 上打包。\n  - Linux 安装包建议在 Linux 上打包。\n\nElectron 支持有限的跨平台打包，但涉及原生模块、签名和安装器工具时，在目标系统上打包更可靠。\n\n## 配置说明\n\n复制环境变量示例文件：\n\n```bash\ncp .env.example .env.local\n```\n\n可用变量：\n\n```env\nVITE_APP_VERSION=1.3.1\nVITE_DEV_SERVER_PORT=5173\nVITE_GITHUB_REPO=Ryderwe\u002FSollin-Music-Desktop\nVITE_GITHUB_ANNOUNCEMENT_REPO=Ryderwe\u002FSollin-Music-Desktop\nVITE_GITHUB_ANNOUNCEMENT_ISSUE_NUMBER=1\nVITE_GITHUB_ANNOUNCEMENT_AUTHOR=ryderwe\n```\n\n配置项说明：\n\n- `VITE_APP_VERSION`：当前应用版本，设置页和更新检查会读取该值。\n- `VITE_DEV_SERVER_PORT`：Vite 开发服务器端口。\n- `VITE_GITHUB_REPO`：用于检查更新的 GitHub 仓库，格式为 `owner\u002Frepo`。\n- `VITE_GITHUB_ANNOUNCEMENT_REPO`：用于读取公告评论的 GitHub 仓库，格式为 `owner\u002Frepo`。默认使用 `VITE_GITHUB_REPO`。\n- `VITE_GITHUB_ANNOUNCEMENT_ISSUE_NUMBER`：用于读取公告的 Issue 编号。官方默认使用 `1`，显式留空时关闭公告检查。\n- `VITE_GITHUB_ANNOUNCEMENT_AUTHOR`：只显示该 GitHub 用户发布的评论，默认 `ryderwe`。\n\n开源版本不需要配置私有服务地址。请不要把 `.env.local`、Token、证书、本机路径或内部接口文档提交到仓库。\n\n## 安装依赖\n\n```bash\nnpm install\n```\n\n用于 CI 或正式发布时，建议使用可复现安装：\n\n```bash\nnpm ci\n```\n\n## 本地开发\n\n只启动 Web 渲染进程：\n\n```bash\nnpm run dev\n```\n\n启动完整 Electron 桌面端：\n\n```bash\nnpm run electron:dev\n```\n\n默认 Vite 开发服务器端口为 `5173`，可通过 `VITE_DEV_SERVER_PORT` 修改。\n\n## 构建\n\n构建渲染进程和 Electron 主进程：\n\n```bash\nnpm run build\n```\n\n只构建渲染进程：\n\n```bash\nnpm run build:web\n```\n\n只编译 Electron 主进程：\n\n```bash\nnpm run electron:compile\n```\n\n预览 Vite 生产构建：\n\n```bash\nnpm run preview\n```\n\n## 桌面端打包\n\n打包产物会输出到 `release\u002F` 目录。\n\n### 当前系统打包\n\n```bash\nnpm run electron:build\n```\n\n### Windows\n\n在 Windows 上运行：\n\n```bash\nnpm run electron:build:win\n```\n\n明确打包 x64：\n\n```bash\nnpm run electron:build:win:x64\n```\n\n配置的输出格式：\n\n- NSIS 安装包：`release\u002F*.exe`\n- 便携版可执行文件：`release\u002F*.exe`\n\n### macOS\n\n在 macOS 上运行：\n\n```bash\nnpm run electron:build:mac\n```\n\nApple Silicon：\n\n```bash\nnpm run electron:build:mac:arm64\n```\n\nIntel：\n\n```bash\nnpm run electron:build:mac:x64\n```\n\n配置的输出格式：\n\n- 磁盘映像：`release\u002F*.dmg`\n- ZIP 压缩包：`release\u002F*.zip`\n\n未签名的本地构建可以使用：\n\n```bash\nCSC_IDENTITY_AUTO_DISCOVERY=false npm run electron:build:mac\n```\n\n如果要公开分发 macOS 版本，需要配置 Apple Developer 证书和 electron-builder 公证凭据。\n\n### Linux\n\n在 Linux 上运行：\n\n```bash\nnpm run electron:build:linux\n```\n\n明确打包 x64：\n\n```bash\nnpm run electron:build:linux:x64\n```\n\n配置的输出格式：\n\n- AppImage：`release\u002F*.AppImage`\n- Debian 包：`release\u002F*.deb`\n\n如果 Debian 或 Ubuntu 打包环境缺少常用工具，可先安装：\n\n```bash\nsudo apt-get update\nsudo apt-get install -y libarchive-tools\n```\n\n## GitHub Actions 打包\n\n`.github\u002Fworkflows\u002Fpackage.yml` 会构建 Windows、macOS Intel、macOS Apple Silicon 和 Linux 包。\n\n手动打包：\n\n1. 打开 GitHub Actions。\n2. 选择 `Package Desktop Apps`。\n3. 点击 `Run workflow`。\n4. 在任务完成后下载 artifacts。\n\n通过标签触发发布打包：\n\n```bash\ngit tag v1.3.1\ngit push origin v1.3.1\n```\n\n推送 `v*` 标签会构建所有配置的平台，并创建 GitHub Release 上传产物。也可以在手动运行 workflow 时通过 `publish_release` 输入项发布 Release。\n\n## 更新检查\n\n开源版本使用 GitHub Releases 检查更新。应用会请求 `VITE_GITHUB_REPO` 指向仓库的 latest release，并根据当前系统优先选择匹配的安装包资产。\n\n发布新版本时建议：\n\n1. 更新 `package.json` 和 `.env.example` 中的版本号。\n2. 执行构建和打包。\n3. 创建形如 `v1.3.2` 的 Git 标签。\n4. 在 GitHub Release 中上传 Windows、macOS 和 Linux 安装包。\n\n## 公告配置\n\n开源版本可以从公开 GitHub Issue 评论读取公告。配置 `VITE_GITHUB_ANNOUNCEMENT_ISSUE_NUMBER` 后，应用启动时会请求该 Issue 的 comments API，只显示 `VITE_GITHUB_ANNOUNCEMENT_AUTHOR` 指定用户发布的最新一条评论。用户关闭后会在本地记录已读；同一条评论更新后会再次提示。\n\n使用方式：\n\n1. 在公开仓库中新建一个固定 Issue，例如标题为 `Announcements`。\n2. 只用 `ryderwe` 账号在该 Issue 下发布公告评论。\n3. 将该 Issue 编号写入 `.env.local` 的 `VITE_GITHUB_ANNOUNCEMENT_ISSUE_NUMBER`。\n\n该功能只请求 GitHub 公共 API，不需要 Token，也不会接入私有后端。\n\n## 音源配置\n\n在线播放和在线搜索依赖用户自行导入的 LX JS 音源脚本。开源仓库不包含私有、付费或内置音源脚本。\n\n在桌面端应用中，可以进入设置页的音源管理：\n\n- 从 URL 导入 LX JS 音源。\n- 导入本地 LX JS 音源文件。\n- 切换当前启用音源。\n- 按音源启用或关闭更新提醒。\n- 查看音源脚本声明的平台、动作和音质能力。\n\n请只使用你有权使用的音源脚本、音乐 API 和内容。\n\n## 预览图\n\n- ![AM 播放界面](images\u002Fam播放界面.png)\n- ![在线首页](images\u002F在线首页.png)\n- ![本地首页](images\u002F本地首页.png)\n- ![经典播放界面](images\u002F经典播放界面.png)\n- ![设置首页](images\u002F设置首页.png)\n\n## 功能清单\n\n### 播放\n\n- 播放、暂停、上一首、下一首。\n- 顺序播放、列表循环、单曲循环和随机播放。\n- 音量控制和静音。\n- 播放进度条和拖动跳转。\n- 系统媒体控制集成。\n- 迷你播放器模式。\n- Windows 和 macOS 下可配置的关闭行为。\n- 系统托盘控制。\n- 全局快捷键控制播放、暂停、上一首和下一首。\n- 在运行环境支持 `setSinkId` 时选择音频输出设备。\n\n### 在线音乐\n\n- 通过用户导入的 LX JS 音源脚本实现在线搜索和在线播放。\n- 多平台在线搜索。\n- 聚合搜索。\n- 在线歌曲、专辑、歌手、歌单和榜单页面。\n- 推荐歌单和歌单广场浏览。\n- 支持账号来源时提供每日推荐和私人 FM。\n- 在线收藏。\n- 导入在线歌单，并支持刷新和可选自动更新。\n- 当前来源无法播放时尝试来源回退。\n- 音质选择，来源支持时可显示普通、无损、高解析等音质标签。\n\n### 本地音乐\n\n- 扫描本地音乐文件夹。\n- 按歌曲、专辑、歌手浏览本地曲库。\n- 本地收藏。\n- 本地歌单。\n- 读取本地文件元数据。\n- 编辑本地歌曲标签。\n- 支持内嵌歌词、翻译歌词、罗马音歌词和逐词歌词，具体取决于文件元数据。\n- 支持同名外置歌词和封面文件回退。\n- 可配置本地标签优先级，在内嵌元数据和外置文件之间切换。\n\n### 歌单与曲库\n\n- 创建和删除本地歌单。\n- 从歌曲菜单和播放器菜单添加歌曲到歌单。\n- 侧边栏歌单拖拽排序。\n- 导入在线歌单。\n- 将支持的在线专辑或歌单转换为本地歌单。\n- 最近播放列表。\n- 在线音乐和本地音乐分别收藏。\n\n### 歌词\n\n- 标准歌词展示。\n- Apple Music 风格歌词展示。\n- TTML 歌词渲染。\n- 数据可用时支持逐词歌词。\n- 翻译和罗马音展示。\n- 歌词页和播放器歌词设置。\n- Electron 桌面歌词窗口。\n- 桌面歌词锁定与解锁。\n- macOS 菜单栏歌词。\n- 底部播放栏歌词预览。\n\n### 下载\n\n- 在桌面端下载歌曲。\n- 下载任务管理页面。\n- 自定义下载目录。\n- 自定义文件命名规则。\n- 下载后写入元数据。\n- 可选导出旁挂 `.lrc` 歌词和封面图片。\n\n### 音效\n\n- 音频可视化。\n- 均衡器预设和自定义增益。\n- 混响预设。\n- 空间音频控制。\n- 播放速度控制。\n- 播放器背景支持专辑封面、流体和可视化模式。\n\n### 数据、备份与同步\n\n- 本地 JSON 导出和导入。\n- 可选择备份项目。\n- WebDAV 备份和恢复。\n- 类似 lx-music-desktop 行为的局域网数据同步。\n- 局域网同步支持主机模式和客户端模式。\n- 可同步选定曲库数据、不喜欢规则、下载规则和部分界面设置。\n- 数据缓存和音频缓存支持容量限制与清理。\n\n### 界面\n\n- 亮色、暗色和跟随系统主题。\n- 响应式 Electron 窗口布局。\n- 侧边栏展开和收起。\n- 搜索历史。\n- 设置页按音源、数据、下载、本地音乐、外观、快捷键、音频和关于等模块组织。\n\n### 开源版已移除的功能\n\n- 私有后端账号登录、注册和会话。\n- 激活码和设备绑定。\n- 私有后端公告和全局通知。\n- 服务端云备份。\n- 通过私有服务检查更新。\n- 通过私有服务下发配置。\n\n## 技术栈\n\n- Electron 28\n- React 18\n- TypeScript\n- Vite 5\n- Tailwind CSS\n- Zustand\n- React Router\n- Radix UI\n- Framer Motion\n- electron-builder\n\n## 项目结构\n\n```text\n.\n├── electron\u002F                 Electron 主进程、preload 脚本和桌面端 IPC\n├── src\u002F\n│   ├── components\u002F           通用 React 组件\n│   ├── pages\u002F                路由页面\n│   ├── services\u002F             播放、搜索、下载、备份和同步服务\n│   ├── stores\u002F               Zustand 状态管理\n│   ├── types\u002F                共享 TypeScript 类型\n│   ├── utils\u002F                工具函数\n│   ├── App.tsx               应用路由和顶层副作用\n│   └── main.tsx              渲染进程入口\n├── build\u002F                    electron-builder 使用的图标和原生资源\n├── public\u002F                   静态资源\n├── index.html                主渲染页面 HTML\n├── desktop-lyrics.html       桌面歌词窗口 HTML\n├── package.json              脚本、依赖和 electron-builder 配置\n└── vite.config.ts            Vite 配置\n```\n\n## 原生模块\n\n本项目使用 Electron 原生模块能力：\n\n- `node-taglib-sharp` 用于音频标签操作。\n- `build\u002FRelease\u002Fqrc_decode.node` 用作原生歌词解码回退。\n\n仓库中的 `qrc_decode.node` 是平台相关二进制文件。如果要为其他系统或架构打包，并且需要该能力，请构建或提供匹配的原生二进制，并更新 `build\u002FRelease` 资源布局。\n\n如果缺少原生歌词解码器，应用会优先尝试 JavaScript 解码，并在可能的情况下自动降级。\n\n## 常见问题\n\n### `npm run electron:dev` 无法连接 Vite\n\n检查开发服务器端口：\n\n```bash\nVITE_DEV_SERVER_PORT=5174 npm run electron:dev\n```\n\n### macOS 打包后无法打开\n\n未签名的本地构建可能被 Gatekeeper 拦截。内部测试可以在 Finder 中通过右键菜单打开。公开分发时应进行签名和公证。\n\n### Windows 打包失败\n\n关闭正在运行的应用实例，清理 `release\u002F` 目录，然后在干净的终端中重新执行打包命令。某些情况下还需要检查杀毒软件是否锁定了输出文件。\n\n### 在线播放失败\n\n确认已经导入并启用了有效音源脚本，同时确认该音源脚本支持当前平台和所选音质。\n\n### 检查更新失败\n\n确认 `VITE_GITHUB_REPO` 指向公开仓库，且该仓库已经创建至少一个 GitHub Release。\n\n## 开源注意事项\n\n- 不要提交 `.env.local`、Token、私有服务地址、签名证书、本机路径或内部接口文档。\n- 本仓库只保留桌面客户端代码，不包含私有服务实现和私有音源脚本。\n- 如果密钥、Token 或真实服务地址曾经被提交到其他仓库，即使后来删除，也应该立即轮换。\n- 发布前检查 Git 历史、release 产物和 CI 日志，确认没有敏感信息。\n- 遵守第三方代码、音源脚本、音乐 API 和内容服务的许可与使用条款。\n- 本项目是客户端应用，你需要自行确认配置的来源、API 和内容具备合法使用权限。\n\n## 致谢\n\nSollin 是独立项目，但它受益于以下开源项目的思路和生态：\n\n- [LX Music Desktop](https:\u002F\u002Fgithub.com\u002Flyswhut\u002Flx-music-desktop)：桌面音乐播放器行为、本地数据流程、同步概念和 LX 音源脚本生态的重要参考。\n- [Apple Music-like Lyrics](https:\u002F\u002Fgithub.com\u002Famll-dev\u002Fapplemusic-like-lyrics)：用于实现 Apple Music 风格歌词体验的歌词渲染库。\n- Electron、React、Vite、TypeScript、Tailwind CSS 以及更广泛的开源生态。\n\n- [linux.do](https:\u002F\u002Flinux.do)：Linux 社区，AI交流平台。\n\n## 许可证\n\nMIT。详见 [LICENSE](LICENSE)。\n\n## Star History\n\n\u003Ca href=\"https:\u002F\u002Fwww.star-history.com\u002F?type=date&repos=Ryderwe%2FSollin-Music-Desktop\">\n \u003Cpicture>\n   \u003Csource media=\"(prefers-color-scheme: dark)\" srcset=\"https:\u002F\u002Fapi.star-history.com\u002Fchart?repos=Ryderwe\u002FSollin-Music-Desktop&type=date&theme=dark&legend=top-left\" \u002F>\n   \u003Csource media=\"(prefers-color-scheme: light)\" srcset=\"https:\u002F\u002Fapi.star-history.com\u002Fchart?repos=Ryderwe\u002FSollin-Music-Desktop&type=date&legend=top-left\" \u002F>\n   \u003Cimg alt=\"Star History Chart\" src=\"https:\u002F\u002Fapi.star-history.com\u002Fchart?repos=Ryderwe\u002FSollin-Music-Desktop&type=date&legend=top-left\" \u002F>\n \u003C\u002Fpicture>\n\u003C\u002Fa>\n",2,"2026-06-11 04:12:24","CREATED_QUERY"]