我想听电台。手机应用商店里下了一堆,没一个顺手。
蜻蜓、喜马拉雅、小宇宙这类,内容是授权目录,我想听的不一定在里面,直播电台反而弱,还要开会员。专门听电台的 App 呢,国内台不全,列表看着挺长,能播的没几个。播客客户端倒是成熟,可它们不管电台,我还得再装一个。
装来装去不如自己写。流声(Liusheng)就是这么来的,Android 和 Windows 都做,前身叫澄波(Chengbo),2.2.1 改的名。
几条后来管了大部分设计的规矩
能播比数量多重要。 我宁可要一份测过的台清单,也不要一份没验证过的大全。精选列表现在 409 个台,每一个都是手工重建、两轮探测全过的。判断能不能播不能看状态码——有的源返回 200,内容其实是 JSON 或网页,那也是死的,删掉,不为了凑数留着。
就做公共电台。 只播公开直播流和公开 RSS,版权点播库不碰,没授权。直播音频只在内存里缓冲,绝不存成文件。
死链得让用户自己能修。 第三方的流一定会过期。所以台坏了不用等我发版,长按换个地址就行,换完只存在他自己设备上。精选列表和手动添加两条路都留着,就是不想让「能播」完全靠别人。
借鉴了谁
这项目借了不少东西,得说清楚。
播放器的样子照 Spotify 做的。 底部一条迷你播放器,点开上滑出 Now Playing,这套交互我直接用了。但我不想整个抄。拓展计划里写了一条:不整体复刻 Apple Music / Spotify——用 Spotify 式的交互,视觉保持 Material 3,不照任何一家。Apple Music 那个方向撞了三条硬约束,而且它的视觉是围着版权曲库搭的,跟「公开直播流 + RSS」这个形态不对路。
代码基本是轮子。 音频用 just_audio 加 audio_service,Windows 端是仓库里自己 fork 的 just_audio_windows(UI 线程回调得自己处理);状态管理是 Riverpod;界面是 Google 的 Material 3。
数据来源分几路。 电台发现用 Radio Browser,社区维护的电台目录 API,元数据是公共域的;只取中国大陆、中文和港澳台,当成全球目录用就偏了。播客发现是三级兜底:先搜 iTunes,不行查 Podcast Index,再不行翻本机目录(GetPodcast 精选加 xyzrank 前 1000,大概 1250 个中文节目)。那 409 个精选台是从蜻蜓、央广网、tingfm、radio5 的公开页面一个个采下来的,每台都实测过。
没碰的也算借鉴。 蜻蜓、喜马拉雅、小宇宙、荔枝的点播库要授权,不碰。但它们自己的公开 RSS 可以用——实测发现喜马拉雅、荔枝、蜻蜓返回的其实是平台自己的标准 RSS 2.0,跟第三方转接源不是一回事。
现在
2.2.4,双端,一套 Material 3。电台、播客、收藏、最近、统计、本机备份、Windows 托盘和浮条、Android 桌面小组件都有了。
这东西是为我自己做的。谁要是也想听,拿去用。