中文 · English
给三星 Tizen 电视做的 bilibili 客户端,全程遥控器操作。电视直连 bilibili: 没有后端,没有代理,没有服务器,账号凭证只存在电视本机。
一台电视上可以同时登多个账号,各自的观看记录互不干扰;在手机上看到一半的, 电视上接着播。
LG webOS 有一个很好的 bili-webos, 三星这边一直是空的。这个项目补的是这个位置。
与 bilibili、三星均无关联。 个人项目,MIT 协议。
![]() |
![]() |
| 首页:最上面一行是「继续观看」,开机光标就在上面 | 1080P H.265 播放,拖动有缩略图预览和章节刻痕 |
![]() |
![]() |
| 播放中按下键拉出分 P、简介与相关推荐,视频不停 | 搜索,可切到电视自带的中文输入法 |
| 实测可用 | 三星 2023 年款 65 吋 CU7090,固件 Tizen 9.0(Chromium 120)。这个项目的所有测量都来自这一台 |
| 大概率可用 | 同代或更新的三星电视(2022 年以后,Tizen 7 及以上)。播放走的是标准的 MSE 和 AVPlay,没有用到机型特有的东西——但没有人在别的机型上试过 |
| 不行 | 非三星电视;三星 2016 年以前的老机型(引擎太老) |
装上去之后启动时会上报引擎版本和编解码支持,第一件事就是看那一行。在别的机型上 装成功或者失败,都请开一个 issue 说一声机型和固件版本,这张表就是这么长出来的。
三星商店不收第三方客户端(2019 年非官方的 Twitch 应用就是因此被下架的),所以只能 侧载。需要一台和电视同网段的电脑,只需要一次,之后电视上直接开。
所有人都会卡在证书上,setup.sh 替你搞定。 2023 年以后的三星电视只认三星签发的
分发证书,Tizen Studio 自带的那套一律 Invalid certificate chain。脚本会打开三星账号
登录页、替你申请证书,不需要 Eclipse、不需要 sudo、不需要证书管理器 GUI。
准备:Node、Python 3,以及 Tizen Studio 的命令行工具(不需要装 IDE)。电视上打开开发者模式,把这台电脑的 IP 登记进去, 然后把电视完整断电重启一次——不重启登记不生效,症状是 sdb 静默超时。
git clone https://github.com/titlog/bilibili-tizen.git && cd bilibili-tizen
zsh tools/setup.sh # 只跑一次:找到电视、读 DUID、签证书,配置写在仓库外
zsh tools/deploy.sh # 检查、签名、安装、启动,约 15 秒更新也是这一条命令。 应用目前不会自己更新(自更新的五条路都探通了,但没做成
产品),git pull 之后再跑一次 deploy.sh 就是升级。
只想要证书、和本项目无关?它已经拆成独立工具 samsung-tv-cert
——
npx samsung-tv-cert --duid <你的DUID>。对 Jellyfin、Twitch 社区版、你自己写的 应用都有用。
- 扫码登录,任意多个账号,切换不用重新扫。
- 凭证只存在电视的本地存储里。 没有服务器、没有统计、没有第三方;应用只和
bilibili.com及其 CDN 通信。流地址是预签名的,播放请求不携带你的账号。 - 电视上的观看进度会回传 bilibili(30 秒一次),手机和网页上就能接着看;反过来也一样。
- 默认走 TV 登录路径,用官方电视客户端的 appkey 签名——这是多账号和进度回传的
前提,也意味着你的客户端对 bilibili 表现成官方电视客户端。这是一个使用条款层面的
取舍,不是技术问题;不想这样可以改走网页扫码,代价是只能一个账号、进度不回传。
两条路的差别摊开在
docs/登录路径.md。 - 令牌过期后需要重新扫码(续期接口没有对着服务器验证过,不敢猜着写)。
- 部署脚本会把你这台电脑的局域网地址写进包里,作为诊断日志的去处;只有你在电脑上 开着收集器时才有东西被收到,而且只在你的局域网内。
能做的:推荐 / 热门 / 排行 / 美食 / 舞蹈 / 动态 / 稍后再看 / 搜索(电视自带中文 输入法),多分 P,续播(记住看到哪一 P,接着手机上的进度),自动播下一集,拖动预览, 播放中拉出分 P 与相关视频,UP 主页(播放面板里按 UP 主名字、或看完之后按右键,看这位 UP 主的全部投稿,返回键回到来的那个页签)。到画面约 2.5–3.5 秒,1080P H.265。
不做的:
- 4K。 缺的那两档(1080P 高码率、4K)是大会员卖的,而且能播 4K 的稿件太少; 这台电视的 MSE 能不能硬解 4K 也没验证过。
- 手机投屏。 投屏接收端必须在网络上监听端口,Tizen 的 web widget 做不到,和够不够 官方无关。替代品是「稍后再看」:手机上点,电视上开。
- 字幕、设置页。 接口有,还没做。
sdb 连不上电视。 开发者模式里登记的是不是这台电脑现在的 IP;改完有没有完整断电
重启。DHCP 换了地址就要重登记。
Invalid certificate chain。 用了 Tizen 自带的证书。跑 zsh tools/setup.sh 换成
三星签发的那套。
装上了,打不开某个视频,提示「视频流被拒绝(403)」。 多半是 CDN 临时限流或者 按文件的拒绝,应用会自己换镜像、换令牌、换编码、压画质;提示出现说明这些都试过了, 过几分钟再试,或者换一个视频。
「动态」「稍后再看」是空的。 这两个标签要登录,先去「我的」扫码。
改了代码没生效。 看电视上报的启动行有没有变;deploy.sh 从 config.xml 推导包名,
改过应用名的话确认它推的是新包。
客户端只是结果,真正花时间的是搞清楚这个平台到底能干什么。下面几条每一条都吃掉过 一整天,而且别处搜不到:
- bilibili 不需要
Referer,但会按 UA 拒绝。 用裸curl试探,每个响应都读起来像 「需要 Referer」——这个假信号差点让整个项目上一个根本不需要的代理。 - 这个固件的 widget 发不出
Cookie头。 Chromium 120 静默忽略 forbidden header, 登录态只能走 query 里的access_key。之前「允许设 Cookie 头」的结论是在只有一个账号 时测的,那个测量根本没有区分能力。 - 同一稿件手机能放、电视不能,根因是 playurl 的
platform。 web 端点铸的流令牌会被 CDN 严格节点 403,app 端点铸的被接受。 - AVPlay 能播 DASH,但清单必须走 HTTP 到达,而 widget 不能监听端口——所以 DASH 走 MSE。同一堵墙也是投屏做不了的原因。
- 换 CDN 节点行不通、限流按 IP、镜像只能排序不能丢弃。 哪台镜像是死的属于当天的 天气,同一台主机一晚全 403、隔天整晚正常。
每条的来龙去脉在 docs/平台坑.md;全部测量、日志判据和排查纪律在
CLAUDE.md,那是这个项目的工作笔记,包括那些推翻了先前结论的记录。
app/ 客户端(ES5,IIFE,无构建步骤)
vendor/ Shaka Player,预编译入库
spike/ 当初摸清平台事实的工装
tools/
setup.sh 只跑一次:你的电视、你的证书
deploy.sh 检查、签名、安装、启动
samsung-cert.mjs 无 GUI 签发三星证书
devserver.mjs 在桌面浏览器里跑客户端(截图、改界面不用部署)
collect.mjs :8099 上的诊断收集器
lint.mjs 抓「调用了不存在的东西」
*-verify.mjs 清单 / 账号 / md5 / 二维码 —— 任何一个失败都拒绝发布
docs/ 平台坑、登录路径、流令牌根治的完整排查
CLAUDE.md 全部发现、坑,以及怎么在零售机上调试
零售机把一切方便的手段都关了:dlog 什么都不返回,Web Inspector 的端口从不打开,
sdb shell 直接 closed。所以应用自己上报——tools/collect.mjs 在 8099 端口监听,
deploy.sh 自动把地址写进构建。
node tools/collect.mjs | tee /tmp/bili.log # 终端 1,先开
zsh tools/deploy.sh # 终端 2收集器不在时上报静默失败;连续五次失败后应用会睡五分钟再试,所以开晚了的收集器最多 等五分钟就能收到东西,重新部署则立刻恢复。
zsh tools/deploy.sh --selftest会在电视上无人值守地走一遍全流程:网格、播放、面板、滚动、拖动、跨缓冲区远距离跳转、 暂停、恢复、退出、账号页,并逐步上报。这是唯一能在无人值守下检验一个构建的办法。 跑完记得再装一次正常构建。
MIT。bilibili 是其所有者的商标,本项目与之无关联。



