[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-70575":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":9,"totalLinesOfCode":9,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":9,"subscribersCount":16,"size":16,"stars1d":17,"stars7d":18,"stars30d":19,"stars90d":16,"forks30d":16,"starsTrendScore":20,"compositeScore":21,"rankGlobal":9,"rankLanguage":9,"license":9,"archived":22,"fork":22,"defaultBranch":23,"hasWiki":22,"hasPages":22,"topics":9,"createdAt":9,"pushedAt":9,"updatedAt":24,"readmeContent":25,"aiSummary":26,"trendingCount":16,"starSnapshotCount":16,"syncStatus":14,"lastSyncTime":27,"discoverSource":28},70575,"NeriPlayer","cwuom\u002FNeriPlayer","cwuom","A unified Android player for streaming music and videos from multiple online platforms. \u002F ✨ 简易多平台音视频聚合流媒体播放器 🎵",null,"https:\u002F\u002Fgithub.com\u002Fcwuom\u002FNeriPlayer","Kotlin",1884,56,2,79,0,51,401,594,324,18.27,false,"main","2026-06-12 02:02:35","[English](.\u002FREADME_EN.md) | [中文](.\u002FREADME.md)\n\n\u003Ch1 align=\"center\">NeriPlayer (音理音理!)\u003C\u002Fh1>\n\n\u003Cdiv align=\"center\">\n\n\u003Ch3>✨ 原生 Android 多源音频播放器 🎵\u003C\u002Fh3>\n\n\u003Cp>\n  \u003Ca href=\"https:\u002F\u002Ft.me\u002Fouom_pub\">\n    \u003Cimg alt=\"Join\" src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FTelegram-@ouom__pub-blue\" \u002F>\n  \u003C\u002Fa>\n\u003C\u002Fp>\n\n\u003Cp>\n  \u003Ca href=\"https:\u002F\u002Ft.me\u002Fneriplayer_ci\">\n    \u003Cimg alt=\"ci_builds\" src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FCI_Builds-@neriplayer__ci-orange\" \u002F>\n  \u003C\u002Fa>\n\u003C\u002Fp>\n\n\u003Cp>\n  \u003Cimg src=\"icon\u002Fneriplayer.svg\" width=\"260\" alt=\"NeriPlayer logo\" \u002F>\n\u003C\u002Fp>\n\n\u003Cp>\n本项目的名称及图标灵感来源于《星空鉄道とシロの旅》中的角色「风又音理」。\n\u003C\u002Fp>\n\n\u003Cp>\n项目采用原生 Android 开发，当前支持 Android 9 (API 28) 及以上设备，\n围绕「多源探索、在线播放、本地可控」持续迭代。\n\u003C\u002Fp>\n\n🚧 \u003Cstrong>Work in progress \u002F 开发中\u003C\u002Fstrong>\n\n\u003Ca href=\"https:\u002F\u002Ftrendshift.io\u002Frepositories\u002F23906\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Ftrendshift.io\u002Fapi\u002Fbadge\u002Frepositories\u002F23906\" alt=\"cwuom%2FNeriPlayer | Trendshift\" style=\"width: 250px; height: 55px;\" width=\"250\" height=\"55\"\u002F>\u003C\u002Fa>\n\n\u003C\u002Fdiv>\n\n> [!WARNING]\n> 本项目仅供学习与研究使用，请勿将其用于任何非法用途。\n\n---\n\n> [!NOTE]\n> NeriPlayer 不提供公共云端曲库或媒体分发服务。\n> 在线音频能力依赖您在第三方平台上的账号授权，\n> 会员或受限内容仍需遵循原平台规则。\n\n---\n\n## 项目简介 \u002F About\nNeriPlayer 是一个基于 **Jetpack Compose + Media3** 的原生 Android\n音频播放器。当前实现重点不是构建公共云端服务，而是在用户已具备第三方平台账号能力的前提下，整合 **网易云音乐**、**Bilibili** 与 **YouTube Music** 的\n在线内容，并提供 **流媒体缓存、应用内下载、本地导入、本地歌单管理、\n可选 GitHub 私有仓库同步** 等能力。\n\n- **账号即能力**：通过用户在第三方平台的合法授权，启用在线播放、\n  搜索、歌单访问等能力。\n- **默认本地存储**：播放缓存、下载文件、歌单、历史记录、设置与授权\n  信息默认保存在设备本地。\n- **可选自有仓库同步**：可将歌单、收藏和历史等元数据同步到用户自己\n  的 GitHub 私有仓库。\n- **单 Activity + Compose 架构**：以 `MainActivity` 为唯一对外入口，\n  通过 Compose `NavHost`、Mini Player 与 Now Playing 覆盖层组织界面。\n- **首次使用有免责声明阶段**：应用启动流程为\n  `Loading -> Disclaimer -> Main`，首次进入需阅读并同意免责声明。\n\n---\n\n## 快速体验 \u002F Getting Started\n### a. 下载 Release 版本（推荐）\n1. 前往 [GitHub Release](https:\u002F\u002Fgithub.com\u002Fcwuom\u002FNeriPlayer\u002Freleases)\n2. 如何选择版本？\n   - 大部分用户请下载 arm64-v8a 版本\n   - 老旧手机（32位系统）请下载 armeabi-v7a\n   - x86 \u002F x86_64 仅供模拟器或英特尔设备或 Chromebook 使用，普通用户无需下载\n\n### b. 下载 CI 版本\n1. 前往 [GitHub Action](https:\u002F\u002Fgithub.com\u002Fcwuom\u002FNeriPlayer\u002Factions)\n   下载最近一次构建成功的 Artifacts 并解压。\n2. 或访问 [NeriPlayer CI Builds](https:\u002F\u002Ft.me\u002Fneriplayer_ci)。\n\n> CI 仅构建 arm64-v8a 版本\n\n### c. 本地构建\n1. 克隆仓库并使用 Android Studio（最新稳定版）打开：\n   ```bash\n   git clone https:\u002F\u002Fgithub.com\u002Fcwuom\u002FNeriPlayer.git\n   cd NeriPlayer\n   ```\n2. 同步依赖。\n3. 构建调试版：\n   ```bash\n   .\u002Fgradlew :app:assembleDebug\n   ```\n4. 安装 APK（需要 Android 9+ 设备）：\n   ```bash\n   adb install -r app\u002Fbuild\u002Foutputs\u002Fapk\u002Fdebug\u002Fapp-debug.apk\n   ```\n5. 首次启动时先阅读并同意免责声明；Android 13+ 设备会申请通知权限。\n6. 如需调试工具，在设置页连续点击 **版本号** 7 次，\n   启用开发者模式后底栏会出现独立 `Debug` 页面。\n\n> DEBUG 版本可能会存在性能问题，仅供测试使用。\n\n发布版构建与签名流程请参阅 [CONTRIBUTING.md](.\u002FCONTRIBUTING.md#构建发布版--release-build)。\n\n---\n\n## 核心特性 \u002F Key Features\n- 🎧 **多源探索与播放**：`Explore` 页当前支持网易云精选歌单与\n  YouTube Music 歌单浏览，并提供 **网易云 \u002F Bilibili \u002F YouTube Music**\n  搜索入口。\n- 🔍 **分层搜索能力**：页面搜索与播放页元数据补全是两套链路。\n  `Explore` 使用 **网易云 \u002F Bilibili \u002F YouTube Music**；\n  `SearchManager` 用 **网易云 \u002F QQ 音乐** 补全封面、歌词与曲目信息。\n- 🧠 **基于 Media3 的自定义播放管理层**：\n  `PlayerManager` 负责音源解析、播放队列、随机\u002F循环、状态持久化、\n  失败重试与恢复。\n- 💾 **可配置流媒体缓存**：播放器使用 `SimpleCache + LRU` 做音频缓存，\n  默认上限为 **1 GB**，支持在设置中手动清理缓存。\n- ⬇️ **应用内下载与本地播放**：支持将在线音源下载到应用专属目录，\n  同步保存歌词与封面，并在应用内查看进度、管理已下载歌曲。\n- 📁 **本地音频导入与扫描**：支持系统 `VIEW \u002F SEND \u002F SEND_MULTIPLE`\n  的 `audio\u002F*`，可从外部分享\u002F打开音频后导入；也支持扫描设备本地音频。\n- ☁️ **GitHub 私有仓库同步**：可选同步本地歌单、收藏歌单、最近播放与\n  删除记录，使用 `WorkManager` 进行延迟与周期同步。\n- 🛠️ **开发者模式与调试工具**：设置页连续点击版本号 **7 次** 后，\n  底栏会出现独立 `Debug` 页，内含 YouTube \u002F Bili \u002F Netease \u002F Search\n  API 探针、普通日志与崩溃日志查看器。\n- 🌈 **音频反应式动态背景**：在 Android 13+ 的 Now Playing 页面，\n  可选启用基于 `RuntimeShader` 的音频反应式背景效果。\n- ♻️ **本地备份与恢复**：支持本地歌单与收藏数据的 JSON 导入\u002F导出，\n  用于设备迁移或手工备份。\n- 🎧 **一起听**：支持创建房间或加入他人房间，实现 WebSocket 实时同步播放状态、独立房间权限控制（房主\u002F听众）及房主离线检测。\n\n---\n\n## 平台现状 \u002F Platform Status\n- **网易云音乐**：登录、搜索、精选歌单\u002F专辑访问、播放、下载、歌词补全。\n- **Bilibili**：登录、搜索、收藏夹访问、分 P 转音频播放、下载。\n- **YouTube Music**：登录、歌单浏览与详情、播放、下载；Explore 中已\n  注册为搜索源。\n- **QQ 音乐**：当前仅用于播放页元数据\u002F歌词补全，未实现登录、播放与库页。\n\n---\n\n## 实现概览 \u002F Implementation Notes\n### 构建与版本\n- `compileSdk = 36`\n- `targetSdk = 36`\n- `minSdk = 28`\n- Java 17 \u002F Kotlin JVM 17\n- 版本名格式：`\u003Cgit短哈希>.\u003CMMddHHmm>`\n- Release APK 文件名：`NeriPlayer-\u003CversionName>.apk`\n\n### 入口与导航\n- 对外入口只有 `MainActivity`，同时处理应用启动与外部音频导入。\n- 启动流程包含免责声明阶段；Android 13+ 首次启动时会申请通知权限。\n- 主界面是 **Compose NavHost + 动态底栏**：\n  `Home \u002F Explore \u002F Library \u002F Settings` 为主路径。\n- `Home` 只有在首页卡片启用时才显示；`Debug` 只有开发者模式开启后才显示。\n- `Now Playing` 不是普通路由，而是覆盖在主导航之上的全屏播放层，\n  底部常驻 `Mini Player`。\n\n### 播放、缓存与服务\n- 播放核心基于 Media3 ExoPlayer，由 `PlayerManager` 统一管理。\n- `AudioPlayerService` 提供前台播放服务、媒体通知与基础传输控制。\n- Bilibili 音频播放通过 `ConditionalHttpDataSourceFactory`\n  动态附加 `Referer \u002F User-Agent \u002F Cookie`。\n- 播放状态会定期持久化，用于进程重启后的队列与状态恢复。\n\n### 搜索与数据来源\n- **UI 搜索**：当前接入 **网易云、Bilibili 与 YouTube Music**，采用按平台独立搜索，而非混合聚合结果。\n- **元数据补全**：底层使用 **网易云与 QQ 音乐**，专门用于跨平台播放时的封面、歌词及曲目信息补全。\n- ⚠️ **QQ 音乐**目前仅作为后台补全源，Library 中的入口仍处于占位开发阶段。\n\n### 本地数据与安全\n- **应用设置**使用 `DataStore` 持久化。\n- **平台 Cookie、授权信息与 GitHub Token** 使用 **Android Keystore + EncryptedSharedPreferences** 本地加密保存。\n- 播放历史、歌单、收藏快照与部分映射数据使用本地文件持久化。\n- 本地歌单使用 JSON 文件存储，并通过临时文件实现原子写入。\n- GitHub 同步使用本地生成的 UUID 作为设备标识，不依赖 `ANDROID_ID`。\n\n### 下载、本地导入与备份\n- 下载实现基于共享 `OkHttpClient`，不是系统 `DownloadManager`。\n- 下载文件存放在应用专属音乐目录，并配套保存歌词与封面。\n- `LocalAudioImportManager` 支持导入外部音频，并复制附近的\n  `lrc\u002Ftxt` 歌词文件与 `cover\u002Ffolder\u002Ffront` 封面图。\n- `BackupManager` 支持本地 JSON 备份、导入与差异分析。\n\n想深入了解实现细节？请阅读 [CONTRIBUTING.md](.\u002FCONTRIBUTING.md)。\n\n---\n\n## 一起听服务端部署 \u002F Listen Together Deployment\nNeriPlayer 内置了“一起听”功能，您可以快速部署自己的服务端，或使用其他人部署的服务。\n服务端仓库：[TheSmallHanCat\u002FNeriPlayer-LTW](https:\u002F\u002Fgithub.com\u002FTheSmallHanCat\u002FNeriPlayer-LTW) 或本仓库的 `np-submodule\u002FNeriPlayer-LTW` 子模块。\n\n服务端基于 **Cloudflare Workers** 和 **Durable Objects**，提供极低延迟的 WebSocket 实时同步。\n\n### 一键部署到 Cloudflare Workers\n[![Deploy to Cloudflare](https:\u002F\u002Fdeploy.workers.cloudflare.com\u002Fbutton)](https:\u002F\u002Fdeploy.workers.cloudflare.com\u002F?url=https:\u002F\u002Fgithub.com\u002FTheSmallHanCat\u002FNeriPlayer-LTW)\n\n---\n\n## GitHub 同步功能 \u002F GitHub Sync\nNeriPlayer 支持将本地元数据同步到 **用户自己的 GitHub 私有仓库**，\n当前同步目标主要包括：\n\n- 本地歌单\n- 收藏歌单\n- 最近播放记录\n- 最近播放删除记录\n\n### 技术细节\n- 🔒 **本地安全存储**：GitHub Token 保存在\n  `Android Keystore + EncryptedSharedPreferences` 中。\n- 🔄 **同步调度**：本地数据变更后会触发一次\n  **延迟 5 秒** 的同步；同时存在 **每小时一次** 的周期同步。\n- ⏱️ **最终一致性**：这是后台双向同步，不是实时秒级推送。\n- 🌐 **网络要求**：同步任务依赖 `WorkManager`，仅在存在\n  **validated network** 时执行。\n- 🧩 **冲突处理**：同步采用三路合并，处理歌单、收藏、历史与删除记录。\n- 🧯 **冲突边界**：当前以内建规则自动合并常见冲突，暂无手动冲突解决界面。\n- 🪶 **省流模式**：同步模块内置 Data Saver 模式，默认开启。\n- 📦 **远端格式**：远端备份文件为明文 JSON 或压缩二进制格式，\n  GitHub 私有仓库并不等于端到端加密。\n- 🚫 **同步边界**：同步的是歌单\u002F收藏\u002F历史等元数据，不会上传音频缓存、\n  下载文件、本地文件歌单、Cookie 或播放 Token。\n\n### 使用方法\n1. 打开设置页中的 GitHub 同步入口。\n2. 创建 GitHub Personal Access Token（需要 `repo` 权限）。\n3. 在应用内完成 Token 校验与仓库配置。\n4. 开启自动同步。\n\n---\n\n\n## 发展规划 \u002F Roadmap\n- [ ] 视频播放\n- [ ] 评论区\n- [x] 清理缓存\n- [x] 添加到播放列表\n- [x] 平板适配\n- [ ] 歌词悬浮窗\n- [x] 国际化\n- [x] 网易云音乐适配 \u002F NetEase Cloud Music\n- [x] 哔哩哔哩适配 \u002F BiliBili\n- [x] YouTube Music 基础适配\n- [x] YouTube Music 搜索能力\n- [ ] 第三方平台持续扩展（酷狗音乐等）\n\n> ⚠️ 当前 QQ 音乐主要用于播放页元数据补全。\n> 完整账号能力、库页数据与更稳定的授权链路仍在开发中。\n\n---\n\n## 问题反馈 \u002F Bug Report\n- 反馈前建议先开启开发者模式（设置页点击 **版本号** 7 次）。\n- 开发者模式开启后，应用会启用普通文件日志；崩溃日志会单独落盘。\n- 前往 [Issues](https:\u002F\u002Fgithub.com\u002Fcwuom\u002FNeriPlayer\u002Fissues)，提供：\n  系统版本、机型、应用版本、复现步骤与关键日志。\n- Windows 可使用以下命令过滤日志：\n  ```bash\n  adb logcat | findstr NeriPlayer\n  ```\n- Linux \u002F macOS 可使用：\n  ```bash\n  adb logcat | grep NeriPlayer\n  ```\n\n---\n\n## 已知问题 \u002F Known Issues\n### 网络\n- 请合理配置代理规则；全局代理可能导致部分第三方接口返回异常数据。\n\n### 能力边界\n- 下载功能当前不依赖系统下载服务，也不提供断点续传。\n- `Bilibili` 当前主要提供搜索与音频播放链路，不是完整的视频发现流。\n\n---\n\n## 隐私与数据 \u002F Privacy\n- NeriPlayer 不提供自己的公共云端媒体分发服务，也不接入广告 SDK、\n  第三方统计或崩溃分析 SDK。\n- 播放缓存、下载文件、本地歌单、历史记录、设置与授权信息默认保存在\n  用户设备本地。\n- 如用户主动开启 GitHub 同步，仅会将歌单\u002F收藏\u002F历史等元数据同步到\n  用户自己的 GitHub 私有仓库。\n- 不会将音频缓存、下载文件、Cookie、播放 Token 上传给开发者。\n- 默认关闭 Android 系统云备份 \u002F 设备迁移。\n- 如需迁移或备份，请使用应用内置的 JSON 导入 \u002F 导出能力。\n- 第三方平台侧的访问日志与风控策略，由对应平台按照其自身隐私政策处理。\n\n---\n\n## 鸣谢 \u002F Reference\n\u003Ctable>\n\u003Ctr>\n  \u003Ctd>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fchaunsin\u002Fnetease-cloud-music\">netease-cloud-music\u003C\u002Fa>\u003C\u002Ftd>\n  \u003Ctd>✨ 网易云音乐 Golang 实现 🎵\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n  \u003Ctd>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002FSocialSisterYi\u002Fbilibili-API-collect\">bilibili-API-collect\u003C\u002Fa>\u003C\u002Ftd>\n  \u003Ctd>哔哩哔哩 API 收集整理\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n  \u003Ctd>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fyt-dlp\u002Fejs\">ejs\u003C\u002Fa>\u003C\u002Ftd>\n  \u003Ctd>External JavaScript for yt-dlp supporting many runtimes\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n  \u003Ctd>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002F6xingyv\u002Faccompanist-lyrics-core\">accompanist-lyrics-core\u003C\u002Fa>\u003C\u002Ftd>\n  \u003Ctd>A lyrics parsing, converting, exporting library for Kotlin\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n  \u003Ctd>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002F6xingyv\u002Faccompanist-lyrics-ui\">accompanist-lyrics-ui\u003C\u002Fa>\u003C\u002Ftd>\n  \u003Ctd>The state-of-the-art karaoke lyrics composable\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n  \u003Ctd>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002FReChronoRain\u002FHyperCeiler\">HyperCeiler\u003C\u002Fa>\u003C\u002Ftd>\n  \u003Ctd>HyperOS enhancement module - Make HyperOS Great Again!\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftable>\n\n---\n\n## 更新周期 \u002F Update Cycle\n- 仅维护核心功能，其他能力欢迎社区贡献。\n- 仓库可能因特殊原因暂停更新。\n- 欢迎提交 PR 与反馈。\n\n---\n\n## 支持方式 \u002F Support\n- 由于项目特殊性，暂不接受任何形式的捐赠。\n- 欢迎通过提交 Issue、PR 或分享使用体验来支持项目发展。\n\n---\n\n## 许可证 \u002F License\nNeriPlayer 使用 **GPL-3.0** 开源许可证发布。\n\n这意味着：\n- ✅ 你可以自由使用、修改和分发本软件。\n- ⚠️ 分发修改版时须继续以 GPL-3.0 协议开源。\n- 📚 详细条款请参阅 [LICENSE](.\u002FLICENSE)。\n\n---\n\n# Contributing to NeriPlayer \u002F 贡献指南\n贡献前请先阅读完整的 [CONTRIBUTING.md](.\u002FCONTRIBUTING.md)。\n\n---\n\n\u003Cp align=\"center\">\n  \u003Cimg src=\"https:\u002F\u002Fmoe-counter.lxchapu.com\u002F:neriplayer?theme=moebooru\" alt=\"访问计数 (Moe Counter)\">\n  \u003Cbr\u002F>\n  \u003Ca href=\"https:\u002F\u002Fstarchart.cc\u002Fcwuom\u002FNeriPlayer\">\n    \u003Cimg src=\"https:\u002F\u002Fstarchart.cc\u002Fcwuom\u002FNeriPlayer.svg\" alt=\"Star 历史趋势图\">\n  \u003C\u002Fa>\n\u003C\u002Fp>\n","NeriPlayer 是一个基于原生 Android 开发的多源音频播放器，支持从网易云音乐、Bilibili 和 YouTube Music 等多个在线平台流媒体播放。该项目采用 Kotlin 语言编写，利用 Jetpack Compose 和 Media3 技术栈构建简洁高效的用户界面与播放管理逻辑。其核心功能包括通过第三方平台账号授权实现在线内容访问、本地存储播放缓存及下载文件、以及可选的 GitHub 私有仓库同步歌单等元数据。适用于需要跨平台管理和播放个人音乐收藏的场景，尤其适合那些希望在单一应用内集成多种音视频服务的用户。","2026-06-11 03:32:50","trending"]