ElderTV 1.1.0:py 和 js 站能用了,直播会记住坏线路
- 1ElderTV 1.0.3:第三方源能用了,直播回来了
- 2ElderTV 1.1.0:py 和 js 站能用了,直播会记住坏线路本文

1.0.3 发布时留下了几件没做完的事:py 和 js 类型的站点还是不能用;开了聚合以后,直播只有央视频的 51 个台;直播时网速一直显示 0;切换清晰度时会露出几秒灰色占位;“播放时显示”的设置窗口还是旧样式。
这一版把这几件都做了。另外加了一个安全拦截开关,并且让直播能记住哪些线路放不出来。真机测试中又发现了三个会闪退或报错的问题,也一起修了,其中两个在 1.0.3 里很可能就有。
下面的截图都来自同一台雷鸟电视(Android 11),是真机测试时截的。
py 和 js 站能用了
我用的订阅一共 1895 个站,其中 js 站 439 个、py 站 96 个。到 1.0.3 为止,这 535 个站一个都跑不起来,原因有四层,前三层是有意的安全设计,第四层是真机上才发现的:
第一,加载器直接返回空。 当时 py 和 js 还没有检查规则,按“规则没定之前一律不运行”处理。
第二,远程 py 脚本必须带校验值。 这是上游 webtv 加的要求,可网上的配置几乎都不带,所以就算放开了加载器,py 站还是会被拒。
第三,聚合时直接剔除 py 和 js 站。
第四,选站名额被 jar 站占满。 前三层去掉后,电视上仍然一个 py/js 站都没有。原因是聚合选站时,采集站先占一半名额,jar 站再把剩下的填满,py/js 排在最后,一个名额都分不到。
改法:py 和 js 站改到插件进程里运行,和 jar 插件受同一套系统限制。插件进程启动时,先把 Python 和 JS 引擎以及 65 个常用的 Python 模块加载好,再加上限制。实测这一步要 2.4 到 3.0 秒。远程 py 脚本不再要求校验值(带了的仍然会校验)。聚合时给 py/js 站留出五分之一的名额,同一个脚本最多占总名额的十分之一(电视上是 20 个),避免全被一种脚本占满。

把首页片源换成一个 py 站(A站),首页能出推荐。

点进去能正常播放。js 站(极影)也测过,同样能出首页、能播放。
代价要说清楚:py 和 js 目前没有静态检查规则,只靠插件进程的系统限制兜底。插件进程不能执行外部程序、不能加载本地库、不能结束本应用,但能联网,也能读写应用自己的文件。
还有一个实际情况:电视上这次分到了 40 个 py/js 站,其中 39 个被订阅作者设成了“不参与搜索”。这类站主要出现在首页推荐和分类里,搜片时基本用不到。
安全拦截开关
设置 → 高级设置 → 站点屏蔽,底部有“安全拦截”。默认开启。

开启时,jar 插件下载后先扫描,带“安装 APK”、内嵌本地库或可疑数据包的会被拦下。

要关闭,得先看完这一页风险说明,默认焦点在“取消”上。
实测:关闭后重新聚合,只剩 3 个“下载到的不是插件”的文件被拦,其余全部放行;再打开,会自动重新聚合并重新扫描,之前放进来的有问题的插件又全部被拦回去,一共 11 个插件、198 个站。关闭期间放进来的插件都做了标记,重新开启后要重新扫描通过才能再用。
直播:黑屏、网速、清晰度
切到配置里的台时黑屏,只有声音。 这是我改出来的问题:直播页上有两个播放器,网页播放器(播央视频)和普通播放器(播配置里的台)。切到配置里的台时,网页播放器只是清空了页面,并没有隐藏,它的黑色背景正好盖在视频上面。

改之前:只剩右上角的时间和网速。

改之后能看到画面了。截图时是凌晨 3 点,这条线路播的是电视台的“暂不支持播放该时段内容”垫片,不是 ElderTV 的问题。
网速一直是 0。 现在会显示了。原因没有确认,推测是网页播放的流量没记在应用名下,所以网页源在应用自己的计数不动时,改用整台电视的流量计数。电视上一般只有这一个应用在用网,误差不大。

切换清晰度时的灰色占位。 1.0.3 切清晰度后,大约 3 秒内画面是页面的灰色播放按钮。现在切换期间先盖一层黑底,写着“正在切换到 720P…”,等新画面出来再撤掉。实测遮罩约 3 秒,第 6 秒收到新画面。

1.0.3 的灰色占位。

1.1.0 的切换遮罩。
聚合直播,以及记住坏线路
开了聚合以后,各订阅里的直播列表会合在一起,按地址去重,每次更新检查一遍还有没有频道。
我用的那个订阅情况比较特殊:它的直播不是列表地址,而是把频道直接写在配置里,一共 591 组、388,046 个频道,这也是那份配置有 36MB 的原因。这一版能读这种格式了:读的时候只记数量有限的频道名,按“在多少组里出现过”排序,留下最常见的 3000 个台,每台最多 5 条线路。在 Mac 上用同一份订阅实测,读完要 0.9 秒,占用内存约 13MB;电视上整次聚合用了 147 秒。
订阅里的直播线路有很多本身就放不出来。我在电视上连着抽了 5 个台,4 个出了画面,1 个两条线路都失败。所以这一版另外做了两件事:
- 记住每条线路的好坏。 每条线路放没放出画面都会记下来。换台时先试上次能播的;连续 3 次放不出的线路,一天内排到最后;所有线路都放不出的台,在频道列表里变暗,并标“暂时放不了”。
- 聚合时替换坏线路。 读配置时每个台多留几条候选线路,重新聚合时跳过电视判定为坏的,用后面的补上。

56 台的三条线路都连续失败 3 次后,列表里标成了“暂时放不了”。
控制台(手机或电脑上打开的那个网页)新增了“直播频道”:

不搜索时列出放不了的台;可以按名字搜台,看每条线路成功和失败过几次,可以隐藏台、删线路、给某个台加自己的线路,也可以加自己的 m3u / txt 直播列表。隐藏、删除、加线路,下次打开直播就生效。我在电视上测过隐藏:隐藏后那个台从列表里消失,后面的台顺次往前补。
播放时显示

1.0.3:信息分散在四个角,字比较小。中间试过把字放大、加深色底,结果左下角的进度压住了字幕,所以最后改成了下面这样。

1.1.0:只在右上角放一块半透明的小框,第一行是时间和网速,第二行是进度,画面下方留给字幕。直播同样只在右上角。

详情页左上角的小窗里不显示。

设置窗口改成了和设置页一致的深色样式。
测试中发现的其他问题
控制台报错、搜索结果页闪退。 控制台打开就报 ClassCastException,搜索结果页也会闪退。原因是起播速度的测速数据,在正式包里被读成了错误的数字类型(正式包做了代码压缩,丢掉了这个字段的类型信息),程序拿它排序时就崩了。1.0.3 用的是同样的代码,只要聚合测过起播速度,就可能遇到(推测,没有在 1.0.3 上复现过)。

修好后,同一个页面能正常显示“8 源 · 2.1 秒”。
退出播放页时闪退。 用正式包做最后一轮测试时遇到一次。原因是上游的“预加载下一集”:退出时它用的下载线程被强行关掉,而它还在往里提交下载,出错后整个应用就退出了。这是之前就有的问题,已修复。之后我反复进出播放页 5 次,没有再出现;不过它本来就不是每次都会发生,所以只能说没再遇到。
控制台卡片错位。

有站点被自动停用时,“自动停用的站点”这张通栏卡片会出现,把“订阅”和“这次更新的结果”拆到了两行,各空出半边。

现在半宽的卡片总是成对排列。
剩余问题和进度
| 问题 | 现状 | 下一步 |
|---|---|---|
| 直播线路已开始播放但画面不动 | 程序只知道“开始播放了”,判断不了画面在不在动,这种线路不会被换掉 | 播放后再看几秒画面进度,不动就换下一条 |
| 很多订阅里的直播线路本身失效 | 抽样 5 个台 4 个出画面;坏线路现在会被排到后面、聚合时被替换 | 积累几天的成败记录,再看能放的比例 |
| 安全拦截开关放在“站点屏蔽”里 | 设置页那几个文件正在做另一项改动,暂时避开 | 那项改动合入后挪到设置页 |
| 控制台“直播频道”只能看到电视打开过的列表 | 控制台不会自己下载直播列表 | 加一个“刷新列表”按钮 |
| 直播流落后时跳回最新位置 | 改好了,测试时没碰到这种情况,没有真机验证 | 继续观察日志 |
| 个别 js 站打不开 | 1 个站初始化时报错,是那个脚本自己的问题 | 再找几个同类的站看是不是共性 |
| 直播网速为 0 的根本原因 | 已改成用整机流量绕开,根因仍是推测 | 暂不处理 |
下载
最低要求:安卓 7.0(Android 7.0)及以上,32 位 ARM(armeabi-v7a)。大多数电视和盒子都满足,安卓 7.0 以下的老设备装不上。
复制到浏览器打开,前两个是中转地址,国内一般能直接下:
GitHub 原地址: https://github.com/riowang88/ElderTV/releases/tag/v1.1.0
中转站是第三方的,不归我管,一条打不开就换另一条。安装包约 99MB。
装法:
- 下载 APK,拷到 U 盘,插到电视上
- 用电视的文件管理器打开,提示未知来源就去设置里允许
- 装好后在“设置 → 高级设置 → 配置地址”填片源地址,或者打开聚合
已经装了 1.0.3 的,直接覆盖安装,观看记录会保留。
ElderTV 不内置任何片源,地址需要自己填。
ElderTV 按 GPL-3.0 发布,对应的源码压缩包在 GitHub 原地址的 Release 页面里。
到目前为止,ElderTV 只在这一台雷鸟电视上测试过。其他电视能不能正常用,还没有数据。
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!












