https://github.com/atorber/noderadio
https://github.com/atorber/noderadio
Last synced: 2 months ago
JSON representation
- Host: GitHub
- URL: https://github.com/atorber/noderadio
- Owner: atorber
- License: apache-2.0
- Created: 2026-04-15T11:01:24.000Z (2 months ago)
- Default Branch: main
- Last Pushed: 2026-04-15T16:25:38.000Z (2 months ago)
- Last Synced: 2026-04-15T17:27:22.755Z (2 months ago)
- Language: HTML
- Size: 412 KB
- Stars: 0
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# NodeRadio | 私频收音机
**NodeRadio(私频收音机)** 是一款为极客、开发者及架构师打造的、高度自定义的音视频直播流管理工具。目前使用 Flutter 框架进行开发,原生支持 Android 平台的高级特性。
它像是一台来自未来的复古电台。不同于预设繁琐的传统播放器,NodeRadio 将每一个 **直播 URL** 或 **协作空间地址** 抽象为一个“频道节点(Channel Node)”。通过输入地址,你可以亲手“调教”出属于自己的私人频道阵列。
-----
## 📻 设计哲学:Neon Nocturne 赛博美学
* **暗黑霓虹:** 采用基于 Material 3 `AppTheme.darkTheme` 深度定制的 *Neon Nocturne* 主题,高对比度色彩(荧光紫、赛博青)点缀在深邃幽暗的背景上。
* **快速交互:** 极简的底部导航结构(频道矩阵、一键添加),摆脱冗杂逻辑,直达核心媒体内容。
* **节点架构:** 频道链接具有严谨的数据结构并自动识别流类型,每个频道都是独立的、持久化的 Node。
-----
## ✨ 当前已实现的核心特性
* **智能频道库管理:**
* 内置轻量级的持久化能力(SharedPreferences),无缝保存、添加、长按删除自定义频道。
* 频道地址智能探测:输入链接即可自动识别并标记为 **飞书直播**、**HLS 流**、**RTMP 流** 或 **常规 Web 页面** 类型。
* **深度支持飞书直播 (Feishu/Lark):**
* 完美解析 `meetings.feishu.cn` 等内嵌 Web 直播流地址。
* 提供一键导入飞书直播测试流选项,免跨端复杂跳转直接在 App 内呈现,打造闭环体验。
* **全功能内置 Web 容器引擎:**
* 内嵌专属打造的 `WebViewPlayerScreen`。
* 提供内置加载进度条与强定制的 Chrome Mobile User-Agent 模拟,深度解决网页兼容问题。
* 一键全屏与横屏强制切入系统,具备最佳的大屏观影体验。
* **Android 原生画中画 (Picture-in-Picture) 后台悬浮播放:**
* 深度集成底层 API (`supportsPictureInPicture`),拥有原生的系统级浮窗支持能力。
* 支持 **Auto PiP 行动**:观看任何直播频道时退回桌面(系统主屏),自动无缝收缩为系统级悬浮窗继续播放。
* 浮窗时自动剥离 App 导航栏与状态栏,呈现 100% 纯净流媒体小窗,并在点击时优雅扩展回全屏应用。
* **无阻碍的中国网络环境编译引擎支持:**
* 针对中国大陆进行了原生 Gradle 与 Maven 下载的定制重配(注入阿里云与腾讯云镜像仓库),保障项目开箱即用、随时可以顺滑构建出 Android Release 应用包。
-----
## 🛠 技术栈与架构 (For Architects)
* **渲染层:** Flutter & Dart。
* **持久层:** `shared_preferences` 对基础数据进行序列化管理。
* **媒体容器:**
* `webview_flutter` 用于实现复杂逻辑页面的渲染(如飞书鉴权页面与推流显示)。
* **底层支持:**
* 使用了 `simple_pip_mode` 突破了普通 Flutter 生命周期限制,获取了 Android 内部的 Picture in Picture 生命周期接口权限以接管悬浮状态。
-----
## 🚀 接入与使用示例
### 如何添加一个飞书直播节点:
1. **获取信号:** 在外部复制飞书会议/直播分享地址。
2. **创建节点:**
* 在 App 底部导航切换至 **[添加]** 标签。
* 填入频道名称(如:`部门技术分享周会`),粘贴相应的 URL,或者使用一键填充测试模板。
3. **注入链接:** 点击 **“保存并添加”**,频道将自动归纳至首页矩阵中进行持久化保存。
4. **悬浮观看:** 点击卡片开始播放,随后上滑返回桌面即可启动画中画 (PiP) 功能。
-----
## 🤝 关于维护
**项目主页:** [github.com/atorber/NodeRadio](https://github.com/atorber/NodeRadio)
如果您在打包编译出现问题(特别是在同步 Android 依赖时),请注意检查项目的 `android/build.gradle.kts` 网络代理以及镜像。当前的构建脚本已确保在国内最高效。
-----
> *"在数字荒原中,捕捉那一束属于你的霓虹电波。"*