阿喵收音机 :懒猫上的专属FM

虫子樱桃

发布于1天前
苔花如米小,也学牡丹开。

很多人都有过这样的经历:想听一个国外电台,得先在一个聚合站里翻半天,点进去发现流已经失效;换个网站,收藏又得重新攒一遍。更麻烦的是,这些聚合应用的电台源大多握在别人手里——某个台换地址了、某个频道下架了,你只能干等维护者更新。

阿喵收音机(meowRadio)就是冲着这件事做的:一个自己部署的网络收音机,把世界电台目录、收藏、定时关闭、录制和自己的电台源都收进一个页面里,源掌握在自己手上。

它是 Rust 写的单二进制服务,React 界面直接嵌进二进制,账号和收藏用 SQLite 保存,不依赖外部数据库,也不需要单独跑一个前端服务。

一分钟跑起来

直接在懒猫应用商店下载

https://appstore.lazycat.cloud/#/shop/detail/community.lazycat.app.meowradio

这个是打开时候的首页界面

首页:胡桃木拟物收音机

找台:目录、搜索和筛选

首页是电台目录,目录来自社区维护的 Radio Browser。列表每条会显示国家、节目类型、编码和码率,点电台名称就直接开播。

想按条件找,用搜索框输入电台名称、FM 或频率关键词;或者点「筛选」打开面板,按国家/地区、语言、节目类型、排序组合浏览——不输关键词也能翻。编码和最低码率收在「音频格式与音质」折叠区里,首页只保留一个筛选入口,不把选项铺满屏幕。

几个实际用起来才发现的细节:中文输入法要在选词完成后再搜;按 Enter 可以立即搜索;搜不到结果时有恢复入口,不用手动清空条件。筛选面板里点击「应用筛选」才会更新列表,直接关掉面板会丢弃未应用的修改。

选中电台后播放器进入 ON AIR 状态,显示电台名、国家与编码,时钟开始走;播放、暂停、上一个/下一个频道和音量都在这一块。

播放中的播放器

九套外观:让它像一台真的收音机

桌面常驻或者投到大屏上,界面好看与否是每天都要面对的。所以这个播放器做了九套外观:胡桃木拟物、琉璃夜色、光阵立方(2D/3D)、云白拟态、弧光调谐、奶油白、黑白刻度、银色复古、红屏像素。每一套都有独立的浅色和暗色配色。

外观在用户菜单的「系统设置」里切换,语言和深浅色在首页顶栏就能切。切换外观不会打断正在播放的电台,偏好保存在当前浏览器里。用户菜单里集中了个人选项、系统设置、录音管理、个人电台源和退出登录五件事。

用户菜单

外观里的电平、波形是随播放状态变化的装饰,暂停、缓冲、静音或者页面被隐藏时就停下来,不会假装成真实频谱;系统开启「减少动态效果」时显示静态形状。

弧光调谐外观

收藏:多了也不卡

收藏多了以后,一次性把全部电台拉下来会越来越慢。所以「我的收藏」改成服务端分页,每页 24 个,同时显示匹配总数和页码;搜索覆盖全部收藏的名称、标签和国家,改关键词会回到第一页,但翻页不会打断正在播的电台。取消末页最后一项收藏时会自动退回有效页。

首页分成「系统电台」「个人电台」「我的收藏」三个入口,各自保留自己的页码。

定时关闭:像收音机闹钟一样

睡前听电台,最需要的是「到点自动关」。定时关闭的入口在播放器旁边,点开是一个表盘:拖动时针和分针选择时长,也可以用键盘方向键、直接输数字,或者用 15/30/60/120 分钟的快捷预设。设好点「开始计时」,到点按实际时间停止播放,重新设置会替换上一次。

它还能决定提前多久给出更醒目的提示:关闭、提前 10 秒、30 秒、1 分钟或 5 分钟。提示跟着当前材质和配色走,数字保持稳定,只有光晕轻微呼吸;系统开启减少动态效果时保持静态。

有个细节值得单独说:换台、切换外观、进入登录页都不会重置计时,但刷新或关闭页面会结束这次计时。这不是 bug——正在运行的定时只属于当前页面会话,是有意这么设计的(后面原理部分再解释)。设备休眠时浏览器无法执行计时,恢复后会按已经过去的截止时间立即停止。

录制:听到好节目存下来

广播节目没法回听,听到好的内容想留下来,就得录。录制的前提是先让音频经过服务器播放(也就是「中转」),然后点播放器上的圆形录制按钮开始,点停止图标结束。

换台、暂停、定时关闭或者播放中断,都会自动结束当前录制,并把这一段连同原来电台的信息保存下来;重连之后需要手动开始新的录制,不会把不同时段的音频悄悄拼成一条。停止后录音自动上传到个人录音库,也可以先下载到本机。上传失败可以重试。

录音库在用户菜单里,支持应用内试听、重命名、下载和删除;试听时会先暂停直播,关掉管理窗口就停止试听。

录制参数在系统设置里:格式按浏览器能力显示(WebM/Opus、Ogg/Opus 或 MP4/AAC,没有伪装成 MP3 的选项),目标码率 64/128/192/256 kbps,最长 5/15/30/60 分钟。每条最大 100 MiB,每用户总共 1 GiB。

个人电台源:把自己的源管起来

这是最贴合「源头要自己维护」这件事的功能。央广、地方台、小众流媒体、或者某个不在公共目录里的直播流,都可以自己加进来。

入口在用户菜单的「个人电台源」,也可以直接访问 /sources。有三种添加方式:填一个返回 JSON 的订阅网址、填单个音频地址或电台播放页、或者直接上传 JSON 文件。网络源需要手动点「更新」拉取,文件源重新上传替换;更新失败会保留原来的内容,不会把好的数据冲掉。

JSON 格式是顶层数组,每个电台有名称、可选的分类路径和一组地址;多个地址按顺序尝试,前面的失效就用后面的。需要带请求头的地址可以用对象写法,但只允许 User-Agent、Referer、Origin、Accept 四种头。

协议支持得比较宽:HTTP(S) 连续音频、HLS、FLV、RTMP(S)、RTSP(S)、MMS 系列,也包括能从中提取媒体链接的 HTML、JSON、JSONP 播放页和接口——央广的播放页按 cf 参数选频道。服务端会把这些源解析并转成同源 MP3(128 kbps)再播放,这样录制和定时功能才能一起用。

导入或更新之后,程序会逐条检查每个地址。检查完只把失败的线路列在对话框里,由你确认后才清理;如果某个电台还有别的有效地址,它会和它的收藏一起保留下来——只有所有线路都失效,才会删掉这个电台和它的收藏。源管理里也可以删除单个电台、单个源或全部个人源,系统电台的收藏不受影响。

限额方面:每个用户最多 32 个源,单次导入最多 5 MiB、5000 个条目;转码任务全局最多 4 个并发、每个用户 2 个,地址检测和播放共用这个额度。

个人源管理

无效地址确认:只列出失败线路

账号:多用户、各自收藏

登录和注册在独立的 /login 页面,不在弹窗里。每个账号有自己的收藏和录音,密码用 Argon2id 哈希,会话是 HttpOnly 的 Cookie,过期和退出都会撤销。

个人资料在用户菜单的「个人选项」里,只有「个人资料」和「修改密码」两个页签:昵称只用于显示,登录用户名不变;头像支持 PNG/JPEG/WebP,上传后服务端裁剪成 256×256 的 WebP。改密码需要验证当前密码,改完保留当前登录、撤销其他设备的会话。

懒猫的移动端优化

移动端在懒猫微服的 WebShell 里打开时,程序会自动启用原生控制栏适配:Android 端同步播放状态、元数据和播放/暂停/换台,iOS 端适配状态栏和安全区域。在普通浏览器里会跳过这些 SDK 加载和宿主调用。

几个设计取舍

定时关闭为什么用「实际截止时间」。 浏览器在后台会节流定时器,如果只靠倒计时计数,页面被挂起后就会越走越慢。所以计时存的是一个绝对截止时刻,到点比对当前时间即可停止。换台、切外观不会重置,是因为截止时刻属于这个页面会话,而不是属于某个播放器实例;刷新页面会结束计时,同样是因为它只存在于当前会话里——这一点在界面上是有意保留的行为。

断流之后怎么恢复。 网络中断后按 2/4/8/16/30/30 秒递增的间隔重试,恢复网络或回到前台时也会检查是否需要重连。手动暂停和定时关闭到点不会触发自动恢复,避免你明明按了暂停、它自己又响起来。

中转的安全边界。 服务端中转要防止被拿来当跳板。系统电台只接受 Radio Browser 的电台 UUID,每次重定向都重新检查目标是不是公共 IP,并把解析结果固定下来;个人电台源只允许公共网络目标,拒绝 URL 里带账号密码的地址,每次跳转和媒体子资源都检查目标地址。HLS 的子资源(播放列表、密钥、分片)用绑定当前用户和电台的签名链接,仍然需要登录会话才能取。

录制为什么只对中转音源启用。 浏览器直连的音频流来自电台自己的域名,跨源拿不到可录制的音轨;而中转后的音频是同源的 MP3,才能用浏览器原生的录制接口抓下来。这也是为什么录制按钮在未中转时是灰的。

收藏为什么要轻量摘要。 列表上要显示收藏标记和银色复古外观里的快捷频道,如果为此把全部电台详情都拉一遍会很浪费,所以单独用一个只含 UUID 和最近几个快捷频道的摘要接口。

移动端上界面会收成单列,筛选面板变成底部抽屉,触控目标也相应放大。

移动端黑白刻度外观

其他的一些说明

  • Radio Browser 是社区目录,部分电台可能离线、地域受限,或者编码不被你的浏览器支持;页面会显示连接失败和重试入口。
  • 个人源里那些需要登录、或者只能靠执行网页脚本才能拿到流地址的链接,可能无法播放;历史链接是否可用也取决于上游服务状态。
  • 移动系统挂起网页时,无法保证后台录制或播放持续运行;回到前台后播放器会检查是否需要重连。

最后

这个项目的目标不是再造一个电台聚合站,而是把「选台、听、收藏、定时、录制、维护自己的源」这套流程放进一个自己能掌控的服务里。目录可以来自社区,但你的收藏和你的电台源,留在你自己的机器上。
感谢懒猫内测群的大佬帮忙抓取的某网络收音机源,通过个人源可以收听很多国内的电台,我做了整理 https://gist.github.com/czyt/e1b1e45842ac69bda2c5ac8245c910b7 希望这个小小的收音机软件能带给你一些快乐。

评论

0

暂无评论

说点什么呢~
收藏
0
0
0