✨ 一个把多源在线播放、本地管理、歌词体验和自建同步做进原生 Android 的音频播放器 🎵
本项目的名称及图标灵感来源于《星空鉄道とシロの旅》中的角色「风又音理」。
项目采用原生 Android 开发,支持 Android 9 (API 28) 及以上设备,
围绕「多源探索、在线播放、本地可控、数据自持」持续打磨。
🛠️
Active development / 持续迭代中
> [!WARNING]
> 本项目仅供学习与研究使用,请勿将其用于任何非法用途。
>
> 本项目及维护者不接受任何形式的赞助、捐赠或商业资助。
---
> [!NOTE]
> NeriPlayer 不提供公共云端曲库或媒体分发服务。
> 在线音频能力依赖用户在第三方平台上的账号授权,
> 会员或受限内容仍需遵循原平台规则。
---
## 快速定位 / Start here
如果你只是想体验应用,请看 [快速体验](#快速体验--getting-started)。
如果你想了解项目能力,请看 [项目亮点](#项目亮点--why-it-stands-out)
和 [核心特性](#核心特性--key-features)。
如果你准备贡献代码,请直接阅读 [CONTRIBUTING.md](./CONTRIBUTING.md)。
如果你要自建一起听服务端,请看
[一起听服务端部署](#一起听服务端部署--listen-together-deployment)。
```text
NeriPlayer
├── 多源在线播放:网易云 / Bilibili / YouTube Music
├── 本地优先数据:缓存、下载、歌单、历史、统计、设置
├── 可选自有同步:GitHub / WebDAV 元数据同步
├── 丰富播放体验:Media3、歌词、音效、流体背景、悬浮/状态栏歌词
└── 可恢复运行:安全模式、崩溃日志、ANR 记录、调试探针
```
## 项目简介 / About
NeriPlayer 是一个基于 **Jetpack Compose + Media3** 的原生 Android
音频播放器。它不构建公共云端服务,而是在用户具备第三方平台账号能力的前提下,
整合 **网易云音乐**、**Bilibili** 与 **YouTube Music** 的在线内容,
并提供本地播放、下载、缓存、歌单管理和多种同步/备份能力。
当前定位:
- **账号即能力**:通过第三方平台授权启用搜索、播放、歌单和收藏夹访问。
- **本地优先**:播放缓存、下载文件、歌单、历史记录、设置与授权信息默认保存在设备本地。
- **可选同步**:可将歌单、收藏、最近播放和播放统计同步到用户自己的
GitHub 仓库(应用内新建时默认使用私有仓库)或 WebDAV 远端文件。
- **尊重隐私与账号安全**:同步策略刻意保持去中心化,
数据写入用户自己控制的 GitHub/WebDAV 远端,而不是上传到项目维护者的中心化服务。
应用并非没有能力把播放历史回写到第三方音乐平台;但中心化音乐平台的客户端
通常存在风控与行为采样机制,直接上报历史播放数据可能触发异常登录、异常播放
或账号冻结等风险。出于保护账号安全的考虑,NeriPlayer 暂不向这些平台上传
本地播放历史和播放统计。
- **单 Activity + Compose 架构**:`MainActivity` 是唯一对外入口,
UI 由 Compose `NavHost`、动态底栏、Mini Player 与 Now Playing 覆盖层组织。
- **启动与恢复链路**:正常启动流程为
`Loading -> Disclaimer -> Onboarding -> Main`;
如果上次启动发生崩溃或系统 ANR,会先进入 `Safe Mode`。
- **测试护栏**:下载存储、同步合并、YouTube 取流、一起听、歌词解析、
播放策略、配置备份与安全模式等关键链路都有对应单元测试或设备测试。
---
## 项目亮点 / Why it stands out
- **本地优先,也认真做脱机体验**:
`NetworkStatusMonitor` 基于系统默认网络承载自动识别脱机状态,
`offlineCachedImageRequest` 会在脱机时阻断远程图片请求并优先使用缓存;
首页、探索、播放页、歌词页、歌单和下载列表都会接收 `offlineMode`,
网络断开时仍能围绕本地文件、已下载音频、播放缓存、缓存封面和本地歌单继续使用。
- **多源播放不是简单入口堆叠**:
`PlayerManager` 负责音源解析、队列和失败恢复;网易云不可播、无直链或
只返回试听片段时,会先尝试音质降级,再由
`PlayerManagerNeteaseAutoSourceSwitch` 按歌名、歌手和时长评分自动匹配
Bilibili 音源兜底;播放异常时还会刷新当前链接,连续失败再跳过或停止。
- **YouTube 取流有多级回退**:
登录态会保留有效身份 Cookie,并与匿名 visitor 分别维护 bootstrap 和 PoToken
会话;Cookie 轮换、签名/n 参数、`player.js` 和挑战结果会优先复用缓存,失效的
`player.js` 或被 CDN 拒绝的直链会进入 EJS/HLS 回退,避免在同一条 URL 上反复重试。
- **GLSL/AGSL 高性能流体背景**:
播放页动态背景由 `BgEffectPainter` 加载
`assets/shaders/hyper_background_effect.glsl` 并通过 `RuntimeShader` 逐帧渲染;
shader 内部基于封面取色、动态色块和轻量颗粒噪声生成流体背景,
并接入 `uMusicLevel / uBeat` 做音频响应,不是简单把封面做高斯模糊。
- **仿 Apple Music 的深度歌词体验**:
`SyncedLyricsView` 与 `AdvancedLyricsView` 支持逐词/逐字高亮、翻译歌词、
音译显示、歌词偏移、点击跳转、长按分享、景深模糊、边缘渐隐和全屏歌词;
`LyricShareSheet` 可选择歌词行,复制文本、分享歌曲或生成 1080px 歌词卡片;
悬浮歌词、状态栏歌词、SuperLyric、Lyricon、蓝牙歌词和歌词编辑
也复用同一条播放数据链路。
- **完整的本地歌曲管理链路**:
`LocalAudioImportManager` 支持外部分享/打开导入、授权文件夹扫描、
设备媒体库扫描和常见音频格式识别,并会处理附近的 `lrc/txt` 歌词与
`cover/folder/front` 封面;大批量扫描会先给出快速预览,再在后台补全
更完整的歌名、歌手、专辑和封面信息;`LocalPlaylistRepository`
负责本地系统歌单、普通歌单、收藏、排序、去重、备份和同步触发。
- **媒体库已经有“分类浏览”的骨架**:
`Library` 不只是歌单列表,本地内容可在歌单/歌手之间切换,
`LocalArtistSummary` 会按展示艺术家自动聚合歌曲、拆分常见合作歌手写法、
生成稳定身份和封面;
网易云歌曲还能进入艺术家详情页,查看热门歌曲和专辑,并把艺术家关注到收藏页。
- **大屏和日常操作都在补手感**:
平板/横屏播放页、歌词页、设置页和艺术家页会使用更稳定的宽度与底部操作布局;
`Mini Player` 支持横向滑动切到上一首/下一首,常用播放控制不用每次展开全屏;
底部主标签按目标顺序做可打断的横向换页,转场中会同时保留出场与入场页面,
避免玻璃背景、滚动位置和页面状态在快速切换时闪断;
播放页长按封面可打开沉浸式大图预览,支持双指缩放、拖动与下载封面。
- **听感也能细调**:
`PlaybackEffectsController` 将倍速、音调、`Equalizer` 和
`LoudnessEnhancer` 绑定到当前 Media3 音频会话;
内置多种均衡器预设,也支持手动频段、响度增强、按歌曲实时响度均衡、
声道平衡、32-bit 高解析普通输出、淡入淡出、交叉淡入淡出、
蓝牙断连暂停、USB 独占播放和音频焦点策略。
USB 独占会由 native 驱动接管兼容 USB 音频设备,避免系统音和其他应用共用 USB 通道;
当前面向 **UAC1.0** 和兼容 **UAC2.0 Type I PCM** 设备,设备选择、
采样率/位深/缓冲策略、32-bit PCM、PCM float 软件转换、后台运行提醒、
UAC2 时钟拓扑与显式反馈端点解析、启动看门狗、前后台健康审计、
动态传输扩缩容和卡死自动恢复也都补齐了;前后台切换会按网络或本地来源选择
唤醒策略,USB 独占播放可在回到前台后恢复;长调度间隙后会重新捕获反馈时钟,
避免继续使用陈旧的速率估计。比特完美音量模式保持软件增益为 0 dB,交给 DAC
硬件控制音量。
- **下载链路已从“能下”进化到“能恢复”**:
下载不走系统 `DownloadManager`,而是用共享 `OkHttpClient`、
可调并发、工作文件和 sidecar 元数据管理完整落盘流程;
直链、`googlevideo` 分块 Range 和 HLS 都有对应续传策略,网络策略暂停后可继续,
启动时会恢复未完成队列,已落盘的缓存命中会直接结算,
手动取消则会清理半成品,语义边界很清楚;下载完成后即使标签写入失败,已落盘
音频仍会保留。
- **存储占用能看清,也能有边界地清理**:
`StorageUsageAnalyzer` 会把音频缓存、图片缓存、下载暂存、分享暂存、
平台歌单缓存、下载内容、日志、崩溃报告和核心应用数据分组统计;
清缓存支持只清可再生成的缓存,不会把用户主动下载的歌曲当作缓存删掉。
- **去中心化同步与播放统计**:
NeriPlayer 不提供公共云端曲库或开发者托管账号数据;
GitHub/WebDAV 同步只在用户自己的远端保存歌单、收藏、最近播放和
播放统计等元数据。`PlaybackStatsRepository` 按歌曲稳定身份记录播放次数、
收听时长、最近播放和每日桶,并参与同步合并;播放和流量统计采用延迟批量写入,
在关键生命周期阶段 flush,并限制每日统计桶数量。
远端同步快照读取时会兼容旧字段和异常缺字段数据,过滤缺少可解析歌曲身份的记录。
- **流量管理不是事后看数字**:
`TrafficStatsRepository` 会区分播放流量、下载流量、Wi‑Fi、移动网络、
漫游和缓存命中;批量或单曲下载在高风险网络下还能主动弹出提示,
避免把“省流量”只做成设置页里的摆设;统计写入同样使用批量累积和生命周期 flush。
- **高个性化,不只是换主题色**:
设置 schema 由 `AutoSettingsSchema` 管理,覆盖动态取色、种子色、
主题风格、自动/浅色/深色模式、UI 缩放、自定义背景、歌词字号、
歌词模糊、播放页流体背景、两级高级模糊、连贯反馈、首页卡片开关、默认启动页、触感反馈,
以及歌曲自定义名称、歌手和封面等细粒度选项。
“进阶高级模糊”和“连贯反馈”默认关闭;关闭连贯反馈时,歌单等详情页使用抽屉式展开;
进阶高级模糊仅在 Android 13+ 且父级高级模糊开启时可用;
它会增强屏幕级顶部 Tab、底部 Tab 和设置结构卡片的实时玻璃材质,
并提供 `12-64 dp` 的模糊度调节,不改变文字、图标、布局与点击区域。
- **ANR、崩溃和安全模式都纳入诊断闭环**:
`AnrWatchdog` 会读取 Android `ApplicationExitInfo.REASON_ANR` 并保存系统
ANR trace;`ExceptionHandler` 与 `NativeCrashHandler` 分别记录 JVM 和
Native 崩溃。上次启动异常时,`SafeModeManager` 可跳过完整应用初始化,
直接进入安全模式预览、复制或导出日志。
- **一起听不是“同步一个进度条”这么简单**:
客户端和 Cloudflare Worker 共同维护房间、角色、队列、播放状态、
循环/随机模式、房主离线恢复、成员控制请求、播放链接共享、版本门控更新和自定义服务端地址;
客户端还会估算服务端时钟偏移、按漂移阈值校正进度,并在共享直链异步返回后
重载权威音源,避免本地待启动状态覆盖房间的暂停或播放指令;
邀请链接必须包含首次加入所需的房间密钥,成员密钥不会出现在公开房间状态中;
本地歌曲不能创建或替换一起听房间当前曲目;开启直链共享后,房主当前歌曲的直链会由
Durable Object 缓存,听众可直接取得当前链接而无需等待房主再次响应;当前曲目最多保留三条
经校验的候选直链,听众始终先按本机音质策略取流,失败后才在会话内回退,候选不会写入歌曲
或离线缓存;同一成员凭据重连不会触发成员变更暂停,房主和听众都会定期保活连接;
服务端使用 Durable Objects 持久化房间状态,并通过 WebSocket 做实时同步。
---
## 快速体验 / Getting Started
### a. 下载 Release 版本(推荐)
1. 前往 [GitHub Releases](https://github.com/cwuom/NeriPlayer/releases)
2. 如何选择版本?
- 大部分手机请选择 `arm64-v8a`
- 老旧 32 位设备请选择 `armeabi-v7a`
- `x86` / `x86_64` 主要用于模拟器、英特尔设备或 Chromebook
> [!IMPORTANT]
> Release 渠道不是严格意义上的稳定通道。版本通常在完成一批功能后手动发布,
> 仍可能包含未充分暴露的问题。
### b. 下载 CI 版本
1. 前往 [GitHub Actions](https://github.com/cwuom/NeriPlayer/actions)
下载最近一次成功构建的 Artifacts 并解压。
2. 或访问 [NeriPlayer CI Builds](https://t.me/neriplayer_ci)。
> master 分支 CI 默认上传 `arm64-v8a` APK;手动 Release 流程会构建多 ABI APK。
### c. 本地构建
1. 克隆仓库并初始化子模块:
```bash
git clone --recursive https://github.com/cwuom/NeriPlayer.git
cd NeriPlayer
```
2. 使用 Android Studio 最新稳定版打开项目并同步依赖。
3. 构建调试版:
```bash
./gradlew :app:assembleDebug
```
4. 安装 APK:
```bash
adb install -r app/build/outputs/apk/debug/app-debug.apk
```
5. 首次启动时先阅读免责声明并完成启动引导;Android 13+ 会申请通知权限。
6. 如需调试工具,在设置页连续点击 **版本号** 7 次启用开发者模式,
底栏会出现独立 `Debug` 页面。
> DEBUG 构建仅用于测试,性能和体积不代表发布版。
发布版构建与签名流程请参阅
[CONTRIBUTING.md](./CONTRIBUTING.md#构建发布版--release-build)。
---
## 核心特性 / Key Features
- 🎧 **多源探索与播放**:
支持网易云音乐、Bilibili、YouTube Music 与本地音频播放。
- 🏠 **首页推荐与继续播放**:
首页支持最近常用歌单、推荐卡片;国际化模式下优先展示 YouTube Music
首页歌单与歌曲货架。
- 🗂️ **媒体库分类浏览**:
`Library` 提供本地、收藏、网易云、YouTube Music、Bilibili 等入口;
可在“设置 > 通用”中完全禁用 YouTube,关闭后不会展示相关入口或执行后台预热;
本地页支持歌单/歌手切换、搜索、歌手排序,收藏页支持歌单/歌手切换,
网易云页支持歌单/专辑切换,Bilibili 页区分创建收藏夹、订阅收藏夹和合集。
- 🔍 **分层搜索能力**:
`Explore` 使用网易云 / Bilibili / YouTube Music 按平台独立搜索;
播放页元数据补全使用网易云 / QQ 音乐,并接入 LRCLIB 外部歌词来源。
- 🧠 **Media3 播放核心**:
`PlayerManager` 管理音源解析、队列、随机/循环、状态恢复、失败重试、
播放链接刷新、YouTube 预取与平台特殊请求策略。
- YouTube 登录态会保留有效 Cookie,并支持 Cookie 轮换、匿名取流、bootstrap/
`player.js`/PoToken 缓存和优先级预取;签名或直链被拒时可回退 EJS/HLS。
- ⏩ **可选 BilibiliSponsorBlock 自动跳过**:默认关闭。开启后仅向公开接口发送当前
BV 号的 SHA-256 前缀,按分 P 和时长筛选 `intro`、`outro`、`sponsor`、
`music_offtopic`、`filler`、`padding` 片段并在本地跳转;不会上传账号、播放历史或新片段。一起听期间保持关闭,
避免房间播放状态漂移。
- 🔁 **网易云自动换源**:
网易云歌曲无权限、无可用直链或仅返回试听片段时,会先尝试降低音质,
再按歌曲名、歌手和时长匹配 Bilibili 音源;开启本地兜底时,还会按稳定元数据匹配
可读的本地音频。
- 🧯 **播放失败兜底**:
播放异常时优先刷新当前播放链接;Bilibili 取流支持 DASH 音频重试和
html5/mp4 渐进流回退,连续失败时自动跳过或停止避免卡死。
- 🎚️ **播放音效**:
Now Playing 内置倍速、音调、响度增强和系统均衡器预设/手动频段调节;
播放设置可开启按歌曲实时分析的响度均衡、声道平衡和 32-bit 高解析普通输出。
响度均衡在 USB 独占播放时保持旁路;高解析普通输出会优先保留高精度管线,
并旁路响度均衡、声道平衡、音频可视化和应用内倍速等处理。
- 🎛️ **细粒度播放行为**:
支持保留上次播放进度、恢复播放模式、淡入淡出、切歌交叉淡入淡出、
蓝牙断连暂停、USB 独占播放、混音播放和预抢占音频焦点。
长音频进度记忆默认开启,仅对时长不少于 15 分钟的内容保存位置;低于 5 秒的
位置不会写入,距离结尾 30 秒以内会视为已完成并清零,显式指定的播放位置优先于
记忆位置。该位置以 `resumePositionMs` 参与本地与可选同步,不代表第三方平台播放历史。
- 🔌 **USB 独占播放**:
支持 **UAC1.0** 和兼容 **UAC2.0 Type I PCM** 的 USB DAC 设备,支持设备选择、
采样率/位深/缓冲策略、兼容性开关、32-bit PCM、
PCM float 到设备格式的软件转换和后台运行提醒;
跟随歌曲采样率时会先按 USB 描述符尝试源采样率,精确格式不可用且兼容策略开启时,
再尝试设备上报的兼容采样率;
对需要异步显式反馈的兼容 UAC2 拓扑,会解析时钟链和反馈端点,
根据设备反馈调度音频包,并在长调度间隙后重新进入反馈时钟捕获;
播放启动卡住、Native 传输背压卡住或前后台切换异常时,会通过原地重配置、
协调式 AudioSink 重建、动态传输扩缩容和软恢复尽量拉回,
必要时回退到系统播放避免整条链路卡死;播放器会按网络或本地来源选择唤醒策略,
前后台切换后可恢复 USB 独占,启用比特完美音量时软件增益固定为 0 dB。
设置页会显示后台行为是否受电池优化或后台权限限制;服务端播放保持时,后台音频锚点
会根据实际输出路由选择静音或零均值载波,并通过 MediaSession 提供远程音量控制,
不会把载波当作用户可听内容。
- 💾 **可配置流媒体缓存**:
使用 `SimpleCache + LRU` 缓存音频,默认上限 **1 GB**,
支持分别清理音频缓存、图片缓存、下载暂存、分享暂存和平台歌单缓存,
并可查看分组后的存储占用详情。
- 🛰️ **脱机模式**:
自动感知系统默认网络承载状态,脱机时停用在线探索和首页远程刷新,
远程图片只走本地缓存;本地文件、已下载音频、播放缓存、歌单、
最近播放和播放统计仍可访问。
- ⬇️ **应用内下载与管理**:
支持多平台音频下载、本地下载列表、任务进度、取消/重试,
并保存歌词、封面、元数据和音频标签;默认下载并发为 **6**,
可在设置中调整,最高 **8**。下载队列会持久化,应用重启后可恢复
未完成任务,已存在的完整下载会直接结算为完成状态;`googlevideo` 直链使用分块
Range 并支持续传,下载完成后标签写入失败也不会删除已落盘音频。
- 📁 **可迁移下载目录**:
下载文件默认在应用管理目录,也可通过 SAF 选择自定义目录;
切换目录时会迁移已有下载,并支持自定义文件名模板。
出于性能考虑,不建议频繁切换到 SAF 目录。
- 🎵 **本地音频导入与扫描**:
支持系统 `VIEW / SEND / SEND_MULTIPLE` 的 `audio/*`,
也支持扫描设备本地音乐、按授权文件夹定向扫描,
并自动识别附近歌词与封面 sidecar 文件;大批量扫描会先快速预览,
可按“已有元信息”过滤预览结果,再在后台补全更完整的本地元信息;SAF 空目录结果
不会误清理已有目录索引。
- 👤 **本地歌手分类与详情**:
本地歌曲会按展示艺术家自动分组,并识别 `feat.`、`with`、`和/与`、
顿号、分号和常见斜杠分隔;本地歌手页支持播放全部、多选、
导出为歌单,以及对在线来源歌曲发起批量下载。
- 🩷 **本地歌单与收藏**:
内置「我喜欢的音乐」和「本地文件」系统歌单,普通本地歌单支持创建、
重命名、删除、排序和添加歌曲;「我喜欢的音乐」支持同步可识别歌曲到
网易云我喜欢的音乐。
- 🧑🎤 **网易云艺术家详情**:
网易云歌曲可进入艺术家页,查看艺术家信息、热门歌曲与专辑分页,
并支持关注/取消关注;关注的艺术家会出现在媒体库收藏分类中。
- 🧺 **网易云歌单详情缓存**:
歌单详情会缓存 header 与曲目列表,二次进入可先展示本地缓存;
网络失败或解析失败时也能回退到最近一次成功加载的数据。
- ☁️ **GitHub / WebDAV 同步**:
可选同步本地歌单、收藏歌单、最近播放、播放统计和删除记录,
使用 `WorkManager` 做延迟与周期同步,数据保存在用户自己的远端。
- 📊 **播放统计**:
按歌曲稳定身份记录播放次数、累计收听时长、首次/最近播放时间和每日统计桶;
支持按日/周/月/年/总计查看,并可参与 GitHub/WebDAV 同步;写入采用延迟批量策略,
在关键生命周期 flush,且每日桶有保留上限。
- 📶 **流量统计与高风险提示**:
记录播放/下载流量、Wi‑Fi/移动/漫游分布和缓存命中;
在移动网络或漫游环境下下载时可主动提示风险。
- ♻️ **备份与恢复**:
支持歌单 JSON 导入/导出;也支持完整配置导入/导出,
可迁移设置、语言、平台授权、GitHub/WebDAV 配置与一起听设置。
- 🎧 **一起听**:
支持创建房间或加入他人房间,通过 WebSocket 实时同步播放状态,
支持房主/听众权限、成员控制开关、新成员加入时可自动暂停、同一成员重连不暂停、显式离开时通知房主、循环/随机模式同步、
可选共享房主解析直链、邀请链接、深链加入、自定义服务端和房主离线检测;首次加入必须
提供邀请密钥,成员重连使用成员密钥。房主可分别复制邀请信息和邀请密钥;点击加入会从
剪贴板读取有效邀请,无有效邀请时不会入房。本地歌曲不能建房或替换房间当前曲目;直链共享
开启时,Worker 只公开并缓存当前曲目的房主直链,听众可直接取得缓存,关闭共享会清空缓存;
当前曲目最多保留 3 条候选,听众先按本机音质策略解析,失败后才在本次会话内依次回退,
候选不会写入歌曲或离线缓存。房间会按当前曲目时长推算服务端位置,单曲循环会按时长回绕;
控制事件按客户端顺序过滤,`REQUEST_SET_TRACK` 只能选择当前队列歌曲,并继续校验稳定
曲目键和服务端时钟。
- 🌈 **个性化与主题**:
支持自动/浅色/深色模式、动态取色、种子色、主题风格、UI 缩放、
自定义背景图、触感反馈、歌词字号、歌词模糊、默认启动页和首页卡片开关;
Android 13+ 还可按需开启默认关闭的“进阶高级模糊”,增强顶部/底部 Tab
与设置结构卡片材质;模糊度可在 `12-64 dp` 间调节,父级关闭时会保留
子级选择和模糊度但停止进阶绘制。
- ✨ **播放页动效与歌词**:
支持 `RuntimeShader` / GLSL 流体背景、音频反应式动态背景、封面模糊背景、
仿 Apple Music 歌词、高级歌词、逐词歌词、翻译歌词、歌词偏移、
音译显示、歌词长按分享、歌词卡片生成、歌词编辑、歌词字体调节、
歌词触感反馈和 Lyrics 全屏页。封面页逐行歌词与底部 Dock 工具栏可以分别关闭;
窄屏或高缩放的竖屏会自动切换为紧凑布局,并将操作按钮收缩到稳定的触控槽位。
歌词分享支持逐行点选和从起点到目标行的长按范围选择。RuntimeShader 动态背景仅在 Android 13+
启用;封面模糊需要 Android 12+,高级模糊需要 Android 13+,低版本会降级。
- 👆 **迷你播放器手势**:
底部 Mini Player 支持横向滑动切换上一首/下一首,同时保留点击展开与播放暂停。
- 🪟 **悬浮歌词与状态栏歌词**:
支持系统悬浮歌词,颜色、描边、字号、位置、对齐和翻译显示都可自定义;
也支持魅族状态栏歌词(部分设备可用)和 SuperLyric 输出,
应用前台可自动隐藏悬浮窗避免遮挡。
- 🔌 **外部歌词/设备联动**:
支持词幕适配(Lyricon Provider)、SuperLyric、外部蓝牙歌词、
蓝牙断连暂停和 USB 独占播放开关;外部歌词链路会同步当前歌曲、
播放状态、进度、逐字歌词和翻译;Lyricon/SuperLyric 进度由独立 200 ms 推送,
翻译行按时间匹配,歌词卡片使用缓存,歌曲分享支持 Xiaomi Super Island 链接。
- 🛠️ **开发者模式与调试工具**:
设置页连续点击版本号 **7 次** 后,底栏出现 `Debug` 页,
包含 YouTube / Bili / Netease / Search / Listen Together 探针、
普通日志与崩溃日志查看器。
- 🧾 **登录与日志更友好**:
支持网易云 / Bilibili 二维码登录与网页登录兜底;
开发者模式外也可开启持久文件日志,便于复现疑难问题。
- 🛟 **安全模式与崩溃日志**:
上次启动发生 JVM / Native 崩溃或系统 ANR 时,可直接进入安全模式预览或导出日志,
并按需清理设置、授权信息或崩溃标记。
---
## 平台现状 / Platform Status
- **网易云音乐**:
登录、歌曲搜索、精选歌单、专辑、歌单/专辑列表搜索、播放、下载、歌词、播放页元数据补全,
无权限自动换源、本地收藏同步到网易云我喜欢的音乐、艺术家详情、
热门歌曲/专辑分页和艺术家关注。
- **Bilibili**:
Web 登录、二维码登录、视频搜索、创建收藏夹、订阅收藏夹、合集、
收藏夹/合集列表搜索、分 P 转音频播放、下载;
当前不是完整视频发现流或评论区客户端。
- **YouTube Music**:
登录、首页/媒体库歌单浏览、歌单详情、搜索、播放、下载,
并包含 PoToken / JS Challenge 相关支持。
- **QQ 音乐**:
当前仅用于播放页元数据和歌词补全,未实现登录、播放和库页数据。
- **本地音频**:
支持外部分享/打开导入、设备扫描、授权文件夹扫描、本地文件播放、
本地歌手分类、分享和本地歌单管理。
---
## 实现概览 / Implementation Notes
### 构建与版本
- `compileSdk = 37`
- `targetSdk = 36`
- `minSdk = 28`
- Java 17 / Kotlin JVM 17
- NDK `27.0.12077973`
- CMake `3.28.0+`
- 版本名格式:`