简体中文
覆盖配置参考
供 API 客户端和高级配置使用。继承示例见配置层级。
各项设置分别在哪一层配置
并非每个字段在每一层都可以设置。下面的列表对应解析器和构建器实际读取的内容。
- 仅全局层(基础默认值 + 运行时参数):
auto_thumbnail、并发/任务上限、调度延迟、日志过滤指令 - 仅平台层:
fetch_delay_ms、download_delay_ms、platform_specific_config - 仅模板层:
platform_overrides、engines_override - 仅主播层:
streamer_specific_config(JSON 对象,见下文)
各层的字段名并不相同
平台层和模板层存储的是 stream_selection_config(JSON),它会成为 MergedConfig.stream_selection;主播覆盖同样使用 stream_selection_config 这个键。 全局层的引擎和提取器默认值名为 default_download_engine 和 default_extractor, 而平台、模板和主播层使用 download_engine 和 extractor。
合并规则(重要细节)
构建器的策略刻意保守:绝大多数字段都是“有值则覆盖”。
标量:高优先级层覆盖
对于大部分字符串/数字/布尔字段,只要高优先级层提供了值,就会替换低优先级层的值。
离线判定和下载失败恢复共用同一个次数
offline_check_count 是连续离线信号的统一容忍次数。运行时会根据全局、平台、 模板和主播配置合并出每个主播的最终值,并将其同时用于:
- 确认主播离线前所需的连续离线状态检查次数
- 连续下载失败后让主播进入临时冷却的失败次数
默认值为 3。即使将 offline_check_count 设置为 1,下载失败阈值也最低为 2,以避免一次临时 CDN 或网络错误立即触发冷却。达到阈值后,冷却从 60 秒开始, 后续连续失败会让时间依次翻倍,最长为一小时。成功的状态检查或持续的下载进度会 清除累计失败状态。
offline_check_delay_ms 控制离线确认检查间隔及相关的会话迟滞窗口,不控制冷却时长。
这两个值最终都不会低于各自的下限:offline_check_count 至少为 1, offline_check_delay_ms 至少为 1000。收敛发生在平台、模板和主播层,构建合并配置时还会 再做一次,因此即使全局层填了低于下限的值,也会在被读取之前得到修正。
已弃用的兼容格式
序列化 StreamerMetadata 中的别名 effective_offline_check_count 和 effective_offline_check_delay_ms 已弃用。未包含 backoff_threshold 的持久化 TransientError 事件也已弃用。这些兼容格式将在未来版本中移除。新的集成必须使用 offline_check_count 和 offline_check_delay_ms,并在每个序列化的瞬时错误事件中包含 backoff_threshold。
Cookies:“有值即覆盖”(空字符串同样算有值)
Cookies 被当作单个可选字符串处理。只要高优先级层提供了 cookies,就会覆盖低优先级层。
Cookies 使用建议
不要把 cookies 设置成空字符串。空字符串同样算“有值”,会覆盖低优先级层, 实际效果是让兜底 cookies 失效。
流选择:由 StreamSelectionConfig::merge 合并
流选择的合并有特殊语义:
preferred_formats:仅当为Some(非空数组)时覆盖preferred_media_formats、preferred_qualities、preferred_cdns:仅当非空时覆盖min_bitrate、max_bitrate:仅当非零时覆盖blacklisted_cdns:取并集而不是替换,因此高优先级层只能新增排除项
这样模板只需声明自己关心的部分,不会丢掉平台层的默认值。
管道:高优先级层整体替换管道
管道由 JSON 解析为 DagPipelineDefinition。当某一层提供了管道时,它会整体替换 之前的管道定义(不存在逐步骤合并)。
模板还可以把管道写在 platform_overrides[platform_name] 里。它比模板自身顶层的 pipeline、session_complete_pipeline 和 paired_segment_pipeline 更具体, 因此解析器会在模板层之后再应用它们,结果是它们优先生效。
参见:
平台附加项:JSON 浅合并,null 不覆盖
平台提取器选项通过 platform_extras(一个 JSON 数据块)传递,采用浅层对象合并:
- 如果两侧都是 JSON 对象,高优先级层的键会覆盖低优先级层的同名键。
- 高优先级层中值为
null的键会被忽略(不产生覆盖)。 - 如果任意一侧不是对象,则高优先级层胜出。
具体实现位于 platforms_parser::extractor::platform_configs::merge_platform_extras。
如何清除 platform_extras 中的键
platform_extras 使用浅合并,且忽略上层的 null。这意味着高优先级层无法通过 null “取消”低优先级层的键,只能用一个非 null 的值覆盖它。
平台提取器选项(platform_extras)
platform_extras 的来源和合并位置如下:
- 平台层:
platform_config.platform_specific_config - 模板层:
template_config.platform_overrides[platform_name] - 主播层:
streamers.streamer_specific_config.platform_extras
每一层都会按层级顺序调用同一个合并函数。
关于平台附加项中的凭据
平台、模板和主播记录都可能包含与凭据相关的键。每一层在并入 platform_extras 之前, 都会剥离 refresh_token、access_token、session_cookies、last_cookie_check_date 和 last_cookie_check_result,因此提取器配置绝不会携带凭据。
凭据(cookies + refresh_token)单独解析
运行时会另外解析出 credential_source(挂在 ResolvedStreamerContext 上的附属数据), 用于认证和 refresh token 处理。它刻意不属于 MergedConfig,也不得通过序列化的配置 接口对外暴露。
优先级(由高到低):
- 主播覆盖:
streamer_specific_config.cookies(可选附带streamer_specific_config.refresh_token/access_token) - 模板:
template_config.cookies(可选附带template_config.platform_overrides[platform].refresh_token/access_token) - 平台:
platform_config.cookies(可选附带platform_config.platform_specific_config.refresh_token/access_token)
与 MergedConfig.cookies 不同,空字符串或只有空白字符的 cookies 不会成为凭据来源: 该层会被跳过,继续考察下一层。refresh_token 和 access_token 都只会从 cookies 胜出的 那一层读取,因此主播没有配置自己的 cookies 时,主播层的 refresh_token 会被忽略。
平台层也可以在没有 cookies 的情况下产生凭据来源:对于 SOOP, platform_specific_config 中配置了 username 和 password 时会得到一个凭据来源, 其 cookies 在首次使用时签发。
播放器上游代理
选择 服务器代理 后,网页和桌面播放使用与 URL 解析相同的有效 proxy_config。 已添加的主播使用其合并配置(包含模板和主播覆盖);其他直播源 URL 在识别到平台时 使用平台覆盖,否则使用全局配置。直连 由浏览器直接连接,不使用服务器的上游代理。
原始直播源 URL 会随 HLS 播放列表、分片和密钥请求保留,避免 CDN 地址选中不同配置。 配置更新作用于后续请求;连续的 FLV/MPEG-TS 连接需要重新加载播放器才能切换。 显式代理地址无效时播放会报错,不会回退到直连。网页播放需要同时升级前端和后端。
主播覆盖:streamer_specific_config
streamer_specific_config 是一个无类型 JSON 对象,未知的键会被忽略。
会影响 MergedConfig 的键:
output_folder、output_filename_template、output_file_formatmin_segment_size_bytes、max_download_duration_secs、max_part_size_bytesrecord_danmu、danmu_statistics、cookies、download_engine、extractor、offline_check_count、offline_check_delay_msproxy_config(JSON 对象)stream_selection_config(JSON 对象)download_retry_policy(JSON 对象)pipeline、session_complete_pipeline、paired_segment_pipeline(JSON 对象)platform_extras(JSON 对象)
由凭据子系统使用、不属于 MergedConfig 的键:
refresh_token、access_token
两者都只从 cookies 胜出的那一层读取。它们属于在并入 platform_extras 之前会从每一层剥离的 五个键——refresh_token、access_token、session_cookies、last_cookie_check_date 和 last_cookie_check_result。
无效 JSON 会被忽略
平台/模板/全局记录中的多数 JSON 字段都采用尽力而为的解析方式。解析失败时,解析器会 记录一条警告,并回退到默认值或上一层的值。streamer_specific_config 内部同理: 某个键的值结构不对时会被跳过并继承低优先级层,而不会让整次解析失败。
platform_extras 是例外。它的值会被原样取用,不做结构检查;而只要合并的任一侧不是对象, 合并就退化为“上层直接胜出”——因此在这里写标量或数组会替换掉从低优先级层累积下来的 extras,而不是被跳过。
引擎与提取器选择
download_engine
download_engine 是一个字符串,用于选择使用哪份下载引擎配置。它可以是:
- 内置引擎类型字符串(
ffmpeg、streamlink、mesio) - 存放在
engine_configuration表中的自定义引擎配置 ID
两者都匹配不上时,会回退到下载管理器的默认引擎。
extractor
extractor 用于选择由哪个提取器解析直播流地址。它独立于 download_engine,后者只决定 解析出的地址如何被拉取。可用取值:
auto(默认):按 URL 正则注册表分派streamlink:通过 Streamlink 解析
某一层存储 NULL 或空字符串表示不表达偏好,继承下一层的值。无法识别的名称同样只记录日志 并忽略,因此写错名字只会退化为继承,而不会导致解析失败。
engines_override(仅模板层)
模板可以提供 engines_override,它是一个 JSON 对象:
engine_id->override_value
下载开始时,下载管理器会检查所选引擎 ID 是否有对应的覆盖项。如果有,它会:
- 载入基础引擎配置(内置类型用默认配置,自定义 ID 用数据库中的配置)
- 以 JSON Merge Patch 语义应用覆盖:嵌套对象按键逐层合并,覆盖中值为
null的键会被删除 - 为该覆盖创建一个专用的引擎实例,其键包含覆盖内容的哈希,因此它的熔断器状态与未覆盖的 引擎相互独立
这里的 null 含义不同
engines_override 中把某个键设为 null 表示删除该键,而 platform_extras 会忽略上层的 null。