A native Android audio player that combines multi-source streaming, local control, rich lyrics, and self-hosted sync. / ✨ 一个把多源在线播放、本地管理、歌词体验和自建同步做进原生 Android 的音频播放器 🎵
3,363
stars
1,183
commits
Kotlin
primary language
Sep 4, 2026
updated
本项目的名称及图标灵感来源于《星空鉄道とシロの旅》中的角色「风又音理」。
项目采用原生 Android 开发,支持 Android 9 (API 28) 及以上设备, 围绕「多源探索、在线播放、本地可控、数据自持」持续打磨。
🛠️ Active development / 持续迭代中
[!WARNING] 本项目仅供学习与研究使用,请勿将其用于任何非法用途。 请只在你拥有权利、授权或第三方平台规则允许的范围内访问、播放或保存内容。 本项目不提供媒体内容、密钥、规避付费/DRM/地区限制的方案,也不提供公共媒体代理或再分发服务。
本项目及维护者不接受任何形式的赞助、捐赠或商业资助。
[!NOTE] NeriPlayer 不提供公共云端曲库或媒体分发服务。 在线音频能力依赖用户在第三方平台上的账号授权, 会员或受限内容仍需遵循原平台规则。 文档中提到的 YouTube Music 相关能力仅指账号会话、播放兼容和错误恢复, 不代表绕过平台限制、复制受保护内容或重新分发媒体。
如果你只是想体验应用,请看 快速体验。 如果你想了解项目能力,请看 项目亮点 和 核心特性。 如果你准备贡献代码,请直接阅读 CONTRIBUTING.md。 如果你要自建一起听服务端,请看 一起听服务端部署。
NeriPlayer
├── 多源在线播放:网易云 / Bilibili / YouTube Music
├── 本地优先数据:缓存、下载、歌单、历史、统计、设置
├── 可选自有同步:GitHub / WebDAV 元数据同步
├── 丰富播放体验:Media3、歌词、音效、流体背景、桌面小组件、启动器快捷方式、悬浮/状态栏歌词
└── 可恢复运行:安全模式、崩溃日志、ANR 记录、调试探针
NeriPlayer 是一个基于 Jetpack Compose + Media3 的原生 Android 音频播放器。它不构建公共云端服务,而是在用户具备第三方平台账号能力的前提下, 整合 网易云音乐、Bilibili 与 YouTube Music 的在线内容, 并提供本地播放、下载、缓存、歌单管理和多种同步/备份能力。
当前定位:
MainActivity 是唯一对外入口,
UI 由 Compose NavHost、动态底栏、Mini Player 与 Now Playing 覆盖层组织。Loading -> Disclaimer -> Onboarding -> Main;
如果上次启动发生崩溃或系统 ANR,会先进入 Safe Mode。NetworkStatusMonitor 基于系统默认网络承载自动识别脱机状态,
offlineCachedImageRequest 会在脱机时阻断远程图片请求并优先使用缓存;
首页、探索、播放页、歌词页、歌单和下载列表都会接收 offlineMode,
网络断开时仍能围绕本地文件、已下载音频、播放缓存、缓存封面和本地歌单继续使用。PlayerManager 负责音源解析、队列和失败恢复;网易云不可播、无可用播放结果或
只返回试听片段时,会先尝试音质降级,再由
PlayerManagerNeteaseAutoSourceSwitch 按歌名、歌手和时长评分自动匹配
Bilibili 音源兜底;播放异常时还会刷新当前链接,连续失败再跳过或停止。player.js 和挑战结果会优先复用缓存,失效的
player.js 或被平台拒绝的播放候选会进入 EJS/HLS 回退,避免在同一候选上反复重试。BgEffectPainter 加载
assets/shaders/hyper_background_effect.glsl 并通过 RuntimeShader 逐帧渲染;
shader 内部基于封面取色、动态色块和轻量颗粒噪声生成流体背景,
并接入 uMusicLevel / uBeat 做音频响应,不是简单把封面做高斯模糊。SyncedLyricsView 与 AdvancedLyricsView 支持逐行、逐词/逐字 LRC(含行尾
时间和方括号逐字时间戳)以及 YRC/TTML 歌词的高亮、翻译歌词、
音译显示、歌词偏移、点击跳转、长按分享、景深模糊、边缘渐隐和全屏歌词;
LyricShareSheet 可选择歌词行,复制文本、分享歌曲或生成 1080px 歌词卡片;
歌词页遇到含假名的日语原文时,会为翻译行额外留出间距,避免日文字形和译文挤在一起;
悬浮歌词、状态栏歌词、SuperLyric、Lyricon、蓝牙歌词和歌词编辑
也复用同一条播放数据链路。LocalAudioImportManager 支持外部分享/打开导入、授权文件夹扫描、
设备媒体库扫描和常见音频格式识别,并会处理附近的 lrc/txt 歌词与
cover/folder/front 封面;大批量扫描会先给出快速预览,再在后台补全
更完整的歌名、歌手、专辑和封面信息;LocalPlaylistRepository
负责本地系统歌单、普通歌单、收藏、排序、去重、备份和同步触发。Library 不只是歌单列表,本地内容可在歌单/歌手之间切换,
LocalArtistSummary 会按展示艺术家自动聚合歌曲、拆分常见合作歌手写法、
生成稳定身份和封面;
网易云歌曲还能进入艺术家详情页,查看热门歌曲和专辑,并把艺术家关注到收藏页。Mini Player 支持横向滑动切到上一首/下一首,常用播放控制不用每次展开全屏;
桌面小组件提供 4x2 播放卡片和 2x2 迷你播放器;卡片背景和主播放键会从当前
封面取色,4x2 显示当前歌曲、封面、进度、四项播放控制和桌面歌词入口,
2x2 以封面为主视觉并保留三项播放控制,两者都复用播放服务的控制链路;
启动器快捷方式可直接继续播放、打开探索、打开媒体库或随机播放我喜欢的音乐;
底部主标签按目标顺序做可打断的横向换页,转场中会同时保留出场与入场页面,
避免玻璃背景、滚动位置和页面状态在快速切换时闪断;
播放页长按封面可打开沉浸式大图预览,支持双指缩放、拖动与下载封面。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 元数据管理完整落盘流程;
直接 HTTP 传输、平台需要显式 Range 的传输和 HLS 都有对应续传策略,网络策略暂停后可继续,
启动时会恢复未完成队列,已落盘的缓存命中会直接结算,
手动取消则会清理半成品,语义边界很清楚;下载完成后即使标签写入失败,已落盘
音频仍会保留。StorageUsageAnalyzer 会把音频缓存、图片缓存、下载暂存、分享暂存、
平台歌单缓存、下载内容、日志、崩溃报告和核心应用数据分组统计;
清缓存支持只清可再生成的缓存,不会把用户主动下载的歌曲当作缓存删掉。PlaybackStatsRepository 按歌曲稳定身份记录播放次数、
收听时长、最近播放和每日桶,并参与同步合并;播放和流量统计采用延迟批量写入,
在关键生命周期阶段 flush,并限制每日统计桶数量。
远端同步快照读取时会兼容旧字段和异常缺字段数据,过滤缺少可解析歌曲身份的记录。TrafficStatsRepository 会区分播放流量、下载流量、Wi‑Fi、移动网络、
漫游和缓存命中;批量或单曲下载在高风险网络下还能主动弹出提示,
避免把“省流量”只做成设置页里的摆设;统计写入同样使用批量累积和生命周期 flush。AutoSettingsSchema 管理,覆盖动态取色、种子色、
主题风格、自动/浅色/深色模式、UI 缩放、自定义背景、歌词字号、
歌词模糊、播放页流体背景、两级高级模糊、连贯反馈、首页卡片开关、默认启动页、触感反馈,
以及歌曲自定义名称、歌手和封面等细粒度选项。
OnePlus 的高密度屏幕(系统 densityDpi >= 500)会自动叠加 0.95x UI 修正,
普通密度机型不触发修正,用户手动设置值仍会作为额外乘数参与计算。
“进阶高级模糊”和“连贯反馈”默认关闭;关闭连贯反馈时,歌单等详情页使用抽屉式展开;
进阶高级模糊仅在 Android 13+ 且父级高级模糊开启时可用;
它会增强屏幕级顶部 Tab、底部 Tab 和设置结构卡片的实时玻璃材质,
并提供 12-64 dp 的模糊度调节,不改变文字、图标、布局与点击区域。
模糊质量可独立选择“超低、低、默认、高”:超低和低保持与默认相同的模糊范围,
通过局部区域渲染、动态下采样和 RenderNode 硬件缓存降低渲染开销。
检测到天玑 SoC 且尚未保存过选择时默认使用“超低”;前后台切换或更改质量时会
重建局部缓存,避免恢复后出现异常背景。“高”需要先开启进阶高级模糊。AnrWatchdog 会读取 Android ApplicationExitInfo.REASON_ANR 并保存系统
ANR trace;ExceptionHandler 与 NativeCrashHandler 分别记录 JVM 和
Native 崩溃。上次启动异常时,SafeModeManager 可跳过完整应用初始化,
直接进入安全模式预览、复制或导出日志。arm64-v8aarmeabi-v7ax86 / x86_64 主要用于模拟器、英特尔设备或 Chromebook[!IMPORTANT] Release 渠道不是严格意义上的稳定通道。版本通常在完成一批功能后手动发布, 仍可能包含未充分暴露的问题。
master 分支 CI 默认上传
arm64-v8aAPK;手动 Release 流程会构建多 ABI APK。
git clone --recursive https://github.com/cwuom/NeriPlayer.git
cd NeriPlayer
./gradlew :app:assembleDebug
adb install -r app/build/outputs/apk/debug/app-debug.apk
Debug 页面。DEBUG 构建仅用于测试,性能和体积不代表发布版。
发布版构建与签名流程请参阅 CONTRIBUTING.md。
Library 提供本地、收藏、网易云、YouTube Music、Bilibili 等入口;
可在“设置 > 通用”中完全禁用 YouTube,关闭后不会展示相关入口或执行后台预热;
本地页支持歌单/歌手切换、搜索、歌手排序,收藏页支持歌单/歌手切换,
网易云页支持歌单/专辑切换,Bilibili 页区分创建收藏夹、订阅收藏夹和合集。Explore 使用网易云 / Bilibili / YouTube Music 按平台独立搜索;
网易云支持歌曲、歌单和歌手分类,网易云与 Bilibili 搜索结果可在列表触底后
自动加载下一页;“链接识别”可直接粘贴链接或含标题、短链接的整段分享文案,
识别网易云歌曲/歌单/歌手、Bilibili 视频/收藏夹/合集/UP 主及 YouTube
视频/歌单/频道。项目已有详情页的类型可直接打开,暂无详情页的类型会明确提示;
Bilibili 链接会尽量保留 p / cid 分 P 和 season_id 合集上下文,
分享合集时可直接解析到对应合集列表。
搜索框下方会显示本地搜索历史,默认记录防抖搜索过的关键词;
可在“设置 > 通用”关闭探索页搜索历史,关闭后不显示也不再记录新关键词,
已有记录不会被自动删除,重新开启后仍可显示;
播放页元数据补全使用网易云 / QQ 音乐,并接入 LRCLIB 外部歌词来源;
歌词编辑器可选择酷狗、网易云、QQ 音乐、AMLL TTML、LRCLIB 和
YouTube Music 后手动匹配歌词,逐字歌词优先但不隐藏普通歌词,并会自动清理
标题、制作信息等非歌词行。PlayerManager 管理音源解析、队列、随机/循环、状态恢复、失败重试、
播放链接刷新、YouTube 预取与平台特殊请求策略。
随机播放会先生成真实乱序队列,再按该队列顺序播放、持久化和展示。player.js/PoToken 缓存和优先级预取;签名或播放候选被拒时可回退 EJS/HLS。intro、outro、sponsor、
music_offtopic、filler、padding 片段并在本地跳转;不会上传账号、播放历史或新片段。一起听期间保持关闭,
避免房间播放状态漂移。BVID + CID 本地持久化,并通过 GitHub/WebDAV
同步。播放页可使用设为开始/结束、前后 5 秒及播放/暂停辅助定位;一起听期间不应用本地自动跳过,避免房间状态漂移。resumePositionMs 参与本地与可选同步,不代表第三方平台播放历史。USB_DEVICE_ATTACHED 事件可单独关闭,
用于避免不想接管 DAC 时反复唤起应用;
跟随歌曲采样率时会先按 USB 描述符尝试源采样率,精确格式不可用且兼容策略开启时,
再尝试设备上报的兼容采样率;
对需要异步显式反馈的兼容 UAC2 拓扑,会解析时钟链和反馈端点,
根据设备反馈调度音频包,并在长调度间隙后重新进入反馈时钟捕获;
播放启动卡住、Native 传输背压卡住或前后台切换异常时,会通过原地重配置、
协调式 AudioSink 重建、动态传输扩缩容和软恢复尽量拉回,
必要时回退到系统播放避免整条链路卡死;播放器会按网络或本地来源选择唤醒策略,
前后台切换后可恢复 USB 独占,启用比特完美音量时软件增益固定为 0 dB。
设置页会显示后台行为是否受电池优化或后台权限限制;服务端播放保持时,后台音频锚点
会根据实际输出路由选择静音或零均值载波,并通过 MediaSession 提供远程音量控制,
不会把载波当作用户可听内容。SimpleCache + LRU 缓存音频,默认上限 1 GB,
支持分别清理音频缓存、图片缓存、下载暂存、分享暂存和平台歌单缓存,
并可查看分组后的存储占用详情。VIEW / SEND / SEND_MULTIPLE 的 audio/*,
也支持扫描设备本地音乐、按授权文件夹定向扫描,
并自动识别附近歌词与封面 sidecar 文件;大批量扫描会先快速预览,
可按“已有元信息”过滤预览结果,再在后台补全更完整的本地元信息;SAF 空目录结果
不会误清理已有目录索引。feat.、with、和/与、
顿号、分号和常见斜杠分隔;本地歌手页支持播放全部、多选、
导出为歌单,以及对在线来源歌曲发起批量下载。WorkManager 做延迟与周期同步,数据保存在用户自己的远端。REQUEST_SET_TRACK 只能选择当前队列歌曲,并继续校验稳定
曲目键和服务端时钟。12-64 dp 间调节,父级关闭时会保留
子级选择和模糊度但停止进阶绘制。模糊质量可独立选择超低、低、默认或高;
低和超低保持默认覆盖范围,以局部渲染、动态下采样和硬件缓存减轻开销,
天玑设备在未保存偏好时默认超低,并会在前后台恢复或切换质量后重建缓存。RuntimeShader / GLSL 流体背景、音频反应式动态背景、封面模糊背景、
仿 Apple Music 歌词、高级歌词、逐词歌词、翻译歌词、歌词偏移、
音译显示、歌词长按分享、歌词卡片生成、歌词编辑、歌词字体调节,
且封面页与歌词页的歌词 / 翻译字号可分别调节,
歌词触感反馈和 Lyrics 全屏页。封面页逐行歌词与底部 Dock 工具栏可以分别关闭;
窄屏或高缩放的竖屏会自动切换为紧凑布局,并将操作按钮收缩到稳定的触控槽位。
歌词分享支持逐行点选和从起点到目标行的长按范围选择。RuntimeShader 动态背景仅在 Android 13+
启用;封面模糊需要 Android 12+,高级模糊需要 Android 13+,低版本会降级。Debug 页,
包含 YouTube / Bili / Netease / Search / Listen Together 探针、
普通日志与崩溃日志查看器。season_id 或视频详情恢复合集上下文;
当前不是完整视频发现流或评论区客户端。compileSdk = 37targetSdk = 36minSdk = 2827.0.120779733.28.0+<git短哈希>.<MMddHHmm>NeriPlayer-<versionName>[-abi].apkarm64-v8a;多 ABI 构建需加
-PbuildAllReleaseAbis=true.github/workflows/android_native_ci.yml 会在 Native 相关变更时运行
Release + -Werror、ASan+UBSan、TSan 三组 host CTest,并单独编译
arm64-v8a、armeabi-v7a、x86、x86_64 四个 Android ABI。:app:主 Android 应用。:ksp-annotations / :ksp-processor:设置项自动登记与生成。:accompanist-lyrics-core / :accompanist-lyrics-ui:歌词解析与 Compose 歌词 UI 子模块。build-logic:统一 Gradle convention plugin。buildSrc:保留的辅助 Gradle 构建逻辑模块。np-submodule/NeriPlayer-LTW:一起听 Cloudflare Workers 服务端。np-submodule/miuix:仓库内附带的上游 Miuix 源码/文档树,当前不参与主应用模块构建。MainActivity 是唯一对外入口,同时处理启动流程、通知权限、
外部音频导入、USB 设备插入事件和 neriplayer://listen-together/join 深链。Safe Mode,
只开放日志预览导出、配置导出、登录重置、设置重置和恢复正常启动。Home / Explore / Library / Settings 为主路径。Home 会根据首页卡片可用性动态显示;Debug 仅开发者模式开启后显示。MainTabLayerHost 保留出场/入场双场景并按标签顺序横向切换;
每个场景独立持有可保存状态和高级玻璃 owner,快速反向切换也会从当前进度继续。Now Playing 不是普通路由,而是覆盖在主导航之上的全屏播放层,
底部常驻 Mini Player;Mini Player 支持横向滑动切歌。LauncherShortcuts 映射为继续播放、探索、媒体库和随机喜欢,
只落到主标签或播放服务入口,不会绕过正常导航状态恢复。Library 使用分页导航组织本地、收藏、网易云、YouTube Music、Bilibili
和 QQ 音乐占位;同时提供最近播放和播放统计入口。LocalArtistDetailScreen 承载,支持播放全部、多选、
导出歌单和批量下载在线歌曲;网易云艺术家详情页由
NeteaseArtistDetailScreen 承载,支持歌曲/专辑分页和关注状态。PlayerManager 统一管理。AudioPlayerService 提供前台播放服务、媒体通知、MediaSession 和基础传输控制。ConditionalHttpDataSourceFactory
动态附加 Referer / User-Agent / Cookie。player.js 和 PoToken 缓存,并在播放候选
被拒时回退 EJS/HLS;长音频的大幅 Seek 会进入更短的启动恢复窗口,避免等待普通
播放启动看门狗超时。playback/、url/、resolver/、service/、effects/、
lifecycle/、watchdog/ 与 usb/ 等职责分包;共享歌曲模型位于 data/model/,
旧包名仅保留少量兼容别名,不应作为新增代码入口。USB_DEVICE_ATTACHED 唤起路径。Explore 当前接入网易云、Bilibili 和 YouTube Music,
采用按平台独立搜索,不混合聚合结果。网易云可切换歌曲/歌单/歌手,
网易云和 Bilibili 支持触底分页;链接识别支持直接链接和含短链接的分享文案,
Bilibili 视频链接会保留 p / cid 指向的分 P,合集分享会优先使用
视频详情里的 UGC season,必要时回退到链接里的 season_id。
搜索历史保存在本地,可在“设置 > 通用”中独立关闭显示和记录。SearchManager 使用网易云与 QQ 音乐补全封面、歌词和曲目信息。LyriconManager 向 Lyricon 与 SuperLyric 输出当前歌曲、播放状态、进度、
逐字歌词与翻译歌词;进度通过独立的 200 ms feed loop 推送并使用时间锚点校准,
状态栏歌词依赖厂商能力,当前面向部分支持设备。neteaseArtists
元数据,用于进入网易云艺术家详情。NeteasePlaylistCacheRepository 会缓存歌单 header、曲目、最近曲目签名和保存时间;
NeteaseCollectionDetailViewModel 会先发布缓存再刷新网络,
当曲目签名未变化或网络失败时复用缓存。DataStore 持久化,并通过 KSP 生成设置 key、备份白名单和设置 UI 元数据。ThemeMode 管理,支持浅色、深色和跟随系统的 Auto 模式。Android Keystore + EncryptedSharedPreferences 本地加密保存。data/sync/model/,
封面映射位于 data/sync/;GitHub/WebDAV 管理器与传输仍在各自 provider 包,
现有兼容序列化和多数合并策略继续位于 sync/github/。
删除记录会和撤销操作一起进入合并策略,避免本地撤销后的歌曲在下一轮同步又被旧删除记录移除。ANDROID_ID。GZIP(ProtoBuf),普通模式保存 UTF-8 JSON。OkHttpClient,不是系统 DownloadManager。cache/download_staging 下的工作文件,再提交到应用管理目录
或用户选择的 SAF 目录;正式落盘前会先准备音频元数据,提交后再写歌词、封面、
.npmeta.json 和音频标签。DownloadTaskStore 会持久化待下载队列和任务状态;
GlobalDownloadManager 启动时会等待已有队列收敛,再恢复未完成任务,
避免旧队列和新请求互相覆盖。Range: bytes=<offset>-.hls.json 检查点恢复.resume.json 恢复元数据,用来在应用重启后重建待恢复任务;
GlobalDownloadManager 启动时会自动扫描并恢复未完成下载。WAITING_NETWORK 时,也会保留断点并在网络恢复或用户确认后继续。StorageUsageAnalyzer 会按可清理缓存、下载内容、诊断文件和应用数据分组统计占用;
清理缓存只覆盖可再生成的缓存和暂存文件,不会删除用户主动保存的下载歌曲。LocalAudioImportManager 支持导入外部音频、扫描设备音乐,
并复制附近的 lrc/txt 歌词文件与 cover/folder/front 封面图。cache/shared_local_media 暂存后分享,该目录属于可清理缓存。BackupManager 支持本地歌单 JSON 备份、导入与差异分析。ConfigFileManager 支持完整配置导入/导出,用于迁移设置、授权和同步配置。想深入了解实现细节?请阅读 CONTRIBUTING.md。
NeriPlayer 内置“一起听”功能。你可以快速部署自己的服务端, 也可以使用他人部署的服务。
服务端源码与部署入口:
np-submodule/NeriPlayer-LTW服务端基于 Cloudflare Workers 和 Durable Objects, 通过 WebSocket 提供实时同步。
应用内可在设置页配置一起听服务端地址、测试可用性,并重置本机一起听身份。
补充说明:
NeriPlayer 支持将本地元数据同步到 用户自己的 GitHub 仓库。 应用内新建仓库时默认创建为私有仓库,也支持接入已有仓库。
当前同步对象包括:
Android Keystore + EncryptedSharedPreferences 中。WorkManager,仅在存在
validated network 时执行。addedAt 的歌曲会排在已有时间的歌曲之后,避免异常快照打乱歌单。backup-raw.bin 直接写入原始 GZIP(ProtoBuf) 字节;读取侧仍兼容
backup.json 和历史 backup.bin Base64 格式,关闭省流模式时使用 JSON。JSON、压缩
正文和解压后正文分别有 8 MiB、12 MiB、16 MiB 的上限。repo 权限)。除 GitHub 外,NeriPlayer 也支持将同一套同步数据保存到 WebDAV 远端文件。
WorkManager 做延迟同步、周期同步、网络检查和失败重试。这些方向会根据维护精力、平台可用性和社区反馈调整,不承诺固定周期。
season_id 链接识别⚠️ 当前 QQ 音乐主要用于播放页元数据补全。 完整账号能力、库页数据与更稳定的授权链路仍在开发中。
感谢使用 NeriPlayer。由于项目功能较多且用户运行环境复杂, 可能会出现符合预期的差异或异常情况。若您在运行中遇到任何问题, 欢迎随时提交反馈,我们将持续优化。
adb logcat | findstr NeriPlayer
adb logcat | grep NeriPlayer
backup-raw.bin 原始 GZIP 字节;新版在迁移期间同时保留
backup.json 与历史 backup.bin Base64 的读取兼容。| netease-cloud-music | ✨ 网易云音乐 Golang 实现 🎵 |
| bilibili-API-collect | 哔哩哔哩 API 收集整理 |
| ejs | External JavaScript for yt-dlp supporting many runtimes |
| accompanist-lyrics-core | A lyrics parsing, converting, exporting library for Kotlin |
| accompanist-lyrics-ui | The state-of-the-art karaoke lyrics composable |
| LDDC | 多平台精准歌词下载匹配工具,手动歌词匹配体验参考 |
| Metrolist | YouTube Music client for Android |
| HyperCeiler | HyperOS enhancement module - Make HyperOS Great Again! |
NeriPlayer 使用 GPL-3.0 开源许可证发布。
这意味着:
app/src/main/cpp/README.md 仅为其中列出的 NeriPlayer 自有 Native 源码
提供附带署名条件的替代授权;第三方源码和未列入范围的仓库内容不适用。贡献前请先阅读完整的 CONTRIBUTING.md。
Kotlin
85.8%
C
7.2%
C++
5.8%
A native Android audio player that combines multi-source streaming, local control, rich lyrics, and self-hosted sync. / ✨ 一个把多源在线播放、本地管理、歌词体验和自建同步做进原生 Android 的音频播放器 🎵
3,363
stars
1,183
commits
Kotlin
primary language
Sep 4, 2026
updated
本项目的名称及图标灵感来源于《星空鉄道とシロの旅》中的角色「风又音理」。
项目采用原生 Android 开发,支持 Android 9 (API 28) 及以上设备, 围绕「多源探索、在线播放、本地可控、数据自持」持续打磨。
🛠️ Active development / 持续迭代中
[!WARNING] 本项目仅供学习与研究使用,请勿将其用于任何非法用途。 请只在你拥有权利、授权或第三方平台规则允许的范围内访问、播放或保存内容。 本项目不提供媒体内容、密钥、规避付费/DRM/地区限制的方案,也不提供公共媒体代理或再分发服务。
本项目及维护者不接受任何形式的赞助、捐赠或商业资助。
[!NOTE] NeriPlayer 不提供公共云端曲库或媒体分发服务。 在线音频能力依赖用户在第三方平台上的账号授权, 会员或受限内容仍需遵循原平台规则。 文档中提到的 YouTube Music 相关能力仅指账号会话、播放兼容和错误恢复, 不代表绕过平台限制、复制受保护内容或重新分发媒体。
如果你只是想体验应用,请看 快速体验。 如果你想了解项目能力,请看 项目亮点 和 核心特性。 如果你准备贡献代码,请直接阅读 CONTRIBUTING.md。 如果你要自建一起听服务端,请看 一起听服务端部署。
NeriPlayer
├── 多源在线播放:网易云 / Bilibili / YouTube Music
├── 本地优先数据:缓存、下载、歌单、历史、统计、设置
├── 可选自有同步:GitHub / WebDAV 元数据同步
├── 丰富播放体验:Media3、歌词、音效、流体背景、桌面小组件、启动器快捷方式、悬浮/状态栏歌词
└── 可恢复运行:安全模式、崩溃日志、ANR 记录、调试探针
NeriPlayer 是一个基于 Jetpack Compose + Media3 的原生 Android 音频播放器。它不构建公共云端服务,而是在用户具备第三方平台账号能力的前提下, 整合 网易云音乐、Bilibili 与 YouTube Music 的在线内容, 并提供本地播放、下载、缓存、歌单管理和多种同步/备份能力。
当前定位:
MainActivity 是唯一对外入口,
UI 由 Compose NavHost、动态底栏、Mini Player 与 Now Playing 覆盖层组织。Loading -> Disclaimer -> Onboarding -> Main;
如果上次启动发生崩溃或系统 ANR,会先进入 Safe Mode。NetworkStatusMonitor 基于系统默认网络承载自动识别脱机状态,
offlineCachedImageRequest 会在脱机时阻断远程图片请求并优先使用缓存;
首页、探索、播放页、歌词页、歌单和下载列表都会接收 offlineMode,
网络断开时仍能围绕本地文件、已下载音频、播放缓存、缓存封面和本地歌单继续使用。PlayerManager 负责音源解析、队列和失败恢复;网易云不可播、无可用播放结果或
只返回试听片段时,会先尝试音质降级,再由
PlayerManagerNeteaseAutoSourceSwitch 按歌名、歌手和时长评分自动匹配
Bilibili 音源兜底;播放异常时还会刷新当前链接,连续失败再跳过或停止。player.js 和挑战结果会优先复用缓存,失效的
player.js 或被平台拒绝的播放候选会进入 EJS/HLS 回退,避免在同一候选上反复重试。BgEffectPainter 加载
assets/shaders/hyper_background_effect.glsl 并通过 RuntimeShader 逐帧渲染;
shader 内部基于封面取色、动态色块和轻量颗粒噪声生成流体背景,
并接入 uMusicLevel / uBeat 做音频响应,不是简单把封面做高斯模糊。SyncedLyricsView 与 AdvancedLyricsView 支持逐行、逐词/逐字 LRC(含行尾
时间和方括号逐字时间戳)以及 YRC/TTML 歌词的高亮、翻译歌词、
音译显示、歌词偏移、点击跳转、长按分享、景深模糊、边缘渐隐和全屏歌词;
LyricShareSheet 可选择歌词行,复制文本、分享歌曲或生成 1080px 歌词卡片;
歌词页遇到含假名的日语原文时,会为翻译行额外留出间距,避免日文字形和译文挤在一起;
悬浮歌词、状态栏歌词、SuperLyric、Lyricon、蓝牙歌词和歌词编辑
也复用同一条播放数据链路。LocalAudioImportManager 支持外部分享/打开导入、授权文件夹扫描、
设备媒体库扫描和常见音频格式识别,并会处理附近的 lrc/txt 歌词与
cover/folder/front 封面;大批量扫描会先给出快速预览,再在后台补全
更完整的歌名、歌手、专辑和封面信息;LocalPlaylistRepository
负责本地系统歌单、普通歌单、收藏、排序、去重、备份和同步触发。Library 不只是歌单列表,本地内容可在歌单/歌手之间切换,
LocalArtistSummary 会按展示艺术家自动聚合歌曲、拆分常见合作歌手写法、
生成稳定身份和封面;
网易云歌曲还能进入艺术家详情页,查看热门歌曲和专辑,并把艺术家关注到收藏页。Mini Player 支持横向滑动切到上一首/下一首,常用播放控制不用每次展开全屏;
桌面小组件提供 4x2 播放卡片和 2x2 迷你播放器;卡片背景和主播放键会从当前
封面取色,4x2 显示当前歌曲、封面、进度、四项播放控制和桌面歌词入口,
2x2 以封面为主视觉并保留三项播放控制,两者都复用播放服务的控制链路;
启动器快捷方式可直接继续播放、打开探索、打开媒体库或随机播放我喜欢的音乐;
底部主标签按目标顺序做可打断的横向换页,转场中会同时保留出场与入场页面,
避免玻璃背景、滚动位置和页面状态在快速切换时闪断;
播放页长按封面可打开沉浸式大图预览,支持双指缩放、拖动与下载封面。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 元数据管理完整落盘流程;
直接 HTTP 传输、平台需要显式 Range 的传输和 HLS 都有对应续传策略,网络策略暂停后可继续,
启动时会恢复未完成队列,已落盘的缓存命中会直接结算,
手动取消则会清理半成品,语义边界很清楚;下载完成后即使标签写入失败,已落盘
音频仍会保留。StorageUsageAnalyzer 会把音频缓存、图片缓存、下载暂存、分享暂存、
平台歌单缓存、下载内容、日志、崩溃报告和核心应用数据分组统计;
清缓存支持只清可再生成的缓存,不会把用户主动下载的歌曲当作缓存删掉。PlaybackStatsRepository 按歌曲稳定身份记录播放次数、
收听时长、最近播放和每日桶,并参与同步合并;播放和流量统计采用延迟批量写入,
在关键生命周期阶段 flush,并限制每日统计桶数量。
远端同步快照读取时会兼容旧字段和异常缺字段数据,过滤缺少可解析歌曲身份的记录。TrafficStatsRepository 会区分播放流量、下载流量、Wi‑Fi、移动网络、
漫游和缓存命中;批量或单曲下载在高风险网络下还能主动弹出提示,
避免把“省流量”只做成设置页里的摆设;统计写入同样使用批量累积和生命周期 flush。AutoSettingsSchema 管理,覆盖动态取色、种子色、
主题风格、自动/浅色/深色模式、UI 缩放、自定义背景、歌词字号、
歌词模糊、播放页流体背景、两级高级模糊、连贯反馈、首页卡片开关、默认启动页、触感反馈,
以及歌曲自定义名称、歌手和封面等细粒度选项。
OnePlus 的高密度屏幕(系统 densityDpi >= 500)会自动叠加 0.95x UI 修正,
普通密度机型不触发修正,用户手动设置值仍会作为额外乘数参与计算。
“进阶高级模糊”和“连贯反馈”默认关闭;关闭连贯反馈时,歌单等详情页使用抽屉式展开;
进阶高级模糊仅在 Android 13+ 且父级高级模糊开启时可用;
它会增强屏幕级顶部 Tab、底部 Tab 和设置结构卡片的实时玻璃材质,
并提供 12-64 dp 的模糊度调节,不改变文字、图标、布局与点击区域。
模糊质量可独立选择“超低、低、默认、高”:超低和低保持与默认相同的模糊范围,
通过局部区域渲染、动态下采样和 RenderNode 硬件缓存降低渲染开销。
检测到天玑 SoC 且尚未保存过选择时默认使用“超低”;前后台切换或更改质量时会
重建局部缓存,避免恢复后出现异常背景。“高”需要先开启进阶高级模糊。AnrWatchdog 会读取 Android ApplicationExitInfo.REASON_ANR 并保存系统
ANR trace;ExceptionHandler 与 NativeCrashHandler 分别记录 JVM 和
Native 崩溃。上次启动异常时,SafeModeManager 可跳过完整应用初始化,
直接进入安全模式预览、复制或导出日志。arm64-v8aarmeabi-v7ax86 / x86_64 主要用于模拟器、英特尔设备或 Chromebook[!IMPORTANT] Release 渠道不是严格意义上的稳定通道。版本通常在完成一批功能后手动发布, 仍可能包含未充分暴露的问题。
master 分支 CI 默认上传
arm64-v8aAPK;手动 Release 流程会构建多 ABI APK。
git clone --recursive https://github.com/cwuom/NeriPlayer.git
cd NeriPlayer
./gradlew :app:assembleDebug
adb install -r app/build/outputs/apk/debug/app-debug.apk
Debug 页面。DEBUG 构建仅用于测试,性能和体积不代表发布版。
发布版构建与签名流程请参阅 CONTRIBUTING.md。
Library 提供本地、收藏、网易云、YouTube Music、Bilibili 等入口;
可在“设置 > 通用”中完全禁用 YouTube,关闭后不会展示相关入口或执行后台预热;
本地页支持歌单/歌手切换、搜索、歌手排序,收藏页支持歌单/歌手切换,
网易云页支持歌单/专辑切换,Bilibili 页区分创建收藏夹、订阅收藏夹和合集。Explore 使用网易云 / Bilibili / YouTube Music 按平台独立搜索;
网易云支持歌曲、歌单和歌手分类,网易云与 Bilibili 搜索结果可在列表触底后
自动加载下一页;“链接识别”可直接粘贴链接或含标题、短链接的整段分享文案,
识别网易云歌曲/歌单/歌手、Bilibili 视频/收藏夹/合集/UP 主及 YouTube
视频/歌单/频道。项目已有详情页的类型可直接打开,暂无详情页的类型会明确提示;
Bilibili 链接会尽量保留 p / cid 分 P 和 season_id 合集上下文,
分享合集时可直接解析到对应合集列表。
搜索框下方会显示本地搜索历史,默认记录防抖搜索过的关键词;
可在“设置 > 通用”关闭探索页搜索历史,关闭后不显示也不再记录新关键词,
已有记录不会被自动删除,重新开启后仍可显示;
播放页元数据补全使用网易云 / QQ 音乐,并接入 LRCLIB 外部歌词来源;
歌词编辑器可选择酷狗、网易云、QQ 音乐、AMLL TTML、LRCLIB 和
YouTube Music 后手动匹配歌词,逐字歌词优先但不隐藏普通歌词,并会自动清理
标题、制作信息等非歌词行。PlayerManager 管理音源解析、队列、随机/循环、状态恢复、失败重试、
播放链接刷新、YouTube 预取与平台特殊请求策略。
随机播放会先生成真实乱序队列,再按该队列顺序播放、持久化和展示。player.js/PoToken 缓存和优先级预取;签名或播放候选被拒时可回退 EJS/HLS。intro、outro、sponsor、
music_offtopic、filler、padding 片段并在本地跳转;不会上传账号、播放历史或新片段。一起听期间保持关闭,
避免房间播放状态漂移。BVID + CID 本地持久化,并通过 GitHub/WebDAV
同步。播放页可使用设为开始/结束、前后 5 秒及播放/暂停辅助定位;一起听期间不应用本地自动跳过,避免房间状态漂移。resumePositionMs 参与本地与可选同步,不代表第三方平台播放历史。USB_DEVICE_ATTACHED 事件可单独关闭,
用于避免不想接管 DAC 时反复唤起应用;
跟随歌曲采样率时会先按 USB 描述符尝试源采样率,精确格式不可用且兼容策略开启时,
再尝试设备上报的兼容采样率;
对需要异步显式反馈的兼容 UAC2 拓扑,会解析时钟链和反馈端点,
根据设备反馈调度音频包,并在长调度间隙后重新进入反馈时钟捕获;
播放启动卡住、Native 传输背压卡住或前后台切换异常时,会通过原地重配置、
协调式 AudioSink 重建、动态传输扩缩容和软恢复尽量拉回,
必要时回退到系统播放避免整条链路卡死;播放器会按网络或本地来源选择唤醒策略,
前后台切换后可恢复 USB 独占,启用比特完美音量时软件增益固定为 0 dB。
设置页会显示后台行为是否受电池优化或后台权限限制;服务端播放保持时,后台音频锚点
会根据实际输出路由选择静音或零均值载波,并通过 MediaSession 提供远程音量控制,
不会把载波当作用户可听内容。SimpleCache + LRU 缓存音频,默认上限 1 GB,
支持分别清理音频缓存、图片缓存、下载暂存、分享暂存和平台歌单缓存,
并可查看分组后的存储占用详情。VIEW / SEND / SEND_MULTIPLE 的 audio/*,
也支持扫描设备本地音乐、按授权文件夹定向扫描,
并自动识别附近歌词与封面 sidecar 文件;大批量扫描会先快速预览,
可按“已有元信息”过滤预览结果,再在后台补全更完整的本地元信息;SAF 空目录结果
不会误清理已有目录索引。feat.、with、和/与、
顿号、分号和常见斜杠分隔;本地歌手页支持播放全部、多选、
导出为歌单,以及对在线来源歌曲发起批量下载。WorkManager 做延迟与周期同步,数据保存在用户自己的远端。REQUEST_SET_TRACK 只能选择当前队列歌曲,并继续校验稳定
曲目键和服务端时钟。12-64 dp 间调节,父级关闭时会保留
子级选择和模糊度但停止进阶绘制。模糊质量可独立选择超低、低、默认或高;
低和超低保持默认覆盖范围,以局部渲染、动态下采样和硬件缓存减轻开销,
天玑设备在未保存偏好时默认超低,并会在前后台恢复或切换质量后重建缓存。RuntimeShader / GLSL 流体背景、音频反应式动态背景、封面模糊背景、
仿 Apple Music 歌词、高级歌词、逐词歌词、翻译歌词、歌词偏移、
音译显示、歌词长按分享、歌词卡片生成、歌词编辑、歌词字体调节,
且封面页与歌词页的歌词 / 翻译字号可分别调节,
歌词触感反馈和 Lyrics 全屏页。封面页逐行歌词与底部 Dock 工具栏可以分别关闭;
窄屏或高缩放的竖屏会自动切换为紧凑布局,并将操作按钮收缩到稳定的触控槽位。
歌词分享支持逐行点选和从起点到目标行的长按范围选择。RuntimeShader 动态背景仅在 Android 13+
启用;封面模糊需要 Android 12+,高级模糊需要 Android 13+,低版本会降级。Debug 页,
包含 YouTube / Bili / Netease / Search / Listen Together 探针、
普通日志与崩溃日志查看器。season_id 或视频详情恢复合集上下文;
当前不是完整视频发现流或评论区客户端。compileSdk = 37targetSdk = 36minSdk = 2827.0.120779733.28.0+<git短哈希>.<MMddHHmm>NeriPlayer-<versionName>[-abi].apkarm64-v8a;多 ABI 构建需加
-PbuildAllReleaseAbis=true.github/workflows/android_native_ci.yml 会在 Native 相关变更时运行
Release + -Werror、ASan+UBSan、TSan 三组 host CTest,并单独编译
arm64-v8a、armeabi-v7a、x86、x86_64 四个 Android ABI。:app:主 Android 应用。:ksp-annotations / :ksp-processor:设置项自动登记与生成。:accompanist-lyrics-core / :accompanist-lyrics-ui:歌词解析与 Compose 歌词 UI 子模块。build-logic:统一 Gradle convention plugin。buildSrc:保留的辅助 Gradle 构建逻辑模块。np-submodule/NeriPlayer-LTW:一起听 Cloudflare Workers 服务端。np-submodule/miuix:仓库内附带的上游 Miuix 源码/文档树,当前不参与主应用模块构建。MainActivity 是唯一对外入口,同时处理启动流程、通知权限、
外部音频导入、USB 设备插入事件和 neriplayer://listen-together/join 深链。Safe Mode,
只开放日志预览导出、配置导出、登录重置、设置重置和恢复正常启动。Home / Explore / Library / Settings 为主路径。Home 会根据首页卡片可用性动态显示;Debug 仅开发者模式开启后显示。MainTabLayerHost 保留出场/入场双场景并按标签顺序横向切换;
每个场景独立持有可保存状态和高级玻璃 owner,快速反向切换也会从当前进度继续。Now Playing 不是普通路由,而是覆盖在主导航之上的全屏播放层,
底部常驻 Mini Player;Mini Player 支持横向滑动切歌。LauncherShortcuts 映射为继续播放、探索、媒体库和随机喜欢,
只落到主标签或播放服务入口,不会绕过正常导航状态恢复。Library 使用分页导航组织本地、收藏、网易云、YouTube Music、Bilibili
和 QQ 音乐占位;同时提供最近播放和播放统计入口。LocalArtistDetailScreen 承载,支持播放全部、多选、
导出歌单和批量下载在线歌曲;网易云艺术家详情页由
NeteaseArtistDetailScreen 承载,支持歌曲/专辑分页和关注状态。PlayerManager 统一管理。AudioPlayerService 提供前台播放服务、媒体通知、MediaSession 和基础传输控制。ConditionalHttpDataSourceFactory
动态附加 Referer / User-Agent / Cookie。player.js 和 PoToken 缓存,并在播放候选
被拒时回退 EJS/HLS;长音频的大幅 Seek 会进入更短的启动恢复窗口,避免等待普通
播放启动看门狗超时。playback/、url/、resolver/、service/、effects/、
lifecycle/、watchdog/ 与 usb/ 等职责分包;共享歌曲模型位于 data/model/,
旧包名仅保留少量兼容别名,不应作为新增代码入口。USB_DEVICE_ATTACHED 唤起路径。Explore 当前接入网易云、Bilibili 和 YouTube Music,
采用按平台独立搜索,不混合聚合结果。网易云可切换歌曲/歌单/歌手,
网易云和 Bilibili 支持触底分页;链接识别支持直接链接和含短链接的分享文案,
Bilibili 视频链接会保留 p / cid 指向的分 P,合集分享会优先使用
视频详情里的 UGC season,必要时回退到链接里的 season_id。
搜索历史保存在本地,可在“设置 > 通用”中独立关闭显示和记录。SearchManager 使用网易云与 QQ 音乐补全封面、歌词和曲目信息。LyriconManager 向 Lyricon 与 SuperLyric 输出当前歌曲、播放状态、进度、
逐字歌词与翻译歌词;进度通过独立的 200 ms feed loop 推送并使用时间锚点校准,
状态栏歌词依赖厂商能力,当前面向部分支持设备。neteaseArtists
元数据,用于进入网易云艺术家详情。NeteasePlaylistCacheRepository 会缓存歌单 header、曲目、最近曲目签名和保存时间;
NeteaseCollectionDetailViewModel 会先发布缓存再刷新网络,
当曲目签名未变化或网络失败时复用缓存。DataStore 持久化,并通过 KSP 生成设置 key、备份白名单和设置 UI 元数据。ThemeMode 管理,支持浅色、深色和跟随系统的 Auto 模式。Android Keystore + EncryptedSharedPreferences 本地加密保存。data/sync/model/,
封面映射位于 data/sync/;GitHub/WebDAV 管理器与传输仍在各自 provider 包,
现有兼容序列化和多数合并策略继续位于 sync/github/。
删除记录会和撤销操作一起进入合并策略,避免本地撤销后的歌曲在下一轮同步又被旧删除记录移除。ANDROID_ID。GZIP(ProtoBuf),普通模式保存 UTF-8 JSON。OkHttpClient,不是系统 DownloadManager。cache/download_staging 下的工作文件,再提交到应用管理目录
或用户选择的 SAF 目录;正式落盘前会先准备音频元数据,提交后再写歌词、封面、
.npmeta.json 和音频标签。DownloadTaskStore 会持久化待下载队列和任务状态;
GlobalDownloadManager 启动时会等待已有队列收敛,再恢复未完成任务,
避免旧队列和新请求互相覆盖。Range: bytes=<offset>-.hls.json 检查点恢复.resume.json 恢复元数据,用来在应用重启后重建待恢复任务;
GlobalDownloadManager 启动时会自动扫描并恢复未完成下载。WAITING_NETWORK 时,也会保留断点并在网络恢复或用户确认后继续。StorageUsageAnalyzer 会按可清理缓存、下载内容、诊断文件和应用数据分组统计占用;
清理缓存只覆盖可再生成的缓存和暂存文件,不会删除用户主动保存的下载歌曲。LocalAudioImportManager 支持导入外部音频、扫描设备音乐,
并复制附近的 lrc/txt 歌词文件与 cover/folder/front 封面图。cache/shared_local_media 暂存后分享,该目录属于可清理缓存。BackupManager 支持本地歌单 JSON 备份、导入与差异分析。ConfigFileManager 支持完整配置导入/导出,用于迁移设置、授权和同步配置。想深入了解实现细节?请阅读 CONTRIBUTING.md。
NeriPlayer 内置“一起听”功能。你可以快速部署自己的服务端, 也可以使用他人部署的服务。
服务端源码与部署入口:
np-submodule/NeriPlayer-LTW服务端基于 Cloudflare Workers 和 Durable Objects, 通过 WebSocket 提供实时同步。
应用内可在设置页配置一起听服务端地址、测试可用性,并重置本机一起听身份。
补充说明:
NeriPlayer 支持将本地元数据同步到 用户自己的 GitHub 仓库。 应用内新建仓库时默认创建为私有仓库,也支持接入已有仓库。
当前同步对象包括:
Android Keystore + EncryptedSharedPreferences 中。WorkManager,仅在存在
validated network 时执行。addedAt 的歌曲会排在已有时间的歌曲之后,避免异常快照打乱歌单。backup-raw.bin 直接写入原始 GZIP(ProtoBuf) 字节;读取侧仍兼容
backup.json 和历史 backup.bin Base64 格式,关闭省流模式时使用 JSON。JSON、压缩
正文和解压后正文分别有 8 MiB、12 MiB、16 MiB 的上限。repo 权限)。除 GitHub 外,NeriPlayer 也支持将同一套同步数据保存到 WebDAV 远端文件。
WorkManager 做延迟同步、周期同步、网络检查和失败重试。这些方向会根据维护精力、平台可用性和社区反馈调整,不承诺固定周期。
season_id 链接识别⚠️ 当前 QQ 音乐主要用于播放页元数据补全。 完整账号能力、库页数据与更稳定的授权链路仍在开发中。
感谢使用 NeriPlayer。由于项目功能较多且用户运行环境复杂, 可能会出现符合预期的差异或异常情况。若您在运行中遇到任何问题, 欢迎随时提交反馈,我们将持续优化。
adb logcat | findstr NeriPlayer
adb logcat | grep NeriPlayer
backup-raw.bin 原始 GZIP 字节;新版在迁移期间同时保留
backup.json 与历史 backup.bin Base64 的读取兼容。| netease-cloud-music | ✨ 网易云音乐 Golang 实现 🎵 |
| bilibili-API-collect | 哔哩哔哩 API 收集整理 |
| ejs | External JavaScript for yt-dlp supporting many runtimes |
| accompanist-lyrics-core | A lyrics parsing, converting, exporting library for Kotlin |
| accompanist-lyrics-ui | The state-of-the-art karaoke lyrics composable |
| LDDC | 多平台精准歌词下载匹配工具,手动歌词匹配体验参考 |
| Metrolist | YouTube Music client for Android |
| HyperCeiler | HyperOS enhancement module - Make HyperOS Great Again! |
NeriPlayer 使用 GPL-3.0 开源许可证发布。
这意味着:
app/src/main/cpp/README.md 仅为其中列出的 NeriPlayer 自有 Native 源码
提供附带署名条件的替代授权;第三方源码和未列入范围的仓库内容不适用。贡献前请先阅读完整的 CONTRIBUTING.md。
Kotlin
85.8%
C
7.2%
C++
5.8%