[
  {
    "key": "qqPanel",
    "group": "解析面板",
    "type": "boolean",
    "default": true,
    "label": "链接解析面板",
    "description": "有人在群里发链接时，机器人先回一条带按钮的面板，让他自己挑清晰度、要不要弹幕、要不要在线看。关掉就直接按配置里定的方式解析。"
  },
  {
    "key": "recallPanel",
    "group": "解析面板",
    "type": "boolean",
    "default": true,
    "label": "自动撤回面板",
    "description": "机器人每次发新消息前，先把上一条提示/面板撤掉，群里不会堆一排旧消息。默认打开。",
    "renderIn": "app"
  },
  {
    "key": "qqFileLimitMB",
    "group": "解析面板",
    "type": "number",
    "default": 200,
    "min": 1,
    "max": 2000,
    "label": "画质档体积上限（MB）",
    "description": "面板里「清晰度」那一列的体积上限（MB）。超过它的画质档不给发送按钮，那一格显示「超上限」。QQ 单个视频最多 200MB，所以默认 200。在线播放模式下不按这个值过滤，所有档位都会列出来。"
  },
  {
    "key": "bangumiPanelCols",
    "group": "番剧选集面板",
    "type": "number",
    "default": 5,
    "min": 1,
    "max": 10,
    "label": "表格列数",
    "description": "番剧选集面板每行放几个集数，默认 5。"
  },
  {
    "key": "bangumiPanelRows",
    "group": "番剧选集面板",
    "type": "number",
    "default": 4,
    "min": 1,
    "max": 10,
    "label": "表格行数",
    "description": "番剧选集面板每页放几行（含表头那一行），默认 4，也就是一页 20 集。"
  },
  {
    "key": "sliceImageOnDemand",
    "group": "图片发送",
    "type": "boolean",
    "default": true,
    "label": "超大图片自动切片",
    "description": "卡片太长、超过 QQ 的图片上限时，自动切成几张发出去。默认打开。关掉就整张发，可能被 QQ 拒收。"
  },
  {
    "key": "sliceImageHeight",
    "group": "图片发送",
    "type": "number",
    "default": 2000,
    "min": 500,
    "max": 4000,
    "label": "切片高度（像素）",
    "description": "切片时每张图的高度（像素），默认 2000。数值越大张数越少，但单张也越大。"
  },
  {
    "key": "sliceImageAutoHeight",
    "group": "图片发送",
    "type": "number",
    "default": 6000,
    "min": 0,
    "max": 100000,
    "label": "超过这个高度就自动切片（像素）",
    "description": "图片高度超过这个数就**直接切片**，不用先整张发一次去试探 QQ 会不会拒收。太高的图整张发时 QQ 会把它整体缩小显示，卡片下面挂了按钮（提取封面 / 提取评论区图片）时，缩图留下的空白会被按钮撑开、留一大片空白很难看；切成几片后每片都在正常尺寸内，就没有这块空白了。默认 6000。填 0 = 关掉，回到「先整张发、发不出去才切片」的老行为。"
  },
  {
    "key": "ocrApiKey",
    "group": "卡片识别",
    "type": "string",
    "default": "",
    "label": "卡片文字识别密钥",
    "secret": true,
    "description": "解析 B站分享卡片用（卡片里没有链接、只有封面图时要靠识别图上的字来找作品）。留空会用一个公共测试密钥，很容易被限流导致识别失败。可以到 ocr.space 免费申请一个填这里。"
  },
  {
    "key": "qqPanelDanmaku",
    "group": "解析面板",
    "type": "boolean",
    "default": false,
    "label": "面板显示「烧录弹幕」列",
    "description": "打开后解析面板会多一列「烧录弹幕」，用户可以选一档带弹幕的解析。在线播放模式下这一列会自动出现，不需要开这个。"
  },
  {
    "key": "qqPanelSourceLink",
    "group": "解析面板",
    "type": "boolean",
    "default": true,
    "label": "面板带「打开原站」链接",
    "description": "面板表格下面挂一个「打开原站」按钮，点它直接去平台看原视频。默认打开。"
  },
  {
    "key": "onebotQualityPanel",
    "group": "解析面板",
    "type": "boolean",
    "default": true,
    "label": "QQ 系：用表情当按钮",
    "description": "**只对 QQ 系协议端生效**（OneBot / NapCat / LLOneBot / Lagrange…），别的平台有没有这个开关都一样的数字列表。QQ 个人号没有官方机器人那种原生按钮，所以拿表情顶：机器人把表情贴到自己那条消息下面，用户点一下就算选中 —— 画质选择、互动视频选项、卡片上的「提取封面图 / 提取评论区图片」、「查询下载进度」都走这一套。关掉就只用数字列表（回序号选择）。注意：**它受通用里「发链接后先问清晰度」管着** —— 那个关掉的话，这里开了也不会去问画质。另外 LLOneBot 会把表情中间的文字吞掉，那种协议端会自动改成「数字列表 + 末尾一排表情 + 从左到右数第几个」的排法。"
  },
  {
    "key": "qqGroupFileLimitMB",
    "group": "视频发送",
    "type": "number",
    "default": 30,
    "min": 0,
    "max": 2000,
    "label": "群文件发送阈值（MB）",
    "description": "视频超过这个体积就改用群文件发送（MB），默认 30。"
  },
  {
    "key": "forceNoDanmaku",
    "group": "通用",
    "renderIn": "app",
    "type": "boolean",
    "default": true,
    "label": "强制不烧录弹幕",
    "description": "优先级最高的总开关。打开时无论指令、面板按钮还是平台配置都不会烧录弹幕，一律按纯视频解析。想用弹幕功能就先把它关掉。"
  },
  {
    "key": "parseDedupe",
    "group": "通用",
    "renderIn": "app",
    "type": "boolean",
    "default": true,
    "label": "短时间不重复解析",
    "description": "同一条链接短时间里被重复发送时，只解析一次，避免刷屏和重复下载。去重键包含会话、作品 ID、画质与弹幕开关 —— 换画质、换作品、换群都不会被误伤；关掉后每条消息都会解析。默认打开。"
  },
  {
    "key": "parseDedupeMinutes",
    "group": "通用",
    "renderIn": "app",
    "type": "number",
    "default": 1,
    "min": 1,
    "max": 60,
    "label": "重复解析间隔（分钟）",
    "description": "上面「短时间不重复解析」的时间窗口，单位分钟，默认 1，可填 1 到 60；只在「短时间不重复解析」打开时才生效。"
  },
  {
    "key": "playerEnabled",
    "group": "通用",
    "renderIn": "app",
    "section": "在线播放器设置",
    "editableWhen": "danmaku",
    "type": "boolean",
    "default": true,
    "label": "在线播放器总开关",
    "description": "在线播放器这一组的总开关：关掉后组内其它设置全部变灰不可改，解析回到原来的「下载后发文件」。打开时视频不下载到群里，而是给一个网页链接在线看，可以带弹幕。默认打开。"
  },
  {
    "key": "playerWatchButton",
    "group": "通用",
    "renderIn": "app",
    "section": "在线播放器设置",
    "type": "boolean",
    "default": true,
    "label": "面板显示「在线看」按钮",
    "description": "解析面板上多一列「在线看」，点它直接给播放链接，不看弹幕开关有没有打开。受上面的「在线播放器总开关」控制：总开关关掉时这一列也不会出现。"
  },
  {
    "key": "playerBaseUrl",
    "group": "通用",
    "renderIn": "app",
    "section": "在线播放器设置",
    "type": "string",
    "default": "",
    "label": "播放器公网地址",
    "description": "播放链接用的域名，例如 https://play.example.com。留空就只能本机或内网访问，群里的人打不开。"
  },
  {
    "key": "playerPort",
    "group": "通用",
    "renderIn": "app",
    "section": "在线播放器设置",
    "type": "number",
    "default": 0,
    "min": 0,
    "max": 65535,
    "label": "播放器端口",
    "description": "播放器单独用的端口，反向代理要转发到这个端口，默认 8888。填 0 或留空就跟着 Koishi 自己的端口走。"
  },
  {
    "key": "playerExpireMinutes",
    "group": "通用",
    "renderIn": "app",
    "section": "在线播放器设置",
    "type": "number",
    "default": 60,
    "min": 1,
    "max": 1440,
    "label": "链接有效期（分钟）",
    "description": "播放链接的有效时间，单位分钟，默认 128（差不多两小时），最多 1440。过期后文件一起清理。"
  },
  {
    "key": "playerMaxFileMB",
    "group": "通用",
    "renderIn": "app",
    "section": "在线播放器设置",
    "type": "number",
    "default": 0,
    "min": 0,
    "max": 102400,
    "label": "在线播放最大文件（MB）",
    "description": "超过这个体积的视频不走在线播放，避免把机器磁盘塞满（MB）。留空或填 0 表示跟随全局的「文件大小限制」。"
  },
  {
    "key": "playerOnOversize",
    "group": "通用",
    "renderIn": "app",
    "section": "在线播放器设置",
    "type": "boolean",
    "default": false,
    "label": "超限转在线播放",
    "description": "视频超过全局大小限制时不再直接拒绝，改成给一条在线播放链接。默认关闭。"
  },
  {
    "key": "forceOnlinePlayer",
    "group": "通用",
    "renderIn": "app",
    "section": "在线播放器设置",
    "type": "string",
    "default": "bilibili",
    "label": "强制在线播放的适配器",
    "description": "填适配器平台名（默认 bilibili，也就是 B站私聊机器人）。从这里进来的消息解析完只给播放链接，不发视频文件。多个用逗号隔开，留空表示不强制。"
  },
  {
    "key": "verifyBaseUrl",
    "group": "通用",
    "renderIn": "app",
    "section": "人机验证设置",
    "type": "string",
    "default": "",
    "label": "验证页公网地址",
    "description": "平台要人机验证时（比如 B站风控）发给用户的验证链接用的域名，例如 https://kkk.example.com。验证页挂在 Koishi 自己的端口上，所以这里要填指向（或反向代理到）Koishi 端口的地址，不是在线播放器那个域名。留空就只能本机或内网打开，群里的人点不开。"
  },
  {
    "key": "errorReportUpload",
    "group": "通用",
    "renderIn": "app",
    "section": "错误上报",
    "type": "boolean",
    "default": true,
    "label": "上传错误信息",
    "description": "出错时自动把错误信息、运行环境和最近的日志上传到收集站，站长在网页上就能查，不用你截图。默认打开。"
  },
  {
    "key": "qualityListPanel",
    "group": "通用",
    "renderIn": "app",
    "type": "boolean",
    "default": true,
    "label": "发链接后先问清晰度（数字列表）",
    "description": "**「要不要问清晰度」的总开关。** 打开后发链接先列一串「1. 1080P · <1MB / 2. 720P · <1MB…」，**回复序号**选一档（引用这条消息回复也行），所有平台都能用 —— Telegram / Discord / 微信 / Milky 这些没有按钮的平台以前只能按配置里的默认画质直接解析，用户根本没得选。QQ 系（OneBot / NapCat / LLOneBot…）另外还有「用表情当按钮」那个开关：它开着时优先用表情按钮，这个数字列表自动退成「点不动表情时的退路」。⚠️ **关掉这个就是「别问了」**：不管表情那个开关怎么设，都按配置里的默认画质直接解析。"
  },
  {
    "key": "qualityPanelTimeoutSec",
    "group": "通用",
    "renderIn": "app",
    "type": "number",
    "default": 60,
    "min": 10,
    "max": 600,
    "label": "问清晰度等多久（秒）",
    "description": "列完清晰度之后，等这么久还没人选就**不再等了** —— 撤回那条列表、按配置里的默认画质直接解析发视频，不会把这条链接晾在那儿。默认 60 秒，可选 10 ~ 600 秒。"
  },
  {
    "key": "errorNoCard",
    "group": "通用",
    "renderIn": "app",
    "section": "错误上报",
    "type": "boolean",
    "default": false,
    "label": "出错只发文字（不渲染错误卡片）",
    "description": "出错时不渲染错误卡片，只在群里发一行文字：错误信息已上传，ID：xxx。上传照旧。默认关闭。"
  }
]
