469 lines
15 KiB
JSON
469 lines
15 KiB
JSON
{
|
||
"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 目录中的纯享切片视频。"
|
||
}
|
||
}
|
||
}
|
||
}
|