Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ FFMPEG_TIMEOUT=600
# 如果以后要换存储盘,可以同步修改 docker-compose.yml 里的 volumes 和这里的路径。
STORAGE_ROOT=E:\直播间切片工作流存储
TASKS_DIR=E:\直播间切片工作流存储
# 浏览器上传超过 1MB 时使用的临时目录;必须放在大容量存储盘。
UPLOAD_TEMP_DIR=E:\直播间切片工作流存储\_临时上传

AI_DEFAULT_PROVIDER=remote
AI_REQUEST_TIMEOUT_SECONDS=120
Expand Down Expand Up @@ -61,14 +63,14 @@ AI_LOCAL_HEALTH_TIMEOUT_SECONDS=30
OPENCLI_LOCAL_BASE_URL=http://127.0.0.1:8001
OPENCLI_HOST_BRIDGE_URL=http://host.docker.internal:8765

# v1.5.0 统一排期与 Windows Chrome 发布 Worker
# v2.0.0 统一排期与 Windows Chrome 发布 Worker
APP_TIMEZONE=Asia/Shanghai
PUBLISH_SCHEDULER_ENABLED=true
PUBLISH_SCHEDULER_INTERVAL_SECONDS=5
PUBLISH_DEFAULT_MODE=local_browser
PUBLISH_JOB_STALE_MINUTES=30
PUBLISH_SCHEDULER_MAX_RETRY_COUNT=3
PUBLISH_SCHEDULER_EXPORT_DIR=
PUBLISH_SCHEDULER_EXPORT_DIR=E:\直播间切片工作流存储\_发布包
PUBLISH_SCHEDULER_ALLOW_PUBLISH_WITHOUT_REVIEW=false
PUBLISH_ENABLE_OPENCLI_FALLBACK=false
# 请使用随机长字符串;start_publish_worker.ps1 会在本地 .env 缺失时自动生成。
Expand Down
14 changes: 8 additions & 6 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@
- 项目英文名:NiuMa Studio
- 项目中文说明:牛马片场,本地 AI 高光生产后台
- 项目目录:`C:\Users\10578\Documents\New project 2`
- 当前版本:1.5.0
- 当前状态:Windows 本地后台处理链路与抖音/B站统一真实发布架构已实现;真实投稿仍遵守账号登录、平台验证、风控和人工确认边界
- 当前版本:2.0.0
- 当前状态:Windows 本地 AI 高光生产闭环已完成整合,素材、转写、AI 选片、审核、切片、内容准备、排期与抖音/B站统一真实发布链路已打通;真实投稿仍遵守账号登录、平台验证、风控和人工确认边界

## 协作方式

Expand All @@ -27,7 +27,7 @@
- AI 分析:预留 OpenAI-compatible API 或本地大模型接口
- 语音转写:预留服务接口

## 当前 1.5.0 范围
## 当前 2.0.0 范围

- 新建视频处理任务,支持直播录像、综艺访谈和其他长视频素材。
- 上传本地视频或选择 NAS / 本地目录中的已有视频。
Expand All @@ -37,12 +37,14 @@
- 生成逐句时间戳原文,供 AI 分析、字幕和片段审核复用。
- AI 分析候选短视频片段,支持远程 OpenAI-compatible / DeepSeek 和本地 Ollama。
- 后台查看并编辑候选片段。
- 自动切割视频并输出短视频文件。
- 保存审核选择后按需自动生成最新切片,并安全同步到发送中心。
- 自动切割视频并输出短视频文件;全自动任务详情每 3 秒局部更新状态、进度、日志和可用操作。
- 保留字幕工作台,但全自动流程继续跳过字幕生成、烧录和叠加。
- 发送中心分为内容准备、排期计划和执行记录,生成标题、简介、话题和候选封面帧。
- 发送中心分为内容准备、排期计划和执行记录,生成标题、简介、话题和候选封面帧;支持任务分组、已排期标记、月历日期详情、跨午夜窗口和续接当前平台最晚排期
- 立即发送与定时发送统一使用 SQLite Scheduler、Publisher Registry 和 Windows Chrome Worker。
- 抖音与 B站使用各自 Publisher;`manual_export` 仅显式导出本地发布包,`opencli` 仅作默认关闭的兼容模式。
- 展示任务状态、处理进度和异常信息。
- 统一使用 E 盘任务存储、临时上传目录和发布包目录;永久删除只清理项目托管产物,不删除外部唯一原片。
- 展示任务状态、处理进度和异常信息,失败步骤可重试,发布结果不确定时进入人工复核。

## 当前不做

Expand Down
62 changes: 62 additions & 0 deletions DEVELOPMENT_LOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,49 @@
# Development Log

## 2026-08-03 v2.0.0 主分支收拢与文档定版

- 将当前工作分支相对 `master` 的素材存储、自动流水线、审核切片、发送中心、排期和真实发布成果统一作为 v2.0 本地生产闭环,不改变 FastAPI + SQLite + Windows Worker 的现有架构。
- 项目版本、FastAPI API、Windows 发布 Worker 和界面侧栏统一更新为 `2.0.0` / `v2.0`;全自动流程结束提示同步改为当前发送中心与排期语义。
- `README.md` 增加项目现状表、完整主流程、功能清单、运行形态和人工边界;明确“发布架构已实现”不等于“所有账号和平台页面已完成无人值守验证”。
- 新手指南、架构、状态流、部署和路线图同步说明 E 盘存储、两类 AI 选片、任务实时进度、片段审核同步、排期月历、Windows Chrome Worker、发布终态与后续真实灰度重点。
- 保留所有历史版本开发记录和既有验收说明;v2.0 后续仍优先做抖音 / B站单条真实灰度、长时间运行和数据备份验收,不扩大到多用户、云端 SaaS 或绕过平台验证。
- 发布前验证已完成:Python 编译、Ruff、`app.js` / `publish-center.js` 语法和 Git 空白检查全部通过,完整自动化测试 `407 passed`;仅保留 9 条既有依赖弃用提醒,测试未连接真实平台或触发投稿。

## 2026-08-03 发送中心排期日历展开与时间升序

- “排期计划”月历中的有任务日期现在可点击或使用键盘 Enter / 空格打开,在月历下方完整展示当天当前平台的全部排期,并明确显示日期、平台和任务数量。
- 当天详情按北京时间从早到晚展示时间、标题、账号与状态;点击任意一条只会滚动并高亮下方原任务,不复制操作按钮、不修改排期,也不触发投稿。
- 月历前两条预览与下方任务清单统一按 `scheduled_at` 升序;已排期任务在前,未排期任务在后且保持原有内部顺序。应用、调整、清除或取消排期后会原地重排,无需刷新页面。
- 切换平台或月份会关闭旧日期详情;选中日期已无排期时也会自动关闭。抖音和 B站继续严格隔离,日期仍按 `Asia/Shanghai` 北京时间计算。
- 未新增 API、数据库字段或迁移,未修改调度和真实发布边界;新增浏览器回归覆盖完整日期展开、稳定排序、键盘访问、定位高亮、动态取消排期和窄屏无横向溢出。
- 本机真实页面已只读验收:8 月 3 日完整显示 `08:00 → 11:00 → 14:00 → 17:00 → 20:00 → 23:00`,主清单继续衔接到 8 月 4 日;控制台无错误,未修改排期或触发投稿。专项测试 `37 passed`、完整测试 `407 passed`,Ruff、JavaScript 语法和 Git 空白检查均通过,仅保留 9 条现有依赖弃用警告。

## 2026-08-02 发送中心续接最晚排期

- “设置排期”抽屉新增“接在当前平台最晚排期后”:每次点击都实时读取 SQLite,不依赖页面中最多 200 条的缓存列表;抖音和 B站分别计算。
- 新增 `POST /api/publish/schedules/next-start`。接口只查当前平台仍有效且带未来时间的 `WAITING / SCHEDULED / PUBLISHING` 记录,并排除本次正在调整的已选任务;已发布、失败、取消和另一平台记录不会占用本平台时间线。
- 续排严格使用当前间隔,并复用跨午夜时段规则:19:00 加 3 小时为 22:00,21:00 加 3 小时为次日 00:00,22:00 加 3 小时超出窗口后顺延到次日 07:00。
- 发送中心和全自动任务的新默认每日窗口统一为 `07:00 → 00:00`,仍可逐次修改;已有任务配置、已有排期和数据库结构均未改变。
- 修复全自动 `daily_window` 对跨午夜窗口的旧循环判断,改为复用统一的允许时段计算,不会在 `07:00 → 00:00` 下反复滚动日期。
- 新增服务层、API、默认值、平台隔离、选中任务排除、无排期、跨午夜、自动流程及浏览器回填测试;相关测试共 `49 passed`,完整测试 `397 passed`,Ruff、Python/JavaScript 语法和 Git 空白检查均通过,测试未触发真实投稿。

## 2026-08-02 片段审核同步发送中心修复

- 根因确认:片段审核页勾选“启用”后,旧“同步发送中心”只读取已经完成的激活切片;当候选片段已启用但尚未出现在当前切片批次中时,请求会返回“新增 0 条”,发送中心仍只能看到旧版本。
- “生成切片”现在会先保存页面里的启用状态、标题、摘要和出入点,再开始切割,避免页面选择尚未落库时继续使用旧审核结果。
- 片段审核页新增“保存并同步发送中心”完整流程:先保存审核选择,再核对当前启用候选与激活成片;选择或内容有变化、文件缺失、成片数量不一致时自动生成安全新版本并同步,完全一致时只做幂等同步,不重复切片。
- 同步成功后自动进入 `/publish?task_id=...&tab=content`,展开并定位当前原始处理任务;旧版待准备/已排期记录仍按现有版本规则安全转入历史,不删除视频、文案或执行证据。
- 真实任务 `6753ce9f3bfd` 已完成页面回归:3 条候选均启用、修复前只有 2 条成片和 2 条发送内容;修复后新增 3 条最新发送内容、2 条旧版安全转入历史、失败 0 条,目标“大田怕鸟怕到连杂志图都怕,小S补刀跳海”已出现在抖音内容准备列表,未排期且未触发真实投稿。
- 新增审核同步服务和路由回归测试。完整自动化测试 `383 passed`,Ruff 与 JavaScript 语法检查通过;仅保留 8 条现有依赖弃用警告。

## 2026-08-02 内容准备已排期标记优化

- 发送中心“内容准备”中的 `SCHEDULED` 卡片新增蓝色“已排期 + 北京时间”标签,并使用轻蓝渐变底色、蓝色边框、左侧强调线和轻阴影,让已经安排过的任务无需切换页签即可辨认。
- 已排期卡片底部操作由“加入发布计划”改为“调整排期”;未排期卡片继续保持原白色样式与原按钮文案。
- 标记直接复用发布任务现有状态和排期时间,不新增数据库字段,不修改历史数据;新增排期、清除排期或取消发送后,标签、卡片颜色和按钮文案会在当前页面原地同步。
- 新增模板首屏渲染与前端原地更新回归测试。完整测试 `383 passed`,Ruff、JavaScript 语法、Git 空白检查和浏览器控制台错误检查均通过;仅有 8 条现有依赖弃用提醒。
- 本机 `127.0.0.1:8001/publish` 已按约 1500×1100 桌面视口验收:“姜母鸭汤酒味重到小S喝懵了”显示“已排期 2026-08-02 13:00”,普通未排期卡片保持原样;验收未修改排期、账号或平台数据,也未触发真实投稿。

## 2026-08-02 发送中心封面计数平台隔离修复

- 根因确认:发送中心当前停留在抖音时,封面按钮仍统计了页面中隐藏的 B站任务;现场数据库中的 8 条空封面路径全部属于 B站,抖音当前缺失数实际为 0。
Expand Down Expand Up @@ -902,3 +946,21 @@
- “移出内容准备”仍是用户主动隐藏记录,“跳过任务”仍是终止当前任务;二者继续使用 `CANCELLED`,不会被普通取消逻辑误恢复。
- 兼容历史数据:数据库初始化时,只把旧版错误标记为“用户取消任务”的最后一条记录安全恢复到 `WAITING`;若同一切片和平台已经有活跃替代任务,则不会制造重复任务。
- 新增状态机、历史数据恢复和浏览器交互回归测试;专项测试 `19 passed`、完整测试 `336 passed`,Python 编译、两个 JavaScript 文件语法检查、Ruff 和差异检查均通过。

## 2026-08-02 E 盘统一视频存储与任务永久删除

- 新增 `UPLOAD_TEMP_DIR`,并在应用启动时把当前进程的 `TEMP`、`TMP` 和 Python 临时目录指向 E 盘;大于 1 MB 的浏览器上传不再先写入 C 盘系统临时目录。
- 手动发布包默认目录从项目 `outputs/publish_packages` 调整到 `E:\直播间切片工作流存储\_发布包`;任务原片、音频、切片、字幕和封面继续统一使用 `TASKS_DIR`。
- 任务列表“移入回收站”改为“永久删除”:只删除系统托管目录,外部 NAS / E 盘原片保留,数据库历史隐藏保留;运行中的处理和发布任务禁止删除。
- 新增 `scripts/purge_deleted_task_media.py`,默认只预览;`--apply` 会先创建 SQLite 元数据备份,再清理已隐藏任务的 E 盘目录、发布包和精确匹配的旧版 C 盘任务目录。
- 新增大文件 multipart 临时目录、失败上传回滚、外部原片保护、路径越界、运行中拦截、删除失败回滚、幂等删除和旧任务清理测试。
- 已对真实数据先预演再执行清理:15 条已隐藏任务共删除 16 个托管目录,释放 `6,213,311,934` 字节(约 6.21 GB);4 条有效任务目录清理前后均完整,外部测试原片保留,清理后再次预演为 0 个残留目录。
- 清理前 SQLite 元数据备份完整性检查为 `ok`;最终完整测试 `395 passed`,Python 编译、Ruff、JavaScript 语法和差异检查均通过。

## 2026-08-02 任务详情进度局部自动刷新

- 新增 `GET /api/tasks/{task_id}/live-status` 轻量接口,统一返回任务状态、进度、10 步时间线、日志、候选/输出数量和可用操作,不执行 FFprobe。
- 全自动任务详情页打开后立即读取一次状态,处理中每 3 秒局部更新状态卡、顶部状态、基础计数和右侧运行日志;页面切回前台时会立即补一次更新。
- 完成或失败后停止轮询,并原地显示发送中心、片段检查、重试或继续入口;重试/继续全自动流程也不再触发整页刷新。
- 网络短暂异常时保留当前页面数据并继续重试,不会清空用户正在编辑的 AI Prompt 或改变滚动位置。
- 新增处理中、失败、完成、404 和前端无整页刷新测试;专项测试 `21 passed`、完整测试 `407 passed`,JavaScript 与 Python 语法检查通过。浏览器实测从 AI 分析中切换到失败状态时,状态卡、日志和重试按钮在 3 秒内更新,未保存输入保持不变。
Loading
Loading