{ "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" }, "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 命令或绝对路径。" }, "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 } }, "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 目录中的纯享切片视频。" } } } }