Files
biliup-next/config/settings.schema.json

519 lines
16 KiB
JSON
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"version": 1,
"title": "biliup-next settings schema",
"group_ui": {
"runtime": { "title": "Runtime", "order": 10, "description": "控制面本身的日志、认证和数据库设置。" },
"paths": { "title": "Paths", "order": 20, "description": "隔离 workspace 与外部依赖文件路径。" },
"scheduler": { "title": "Scheduler", "order": 30, "description": "每轮扫描多少任务、按什么顺序推进。" },
"ingest": { "title": "Ingest", "order": 40, "description": "视频进入 stage 后的入口规则。" },
"transcribe": { "title": "Transcribe", "order": 50, "description": "字幕转录与音频切分相关参数。" },
"song_detect": { "title": "Song Detect", "order": 60, "description": "歌曲识别 provider 与轮询间隔。" },
"split": { "title": "Split", "order": 70, "description": "切歌输出与 FFmpeg 行为。" },
"publish": { "title": "Publish", "order": 80, "description": "上传器、cookies 与重试策略。" },
"comment": { "title": "Comment", "order": 90, "description": "置顶评论开关与重试时序。" },
"collection": { "title": "Collection", "order": 100, "description": "合集绑定、模糊匹配与排序策略。" },
"cleanup": { "title": "Cleanup", "order": 110, "description": "任务完成后清理原视频和切片视频以节省空间。" }
},
"groups": {
"runtime": {
"database_path": {
"type": "string",
"default": "data/workspace/biliup_next.db",
"title": "Database Path",
"ui_order": 20,
"ui_widget": "path",
"description": "SQLite database path relative to biliup-next root"
},
"control_token": {
"type": "string",
"default": "",
"title": "Control Token",
"ui_order": 10,
"ui_featured": true,
"ui_widget": "secret",
"ui_placeholder": "留空则关闭控制面认证",
"description": "Optional API/dashboard auth token",
"sensitive": true
},
"log_level": {
"type": "string",
"default": "INFO",
"title": "Log Level",
"ui_order": 30,
"enum": ["DEBUG", "INFO", "WARNING", "ERROR"]
}
},
"paths": {
"stage_dir": {
"type": "string",
"default": "data/workspace/stage",
"title": "Stage Directory",
"ui_order": 10,
"ui_widget": "path"
},
"backup_dir": {
"type": "string",
"default": "data/workspace/backup",
"title": "Backup Directory",
"ui_order": 20,
"ui_widget": "path"
},
"session_dir": {
"type": "string",
"default": "data/workspace/session",
"title": "Session Directory",
"ui_order": 30,
"ui_widget": "path"
},
"cookies_file": {
"type": "string",
"default": "runtime/cookies.json",
"title": "Cookies File",
"ui_order": 40,
"ui_widget": "path"
},
"upload_config_file": {
"type": "string",
"default": "runtime/upload_config.json",
"title": "Upload Config File",
"ui_order": 50,
"ui_widget": "path"
}
},
"scheduler": {
"candidate_scan_limit": {
"type": "integer",
"default": 500,
"title": "Candidate Scan Limit",
"ui_order": 10,
"minimum": 1,
"description": "每轮调度预览时,最多读取多少个任务作为候选。"
},
"max_tasks_per_cycle": {
"type": "integer",
"default": 50,
"title": "Max Tasks Per Cycle",
"ui_order": 20,
"ui_featured": true,
"minimum": 1,
"description": "单轮 worker 最多实际推进多少个任务。"
},
"prioritize_retry_due": {
"type": "boolean",
"default": true,
"title": "Prioritize Retry Due",
"ui_order": 30,
"ui_featured": true,
"description": "将已到达重试时间的任务排在普通 ready 任务前面。"
},
"oldest_first": {
"type": "boolean",
"default": true,
"title": "Oldest First",
"ui_order": 40,
"description": "同优先级下是否优先处理较早更新的任务。"
},
"status_priority": {
"type": "array",
"default": ["failed_retryable", "created", "transcribed", "songs_detected", "split_done", "published", "commented", "collection_synced"],
"title": "Status Priority",
"ui_order": 50,
"description": "调度排序时使用的状态优先级列表。越靠前优先级越高。"
}
},
"ingest": {
"provider": {
"type": "string",
"default": "local_file",
"title": "Provider",
"ui_order": 30
},
"min_duration_seconds": {
"type": "integer",
"default": 900,
"title": "Min Duration Seconds",
"ui_order": 10,
"ui_featured": true,
"ui_widget": "duration_seconds",
"description": "低于该时长的视频会直接进入 backup不进入后续流程。",
"minimum": 0
},
"ffprobe_bin": {
"type": "string",
"default": "ffprobe",
"title": "FFprobe Bin",
"ui_order": 20,
"ui_widget": "command"
},
"yt_dlp_cmd": {
"type": "string",
"default": "yt-dlp",
"title": "yt-dlp Command",
"ui_order": 25,
"ui_widget": "command",
"description": "当 ingest.provider 选择 bilibili_url 时,用于下载 B 站视频的 yt-dlp 命令或绝对路径。"
},
"yt_dlp_format": {
"type": "string",
"default": "",
"title": "yt-dlp Format",
"ui_order": 26,
"description": "可选的 yt-dlp -f 参数。留空表示使用默认画质;测试时可设为 worst[ext=mp4]/worst。"
},
"allowed_extensions": {
"type": "array",
"default": [".mp4", ".flv", ".mkv", ".mov"],
"title": "Allowed Extensions",
"ui_order": 40
},
"stage_min_free_space_mb": {
"type": "integer",
"default": 2048,
"title": "Stage Min Free Space MB",
"ui_order": 50,
"ui_featured": true,
"ui_widget": "storage_mb",
"description": "导入或上传到 stage 前要求保留的最小剩余空间。导入本地文件时还会额外加上源文件大小。",
"minimum": 0
},
"stability_wait_seconds": {
"type": "integer",
"default": 30,
"title": "Stage Stability Wait Seconds",
"ui_order": 60,
"ui_featured": true,
"ui_widget": "duration_seconds",
"description": "扫描 stage 时,文件最后修改后至少静默这么久才会开始处理。用于避免手动 copy 半截文件被提前接走。",
"minimum": 0
},
"session_gap_minutes": {
"type": "integer",
"default": 60,
"title": "Session Gap Minutes",
"ui_order": 70,
"ui_featured": true,
"ui_widget": "duration_minutes",
"description": "当没有显式 session_key 时,同一主播前后片段的最大归并间隔。系统会用上一段结束时间和下一段开始时间做连续性判断。",
"minimum": 0
},
"meta_sidecar_enabled": {
"type": "boolean",
"default": true,
"title": "Meta Sidecar Enabled",
"ui_order": 80,
"description": "是否读取 stage 中与视频同名的 sidecar 元数据文件,例如 .meta.json。"
},
"meta_sidecar_suffix": {
"type": "string",
"default": ".meta.json",
"title": "Meta Sidecar Suffix",
"ui_order": 90,
"description": "stage sidecar 元数据文件后缀。默认会读取 video.mp4 对应的 video.meta.json。"
}
},
"transcribe": {
"provider": {
"type": "string",
"default": "groq",
"title": "Provider",
"ui_order": 20
},
"groq_api_key": {
"type": "string",
"default": "",
"title": "Groq API Key",
"ui_order": 10,
"ui_featured": true,
"ui_widget": "secret",
"ui_placeholder": "gsk_...",
"description": "用于调用 Groq 转录 API。",
"sensitive": true
},
"ffmpeg_bin": {
"type": "string",
"default": "ffmpeg",
"title": "FFmpeg Bin",
"ui_order": 30,
"ui_widget": "command"
},
"max_file_size_mb": {
"type": "integer",
"default": 23,
"title": "Max File Size MB",
"ui_order": 40,
"minimum": 1
}
},
"song_detect": {
"provider": {
"type": "string",
"default": "codex",
"title": "Provider",
"ui_order": 20
},
"codex_cmd": {
"type": "string",
"default": "codex",
"title": "Codex Command",
"ui_order": 10,
"ui_featured": true,
"ui_widget": "command",
"description": "歌曲识别时实际执行的 codex 命令或绝对路径。"
},
"qwen_cmd": {
"type": "string",
"default": "qwen",
"title": "Qwen Command",
"ui_order": 15,
"ui_featured": true,
"ui_widget": "command",
"description": "歌曲识别 provider 选择 qwen_cli 时,实际执行的 qwen 命令或绝对路径。"
},
"poll_interval_seconds": {
"type": "integer",
"default": 2,
"title": "Poll Interval Seconds",
"ui_order": 30,
"minimum": 1
}
},
"split": {
"provider": {
"type": "string",
"default": "ffmpeg_copy",
"title": "Provider",
"ui_order": 20
},
"ffmpeg_bin": {
"type": "string",
"default": "ffmpeg",
"title": "FFmpeg Bin",
"ui_order": 10,
"ui_widget": "command"
},
"poll_interval_seconds": {
"type": "integer",
"default": 2,
"title": "Poll Interval Seconds",
"ui_order": 30,
"minimum": 1
},
"min_free_space_mb": {
"type": "integer",
"default": 2048,
"title": "Split Min Free Space MB",
"ui_order": 40,
"ui_featured": true,
"ui_widget": "storage_mb",
"description": "开始切歌前要求额外保留的最小剩余空间。实际检查值为该配置加源视频大小。",
"minimum": 0
}
},
"publish": {
"provider": {
"type": "string",
"default": "biliup_cli",
"title": "Provider",
"ui_order": 30
},
"biliup_path": {
"type": "string",
"default": "runtime/biliup",
"title": "Biliup Path",
"ui_order": 20,
"ui_widget": "path"
},
"cookie_file": {
"type": "string",
"default": "runtime/cookies.json",
"title": "Cookie File",
"ui_order": 40,
"ui_widget": "path"
},
"retry_count": {
"type": "integer",
"default": 5,
"title": "Retry Count",
"ui_order": 10,
"ui_featured": true,
"description": "上传失败后的最大重试次数。默认与重试时间表长度保持一致。",
"minimum": 0
},
"retry_schedule_minutes": {
"type": "array",
"default": [15, 5, 5, 5, 5],
"title": "Retry Schedule Minutes",
"ui_order": 15,
"ui_featured": true,
"ui_widget": "array",
"description": "按分钟定义每次上传重试的等待时间。默认第 1 次重试等待 15 分钟,第 2-5 次各等待 5 分钟。",
"items": {
"type": "integer",
"minimum": 0
}
},
"retry_backoff_seconds": {
"type": "integer",
"default": 300,
"title": "Retry Backoff Seconds",
"ui_order": 50,
"ui_featured": true,
"ui_widget": "duration_seconds",
"description": "旧版统一回退秒数。仅在未配置重试时间表时作为兼容兜底。",
"minimum": 0
},
"command_timeout_seconds": {
"type": "integer",
"default": 1800,
"title": "Command Timeout Seconds",
"ui_order": 60,
"ui_featured": true,
"ui_widget": "duration_seconds",
"description": "单次 biliup renew/upload/append 命令的超时时间。超时会写入 publish.log 并返回失败。",
"minimum": 1
},
"rate_limit_retry_schedule_minutes": {
"type": "array",
"default": [
30,
60,
120
],
"title": "Rate Limit Retry Schedule Minutes",
"ui_order": 70,
"ui_featured": true,
"description": "上传命中 B站 601 限流时,按分钟定义专用重试等待时间。",
"items": {
"type": "integer",
"minimum": 0
}
}
},
"comment": {
"provider": {
"type": "string",
"default": "bilibili_top_comment",
"title": "Provider",
"ui_order": 20
},
"enabled": {
"type": "boolean",
"default": true,
"title": "Enabled",
"ui_order": 10
},
"max_retries": {
"type": "integer",
"default": 5,
"title": "Max Retries",
"ui_order": 30,
"minimum": 0
},
"base_delay_seconds": {
"type": "integer",
"default": 180,
"title": "Base Delay Seconds",
"ui_order": 40,
"minimum": 0
},
"poll_interval_seconds": {
"type": "integer",
"default": 10,
"title": "Poll Interval Seconds",
"ui_order": 50,
"minimum": 1
},
"post_split_comment": {
"type": "boolean",
"default": true,
"title": "Post Split Comment",
"ui_order": 60,
"ui_featured": true,
"description": "是否在纯享版分P视频下发布置顶歌单评论。纯享版评论默认不带时间轴。"
},
"post_full_video_timeline_comment": {
"type": "boolean",
"default": true,
"title": "Post Full Video Timeline Comment",
"ui_order": 70,
"ui_featured": true,
"description": "是否尝试在完整版主视频下发布带时间轴的置顶评论。找不到完整版 BV 时会跳过。"
}
},
"collection": {
"provider": {
"type": "string",
"default": "bilibili_collection",
"title": "Provider",
"ui_order": 30
},
"enabled": {
"type": "boolean",
"default": true,
"title": "Enabled",
"ui_order": 20
},
"season_id_a": {
"type": "integer",
"default": 7196643,
"title": "Season ID A",
"ui_order": 10,
"ui_featured": true,
"ui_widget": "season_id",
"description": "完整版合集 ID。",
"minimum": 0
},
"season_id_b": {
"type": "integer",
"default": 7196624,
"title": "Season ID B",
"ui_order": 11,
"ui_featured": true,
"ui_widget": "season_id",
"description": "纯享版合集 ID。",
"minimum": 0
},
"allow_fuzzy_full_video_match": {
"type": "boolean",
"default": false,
"title": "Allow Fuzzy Full Video Match",
"ui_order": 40
},
"append_collection_a_new_to_end": {
"type": "boolean",
"default": true,
"title": "Append Collection A New To End",
"ui_order": 50,
"ui_featured": true,
"description": "新加入的完整版视频是否追加到合集末尾。"
},
"append_collection_b_new_to_end": {
"type": "boolean",
"default": true,
"title": "Append Collection B New To End",
"ui_order": 60,
"ui_featured": true,
"description": "新加入的纯享版视频是否追加到合集末尾。"
}
},
"cleanup": {
"delete_source_video_after_collection_synced": {
"type": "boolean",
"default": false,
"title": "Delete Source Video After Collection Synced",
"ui_order": 10,
"ui_featured": true,
"description": "任务完成并写入合集后,是否删除 session 目录中的原始完整视频。"
},
"delete_split_videos_after_collection_synced": {
"type": "boolean",
"default": false,
"title": "Delete Split Videos After Collection Synced",
"ui_order": 20,
"ui_featured": true,
"description": "任务完成并写入合集后,是否删除 split_video 目录中的纯享切片视频。"
}
}
}
}