更新日志
v0.5.0
本次更新重做了新增和编辑主播的流程,也让应用正在做的事情变得可见得多。主播属于哪个平台,现在直接从链接识别,不用再手动挑;每个主播都可以单独覆盖所属平台的选项;某个平台的内置地址解析失效时,还能改用 Streamlink,其他设置一概不用动。上传也不再是个黑盒:进行中可以直接在主播卡片上看到,结束后能查到每个文件传去了哪里。邮件通知这次两头都补齐,第一次真正可用:SMTP 投递实现了,渠道也不再被“即将推出”的标签挡着。
在这些之外,我们对录制、监控、管道、数据库和网页界面做了一轮排查,改掉的多半是你以后不该再碰到的问题:重启后悄悄不再被检测的主播、在某些流上形同虚设的录制大小上限、HLS 录制结尾被丢掉的片段、失败后在目标位置留下半个文件的管道步骤,以及取消一个步骤之后整条流程就卡在那里不动。
网页界面加载更快,也能记住更多你正在做的事——筛选条件、列表翻到的位置,还有网络抖动时的登录状态。设置、通知、录制引擎和录制过滤器几个页面重新做了归类,相关选项放到了一起,少数原本只写在提示气泡里的说明现在直接显示在页面上。
登录相关也更严格了。缺少签名密钥时服务端会直接拒绝启动,而不是拿一个空密钥继续跑;被停用的账号和“必须修改密码”现在每次请求都会检查,而不只在登录时检查一遍;日志里也不会再出现凭据。
升级前须知
服务端不再接受空的签名密钥
JWT_SECRET一直标注为必填,但此前留空也能启动,实际上就是拿一个空密钥在签名。现在缺少它会直接拒绝启动。仅在本机使用时,可以同时设置AUTH_DISABLED=true和API_BIND_ADDRESS=127.0.0.1(或::1);换成其他监听地址则不接受这个豁免。网页端同样要求在生产环境提供SESSION_SECRET,不再回退到内置的默认值。按官方 Docker Compose 文件部署的话,这两项本来就有。导入备份要么整体成功,要么整体回滚
此前导入中途失败,已经写进去的部分会留在库里。现在整个导入在一个事务里完成,任何一项校验不通过就整体回滚。校验也更严格,因此旧版本导出、依赖缺失字段自动补默认值的备份包可能会被拒绝——用当前版本重新导出即可。以“替换”方式导入时,仅大小写不同的主播链接现在也能正确处理。
主播与平台
可选择直播地址的获取方式
各站点通常都有内置的直播地址解析支持。当站点改版导致内置解析失效时,现在可以在地址获取方式中改用 Streamlink。该设置可针对单个主播、整个平台、模板或全局默认值分别配置,越具体的设置优先级越高。使用前需已安装 Streamlink 工具。它与下载引擎无关:下载引擎只决定拿到地址之后如何保存直播流。
主播级别的平台选项
主播页面新增平台选项标签页,可以只为该主播设置所属站点的专属选项,例如清晰度、登录信息、Streamlink 参数等,而不必修改整个站点的设置。未填写的项目仍沿用站点设置。
重构了新增与编辑主播页面
两个页面均已重新设计。新增主播时会先填写链接并确认站点可识别,随后才填写其余设置,也不会再重复询问链接和名称。编辑页面则将全部设置与检查历史、最近录制集中展示。若在有未保存更改时离开页面,现在会先行提示。
修改主播链接后会正确切换到对应平台
此前如果你编辑主播并把链接换成另一个平台的地址,主播仍会沿用旧平台的设置——包括 Cookie、代理、输出目录和弹幕选项,录制文件也仍以旧平台的名称归档。现在平台会直接根据链接识别,更换链接即可正确迁移到新平台。平台也不再需要手动选择:新增或编辑主播时,识别到的平台会直接显示在链接旁边,无法识别的链接会在保存前给出提示。此前已经对不上平台的主播,会在下次保存时自动更正。
房间关闭时显示为离线,而不是报错
房间关闭、或直播刚结束时,有几个平台返回的数据结构和应用预期的不一样,检测会直接失败——而检测持续失败的主播会被退避。现在 AcFun、哔哩哔哩、斗鱼、PandaTV 和 Twitcasting 都能正确读懂这类回复,把主播判定为单纯离线,或者显示平台自己给出的提示。此外,标题或昵称里带 “undefined” 的小红书直播间不会再解析失败,Picarto 即使链接带查询参数也能取到正确的频道名,Twitcasting 某一档清晰度获取失败时也不会连带丢掉其他清晰度。
对平台的凭据请求变少了
Bigo 和抖音的凭据现在会带着有效期在多次检测之间复用,而不是每轮轮询都重新申请、或者拿到之后就永不过期。多个检测同时开始时会共用一次刷新,不再各自向平台要一份;刷新失败也会在下次重试,而不是把一个失效的占位值一直留着。微博的兜底 Cookie 提示也改成每次运行只记录一次,不再每次检测都打一遍。
通知
邮件通知现在完整可用了
邮件渠道此前两头各缺一半:服务端只把邮件内容拼好,然后往日志里写一行“本应发送”就结束了;界面上的邮件又标着即将推出、根本选不中——尽管它背后的表单其实早就写完了。现在两边都补上了。邮件会通过 SMTP 真正投递,465 端口用隐式 TLS、其余端口用 STARTTLS,同时发送纯文本和 HTML 两个版本,也接入了其他渠道早就有的重试、死信和熔断处理。在通知设置里,邮件渠道现在和其他类型一样可以新建、编辑。不需要认证的中继同样支持——把用户名和密码留空即可;只填其中一个会在表单里当场提示,而不是等到发送时才失败。
Discord 仍标记为即将推出,暂时还不可用。
可分别设置各个通知渠道的语言
通知渠道新增通知语言设置,你可以让发往 Telegram、Webhook 或共用邮箱的提醒各自使用不同的语言。保持为与服务端一致的渠道仍沿用服务端所使用的语言,因此在你主动选择之前不会有任何变化。该设置针对的是查看这些消息的人,与你在本界面所使用的语言无关。
浏览器通知与桌面通知不在此范围内,仍会跟随服务端的语言。
上传
上传过程可见,文件去向有记录
此前上传就像一个黑盒:上传步骤完成后没有任何地方记录文件被传到了哪里,上传进行中时除了任务页面也看不到任何迹象。现在文件上传时,主播卡片上会显示一个带实时进度的云朵小标记,悬停可查看各个上传的速度与大小。上传完成后,任务页面会列出每个文件的目标位置、大小和结果,包括哪些文件失败及原因;媒体产物页面上已上传的文件也会带有云朵标记,悬停即可查看远端地址。这些记录在上传完成后会保留,重启后依然存在,重试上传时会原地更新。
rclone 上传进度终于会动了
此前 rclone 上传进行时,任务页面的进度区域始终是空的——看不到百分比、速度和剩余时间,尽管传输本身一切正常。原因在于向 rclone 索取的传输统计实际上从未送达。现在进度每秒更新一次,显示百分比、已传输大小、速度和预计剩余时间,主播卡片上的上传标记也使用同样的实时数据。如果你曾在 rclone 步骤的额外参数中加入
--progress(或-P),它会被自动移除并在任务日志中注明,因为它会破坏进度上报。中断的 rclone 移动上传现在可以在重试后完成
当移动上传已发送部分文件后中途失败(例如网络波动)时,此前每次重试都会继续失败,因为已上传的文件在本地已不存在,手动重试任务也会遇到同样的错误。现在重试会从上次中断的地方继续,只上传剩余的文件;如果所有文件都已在之前的尝试中上传完成,重试的任务会直接成功。
管道
中断的本地文件移动同样可以在重试后恢复
复制/移动管道步骤也存在同样的问题:如果移动在部分文件已到达目标文件夹后被中断,重试任务会把这些文件报告为失败;如果所有文件都已移动完成,整个任务会直接失败。现在重试会识别已到达目标位置的文件并正常完成。跨盘移动也会先复制到临时文件名,因此中断的移动不会再在最终文件名下留下写了一半的文件。
转换失败不会再留下一个坏文件
转封装和其他 ffmpeg 步骤此前直接往目标位置写,因此运行失败、被取消或超时后,最终文件名下会留下一个写了一半的文件。现在结果会先以临时文件名写在旁边,等 ffmpeg 正常结束后才移动到位。如果该步骤设置为不覆盖,目标位置已有的文件一定会被保留——两个任务恰好同时完成时也是如此——失败的运行也会清理掉自己的临时文件。
取消一个步骤会一并取消它所属的流程
此前取消多步骤管道中的某一个步骤,只会停下这一个步骤,整条流程仍停留在“处理中”,也没有任何东西能把它结束掉,等待该场次收尾的其他工作也可能因此一直卡着。现在取消某个步骤会连同它所属的整条流程一起取消,同级步骤也随之停止;已经结束的流程则不受影响。
取消或超时的任务不再让工具在后台继续运行
此前当管道任务被取消或超过任务超时时间时,它启动的外部工具——rclone 传输、ffmpeg 处理(转封装、转码、字幕压制、缩略图)或弹幕转换——即使任务已被标记为失败,仍可能在后台继续运行;rclone 的临时文件列表也会残留在录制文件夹中。现在停止任务会同时停止这些工具并清理临时文件。
排队的任务会在有空闲工作线程时立刻开始
管道任务由两组工作线程处理,各自接受不同类型的任务。此前新任务入队只会随机唤醒其中一个,因此任务可能一直等到下一轮轮询才开始,而本可以处理它的那一组却在休眠。现在所有符合条件的线程组都会被唤醒,唤醒信号即使在工作线程忙碌时到达也会被记住,不会丢失。还有两处相关修复:批量派生任务时若中途失败,已经创建的任务会被取消,而不是留在那里继续可执行;步骤无法读取某个文件的状态时,只判定该文件失败,不会连带放弃其余文件。
删除管道后任务统计数字会随之更新
此前在管道任务页面删除一个管道时,管道本身被移除了,但它的任务却被悄悄留了下来,导致页面顶部的等待、已完成、失败等计数从不减少——已删除的失败管道会永远计入失败数字。现在删除管道会一并删除它的任务,计数会立即更新。升级前创建的管道同样适用,此前删除时遗留下来的任务记录也会在升级时一次性清理。
单个任务的执行日志不会再无限增长
此前如果任务产生大量输出——例如在 rclone 步骤的额外参数中开启了详细日志——它的执行日志会不断累积,数据库也会随之持续增长,直到定期的历史清理才会回落。现在每次任务运行最多保留最近的 5000 条日志,超出的部分会从最旧的开始丢弃。正常任务远达不到这个上限,日志不受影响。
录制与监控
重启后监控会自行恢复
如果应用重启时某个主播正处于错误退避中,它此后就再也不会被分配监控,只能靠你手动关掉再打开监控才能恢复。现在这类主播在启动时会重新加入监控,首次检测则会等到退避结束再进行。同时修复了三处相关问题:直播看门狗检测失败后不会再跟着停滞计时器高频重试;已删除的主播不会再从重启队列里被复活;单次请求的超时设得很小时,也不会再把整个检测流程提前掐断。
下载失败的退避次数改为跟随离线检测设置
此前主播进入冷却前允许的连续下载失败次数固定为 3 次,无论你把离线检测次数设成多少。现在它会使用同一个设置,并保留最少 2 次的下限,避免一次偶发失败就进入冷却;收到的通知里也会写明实际生效的阈值。冷却时间仍是从 60 秒起、每多失败一次翻倍、最长一小时。在平台或模板上覆盖过的离线检测值,现在在表单打开或重置时也会保留,不会再显示成“继承”并在保存时被清掉。
大小与时长上限对所有直播流都生效
FLV 录制是在关键帧处切分的,但在某些流上——负载被过滤或加密、编码无法识别——没有任何一帧会被认成关键帧,于是你设置的大小和时长上限被无声地忽略,录制会一直长成一个没有上限的大文件。现在这类录制在超过上限两倍时会强制切分,关闭“仅在关键帧处切分”选项时该设置也会被真正遵守,计入上限的大小也和文件在磁盘上的实际增长一致。超长录制的时间轴也不会再在某个时刻绕回起点。
HLS 录制不再丢数据
此前 HLS 录制有三种丢内容的情况:分片流结尾那一小段在播放列表结束时被丢弃,而不是写出来;按大小或时长切分出的新文件开头没有重复写入流的初始化数据,导致新文件单独打不开;以及一帧不合规范的 AV1 数据就能让整场录制的写入中断——现在它只会记录到日志里,录制继续。结构只解析出一半的 TS 分片也不会再触发莫名其妙的切分。
恢复过来的线路可以重新被使用
当一条直播流提供了多个线路时,此前每个失败过的线路都会在本场录制中被永久排除。长时间录制下,这意味着即使早先失败的线路已经恢复,应用仍可能把线路用尽。现在真正取到数据的线路会清空这份记录,它之后再掉线时,其他线路又重新可用。一上来就失败的线路仍计为失败,因此彻底不可用的流不会一直空转。
AV1 等新编码的录制文件不再丢失编码信息
FLV 录制结束时,录制器会回写文件的元数据,但此前只认识 FLV 早期的那套编码编号。使用新编码的直播——比如 AV1 视频或 Opus 音频——录出来的文件里编码字段会被写成一个没有意义的数字,播放器和工具读到它就会把编码认错。现在无论新旧格式、视频还是音频,写入的都是正确的编码;遇到实在判断不出编码的流,也会保留流自己声明的值,不再直接覆盖。一路流里带多条视频轨道的情况现在也能识别了。
被取消的检测不会再卡住主播的配置
主播的配置只解析一次,同一时刻其他要用的地方会共享这份结果。此前如果发起解析的那次请求中途消失了——比如检测在不巧的时机被取消——它留下的占位会挡住这个主播后续所有的配置读取,而且没有任何机制能把它恢复。现在会由另一个等待者接手继续。
过期的缓存数据会重新获取
下载缓存中已经过期的条目此前仍会被当作有效内容返回,磁盘上过期的副本还可能被重新加载回内存。现在它们一律按未命中处理,数据会重新获取。缓存初始化时遇到磁盘错误,也不会再被永久标记为不可用、非重启不可恢复。
稳定性
内部异常不会再让录制戛然而止
服务端的发布版此前被编译成一遇到内部异常就直接终止进程,这会跳过后台任务的错误兜底,也跳过用于收尾进行中录制的优雅退出流程。现在改为正常展开栈,异常被控制在原地,进行中的录制也能被正常收尾。独立的
strev和mesio命令行工具仍保留体积更小的直接终止方式。平台返回的畸形数据不会再拖垮应用
有几处直接解析网络数据的地方——虎牙的二进制响应、FLV 元数据、哔哩哔哩的弹幕帧、H.264 头部和 MPEG-TS 表——此前可能因为被截断或恶意构造的输入而崩溃、按对方给出的长度分配内存,或者把自身状态弄乱。现在它们会把坏数据当成普通错误处理并继续运行,正常的直播流则和以前完全一样。
写入中断不会再把数据库卡死
应用通过单条连接写数据库。此前有几处写入——记录媒体产物、记录场次分段、删除媒体产物——是自己手写事务的,因此写入被取消或提交失败时,这条连接可能带着未结束的事务被归还,之后所有写入都会一直等下去,直到重启应用为止。现在所有写入都走同一套事务处理,连接被复用前会先回滚。
播放
需要登录的直播流在内置播放器中稳定播放
对于播放列表需要 Cookie 或自定义请求头的直播流,此前只有第一个请求会带上这些信息,导致后续在网页端和桌面端播放器中卡住或失败。现在播放器会在整个播放列表中都带上这些请求头——包括清晰度变体、分片、加密密钥和低延迟分段——让这些直播流稳定播放。
新增用于本地网络流来源的设置
为避免内置播放器的代理被指向私有地址,现在它默认只访问公网上的流来源。如果你要观看或录制来自本地网络的来源——例如局域网转推、摄像头或 tailnet 上的设备——请在“网络与系统”设置中开启 允许私有网络流代理目标 以允许访问。
网页界面
网页界面加载更快
仪表盘现在需要下载的启动代码更少,字体文件更小,健康状态检查可以复用,构建后的资源也会在再次访问时使用缓存。翻译数据不再嵌入每个页面,而是作为可复用的压缩文件加载;主播页面只会重绘真正发生变化的卡片;会话列表也改为按页用固定次数的数据库查询取数据,而不是每行都查上几次。这些调整不会改变现有外观、动画、语言支持或操作方式。
网络抖动不会再把你踢下线
此前只要登录状态检查失败——超时,或者服务端短暂不可达——都会被一律当作“未登录”,一次抖动就会把你打回登录页。现在临时性失败会重试,已有的登录状态也会保留。另外,令牌刷新成功但紧接着的请求失败时,你看到的会是这次请求真正的错误,而不是最初那个。
实时推送只保持一条连接
下载状态和日志推送此前可能出现多条连接、也可能一条都不剩:清理或刷新登录时正在关闭的连接会又排一次重连,旧连接的事件会覆盖当前连接的状态,暂停日志查看还会把连接整个重建。现在无论是重连、登录变化、离开页面还是暂停,同一时刻都只有一条连接在工作。
下载日志压缩包不再拖垮页面
日志压缩包此前要先在页面内存里拼好再交给你,包一大就撑不住。现在下载直接交给浏览器处理,进度也由浏览器自己显示,页面不再为它单独显示进度条。服务端也改为把每个日志边读边写进压缩包,不再整个读进内存。
设置页面更清晰
全局设置、通知、录制引擎与录制过滤器等页面均已调整。相关设置按用途归入带标题的分组,更多项目可以通过悬停旁边的问号查看说明,输入框与下拉框也统一了对齐。少数原本只写在提示气泡里的说明,现在直接显示在页面上。保存按钮不再以灰色常驻页面,改为在你修改了内容后才出现。各项设置的功能本身没有变化。
部分界面文字在切换语言后仍显示英文
在录制过滤器的编辑界面中,星期的悬停提示以及星期和时间的预设菜单此前始终显示英文,通知事件与通知渠道上的优先级标签、仪表盘的运行时长一行也是如此。现在它们都会跟随你所选择的语言显示。
通知事件此前也以内部名称显示,因此事件列表、类型筛选以及各渠道的事件选择列表中会出现“STREAM ONLINE”这样的条目。现在它们会以你所选语言的正常文字显示,在事件列表中搜索时,两种写法都仍然可以匹配。
下拉框恢复应有的高度
在管道步骤、录制引擎与预设等表单中,下拉框此前会比旁边的输入框矮一截,导致同一行的设置无法对齐。现在各处的下拉框都会显示为应有的高度。
下拉框在页面打开时会显示已保存的选项
在部分管道步骤、录制引擎与任务表单中,即使已经保存过设置,下拉框在你点击之前仍可能显示为空或停留在错误的选项上。现在页面加载后它们会直接显示已保存的内容。
主题更改重新即时生效
此前如果你已经自定义过主题,在主题页面选择新主题后需要刷新页面才能生效。现在主题预设、颜色和圆角的更改都会立即生效。
列表的筛选和搜索在返回时会保留
在主播、会话、管道任务、预设、工作流、媒体产物等页面上,此前只要打开某一项再返回、或刷新页面,你的搜索内容、筛选、排序和所在页码都会被重置。现在这些状态会保存在页面地址中,返回或刷新都会停留在原处,你还可以收藏或分享某个筛选后的视图。
分页按钮现在会跟随界面语言
在分页列表中,“上一页”和“下一页”按钮此前即使界面切换到其他语言仍显示英文。现在它们会以你选择的语言显示。
管道执行详情在移动端正常显示
在窄屏上,管道执行详情页的概览卡片可能出现图标重叠、进度百分比等较长数值被截断,以及卡片图标高低不齐的情况。现在这些卡片会自适应小屏幕,图标也会对齐排列,进度、步骤数和开始时间都能正常显示。
悬停才出现的操作按钮支持键盘访问
主播行和日志文件上那些鼠标悬停才显示的操作,此前用键盘移动过去时是看不见的。现在获得焦点时它们同样会显示出来。
安全与登录
停用账号和强制修改密码会立即生效
这两项此前都只在登录时检查一次,因此你停用了某个用户、或者要求某个用户修改密码后,他手上已有的令牌在过期前仍然照常可用。现在每次请求都会检查这两项,同时也会检查用户是否已被删除。用被停用的账号登录时也会明确返回“账号已停用”,而不是看起来像密码不对;检查过程中数据库出错则返回服务错误,而不是放行请求。
日志里不会再出现凭据
保存平台设置或管道预设时,此前会把整个请求和响应写进日志,于是 Cookie、密码和处理器配置都进到了留存的日志文件里。这些日志行已经删除。另外,地址里带访问令牌的请求——流代理、媒体、下载和日志接口——现在只记录路径,令牌不会再出现在任何一行日志中。
登录不会再拖慢其他请求
校验密码本身就是故意设计得比较慢的运算。此前它跑在处理请求的同一批线程上,因此几个人同时登录就可能把无关的请求也一起卡住。现在它改到旁边单独执行。
桌面应用
Windows:窗口打开期间不再持续轮询
桌面应用此前每 80 毫秒就检查一次窗口是否被最小化,以便收进托盘。在 Windows 上现在改为由系统通知,省掉了这份持续的后台开销。macOS 和 Linux 仍保留原来的定时检查——它们的窗口层不会上报这个状态变化——三个平台的最小化到托盘行为都和以前一致。