1.0 MiB
PROGRESS — 工作留痕(FruitServer)
红线第 2 条:谁干活谁写这里(命令 + 原始输出 + 解读,逐动作追加)。 指令通道:
docs/plans/INBOX.md(specs 仓库只拉取、由项目负责人更新)。
2026-10-16 I1:后台管理端 —— 商品(金币包)配置 + 系统公告管理
计划文件:docs/plans/2026-10-16-I1.md(先写计划再动手)。改了 docs/api-phase1.md §2.11/§2.12(契约先行)。
动作 1:开工前核对仓库状态
$ cd FruitServer && git status --short && git log --oneline -1
M docs/api-phase1.md
M fruitshorts-admin-api/.../FruitShortsApplication.java
M fruitshorts-app-api/.../AppNoticeService.java
M sql/data-phase1.sql
?? docs/plans/2026-10-16-I1.md
?? fruitshorts-admin-api/.../ProductAdminController.java(+ NoticeAdminController)
?? fruitshorts-admin-api/src/test/.../ProductAdminControllerContractTest.java(+ Notice / AdminPermissionAnnotation)
?? fruitshorts-module-commerce/.../ProductService.java(+ 3 个 VO)
?? fruitshorts-module-system/.../OpsNoticeService.java(+ 3 个 VO)
7513ac0 docs(plans): 指令通道迁入本仓库(specs 改为只拉取,由项目负责人更新)
解读:分支 develop,起点就是指令通道那笔 7513ac0;工作区只有本轮 I1 的改动。
动作 2:契约先行(先改文档再写代码)
docs/api-phase1.md 新增 §2.11 商品(金币包)配置(已实现)、§2.12 系统公告管理(已实现):
接口表 + 字段表 + 校验错误码表 + 权限点 + 与 C 端可见性口径对齐说明。VIP 口径在契约里定死:
允许建档、不允许启用。
动作 3:后端门禁 —— mvn test
首轮(雪花 id 修复前):
$ mvn test
[INFO] Tests run: 33, Failures: 0, Errors: 0, Skipped: 0 (fruitshorts-module-commerce)
[INFO] Tests run: 14, Failures: 0, Errors: 0, Skipped: 0 (fruitshorts-admin-api)
[INFO] Tests run: 49, Failures: 0, Errors: 0, Skipped: 0 (fruitshorts-app-api)
[INFO] Tests run: 12, Failures: 0, Errors: 0, Skipped: 0 (fruitshorts-transcode-worker)
[INFO] BUILD SUCCESS
解读:存量 91 条(app-api 41 + commerce 27 + admin-api 3 + worker 12 + …)无一跑红,新增 17 条全过,共 108。
动作 4:SQL 幂等(连跑三遍)
$ psql -f sql/data-phase1.sql # 第一次
INSERT 0 5 / UPDATE 5 / INSERT 0 4 / INSERT 0 4 / INSERT 0 3 / INSERT 0 3
$ psql -f sql/data-phase1.sql # 第二次
INSERT 0 5 / UPDATE 5 / INSERT 0 0 / INSERT 0 0 / INSERT 0 3 / INSERT 0 0
$ psql -t -c "select 'role_menu='||count(*) from sys_role_menu union all ..." # 跑前
role_menu=54 / permission=52 / menu=33 / role_perm=79
$ psql -f sql/data-phase1.sql # 第三次
RUN3 EXIT=0
role_menu=54 / permission=52 / menu=33 / role_perm=79 # 跑后:完全一致
解读:脚本可重复执行,行数不增长、不重复插入。新增权限点 1160-1163、菜单 31/32/33(商品挂 22「订单与权益」下、公告新建 32「运营管理」分组 + 33 子菜单),并给超管授了角色-菜单。
动作 5:打包 + 起回服务 + curl 自测(商品)
$ mvn -pl fruitshorts-app-api,fruitshorts-admin-api -am package -DskipTests → BUILD SUCCESS
(kill 8080/8081 → 重新起 jar → 健康检查)
admin=200 / app=200
商品自测(完整脚本 /tmp/i1-curl.sh,原始输出 /tmp/i1-curl.log):
3) 新建商品 i1_test_coin_100(800+80,IDR 9900,platform=GOOGLE)
{"code":0,"message":"ok","data":2111010131922784257}
4) 新建后状态 → "status": 0, "statusText": "已下架" # 新建默认下架
5) code 重复 → {"code":200001,"message":"商品编码已存在:i1_test_coin_100"}
6) 同平台 store id 重复 → {"code":200001,"message":"该平台下商店商品 id 已被占用:I1_TEST_COIN_100"}
7) 金币包 coin_amount=0 → {"code":400,"message":"金币包的金币数量必须大于 0"}
8) VIP vip_days=0 → {"code":400,"message":"会员商品的会员天数必须大于 0"}
9) VIP vip_days=30 → {"code":0} # 允许建档
10) VIP 启用 → {"code":400,"message":"会员商品在订阅功能上线前不能启用(可先建档,上线后再上下架)"}
11) 上架 → {"code":0},详情 status=1/已上架
12) C 端等价查询(store_product_id + platform in (GOOGLE,ALL) + status=1)
2111010131922784257 | i1_test_coin_100 | GOOGLE | I1_TEST_COIN_100 | 800 | 80 | 1 (1 row)
公告自测(同一脚本,13–18 步):
13) 公告分页(新建前)→ total 0
14) 新建 target=ALL → {"code":0,"data":2111010133357236226}
15) 新建 target=CREATOR → {"code":0,"data":2111010133537591298}
16) 新建 expire_at=2020-01-01(已过期) → {"code":0}
17) C 端 GET /app/notices(匿名)→ total 1,只返回第 14 步那条
18) 后台下架第 14 步那条 → C 端 total 0
越权自测(content.editor01 / role=content_operator,无 product:* / notice:*):
GET /admin/products/page → {"code":403,"message":"无权限"}
GET /admin/notices/page → {"code":403,"message":"无权限"}
POST /admin/products → {"code":403,"message":"无权限"}
PUT /admin/notices/1/status → {"code":403,"message":"无权限"}
(无 token)GET /admin/products/page → {"code":401,"message":"未登录或登录已过期"}
解读:商品三类校验、VIP 只建不启、公告"C 端可见/不可见"三个分支、越权 401/403 全部实测通过。
logs 里 200002 该商品未在后台配置 的触发点在商店校验之后(/app/orders/verify 当前默认
DisabledStoreVerifier → 先返回 200003 商店校验尚未配置),所以 C 端链路验证到"进入商店校验环节"为止,
真正的发币链路等 Google Play 凭据到位(见回执「待确认」)。
动作 6:清理第一轮自测数据
DELETE 3 # 3 个自测商品
DELETE 4 # 4 条自测公告
products | soft_deleted notices
3 | 0 0
动作 7:前端页面(ReelShortWeb,develop 分支)
新增 4 个文件(首行署名 // Author: fruit.com.cn / <!-- Author: fruit.com.cn -->):
src/api/admin/product.ts src/api/admin/notice.ts
src/views/commerce/ProductManagementView.vue src/views/operation/NoticeManagementView.vue
挂载机制实测(与 INBOX 描述有出入,以实测为准):菜单树来自 DB sys_menu,
src/utils/routerHelper.ts 用 import.meta.glob('../views/**/*.{vue,tsx}') 按 component 字符串动态解析;
src/router/index.ts 的 asyncRouterMap 只静态声明 dashboard/content/user/system 这几个早期分组,
commerce/governance/board/creator-center 都不在里面 —— 所以新增页面不需要改静态路由表,
只要 ① 建 .vue ② 菜单 component 与视图路径一致。本轮据此实现,未动 src/router/index.ts。
前端门禁:
$ pnpm ts:check → 0 错误(无输出)
$ pnpm exec eslint --ext .js,.ts,.vue ./src
✖ 1 problem (1 error, 0 warnings) # 第一遍:NoticeManagementView.vue prettier 折行
(改完复跑)→ 无输出,0 error
$ pnpm build:pro → Build successful. Please see dist-pro directory
动作 8::3005 真浏览器实测(Codex in-app browser)
登录 admin → 侧边栏出现「订单与权益 → 商品配置」「运营管理 → 系统公告」(其余菜单不变)
#/commerce/products → 标题「商品配置」,11 列与后端字段一一对应,状态列用 statusText(已上架/已下架)
#/operation/notices → 标题「系统公告」,空态「还没有发布公告」
新建商品(UI)→ toast「商品已创建(默认下架,请确认后再上架)」,行内 totalCoin 550、状态「已下架」
新建公告(UI)→ toast「公告已发布」,行内 发布时间 16:32:15、失效时间「-」、状态「已发布」
C 端 GET /app/notices(匿名)→ 立刻能看到这条(total 1)
下架 → toast「公告已下架」→ C 端 total 0
删除 → toast「商品已删除」「公告已删除」→ 列表回到种子数据
溢出检查(1440/1280/1024,两页各一次)
1440: docScroll=1440 clientWidth=1440 overflowX=false
1280: docScroll=1280 clientWidth=1280 overflowX=false
1024: docScroll=1024 clientWidth=1024 overflowX=false
截图:/tmp/i1-product-list.png、/tmp/i1-notice-list.png
动作 9:❌ 实测抓到的真缺陷 —— 雪花 id 在浏览器里被四舍五入
UI 上点「下架」时后端回:
{"code":200002,"message":"公告不存在"} # 明明列表里就有这条
定位:
$ node -e 'console.log(2111011206851596290, Number.isSafeInteger(2111011206851596290))'
2111011206851596300 false
$ psql -c "select id, title from ops_notice;"
2111011206851596290 | I1 自测公告(UI 创建) # DB 里是 …596290
解读:S0 换雪花主键后 id 已超过 JS 安全整数范围(2^53-1 = 9007199254740991)。
浏览器 JSON.parse 把 2111011206851596290 变成 2111011206851596300,
页面拿这个被改过的 id 回查 → 200002。这是 S0 之后所有"新建即操作"的通用风险,
只是本轮新建的页面第一个撞上。
修复(限定在本轮两个模块的契约内,不动全局序列化、不动 app-api,避免影响 Flutter 客户端):
fruitshorts-module-commerce/.../ProductRespVO.java id 加 @JsonSerialize(using = ToStringSerializer.class)
fruitshorts-module-system/.../NoticeRespVO.java 同上
ProductAdminController#create / NoticeAdminController#create 返回 Result<String>
ReelShortWeb/src/api/admin/{product,notice}.ts id: string
docs/api-phase1.md §2.11/§2.12 写明"id 以字符串下发"
新增两条防回归测试(把真实雪花 id 喂进去断言是字符串):
ProductAdminControllerContractTest#should_send_string_id_when_product_id_exceeds_js_safe_integer、
NoticeAdminControllerContractTest#should_send_string_id_when_notice_id_exceeds_js_safe_integer。
动作 10:修复后复跑门禁(最终数字)
$ mvn test
[INFO] Tests run: 33, Failures: 0, Errors: 0, Skipped: 0 (module-commerce)
[INFO] Tests run: 16, Failures: 0, Errors: 0, Skipped: 0 (admin-api)
[INFO] Tests run: 49, Failures: 0, Errors: 0, Skipped: 0 (app-api)
[INFO] Tests run: 12, Failures: 0, Errors: 0, Skipped: 0 (transcode-worker)
[INFO] BUILD SUCCESS # 共 110 条(存量 91 + 新增 19)
$ mvn -pl fruitshorts-app-api,fruitshorts-admin-api -am package -DskipTests → BUILD SUCCESS
修复后复测(同一浏览器,重新起服务后):
点「已发布」→ toast「公告已下架」,行内状态变「已下架」 # 修复前这里是「公告不存在」
C 端 GET /app/notices → {"total":0} # 下架后客户端立即不可见
接口返回类型核对:id= 2111012331625517057 type= str
动作 11:自测数据清理(收尾)
DELETE 1 # 商品 i1_ui_coin_880(第一轮 UI 建的)
DELETE 4 # 公告 4 条(含 UI 建的)
DELETE 1 # 商品 i1_ui2_coin_500(修复后 UI 建的)
DELETE 1 # 公告 I1 复测公告:印尼开服
products | soft_deleted notices
3 | 0 0
解读:product 表回到 3 行种子(coin_100 / coin_550 / coin_1200),ops_notice 回 0 行。
没有留下任何自测数据。
本轮遗留(已写进 INBOX 回执的「待确认」)
- 雪花 id 的全局方案:admin-api 是否统一
Long → String(涉及所有既有页面的id类型), app-api 是否要动(影响 Flutter 客户端解析)——属于平台级改动,等裁定。 /app/orders/verify的真发币链路需要 Google Play 凭据(B1-1 已列清单)。
2026-10-16 J1:全局 ID 字符串化(Long → String)+ 契约统一
计划文件:docs/plans/2026-10-16-J1.md(先写计划再动手)。用户裁定「方案 (a) 全局修改,统一契约」。
动作 1:后端全局序列化(fruitshorts-framework)
新增 JacksonLongToStringConfig:SimpleModule 把 Long.class / Long.TYPE → ToStringSerializer,
经 Jackson2ObjectMapperBuilderCustomizer 挂进 Spring Boot 的 ObjectMapper。
两个入口都是 scanBasePackages = "com.fruitshorts",一处生效两端一致,没改 yml。
一个刻意的例外:PageResult.total 是条数不是 id,用 mixin 显式保持数字(前端分页组件要数字)。
为此给 mixin 加了个 PlainLongSerializer(NumberSerializer 没有无参构造,using= 装不上)。
I1 里给商品/公告 VO 逐个加的 @JsonSerialize 与 Result<String> 新建返回已回退成自然写法 ——
全局生效后它们只是冗余特例(现在是"所有模块一个口径")。
动作 2:契约 §0 总口径
docs/api-phase1.md §0 新增「ID 字段一律以字符串下发」+ 示例 + 边界(total 与 Integer 保持数字、
id 回传按字符串传),§2.11/§2.12 的逐模块表述改成引用 §0。
动作 3:契约测试的 standalone mapper 也挂上模块(否则假绿)
ControllerContractSupport(app-api / admin-api 两处)自带手搓 JsonMapper,不含全局模块 ——
不改它的话,测试断言数字 id 也会过,而生产早就变成字符串了。挂上模块后:
$ mvn test
[INFO] Tests run: 33, Failures: 0, Errors: 0, Skipped: 0 (fruitshorts-module-commerce)
[INFO] Tests run: 21, Failures: 0, Errors: 0, Skipped: 0 (fruitshorts-admin-api)
[INFO] Tests run: 49, Failures: 0, Errors: 0, Skipped: 0 (fruitshorts-app-api)
[INFO] Tests run: 12, Failures: 0, Errors: 0, Skipped: 0 (fruitshorts-transcode-worker)
[INFO] BUILD SUCCESS # 共 115 条(存量 110 + 新增 5)
新增 LongToStringSerializationTest 5 条:普通字段 / 嵌套对象 / List / Map 值 / 分页(total 数字 + list id 字符串)
/ 请求体 "id":"…" 反序列化成 Long / 19 位路径变量绑定成 Long。
另外把 C 端 4 条 id 断言从数字改成 value("…") + isString()(原来"数字也能过"的宽松比较不算证据)。
动作 4:Web 与客户端适配
见回执的逐文件清单。要点:Web 审计出 4 处把 id 当数字用的地方(代看 id 过 Number、
两处 Number(route.…) 与 id 比较、菜单顶级哨兵 0 与 "0" 不一致);Flutter 侧 id 本来就是
(json['id'] ?? '').toString(),会崩的是被全局规则扫到的 Long 计数,只改了 expiresIn 与 viewCount。
$ pnpm ts:check → 0 错误
$ pnpm exec eslint … ./src → 0 error
$ pnpm build:pro → Build successful
$ dart analyze lib test → No issues found!
$ flutter test → All tests passed! (+167)
动作 5:端到端复现"修复前后"(真实服务)
① 复现 PM 那个场景:C 端注册 → admin 列表/详情
$ curl -X POST :8081/app/auth/register -d '{"targetType":"EMAIL","target":"j1.selftest@example.com",…}'
→ "expiresIn": "7200" # long 字段,已是字符串
$ curl -H "Authorization: …" :8080/admin/app-users/page?pageSize=50
total = 2 int # 分页 total 仍是数字(例外生效)
命中用户: uid=U79DG5IOM id='2111015748376858626' id类型=str
$ curl -H "Authorization: …" :8080/admin/app-users/2111015748376858626
code= 0 message= ok # 修复前这里就是 200002
data.id= '2111015748376858626' uid= U79DG5IOM
② JS 侧逐位一致(真实响应喂 node)
$ node -e '…'
响应原文里的 id(JSON 字符串): "2111015748376858626"
typeof 解析后 : string
String(parsed.id) : 2111015748376858626
库里 app_user.id : 2111015748376858626
逐位相等? : true
---- 反面对照:同一串数字当裸数字解析 ----
裸数字 -> String(parsed.id) : 2111015748376858600
逐位相等? : false
③ 全局范围:换两个模块(商品 / 创作者)走"新建 → 用响应 id 查详情 → 改状态"
新建商品响应 : {"code":0,"data":"2111015841427492865"}
商品详情 : code=0 id='2111015841427492865'
商品上架 : {"code":0}
新建创作者响应 : {"code":0,"data":"2111015841771425794"}
创作者详情 : code=0 id='2111015841771425794' name=J1 探针工作室
④ C 端字段类型(匿名可读的链路)
/app/home/feed : drama card id='5'(str) viewCount='3100000'(str)
/app/dramas/5 : id='5'(str) viewCount='3100000'(str) totalEpisodes=72(int) episode id='7'(str)
/app/episodes/7/play : episodeId='7'(str) dramaId='5'(str) durationSec=228(int) unlockCoin=0(int)
解读:Long → 字符串(id、viewCount、expiresIn、coinAmount),Integer/int 与分页 total 仍是数字, 与 §0 的规则和例外完全对上。
动作 6:自测数据清理(含一次口径纠正)
DELETE 1 # 自测用户 app_user(含 credential 2 / session 2 / device 2 / consent 3 / wallet 1)
DELETE 1 # 商品 j1_probe_coin
DELETE 1 # 创作者 J1PROBE
全库扫描 uid / 邮箱 / 雪花 id → 无任何残留(NOTICE: 扫描完成)
现存:creator 只剩 PM 那条 id=25(CR20261015001)、app_user 只剩 id=28(UHR-DLTH8)、
product 3 行种子、ops_notice 0 行 —— 都不是本轮数据。
⚠️ 口径纠正:我第一版清理脚本用 psql -t -A -c "delete … returning 1" | wc -l 数"行数",
数到的其实是 psql 的命令标签(实测删 0 行时输出 DELETE 0,也是 1 行),所以那轮打印的
"删除 1 行"是假数字。真正的证据是后面的全库残留扫描(零命中)与现存数据核对,已按此结论写回执。
2026-10-16 K1:客户端对接(详情 + 播放 + 进度续看 + 收藏)+ 三态 UI
计划文件:docs/plans/2026-10-16-K1.md(先写计划再动手)。仓库:ReelShort(Flutter,develop)。
动作 1:勘察更正
条目说"客户端只调了 6 个接口、没有详情和票据"——实测详情已接(CatalogApi.dramaDetail),
票据半接(CatalogApi.playTicket 存在但没页面调用)。这一点写进计划与回执。
动作 2:分层实现(api → repository → logic → view)
- 新增
playback_api.dart/watch_api.dart/library_api.dart+watch_progress.dart模型 - 新增
PlaybackRepository(票据 TTL 缓存,默认 10 分钟;时钟/TTL 可注入)、FavoriteRepository WatchHistoryRepository换成服务端模型(每剧一条续看记录),删掉demoProfileId与 SharedPreferences 实现FavoriteController乐观更新 + 失败回滚;app.dart注入三个仓库与收藏控制器
动作 3:门禁(最终数字)
$ dart analyze lib test
No issues found!
$ flutter test
00:09 +188: All tests passed!
新增测试:playback_ticket_expiry_test(票据过期重取 + 签名 query 原样保留)、
progress_throttle_test(10 秒节流 + 切集补报 + 播完 finished + 续看定位)、
watch_history_test(重写为服务端模型)、library/favorite_controller_test(回滚/错误态/退出清空)、
integration/live_watch_flow_test(真实后端端到端)。
动作 4:真实后端联调(8081,原始输出)
① 首页 → dramaId=5
② 详情 → episodes=3,第一集 id='7' playUrl=/files/episode/202610/cec39d8e….mp4?e=1792144372&s=8791826a…
③ 票据 → episodeId='7' dramaId='5' accessType=FREE accessible=True
playUrl 与详情里的签名地址一致(客户端只补 host,不动 path/query)
④ 上报进度(42s)→ {"dramaId":"5","episodeId":"7","positionMs":"42000","durationMs":"228000","playCount":1}
⑤ 读回续看位置 → dramaId='5' episodeId='7' positionMs='42000' durationMs='228000'
⑥ 最近观看 → 条数=1,dramaId='5' episodeId='7' positionMs='42000'
⑦ 收藏 → toggle 返回 true → 收藏列表条数=1(首个 '5')→ DELETE → 取消后条数=0
flutter test test/integration/live_watch_flow_test.dart → All tests passed(同一链路在客户端代码里跑通)。
解读:positionMs/durationMs/dramaId 都是字符串(J1 的新口径),客户端用 jsonToInt 解析。
动作 5:自测数据清理
已清理 2 个自测账号(k1.selftest.* / k1.receipt.*)+ 依赖行
残留核对:app_user 1 行(PM 的 id=28)、app_user_credential 1 行、watch_progress 0、user_favorite 0
(第一次清理漏了 app_user 本体——它的主键列叫 id 不是 user_id,随后单独删掉并复核。)
2026-10-16 K1-verify:用正确地址重做真机验证(设备侧取证)—— 结果:未验证(已按用户要求交回用户执行)
红线第 10 条新增后,本轮目标是"用正确地址 + 设备侧证据"重做真机验证。以下是逐动作留痕。
动作 1:取真实地址(不硬编码)
$ ipconfig getifaddr en0
192.168.31.187
$ for i in en0 en1 en2 utun0..3; do ipconfig getifaddr $i; done
en0 = 192.168.31.187 # 只有 en0 有地址;旧的 10.157.242.1 已不存在
$ lsof -nP -iTCP:8081 -sTCP:LISTEN
java 80383 ... TCP *:8081 (LISTEN)
动作 2:加设备侧集成测试(可重复、可入库的证据)
pubspec.yamldev_dependencies 加integration_test(sdk)- 新增
integration_test/app_backend_test.dart:在手机进程里请求/app/home/feed与/app/dramas/{id}, 断言列表非空、详情 id 一致;再用真 App 跑一遍,断言首页底部标签栏出现(= 剧目列表加载成功)。 两个用例都把API_BASE_URL打进设备日志,便于区分"地址不对"还是"设备连不上"。 dart analyze lib test integration_test→ No issues found!
动作 3:第一次真机执行(设备侧输出,17:56)
$ IP=$(ipconfig getifaddr en0) && flutter test integration_test -d 00008101-000875813E42001E \
--dart-define=API_BASE_URL=http://$IP:8081
Running Xcode build... Xcode build done. 31.3s
Installing and launching... 20.0s
00:00 +0: should_fetch_home_feed_and_drama_detail_when_device_reaches_backend
[device] API_BASE_URL=http://192.168.31.187:8081
[device] 首页分区=4 剧目=3
[device] 详情 id=5 剧集=3
00:01 +1: should_render_home_drama_list_when_app_boots_on_device
[device] 首页剧目列表已渲染:API_BASE_URL=http://192.168.31.187:8081
00:05 +2: (tearDownAll)
00:06 +2: All tests passed!
解读:[device] 行是手机进程里打印的(不是开发机 curl),断言也在手机进程里跑;这一次是全过的。
动作 4:第二次执行(只跑第一个用例,17:59)—— 失败
Running Xcode build... Xcode build done. 17.8s
Installing and launching...
The Dart VM Service was not discovered after 60 seconds. This is taking much longer than expected...
我同时起了 lsof 轮询想抓"手机 IP → 8081"的已建立连接,一个连接都没抓到(原始文件只有 lsof 表头)—— 因为 app 那次根本没 attach 上,也就没有发请求。这一步没有产出任何设备侧证据。
动作 5:第三次(flutter run 真机跑,18:03–18:04)—— 被叫停
Launching lib/main.dart on iPhone in debug mode...
Running Xcode build... Xcode build done. 30.4s
Installing and launching...
You may be prompted to give access to control Xcode...
PM 报告:该轮后续撞上 iOS 构建报错
build/ios/iphoneos/video_player_avfoundation_video_player_avfoundation.bundle: No such file or directory,
并把进程停掉、执行了 flutter clean(我自己的日志到 "Installing and launching" 为止,上面这条报错文本来自 PM 报告,不是我抓到的)。
推测成因(如实写,未定论):我这轮 flutter run 与另一次执行并发写同一个 build/ 目录,
产物被互相破坏(PM 也把"并发写 build 目录"列为成因之一)。
动作 6:按用户指令停止执行,转为交接
用户 20:45 指令:「codex 不用跑测试 我来执行」。我随即:
$ kill -TERM 76461 76458 76675 77472 76250 # 我的 flutter run / xcodebuild / frontend_server / lsof 轮询
$ pgrep -fl "flutter_tools|xcodebuild|k1v_poller"
4173 ... flutter_tools.snapshot daemon # 只剩 IDE 常驻 daemon(非构建)
build/ 目录里留着我被 kill 的那次构建的半成品,用户按 flutter clean && flutter pub get 起跑即可清掉。
结论口径
- 按红线第 10 条与用户要求:本批真机验证标注「未验证」,由用户执行后以用户的结果为准。
- 动作 3 那次是真实的设备侧输出且全过,但随后两次执行失败(一次 VM service 未 attach、一次构建产物缺失), 所以在用户重跑之前不把它当作最终结论;它作为历史记录保留在这里。
- 我没有用任何"开发机 curl"作为设备可达证据。
2026-10-17 K2:分类 + 观看记录 + 收藏列表 + 下载授权管理
动作 1:按 INBOX 指定顺序读取规范与契约
叙述:开工前先完整核对 INBOX K2 条目、项目约束、Git 流程、接口 §0/§1.3/§1.5/§1.6, 再读 A3/A5、CONTENT/RECORD 用例与测试计划。当前没有启动客户端构建,也没有改业务代码。
$ sed -n '1,260p' docs/plans/INBOX.md
# INBOX — 给 Codex 的指令队列(FruitServer 仓库内)
## [待处理] 2026-10-17 | K2 客户端第二批:分类 + 观看记录 + 收藏列表 + 下载授权(A3/A5 剩余)+ UI
本批只做 K2,做完停下写回执,不要连做 K3/K4。
接口只认 FruitServer/docs/api-phase1.md §1.3 / §1.5 / §1.6
$ sed -n '1,260p' /Users/jianghaifeng/Desktop/ReelShort/AGENTS.md
# 水果短剧(FruitShorts)— Codex 项目上下文
## 强制约束(不可违反)
## 自主执行原则(Autonomy — 最高优先级)
$ sed -n '1,340p' /Users/jianghaifeng/Desktop/ReelShort/CODING_STANDARDS.md
## 3. Dart / Flutter(ReelShort)
TDD 强制:先写测试(红灯)→ 实现(绿灯)→ 重构
门禁:dart analyze lib test 零告警 + flutter test 全过
$ sed -n '1,300p' /Users/jianghaifeng/Desktop/ReelShort/GIT_WORKFLOW.md
## 一、分支模型(Git Flow)
feature/*:具体功能开发,来源 develop
合并一律 --no-ff(禁用 fast-forward)
$ sed -n '1,64p;150,158p;186,222p' docs/api-phase1.md
## 0. 通用约定
所有 ID 字段(主键与外键)在 JSON 里都是字符串
### 1.3 内容浏览(已实现)
GET /app/categories | 分类列表
### 1.5 观看记录与收藏(已实现)
GET /app/watch/recent?limit=20 | 最近观看
DELETE /app/watch/progress/{dramaId} | 删除某剧记录
DELETE /app/watch/progress | 清空记录
### 1.6 离线下载(已实现)
GET /app/downloads/policy
PUT /app/downloads/settings
POST /app/downloads
GET /app/downloads
GET /app/downloads/{episodeId}/url
POST /app/downloads/{episodeId}/progress
DELETE /app/downloads/{episodeId}
DELETE /app/downloads
$ sed -n '1,90p' /Users/jianghaifeng/Desktop/ReelShort/docs/plans/codex-研发任务清单.md
- A3 内容(03):首页 feed、发现 feed、分类、详情(一次请求渲染详情页)、搜索。
- A5 记录/收藏(05):观看记录、最近观看、收藏切换与列表、下载授权。
$ sed -n '1,135p' /Users/jianghaifeng/Desktop/ReelShort/docs/16-测试用例库.md
TC-CONTENT-09 | 分类题材 | 有分类 | 查看分类 | 分类列表正确 | P2
TC-RECORD-01 | 观看历史 | 有播放 | 查看历史 | 按时间倒序,可删除 | P0
TC-RECORD-03 | 取消收藏 | 已收藏 | 取消 | 状态反转 | P0
TC-RECORD-04 | 收藏列表 | 有收藏 | 查看 | 分页正确 | P1
TC-RECORD-09 | 历史清空 | 有历史 | 清空 | 全部清空 | P2
$ sed -n '1,100p' /Users/jianghaifeng/Desktop/ReelShort/docs/09-测试计划.md
单元测试 | Dart 核心类 | flutter test | 核心模块 ≥80%
UI 测试 | 关键页面 | Flutter widget test | 核心页面
解读:K2 范围、TDD 顺序、接口白名单、三语言文案、三态、登录闸、门禁与设备验证边界均已确认。 搜索没有契约接口,本批不做;收藏分页和观看记录卡片字段按 INBOX 的降级方案处理。
动作 2:只读核对两个仓库基线与客户端现状
叙述:确认客户端从干净 develop 开工,并核对现有网络层、记录/收藏实现和页面入口,
用于计划中的真实文件清单。
$ git status --short --branch && git log -5 --oneline --decorate
## develop...origin/develop
00280ca (HEAD -> develop, origin/develop) merge: 同步 main 的作者标识提交到 develop
84a1f58 test(client): 新增设备侧集成测试(真机跑通后端可达性)
d7eff4c feat(client): 对接详情/播放/进度续看/收藏(K1 看剧闭环)+ 三态 UI
$ git status --short --branch && git log -5 --oneline --decorate # FruitServer
## develop...origin/develop
4118efd (HEAD -> develop, origin/develop) docs(inbox): 按 specs 补全 K2 执行规范与门禁
096e90c docs(inbox): 记录用户裁定——K2 先按现状契约执行,契约缺口后期再补
582453f docs(inbox): 下发 K2 客户端第二批(分类/记录/收藏/下载授权 + UI)
$ find lib -maxdepth 4 -type f | sort
lib/core/data/remote/catalog_api.dart
lib/core/data/remote/library_api.dart
lib/core/data/remote/watch_api.dart
lib/pages/discover/discover_view.dart
lib/pages/mine/mine_view.dart
...
解读:两仓均无未提交改动。分类 API、下载 API/page/controller 不存在;
观看记录删除只有单条,没有清空;收藏数据层已有但无独立页面;
ApiClient 只有 GET/POST/DELETE,下载设置所需的 PUT 需最小补齐。
动作 3:写 K2 计划
叙述:先落计划再动业务代码,明确四块范围、实施顺序、影响文件、三个契约缺口、 风险和待确认项。
文件:docs/plans/2026-10-17-K2.md
章节:范围与完成口径 / 实施顺序与 TDD / 预计影响文件 /
契约缺口 / 风险与控制 / 待确认 / 完成定义
解读:后续实现按 K2-A → K2-B → K2-C → K2-D 推进;每块先红后绿并单独跑门禁。 真机与 Android 构建结果按实际证据记录,缺失时明确标“未验证”。
动作 4:创建功能分支并跑存量基线门禁
叙述:客户端从 develop 创建任务指定分支;沙箱不允许写 .git/index.lock,
Git 与 Flutter 工具链缓存写操作按权限流程在受控环境执行。先确认存量门禁本身是绿的。
$ git checkout -b feature/flutter-k2-library develop
Switched to a new branch 'feature/flutter-k2-library'
## feature/flutter-k2-library
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:10 +188: All tests passed!
解读:客户端基线 188 个测试全过、静态检查零告警,可以开始 K2-A。
动作 5:K2-A 测试红灯
叙述:先新增分类模型/API/控制器的契约测试,覆盖雪花 ID 字符串、分类到
category-{id} 分区映射、缺失分区空态、hot/new 入口、全量去重和失败重试。
$ flutter test test/category/category_controller_test.dart
test/category/category_controller_test.dart:6:8: Error: Error when reading
'lib/core/data/models/content_category.dart': No such file or directory
test/category/category_controller_test.dart:10:8: Error: Error when reading
'lib/core/data/remote/category_api.dart': No such file or directory
test/category/category_controller_test.dart:11:8: Error: Error when reading
'lib/core/data/repositories/category_repository.dart': No such file or directory
test/category/category_controller_test.dart:12:8: Error: Error when reading
'lib/core/data/services/category_controller.dart': No such file or directory
00:00 +0 -1: Some tests failed.
解读:红灯原因符合预期,目标实现尚不存在。下一步实现分类数据层与控制器。
动作 6:K2-A 实现绿灯与门禁
叙述:实现 ContentCategory、CategoryApi、CategoryRepository、
CategoryController,发现页改为读取 /app/categories 与 /app/discover/feed;
保留 For You / Hot / New 样式,服务端分类只匹配 category-{id}。
$ flutter test test/category/category_controller_test.dart
00:00 +5: All tests passed!
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:08 +191 ~1: All tests passed!
解读:分类块绿。~1 是既有真实后端联调用例因本机 8081 未启动而按设计跳过,
不是失败。分类 UI 仍保留 hot/new 入口;后端发现 feed 未下发对应分区时显示空态。
动作 7:K2-B 测试红灯
叙述:先固定观看记录页核心逻辑:updatedAt 解析、recent 按 dramaId 去重、
详情并发上限 4、单条详情失败降级与单项重试、删除/清空乐观回滚、recent 失败态。
$ flutter test test/watch/watch_records_controller_test.dart
test/watch/watch_records_controller_test.dart:11:8: Error: Error when reading
'lib/core/data/services/watch_records_controller.dart': No such file or directory
test/watch/watch_records_controller_test.dart:23:3: Error: No named parameter
with the name 'updatedAt'.
test/watch/watch_records_controller_test.dart:49:21: Error: The getter
'updatedAt' isn't defined for the type 'WatchProgress'.
00:00 +0 -1: Some tests failed.
解读:红灯符合预期,观看记录控制器与更新时间字段尚不存在。
动作 8:K2-B 实现与门禁
叙述:增加 updatedAt、观看记录清空 API/repository,新增独立
WatchRecordsController 与 WatchRecordsPage。“我的 → 观看记录”已改为打开独立页。
详情请求按 dramaId 去重、最多 4 个并发;单条详情失败显示占位与单项重试;
单删和清空先更新 UI,失败回滚并提示;清空有二次确认。
$ flutter test test/watch/watch_records_controller_test.dart test/watch/watch_records_page_test.dart
00:00 +10: All tests passed!
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:08 +201 ~1: All tests passed!
解读:K2-B 绿。~1 仍是既有真实后端联调用例跳过;本轮新增 10 个记录相关测试。
动作 9:K2-C 测试红灯
叙述:先补收藏取消失败的原位回滚测试,再新增独立收藏页的卡片、取消失败、 空态、失败重试与未登录闸测试。
$ flutter test test/library/favorite_controller_test.dart test/library/favorites_page_test.dart
test/library/favorite_controller_test.dart:80:8: Error: The setter 'failRemove'
isn't defined for the type 'InMemoryFavoriteRepository'.
test/library/favorites_page_test.dart:13:8: Error: Error when reading
'lib/pages/favorites/favorites_page.dart': No such file or directory
test/library/favorites_page_test.dart:108:23: Error: The getter 'listCalls'
isn't defined for the type 'InMemoryFavoriteRepository'.
00:00 +0 -2: Some tests failed.
解读:红灯符合预期:独立收藏页不存在,测试仓库也还不能模拟删除失败。
动作 10:K2-C 实现与门禁
叙述:新增独立 FavoritesPage 和复用列表卡片,服务端列表三态齐全;
取消收藏采用乐观更新,失败时按原索引回滚;我的页增加“我的收藏”入口。
$ flutter test test/library/favorite_controller_test.dart test/library/favorites_page_test.dart
00:00 +13: All tests passed!
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:10 +207 ~1: All tests passed!
解读:K2-C 绿。收藏页按契约全量读取,不发送 page/size;真实后端联调用例仍按设计跳过。
动作 11:K2-D 测试红灯
叙述:先用 API 契约测试钉住 §1.6 全部 8 个下载接口与字符串 ID; 再用控制器测试固定策略/授权加载、后端 message 透传、设置回滚、删除和清空回滚。
$ flutter test test/download/download_api_test.dart test/download/download_controller_test.dart
test/download/download_api_test.dart:7:8: Error: Error when reading
'lib/core/data/remote/download_api.dart': No such file or directory
test/download/download_controller_test.dart:4:8: Error: Error when reading
'lib/core/data/models/download_license.dart': No such file or directory
test/download/download_controller_test.dart:9:31: Error: Type
'DownloadController' not found.
00:00 +0 -2: Some tests failed.
解读:红灯符合预期,下载模型、API、仓库与控制器尚未实现。
动作 12:K2-D 数据层与页面实现
叙述:实现下载策略/授权模型、8 个接口的 DownloadApi、仓库与控制器;
ApiClient 仅补契约需要的 PUT。新增“我的下载”页,展示策略、配额、
授权/任务原始状态、进度、有效期,并提供仅 Wi-Fi、清晰度、单删和清空;
详情页与播放页接入真实授权申请。授权失败直接展示后端 message。
$ flutter test test/download/download_api_test.dart test/download/download_controller_test.dart test/download/downloads_page_test.dart
00:00 +10: All tests passed!
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:10 +219 ~1: All tests passed!
解读:K2-D 首轮绿。文件分片落盘、断点续传、离线播放、licenseKey 本地校验未做,
url 与 progress 只交付 API 方法;这些边界不会写成“已完成”。
动作 13:提交前边界审查(清晰度下拉修复)
叙述:审查发现当后端策略 maxQuality 已是 720P/1080P 时,
下拉选项会重复同一值并触发 Flutter 断言。先补测试得到红灯,再去重选项;
同时处理退出后重新登录页面不刷新、登录闸文案覆盖观看记录/下载的问题。
$ flutter test test/download/downloads_page_test.dart
Failed assertion: There should be exactly one item with
[DropdownButton]'s value: 720P.
Either zero or 2 or more [DropdownMenuItem]s were detected with the same value
00:01 +6 -1: Some tests failed.
$ flutter test test/download/downloads_page_test.dart
00:00 +7: All tests passed!
解读:边界缺陷已由测试固定并修复,避免特定后端清晰度值导致下载页崩溃。
动作 14:最终门禁与 Android 构建
叙述:整理掉格式化造成的无关测试 diff 后,在 develop 合并前后都复跑门禁。 首次 Android 构建因本机 Gradle 依赖经代理下载持续约 12 分钟,但最终成功; 修复后二次构建命中缓存(2.377 秒)。
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:11 +220 ~1: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'... 705.7s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
$ flutter build apk --debug # 最终修复后
Running Gradle task 'assembleDebug'... 2,377ms
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警、220 个测试通过;~1 是既有真实后端联调用例因本机未启动
8081 服务按设计跳过。Android debug APK 构建通过。
动作 15:Git 提交、合并与推送
叙述:客户端从干净 develop 建功能分支,功能提交与 --no-ff 合并提交均使用
项目规定作者。合并前确认 origin/develop 无新提交;合并后在 develop 复跑门禁,
再 push,最后删除已完成 feature 分支。未改 main。
commit=cc4d7c5a9dc6a4f6f0565a32503cce5973af703c
author=Zhou Weidong <502333560@qq.com>
subject=feat(flutter): 接入分类记录收藏与下载授权
merge=45f5f25640a274edb51bd90b3b5e52c43ba9d9cd
author=Zhou Weidong <502333560@qq.com>
subject=merge: 合并 K2 客户端分类记录收藏与下载授权
$ git push origin develop
To http://git.reelshort2.com/jianghaifeng/ReelShort.git
00280ca..45f5f25 develop -> develop
$ git branch -d feature/flutter-k2-library
Deleted branch feature/flutter-k2-library (was cc4d7c5).
解读:客户端 develop 已与 origin/develop 对齐,工作区干净。
动作 16:真实数据与未验证边界
叙述:生产环境注入的发现分类、观看记录、收藏、下载授权均调用契约 HTTP 接口, 不再用本地演示目录补齐。由于设备侧验证归用户执行,本轮没有把任何开发机请求 当作“设备可达”证据。
已接生产 HTTP 链路:
- GET /app/categories + GET /app/discover/feed
- GET /app/watch/recent + DELETE /app/watch/progress/{dramaId} + DELETE /app/watch/progress
- GET /app/favorites + DELETE /app/favorites/{dramaId} + POST /app/favorites/toggle
- §1.6 全部 8 个 /app/downloads* 契约接口
仍未做:
- 搜索(契约无接口)
- 下载文件分片落盘 / 断点续传 / 离线播放 / licenseKey 本地校验
- 真机 / 模拟器侧验证(未验证,由用户执行)
解读:功能代码和构建门禁已完成;设备网络、实际授权状态与 UI 交互需用户按回执步骤验证。
动作 17:用户真机验收清单
叙述:本动作只补齐验收证据与回执缺项,不新做功能、不改 ReelShort 产品代码。
本轮重新核对 ReelShort develop 为 45f5f25,FruitServer 文档开工前为 698bb78;
并复跑 dart analyze lib test、flutter test、flutter build apk --debug。
设备侧取证由用户执行,Codex 未执行。下面所有“预期”都是用户在手机上应看到的业务结果;
开发机 curl 只用于检查后端是否启动,不作为手机可达或设备侧验收证据。
17.1 本轮门禁复跑原始输出
叙述:先确认 8081 监听状态,再按 ReelShort develop 顺序复跑三个客户端门禁。
Flutter 首次在受限沙箱内运行时被拒绝写 SDK 缓存
(engine.stamp.tmp / engine.realm: Operation not permitted),
随后在受控环境用同一组命令复跑;下面贴的是复跑成功的原始输出。
$ lsof -nP -iTCP:8081 -sTCP:LISTEN
(无输出,说明本轮复跑时 8081 未监听)
$ flutter devices
Found 3 connected devices:
iPhone (mobile) • 00008101-000875813E42001E • ios • iOS 26.6.1 23G83
macOS (desktop) • macos • darwin-arm64 • macOS 15.5 24F74 darwin-arm64
Chrome (web) • chrome • web-javascript • Google Chrome 155.0.8059.80
Checking for wireless devices...
No wireless devices were found.
Run "flutter emulators" to list and start any available device emulators.
$ cd /Users/jianghaifeng/Desktop/ReelShort/ReelShort
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
test/integration/live_watch_flow_test.dart: should_complete_the_watch_flow_when_backend_is_running
客户端接口服务未启动,已跳过联调测试
test/integration/live_auth_test.dart: should_surface_business_error_when_sign_in_uses_unknown_email
客户端接口服务未启动,已跳过联调测试
test/integration/live_catalog_test.dart: should_parse_banner_and_sections_when_home_feed_is_fetched
客户端接口服务未启动,已跳过联调测试
test/integration/live_catalog_test.dart: should_order_episodes_by_number_and_attach_url_when_detail_is_fetched
客户端接口服务未启动,已跳过联调测试
test/integration/live_catalog_test.dart: should_return_play_url_when_episode_is_playable
客户端接口服务未启动,已跳过联调测试
00:10 +216 ~5: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'... 2,672ms
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警;8081 未启动时测试结果是 +216 ~5,5 条跳过均来自 live 联调用例的
markTestSkipped,不是失败;Android debug APK 构建成功(缓存命中,2,672ms)。
本轮没有设备侧业务证据,也没有用开发机请求替代手机取证。
17.2 从零前置条件
以下命令都需要在 Mac 终端执行。第 1 步只在首次搭建环境时执行;已有数据库可跳过。
- 启动 PostgreSQL;首次环境再建角色、数据库并初始化脚本。
$ brew services start postgresql@18
$ export PATH="/opt/homebrew/opt/postgresql@18/bin:$PATH"
$ psql -d postgres -c "CREATE ROLE fruitshorts LOGIN PASSWORD 'fruitshorts';"
$ psql -d postgres -c "CREATE DATABASE fruitshorts OWNER fruitshorts ENCODING 'UTF8';"
$ cd /Users/jianghaifeng/Desktop/ReelShort/FruitServer
$ psql -h 127.0.0.1 -U fruitshorts -d fruitshorts -f sql/schema.sql
$ psql -h 127.0.0.1 -U fruitshorts -d fruitshorts -f sql/data.sql
$ psql -h 127.0.0.1 -U fruitshorts -d fruitshorts -f sql/schema-phase1.sql
$ psql -h 127.0.0.1 -U fruitshorts -d fruitshorts -f sql/partition-maintenance.sql
$ psql -h 127.0.0.1 -U fruitshorts -d fruitshorts -f sql/data-phase1.sql
预期:五个 SQL 脚本按顺序执行完成,没有主键冲突或表不存在错误。
重复执行是幂等的;不要颠倒 partition-maintenance.sql 与 data-phase1.sql 的顺序。
- 构建并启动客户端接口服务 8081。
$ cd /Users/jianghaifeng/Desktop/ReelShort/FruitServer
$ mvn -pl fruitshorts-app-api -am package -DskipTests
$ java -jar fruitshorts-app-api/target/fruitshorts-app-api-1.0.0-SNAPSHOT.jar
预期:启动日志出现 Started AppApiApplication;另开终端检查:
$ lsof -nP -iTCP:8081 -sTCP:LISTEN
java ... TCP *:8081 (LISTEN)
$ curl -fsS http://127.0.0.1:8081/healthz
{"code":0,...,"data":{"status":"UP","app":"fruitshorts-app-api",...}}
curl 只证明开发机上的 8081 已启动,不能证明手机可达。
- 准备手机与局域网。
- 手机和 Mac 连接同一个 Wi-Fi;关闭会隔离客户端的访客网络/VPN 代理。
- iPhone 首次启动 App 时,在系统弹窗中允许「本地网络」权限。
- Mac 防火墙若拦截 Java,到「系统设置 → 网络 → 防火墙 → 选项」允许
java传入连接。 - 同网段地址用
IP=$(ipconfig getifaddr en0)获取。若为空,先确认当前 Wi-Fi 网卡名, 再改用对应接口(如en1)。
预期:终端打印形如 192.168.x.x 的局域网地址;手机浏览器能访问
http://<该地址>:8081/healthz,页面显示 "status":"UP"。
- 获取 Flutter 运行设备号。
$ cd /Users/jianghaifeng/Desktop/ReelShort/ReelShort
$ flutter devices
预期:真机以 iPhone (mobile) • <UDID> • ios 形式出现。本轮机器识别到的设备号是
00008101-000875813E42001E;换手机或重装后必须重新执行 flutter devices,
不能继续照抄旧 UDID。也可以执行 xcrun xctrace list devices 查 iPhone UDID。
这里的“运行设备号”用于 flutter run -d。下载绑定使用的设备号是另一个概念:
客户端首次运行会在本地生成并持久化,随后由 ApiClient 作为 X-Device-Id 发送,
用户不需要也不能在界面上手填。测试文件里的 dio-check-device、k1-live-device
只是测试固定值,不是生产 App 的设备号。
- 用当前 Mac 的局域网 IP 注入接口地址并运行 App。
$ cd /Users/jianghaifeng/Desktop/ReelShort
$ git checkout develop
$ git pull origin develop
$ git rev-parse HEAD
45f5f25640a274edb51bd90b3b5e52c43ba9d9cd
$ cd ReelShort
$ IP=$(ipconfig getifaddr en0)
$ echo "API_BASE_URL=http://$IP:8081"
$ flutter run -d 00008101-000875813E42001E \
--dart-define=API_BASE_URL=http://$IP:8081
API_BASE_URL 是 Dart 编译期 --dart-define,不是 export API_BASE_URL=... 环境变量;
改了地址必须停止 App 后用新参数重新 flutter run,热重载不会替换它。
真机不能用 127.0.0.1 访问 Mac,Android 模拟器才用 10.0.2.2:8081。
预期:App 启动后首页和发现页能加载封面、标题与分区;手机没有出现网络异常空屏。
如果页面一直报网络错误,先在手机浏览器验证第 3 步的 /healthz,再检查 Mac 防火墙和
本地网络权限;不要用开发机 curl 冒充设备通过。
17.3 K2-A 分类验收
- 打开「发现」页。
预期:先出现分类/分区加载态,随后分类条显示保留的 For You、Hot、New 入口,
再显示后端 /app/categories 返回的分类名称。默认种子数据下包括「都市情感」「重生逆袭」
「甜宠爱情」「悬疑复仇」;数据库改过名称时以实际后端返回名称为准。
- 依次点「都市情感」「甜宠爱情」。
预期:顶部对应分类 chip 高亮;下方只展示 /app/discover/feed 中
code == "category-{id}" 的分区卡片。切换分类时内容跟着切换,不会保留上一个分类的卡片。
- 点默认种子中没有已发布内容的「重生逆袭」或「悬疑复仇」。
预期:分区区域显示「这个分类暂时没有剧集。」。这是无分区空态,不应出现自行拼装的推荐列表、 旧分类残留卡片或网络失败文案。
- 切回有内容的分类。
预期:卡片恢复显示;封面和标题与后端发现 feed 一致;点卡片可进入对应详情。
- 失败与重试:停止 8081,冷启动 App 后打开「发现」页。
预期:分类区域显示「分类加载失败。」和「重试」按钮,不白屏。 重新启动 8081 后点「重试」,预期分类和分区恢复显示;必要时下拉刷新。
设备侧只能直接证明服务端分类名称与分类切换结果;category-{id} 的代码映射、
全量去重和并发/重试细节由 test/category/category_controller_test.dart 自动化覆盖。
解读:K2-A 的用户验收点是“分类条来自服务端、内容只取对应 category-{id} 分区、
缺失分区显示空态、失败可重试”;真机没有执行这些步骤,当前结论仍为未验证。
17.4 K2-B 观看记录验收
- 登录后播放任意一部剧的免费集约 10 秒,返回并进入「我的 → 观看历史」。
预期:页面先显示加载态,随后出现该剧卡片;卡片可见封面、剧名、
「第 N 集」、进度条、续看至 mm:ss / mm:ss 和「更新于 ...」。
即使该剧不在首页/发现已加载目录中,也应正常显示,不能因为目录里匹配不到而消失。
- N+1 合并卡片:对同一部剧先后播放两个不同剧集,再播放另一部剧的一集,重新打开观看历史。
预期:同一部剧只出现一张卡片,不因看过多个剧集而重复;卡片展示该剧最新进度和对应集号。
不同剧各自一张卡片。详情是按 dramaId 去重后补取的,单条卡片加载中不应拖住其他卡片。
- 单条删除:点某张卡片右侧的关闭图标。
预期:卡片立即从页面消失;返回再进入观看历史后仍然不存在。
- 单删失败回滚:保持页面已加载,停止 8081,再点另一张卡片的关闭图标。
预期:卡片先乐观消失,随后回到原位置,并出现「删除记录失败,请重试。」。 重新启动 8081 后,删除动作可再次执行。
- 清空:点页面右上方「清空」。
预期:先弹出「清空观看记录?」及「这会从当前账号移除全部观看记录。」; 点「暂不」列表保持不变;点「清空」后列表变空并显示「还没有观看记录。」。
- 清空失败回滚:有记录且页面已加载时停止 8081,点「清空」并在二次确认中点「清空」。
预期:列表先清空,随后恢复原记录,并出现「清空观看记录失败,请重试。」。
- 三态和失败重试:后端正常时进入页面观察加载态;清空后观察空态;停止 8081 后冷启动 App 再进入观看历史,观察「续看进度加载失败。」和「重试」。重启 8081 后点「重试」, 预期记录重新加载。
若单条详情请求失败,预期该卡片显示「剧集信息加载失败」与「重试」,其他卡片仍正常显示;
该分支和 4 并发上限由 test/watch/watch_records_controller_test.dart、
test/watch/watch_records_page_test.dart 自动化覆盖。真机验收重点看合并卡片和整页不被单条失败拖垮。
解读:K2-B 的用户验收点是三态、同一剧 N+1 详情合并为一张卡片、单删与清空的乐观回滚; 自动化测试已覆盖控制器行为,手机上的真实网络与回滚表现仍待用户取证。
17.5 K2-C 收藏验收
- 登录后在详情页或播放页点书签图标收藏一部剧。
预期:图标立即切换为已收藏状态;失败时图标回到原状态并显示「收藏操作失败,请重试。」。
- 再收藏 1 至 2 部不同的剧,进入「我的 → 我的收藏」。
预期:页面展示服务端 GET /app/favorites 返回的全部收藏卡片,封面、标题与首页卡片一致;
列表不显示分页控件,也不发送自造的 page/size。点击卡片可进入详情。
- 取消收藏:点某张收藏卡片右侧的粉色收藏图标。
预期:卡片立即消失;返回再进入我的收藏后仍然不存在。
- 取消收藏失败回滚:保持列表已加载,停止 8081,再点另一张卡片的粉色图标。
预期:卡片先乐观消失,随后回到原位置,并出现「收藏操作失败,请重试。」。 重新启动 8081 后可再次取消。
-
三态和失败重试:后端正常时进入页面观察加载态;取消全部收藏后观察「还没有收藏。」; 停止 8081 后冷启动 App 再进入我的收藏,观察「收藏列表加载失败。」和「重试」。 重启 8081 后点「重试」,预期列表恢复。
-
服务端状态校准:在另一台设备或另一次登录中取消同一部收藏,再回到当前设备的我的收藏刷新。
预期:当前列表以服务端结果为准,不继续显示已被取消的收藏。
解读:K2-C 的用户验收点是服务端全量收藏列表、取消收藏后的乐观回滚和三态; 未登录引导另见 17.7,设备侧列表与回滚表现仍待用户取证。
17.6 K2-D 下载授权验收
- 登录后进入「我的 → 下载」。
预期:先出现加载态,随后显示策略卡:
「剩余 X / Y 个授权」、「授权有效期 N 天」以及后端返回的 expirePolicyText 原文;
下面显示「仅 Wi-Fi 下载」开关和「最高清晰度」下拉框。
- 验证 §1.6 的 8 个接口。真机可观察结果如下:
| # | 接口 | 真机操作与预期可见结果 |
|---|---|---|
| 1 | GET /app/downloads/policy |
打开下载页后策略卡出现,配额、授权天数、expirePolicyText 来自后端 |
| 2 | PUT /app/downloads/settings |
切换仅 Wi-Fi 或清晰度后,页面立即显示新值;离开再进入仍保持 |
| 3 | POST /app/downloads |
详情页/播放页点下载图标,出现授权成功或后端拒绝提示 |
| 4 | GET /app/downloads |
打开下载页后出现当前设备授权列表;无授权时显示空态 |
| 5 | GET /app/downloads/{episodeId}/url |
本批只提供 API 方法,UI 不调用;真机无可观察入口,见自动化测试 |
| 6 | POST /app/downloads/{episodeId}/progress |
本批只提供方法,不做文件落盘/进度上报;真机无可观察入口,见自动化测试 |
| 7 | DELETE /app/downloads/{episodeId} |
点单条右侧关闭图标后该授权消失,重新进入仍不存在 |
| 8 | DELETE /app/downloads |
点「清空」并二次确认后授权列表变空,重新进入仍为空 |
- 申请授权成功:进入任意可下载剧集的详情页或播放页,点下载图标(详情页右上角下载按钮, 或播放页右侧下载入口)。
预期:服务端接受时出现「下载授权已就绪。」;进入我的下载后能看到对应剧名、集号、 授权状态、任务状态、进度百分比、清晰度(后端有值时)和到期时间。
- 授予失败透传后端
message:选择付费/未解锁剧集,或把当前设备配额用满后再次申请。
预期:SnackBar 原样显示后端返回的 message,不能替换成前端自造的“付费/未解锁/配额满”判断。
只有后端没有可用 message 时才回退到「申请下载失败。」。验收时记录手机屏幕上看到的完整原文;
当前环境没有执行这一步,因此具体拒绝文案仍属未验证。
- 仅 Wi-Fi/清晰度成功:切换「仅 Wi-Fi 下载」,再选择
AUTO、720P或1080P。
预期:开关/下拉值立即变化,没有崩溃或重复选项;退出下载页再进入,值从
GET /app/downloads/policy 重新读取且保持。
- 设置失败回滚:保持下载页已加载,停止 8081,再切换仅 Wi-Fi 或清晰度。
预期:值先乐观变化,随后恢复原值,并出现「下载设置更新失败。」。
- 单删和清空。
- 点单条右侧关闭图标:预期该授权立即消失,重新进入后仍不存在。
- 停止 8081 后点另一条关闭图标:预期先消失再恢复,并提示「删除下载授权失败。」。
- 点「清空」:预期先弹出「清空下载授权?」及「这会吊销当前设备的全部下载授权。」; 点「暂不」不变,点「清空」后列表为空并显示「还没有下载授权。」。
- 停止 8081 后清空:预期列表先清空再恢复,并提示「清空下载授权失败。」。
- 状态枚举后端驱动:查看授权卡上「授权:...」「任务:...」后的文本。
预期:显示后端原值,如 ACTIVE/EXPIRED/REVOKED、
QUEUED/DOWNLOADING/PAUSED/COMPLETED/FAILED/CANCELED,前端不做中文映射或本地推算。
现有数据只可能展示实际出现的状态;其余枚举由下载 API/控制器测试覆盖,
设备侧未逐一构造全部后端状态,回执不能写成“所有状态已真机验证”。
- 三态和失败重试:后端正常时进入观察加载态;清空授权后观察空态; 停止 8081 后冷启动 App 再进入下载页,观察「下载设置加载失败。」和「重试」。 重启 8081 后点「重试」,预期策略卡和授权列表恢复。
本批不落盘、不断点续传、不提供离线播放;即使授权状态为 ACTIVE,也不能据此验收文件已下载。
解读:K2-D 的用户验收点是策略卡、8 个接口的可见结果、后端 message 透传、
仅 Wi-Fi/清晰度、单删/清空以及状态枚举原样展示。URL/进度两个接口没有本批 UI 入口,
只能由自动化测试证明方法契约;真机拒绝文案和全部状态仍未验证。
17.7 未登录 AuthGate 与失败重试
- 在「我的」页退出登录。
预期:账号回到未登录状态。
- 依次进入「我的 → 观看历史」「我的 → 我的收藏」「我的 → 下载」。
预期:三个页面都显示登录引导: 「登录后可继续」、「观看记录、收藏、评论和下载需要登录。」和「去登录」按钮; 不显示网络错误、白屏或空列表冒充无数据。
- 在未登录的详情页点收藏或在详情页/播放页点下载。
预期:出现底部登录提示;点「去登录」进入登录页,点「暂不」关闭提示且不发业务请求。
- 完成登录后返回观看历史、我的收藏或下载页。
预期:页面自动从登录引导切换到加载态,再展示对应数据;不需要杀 App 才能刷新。
- 失败重试统一检查:先让页面加载成功,再停止 8081 并冷启动 App 进入页面。
预期:记录页显示「续看进度加载失败。」、收藏页显示「收藏列表加载失败。」、 下载页显示「下载设置加载失败。」,均有「重试」按钮;重启 8081 后点「重试」能恢复, 不出现白屏或无提示的假成功。
解读:未登录时三个独立页面都应由页面级 AuthGate 接住;登录或后端恢复后应重新加载。 这些手机交互本轮未执行,不能用开发机请求代替。
17.8 测试跳过口径差异与稳定复现命令
PM 复核事实与本轮复跑结果一致:
- 8081 未启动:
flutter test呈+216 ~5,5 个 live 用例全部由markTestSkipped('客户端接口服务未启动,已跳过联调测试')跳过。 - 8081 已启动:PM 复核呈
+220 ~1,4 个 live 用例通过; 当前演示数据下live_watch_flow_test.dart仍由播放断言前的markTestSkipped('这部演示剧没有可播剧集,已跳过播放相关断言')保留 1 个跳过。 如果换了一套有可播剧集的种子数据,这个用例可能通过并呈+221 ~0;以实际输出为准。
5 个 live 用例及跳过机制:
| 文件 | 用例 | 跳过机制 |
|---|---|---|
test/integration/live_auth_test.dart |
should_surface_business_error_when_sign_in_uses_unknown_email |
捕获连接失败后 markTestSkipped('客户端接口服务未启动,已跳过联调测试') |
test/integration/live_catalog_test.dart |
should_parse_banner_and_sections_when_home_feed_is_fetched |
serverUp() 失败后 markTestSkipped('客户端接口服务未启动,已跳过联调测试') |
test/integration/live_catalog_test.dart |
should_order_episodes_by_number_and_attach_url_when_detail_is_fetched |
同上 |
test/integration/live_catalog_test.dart |
should_return_play_url_when_episode_is_playable |
同上 |
test/integration/live_watch_flow_test.dart |
should_complete_the_watch_flow_when_backend_is_running |
注册失败后跳过“服务未启动”;注册成功但无可播剧集时跳过“没有可播剧集” |
稳定复现 +216 ~5:
$ lsof -nP -iTCP:8081 -sTCP:LISTEN
(确认无输出)
$ cd /Users/jianghaifeng/Desktop/ReelShort/ReelShort
$ flutter test
00:10 +216 ~5: All tests passed!
稳定复现 +220 ~1:
# 终端 A:启动 8081 后保持运行
$ cd /Users/jianghaifeng/Desktop/ReelShort/FruitServer
$ mvn -pl fruitshorts-app-api -am package -DskipTests
$ java -jar fruitshorts-app-api/target/fruitshorts-app-api-1.0.0-SNAPSHOT.jar
# 终端 B:确认 8081 已监听后跑测试
$ curl -fsS http://127.0.0.1:8081/healthz
$ cd /Users/jianghaifeng/Desktop/ReelShort/ReelShort
$ flutter test
00:xx +220 ~1: All tests passed!
这 3 个 live 测试文件把地址硬编码为 http://127.0.0.1:8081,不读取
--dart-define=API_BASE_URL。因此复现测试口径必须在同一台 Mac 上启动 8081,
手机同一局域网只用于真机 App 验收,不能替代这里的环回联调。
本轮没有改这 3 个测试文件或产品代码。
解读:~5 与 ~1 的差异来自 8081 是否启动,不是测试代码漂移;
~1 还是当前演示数据下播放断言前的跳过,不能把 ~5 误报成 5 个失败。
17.9 提交作者口径差异登记
叙述:已发生的历史提交不改写,不回滚,不 force push。下面用原始 Git 输出登记事实。
$ git show -s --format='%H%n author: %an <%ae>%n committer: %cn <%ce>%n subject: %s' cc4d7c5
cc4d7c5a9dc6a4f6f0565a32503cce5973af703c
author: Zhou Weidong <502333560@qq.com>
committer: Zhou Weidong <502333560@qq.com>
subject: feat(flutter): 接入分类记录收藏与下载授权
$ git show -s --format='%H%n author: %an <%ae>%n committer: %cn <%ce>%n subject: %s' 45f5f25
45f5f25640a274edb51bd90b3b5e52c43ba9d9cd
author: Zhou Weidong <502333560@qq.com>
committer: Zhou Weidong <502333560@qq.com>
subject: merge: 合并 K2 客户端分类记录收藏与下载授权
差异口径与最终裁定:
- specs 规范要求提交作者统一为
Zhou Weidong <502333560@qq.com>,上述两个历史提交按此口径产生。 - 用户曾口头要求使用
jianghaifeng <haifeng_hello@163.com>;该口径已作废,不再作为后续提交依据。 - 两个历史提交均已 push 到
develop;保留原始历史,不通过回滚或 force push 改写,不动main。 - 已裁定:后续提交统一使用
Zhou Weidong <502333560@qq.com>,author 与 committer 均按此口径。 - 本回执提交
cfce77a曾误用jianghaifeng <haifeng_hello@163.com>/trae-solo-agent <solo-agent@trae.ai>,现已通过 amend 修正为Zhou Weidong <502333560@qq.com>;amend 后最终提交号以本轮git log -2原始输出为准。
解读:提交作者差异是已发生事实,已推送的历史提交不通过回滚或 force push 改写; jianghaifeng 口径作废,后续统一使用 Zhou Weidong,本回执提交已通过 amend 校正。
17.10 仍未验证的边界
- 设备侧业务取证由用户执行,Codex 未执行;本轮没有手机屏幕截图、设备日志或手机到 8081 的连接证据。
- 具体后端拒绝
message原文尚未在真机触发并记录。 - 8 个下载接口中,
GET /app/downloads/{episodeId}/url与POST /app/downloads/{episodeId}/progress本批没有 UI 调用入口,只有自动化 API 契约测试。 ACTIVE/EXPIRED/REVOKED与QUEUED/DOWNLOADING/PAUSED/COMPLETED/FAILED/CANCELED只验证“前端展示后端原值”的机制;没有逐一构造全部状态做真机验收。- 文件分片落盘、断点续传、离线播放、
licenseKey本地校验不在 K2 范围,仍未实现,也不能验收。 - 收藏接口没有分页参数,本批按全量列表验收,不验收服务端分页。
- 搜索契约没有接口,本批不验收搜索。
2026-10-17 K3-A 评论实施(【Codex】)
叙述:按 K3 任务书先补计划文档基线,再按评论 API/controller/UI 顺序做 TDD。 首轮测试在实现前运行,用于确认红灯;实现后运行同一组定向测试转绿。
18.1 计划文档
命令:使用补丁工具增量更新 docs/plans/2026-10-17-K3.md。
原始结果:
Success. Updated the following files:
M /Users/jianghaifeng/Desktop/ReelShort/FruitServer/docs/plans/2026-10-17-K3.md
解读:保留既有 K3 计划,仅补记 ReelShort 45f5f25、FruitServer a0156ee
和计划文件未跟踪的实测基线,没有覆盖已有内容。
18.2 K3-A 首次红灯
命令:
$ cd /Users/jianghaifeng/Desktop/ReelShort/ReelShort
$ flutter test test/comment/comment_api_test.dart test/comment/comment_controller_test.dart
原始输出(节选):
Error when reading 'lib/core/data/remote/comment_api.dart': No such file or directory
Error when reading 'lib/core/data/models/comment.dart': No such file or directory
Error when reading 'lib/core/data/services/comment_controller.dart': No such file or directory
00:00 +0 -2: Some tests failed.
解读:生产 API、模型和 controller 尚不存在,红灯原因符合预期。
18.3 K3-A 数据层绿灯
命令:实现评论模型、API、仓库和 controller 后,重跑同一组定向测试。
原始输出:
00:00 +9: All tests passed!
解读:评论游标分页、String ID、发布回复、替换内容、敏感词 BLOCK message、 删除成功与失败回滚均通过。
18.4 K3-A UI 红灯与绿灯
首次运行:
$ flutter test test/comment/drama_comments_sheet_test.dart
ProviderNotFoundException: Could not find the correct Provider<EngagementController>
00:00 +0 -5: Some tests failed.
解读:旧弹窗仍直接依赖本地 EngagementController,符合 UI 红灯预期。
替换为服务端 controller、三态和回复输入后:
00:01 +5: All tests passed!
随后运行整个评论测试目录:
$ flutter test test/comment
00:01 +14: All tests passed!
解读:API、controller 和弹窗测试共 14 项全部通过。
18.5 K3-A 静态分析
首次分析:
info - lib/core/data/remote/comment_api.dart:23:9 - use_null_aware_elements
info - lib/core/data/remote/comment_api.dart:24:9 - use_null_aware_elements
2 issues found.
按 lint 改为 null-aware map value 后:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
解读:K3-A 达到零告警口径。真机交互未执行,设备侧取证仍由用户完成。
18.6 K3-B 点赞红灯
命令:
$ cd /Users/jianghaifeng/Desktop/ReelShort/ReelShort
$ flutter test test/interaction test/comment/drama_comments_sheet_test.dart
原始输出(节选):
Error when reading 'lib/core/data/services/interaction_controller.dart': No such file or directory
Method not found: 'InteractionController'.
00:01 +8 -1: Some tests failed.
解读:互动 API 已先通过,缺失的剧集点赞 controller 构成 K3-B 红灯。
18.7 K3-B 绿灯
实现 InteractionController、替换播放页右栏、去掉本地互动演示层后:
$ flutter test test/interaction test/comment/drama_comments_sheet_test.dart
00:01 +11: All tests passed!
补齐评论点赞成功/回滚和整机 AuthGate 断言后:
$ flutter test test/comment/comment_controller_test.dart test/widget_test.dart
00:04 +23: All tests passed!
静态分析:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
解读:剧集与评论点赞均使用服务端结果校准;失败会回滚;未登录点剧集赞会打开 AuthGate 且仓库调用次数为 0。剧集点赞数字未展示,符合契约缺口降级方案。
18.8 K3-C 举报红灯
命令:
$ cd /Users/jianghaifeng/Desktop/ReelShort/ReelShort
$ flutter test test/interaction/report_dialog_test.dart test/comment/drama_comments_sheet_test.dart test/widget_test.dart
原始输出(节选):
Error when reading 'lib/pages/interaction/widgets/report_dialog.dart': No such file or directory
Found 0 widgets with key [<'comment-menu-10'>]
Found 0 widgets with key [<'detail-more'>]
00:05 +21 -5: Some tests failed.
解读:举报弹窗、评论更多菜单和详情页更多菜单均尚未实现,红灯符合 K3-C 范围。
18.9 K3-C 绿灯
实现固定五项 SPAM/ABUSE/PORN/AD/OTHER 单选、可选描述、评论与短剧举报入口后:
$ flutter test test/interaction/report_dialog_test.dart test/comment/drama_comments_sheet_test.dart test/widget_test.dart
00:05 +26: All tests passed!
解读:举报原因与描述提交、评论举报成功、重复举报 message 透传、未登录 AuthGate 和详情页举报短剧均通过。
18.10 K3-C 静态分析
首次分析:
info - lib/pages/drama_detail/drama_detail_view.dart:319:42 - use_build_context_synchronously
info - lib/pages/drama_detail/drama_detail_view.dart:321:26 - use_build_context_synchronously
info - lib/pages/drama_detail/drama_detail_view.dart:327:26 - use_build_context_synchronously
3 issues found.
改为 State 自身 context + mounted 守卫后:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
解读:举报实现达到零告警口径。
18.11 K3-D 分享回归
命令:
$ cd /Users/jianghaifeng/Desktop/ReelShort/ReelShort
$ flutter test test/core/platform_share_service_test.dart test/formatting/localized_content_test.dart test/widget_test.dart
原始输出:
00:05 +25: All tests passed!
解读:系统分享文本保持“标题 → 简介 → footer”顺序;en/zh/id 三语均生成
非空标题、简介和 FruitShorts footer;播放页分享入口回归通过。
18.12 代码规模红线修正
提交前检查命令:
$ wc -l lib/pages/player/widgets/drama_comments_sheet.dart
535 lib/pages/player/widgets/drama_comments_sheet.dart
解读:主弹窗超过单文件 500 行红线。将评论条目与交互回调拆到
comment_tile.dart 后:
$ wc -l lib/pages/player/widgets/drama_comments_sheet.dart lib/pages/player/widgets/comment_tile.dart
396 lib/pages/player/widgets/drama_comments_sheet.dart
149 lib/pages/player/widgets/comment_tile.dart
拆分后复跑互动定向测试:
00:06 +51: All tests passed!
解读:行为未回归,两个文件均低于 500 行。
18.13 最终门禁
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:11 +241 ~1: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'... 6.8s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:唯一跳过项是既有 live watch 用例,因客户端接口服务未启动而按测试机制跳过。 真机/设备侧集成、截图、设备日志仍未执行。
18.14 Git 合并与推送
ReelShort 功能提交:
d361034226ec2bc431548d45068dc60046e5e473
author: Zhou Weidong <502333560@qq.com>
committer: Zhou Weidong <502333560@qq.com>
subject: feat(flutter): 接入互动评论点赞举报
--no-ff 合并提交:
9db6935308e65342be46c81419c2992ed2df1df0
author: Zhou Weidong <502333560@qq.com>
committer: Zhou Weidong <502333560@qq.com>
subject: merge: 合并 K3 客户端互动能力
推送:
To http://git.reelshort2.com/jianghaifeng/ReelShort.git
45f5f25..9db6935 develop -> develop
解读:K3 已合并到 ReelShort develop 并推送,未操作 main。
18.15 本人评论举报错误透传补充修复
逐条复核任务书时发现:本人评论的更多菜单原先只提供删除,无法触发 “不能举报自己发布的内容”这一后端 message。先补红灯用例,再让菜单始终提供 “举报评论”,本人评论额外提供“删除评论”。
红灯:
$ flutter test test/comment/drama_comments_sheet_test.dart --plain-name should_show_backend_message_when_reporting_own_comment
Found 0 widgets with text "Report comment"
00:00 +0 -1: Some tests failed.
修复后:
00:00 +1: All tests passed!
最终重跑:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:12 +242 ~1: All tests passed!
$ flutter build apk --debug
✓ Built build/app/outputs/flutter-apk/app-debug.apk
修复提交:
1488ee8f85671de96c70347c1b17fb9c4556bd88
fix(flutter): 透传举报本人评论错误
--no-ff 合并提交:
e1147cfcbabcdf457e427bbd118c32d37f8d9b15
merge: 合并 K3 举报错误透传修复
推送:
9db6935..e1147cf develop -> develop
解读:报告本人内容现在会把后端错误原样展示;author/committer 均保持统一。
2026-10-17 K5 克莱因蓝主题与印尼语适配(【Codex】)
19.1 诊断分支收口
叙述:上一项 iOS 首页诊断插桩已提交在独立分支,不并入 K5,也不阻塞干净基线。
$ git status --short --branch
## feature/flutter-ios-home-diagnostics
$ git log -1 --oneline
7efbed9 chore(flutter): 增加首页加载失败诊断日志
解读:诊断提交保留为未合并 feature 分支;K5 从 develop e1147cf 新建,
后续所有 K5 改动均在该基线上。
19.2 K5 计划
叙述:先写 docs/plans/2026-10-17-K5.md,记录方案 A 色值、影响文件、TDD、
风险和待确认,再开始代码。
Success. Updated the following files:
A docs/plans/2026-10-17-K5.md
19.3 K5 首次红灯
命令:
$ flutter test test/theme test/config/locale_controller_test.dart test/mine/mine_logic_test.dart test/widget_test.dart
原始输出(节选):
Error when reading 'lib/core/theme/app_theme.dart': No such file or directory
Member not found: 'bluePressed'
Member not found: 'onPrimary'
Method not found: 'resolveAppLocale'
Found 0 widgets with text "Bahasa Indonesia"
Expected: empty
Actual: [
'lib/core/theme/app_colors.dart:5: static const blue = Color(0xFF2F7BFF);',
...
]
00:07 +22 -5: Some tests failed.
解读:主题 token/ThemeData、locale 解析、语言选项和旧蓝扫描全部按预期红灯。
19.4 K5 实现与定向绿灯
实现内容:
AppColors新增bluePressed/onPrimary,更新blue/blueSoft。- 新增
AppTheme.light/dark显式 ColorScheme 和控件主题。 - 页面旧蓝清理,深色高亮改
blueSoft,大面积选中态改bluePressed。 resolveAppLocale支持 en/zh/id,未知系统语言回退 id。- 两个语言入口增加 Bahasa Indonesia;快捷抽屉改 Wrap。
- 日期/时间改用
MaterialLocalizations。
定向测试:
$ flutter test test/theme test/config test/formatting test/mine/mine_logic_test.dart test/widget_test.dart test/auth test/library test/watch test/download test/drama_detail
00:08 +97: All tests passed!
旧蓝扫描补跑:
$ rg -n '0xFF2F7BFF|0xFF8FB4FF|Colors\.blue|_orange|seedColor' lib -g '*.dart'
结果:无匹配(仅保留 AppColors.blue/blueSoft/bluePressed 等 token 引用)。
19.5 K5 最终门禁
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:12 +251 ~1: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'... 26.6s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:全量测试除既有 live watch 跳过外全部通过,APK 构建成功。
19.6 Git
10d448c8ba93aa2762e14babdb528805897b3992
author: Zhou Weidong <502333560@qq.com>
committer: Zhou Weidong <502333560@qq.com>
subject: feat(flutter): 应用克莱因蓝主题与印尼语适配
e52d81881c19202c7adc8d13a6f78f78e4f6182f
author: Zhou Weidong <502333560@qq.com>
committer: Zhou Weidong <502333560@qq.com>
subject: merge: 合并 K5 克莱因蓝主题与印尼语适配
To http://git.reelshort2.com/jianghaifeng/ReelShort.git
e1147cf..e52d818 develop -> develop
解读:K5 已以 --no-ff 合并到 ReelShort develop 并推送,未操作 main。
2026-10-17 K6 登录页、底部导航与震动反馈(【Codex】)
20.1 K6 计划与 UI 红灯
叙述:先写 docs/plans/2026-10-17-K6.md,再基于 K5 develop e52d818
创建 feature/flutter-k6-auth-nav-ui。首轮登录/底栏测试在实现前运行:
$ flutter test test/auth/auth_page_test.dart test/widget_test.dart
Found 0 widgets with text "FruitShorts"
Found 0 widgets with key [<'auth-email'>]
Expected: Color(... #101114)
00:07 +22 -5: Some tests failed.
解读:品牌区、表单 Key/显隐/焦点、底栏主题样式尚未实现,红灯符合任务范围。
20.2 K6 UI 绿灯
实现登录品牌区、autofill、密码显隐、next/done、busy 禁用、主题错误色、 Small screen 滚动和底部导航主题胶囊后:
$ flutter test test/auth test/home/home_nav_ui_test.dart test/widget_test.dart test/config/l10n_id_test.dart test/theme
00:06 +42: All tests passed!
提交:e609e3a feat(flutter): 优化登录页与底部导航。
20.3 Haptics 补充需求红灯
FruitServer 93af19e 新增 K6-C 点击震动反馈。补 fake Haptics 和触发测试后:
Error when reading 'lib/core/platform/haptics.dart': No such file or directory
No named parameter with the name 'haptics'
00:02 +1 -4: Some tests failed.
解读:Haptics 抽象、Provider 注入与页面触发尚未实现。
20.4 Haptics 实现与定向绿灯
新增 Haptics + FlutterHaptics,通过 Provider 注入;tab selection、
关键操作 light、危险确认 medium;默认实现吞掉平台异常,页面调用全部
unawaited。新增 fake/静态扫描/异常静默测试。
$ flutter test test/core/haptics_test.dart test/core/haptics_scan_test.dart test/auth test/home/home_nav_ui_test.dart test/comment test/watch test/download test/library test/drama_detail test/player
00:05 +98: All tests passed!
提交:8a481d5 feat(flutter): 增加关键操作震动反馈。
20.5 K6 最终门禁
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:14 +263 ~1: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'... 6.6s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:震动反馈、登录页、底栏和存量测试全部通过;~1 为既有 live watch 跳过。
20.6 Git
e609e3a feat(flutter): 优化登录页与底部导航
8a481d5 feat(flutter): 增加关键操作震动反馈
0cedaab merge: 合并 K6 登录导航与震动反馈
To http://git.reelshort2.com/jianghaifeng/ReelShort.git
e52d818..0cedaab develop -> develop
解读:K6 已合并并推送,author/committer 均为 Zhou Weidong,未操作 main。
20.7 iOS Xcode SPM 构建修复(K6 收尾)
叙述:只修改 Runner.xcscheme PreActions。新增 Python 无关的 shell
兜底链解析 Flutter,先 flutter pub get;原 prepare action 保留,并改为
同一路径解析后执行 xcode_backend.sh prepare。
XML 校验:
$ xmllint --noout ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
(无输出,退出码 0)
清理 ephemeral 后直接 xcodebuild:
$ rm -rf ios/Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage
$ xcodebuild -project ios/Runner.xcodeproj -scheme Runner -configuration Debug -sdk iphoneos build
Resolve Package Graph
the package at '.../FlutterGeneratedPluginSwiftPackage' cannot be accessed
xcodebuild: error: Could not resolve package dependencies
解读:Xcode 在运行 scheme PreActions 之前先解析 Package Graph,因此 “包目录完全不存在”的首次冷启动无法仅靠 scheme PreAction 自动生成。 这是 Xcode 执行顺序限制,不是 XML 语法错误。
使用 flutter pub get 恢复包后:
$ flutter pub get
Got dependencies!
$ xcodebuild -list -project ios/Runner.xcodeproj
Resolved source packages:
FlutterGeneratedPluginSwiftPackage: .../ios/Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage
...
完整重建精简日志:
$ xcodebuild -project ios/Runner.xcodeproj -scheme Runner -configuration Debug -sdk iphoneos build
Resolve Package Graph
Resolved source packages:
Run pre-actions
export SCHEME_ACTION_NAME="Bootstrap Flutter SPM Package"
Resolving dependencies...
Got dependencies!
** BUILD SUCCEEDED **
解读:SPM 包存在时,PreAction 能成功刷新依赖,prepare 和完整 iPhoneOS
Debug 构建通过并完成签名。冷启动自动生成未通过验证,用户仍需在
新克隆/flutter clean/手动删除 ephemeral 后先运行 flutter pub get。
Git:
cc037a2956848128c4899df1f5092fea44d3620b
fix(ios): 刷新 Flutter SPM 包后再准备框架
0cedaab..ac706a4 develop -> develop
解读:scheme 修复已合并推送;author/committer 均为 Zhou Weidong。
20.8 K6 导航白线与观看历史缺陷修复
导航白线
首次红灯:
Expected: a value less than <0.2>
Actual: <1.0>
解读:当前深色 ColorScheme 默认 outlineVariant 实为白色,确认了白线根因。
修复:新增 light/dark outline token,两个 ColorScheme 显式设置
outline/outlineVariant;导航边框继续使用主题 token。
观看历史真实诊断
后端日志:
2026-10-17T16:35:22.816+08:00 POST /app/auth/register 耗时 242ms
2026-10-17T16:35:37.123+08:00 POST /app/watch/progress 耗时 51ms
数据库只读查询:
uid | drama_id | episode_id | position_ms | duration_ms
UKZBA9IBE | 1 | 1 | 1522 | 91326
UKZBA9IBE | 5 | 7 | 0 | 227880
真实 recent 响应:
{"code":0,"message":"ok","data":[
{"dramaId":"5","episodeId":"7",...},
{"dramaId":"1","episodeId":"1",...}
]}
临时直连 controller 诊断:
watch-records-diagnostic error=null records=2
record drama=5 episode=7 detail=闪婚后,傅先生每天都在撒糖 loading=false failed=false
record drama=1 episode=1 detail=替嫁新娘:总裁的掌心宠 loading=false failed=false
解读:真实用户同类数据在 API、JSON 解析、controller 和详情补取链路均正常, 未复现设备侧 401/100000、解析异常或详情失败。后端日志中的 429 仍属于 其他联调设备,用户 watch 请求没有该错误。
确认的客户端缺陷是 controller 吞掉真实异常:
Expected: '账号不存在,请先注册'
Actual: 'progressError'
修复:debug 打印异常类型、原文与堆栈;ApiException message 透传页面错误态。
定向与全量门禁
$ flutter test test/theme test/home/home_nav_ui_test.dart test/watch/watch_records_controller_test.dart test/watch/watch_records_page_test.dart
00:01 +21: All tests passed!
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:13 +266 ~1: All tests passed!
$ flutter build apk --debug
✓ Built build/app/outputs/flutter-apk/app-debug.apk
Git
732483465ced2b28438585a4b2f1573e9a0529cb
fix(flutter): 修复导航白线与观看记录错误透传
ac706a4..b7b1c50 develop -> develop
解读:修复已合并推送;用户设备特定 error 仍需设备日志确认。
2026-10-17 K7 首页轮播与站内通知(【Codex】)
21.1 K7 计划与首次红灯
叙述:先写 docs/plans/2026-10-17-K7.md,从干净 develop b7b1c50
创建 feature/flutter-k7-carousel-notices。
首次轮播/通知测试:
No named parameter with the name 'active'
Error when reading 'lib/core/data/models/notice.dart': No such file or directory
Error when reading 'lib/core/data/remote/notice_api.dart': No such file or directory
00:00 +0 -3: Some tests failed.
解读:轮播增强、通知数据层和页面尚不存在,红灯符合预期。
21.2 轮播绿灯
实现 Timer、交互暂停、active/TickerMode、圆点、失败占位与语义后:
$ flutter test test/discover/cover_carousel_test.dart
00:00 +7: All tests passed!
21.3 通知实现与定向绿灯
实现 Notice model/API/repository/controller/Page、我的页入口和三语文案后, 真实匿名接口返回:
$ curl -sS 'http://127.0.0.1:8081/app/notices?pageIndex=1&pageSize=20'
{"code":0,"message":"ok","data":{"total":0,"list":[]}}
通知与轮播定向测试:
$ flutter test test/discover/cover_carousel_test.dart test/notice
All tests passed!
期间修正 320px 下类型/时间同一行 3.5px 溢出,改为双 Flexible。
21.4 K7 最终门禁
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:14 +284 ~1: All tests passed!
$ flutter build apk --debug
✓ Built build/app/outputs/flutter-apk/app-debug.apk
21.5 Git
b870956665f5268070c691533cc2a334f2aa7f59
feat(flutter): 增加轮播自动播放与站内通知
b7b1c50..3e8703b develop -> develop
解读:K7 已合并推送;author/committer 均为 Zhou Weidong。
2026-10-17 K7 真机缺陷修复:观看历史 Provider 与首页轮播数据源
22.1 范围与分支
叙述:用户真机验收后报告观看历史仍报错、首页轮播仍不显示。本轮只修客户端
Provider 注册与首页轮播数据源,不改后端、Web、specs 或既有发现页分区逻辑。
ReelShort 从 develop 3e8703b 拉
fix/flutter-home-watch-provider-banners;FruitServer 从 develop 9c6aaed
拉 docs/flutter-home-watch-device-fix,本仓库只改 docs/plans/PROGRESS.md。
22.2 先红:复现设备报告
真实 LumaDramaApp Provider 树打开「我的 -> 观看历史」:
ProviderNotFoundException:
Could not find the correct Provider<CatalogRepository>
above this _WatchRecordsBody Widget
首页 feed 返回 2 条 banner、discover feed 返回 0 条 banner:
Expected: exactly one matching candidate
Actual: Found 0 widgets with type "CoverCarousel"
解读:两处红灯分别复现了用户报告的 Provider 缺失和轮播为空。
22.3 修复
lib/app.dart在现有 Repository Provider 附近注册Provider<CatalogRepository>.value(value: _catalogRepository),与CatalogController共用同一实例。lib/pages/discover/discover_view.dart改为监听CatalogController.feed.banners,修复后首页 tab 使用/app/home/feed的 banners;发现页分区仍使用CategoryController,没有新增接口。- 新增
test/watch/watch_history_provider_test.dart:在真实 Provider 树打开 观看历史,断言不抛错并展示空态。 - 新增
test/discover/home_banner_source_test.dart:home banners 为 2、 discover banners 为空时,断言渲染两个圆点、首图显示且 4.5 秒后自动切到次图。
22.4 门禁原始输出
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test test/watch/watch_history_provider_test.dart test/discover/home_banner_source_test.dart
00:01 +2: All tests passed!
$ flutter test test/discover/cover_carousel_test.dart test/watch/watch_records_page_test.dart
00:00 +12: All tests passed!
$ flutter test
00:16 +286 ~1: All tests passed!
解读:完整套件 286 项通过,1 项联调测试因客户端接口服务未启动按设计跳过;
输出中的 [WatchRecordsController] ... 异常堆栈来自故意注入失败的既有测试。
22.5 Git
5058853 fix(flutter): 注册目录仓库并修正首页轮播数据源
6cc5bfc merge: 合并首页轮播与观看历史真机修复
3e8703b..6cc5bfc develop -> develop
修复提交与合并提交的 author/committer 均为
Zhou Weidong <502333560@qq.com>。
22.6 用户真机验证步骤与预期
以下设备侧取证由用户执行,开发机测试不能替代真机证据。
- 使用最新
develop重新构建并安装,登录用户设备d-mvc33zh5-pemv3e。 预期:flutter run终端不再出现ProviderNotFoundException。 - 打开「我的 -> 观看历史」。 预期:页面正常打开;有历史时显示剧目与进度,无历史时显示空态,不再进入 Provider 错误页。
- 回到发现页并等待首页 feed 加载完成。
预期:顶部轮播显示后端
/app/home/feed返回的 2 张 banner,底部有两个圆点。 - 等待 4.5 秒。 预期:轮播自动切到第 2 张;手动拖动后仍可从当前页继续自动轮播。
设备侧截图、日志与最终验收结论由用户执行。
37. K21 登录页 UI 优化
37.1 基线与布局
ReelShort: e44fbdf style(ui): 合并 K20 客户端视觉统一
FruitServer: af28161 docs(plans): 下发 K21 登录页 UI 优化任务
计划先提交为 0e3ddfc docs(plans): 增加 K21 登录页实施计划。
布局由顶部对齐 + ListView 改为:
LayoutBuilder + SingleChildScrollView + ConstrainedBox + Center;- 正常高度品牌与卡片垂直居中;
- 高度小于 720 时使用紧凑横向品牌,保证 600 高测试视口与提交按钮可达;
- 返回按钮改为
Positioned + SafeArea浮层,不占内容流; - 小屏键盘仍保留
28 + viewInsets.bottom底部 padding,可滚动到auth-submit。
37.2 品牌与文案
auth-brand-mark改用assets/icon/splash_mark.png,尺寸仍为 48×48。- 品牌名 26/w800,tagline 14/blueSoft;正常视口居中竖排。
- 登录使用现有
authSubtitle;注册新增authSignUpSubtitle:
en: Create an account to keep your list, history, and progress.
zh: 创建账号,保存你的片单、观看记录和进度。
id: Buat akun untuk menyimpan daftar, riwayat, dan progresmu.
- 注册态密码框下显示
authPasswordHint,Keyauth-password-rule;登录态隐藏。
37.3 字段错误与交互
AuthLogic 新增 fieldError,validate() 记录具体字段错误,输入变化或切换模式时清除。
邮箱/密码字段增加 semantic error 红框:
errorBorder / focusedErrorBorder
color = colorScheme.error
width = 1.5
同时:
_submit()busy 首行短路;- 异步 catch 的
setState前判断 mounted; - 密码框 IME done 提交同样经过 busy 短路;
- 提交按钮增加 alpha 0.22 的辣椒红轻阴影,背景色与按下色不变。
37.4 保留项
auth-brand-mark 48x48
auth-card radius 20 / border outlineVariantDark / width 1
input height 52 / radius 14 / fill bar / focus blue 1.5
submit height 52 / radius 26 / blue / bluePressed
auth-enter-animation 220ms / tween 0 -> 1
mode keys, title copy, hidden compatibility copy
error capsule radius 12 / alpha 0.1 / semantic color
320x568 + keyboard 260 scroll reachability
主 glow 颜色 alpha 保持 ≤0.18;新增 warm glow Key
auth-background-warm-glow,alpha 上限 0.06。
37.5 TDD 与门禁
新增 test/auth/auth_k21_test.dart,先红灯后转绿:
$ flutter test test/auth/auth_k21_test.dart
00:00 +2: All tests passed!
全部 Auth 测试:
$ flutter test test/auth/auth_visual_test.dart \
test/auth/auth_page_test.dart test/auth/auth_k21_test.dart
00:01 +17: All tests passed!
全量门禁:
$ dart analyze lib test
No issues found!
$ flutter test
00:24 +343: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'... 7.5s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
37.6 Git
8a96f34 feat(auth): 优化登录页布局与字段反馈
b1c69e2 feat(auth): 合并 K21 登录页优化
e44fbdf..b1c69e2 develop -> develop
author/committer 均为 Zhou Weidong <502333560@qq.com>。
37.7 用户真机验收
设备侧取证由用户执行:
- 普通手机竖屏打开登录页:品牌 hero 与卡片垂直居中,返回键为顶部浮层。
- 切换注册:副标题变为注册文案,密码框下出现规则提示。
- 提交空邮箱:邮箱出现 1.5px 红色边框,错误胶囊仍保留。
- 输入非法邮箱后修改:字段红框清除。
- 输入弱密码:密码框变红,规则提示仍在。
- 连续点提交或按键盘 Done:只发出一次请求,busy 时按钮与模式切换禁用。
- 320×568 小屏弹出键盘:滚动后提交按钮可点击。
- 检查主辣椒红 glow、暖色副 glow 均淡且不影响文字对比度。
- 检查品牌图为
splash_mark.png,显示 48×48,无拉伸。
36. K20 客户端视觉统一
36.1 基线与计划
ReelShort: 42ce1d1 fix(account): 合并网络异常文案修复
FruitServer: 810d9fc docs(plans): 下发 K20 客户端视觉统一任务
计划先提交为 3435784 docs(plans): 增加 K20 视觉统一实施计划。
客户端从干净 develop 创建 feature/flutter-k20-visual。
36.2 统一 Token
新增 lib/core/theme/app_dimens.dart:
页面边距 16
卡片圆角/内边距 16/16
内嵌块圆角/内边距 12/12
胶囊圆角 20
caption/body/list/section/page = 12/14/15/16/20
详情标题 24
导航标签 11
主按钮/整页主操作 = 48/52
点击区 44
导航高度/图标 = 64/22
进度条高度/圆角 = 4/4
账号卡高度/图标/标签 = 64/18/11
观看占位高度 114
AppColors.favorite = #D74A7D;主色继续使用辣椒红 #C4322A。
36.3 十四项实现
- 新增
AppBottomNav/AppBottomNavItem,替换 home、discover、mine、 player fallback 四处导航;保留tab-home等既有 Key。 - 账号入口卡改为 64 高、18 图标、11 标签和 44 以上点击区。
- 清理全部 9.5/10 业务字号,任务书列出的 11 字号提升至 12。
- 页面边距、卡片圆角、内边距和列表间距按 token 收敛。
- 任务书列出的硬编码颜色替换为
AppColors;收藏红心使用favorite。 - 详情、记录、下载进度条统一 4 高、4 圆角、blueSoft/white24。
- Filled/OutlinedButton 最小高度 48;empty 重试色改 blueSoft。
- 页面标题 20/w800,详情标题 24,区块与列表标题按 token。
themeMode = ThemeMode.dark;根节点统一状态栏和系统导航栏颜色。- 8 个独立列表页补底部安全区。
- 详情加载/失败分支补 AppBar,封面顶部加黑色渐变,边距 24→16。
- 点赞/收藏选中态改实心图标;分类与 my tabs 补 selected 语义。
- HeaderPill、LoginButton、分类 Chip 点击区补到 44。
- 观看记录加载占位改为 114,并复用 12 内边距。
36.4 既有断言兼容
首轮回归发现两项既有断言与通用 token 冲突:
Auth card radius expected 20, actual 16
EmptyState subtitle expected 12.5, actual 12
EmptyState action expected 13, actual 14
按“不改测试断言”要求保留为显式 token 例外:
authCardRadius = 20
emptyStateSubtitle = 12.5
emptyStateAction = 13
其余通用卡片仍为 16,正文 caption 仍为 12。
36.5 门禁
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:24 +341: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'... 7.8s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
36.6 Git
df5fbe5 feat(ui): 增加视觉 token 与统一导航
c5bfd00 style(ui): 统一页面字号间距与状态样式
5f1df40 fix(ui): 保留空态既有字号口径
e44fbdf style(ui): 合并 K20 客户端视觉统一
42ce1d1..e44fbdf develop -> develop
提交 author/committer 均为 Zhou Weidong <502333560@qq.com>。
36.7 用户真机验收
设备侧取证由用户执行:
- 首页底部导航:检查 64 高、22 图标、11 标签、主色胶囊选中态和四个原 Key。
- 发现页:检查三处导航一致,分类 Chip 点击区 44、选中语义和 header 按钮高度。
- 我的页:检查账号卡 64 高、四入口可点,菜单/语言入口仍在首屏可用。
- 详情页:检查返回按钮可读、封面顶部渐变、24 标题、16 边距、进度条 4 高。
- 观看记录:检查加载占位 114、真实卡片 12 padding、进度条和 12 以上辅助文本。
- 下载页:检查策略卡、授权卡、12 圆角、进度条和安全区。
- 公告/收藏/账号中心:检查卡片 12/16 圆角、正文 ≥12、底部安全区。
- 播放器抽屉与右侧栏:检查点赞/收藏选中实心图标,fallback 导航与其他页一致。
- 浅色封面详情页:确认返回/更多图标因顶部黑色渐变保持可读。
- Android 系统栏:确认状态栏浅色图标、导航栏为
AppColors.bar。
35. K19 非 ApiException 网络文案修复
35.1 缺陷与修复
Trae 复核发现,账号中心三个逻辑类在断网、超时等非 ApiException
失败时,把内部哨兵键直接交给 errorText,会原样上屏:
accountProfileLoadFailed
accountProfileSaveFailed
accountDevicesLoadFailed
accountExportLoadFailed
修复严格沿用既有 errorText 约定:
- 非
ApiException统一置networkError; ApiException.message继续原样透传;- 未修改
errorText映射表; - 未修改既有测试断言。
修改位置:
ReelShort/lib/pages/account/account_profile_logic.dart
ReelShort/lib/pages/account/account_devices_logic.dart
ReelShort/lib/pages/account/account_export_logic.dart
35.2 TDD 与定向测试
先给 FakeAccountRepository 增加通用异常开关,并新增四个页面测试。
修复前红灯:
00:01 +4 -4: Some tests failed.
should_show_localized_network_copy_when_profile_load_fails
should_show_localized_network_copy_when_profile_save_fails
should_show_localized_network_copy_when_devices_fail
should_show_localized_network_copy_when_export_fails
修复后定向测试:
$ flutter test test/account/account_pages_test.dart
00:01 +8: All tests passed!
四个用例分别使用中文、英文、印尼语当前语言环境,断言上屏
l10n.networkError,且不出现内部哨兵键。
35.3 最终门禁
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:23 +339: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'... 7.2s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
35.4 Git
27ab7ce fix(account): 本地化网络异常文案
42ce1d1 fix(account): 合并网络异常文案修复
9b3ab9d..42ce1d1 develop -> develop
提交 author/committer 均为 Zhou Weidong <502333560@qq.com>。
35.5 用户验证建议
设备侧取证由用户执行:
- 登录后断开手机网络,打开「个人资料」。
预期:显示当前语言的网络异常文案,不出现
accountProfileLoadFailed。 - 恢复网络后修改昵称,再断网保存。
预期:显示当前语言的网络异常文案,不出现
accountProfileSaveFailed。 - 断网打开「登录设备」。
预期:显示当前语言的网络异常文案,不出现
accountDevicesLoadFailed。 - 断网打开「数据导出」。
预期:显示当前语言的网络异常文案,不出现
accountExportLoadFailed。
34. K19 客户端账号中心
34.1 基线与实施范围
基线确认:
ReelShort: 7d68699 fix(config): 合并开发默认服务器地址
FruitServer: 5c93ba9 docs(plans): 下发 K19 账号中心接口对接任务
计划文档先提交为 6b5e70e docs(plans): 增加 K19 账号中心实施计划。
客户端从干净 develop 创建 feature/flutter-k19-account,只对接:
GET /app/me
PUT /app/me
GET /app/me/devices
GET /app/me/export
POST /app/me/deactivate
POST /app/me/deactivate/cancel
接口口径以后端实际代码为准:设备直接返回实体数组;导出返回
profile / credentials / consents / devices;注销请求只发送 reason。
34.2 TDD 与实现
先用不存在的 AccountApi/AccountProfile 跑红灯,确认测试在实现前失败:
Error: Error when reading 'lib/core/data/remote/account_api.dart':
No such file or directory
Some tests failed.
第一批实现后:
$ flutter test test/account/account_api_test.dart
00:00 +7: All tests passed!
登录态同步先红灯:
Error: The method 'applyProfile' isn't defined for the type 'AuthController'.
实现 applyProfile(AuthUser) 后:
00:00 +1: All tests passed!
逻辑层覆盖资料保存回调、设备读取、导出复制、注销清会话和撤销失败文案:
$ flutter test test/account/account_logic_test.dart
00:00 +5: All tests passed!
页面与入口先红灯,随后用稳定 Key 实现:
$ flutter test test/account/account_pages_test.dart \
test/account/mine_account_entry_test.dart
00:01 +6: All tests passed!
实现文件:
lib/core/data/remote/account_api.dart
lib/core/data/models/account_profile.dart
lib/core/data/models/account_device.dart
lib/core/data/models/account_export.dart
lib/core/data/repositories/account_repository.dart
lib/pages/account/*
lib/pages/mine/mine_view.dart
lib/core/data/services/auth_controller.dart
lib/app.dart
lib/l10n/app_{en,zh,id}.arb
34.3 首屏布局回归
首次全量测试时,新增账号卡把既有偏好设置和观看历史入口挤出可视区:
Found 0 widgets with text "App Language"
Found 0 widgets with text "Watch History"
Some tests failed.
处理:不改既有测试断言,把账号卡收敛为 48px 紧凑横向入口, 保留四项图标、分隔线和账号标题;原有菜单项改用紧凑密度。 三个受影响测试回归:
$ flutter test test/home/home_nav_ui_test.dart \
test/watch/watch_history_provider_test.dart test/widget_test.dart
00:06 +21: All tests passed!
34.4 最终门禁
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:26 +335: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'... 10.0s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
34.5 Git
44f6feb feat(account): 接入个人中心接口模型
ef7f4ce feat(account): 同步资料保存后的登录态
c68f024 feat(account): 增加账号中心页面逻辑
da09511 feat(account): 增加账号中心页面与入口
6fce24d refactor(account): 收敛账号页组件结构
7151bc9 style(account): 保持账号入口首屏可用
9b3ab9d feat(account): 合并 K19 账号中心
7d68699..9b3ab9d develop -> develop
所有提交 author/committer 均为 Zhou Weidong <502333560@qq.com>。
34.6 已知缺口
- 无注销状态查询:不能预先判断是否在冷静期,撤销失败直接展示后端文案。
- 无设备下线接口:设备页只读。
- 无头像上传接口:头像只展示。
- 资料响应不含生日:本批生日只能本次设置,不能回填或清空。
34.7 用户真机验证
以下步骤必须在设备侧执行并取证,开发机不代跑:
- 登录后打开「我的」。 预期:钱包卡后、菜单卡前出现「账号」卡,四项入口完整可点击。
- 打开「个人资料」。 预期:服务端字段回填;修改昵称/性别并保存后,我的页昵称同步更新。
- 打开「登录设备」。 预期:设备号首尾可见、中间脱敏;平台、机型、时间、状态正确;空列表显示空态。
- 打开「数据导出」。 预期:显示资料、凭据、授权记录数、设备数;复制 JSON 成功。
- 打开「注销账号」。 预期:显示 15 天冷静期和立即登出提示;提交必须经过二次确认。
- 确认注销。
预期:显示
scheduledAt,本地 token 清空并回到未登录状态。 - 重新登录后撤销注销。 预期:有申请时成功;无申请时显示后端“没有待处理的注销申请”。
设备侧截图、日志和最终验收结论由用户执行。
2026-10-17 K10 统一空列表占位
26.1 范围、分支与计划
叙述:新增统一 EmptyState,替换任务书表格中的 10 处纯文字空态。只改空态
视觉、三语 l10n 与测试,不改列表数据、接口、加载/失败逻辑。
- 客户端分支:
feature/flutter-k10-empty-states,基线19babb8。 - 文档分支:
docs/k10-empty-states,基线 K10 任务书3f84bc6。
开工前先写并提交计划:
f1d56b1 docs(plans): 增加 K10 统一空态实施计划
26.2 先红:组件与页面
组件文件尚不存在:
$ flutter test test/empty_state/empty_state_test.dart
Error when reading 'lib/core/widgets/empty_state.dart': No such file or directory
Failed to load ".../empty_state_test.dart"
页面测试已能运行,但五处空态仍是旧实现:
$ flutter test test/library/favorites_page_test.dart test/download/downloads_page_test.dart test/watch/watch_records_page_test.dart test/notice/notices_page_test.dart test/comment/drama_comments_sheet_test.dart
Found 0 widgets with type "EmptyState": []
00:03 +28 -6: Some tests failed.
解读:组件、收藏、下载、记录、通知、评论空态均未接入,红灯符合 K10 范围。
26.3 组件实现
新增:
128 lib/core/widgets/empty_state.dart
规格:
- 默认 96x96、圆角 28、
AppColors.blue11% 背景,图标 42。 - compact 64x64、圆角 18、图标 28。
- 标题 16/w600,副标题 13 muted,最多 2 行。
- 可选 TextButton 最小高度 44,主题主色。
- 深色主题图标
blueSoft,浅色主题图标blue。 - 外层 Semantics 只读标题;图形和文本排除重复语义,操作按钮仍可访问。
新增三语副标题:
en: New content will appear here.
zh: 有新内容时会显示在这里。
id: Konten baru akan muncul di sini.
26.4 10 处替换
lib/pages/home/home_view.dart movie_outlined
lib/pages/discover/widgets/home_drama_grid.dart grid_view_rounded / search_off_rounded
lib/pages/favorites/favorites_page.dart favorite_border_rounded
lib/pages/notices/notices_page.dart notifications_none_rounded
lib/pages/drama_detail/drama_detail_view.dart video_library_outlined
lib/pages/mine/mine_view.dart bookmark_border_rounded / history_rounded
lib/pages/downloads/downloads_page.dart download_outlined
lib/pages/watch_records/watch_records_page.dart history_rounded
lib/pages/player/widgets/drama_comments_sheet.dart chat_bubble_outline_rounded(compact)
首页将原合并的 error || empty 分支拆开:
- error 继续使用
error_outline_rounded、catalogError、重试与 debug API 地址。 - 空列表才使用
EmptyState(noStories)。
收藏、通知、记录、评论等失败态仍保留原错误与重试,不用 EmptyState。
26.5 定向与全量绿灯
组件测试:
$ flutter test test/empty_state/empty_state_test.dart
00:00 +4: All tests passed!
组件与五处页面:
$ flutter test test/empty_state/empty_state_test.dart test/library/favorites_page_test.dart test/download/downloads_page_test.dart test/watch/watch_records_page_test.dart test/notice/notices_page_test.dart test/comment/drama_comments_sheet_test.dart
00:03 +38: All tests passed!
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:18 +302 ~1: All tests passed!
解读:302 项通过,1 项联调测试因客户端接口服务未启动按设计跳过;既有页面
用例保留,新增断言只增加 EmptyState 校验,不删除原用例。
26.6 Android debug 构建
用户 iOS flutter run 仍在运行,未终止该会话。为避免争用原项目 build/,
将同一工作区(排除 build/.git/.dart_tool/ephemeral)同步到独立临时副本后构建:
$ flutter build apk --debug
Running Gradle task 'assembleDebug'... 6.9s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:K10 最终代码通过 Android debug 构建,且原 iOS 运行会话未被中断。
26.7 Git
6d08330 feat(flutter): 统一空列表占位组件
0466b4b merge: 合并 K10 统一空态组件
19babb8..0466b4b develop -> develop
功能提交与合并提交 author/committer 均为
Zhou Weidong <502333560@qq.com>。
- 2026-10-19 K22.1 首屏 loading:
.app-loading文字色改为#f8f1ea,Web 提交a97b8cc,合并3e8312e,pnpm build:pro通过。
26.8 用户真机验证步骤与预期
以下设备侧取证由用户执行,Codex 未跑真机。
- 使用最新客户端
develop,分别切换深色和浅色主题进入一个空列表页面。 预期:显示 96x96 柔和蓝色底、图标、标题与可选说明,不白屏、不溢出。 - 打开收藏、下载、观看记录、通知页面并清空对应数据。
预期:均显示统一
EmptyState,原有文案与清空/刷新逻辑正常。 - 打开无评论的剧目评论弹窗。 预期:显示 compact 64x64 图标占位,弹窗仍可滚动与输入。
- 打开无剧集详情或首页无剧目场景。 预期:显示对应空态;重试按钮行为保持不变。
- 模拟接口失败。 预期:仍显示原错误图标、错误文案和重试,不显示空态占位。
- 在 320px 宽小屏检查长标题、副标题和按钮。 预期:最多两行、可换行且无横向溢出,按钮点击区域不小于 44pt。
设备侧截图、语音朗读与最终验收结论由用户执行。
2026-10-17 K11 首页 3 列与全部分类
27.1 范围、分支与计划
叙述:在 K9 首页「全部剧目」网格上做最小修订,每行 3 个,分类首项从
For You 改为「全部」。只改网格参数、首个分类 label 和对应测试。
- 客户端分支:
feature/flutter-k11-home-grid-3col,基线0466b4b。 - 文档分支:
docs/k11-home-grid-3col,基线任务书2a06190。
开工前先写并提交计划:
f97574b docs(plans): 增加 K11 首页三列网格实施计划
27.2 先红:3 列与全部文案
先更新 K9 网格测试的期望值并执行:
$ flutter test test/discover/home_all_dramas_grid_test.dart
Expected: exactly one matching candidate
Actual: _TextWidgetFinder:<Found 0 widgets with text "All": []>
00:01 +0 -1: Some tests failed.
解读:分类首项仍显示旧文案,3 列断言在首个失败处之后尚未执行;红灯与 K11 目标一致。
27.3 实现
home_drama_grid.dart:
crossAxisCount: 3
mainAxisSpacing: 14
crossAxisSpacing: 10
childAspectRatio: 2 / 3
discover_view.dart:
(code: CategoryController.allCode, label: l10n.all)
已核对三份 ARB 原本已有 all:
lib/l10n/app_en.arb:49: "all": "All",
lib/l10n/app_zh.arb:49: "all": "全部",
lib/l10n/app_id.arb:49: "all": "Semua",
解读:直接复用现有三语 getter,未添加重复 JSON key,也未改动 l10n 生成文件。
27.4 定向绿灯
$ flutter test test/discover/home_all_dramas_grid_test.dart
00:01 +5: All tests passed!
测试同时断言:
crossAxisCount == 3crossAxisSpacing == 10mainAxisSpacing == 14childAspectRatio == 2/3- 首个 chip 为
All,且位于Hot左侧 - 320px 小屏 3 列布局无溢出
两个既有首页壳层用例仍保留,只更新旧分类断言:
$ flutter test test/widget_test.dart
00:05 +17: All tests passed!
27.5 全量门禁与构建
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:18 +302 ~1: All tests passed!
解读:302 项通过,1 项联调测试因客户端接口服务未启动按设计跳过。
用户 Android flutter run 仍在运行,未终止该会话。为避免争用原项目
build/,将当前工作区同步到独立临时副本后执行:
$ flutter build apk --debug
Running Gradle task 'assembleDebug'... 21.8s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
27.6 Git
f0db631 feat(flutter): 首页网格改为三列并首位显示全部
b5a8656 merge: 合并 K11 首页三列网格
0466b4b..b5a8656 develop -> develop
功能提交与合并提交 author/committer 均为
Zhou Weidong <502333560@qq.com>。
27.7 用户真机验证步骤与预期
以下设备侧取证由用户执行,Codex 未跑真机。
- 使用最新客户端
develop进入首页。 预期:分类 chips 第一项显示「全部 / All / Semua」,其后仍是热门、最新和 服务端分类。 - 查看「全部剧目」列表。 预期:每行 3 个剧目,列间距 10、行间距 14,左右边距保持 16。
- 检查长标题和类型。 预期:标题最多 2 行、类型最多 1 行,不横向或纵向溢出。
- 点击「全部」及其他分类。 预期:网格内容按现有逻辑更新,点击卡片仍进入对应详情。
- 在 320px 宽设备或小屏模拟器滚动列表。 预期:3 列布局稳定,无卡片重叠或整页溢出。
设备侧截图、滚动和分类切换结果由用户执行。
2026-10-17 K12 首页去标题与空态重做
28.1 范围、分支与计划
叙述:删除 K11 首页「全部剧目」标题,使分类 chips 后直接进入网格;同时将
K10 空态从实心圆角块改为双层同心圆。只改首页间距、EmptyState 和对应测试。
- 客户端分支:
feature/flutter-k12-home-empty-polish,基线b5a8656。 - 文档分支:
docs/k12-home-empty-polish,基线任务书87a37e9。
开工前先写并提交计划:
e49664c docs(plans): 增加 K12 首页与空态视觉修订计划
构建前已确认用户真机会话停止,进程检查无并发 Flutter run/build。
28.2 先红:标题与旧空态
$ flutter test test/empty_state/empty_state_test.dart test/discover/home_all_dramas_grid_test.dart
Found 0 widgets with key [<'empty-state-art-inner'>]: []
Expected: Size(60, 60)
Actual: Size(64, 64)
Expected: <260>
Actual: <280.0>
Found 1 widget with key [<'home-all-dramas-title'>]
00:02 +2 -7: Some tests failed.
解读:旧实心圆角空态仍为 96/64、最大宽 280,首页标题仍存在,红灯与 K12 目标一致。
28.3 首页去标题
删除 home-all-dramas-title Text 及其间隔,分类 Sliver 的底部 padding 改为 14。
实际 chips 控件增加稳定 Key:
home-category-chips
测试读取 chips 底边与首张卡片的 RenderBox 顶边,断言间距:
closeTo(14, 0.1)
28.4 空态双层同心圆
最终规格:
default outer: 84, blue alpha 0.055, border alpha 0.11
default inner: 56, blue alpha 0.11
compact outer: 60; inner: 40
icon: 27 / compact 21
title: 15 w600
subtitle: 12.5, height 1.45
button: 13, min height 44
padding: 24x28 / compact 16x16
max width: 260
新增 Key:
empty-state-art-inner
empty-state-padding
empty-state-art、empty-state-icon、empty-state-title、
empty-state-action 保持,外层 Semantics 仍只读标题。
28.5 定向与全量绿灯
组件、首页和既有壳层:
$ flutter test test/empty_state/empty_state_test.dart test/discover/home_all_dramas_grid_test.dart test/widget_test.dart
00:06 +26: All tests passed!
既有壳层测试中的 All Dramas 文本锚点改为稳定网格 Key
home-all-dramas-grid,原导航流程与用例全部保留。
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:17 +302 ~1: All tests passed!
解读:302 项通过,1 项联调测试因客户端接口服务未启动按设计跳过。
28.6 APK 构建
$ flutter build apk --debug
Running Gradle task 'assembleDebug'... 16.6s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
28.7 Git
2dd4627 feat(flutter): 精简首页标题并重做空态视觉
b762289 merge: 合并 K12 首页与空态视觉修订
b5a8656..b762289 develop -> develop
功能提交与合并提交 author/committer 均为
Zhou Weidong <502333560@qq.com>。
28.8 用户真机验证步骤与预期
以下设备侧取证由用户执行,Codex 未跑真机。
- 打开首页并查看分类 chips 下方。 预期:不再显示「全部剧目」标题,chips 下方 14px 后直接出现 3 列网格。
- 打开任一空列表页面。 预期:显示双层同心圆,外层比内层更淡,图标居中,不再是大块实心圆角矩形。
- 分别切换深色和浅色主题。
预期:深色图标为
blueSoft,浅色图标为blue,文字与背景对比清晰。 - 检查带副标题和操作按钮的空态。 预期:标题 15、副标题 12.5、按钮 13,间距舒展,按钮点击区域不少于 44pt。
- 打开无评论弹窗。 预期:使用 60/40 compact 双层圆,图标 21,上下留白 16,不挤压输入区。
- 在 320px 宽小屏检查空态和首页。 预期:最大宽 260 生效,无横向溢出,标题最多两行。
设备侧截图、深浅主题与小屏结果由用户执行。
2026-10-17 K13 运行时服务器地址设置
29.1 范围、分支与计划
叙述:解决 debug APK 不带 --dart-define 时固定回退到 .local 的问题。
新增 debug-only 运行时地址,优先级为本地设置 > dart-define > 现有默认。
- 客户端分支:
feature/flutter-k13-dev-server-setting,基线b762289。 - 文档分支:
docs/k13-dev-server-setting,基线任务书1a5951c。
开工前先写并提交计划:
6405dff docs(plans): 增加 K13 开发服务器地址实施计划
当前有真机 flutter run 会话,未主动终止;构建在独立副本中完成。
29.2 先红:运行时配置与入口缺失
$ flutter test test/config/server_endpoint_test.dart test/mine/server_endpoint_setting_test.dart
Error when reading 'lib/core/config/server_endpoint.dart': No such file or directory
Member not found: 'AppConfig.clearRuntimeBaseUrl'
No named parameter with the name 'showServerSetting'
Some tests failed.
解读:运行时解析器、AppConfig 覆盖入口和 debug 设置参数均不存在,红灯符合 K13 范围。
29.3 运行时解析与启动顺序
新增:
86 lib/core/config/server_endpoint.dart
关键规则:
preference key: dev.api_base_url
runtime > dart-define(API_BASE_URL) > default
normalize: trim, http(s), non-empty host, trailing slash removed
release: ServerEndpoint.load(debug: false) returns before preferences are read
main() 在 runApp 前执行:
await ServerEndpoint.load();
runApp(const LumaDramaApp());
因此 LumaDramaApp 创建共用 ApiClient 前,运行时地址已经加载完成。
29.4 Debug 设置入口
我的页设置弹窗增加服务器地址行:
- 显示当前
AppConfig.apiBaseUrl; - 编辑弹窗预填当前地址;
- 保存合法值后提示重启生效;
- 非法值显示三语错误且不写 SharedPreferences;
- 恢复默认清除
dev.api_base_url; - 设置面板改为 85% 屏高内可滚动,避免小屏溢出。
可见性通过 MyPage.debugShowSetting 注入,默认 kDebugMode。release
编译时默认 false,不显示该行,也不读取本地覆盖。
新增三语 key:
serverAddress
serverAddressHint
saveAddress
restartToApply
restoreDefault
invalidServerAddress
29.5 定向与全量绿灯
$ flutter test test/config/server_endpoint_test.dart test/mine/server_endpoint_setting_test.dart
00:00 +7: All tests passed!
覆盖:
- 本地设置 > dart-define > 默认;
- trim、末尾斜杠、http/https;
ftp://、缺 scheme、空 host 拒绝;- debug=false 不应用本地覆盖;
- save/clear SharedPreferences;
- debug 入口可见、注入 false 不可见;
- 非法地址不保存并显示错误。
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:19 +309 ~1: All tests passed!
解读:309 项通过,1 项联调测试因客户端接口服务未启动按设计跳过。
29.6 无 dart-define 的 Debug APK
用户真机 run 未终止。将当前工作区同步到独立临时副本,并明确不带构建参数:
$ flutter build apk --debug
Running Gradle task 'assembleDebug'... 23.4s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:即使 APK 没有 --dart-define,安装后也可在 debug 设置中保存真实服务器
地址,重启后覆盖现有 .local 默认值。
29.7 Git
907562a feat(flutter): 增加 debug 运行时服务器地址设置
f95325d merge: 合并 K13 开发服务器地址设置
b762289..f95325d develop -> develop
功能提交与合并提交 author/committer 均为
Zhou Weidong <502333560@qq.com>。
29.8 用户真机验证步骤与预期
以下设备侧取证由用户执行,Codex 未跑真机。
- 安装本次不带
--dart-define构建的 debug APK。 预期:App 可以启动,进入「我的 → 设置」能看到「服务器地址」。 - 点击「服务器地址」。 预期:编辑框预填当前地址,并显示「重启 App 生效」。
- 输入真实局域网地址,例如
http://192.168.31.187:8081,保存。 预期:返回设置页并提示重启;输入框不会保留非法格式。 - 完全结束 App 后重新打开,确认首页/发现请求成功,并在后端日志看到来自手机
的
/app/home/feed等请求。 预期:请求使用新地址,不再访问.local默认地址。 - 再次进入设置,点击「恢复默认」并重启。 预期:本地覆盖被清除,回到编译配置地址。
- 用 release 构建检查。 预期:设置中完全没有服务器地址入口,且即使本地存有 key 也不会读取。
设备侧日志、截图与最终连通性结论由用户执行。
2026-10-17 K14 客户端文档
30.1 范围与依据
叙述:重写客户端 README,新增任务清单和文件说明。只改 ReelShort 的三份文档, 不改代码、specs、后端或 Web。
核对依据:
pubspec.yaml、pubspec.locklib/与test/实际目录lib/core/data/remote/**实际调用FruitServer/docs/api-phase1.md章节FruitServer/docs/plans/PROGRESS.md已完成批次
客户端分支:docs/k14-client-docs,基线 f95325d。
30.2 接口与目录核对
Flutter 版本:
$ flutter --version
Flutter 3.47.7 • channel stable
Tools • Dart 3.13.5 • DevTools 2.60.0
接口路径:
$ rg -o "'/app/[^']+'" lib/core/data/remote -g '*.dart' | sort -u | wc -l
26
按 HTTP 方法和重复 URL 逐项统计为 31 个方法级调用。README 已按账号、内容、 观看记录、收藏、下载、互动和公告分组列出。
30.3 文档内容
ReelShort/README.md:
- 印尼市场定位、技术栈、目录概览;
- 实际接口清单;
- Android USB、Android 模拟器、iOS 和 debug 运行时地址;
- iOS foundation 2.5.6、SPM 恢复、Android libdartjni 处理;
- 门禁命令、测试命名和当前边界。
ReelShort/docs/TASKS.md:
- K1-K13 批次表;
- K4、支付/金币、搜索、下载落盘待办;
- 未确认范围标「需核对」,未编造提交号。
ReelShort/docs/FILES.md:
- 目录树、关键文件职责、test 结构;
app_localizations*.dart、*.g.dart、build、ephemeral 等生成物标注为勿手改。
仓库 .gitignore 包含 /docs/。本轮只对新增的两个 docs 文件使用
git add -f,没有修改 .gitignore。
30.4 门禁
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:20 +309 ~1: All tests passed!
解读:文档改动未误改代码;309 项通过,1 项联调测试因服务未启动跳过。
30.5 Git
5a28845 docs(client): 重写 README 并补充任务与文件说明
213c86e docs(client): 修正已接接口数量说明
9fe62d1 merge: 合并 K14 文档接口统计修正
f95325d..9fe62d1 develop -> develop
主提交、修正提交和最终合并的 author/committer 均为
Zhou Weidong <502333560@qq.com>。
30.6 文档验收
- 打开
ReelShort/README.md,按表中命令可完成 Android USB、iOS 和 debug 运行时地址配置。 - 打开
ReelShort/docs/TASKS.md,能区分已合入功能与待办/需核对事项。 - 打开
ReelShort/docs/FILES.md,能定位核心配置、数据层、页面、测试和生成物。 - 文档中的接口路径与
lib/core/data/remote/一致。
2026-10-17 K15 首页服务器设置与真机默认地址
31.1 最终范围
用户最终确认手机与 Mac 在同一网络,不使用 USB 转发。修复范围确定为:
- 真机默认地址改为
http://10.157.242.1:8081,只替换devHostBaseUrl; - 平台默认选择与优先级保持不变:运行时设置 > dart-define > 平台默认;
- 首页加载失败页 debug 下增加「服务器设置」,复用 K13 地址弹窗;
- release 不显示入口。
客户端修复分支:fix/home-server-default,基线 9fe62d1。
31.2 地址与失败页实现
AppConfig:
devHostBaseUrl = "http://10.157.242.1:8081"
注释已说明该 IP 跟随开发机网络变化,换网络时只改这一行。模拟器、桌面端和
iOS 模拟器仍使用 127.0.0.1;iOS/Android 真机使用该局域网地址。
K13 的服务器地址弹窗抽到:
lib/core/widgets/server_endpoint_dialog.dart
我的页和首页错误页共用同一弹窗。首页错误页新增
home-server-settings 按钮,仅调试工具开启时显示;可编辑、保存、恢复默认,
保存后提示重启生效。
31.3 测试与门禁
新增/更新测试:
AppConfig.devHostBaseUrl为最终局域网地址;- 原有运行时 > dart-define > 默认优先级继续通过;
- 首页错误页 debug 下显示按钮并可打开
server-endpoint-input; - 注入 release 条件时按钮不显示;
- 我的页设置入口与非法地址拒绝继续通过。
$ flutter test test/config/server_endpoint_test.dart test/mine/server_endpoint_setting_test.dart test/home/home_server_setting_test.dart
00:02 +10: All tests passed!
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:21 +312 ~1: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'... 13.2s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:312 项通过,1 项联调测试因服务未启动跳过;debug APK 构建成功。
31.4 Git
c4694c6 fix(flutter): 增加首页服务器设置并更新真机默认地址
4778ce2 merge: 合并 K15 首页服务器设置修复
9fe62d1..4778ce2 develop -> develop
功能提交与合并提交 author/committer 均为
Zhou Weidong <502333560@qq.com>。
31.5 用户真机验证步骤
- Android Studio 直接 Run,不额外传
--dart-define。 预期:默认请求http://10.157.242.1:8081。 - 若首页仍加载失败,在错误页查看 debug 地址和「服务器设置」按钮。 预期:点击后打开与「我的 → 设置」相同的地址弹窗。
- 修改地址并保存,完全结束 App 后重开。 预期:使用新地址请求,后端日志出现手机侧请求。
- release 构建中检查首页错误页。 预期:不显示服务器设置入口。
设备侧日志、截图和最终网络连通性结论由用户执行。
2026-10-17 K16 注册限流后台配置化
32.1 最终口径
叙述:K16 开工后 Trae 于 461fb8e 更新任务书,要求从 sys_config 读取配置,
不使用 application.yml 固化。初版 @Value 实现已按最新口径修正。
最终配置键:
app.register.max-per-ip-per-day
app.register.max-per-device-per-day
- 值 <= 0:对应维度不限制;
- 键缺失或非整数:回退 IP 5 / 设备 3;
- 错误码和错误文案不变。
32.2 后端实现与测试
AppAuthService 注入 ConfigService,module-user 增加 module-system 依赖。
首次红灯:
Could not find field 'maxRegisterPerIpPerDay'
Tests run: 16, Failures: 0, Errors: 4
最终定向测试:
$ mvn -pl fruitshorts-app-api -am -Dtest=AppAuthServiceTest -Dsurefire.failIfNoSpecifiedTests=false test
Tests run: 18, Failures: 0, Errors: 0, Skipped: 0
BUILD SUCCESS
覆盖:IP 超限、设备超限、自定义阈值、IP=0、设备=0、缺省回退、非数字回退。
全量测试:
$ mvn test
[INFO] BUILD SUCCESS
32.3 种子配置与后台页面
sql/data-phase1.sql 增加幂等种子:
INSERT INTO sys_config (id, config_key, config_value, remark) VALUES
(3, 'app.register.max-per-ip-per-day', '0', '0=不限制;生产建议 5'),
(4, 'app.register.max-per-device-per-day', '0', '0=不限制;生产建议 3')
ON CONFLICT (config_key) DO NOTHING;
当前开发库执行结果:
INSERT 0 2
id | config_key | config_value | remark
----+-------------------------------------+--------------+--------------------
3 | app.register.max-per-ip-per-day | 0 | 0=不限制;生产建议 5
4 | app.register.max-per-device-per-day | 0 | 0=不限制;生产建议 3
后台 SettingsView.vue 原有页面只显示两个旧配置字段,因此补充了两个数值项,
沿用现有 /admin/configs 接口,不新建页面。
$ pnpm build:pro
Build successful. Please see dist-pro directory
Web 提交 54db082,合并 5c087f4,已推送。
32.4 打包、重启与接口自检
$ mvn -pl fruitshorts-app-api -am package -DskipTests
[INFO] BUILD SUCCESS
旧 8081 服务停止后,通过 launchctl 启动新 jar。当前服务:
80642 0 com.fruitshorts.app-api
java 80642 ... TCP *:8081 (LISTEN)
健康检查:
HTTP/1.1 200
{"code":0,"message":"ok","data":{"status":"UP","app":"fruitshorts-app-api",...}}
同一新设备号连续注册 4 次(令牌字段已省略):
attempt 1 HTTP 200 {"code":0,"message":"ok","newUser":true,"uid":"U-4JA-DDD"}
attempt 2 HTTP 200 {"code":0,"message":"ok","newUser":true,"uid":"UTIOUCLLV"}
attempt 3 HTTP 200 {"code":0,"message":"ok","newUser":true,"uid":"UR6ZJRO74"}
attempt 4 HTTP 200 {"code":0,"message":"ok","newUser":true,"uid":"UXJF6MECJ"}
解读:开发库两键均为 0,IP 与设备 guard 均跳过,连续注册不再 429。
32.5 Git
FruitServer:
3403a52 docs(plans): 增加 K16 注册限流配置化计划
758eb69 feat(backend): 注册限流阈值改为可配置
f1aaaee fix(backend): 改为后台配置注册限流阈值
f4003ed test(backend): 覆盖注册限流缺省回退
5b7be2e merge: 合并注册限流缺省回退测试
78fb995..5b7be2e develop -> develop
ReelShortWeb:
54db082 feat(admin): 增加注册限流配置项
5c087f4 chore(admin): 合并注册限流配置项
3ec9ea6..5c087f4 develop -> develop
最终后端修正与 Web 提交的 author/committer 均为
Zhou Weidong <502333560@qq.com>。
32.6 用户验收步骤
- 登录后台「系统设置」。 预期:看到注册频控两个数值项,当前均为 0。
- 将单设备上限改为 3,保存后使用同一设备注册第 4 次。 预期:返回 429;恢复 0 后第 4 次可成功。
- 将单 IP 上限改为 1,保存后从同一 IP 注册第 2 次。 预期:返回 429;恢复 0 后恢复不限。
- 验证完成后开发库恢复 0/0;生产配置建议恢复 IP 5 / 设备 3。
设备侧接口结果与后台截图由用户最终验收。
32.7 API 文档键名补正
复核 docs/api-phase1.md §1.1 时发现文档仍沿用旧的
fruitshorts.auth.register-max-* 键名,与 AppAuthService 实际读取的
sys_config 键不一致。已补正为:
app.register.max-per-ip-per-day
app.register.max-per-device-per-day
同时将入口表述统一为后台「系统配置」。本次只补正文档,不改运行逻辑。
补正后复核:
$ mvn test
AppAuthServiceTest: Tests run: 18, Failures: 0, Errors: 0, Skipped: 0
BUILD SUCCESS
开发库两键均为 0。同一新设备号连续注册 4 次均为 code=0:
uid=UFCIW1LWU
uid=UP2BH-DN_
uid=ULOFAAU2Z
uid=UDAYJR-_E
2026-10-17 K16 返工:sys_config 优先 + @Value 兜底
33.1 返工范围
K16 首版合并后,用户要求明确区分后台运行配置与 yml fallback:
AppAuthService运行时优先读取sys_config:app.register.max-per-ip-per-day、app.register.max-per-device-per-day;- 键缺失或非整数时,回退
@Value注入的fruitshorts.auth.register-max-*; - yml 中的值只作 fallback,默认 5 / 3;≤0 仍表示不限制。
返工分支:fix/k16-register-config-fallback。
33.2 TDD 与测试
先把非数字配置用例改为验证 @Value fallback=2,旧实现红灯:
Could not find field 'maxRegisterPerIpPerDay'
Tests run: 18, Failures: 0, Errors: 1, Skipped: 0
BUILD FAILURE
增加注入字段并接入 registerLimit 后,定向测试转绿:
RUNNING AppAuthServiceTest
Tests run: 18, Failures: 0, Errors: 0, Skipped: 0
BUILD SUCCESS
全量测试:
$ mvn test
[INFO] fruitshorts-module-user ............................ SUCCESS
[INFO] fruitshorts-app-api ............................... SUCCESS
[INFO] BUILD SUCCESS
代码提交:
35d92c0 fix(backend): 后台注册限流配置优先并保留注入兜底
33.3 数据库与后台接口
重新执行 sql/data-phase1.sql 中的幂等插入:
INSERT 0 0
查询结果:
config_key | config_value | remark
app.register.max-per-device-per-day | 0 | 0=不限制;生产建议 3
app.register.max-per-ip-per-day | 0 | 0=不限制;生产建议 5
(2 rows)
使用本机开发管理员登录后,GET /admin/configs 返回:
{
"code": 0,
"message": "ok",
"configs": [
{
"key": "app.register.max-per-device-per-day",
"value": "0",
"remark": "0=不限制;生产建议 3"
},
{
"key": "app.register.max-per-ip-per-day",
"value": "0",
"remark": "0=不限制;生产建议 5"
}
]
}
现有 SettingsView.vue 已使用 listConfigsApi / updateConfigsApi,
页面上的两个数值输入项可直接读写这两键。
33.4 阈值 2 往返验证
通过后台 PUT /admin/configs 把 IP 上限临时设为 2、设备上限设为 0,
使用同一条测试 IP 连续注册:
attempt 1 HTTP 200 code=0 message=ok
attempt 2 HTTP 200 code=0 message=ok
attempt 3 HTTP 200 code=429 message=当前网络注册过于频繁,请稍后再试
随后通过同一后台接口恢复 IP=0,再注册一次:
attempt 4 HTTP 200 code=0 message=ok
说明:当前统一响应包装对外使用 HTTP 200,业务码在 code 字段返回 429。
33.5 打包与 8081
$ mvn -pl fruitshorts-app-api -am package -DskipTests
[INFO] BUILD SUCCESS
通过 launchctl kickstart -k gui/501/com.fruitshorts.app-api 重启:
before PID: 80642
after PID: 94657
java 94657 ... TCP *:8081 (LISTEN)
健康检查:
{"code":0,"message":"ok","data":{"status":"UP","app":"fruitshorts-app-api","profiles":"","time":"2026-10-17T23:38:32.363463"}}
HTTP 200
2026-10-17 iOS 构建阻塞:固定 shared_preferences_foundation 2.5.6
25.1 现象与根因
用户从 Xcode 16.2 构建 iOS 时,Swift 6.0.3 在
shared_preferences_foundation 2.6.0 生成文件中报:
Unexpected , separator
messages.g.swift:33:2
根因是 2.6.0 的函数参数列表使用 trailing comma,需要 Swift 6.1。此前可构建
时锁文件为 foundation 2.5.7;a4415c8 同步依赖锁后升到了 2.6.0。
用户随后修正固定目标:最终使用 2.5.6,不使用 2.5.4;2.5.7 的本地缓存缺
PrivacyInfo.xcprivacy,也不使用。
25.2 修复
客户端从 develop a4415c8 创建独立分支:
fix/ios-shared-preferences-foundation
pubspec.yaml:
dependency_overrides:
shared_preferences_foundation: 2.5.6
执行:
$ flutter pub get
Resolving dependencies...
Downloading packages...
! shared_preferences_foundation 2.5.6 (overridden) (2.6.0 available)
Got dependencies!
锁文件:
$ rg -n -A 8 '^ shared_preferences_foundation:' pubspec.lock
407: shared_preferences_foundation:
408- dependency: "direct overridden"
409- description:
410- name: shared_preferences_foundation
411- sha256: "4e7eaffc2b17ba398759f1151415869a34771ba11ebbccd1b0145472a619a64f"
412- url: "https://pub.flutter-io.cn"
413- source: hosted
414- version: "2.5.6"
确认缓存包完整:
$ find "$HOME/.pub-cache/hosted/pub.flutter-io.cn/shared_preferences_foundation-2.5.6" -name PrivacyInfo.xcprivacy -print
/Users/jianghaifeng/.pub-cache/hosted/pub.flutter-io.cn/shared_preferences_foundation-2.5.6/darwin/shared_preferences_foundation/Sources/shared_preferences_foundation/Resources/PrivacyInfo.xcprivacy
25.3 依赖树原始输出
$ flutter pub deps --style=compact | grep shared_preferences_foundation
- shared_preferences 2.5.6 [flutter shared_preferences_android shared_preferences_foundation shared_preferences_linux shared_preferences_platform_interface shared_preferences_web shared_preferences_windows]
- shared_preferences_foundation 2.5.6 [flutter shared_preferences_platform_interface]
解读:shared_preferences 2.5.6 与 override 后的
shared_preferences_foundation 2.5.6 兼容,无需降级主插件。
25.4 iOS 编译验证
为排除先前版本的构建缓存,先清理再重新解析:
$ flutter clean
Cleaning Xcode workspace... 7.2s
Deleting build... 482ms
Deleting .dart_tool... 24ms
Deleting ephemeral... 2ms
Deleting Generated.xcconfig... 0ms
Deleting flutter_export_environment.sh... 0ms
Deleting .flutter-plugins-dependencies... 0ms
$ flutter pub get
! shared_preferences_foundation 2.5.6 (overridden) (2.6.0 available)
Got dependencies!
完整无签名设备构建:
$ flutter build ios --debug --no-codesign
Warning: Building for device with codesigning disabled. You will have to manually codesign before deploying to device.
Building com.stormg.lumadramv for device (ios)...
Running Xcode build...
Xcode build done. 22.1s
✓ Built build/ios/iphoneos/Runner.app
解读:Swift Compiler 编译通过,不再出现 Unexpected , separator。
本轮未运行真机,也未执行签名安装。
25.5 Git
2c30f83 chore(ios): 固定 shared_preferences_foundation 2.5.6
19babb8 merge: 合并 iOS shared_preferences 编译修复
a4415c8..19babb8 develop -> develop
该 chore 提交只包含 pubspec.yaml 与 pubspec.lock,K9 修改未混入;
author/committer 均为 Zhou Weidong <502333560@qq.com>。
25.6 用户后续验证
- 拉取最新客户端
develop并执行flutter pub get。 预期:终端显示shared_preferences_foundation 2.5.6 (overridden)。 - 从 Xcode 16.2 直接 Run 或执行
flutter run到 iPhone。 预期:Swift Compiler 不再报Unexpected , separator,App 可完成构建启动。 - 打开设置或任何依赖
shared_preferences的页面,修改语言或登录态。 预期:偏好设置读写正常。
设备侧构建日志、启动截图与偏好读写结果由用户执行。
2026-10-17 K8 登录页视觉重设计
23.1 范围、分支与计划
叙述:按 INBOX K8 条目重设计登录页视觉,不改 AuthLogic、校验、AuthController、
接口、登录/注册流程或其他页面。客户端从 develop 6cc5bfc 创建
feature/flutter-k8-auth-visual;FruitServer 从 K8 任务书提交 c33e6cd
创建 docs/k8-auth-visual,只改 docs/plans/。
开工前先写并提交计划:
e7c11c3 docs(plans): 增加 K8 登录页视觉实施计划
实施文件:
lib/pages/auth/auth_view.dartlib/pages/auth/auth_widgets.dartlib/pages/auth/auth_form_widgets.darttest/auth/auth_visual_test.dart
auth_view.dart 初次实现达到 654 行,触发项目单文件 500 行红线。随后按页面
组合、卡片/分段控件、表单控件与品牌组件拆分,最终行数:
259 lib/pages/auth/auth_view.dart
183 lib/pages/auth/auth_widgets.dart
363 lib/pages/auth/auth_form_widgets.dart
311 test/auth/auth_visual_test.dart
解读:所有新增 Dart 文件均低于 500 行,页面状态类低于 300 行。
23.2 先红:视觉测试
叙述:先新增 test/auth/auth_visual_test.dart,未改既有
test/auth/auth_page_test.dart。
$ flutter test test/auth/auth_visual_test.dart
Expected: exactly one matching candidate
Actual: Found 0 widgets with key [<'auth-brand'>]: []
Bad state: No element
The finder "Found 0 widgets with key [<'auth-mode-sign-up'>]: []"
could not find any matching widgets.
Expected: exactly one matching candidate
Actual: Found 0 widgets with key [<'auth-error-capsule'>]: []
00:01 +2 -4: Some tests failed.
解读:品牌区、220ms 入场动画、pill 分段控件和错误胶囊尚不存在,红灯与 K8 新增视觉范围一致;既有功能型交互仍可运行。
23.3 绿灯:视觉与交互实现
实现后的新增与既有 auth 用例:
$ flutter test test/auth/auth_visual_test.dart test/auth/auth_page_test.dart
00:01 +15: All tests passed!
覆盖内容:
- 深色品牌页、
AppColors.ink、顶部克莱因蓝渐变透明度不超过 0.18。 - 48px 蓝色圆角品牌方块、App 名和印尼市场 tagline。
AppColors.card、20px 圆角、1pxoutlineVariant边框、20px 内边距。- 52px 输入框、14px 圆角、
AppColors.bar填充、邮箱/锁前缀图标和聚焦 1.5px 主色边框。 - 52px 主按钮、26px 圆角、
AppColors.blue/bluePressed、16/w700 文字与 18px loading。 - pill 登录/注册分段控件、选中主色底、切换调用现有
toggleMode()。 - 220ms 淡入上滑、错误浅红胶囊、44pt 以上点击区域。
- 邮箱→密码焦点流转、密码显隐、busy 禁用、Haptics 和 autofill 均保留。
既有 auth-switch-mode Key 与旧测试所需文本兼容入口保留,但用户可见切换控件
已改为 pill 分段;旧用例没有删改。
23.4 全量门禁与构建
构建前检查并发进程:
$ ps -axo pid=,etime=,args= | rg 'flutter_tools.snapshot (run|build)|xcodebuild|gradlew'
输出仅有当前检查命令自身,没有 Flutter run/build 进程后开始门禁。
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:19 +292 ~1: All tests passed!
解读:292 项通过,1 项联调测试因客户端接口服务未启动按设计跳过;输出中的
[WatchRecordsController] 堆栈来自既有故意注入失败的测试。
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
38.2s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
门禁执行期间 Flutter 工具自动改写 pubspec.lock 的包镜像和新版 SDK 传递依赖;
该文件不属于 K8 范围,已单独还原,未进入提交。
23.5 Git
45c3c64 feat(flutter): 重设计登录页视觉
99f64ab merge: 合并 K8 登录页视觉重设计
6cc5bfc..99f64ab develop -> develop
修复提交与合并提交 author/committer 均为
Zhou Weidong <502333560@qq.com>。
23.6 用户真机验证步骤与预期
以下设备侧取证由用户执行,Codex 未跑真机。
- 拉取最新客户端
develop,冷启动并进入登录页。 预期:全屏深色背景,顶部只有克制的蓝色光晕,品牌方块、App 名和印尼 tagline 清晰可见。 - 观察表单卡片和输入框。 预期:卡片为深色圆角面板;输入框高 52、圆角 14,邮箱和锁图标存在。
- 点击邮箱输入框并切换到密码框。 预期:聚焦输入框出现 1.5px 克莱因蓝边框,图标高亮;键盘 Next 会跳到密码, Done 会提交。
- 点击登录/注册 pill 两段。 预期:选中段蓝底白字,标题、副标题和按钮文案同步切换。
- 点击密码右侧眼睛按钮。 预期:密码明文/密文切换,按钮点击区域不小于 44pt。
- 输入错误邮箱或不安全密码并提交。 预期:卡片内出现浅红胶囊错误提示,文案与当前语言一致。
- 在 iPhone SE 尺寸打开键盘并滚动。 预期:无横向溢出,提交按钮可滚动到键盘上方并点击。
- 登录/注册提交时观察按钮与触觉。 预期:按钮显示 18px 白色 loading 环,输入与分段切换禁用;设备支持触觉时 有一次 light impact。
设备侧截图、日志与最终视觉验收结论由用户执行。
2026-10-17 K9 首页 2 列全部剧目
24.1 范围、分支与计划
叙述:按 INBOX K9 条目移除首页「继续观看」,在分类 chips 下方展示当前分类的
全部剧目。只改发现页、三语 l10n、首页相关测试与 docs/plans/;不改接口、
数据模型、轮播、通知或其他页面。
- 客户端:从
develop 99f64ab创建feature/flutter-k9-home-grid。 - 文档:从 K9 任务书
b434f65创建docs/k9-home-grid。
开工前先写并提交计划:
496d273 docs(plans): 增加 K9 首页剧目网格实施计划
24.2 先红:首页网格测试
叙述:先新增 test/discover/home_all_dramas_grid_test.dart,未改实现与既有测试。
$ flutter test test/discover/home_all_dramas_grid_test.dart
Expected: no matching candidates
Actual: Found 1 widget with text "Continue Watching"
Found 0 widgets with key [<'home-drama-card-city-lights-demo'>]: []
Found 0 widgets with text "All Dramas": []
00:02 +0 -5: Some tests failed.
解读:继续观看仍存在,「全部剧目」标题、2 列网格和卡片 Key 尚不存在,红灯与 K9 范围一致。
24.3 实现与定向绿灯
discover_view.dart 改为外层 CustomScrollView,首页 sliver 顺序为:
轮播、分类与标题、剧目网格、底部留白。网格代码拆到:
lib/pages/discover/widgets/home_drama_grid.dart
关键参数:
crossAxisCount: 2
mainAxisSpacing: 16
crossAxisSpacing: 12
childAspectRatio: 2 / 3
horizontal padding: 16
卡片使用 RemoteImage、14px 圆角、底部深色渐变;标题 2 行、类型 1 行。
点击直接调用现有 logic.openCard(...)。分类数据直接使用
CategoryController.visibleDramas。
新增三语 allDramas 并执行 flutter gen-l10n:
$ rg -n "allDramas" lib/l10n
lib/l10n/app_localizations_en.dart:161: String get allDramas => 'All Dramas';
lib/l10n/app_zh.arb:58: "allDramas": "全部剧目",
lib/l10n/app_en.arb:58: "allDramas": "All Dramas",
lib/l10n/app_localizations_zh.dart:158: String get allDramas => '全部剧目';
lib/l10n/app_id.arb:58: "allDramas": "Semua Drama",
lib/l10n/app_localizations_id.dart:161: String get allDramas => 'Semua Drama';
定向绿灯:
$ flutter test test/discover/home_all_dramas_grid_test.dart
00:01 +5: All tests passed!
覆盖:无继续观看、全部剧目标题、2 列 delegate、左右/行列间距、2:3 封面、 分类切换、无剧目空态、分类缺失空态、失败重试与 320px 小屏。
文件规模:
487 lib/pages/discover/discover_view.dart
167 lib/pages/discover/widgets/home_drama_grid.dart
245 test/discover/home_all_dramas_grid_test.dart
解读:改造前 discover_view.dart 为 649 行;删除继续观看旧实现并拆分网格后
降到 500 行以内。首页源码已无 continueWatching、_continueTile、
_ShowcaseCard、_cardsFor 或嵌套 GridView。
24.4 既有壳层断言更新
test/widget_test.dart 原有 5 处断言首页出现 Continue Watching。K9 明确要求
该文案彻底消失,因此该断言与 find.text('Continue Watching'), findsNothing
不可能同时成立。
处理:保留全部既有用例、测试名称和导航流程,仅把 5 处已作废的可见文案断言
原位改为 All Dramas;没有删除测试用例。
$ flutter test test/widget_test.dart
00:05 +17: All tests passed!
24.5 全量门禁与构建
首次静态分析发现新增测试有一个未使用 import:
warning - test/discover/home_all_dramas_grid_test.dart:10:8
Unused import: 'package:fruitshorts/core/data/repositories/catalog_repository.dart'.
1 issue found.
移除后:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:18 +297 ~1: All tests passed!
解读:297 项通过,1 项联调测试因客户端接口服务未启动按设计跳过;输出中的
[WatchRecordsController] 堆栈来自既有故意注入失败的测试。
构建前检查:
$ ps -axo pid=,etime=,args= | rg 'flutter_tools.snapshot (run|build)|xcodebuild|gradlew'
输出仅有当前检查命令自身,没有并发 Flutter run/build 后执行:
$ flutter build apk --debug
Running Gradle task 'assembleDebug'... 8.4s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
24.6 Git
cf03178 feat(flutter): 首页改为两列全部剧目网格
2c381be merge: 合并 K9 首页全部剧目网格
99f64ab..2c381be develop -> develop
功能提交与合并提交 author/committer 均为
Zhou Weidong <502333560@qq.com>。
24.7 用户真机验证步骤与预期
以下设备侧取证由用户执行,Codex 未跑真机。
- 使用最新客户端
develop进入首页「Home/发现」tab。 预期:页面不再出现「继续观看」标题或横向卡片。 - 向下查看分类 chips。
预期:chips 下方显示当前语言对应的「全部剧目」/
All Dramas/Semua Drama。 - 观察列表布局。 预期:一行 2 个剧目,左右各 16,列间距 12、行间距 16;封面为 2:3 圆角。
- 向下滚动长列表。 预期:继续按 2 列懒加载,滚动中无整页白屏或卡顿。
- 依次点击「为你推荐 / 热门 / 最新 / 服务端分类」。 预期:网格内容随分类更新;「为你推荐」显示去重后的全部剧目。
- 点击任意剧目卡片。 预期:沿用原详情流程打开对应剧目。
- 在有长标题或空分类数据时检查卡片。 预期:标题最多 2 行、类型最多 1 行,不横向溢出;空态和失败重试文案保留。
设备侧截图、日志与最终验收结论由用户执行。
2026-10-19 | P0 商业化与登录闭环(Flutter)
1. 金币余额 + 金币解锁
- 新增
WalletController、CommerceApi、CommerceRepository、WalletSnapshot/UnlockResult;钱包页读取GET /app/wallet,展示服务端余额、累计充消、流水、空态与重试。 - 播放器
COIN_REQUIRED时调用POST /app/episodes/{id}/unlock,成功后强制刷新播放票据并起播;余额不足保留后端 message。 - 个人页金币卡改为真实余额;未登录先走登录。
- 命令与结果:
flutter test test/commerce test/wallet
+6: All tests passed!
- 解读:余额、流水、解锁扣币与错误回传均由服务端数据驱动,没有本地写死余额。
2. 充值入口
- 契约要求 Google Play
purchaseToken,开发环境verifier=disabled且无商品凭据;按指令「暂不接则隐藏入口」处理,钱包页与个人页均不保留假充值按钮。 - 阻塞已写入
INBOX.md顶部「【待 Trae 协助】」。
3. 本地下载落盘 + 离线播放
- 新增
DownloadStorage/FileDownloadStorage:GET /app/downloads/{episodeId}/url取签名地址,流式写.part,完成后原子改名;冷启动扫描本地目录恢复索引。 DownloadController.startDownload上报DOWNLOADING/COMPLETED/FAILED,下载页展示实时进度;下载完成可离线播放,删除同时清本地文件和服务端授权。- 播放器优先使用已同步本地文件,命中时不请求播放票据。
- 命令与结果:
flutter test test/download/download_storage_test.dart test/download/download_controller_local_test.dart
+3: All tests passed!
flutter test test/download
+36: All tests passed!
- 解读:MP4 分集真实落盘,下载页可离线起播;HLS 分片场景由后端下载接口当前返回 MP4 地址覆盖。
4. 手机号 OTP 登录
AuthApi新增POST /app/auth/otp、手机号验证码登录/注册;登录页新增 Material 3 底部表单(手机号、验证码、60 秒重发倒计时、登录/注册切换)。- 移除了 Google 登录假入口;短信通道仍是后端
LogOtpSender,已在 INBOX 标注。 - 命令与结果:
flutter test test/auth
+26: All tests passed!
- 解读:客户端能真实发起 OTP、携带
deviceId登录/注册并落盘会话;真机收码依赖后端短信供应商。
5. 门禁
dart analyze lib test
No issues found!
flutter test
00:19 +374 ~1: All tests passed!
- 解读:静态检查零告警,全部测试通过;
~1为联调测试在无数据时主动跳过。
2026-10-19 | P1 首页榜单 tab(Flutter)
1. 数据来源与交互
RankingLogic只消费/app/home/feed已返回的hot/new分区,保持服务端顺序并按 id 去重;分区缺失时回退到完整目录,不生成虚构分数或假数据。- 新增
RankingPage:Material 3 分段切换、榜首大图卡、第 2 名起紧凑榜单、真实集数/类型文案、空态;条目点击复用现有详情页。 - 底部导航 3→4:首页 / 发现 / 榜单 / 我的,榜单返回逻辑复用根 tab 的状态保留。
2. 测试(先红后绿)
flutter test test/ranking/ranking_logic_test.dart test/ranking/ranking_view_test.dart test/home/home_nav_ui_test.dart
+8: All tests passed!
- 解读:热门顺序、新剧切换、去重回退、榜单渲染与详情跳转、四 tab 导航均已覆盖。
3. 门禁
dart analyze lib test
No issues found!
flutter test
00:20 +379 ~1: All tests passed!
- 解读:静态检查零告警,全量测试通过;
~1为联调测试在无数据时主动跳过。
2026-10-19 | P2 移除 debug 服务器地址入口(Flutter)
- 设置 sheet 只保留界面语言(English / 简体中文 / Bahasa Indonesia),删除
server-endpoint-setting编辑入口与debugShowSetting分支。 - 首页目录失败态只保留错误说明与重试,删除 debug 服务器按钮及仅用于运行时代理编辑的
server_endpoint_dialog.dart。 - 运行时地址仍可由
--dart-define=API_BASE_URL注入,不影响真机联调或发布配置。
测试(先红后绿)
flutter test test/mine/server_endpoint_setting_test.dart test/home/home_server_setting_test.dart test/mine/mine_logic_test.dart test/mine/mine_preview_layout_test.dart
+12: All tests passed!
- 解读:设置 sheet 与首页失败态均断言不再出现服务器入口,三种界面语言仍完整可选。
门禁
dart analyze lib test
No issues found!
flutter test
00:19 +377 ~1: All tests passed!
- 解读:静态检查零告警,全量测试通过;
~1为联调测试在无数据时主动跳过。
2026-10-19 | P2 首页轮播 banner 接入(Flutter)
- 发现页顶部接入
/app/home/feed的真实banners;DRAMA类型点击后按linkValue拉取详情并进入详情页,不会把 banner 链接当成假数据。 - 新增
FeedBannerCarousel:Material 3 圆角卡片、4.5s 自动轮播、单张不启动定时器、按住暂停/松手恢复、TickerMode 与 tab active 双重暂停、圆点指示器带三语语义标签。 banners为空时完全不占位;图片加载失败显示统一占位图标。- 使用现有
carouselSemantics文案,没有新增无效入口。
测试(先红后绿)
flutter test test/home/feed_banner_carousel_test.dart test/discover/discover_banner_test.dart
+5: All tests passed!
- 解读:空列表、点击跳详情、自动翻页、按住暂停,以及发现页真实对接链路均通过。
门禁
dart analyze lib test
No issues found!
flutter test
00:20 +382 ~1: All tests passed!
- 解读:静态检查零告警,全量测试通过;
~1为联调测试在无数据时主动跳过。
2026-10-19 | P2 点赞与评论计数展示(Flutter)
- 点赞计数:
InteractionController记录点赞接口返回的count,仅在服务端成功后展示;剧集契约没有初始计数,因此未点赞前不伪造数字。右栏rail-like-count与播放器更多菜单player-more-like-count均展示真实值。 - 评论计数:评论接口无总数字段,
CommentController.exactCount仅在全部顶层评论分页加载完成且无更多页时返回精确数量;仍有多页时标题保持Comments,不把当前页数量冒充总数。 - 切换账号时
clear()同步清理点赞计数,避免跨账号串联。
测试(先红后绿)
flutter test test/home/home_preview_layout_test.dart test/interaction/interaction_controller_test.dart test/comment/comment_controller_test.dart test/comment/drama_comments_sheet_test.dart
00:01 +27: All tests passed!
- 解读:覆盖服务端计数刷新、清空会话、分页完成前不展示总数、分页完成后显示
Comments · N,以及右栏真实数字渲染。
门禁
dart analyze lib test
No issues found!
flutter test
00:20 +385 ~1: All tests passed!
- 解读:静态检查零告警,全量测试通过;
~1为联调测试在无数据时主动跳过。
打包验证
flutter build apk --debug
Running Gradle task 'assembleDebug'... 93.9s
√ Built build\app\outputs\flutter-apk\app-debug.apk
- 解读:debug APK 构建成功,develop 合并后可直接拉取打包验证。
develop 合并与推送
git checkout develop
git merge --no-ff feature/flutter-p0-commerce -m "merge: Flutter P0-P2 App 对接完成"
Merge made by the 'ort' strategy.
69 files changed, 4733 insertions(+), 387 deletions(-)
git push origin develop
de941c8..ec2db68 develop -> develop
- 解读:合并提交
ec2db68,远端origin/develop已更新;合并后dart analyze lib test零告警、flutter test全过(+385 ~1)、flutter build apk --debug成功,工作区干净。
K22 后台管理视觉与交互统一
分支与提交
ReelShortWeb:
5c087f4 chore(admin): 合并注册限流配置项
97fbeda style(web): 统一后台图标与全局视觉
8f3447e chore(web): 合并 K22 后台视觉统一
FruitServer:
5e55171 docs(plans): 增加 K22 后台视觉统一计划
c14b4cb fix(sql): 统一后台菜单图标
be9e381 chore(sql): 合并 K22 菜单图标
功能提交与合并提交 author/committer 均为
Zhou Weidong <502333560@qq.com>。未修改 main、客户端业务代码与 Web 接口契约。
图标体系与扫描
新增 src/constants/icons.ts、src/components/AppIcon/,并将客户端品牌图标
复制为 src/assets/imgs/brand-mark.png。
before-old-prefix=22
before-el-icon=15
before-element-plus-icons=16
old-prefix=0
el-icon=0
element-plus-icons=0
AppIcons unique=54 missing=0
页面与共享组件已不再直接引用旧 Iconify 前缀、<el-icon> 或
@element-plus/icons-vue。剩余两处 <Icon> 分别是 AppIcon 的底层包装与
Icon 自身的在线图标实现。
任务书列出的 language-rounded、view-column-rounded、lock-rounded、
chevron-down-rounded 在当前 Material Symbols JSON 中不存在,使用同语义且
通过存在性校验的 translate-rounded、combine-columns-rounded、
lock-person-rounded、keyboard-arrow-down-rounded。
菜单 SQL 与接口自检
已幂等执行:
$ psql -d fruitshorts -v ON_ERROR_STOP=1 -f sql/data.sql
INSERT 0 3
INSERT 0 4
INSERT 0 19
INSERT 0 13
...
INSERT 0 4
$ psql -d fruitshorts -v ON_ERROR_STOP=1 -f sql/data-phase1.sql
DO
INSERT 0 0
...
UPDATE 5
...
INSERT 0 0
目标菜单回查:
id | title | icon
----+------------+---------------------------------------------
1 | 工作台 | material-symbols:dashboard-rounded
2 | 工作台 | material-symbols:dashboard-rounded
3 | 内容管理 | material-symbols:video-library-rounded
6 | 后台管理 | material-symbols:settings-rounded
15 | 用户管理 | material-symbols:group-rounded
17 | 创作者管理 | material-symbols:movie-edit-rounded
20 | 内容治理 | material-symbols:policy-rounded
22 | 订单与权益 | material-symbols:payments-rounded
24 | 数据看板 | material-symbols:monitoring-rounded
26 | 创作者中心 | material-symbols:video-camera-front-rounded
32 | 运营管理 | material-symbols:campaign-rounded
(11 rows)
管理员登录后调用 /admin/auth/menus:
工作台 material-symbols:dashboard-rounded
内容管理 material-symbols:video-library-rounded
后台管理 material-symbols:settings-rounded
用户管理 material-symbols:group-rounded
创作者管理 material-symbols:movie-edit-rounded
内容治理 material-symbols:policy-rounded
订单与权益 material-symbols:payments-rounded
数据看板 material-symbols:monitoring-rounded
运营管理 material-symbols:campaign-rounded
menus=28 icons=9 allMaterial=true
解读:超级管理员可见菜单接口返回的图标全部为 material-symbols: 前缀。
创作者中心(id 26)按既有规则对超级管理员隐藏,未出现在该菜单树,但数据库
回查已确认其图标正确。
登录页与全局壳
登录页:
- 删除
admin/admin123占位,改为三语占位文案。 - “记住我”默认关闭,只保存用户名;退出和恢复时清理历史密码字段。
- 支持密码框回车提交;请求与动态路由生成完成前保持 loading,防重复。
- 品牌统一使用客户端
splash_mark.png,登录页与侧边栏同一资源。 - ≤960px 压缩品牌区;实测登录卡在 1024×768、800×768、375×812 首屏完整可见。
全局壳:
- 深色选中菜单、当前标签、主题开关轨道统一使用主色派生 token;
深色选中白字对比度由
2.78:1提升到5.00:1。 - 面包屑深色对比度
11.13:1,顶栏16.70:1。 - 标签关闭图标改用
var(--el-text-color-secondary)。 - 删除
body { min-width: 980px }和未使用的旧壳层死选择器。 - 补 1200/768 断点;1024、800、375 下
documentElement.scrollWidth分别等于视口宽度,顶栏无越界元素。 - 用户头像/姓名读取
userStore,不再写死avatar.jpg/Archer。 - “清除缓存并且重置”弹出二次确认,取消后保持当前状态。
- 字体、圆角、主色变量收敛;
#409eff !important已清零。
门禁
$ pnpm lint:eslint
> fruitshorts-admin@1.0.0 lint:eslint /Users/jianghaifeng/Desktop/ReelShort/ReelShortWeb
> eslint --fix --ext .js,.ts,.vue ./src
$ pnpm build:pro
> fruitshorts-admin@1.0.0 build:pro /Users/jianghaifeng/Desktop/ReelShort/ReelShortWeb
> VITE_CJS_IGNORE_WARNING=1 vite build --mode pro
[warn] Circular chunk: element-plus -> vue-chunks -> element-plus. Please adjust the manual chunk logic for these chunks.
[warn] node_modules/.pnpm/mockjs@1.1.0/node_modules/mockjs/dist/mock.js (537:22): Use of eval in "node_modules/.pnpm/mockjs@1.1.0/node_modules/mockjs/dist/mock.js" is strongly discouraged as it poses security risks and may cause issues with minification.
Build successful. Please see dist-pro directory
解读:ESLint 零错误;构建成功。两条 warning 来自既有 chunk 配置与 mockjs 依赖, 本批未改构建配置。
浏览器自查
Codex 已在本地开发服务完成以下自查,不作为用户验收:
- 登录页:三档宽度无横向溢出;800×768 登录卡底边
754.40,375×812 底边772.77,均在首屏内。 - 登录交互:占位为“请输入用户名/请输入密码”;“记住我”默认未勾选; 密码框回车可进入工作台。
- 侧边栏:1024 展开 200px、收起 64px;375 抽屉展开 200px、遮罩关闭正常。
- 顶栏、标签页、面包屑、短剧管理工具栏均正常渲染 Material Symbols Rounded。
- 深色/浅色切换正常;深色选中菜单与当前标签均为白字压深主色,对比度
5.00:1。 - 清除缓存按钮显示“确认清除本地缓存并重新加载后台吗?”,取消有效。
- 浏览器控制台 0 个 error;动态路由刷新期间出现 2 条既有
No match foundrouter warning,随路由生成完成消失,不影响页面。
用户验收步骤与预期
- 运行
pnpm dev,打开http://127.0.0.1:3005/#/login。 预期:暖色品牌登录页;用户名/密码为中文占位;“记住我”默认关闭。 - 输入管理员账号,在密码框直接回车。 预期:按钮进入 loading,随后只跳转一次工作台。
- 检查左侧菜单、顶栏、标签页和短剧管理页工具栏。 预期:图标均为 Material Symbols Rounded,无旧图标混用。
- 展开/收起侧栏,并打开右侧“项目配置”。 预期:品牌 mark 一致;主题开关边界清楚;布局无跳动。
- 切换到深色再切回浅色。 预期:菜单、面包屑、当前标签、关闭图标与开关均清晰可辨。
- 分别以 1024、800、375 宽度查看工作台、短剧管理和登录页。 预期:内容区与顶栏不横向裁切;375 可通过菜单按钮打开侧栏抽屉。
- 点击“清除缓存并且重置”后选择取消。 预期:先出现二次确认,取消后页面状态不变。
最终业务验收由用户在浏览器执行。
K22 复核收尾:静态路由图标
将 src/router/index.ts 中 5 处静态路由 meta.icon 从旧前缀改为
AppIcons:
工作台:AppIcons.dashboard
内容管理:AppIcons.content
用户管理:AppIcons.group
后台管理:AppIcons.settings
src/constants/icons.ts 的历史短名与旧 Iconify 名兜底映射保持不变。
$ rg -n "icon:\s*'(ant-design:|ep:)" src/router/index.ts
(无输出)
$ pnpm lint:eslint
> eslint --fix --ext .js,.ts,.vue ./src
$ pnpm build:pro
Build successful. Please see dist-pro directory
提交:
29465ab fix(web): 统一静态路由图标
5494190 chore(web): 合并 K22 路由图标收尾
功能提交与合并提交 author/committer 均为
Zhou Weidong <502333560@qq.com>,Web develop 已推送。
K22.1 后台收尾
登录页与注册清理
登录 hero 保留品牌 mark、kicker 与标题,删除说明段落和三个标签:
FruitShorts
内容运营后台
短剧内容管理
登录
使用管理员账号进入工作台
用户名
密码
记住我
忘记密码
登录
同时删除已无引用的 login.message/noAccount/pointDrama/pointPublish/pointAccess/ register/checkPassword/otherLogin/hasUser/code/codePlaceholder、注册表单、注册入口、
to-register 事件和注册切换状态。
文件删除证据
删除前在 ReelShortWeb 全仓检索:
[src/assets/imgs/logo.png]
[src/assets/imgs/avatar.jpg]
[public/logo.png]
[public/favicon.ico]
[CustomMenuView]
(以上均无引用)
[RegisterForm]
src/views/Login/components/index.ts
src/views/Login/Login.vue
RegisterForm 的引用已在同一提交中先移除。ReelShortWeb 全仓及开发库均无
CustomMenuView 路由/菜单记录:
$ psql -d fruitshorts -c "SELECT id, title, component FROM sys_menu WHERE component ILIKE '%CustomMenu%';"
id | title | component
----+-------+-----------
(0 rows)
最终删除:
public/favicon.icopublic/logo.pngsrc/assets/imgs/logo.pngsrc/assets/imgs/avatar.jpgsrc/views/permission/CustomMenuView.vuesrc/views/Login/components/RegisterForm.vuemock/
品牌与本地图标
brand-mark.png复制到public/brand-mark.png,favicon 和首屏 loading 均改用它。- 首屏背景改为
#100C0A,标题浅色,loading mark 使用 12px 圆角。 - 删除
public/favicon.ico、public/logo.png。 - 修正侧边栏品牌图任意值类未生成的问题,展开/收起均为 38px、圆角 12px。
- 在线图标关闭后,UnoCSS 的运行时动态类不会自动收集;已把
AppIcons全量加入 safelist,并显式加载本地@iconify/json/json/material-symbols.json。
品牌文件校验:
public/brand-mark.png
src/assets/imgs/brand-mark.png
76e01df1fa0ec94ca59842ea9e15f8084ae6532290ee874a88a3c5718159cea7
两个文件 SHA-256 一致。
Mock 与 env
.env.base VITE_USE_MOCK=false VITE_USE_ONLINE_ICON=false
.env.dev VITE_USE_MOCK=false VITE_USE_ONLINE_ICON=false
.env.pro VITE_USE_MOCK=false VITE_USE_ONLINE_ICON=false
.env.test VITE_USE_MOCK=false VITE_USE_ONLINE_ICON=false
已删除 mock/、viteMockServe、mockPath、生产 mock 注入和
getTestRoleApi 的 /mock/role/list2 分支;tsconfig.json 不再包含 mock。
package.json 移除 @element-plus/icons-vue、@faker-js/faker、
vite-plugin-mock 三个不再直接使用的依赖。
最终扫描
old-prefix=0
el-icon=0
element-plus-icons=0
logo-png=0
mock-build-code=0
mock-directory=absent
src/constants/icons.ts 的旧名兼容映射按要求保留,未计入 old-prefix。
生产产物:
dark-mode-rounded=1
translate-rounded=1
dashboard-rounded=1
video-library-rounded=1
group-rounded=1
settings-rounded=1
dist-pro/brand-mark.png
门禁
$ pnpm lint:eslint
> fruitshorts-admin@1.0.0 lint:eslint
> eslint --fix --ext .js,.ts,.vue ./src
$ pnpm build:pro
> fruitshorts-admin@1.0.0 build:pro
> VITE_CJS_IGNORE_WARNING=1 vite build --mode pro
[warn] Circular chunk: element-plus -> vue-chunks -> element-plus.
Build successful. Please see dist-pro directory
浏览器自查
- 登录 hero 只剩 kicker + 标题,无说明段落和三个标签。
- favicon 为
/brand-mark.png;首屏 loading 为/brand-mark.png, 背景#100C0A。 /brand-mark.png返回image/png;旧/logo.png不再作为图片存在。- 登录后菜单、顶栏、短剧管理工具栏全部使用离线 Material Symbols Rounded。
- 短剧管理页可见图标 22 个,空白 0 个;图标 mask 均有效。
- 侧边栏展开/收起品牌图均为 38×38,与登录页一致。
- 浏览器控制台 error 0 条,无 mock 或旧资源错误。
提交
8aa84a3 docs(plans): 增加 K22.1 后台收尾计划
ada741f style(web): 精简登录品牌与注册入口
8797048 chore(web): 清理 mock 与旧品牌资源
e5c5101 chore(web): 合并 K22.1 后台收尾
功能提交与合并提交 author/committer 均为
Zhou Weidong <502333560@qq.com>。
K23 后台视觉深化
主色
--el-color-primary: #c4322a
--el-color-primary-light-3: #d3615b
--el-color-primary-light-5: #e19995
--el-color-primary-light-7: #f0c2c0
--el-color-primary-light-8: #f5d9d8
--el-color-primary-light-9: #faeeed
--el-color-primary-dark-2: #9d2822
旧用户持久化的 #409eff 在 store 恢复时迁移为 #c4322a。默认蓝扫描:
$ rg '#409eff|#79bbff|#a0cfff|#c6e2ff|#d9ecff|#ecf5ff|#337ecc|rgba?\(64[ ,]+158[ ,]+255' src
(无输出)
二级菜单图标为空
data.sql 与 data-phase1.sql 均加入:
UPDATE sys_menu SET icon = '' WHERE type = 'MENU';
type | total | empty_icon | with_icon
---------+-------+------------+-----------
CATALOG | 10 | 0 | 10
MENU | 23 | 23 | 0
parents=9 parentMissingIcon=0
children=19 childWithIcon=0
菜单管理仅在 type='CATALOG' 时显示图标选择,保存 MENU 时强制 icon 为空。
渲染层对嵌套项强制不输出 AppIcon,历史脏值也不保留图标空位。
对齐实测
1024px: parent text left=42px, row=44px; child text left=42px, row=40px, icon=0
375px: parent text left=42px, row=44px; child text left=42px, row=40px, icon=0
popper: child row=40px, icon=0
浅色选中为浅主色底 + 主色文字;暗色选中为深主色底 + 白字, 暗色实测对比度 8.73:1。
短剧编辑弹窗
- 宽 680px,三区块,内容滚动、底部固定;375px 下宽 345px 且无横向溢出。
- 数字输入固定 180px,控件位于右侧;1024/375 实测均为 180px。
- 封面 96×128 预览、basename、状态 chip、更换/移除、查看原图、进度遮罩和错误提示。
- 删除原始 URL 输入框。
- txt 实测提示“封面仅支持 JPG、PNG 或 WebP 格式”;限制 5MB。
- 空名称保存显示字段错误“请输入短剧名称”;类型必选。
- 保存/上传中按钮禁用,关闭被拦截。
锁屏弹窗
- 宽 440px,高度 360px;375px 下宽 359px。
- 头部底边线 0px,关闭图标距右边缘 22px。
- 增加“输入密码解锁当前会话”;密码框回车可锁定,取消可关闭。
- 取消/锁定按钮均为 96×36px。
- 删除
console.log('set: ', val)。
门禁
$ pnpm lint:eslint
> eslint --fix --ext .js,.ts,.vue ./src
$ pnpm build:pro
[warn] Circular chunk: element-plus -> vue-chunks -> element-plus.
Build successful. Please see dist-pro directory
浏览器自查:1024/375、明暗主题通过;控制台 error 0;无资源 404。
提交
5356f24 docs(plans): 增加 K23 后台视觉深化计划
91bbfd5 docs(plans): 更正 K23 子菜单图标口径
ba90bf9 style(web): 统一辣椒红主色与菜单层级
805d7dd feat(web): 重做短剧编辑弹窗
898e439 fix(web): 优化锁屏弹窗布局与交互
ee3bb1c chore(web): 合并 K23 后台视觉深化
b400e36 fix(sql): 清空二级菜单图标
功能提交与合并提交 author/committer 均为
Zhou Weidong <502333560@qq.com>。
用户浏览器验收
- 登录后检查按钮、链接、焦点环、标签和选中菜单:均应为辣椒红,无 Element 蓝。
- 展开内容管理/后台管理:一级项有图标,二级项只有文字,父子文字左边缘同线。
- 收起侧栏打开 popper:二级项无图标、行高 40px。
- 编辑短剧:检查三区块、固定数字框、封面预览与“查看原图”,不再出现原始 URL 输入。
- 上传非法格式或超过 5MB 图片:弹窗内显示错误且原图不变。
- 打开锁屏:标题/说明清晰,可取消,回车可锁定。
- 切换明暗主题并缩至 375px:布局不溢出,暗色选中态白字清晰。
- 2026-10-19 K23 菜单对齐补丁:一级 padding-left=16px、左侧 margin=0,二级 margin-left=42px;1024 实测父子文字 left 均为 42px,Web 提交
40fbd6e,合并fe1ae95,pnpm build:pro通过。
K23.1 后台修正
品牌文字
app.ts 浅色分支改为:
logoTitleTextColor = #303133
topHeaderTextColor = #303133
持久化旧主题在恢复时重新执行菜单/顶栏主题计算。浏览器实测:
FruitShorts logo text = rgb(48, 49, 51)
Top header text = rgb(48, 49, 51)
Breadcrumb text = rgb(96, 98, 102)
浅色侧边栏不再出现蓝色品牌字。
删除按钮
覆盖并统一为 type="danger" 实心红底白字:
- 短剧、剧集、轮播图、类型、公告、商品、评论、敏感词
- 管理员、角色、角色分类、菜单
- 创作者分集删除、撤回、冻结
- 订单退款、权益回收
- 短剧封面“移除”
表格内按钮均为 size="small";danger-action、danger link、danger plain
扫描结果均为 0。删除确认弹窗带 confirmButtonClass: 'el-button--danger'。
浏览器实测危险按钮:
background = rgb(245, 108, 108)
color = rgb(255, 255, 255)
height = 28px(表格按钮)
white-space = nowrap
删除确认按钮同样为 rgb(245,108,108) 背景、白字。
布局回归
1440×900:
品牌图/文字中心线均为 25px
logo text color = rgb(48,49,51)
document scrollWidth = clientWidth = 1440
1024×768:
菜单父文字 left=42px,父行高 44px
菜单子文字 left=42px,子行高 40px,子图标 0
短剧弹窗宽 680px,内容 scrollWidth=clientWidth
数字框 180px ×2,底部按钮可见
锁屏弹窗 440×360,确认/取消按钮 96×36
375×812:
菜单父/子文字 left 均为 42px
短剧弹窗宽 345px,无横向滚动,底部按钮固定可见
数字框仍为 180px ×2
锁屏弹窗宽 359px,按钮不裁切
表格页:
短剧/剧集/轮播图/类型/公告/商品/治理/角色分类
document scrollWidth = clientWidth = 375
红色删除按钮无换行
门禁
$ pnpm lint:eslint
> fruitshorts-admin@1.0.0 lint:eslint
> eslint --fix --ext .js,.ts,.vue ./src
$ pnpm build:pro
[warn] Circular chunk: element-plus -> vue-chunks -> element-plus.
Build successful. Please see dist-pro directory
浏览器控制台 error 0,资源 404 0。
提交
38c8f51 docs(plans): 增加 K23.1 后台修正计划
e77db70 fix(web): 修正浅色品牌文字颜色
f5b399a fix(web): 统一危险操作按钮样式
6f52230 chore(web): 合并 K23.1 后台修正
功能提交与合并提交 author/committer 均为
Zhou Weidong <502333560@qq.com>。
K23.1 布局复核修补
-
danger 禁用态:管理员行实测背景
rgb(245,247,250)、文字rgb(168,171,178)、not-allowed,可点击删除仍为红底白字。 -
锁屏弹窗:卡片实测
440×440,footer 底边588、卡片底边604,取消/锁定按钮底边569,均完整在卡片内。 -
封面预览:桌面图片内容区
94×126(96×128 卡片内),object-fit:cover;375 下卡片恢复96×128,纵向排列且与信息区无重叠,页面无横向溢出。 -
门禁:
pnpm lint:eslint零错误,pnpm build:pro成功。 -
Web 提交
c8bf4a8,合并提交73da0bb。 -
2026-10-19 K23.1 工作台菜单:单子节点渲染合并父子 meta,仅父 icon 兜底;实测工作台文字 left=42px、内容管理文字 left=42px,内容子项仍无图标且 left=42px。Web 提交
bb03a5a,合并f023c7d,lint/build 通过。 -
2026-10-19 K23.1 二级菜单背景:inline 与 popper 的 hover/active 背景强制 transparent;浅色文字为主色、深色为白色,一级背景保持不变。浏览器实测浅/深色均为
rgba(0,0,0,0)。Web 提交f6f4d26,合并9f92d11。 -
2026-10-19 K23.1 剧集顶部布局:左侧“当前短剧”+剧名+集数,右侧“切换短剧”+320-360px 下拉;1024 左右中心差 0.004px、下拉宽 327.68px,表头完整且 250px 固定操作列可见;375 纵向堆叠、下拉 100%、页面 scrollWidth=clientWidth=375。Web 提交
122aa21,合并046400a,lint/build 通过。 -
2026-10-19 K23.1 列表图片预览:新增
AppImage并接入短剧封面、轮播图、App 用户头像、创作者作品封面、分集封面;短剧封面 44×56、轮播图 160×90 尺寸保持不变。浏览器实测短剧/轮播图 viewer 可打开、下一张切换、关闭;375 页面无横向溢出。当前用户数据无头像且管理员会话不可进入创作者中心,后两处完成代码接入但未取得对应业务数据点击证据。Web 提交8a84f24,合并5db565b。 -
2026-10-19 K23.1 轮播图编辑弹窗:680px 三段布局,240×135 图片预览、跳转配置、排序/状态;移除原始 URL 输入,加入图片与条件跳转校验、上传校验与进度遮罩。1024 弹窗宽 680px、正文 scrollWidth=clientWidth、footer 可见;375 弹窗宽 345px、图片区纵向、卡片 240×135、信息区无重叠、页面无横向溢出。Web 提交
f281dcf,合并685d4fd,lint/build 通过。 -
2026-10-19 K23.1 剧集编辑弹窗:680px 三段布局,基础信息、视频文件、付费与状态;视频区固定 240×135,移除原始 URL 输入,加入 MP4/MOV、500MB、上线视频必填校验和上传进度。1024 弹窗宽 680px、视频卡 240×135、数字框 180px、footer 可见;375 弹窗宽 345px、视频区纵向且不重叠、页面无横向溢出。格式校验实测显示“视频仅支持 MP4 或 MOV 格式”。Web 提交
2b5dda7,合并83e535d,lint/build 通过。
K24 客户端 UI 对齐设计稿(2026-10-19)
范围:设计系统、3 Tab 底部导航、首页沉浸层、发现页;详情/播放器/我的/登录留 K25/K26。
设计口径:采用 README.md + screens/01-home.html + screens/02-discover.html
的 #0B0C10 / #16181F / #1D1E28 / #FF5B3D / #FF4321 / #9278EA,不使用
DESIGN.md 顶部 YAML 的 #ffb4a5/#cdbdff。
落地:
AppColors改 Obsidian Flare,保留blue/blueSoft/ink/card等旧名并新增secondary/lavender/onSurface/subtle/success/border。- 字体 Outfit(标题)+ Plus Jakarta Sans(正文)共 7 个 OFL TTF,放在
assets/fonts/,两份 OFL 许可证随包;.gitignore放行 fonts 目录。 - 新增
GlassPanel:BackdropFilter16/24px、白 8-14% 描边、圆角 16/24/26。 - 底部导航 3 Tab:
tab-home/tab-discover/tab-my,删除tab-my-list;选中橙色图标、 文案与 3px 圆点,背景#0B0C10/95+ blur;My List 区块并入 Me 页。 - 首页保留
PlayerPage(homeMode: true)播放链路,新增HomeFeedOverlay:剧名/HOT/ Season/搜索/更多,头像 Follow +、Like/Comment/Bookmark/Share 玻璃钮,底部 26px 玻璃信息卡、题材 chips、集数、双行简介、1.5px 进度、Follow Series/Episodes。 下载与 PiP 收进“更多”底部菜单。 - 发现页移除顶层 3D 轮播;新增品牌行+头像、44px 搜索框(现有过滤与 searchRequest 聚焦)、 分类 chips、观看记录 Continue Watching(无记录隐藏)、4 个快捷入口、2 列 Trending (3/4.2、16px 圆角、HOT/Free 有数据才显示、viewCount 展示)。
数据缺口:Drama 无评分、完结、VIP、剧级点赞/评论数;对应 UI 隐藏,不补假数据。
Continue Watching 只有 episodeId,能匹配到当前剧集列表时才显示集号。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:48 +347: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'... 26.4s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
构建说明:用户当时有 flutter run --device-id=00008101... 占用主工作区 build/,
因此在 /tmp/reelshort-k24-final 的独立 git worktree 执行 flutter pub get 与
flutter build apk --debug,避免并发构建冲突。
Git:
eae1c53 feat(theme): 接入 Obsidian Flare 设计系统
e8c1859 feat(ui): 重做三 Tab 首页与发现页
4553606 merge: K24 客户端 UI 对齐设计稿
提交与合并 author/committer 均为 Zhou Weidong <502333560@qq.com>。
ReelShort develop 与 feature/flutter-k24-design-system 已推送。
真机验收步骤(设备侧取证由用户执行):
flutter run打开 App,确认默认进入 Home 沉浸 feed;底部仅 Home/Discover/Me 三个 Tab。- Home 检查剧名/HOT/Season、右侧头像+Follow、Like/Comment/Bookmark/Share、底部玻璃卡、 集数、简介、橙色进度、Follow Series/Episodes;“更多”内有下载与 PiP。
- 点 Discover,确认品牌行、搜索框、分类 chips、4 快捷入口、2 列 Trending;输入剧名过滤, 清空恢复;有观看记录时显示 Continue Watching,无记录时不显示。
- 点 Me,确认账号内容与 History/Watchlist/Liked 在同一页;切回 Home 播放进度与收藏状态保留。
- 深色/浅色系统、320×568 与 390×844 小屏检查无溢出、文字不截断。
K25 客户端详情页 + 播放器(2026-10-19)
范围:详情页与 homeMode=false 卡片播放器;homeMode=true 首页沉浸 feed 保持 K24 现状。
详情页:
- 16:9 hero(当前模型只有
posterUrl)、底部渐变、玻璃返回/分享/收藏/更多。 - 集数 pill、24px 标题、Season 副标题、
viewCount、题材标签;评分/完结/榜单项无字段隐藏。 - 16px 玻璃简介卡,2 行 + More/Less。
- 橙色全宽 Start Watching/继续观看 + 48×48 收藏/下载;举报保留在更多菜单。
- Episodes 标题 + All 范围 chip;46×44 横向集数 chips,锁定项紫色;2 列剧集卡, 390 宽下缩略图实测 96×64,含 Free/Coin、时长、锁态与下载入口。
播放器(从详情进入):
- 顶部返回、剧名 + Ep.x、更多(下载/PiP)。
- 9:10 圆角 16 视频框、Auto-Next/1.0x pill、中心橙色播放、右侧 36px 点赞/全屏。
- 1.5px 进度条:白色 30% 缓冲、
#FF5B3D播放段、白色 thumb;左中右时间/集数信息,保留拖动 seek。 - Episodes / Comments / Next Ep 三按钮;末集 Next 置灰。
PlayerFeaturedComment复用CommentController,无评论隐藏;VIP/总数无字段不显示。- 保留票据三态、自动连播、PiP、下载、点赞/收藏/评论与播放会话协议。
数据缺口:coverUrl、评分、完结、Top 排名、Trailer/4K、VIP、剧级点赞/评论总数、场景标签、
集数范围、倍速能力均无模型字段;按 INBOX 隐藏或不伪造。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:30 +352: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'... 26.3s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
构建说明:主工作区仍有用户侧 flutter run,因此在 /tmp/reelshort-k25-final
独立 worktree 执行 flutter pub get 与 flutter build apk --debug,避免并发占用 build/。
Git:
ec163f9 feat(detail): 重做详情页视觉结构
689063a feat(player): 新增卡片式播放器
04fddce merge: K25 客户端详情页与播放器
提交与合并 author/committer 均为 Zhou Weidong <502333560@qq.com>。
ReelShort develop 与 feature/flutter-k25-detail-player 已推送。
真机验收步骤(设备侧取证由用户执行):
- 从首页/发现进入详情,检查 16:9 hero、玻璃按钮、集数/播放量/题材、简介展开。
- 点 Start Watching,确认进入卡片播放器:9:10 视频框、进度条、三按钮行。
- 拖动进度条、切换下一集、末集按钮置灰;点 Episodes/Comments 打开现有弹窗。
- 有评论时检查精选评论卡与 View all;无评论时应隐藏。
- 从播放器更多菜单验证下载/PiP;点全屏进入横屏,退出后回到卡片布局。
- 检查收藏、举报、续看进度、票据失败重试与自动连播未回退。
K25 修复:详情/选集进入恢复全屏(2026-10-19)
player_view.dart移除!homeMode && !fullscreen的卡片播放器分支,详情 CTA 与集数 chip 进入后统一走原有全屏PageView+_PlaybackOverlay,与首页 feed 一致。- 删除仅卡片模式使用的
_buildCardPlayer/_buildCardVideo/_cardTopBar/_cardActions/_showCardMore/_CardIconButton/_CardActionButton,并删除card_seek_bar.dart、player_featured_comment.dart。 player_logic.dart删除仅卡片模式使用的hasNextEpisode/playNextEpisode; 票据、进度、PiP、下载、互动、选集、评论与自动连播逻辑保持原样。- 删除
player_card_view_test.dart,新增player_fullscreen_test.dart: 发现卡片进入、详情 CTA、详情集数 chip 三条路径均断言存在rail-like/rail-save/rail-comments/rail-share、PiP、Clear screen 与 Slider,且不存在card-player-*Key。 - 清理仅卡片模式使用的
autoNextOn/viewAll/enterFullscreenl10n key。
门禁原始输出:
$ dart analyze lib test
No issues found!
$ flutter test
00:28 +351: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'... 23.7s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
构建仍在 /tmp/reelshort-player-fullscreen 独立 worktree 完成,避免与用户侧
flutter run 并发占用主 build/。
Git:
1c94b72 fix(player): 恢复详情与选集全屏播放
eefabb6 merge: 修复播放器全屏进入方式
提交与合并 author/committer 均为 Zhou Weidong <502333560@qq.com>;
develop 与 fix/flutter-player-fullscreen 已推送。真机验收由用户执行。
K26 客户端六屏按「移动端设计预览」校正(2026-10-19)
权威文件:/Users/jianghaifeng/Desktop/ReelShort/docs/移动端设计预览.html。
保留 K24 的 Outfit / Plus Jakarta Sans、全部 Provider 业务逻辑与接口。
Token:
bar=#0D0D11、card=#1B1C21、cardAlt/raised=#1C1D21、input=#25252A、quick=#202126、goldCard=#201B1E、text=#E6E1E3、muted=#D2CDD0、subtle=#9A96A3、accent=#FFA490。- 卡片圆角 12、按钮 9、chips 20、封面 10;导航高 54、图标 17、文字 9; 进度条 3px。
六屏:
- 首页:剧名 + 28px 搜索/菜单;Like/Comment/Share/Favorite 四项;底部 14px 玻璃卡 (tags、第 x/共 y 集、13px 标题、34px 追剧/选集);去掉 HOT/Season/头像 Follow。
- 发现:Logo + 发现 + 搜索/头像;36px 搜索框;推荐分类 chips;52×66 Continue Watching; 4 个 62px 快捷入口;热门短剧标题 + 2 列 120px 封面网格。
- 详情:190px hero + 28px 返回;N 集、18px 标题、11px 简介、40px 开始观看、选集 chips; 收藏/下载/分享/举报收进更多;移除 K25 统计行、CTA 行与剧集预览卡。
- 播放器:全屏 46px 顶栏;中心 52px 播放、1.0x;3px 进度;32px 选集/评论/下一集; 精选评论卡;无右侧互动栏;下载/PiP/点赞/收藏/分享收进更多。
- 我的:Logo + 我的 + 搜索/头像;48px 用户行;
#201B1E金币卡;50×64 Continue Watching; 历史/收藏/喜欢 Tabs;历史卡;语言行;保留通知/下载/账号中心入口。 - 登录:64px 渐变 Logo + 水果短剧 + 副标题;Google/手机号/邮箱三个 44px 入口; Google/手机号提示即将开放,邮箱进入 K21 表单;底部法律文案。
新增/更新测试:首页预览卡、发现搜索/Continue Watching/2 列网格、详情选集 chips、 全屏播放器三按钮、Me 页用户/金币/继续观看/语言行、登录三入口。
门禁原始输出:
$ dart analyze lib test
No issues found!
$ flutter test
00:30 +354: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'... 27.2s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
构建在 /tmp/reelshort-k26-final 独立 worktree 完成,避免与用户侧 flutter run
并发占用主 build/。
Git:
87db548 feat(theme): 校正 K26 预览色板与导航
21d457f feat(ui): 校正首页发现详情播放器预览
fecc5b0 feat(ui): 新增登录入口与我的页预览
8767b56 test(ui): 更新三 Tab 预览断言
a5398da merge: K26 客户端六屏按预览校正
提交与合并 author/committer 均为 Zhou Weidong <502333560@qq.com>。
ReelShort develop 与 feature/flutter-k26-mobile-preview 已推送。
真机验收步骤(设备侧取证由用户执行):
- 首页检查剧名/搜索/菜单、四项互动、底部玻璃卡与 34px 追剧/选集按钮。
- 发现检查 36px 搜索、分类 chips、Continue Watching、4 快捷入口、2 列热门短剧。
- 详情检查 190px hero、N 集、18px 标题、40px 开始观看与选集 chips;更多菜单含收藏/下载。
- 从详情进入播放器,检查全屏顶栏、中心播放、3px 进度、三按钮与精选评论。
- 我的检查用户行、金币卡、Continue Watching、历史/收藏/喜欢与语言行。
- 登录页检查三个入口;Google/手机号提示即将开放,邮箱进入现有表单。
- 320×568、360×720、390×844 与深色/浅色检查无溢出。
K26 清理:预览为唯一权威(2026-10-19)
按用户口径移除旧 UI 与死代码,不保留新旧两套:
- 删除旧 Discover 3D 轮播
cover_carousel.dart、cover_carousel_test.dart、home_banner_source_test.dart;发现页不再存在轮播/banner 分支。 - 删除旧首页侧滑
HomeQuickDrawer,改为预览 token 的HomeMenuSheet底部菜单; 保留drawer-*业务入口 Key(现指新菜单项,不再引用旧 Drawer 组件)。 - 删除无入口的横屏全屏实现:
PlayerLogic.fullscreen/setFullscreen、_FullscreenControls、watchFullscreen/exitFullscreenl10n。 - 删除清屏旧 UI:
screenCleared/setScreenCleared、首页更多里的清屏项、 播放器退出清屏按钮、clearScreen/exitClearScreenl10n。 - 删除旧 Key 及其测试:
tab-my-list、home-all-dramas-title、card-player-*、home-feed-clear、旧清屏/沉浸测试。 - 全仓 grep 复核:
CoverCarousel|HomeQuickDrawer|_FullscreenControls|setFullscreen|setScreenCleared|card-player-|detail-episode-grid|rail-download|tab-my-list均为 0 引用。
六屏仍严格对应预览:首页玻璃卡四互动、发现搜索/Continue/2 列、详情 190px hero/选集 chips、全屏播放器三按钮、Me 用户/金币/Continue/语言、登录三入口。
门禁原始输出:
$ dart analyze lib test
No issues found!
$ flutter test
00:26 +343: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'... 25.5s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
构建在 /tmp/reelshort-k26-cleanup 独立 worktree 完成。
Git:
5422581 refactor(ui): 清理 K26 旧 UI 与死代码
c825025 merge: 清理 K26 旧 UI 与死代码
提交与合并 author/committer 均为 Zhou Weidong <502333560@qq.com>;
develop 与 fix/flutter-k26-preview-authority 已推送。
K26 修复:详情播放器暂停重复按钮(2026-10-19)
player_view.dart:34新增shouldShowFeedPauseIndicator(...),条件为homeMode && selected && ready && !playing && !pip。player_view.dart:314独立中心播放提示改用该条件,并加 Keyhome-feed-center-play;详情/选集进入不再渲染这层,只保留_PlaybackOverlay的player-play-toggle。- 首页
homeMode=true暂停时仍显示独立中心播放提示,行为不变。 player_fullscreen_test.dart新增:详情播放暂停后player-play-toggle仅 1 个、home-feed-center-play为 0、 全屏播放图标仅 1 个;另加条件单测验证首页 true、详情 false、播放中 false。
门禁原始输出:
$ dart analyze lib test
No issues found!
$ flutter test
00:27 +345: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'... 24.5s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
构建在 /tmp/reelshort-player-single-pause 独立 worktree 完成。
Git:
f0c5354 fix(player): 移除详情暂停重复按钮
568f051 merge: 修复详情暂停重复按钮
提交与合并 author/committer 均为 Zhou Weidong <502333560@qq.com>;
develop 与 fix/flutter-player-single-pause 已推送。
K26 修复:播放器共享中心按钮与控制层自动隐藏(2026-10-19)
- 新增
lib/pages/player/widgets/player_center_toggle.dart: 52×52、圆形Color(0x80000000)、播放/暂停图标 26。 - 首页 feed 暂停提示与
_PlaybackOverlay中心按钮统一改用PlayerCenterToggle;首页 Keyhome-feed-center-play,播放页 Keyplayer-play-toggle。 _PlaybackOverlay改为 StatefulWidget:进入显示控制层,Timer 2.5 秒后隐藏; 点击player-video-tap重新显示;控制层可见时点击视频会切换播放/暂停。 dispose 取消 Timer。- 隐藏时只保留视频画面与点击层;PiP 分支不构建 overlay,逻辑不受影响。
- 间距:播放器顶栏左右 14、进度条上方 8、三按钮行上 10、评论卡上 12, 外层 SafeArea;首页右侧互动栏距右 12、距信息卡 16。
门禁原始输出:
$ dart analyze lib test
No issues found!
$ flutter test
00:28 +347: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'... 24.7s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
构建在 /tmp/reelshort-player-controls 独立 worktree 完成。
Git:
03e34b3 fix(player): 统一暂停按钮并自动隐藏控制层
e03ea76 merge: 统一暂停按钮并自动隐藏控制层
提交与合并 author/committer 均为 Zhou Weidong <502333560@qq.com>;
develop 与 fix/flutter-player-controls 已推送。
K26 修复:首页标题、Me Tabs 与六屏顶栏间距(2026-10-19)
- 首页底部卡片标题:
home_feed_overlay.dart:201改为优先episode.title, 空值时回退localizedDramaTitle(l10n, drama);Keyhome-feed-episode-title保留。 - Me 页历史/收藏/喜欢:改为左侧固定间距 20px、横向可滚动;文字 14px,
选中橙色并显示 2px 下划线,未选中
#E4DBDD;垂直 padding 6,内容间距 12; Keysmine-library-tab-0/1/2保留。 - 顶栏按钮统一 36×36、图标 18: 首页搜索/菜单、发现搜索/头像、我的搜索/头像、播放器返回/更多、详情 Hero 返回/更多。 搜索/菜单/头像间距 8;播放器顶栏左右 14;320 宽回归通过。
- 首页玻璃卡:padding 12,tags→集数 8、集数→标题 8、标题→按钮 10; 右侧互动栏距右 12、距信息卡 16。
门禁原始输出:
$ dart analyze lib test
No issues found!
$ flutter test
00:29 +349: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'... 25.0s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
构建在 /tmp/reelshort-ui-spacing 独立 worktree 完成。
Git:
2fd92cd fix(ui): 修正六屏顶栏与内容间距
cbbd4c8 merge: 修正六屏顶栏与内容间距
提交与合并 author/committer 均为 Zhou Weidong <502333560@qq.com>;
develop 与 fix/flutter-ui-spacing 已推送。
K26 修复:详情选集等宽懒加载网格(2026-10-19)
detail-episode-chips从Wrap改为GridView.builder:shrinkWrap: true、NeverScrollableScrollPhysics、懒加载;mainAxisSpacing/crossAxisSpacing=8、childAspectRatio=1.35、圆角 9。- 列数由 LayoutBuilder 计算:6 列格子宽度 ≥40 时保持 6 列(390/320 宽均为 6), 否则回退 5 列。
- 选集按
episode.number升序渲染;使用(originalIndex, episode)映射, 点击仍调用logic.openPlayer(context, originalIndex)。 - 测试覆盖 80 集:6 列、芯片等宽、1→6 同行/7 换行、倒序输入仍升序、
点击第 12 集打开
PlayerPage.initialIndex == 11、320 宽仍 6 列。
门禁原始输出:
$ dart analyze lib test
No issues found!
$ flutter test
00:29 +351: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'... 22.9s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
构建在 /tmp/reelshort-detail-grid 独立 worktree 完成。
Git:
fbfb976 fix(detail): 选集改为等宽懒加载网格
f4e1a54 merge: 修正详情选集等宽网格
提交与合并 author/committer 均为 Zhou Weidong <502333560@qq.com>;
develop 与 fix/flutter-detail-episode-grid 已推送。
K27 播放器控制层:清屏 + 取消自动隐藏(2026-10-19)
- 删除
_PlaybackOverlayState的 Timer/自动隐藏;控制层进入默认可见并常驻, 仅由清屏与点画面恢复改变。 - 播放页顶栏新增
player-clear-screen(36×36,Icons.fullscreen_rounded), 点击隐藏顶栏、中心按钮、进度条、三按钮、评论卡和 1.0x;点player-video-tap恢复,不改变播放态。 - 首页
HomeFeedOverlay新增home-feed-clear-screen;清屏后隐藏标题/rail/信息卡/ 渐变遮罩,点home-feed-video-tap恢复,不改变播放态。 - 中心按钮只在
playing时显示暂停;点击后暂停且按钮消失;暂停时点画面恢复播放, 按钮随播放态恢复。删除shouldShowFeedPauseIndicator/home-feed-center-play。 - 新增 l10n
clearScreen三语;票据/seek/选集/评论/下一集/下载/PiP 未改。
门禁原始输出:
$ dart analyze lib test
No issues found!
$ flutter test
00:28 +351: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'... 24.6s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
构建在 /tmp/reelshort-player-clear-screen 独立 worktree 完成。
Git:
f613033 fix(player): 改为显式清屏交互
60ec19f merge: 改为显式清屏交互
提交与合并 author/committer 均为 Zhou Weidong <502333560@qq.com>;
develop 与 fix/flutter-player-clear-screen 已推送。真机验收由用户执行。
K27.1 中心按钮口径:仅暂停时显示(2026-10-19)
- 播放中不渲染中心按钮;点击画面切换暂停,暂停后显示
player-play-toggle(PlayerCenterToggle(playing:false))。 - 点中心按钮或再点画面恢复播放,按钮立即消失。
- 首页恢复暂停态
home-feed-center-play;播放中、清屏、PiP 时不渲染。 - 清屏时中心按钮一并隐藏,点画面仅恢复控制层,不改变播放态。
- 无定时器,控制层仍常驻。
门禁原始输出:
$ dart analyze lib test
No issues found!
$ flutter test
00:29 +352: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'... 24.8s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
构建在 /tmp/reelshort-paused-play-toggle 独立 worktree 完成。
Git:
0eabb0a fix(player): 仅在暂停时显示播放按钮
3fcfd68 merge: 仅在暂停时显示播放按钮
提交与合并 author/committer 均为 Zhou Weidong <502333560@qq.com>;
develop 与 fix/flutter-paused-play-toggle 已推送。
K27.2 清屏态退出按钮(2026-10-19)
- 新增共享
ExitClearScreenButton:36×36、Color(0x80000000)、 白色Icons.fullscreen_exit_rounded18。 - 播放页清屏后右上
top:8/right:12显示player-exit-clear-screen; 点击仅恢复控制层,播放态不变。 - 首页 feed 清屏后显示
home-feed-exit-clear-screen;点击恢复 overlay, 播放态不变。 - 保留清屏态点画面恢复手势;退出按钮不自动隐藏。
- 新增 l10n
exitClearScreen三语。
门禁原始输出:
$ dart analyze lib test
No issues found!
$ flutter test
00:27 +352: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'... 22.8s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
构建在 /tmp/reelshort-exit-clear 独立 worktree 完成。
Git:
e2e809e fix(player): 增加退出清屏浮动按钮
a2de5e8 merge: 增加退出清屏浮动按钮
提交与合并 author/committer 均为 Zhou Weidong <502333560@qq.com>;
develop 与 fix/flutter-exit-clear-screen 已推送。
K27.3 清屏态点击 / 退出按钮位置 / 滑动复位(2026-10-19)
- 播放页
_onVideoTap无论清屏与否都调用播放/暂停切换;清屏态不再因点画面恢复控制层。 - 首页
home-feed-video-tap同样改为播放/暂停切换,保持清屏。 - 退出清屏只由
player-exit-clear-screen/home-feed-exit-clear-screen触发; 不改变播放态。 - 首页退出按钮包入 SafeArea(top 8 / right 12),避免状态栏/刘海遮挡。
- 首页
PageView.onPageChanged在homeMode下复位_feedChromeVisible=true, 滑动切剧自动退出清屏。 - 无定时器,控制层常驻;仅暂停时显示中心播放按钮口径不变。
门禁原始输出:
$ dart analyze lib test
No issues found!
$ flutter test
00:37 +353: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'... 29.4s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
构建在 /tmp/reelshort-clear-tap 独立 worktree 完成。
Git:
aea130b fix(player): 修正清屏态点击与滑动复位
bc5feeb merge: 修正清屏态点击与滑动复位
提交与合并 author/committer 均为 Zhou Weidong <502333560@qq.com>;
develop 与 fix/flutter-clear-screen-tap 已推送。真机验收由用户执行。
K27.4 清屏跨滑动保持 + 中心按钮常驻双态(2026-10-19)
- 撤销
PageView.onPageChanged的_feedChromeVisible=true复位;首页清屏后 滑动切剧仍保持清屏。 - 播放页中心
PlayerCenterToggle移出控制层条件,清屏时仍显示: 播放中playing:true(暂停图标),暂停中playing:false(播放图标),点击切换。 - 首页中心
home-feed-center-play不再依赖清屏状态,仅受 PiP/chromeHidden 控制; 同样双态显示并可点击切换。 - 清屏态点画面仍切换播放/暂停并保持清屏;退出只由右上退出按钮触发。
- 无定时器,顶栏/底部控件仍常驻。
门禁原始输出:
$ dart analyze lib test
No issues found!
$ flutter test
00:29 +353: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'... 23.6s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
构建在 /tmp/reelshort-clear-state 独立 worktree 完成。
Git:
0d977da fix(player): 保持清屏并常驻中心按钮
b1747af merge: 保持清屏并常驻中心按钮
提交与合并 author/committer 均为 Zhou Weidong <502333560@qq.com>;
develop 与 fix/flutter-clear-screen-state 已推送。真机验收由用户执行。
K27.5 中心按钮最终口径:仅暂停时显示(2026-10-19)
- 播放中(普通态/清屏态)
player-play-toggle不渲染。 - 暂停时中心显示
PlayerCenterToggle(playing:false);点它或点画面恢复播放, 按钮立即消失。 - 播放页中心按钮仍在
_controlsVisible控制层块外,保证清屏 + 暂停时可见。 - 首页
home-feed-center-play只在!session.userWantsPlay时渲染; 清屏不影响该规则。 - 清屏跨滑动保持、退出按钮、清屏态点画面播放切换、无定时器均保留。
门禁原始输出:
$ dart analyze lib test
No issues found!
$ flutter test
00:28 +353: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'... 23.1s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
构建在 /tmp/reelshort-center-paused 独立 worktree 完成。
Git:
71e317f fix(player): 中心按钮仅暂停时显示
99a57ec merge: 中心按钮仅暂停时显示
提交与合并 author/committer 均为 Zhou Weidong <502333560@qq.com>;
develop 与 fix/flutter-center-toggle-paused-only 已推送。真机验收由用户执行。
K27.6 首页集数左贴 + 清屏状态跨集共享(2026-10-19)
- 首页底部卡片 tags 与
第 n 集 / 共 n 集放入同一 Wrap(spacing 6、runSpacing 4、 垂直居中),集数紧跟标签左侧,不再右对齐;长度超出可换行。 - 清屏状态提升到
_PlayerPageState._chromeVisible,首页与选集播放共用。_PlaybackOverlay只接收controlsVisible/onClear/onExitClear/onTogglePlay, 不再持有显隐状态。 - 选集页清屏后滑动切下一集仍保持清屏,退出按钮仍在;退出后恢复顶栏/底部。
- 首页清屏跨滑动保持、中心按钮仅暂停显示、点画面切播放等规则不变。
门禁原始输出:
$ dart analyze lib test
No issues found!
$ flutter test
00:28 +354: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'... 24.0s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
构建在 /tmp/reelshort-clear-shared 独立 worktree 完成。
Git:
5b7a8bd fix(player): 共享清屏状态并左贴集数
5ca5846 merge: 共享清屏状态并左贴集数
提交与合并 author/committer 均为 Zhou Weidong <502333560@qq.com>;
develop 与 fix/flutter-clear-screen-shared 已推送。真机验收由用户执行。
K27.7 倍速入口改为底部弹窗(2026-10-19)
- 播放器右下角
1.0x改为可点击player-speed,显示当前倍速。 - 点击弹出
player-speed-sheet,档位 0.5/0.75/1.0/1.25/1.5/2.0, Keyplayer-speed-<值>,当前档主色高亮。 - 选择后关闭弹窗、入口同步,并调用当前
VideoPlayerController.setPlaybackSpeed。 - 倍速状态由
_PlayerPageState._playbackSpeed持有,同时同步到PlayerLogic; 新控制器在 prepare/activate 时应用当前倍速,切集沿用。 - 清屏时倍速入口随控制层隐藏;普通/暂停态显示。
- 新增 l10n
playbackSpeed三语。
门禁原始输出:
$ dart analyze lib test
No issues found!
$ flutter test
00:29 +356: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'... 22.3s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
构建在 /tmp/reelshort-speed-sheet 独立 worktree 完成。
Git:
3a7e0bc feat(player): 倍速改为底部弹窗选择
87628e7 merge: 倍速改为底部弹窗选择
提交与合并 author/committer 均为 Zhou Weidong <502333560@qq.com>;
develop 与 fix/flutter-speed-sheet 已推送。真机验收由用户执行。
K27.8 首页互动下移 + 倍速弹窗 + 拖动时间(2026-10-19)
- 首页右侧 Like/Comment/Share/Favorite rail 改为
Alignment(1.0, 0.45), 距右 12、与底部信息卡保持间隙。 - 删除画面右下角
player-speed静态入口;倍速移入player-more: ListTileplayer-more-speed,trailing 显示当前倍速,点击关闭更多并打开player-speed-sheet。 - 选择倍速后立即更新入口/更多 trailing,并应用到当前及后续控制器。
- 播放器进度条
showTimes: true;拖动时显示当前时间 / 总时长,松手后消失。 - 中心按钮仅暂停显示、清屏共享、退出清屏、无定时器等规则不变。
门禁原始输出:
$ dart analyze lib test
No issues found!
$ flutter test
00:29 +357: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'... 22.7s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
构建在 /tmp/reelshort-rail-speed 独立 worktree 完成。
Git:
4d7173d fix(player): 调整 rail 倍速弹窗与进度时间
1eaab2a merge: 调整 rail 倍速弹窗与进度时间
提交与合并 author/committer 均为 Zhou Weidong <502333560@qq.com>;
develop 与 fix/flutter-feed-rail-speed-time 已推送。真机验收由用户执行。
K27.9 发现页固定顶栏(2026-10-19)
_header从CustomScrollView.slivers移出,放到DiscoverPage._pageColumn 顶部、Expanded(_feed)之前。- 顶栏改为
SizedBox(height:46)+Padding(horizontal:14),与 Me 页顶栏一致。 - 搜索框、分类 chips、Continue Watching、快捷入口、热门短剧等仍在滚动区, 顺序与间距保持;底部导航不变。
- 测试记录
discover-search-button初始位置,滚动内容后位置不变,home-category-chips位置发生上移。
门禁原始输出:
$ dart analyze lib test
No issues found!
$ flutter test
00:33 +358: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'... 26.9s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
构建在 /tmp/reelshort-discover-header 独立 worktree 完成。
Git:
1617580 fix(discover): 固定发现页顶栏
149b51b merge: 固定发现页顶栏
提交与合并 author/committer 均为 Zhou Weidong <502333560@qq.com>;
develop 与 fix/flutter-discover-fixed-header 已推送。真机验收由用户执行。
K27.10 发现页封面不裁剪、图上不显示剧名(2026-10-19)
_HomeDramaCard封面RemoteImage.fit改为BoxFit.contain, 外层加AppColors.card中性底色;封面高 120、圆角 10、网格尺寸不变。- 删除封面上的剧名 Positioned 与底部黑色渐变遮罩。
- 左上角免费角标保留;图片下方剧名/题材两行保留,剧名 Key 唯一。
- 卡片点击、2 列网格与间距不变。
门禁原始输出:
$ dart analyze lib test
No issues found!
$ flutter test
00:31 +358: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'... 30.7s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
构建在 /tmp/reelshort-cover-contain 独立 worktree 完成。
Git:
4c2384f fix(discover): 封面完整显示并移除图上标题
bbae8cf merge: 封面完整显示并移除图上标题
提交与合并 author/committer 均为 Zhou Weidong <502333560@qq.com>;
develop 与 fix/flutter-discover-cover-contain 已推送。真机验收由用户执行。
K27.11 发现页搜索点击页面失焦(2026-10-19)
discover-searchTextField 增加onTapOutside: (_) => logic.searchFocus.unfocus()。- 点击输入框仍保持焦点;点击分类、卡片、按钮等区域仍执行原动作。
- 不清空输入、不影响过滤结果与布局。
门禁原始输出:
$ dart analyze lib test
No issues found!
$ flutter test
00:39 +359: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'... 22.5s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
构建在 /tmp/reelshort-search-unfocus 独立 worktree 完成。
Git:
884687d fix(discover): 点击页面取消搜索焦点
cabc0e7 merge: 点击页面取消搜索焦点
提交与合并 author/committer 均为 Zhou Weidong <502333560@qq.com>;
develop 与 fix/flutter-discover-search-unfocus 已推送。真机验收由用户执行。
K27.12 发现页瀑布流 + 下拉刷新(2026-10-19)
- 发现页短剧列表改为手动两列瀑布流:奇偶索引分列,列间距 10、卡片间距 10、
左右 14;保留
home-all-dramas-section/grid、卡片/封面/标题 Key。 - 封面改用
Image.network(fit: BoxFit.fitWidth),高度按原图比例自适应、不裁剪; 加载中/失败使用 3:4 占位,免费角标仍叠加左上角,图上不再有剧名/渐变。 CustomScrollView外包RefreshIndicator(AlwaysScrollableScrollPhysics, 主色指示器),onRefresh并行执行categories.load()与logic.refreshResume(),完成后自动收起。- 搜索、分类选择、快捷入口、底部导航不变。
门禁原始输出:
$ dart analyze lib test
No issues found!
$ flutter test
00:30 +360: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'... 22.3s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
构建在 /tmp/reelshort-discover-masonry 独立 worktree 完成。
Git:
d271c43 feat(discover): 增加瀑布流与下拉刷新
75dacf2 merge: 增加瀑布流与下拉刷新
提交与合并 author/committer 均为 Zhou Weidong <502333560@qq.com>;
develop 与 fix/flutter-discover-masonry-refresh 已推送。真机验收由用户执行。
K27.13 客户端默认 API 地址更新(2026-10-19)
AppConfig.devHostBaseUrl更新为http://192.168.31.250:8081。- 优先级保持:运行时设置 >
--dart-define=API_BASE_URL> 平台默认值; 模拟器/桌面仍使用环回地址。 server_endpoint_test.dart的地址断言同步更新。
门禁原始输出:
$ dart analyze lib test
No issues found!
$ flutter test
00:31 +360: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'... 23.0s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
构建在 /tmp/reelshort-api-host 独立 worktree 完成。
Git:
501446b chore(config): 更新开发默认服务器地址
53b7726 merge: 更新开发默认服务器地址
提交与合并 author/committer 均为 Zhou Weidong <502333560@qq.com>;
develop 与 chore/flutter-api-host 已推送。真机验证由用户执行。
K27.14 客户端默认 API 地址更新为 172.18.0.7(2026-10-19)
AppConfig.devHostBaseUrl更新为http://172.18.0.7:8081。- 优先级保持:运行时设置 >
--dart-define=API_BASE_URL> 平台默认值; 模拟器/桌面仍使用环回地址。 server_endpoint_test.dart地址断言同步更新。
门禁原始输出:
$ dart analyze lib test
No issues found!
$ flutter test
00:32 +360: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'... 22.8s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
构建在 /tmp/reelshort-api-host2 独立 worktree 完成。
Git:
cb2fa92 chore(config): 更新开发默认服务器地址
75438c2 merge: 更新开发默认服务器地址
提交与合并 author/committer 均为 Zhou Weidong <502333560@qq.com>;
develop 与 chore/flutter-api-host-2 已推送。真机验证由用户执行。
K27.15 客户端默认 API 地址恢复为 192.168.31.187(2026-10-19)
AppConfig.devHostBaseUrl恢复为http://192.168.31.187:8081。- 优先级与模拟器/桌面环回逻辑不变。
server_endpoint_test.dart地址断言同步更新。
门禁原始输出:
$ dart analyze lib test
No issues found!
$ flutter test
00:31 +360: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'... 22.2s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
构建在 /tmp/reelshort-api-host3 独立 worktree 完成。
Git:
d75b696 chore(config): 恢复开发默认服务器地址
190e4f9 merge: 恢复开发默认服务器地址
提交与合并 author/committer 均为 `Zhou Weidong <502333560@qq.com>`;
`develop` 与 `chore/flutter-api-host-3` 已推送。真机验证由用户执行。
2026-10-19 ReelShortWeb:release/v1.0.0 分片上传修复同步到 develop
release/v1.0.0本地落后 1 个提交,执行git pull --ff-only origin release/v1.0.0快进到8e9435e fix(web): 修复分片上传 chunkSize 字符串拼接导致大文件超限(仅src/utils/uploader.ts)。develop(83e535d)以--no-ff合并 release,合并提交f78960f chore(web): 合并 release 分片上传修复,已推送。
门禁原始输出:
$ pnpm lint:eslint
> eslint --fix --ext .js,.ts,.vue ./src
(无错误输出)
$ pnpm build:pro
[warn] Circular chunk: element-plus -> vue-chunks -> element-plus. Please adjust the manual chunk logic for these chunks.
Build successful. Please see dist-pro directory
release/v1.0.0 保持 8e9435e 不变;develop 已包含该修复。
2026-10-19 ReelShort:develop 合并进 release/v1.0.0(K27.16)
- 合并提交
35364c9 chore(release): 合并 develop 到 release/v1.0.0,已推送。 - 冲突/取舍:地址取 release(
http://39.162.50.99:8081,含双网络 probe);保留usesCleartextTraffic="true"与main.dart的probeAndApplyBaseUrl();server_endpoint.dart、auth_session_store.dart、pubspec.yaml(shared_preferences ^2.5.5- platform_interface + foundation override)采用 develop 版本;K22–K27 UI/播放器/发现页改动全部进入 release。
- 首次
flutter build apk因与并行的flutter run争用 Gradle 锁挂起 15 分钟; 终止进程并./gradlew --stop后重新构建通过。
门禁原始输出:
$ flutter analyze lib test
No issues found!
$ flutter test
00:30 +355 ~5: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'... 23.4s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
真机验证由用户执行。
2026-10-20 第二轮 App 对接 1/5:金币充值
TDD 红灯(先写用例,接口尚不存在):
$ flutter test test/commerce/store_api_test.dart test/commerce/store_controller_test.dart
Error: The method 'products' isn't defined for the type 'CommerceApi'.
Error: The method 'createOrder' isn't defined for the type 'CommerceApi'.
Error when reading 'lib/core/data/models/order.dart': 系统找不到指定的文件。
Some tests failed.
绿灯(商品/订单接口、StoreRepository、StoreController、充值页、会员页):
$ flutter test test/store/store_pages_test.dart test/commerce/store_api_test.dart test/commerce/store_controller_test.dart
00:00 +7: All tests passed!
门禁:
$ dart analyze lib test
No issues found!
$ flutter test
00:00 +392 ~1: All tests passed!
解读:GET /app/products?type=COIN_PACK|VIP 与 POST /app/orders {productId} 已接入;充值页展示 name/coinAmount/bonusCoin/displayPrice,会员页展示 vipDays/displayPrice,点击购买真实创建订单并以订单号提示等待支付;钱包页与「我的」均增加入口,下单成功后刷新钱包。全量静态检查与测试零告警全通过。
2026-10-20 第二轮 App 对接 2/5:会员开通
TDD 红灯(与金币包同批先写用例,vipDays/订单接口尚未落地):
$ flutter test test/commerce/store_api_test.dart test/commerce/store_controller_test.dart
Error: The method 'products' isn't defined for the type 'CommerceApi'.
Error: The method 'createOrder' isn't defined for the type 'CommerceApi'.
Some tests failed.
绿灯:
$ flutter test test/store/store_pages_test.dart
00:00 +7: All tests passed!
门禁(与 1/5 同批提交前执行):
$ dart analyze lib test
No issues found!
$ flutter test
00:00 +392 ~1: All tests passed!
解读:会员页调用 GET /app/products?type=VIP 展示 vipDays 与 displayPrice,点开通调用 POST /app/orders {productId} 并展示 CREATED 订单号;钱包页与「我的」均提供 VIP 入口,未登录先引导登录。商品为空时展示服务端真实空态,不伪造档位。
2026-10-20 第二轮 App 对接 3/5:搜索改为后端接口
TDD 红灯:
$ flutter test test/catalog/search_api_test.dart test/discover/discover_search_test.dart
Error: The method 'search' isn't defined for the type 'CatalogApi'.
Error when reading 'lib/core/data/models/search_result.dart': 系统找不到指定的文件。
Error when reading 'lib/core/data/repositories/search_repository.dart': 系统找不到指定的文件。
Some tests failed.
绿灯:
$ flutter test test/catalog/search_api_test.dart test/discover/discover_search_test.dart test/discover/home_all_dramas_grid_test.dart test/discover/discover_logic_test.dart
00:04 +28: All tests passed!
门禁:
$ dart analyze lib test
No issues found!
$ flutter test
00:20 +397 ~1: All tests passed!
解读:GET /app/search?keyword=&pageIndex=1&pageSize=20 已接入 SearchApi/SearchRepository;发现页输入框改为 350ms 防抖请求后端,结果直接渲染卡片网格,清空输入回到剧场列表。已移除本地标题/简介匹配;加载、失败重试、空结果均有状态。全量静态检查与测试通过。
2026-10-20 第二轮 App 对接 4/5:剧场语言筛选
TDD 红灯:
$ flutter test test/discover/discover_logic_test.dart test/discover/discover_language_filter_test.dart
Error: The method 'selectLanguage' isn't defined for the type 'DiscoverLogic'.
Error: The method 'languagesOf' isn't defined for the type 'DiscoverLogic'.
The finder "Found 0 widgets with key [<'discover-language-zh-CN'>]" could not find any matching widgets.
Some tests failed.
绿灯:
$ flutter test test/discover/discover_logic_test.dart test/discover/discover_language_filter_test.dart test/catalog/drama_model_test.dart
00:02 +19: All tests passed!
门禁:
$ dart analyze lib test
No issues found!
$ flutter test
00:21 +400 ~1: All tests passed!
解读:Drama.language 已从 /app/home/feed、/app/discover/feed 卡片解析;剧场列表根据当前 feed 动态汇总语种并渲染语言 chips(全部/中文/印尼语/英语,未知语种原样展示),选择后即时按 language 过滤。语言筛选同时作用于后端搜索结果。全量静态检查与测试通过。
2026-10-20 第二轮 App 对接 5/5:播放清晰度入口
TDD 红灯:
$ flutter test test/playback/play_ticket_quality_test.dart test/playback/player_quality_test.dart test/player/quality_sheet_test.dart test/player/player_fullscreen_test.dart
Error: The getter 'qualities' isn't defined for the type 'PlayTicket'.
Error: The getter 'qualities' isn't defined for the type 'PlayerLogic'.
Found 0 widgets with key [<'player-more-quality'>]: []
Some tests failed.
绿灯:
$ flutter test test/playback/play_ticket_quality_test.dart test/playback/player_quality_test.dart test/player/quality_sheet_test.dart test/player/player_fullscreen_test.dart
00:05 +16: All tests passed!
门禁:
$ dart analyze lib test
No issues found!
$ flutter test
00:21 +404 ~1: All tests passed!
解读:GET /app/episodes/{id}/play 的 qualities 已解析进 PlayTicket 并写入 PlayerLogic;播放器「更多」菜单新增清晰度入口,面板展示后端返回的全部档位(AUTO 显示为“自动”)并标注当前自动档,附 HLS 自动码率切换说明。播放器无手动切轨 API,因此档位按契约只展示、不做伪切换。全量静态检查与测试通过。## 2026-10-20 第二轮 App 对接 收尾:合并 develop 与发布门禁
合并:
$ git checkout develop
Switched to branch 'develop'
Your branch is up to date with 'origin/develop'.
$ git -c user.name='Zhou Weidong' -c user.email='502333560@qq.com' merge --no-ff feature/app-phase2-integration -m "merge: 第二轮 App 接口对接"
Merge made by the 'ort' strategy.
45 files changed, 2366 insertions(+), 111 deletions(-)
7ca7d20 (HEAD -> develop) merge: 第二轮 App 接口对接
合并后在 develop 执行门禁:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
ANALYZE_EXIT=0
$ flutter test
00:21 +404 ~1: All tests passed!
FLUTTER_TEST_EXIT=0
推送:
$ git push origin develop
To http://git.reelshort2.com/jianghaifeng/ReelShort.git
ec2db68..7ca7d20 develop -> develop
PUSH_EXIT=0
核对:
$ git status -sb
## develop...origin/develop
$ git rev-parse HEAD origin/develop
7ca7d20630e51c29fa2916331a75ad508b0d26ec
7ca7d20630e51c29fa2916331a75ad508b0d26ec
解读:5 项功能均已接入真实后端接口并通过门禁,工作区干净;合并提交 7ca7d20 已推送至 origin/develop,本地与远端一致。本轮只修改 Flutter 客户端及测试,未修改后端。
2026-10-20 UX 改造 Step 0:分支与基线门禁
分支:
$ git checkout -b feature/ux-theatre-3tabs
Switched to a new branch 'feature/ux-theatre-3tabs'
## feature/ux-theatre-3tabs
基线门禁:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
ANALYZE_EXIT=0
$ flutter test
00:22 +404 ~1: All tests passed!
FLUTTER_TEST_EXIT=0
解读:从 develop 切出 feature/ux-theatre-3tabs;改造前静态检查零告警、404 条测试全过(1 条跳过),可作为回归基线。计划已写入 FruitServer/docs/plans/2026-10-20-ux-theatre-3tabs.md。
2026-10-20 UX 改造 Step 1:底部导航 4 → 3
改动:home_view.dart 移除 RankingPage 的 IndexedStack child 与 tab-ranking 导航项;_HomeTabs 不再接收 sections。同步把导航测试改为 3 Tab,并删除已无入口的 ranking_view_test.dart(榜单视图将在下一步并入发现页后彻底删除)。
$ flutter test test/home/home_nav_ui_test.dart test/widget_test.dart
00:06 +19: All tests passed!
$ dart analyze lib test
Analyzing lib, test...
No issues found!
ANALYZE_EXIT=0
$ flutter test
00:21 +402 ~1: All tests passed!
FLUTTER_TEST_EXIT=0
解读:底部只剩 推荐/发现/我的 三个入口,首页沉浸式播放链路未改动。测试从 404 降为 402,是因为独立榜单页的 2 条入口测试随 tab 一起删除;榜单逻辑测试仍保留。
2026-10-20 UX 改造 Step 2:发现页改为红果式剧场
改动:发现页顶部保留搜索框,新增 3 列分类九宫格 discover-category-grid,点击分类进入 CategoryDramasPage;下方依次为轮播、页内榜单 discover-ranking-section(热播/新剧前 5)和双列剧目网格。原 RankingPage 独立页面与入口删除,RankingLogic 移入 lib/pages/discover/ 复用;搜索改为纯服务端检索(防抖、加载、错误重试、空结果),语言筛选与 home_drama_grid.dart 一并删除。
$ dart analyze lib test
Analyzing lib, test...
No issues found!
ANALYZE_EXIT=0
$ flutter test
00:19 +375 ~1: All tests passed!
FLUTTER_TEST_EXIT=0
$ git -c user.name='Zhou Weidong' -c user.email='502333560@qq.com' commit -m "feat(app): 剧场页九宫格与极简我的页"
[feature/ux-theatre-3tabs 35338cb] feat(app): 剧场页九宫格与极简我的页
46 files changed, 2322 insertions(+), 4327 deletions(-)
解读:榜单不再占独立 Tab,而是成为剧场页内的找剧区块;分类九宫格成为首屏主入口。测试数从 Step 1 的 402 降为 375,主要是删除了语言筛选、旧发现列表和旧「我的」堆砌入口的过时用例,新增九宫格、分类页、页内榜单和极简「我的」用例。
2026-10-20 UX 改造 Step 3:极简「我的」与移除手动语言切换
改动:「我的」页只保留身份头、继续观看卡片和 6 个核心入口(追剧/历史/下载/钱包/会员/设置);账号、通知与登录/登出迁入独立 SettingsPage。删除语言切换控制器、持久化键、入口与全局语言筛选逻辑,App 仅跟随系统语言,不支持的系统语言回退印尼语;同步清理 7 个已无引用的语言文案 key,以及仅供旧测试使用的 visibleDramas 死方法。
$ flutter gen-l10n
Because l10n.yaml exists, the options defined there will be used instead.
To use the command line arguments, delete the l10n.yaml file in the Flutter project.
$ dart analyze lib test
Analyzing lib, test...
No issues found!
ANALYZE_EXIT=0
$ flutter test
00:19 +375 ~1: All tests passed!
FLUTTER_TEST_EXIT=0
$ git -c user.name='Zhou Weidong' -c user.email='502333560@qq.com' commit -m "chore(l10n): 清理已移除语言入口文案"
[feature/ux-theatre-3tabs 12e57de] chore(l10n): 清理已移除语言入口文案
7 files changed, 126 deletions(-)
旧类/旧入口扫描:
$ Get-ChildItem -Path lib,test -Recurse -File -Filter *.dart | Select-String -Pattern @('LocaleController','showLanguage','selectedCode','selectCode','visibleDramas','RankingPage','ranking_view','HomeDramaGrid','openLibrary','sectionRequest','selectFromMenu','languageFilter','languageChinese','languageIndonesian','languageEnglish') -SimpleMatch
(无输出)
解读:手动语言入口及其状态、文案、测试依赖均已移除,「我的」页只保留高频入口,低频账号与通知集中到设置页。功能提交与文案清理分开提交,均为门禁通过后落盘。
2026-10-20 UX 改造 Step 4:合并 develop 与最终门禁
合并:
$ git checkout develop
Switched to branch 'develop'
Your branch is up to date with 'origin/develop'.
$ git -c user.name='Zhou Weidong' -c user.email='502333560@qq.com' merge --no-ff feature/ux-theatre-3tabs -m "merge: 红果式三 Tab 剧场与极简我的页"
Merge made by the 'ort' strategy.
54 files changed, 2323 insertions(+), 4567 deletions(-)
合并后门禁与残留扫描:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:19 +375 ~1: All tests passed!
$ Get-ChildItem -Path lib,test -Recurse -File -Filter *.dart | Select-String -Pattern @('LocaleController','showLanguage','selectedCode','selectCode','visibleDramas','RankingPage','ranking_view','HomeDramaGrid','openLibrary','sectionRequest','selectFromMenu','languageFilter','languageChinese','languageIndonesian','languageEnglish') -SimpleMatch
DEAD_CODE_SCAN=clean
GATE_EXIT=0
解读:develop 合并提交为 842e716;合并后静态分析零告警、375 条测试全过(1 条跳过),旧榜单页/旧语言控制器/旧入口标志无残留。
推送与核对:
$ git push origin develop
To http://git.reelshort2.com/jianghaifeng/ReelShort.git
19caaa0..842e716 develop -> develop
$ git status -sb
## develop...origin/develop
$ git rev-parse HEAD origin/develop
842e716ea63f182b2b434d47df1a06512209aab4
842e716ea63f182b2b434d47df1a06512209aab4
解读:develop 已推送到远端,本地与 origin/develop 指向同一提交 842e716,工作区干净。
2026-10-20 05:50:16 - batch publish started
Command:
powershell -File C:\work\ReelShort\tools\publish-drama-assets.ps1
Raw output:
AssetRoot=C:\work\drama_assets
BaseUrl=http://127.0.0.1:8080
AppBaseUrl=http://127.0.0.1:8081
StatePath=C:\work\ReelShort\docs\plans\fruitshorts-publish-state.json
Interpretation: Starting the full batch publish workflow.
2026-10-20 05:50:17 - admin login
Command:
POST http://127.0.0.1:8080/admin/auth/login
BODY {username:admin,password:***}
Raw output:
{"code":0,"message":"ok","data":{"token":"***","userId":"1001","username":"admin","name":"系统管理员","avatar":"","role":"super_admin","roleName":"超级管理员","roleId":"1","permissions":["drama:list","drama:create","drama:update","drama:delete","episode:list","episode:upload","episode:sort","cover:upload","drama:review","stat:view","system:role","system:admin-user","system:menu","system:role-category","banner:list","banner:create","banner:update","banner:delete","log:list","app-user:list","app-user:update","download:list","download:revoke","comment:list","comment:audit","report:list","report:handle","sensitive-word:list","sensitive-word:update","order:list","order:update","entitlement:list","entitlement:update","wallet:update","reconcile:run","creator:list","creator:audit","submission:list","submission:audit","price:update","dashboard:view","creator-center:view","creator-center:drama:edit","creator-center:upload","creator-center:price:update","creator-center:stat:view","creator-center:impersonate","creator:account","product:list","product:update","notice:list","notice:update"],"mustChangePassword":false}}
Interpretation: Authenticated as admin and received a bearer token.
2026-10-20 05:50:17 - list existing dramas
Command:
GET http://127.0.0.1:8080/admin/dramas/page?pageIndex=1&pageSize=200
Raw output:
{"code":0,"message":"ok","data":{"total":6,"list":[{"id":"4","code":"D20250620004","title":"她从深渊中走来","subtitle":"","categoryId":"4","category":"悬疑复仇","genre":"悬疑复仇","description":"真相只有一个,而她亲手揭开迷雾。","cover":"","trailerUrl":"","language":"zh-CN","episodes":24,"freeEpisodes":3,"unlockCoin":80,"isHot":false,"status":"draft","statusText":"草稿","views":"0","sort":4,"publishAt":null,"createdAt":"2025-06-15 09:00:00","updatedAt":"2026-10-16 06:00:20"},{"id":"3","code":"D20250529003","title":"心动信号:请和我恋爱","subtitle":"","categoryId":"3","category":"甜宠爱情","genre":"甜宠爱情","description":"恋爱观察室里,心动正在悄悄发生。","cover":"","trailerUrl":"","language":"zh-CN","episodes":56,"freeEpisodes":3,"unlockCoin":50,"isHot":false,"status":"published","statusText":"已上线","views":"1800000","sort":3,"publishAt":"2025-05-29 10:00:00","createdAt":"2025-05-20 09:00:00","updatedAt":"2026-10-16 06:00:20"},{"id":"2","code":"D20250618002","title":"重生之我在豪门当千金","subtitle":"","categoryId":"2","category":"重生逆袭","genre":"重生逆袭","description":"重活一世,她要拿回属于自己的一切。","cover":"","trailerUrl":"","language":"zh-CN","episodes":42,"freeEpisodes":3,"unlockCoin":60,"isHot":false,"status":"reviewing","statusText":"审核中","views":"0","sort":2,"publishAt":null,"createdAt":"2025-06-05 09:00:00","updatedAt":"2026-10-16 06:00:20"},{"id":"1","code":"D20250612001","title":"替嫁新娘:总裁的掌心宠","subtitle":"","categoryId":"1","category":"都市情感","genre":"都市情感","description":"一场意外替嫁,让她成为冷面总裁的契约新娘。","cover":"","trailerUrl":"","language":"zh-CN","episodes":68,"freeEpisodes":3,"unlockCoin":60,"isHot":true,"status":"published","statusText":"已上线","views":"2400000","sort":1,"publishAt":"2025-06-12 10:00:00","createdAt":"2025-06-01 09:00:00","updatedAt":"2026-10-16 06:00:20"},{"id":"2112110445962858498","code":"D20261019006","title":"周卫东测试","subtitle":"","categoryId":"1","category":"都市情感","genre":"都市情感","description":"测试","cover":"/files/drama_cover/202610/ff83c789b59c4982be317e91f14bd36e.jpg","trailerUrl":"","language":"zh-CN","episodes":4,"freeEpisodes":20,"unlockCoin":1,"isHot":true,"status":"published","statusText":"已上线","views":"0","sort":0,"publishAt":"2026-10-19 17:36:12","createdAt":"2026-10-19 17:15:46","updatedAt":"2026-10-19 21:55:27"},{"id":"5","code":"D20250521005","title":"闪婚后,傅先生每天都在撒糖1","subtitle":"","categoryId":"1","category":"都市情感","genre":"都市情感","description":"一纸婚约,开启了甜蜜又心动的同居生活。","cover":"","trailerUrl":"","language":"zh-CN","episodes":1,"freeEpisodes":3,"unlockCoin":60,"isHot":true,"status":"published","statusText":"已上线","views":"3100000","sort":0,"publishAt":"2025-05-21 10:00:00","createdAt":"2025-05-10 09:00:00","updatedAt":"2026-10-19 17:34:38"}]}}
Interpretation: Loaded existing dramas for idempotent title matching.
2026-10-20 05:50:17 - probe video durations (fallback)
Command:
docker run --rm -v "C:\work\drama_assets":/assets --entrypoint bash fruitshorts/transcode-worker:latest -c "find "/assets" -maxdepth 2 -type f -name "*.mp4" -print0 | while IFS= read -r -d "" f; do d=$(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "$f"); printf "%s\t%s\n" "$(basename "$f")" "$d"; done"
Raw output:
At C:\work\ReelShort\tools\publish-drama-assets.ps1:198 char:32
+ if ($exitCode -ne 0) { throw $raw }
+ ~~~~~~~~~~
+ CategoryInfo : OperationStopped: (:String) [], RuntimeException
+ FullyQualifiedErrorId :
Interpretation: ffprobe probe failed; durationSec will be 0 and will be corrected after transcoding.
2026-10-20 05:50:17 - init upload 竖版_9x16.jpg
Command:
POST http://127.0.0.1:8080/admin/media/upload/init
BODY {"fileSize":227050,"fileName":"竖版_9x16.jpg","bizType":"DRAMA_COVER","chunkSize":5242880}
Raw output:
{"code":0,"message":"ok","data":{"uploadId":"7b347b6d3ecf49e7a46b1e78cc46718c","chunkSize":"5242880","totalChunks":1,"objectKey":"drama_cover/202610/0ca73f7e66e64c82be82cb09504db6f6.jpg"}}
Interpretation: Created upload session for DRAMA_COVER file 竖版_9x16.jpg.
2026-10-20 05:50:17 - upload chunk 1
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=7b347b6d3ecf49e7a46b1e78cc46718c&index=0 (multipart file=chunk_0.bin, bytes=227050)
Raw output:
{"code":0,"message":"ok","data":0}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:17 - complete upload 竖版_9x16.jpg
Command:
POST http://127.0.0.1:8080/admin/media/upload/complete
BODY {"uploadId":"7b347b6d3ecf49e7a46b1e78cc46718c","durationSec":0}
Raw output:
{"code":0,"message":"ok","data":{"id":"2112300329403027457","bizType":"DRAMA_COVER","fileName":"竖版_9x16.jpg","objectKey":"drama_cover/202610/0ca73f7e66e64c82be82cb09504db6f6.jpg","url":"/files/drama_cover/202610/0ca73f7e66e64c82be82cb09504db6f6.jpg","sizeBytes":"227050","md5":"378ebb237a70702eb7e03557c9ae2829","durationSec":0,"status":"ready","createdAt":"2026-10-20 05:50:17"}}
Interpretation: Merged uploaded chunks into media asset 竖版_9x16.jpg.
2026-10-20 05:50:17 - init upload 1.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/init
BODY {"fileSize":30052085,"fileName":"1.mp4","bizType":"EPISODE","chunkSize":5242880}
Raw output:
{"code":0,"message":"ok","data":{"uploadId":"4b8a77c8f4ad4d45856a708c171abb6b","chunkSize":"5242880","totalChunks":6,"objectKey":"episode/202610/1dc00015a1d9449b83ce3d0025ae88f5.mp4"}}
Interpretation: Created upload session for EPISODE file 1.mp4.
2026-10-20 05:50:17 - upload chunk 1
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=4b8a77c8f4ad4d45856a708c171abb6b&index=0 (multipart file=chunk_0.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":0}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:18 - upload chunk 2
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=4b8a77c8f4ad4d45856a708c171abb6b&index=1 (multipart file=chunk_1.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":1}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:18 - upload chunk 3
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=4b8a77c8f4ad4d45856a708c171abb6b&index=2 (multipart file=chunk_2.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":2}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:18 - upload chunk 4
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=4b8a77c8f4ad4d45856a708c171abb6b&index=3 (multipart file=chunk_3.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":3}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:18 - upload chunk 5
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=4b8a77c8f4ad4d45856a708c171abb6b&index=4 (multipart file=chunk_4.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":4}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:18 - upload chunk 6
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=4b8a77c8f4ad4d45856a708c171abb6b&index=5 (multipart file=chunk_5.bin, bytes=3837685)
Raw output:
{"code":0,"message":"ok","data":5}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:18 - complete upload 1.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/complete
BODY {"uploadId":"4b8a77c8f4ad4d45856a708c171abb6b","durationSec":0}
Raw output:
{"code":0,"message":"ok","data":{"id":"2112300333169512449","bizType":"EPISODE","fileName":"1.mp4","objectKey":"episode/202610/1dc00015a1d9449b83ce3d0025ae88f5.mp4","url":"/files/episode/202610/1dc00015a1d9449b83ce3d0025ae88f5.mp4","sizeBytes":"30052085","md5":"05ec7bc155418077465074689e9f3076","durationSec":0,"status":"transcoding","createdAt":"2026-10-20 05:50:18"}}
Interpretation: Merged uploaded chunks into media asset 1.mp4.
2026-10-20 05:50:18 - init upload 2.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/init
BODY {"fileSize":19244800,"fileName":"2.mp4","bizType":"EPISODE","chunkSize":5242880}
Raw output:
{"code":0,"message":"ok","data":{"uploadId":"3881f708dad4423893f4de5eeddff4cd","chunkSize":"5242880","totalChunks":4,"objectKey":"episode/202610/f80fa83558fc4595aa70519db66d6aa7.mp4"}}
Interpretation: Created upload session for EPISODE file 2.mp4.
2026-10-20 05:50:18 - upload chunk 1
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=3881f708dad4423893f4de5eeddff4cd&index=0 (multipart file=chunk_0.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":0}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:18 - upload chunk 2
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=3881f708dad4423893f4de5eeddff4cd&index=1 (multipart file=chunk_1.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":1}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:18 - upload chunk 3
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=3881f708dad4423893f4de5eeddff4cd&index=2 (multipart file=chunk_2.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":2}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:18 - upload chunk 4
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=3881f708dad4423893f4de5eeddff4cd&index=3 (multipart file=chunk_3.bin, bytes=3516160)
Raw output:
{"code":0,"message":"ok","data":3}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:19 - complete upload 2.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/complete
BODY {"uploadId":"3881f708dad4423893f4de5eeddff4cd","durationSec":0}
Raw output:
{"code":0,"message":"ok","data":{"id":"2112300335610597377","bizType":"EPISODE","fileName":"2.mp4","objectKey":"episode/202610/f80fa83558fc4595aa70519db66d6aa7.mp4","url":"/files/episode/202610/f80fa83558fc4595aa70519db66d6aa7.mp4","sizeBytes":"19244800","md5":"b6d50f69a6296bc78da616c6a4cdc7b6","durationSec":0,"status":"transcoding","createdAt":"2026-10-20 05:50:19"}}
Interpretation: Merged uploaded chunks into media asset 2.mp4.
2026-10-20 05:50:19 - init upload 3.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/init
BODY {"fileSize":17722875,"fileName":"3.mp4","bizType":"EPISODE","chunkSize":5242880}
Raw output:
{"code":0,"message":"ok","data":{"uploadId":"4c7f1c6626254ff289dfc72077609c53","chunkSize":"5242880","totalChunks":4,"objectKey":"episode/202610/4027568fe23d4ec6b4d68320a12b24a7.mp4"}}
Interpretation: Created upload session for EPISODE file 3.mp4.
2026-10-20 05:50:19 - upload chunk 1
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=4c7f1c6626254ff289dfc72077609c53&index=0 (multipart file=chunk_0.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":0}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:19 - upload chunk 2
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=4c7f1c6626254ff289dfc72077609c53&index=1 (multipart file=chunk_1.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":1}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:19 - upload chunk 3
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=4c7f1c6626254ff289dfc72077609c53&index=2 (multipart file=chunk_2.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":2}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:19 - upload chunk 4
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=4c7f1c6626254ff289dfc72077609c53&index=3 (multipart file=chunk_3.bin, bytes=1994235)
Raw output:
{"code":0,"message":"ok","data":3}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:19 - complete upload 3.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/complete
BODY {"uploadId":"4c7f1c6626254ff289dfc72077609c53","durationSec":0}
Raw output:
{"code":0,"message":"ok","data":{"id":"2112300337875521538","bizType":"EPISODE","fileName":"3.mp4","objectKey":"episode/202610/4027568fe23d4ec6b4d68320a12b24a7.mp4","url":"/files/episode/202610/4027568fe23d4ec6b4d68320a12b24a7.mp4","sizeBytes":"17722875","md5":"05a103901363d088bc46ca48a9bed255","durationSec":0,"status":"transcoding","createdAt":"2026-10-20 05:50:19"}}
Interpretation: Merged uploaded chunks into media asset 3.mp4.
2026-10-20 05:50:19 - init upload 4.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/init
BODY {"fileSize":14904365,"fileName":"4.mp4","bizType":"EPISODE","chunkSize":5242880}
Raw output:
{"code":0,"message":"ok","data":{"uploadId":"7294686f05c440b5af7f1b1697f65aed","chunkSize":"5242880","totalChunks":3,"objectKey":"episode/202610/e8950dfea9ee417d8428e59a3c92d0f5.mp4"}}
Interpretation: Created upload session for EPISODE file 4.mp4.
2026-10-20 05:50:19 - upload chunk 1
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=7294686f05c440b5af7f1b1697f65aed&index=0 (multipart file=chunk_0.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":0}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:19 - upload chunk 2
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=7294686f05c440b5af7f1b1697f65aed&index=1 (multipart file=chunk_1.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":1}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:20 - upload chunk 3
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=7294686f05c440b5af7f1b1697f65aed&index=2 (multipart file=chunk_2.bin, bytes=4418605)
Raw output:
{"code":0,"message":"ok","data":2}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:20 - complete upload 4.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/complete
BODY {"uploadId":"7294686f05c440b5af7f1b1697f65aed","durationSec":0}
Raw output:
{"code":0,"message":"ok","data":{"id":"2112300339666489345","bizType":"EPISODE","fileName":"4.mp4","objectKey":"episode/202610/e8950dfea9ee417d8428e59a3c92d0f5.mp4","url":"/files/episode/202610/e8950dfea9ee417d8428e59a3c92d0f5.mp4","sizeBytes":"14904365","md5":"f89b4a3de59120b2e3be74e150dd894f","durationSec":0,"status":"transcoding","createdAt":"2026-10-20 05:50:20"}}
Interpretation: Merged uploaded chunks into media asset 4.mp4.
2026-10-20 05:50:20 - init upload 5.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/init
BODY {"fileSize":16647093,"fileName":"5.mp4","bizType":"EPISODE","chunkSize":5242880}
Raw output:
{"code":0,"message":"ok","data":{"uploadId":"e0fa37dcad874c73ae7008fc3321c13d","chunkSize":"5242880","totalChunks":4,"objectKey":"episode/202610/3e22155224834af3b6be54c39bb96776.mp4"}}
Interpretation: Created upload session for EPISODE file 5.mp4.
2026-10-20 05:50:20 - upload chunk 1
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=e0fa37dcad874c73ae7008fc3321c13d&index=0 (multipart file=chunk_0.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":0}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:20 - upload chunk 2
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=e0fa37dcad874c73ae7008fc3321c13d&index=1 (multipart file=chunk_1.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":1}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:20 - upload chunk 3
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=e0fa37dcad874c73ae7008fc3321c13d&index=2 (multipart file=chunk_2.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":2}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:20 - upload chunk 4
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=e0fa37dcad874c73ae7008fc3321c13d&index=3 (multipart file=chunk_3.bin, bytes=918453)
Raw output:
{"code":0,"message":"ok","data":3}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:20 - complete upload 5.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/complete
BODY {"uploadId":"e0fa37dcad874c73ae7008fc3321c13d","durationSec":0}
Raw output:
{"code":0,"message":"ok","data":{"id":"2112300341780418561","bizType":"EPISODE","fileName":"5.mp4","objectKey":"episode/202610/3e22155224834af3b6be54c39bb96776.mp4","url":"/files/episode/202610/3e22155224834af3b6be54c39bb96776.mp4","sizeBytes":"16647093","md5":"2ebed1caea0a92ea824cbeaa799824e6","durationSec":0,"status":"transcoding","createdAt":"2026-10-20 05:50:20"}}
Interpretation: Merged uploaded chunks into media asset 5.mp4.
2026-10-20 05:50:20 - create drama Cinta Sang Ceo
Command:
POST http://127.0.0.1:8080/admin/dramas
BODY {"genre":"Urban Romance","description":"总裁的秘密爱","freeEpisodes":5,"subtitle":"总裁的秘密爱","sort":100,"isHot":true,"categoryId":1,"cover":"/files/drama_cover/202610/0ca73f7e66e64c82be82cb09504db6f6.jpg","language":"id-ID","title":"Cinta Sang Ceo","unlockCoin":10}
Raw output:
{"code":0,"message":"ok","data":"2112300341935607809"}
Interpretation: Created drama 'Cinta Sang Ceo' with Chinese synopsis '总裁的秘密爱'.
2026-10-20 05:50:20 - read drama 2112300341935607809 before episodes
Command:
GET http://127.0.0.1:8080/admin/dramas/2112300341935607809
Raw output:
{"code":0,"message":"ok","data":{"id":"2112300341935607809","code":"D20261020007","title":"Cinta Sang Ceo","subtitle":"总裁的秘密爱","categoryId":"1","category":"都市情感","genre":"Urban Romance","description":"总裁的秘密爱","cover":"/files/drama_cover/202610/0ca73f7e66e64c82be82cb09504db6f6.jpg","trailerUrl":"","language":"id-ID","episodes":0,"freeEpisodes":5,"unlockCoin":10,"isHot":true,"status":"draft","statusText":"草稿","views":"0","sort":100,"publishAt":null,"createdAt":"2026-10-20 05:50:20","updatedAt":"2026-10-20 05:50:20"}}
Interpretation: Read drama metadata before creating or updating episodes.
2026-10-20 05:50:20 - list episodes drama 2112300341935607809
Command:
GET http://127.0.0.1:8080/admin/episodes?dramaId=2112300341935607809
Raw output:
{"code":0,"message":"ok","data":[]}
Interpretation: Loaded existing episodes for resume and duplicate prevention.
2026-10-20 05:50:20 - create episode 1 for Cinta Sang Ceo
Command:
POST http://127.0.0.1:8080/admin/episodes
BODY {"durationSec":0,"dramaId":"2112300341935607809","title":"Episode 1","sort":1,"videoUrl":"/files/episode/202610/1dc00015a1d9449b83ce3d0025ae88f5.mp4","number":1,"unlockCoin":10,"isFree":true}
Raw output:
{"code":0,"message":"ok","data":"2112300342120157185"}
Interpretation: Created episode 1 for drama Cinta Sang Ceo.
2026-10-20 05:50:20 - create episode 2 for Cinta Sang Ceo
Command:
POST http://127.0.0.1:8080/admin/episodes
BODY {"durationSec":0,"dramaId":"2112300341935607809","title":"Episode 2","sort":2,"videoUrl":"/files/episode/202610/f80fa83558fc4595aa70519db66d6aa7.mp4","number":2,"unlockCoin":10,"isFree":true}
Raw output:
{"code":0,"message":"ok","data":"2112300342195654658"}
Interpretation: Created episode 2 for drama Cinta Sang Ceo.
2026-10-20 05:50:20 - create episode 3 for Cinta Sang Ceo
Command:
POST http://127.0.0.1:8080/admin/episodes
BODY {"durationSec":0,"dramaId":"2112300341935607809","title":"Episode 3","sort":3,"videoUrl":"/files/episode/202610/4027568fe23d4ec6b4d68320a12b24a7.mp4","number":3,"unlockCoin":10,"isFree":true}
Raw output:
{"code":0,"message":"ok","data":"2112300342245986305"}
Interpretation: Created episode 3 for drama Cinta Sang Ceo.
2026-10-20 05:50:20 - create episode 4 for Cinta Sang Ceo
Command:
POST http://127.0.0.1:8080/admin/episodes
BODY {"durationSec":0,"dramaId":"2112300341935607809","title":"Episode 4","sort":4,"videoUrl":"/files/episode/202610/e8950dfea9ee417d8428e59a3c92d0f5.mp4","number":4,"unlockCoin":10,"isFree":true}
Raw output:
{"code":0,"message":"ok","data":"2112300342292123650"}
Interpretation: Created episode 4 for drama Cinta Sang Ceo.
2026-10-20 05:50:20 - create episode 5 for Cinta Sang Ceo
Command:
POST http://127.0.0.1:8080/admin/episodes
BODY {"durationSec":0,"dramaId":"2112300341935607809","title":"Episode 5","sort":5,"videoUrl":"/files/episode/202610/3e22155224834af3b6be54c39bb96776.mp4","number":5,"unlockCoin":10,"isFree":true}
Raw output:
{"code":0,"message":"ok","data":"2112300342350843905"}
Interpretation: Created episode 5 for drama Cinta Sang Ceo.
2026-10-20 05:50:20 - read drama 2112300341935607809 status
Command:
GET http://127.0.0.1:8080/admin/dramas/2112300341935607809
Raw output:
{"code":0,"message":"ok","data":{"id":"2112300341935607809","code":"D20261020007","title":"Cinta Sang Ceo","subtitle":"总裁的秘密爱","categoryId":"1","category":"都市情感","genre":"Urban Romance","description":"总裁的秘密爱","cover":"/files/drama_cover/202610/0ca73f7e66e64c82be82cb09504db6f6.jpg","trailerUrl":"","language":"id-ID","episodes":5,"freeEpisodes":5,"unlockCoin":10,"isHot":true,"status":"draft","statusText":"草稿","views":"0","sort":100,"publishAt":null,"createdAt":"2026-10-20 05:50:20","updatedAt":"2026-10-20 05:50:20"}}
Interpretation: Read current drama status before review transitions.
2026-10-20 05:50:20 - submit drama 2112300341935607809
Command:
POST http://127.0.0.1:8080/admin/dramas/2112300341935607809/submit
Raw output:
{"code":0,"message":"ok","data":null}
Interpretation: Drama submitted for review.
2026-10-20 05:50:20 - approve drama 2112300341935607809
Command:
POST http://127.0.0.1:8080/admin/dramas/2112300341935607809/approve
Raw output:
{"code":0,"message":"ok","data":null}
Interpretation: Drama review approved.
2026-10-20 05:50:20 - publish drama 2112300341935607809
Command:
POST http://127.0.0.1:8080/admin/dramas/2112300341935607809/publish
Raw output:
{"code":0,"message":"ok","data":null}
Interpretation: Drama published; draft episodes are promoted to published.
2026-10-20 05:50:20 - init upload 竖版_9x16.jpg
Command:
POST http://127.0.0.1:8080/admin/media/upload/init
BODY {"fileSize":191245,"fileName":"竖版_9x16.jpg","bizType":"DRAMA_COVER","chunkSize":5242880}
Raw output:
{"code":0,"message":"ok","data":{"uploadId":"67a3ae8fea974d349d4b47c176cc5fcf","chunkSize":"5242880","totalChunks":1,"objectKey":"drama_cover/202610/4dd149df699b48849a1b22960e35e66b.jpg"}}
Interpretation: Created upload session for DRAMA_COVER file 竖版_9x16.jpg.
2026-10-20 05:50:21 - upload chunk 1
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=67a3ae8fea974d349d4b47c176cc5fcf&index=0 (multipart file=chunk_0.bin, bytes=191245)
Raw output:
{"code":0,"message":"ok","data":0}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:21 - complete upload 竖版_9x16.jpg
Command:
POST http://127.0.0.1:8080/admin/media/upload/complete
BODY {"uploadId":"67a3ae8fea974d349d4b47c176cc5fcf","durationSec":0}
Raw output:
{"code":0,"message":"ok","data":{"id":"2112300342803828737","bizType":"DRAMA_COVER","fileName":"竖版_9x16.jpg","objectKey":"drama_cover/202610/4dd149df699b48849a1b22960e35e66b.jpg","url":"/files/drama_cover/202610/4dd149df699b48849a1b22960e35e66b.jpg","sizeBytes":"191245","md5":"b5003b165c5e7b6dd5f6f55ea6d8913a","durationSec":0,"status":"ready","createdAt":"2026-10-20 05:50:21"}}
Interpretation: Merged uploaded chunks into media asset 竖版_9x16.jpg.
2026-10-20 05:50:21 - init upload 6.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/init
BODY {"fileSize":16839793,"fileName":"6.mp4","bizType":"EPISODE","chunkSize":5242880}
Raw output:
{"code":0,"message":"ok","data":{"uploadId":"5abd9d042bc644d68311fb41bcedcdcb","chunkSize":"5242880","totalChunks":4,"objectKey":"episode/202610/eac2da991d2e48a78d5468135729b8f7.mp4"}}
Interpretation: Created upload session for EPISODE file 6.mp4.
2026-10-20 05:50:21 - upload chunk 1
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=5abd9d042bc644d68311fb41bcedcdcb&index=0 (multipart file=chunk_0.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":0}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:21 - upload chunk 2
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=5abd9d042bc644d68311fb41bcedcdcb&index=1 (multipart file=chunk_1.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":1}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:21 - upload chunk 3
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=5abd9d042bc644d68311fb41bcedcdcb&index=2 (multipart file=chunk_2.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":2}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:21 - upload chunk 4
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=5abd9d042bc644d68311fb41bcedcdcb&index=3 (multipart file=chunk_3.bin, bytes=1111153)
Raw output:
{"code":0,"message":"ok","data":3}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:21 - complete upload 6.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/complete
BODY {"uploadId":"5abd9d042bc644d68311fb41bcedcdcb","durationSec":0}
Raw output:
{"code":0,"message":"ok","data":{"id":"2112300344913563649","bizType":"EPISODE","fileName":"6.mp4","objectKey":"episode/202610/eac2da991d2e48a78d5468135729b8f7.mp4","url":"/files/episode/202610/eac2da991d2e48a78d5468135729b8f7.mp4","sizeBytes":"16839793","md5":"4f232ca4f1aad628ab85f7d2a4bfbc55","durationSec":0,"status":"transcoding","createdAt":"2026-10-20 05:50:21"}}
Interpretation: Merged uploaded chunks into media asset 6.mp4.
2026-10-20 05:50:21 - init upload 7.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/init
BODY {"fileSize":13621904,"fileName":"7.mp4","bizType":"EPISODE","chunkSize":5242880}
Raw output:
{"code":0,"message":"ok","data":{"uploadId":"fe597da89edc4cdb9803c9b9080954fc","chunkSize":"5242880","totalChunks":3,"objectKey":"episode/202610/bfeecceb819644ec8ebd109d32203685.mp4"}}
Interpretation: Created upload session for EPISODE file 7.mp4.
2026-10-20 05:50:21 - upload chunk 1
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=fe597da89edc4cdb9803c9b9080954fc&index=0 (multipart file=chunk_0.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":0}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:21 - upload chunk 2
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=fe597da89edc4cdb9803c9b9080954fc&index=1 (multipart file=chunk_1.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":1}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:21 - upload chunk 3
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=fe597da89edc4cdb9803c9b9080954fc&index=2 (multipart file=chunk_2.bin, bytes=3136144)
Raw output:
{"code":0,"message":"ok","data":2}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:21 - complete upload 7.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/complete
BODY {"uploadId":"fe597da89edc4cdb9803c9b9080954fc","durationSec":0}
Raw output:
{"code":0,"message":"ok","data":{"id":"2112300346582896641","bizType":"EPISODE","fileName":"7.mp4","objectKey":"episode/202610/bfeecceb819644ec8ebd109d32203685.mp4","url":"/files/episode/202610/bfeecceb819644ec8ebd109d32203685.mp4","sizeBytes":"13621904","md5":"e7155a03a8629253b9f729f66a1386d6","durationSec":0,"status":"transcoding","createdAt":"2026-10-20 05:50:21"}}
Interpretation: Merged uploaded chunks into media asset 7.mp4.
2026-10-20 05:50:21 - init upload 8.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/init
BODY {"fileSize":16745716,"fileName":"8.mp4","bizType":"EPISODE","chunkSize":5242880}
Raw output:
{"code":0,"message":"ok","data":{"uploadId":"f25d8d241a06426eb26debe9017d0626","chunkSize":"5242880","totalChunks":4,"objectKey":"episode/202610/f7f6f5dc20d24f01b0bb5ef5f66d635c.mp4"}}
Interpretation: Created upload session for EPISODE file 8.mp4.
2026-10-20 05:50:21 - upload chunk 1
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=f25d8d241a06426eb26debe9017d0626&index=0 (multipart file=chunk_0.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":0}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:22 - upload chunk 2
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=f25d8d241a06426eb26debe9017d0626&index=1 (multipart file=chunk_1.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":1}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:22 - upload chunk 3
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=f25d8d241a06426eb26debe9017d0626&index=2 (multipart file=chunk_2.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":2}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:22 - upload chunk 4
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=f25d8d241a06426eb26debe9017d0626&index=3 (multipart file=chunk_3.bin, bytes=1017076)
Raw output:
{"code":0,"message":"ok","data":3}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:22 - complete upload 8.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/complete
BODY {"uploadId":"f25d8d241a06426eb26debe9017d0626","durationSec":0}
Raw output:
{"code":0,"message":"ok","data":{"id":"2112300348638105601","bizType":"EPISODE","fileName":"8.mp4","objectKey":"episode/202610/f7f6f5dc20d24f01b0bb5ef5f66d635c.mp4","url":"/files/episode/202610/f7f6f5dc20d24f01b0bb5ef5f66d635c.mp4","sizeBytes":"16745716","md5":"a523abce70820fb53b8b51afd9908caf","durationSec":0,"status":"transcoding","createdAt":"2026-10-20 05:50:22"}}
Interpretation: Merged uploaded chunks into media asset 8.mp4.
2026-10-20 05:50:22 - init upload 9.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/init
BODY {"fileSize":22169851,"fileName":"9.mp4","bizType":"EPISODE","chunkSize":5242880}
Raw output:
{"code":0,"message":"ok","data":{"uploadId":"36f0b2c60958465194e8317180a1f973","chunkSize":"5242880","totalChunks":5,"objectKey":"episode/202610/d9b7b4399a5948c08e8840d13626b8b0.mp4"}}
Interpretation: Created upload session for EPISODE file 9.mp4.
2026-10-20 05:50:22 - upload chunk 1
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=36f0b2c60958465194e8317180a1f973&index=0 (multipart file=chunk_0.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":0}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:22 - upload chunk 2
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=36f0b2c60958465194e8317180a1f973&index=1 (multipart file=chunk_1.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":1}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:22 - upload chunk 3
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=36f0b2c60958465194e8317180a1f973&index=2 (multipart file=chunk_2.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":2}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:22 - upload chunk 4
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=36f0b2c60958465194e8317180a1f973&index=3 (multipart file=chunk_3.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":3}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:22 - upload chunk 5
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=36f0b2c60958465194e8317180a1f973&index=4 (multipart file=chunk_4.bin, bytes=1198331)
Raw output:
{"code":0,"message":"ok","data":4}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:23 - complete upload 9.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/complete
BODY {"uploadId":"36f0b2c60958465194e8317180a1f973","durationSec":0}
Raw output:
{"code":0,"message":"ok","data":{"id":"2112300351330848770","bizType":"EPISODE","fileName":"9.mp4","objectKey":"episode/202610/d9b7b4399a5948c08e8840d13626b8b0.mp4","url":"/files/episode/202610/d9b7b4399a5948c08e8840d13626b8b0.mp4","sizeBytes":"22169851","md5":"f57b577190cbd22f2b7448aa89794b1d","durationSec":0,"status":"transcoding","createdAt":"2026-10-20 05:50:22"}}
Interpretation: Merged uploaded chunks into media asset 9.mp4.
2026-10-20 05:50:23 - create drama Istri Yang Bangkit
Command:
POST http://127.0.0.1:8080/admin/dramas
BODY {"genre":"Revenge Suspense","description":"被背叛的妻子","freeEpisodes":4,"subtitle":"被背叛的妻子","sort":99,"isHot":true,"categoryId":4,"cover":"/files/drama_cover/202610/4dd149df699b48849a1b22960e35e66b.jpg","language":"id-ID","title":"Istri Yang Bangkit","unlockCoin":10}
Raw output:
{"code":0,"message":"ok","data":"2112300351435706369"}
Interpretation: Created drama 'Istri Yang Bangkit' with Chinese synopsis '被背叛的妻子'.
2026-10-20 05:50:23 - read drama 2112300351435706369 before episodes
Command:
GET http://127.0.0.1:8080/admin/dramas/2112300351435706369
Raw output:
{"code":0,"message":"ok","data":{"id":"2112300351435706369","code":"D20261020008","title":"Istri Yang Bangkit","subtitle":"被背叛的妻子","categoryId":"4","category":"悬疑复仇","genre":"Revenge Suspense","description":"被背叛的妻子","cover":"/files/drama_cover/202610/4dd149df699b48849a1b22960e35e66b.jpg","trailerUrl":"","language":"id-ID","episodes":0,"freeEpisodes":4,"unlockCoin":10,"isHot":true,"status":"draft","statusText":"草稿","views":"0","sort":99,"publishAt":null,"createdAt":"2026-10-20 05:50:23","updatedAt":"2026-10-20 05:50:23"}}
Interpretation: Read drama metadata before creating or updating episodes.
2026-10-20 05:50:23 - list episodes drama 2112300351435706369
Command:
GET http://127.0.0.1:8080/admin/episodes?dramaId=2112300351435706369
Raw output:
{"code":0,"message":"ok","data":[]}
Interpretation: Loaded existing episodes for resume and duplicate prevention.
2026-10-20 05:50:23 - create episode 1 for Istri Yang Bangkit
Command:
POST http://127.0.0.1:8080/admin/episodes
BODY {"durationSec":0,"dramaId":"2112300351435706369","title":"Episode 1","sort":1,"videoUrl":"/files/episode/202610/eac2da991d2e48a78d5468135729b8f7.mp4","number":1,"unlockCoin":10,"isFree":true}
Raw output:
{"code":0,"message":"ok","data":"2112300351523786753"}
Interpretation: Created episode 1 for drama Istri Yang Bangkit.
2026-10-20 05:50:23 - create episode 2 for Istri Yang Bangkit
Command:
POST http://127.0.0.1:8080/admin/episodes
BODY {"durationSec":0,"dramaId":"2112300351435706369","title":"Episode 2","sort":2,"videoUrl":"/files/episode/202610/bfeecceb819644ec8ebd109d32203685.mp4","number":2,"unlockCoin":10,"isFree":true}
Raw output:
{"code":0,"message":"ok","data":"2112300351565729793"}
Interpretation: Created episode 2 for drama Istri Yang Bangkit.
2026-10-20 05:50:23 - create episode 3 for Istri Yang Bangkit
Command:
POST http://127.0.0.1:8080/admin/episodes
BODY {"durationSec":0,"dramaId":"2112300351435706369","title":"Episode 3","sort":3,"videoUrl":"/files/episode/202610/f7f6f5dc20d24f01b0bb5ef5f66d635c.mp4","number":3,"unlockCoin":10,"isFree":true}
Raw output:
{"code":0,"message":"ok","data":"2112300351611867138"}
Interpretation: Created episode 3 for drama Istri Yang Bangkit.
2026-10-20 05:50:23 - create episode 4 for Istri Yang Bangkit
Command:
POST http://127.0.0.1:8080/admin/episodes
BODY {"durationSec":0,"dramaId":"2112300351435706369","title":"Episode 4","sort":4,"videoUrl":"/files/episode/202610/d9b7b4399a5948c08e8840d13626b8b0.mp4","number":4,"unlockCoin":10,"isFree":true}
Raw output:
{"code":0,"message":"ok","data":"2112300351653810178"}
Interpretation: Created episode 4 for drama Istri Yang Bangkit.
2026-10-20 05:50:23 - read drama 2112300351435706369 status
Command:
GET http://127.0.0.1:8080/admin/dramas/2112300351435706369
Raw output:
{"code":0,"message":"ok","data":{"id":"2112300351435706369","code":"D20261020008","title":"Istri Yang Bangkit","subtitle":"被背叛的妻子","categoryId":"4","category":"悬疑复仇","genre":"Revenge Suspense","description":"被背叛的妻子","cover":"/files/drama_cover/202610/4dd149df699b48849a1b22960e35e66b.jpg","trailerUrl":"","language":"id-ID","episodes":4,"freeEpisodes":4,"unlockCoin":10,"isHot":true,"status":"draft","statusText":"草稿","views":"0","sort":99,"publishAt":null,"createdAt":"2026-10-20 05:50:23","updatedAt":"2026-10-20 05:50:23"}}
Interpretation: Read current drama status before review transitions.
2026-10-20 05:50:23 - submit drama 2112300351435706369
Command:
POST http://127.0.0.1:8080/admin/dramas/2112300351435706369/submit
Raw output:
{"code":0,"message":"ok","data":null}
Interpretation: Drama submitted for review.
2026-10-20 05:50:23 - approve drama 2112300351435706369
Command:
POST http://127.0.0.1:8080/admin/dramas/2112300351435706369/approve
Raw output:
{"code":0,"message":"ok","data":null}
Interpretation: Drama review approved.
2026-10-20 05:50:23 - publish drama 2112300351435706369
Command:
POST http://127.0.0.1:8080/admin/dramas/2112300351435706369/publish
Raw output:
{"code":0,"message":"ok","data":null}
Interpretation: Drama published; draft episodes are promoted to published.
2026-10-20 05:50:23 - init upload 竖版_9x16.jpg
Command:
POST http://127.0.0.1:8080/admin/media/upload/init
BODY {"fileSize":256571,"fileName":"竖版_9x16.jpg","bizType":"DRAMA_COVER","chunkSize":5242880}
Raw output:
{"code":0,"message":"ok","data":{"uploadId":"418cfbbdccb24c67892cf870a7cbdf68","chunkSize":"5242880","totalChunks":1,"objectKey":"drama_cover/202610/93e8ebda36794f3fac90cf419ce71792.jpg"}}
Interpretation: Created upload session for DRAMA_COVER file 竖版_9x16.jpg.
2026-10-20 05:50:23 - upload chunk 1
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=418cfbbdccb24c67892cf870a7cbdf68&index=0 (multipart file=chunk_0.bin, bytes=256571)
Raw output:
{"code":0,"message":"ok","data":0}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:23 - complete upload 竖版_9x16.jpg
Command:
POST http://127.0.0.1:8080/admin/media/upload/complete
BODY {"uploadId":"418cfbbdccb24c67892cf870a7cbdf68","durationSec":0}
Raw output:
{"code":0,"message":"ok","data":{"id":"2112300352001937409","bizType":"DRAMA_COVER","fileName":"竖版_9x16.jpg","objectKey":"drama_cover/202610/93e8ebda36794f3fac90cf419ce71792.jpg","url":"/files/drama_cover/202610/93e8ebda36794f3fac90cf419ce71792.jpg","sizeBytes":"256571","md5":"260b0c9476d43c0325c09a2fa874eade","durationSec":0,"status":"ready","createdAt":"2026-10-20 05:50:23"}}
Interpretation: Merged uploaded chunks into media asset 竖版_9x16.jpg.
2026-10-20 05:50:23 - init upload 10.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/init
BODY {"fileSize":12212920,"fileName":"10.mp4","bizType":"EPISODE","chunkSize":5242880}
Raw output:
{"code":0,"message":"ok","data":{"uploadId":"02ae919bac3f40f188aaf3601e27c083","chunkSize":"5242880","totalChunks":3,"objectKey":"episode/202610/3263657859b6451e964a1582bd26b40c.mp4"}}
Interpretation: Created upload session for EPISODE file 10.mp4.
2026-10-20 05:50:23 - upload chunk 1
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=02ae919bac3f40f188aaf3601e27c083&index=0 (multipart file=chunk_0.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":0}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:23 - upload chunk 2
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=02ae919bac3f40f188aaf3601e27c083&index=1 (multipart file=chunk_1.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":1}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:23 - upload chunk 3
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=02ae919bac3f40f188aaf3601e27c083&index=2 (multipart file=chunk_2.bin, bytes=1727160)
Raw output:
{"code":0,"message":"ok","data":2}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:23 - complete upload 10.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/complete
BODY {"uploadId":"02ae919bac3f40f188aaf3601e27c083","durationSec":0}
Raw output:
{"code":0,"message":"ok","data":{"id":"2112300354833092609","bizType":"EPISODE","fileName":"10.mp4","objectKey":"episode/202610/3263657859b6451e964a1582bd26b40c.mp4","url":"/files/episode/202610/3263657859b6451e964a1582bd26b40c.mp4","sizeBytes":"12212920","md5":"ab9e992a4df45641453a0f5963c0415a","durationSec":0,"status":"transcoding","createdAt":"2026-10-20 05:50:23"}}
Interpretation: Merged uploaded chunks into media asset 10.mp4.
2026-10-20 05:50:23 - init upload 11.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/init
BODY {"fileSize":11618962,"fileName":"11.mp4","bizType":"EPISODE","chunkSize":5242880}
Raw output:
{"code":0,"message":"ok","data":{"uploadId":"ce260c107ec642aa8d7f5206566781d2","chunkSize":"5242880","totalChunks":3,"objectKey":"episode/202610/502359072c2c470c8492d52627823543.mp4"}}
Interpretation: Created upload session for EPISODE file 11.mp4.
2026-10-20 05:50:24 - upload chunk 1
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=ce260c107ec642aa8d7f5206566781d2&index=0 (multipart file=chunk_0.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":0}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:24 - upload chunk 2
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=ce260c107ec642aa8d7f5206566781d2&index=1 (multipart file=chunk_1.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":1}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:24 - upload chunk 3
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=ce260c107ec642aa8d7f5206566781d2&index=2 (multipart file=chunk_2.bin, bytes=1133202)
Raw output:
{"code":0,"message":"ok","data":2}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:24 - complete upload 11.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/complete
BODY {"uploadId":"ce260c107ec642aa8d7f5206566781d2","durationSec":0}
Raw output:
{"code":0,"message":"ok","data":{"id":"2112300358012375042","bizType":"EPISODE","fileName":"11.mp4","objectKey":"episode/202610/502359072c2c470c8492d52627823543.mp4","url":"/files/episode/202610/502359072c2c470c8492d52627823543.mp4","sizeBytes":"11618962","md5":"7bf3d8324bf567a950b32752218a8f78","durationSec":0,"status":"transcoding","createdAt":"2026-10-20 05:50:24"}}
Interpretation: Merged uploaded chunks into media asset 11.mp4.
2026-10-20 05:50:24 - init upload 12.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/init
BODY {"fileSize":10675335,"fileName":"12.mp4","bizType":"EPISODE","chunkSize":5242880}
Raw output:
{"code":0,"message":"ok","data":{"uploadId":"87fb819443b74f24be80b0deea023ff9","chunkSize":"5242880","totalChunks":3,"objectKey":"episode/202610/40f4e0a343a8470f882e72b528863456.mp4"}}
Interpretation: Created upload session for EPISODE file 12.mp4.
2026-10-20 05:50:24 - upload chunk 1
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=87fb819443b74f24be80b0deea023ff9&index=0 (multipart file=chunk_0.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":0}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:24 - upload chunk 2
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=87fb819443b74f24be80b0deea023ff9&index=1 (multipart file=chunk_1.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":1}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:24 - upload chunk 3
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=87fb819443b74f24be80b0deea023ff9&index=2 (multipart file=chunk_2.bin, bytes=189575)
Raw output:
{"code":0,"message":"ok","data":2}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:25 - complete upload 12.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/complete
BODY {"uploadId":"87fb819443b74f24be80b0deea023ff9","durationSec":0}
Raw output:
{"code":0,"message":"ok","data":{"id":"2112300360847724546","bizType":"EPISODE","fileName":"12.mp4","objectKey":"episode/202610/40f4e0a343a8470f882e72b528863456.mp4","url":"/files/episode/202610/40f4e0a343a8470f882e72b528863456.mp4","sizeBytes":"10675335","md5":"0487a1d3a58cbcdefc12c117e3697848","durationSec":0,"status":"transcoding","createdAt":"2026-10-20 05:50:24"}}
Interpretation: Merged uploaded chunks into media asset 12.mp4.
2026-10-20 05:50:25 - init upload 13.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/init
BODY {"fileSize":27861811,"fileName":"13.mp4","bizType":"EPISODE","chunkSize":5242880}
Raw output:
{"code":0,"message":"ok","data":{"uploadId":"318f4e8dbbdb4898b480300b9dd4876a","chunkSize":"5242880","totalChunks":6,"objectKey":"episode/202610/2932c3e07bec49a0bd0d4007db684c59.mp4"}}
Interpretation: Created upload session for EPISODE file 13.mp4.
2026-10-20 05:50:25 - upload chunk 1
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=318f4e8dbbdb4898b480300b9dd4876a&index=0 (multipart file=chunk_0.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":0}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:25 - upload chunk 2
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=318f4e8dbbdb4898b480300b9dd4876a&index=1 (multipart file=chunk_1.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":1}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:25 - upload chunk 3
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=318f4e8dbbdb4898b480300b9dd4876a&index=2 (multipart file=chunk_2.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":2}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:25 - upload chunk 4
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=318f4e8dbbdb4898b480300b9dd4876a&index=3 (multipart file=chunk_3.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":3}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:25 - upload chunk 5
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=318f4e8dbbdb4898b480300b9dd4876a&index=4 (multipart file=chunk_4.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":4}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:25 - upload chunk 6
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=318f4e8dbbdb4898b480300b9dd4876a&index=5 (multipart file=chunk_5.bin, bytes=1647411)
Raw output:
{"code":0,"message":"ok","data":5}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:27 - complete upload 13.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/complete
BODY {"uploadId":"318f4e8dbbdb4898b480300b9dd4876a","durationSec":0}
Raw output:
{"code":0,"message":"ok","data":{"id":"2112300367785103361","bizType":"EPISODE","fileName":"13.mp4","objectKey":"episode/202610/2932c3e07bec49a0bd0d4007db684c59.mp4","url":"/files/episode/202610/2932c3e07bec49a0bd0d4007db684c59.mp4","sizeBytes":"27861811","md5":"f7e2a89dcf539449c2494375f8502676","durationSec":0,"status":"transcoding","createdAt":"2026-10-20 05:50:25"}}
Interpretation: Merged uploaded chunks into media asset 13.mp4.
2026-10-20 05:50:27 - init upload 14.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/init
BODY {"fileSize":8917322,"fileName":"14.mp4","bizType":"EPISODE","chunkSize":5242880}
Raw output:
{"code":0,"message":"ok","data":{"uploadId":"2639295c63744b4e9f6f8faa0d12c8ed","chunkSize":"5242880","totalChunks":2,"objectKey":"episode/202610/031b9edbfc5349798fdfd0e2f67bec79.mp4"}}
Interpretation: Created upload session for EPISODE file 14.mp4.
2026-10-20 05:50:27 - upload chunk 1
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=2639295c63744b4e9f6f8faa0d12c8ed&index=0 (multipart file=chunk_0.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":0}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:27 - upload chunk 2
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=2639295c63744b4e9f6f8faa0d12c8ed&index=1 (multipart file=chunk_1.bin, bytes=3674442)
Raw output:
{"code":0,"message":"ok","data":1}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:27 - complete upload 14.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/complete
BODY {"uploadId":"2639295c63744b4e9f6f8faa0d12c8ed","durationSec":0}
Raw output:
{"code":0,"message":"ok","data":{"id":"2112300370070999042","bizType":"EPISODE","fileName":"14.mp4","objectKey":"episode/202610/031b9edbfc5349798fdfd0e2f67bec79.mp4","url":"/files/episode/202610/031b9edbfc5349798fdfd0e2f67bec79.mp4","sizeBytes":"8917322","md5":"a136b8b1986939152dc0a17b373e828d","durationSec":0,"status":"transcoding","createdAt":"2026-10-20 05:50:27"}}
Interpretation: Merged uploaded chunks into media asset 14.mp4.
2026-10-20 05:50:27 - create drama Pewaris Hilang
Command:
POST http://127.0.0.1:8080/admin/dramas
BODY {"genre":"Rebirth Comeback","description":"失落的继承人","freeEpisodes":5,"subtitle":"失落的继承人","sort":98,"isHot":true,"categoryId":2,"cover":"/files/drama_cover/202610/93e8ebda36794f3fac90cf419ce71792.jpg","language":"id-ID","title":"Pewaris Hilang","unlockCoin":10}
Raw output:
{"code":0,"message":"ok","data":"2112300370213605378"}
Interpretation: Created drama 'Pewaris Hilang' with Chinese synopsis '失落的继承人'.
2026-10-20 05:50:27 - read drama 2112300370213605378 before episodes
Command:
GET http://127.0.0.1:8080/admin/dramas/2112300370213605378
Raw output:
{"code":0,"message":"ok","data":{"id":"2112300370213605378","code":"D20261020009","title":"Pewaris Hilang","subtitle":"失落的继承人","categoryId":"2","category":"重生逆袭","genre":"Rebirth Comeback","description":"失落的继承人","cover":"/files/drama_cover/202610/93e8ebda36794f3fac90cf419ce71792.jpg","trailerUrl":"","language":"id-ID","episodes":0,"freeEpisodes":5,"unlockCoin":10,"isHot":true,"status":"draft","statusText":"草稿","views":"0","sort":98,"publishAt":null,"createdAt":"2026-10-20 05:50:27","updatedAt":"2026-10-20 05:50:27"}}
Interpretation: Read drama metadata before creating or updating episodes.
2026-10-20 05:50:27 - list episodes drama 2112300370213605378
Command:
GET http://127.0.0.1:8080/admin/episodes?dramaId=2112300370213605378
Raw output:
{"code":0,"message":"ok","data":[]}
Interpretation: Loaded existing episodes for resume and duplicate prevention.
2026-10-20 05:50:27 - create episode 1 for Pewaris Hilang
Command:
POST http://127.0.0.1:8080/admin/episodes
BODY {"durationSec":0,"dramaId":"2112300370213605378","title":"Episode 1","sort":1,"videoUrl":"/files/episode/202610/3263657859b6451e964a1582bd26b40c.mp4","number":1,"unlockCoin":10,"isFree":true}
Raw output:
{"code":0,"message":"ok","data":"2112300370410737666"}
Interpretation: Created episode 1 for drama Pewaris Hilang.
2026-10-20 05:50:27 - create episode 2 for Pewaris Hilang
Command:
POST http://127.0.0.1:8080/admin/episodes
BODY {"durationSec":0,"dramaId":"2112300370213605378","title":"Episode 2","sort":2,"videoUrl":"/files/episode/202610/502359072c2c470c8492d52627823543.mp4","number":2,"unlockCoin":10,"isFree":true}
Raw output:
{"code":0,"message":"ok","data":"2112300370490429442"}
Interpretation: Created episode 2 for drama Pewaris Hilang.
2026-10-20 05:50:27 - create episode 3 for Pewaris Hilang
Command:
POST http://127.0.0.1:8080/admin/episodes
BODY {"durationSec":0,"dramaId":"2112300370213605378","title":"Episode 3","sort":3,"videoUrl":"/files/episode/202610/40f4e0a343a8470f882e72b528863456.mp4","number":3,"unlockCoin":10,"isFree":true}
Raw output:
{"code":0,"message":"ok","data":"2112300370595287041"}
Interpretation: Created episode 3 for drama Pewaris Hilang.
2026-10-20 05:50:27 - create episode 4 for Pewaris Hilang
Command:
POST http://127.0.0.1:8080/admin/episodes
BODY {"durationSec":0,"dramaId":"2112300370213605378","title":"Episode 4","sort":4,"videoUrl":"/files/episode/202610/2932c3e07bec49a0bd0d4007db684c59.mp4","number":4,"unlockCoin":10,"isFree":true}
Raw output:
{"code":0,"message":"ok","data":"2112300370670784514"}
Interpretation: Created episode 4 for drama Pewaris Hilang.
2026-10-20 05:50:27 - create episode 5 for Pewaris Hilang
Command:
POST http://127.0.0.1:8080/admin/episodes
BODY {"durationSec":0,"dramaId":"2112300370213605378","title":"Episode 5","sort":5,"videoUrl":"/files/episode/202610/031b9edbfc5349798fdfd0e2f67bec79.mp4","number":5,"unlockCoin":10,"isFree":true}
Raw output:
{"code":0,"message":"ok","data":"2112300370767253506"}
Interpretation: Created episode 5 for drama Pewaris Hilang.
2026-10-20 05:50:27 - read drama 2112300370213605378 status
Command:
GET http://127.0.0.1:8080/admin/dramas/2112300370213605378
Raw output:
{"code":0,"message":"ok","data":{"id":"2112300370213605378","code":"D20261020009","title":"Pewaris Hilang","subtitle":"失落的继承人","categoryId":"2","category":"重生逆袭","genre":"Rebirth Comeback","description":"失落的继承人","cover":"/files/drama_cover/202610/93e8ebda36794f3fac90cf419ce71792.jpg","trailerUrl":"","language":"id-ID","episodes":5,"freeEpisodes":5,"unlockCoin":10,"isHot":true,"status":"draft","statusText":"草稿","views":"0","sort":98,"publishAt":null,"createdAt":"2026-10-20 05:50:27","updatedAt":"2026-10-20 05:50:27"}}
Interpretation: Read current drama status before review transitions.
2026-10-20 05:50:27 - submit drama 2112300370213605378
Command:
POST http://127.0.0.1:8080/admin/dramas/2112300370213605378/submit
Raw output:
{"code":0,"message":"ok","data":null}
Interpretation: Drama submitted for review.
2026-10-20 05:50:27 - approve drama 2112300370213605378
Command:
POST http://127.0.0.1:8080/admin/dramas/2112300370213605378/approve
Raw output:
{"code":0,"message":"ok","data":null}
Interpretation: Drama review approved.
2026-10-20 05:50:27 - publish drama 2112300370213605378
Command:
POST http://127.0.0.1:8080/admin/dramas/2112300370213605378/publish
Raw output:
{"code":0,"message":"ok","data":null}
Interpretation: Drama published; draft episodes are promoted to published.
2026-10-20 05:50:27 - init upload 竖版_9x16.jpg
Command:
POST http://127.0.0.1:8080/admin/media/upload/init
BODY {"fileSize":194899,"fileName":"竖版_9x16.jpg","bizType":"DRAMA_COVER","chunkSize":5242880}
Raw output:
{"code":0,"message":"ok","data":{"uploadId":"83f9e9fb88074d24b7c82f926edbec68","chunkSize":"5242880","totalChunks":1,"objectKey":"drama_cover/202610/31dec9fc90c442fa8a50ea4bc81e776f.jpg"}}
Interpretation: Created upload session for DRAMA_COVER file 竖版_9x16.jpg.
2026-10-20 05:50:27 - upload chunk 1
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=83f9e9fb88074d24b7c82f926edbec68&index=0 (multipart file=chunk_0.bin, bytes=194899)
Raw output:
{"code":0,"message":"ok","data":0}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:27 - complete upload 竖版_9x16.jpg
Command:
POST http://127.0.0.1:8080/admin/media/upload/complete
BODY {"uploadId":"83f9e9fb88074d24b7c82f926edbec68","durationSec":0}
Raw output:
{"code":0,"message":"ok","data":{"id":"2112300371438342146","bizType":"DRAMA_COVER","fileName":"竖版_9x16.jpg","objectKey":"drama_cover/202610/31dec9fc90c442fa8a50ea4bc81e776f.jpg","url":"/files/drama_cover/202610/31dec9fc90c442fa8a50ea4bc81e776f.jpg","sizeBytes":"194899","md5":"7f96820b49436de36812db36cb4a4965","durationSec":0,"status":"ready","createdAt":"2026-10-20 05:50:27"}}
Interpretation: Merged uploaded chunks into media asset 竖版_9x16.jpg.
2026-10-20 05:50:27 - init upload 15.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/init
BODY {"fileSize":7775882,"fileName":"15.mp4","bizType":"EPISODE","chunkSize":5242880}
Raw output:
{"code":0,"message":"ok","data":{"uploadId":"fd5d53d68f1840509890030fe8c8294f","chunkSize":"5242880","totalChunks":2,"objectKey":"episode/202610/39967fe4b620419fbba263ff584e02ae.mp4"}}
Interpretation: Created upload session for EPISODE file 15.mp4.
2026-10-20 05:50:27 - upload chunk 1
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=fd5d53d68f1840509890030fe8c8294f&index=0 (multipart file=chunk_0.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":0}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:28 - upload chunk 2
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=fd5d53d68f1840509890030fe8c8294f&index=1 (multipart file=chunk_1.bin, bytes=2533002)
Raw output:
{"code":0,"message":"ok","data":1}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:28 - complete upload 15.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/complete
BODY {"uploadId":"fd5d53d68f1840509890030fe8c8294f","durationSec":0}
Raw output:
{"code":0,"message":"ok","data":{"id":"2112300373816512514","bizType":"EPISODE","fileName":"15.mp4","objectKey":"episode/202610/39967fe4b620419fbba263ff584e02ae.mp4","url":"/files/episode/202610/39967fe4b620419fbba263ff584e02ae.mp4","sizeBytes":"7775882","md5":"1f0b6109fad515038f54759716a9f0af","durationSec":0,"status":"transcoding","createdAt":"2026-10-20 05:50:28"}}
Interpretation: Merged uploaded chunks into media asset 15.mp4.
2026-10-20 05:50:28 - init upload 16.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/init
BODY {"fileSize":17051328,"fileName":"16.mp4","bizType":"EPISODE","chunkSize":5242880}
Raw output:
{"code":0,"message":"ok","data":{"uploadId":"a94851a519f349ac9f3142e0a79f0173","chunkSize":"5242880","totalChunks":4,"objectKey":"episode/202610/8f2f0087f82442b8b8d1409773afe316.mp4"}}
Interpretation: Created upload session for EPISODE file 16.mp4.
2026-10-20 05:50:28 - upload chunk 1
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=a94851a519f349ac9f3142e0a79f0173&index=0 (multipart file=chunk_0.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":0}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:28 - upload chunk 2
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=a94851a519f349ac9f3142e0a79f0173&index=1 (multipart file=chunk_1.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":1}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:28 - upload chunk 3
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=a94851a519f349ac9f3142e0a79f0173&index=2 (multipart file=chunk_2.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":2}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:28 - upload chunk 4
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=a94851a519f349ac9f3142e0a79f0173&index=3 (multipart file=chunk_3.bin, bytes=1322688)
Raw output:
{"code":0,"message":"ok","data":3}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:29 - complete upload 16.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/complete
BODY {"uploadId":"a94851a519f349ac9f3142e0a79f0173","durationSec":0}
Raw output:
{"code":0,"message":"ok","data":{"id":"2112300378312806402","bizType":"EPISODE","fileName":"16.mp4","objectKey":"episode/202610/8f2f0087f82442b8b8d1409773afe316.mp4","url":"/files/episode/202610/8f2f0087f82442b8b8d1409773afe316.mp4","sizeBytes":"17051328","md5":"f45d06099f3f1c1570fdd507d100fc53","durationSec":0,"status":"transcoding","createdAt":"2026-10-20 05:50:28"}}
Interpretation: Merged uploaded chunks into media asset 16.mp4.
2026-10-20 05:50:29 - init upload 17.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/init
BODY {"fileSize":14631004,"fileName":"17.mp4","bizType":"EPISODE","chunkSize":5242880}
Raw output:
{"code":0,"message":"ok","data":{"uploadId":"71543a3299da4dedb0274edf38b8535b","chunkSize":"5242880","totalChunks":3,"objectKey":"episode/202610/f63d5434d27c4feb96432bce6b0413ff.mp4"}}
Interpretation: Created upload session for EPISODE file 17.mp4.
2026-10-20 05:50:29 - upload chunk 1
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=71543a3299da4dedb0274edf38b8535b&index=0 (multipart file=chunk_0.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":0}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:29 - upload chunk 2
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=71543a3299da4dedb0274edf38b8535b&index=1 (multipart file=chunk_1.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":1}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:29 - upload chunk 3
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=71543a3299da4dedb0274edf38b8535b&index=2 (multipart file=chunk_2.bin, bytes=4145244)
Raw output:
{"code":0,"message":"ok","data":2}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:30 - complete upload 17.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/complete
BODY {"uploadId":"71543a3299da4dedb0274edf38b8535b","durationSec":0}
Raw output:
{"code":0,"message":"ok","data":{"id":"2112300382242869249","bizType":"EPISODE","fileName":"17.mp4","objectKey":"episode/202610/f63d5434d27c4feb96432bce6b0413ff.mp4","url":"/files/episode/202610/f63d5434d27c4feb96432bce6b0413ff.mp4","sizeBytes":"14631004","md5":"58becc74e6cc50581be7903df02fa6e9","durationSec":0,"status":"transcoding","createdAt":"2026-10-20 05:50:29"}}
Interpretation: Merged uploaded chunks into media asset 17.mp4.
2026-10-20 05:50:30 - init upload 18.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/init
BODY {"fileSize":16140196,"fileName":"18.mp4","bizType":"EPISODE","chunkSize":5242880}
Raw output:
{"code":0,"message":"ok","data":{"uploadId":"77806792cd224938948df64f7aeb7aaf","chunkSize":"5242880","totalChunks":4,"objectKey":"episode/202610/56a083c52e3a46bdaadfe60b32dc3612.mp4"}}
Interpretation: Created upload session for EPISODE file 18.mp4.
2026-10-20 05:50:30 - upload chunk 1
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=77806792cd224938948df64f7aeb7aaf&index=0 (multipart file=chunk_0.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":0}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:30 - upload chunk 2
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=77806792cd224938948df64f7aeb7aaf&index=1 (multipart file=chunk_1.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":1}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:30 - upload chunk 3
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=77806792cd224938948df64f7aeb7aaf&index=2 (multipart file=chunk_2.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":2}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:30 - upload chunk 4
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=77806792cd224938948df64f7aeb7aaf&index=3 (multipart file=chunk_3.bin, bytes=411556)
Raw output:
{"code":0,"message":"ok","data":3}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:31 - complete upload 18.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/complete
BODY {"uploadId":"77806792cd224938948df64f7aeb7aaf","durationSec":0}
Raw output:
{"code":0,"message":"ok","data":{"id":"2112300386147766274","bizType":"EPISODE","fileName":"18.mp4","objectKey":"episode/202610/56a083c52e3a46bdaadfe60b32dc3612.mp4","url":"/files/episode/202610/56a083c52e3a46bdaadfe60b32dc3612.mp4","sizeBytes":"16140196","md5":"47d9ed35b686fb076aaaa8dab013cfed","durationSec":0,"status":"transcoding","createdAt":"2026-10-20 05:50:30"}}
Interpretation: Merged uploaded chunks into media asset 18.mp4.
2026-10-20 05:50:31 - create drama Nikah Kontrak
Command:
POST http://127.0.0.1:8080/admin/dramas
BODY {"genre":"Sweet Romance","description":"契约婚姻","freeEpisodes":4,"subtitle":"契约婚姻","sort":97,"isHot":false,"categoryId":3,"cover":"/files/drama_cover/202610/31dec9fc90c442fa8a50ea4bc81e776f.jpg","language":"id-ID","title":"Nikah Kontrak","unlockCoin":10}
Raw output:
{"code":0,"message":"ok","data":"2112300386319732737"}
Interpretation: Created drama 'Nikah Kontrak' with Chinese synopsis '契约婚姻'.
2026-10-20 05:50:31 - read drama 2112300386319732737 before episodes
Command:
GET http://127.0.0.1:8080/admin/dramas/2112300386319732737
Raw output:
{"code":0,"message":"ok","data":{"id":"2112300386319732737","code":"D20261020010","title":"Nikah Kontrak","subtitle":"契约婚姻","categoryId":"3","category":"甜宠爱情","genre":"Sweet Romance","description":"契约婚姻","cover":"/files/drama_cover/202610/31dec9fc90c442fa8a50ea4bc81e776f.jpg","trailerUrl":"","language":"id-ID","episodes":0,"freeEpisodes":4,"unlockCoin":10,"isHot":false,"status":"draft","statusText":"草稿","views":"0","sort":97,"publishAt":null,"createdAt":"2026-10-20 05:50:31","updatedAt":"2026-10-20 05:50:31"}}
Interpretation: Read drama metadata before creating or updating episodes.
2026-10-20 05:50:31 - list episodes drama 2112300386319732737
Command:
GET http://127.0.0.1:8080/admin/episodes?dramaId=2112300386319732737
Raw output:
{"code":0,"message":"ok","data":[]}
Interpretation: Loaded existing episodes for resume and duplicate prevention.
2026-10-20 05:50:31 - create episode 1 for Nikah Kontrak
Command:
POST http://127.0.0.1:8080/admin/episodes
BODY {"durationSec":0,"dramaId":"2112300386319732737","title":"Episode 1","sort":1,"videoUrl":"/files/episode/202610/39967fe4b620419fbba263ff584e02ae.mp4","number":1,"unlockCoin":10,"isFree":true}
Raw output:
{"code":0,"message":"ok","data":"2112300386458144769"}
Interpretation: Created episode 1 for drama Nikah Kontrak.
2026-10-20 05:50:31 - create episode 2 for Nikah Kontrak
Command:
POST http://127.0.0.1:8080/admin/episodes
BODY {"durationSec":0,"dramaId":"2112300386319732737","title":"Episode 2","sort":2,"videoUrl":"/files/episode/202610/8f2f0087f82442b8b8d1409773afe316.mp4","number":2,"unlockCoin":10,"isFree":true}
Raw output:
{"code":0,"message":"ok","data":"2112300386525253634"}
Interpretation: Created episode 2 for drama Nikah Kontrak.
2026-10-20 05:50:31 - create episode 3 for Nikah Kontrak
Command:
POST http://127.0.0.1:8080/admin/episodes
BODY {"durationSec":0,"dramaId":"2112300386319732737","title":"Episode 3","sort":3,"videoUrl":"/files/episode/202610/f63d5434d27c4feb96432bce6b0413ff.mp4","number":3,"unlockCoin":10,"isFree":true}
Raw output:
{"code":0,"message":"ok","data":"2112300386596556802"}
Interpretation: Created episode 3 for drama Nikah Kontrak.
2026-10-20 05:50:31 - create episode 4 for Nikah Kontrak
Command:
POST http://127.0.0.1:8080/admin/episodes
BODY {"durationSec":0,"dramaId":"2112300386319732737","title":"Episode 4","sort":4,"videoUrl":"/files/episode/202610/56a083c52e3a46bdaadfe60b32dc3612.mp4","number":4,"unlockCoin":10,"isFree":true}
Raw output:
{"code":0,"message":"ok","data":"2112300386676248577"}
Interpretation: Created episode 4 for drama Nikah Kontrak.
2026-10-20 05:50:31 - read drama 2112300386319732737 status
Command:
GET http://127.0.0.1:8080/admin/dramas/2112300386319732737
Raw output:
{"code":0,"message":"ok","data":{"id":"2112300386319732737","code":"D20261020010","title":"Nikah Kontrak","subtitle":"契约婚姻","categoryId":"3","category":"甜宠爱情","genre":"Sweet Romance","description":"契约婚姻","cover":"/files/drama_cover/202610/31dec9fc90c442fa8a50ea4bc81e776f.jpg","trailerUrl":"","language":"id-ID","episodes":4,"freeEpisodes":4,"unlockCoin":10,"isHot":false,"status":"draft","statusText":"草稿","views":"0","sort":97,"publishAt":null,"createdAt":"2026-10-20 05:50:31","updatedAt":"2026-10-20 05:50:31"}}
Interpretation: Read current drama status before review transitions.
2026-10-20 05:50:31 - submit drama 2112300386319732737
Command:
POST http://127.0.0.1:8080/admin/dramas/2112300386319732737/submit
Raw output:
{"code":0,"message":"ok","data":null}
Interpretation: Drama submitted for review.
2026-10-20 05:50:31 - approve drama 2112300386319732737
Command:
POST http://127.0.0.1:8080/admin/dramas/2112300386319732737/approve
Raw output:
{"code":0,"message":"ok","data":null}
Interpretation: Drama review approved.
2026-10-20 05:50:31 - publish drama 2112300386319732737
Command:
POST http://127.0.0.1:8080/admin/dramas/2112300386319732737/publish
Raw output:
{"code":0,"message":"ok","data":null}
Interpretation: Drama published; draft episodes are promoted to published.
2026-10-20 05:50:31 - init upload 竖版_9x16.jpg
Command:
POST http://127.0.0.1:8080/admin/media/upload/init
BODY {"fileSize":234530,"fileName":"竖版_9x16.jpg","bizType":"DRAMA_COVER","chunkSize":5242880}
Raw output:
{"code":0,"message":"ok","data":{"uploadId":"6a2061bf29124407823201ba613556f9","chunkSize":"5242880","totalChunks":1,"objectKey":"drama_cover/202610/1074a29a9f83448fbf664c75a290194e.jpg"}}
Interpretation: Created upload session for DRAMA_COVER file 竖版_9x16.jpg.
2026-10-20 05:50:31 - upload chunk 1
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=6a2061bf29124407823201ba613556f9&index=0 (multipart file=chunk_0.bin, bytes=234530)
Raw output:
{"code":0,"message":"ok","data":0}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:31 - complete upload 竖版_9x16.jpg
Command:
POST http://127.0.0.1:8080/admin/media/upload/complete
BODY {"uploadId":"6a2061bf29124407823201ba613556f9","durationSec":0}
Raw output:
{"code":0,"message":"ok","data":{"id":"2112300387246673922","bizType":"DRAMA_COVER","fileName":"竖版_9x16.jpg","objectKey":"drama_cover/202610/1074a29a9f83448fbf664c75a290194e.jpg","url":"/files/drama_cover/202610/1074a29a9f83448fbf664c75a290194e.jpg","sizeBytes":"234530","md5":"6a45203a287f5bf672d5d3b3f0106b7a","durationSec":0,"status":"ready","createdAt":"2026-10-20 05:50:31"}}
Interpretation: Merged uploaded chunks into media asset 竖版_9x16.jpg.
2026-10-20 05:50:31 - init upload 19.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/init
BODY {"fileSize":12391064,"fileName":"19.mp4","bizType":"EPISODE","chunkSize":5242880}
Raw output:
{"code":0,"message":"ok","data":{"uploadId":"54b345cddf2b4ae5bdaf3e296eb11369","chunkSize":"5242880","totalChunks":3,"objectKey":"episode/202610/d5416f2b1bc74223850a727a04d4f988.mp4"}}
Interpretation: Created upload session for EPISODE file 19.mp4.
2026-10-20 05:50:31 - upload chunk 1
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=54b345cddf2b4ae5bdaf3e296eb11369&index=0 (multipart file=chunk_0.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":0}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:31 - upload chunk 2
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=54b345cddf2b4ae5bdaf3e296eb11369&index=1 (multipart file=chunk_1.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":1}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:31 - upload chunk 3
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=54b345cddf2b4ae5bdaf3e296eb11369&index=2 (multipart file=chunk_2.bin, bytes=1905304)
Raw output:
{"code":0,"message":"ok","data":2}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:32 - complete upload 19.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/complete
BODY {"uploadId":"54b345cddf2b4ae5bdaf3e296eb11369","durationSec":0}
Raw output:
{"code":0,"message":"ok","data":{"id":"2112300390572756993","bizType":"EPISODE","fileName":"19.mp4","objectKey":"episode/202610/d5416f2b1bc74223850a727a04d4f988.mp4","url":"/files/episode/202610/d5416f2b1bc74223850a727a04d4f988.mp4","sizeBytes":"12391064","md5":"367fee1f40e373110b3439cdc6d9d704","durationSec":0,"status":"transcoding","createdAt":"2026-10-20 05:50:31"}}
Interpretation: Merged uploaded chunks into media asset 19.mp4.
2026-10-20 05:50:32 - init upload 20.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/init
BODY {"fileSize":13241110,"fileName":"20.mp4","bizType":"EPISODE","chunkSize":5242880}
Raw output:
{"code":0,"message":"ok","data":{"uploadId":"836f0d4c25984e2d9644d6d32c6b61c8","chunkSize":"5242880","totalChunks":3,"objectKey":"episode/202610/3b060d4df20b4954af49141cdf58a3fe.mp4"}}
Interpretation: Created upload session for EPISODE file 20.mp4.
2026-10-20 05:50:32 - upload chunk 1
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=836f0d4c25984e2d9644d6d32c6b61c8&index=0 (multipart file=chunk_0.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":0}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:32 - upload chunk 2
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=836f0d4c25984e2d9644d6d32c6b61c8&index=1 (multipart file=chunk_1.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":1}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:32 - upload chunk 3
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=836f0d4c25984e2d9644d6d32c6b61c8&index=2 (multipart file=chunk_2.bin, bytes=2755350)
Raw output:
{"code":0,"message":"ok","data":2}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:33 - complete upload 20.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/complete
BODY {"uploadId":"836f0d4c25984e2d9644d6d32c6b61c8","durationSec":0}
Raw output:
{"code":0,"message":"ok","data":{"id":"2112300394305687554","bizType":"EPISODE","fileName":"20.mp4","objectKey":"episode/202610/3b060d4df20b4954af49141cdf58a3fe.mp4","url":"/files/episode/202610/3b060d4df20b4954af49141cdf58a3fe.mp4","sizeBytes":"13241110","md5":"259b6335eaba29bab093696ea4b9a4b8","durationSec":0,"status":"transcoding","createdAt":"2026-10-20 05:50:32"}}
Interpretation: Merged uploaded chunks into media asset 20.mp4.
2026-10-20 05:50:33 - init upload 21.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/init
BODY {"fileSize":9966124,"fileName":"21.mp4","bizType":"EPISODE","chunkSize":5242880}
Raw output:
{"code":0,"message":"ok","data":{"uploadId":"e111251fd9df403d998516d109803a5b","chunkSize":"5242880","totalChunks":2,"objectKey":"episode/202610/389519ec3a1a41ca97351441740cafeb.mp4"}}
Interpretation: Created upload session for EPISODE file 21.mp4.
2026-10-20 05:50:33 - upload chunk 1
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=e111251fd9df403d998516d109803a5b&index=0 (multipart file=chunk_0.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":0}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:33 - upload chunk 2
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=e111251fd9df403d998516d109803a5b&index=1 (multipart file=chunk_1.bin, bytes=4723244)
Raw output:
{"code":0,"message":"ok","data":1}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:33 - complete upload 21.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/complete
BODY {"uploadId":"e111251fd9df403d998516d109803a5b","durationSec":0}
Raw output:
{"code":0,"message":"ok","data":{"id":"2112300397086511105","bizType":"EPISODE","fileName":"21.mp4","objectKey":"episode/202610/389519ec3a1a41ca97351441740cafeb.mp4","url":"/files/episode/202610/389519ec3a1a41ca97351441740cafeb.mp4","sizeBytes":"9966124","md5":"862641c6580698ae97b7629882873969","durationSec":0,"status":"transcoding","createdAt":"2026-10-20 05:50:33"}}
Interpretation: Merged uploaded chunks into media asset 21.mp4.
2026-10-20 05:50:34 - init upload 22.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/init
BODY {"fileSize":8574477,"fileName":"22.mp4","bizType":"EPISODE","chunkSize":5242880}
Raw output:
{"code":0,"message":"ok","data":{"uploadId":"aee205581b1e443b917a320c793086c7","chunkSize":"5242880","totalChunks":2,"objectKey":"episode/202610/c4e231b4f6004a788e9046cb407d9a24.mp4"}}
Interpretation: Created upload session for EPISODE file 22.mp4.
2026-10-20 05:50:34 - upload chunk 1
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=aee205581b1e443b917a320c793086c7&index=0 (multipart file=chunk_0.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":0}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:34 - upload chunk 2
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=aee205581b1e443b917a320c793086c7&index=1 (multipart file=chunk_1.bin, bytes=3331597)
Raw output:
{"code":0,"message":"ok","data":1}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:34 - complete upload 22.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/complete
BODY {"uploadId":"aee205581b1e443b917a320c793086c7","durationSec":0}
Raw output:
{"code":0,"message":"ok","data":{"id":"2112300399489847297","bizType":"EPISODE","fileName":"22.mp4","objectKey":"episode/202610/c4e231b4f6004a788e9046cb407d9a24.mp4","url":"/files/episode/202610/c4e231b4f6004a788e9046cb407d9a24.mp4","sizeBytes":"8574477","md5":"0e075725737c2dcae7e8949b99a85853","durationSec":0,"status":"transcoding","createdAt":"2026-10-20 05:50:34"}}
Interpretation: Merged uploaded chunks into media asset 22.mp4.
2026-10-20 05:50:34 - init upload 23.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/init
BODY {"fileSize":10080145,"fileName":"23.mp4","bizType":"EPISODE","chunkSize":5242880}
Raw output:
{"code":0,"message":"ok","data":{"uploadId":"ad02888d33fb4b4f801d67e0af00b169","chunkSize":"5242880","totalChunks":2,"objectKey":"episode/202610/64869b53b6b945c8b1b0cdaf575ecb3d.mp4"}}
Interpretation: Created upload session for EPISODE file 23.mp4.
2026-10-20 05:50:34 - upload chunk 1
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=ad02888d33fb4b4f801d67e0af00b169&index=0 (multipart file=chunk_0.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":0}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:34 - upload chunk 2
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=ad02888d33fb4b4f801d67e0af00b169&index=1 (multipart file=chunk_1.bin, bytes=4837265)
Raw output:
{"code":0,"message":"ok","data":1}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:35 - complete upload 23.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/complete
BODY {"uploadId":"ad02888d33fb4b4f801d67e0af00b169","durationSec":0}
Raw output:
{"code":0,"message":"ok","data":{"id":"2112300402195173378","bizType":"EPISODE","fileName":"23.mp4","objectKey":"episode/202610/64869b53b6b945c8b1b0cdaf575ecb3d.mp4","url":"/files/episode/202610/64869b53b6b945c8b1b0cdaf575ecb3d.mp4","sizeBytes":"10080145","md5":"3eccf574fb26c7badc8fa6e222d73f28","durationSec":0,"status":"transcoding","createdAt":"2026-10-20 05:50:34"}}
Interpretation: Merged uploaded chunks into media asset 23.mp4.
2026-10-20 05:50:35 - create drama Alpha Terakhir
Command:
POST http://127.0.0.1:8080/admin/dramas
BODY {"genre":"Sweet Romance","description":"最后的Alpha","freeEpisodes":5,"subtitle":"最后的Alpha","sort":96,"isHot":false,"categoryId":3,"cover":"/files/drama_cover/202610/1074a29a9f83448fbf664c75a290194e.jpg","language":"id-ID","title":"Alpha Terakhir","unlockCoin":10}
Raw output:
{"code":0,"message":"ok","data":"2112300402325196801"}
Interpretation: Created drama 'Alpha Terakhir' with Chinese synopsis '最后的Alpha'.
2026-10-20 05:50:35 - read drama 2112300402325196801 before episodes
Command:
GET http://127.0.0.1:8080/admin/dramas/2112300402325196801
Raw output:
{"code":0,"message":"ok","data":{"id":"2112300402325196801","code":"D20261020011","title":"Alpha Terakhir","subtitle":"最后的Alpha","categoryId":"3","category":"甜宠爱情","genre":"Sweet Romance","description":"最后的Alpha","cover":"/files/drama_cover/202610/1074a29a9f83448fbf664c75a290194e.jpg","trailerUrl":"","language":"id-ID","episodes":0,"freeEpisodes":5,"unlockCoin":10,"isHot":false,"status":"draft","statusText":"草稿","views":"0","sort":96,"publishAt":null,"createdAt":"2026-10-20 05:50:35","updatedAt":"2026-10-20 05:50:35"}}
Interpretation: Read drama metadata before creating or updating episodes.
2026-10-20 05:50:35 - list episodes drama 2112300402325196801
Command:
GET http://127.0.0.1:8080/admin/episodes?dramaId=2112300402325196801
Raw output:
{"code":0,"message":"ok","data":[]}
Interpretation: Loaded existing episodes for resume and duplicate prevention.
2026-10-20 05:50:35 - create episode 1 for Alpha Terakhir
Command:
POST http://127.0.0.1:8080/admin/episodes
BODY {"durationSec":0,"dramaId":"2112300402325196801","title":"Episode 1","sort":1,"videoUrl":"/files/episode/202610/d5416f2b1bc74223850a727a04d4f988.mp4","number":1,"unlockCoin":10,"isFree":true}
Raw output:
{"code":0,"message":"ok","data":"2112300402476191745"}
Interpretation: Created episode 1 for drama Alpha Terakhir.
2026-10-20 05:50:35 - create episode 2 for Alpha Terakhir
Command:
POST http://127.0.0.1:8080/admin/episodes
BODY {"durationSec":0,"dramaId":"2112300402325196801","title":"Episode 2","sort":2,"videoUrl":"/files/episode/202610/3b060d4df20b4954af49141cdf58a3fe.mp4","number":2,"unlockCoin":10,"isFree":true}
Raw output:
{"code":0,"message":"ok","data":"2112300402555883522"}
Interpretation: Created episode 2 for drama Alpha Terakhir.
2026-10-20 05:50:35 - create episode 3 for Alpha Terakhir
Command:
POST http://127.0.0.1:8080/admin/episodes
BODY {"durationSec":0,"dramaId":"2112300402325196801","title":"Episode 3","sort":3,"videoUrl":"/files/episode/202610/389519ec3a1a41ca97351441740cafeb.mp4","number":3,"unlockCoin":10,"isFree":true}
Raw output:
{"code":0,"message":"ok","data":"2112300402635575298"}
Interpretation: Created episode 3 for drama Alpha Terakhir.
2026-10-20 05:50:35 - create episode 4 for Alpha Terakhir
Command:
POST http://127.0.0.1:8080/admin/episodes
BODY {"durationSec":0,"dramaId":"2112300402325196801","title":"Episode 4","sort":4,"videoUrl":"/files/episode/202610/c4e231b4f6004a788e9046cb407d9a24.mp4","number":4,"unlockCoin":10,"isFree":true}
Raw output:
{"code":0,"message":"ok","data":"2112300402711072769"}
Interpretation: Created episode 4 for drama Alpha Terakhir.
2026-10-20 05:50:35 - create episode 5 for Alpha Terakhir
Command:
POST http://127.0.0.1:8080/admin/episodes
BODY {"durationSec":0,"dramaId":"2112300402325196801","title":"Episode 5","sort":5,"videoUrl":"/files/episode/202610/64869b53b6b945c8b1b0cdaf575ecb3d.mp4","number":5,"unlockCoin":10,"isFree":true}
Raw output:
{"code":0,"message":"ok","data":"2112300402778181634"}
Interpretation: Created episode 5 for drama Alpha Terakhir.
2026-10-20 05:50:35 - read drama 2112300402325196801 status
Command:
GET http://127.0.0.1:8080/admin/dramas/2112300402325196801
Raw output:
{"code":0,"message":"ok","data":{"id":"2112300402325196801","code":"D20261020011","title":"Alpha Terakhir","subtitle":"最后的Alpha","categoryId":"3","category":"甜宠爱情","genre":"Sweet Romance","description":"最后的Alpha","cover":"/files/drama_cover/202610/1074a29a9f83448fbf664c75a290194e.jpg","trailerUrl":"","language":"id-ID","episodes":5,"freeEpisodes":5,"unlockCoin":10,"isHot":false,"status":"draft","statusText":"草稿","views":"0","sort":96,"publishAt":null,"createdAt":"2026-10-20 05:50:35","updatedAt":"2026-10-20 05:50:35"}}
Interpretation: Read current drama status before review transitions.
2026-10-20 05:50:35 - submit drama 2112300402325196801
Command:
POST http://127.0.0.1:8080/admin/dramas/2112300402325196801/submit
Raw output:
{"code":0,"message":"ok","data":null}
Interpretation: Drama submitted for review.
2026-10-20 05:50:35 - approve drama 2112300402325196801
Command:
POST http://127.0.0.1:8080/admin/dramas/2112300402325196801/approve
Raw output:
{"code":0,"message":"ok","data":null}
Interpretation: Drama review approved.
2026-10-20 05:50:35 - publish drama 2112300402325196801
Command:
POST http://127.0.0.1:8080/admin/dramas/2112300402325196801/publish
Raw output:
{"code":0,"message":"ok","data":null}
Interpretation: Drama published; draft episodes are promoted to published.
2026-10-20 05:50:35 - init upload 竖版_9x16.jpg
Command:
POST http://127.0.0.1:8080/admin/media/upload/init
BODY {"fileSize":182954,"fileName":"竖版_9x16.jpg","bizType":"DRAMA_COVER","chunkSize":5242880}
Raw output:
{"code":0,"message":"ok","data":{"uploadId":"bb399db135814d7eb69a5033952eddc7","chunkSize":"5242880","totalChunks":1,"objectKey":"drama_cover/202610/8a7c339a7af84b2b8aa97772636935d3.jpg"}}
Interpretation: Created upload session for DRAMA_COVER file 竖版_9x16.jpg.
2026-10-20 05:50:35 - upload chunk 1
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=bb399db135814d7eb69a5033952eddc7&index=0 (multipart file=chunk_0.bin, bytes=182954)
Raw output:
{"code":0,"message":"ok","data":0}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:35 - complete upload 竖版_9x16.jpg
Command:
POST http://127.0.0.1:8080/admin/media/upload/complete
BODY {"uploadId":"bb399db135814d7eb69a5033952eddc7","durationSec":0}
Raw output:
{"code":0,"message":"ok","data":{"id":"2112300403382161409","bizType":"DRAMA_COVER","fileName":"竖版_9x16.jpg","objectKey":"drama_cover/202610/8a7c339a7af84b2b8aa97772636935d3.jpg","url":"/files/drama_cover/202610/8a7c339a7af84b2b8aa97772636935d3.jpg","sizeBytes":"182954","md5":"2fa1465b24d2d15679037cf6d1dfb3a8","durationSec":0,"status":"ready","createdAt":"2026-10-20 05:50:35"}}
Interpretation: Merged uploaded chunks into media asset 竖版_9x16.jpg.
2026-10-20 05:50:35 - init upload 24.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/init
BODY {"fileSize":9815337,"fileName":"24.mp4","bizType":"EPISODE","chunkSize":5242880}
Raw output:
{"code":0,"message":"ok","data":{"uploadId":"447879a458a24b3f824a1fda69e5717e","chunkSize":"5242880","totalChunks":2,"objectKey":"episode/202610/00151bb5733b4076bff30e7acfe16605.mp4"}}
Interpretation: Created upload session for EPISODE file 24.mp4.
2026-10-20 05:50:35 - upload chunk 1
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=447879a458a24b3f824a1fda69e5717e&index=0 (multipart file=chunk_0.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":0}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:35 - upload chunk 2
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=447879a458a24b3f824a1fda69e5717e&index=1 (multipart file=chunk_1.bin, bytes=4572457)
Raw output:
{"code":0,"message":"ok","data":1}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:36 - complete upload 24.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/complete
BODY {"uploadId":"447879a458a24b3f824a1fda69e5717e","durationSec":0}
Raw output:
{"code":0,"message":"ok","data":{"id":"2112300406142013441","bizType":"EPISODE","fileName":"24.mp4","objectKey":"episode/202610/00151bb5733b4076bff30e7acfe16605.mp4","url":"/files/episode/202610/00151bb5733b4076bff30e7acfe16605.mp4","sizeBytes":"9815337","md5":"94f4fea2475bfff462e505d61714bed2","durationSec":0,"status":"transcoding","createdAt":"2026-10-20 05:50:35"}}
Interpretation: Merged uploaded chunks into media asset 24.mp4.
2026-10-20 05:50:36 - init upload 25.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/init
BODY {"fileSize":15835482,"fileName":"25.mp4","bizType":"EPISODE","chunkSize":5242880}
Raw output:
{"code":0,"message":"ok","data":{"uploadId":"5b87a10c81a0488f8816d8a929af8c7e","chunkSize":"5242880","totalChunks":4,"objectKey":"episode/202610/2bcada54921545ad8538011ef6877793.mp4"}}
Interpretation: Created upload session for EPISODE file 25.mp4.
2026-10-20 05:50:36 - upload chunk 1
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=5b87a10c81a0488f8816d8a929af8c7e&index=0 (multipart file=chunk_0.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":0}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:36 - upload chunk 2
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=5b87a10c81a0488f8816d8a929af8c7e&index=1 (multipart file=chunk_1.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":1}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:36 - upload chunk 3
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=5b87a10c81a0488f8816d8a929af8c7e&index=2 (multipart file=chunk_2.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":2}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:36 - upload chunk 4
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=5b87a10c81a0488f8816d8a929af8c7e&index=3 (multipart file=chunk_3.bin, bytes=106842)
Raw output:
{"code":0,"message":"ok","data":3}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:37 - complete upload 25.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/complete
BODY {"uploadId":"5b87a10c81a0488f8816d8a929af8c7e","durationSec":0}
Raw output:
{"code":0,"message":"ok","data":{"id":"2112300410453757954","bizType":"EPISODE","fileName":"25.mp4","objectKey":"episode/202610/2bcada54921545ad8538011ef6877793.mp4","url":"/files/episode/202610/2bcada54921545ad8538011ef6877793.mp4","sizeBytes":"15835482","md5":"7804aef2325b3232ab255488f599c271","durationSec":0,"status":"transcoding","createdAt":"2026-10-20 05:50:36"}}
Interpretation: Merged uploaded chunks into media asset 25.mp4.
2026-10-20 05:50:37 - init upload 26.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/init
BODY {"fileSize":9333861,"fileName":"26.mp4","bizType":"EPISODE","chunkSize":5242880}
Raw output:
{"code":0,"message":"ok","data":{"uploadId":"83a29c9298a84201a001e6647a86ee60","chunkSize":"5242880","totalChunks":2,"objectKey":"episode/202610/092b38097cf14ae0b47222eec489411b.mp4"}}
Interpretation: Created upload session for EPISODE file 26.mp4.
2026-10-20 05:50:37 - upload chunk 1
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=83a29c9298a84201a001e6647a86ee60&index=0 (multipart file=chunk_0.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":0}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:37 - upload chunk 2
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=83a29c9298a84201a001e6647a86ee60&index=1 (multipart file=chunk_1.bin, bytes=4090981)
Raw output:
{"code":0,"message":"ok","data":1}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:37 - complete upload 26.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/complete
BODY {"uploadId":"83a29c9298a84201a001e6647a86ee60","durationSec":0}
Raw output:
{"code":0,"message":"ok","data":{"id":"2112300412513161217","bizType":"EPISODE","fileName":"26.mp4","objectKey":"episode/202610/092b38097cf14ae0b47222eec489411b.mp4","url":"/files/episode/202610/092b38097cf14ae0b47222eec489411b.mp4","sizeBytes":"9333861","md5":"a619777be4f614aaa10295fcabf723ea","durationSec":0,"status":"transcoding","createdAt":"2026-10-20 05:50:37"}}
Interpretation: Merged uploaded chunks into media asset 26.mp4.
2026-10-20 05:50:37 - init upload 27.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/init
BODY {"fileSize":10974318,"fileName":"27.mp4","bizType":"EPISODE","chunkSize":5242880}
Raw output:
{"code":0,"message":"ok","data":{"uploadId":"f444ace7123141c794a82064d5e886a8","chunkSize":"5242880","totalChunks":3,"objectKey":"episode/202610/5686107ab0a945f5a109541393e279a1.mp4"}}
Interpretation: Created upload session for EPISODE file 27.mp4.
2026-10-20 05:50:37 - upload chunk 1
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=f444ace7123141c794a82064d5e886a8&index=0 (multipart file=chunk_0.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":0}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:37 - upload chunk 2
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=f444ace7123141c794a82064d5e886a8&index=1 (multipart file=chunk_1.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":1}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:37 - upload chunk 3
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=f444ace7123141c794a82064d5e886a8&index=2 (multipart file=chunk_2.bin, bytes=488558)
Raw output:
{"code":0,"message":"ok","data":2}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:38 - complete upload 27.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/complete
BODY {"uploadId":"f444ace7123141c794a82064d5e886a8","durationSec":0}
Raw output:
{"code":0,"message":"ok","data":{"id":"2112300415545643010","bizType":"EPISODE","fileName":"27.mp4","objectKey":"episode/202610/5686107ab0a945f5a109541393e279a1.mp4","url":"/files/episode/202610/5686107ab0a945f5a109541393e279a1.mp4","sizeBytes":"10974318","md5":"ecd1e8f1846ba80e0b424bf98a1ac1af","durationSec":0,"status":"transcoding","createdAt":"2026-10-20 05:50:37"}}
Interpretation: Merged uploaded chunks into media asset 27.mp4.
2026-10-20 05:50:38 - create drama Dokter Hatiku
Command:
POST http://127.0.0.1:8080/admin/dramas
BODY {"genre":"Urban Romance","description":"我心中的医生","freeEpisodes":4,"subtitle":"我心中的医生","sort":95,"isHot":false,"categoryId":1,"cover":"/files/drama_cover/202610/8a7c339a7af84b2b8aa97772636935d3.jpg","language":"id-ID","title":"Dokter Hatiku","unlockCoin":10}
Raw output:
{"code":0,"message":"ok","data":"2112300415688249345"}
Interpretation: Created drama 'Dokter Hatiku' with Chinese synopsis '我心中的医生'.
2026-10-20 05:50:38 - read drama 2112300415688249345 before episodes
Command:
GET http://127.0.0.1:8080/admin/dramas/2112300415688249345
Raw output:
{"code":0,"message":"ok","data":{"id":"2112300415688249345","code":"D20261020012","title":"Dokter Hatiku","subtitle":"我心中的医生","categoryId":"1","category":"都市情感","genre":"Urban Romance","description":"我心中的医生","cover":"/files/drama_cover/202610/8a7c339a7af84b2b8aa97772636935d3.jpg","trailerUrl":"","language":"id-ID","episodes":0,"freeEpisodes":4,"unlockCoin":10,"isHot":false,"status":"draft","statusText":"草稿","views":"0","sort":95,"publishAt":null,"createdAt":"2026-10-20 05:50:38","updatedAt":"2026-10-20 05:50:38"}}
Interpretation: Read drama metadata before creating or updating episodes.
2026-10-20 05:50:38 - list episodes drama 2112300415688249345
Command:
GET http://127.0.0.1:8080/admin/episodes?dramaId=2112300415688249345
Raw output:
{"code":0,"message":"ok","data":[]}
Interpretation: Loaded existing episodes for resume and duplicate prevention.
2026-10-20 05:50:38 - create episode 1 for Dokter Hatiku
Command:
POST http://127.0.0.1:8080/admin/episodes
BODY {"durationSec":0,"dramaId":"2112300415688249345","title":"Episode 1","sort":1,"videoUrl":"/files/episode/202610/00151bb5733b4076bff30e7acfe16605.mp4","number":1,"unlockCoin":10,"isFree":true}
Raw output:
{"code":0,"message":"ok","data":"2112300415818272770"}
Interpretation: Created episode 1 for drama Dokter Hatiku.
2026-10-20 05:50:38 - create episode 2 for Dokter Hatiku
Command:
POST http://127.0.0.1:8080/admin/episodes
BODY {"durationSec":0,"dramaId":"2112300415688249345","title":"Episode 2","sort":2,"videoUrl":"/files/episode/202610/2bcada54921545ad8538011ef6877793.mp4","number":2,"unlockCoin":10,"isFree":true}
Raw output:
{"code":0,"message":"ok","data":"2112300415885381633"}
Interpretation: Created episode 2 for drama Dokter Hatiku.
2026-10-20 05:50:38 - create episode 3 for Dokter Hatiku
Command:
POST http://127.0.0.1:8080/admin/episodes
BODY {"durationSec":0,"dramaId":"2112300415688249345","title":"Episode 3","sort":3,"videoUrl":"/files/episode/202610/092b38097cf14ae0b47222eec489411b.mp4","number":3,"unlockCoin":10,"isFree":true}
Raw output:
{"code":0,"message":"ok","data":"2112300415944101889"}
Interpretation: Created episode 3 for drama Dokter Hatiku.
2026-10-20 05:50:38 - create episode 4 for Dokter Hatiku
Command:
POST http://127.0.0.1:8080/admin/episodes
BODY {"durationSec":0,"dramaId":"2112300415688249345","title":"Episode 4","sort":4,"videoUrl":"/files/episode/202610/5686107ab0a945f5a109541393e279a1.mp4","number":4,"unlockCoin":10,"isFree":true}
Raw output:
{"code":0,"message":"ok","data":"2112300416011210754"}
Interpretation: Created episode 4 for drama Dokter Hatiku.
2026-10-20 05:50:38 - read drama 2112300415688249345 status
Command:
GET http://127.0.0.1:8080/admin/dramas/2112300415688249345
Raw output:
{"code":0,"message":"ok","data":{"id":"2112300415688249345","code":"D20261020012","title":"Dokter Hatiku","subtitle":"我心中的医生","categoryId":"1","category":"都市情感","genre":"Urban Romance","description":"我心中的医生","cover":"/files/drama_cover/202610/8a7c339a7af84b2b8aa97772636935d3.jpg","trailerUrl":"","language":"id-ID","episodes":4,"freeEpisodes":4,"unlockCoin":10,"isHot":false,"status":"draft","statusText":"草稿","views":"0","sort":95,"publishAt":null,"createdAt":"2026-10-20 05:50:38","updatedAt":"2026-10-20 05:50:38"}}
Interpretation: Read current drama status before review transitions.
2026-10-20 05:50:38 - submit drama 2112300415688249345
Command:
POST http://127.0.0.1:8080/admin/dramas/2112300415688249345/submit
Raw output:
{"code":0,"message":"ok","data":null}
Interpretation: Drama submitted for review.
2026-10-20 05:50:38 - approve drama 2112300415688249345
Command:
POST http://127.0.0.1:8080/admin/dramas/2112300415688249345/approve
Raw output:
{"code":0,"message":"ok","data":null}
Interpretation: Drama review approved.
2026-10-20 05:50:38 - publish drama 2112300415688249345
Command:
POST http://127.0.0.1:8080/admin/dramas/2112300415688249345/publish
Raw output:
{"code":0,"message":"ok","data":null}
Interpretation: Drama published; draft episodes are promoted to published.
2026-10-20 05:50:38 - init upload 竖版_9x16.jpg
Command:
POST http://127.0.0.1:8080/admin/media/upload/init
BODY {"fileSize":231729,"fileName":"竖版_9x16.jpg","bizType":"DRAMA_COVER","chunkSize":5242880}
Raw output:
{"code":0,"message":"ok","data":{"uploadId":"7e011e0ebef742d78593287845a03b6a","chunkSize":"5242880","totalChunks":1,"objectKey":"drama_cover/202610/8609c882fb084c7cb72f9d481c6ce525.jpg"}}
Interpretation: Created upload session for DRAMA_COVER file 竖版_9x16.jpg.
2026-10-20 05:50:38 - upload chunk 1
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=7e011e0ebef742d78593287845a03b6a&index=0 (multipart file=chunk_0.bin, bytes=231729)
Raw output:
{"code":0,"message":"ok","data":0}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:38 - complete upload 竖版_9x16.jpg
Command:
POST http://127.0.0.1:8080/admin/media/upload/complete
BODY {"uploadId":"7e011e0ebef742d78593287845a03b6a","durationSec":0}
Raw output:
{"code":0,"message":"ok","data":{"id":"2112300416548081665","bizType":"DRAMA_COVER","fileName":"竖版_9x16.jpg","objectKey":"drama_cover/202610/8609c882fb084c7cb72f9d481c6ce525.jpg","url":"/files/drama_cover/202610/8609c882fb084c7cb72f9d481c6ce525.jpg","sizeBytes":"231729","md5":"7c0a0a786f0bb7d35cd13586814cd45a","durationSec":0,"status":"ready","createdAt":"2026-10-20 05:50:38"}}
Interpretation: Merged uploaded chunks into media asset 竖版_9x16.jpg.
2026-10-20 05:50:38 - init upload 28.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/init
BODY {"fileSize":6916271,"fileName":"28.mp4","bizType":"EPISODE","chunkSize":5242880}
Raw output:
{"code":0,"message":"ok","data":{"uploadId":"f6ee4c9bfbb445368d22aef64e096940","chunkSize":"5242880","totalChunks":2,"objectKey":"episode/202610/8792d25251604009918575d55ebd7c63.mp4"}}
Interpretation: Created upload session for EPISODE file 28.mp4.
2026-10-20 05:50:38 - upload chunk 1
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=f6ee4c9bfbb445368d22aef64e096940&index=0 (multipart file=chunk_0.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":0}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:38 - upload chunk 2
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=f6ee4c9bfbb445368d22aef64e096940&index=1 (multipart file=chunk_1.bin, bytes=1673391)
Raw output:
{"code":0,"message":"ok","data":1}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:39 - complete upload 28.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/complete
BODY {"uploadId":"f6ee4c9bfbb445368d22aef64e096940","durationSec":0}
Raw output:
{"code":0,"message":"ok","data":{"id":"2112300418439712769","bizType":"EPISODE","fileName":"28.mp4","objectKey":"episode/202610/8792d25251604009918575d55ebd7c63.mp4","url":"/files/episode/202610/8792d25251604009918575d55ebd7c63.mp4","sizeBytes":"6916271","md5":"a3cae1aece65b985ff5c8ce9c244c980","durationSec":0,"status":"transcoding","createdAt":"2026-10-20 05:50:38"}}
Interpretation: Merged uploaded chunks into media asset 28.mp4.
2026-10-20 05:50:39 - init upload 29.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/init
BODY {"fileSize":12138780,"fileName":"29.mp4","bizType":"EPISODE","chunkSize":5242880}
Raw output:
{"code":0,"message":"ok","data":{"uploadId":"a8d6aebad1314cb3b6dc3ef3abab3dbe","chunkSize":"5242880","totalChunks":3,"objectKey":"episode/202610/cb21fdc7c02d46a2a9f342efa5dc1dfb.mp4"}}
Interpretation: Created upload session for EPISODE file 29.mp4.
2026-10-20 05:50:39 - upload chunk 1
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=a8d6aebad1314cb3b6dc3ef3abab3dbe&index=0 (multipart file=chunk_0.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":0}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:39 - upload chunk 2
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=a8d6aebad1314cb3b6dc3ef3abab3dbe&index=1 (multipart file=chunk_1.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":1}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:39 - upload chunk 3
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=a8d6aebad1314cb3b6dc3ef3abab3dbe&index=2 (multipart file=chunk_2.bin, bytes=1653020)
Raw output:
{"code":0,"message":"ok","data":2}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:39 - complete upload 29.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/complete
BODY {"uploadId":"a8d6aebad1314cb3b6dc3ef3abab3dbe","durationSec":0}
Raw output:
{"code":0,"message":"ok","data":{"id":"2112300421715464194","bizType":"EPISODE","fileName":"29.mp4","objectKey":"episode/202610/cb21fdc7c02d46a2a9f342efa5dc1dfb.mp4","url":"/files/episode/202610/cb21fdc7c02d46a2a9f342efa5dc1dfb.mp4","sizeBytes":"12138780","md5":"b15c104821cd5676f8539fbfa8713959","durationSec":0,"status":"transcoding","createdAt":"2026-10-20 05:50:39"}}
Interpretation: Merged uploaded chunks into media asset 29.mp4.
2026-10-20 05:50:39 - init upload 30.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/init
BODY {"fileSize":13795881,"fileName":"30.mp4","bizType":"EPISODE","chunkSize":5242880}
Raw output:
{"code":0,"message":"ok","data":{"uploadId":"59301de594dd4dfd9bf282b3be73027f","chunkSize":"5242880","totalChunks":3,"objectKey":"episode/202610/bc77d0b8ac434115a0b2cbc423174bdf.mp4"}}
Interpretation: Created upload session for EPISODE file 30.mp4.
2026-10-20 05:50:39 - upload chunk 1
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=59301de594dd4dfd9bf282b3be73027f&index=0 (multipart file=chunk_0.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":0}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:40 - upload chunk 2
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=59301de594dd4dfd9bf282b3be73027f&index=1 (multipart file=chunk_1.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":1}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:40 - upload chunk 3
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=59301de594dd4dfd9bf282b3be73027f&index=2 (multipart file=chunk_2.bin, bytes=3310121)
Raw output:
{"code":0,"message":"ok","data":2}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:40 - complete upload 30.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/complete
BODY {"uploadId":"59301de594dd4dfd9bf282b3be73027f","durationSec":0}
Raw output:
{"code":0,"message":"ok","data":{"id":"2112300425389674497","bizType":"EPISODE","fileName":"30.mp4","objectKey":"episode/202610/bc77d0b8ac434115a0b2cbc423174bdf.mp4","url":"/files/episode/202610/bc77d0b8ac434115a0b2cbc423174bdf.mp4","sizeBytes":"13795881","md5":"1347b4fa81a3ca6c9e415388b864d8fa","durationSec":0,"status":"transcoding","createdAt":"2026-10-20 05:50:40"}}
Interpretation: Merged uploaded chunks into media asset 30.mp4.
2026-10-20 05:50:40 - init upload 31.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/init
BODY {"fileSize":13407094,"fileName":"31.mp4","bizType":"EPISODE","chunkSize":5242880}
Raw output:
{"code":0,"message":"ok","data":{"uploadId":"9a29d5c8a29b493dabe4c16d731ab9ba","chunkSize":"5242880","totalChunks":3,"objectKey":"episode/202610/dcb43839db94481bb2b7cffe746995a5.mp4"}}
Interpretation: Created upload session for EPISODE file 31.mp4.
2026-10-20 05:50:40 - upload chunk 1
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=9a29d5c8a29b493dabe4c16d731ab9ba&index=0 (multipart file=chunk_0.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":0}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:40 - upload chunk 2
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=9a29d5c8a29b493dabe4c16d731ab9ba&index=1 (multipart file=chunk_1.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":1}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:41 - upload chunk 3
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=9a29d5c8a29b493dabe4c16d731ab9ba&index=2 (multipart file=chunk_2.bin, bytes=2921334)
Raw output:
{"code":0,"message":"ok","data":2}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:41 - complete upload 31.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/complete
BODY {"uploadId":"9a29d5c8a29b493dabe4c16d731ab9ba","durationSec":0}
Raw output:
{"code":0,"message":"ok","data":{"id":"2112300428967415810","bizType":"EPISODE","fileName":"31.mp4","objectKey":"episode/202610/dcb43839db94481bb2b7cffe746995a5.mp4","url":"/files/episode/202610/dcb43839db94481bb2b7cffe746995a5.mp4","sizeBytes":"13407094","md5":"d1765b8d01716d96f62dbe147924276e","durationSec":0,"status":"transcoding","createdAt":"2026-10-20 05:50:41"}}
Interpretation: Merged uploaded chunks into media asset 31.mp4.
2026-10-20 05:50:41 - init upload 32.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/init
BODY {"fileSize":13755173,"fileName":"32.mp4","bizType":"EPISODE","chunkSize":5242880}
Raw output:
{"code":0,"message":"ok","data":{"uploadId":"7aefcfb8a3b94f13b3c5a818216a7d13","chunkSize":"5242880","totalChunks":3,"objectKey":"episode/202610/3fd641c6b36e44a7bbf16b26113d5eaf.mp4"}}
Interpretation: Created upload session for EPISODE file 32.mp4.
2026-10-20 05:50:41 - upload chunk 1
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=7aefcfb8a3b94f13b3c5a818216a7d13&index=0 (multipart file=chunk_0.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":0}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:41 - upload chunk 2
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=7aefcfb8a3b94f13b3c5a818216a7d13&index=1 (multipart file=chunk_1.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":1}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:41 - upload chunk 3
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=7aefcfb8a3b94f13b3c5a818216a7d13&index=2 (multipart file=chunk_2.bin, bytes=3269413)
Raw output:
{"code":0,"message":"ok","data":2}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:42 - complete upload 32.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/complete
BODY {"uploadId":"7aefcfb8a3b94f13b3c5a818216a7d13","durationSec":0}
Raw output:
{"code":0,"message":"ok","data":{"id":"2112300432620654594","bizType":"EPISODE","fileName":"32.mp4","objectKey":"episode/202610/3fd641c6b36e44a7bbf16b26113d5eaf.mp4","url":"/files/episode/202610/3fd641c6b36e44a7bbf16b26113d5eaf.mp4","sizeBytes":"13755173","md5":"71e196616b5d408c148d3f26639adbce","durationSec":0,"status":"transcoding","createdAt":"2026-10-20 05:50:41"}}
Interpretation: Merged uploaded chunks into media asset 32.mp4.
2026-10-20 05:50:42 - create drama Kembali Untukmu
Command:
POST http://127.0.0.1:8080/admin/dramas
BODY {"genre":"Rebirth Comeback","description":"为你重来","freeEpisodes":5,"subtitle":"为你重来","sort":94,"isHot":false,"categoryId":2,"cover":"/files/drama_cover/202610/8609c882fb084c7cb72f9d481c6ce525.jpg","language":"id-ID","title":"Kembali Untukmu","unlockCoin":10}
Raw output:
{"code":0,"message":"ok","data":"2112300432767455234"}
Interpretation: Created drama 'Kembali Untukmu' with Chinese synopsis '为你重来'.
2026-10-20 05:50:42 - read drama 2112300432767455234 before episodes
Command:
GET http://127.0.0.1:8080/admin/dramas/2112300432767455234
Raw output:
{"code":0,"message":"ok","data":{"id":"2112300432767455234","code":"D20261020013","title":"Kembali Untukmu","subtitle":"为你重来","categoryId":"2","category":"重生逆袭","genre":"Rebirth Comeback","description":"为你重来","cover":"/files/drama_cover/202610/8609c882fb084c7cb72f9d481c6ce525.jpg","trailerUrl":"","language":"id-ID","episodes":0,"freeEpisodes":5,"unlockCoin":10,"isHot":false,"status":"draft","statusText":"草稿","views":"0","sort":94,"publishAt":null,"createdAt":"2026-10-20 05:50:42","updatedAt":"2026-10-20 05:50:42"}}
Interpretation: Read drama metadata before creating or updating episodes.
2026-10-20 05:50:42 - list episodes drama 2112300432767455234
Command:
GET http://127.0.0.1:8080/admin/episodes?dramaId=2112300432767455234
Raw output:
{"code":0,"message":"ok","data":[]}
Interpretation: Loaded existing episodes for resume and duplicate prevention.
2026-10-20 05:50:42 - create episode 1 for Kembali Untukmu
Command:
POST http://127.0.0.1:8080/admin/episodes
BODY {"durationSec":0,"dramaId":"2112300432767455234","title":"Episode 1","sort":1,"videoUrl":"/files/episode/202610/8792d25251604009918575d55ebd7c63.mp4","number":1,"unlockCoin":10,"isFree":true}
Raw output:
{"code":0,"message":"ok","data":"2112300432893284353"}
Interpretation: Created episode 1 for drama Kembali Untukmu.
2026-10-20 05:50:42 - create episode 2 for Kembali Untukmu
Command:
POST http://127.0.0.1:8080/admin/episodes
BODY {"durationSec":0,"dramaId":"2112300432767455234","title":"Episode 2","sort":2,"videoUrl":"/files/episode/202610/cb21fdc7c02d46a2a9f342efa5dc1dfb.mp4","number":2,"unlockCoin":10,"isFree":true}
Raw output:
{"code":0,"message":"ok","data":"2112300432964587521"}
Interpretation: Created episode 2 for drama Kembali Untukmu.
2026-10-20 05:50:42 - create episode 3 for Kembali Untukmu
Command:
POST http://127.0.0.1:8080/admin/episodes
BODY {"durationSec":0,"dramaId":"2112300432767455234","title":"Episode 3","sort":3,"videoUrl":"/files/episode/202610/bc77d0b8ac434115a0b2cbc423174bdf.mp4","number":3,"unlockCoin":10,"isFree":true}
Raw output:
{"code":0,"message":"ok","data":"2112300433031696385"}
Interpretation: Created episode 3 for drama Kembali Untukmu.
2026-10-20 05:50:42 - create episode 4 for Kembali Untukmu
Command:
POST http://127.0.0.1:8080/admin/episodes
BODY {"durationSec":0,"dramaId":"2112300432767455234","title":"Episode 4","sort":4,"videoUrl":"/files/episode/202610/dcb43839db94481bb2b7cffe746995a5.mp4","number":4,"unlockCoin":10,"isFree":true}
Raw output:
{"code":0,"message":"ok","data":"2112300433102999553"}
Interpretation: Created episode 4 for drama Kembali Untukmu.
2026-10-20 05:50:42 - create episode 5 for Kembali Untukmu
Command:
POST http://127.0.0.1:8080/admin/episodes
BODY {"durationSec":0,"dramaId":"2112300432767455234","title":"Episode 5","sort":5,"videoUrl":"/files/episode/202610/3fd641c6b36e44a7bbf16b26113d5eaf.mp4","number":5,"unlockCoin":10,"isFree":true}
Raw output:
{"code":0,"message":"ok","data":"2112300433174302721"}
Interpretation: Created episode 5 for drama Kembali Untukmu.
2026-10-20 05:50:42 - read drama 2112300432767455234 status
Command:
GET http://127.0.0.1:8080/admin/dramas/2112300432767455234
Raw output:
{"code":0,"message":"ok","data":{"id":"2112300432767455234","code":"D20261020013","title":"Kembali Untukmu","subtitle":"为你重来","categoryId":"2","category":"重生逆袭","genre":"Rebirth Comeback","description":"为你重来","cover":"/files/drama_cover/202610/8609c882fb084c7cb72f9d481c6ce525.jpg","trailerUrl":"","language":"id-ID","episodes":5,"freeEpisodes":5,"unlockCoin":10,"isHot":false,"status":"draft","statusText":"草稿","views":"0","sort":94,"publishAt":null,"createdAt":"2026-10-20 05:50:42","updatedAt":"2026-10-20 05:50:42"}}
Interpretation: Read current drama status before review transitions.
2026-10-20 05:50:42 - submit drama 2112300432767455234
Command:
POST http://127.0.0.1:8080/admin/dramas/2112300432767455234/submit
Raw output:
{"code":0,"message":"ok","data":null}
Interpretation: Drama submitted for review.
2026-10-20 05:50:42 - approve drama 2112300432767455234
Command:
POST http://127.0.0.1:8080/admin/dramas/2112300432767455234/approve
Raw output:
{"code":0,"message":"ok","data":null}
Interpretation: Drama review approved.
2026-10-20 05:50:42 - publish drama 2112300432767455234
Command:
POST http://127.0.0.1:8080/admin/dramas/2112300432767455234/publish
Raw output:
{"code":0,"message":"ok","data":null}
Interpretation: Drama published; draft episodes are promoted to published.
2026-10-20 05:50:42 - init upload 竖版_9x16.jpg
Command:
POST http://127.0.0.1:8080/admin/media/upload/init
BODY {"fileSize":250372,"fileName":"竖版_9x16.jpg","bizType":"DRAMA_COVER","chunkSize":5242880}
Raw output:
{"code":0,"message":"ok","data":{"uploadId":"0e5250e6546e421d8ad2963bd38c280c","chunkSize":"5242880","totalChunks":1,"objectKey":"drama_cover/202610/407513b839224e3fb7e87563c90fd93d.jpg"}}
Interpretation: Created upload session for DRAMA_COVER file 竖版_9x16.jpg.
2026-10-20 05:50:42 - upload chunk 1
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=0e5250e6546e421d8ad2963bd38c280c&index=0 (multipart file=chunk_0.bin, bytes=250372)
Raw output:
{"code":0,"message":"ok","data":0}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:42 - complete upload 竖版_9x16.jpg
Command:
POST http://127.0.0.1:8080/admin/media/upload/complete
BODY {"uploadId":"0e5250e6546e421d8ad2963bd38c280c","durationSec":0}
Raw output:
{"code":0,"message":"ok","data":{"id":"2112300433774088193","bizType":"DRAMA_COVER","fileName":"竖版_9x16.jpg","objectKey":"drama_cover/202610/407513b839224e3fb7e87563c90fd93d.jpg","url":"/files/drama_cover/202610/407513b839224e3fb7e87563c90fd93d.jpg","sizeBytes":"250372","md5":"b0d88bc1c2512105c217a6eb479bd342","durationSec":0,"status":"ready","createdAt":"2026-10-20 05:50:42"}}
Interpretation: Merged uploaded chunks into media asset 竖版_9x16.jpg.
2026-10-20 05:50:42 - init upload 33.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/init
BODY {"fileSize":12261102,"fileName":"33.mp4","bizType":"EPISODE","chunkSize":5242880}
Raw output:
{"code":0,"message":"ok","data":{"uploadId":"b94713b80cbe41a39255091b68152f7e","chunkSize":"5242880","totalChunks":3,"objectKey":"episode/202610/cc27868b3a904e718bd13d9b4b1ac850.mp4"}}
Interpretation: Created upload session for EPISODE file 33.mp4.
2026-10-20 05:50:42 - upload chunk 1
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=b94713b80cbe41a39255091b68152f7e&index=0 (multipart file=chunk_0.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":0}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:42 - upload chunk 2
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=b94713b80cbe41a39255091b68152f7e&index=1 (multipart file=chunk_1.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":1}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:43 - upload chunk 3
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=b94713b80cbe41a39255091b68152f7e&index=2 (multipart file=chunk_2.bin, bytes=1775342)
Raw output:
{"code":0,"message":"ok","data":2}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:43 - complete upload 33.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/complete
BODY {"uploadId":"b94713b80cbe41a39255091b68152f7e","durationSec":0}
Raw output:
{"code":0,"message":"ok","data":{"id":"2112300436978536449","bizType":"EPISODE","fileName":"33.mp4","objectKey":"episode/202610/cc27868b3a904e718bd13d9b4b1ac850.mp4","url":"/files/episode/202610/cc27868b3a904e718bd13d9b4b1ac850.mp4","sizeBytes":"12261102","md5":"60f9fabfa70acd312100a275634c441d","durationSec":0,"status":"transcoding","createdAt":"2026-10-20 05:50:43"}}
Interpretation: Merged uploaded chunks into media asset 33.mp4.
2026-10-20 05:50:43 - init upload 34.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/init
BODY {"fileSize":12234456,"fileName":"34.mp4","bizType":"EPISODE","chunkSize":5242880}
Raw output:
{"code":0,"message":"ok","data":{"uploadId":"b166b91cec4d42648f2ff7f2dc3d124a","chunkSize":"5242880","totalChunks":3,"objectKey":"episode/202610/4e7090da673f4745a1ec22d9d154e748.mp4"}}
Interpretation: Created upload session for EPISODE file 34.mp4.
2026-10-20 05:50:43 - upload chunk 1
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=b166b91cec4d42648f2ff7f2dc3d124a&index=0 (multipart file=chunk_0.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":0}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:43 - upload chunk 2
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=b166b91cec4d42648f2ff7f2dc3d124a&index=1 (multipart file=chunk_1.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":1}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:43 - upload chunk 3
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=b166b91cec4d42648f2ff7f2dc3d124a&index=2 (multipart file=chunk_2.bin, bytes=1748696)
Raw output:
{"code":0,"message":"ok","data":2}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:44 - complete upload 34.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/complete
BODY {"uploadId":"b166b91cec4d42648f2ff7f2dc3d124a","durationSec":0}
Raw output:
{"code":0,"message":"ok","data":{"id":"2112300440216539138","bizType":"EPISODE","fileName":"34.mp4","objectKey":"episode/202610/4e7090da673f4745a1ec22d9d154e748.mp4","url":"/files/episode/202610/4e7090da673f4745a1ec22d9d154e748.mp4","sizeBytes":"12234456","md5":"a6ccffeb8a249b5f03746e97777deb0b","durationSec":0,"status":"transcoding","createdAt":"2026-10-20 05:50:43"}}
Interpretation: Merged uploaded chunks into media asset 34.mp4.
2026-10-20 05:50:44 - init upload 35.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/init
BODY {"fileSize":12055876,"fileName":"35.mp4","bizType":"EPISODE","chunkSize":5242880}
Raw output:
{"code":0,"message":"ok","data":{"uploadId":"045ee478a03b471d9faad00f2b895fac","chunkSize":"5242880","totalChunks":3,"objectKey":"episode/202610/1b8a5896dc3b4f8bb4f267ff9f3cbbbe.mp4"}}
Interpretation: Created upload session for EPISODE file 35.mp4.
2026-10-20 05:50:44 - upload chunk 1
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=045ee478a03b471d9faad00f2b895fac&index=0 (multipart file=chunk_0.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":0}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:44 - upload chunk 2
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=045ee478a03b471d9faad00f2b895fac&index=1 (multipart file=chunk_1.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":1}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:44 - upload chunk 3
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=045ee478a03b471d9faad00f2b895fac&index=2 (multipart file=chunk_2.bin, bytes=1570116)
Raw output:
{"code":0,"message":"ok","data":2}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:45 - complete upload 35.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/complete
BODY {"uploadId":"045ee478a03b471d9faad00f2b895fac","durationSec":0}
Raw output:
{"code":0,"message":"ok","data":{"id":"2112300443555205122","bizType":"EPISODE","fileName":"35.mp4","objectKey":"episode/202610/1b8a5896dc3b4f8bb4f267ff9f3cbbbe.mp4","url":"/files/episode/202610/1b8a5896dc3b4f8bb4f267ff9f3cbbbe.mp4","sizeBytes":"12055876","md5":"40721adfcc17b7c72a5150c8a38e4de5","durationSec":0,"status":"transcoding","createdAt":"2026-10-20 05:50:44"}}
Interpretation: Merged uploaded chunks into media asset 35.mp4.
2026-10-20 05:50:45 - init upload 36.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/init
BODY {"fileSize":8311956,"fileName":"36.mp4","bizType":"EPISODE","chunkSize":5242880}
Raw output:
{"code":0,"message":"ok","data":{"uploadId":"8b46b5eeb1e44829946dc70adcdd4ac9","chunkSize":"5242880","totalChunks":2,"objectKey":"episode/202610/d4e12654f7e0413c9ddde013dd2668b3.mp4"}}
Interpretation: Created upload session for EPISODE file 36.mp4.
2026-10-20 05:50:45 - upload chunk 1
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=8b46b5eeb1e44829946dc70adcdd4ac9&index=0 (multipart file=chunk_0.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":0}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:45 - upload chunk 2
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=8b46b5eeb1e44829946dc70adcdd4ac9&index=1 (multipart file=chunk_1.bin, bytes=3069076)
Raw output:
{"code":0,"message":"ok","data":1}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:45 - complete upload 36.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/complete
BODY {"uploadId":"8b46b5eeb1e44829946dc70adcdd4ac9","durationSec":0}
Raw output:
{"code":0,"message":"ok","data":{"id":"2112300445811740673","bizType":"EPISODE","fileName":"36.mp4","objectKey":"episode/202610/d4e12654f7e0413c9ddde013dd2668b3.mp4","url":"/files/episode/202610/d4e12654f7e0413c9ddde013dd2668b3.mp4","sizeBytes":"8311956","md5":"283fe97b94dea3a23fb121ec800dc2b2","durationSec":0,"status":"transcoding","createdAt":"2026-10-20 05:50:45"}}
Interpretation: Merged uploaded chunks into media asset 36.mp4.
2026-10-20 05:50:45 - create drama Gadis Pembantu
Command:
POST http://127.0.0.1:8080/admin/dramas
BODY {"genre":"Urban Romance","description":"女仆与亿万富翁","freeEpisodes":4,"subtitle":"女仆与亿万富翁","sort":93,"isHot":false,"categoryId":1,"cover":"/files/drama_cover/202610/407513b839224e3fb7e87563c90fd93d.jpg","language":"id-ID","title":"Gadis Pembantu","unlockCoin":10}
Raw output:
{"code":0,"message":"ok","data":"2112300445958541313"}
Interpretation: Created drama 'Gadis Pembantu' with Chinese synopsis '女仆与亿万富翁'.
2026-10-20 05:50:45 - read drama 2112300445958541313 before episodes
Command:
GET http://127.0.0.1:8080/admin/dramas/2112300445958541313
Raw output:
{"code":0,"message":"ok","data":{"id":"2112300445958541313","code":"D20261020014","title":"Gadis Pembantu","subtitle":"女仆与亿万富翁","categoryId":"1","category":"都市情感","genre":"Urban Romance","description":"女仆与亿万富翁","cover":"/files/drama_cover/202610/407513b839224e3fb7e87563c90fd93d.jpg","trailerUrl":"","language":"id-ID","episodes":0,"freeEpisodes":4,"unlockCoin":10,"isHot":false,"status":"draft","statusText":"草稿","views":"0","sort":93,"publishAt":null,"createdAt":"2026-10-20 05:50:45","updatedAt":"2026-10-20 05:50:45"}}
Interpretation: Read drama metadata before creating or updating episodes.
2026-10-20 05:50:45 - list episodes drama 2112300445958541313
Command:
GET http://127.0.0.1:8080/admin/episodes?dramaId=2112300445958541313
Raw output:
{"code":0,"message":"ok","data":[]}
Interpretation: Loaded existing episodes for resume and duplicate prevention.
2026-10-20 05:50:45 - create episode 1 for Gadis Pembantu
Command:
POST http://127.0.0.1:8080/admin/episodes
BODY {"durationSec":0,"dramaId":"2112300445958541313","title":"Episode 1","sort":1,"videoUrl":"/files/episode/202610/cc27868b3a904e718bd13d9b4b1ac850.mp4","number":1,"unlockCoin":10,"isFree":true}
Raw output:
{"code":0,"message":"ok","data":"2112300446101147650"}
Interpretation: Created episode 1 for drama Gadis Pembantu.
2026-10-20 05:50:45 - create episode 2 for Gadis Pembantu
Command:
POST http://127.0.0.1:8080/admin/episodes
BODY {"durationSec":0,"dramaId":"2112300445958541313","title":"Episode 2","sort":2,"videoUrl":"/files/episode/202610/4e7090da673f4745a1ec22d9d154e748.mp4","number":2,"unlockCoin":10,"isFree":true}
Raw output:
{"code":0,"message":"ok","data":"2112300446164062209"}
Interpretation: Created episode 2 for drama Gadis Pembantu.
2026-10-20 05:50:45 - create episode 3 for Gadis Pembantu
Command:
POST http://127.0.0.1:8080/admin/episodes
BODY {"durationSec":0,"dramaId":"2112300445958541313","title":"Episode 3","sort":3,"videoUrl":"/files/episode/202610/1b8a5896dc3b4f8bb4f267ff9f3cbbbe.mp4","number":3,"unlockCoin":10,"isFree":true}
Raw output:
{"code":0,"message":"ok","data":"2112300446239559681"}
Interpretation: Created episode 3 for drama Gadis Pembantu.
2026-10-20 05:50:45 - create episode 4 for Gadis Pembantu
Command:
POST http://127.0.0.1:8080/admin/episodes
BODY {"durationSec":0,"dramaId":"2112300445958541313","title":"Episode 4","sort":4,"videoUrl":"/files/episode/202610/d4e12654f7e0413c9ddde013dd2668b3.mp4","number":4,"unlockCoin":10,"isFree":true}
Raw output:
{"code":0,"message":"ok","data":"2112300446319251457"}
Interpretation: Created episode 4 for drama Gadis Pembantu.
2026-10-20 05:50:45 - read drama 2112300445958541313 status
Command:
GET http://127.0.0.1:8080/admin/dramas/2112300445958541313
Raw output:
{"code":0,"message":"ok","data":{"id":"2112300445958541313","code":"D20261020014","title":"Gadis Pembantu","subtitle":"女仆与亿万富翁","categoryId":"1","category":"都市情感","genre":"Urban Romance","description":"女仆与亿万富翁","cover":"/files/drama_cover/202610/407513b839224e3fb7e87563c90fd93d.jpg","trailerUrl":"","language":"id-ID","episodes":4,"freeEpisodes":4,"unlockCoin":10,"isHot":false,"status":"draft","statusText":"草稿","views":"0","sort":93,"publishAt":null,"createdAt":"2026-10-20 05:50:45","updatedAt":"2026-10-20 05:50:45"}}
Interpretation: Read current drama status before review transitions.
2026-10-20 05:50:45 - submit drama 2112300445958541313
Command:
POST http://127.0.0.1:8080/admin/dramas/2112300445958541313/submit
Raw output:
{"code":0,"message":"ok","data":null}
Interpretation: Drama submitted for review.
2026-10-20 05:50:45 - approve drama 2112300445958541313
Command:
POST http://127.0.0.1:8080/admin/dramas/2112300445958541313/approve
Raw output:
{"code":0,"message":"ok","data":null}
Interpretation: Drama review approved.
2026-10-20 05:50:45 - publish drama 2112300445958541313
Command:
POST http://127.0.0.1:8080/admin/dramas/2112300445958541313/publish
Raw output:
{"code":0,"message":"ok","data":null}
Interpretation: Drama published; draft episodes are promoted to published.
2026-10-20 05:50:45 - init upload 竖版_9x16.jpg
Command:
POST http://127.0.0.1:8080/admin/media/upload/init
BODY {"fileSize":266726,"fileName":"竖版_9x16.jpg","bizType":"DRAMA_COVER","chunkSize":5242880}
Raw output:
{"code":0,"message":"ok","data":{"uploadId":"b2a7a9141dc447aeacbbbf3041219ea0","chunkSize":"5242880","totalChunks":1,"objectKey":"drama_cover/202610/9d67d294e430421db8e3f383b1086575.jpg"}}
Interpretation: Created upload session for DRAMA_COVER file 竖版_9x16.jpg.
2026-10-20 05:50:45 - upload chunk 1
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=b2a7a9141dc447aeacbbbf3041219ea0&index=0 (multipart file=chunk_0.bin, bytes=266726)
Raw output:
{"code":0,"message":"ok","data":0}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:45 - complete upload 竖版_9x16.jpg
Command:
POST http://127.0.0.1:8080/admin/media/upload/complete
BODY {"uploadId":"b2a7a9141dc447aeacbbbf3041219ea0","durationSec":0}
Raw output:
{"code":0,"message":"ok","data":{"id":"2112300446868705281","bizType":"DRAMA_COVER","fileName":"竖版_9x16.jpg","objectKey":"drama_cover/202610/9d67d294e430421db8e3f383b1086575.jpg","url":"/files/drama_cover/202610/9d67d294e430421db8e3f383b1086575.jpg","sizeBytes":"266726","md5":"afb6c75f87ef62d37addff6b930f5522","durationSec":0,"status":"ready","createdAt":"2026-10-20 05:50:45"}}
Interpretation: Merged uploaded chunks into media asset 竖版_9x16.jpg.
2026-10-20 05:50:45 - init upload 37.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/init
BODY {"fileSize":12203081,"fileName":"37.mp4","bizType":"EPISODE","chunkSize":5242880}
Raw output:
{"code":0,"message":"ok","data":{"uploadId":"1dbaf37976254b12b97da3ad08cb622b","chunkSize":"5242880","totalChunks":3,"objectKey":"episode/202610/a610e0394f684ce2b3c4d27d73c0b557.mp4"}}
Interpretation: Created upload session for EPISODE file 37.mp4.
2026-10-20 05:50:45 - upload chunk 1
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=1dbaf37976254b12b97da3ad08cb622b&index=0 (multipart file=chunk_0.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":0}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:46 - upload chunk 2
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=1dbaf37976254b12b97da3ad08cb622b&index=1 (multipart file=chunk_1.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":1}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:46 - upload chunk 3
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=1dbaf37976254b12b97da3ad08cb622b&index=2 (multipart file=chunk_2.bin, bytes=1717321)
Raw output:
{"code":0,"message":"ok","data":2}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:46 - complete upload 37.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/complete
BODY {"uploadId":"1dbaf37976254b12b97da3ad08cb622b","durationSec":0}
Raw output:
{"code":0,"message":"ok","data":{"id":"2112300450085736449","bizType":"EPISODE","fileName":"37.mp4","objectKey":"episode/202610/a610e0394f684ce2b3c4d27d73c0b557.mp4","url":"/files/episode/202610/a610e0394f684ce2b3c4d27d73c0b557.mp4","sizeBytes":"12203081","md5":"7d13d0b01555f248570ab567093ddba6","durationSec":0,"status":"transcoding","createdAt":"2026-10-20 05:50:46"}}
Interpretation: Merged uploaded chunks into media asset 37.mp4.
2026-10-20 05:50:46 - init upload 38.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/init
BODY {"fileSize":10696711,"fileName":"38.mp4","bizType":"EPISODE","chunkSize":5242880}
Raw output:
{"code":0,"message":"ok","data":{"uploadId":"a62627c3dece4479a1f624ff7e87a9d6","chunkSize":"5242880","totalChunks":3,"objectKey":"episode/202610/200c42041d2641e287f7d5e8d6a3fb02.mp4"}}
Interpretation: Created upload session for EPISODE file 38.mp4.
2026-10-20 05:50:46 - upload chunk 1
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=a62627c3dece4479a1f624ff7e87a9d6&index=0 (multipart file=chunk_0.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":0}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:46 - upload chunk 2
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=a62627c3dece4479a1f624ff7e87a9d6&index=1 (multipart file=chunk_1.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":1}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:46 - upload chunk 3
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=a62627c3dece4479a1f624ff7e87a9d6&index=2 (multipart file=chunk_2.bin, bytes=210951)
Raw output:
{"code":0,"message":"ok","data":2}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:47 - complete upload 38.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/complete
BODY {"uploadId":"a62627c3dece4479a1f624ff7e87a9d6","durationSec":0}
Raw output:
{"code":0,"message":"ok","data":{"id":"2112300453072080898","bizType":"EPISODE","fileName":"38.mp4","objectKey":"episode/202610/200c42041d2641e287f7d5e8d6a3fb02.mp4","url":"/files/episode/202610/200c42041d2641e287f7d5e8d6a3fb02.mp4","sizeBytes":"10696711","md5":"29c07a599604176a8afd45b35fa9ddc7","durationSec":0,"status":"transcoding","createdAt":"2026-10-20 05:50:46"}}
Interpretation: Merged uploaded chunks into media asset 38.mp4.
2026-10-20 05:50:47 - init upload 39.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/init
BODY {"fileSize":7961230,"fileName":"39.mp4","bizType":"EPISODE","chunkSize":5242880}
Raw output:
{"code":0,"message":"ok","data":{"uploadId":"d21a5495110547f99f92ca2d5449a3f6","chunkSize":"5242880","totalChunks":2,"objectKey":"episode/202610/e8370a9736284eeebf8d3221021f30dd.mp4"}}
Interpretation: Created upload session for EPISODE file 39.mp4.
2026-10-20 05:50:47 - upload chunk 1
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=d21a5495110547f99f92ca2d5449a3f6&index=0 (multipart file=chunk_0.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":0}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:47 - upload chunk 2
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=d21a5495110547f99f92ca2d5449a3f6&index=1 (multipart file=chunk_1.bin, bytes=2718350)
Raw output:
{"code":0,"message":"ok","data":1}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:47 - complete upload 39.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/complete
BODY {"uploadId":"d21a5495110547f99f92ca2d5449a3f6","durationSec":0}
Raw output:
{"code":0,"message":"ok","data":{"id":"2112300455404113921","bizType":"EPISODE","fileName":"39.mp4","objectKey":"episode/202610/e8370a9736284eeebf8d3221021f30dd.mp4","url":"/files/episode/202610/e8370a9736284eeebf8d3221021f30dd.mp4","sizeBytes":"7961230","md5":"c0e4c8f612913b465bdb4edee283fa79","durationSec":0,"status":"transcoding","createdAt":"2026-10-20 05:50:47"}}
Interpretation: Merged uploaded chunks into media asset 39.mp4.
2026-10-20 05:50:47 - init upload 40.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/init
BODY {"fileSize":9607564,"fileName":"40.mp4","bizType":"EPISODE","chunkSize":5242880}
Raw output:
{"code":0,"message":"ok","data":{"uploadId":"8196ba97f6064176869e09ebae64fd6a","chunkSize":"5242880","totalChunks":2,"objectKey":"episode/202610/817834e6f0f441afb8182377013b94e8.mp4"}}
Interpretation: Created upload session for EPISODE file 40.mp4.
2026-10-20 05:50:48 - upload chunk 1
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=8196ba97f6064176869e09ebae64fd6a&index=0 (multipart file=chunk_0.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":0}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:48 - upload chunk 2
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=8196ba97f6064176869e09ebae64fd6a&index=1 (multipart file=chunk_1.bin, bytes=4364684)
Raw output:
{"code":0,"message":"ok","data":1}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:48 - complete upload 40.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/complete
BODY {"uploadId":"8196ba97f6064176869e09ebae64fd6a","durationSec":0}
Raw output:
{"code":0,"message":"ok","data":{"id":"2112300457786478594","bizType":"EPISODE","fileName":"40.mp4","objectKey":"episode/202610/817834e6f0f441afb8182377013b94e8.mp4","url":"/files/episode/202610/817834e6f0f441afb8182377013b94e8.mp4","sizeBytes":"9607564","md5":"90b2782ec84663e6266d462ae5512bab","durationSec":0,"status":"transcoding","createdAt":"2026-10-20 05:50:48"}}
Interpretation: Merged uploaded chunks into media asset 40.mp4.
2026-10-20 05:50:48 - init upload 41.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/init
BODY {"fileSize":15251109,"fileName":"41.mp4","bizType":"EPISODE","chunkSize":5242880}
Raw output:
{"code":0,"message":"ok","data":{"uploadId":"cdd47b6f15d34b3d89a8442ada009896","chunkSize":"5242880","totalChunks":3,"objectKey":"episode/202610/a5498325873145e887894a927dfbfb1d.mp4"}}
Interpretation: Created upload session for EPISODE file 41.mp4.
2026-10-20 05:50:48 - upload chunk 1
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=cdd47b6f15d34b3d89a8442ada009896&index=0 (multipart file=chunk_0.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":0}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:48 - upload chunk 2
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=cdd47b6f15d34b3d89a8442ada009896&index=1 (multipart file=chunk_1.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":1}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:48 - upload chunk 3
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=cdd47b6f15d34b3d89a8442ada009896&index=2 (multipart file=chunk_2.bin, bytes=4765349)
Raw output:
{"code":0,"message":"ok","data":2}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:48 - complete upload 41.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/complete
BODY {"uploadId":"cdd47b6f15d34b3d89a8442ada009896","durationSec":0}
Raw output:
{"code":0,"message":"ok","data":{"id":"2112300459971710977","bizType":"EPISODE","fileName":"41.mp4","objectKey":"episode/202610/a5498325873145e887894a927dfbfb1d.mp4","url":"/files/episode/202610/a5498325873145e887894a927dfbfb1d.mp4","sizeBytes":"15251109","md5":"9f9883b25b1c4ea46cc60a511f7b99be","durationSec":0,"status":"transcoding","createdAt":"2026-10-20 05:50:48"}}
Interpretation: Merged uploaded chunks into media asset 41.mp4.
2026-10-20 05:50:48 - create drama Kembar Rahasia
Command:
POST http://127.0.0.1:8080/admin/dramas
BODY {"genre":"Revenge Suspense","description":"秘密双胞胎","freeEpisodes":5,"subtitle":"秘密双胞胎","sort":92,"isHot":false,"categoryId":4,"cover":"/files/drama_cover/202610/9d67d294e430421db8e3f383b1086575.jpg","language":"id-ID","title":"Kembar Rahasia","unlockCoin":10}
Raw output:
{"code":0,"message":"ok","data":"2112300460047208449"}
Interpretation: Created drama 'Kembar Rahasia' with Chinese synopsis '秘密双胞胎'.
2026-10-20 05:50:48 - read drama 2112300460047208449 before episodes
Command:
GET http://127.0.0.1:8080/admin/dramas/2112300460047208449
Raw output:
{"code":0,"message":"ok","data":{"id":"2112300460047208449","code":"D20261020015","title":"Kembar Rahasia","subtitle":"秘密双胞胎","categoryId":"4","category":"悬疑复仇","genre":"Revenge Suspense","description":"秘密双胞胎","cover":"/files/drama_cover/202610/9d67d294e430421db8e3f383b1086575.jpg","trailerUrl":"","language":"id-ID","episodes":0,"freeEpisodes":5,"unlockCoin":10,"isHot":false,"status":"draft","statusText":"草稿","views":"0","sort":92,"publishAt":null,"createdAt":"2026-10-20 05:50:48","updatedAt":"2026-10-20 05:50:48"}}
Interpretation: Read drama metadata before creating or updating episodes.
2026-10-20 05:50:48 - list episodes drama 2112300460047208449
Command:
GET http://127.0.0.1:8080/admin/episodes?dramaId=2112300460047208449
Raw output:
{"code":0,"message":"ok","data":[]}
Interpretation: Loaded existing episodes for resume and duplicate prevention.
2026-10-20 05:50:48 - create episode 1 for Kembar Rahasia
Command:
POST http://127.0.0.1:8080/admin/episodes
BODY {"durationSec":0,"dramaId":"2112300460047208449","title":"Episode 1","sort":1,"videoUrl":"/files/episode/202610/a610e0394f684ce2b3c4d27d73c0b557.mp4","number":1,"unlockCoin":10,"isFree":true}
Raw output:
{"code":0,"message":"ok","data":"2112300460118511618"}
Interpretation: Created episode 1 for drama Kembar Rahasia.
2026-10-20 05:50:49 - create episode 2 for Kembar Rahasia
Command:
POST http://127.0.0.1:8080/admin/episodes
BODY {"durationSec":0,"dramaId":"2112300460047208449","title":"Episode 2","sort":2,"videoUrl":"/files/episode/202610/200c42041d2641e287f7d5e8d6a3fb02.mp4","number":2,"unlockCoin":10,"isFree":true}
Raw output:
{"code":0,"message":"ok","data":"2112300460156260353"}
Interpretation: Created episode 2 for drama Kembar Rahasia.
2026-10-20 05:50:49 - create episode 3 for Kembar Rahasia
Command:
POST http://127.0.0.1:8080/admin/episodes
BODY {"durationSec":0,"dramaId":"2112300460047208449","title":"Episode 3","sort":3,"videoUrl":"/files/episode/202610/e8370a9736284eeebf8d3221021f30dd.mp4","number":3,"unlockCoin":10,"isFree":true}
Raw output:
{"code":0,"message":"ok","data":"2112300460189814786"}
Interpretation: Created episode 3 for drama Kembar Rahasia.
2026-10-20 05:50:49 - create episode 4 for Kembar Rahasia
Command:
POST http://127.0.0.1:8080/admin/episodes
BODY {"durationSec":0,"dramaId":"2112300460047208449","title":"Episode 4","sort":4,"videoUrl":"/files/episode/202610/817834e6f0f441afb8182377013b94e8.mp4","number":4,"unlockCoin":10,"isFree":true}
Raw output:
{"code":0,"message":"ok","data":"2112300460223369217"}
Interpretation: Created episode 4 for drama Kembar Rahasia.
2026-10-20 05:50:49 - create episode 5 for Kembar Rahasia
Command:
POST http://127.0.0.1:8080/admin/episodes
BODY {"durationSec":0,"dramaId":"2112300460047208449","title":"Episode 5","sort":5,"videoUrl":"/files/episode/202610/a5498325873145e887894a927dfbfb1d.mp4","number":5,"unlockCoin":10,"isFree":true}
Raw output:
{"code":0,"message":"ok","data":"2112300460261117954"}
Interpretation: Created episode 5 for drama Kembar Rahasia.
2026-10-20 05:50:49 - read drama 2112300460047208449 status
Command:
GET http://127.0.0.1:8080/admin/dramas/2112300460047208449
Raw output:
{"code":0,"message":"ok","data":{"id":"2112300460047208449","code":"D20261020015","title":"Kembar Rahasia","subtitle":"秘密双胞胎","categoryId":"4","category":"悬疑复仇","genre":"Revenge Suspense","description":"秘密双胞胎","cover":"/files/drama_cover/202610/9d67d294e430421db8e3f383b1086575.jpg","trailerUrl":"","language":"id-ID","episodes":5,"freeEpisodes":5,"unlockCoin":10,"isHot":false,"status":"draft","statusText":"草稿","views":"0","sort":92,"publishAt":null,"createdAt":"2026-10-20 05:50:48","updatedAt":"2026-10-20 05:50:49"}}
Interpretation: Read current drama status before review transitions.
2026-10-20 05:50:49 - submit drama 2112300460047208449
Command:
POST http://127.0.0.1:8080/admin/dramas/2112300460047208449/submit
Raw output:
{"code":0,"message":"ok","data":null}
Interpretation: Drama submitted for review.
2026-10-20 05:50:49 - approve drama 2112300460047208449
Command:
POST http://127.0.0.1:8080/admin/dramas/2112300460047208449/approve
Raw output:
{"code":0,"message":"ok","data":null}
Interpretation: Drama review approved.
2026-10-20 05:50:49 - publish drama 2112300460047208449
Command:
POST http://127.0.0.1:8080/admin/dramas/2112300460047208449/publish
Raw output:
{"code":0,"message":"ok","data":null}
Interpretation: Drama published; draft episodes are promoted to published.
2026-10-20 05:50:49 - init upload 竖版_9x16.jpg
Command:
POST http://127.0.0.1:8080/admin/media/upload/init
BODY {"fileSize":226680,"fileName":"竖版_9x16.jpg","bizType":"DRAMA_COVER","chunkSize":5242880}
Raw output:
{"code":0,"message":"ok","data":{"uploadId":"882e84de62424ecf8717e303b8433aa2","chunkSize":"5242880","totalChunks":1,"objectKey":"drama_cover/202610/d78b16ea924a4408a4f4d11e65d7b6e0.jpg"}}
Interpretation: Created upload session for DRAMA_COVER file 竖版_9x16.jpg.
2026-10-20 05:50:49 - upload chunk 1
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=882e84de62424ecf8717e303b8433aa2&index=0 (multipart file=chunk_0.bin, bytes=226680)
Raw output:
{"code":0,"message":"ok","data":0}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:49 - complete upload 竖版_9x16.jpg
Command:
POST http://127.0.0.1:8080/admin/media/upload/complete
BODY {"uploadId":"882e84de62424ecf8717e303b8433aa2","durationSec":0}
Raw output:
{"code":0,"message":"ok","data":{"id":"2112300460533747713","bizType":"DRAMA_COVER","fileName":"竖版_9x16.jpg","objectKey":"drama_cover/202610/d78b16ea924a4408a4f4d11e65d7b6e0.jpg","url":"/files/drama_cover/202610/d78b16ea924a4408a4f4d11e65d7b6e0.jpg","sizeBytes":"226680","md5":"ec14161918dc860fb947fb3ccc65afc2","durationSec":0,"status":"ready","createdAt":"2026-10-20 05:50:49"}}
Interpretation: Merged uploaded chunks into media asset 竖版_9x16.jpg.
2026-10-20 05:50:49 - init upload 42.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/init
BODY {"fileSize":12470999,"fileName":"42.mp4","bizType":"EPISODE","chunkSize":5242880}
Raw output:
{"code":0,"message":"ok","data":{"uploadId":"ccd368980b2343a7bb20a100bf115b33","chunkSize":"5242880","totalChunks":3,"objectKey":"episode/202610/8c22e4ad16e54b529d7fc60bc0963142.mp4"}}
Interpretation: Created upload session for EPISODE file 42.mp4.
2026-10-20 05:50:49 - upload chunk 1
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=ccd368980b2343a7bb20a100bf115b33&index=0 (multipart file=chunk_0.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":0}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:49 - upload chunk 2
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=ccd368980b2343a7bb20a100bf115b33&index=1 (multipart file=chunk_1.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":1}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:49 - upload chunk 3
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=ccd368980b2343a7bb20a100bf115b33&index=2 (multipart file=chunk_2.bin, bytes=1985239)
Raw output:
{"code":0,"message":"ok","data":2}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:49 - complete upload 42.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/complete
BODY {"uploadId":"ccd368980b2343a7bb20a100bf115b33","durationSec":0}
Raw output:
{"code":0,"message":"ok","data":{"id":"2112300462115000321","bizType":"EPISODE","fileName":"42.mp4","objectKey":"episode/202610/8c22e4ad16e54b529d7fc60bc0963142.mp4","url":"/files/episode/202610/8c22e4ad16e54b529d7fc60bc0963142.mp4","sizeBytes":"12470999","md5":"d36b8e9b36fc1e4b7d47ef52d87c238b","durationSec":0,"status":"transcoding","createdAt":"2026-10-20 05:50:49"}}
Interpretation: Merged uploaded chunks into media asset 42.mp4.
2026-10-20 05:50:49 - init upload 43.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/init
BODY {"fileSize":9233746,"fileName":"43.mp4","bizType":"EPISODE","chunkSize":5242880}
Raw output:
{"code":0,"message":"ok","data":{"uploadId":"521978ccacb2472eada8608b1442231b","chunkSize":"5242880","totalChunks":2,"objectKey":"episode/202610/a8d528bd739f42f1b6b2ad67cdf4a629.mp4"}}
Interpretation: Created upload session for EPISODE file 43.mp4.
2026-10-20 05:50:49 - upload chunk 1
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=521978ccacb2472eada8608b1442231b&index=0 (multipart file=chunk_0.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":0}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:49 - upload chunk 2
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=521978ccacb2472eada8608b1442231b&index=1 (multipart file=chunk_1.bin, bytes=3990866)
Raw output:
{"code":0,"message":"ok","data":1}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:49 - complete upload 43.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/complete
BODY {"uploadId":"521978ccacb2472eada8608b1442231b","durationSec":0}
Raw output:
{"code":0,"message":"ok","data":{"id":"2112300463281016834","bizType":"EPISODE","fileName":"43.mp4","objectKey":"episode/202610/a8d528bd739f42f1b6b2ad67cdf4a629.mp4","url":"/files/episode/202610/a8d528bd739f42f1b6b2ad67cdf4a629.mp4","sizeBytes":"9233746","md5":"9a268fc42e17ad47aaff973911960164","durationSec":0,"status":"transcoding","createdAt":"2026-10-20 05:50:49"}}
Interpretation: Merged uploaded chunks into media asset 43.mp4.
2026-10-20 05:50:49 - init upload 44.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/init
BODY {"fileSize":10147851,"fileName":"44.mp4","bizType":"EPISODE","chunkSize":5242880}
Raw output:
{"code":0,"message":"ok","data":{"uploadId":"20b97d3259c0482f867848964f1873e2","chunkSize":"5242880","totalChunks":2,"objectKey":"episode/202610/3d021ab796bb4c3b81c142f89b530879.mp4"}}
Interpretation: Created upload session for EPISODE file 44.mp4.
2026-10-20 05:50:49 - upload chunk 1
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=20b97d3259c0482f867848964f1873e2&index=0 (multipart file=chunk_0.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":0}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:49 - upload chunk 2
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=20b97d3259c0482f867848964f1873e2&index=1 (multipart file=chunk_1.bin, bytes=4904971)
Raw output:
{"code":0,"message":"ok","data":1}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:50 - complete upload 44.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/complete
BODY {"uploadId":"20b97d3259c0482f867848964f1873e2","durationSec":0}
Raw output:
{"code":0,"message":"ok","data":{"id":"2112300464522530817","bizType":"EPISODE","fileName":"44.mp4","objectKey":"episode/202610/3d021ab796bb4c3b81c142f89b530879.mp4","url":"/files/episode/202610/3d021ab796bb4c3b81c142f89b530879.mp4","sizeBytes":"10147851","md5":"277068eced16810ad5c46351b7570a04","durationSec":0,"status":"transcoding","createdAt":"2026-10-20 05:50:49"}}
Interpretation: Merged uploaded chunks into media asset 44.mp4.
2026-10-20 05:50:50 - init upload 45.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/init
BODY {"fileSize":13368362,"fileName":"45.mp4","bizType":"EPISODE","chunkSize":5242880}
Raw output:
{"code":0,"message":"ok","data":{"uploadId":"0dd7ff60b6c141f2ab437ca97096d44e","chunkSize":"5242880","totalChunks":3,"objectKey":"episode/202610/ae40ffe561ab445289739fdde092f7c1.mp4"}}
Interpretation: Created upload session for EPISODE file 45.mp4.
2026-10-20 05:50:50 - upload chunk 1
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=0dd7ff60b6c141f2ab437ca97096d44e&index=0 (multipart file=chunk_0.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":0}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:50 - upload chunk 2
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=0dd7ff60b6c141f2ab437ca97096d44e&index=1 (multipart file=chunk_1.bin, bytes=5242880)
Raw output:
{"code":0,"message":"ok","data":1}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:50 - upload chunk 3
Command:
POST http://127.0.0.1:8080/admin/media/upload/chunk?uploadId=0dd7ff60b6c141f2ab437ca97096d44e&index=2 (multipart file=chunk_2.bin, bytes=2882602)
Raw output:
{"code":0,"message":"ok","data":2}
Interpretation: Chunk accepted by the upload session.
2026-10-20 05:50:50 - complete upload 45.mp4
Command:
POST http://127.0.0.1:8080/admin/media/upload/complete
BODY {"uploadId":"0dd7ff60b6c141f2ab437ca97096d44e","durationSec":0}
Raw output:
{"code":0,"message":"ok","data":{"id":"2112300466141532161","bizType":"EPISODE","fileName":"45.mp4","objectKey":"episode/202610/ae40ffe561ab445289739fdde092f7c1.mp4","url":"/files/episode/202610/ae40ffe561ab445289739fdde092f7c1.mp4","sizeBytes":"13368362","md5":"d07b05508a12bf83baf6a541d8591b9b","durationSec":0,"status":"transcoding","createdAt":"2026-10-20 05:50:50"}}
Interpretation: Merged uploaded chunks into media asset 45.mp4.
2026-10-20 05:50:50 - create drama Pengawal Cintaku
Command:
POST http://127.0.0.1:8080/admin/dramas
BODY {"genre":"Sweet Romance","description":"我的保镖恋人","freeEpisodes":4,"subtitle":"我的保镖恋人","sort":91,"isHot":false,"categoryId":3,"cover":"/files/drama_cover/202610/d78b16ea924a4408a4f4d11e65d7b6e0.jpg","language":"id-ID","title":"Pengawal Cintaku","unlockCoin":10}
Raw output:
{"code":0,"message":"ok","data":"2112300466212835330"}
Interpretation: Created drama 'Pengawal Cintaku' with Chinese synopsis '我的保镖恋人'.
2026-10-20 05:50:50 - read drama 2112300466212835330 before episodes
Command:
GET http://127.0.0.1:8080/admin/dramas/2112300466212835330
Raw output:
{"code":0,"message":"ok","data":{"id":"2112300466212835330","code":"D20261020016","title":"Pengawal Cintaku","subtitle":"我的保镖恋人","categoryId":"3","category":"甜宠爱情","genre":"Sweet Romance","description":"我的保镖恋人","cover":"/files/drama_cover/202610/d78b16ea924a4408a4f4d11e65d7b6e0.jpg","trailerUrl":"","language":"id-ID","episodes":0,"freeEpisodes":4,"unlockCoin":10,"isHot":false,"status":"draft","statusText":"草稿","views":"0","sort":91,"publishAt":null,"createdAt":"2026-10-20 05:50:50","updatedAt":"2026-10-20 05:50:50"}}
Interpretation: Read drama metadata before creating or updating episodes.
2026-10-20 05:50:50 - list episodes drama 2112300466212835330
Command:
GET http://127.0.0.1:8080/admin/episodes?dramaId=2112300466212835330
Raw output:
{"code":0,"message":"ok","data":[]}
Interpretation: Loaded existing episodes for resume and duplicate prevention.
2026-10-20 05:50:50 - create episode 1 for Pengawal Cintaku
Command:
POST http://127.0.0.1:8080/admin/episodes
BODY {"durationSec":0,"dramaId":"2112300466212835330","title":"Episode 1","sort":1,"videoUrl":"/files/episode/202610/8c22e4ad16e54b529d7fc60bc0963142.mp4","number":1,"unlockCoin":10,"isFree":true}
Raw output:
{"code":0,"message":"ok","data":"2112300466275749890"}
Interpretation: Created episode 1 for drama Pengawal Cintaku.
2026-10-20 05:50:50 - create episode 2 for Pengawal Cintaku
Command:
POST http://127.0.0.1:8080/admin/episodes
BODY {"durationSec":0,"dramaId":"2112300466212835330","title":"Episode 2","sort":2,"videoUrl":"/files/episode/202610/a8d528bd739f42f1b6b2ad67cdf4a629.mp4","number":2,"unlockCoin":10,"isFree":true}
Raw output:
{"code":0,"message":"ok","data":"2112300466317692930"}
Interpretation: Created episode 2 for drama Pengawal Cintaku.
2026-10-20 05:50:50 - create episode 3 for Pengawal Cintaku
Command:
POST http://127.0.0.1:8080/admin/episodes
BODY {"durationSec":0,"dramaId":"2112300466212835330","title":"Episode 3","sort":3,"videoUrl":"/files/episode/202610/3d021ab796bb4c3b81c142f89b530879.mp4","number":3,"unlockCoin":10,"isFree":true}
Raw output:
{"code":0,"message":"ok","data":"2112300466355441666"}
Interpretation: Created episode 3 for drama Pengawal Cintaku.
2026-10-20 05:50:50 - create episode 4 for Pengawal Cintaku
Command:
POST http://127.0.0.1:8080/admin/episodes
BODY {"durationSec":0,"dramaId":"2112300466212835330","title":"Episode 4","sort":4,"videoUrl":"/files/episode/202610/ae40ffe561ab445289739fdde092f7c1.mp4","number":4,"unlockCoin":10,"isFree":true}
Raw output:
{"code":0,"message":"ok","data":"2112300466443522050"}
Interpretation: Created episode 4 for drama Pengawal Cintaku.
2026-10-20 05:50:50 - read drama 2112300466212835330 status
Command:
GET http://127.0.0.1:8080/admin/dramas/2112300466212835330
Raw output:
{"code":0,"message":"ok","data":{"id":"2112300466212835330","code":"D20261020016","title":"Pengawal Cintaku","subtitle":"我的保镖恋人","categoryId":"3","category":"甜宠爱情","genre":"Sweet Romance","description":"我的保镖恋人","cover":"/files/drama_cover/202610/d78b16ea924a4408a4f4d11e65d7b6e0.jpg","trailerUrl":"","language":"id-ID","episodes":4,"freeEpisodes":4,"unlockCoin":10,"isHot":false,"status":"draft","statusText":"草稿","views":"0","sort":91,"publishAt":null,"createdAt":"2026-10-20 05:50:50","updatedAt":"2026-10-20 05:50:50"}}
Interpretation: Read current drama status before review transitions.
2026-10-20 05:50:50 - submit drama 2112300466212835330
Command:
POST http://127.0.0.1:8080/admin/dramas/2112300466212835330/submit
Raw output:
{"code":0,"message":"ok","data":null}
Interpretation: Drama submitted for review.
2026-10-20 05:50:50 - approve drama 2112300466212835330
Command:
POST http://127.0.0.1:8080/admin/dramas/2112300466212835330/approve
Raw output:
{"code":0,"message":"ok","data":null}
Interpretation: Drama review approved.
2026-10-20 05:50:50 - publish drama 2112300466212835330
Command:
POST http://127.0.0.1:8080/admin/dramas/2112300466212835330/publish
Raw output:
{"code":0,"message":"ok","data":null}
Interpretation: Drama published; draft episodes are promoted to published.
2026-10-20 05:50:50 - transcode status snapshot
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 QUEUED 0
2112300337875521538 QUEUED 0
2112300339666489345 QUEUED 0
2112300341780418561 QUEUED 0
2112300344913563649 QUEUED 0
2112300346582896641 QUEUED 0
2112300348638105601 QUEUED 0
2112300351330848770 QUEUED 0
2112300354833092609 QUEUED 0
2112300358012375042 QUEUED 0
2112300360847724546 QUEUED 0
2112300367785103361 QUEUED 0
2112300370070999042 QUEUED 0
2112300373816512514 QUEUED 0
2112300378312806402 QUEUED 0
2112300382242869249 QUEUED 0
2112300386147766274 QUEUED 0
2112300390572756993 QUEUED 0
2112300394305687554 QUEUED 0
2112300397086511105 QUEUED 0
2112300399489847297 QUEUED 0
2112300402195173378 QUEUED 0
2112300406142013441 QUEUED 0
2112300410453757954 QUEUED 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Read transcode_task status for all uploaded videos.
2026-10-20 05:50:50 - wait for transcode
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 QUEUED 0
2112300337875521538 QUEUED 0
2112300339666489345 QUEUED 0
2112300341780418561 QUEUED 0
2112300344913563649 QUEUED 0
2112300346582896641 QUEUED 0
2112300348638105601 QUEUED 0
2112300351330848770 QUEUED 0
2112300354833092609 QUEUED 0
2112300358012375042 QUEUED 0
2112300360847724546 QUEUED 0
2112300367785103361 QUEUED 0
2112300370070999042 QUEUED 0
2112300373816512514 QUEUED 0
2112300378312806402 QUEUED 0
2112300382242869249 QUEUED 0
2112300386147766274 QUEUED 0
2112300390572756993 QUEUED 0
2112300394305687554 QUEUED 0
2112300397086511105 QUEUED 0
2112300399489847297 QUEUED 0
2112300402195173378 QUEUED 0
2112300406142013441 QUEUED 0
2112300410453757954 QUEUED 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Transcode progress: 1/45 success, 0 running, 44 queued, 0 failed, 0 missing task rows.
2026-10-20 05:51:00 - transcode status snapshot
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 RUNNING 0
2112300337875521538 QUEUED 0
2112300339666489345 QUEUED 0
2112300341780418561 QUEUED 0
2112300344913563649 QUEUED 0
2112300346582896641 QUEUED 0
2112300348638105601 QUEUED 0
2112300351330848770 QUEUED 0
2112300354833092609 QUEUED 0
2112300358012375042 QUEUED 0
2112300360847724546 QUEUED 0
2112300367785103361 QUEUED 0
2112300370070999042 QUEUED 0
2112300373816512514 QUEUED 0
2112300378312806402 QUEUED 0
2112300382242869249 QUEUED 0
2112300386147766274 QUEUED 0
2112300390572756993 QUEUED 0
2112300394305687554 QUEUED 0
2112300397086511105 QUEUED 0
2112300399489847297 QUEUED 0
2112300402195173378 QUEUED 0
2112300406142013441 QUEUED 0
2112300410453757954 QUEUED 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Read transcode_task status for all uploaded videos.
2026-10-20 05:51:00 - wait for transcode
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 RUNNING 0
2112300337875521538 QUEUED 0
2112300339666489345 QUEUED 0
2112300341780418561 QUEUED 0
2112300344913563649 QUEUED 0
2112300346582896641 QUEUED 0
2112300348638105601 QUEUED 0
2112300351330848770 QUEUED 0
2112300354833092609 QUEUED 0
2112300358012375042 QUEUED 0
2112300360847724546 QUEUED 0
2112300367785103361 QUEUED 0
2112300370070999042 QUEUED 0
2112300373816512514 QUEUED 0
2112300378312806402 QUEUED 0
2112300382242869249 QUEUED 0
2112300386147766274 QUEUED 0
2112300390572756993 QUEUED 0
2112300394305687554 QUEUED 0
2112300397086511105 QUEUED 0
2112300399489847297 QUEUED 0
2112300402195173378 QUEUED 0
2112300406142013441 QUEUED 0
2112300410453757954 QUEUED 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Transcode progress: 1/45 success, 1 running, 43 queued, 0 failed, 0 missing task rows.
2026-10-20 05:51:10 - transcode status snapshot
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 RUNNING 0
2112300337875521538 QUEUED 0
2112300339666489345 QUEUED 0
2112300341780418561 QUEUED 0
2112300344913563649 QUEUED 0
2112300346582896641 QUEUED 0
2112300348638105601 QUEUED 0
2112300351330848770 QUEUED 0
2112300354833092609 QUEUED 0
2112300358012375042 QUEUED 0
2112300360847724546 QUEUED 0
2112300367785103361 QUEUED 0
2112300370070999042 QUEUED 0
2112300373816512514 QUEUED 0
2112300378312806402 QUEUED 0
2112300382242869249 QUEUED 0
2112300386147766274 QUEUED 0
2112300390572756993 QUEUED 0
2112300394305687554 QUEUED 0
2112300397086511105 QUEUED 0
2112300399489847297 QUEUED 0
2112300402195173378 QUEUED 0
2112300406142013441 QUEUED 0
2112300410453757954 QUEUED 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Read transcode_task status for all uploaded videos.
2026-10-20 05:51:21 - transcode status snapshot
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 RUNNING 0
2112300339666489345 QUEUED 0
2112300341780418561 QUEUED 0
2112300344913563649 QUEUED 0
2112300346582896641 QUEUED 0
2112300348638105601 QUEUED 0
2112300351330848770 QUEUED 0
2112300354833092609 QUEUED 0
2112300358012375042 QUEUED 0
2112300360847724546 QUEUED 0
2112300367785103361 QUEUED 0
2112300370070999042 QUEUED 0
2112300373816512514 QUEUED 0
2112300378312806402 QUEUED 0
2112300382242869249 QUEUED 0
2112300386147766274 QUEUED 0
2112300390572756993 QUEUED 0
2112300394305687554 QUEUED 0
2112300397086511105 QUEUED 0
2112300399489847297 QUEUED 0
2112300402195173378 QUEUED 0
2112300406142013441 QUEUED 0
2112300410453757954 QUEUED 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Read transcode_task status for all uploaded videos.
2026-10-20 05:51:21 - wait for transcode
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 RUNNING 0
2112300339666489345 QUEUED 0
2112300341780418561 QUEUED 0
2112300344913563649 QUEUED 0
2112300346582896641 QUEUED 0
2112300348638105601 QUEUED 0
2112300351330848770 QUEUED 0
2112300354833092609 QUEUED 0
2112300358012375042 QUEUED 0
2112300360847724546 QUEUED 0
2112300367785103361 QUEUED 0
2112300370070999042 QUEUED 0
2112300373816512514 QUEUED 0
2112300378312806402 QUEUED 0
2112300382242869249 QUEUED 0
2112300386147766274 QUEUED 0
2112300390572756993 QUEUED 0
2112300394305687554 QUEUED 0
2112300397086511105 QUEUED 0
2112300399489847297 QUEUED 0
2112300402195173378 QUEUED 0
2112300406142013441 QUEUED 0
2112300410453757954 QUEUED 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Transcode progress: 2/45 success, 1 running, 42 queued, 0 failed, 0 missing task rows.
2026-10-20 05:51:31 - transcode status snapshot
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 QUEUED 0
2112300341780418561 QUEUED 0
2112300344913563649 QUEUED 0
2112300346582896641 QUEUED 0
2112300348638105601 QUEUED 0
2112300351330848770 QUEUED 0
2112300354833092609 QUEUED 0
2112300358012375042 QUEUED 0
2112300360847724546 QUEUED 0
2112300367785103361 QUEUED 0
2112300370070999042 QUEUED 0
2112300373816512514 QUEUED 0
2112300378312806402 QUEUED 0
2112300382242869249 QUEUED 0
2112300386147766274 QUEUED 0
2112300390572756993 QUEUED 0
2112300394305687554 QUEUED 0
2112300397086511105 QUEUED 0
2112300399489847297 QUEUED 0
2112300402195173378 QUEUED 0
2112300406142013441 QUEUED 0
2112300410453757954 QUEUED 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Read transcode_task status for all uploaded videos.
2026-10-20 05:51:31 - wait for transcode
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 QUEUED 0
2112300341780418561 QUEUED 0
2112300344913563649 QUEUED 0
2112300346582896641 QUEUED 0
2112300348638105601 QUEUED 0
2112300351330848770 QUEUED 0
2112300354833092609 QUEUED 0
2112300358012375042 QUEUED 0
2112300360847724546 QUEUED 0
2112300367785103361 QUEUED 0
2112300370070999042 QUEUED 0
2112300373816512514 QUEUED 0
2112300378312806402 QUEUED 0
2112300382242869249 QUEUED 0
2112300386147766274 QUEUED 0
2112300390572756993 QUEUED 0
2112300394305687554 QUEUED 0
2112300397086511105 QUEUED 0
2112300399489847297 QUEUED 0
2112300402195173378 QUEUED 0
2112300406142013441 QUEUED 0
2112300410453757954 QUEUED 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Transcode progress: 3/45 success, 0 running, 42 queued, 0 failed, 0 missing task rows.
2026-10-20 05:51:41 - transcode status snapshot
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 RUNNING 0
2112300341780418561 QUEUED 0
2112300344913563649 QUEUED 0
2112300346582896641 QUEUED 0
2112300348638105601 QUEUED 0
2112300351330848770 QUEUED 0
2112300354833092609 QUEUED 0
2112300358012375042 QUEUED 0
2112300360847724546 QUEUED 0
2112300367785103361 QUEUED 0
2112300370070999042 QUEUED 0
2112300373816512514 QUEUED 0
2112300378312806402 QUEUED 0
2112300382242869249 QUEUED 0
2112300386147766274 QUEUED 0
2112300390572756993 QUEUED 0
2112300394305687554 QUEUED 0
2112300397086511105 QUEUED 0
2112300399489847297 QUEUED 0
2112300402195173378 QUEUED 0
2112300406142013441 QUEUED 0
2112300410453757954 QUEUED 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Read transcode_task status for all uploaded videos.
2026-10-20 05:51:41 - wait for transcode
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 RUNNING 0
2112300341780418561 QUEUED 0
2112300344913563649 QUEUED 0
2112300346582896641 QUEUED 0
2112300348638105601 QUEUED 0
2112300351330848770 QUEUED 0
2112300354833092609 QUEUED 0
2112300358012375042 QUEUED 0
2112300360847724546 QUEUED 0
2112300367785103361 QUEUED 0
2112300370070999042 QUEUED 0
2112300373816512514 QUEUED 0
2112300378312806402 QUEUED 0
2112300382242869249 QUEUED 0
2112300386147766274 QUEUED 0
2112300390572756993 QUEUED 0
2112300394305687554 QUEUED 0
2112300397086511105 QUEUED 0
2112300399489847297 QUEUED 0
2112300402195173378 QUEUED 0
2112300406142013441 QUEUED 0
2112300410453757954 QUEUED 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Transcode progress: 3/45 success, 1 running, 41 queued, 0 failed, 0 missing task rows.
2026-10-20 05:51:51 - transcode status snapshot
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 QUEUED 0
2112300344913563649 QUEUED 0
2112300346582896641 QUEUED 0
2112300348638105601 QUEUED 0
2112300351330848770 QUEUED 0
2112300354833092609 QUEUED 0
2112300358012375042 QUEUED 0
2112300360847724546 QUEUED 0
2112300367785103361 QUEUED 0
2112300370070999042 QUEUED 0
2112300373816512514 QUEUED 0
2112300378312806402 QUEUED 0
2112300382242869249 QUEUED 0
2112300386147766274 QUEUED 0
2112300390572756993 QUEUED 0
2112300394305687554 QUEUED 0
2112300397086511105 QUEUED 0
2112300399489847297 QUEUED 0
2112300402195173378 QUEUED 0
2112300406142013441 QUEUED 0
2112300410453757954 QUEUED 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Read transcode_task status for all uploaded videos.
2026-10-20 05:51:51 - wait for transcode
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 QUEUED 0
2112300344913563649 QUEUED 0
2112300346582896641 QUEUED 0
2112300348638105601 QUEUED 0
2112300351330848770 QUEUED 0
2112300354833092609 QUEUED 0
2112300358012375042 QUEUED 0
2112300360847724546 QUEUED 0
2112300367785103361 QUEUED 0
2112300370070999042 QUEUED 0
2112300373816512514 QUEUED 0
2112300378312806402 QUEUED 0
2112300382242869249 QUEUED 0
2112300386147766274 QUEUED 0
2112300390572756993 QUEUED 0
2112300394305687554 QUEUED 0
2112300397086511105 QUEUED 0
2112300399489847297 QUEUED 0
2112300402195173378 QUEUED 0
2112300406142013441 QUEUED 0
2112300410453757954 QUEUED 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Transcode progress: 4/45 success, 0 running, 41 queued, 0 failed, 0 missing task rows.
2026-10-20 05:52:01 - transcode status snapshot
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 RUNNING 0
2112300344913563649 QUEUED 0
2112300346582896641 QUEUED 0
2112300348638105601 QUEUED 0
2112300351330848770 QUEUED 0
2112300354833092609 QUEUED 0
2112300358012375042 QUEUED 0
2112300360847724546 QUEUED 0
2112300367785103361 QUEUED 0
2112300370070999042 QUEUED 0
2112300373816512514 QUEUED 0
2112300378312806402 QUEUED 0
2112300382242869249 QUEUED 0
2112300386147766274 QUEUED 0
2112300390572756993 QUEUED 0
2112300394305687554 QUEUED 0
2112300397086511105 QUEUED 0
2112300399489847297 QUEUED 0
2112300402195173378 QUEUED 0
2112300406142013441 QUEUED 0
2112300410453757954 QUEUED 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Read transcode_task status for all uploaded videos.
2026-10-20 05:52:01 - wait for transcode
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 RUNNING 0
2112300344913563649 QUEUED 0
2112300346582896641 QUEUED 0
2112300348638105601 QUEUED 0
2112300351330848770 QUEUED 0
2112300354833092609 QUEUED 0
2112300358012375042 QUEUED 0
2112300360847724546 QUEUED 0
2112300367785103361 QUEUED 0
2112300370070999042 QUEUED 0
2112300373816512514 QUEUED 0
2112300378312806402 QUEUED 0
2112300382242869249 QUEUED 0
2112300386147766274 QUEUED 0
2112300390572756993 QUEUED 0
2112300394305687554 QUEUED 0
2112300397086511105 QUEUED 0
2112300399489847297 QUEUED 0
2112300402195173378 QUEUED 0
2112300406142013441 QUEUED 0
2112300410453757954 QUEUED 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Transcode progress: 4/45 success, 1 running, 40 queued, 0 failed, 0 missing task rows.
2026-10-20 05:52:11 - transcode status snapshot
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 QUEUED 0
2112300346582896641 QUEUED 0
2112300348638105601 QUEUED 0
2112300351330848770 QUEUED 0
2112300354833092609 QUEUED 0
2112300358012375042 QUEUED 0
2112300360847724546 QUEUED 0
2112300367785103361 QUEUED 0
2112300370070999042 QUEUED 0
2112300373816512514 QUEUED 0
2112300378312806402 QUEUED 0
2112300382242869249 QUEUED 0
2112300386147766274 QUEUED 0
2112300390572756993 QUEUED 0
2112300394305687554 QUEUED 0
2112300397086511105 QUEUED 0
2112300399489847297 QUEUED 0
2112300402195173378 QUEUED 0
2112300406142013441 QUEUED 0
2112300410453757954 QUEUED 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Read transcode_task status for all uploaded videos.
2026-10-20 05:52:11 - wait for transcode
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 QUEUED 0
2112300346582896641 QUEUED 0
2112300348638105601 QUEUED 0
2112300351330848770 QUEUED 0
2112300354833092609 QUEUED 0
2112300358012375042 QUEUED 0
2112300360847724546 QUEUED 0
2112300367785103361 QUEUED 0
2112300370070999042 QUEUED 0
2112300373816512514 QUEUED 0
2112300378312806402 QUEUED 0
2112300382242869249 QUEUED 0
2112300386147766274 QUEUED 0
2112300390572756993 QUEUED 0
2112300394305687554 QUEUED 0
2112300397086511105 QUEUED 0
2112300399489847297 QUEUED 0
2112300402195173378 QUEUED 0
2112300406142013441 QUEUED 0
2112300410453757954 QUEUED 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Transcode progress: 5/45 success, 0 running, 40 queued, 0 failed, 0 missing task rows.
2026-10-20 05:52:21 - transcode status snapshot
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 RUNNING 0
2112300346582896641 QUEUED 0
2112300348638105601 QUEUED 0
2112300351330848770 QUEUED 0
2112300354833092609 QUEUED 0
2112300358012375042 QUEUED 0
2112300360847724546 QUEUED 0
2112300367785103361 QUEUED 0
2112300370070999042 QUEUED 0
2112300373816512514 QUEUED 0
2112300378312806402 QUEUED 0
2112300382242869249 QUEUED 0
2112300386147766274 QUEUED 0
2112300390572756993 QUEUED 0
2112300394305687554 QUEUED 0
2112300397086511105 QUEUED 0
2112300399489847297 QUEUED 0
2112300402195173378 QUEUED 0
2112300406142013441 QUEUED 0
2112300410453757954 QUEUED 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Read transcode_task status for all uploaded videos.
2026-10-20 05:52:21 - wait for transcode
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 RUNNING 0
2112300346582896641 QUEUED 0
2112300348638105601 QUEUED 0
2112300351330848770 QUEUED 0
2112300354833092609 QUEUED 0
2112300358012375042 QUEUED 0
2112300360847724546 QUEUED 0
2112300367785103361 QUEUED 0
2112300370070999042 QUEUED 0
2112300373816512514 QUEUED 0
2112300378312806402 QUEUED 0
2112300382242869249 QUEUED 0
2112300386147766274 QUEUED 0
2112300390572756993 QUEUED 0
2112300394305687554 QUEUED 0
2112300397086511105 QUEUED 0
2112300399489847297 QUEUED 0
2112300402195173378 QUEUED 0
2112300406142013441 QUEUED 0
2112300410453757954 QUEUED 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Transcode progress: 5/45 success, 1 running, 39 queued, 0 failed, 0 missing task rows.
2026-10-20 05:52:31 - transcode status snapshot
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 RUNNING 0
2112300348638105601 QUEUED 0
2112300351330848770 QUEUED 0
2112300354833092609 QUEUED 0
2112300358012375042 QUEUED 0
2112300360847724546 QUEUED 0
2112300367785103361 QUEUED 0
2112300370070999042 QUEUED 0
2112300373816512514 QUEUED 0
2112300378312806402 QUEUED 0
2112300382242869249 QUEUED 0
2112300386147766274 QUEUED 0
2112300390572756993 QUEUED 0
2112300394305687554 QUEUED 0
2112300397086511105 QUEUED 0
2112300399489847297 QUEUED 0
2112300402195173378 QUEUED 0
2112300406142013441 QUEUED 0
2112300410453757954 QUEUED 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Read transcode_task status for all uploaded videos.
2026-10-20 05:52:31 - wait for transcode
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 RUNNING 0
2112300348638105601 QUEUED 0
2112300351330848770 QUEUED 0
2112300354833092609 QUEUED 0
2112300358012375042 QUEUED 0
2112300360847724546 QUEUED 0
2112300367785103361 QUEUED 0
2112300370070999042 QUEUED 0
2112300373816512514 QUEUED 0
2112300378312806402 QUEUED 0
2112300382242869249 QUEUED 0
2112300386147766274 QUEUED 0
2112300390572756993 QUEUED 0
2112300394305687554 QUEUED 0
2112300397086511105 QUEUED 0
2112300399489847297 QUEUED 0
2112300402195173378 QUEUED 0
2112300406142013441 QUEUED 0
2112300410453757954 QUEUED 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Transcode progress: 6/45 success, 1 running, 38 queued, 0 failed, 0 missing task rows.
2026-10-20 05:52:41 - transcode status snapshot
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 RUNNING 0
2112300348638105601 QUEUED 0
2112300351330848770 QUEUED 0
2112300354833092609 QUEUED 0
2112300358012375042 QUEUED 0
2112300360847724546 QUEUED 0
2112300367785103361 QUEUED 0
2112300370070999042 QUEUED 0
2112300373816512514 QUEUED 0
2112300378312806402 QUEUED 0
2112300382242869249 QUEUED 0
2112300386147766274 QUEUED 0
2112300390572756993 QUEUED 0
2112300394305687554 QUEUED 0
2112300397086511105 QUEUED 0
2112300399489847297 QUEUED 0
2112300402195173378 QUEUED 0
2112300406142013441 QUEUED 0
2112300410453757954 QUEUED 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Read transcode_task status for all uploaded videos.
2026-10-20 05:52:52 - transcode status snapshot
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 RUNNING 0
2112300351330848770 QUEUED 0
2112300354833092609 QUEUED 0
2112300358012375042 QUEUED 0
2112300360847724546 QUEUED 0
2112300367785103361 QUEUED 0
2112300370070999042 QUEUED 0
2112300373816512514 QUEUED 0
2112300378312806402 QUEUED 0
2112300382242869249 QUEUED 0
2112300386147766274 QUEUED 0
2112300390572756993 QUEUED 0
2112300394305687554 QUEUED 0
2112300397086511105 QUEUED 0
2112300399489847297 QUEUED 0
2112300402195173378 QUEUED 0
2112300406142013441 QUEUED 0
2112300410453757954 QUEUED 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Read transcode_task status for all uploaded videos.
2026-10-20 05:52:52 - wait for transcode
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 RUNNING 0
2112300351330848770 QUEUED 0
2112300354833092609 QUEUED 0
2112300358012375042 QUEUED 0
2112300360847724546 QUEUED 0
2112300367785103361 QUEUED 0
2112300370070999042 QUEUED 0
2112300373816512514 QUEUED 0
2112300378312806402 QUEUED 0
2112300382242869249 QUEUED 0
2112300386147766274 QUEUED 0
2112300390572756993 QUEUED 0
2112300394305687554 QUEUED 0
2112300397086511105 QUEUED 0
2112300399489847297 QUEUED 0
2112300402195173378 QUEUED 0
2112300406142013441 QUEUED 0
2112300410453757954 QUEUED 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Transcode progress: 7/45 success, 1 running, 37 queued, 0 failed, 0 missing task rows.
2026-10-20 05:53:02 - transcode status snapshot
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 QUEUED 0
2112300354833092609 QUEUED 0
2112300358012375042 QUEUED 0
2112300360847724546 QUEUED 0
2112300367785103361 QUEUED 0
2112300370070999042 QUEUED 0
2112300373816512514 QUEUED 0
2112300378312806402 QUEUED 0
2112300382242869249 QUEUED 0
2112300386147766274 QUEUED 0
2112300390572756993 QUEUED 0
2112300394305687554 QUEUED 0
2112300397086511105 QUEUED 0
2112300399489847297 QUEUED 0
2112300402195173378 QUEUED 0
2112300406142013441 QUEUED 0
2112300410453757954 QUEUED 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Read transcode_task status for all uploaded videos.
2026-10-20 05:53:02 - wait for transcode
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 QUEUED 0
2112300354833092609 QUEUED 0
2112300358012375042 QUEUED 0
2112300360847724546 QUEUED 0
2112300367785103361 QUEUED 0
2112300370070999042 QUEUED 0
2112300373816512514 QUEUED 0
2112300378312806402 QUEUED 0
2112300382242869249 QUEUED 0
2112300386147766274 QUEUED 0
2112300390572756993 QUEUED 0
2112300394305687554 QUEUED 0
2112300397086511105 QUEUED 0
2112300399489847297 QUEUED 0
2112300402195173378 QUEUED 0
2112300406142013441 QUEUED 0
2112300410453757954 QUEUED 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Transcode progress: 8/45 success, 0 running, 37 queued, 0 failed, 0 missing task rows.
2026-10-20 05:53:12 - transcode status snapshot
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 RUNNING 0
2112300354833092609 QUEUED 0
2112300358012375042 QUEUED 0
2112300360847724546 QUEUED 0
2112300367785103361 QUEUED 0
2112300370070999042 QUEUED 0
2112300373816512514 QUEUED 0
2112300378312806402 QUEUED 0
2112300382242869249 QUEUED 0
2112300386147766274 QUEUED 0
2112300390572756993 QUEUED 0
2112300394305687554 QUEUED 0
2112300397086511105 QUEUED 0
2112300399489847297 QUEUED 0
2112300402195173378 QUEUED 0
2112300406142013441 QUEUED 0
2112300410453757954 QUEUED 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Read transcode_task status for all uploaded videos.
2026-10-20 05:53:12 - wait for transcode
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 RUNNING 0
2112300354833092609 QUEUED 0
2112300358012375042 QUEUED 0
2112300360847724546 QUEUED 0
2112300367785103361 QUEUED 0
2112300370070999042 QUEUED 0
2112300373816512514 QUEUED 0
2112300378312806402 QUEUED 0
2112300382242869249 QUEUED 0
2112300386147766274 QUEUED 0
2112300390572756993 QUEUED 0
2112300394305687554 QUEUED 0
2112300397086511105 QUEUED 0
2112300399489847297 QUEUED 0
2112300402195173378 QUEUED 0
2112300406142013441 QUEUED 0
2112300410453757954 QUEUED 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Transcode progress: 8/45 success, 1 running, 36 queued, 0 failed, 0 missing task rows.
2026-10-20 05:53:22 - transcode status snapshot
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 RUNNING 0
2112300354833092609 QUEUED 0
2112300358012375042 QUEUED 0
2112300360847724546 QUEUED 0
2112300367785103361 QUEUED 0
2112300370070999042 QUEUED 0
2112300373816512514 QUEUED 0
2112300378312806402 QUEUED 0
2112300382242869249 QUEUED 0
2112300386147766274 QUEUED 0
2112300390572756993 QUEUED 0
2112300394305687554 QUEUED 0
2112300397086511105 QUEUED 0
2112300399489847297 QUEUED 0
2112300402195173378 QUEUED 0
2112300406142013441 QUEUED 0
2112300410453757954 QUEUED 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Read transcode_task status for all uploaded videos.
2026-10-20 05:53:32 - transcode status snapshot
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 RUNNING 0
2112300358012375042 QUEUED 0
2112300360847724546 QUEUED 0
2112300367785103361 QUEUED 0
2112300370070999042 QUEUED 0
2112300373816512514 QUEUED 0
2112300378312806402 QUEUED 0
2112300382242869249 QUEUED 0
2112300386147766274 QUEUED 0
2112300390572756993 QUEUED 0
2112300394305687554 QUEUED 0
2112300397086511105 QUEUED 0
2112300399489847297 QUEUED 0
2112300402195173378 QUEUED 0
2112300406142013441 QUEUED 0
2112300410453757954 QUEUED 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Read transcode_task status for all uploaded videos.
2026-10-20 05:53:32 - wait for transcode
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 RUNNING 0
2112300358012375042 QUEUED 0
2112300360847724546 QUEUED 0
2112300367785103361 QUEUED 0
2112300370070999042 QUEUED 0
2112300373816512514 QUEUED 0
2112300378312806402 QUEUED 0
2112300382242869249 QUEUED 0
2112300386147766274 QUEUED 0
2112300390572756993 QUEUED 0
2112300394305687554 QUEUED 0
2112300397086511105 QUEUED 0
2112300399489847297 QUEUED 0
2112300402195173378 QUEUED 0
2112300406142013441 QUEUED 0
2112300410453757954 QUEUED 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Transcode progress: 9/45 success, 1 running, 35 queued, 0 failed, 0 missing task rows.
2026-10-20 05:53:42 - transcode status snapshot
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 QUEUED 0
2112300360847724546 QUEUED 0
2112300367785103361 QUEUED 0
2112300370070999042 QUEUED 0
2112300373816512514 QUEUED 0
2112300378312806402 QUEUED 0
2112300382242869249 QUEUED 0
2112300386147766274 QUEUED 0
2112300390572756993 QUEUED 0
2112300394305687554 QUEUED 0
2112300397086511105 QUEUED 0
2112300399489847297 QUEUED 0
2112300402195173378 QUEUED 0
2112300406142013441 QUEUED 0
2112300410453757954 QUEUED 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Read transcode_task status for all uploaded videos.
2026-10-20 05:53:42 - wait for transcode
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 QUEUED 0
2112300360847724546 QUEUED 0
2112300367785103361 QUEUED 0
2112300370070999042 QUEUED 0
2112300373816512514 QUEUED 0
2112300378312806402 QUEUED 0
2112300382242869249 QUEUED 0
2112300386147766274 QUEUED 0
2112300390572756993 QUEUED 0
2112300394305687554 QUEUED 0
2112300397086511105 QUEUED 0
2112300399489847297 QUEUED 0
2112300402195173378 QUEUED 0
2112300406142013441 QUEUED 0
2112300410453757954 QUEUED 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Transcode progress: 10/45 success, 0 running, 35 queued, 0 failed, 0 missing task rows.
2026-10-20 05:53:52 - transcode status snapshot
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 RUNNING 0
2112300360847724546 QUEUED 0
2112300367785103361 QUEUED 0
2112300370070999042 QUEUED 0
2112300373816512514 QUEUED 0
2112300378312806402 QUEUED 0
2112300382242869249 QUEUED 0
2112300386147766274 QUEUED 0
2112300390572756993 QUEUED 0
2112300394305687554 QUEUED 0
2112300397086511105 QUEUED 0
2112300399489847297 QUEUED 0
2112300402195173378 QUEUED 0
2112300406142013441 QUEUED 0
2112300410453757954 QUEUED 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Read transcode_task status for all uploaded videos.
2026-10-20 05:53:52 - wait for transcode
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 RUNNING 0
2112300360847724546 QUEUED 0
2112300367785103361 QUEUED 0
2112300370070999042 QUEUED 0
2112300373816512514 QUEUED 0
2112300378312806402 QUEUED 0
2112300382242869249 QUEUED 0
2112300386147766274 QUEUED 0
2112300390572756993 QUEUED 0
2112300394305687554 QUEUED 0
2112300397086511105 QUEUED 0
2112300399489847297 QUEUED 0
2112300402195173378 QUEUED 0
2112300406142013441 QUEUED 0
2112300410453757954 QUEUED 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Transcode progress: 10/45 success, 1 running, 34 queued, 0 failed, 0 missing task rows.
2026-10-20 05:54:02 - transcode status snapshot
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 RUNNING 0
2112300367785103361 QUEUED 0
2112300370070999042 QUEUED 0
2112300373816512514 QUEUED 0
2112300378312806402 QUEUED 0
2112300382242869249 QUEUED 0
2112300386147766274 QUEUED 0
2112300390572756993 QUEUED 0
2112300394305687554 QUEUED 0
2112300397086511105 QUEUED 0
2112300399489847297 QUEUED 0
2112300402195173378 QUEUED 0
2112300406142013441 QUEUED 0
2112300410453757954 QUEUED 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Read transcode_task status for all uploaded videos.
2026-10-20 05:54:02 - wait for transcode
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 RUNNING 0
2112300367785103361 QUEUED 0
2112300370070999042 QUEUED 0
2112300373816512514 QUEUED 0
2112300378312806402 QUEUED 0
2112300382242869249 QUEUED 0
2112300386147766274 QUEUED 0
2112300390572756993 QUEUED 0
2112300394305687554 QUEUED 0
2112300397086511105 QUEUED 0
2112300399489847297 QUEUED 0
2112300402195173378 QUEUED 0
2112300406142013441 QUEUED 0
2112300410453757954 QUEUED 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Transcode progress: 11/45 success, 1 running, 33 queued, 0 failed, 0 missing task rows.
2026-10-20 05:54:12 - transcode status snapshot
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 RUNNING 0
2112300370070999042 QUEUED 0
2112300373816512514 QUEUED 0
2112300378312806402 QUEUED 0
2112300382242869249 QUEUED 0
2112300386147766274 QUEUED 0
2112300390572756993 QUEUED 0
2112300394305687554 QUEUED 0
2112300397086511105 QUEUED 0
2112300399489847297 QUEUED 0
2112300402195173378 QUEUED 0
2112300406142013441 QUEUED 0
2112300410453757954 QUEUED 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Read transcode_task status for all uploaded videos.
2026-10-20 05:54:12 - wait for transcode
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 RUNNING 0
2112300370070999042 QUEUED 0
2112300373816512514 QUEUED 0
2112300378312806402 QUEUED 0
2112300382242869249 QUEUED 0
2112300386147766274 QUEUED 0
2112300390572756993 QUEUED 0
2112300394305687554 QUEUED 0
2112300397086511105 QUEUED 0
2112300399489847297 QUEUED 0
2112300402195173378 QUEUED 0
2112300406142013441 QUEUED 0
2112300410453757954 QUEUED 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Transcode progress: 12/45 success, 1 running, 32 queued, 0 failed, 0 missing task rows.
2026-10-20 05:54:23 - transcode status snapshot
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 RUNNING 0
2112300370070999042 QUEUED 0
2112300373816512514 QUEUED 0
2112300378312806402 QUEUED 0
2112300382242869249 QUEUED 0
2112300386147766274 QUEUED 0
2112300390572756993 QUEUED 0
2112300394305687554 QUEUED 0
2112300397086511105 QUEUED 0
2112300399489847297 QUEUED 0
2112300402195173378 QUEUED 0
2112300406142013441 QUEUED 0
2112300410453757954 QUEUED 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Read transcode_task status for all uploaded videos.
2026-10-20 05:54:33 - transcode status snapshot
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 RUNNING 0
2112300370070999042 QUEUED 0
2112300373816512514 QUEUED 0
2112300378312806402 QUEUED 0
2112300382242869249 QUEUED 0
2112300386147766274 QUEUED 0
2112300390572756993 QUEUED 0
2112300394305687554 QUEUED 0
2112300397086511105 QUEUED 0
2112300399489847297 QUEUED 0
2112300402195173378 QUEUED 0
2112300406142013441 QUEUED 0
2112300410453757954 QUEUED 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Read transcode_task status for all uploaded videos.
2026-10-20 05:54:43 - transcode status snapshot
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 RUNNING 0
2112300373816512514 QUEUED 0
2112300378312806402 QUEUED 0
2112300382242869249 QUEUED 0
2112300386147766274 QUEUED 0
2112300390572756993 QUEUED 0
2112300394305687554 QUEUED 0
2112300397086511105 QUEUED 0
2112300399489847297 QUEUED 0
2112300402195173378 QUEUED 0
2112300406142013441 QUEUED 0
2112300410453757954 QUEUED 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Read transcode_task status for all uploaded videos.
2026-10-20 05:54:43 - wait for transcode
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 RUNNING 0
2112300373816512514 QUEUED 0
2112300378312806402 QUEUED 0
2112300382242869249 QUEUED 0
2112300386147766274 QUEUED 0
2112300390572756993 QUEUED 0
2112300394305687554 QUEUED 0
2112300397086511105 QUEUED 0
2112300399489847297 QUEUED 0
2112300402195173378 QUEUED 0
2112300406142013441 QUEUED 0
2112300410453757954 QUEUED 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Transcode progress: 13/45 success, 1 running, 31 queued, 0 failed, 0 missing task rows.
2026-10-20 05:54:53 - transcode status snapshot
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 RUNNING 0
2112300378312806402 QUEUED 0
2112300382242869249 QUEUED 0
2112300386147766274 QUEUED 0
2112300390572756993 QUEUED 0
2112300394305687554 QUEUED 0
2112300397086511105 QUEUED 0
2112300399489847297 QUEUED 0
2112300402195173378 QUEUED 0
2112300406142013441 QUEUED 0
2112300410453757954 QUEUED 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Read transcode_task status for all uploaded videos.
2026-10-20 05:54:53 - wait for transcode
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 RUNNING 0
2112300378312806402 QUEUED 0
2112300382242869249 QUEUED 0
2112300386147766274 QUEUED 0
2112300390572756993 QUEUED 0
2112300394305687554 QUEUED 0
2112300397086511105 QUEUED 0
2112300399489847297 QUEUED 0
2112300402195173378 QUEUED 0
2112300406142013441 QUEUED 0
2112300410453757954 QUEUED 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Transcode progress: 14/45 success, 1 running, 30 queued, 0 failed, 0 missing task rows.
2026-10-20 05:55:03 - transcode status snapshot
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 QUEUED 0
2112300382242869249 QUEUED 0
2112300386147766274 QUEUED 0
2112300390572756993 QUEUED 0
2112300394305687554 QUEUED 0
2112300397086511105 QUEUED 0
2112300399489847297 QUEUED 0
2112300402195173378 QUEUED 0
2112300406142013441 QUEUED 0
2112300410453757954 QUEUED 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Read transcode_task status for all uploaded videos.
2026-10-20 05:55:03 - wait for transcode
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 QUEUED 0
2112300382242869249 QUEUED 0
2112300386147766274 QUEUED 0
2112300390572756993 QUEUED 0
2112300394305687554 QUEUED 0
2112300397086511105 QUEUED 0
2112300399489847297 QUEUED 0
2112300402195173378 QUEUED 0
2112300406142013441 QUEUED 0
2112300410453757954 QUEUED 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Transcode progress: 15/45 success, 0 running, 30 queued, 0 failed, 0 missing task rows.
2026-10-20 05:55:13 - transcode status snapshot
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 RUNNING 0
2112300382242869249 QUEUED 0
2112300386147766274 QUEUED 0
2112300390572756993 QUEUED 0
2112300394305687554 QUEUED 0
2112300397086511105 QUEUED 0
2112300399489847297 QUEUED 0
2112300402195173378 QUEUED 0
2112300406142013441 QUEUED 0
2112300410453757954 QUEUED 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Read transcode_task status for all uploaded videos.
2026-10-20 05:55:13 - wait for transcode
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 RUNNING 0
2112300382242869249 QUEUED 0
2112300386147766274 QUEUED 0
2112300390572756993 QUEUED 0
2112300394305687554 QUEUED 0
2112300397086511105 QUEUED 0
2112300399489847297 QUEUED 0
2112300402195173378 QUEUED 0
2112300406142013441 QUEUED 0
2112300410453757954 QUEUED 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Transcode progress: 15/45 success, 1 running, 29 queued, 0 failed, 0 missing task rows.
2026-10-20 05:55:23 - transcode status snapshot
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 QUEUED 0
2112300386147766274 QUEUED 0
2112300390572756993 QUEUED 0
2112300394305687554 QUEUED 0
2112300397086511105 QUEUED 0
2112300399489847297 QUEUED 0
2112300402195173378 QUEUED 0
2112300406142013441 QUEUED 0
2112300410453757954 QUEUED 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Read transcode_task status for all uploaded videos.
2026-10-20 05:55:23 - wait for transcode
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 QUEUED 0
2112300386147766274 QUEUED 0
2112300390572756993 QUEUED 0
2112300394305687554 QUEUED 0
2112300397086511105 QUEUED 0
2112300399489847297 QUEUED 0
2112300402195173378 QUEUED 0
2112300406142013441 QUEUED 0
2112300410453757954 QUEUED 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Transcode progress: 16/45 success, 0 running, 29 queued, 0 failed, 0 missing task rows.
2026-10-20 05:55:33 - transcode status snapshot
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 RUNNING 0
2112300386147766274 QUEUED 0
2112300390572756993 QUEUED 0
2112300394305687554 QUEUED 0
2112300397086511105 QUEUED 0
2112300399489847297 QUEUED 0
2112300402195173378 QUEUED 0
2112300406142013441 QUEUED 0
2112300410453757954 QUEUED 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Read transcode_task status for all uploaded videos.
2026-10-20 05:55:33 - wait for transcode
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 RUNNING 0
2112300386147766274 QUEUED 0
2112300390572756993 QUEUED 0
2112300394305687554 QUEUED 0
2112300397086511105 QUEUED 0
2112300399489847297 QUEUED 0
2112300402195173378 QUEUED 0
2112300406142013441 QUEUED 0
2112300410453757954 QUEUED 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Transcode progress: 16/45 success, 1 running, 28 queued, 0 failed, 0 missing task rows.
2026-10-20 05:55:43 - transcode status snapshot
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 RUNNING 0
2112300390572756993 QUEUED 0
2112300394305687554 QUEUED 0
2112300397086511105 QUEUED 0
2112300399489847297 QUEUED 0
2112300402195173378 QUEUED 0
2112300406142013441 QUEUED 0
2112300410453757954 QUEUED 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Read transcode_task status for all uploaded videos.
2026-10-20 05:55:43 - wait for transcode
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 RUNNING 0
2112300390572756993 QUEUED 0
2112300394305687554 QUEUED 0
2112300397086511105 QUEUED 0
2112300399489847297 QUEUED 0
2112300402195173378 QUEUED 0
2112300406142013441 QUEUED 0
2112300410453757954 QUEUED 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Transcode progress: 17/45 success, 1 running, 27 queued, 0 failed, 0 missing task rows.
2026-10-20 05:55:54 - transcode status snapshot
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 RUNNING 0
2112300390572756993 QUEUED 0
2112300394305687554 QUEUED 0
2112300397086511105 QUEUED 0
2112300399489847297 QUEUED 0
2112300402195173378 QUEUED 0
2112300406142013441 QUEUED 0
2112300410453757954 QUEUED 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Read transcode_task status for all uploaded videos.
2026-10-20 05:56:04 - transcode status snapshot
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 RUNNING 0
2112300394305687554 QUEUED 0
2112300397086511105 QUEUED 0
2112300399489847297 QUEUED 0
2112300402195173378 QUEUED 0
2112300406142013441 QUEUED 0
2112300410453757954 QUEUED 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Read transcode_task status for all uploaded videos.
2026-10-20 05:56:04 - wait for transcode
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 RUNNING 0
2112300394305687554 QUEUED 0
2112300397086511105 QUEUED 0
2112300399489847297 QUEUED 0
2112300402195173378 QUEUED 0
2112300406142013441 QUEUED 0
2112300410453757954 QUEUED 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Transcode progress: 18/45 success, 1 running, 26 queued, 0 failed, 0 missing task rows.
2026-10-20 05:56:14 - transcode status snapshot
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 QUEUED 0
2112300397086511105 QUEUED 0
2112300399489847297 QUEUED 0
2112300402195173378 QUEUED 0
2112300406142013441 QUEUED 0
2112300410453757954 QUEUED 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Read transcode_task status for all uploaded videos.
2026-10-20 05:56:14 - wait for transcode
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 QUEUED 0
2112300397086511105 QUEUED 0
2112300399489847297 QUEUED 0
2112300402195173378 QUEUED 0
2112300406142013441 QUEUED 0
2112300410453757954 QUEUED 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Transcode progress: 19/45 success, 0 running, 26 queued, 0 failed, 0 missing task rows.
2026-10-20 05:56:24 - transcode status snapshot
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 RUNNING 0
2112300397086511105 QUEUED 0
2112300399489847297 QUEUED 0
2112300402195173378 QUEUED 0
2112300406142013441 QUEUED 0
2112300410453757954 QUEUED 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Read transcode_task status for all uploaded videos.
2026-10-20 05:56:24 - wait for transcode
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 RUNNING 0
2112300397086511105 QUEUED 0
2112300399489847297 QUEUED 0
2112300402195173378 QUEUED 0
2112300406142013441 QUEUED 0
2112300410453757954 QUEUED 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Transcode progress: 19/45 success, 1 running, 25 queued, 0 failed, 0 missing task rows.
2026-10-20 05:56:34 - transcode status snapshot
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 SUCCESS 0
2112300397086511105 RUNNING 0
2112300399489847297 QUEUED 0
2112300402195173378 QUEUED 0
2112300406142013441 QUEUED 0
2112300410453757954 QUEUED 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Read transcode_task status for all uploaded videos.
2026-10-20 05:56:34 - wait for transcode
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 SUCCESS 0
2112300397086511105 RUNNING 0
2112300399489847297 QUEUED 0
2112300402195173378 QUEUED 0
2112300406142013441 QUEUED 0
2112300410453757954 QUEUED 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Transcode progress: 20/45 success, 1 running, 24 queued, 0 failed, 0 missing task rows.
2026-10-20 05:56:44 - transcode status snapshot
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 SUCCESS 0
2112300397086511105 SUCCESS 0
2112300399489847297 QUEUED 0
2112300402195173378 QUEUED 0
2112300406142013441 QUEUED 0
2112300410453757954 QUEUED 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Read transcode_task status for all uploaded videos.
2026-10-20 05:56:44 - wait for transcode
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 SUCCESS 0
2112300397086511105 SUCCESS 0
2112300399489847297 QUEUED 0
2112300402195173378 QUEUED 0
2112300406142013441 QUEUED 0
2112300410453757954 QUEUED 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Transcode progress: 21/45 success, 0 running, 24 queued, 0 failed, 0 missing task rows.
2026-10-20 05:56:54 - transcode status snapshot
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 SUCCESS 0
2112300397086511105 SUCCESS 0
2112300399489847297 RUNNING 0
2112300402195173378 QUEUED 0
2112300406142013441 QUEUED 0
2112300410453757954 QUEUED 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Read transcode_task status for all uploaded videos.
2026-10-20 05:56:54 - wait for transcode
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 SUCCESS 0
2112300397086511105 SUCCESS 0
2112300399489847297 RUNNING 0
2112300402195173378 QUEUED 0
2112300406142013441 QUEUED 0
2112300410453757954 QUEUED 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Transcode progress: 21/45 success, 1 running, 23 queued, 0 failed, 0 missing task rows.
2026-10-20 05:57:04 - transcode status snapshot
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 SUCCESS 0
2112300397086511105 SUCCESS 0
2112300399489847297 SUCCESS 0
2112300402195173378 RUNNING 0
2112300406142013441 QUEUED 0
2112300410453757954 QUEUED 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Read transcode_task status for all uploaded videos.
2026-10-20 05:57:04 - wait for transcode
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 SUCCESS 0
2112300397086511105 SUCCESS 0
2112300399489847297 SUCCESS 0
2112300402195173378 RUNNING 0
2112300406142013441 QUEUED 0
2112300410453757954 QUEUED 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Transcode progress: 22/45 success, 1 running, 22 queued, 0 failed, 0 missing task rows.
2026-10-20 05:57:14 - transcode status snapshot
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 SUCCESS 0
2112300397086511105 SUCCESS 0
2112300399489847297 SUCCESS 0
2112300402195173378 SUCCESS 0
2112300406142013441 QUEUED 0
2112300410453757954 QUEUED 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Read transcode_task status for all uploaded videos.
2026-10-20 05:57:14 - wait for transcode
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 SUCCESS 0
2112300397086511105 SUCCESS 0
2112300399489847297 SUCCESS 0
2112300402195173378 SUCCESS 0
2112300406142013441 QUEUED 0
2112300410453757954 QUEUED 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Transcode progress: 23/45 success, 0 running, 22 queued, 0 failed, 0 missing task rows.
2026-10-20 05:57:25 - transcode status snapshot
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 SUCCESS 0
2112300397086511105 SUCCESS 0
2112300399489847297 SUCCESS 0
2112300402195173378 SUCCESS 0
2112300406142013441 SUCCESS 0
2112300410453757954 QUEUED 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Read transcode_task status for all uploaded videos.
2026-10-20 05:57:25 - wait for transcode
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 SUCCESS 0
2112300397086511105 SUCCESS 0
2112300399489847297 SUCCESS 0
2112300402195173378 SUCCESS 0
2112300406142013441 SUCCESS 0
2112300410453757954 QUEUED 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Transcode progress: 24/45 success, 0 running, 21 queued, 0 failed, 0 missing task rows.
2026-10-20 05:57:35 - transcode status snapshot
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 SUCCESS 0
2112300397086511105 SUCCESS 0
2112300399489847297 SUCCESS 0
2112300402195173378 SUCCESS 0
2112300406142013441 SUCCESS 0
2112300410453757954 RUNNING 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Read transcode_task status for all uploaded videos.
2026-10-20 05:57:35 - wait for transcode
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 SUCCESS 0
2112300397086511105 SUCCESS 0
2112300399489847297 SUCCESS 0
2112300402195173378 SUCCESS 0
2112300406142013441 SUCCESS 0
2112300410453757954 RUNNING 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Transcode progress: 24/45 success, 1 running, 20 queued, 0 failed, 0 missing task rows.
2026-10-20 05:57:45 - transcode status snapshot
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 SUCCESS 0
2112300397086511105 SUCCESS 0
2112300399489847297 SUCCESS 0
2112300402195173378 SUCCESS 0
2112300406142013441 SUCCESS 0
2112300410453757954 SUCCESS 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Read transcode_task status for all uploaded videos.
2026-10-20 05:57:45 - wait for transcode
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 SUCCESS 0
2112300397086511105 SUCCESS 0
2112300399489847297 SUCCESS 0
2112300402195173378 SUCCESS 0
2112300406142013441 SUCCESS 0
2112300410453757954 SUCCESS 0
2112300412513161217 QUEUED 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Transcode progress: 25/45 success, 0 running, 20 queued, 0 failed, 0 missing task rows.
2026-10-20 05:57:55 - transcode status snapshot
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 SUCCESS 0
2112300397086511105 SUCCESS 0
2112300399489847297 SUCCESS 0
2112300402195173378 SUCCESS 0
2112300406142013441 SUCCESS 0
2112300410453757954 SUCCESS 0
2112300412513161217 RUNNING 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Read transcode_task status for all uploaded videos.
2026-10-20 05:57:55 - wait for transcode
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 SUCCESS 0
2112300397086511105 SUCCESS 0
2112300399489847297 SUCCESS 0
2112300402195173378 SUCCESS 0
2112300406142013441 SUCCESS 0
2112300410453757954 SUCCESS 0
2112300412513161217 RUNNING 0
2112300415545643010 QUEUED 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Transcode progress: 25/45 success, 1 running, 19 queued, 0 failed, 0 missing task rows.
2026-10-20 05:58:05 - transcode status snapshot
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 SUCCESS 0
2112300397086511105 SUCCESS 0
2112300399489847297 SUCCESS 0
2112300402195173378 SUCCESS 0
2112300406142013441 SUCCESS 0
2112300410453757954 SUCCESS 0
2112300412513161217 SUCCESS 0
2112300415545643010 RUNNING 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Read transcode_task status for all uploaded videos.
2026-10-20 05:58:05 - wait for transcode
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 SUCCESS 0
2112300397086511105 SUCCESS 0
2112300399489847297 SUCCESS 0
2112300402195173378 SUCCESS 0
2112300406142013441 SUCCESS 0
2112300410453757954 SUCCESS 0
2112300412513161217 SUCCESS 0
2112300415545643010 RUNNING 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Transcode progress: 26/45 success, 1 running, 18 queued, 0 failed, 0 missing task rows.
2026-10-20 05:58:15 - transcode status snapshot
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 SUCCESS 0
2112300397086511105 SUCCESS 0
2112300399489847297 SUCCESS 0
2112300402195173378 SUCCESS 0
2112300406142013441 SUCCESS 0
2112300410453757954 SUCCESS 0
2112300412513161217 SUCCESS 0
2112300415545643010 RUNNING 0
2112300418439712769 QUEUED 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Read transcode_task status for all uploaded videos.
2026-10-20 05:58:25 - transcode status snapshot
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 SUCCESS 0
2112300397086511105 SUCCESS 0
2112300399489847297 SUCCESS 0
2112300402195173378 SUCCESS 0
2112300406142013441 SUCCESS 0
2112300410453757954 SUCCESS 0
2112300412513161217 SUCCESS 0
2112300415545643010 SUCCESS 0
2112300418439712769 RUNNING 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Read transcode_task status for all uploaded videos.
2026-10-20 05:58:25 - wait for transcode
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 SUCCESS 0
2112300397086511105 SUCCESS 0
2112300399489847297 SUCCESS 0
2112300402195173378 SUCCESS 0
2112300406142013441 SUCCESS 0
2112300410453757954 SUCCESS 0
2112300412513161217 SUCCESS 0
2112300415545643010 SUCCESS 0
2112300418439712769 RUNNING 0
2112300421715464194 QUEUED 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Transcode progress: 27/45 success, 1 running, 17 queued, 0 failed, 0 missing task rows.
2026-10-20 05:58:35 - transcode status snapshot
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 SUCCESS 0
2112300397086511105 SUCCESS 0
2112300399489847297 SUCCESS 0
2112300402195173378 SUCCESS 0
2112300406142013441 SUCCESS 0
2112300410453757954 SUCCESS 0
2112300412513161217 SUCCESS 0
2112300415545643010 SUCCESS 0
2112300418439712769 SUCCESS 0
2112300421715464194 RUNNING 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Read transcode_task status for all uploaded videos.
2026-10-20 05:58:35 - wait for transcode
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 SUCCESS 0
2112300397086511105 SUCCESS 0
2112300399489847297 SUCCESS 0
2112300402195173378 SUCCESS 0
2112300406142013441 SUCCESS 0
2112300410453757954 SUCCESS 0
2112300412513161217 SUCCESS 0
2112300415545643010 SUCCESS 0
2112300418439712769 SUCCESS 0
2112300421715464194 RUNNING 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Transcode progress: 28/45 success, 1 running, 16 queued, 0 failed, 0 missing task rows.
2026-10-20 05:58:45 - transcode status snapshot
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 SUCCESS 0
2112300397086511105 SUCCESS 0
2112300399489847297 SUCCESS 0
2112300402195173378 SUCCESS 0
2112300406142013441 SUCCESS 0
2112300410453757954 SUCCESS 0
2112300412513161217 SUCCESS 0
2112300415545643010 SUCCESS 0
2112300418439712769 SUCCESS 0
2112300421715464194 SUCCESS 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Read transcode_task status for all uploaded videos.
2026-10-20 05:58:45 - wait for transcode
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 SUCCESS 0
2112300397086511105 SUCCESS 0
2112300399489847297 SUCCESS 0
2112300402195173378 SUCCESS 0
2112300406142013441 SUCCESS 0
2112300410453757954 SUCCESS 0
2112300412513161217 SUCCESS 0
2112300415545643010 SUCCESS 0
2112300418439712769 SUCCESS 0
2112300421715464194 SUCCESS 0
2112300425389674497 QUEUED 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Transcode progress: 29/45 success, 0 running, 16 queued, 0 failed, 0 missing task rows.
2026-10-20 05:58:56 - transcode status snapshot
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 SUCCESS 0
2112300397086511105 SUCCESS 0
2112300399489847297 SUCCESS 0
2112300402195173378 SUCCESS 0
2112300406142013441 SUCCESS 0
2112300410453757954 SUCCESS 0
2112300412513161217 SUCCESS 0
2112300415545643010 SUCCESS 0
2112300418439712769 SUCCESS 0
2112300421715464194 SUCCESS 0
2112300425389674497 RUNNING 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Read transcode_task status for all uploaded videos.
2026-10-20 05:58:56 - wait for transcode
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 SUCCESS 0
2112300397086511105 SUCCESS 0
2112300399489847297 SUCCESS 0
2112300402195173378 SUCCESS 0
2112300406142013441 SUCCESS 0
2112300410453757954 SUCCESS 0
2112300412513161217 SUCCESS 0
2112300415545643010 SUCCESS 0
2112300418439712769 SUCCESS 0
2112300421715464194 SUCCESS 0
2112300425389674497 RUNNING 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Transcode progress: 29/45 success, 1 running, 15 queued, 0 failed, 0 missing task rows.
2026-10-20 05:59:06 - transcode status snapshot
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 SUCCESS 0
2112300397086511105 SUCCESS 0
2112300399489847297 SUCCESS 0
2112300402195173378 SUCCESS 0
2112300406142013441 SUCCESS 0
2112300410453757954 SUCCESS 0
2112300412513161217 SUCCESS 0
2112300415545643010 SUCCESS 0
2112300418439712769 SUCCESS 0
2112300421715464194 SUCCESS 0
2112300425389674497 SUCCESS 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Read transcode_task status for all uploaded videos.
2026-10-20 05:59:06 - wait for transcode
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 SUCCESS 0
2112300397086511105 SUCCESS 0
2112300399489847297 SUCCESS 0
2112300402195173378 SUCCESS 0
2112300406142013441 SUCCESS 0
2112300410453757954 SUCCESS 0
2112300412513161217 SUCCESS 0
2112300415545643010 SUCCESS 0
2112300418439712769 SUCCESS 0
2112300421715464194 SUCCESS 0
2112300425389674497 SUCCESS 0
2112300428967415810 QUEUED 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Transcode progress: 30/45 success, 0 running, 15 queued, 0 failed, 0 missing task rows.
2026-10-20 05:59:16 - transcode status snapshot
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 SUCCESS 0
2112300397086511105 SUCCESS 0
2112300399489847297 SUCCESS 0
2112300402195173378 SUCCESS 0
2112300406142013441 SUCCESS 0
2112300410453757954 SUCCESS 0
2112300412513161217 SUCCESS 0
2112300415545643010 SUCCESS 0
2112300418439712769 SUCCESS 0
2112300421715464194 SUCCESS 0
2112300425389674497 SUCCESS 0
2112300428967415810 RUNNING 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Read transcode_task status for all uploaded videos.
2026-10-20 05:59:16 - wait for transcode
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 SUCCESS 0
2112300397086511105 SUCCESS 0
2112300399489847297 SUCCESS 0
2112300402195173378 SUCCESS 0
2112300406142013441 SUCCESS 0
2112300410453757954 SUCCESS 0
2112300412513161217 SUCCESS 0
2112300415545643010 SUCCESS 0
2112300418439712769 SUCCESS 0
2112300421715464194 SUCCESS 0
2112300425389674497 SUCCESS 0
2112300428967415810 RUNNING 0
2112300432620654594 QUEUED 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Transcode progress: 30/45 success, 1 running, 14 queued, 0 failed, 0 missing task rows.
2026-10-20 05:59:26 - transcode status snapshot
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 SUCCESS 0
2112300397086511105 SUCCESS 0
2112300399489847297 SUCCESS 0
2112300402195173378 SUCCESS 0
2112300406142013441 SUCCESS 0
2112300410453757954 SUCCESS 0
2112300412513161217 SUCCESS 0
2112300415545643010 SUCCESS 0
2112300418439712769 SUCCESS 0
2112300421715464194 SUCCESS 0
2112300425389674497 SUCCESS 0
2112300428967415810 SUCCESS 0
2112300432620654594 RUNNING 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Read transcode_task status for all uploaded videos.
2026-10-20 05:59:26 - wait for transcode
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 SUCCESS 0
2112300397086511105 SUCCESS 0
2112300399489847297 SUCCESS 0
2112300402195173378 SUCCESS 0
2112300406142013441 SUCCESS 0
2112300410453757954 SUCCESS 0
2112300412513161217 SUCCESS 0
2112300415545643010 SUCCESS 0
2112300418439712769 SUCCESS 0
2112300421715464194 SUCCESS 0
2112300425389674497 SUCCESS 0
2112300428967415810 SUCCESS 0
2112300432620654594 RUNNING 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Transcode progress: 31/45 success, 1 running, 13 queued, 0 failed, 0 missing task rows.
2026-10-20 05:59:36 - transcode status snapshot
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 SUCCESS 0
2112300397086511105 SUCCESS 0
2112300399489847297 SUCCESS 0
2112300402195173378 SUCCESS 0
2112300406142013441 SUCCESS 0
2112300410453757954 SUCCESS 0
2112300412513161217 SUCCESS 0
2112300415545643010 SUCCESS 0
2112300418439712769 SUCCESS 0
2112300421715464194 SUCCESS 0
2112300425389674497 SUCCESS 0
2112300428967415810 SUCCESS 0
2112300432620654594 RUNNING 0
2112300436978536449 QUEUED 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Read transcode_task status for all uploaded videos.
2026-10-20 05:59:46 - transcode status snapshot
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 SUCCESS 0
2112300397086511105 SUCCESS 0
2112300399489847297 SUCCESS 0
2112300402195173378 SUCCESS 0
2112300406142013441 SUCCESS 0
2112300410453757954 SUCCESS 0
2112300412513161217 SUCCESS 0
2112300415545643010 SUCCESS 0
2112300418439712769 SUCCESS 0
2112300421715464194 SUCCESS 0
2112300425389674497 SUCCESS 0
2112300428967415810 SUCCESS 0
2112300432620654594 SUCCESS 0
2112300436978536449 RUNNING 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Read transcode_task status for all uploaded videos.
2026-10-20 05:59:46 - wait for transcode
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 SUCCESS 0
2112300397086511105 SUCCESS 0
2112300399489847297 SUCCESS 0
2112300402195173378 SUCCESS 0
2112300406142013441 SUCCESS 0
2112300410453757954 SUCCESS 0
2112300412513161217 SUCCESS 0
2112300415545643010 SUCCESS 0
2112300418439712769 SUCCESS 0
2112300421715464194 SUCCESS 0
2112300425389674497 SUCCESS 0
2112300428967415810 SUCCESS 0
2112300432620654594 SUCCESS 0
2112300436978536449 RUNNING 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Transcode progress: 32/45 success, 1 running, 12 queued, 0 failed, 0 missing task rows.
2026-10-20 05:59:56 - transcode status snapshot
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 SUCCESS 0
2112300397086511105 SUCCESS 0
2112300399489847297 SUCCESS 0
2112300402195173378 SUCCESS 0
2112300406142013441 SUCCESS 0
2112300410453757954 SUCCESS 0
2112300412513161217 SUCCESS 0
2112300415545643010 SUCCESS 0
2112300418439712769 SUCCESS 0
2112300421715464194 SUCCESS 0
2112300425389674497 SUCCESS 0
2112300428967415810 SUCCESS 0
2112300432620654594 SUCCESS 0
2112300436978536449 SUCCESS 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Read transcode_task status for all uploaded videos.
2026-10-20 05:59:56 - wait for transcode
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 SUCCESS 0
2112300397086511105 SUCCESS 0
2112300399489847297 SUCCESS 0
2112300402195173378 SUCCESS 0
2112300406142013441 SUCCESS 0
2112300410453757954 SUCCESS 0
2112300412513161217 SUCCESS 0
2112300415545643010 SUCCESS 0
2112300418439712769 SUCCESS 0
2112300421715464194 SUCCESS 0
2112300425389674497 SUCCESS 0
2112300428967415810 SUCCESS 0
2112300432620654594 SUCCESS 0
2112300436978536449 SUCCESS 0
2112300440216539138 QUEUED 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Transcode progress: 33/45 success, 0 running, 12 queued, 0 failed, 0 missing task rows.
2026-10-20 06:00:06 - transcode status snapshot
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 SUCCESS 0
2112300397086511105 SUCCESS 0
2112300399489847297 SUCCESS 0
2112300402195173378 SUCCESS 0
2112300406142013441 SUCCESS 0
2112300410453757954 SUCCESS 0
2112300412513161217 SUCCESS 0
2112300415545643010 SUCCESS 0
2112300418439712769 SUCCESS 0
2112300421715464194 SUCCESS 0
2112300425389674497 SUCCESS 0
2112300428967415810 SUCCESS 0
2112300432620654594 SUCCESS 0
2112300436978536449 SUCCESS 0
2112300440216539138 RUNNING 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Read transcode_task status for all uploaded videos.
2026-10-20 06:00:06 - wait for transcode
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 SUCCESS 0
2112300397086511105 SUCCESS 0
2112300399489847297 SUCCESS 0
2112300402195173378 SUCCESS 0
2112300406142013441 SUCCESS 0
2112300410453757954 SUCCESS 0
2112300412513161217 SUCCESS 0
2112300415545643010 SUCCESS 0
2112300418439712769 SUCCESS 0
2112300421715464194 SUCCESS 0
2112300425389674497 SUCCESS 0
2112300428967415810 SUCCESS 0
2112300432620654594 SUCCESS 0
2112300436978536449 SUCCESS 0
2112300440216539138 RUNNING 0
2112300443555205122 QUEUED 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Transcode progress: 33/45 success, 1 running, 11 queued, 0 failed, 0 missing task rows.
2026-10-20 06:00:16 - transcode status snapshot
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 SUCCESS 0
2112300397086511105 SUCCESS 0
2112300399489847297 SUCCESS 0
2112300402195173378 SUCCESS 0
2112300406142013441 SUCCESS 0
2112300410453757954 SUCCESS 0
2112300412513161217 SUCCESS 0
2112300415545643010 SUCCESS 0
2112300418439712769 SUCCESS 0
2112300421715464194 SUCCESS 0
2112300425389674497 SUCCESS 0
2112300428967415810 SUCCESS 0
2112300432620654594 SUCCESS 0
2112300436978536449 SUCCESS 0
2112300440216539138 SUCCESS 0
2112300443555205122 RUNNING 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Read transcode_task status for all uploaded videos.
2026-10-20 06:00:16 - wait for transcode
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 SUCCESS 0
2112300397086511105 SUCCESS 0
2112300399489847297 SUCCESS 0
2112300402195173378 SUCCESS 0
2112300406142013441 SUCCESS 0
2112300410453757954 SUCCESS 0
2112300412513161217 SUCCESS 0
2112300415545643010 SUCCESS 0
2112300418439712769 SUCCESS 0
2112300421715464194 SUCCESS 0
2112300425389674497 SUCCESS 0
2112300428967415810 SUCCESS 0
2112300432620654594 SUCCESS 0
2112300436978536449 SUCCESS 0
2112300440216539138 SUCCESS 0
2112300443555205122 RUNNING 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Transcode progress: 34/45 success, 1 running, 10 queued, 0 failed, 0 missing task rows.
2026-10-20 06:00:27 - transcode status snapshot
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 SUCCESS 0
2112300397086511105 SUCCESS 0
2112300399489847297 SUCCESS 0
2112300402195173378 SUCCESS 0
2112300406142013441 SUCCESS 0
2112300410453757954 SUCCESS 0
2112300412513161217 SUCCESS 0
2112300415545643010 SUCCESS 0
2112300418439712769 SUCCESS 0
2112300421715464194 SUCCESS 0
2112300425389674497 SUCCESS 0
2112300428967415810 SUCCESS 0
2112300432620654594 SUCCESS 0
2112300436978536449 SUCCESS 0
2112300440216539138 SUCCESS 0
2112300443555205122 RUNNING 0
2112300445811740673 QUEUED 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Read transcode_task status for all uploaded videos.
2026-10-20 06:00:37 - transcode status snapshot
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 SUCCESS 0
2112300397086511105 SUCCESS 0
2112300399489847297 SUCCESS 0
2112300402195173378 SUCCESS 0
2112300406142013441 SUCCESS 0
2112300410453757954 SUCCESS 0
2112300412513161217 SUCCESS 0
2112300415545643010 SUCCESS 0
2112300418439712769 SUCCESS 0
2112300421715464194 SUCCESS 0
2112300425389674497 SUCCESS 0
2112300428967415810 SUCCESS 0
2112300432620654594 SUCCESS 0
2112300436978536449 SUCCESS 0
2112300440216539138 SUCCESS 0
2112300443555205122 SUCCESS 0
2112300445811740673 RUNNING 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Read transcode_task status for all uploaded videos.
2026-10-20 06:00:37 - wait for transcode
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 SUCCESS 0
2112300397086511105 SUCCESS 0
2112300399489847297 SUCCESS 0
2112300402195173378 SUCCESS 0
2112300406142013441 SUCCESS 0
2112300410453757954 SUCCESS 0
2112300412513161217 SUCCESS 0
2112300415545643010 SUCCESS 0
2112300418439712769 SUCCESS 0
2112300421715464194 SUCCESS 0
2112300425389674497 SUCCESS 0
2112300428967415810 SUCCESS 0
2112300432620654594 SUCCESS 0
2112300436978536449 SUCCESS 0
2112300440216539138 SUCCESS 0
2112300443555205122 SUCCESS 0
2112300445811740673 RUNNING 0
2112300450085736449 QUEUED 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Transcode progress: 35/45 success, 1 running, 9 queued, 0 failed, 0 missing task rows.
2026-10-20 06:00:47 - transcode status snapshot
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 SUCCESS 0
2112300397086511105 SUCCESS 0
2112300399489847297 SUCCESS 0
2112300402195173378 SUCCESS 0
2112300406142013441 SUCCESS 0
2112300410453757954 SUCCESS 0
2112300412513161217 SUCCESS 0
2112300415545643010 SUCCESS 0
2112300418439712769 SUCCESS 0
2112300421715464194 SUCCESS 0
2112300425389674497 SUCCESS 0
2112300428967415810 SUCCESS 0
2112300432620654594 SUCCESS 0
2112300436978536449 SUCCESS 0
2112300440216539138 SUCCESS 0
2112300443555205122 SUCCESS 0
2112300445811740673 SUCCESS 0
2112300450085736449 RUNNING 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Read transcode_task status for all uploaded videos.
2026-10-20 06:00:47 - wait for transcode
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 SUCCESS 0
2112300397086511105 SUCCESS 0
2112300399489847297 SUCCESS 0
2112300402195173378 SUCCESS 0
2112300406142013441 SUCCESS 0
2112300410453757954 SUCCESS 0
2112300412513161217 SUCCESS 0
2112300415545643010 SUCCESS 0
2112300418439712769 SUCCESS 0
2112300421715464194 SUCCESS 0
2112300425389674497 SUCCESS 0
2112300428967415810 SUCCESS 0
2112300432620654594 SUCCESS 0
2112300436978536449 SUCCESS 0
2112300440216539138 SUCCESS 0
2112300443555205122 SUCCESS 0
2112300445811740673 SUCCESS 0
2112300450085736449 RUNNING 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Transcode progress: 36/45 success, 1 running, 8 queued, 0 failed, 0 missing task rows.
2026-10-20 06:00:57 - transcode status snapshot
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 SUCCESS 0
2112300397086511105 SUCCESS 0
2112300399489847297 SUCCESS 0
2112300402195173378 SUCCESS 0
2112300406142013441 SUCCESS 0
2112300410453757954 SUCCESS 0
2112300412513161217 SUCCESS 0
2112300415545643010 SUCCESS 0
2112300418439712769 SUCCESS 0
2112300421715464194 SUCCESS 0
2112300425389674497 SUCCESS 0
2112300428967415810 SUCCESS 0
2112300432620654594 SUCCESS 0
2112300436978536449 SUCCESS 0
2112300440216539138 SUCCESS 0
2112300443555205122 SUCCESS 0
2112300445811740673 SUCCESS 0
2112300450085736449 RUNNING 0
2112300453072080898 QUEUED 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Read transcode_task status for all uploaded videos.
2026-10-20 06:01:07 - transcode status snapshot
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 SUCCESS 0
2112300397086511105 SUCCESS 0
2112300399489847297 SUCCESS 0
2112300402195173378 SUCCESS 0
2112300406142013441 SUCCESS 0
2112300410453757954 SUCCESS 0
2112300412513161217 SUCCESS 0
2112300415545643010 SUCCESS 0
2112300418439712769 SUCCESS 0
2112300421715464194 SUCCESS 0
2112300425389674497 SUCCESS 0
2112300428967415810 SUCCESS 0
2112300432620654594 SUCCESS 0
2112300436978536449 SUCCESS 0
2112300440216539138 SUCCESS 0
2112300443555205122 SUCCESS 0
2112300445811740673 SUCCESS 0
2112300450085736449 SUCCESS 0
2112300453072080898 RUNNING 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Read transcode_task status for all uploaded videos.
2026-10-20 06:01:07 - wait for transcode
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 SUCCESS 0
2112300397086511105 SUCCESS 0
2112300399489847297 SUCCESS 0
2112300402195173378 SUCCESS 0
2112300406142013441 SUCCESS 0
2112300410453757954 SUCCESS 0
2112300412513161217 SUCCESS 0
2112300415545643010 SUCCESS 0
2112300418439712769 SUCCESS 0
2112300421715464194 SUCCESS 0
2112300425389674497 SUCCESS 0
2112300428967415810 SUCCESS 0
2112300432620654594 SUCCESS 0
2112300436978536449 SUCCESS 0
2112300440216539138 SUCCESS 0
2112300443555205122 SUCCESS 0
2112300445811740673 SUCCESS 0
2112300450085736449 SUCCESS 0
2112300453072080898 RUNNING 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Transcode progress: 37/45 success, 1 running, 7 queued, 0 failed, 0 missing task rows.
2026-10-20 06:01:17 - transcode status snapshot
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 SUCCESS 0
2112300397086511105 SUCCESS 0
2112300399489847297 SUCCESS 0
2112300402195173378 SUCCESS 0
2112300406142013441 SUCCESS 0
2112300410453757954 SUCCESS 0
2112300412513161217 SUCCESS 0
2112300415545643010 SUCCESS 0
2112300418439712769 SUCCESS 0
2112300421715464194 SUCCESS 0
2112300425389674497 SUCCESS 0
2112300428967415810 SUCCESS 0
2112300432620654594 SUCCESS 0
2112300436978536449 SUCCESS 0
2112300440216539138 SUCCESS 0
2112300443555205122 SUCCESS 0
2112300445811740673 SUCCESS 0
2112300450085736449 SUCCESS 0
2112300453072080898 SUCCESS 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Read transcode_task status for all uploaded videos.
2026-10-20 06:01:17 - wait for transcode
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 SUCCESS 0
2112300397086511105 SUCCESS 0
2112300399489847297 SUCCESS 0
2112300402195173378 SUCCESS 0
2112300406142013441 SUCCESS 0
2112300410453757954 SUCCESS 0
2112300412513161217 SUCCESS 0
2112300415545643010 SUCCESS 0
2112300418439712769 SUCCESS 0
2112300421715464194 SUCCESS 0
2112300425389674497 SUCCESS 0
2112300428967415810 SUCCESS 0
2112300432620654594 SUCCESS 0
2112300436978536449 SUCCESS 0
2112300440216539138 SUCCESS 0
2112300443555205122 SUCCESS 0
2112300445811740673 SUCCESS 0
2112300450085736449 SUCCESS 0
2112300453072080898 SUCCESS 0
2112300455404113921 QUEUED 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Transcode progress: 38/45 success, 0 running, 7 queued, 0 failed, 0 missing task rows.
2026-10-20 06:01:27 - transcode status snapshot
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 SUCCESS 0
2112300397086511105 SUCCESS 0
2112300399489847297 SUCCESS 0
2112300402195173378 SUCCESS 0
2112300406142013441 SUCCESS 0
2112300410453757954 SUCCESS 0
2112300412513161217 SUCCESS 0
2112300415545643010 SUCCESS 0
2112300418439712769 SUCCESS 0
2112300421715464194 SUCCESS 0
2112300425389674497 SUCCESS 0
2112300428967415810 SUCCESS 0
2112300432620654594 SUCCESS 0
2112300436978536449 SUCCESS 0
2112300440216539138 SUCCESS 0
2112300443555205122 SUCCESS 0
2112300445811740673 SUCCESS 0
2112300450085736449 SUCCESS 0
2112300453072080898 SUCCESS 0
2112300455404113921 SUCCESS 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Read transcode_task status for all uploaded videos.
2026-10-20 06:01:27 - wait for transcode
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 SUCCESS 0
2112300397086511105 SUCCESS 0
2112300399489847297 SUCCESS 0
2112300402195173378 SUCCESS 0
2112300406142013441 SUCCESS 0
2112300410453757954 SUCCESS 0
2112300412513161217 SUCCESS 0
2112300415545643010 SUCCESS 0
2112300418439712769 SUCCESS 0
2112300421715464194 SUCCESS 0
2112300425389674497 SUCCESS 0
2112300428967415810 SUCCESS 0
2112300432620654594 SUCCESS 0
2112300436978536449 SUCCESS 0
2112300440216539138 SUCCESS 0
2112300443555205122 SUCCESS 0
2112300445811740673 SUCCESS 0
2112300450085736449 SUCCESS 0
2112300453072080898 SUCCESS 0
2112300455404113921 SUCCESS 0
2112300457786478594 QUEUED 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Transcode progress: 39/45 success, 0 running, 6 queued, 0 failed, 0 missing task rows.
2026-10-20 06:01:37 - transcode status snapshot
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 SUCCESS 0
2112300397086511105 SUCCESS 0
2112300399489847297 SUCCESS 0
2112300402195173378 SUCCESS 0
2112300406142013441 SUCCESS 0
2112300410453757954 SUCCESS 0
2112300412513161217 SUCCESS 0
2112300415545643010 SUCCESS 0
2112300418439712769 SUCCESS 0
2112300421715464194 SUCCESS 0
2112300425389674497 SUCCESS 0
2112300428967415810 SUCCESS 0
2112300432620654594 SUCCESS 0
2112300436978536449 SUCCESS 0
2112300440216539138 SUCCESS 0
2112300443555205122 SUCCESS 0
2112300445811740673 SUCCESS 0
2112300450085736449 SUCCESS 0
2112300453072080898 SUCCESS 0
2112300455404113921 SUCCESS 0
2112300457786478594 RUNNING 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Read transcode_task status for all uploaded videos.
2026-10-20 06:01:37 - wait for transcode
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 SUCCESS 0
2112300397086511105 SUCCESS 0
2112300399489847297 SUCCESS 0
2112300402195173378 SUCCESS 0
2112300406142013441 SUCCESS 0
2112300410453757954 SUCCESS 0
2112300412513161217 SUCCESS 0
2112300415545643010 SUCCESS 0
2112300418439712769 SUCCESS 0
2112300421715464194 SUCCESS 0
2112300425389674497 SUCCESS 0
2112300428967415810 SUCCESS 0
2112300432620654594 SUCCESS 0
2112300436978536449 SUCCESS 0
2112300440216539138 SUCCESS 0
2112300443555205122 SUCCESS 0
2112300445811740673 SUCCESS 0
2112300450085736449 SUCCESS 0
2112300453072080898 SUCCESS 0
2112300455404113921 SUCCESS 0
2112300457786478594 RUNNING 0
2112300459971710977 QUEUED 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Transcode progress: 39/45 success, 1 running, 5 queued, 0 failed, 0 missing task rows.
2026-10-20 06:01:47 - transcode status snapshot
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 SUCCESS 0
2112300397086511105 SUCCESS 0
2112300399489847297 SUCCESS 0
2112300402195173378 SUCCESS 0
2112300406142013441 SUCCESS 0
2112300410453757954 SUCCESS 0
2112300412513161217 SUCCESS 0
2112300415545643010 SUCCESS 0
2112300418439712769 SUCCESS 0
2112300421715464194 SUCCESS 0
2112300425389674497 SUCCESS 0
2112300428967415810 SUCCESS 0
2112300432620654594 SUCCESS 0
2112300436978536449 SUCCESS 0
2112300440216539138 SUCCESS 0
2112300443555205122 SUCCESS 0
2112300445811740673 SUCCESS 0
2112300450085736449 SUCCESS 0
2112300453072080898 SUCCESS 0
2112300455404113921 SUCCESS 0
2112300457786478594 SUCCESS 0
2112300459971710977 RUNNING 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Read transcode_task status for all uploaded videos.
2026-10-20 06:01:47 - wait for transcode
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 SUCCESS 0
2112300397086511105 SUCCESS 0
2112300399489847297 SUCCESS 0
2112300402195173378 SUCCESS 0
2112300406142013441 SUCCESS 0
2112300410453757954 SUCCESS 0
2112300412513161217 SUCCESS 0
2112300415545643010 SUCCESS 0
2112300418439712769 SUCCESS 0
2112300421715464194 SUCCESS 0
2112300425389674497 SUCCESS 0
2112300428967415810 SUCCESS 0
2112300432620654594 SUCCESS 0
2112300436978536449 SUCCESS 0
2112300440216539138 SUCCESS 0
2112300443555205122 SUCCESS 0
2112300445811740673 SUCCESS 0
2112300450085736449 SUCCESS 0
2112300453072080898 SUCCESS 0
2112300455404113921 SUCCESS 0
2112300457786478594 SUCCESS 0
2112300459971710977 RUNNING 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Transcode progress: 40/45 success, 1 running, 4 queued, 0 failed, 0 missing task rows.
2026-10-20 06:01:58 - transcode status snapshot
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 SUCCESS 0
2112300397086511105 SUCCESS 0
2112300399489847297 SUCCESS 0
2112300402195173378 SUCCESS 0
2112300406142013441 SUCCESS 0
2112300410453757954 SUCCESS 0
2112300412513161217 SUCCESS 0
2112300415545643010 SUCCESS 0
2112300418439712769 SUCCESS 0
2112300421715464194 SUCCESS 0
2112300425389674497 SUCCESS 0
2112300428967415810 SUCCESS 0
2112300432620654594 SUCCESS 0
2112300436978536449 SUCCESS 0
2112300440216539138 SUCCESS 0
2112300443555205122 SUCCESS 0
2112300445811740673 SUCCESS 0
2112300450085736449 SUCCESS 0
2112300453072080898 SUCCESS 0
2112300455404113921 SUCCESS 0
2112300457786478594 SUCCESS 0
2112300459971710977 RUNNING 0
2112300462115000321 QUEUED 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Read transcode_task status for all uploaded videos.
2026-10-20 06:02:08 - transcode status snapshot
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 SUCCESS 0
2112300397086511105 SUCCESS 0
2112300399489847297 SUCCESS 0
2112300402195173378 SUCCESS 0
2112300406142013441 SUCCESS 0
2112300410453757954 SUCCESS 0
2112300412513161217 SUCCESS 0
2112300415545643010 SUCCESS 0
2112300418439712769 SUCCESS 0
2112300421715464194 SUCCESS 0
2112300425389674497 SUCCESS 0
2112300428967415810 SUCCESS 0
2112300432620654594 SUCCESS 0
2112300436978536449 SUCCESS 0
2112300440216539138 SUCCESS 0
2112300443555205122 SUCCESS 0
2112300445811740673 SUCCESS 0
2112300450085736449 SUCCESS 0
2112300453072080898 SUCCESS 0
2112300455404113921 SUCCESS 0
2112300457786478594 SUCCESS 0
2112300459971710977 SUCCESS 0
2112300462115000321 RUNNING 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Read transcode_task status for all uploaded videos.
2026-10-20 06:02:08 - wait for transcode
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 SUCCESS 0
2112300397086511105 SUCCESS 0
2112300399489847297 SUCCESS 0
2112300402195173378 SUCCESS 0
2112300406142013441 SUCCESS 0
2112300410453757954 SUCCESS 0
2112300412513161217 SUCCESS 0
2112300415545643010 SUCCESS 0
2112300418439712769 SUCCESS 0
2112300421715464194 SUCCESS 0
2112300425389674497 SUCCESS 0
2112300428967415810 SUCCESS 0
2112300432620654594 SUCCESS 0
2112300436978536449 SUCCESS 0
2112300440216539138 SUCCESS 0
2112300443555205122 SUCCESS 0
2112300445811740673 SUCCESS 0
2112300450085736449 SUCCESS 0
2112300453072080898 SUCCESS 0
2112300455404113921 SUCCESS 0
2112300457786478594 SUCCESS 0
2112300459971710977 SUCCESS 0
2112300462115000321 RUNNING 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Transcode progress: 41/45 success, 1 running, 3 queued, 0 failed, 0 missing task rows.
2026-10-20 06:02:18 - transcode status snapshot
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 SUCCESS 0
2112300397086511105 SUCCESS 0
2112300399489847297 SUCCESS 0
2112300402195173378 SUCCESS 0
2112300406142013441 SUCCESS 0
2112300410453757954 SUCCESS 0
2112300412513161217 SUCCESS 0
2112300415545643010 SUCCESS 0
2112300418439712769 SUCCESS 0
2112300421715464194 SUCCESS 0
2112300425389674497 SUCCESS 0
2112300428967415810 SUCCESS 0
2112300432620654594 SUCCESS 0
2112300436978536449 SUCCESS 0
2112300440216539138 SUCCESS 0
2112300443555205122 SUCCESS 0
2112300445811740673 SUCCESS 0
2112300450085736449 SUCCESS 0
2112300453072080898 SUCCESS 0
2112300455404113921 SUCCESS 0
2112300457786478594 SUCCESS 0
2112300459971710977 SUCCESS 0
2112300462115000321 SUCCESS 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Read transcode_task status for all uploaded videos.
2026-10-20 06:02:18 - wait for transcode
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 SUCCESS 0
2112300397086511105 SUCCESS 0
2112300399489847297 SUCCESS 0
2112300402195173378 SUCCESS 0
2112300406142013441 SUCCESS 0
2112300410453757954 SUCCESS 0
2112300412513161217 SUCCESS 0
2112300415545643010 SUCCESS 0
2112300418439712769 SUCCESS 0
2112300421715464194 SUCCESS 0
2112300425389674497 SUCCESS 0
2112300428967415810 SUCCESS 0
2112300432620654594 SUCCESS 0
2112300436978536449 SUCCESS 0
2112300440216539138 SUCCESS 0
2112300443555205122 SUCCESS 0
2112300445811740673 SUCCESS 0
2112300450085736449 SUCCESS 0
2112300453072080898 SUCCESS 0
2112300455404113921 SUCCESS 0
2112300457786478594 SUCCESS 0
2112300459971710977 SUCCESS 0
2112300462115000321 SUCCESS 0
2112300463281016834 QUEUED 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Transcode progress: 42/45 success, 0 running, 3 queued, 0 failed, 0 missing task rows.
2026-10-20 06:02:28 - transcode status snapshot
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 SUCCESS 0
2112300397086511105 SUCCESS 0
2112300399489847297 SUCCESS 0
2112300402195173378 SUCCESS 0
2112300406142013441 SUCCESS 0
2112300410453757954 SUCCESS 0
2112300412513161217 SUCCESS 0
2112300415545643010 SUCCESS 0
2112300418439712769 SUCCESS 0
2112300421715464194 SUCCESS 0
2112300425389674497 SUCCESS 0
2112300428967415810 SUCCESS 0
2112300432620654594 SUCCESS 0
2112300436978536449 SUCCESS 0
2112300440216539138 SUCCESS 0
2112300443555205122 SUCCESS 0
2112300445811740673 SUCCESS 0
2112300450085736449 SUCCESS 0
2112300453072080898 SUCCESS 0
2112300455404113921 SUCCESS 0
2112300457786478594 SUCCESS 0
2112300459971710977 SUCCESS 0
2112300462115000321 SUCCESS 0
2112300463281016834 RUNNING 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Read transcode_task status for all uploaded videos.
2026-10-20 06:02:28 - wait for transcode
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 SUCCESS 0
2112300397086511105 SUCCESS 0
2112300399489847297 SUCCESS 0
2112300402195173378 SUCCESS 0
2112300406142013441 SUCCESS 0
2112300410453757954 SUCCESS 0
2112300412513161217 SUCCESS 0
2112300415545643010 SUCCESS 0
2112300418439712769 SUCCESS 0
2112300421715464194 SUCCESS 0
2112300425389674497 SUCCESS 0
2112300428967415810 SUCCESS 0
2112300432620654594 SUCCESS 0
2112300436978536449 SUCCESS 0
2112300440216539138 SUCCESS 0
2112300443555205122 SUCCESS 0
2112300445811740673 SUCCESS 0
2112300450085736449 SUCCESS 0
2112300453072080898 SUCCESS 0
2112300455404113921 SUCCESS 0
2112300457786478594 SUCCESS 0
2112300459971710977 SUCCESS 0
2112300462115000321 SUCCESS 0
2112300463281016834 RUNNING 0
2112300464522530817 QUEUED 0
2112300466141532161 QUEUED 0
Interpretation: Transcode progress: 42/45 success, 1 running, 2 queued, 0 failed, 0 missing task rows.
2026-10-20 06:02:38 - transcode status snapshot
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 SUCCESS 0
2112300397086511105 SUCCESS 0
2112300399489847297 SUCCESS 0
2112300402195173378 SUCCESS 0
2112300406142013441 SUCCESS 0
2112300410453757954 SUCCESS 0
2112300412513161217 SUCCESS 0
2112300415545643010 SUCCESS 0
2112300418439712769 SUCCESS 0
2112300421715464194 SUCCESS 0
2112300425389674497 SUCCESS 0
2112300428967415810 SUCCESS 0
2112300432620654594 SUCCESS 0
2112300436978536449 SUCCESS 0
2112300440216539138 SUCCESS 0
2112300443555205122 SUCCESS 0
2112300445811740673 SUCCESS 0
2112300450085736449 SUCCESS 0
2112300453072080898 SUCCESS 0
2112300455404113921 SUCCESS 0
2112300457786478594 SUCCESS 0
2112300459971710977 SUCCESS 0
2112300462115000321 SUCCESS 0
2112300463281016834 SUCCESS 0
2112300464522530817 RUNNING 0
2112300466141532161 QUEUED 0
Interpretation: Read transcode_task status for all uploaded videos.
2026-10-20 06:02:38 - wait for transcode
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 SUCCESS 0
2112300397086511105 SUCCESS 0
2112300399489847297 SUCCESS 0
2112300402195173378 SUCCESS 0
2112300406142013441 SUCCESS 0
2112300410453757954 SUCCESS 0
2112300412513161217 SUCCESS 0
2112300415545643010 SUCCESS 0
2112300418439712769 SUCCESS 0
2112300421715464194 SUCCESS 0
2112300425389674497 SUCCESS 0
2112300428967415810 SUCCESS 0
2112300432620654594 SUCCESS 0
2112300436978536449 SUCCESS 0
2112300440216539138 SUCCESS 0
2112300443555205122 SUCCESS 0
2112300445811740673 SUCCESS 0
2112300450085736449 SUCCESS 0
2112300453072080898 SUCCESS 0
2112300455404113921 SUCCESS 0
2112300457786478594 SUCCESS 0
2112300459971710977 SUCCESS 0
2112300462115000321 SUCCESS 0
2112300463281016834 SUCCESS 0
2112300464522530817 RUNNING 0
2112300466141532161 QUEUED 0
Interpretation: Transcode progress: 43/45 success, 1 running, 1 queued, 0 failed, 0 missing task rows.
2026-10-20 06:02:48 - transcode status snapshot
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 SUCCESS 0
2112300397086511105 SUCCESS 0
2112300399489847297 SUCCESS 0
2112300402195173378 SUCCESS 0
2112300406142013441 SUCCESS 0
2112300410453757954 SUCCESS 0
2112300412513161217 SUCCESS 0
2112300415545643010 SUCCESS 0
2112300418439712769 SUCCESS 0
2112300421715464194 SUCCESS 0
2112300425389674497 SUCCESS 0
2112300428967415810 SUCCESS 0
2112300432620654594 SUCCESS 0
2112300436978536449 SUCCESS 0
2112300440216539138 SUCCESS 0
2112300443555205122 SUCCESS 0
2112300445811740673 SUCCESS 0
2112300450085736449 SUCCESS 0
2112300453072080898 SUCCESS 0
2112300455404113921 SUCCESS 0
2112300457786478594 SUCCESS 0
2112300459971710977 SUCCESS 0
2112300462115000321 SUCCESS 0
2112300463281016834 SUCCESS 0
2112300464522530817 RUNNING 0
2112300466141532161 QUEUED 0
Interpretation: Read transcode_task status for all uploaded videos.
2026-10-20 06:02:58 - transcode status snapshot
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 SUCCESS 0
2112300397086511105 SUCCESS 0
2112300399489847297 SUCCESS 0
2112300402195173378 SUCCESS 0
2112300406142013441 SUCCESS 0
2112300410453757954 SUCCESS 0
2112300412513161217 SUCCESS 0
2112300415545643010 SUCCESS 0
2112300418439712769 SUCCESS 0
2112300421715464194 SUCCESS 0
2112300425389674497 SUCCESS 0
2112300428967415810 SUCCESS 0
2112300432620654594 SUCCESS 0
2112300436978536449 SUCCESS 0
2112300440216539138 SUCCESS 0
2112300443555205122 SUCCESS 0
2112300445811740673 SUCCESS 0
2112300450085736449 SUCCESS 0
2112300453072080898 SUCCESS 0
2112300455404113921 SUCCESS 0
2112300457786478594 SUCCESS 0
2112300459971710977 SUCCESS 0
2112300462115000321 SUCCESS 0
2112300463281016834 SUCCESS 0
2112300464522530817 SUCCESS 0
2112300466141532161 RUNNING 0
Interpretation: Read transcode_task status for all uploaded videos.
2026-10-20 06:02:58 - wait for transcode
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 SUCCESS 0
2112300397086511105 SUCCESS 0
2112300399489847297 SUCCESS 0
2112300402195173378 SUCCESS 0
2112300406142013441 SUCCESS 0
2112300410453757954 SUCCESS 0
2112300412513161217 SUCCESS 0
2112300415545643010 SUCCESS 0
2112300418439712769 SUCCESS 0
2112300421715464194 SUCCESS 0
2112300425389674497 SUCCESS 0
2112300428967415810 SUCCESS 0
2112300432620654594 SUCCESS 0
2112300436978536449 SUCCESS 0
2112300440216539138 SUCCESS 0
2112300443555205122 SUCCESS 0
2112300445811740673 SUCCESS 0
2112300450085736449 SUCCESS 0
2112300453072080898 SUCCESS 0
2112300455404113921 SUCCESS 0
2112300457786478594 SUCCESS 0
2112300459971710977 SUCCESS 0
2112300462115000321 SUCCESS 0
2112300463281016834 SUCCESS 0
2112300464522530817 SUCCESS 0
2112300466141532161 RUNNING 0
Interpretation: Transcode progress: 44/45 success, 1 running, 0 queued, 0 failed, 0 missing task rows.
2026-10-20 06:03:08 - transcode status snapshot
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 SUCCESS 0
2112300397086511105 SUCCESS 0
2112300399489847297 SUCCESS 0
2112300402195173378 SUCCESS 0
2112300406142013441 SUCCESS 0
2112300410453757954 SUCCESS 0
2112300412513161217 SUCCESS 0
2112300415545643010 SUCCESS 0
2112300418439712769 SUCCESS 0
2112300421715464194 SUCCESS 0
2112300425389674497 SUCCESS 0
2112300428967415810 SUCCESS 0
2112300432620654594 SUCCESS 0
2112300436978536449 SUCCESS 0
2112300440216539138 SUCCESS 0
2112300443555205122 SUCCESS 0
2112300445811740673 SUCCESS 0
2112300450085736449 SUCCESS 0
2112300453072080898 SUCCESS 0
2112300455404113921 SUCCESS 0
2112300457786478594 SUCCESS 0
2112300459971710977 SUCCESS 0
2112300462115000321 SUCCESS 0
2112300463281016834 SUCCESS 0
2112300464522530817 SUCCESS 0
2112300466141532161 RUNNING 0
Interpretation: Read transcode_task status for all uploaded videos.
2026-10-20 06:03:19 - transcode status snapshot
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 SUCCESS 0
2112300397086511105 SUCCESS 0
2112300399489847297 SUCCESS 0
2112300402195173378 SUCCESS 0
2112300406142013441 SUCCESS 0
2112300410453757954 SUCCESS 0
2112300412513161217 SUCCESS 0
2112300415545643010 SUCCESS 0
2112300418439712769 SUCCESS 0
2112300421715464194 SUCCESS 0
2112300425389674497 SUCCESS 0
2112300428967415810 SUCCESS 0
2112300432620654594 SUCCESS 0
2112300436978536449 SUCCESS 0
2112300440216539138 SUCCESS 0
2112300443555205122 SUCCESS 0
2112300445811740673 SUCCESS 0
2112300450085736449 SUCCESS 0
2112300453072080898 SUCCESS 0
2112300455404113921 SUCCESS 0
2112300457786478594 SUCCESS 0
2112300459971710977 SUCCESS 0
2112300462115000321 SUCCESS 0
2112300463281016834 SUCCESS 0
2112300464522530817 SUCCESS 0
2112300466141532161 SUCCESS 0
Interpretation: Read transcode_task status for all uploaded videos.
2026-10-20 06:03:19 - wait for transcode
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT media_asset_id,status,retry_count,coalesce(error_msg,'') FROM transcode_task WHERE media_asset_id IN ('2112300333169512449','2112300335610597377','2112300337875521538','2112300339666489345','2112300341780418561','2112300344913563649','2112300346582896641','2112300348638105601','2112300351330848770','2112300354833092609','2112300358012375042','2112300360847724546','2112300367785103361','2112300370070999042','2112300373816512514','2112300378312806402','2112300382242869249','2112300386147766274','2112300390572756993','2112300394305687554','2112300397086511105','2112300399489847297','2112300402195173378','2112300406142013441','2112300410453757954','2112300412513161217','2112300415545643010','2112300418439712769','2112300421715464194','2112300425389674497','2112300428967415810','2112300432620654594','2112300436978536449','2112300440216539138','2112300443555205122','2112300445811740673','2112300450085736449','2112300453072080898','2112300455404113921','2112300457786478594','2112300459971710977','2112300462115000321','2112300463281016834','2112300464522530817','2112300466141532161') ORDER BY media_asset_id;"
Raw output:
2112300333169512449 SUCCESS 0
2112300335610597377 SUCCESS 0
2112300337875521538 SUCCESS 0
2112300339666489345 SUCCESS 0
2112300341780418561 SUCCESS 0
2112300344913563649 SUCCESS 0
2112300346582896641 SUCCESS 0
2112300348638105601 SUCCESS 0
2112300351330848770 SUCCESS 0
2112300354833092609 SUCCESS 0
2112300358012375042 SUCCESS 0
2112300360847724546 SUCCESS 0
2112300367785103361 SUCCESS 0
2112300370070999042 SUCCESS 0
2112300373816512514 SUCCESS 0
2112300378312806402 SUCCESS 0
2112300382242869249 SUCCESS 0
2112300386147766274 SUCCESS 0
2112300390572756993 SUCCESS 0
2112300394305687554 SUCCESS 0
2112300397086511105 SUCCESS 0
2112300399489847297 SUCCESS 0
2112300402195173378 SUCCESS 0
2112300406142013441 SUCCESS 0
2112300410453757954 SUCCESS 0
2112300412513161217 SUCCESS 0
2112300415545643010 SUCCESS 0
2112300418439712769 SUCCESS 0
2112300421715464194 SUCCESS 0
2112300425389674497 SUCCESS 0
2112300428967415810 SUCCESS 0
2112300432620654594 SUCCESS 0
2112300436978536449 SUCCESS 0
2112300440216539138 SUCCESS 0
2112300443555205122 SUCCESS 0
2112300445811740673 SUCCESS 0
2112300450085736449 SUCCESS 0
2112300453072080898 SUCCESS 0
2112300455404113921 SUCCESS 0
2112300457786478594 SUCCESS 0
2112300459971710977 SUCCESS 0
2112300462115000321 SUCCESS 0
2112300463281016834 SUCCESS 0
2112300464522530817 SUCCESS 0
2112300466141532161 SUCCESS 0
Interpretation: Transcode progress: 45/45 success, 0 running, 0 queued, 0 failed, 0 missing task rows.
2026-10-20 06:03:19 - backfill episode media links
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "UPDATE transcode_task SET drama_id=2112300341935607809, episode_id=2112300342120157185 WHERE media_asset_id=2112300333169512449;
UPDATE media_rendition SET drama_id=2112300341935607809, episode_id=2112300342120157185 WHERE media_asset_id=2112300333169512449;
UPDATE drama_episode SET video_asset_id=2112300333169512449, hls_url=(SELECT hls_url FROM media_asset WHERE id=2112300333169512449), duration_sec=(SELECT duration_sec FROM media_asset WHERE id=2112300333169512449) WHERE id=2112300342120157185;
UPDATE transcode_task SET drama_id=2112300341935607809, episode_id=2112300342195654658 WHERE media_asset_id=2112300335610597377;
UPDATE media_rendition SET drama_id=2112300341935607809, episode_id=2112300342195654658 WHERE media_asset_id=2112300335610597377;
UPDATE drama_episode SET video_asset_id=2112300335610597377, hls_url=(SELECT hls_url FROM media_asset WHERE id=2112300335610597377), duration_sec=(SELECT duration_sec FROM media_asset WHERE id=2112300335610597377) WHERE id=2112300342195654658;
UPDATE transcode_task SET drama_id=2112300341935607809, episode_id=2112300342245986305 WHERE media_asset_id=2112300337875521538;
UPDATE media_rendition SET drama_id=2112300341935607809, episode_id=2112300342245986305 WHERE media_asset_id=2112300337875521538;
UPDATE drama_episode SET video_asset_id=2112300337875521538, hls_url=(SELECT hls_url FROM media_asset WHERE id=2112300337875521538), duration_sec=(SELECT duration_sec FROM media_asset WHERE id=2112300337875521538) WHERE id=2112300342245986305;
UPDATE transcode_task SET drama_id=2112300341935607809, episode_id=2112300342292123650 WHERE media_asset_id=2112300339666489345;
UPDATE media_rendition SET drama_id=2112300341935607809, episode_id=2112300342292123650 WHERE media_asset_id=2112300339666489345;
UPDATE drama_episode SET video_asset_id=2112300339666489345, hls_url=(SELECT hls_url FROM media_asset WHERE id=2112300339666489345), duration_sec=(SELECT duration_sec FROM media_asset WHERE id=2112300339666489345) WHERE id=2112300342292123650;
UPDATE transcode_task SET drama_id=2112300341935607809, episode_id=2112300342350843905 WHERE media_asset_id=2112300341780418561;
UPDATE media_rendition SET drama_id=2112300341935607809, episode_id=2112300342350843905 WHERE media_asset_id=2112300341780418561;
UPDATE drama_episode SET video_asset_id=2112300341780418561, hls_url=(SELECT hls_url FROM media_asset WHERE id=2112300341780418561), duration_sec=(SELECT duration_sec FROM media_asset WHERE id=2112300341780418561) WHERE id=2112300342350843905;
UPDATE transcode_task SET drama_id=2112300351435706369, episode_id=2112300351523786753 WHERE media_asset_id=2112300344913563649;
UPDATE media_rendition SET drama_id=2112300351435706369, episode_id=2112300351523786753 WHERE media_asset_id=2112300344913563649;
UPDATE drama_episode SET video_asset_id=2112300344913563649, hls_url=(SELECT hls_url FROM media_asset WHERE id=2112300344913563649), duration_sec=(SELECT duration_sec FROM media_asset WHERE id=2112300344913563649) WHERE id=2112300351523786753;
UPDATE transcode_task SET drama_id=2112300351435706369, episode_id=2112300351565729793 WHERE media_asset_id=2112300346582896641;
UPDATE media_rendition SET drama_id=2112300351435706369, episode_id=2112300351565729793 WHERE media_asset_id=2112300346582896641;
UPDATE drama_episode SET video_asset_id=2112300346582896641, hls_url=(SELECT hls_url FROM media_asset WHERE id=2112300346582896641), duration_sec=(SELECT duration_sec FROM media_asset WHERE id=2112300346582896641) WHERE id=2112300351565729793;
UPDATE transcode_task SET drama_id=2112300351435706369, episode_id=2112300351611867138 WHERE media_asset_id=2112300348638105601;
UPDATE media_rendition SET drama_id=2112300351435706369, episode_id=2112300351611867138 WHERE media_asset_id=2112300348638105601;
UPDATE drama_episode SET video_asset_id=2112300348638105601, hls_url=(SELECT hls_url FROM media_asset WHERE id=2112300348638105601), duration_sec=(SELECT duration_sec FROM media_asset WHERE id=2112300348638105601) WHERE id=2112300351611867138;
UPDATE transcode_task SET drama_id=2112300351435706369, episode_id=2112300351653810178 WHERE media_asset_id=2112300351330848770;
UPDATE media_rendition SET drama_id=2112300351435706369, episode_id=2112300351653810178 WHERE media_asset_id=2112300351330848770;
UPDATE drama_episode SET video_asset_id=2112300351330848770, hls_url=(SELECT hls_url FROM media_asset WHERE id=2112300351330848770), duration_sec=(SELECT duration_sec FROM media_asset WHERE id=2112300351330848770) WHERE id=2112300351653810178;
UPDATE transcode_task SET drama_id=2112300370213605378, episode_id=2112300370410737666 WHERE media_asset_id=2112300354833092609;
UPDATE media_rendition SET drama_id=2112300370213605378, episode_id=2112300370410737666 WHERE media_asset_id=2112300354833092609;
UPDATE drama_episode SET video_asset_id=2112300354833092609, hls_url=(SELECT hls_url FROM media_asset WHERE id=2112300354833092609), duration_sec=(SELECT duration_sec FROM media_asset WHERE id=2112300354833092609) WHERE id=2112300370410737666;
UPDATE transcode_task SET drama_id=2112300370213605378, episode_id=2112300370490429442 WHERE media_asset_id=2112300358012375042;
UPDATE media_rendition SET drama_id=2112300370213605378, episode_id=2112300370490429442 WHERE media_asset_id=2112300358012375042;
UPDATE drama_episode SET video_asset_id=2112300358012375042, hls_url=(SELECT hls_url FROM media_asset WHERE id=2112300358012375042), duration_sec=(SELECT duration_sec FROM media_asset WHERE id=2112300358012375042) WHERE id=2112300370490429442;
UPDATE transcode_task SET drama_id=2112300370213605378, episode_id=2112300370595287041 WHERE media_asset_id=2112300360847724546;
UPDATE media_rendition SET drama_id=2112300370213605378, episode_id=2112300370595287041 WHERE media_asset_id=2112300360847724546;
UPDATE drama_episode SET video_asset_id=2112300360847724546, hls_url=(SELECT hls_url FROM media_asset WHERE id=2112300360847724546), duration_sec=(SELECT duration_sec FROM media_asset WHERE id=2112300360847724546) WHERE id=2112300370595287041;
UPDATE transcode_task SET drama_id=2112300370213605378, episode_id=2112300370670784514 WHERE media_asset_id=2112300367785103361;
UPDATE media_rendition SET drama_id=2112300370213605378, episode_id=2112300370670784514 WHERE media_asset_id=2112300367785103361;
UPDATE drama_episode SET video_asset_id=2112300367785103361, hls_url=(SELECT hls_url FROM media_asset WHERE id=2112300367785103361), duration_sec=(SELECT duration_sec FROM media_asset WHERE id=2112300367785103361) WHERE id=2112300370670784514;
UPDATE transcode_task SET drama_id=2112300370213605378, episode_id=2112300370767253506 WHERE media_asset_id=2112300370070999042;
UPDATE media_rendition SET drama_id=2112300370213605378, episode_id=2112300370767253506 WHERE media_asset_id=2112300370070999042;
UPDATE drama_episode SET video_asset_id=2112300370070999042, hls_url=(SELECT hls_url FROM media_asset WHERE id=2112300370070999042), duration_sec=(SELECT duration_sec FROM media_asset WHERE id=2112300370070999042) WHERE id=2112300370767253506;
UPDATE transcode_task SET drama_id=2112300386319732737, episode_id=2112300386458144769 WHERE media_asset_id=2112300373816512514;
UPDATE media_rendition SET drama_id=2112300386319732737, episode_id=2112300386458144769 WHERE media_asset_id=2112300373816512514;
UPDATE drama_episode SET video_asset_id=2112300373816512514, hls_url=(SELECT hls_url FROM media_asset WHERE id=2112300373816512514), duration_sec=(SELECT duration_sec FROM media_asset WHERE id=2112300373816512514) WHERE id=2112300386458144769;
UPDATE transcode_task SET drama_id=2112300386319732737, episode_id=2112300386525253634 WHERE media_asset_id=2112300378312806402;
UPDATE media_rendition SET drama_id=2112300386319732737, episode_id=2112300386525253634 WHERE media_asset_id=2112300378312806402;
UPDATE drama_episode SET video_asset_id=2112300378312806402, hls_url=(SELECT hls_url FROM media_asset WHERE id=2112300378312806402), duration_sec=(SELECT duration_sec FROM media_asset WHERE id=2112300378312806402) WHERE id=2112300386525253634;
UPDATE transcode_task SET drama_id=2112300386319732737, episode_id=2112300386596556802 WHERE media_asset_id=2112300382242869249;
UPDATE media_rendition SET drama_id=2112300386319732737, episode_id=2112300386596556802 WHERE media_asset_id=2112300382242869249;
UPDATE drama_episode SET video_asset_id=2112300382242869249, hls_url=(SELECT hls_url FROM media_asset WHERE id=2112300382242869249), duration_sec=(SELECT duration_sec FROM media_asset WHERE id=2112300382242869249) WHERE id=2112300386596556802;
UPDATE transcode_task SET drama_id=2112300386319732737, episode_id=2112300386676248577 WHERE media_asset_id=2112300386147766274;
UPDATE media_rendition SET drama_id=2112300386319732737, episode_id=2112300386676248577 WHERE media_asset_id=2112300386147766274;
UPDATE drama_episode SET video_asset_id=2112300386147766274, hls_url=(SELECT hls_url FROM media_asset WHERE id=2112300386147766274), duration_sec=(SELECT duration_sec FROM media_asset WHERE id=2112300386147766274) WHERE id=2112300386676248577;
UPDATE transcode_task SET drama_id=2112300402325196801, episode_id=2112300402476191745 WHERE media_asset_id=2112300390572756993;
UPDATE media_rendition SET drama_id=2112300402325196801, episode_id=2112300402476191745 WHERE media_asset_id=2112300390572756993;
UPDATE drama_episode SET video_asset_id=2112300390572756993, hls_url=(SELECT hls_url FROM media_asset WHERE id=2112300390572756993), duration_sec=(SELECT duration_sec FROM media_asset WHERE id=2112300390572756993) WHERE id=2112300402476191745;
UPDATE transcode_task SET drama_id=2112300402325196801, episode_id=2112300402555883522 WHERE media_asset_id=2112300394305687554;
UPDATE media_rendition SET drama_id=2112300402325196801, episode_id=2112300402555883522 WHERE media_asset_id=2112300394305687554;
UPDATE drama_episode SET video_asset_id=2112300394305687554, hls_url=(SELECT hls_url FROM media_asset WHERE id=2112300394305687554), duration_sec=(SELECT duration_sec FROM media_asset WHERE id=2112300394305687554) WHERE id=2112300402555883522;
UPDATE transcode_task SET drama_id=2112300402325196801, episode_id=2112300402635575298 WHERE media_asset_id=2112300397086511105;
UPDATE media_rendition SET drama_id=2112300402325196801, episode_id=2112300402635575298 WHERE media_asset_id=2112300397086511105;
UPDATE drama_episode SET video_asset_id=2112300397086511105, hls_url=(SELECT hls_url FROM media_asset WHERE id=2112300397086511105), duration_sec=(SELECT duration_sec FROM media_asset WHERE id=2112300397086511105) WHERE id=2112300402635575298;
UPDATE transcode_task SET drama_id=2112300402325196801, episode_id=2112300402711072769 WHERE media_asset_id=2112300399489847297;
UPDATE media_rendition SET drama_id=2112300402325196801, episode_id=2112300402711072769 WHERE media_asset_id=2112300399489847297;
UPDATE drama_episode SET video_asset_id=2112300399489847297, hls_url=(SELECT hls_url FROM media_asset WHERE id=2112300399489847297), duration_sec=(SELECT duration_sec FROM media_asset WHERE id=2112300399489847297) WHERE id=2112300402711072769;
UPDATE transcode_task SET drama_id=2112300402325196801, episode_id=2112300402778181634 WHERE media_asset_id=2112300402195173378;
UPDATE media_rendition SET drama_id=2112300402325196801, episode_id=2112300402778181634 WHERE media_asset_id=2112300402195173378;
UPDATE drama_episode SET video_asset_id=2112300402195173378, hls_url=(SELECT hls_url FROM media_asset WHERE id=2112300402195173378), duration_sec=(SELECT duration_sec FROM media_asset WHERE id=2112300402195173378) WHERE id=2112300402778181634;
UPDATE transcode_task SET drama_id=2112300415688249345, episode_id=2112300415818272770 WHERE media_asset_id=2112300406142013441;
UPDATE media_rendition SET drama_id=2112300415688249345, episode_id=2112300415818272770 WHERE media_asset_id=2112300406142013441;
UPDATE drama_episode SET video_asset_id=2112300406142013441, hls_url=(SELECT hls_url FROM media_asset WHERE id=2112300406142013441), duration_sec=(SELECT duration_sec FROM media_asset WHERE id=2112300406142013441) WHERE id=2112300415818272770;
UPDATE transcode_task SET drama_id=2112300415688249345, episode_id=2112300415885381633 WHERE media_asset_id=2112300410453757954;
UPDATE media_rendition SET drama_id=2112300415688249345, episode_id=2112300415885381633 WHERE media_asset_id=2112300410453757954;
UPDATE drama_episode SET video_asset_id=2112300410453757954, hls_url=(SELECT hls_url FROM media_asset WHERE id=2112300410453757954), duration_sec=(SELECT duration_sec FROM media_asset WHERE id=2112300410453757954) WHERE id=2112300415885381633;
UPDATE transcode_task SET drama_id=2112300415688249345, episode_id=2112300415944101889 WHERE media_asset_id=2112300412513161217;
UPDATE media_rendition SET drama_id=2112300415688249345, episode_id=2112300415944101889 WHERE media_asset_id=2112300412513161217;
UPDATE drama_episode SET video_asset_id=2112300412513161217, hls_url=(SELECT hls_url FROM media_asset WHERE id=2112300412513161217), duration_sec=(SELECT duration_sec FROM media_asset WHERE id=2112300412513161217) WHERE id=2112300415944101889;
UPDATE transcode_task SET drama_id=2112300415688249345, episode_id=2112300416011210754 WHERE media_asset_id=2112300415545643010;
UPDATE media_rendition SET drama_id=2112300415688249345, episode_id=2112300416011210754 WHERE media_asset_id=2112300415545643010;
UPDATE drama_episode SET video_asset_id=2112300415545643010, hls_url=(SELECT hls_url FROM media_asset WHERE id=2112300415545643010), duration_sec=(SELECT duration_sec FROM media_asset WHERE id=2112300415545643010) WHERE id=2112300416011210754;
UPDATE transcode_task SET drama_id=2112300432767455234, episode_id=2112300432893284353 WHERE media_asset_id=2112300418439712769;
UPDATE media_rendition SET drama_id=2112300432767455234, episode_id=2112300432893284353 WHERE media_asset_id=2112300418439712769;
UPDATE drama_episode SET video_asset_id=2112300418439712769, hls_url=(SELECT hls_url FROM media_asset WHERE id=2112300418439712769), duration_sec=(SELECT duration_sec FROM media_asset WHERE id=2112300418439712769) WHERE id=2112300432893284353;
UPDATE transcode_task SET drama_id=2112300432767455234, episode_id=2112300432964587521 WHERE media_asset_id=2112300421715464194;
UPDATE media_rendition SET drama_id=2112300432767455234, episode_id=2112300432964587521 WHERE media_asset_id=2112300421715464194;
UPDATE drama_episode SET video_asset_id=2112300421715464194, hls_url=(SELECT hls_url FROM media_asset WHERE id=2112300421715464194), duration_sec=(SELECT duration_sec FROM media_asset WHERE id=2112300421715464194) WHERE id=2112300432964587521;
UPDATE transcode_task SET drama_id=2112300432767455234, episode_id=2112300433031696385 WHERE media_asset_id=2112300425389674497;
UPDATE media_rendition SET drama_id=2112300432767455234, episode_id=2112300433031696385 WHERE media_asset_id=2112300425389674497;
UPDATE drama_episode SET video_asset_id=2112300425389674497, hls_url=(SELECT hls_url FROM media_asset WHERE id=2112300425389674497), duration_sec=(SELECT duration_sec FROM media_asset WHERE id=2112300425389674497) WHERE id=2112300433031696385;
UPDATE transcode_task SET drama_id=2112300432767455234, episode_id=2112300433102999553 WHERE media_asset_id=2112300428967415810;
UPDATE media_rendition SET drama_id=2112300432767455234, episode_id=2112300433102999553 WHERE media_asset_id=2112300428967415810;
UPDATE drama_episode SET video_asset_id=2112300428967415810, hls_url=(SELECT hls_url FROM media_asset WHERE id=2112300428967415810), duration_sec=(SELECT duration_sec FROM media_asset WHERE id=2112300428967415810) WHERE id=2112300433102999553;
UPDATE transcode_task SET drama_id=2112300432767455234, episode_id=2112300433174302721 WHERE media_asset_id=2112300432620654594;
UPDATE media_rendition SET drama_id=2112300432767455234, episode_id=2112300433174302721 WHERE media_asset_id=2112300432620654594;
UPDATE drama_episode SET video_asset_id=2112300432620654594, hls_url=(SELECT hls_url FROM media_asset WHERE id=2112300432620654594), duration_sec=(SELECT duration_sec FROM media_asset WHERE id=2112300432620654594) WHERE id=2112300433174302721;
UPDATE transcode_task SET drama_id=2112300445958541313, episode_id=2112300446101147650 WHERE media_asset_id=2112300436978536449;
UPDATE media_rendition SET drama_id=2112300445958541313, episode_id=2112300446101147650 WHERE media_asset_id=2112300436978536449;
UPDATE drama_episode SET video_asset_id=2112300436978536449, hls_url=(SELECT hls_url FROM media_asset WHERE id=2112300436978536449), duration_sec=(SELECT duration_sec FROM media_asset WHERE id=2112300436978536449) WHERE id=2112300446101147650;
UPDATE transcode_task SET drama_id=2112300445958541313, episode_id=2112300446164062209 WHERE media_asset_id=2112300440216539138;
UPDATE media_rendition SET drama_id=2112300445958541313, episode_id=2112300446164062209 WHERE media_asset_id=2112300440216539138;
UPDATE drama_episode SET video_asset_id=2112300440216539138, hls_url=(SELECT hls_url FROM media_asset WHERE id=2112300440216539138), duration_sec=(SELECT duration_sec FROM media_asset WHERE id=2112300440216539138) WHERE id=2112300446164062209;
UPDATE transcode_task SET drama_id=2112300445958541313, episode_id=2112300446239559681 WHERE media_asset_id=2112300443555205122;
UPDATE media_rendition SET drama_id=2112300445958541313, episode_id=2112300446239559681 WHERE media_asset_id=2112300443555205122;
UPDATE drama_episode SET video_asset_id=2112300443555205122, hls_url=(SELECT hls_url FROM media_asset WHERE id=2112300443555205122), duration_sec=(SELECT duration_sec FROM media_asset WHERE id=2112300443555205122) WHERE id=2112300446239559681;
UPDATE transcode_task SET drama_id=2112300445958541313, episode_id=2112300446319251457 WHERE media_asset_id=2112300445811740673;
UPDATE media_rendition SET drama_id=2112300445958541313, episode_id=2112300446319251457 WHERE media_asset_id=2112300445811740673;
UPDATE drama_episode SET video_asset_id=2112300445811740673, hls_url=(SELECT hls_url FROM media_asset WHERE id=2112300445811740673), duration_sec=(SELECT duration_sec FROM media_asset WHERE id=2112300445811740673) WHERE id=2112300446319251457;
UPDATE transcode_task SET drama_id=2112300460047208449, episode_id=2112300460118511618 WHERE media_asset_id=2112300450085736449;
UPDATE media_rendition SET drama_id=2112300460047208449, episode_id=2112300460118511618 WHERE media_asset_id=2112300450085736449;
UPDATE drama_episode SET video_asset_id=2112300450085736449, hls_url=(SELECT hls_url FROM media_asset WHERE id=2112300450085736449), duration_sec=(SELECT duration_sec FROM media_asset WHERE id=2112300450085736449) WHERE id=2112300460118511618;
UPDATE transcode_task SET drama_id=2112300460047208449, episode_id=2112300460156260353 WHERE media_asset_id=2112300453072080898;
UPDATE media_rendition SET drama_id=2112300460047208449, episode_id=2112300460156260353 WHERE media_asset_id=2112300453072080898;
UPDATE drama_episode SET video_asset_id=2112300453072080898, hls_url=(SELECT hls_url FROM media_asset WHERE id=2112300453072080898), duration_sec=(SELECT duration_sec FROM media_asset WHERE id=2112300453072080898) WHERE id=2112300460156260353;
UPDATE transcode_task SET drama_id=2112300460047208449, episode_id=2112300460189814786 WHERE media_asset_id=2112300455404113921;
UPDATE media_rendition SET drama_id=2112300460047208449, episode_id=2112300460189814786 WHERE media_asset_id=2112300455404113921;
UPDATE drama_episode SET video_asset_id=2112300455404113921, hls_url=(SELECT hls_url FROM media_asset WHERE id=2112300455404113921), duration_sec=(SELECT duration_sec FROM media_asset WHERE id=2112300455404113921) WHERE id=2112300460189814786;
UPDATE transcode_task SET drama_id=2112300460047208449, episode_id=2112300460223369217 WHERE media_asset_id=2112300457786478594;
UPDATE media_rendition SET drama_id=2112300460047208449, episode_id=2112300460223369217 WHERE media_asset_id=2112300457786478594;
UPDATE drama_episode SET video_asset_id=2112300457786478594, hls_url=(SELECT hls_url FROM media_asset WHERE id=2112300457786478594), duration_sec=(SELECT duration_sec FROM media_asset WHERE id=2112300457786478594) WHERE id=2112300460223369217;
UPDATE transcode_task SET drama_id=2112300460047208449, episode_id=2112300460261117954 WHERE media_asset_id=2112300459971710977;
UPDATE media_rendition SET drama_id=2112300460047208449, episode_id=2112300460261117954 WHERE media_asset_id=2112300459971710977;
UPDATE drama_episode SET video_asset_id=2112300459971710977, hls_url=(SELECT hls_url FROM media_asset WHERE id=2112300459971710977), duration_sec=(SELECT duration_sec FROM media_asset WHERE id=2112300459971710977) WHERE id=2112300460261117954;
UPDATE transcode_task SET drama_id=2112300466212835330, episode_id=2112300466275749890 WHERE media_asset_id=2112300462115000321;
UPDATE media_rendition SET drama_id=2112300466212835330, episode_id=2112300466275749890 WHERE media_asset_id=2112300462115000321;
UPDATE drama_episode SET video_asset_id=2112300462115000321, hls_url=(SELECT hls_url FROM media_asset WHERE id=2112300462115000321), duration_sec=(SELECT duration_sec FROM media_asset WHERE id=2112300462115000321) WHERE id=2112300466275749890;
UPDATE transcode_task SET drama_id=2112300466212835330, episode_id=2112300466317692930 WHERE media_asset_id=2112300463281016834;
UPDATE media_rendition SET drama_id=2112300466212835330, episode_id=2112300466317692930 WHERE media_asset_id=2112300463281016834;
UPDATE drama_episode SET video_asset_id=2112300463281016834, hls_url=(SELECT hls_url FROM media_asset WHERE id=2112300463281016834), duration_sec=(SELECT duration_sec FROM media_asset WHERE id=2112300463281016834) WHERE id=2112300466317692930;
UPDATE transcode_task SET drama_id=2112300466212835330, episode_id=2112300466355441666 WHERE media_asset_id=2112300464522530817;
UPDATE media_rendition SET drama_id=2112300466212835330, episode_id=2112300466355441666 WHERE media_asset_id=2112300464522530817;
UPDATE drama_episode SET video_asset_id=2112300464522530817, hls_url=(SELECT hls_url FROM media_asset WHERE id=2112300464522530817), duration_sec=(SELECT duration_sec FROM media_asset WHERE id=2112300464522530817) WHERE id=2112300466355441666;
UPDATE transcode_task SET drama_id=2112300466212835330, episode_id=2112300466443522050 WHERE media_asset_id=2112300466141532161;
UPDATE media_rendition SET drama_id=2112300466212835330, episode_id=2112300466443522050 WHERE media_asset_id=2112300466141532161;
UPDATE drama_episode SET video_asset_id=2112300466141532161, hls_url=(SELECT hls_url FROM media_asset WHERE id=2112300466141532161), duration_sec=(SELECT duration_sec FROM media_asset WHERE id=2112300466141532161) WHERE id=2112300466443522050;
"
Raw output:
UPDATE 1
UPDATE 4
UPDATE 1
UPDATE 1
UPDATE 4
UPDATE 1
UPDATE 1
UPDATE 4
UPDATE 1
UPDATE 1
UPDATE 4
UPDATE 1
UPDATE 1
UPDATE 4
UPDATE 1
UPDATE 1
UPDATE 4
UPDATE 1
UPDATE 1
UPDATE 4
UPDATE 1
UPDATE 1
UPDATE 4
UPDATE 1
UPDATE 1
UPDATE 4
UPDATE 1
UPDATE 1
UPDATE 4
UPDATE 1
UPDATE 1
UPDATE 4
UPDATE 1
UPDATE 1
UPDATE 4
UPDATE 1
UPDATE 1
UPDATE 4
UPDATE 1
UPDATE 1
UPDATE 4
UPDATE 1
UPDATE 1
UPDATE 4
UPDATE 1
UPDATE 1
UPDATE 4
UPDATE 1
UPDATE 1
UPDATE 4
UPDATE 1
UPDATE 1
UPDATE 4
UPDATE 1
UPDATE 1
UPDATE 4
UPDATE 1
UPDATE 1
UPDATE 4
UPDATE 1
UPDATE 1
UPDATE 4
UPDATE 1
UPDATE 1
UPDATE 4
UPDATE 1
UPDATE 1
UPDATE 4
UPDATE 1
UPDATE 1
UPDATE 4
UPDATE 1
UPDATE 1
UPDATE 4
UPDATE 1
UPDATE 1
UPDATE 4
UPDATE 1
UPDATE 1
UPDATE 4
UPDATE 1
UPDATE 1
UPDATE 4
UPDATE 1
UPDATE 1
UPDATE 4
UPDATE 1
UPDATE 1
UPDATE 4
UPDATE 1
UPDATE 1
UPDATE 4
UPDATE 1
UPDATE 1
UPDATE 4
UPDATE 1
UPDATE 1
UPDATE 4
UPDATE 1
UPDATE 1
UPDATE 4
UPDATE 1
UPDATE 1
UPDATE 4
UPDATE 1
UPDATE 1
UPDATE 4
UPDATE 1
UPDATE 1
UPDATE 4
UPDATE 1
UPDATE 1
UPDATE 4
UPDATE 1
UPDATE 1
UPDATE 4
UPDATE 1
UPDATE 1
UPDATE 4
UPDATE 1
UPDATE 1
UPDATE 4
UPDATE 1
UPDATE 1
UPDATE 4
UPDATE 1
UPDATE 1
UPDATE 4
UPDATE 1
UPDATE 1
UPDATE 4
UPDATE 1
UPDATE 1
UPDATE 4
UPDATE 1
Interpretation: Linked successful HLS renditions and transcode tasks back to drama episodes for client playback.
2026-10-20 06:03:19 - client feed verification
Command:
GET http://127.0.0.1:8081/app/home/feed
Raw output:
{"code":0,"message":"ok","data":{"banners":[],"sections":[{"code":"hot","title":"热门推荐","dramas":[{"id":"2112300341935607809","title":"Cinta Sang Ceo","cover":"/files/drama_cover/202610/0ca73f7e66e64c82be82cb09504db6f6.jpg","synopsis":"总裁的秘密爱","genre":"Urban Romance","category":"都市情感","totalEpisodes":5,"isHot":true,"viewCount":"0","language":"id-ID","preview":{"id":"2112300342120157185","number":1,"title":"Episode 1","duration":"03:48","durationSec":228,"isFree":true,"locked":false,"unlockCoin":10,"playUrl":"/files/transcoded/2112300333194678273/master.m3u8?e=1792448299&s=191e871ebeb57d8e766dc38106c26408d18c6080e95e661ab823330b27d732f7"}},{"id":"2112300351435706369","title":"Istri Yang Bangkit","cover":"/files/drama_cover/202610/4dd149df699b48849a1b22960e35e66b.jpg","synopsis":"被背叛的妻子","genre":"Revenge Suspense","category":"悬疑复仇","totalEpisodes":4,"isHot":true,"viewCount":"0","language":"id-ID","preview":{"id":"2112300351523786753","number":1,"title":"Episode 1","duration":"02:10","durationSec":130,"isFree":true,"locked":false,"unlockCoin":10,"playUrl":"/files/transcoded/2112300344921952258/master.m3u8?e=1792448299&s=c79f5f6cf95149c2310c57e0484752153907950e80c1f96567c02df8bbc27b82"}},{"id":"2112300370213605378","title":"Pewaris Hilang","cover":"/files/drama_cover/202610/93e8ebda36794f3fac90cf419ce71792.jpg","synopsis":"失落的继承人","genre":"Rebirth Comeback","category":"重生逆袭","totalEpisodes":5,"isHot":true,"viewCount":"0","language":"id-ID","preview":{"id":"2112300370410737666","number":1,"title":"Episode 1","duration":"01:31","durationSec":91,"isFree":true,"locked":false,"unlockCoin":10,"playUrl":"/files/transcoded/2112300354841481218/master.m3u8?e=1792448299&s=de4c82b0bd7ad7b73f9592b6f7a4c6f365cb448ffc889c7b21193b6e6a6182b5"}},{"id":"1","title":"替嫁新娘:总裁的掌心宠","cover":"","synopsis":"一场意外替嫁,让她成为冷面总裁的契约新娘。","genre":"都市情感","category":"都市情感","totalEpisodes":68,"isHot":true,"viewCount":"2400000","language":"zh-CN","preview":null},{"id":"5","title":"闪婚后,傅先生每天都在撒糖1","cover":"","synopsis":"一纸婚约,开启了甜蜜又心动的同居生活。","genre":"都市情感","category":"都市情感","totalEpisodes":1,"isHot":true,"viewCount":"3100000","language":"zh-CN","preview":null},{"id":"2112110445962858498","title":"周卫东测试","cover":"/files/drama_cover/202610/ff83c789b59c4982be317e91f14bd36e.jpg","synopsis":"测试","genre":"都市情感","category":"都市情感","totalEpisodes":4,"isHot":true,"viewCount":"0","language":"zh-CN","preview":{"id":"2112120981442138113","number":1,"title":"第一集","duration":"03:48","durationSec":228,"isFree":true,"locked":false,"unlockCoin":0,"playUrl":"/files/transcoded/2112115664016773122/master.m3u8?e=1792448299&s=f87c65c1778e888d5fdb94067ba92cec3feced8f0eae689a8ebc12083018112f"}}]},{"code":"new","title":"新剧上线","dramas":[{"id":"2112300466212835330","title":"Pengawal Cintaku","cover":"/files/drama_cover/202610/d78b16ea924a4408a4f4d11e65d7b6e0.jpg","synopsis":"我的保镖恋人","genre":"Sweet Romance","category":"甜宠爱情","totalEpisodes":4,"isHot":false,"viewCount":"0","language":"id-ID","preview":{"id":"2112300466275749890","number":1,"title":"Episode 1","duration":"01:41","durationSec":101,"isFree":true,"locked":false,"unlockCoin":10,"playUrl":"/files/transcoded/2112300462119194626/master.m3u8?e=1792448299&s=825a2f60aa039fbe615b8bfd10f5050adbdd6f247e041402e4ab2ddde5de4d56"}},{"id":"2112300460047208449","title":"Kembar Rahasia","cover":"/files/drama_cover/202610/9d67d294e430421db8e3f383b1086575.jpg","synopsis":"秘密双胞胎","genre":"Revenge Suspense","category":"悬疑复仇","totalEpisodes":5,"isHot":false,"viewCount":"0","language":"id-ID","preview":{"id":"2112300460118511618","number":1,"title":"Episode 1","duration":"01:54","durationSec":114,"isFree":true,"locked":false,"unlockCoin":10,"playUrl":"/files/transcoded/2112300450094125057/master.m3u8?e=1792448299&s=b55430f9ab39d6f6eaf4aa2c388499ba8f03b7afc023cdb1c84962076ad80c2b"}},{"id":"2112300445958541313","title":"Gadis Pembantu","cover":"/files/drama_cover/202610/407513b839224e3fb7e87563c90fd93d.jpg","synopsis":"女仆与亿万富翁","genre":"Urban Romance","category":"都市情感","totalEpisodes":4,"isHot":false,"viewCount":"0","language":"id-ID","preview":{"id":"2112300446101147650","number":1,"title":"Episode 1","duration":"02:01","durationSec":121,"isFree":true,"locked":false,"unlockCoin":10,"playUrl":"/files/transcoded/2112300436991119362/master.m3u8?e=1792448299&s=d4876de165ffc57588454047120e2f76be952aa9025fc2994b34120dcc6bac97"}},{"id":"2112300432767455234","title":"Kembali Untukmu","cover":"/files/drama_cover/202610/8609c882fb084c7cb72f9d481c6ce525.jpg","synopsis":"为你重来","genre":"Rebirth Comeback","category":"重生逆袭","totalEpisodes":5,"isHot":false,"viewCount":"0","language":"id-ID","preview":{"id":"2112300432893284353","number":1,"title":"Episode 1","duration":"01:07","durationSec":67,"isFree":true,"locked":false,"unlockCoin":10,"playUrl":"/files/transcoded/2112300418448101377/master.m3u8?e=1792448299&s=68d46e1cf955054485ec2ec71d85cbb12a954974c579fdcc0430607aa0f7a16e"}},{"id":"2112300415688249345","title":"Dokter Hatiku","cover":"/files/drama_cover/202610/8a7c339a7af84b2b8aa97772636935d3.jpg","synopsis":"我心中的医生","genre":"Urban Romance","category":"都市情感","totalEpisodes":4,"isHot":false,"viewCount":"0","language":"id-ID","preview":{"id":"2112300415818272770","number":1,"title":"Episode 1","duration":"01:30","durationSec":90,"isFree":true,"locked":false,"unlockCoin":10,"playUrl":"/files/transcoded/2112300406150402050/master.m3u8?e=1792448299&s=6b7b38a2134f8770d97e1bb01679cbcd438c32acdc7b857ac46c1452bbaf6383"}},{"id":"2112300402325196801","title":"Alpha Terakhir","cover":"/files/drama_cover/202610/1074a29a9f83448fbf664c75a290194e.jpg","synopsis":"最后的Alpha","genre":"Sweet Romance","category":"甜宠爱情","totalEpisodes":5,"isHot":false,"viewCount":"0","language":"id-ID","preview":{"id":"2112300402476191745","number":1,"title":"Episode 1","duration":"01:50","durationSec":110,"isFree":true,"locked":false,"unlockCoin":10,"playUrl":"/files/transcoded/2112300390585339906/master.m3u8?e=1792448299&s=aa08f027d2f733de8877d393a9e74fd25dc66e5d21e16f31541a581f4ba6848a"}}]},{"code":"category-1","title":"都市情感","dramas":[{"id":"2112300341935607809","title":"Cinta Sang Ceo","cover":"/files/drama_cover/202610/0ca73f7e66e64c82be82cb09504db6f6.jpg","synopsis":"总裁的秘密爱","genre":"Urban Romance","category":"都市情感","totalEpisodes":5,"isHot":true,"viewCount":"0","language":"id-ID","preview":{"id":"2112300342120157185","number":1,"title":"Episode 1","duration":"03:48","durationSec":228,"isFree":true,"locked":false,"unlockCoin":10,"playUrl":"/files/transcoded/2112300333194678273/master.m3u8?e=1792448299&s=191e871ebeb57d8e766dc38106c26408d18c6080e95e661ab823330b27d732f7"}},{"id":"2112300415688249345","title":"Dokter Hatiku","cover":"/files/drama_cover/202610/8a7c339a7af84b2b8aa97772636935d3.jpg","synopsis":"我心中的医生","genre":"Urban Romance","category":"都市情感","totalEpisodes":4,"isHot":false,"viewCount":"0","language":"id-ID","preview":{"id":"2112300415818272770","number":1,"title":"Episode 1","duration":"01:30","durationSec":90,"isFree":true,"locked":false,"unlockCoin":10,"playUrl":"/files/transcoded/2112300406150402050/master.m3u8?e=1792448299&s=6b7b38a2134f8770d97e1bb01679cbcd438c32acdc7b857ac46c1452bbaf6383"}},{"id":"2112300445958541313","title":"Gadis Pembantu","cover":"/files/drama_cover/202610/407513b839224e3fb7e87563c90fd93d.jpg","synopsis":"女仆与亿万富翁","genre":"Urban Romance","category":"都市情感","totalEpisodes":4,"isHot":false,"viewCount":"0","language":"id-ID","preview":{"id":"2112300446101147650","number":1,"title":"Episode 1","duration":"02:01","durationSec":121,"isFree":true,"locked":false,"unlockCoin":10,"playUrl":"/files/transcoded/2112300436991119362/master.m3u8?e=1792448299&s=d4876de165ffc57588454047120e2f76be952aa9025fc2994b34120dcc6bac97"}},{"id":"1","title":"替嫁新娘:总裁的掌心宠","cover":"","synopsis":"一场意外替嫁,让她成为冷面总裁的契约新娘。","genre":"都市情感","category":"都市情感","totalEpisodes":68,"isHot":true,"viewCount":"2400000","language":"zh-CN","preview":null},{"id":"5","title":"闪婚后,傅先生每天都在撒糖1","cover":"","synopsis":"一纸婚约,开启了甜蜜又心动的同居生活。","genre":"都市情感","category":"都市情感","totalEpisodes":1,"isHot":true,"viewCount":"3100000","language":"zh-CN","preview":null},{"id":"2112110445962858498","title":"周卫东测试","cover":"/files/drama_cover/202610/ff83c789b59c4982be317e91f14bd36e.jpg","synopsis":"测试","genre":"都市情感","category":"都市情感","totalEpisodes":4,"isHot":true,"viewCount":"0","language":"zh-CN","preview":{"id":"2112120981442138113","number":1,"title":"第一集","duration":"03:48","durationSec":228,"isFree":true,"locked":false,"unlockCoin":0,"playUrl":"/files/transcoded/2112115664016773122/master.m3u8?e=1792448299&s=f87c65c1778e888d5fdb94067ba92cec3feced8f0eae689a8ebc12083018112f"}}]},{"code":"category-2","title":"重生逆袭","dramas":[{"id":"2112300370213605378","title":"Pewaris Hilang","cover":"/files/drama_cover/202610/93e8ebda36794f3fac90cf419ce71792.jpg","synopsis":"失落的继承人","genre":"Rebirth Comeback","category":"重生逆袭","totalEpisodes":5,"isHot":true,"viewCount":"0","language":"id-ID","preview":{"id":"2112300370410737666","number":1,"title":"Episode 1","duration":"01:31","durationSec":91,"isFree":true,"locked":false,"unlockCoin":10,"playUrl":"/files/transcoded/2112300354841481218/master.m3u8?e=1792448299&s=de4c82b0bd7ad7b73f9592b6f7a4c6f365cb448ffc889c7b21193b6e6a6182b5"}},{"id":"2112300432767455234","title":"Kembali Untukmu","cover":"/files/drama_cover/202610/8609c882fb084c7cb72f9d481c6ce525.jpg","synopsis":"为你重来","genre":"Rebirth Comeback","category":"重生逆袭","totalEpisodes":5,"isHot":false,"viewCount":"0","language":"id-ID","preview":{"id":"2112300432893284353","number":1,"title":"Episode 1","duration":"01:07","durationSec":67,"isFree":true,"locked":false,"unlockCoin":10,"playUrl":"/files/transcoded/2112300418448101377/master.m3u8?e=1792448299&s=68d46e1cf955054485ec2ec71d85cbb12a954974c579fdcc0430607aa0f7a16e"}}]},{"code":"category-3","title":"甜宠爱情","dramas":[{"id":"2112300386319732737","title":"Nikah Kontrak","cover":"/files/drama_cover/202610/31dec9fc90c442fa8a50ea4bc81e776f.jpg","synopsis":"契约婚姻","genre":"Sweet Romance","category":"甜宠爱情","totalEpisodes":4,"isHot":false,"viewCount":"0","language":"id-ID","preview":{"id":"2112300386458144769","number":1,"title":"Episode 1","duration":"01:38","durationSec":98,"isFree":true,"locked":false,"unlockCoin":10,"playUrl":"/files/transcoded/2112300373833289730/master.m3u8?e=1792448299&s=0a8fca94d795688dddb0a16da41d12cd099f90b808711bb32cc8cd02ef1400f1"}},{"id":"2112300402325196801","title":"Alpha Terakhir","cover":"/files/drama_cover/202610/1074a29a9f83448fbf664c75a290194e.jpg","synopsis":"最后的Alpha","genre":"Sweet Romance","category":"甜宠爱情","totalEpisodes":5,"isHot":false,"viewCount":"0","language":"id-ID","preview":{"id":"2112300402476191745","number":1,"title":"Episode 1","duration":"01:50","durationSec":110,"isFree":true,"locked":false,"unlockCoin":10,"playUrl":"/files/transcoded/2112300390585339906/master.m3u8?e=1792448299&s=aa08f027d2f733de8877d393a9e74fd25dc66e5d21e16f31541a581f4ba6848a"}},{"id":"2112300466212835330","title":"Pengawal Cintaku","cover":"/files/drama_cover/202610/d78b16ea924a4408a4f4d11e65d7b6e0.jpg","synopsis":"我的保镖恋人","genre":"Sweet Romance","category":"甜宠爱情","totalEpisodes":4,"isHot":false,"viewCount":"0","language":"id-ID","preview":{"id":"2112300466275749890","number":1,"title":"Episode 1","duration":"01:41","durationSec":101,"isFree":true,"locked":false,"unlockCoin":10,"playUrl":"/files/transcoded/2112300462119194626/master.m3u8?e=1792448299&s=825a2f60aa039fbe615b8bfd10f5050adbdd6f247e041402e4ab2ddde5de4d56"}},{"id":"3","title":"心动信号:请和我恋爱","cover":"","synopsis":"恋爱观察室里,心动正在悄悄发生。","genre":"甜宠爱情","category":"甜宠爱情","totalEpisodes":56,"isHot":false,"viewCount":"1800000","language":"zh-CN","preview":null}]},{"code":"category-4","title":"悬疑复仇","dramas":[{"id":"2112300351435706369","title":"Istri Yang Bangkit","cover":"/files/drama_cover/202610/4dd149df699b48849a1b22960e35e66b.jpg","synopsis":"被背叛的妻子","genre":"Revenge Suspense","category":"悬疑复仇","totalEpisodes":4,"isHot":true,"viewCount":"0","language":"id-ID","preview":{"id":"2112300351523786753","number":1,"title":"Episode 1","duration":"02:10","durationSec":130,"isFree":true,"locked":false,"unlockCoin":10,"playUrl":"/files/transcoded/2112300344921952258/master.m3u8?e=1792448299&s=c79f5f6cf95149c2310c57e0484752153907950e80c1f96567c02df8bbc27b82"}},{"id":"2112300460047208449","title":"Kembar Rahasia","cover":"/files/drama_cover/202610/9d67d294e430421db8e3f383b1086575.jpg","synopsis":"秘密双胞胎","genre":"Revenge Suspense","category":"悬疑复仇","totalEpisodes":5,"isHot":false,"viewCount":"0","language":"id-ID","preview":{"id":"2112300460118511618","number":1,"title":"Episode 1","duration":"01:54","durationSec":114,"isFree":true,"locked":false,"unlockCoin":10,"playUrl":"/files/transcoded/2112300450094125057/master.m3u8?e=1792448299&s=b55430f9ab39d6f6eaf4aa2c388499ba8f03b7afc023cdb1c84962076ad80c2b"}}]}]}}
Interpretation: Home feed contains 14 unique titles; missing expected titles: .
2026-10-20 06:03:19 - client play verification
Command:
GET http://127.0.0.1:8081/app/episodes/2112300342120157185/play (X-Device-Id: codex-batch-verify)
Raw output:
{"code":0,"message":"ok","data":{"episodeId":"2112300342120157185","dramaId":"2112300341935607809","number":1,"title":"Episode 1","durationSec":228,"accessible":true,"accessType":"FREE","playUrl":"/files/transcoded/2112300333194678273/master.m3u8?e=1792448299&s=191e871ebeb57d8e766dc38106c26408d18c6080e95e661ab823330b27d732f7","qualities":["AUTO","360p","480p","720p","1080p"],"unlockCoin":10,"previewSeconds":0}}
Interpretation: Playback ticket for episode 2112300342120157185 of drama Cinta Sang Ceo.
2026-10-20 06:03:19 - fetch HLS master playlist
Command:
GET http://127.0.0.1:8081/files/transcoded/2112300333194678273/master.m3u8?e=1792448299&s=191e871ebeb57d8e766dc38106c26408d18c6080e95e661ab823330b27d732f7
Raw output:
HTTP 200 application/vnd.apple.mpegurl
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-STREAM-INF:BANDWIDTH=464000,RESOLUTION=640x360
360p/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=864000,RESOLUTION=854x480
480p/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1696000,RESOLUTION=1280x720
720p/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=3328000,RESOLUTION=1920x1080
1080p/index.m3u8
Interpretation: Fetched the signed HLS master playlist returned by the play API.
2026-10-20 06:03:19 - fetch HLS variant playlist
Command:
GET http://127.0.0.1:8081/files/transcoded/2112300333194678273/360p/index.m3u8
Raw output:
HTTP 200 application/vnd.apple.mpegurl
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-PLAYLIST-TYPE:VOD
#EXTINF:6.000000,
seg_000.ts
#EXTINF:6.000000,
seg_001.ts
#EXTINF:6.000000,
seg_002.ts
#EXTINF:6.000000,
seg_003.ts
#EXTINF:6.000000,
seg_004.ts
#EXTINF:6.000000,
seg_005.ts
#EXTINF:6.000000,
seg_006.ts
#EXTINF:6.000000,
seg_007.ts
#EXTINF:6.000000,
seg_008.ts
#EXTINF:6.000000,
seg_009.ts
#EXTINF:6.000000,
seg_010.ts
#EXTINF:6.000000,
seg_011.ts
#EXTINF:6.000000,
seg_012.ts
#EXTINF:6.000000,
seg_013.ts
#EXTINF:6.000000,
seg_014.ts
#EXTINF:6.000000,
seg_015.ts
#EXTINF:6.000000,
seg_016.ts
#EXTINF:6.000000,
seg_017.ts
#EXTINF:6.000000,
seg_018.ts
#EXTINF:6.000000,
seg_019.ts
#EXTINF:6.000000,
seg_020.ts
#EXTINF:6.000000,
seg_021.ts
#EXTINF:6.000000,
seg_022.ts
#EXTINF:6.000000,
seg_023.ts
#EXTINF:6.000000,
seg_024.ts
#EXTINF:6.000000,
seg_025.ts
#EXTINF:6.000000,
seg_026.ts
#EXTINF:6.000000,
seg_027.ts
#EXTINF:6.000000,
seg_028.ts
#EXTINF:6.000000,
seg_029.ts
#EXTINF:6.000000,
seg_030.ts
#EXTINF:6.000000,
seg_031.ts
#EXTINF:6.000000,
seg_032.ts
#EXTINF:6.000000,
seg_033.ts
#EXTINF:6.000000,
seg_034.ts
#EXTINF:6.000000,
seg_035.ts
#EXTINF:6.000000,
seg_036.ts
#EXTINF:5.880000,
seg_037.ts
#EXT-X-ENDLIST
Interpretation: Fetched the first variant playlist referenced by the master playlist.
2026-10-20 06:03:19 - fetch HLS media segment
Command:
GET http://127.0.0.1:8081/files/transcoded/2112300333194678273/360p/seg_000.ts (Range: bytes=0-1023)
Raw output:
HTTP 206 application/octet-stream bytes=1024
Interpretation: Fetched the first media segment bytes, proving the HLS path is playable.
2026-10-20 06:03:19 - final database summary
Command:
docker exec fruitshorts-db psql -U fruitshorts -d fruitshorts -A -t -F " " -c "SELECT d.id,d.title,d.status,count(e.id),count(*) FILTER (WHERE e.status='published'),count(*) FILTER (WHERE coalesce(e.hls_url,'')<>'') FROM drama d LEFT JOIN drama_episode e ON e.drama_id=d.id WHERE d.id IN ('2112300341935607809','2112300351435706369','2112300370213605378','2112300386319732737','2112300402325196801','2112300415688249345','2112300432767455234','2112300445958541313','2112300460047208449','2112300466212835330') GROUP BY d.id,d.title,d.status ORDER BY d.title;"
Raw output:
2112300402325196801 Alpha Terakhir published 5 5 5
2112300341935607809 Cinta Sang Ceo published 5 5 5
2112300415688249345 Dokter Hatiku published 4 4 4
2112300445958541313 Gadis Pembantu published 4 4 4
2112300351435706369 Istri Yang Bangkit published 4 4 4
2112300432767455234 Kembali Untukmu published 5 5 5
2112300460047208449 Kembar Rahasia published 5 5 5
2112300386319732737 Nikah Kontrak published 4 4 4
2112300466212835330 Pengawal Cintaku published 4 4 4
2112300370213605378 Pewaris Hilang published 5 5 5
Interpretation: Final counts of episodes, published episodes and HLS-linked episodes for the 10 imported dramas.
2026-10-20 06:03:19 - final drama summary
Command:
(derived from state)
Raw output:
[
{
"Directory": "01_cinta_sang_ceo_总裁的秘密爱",
"Title": "Cinta Sang Ceo",
"Chinese": "总裁的秘密爱",
"DramaId": "2112300341935607809",
"CoverUrl": "/files/drama_cover/202610/0ca73f7e66e64c82be82cb09504db6f6.jpg",
"Status": [
null,
"published"
],
"Episodes": [
{
"Number": 1,
"Id": "2112300342120157185",
"AssetId": "2112300333169512449",
"VideoUrl": "/files/episode/202610/1dc00015a1d9449b83ce3d0025ae88f5.mp4",
"DurationSec": 0
},
{
"Number": 2,
"Id": "2112300342195654658",
"AssetId": "2112300335610597377",
"VideoUrl": "/files/episode/202610/f80fa83558fc4595aa70519db66d6aa7.mp4",
"DurationSec": 0
},
{
"Number": 3,
"Id": "2112300342245986305",
"AssetId": "2112300337875521538",
"VideoUrl": "/files/episode/202610/4027568fe23d4ec6b4d68320a12b24a7.mp4",
"DurationSec": 0
},
{
"Number": 4,
"Id": "2112300342292123650",
"AssetId": "2112300339666489345",
"VideoUrl": "/files/episode/202610/e8950dfea9ee417d8428e59a3c92d0f5.mp4",
"DurationSec": 0
},
{
"Number": 5,
"Id": "2112300342350843905",
"AssetId": "2112300341780418561",
"VideoUrl": "/files/episode/202610/3e22155224834af3b6be54c39bb96776.mp4",
"DurationSec": 0
}
]
},
{
"Directory": "02_istri_yang_bangkit_被背叛的妻子",
"Title": "Istri Yang Bangkit",
"Chinese": "被背叛的妻子",
"DramaId": "2112300351435706369",
"CoverUrl": "/files/drama_cover/202610/4dd149df699b48849a1b22960e35e66b.jpg",
"Status": [
null,
"published"
],
"Episodes": [
{
"Number": 1,
"Id": "2112300351523786753",
"AssetId": "2112300344913563649",
"VideoUrl": "/files/episode/202610/eac2da991d2e48a78d5468135729b8f7.mp4",
"DurationSec": 0
},
{
"Number": 2,
"Id": "2112300351565729793",
"AssetId": "2112300346582896641",
"VideoUrl": "/files/episode/202610/bfeecceb819644ec8ebd109d32203685.mp4",
"DurationSec": 0
},
{
"Number": 3,
"Id": "2112300351611867138",
"AssetId": "2112300348638105601",
"VideoUrl": "/files/episode/202610/f7f6f5dc20d24f01b0bb5ef5f66d635c.mp4",
"DurationSec": 0
},
{
"Number": 4,
"Id": "2112300351653810178",
"AssetId": "2112300351330848770",
"VideoUrl": "/files/episode/202610/d9b7b4399a5948c08e8840d13626b8b0.mp4",
"DurationSec": 0
}
]
},
{
"Directory": "03_pewaris_hilang_失落的继承人",
"Title": "Pewaris Hilang",
"Chinese": "失落的继承人",
"DramaId": "2112300370213605378",
"CoverUrl": "/files/drama_cover/202610/93e8ebda36794f3fac90cf419ce71792.jpg",
"Status": [
null,
"published"
],
"Episodes": [
{
"Number": 1,
"Id": "2112300370410737666",
"AssetId": "2112300354833092609",
"VideoUrl": "/files/episode/202610/3263657859b6451e964a1582bd26b40c.mp4",
"DurationSec": 0
},
{
"Number": 2,
"Id": "2112300370490429442",
"AssetId": "2112300358012375042",
"VideoUrl": "/files/episode/202610/502359072c2c470c8492d52627823543.mp4",
"DurationSec": 0
},
{
"Number": 3,
"Id": "2112300370595287041",
"AssetId": "2112300360847724546",
"VideoUrl": "/files/episode/202610/40f4e0a343a8470f882e72b528863456.mp4",
"DurationSec": 0
},
{
"Number": 4,
"Id": "2112300370670784514",
"AssetId": "2112300367785103361",
"VideoUrl": "/files/episode/202610/2932c3e07bec49a0bd0d4007db684c59.mp4",
"DurationSec": 0
},
{
"Number": 5,
"Id": "2112300370767253506",
"AssetId": "2112300370070999042",
"VideoUrl": "/files/episode/202610/031b9edbfc5349798fdfd0e2f67bec79.mp4",
"DurationSec": 0
}
]
},
{
"Directory": "04_nikah_kontrak_契约婚姻",
"Title": "Nikah Kontrak",
"Chinese": "契约婚姻",
"DramaId": "2112300386319732737",
"CoverUrl": "/files/drama_cover/202610/31dec9fc90c442fa8a50ea4bc81e776f.jpg",
"Status": [
null,
"published"
],
"Episodes": [
{
"Number": 1,
"Id": "2112300386458144769",
"AssetId": "2112300373816512514",
"VideoUrl": "/files/episode/202610/39967fe4b620419fbba263ff584e02ae.mp4",
"DurationSec": 0
},
{
"Number": 2,
"Id": "2112300386525253634",
"AssetId": "2112300378312806402",
"VideoUrl": "/files/episode/202610/8f2f0087f82442b8b8d1409773afe316.mp4",
"DurationSec": 0
},
{
"Number": 3,
"Id": "2112300386596556802",
"AssetId": "2112300382242869249",
"VideoUrl": "/files/episode/202610/f63d5434d27c4feb96432bce6b0413ff.mp4",
"DurationSec": 0
},
{
"Number": 4,
"Id": "2112300386676248577",
"AssetId": "2112300386147766274",
"VideoUrl": "/files/episode/202610/56a083c52e3a46bdaadfe60b32dc3612.mp4",
"DurationSec": 0
}
]
},
{
"Directory": "05_alpha_terakhir_最后的Alpha",
"Title": "Alpha Terakhir",
"Chinese": "最后的Alpha",
"DramaId": "2112300402325196801",
"CoverUrl": "/files/drama_cover/202610/1074a29a9f83448fbf664c75a290194e.jpg",
"Status": [
null,
"published"
],
"Episodes": [
{
"Number": 1,
"Id": "2112300402476191745",
"AssetId": "2112300390572756993",
"VideoUrl": "/files/episode/202610/d5416f2b1bc74223850a727a04d4f988.mp4",
"DurationSec": 0
},
{
"Number": 2,
"Id": "2112300402555883522",
"AssetId": "2112300394305687554",
"VideoUrl": "/files/episode/202610/3b060d4df20b4954af49141cdf58a3fe.mp4",
"DurationSec": 0
},
{
"Number": 3,
"Id": "2112300402635575298",
"AssetId": "2112300397086511105",
"VideoUrl": "/files/episode/202610/389519ec3a1a41ca97351441740cafeb.mp4",
"DurationSec": 0
},
{
"Number": 4,
"Id": "2112300402711072769",
"AssetId": "2112300399489847297",
"VideoUrl": "/files/episode/202610/c4e231b4f6004a788e9046cb407d9a24.mp4",
"DurationSec": 0
},
{
"Number": 5,
"Id": "2112300402778181634",
"AssetId": "2112300402195173378",
"VideoUrl": "/files/episode/202610/64869b53b6b945c8b1b0cdaf575ecb3d.mp4",
"DurationSec": 0
}
]
},
{
"Directory": "06_dokter_hatiku_我心中的医生",
"Title": "Dokter Hatiku",
"Chinese": "我心中的医生",
"DramaId": "2112300415688249345",
"CoverUrl": "/files/drama_cover/202610/8a7c339a7af84b2b8aa97772636935d3.jpg",
"Status": [
null,
"published"
],
"Episodes": [
{
"Number": 1,
"Id": "2112300415818272770",
"AssetId": "2112300406142013441",
"VideoUrl": "/files/episode/202610/00151bb5733b4076bff30e7acfe16605.mp4",
"DurationSec": 0
},
{
"Number": 2,
"Id": "2112300415885381633",
"AssetId": "2112300410453757954",
"VideoUrl": "/files/episode/202610/2bcada54921545ad8538011ef6877793.mp4",
"DurationSec": 0
},
{
"Number": 3,
"Id": "2112300415944101889",
"AssetId": "2112300412513161217",
"VideoUrl": "/files/episode/202610/092b38097cf14ae0b47222eec489411b.mp4",
"DurationSec": 0
},
{
"Number": 4,
"Id": "2112300416011210754",
"AssetId": "2112300415545643010",
"VideoUrl": "/files/episode/202610/5686107ab0a945f5a109541393e279a1.mp4",
"DurationSec": 0
}
]
},
{
"Directory": "07_kembali_untukmu_为你重来",
"Title": "Kembali Untukmu",
"Chinese": "为你重来",
"DramaId": "2112300432767455234",
"CoverUrl": "/files/drama_cover/202610/8609c882fb084c7cb72f9d481c6ce525.jpg",
"Status": [
null,
"published"
],
"Episodes": [
{
"Number": 1,
"Id": "2112300432893284353",
"AssetId": "2112300418439712769",
"VideoUrl": "/files/episode/202610/8792d25251604009918575d55ebd7c63.mp4",
"DurationSec": 0
},
{
"Number": 2,
"Id": "2112300432964587521",
"AssetId": "2112300421715464194",
"VideoUrl": "/files/episode/202610/cb21fdc7c02d46a2a9f342efa5dc1dfb.mp4",
"DurationSec": 0
},
{
"Number": 3,
"Id": "2112300433031696385",
"AssetId": "2112300425389674497",
"VideoUrl": "/files/episode/202610/bc77d0b8ac434115a0b2cbc423174bdf.mp4",
"DurationSec": 0
},
{
"Number": 4,
"Id": "2112300433102999553",
"AssetId": "2112300428967415810",
"VideoUrl": "/files/episode/202610/dcb43839db94481bb2b7cffe746995a5.mp4",
"DurationSec": 0
},
{
"Number": 5,
"Id": "2112300433174302721",
"AssetId": "2112300432620654594",
"VideoUrl": "/files/episode/202610/3fd641c6b36e44a7bbf16b26113d5eaf.mp4",
"DurationSec": 0
}
]
},
{
"Directory": "08_gadis_pembantu_女仆与亿万富翁",
"Title": "Gadis Pembantu",
"Chinese": "女仆与亿万富翁",
"DramaId": "2112300445958541313",
"CoverUrl": "/files/drama_cover/202610/407513b839224e3fb7e87563c90fd93d.jpg",
"Status": [
null,
"published"
],
"Episodes": [
{
"Number": 1,
"Id": "2112300446101147650",
"AssetId": "2112300436978536449",
"VideoUrl": "/files/episode/202610/cc27868b3a904e718bd13d9b4b1ac850.mp4",
"DurationSec": 0
},
{
"Number": 2,
"Id": "2112300446164062209",
"AssetId": "2112300440216539138",
"VideoUrl": "/files/episode/202610/4e7090da673f4745a1ec22d9d154e748.mp4",
"DurationSec": 0
},
{
"Number": 3,
"Id": "2112300446239559681",
"AssetId": "2112300443555205122",
"VideoUrl": "/files/episode/202610/1b8a5896dc3b4f8bb4f267ff9f3cbbbe.mp4",
"DurationSec": 0
},
{
"Number": 4,
"Id": "2112300446319251457",
"AssetId": "2112300445811740673",
"VideoUrl": "/files/episode/202610/d4e12654f7e0413c9ddde013dd2668b3.mp4",
"DurationSec": 0
}
]
},
{
"Directory": "09_kembar_rahasia_秘密双胞胎",
"Title": "Kembar Rahasia",
"Chinese": "秘密双胞胎",
"DramaId": "2112300460047208449",
"CoverUrl": "/files/drama_cover/202610/9d67d294e430421db8e3f383b1086575.jpg",
"Status": [
null,
"published"
],
"Episodes": [
{
"Number": 1,
"Id": "2112300460118511618",
"AssetId": "2112300450085736449",
"VideoUrl": "/files/episode/202610/a610e0394f684ce2b3c4d27d73c0b557.mp4",
"DurationSec": 0
},
{
"Number": 2,
"Id": "2112300460156260353",
"AssetId": "2112300453072080898",
"VideoUrl": "/files/episode/202610/200c42041d2641e287f7d5e8d6a3fb02.mp4",
"DurationSec": 0
},
{
"Number": 3,
"Id": "2112300460189814786",
"AssetId": "2112300455404113921",
"VideoUrl": "/files/episode/202610/e8370a9736284eeebf8d3221021f30dd.mp4",
"DurationSec": 0
},
{
"Number": 4,
"Id": "2112300460223369217",
"AssetId": "2112300457786478594",
"VideoUrl": "/files/episode/202610/817834e6f0f441afb8182377013b94e8.mp4",
"DurationSec": 0
},
{
"Number": 5,
"Id": "2112300460261117954",
"AssetId": "2112300459971710977",
"VideoUrl": "/files/episode/202610/a5498325873145e887894a927dfbfb1d.mp4",
"DurationSec": 0
}
]
},
{
"Directory": "10_pengawal_cintaku_我的保镖恋人",
"Title": "Pengawal Cintaku",
"Chinese": "我的保镖恋人",
"DramaId": "2112300466212835330",
"CoverUrl": "/files/drama_cover/202610/d78b16ea924a4408a4f4d11e65d7b6e0.jpg",
"Status": [
null,
"published"
],
"Episodes": [
{
"Number": 1,
"Id": "2112300466275749890",
"AssetId": "2112300462115000321",
"VideoUrl": "/files/episode/202610/8c22e4ad16e54b529d7fc60bc0963142.mp4",
"DurationSec": 0
},
{
"Number": 2,
"Id": "2112300466317692930",
"AssetId": "2112300463281016834",
"VideoUrl": "/files/episode/202610/a8d528bd739f42f1b6b2ad67cdf4a629.mp4",
"DurationSec": 0
},
{
"Number": 3,
"Id": "2112300466355441666",
"AssetId": "2112300464522530817",
"VideoUrl": "/files/episode/202610/3d021ab796bb4c3b81c142f89b530879.mp4",
"DurationSec": 0
},
{
"Number": 4,
"Id": "2112300466443522050",
"AssetId": "2112300466141532161",
"VideoUrl": "/files/episode/202610/ae40ffe561ab445289739fdde092f7c1.mp4",
"DurationSec": 0
}
]
}
]
Interpretation: Final imported drama records including ids, covers, statuses and episode mappings.
2026-10-20 06:03:19 - batch publish completed
Command:
script end
Raw output:
dramas=10
episodes=45
sampleEpisode=2112300342120157185
feedTitleCount=14
Interpretation: All import steps completed; client feed and HLS playback verified. Report: C:\work\ReelShort\docs\plans\fruitshorts-publish-report.json
2026-10-20 06:04:08 - correct drama title
Command:
PUT http://127.0.0.1:8080/admin/dramas/2112300341935607809
BODY {
"id": "2112300341935607809",
"code": "D20261020007",
"title": "Cinta Sang CEO",
"subtitle": "总裁的秘密爱",
"categoryId": "1",
"category": "都市情感",
"genre": "Urban Romance",
"description": "总裁的秘密爱",
"cover": "/files/drama_cover/202610/0ca73f7e66e64c82be82cb09504db6f6.jpg",
"trailerUrl": "",
"language": "id-ID",
"episodes": 5,
"freeEpisodes": 5,
"unlockCoin": 10,
"isHot": true,
"status": "published",
"statusText": "已上线",
"views": "0",
"sort": 100,
"publishAt": "2026-10-20 05:50:20",
"createdAt": "2026-10-20 05:50:20",
"updatedAt": "2026-10-20 05:50:20"
}
Raw output:
{"code":0,"message":"ok","data":null}
Interpretation: Corrected the Indonesian title from 'Cinta Sang Ceo' to 'Cinta Sang CEO' via the admin drama update API.### 2026-10-20 06:04:19 - normalize state and report artifacts Command:
psql SELECT id,drama_id,duration_sec,hls_url FROM drama_episode ...
Raw output:
2112300342120157185 2112300341935607809 228 /files/transcoded/2112300333194678273/master.m3u8
2112300342195654658 2112300341935607809 175 /files/transcoded/2112300335627374593/master.m3u8
2112300342245986305 2112300341935607809 134 /files/transcoded/2112300337888104449/master.m3u8
2112300342292123650 2112300341935607809 130 /files/transcoded/2112300339670683650/master.m3u8
2112300342350843905 2112300341935607809 129 /files/transcoded/2112300341784612866/master.m3u8
2112300351523786753 2112300351435706369 130 /files/transcoded/2112300344921952258/master.m3u8
2112300351565729793 2112300351435706369 112 /files/transcoded/2112300346587090946/master.m3u8
2112300351611867138 2112300351435706369 124 /files/transcoded/2112300348642299906/master.m3u8
2112300351653810178 2112300351435706369 178 /files/transcoded/2112300351339237377/master.m3u8
2112300370410737666 2112300370213605378 91 /files/transcoded/2112300354841481218/master.m3u8
2112300370490429442 2112300370213605378 91 /files/transcoded/2112300358024957954/master.m3u8
2112300370595287041 2112300370213605378 76 /files/transcoded/2112300360856113153/master.m3u8
2112300370670784514 2112300370213605378 206 /files/transcoded/2112300367797686273/master.m3u8
2112300370767253506 2112300370213605378 81 /files/transcoded/2112300370083581954/master.m3u8
2112300386458144769 2112300386319732737 98 /files/transcoded/2112300373833289730/master.m3u8
2112300386525253634 2112300386319732737 120 /files/transcoded/2112300378321195010/master.m3u8
2112300386596556802 2112300386319732737 98 /files/transcoded/2112300382255452161/master.m3u8
2112300386676248577 2112300386319732737 127 /files/transcoded/2112300386151960578/master.m3u8
2112300402476191745 2112300402325196801 110 /files/transcoded/2112300390585339906/master.m3u8
2112300402555883522 2112300402325196801 93 /files/transcoded/2112300394314076162/master.m3u8
2112300402635575298 2112300402325196801 94 /files/transcoded/2112300397090705409/master.m3u8
2112300402711072769 2112300402325196801 89 /files/transcoded/2112300399498235906/master.m3u8
2112300402778181634 2112300402325196801 102 /files/transcoded/2112300402203561986/master.m3u8
2112300415818272770 2112300415688249345 90 /files/transcoded/2112300406150402050/master.m3u8
2112300415885381633 2112300415688249345 129 /files/transcoded/2112300410462146561/master.m3u8
2112300415944101889 2112300415688249345 107 /files/transcoded/2112300412521549825/master.m3u8
2112300416011210754 2112300415688249345 112 /files/transcoded/2112300415549837313/master.m3u8
2112300432893284353 2112300432767455234 67 /files/transcoded/2112300418448101377/master.m3u8
2112300432964587521 2112300432767455234 102 /files/transcoded/2112300421723852802/master.m3u8
2112300433031696385 2112300432767455234 118 /files/transcoded/2112300425398063105/master.m3u8
2112300433102999553 2112300432767455234 115 /files/transcoded/2112300428975804418/master.m3u8
2112300433174302721 2112300432767455234 131 /files/transcoded/2112300432629043201/master.m3u8
2112300446101147650 2112300445958541313 121 /files/transcoded/2112300436991119362/master.m3u8
2112300446164062209 2112300445958541313 109 /files/transcoded/2112300440229122050/master.m3u8
2112300446239559681 2112300445958541313 111 /files/transcoded/2112300443563593729/master.m3u8
2112300446319251457 2112300445958541313 80 /files/transcoded/2112300445820129282/master.m3u8
2112300460118511618 2112300460047208449 114 /files/transcoded/2112300450094125057/master.m3u8
2112300460156260353 2112300460047208449 100 /files/transcoded/2112300453080469505/master.m3u8
2112300460189814786 2112300460047208449 71 /files/transcoded/2112300455412502529/master.m3u8
2112300460223369217 2112300460047208449 94 /files/transcoded/2112300457794867201/master.m3u8
2112300460261117954 2112300460047208449 125 /files/transcoded/2112300459975905281/master.m3u8
2112300466275749890 2112300466212835330 101 /files/transcoded/2112300462119194626/master.m3u8
2112300466317692930 2112300466212835330 101 /files/transcoded/2112300463289405441/master.m3u8
2112300466355441666 2112300466212835330 110 /files/transcoded/2112300464526725121/master.m3u8
2112300466443522050 2112300466212835330 166 /files/transcoded/2112300466145726466/master.m3u8
Interpretation: Replaced accidental null+status arrays with scalar statuses, corrected Cinta Sang CEO, and copied real durationSec values from drama_episode into the state/report artifacts.### 2026-10-20 06:04:26 - final client verification after title correction Command:
GET http://127.0.0.1:8081/app/home/feed
GET http://127.0.0.1:8081/app/episodes/2112300342120157185/play (X-Device-Id: codex-final-verify)
GET <signed playUrl>; GET <variant playlist>; GET <first segment> (Range: bytes=0-1023)
Raw output:
FEED_TITLES=Cinta Sang CEO | Istri Yang Bangkit | Pewaris Hilang | 替嫁新娘:总裁的掌心宠 | 闪婚后,傅先生每天都在撒糖1 | 周卫东测试 | Pengawal Cintaku | Kembar Rahasia | Gadis Pembantu | Kembali Untukmu | Dokter Hatiku | Alpha Terakhir | Nikah Kontrak | 心动信号:请和我恋爱
MISSING=
PLAY_ACCESSIBLE=True
PLAY_ACCESS_TYPE=FREE
PLAY_URL=/files/transcoded/2112300333194678273/master.m3u8?e=1792448366&s=9229bc7e1b81499965bbc1db37ccd7d3c45f41135bc0a72d9de583f963cb3606
PLAY_DURATION=228
PLAY_QUALITIES=AUTO,360p,480p,720p,1080p
MASTER_STATUS=200
VARIANT_STATUS=200
SEGMENT_STATUS=206
SEGMENT_BYTES=1024
MASTER_PLAYLIST=#EXTM3U
#EXT-X-VERSION:3
#EXT-X-STREAM-INF:BANDWIDTH=464000,RESOLUTION=640x360
360p/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=864000,RESOLUTION=854x480
480p/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1696000,RESOLUTION=1280x720
720p/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=3328000,RESOLUTION=1920x1080
1080p/index.m3u8
VARIANT_PLAYLIST=#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-PLAYLIST-TYPE:VOD
#EXTINF:6.000000,
seg_000.ts
#EXTINF:6.000000,
seg_001.ts
#EXTINF:6.000000,
seg_002.ts
#EXTINF:6.000000,
seg_003.ts
#EXTINF:6.000000,
seg_004.ts
#EXTINF:6.000000,
seg_005.ts
#EXTINF:6.000000,
seg_006.ts
#EXTINF:6.000000,
seg_007.ts
#EXTINF:6.000000,
seg_008.ts
#EXTINF:6.000000,
seg_009.ts
#EXTINF:6.000000,
seg_010.ts
#EXTINF:6.000000,
seg_011.ts
#EXTINF:6.000000,
seg_012.ts
#EXTINF:6.000000,
seg_013.ts
#EXTINF:6.000000,
seg_014.ts
#EXTINF:6.000000,
seg_015.ts
#EXTINF:6.000000,
seg_016.ts
#EXTINF:6.000000,
seg_017.ts
#EXTINF:6.000000,
seg_018.ts
#EXTINF:6.000000,
seg_019.ts
#EXTINF:6.000000,
seg_020.ts
#EXTINF:6.000000,
seg_021.ts
#EXTINF:6.000000,
seg_022.ts
#EXTINF:6.000000,
seg_023.ts
#EXTINF:6.000000,
seg_024.ts
#EXTINF:6.000000,
seg_025.ts
#EXTINF:6.000000,
seg_026.ts
#EXTINF:6.000000,
seg_027.ts
#EXTINF:6.000000,
seg_028.ts
#EXTINF:6.000000,
seg_029.ts
#EXTINF:6.000000,
seg_030.ts
#EXTINF:6.000000,
seg_031.ts
#EXTINF:6.000000,
seg_032.ts
#EXTINF:6.000000,
seg_033.ts
#EXTINF:6.000000,
seg_034.ts
#EXTINF:6.000000,
seg_035.ts
#EXTINF:6.000000,
seg_036.ts
#EXTINF:5.880000,
seg_037.ts
#EXT-X-ENDLIST
Interpretation: All 10 expected titles are present in the home feed. The sample episode is FREE and accessible, returns HLS with four qualities, and the master/variant/segment requests all succeed.### 2026-10-20 06:04:37 - final cover and data integrity check Command:
GET <cover url> for each imported drama (HTTP status)
psql SELECT min(duration_sec),max(duration_sec),min(unlock_coin),max(unlock_coin),count(*) FILTER (WHERE is_free=0) ...
Raw output:
COVER_CHECK
Alpha Terakhir 200 /files/drama_cover/202610/1074a29a9f83448fbf664c75a290194e.jpg
Cinta Sang CEO 200 /files/drama_cover/202610/0ca73f7e66e64c82be82cb09504db6f6.jpg
Dokter Hatiku 200 /files/drama_cover/202610/8a7c339a7af84b2b8aa97772636935d3.jpg
Gadis Pembantu 200 /files/drama_cover/202610/407513b839224e3fb7e87563c90fd93d.jpg
Istri Yang Bangkit 200 /files/drama_cover/202610/4dd149df699b48849a1b22960e35e66b.jpg
Kembali Untukmu 200 /files/drama_cover/202610/8609c882fb084c7cb72f9d481c6ce525.jpg
Kembar Rahasia 200 /files/drama_cover/202610/9d67d294e430421db8e3f383b1086575.jpg
Nikah Kontrak 200 /files/drama_cover/202610/31dec9fc90c442fa8a50ea4bc81e776f.jpg
Pengawal Cintaku 200 /files/drama_cover/202610/d78b16ea924a4408a4f4d11e65d7b6e0.jpg
Pewaris Hilang 200 /files/drama_cover/202610/93e8ebda36794f3fac90cf419ce71792.jpg
DB_STATS(min_dur|max_dur|min_coin|max_coin|not_free)=67|228|10|10|0
Interpretation: All 10 vertical covers return HTTP 200. Every imported episode is free, unlockCoin is exactly 10, durations are populated (67-228 seconds), and none is non-free.### 2026-10-20 06:04:51 - final metadata and cover dimension check Command:
psql SELECT title,subtitle,synopsis FROM drama ...
System.Drawing.Image.FromFile(vertical cover).Width/Height
Raw output:
TITLE|SUBTITLE|SYNOPSIS
Cinta Sang CEO 总裁的秘密爱 总裁的秘密爱
Istri Yang Bangkit 被背叛的妻子 被背叛的妻子
Pewaris Hilang 失落的继承人 失落的继承人
Nikah Kontrak 契约婚姻 契约婚姻
Alpha Terakhir 最后的Alpha 最后的Alpha
Dokter Hatiku 我心中的医生 我心中的医生
Kembali Untukmu 为你重来 为你重来
Gadis Pembantu 女仆与亿万富翁 女仆与亿万富翁
Kembar Rahasia 秘密双胞胎 秘密双胞胎
Pengawal Cintaku 我的保镖恋人 我的保镖恋人
COVER_DIMENSIONS
01_cinta_sang_ceo_总裁的秘密爱 竖版_9x16.jpg 720x1280
02_istri_yang_bangkit_被背叛的妻子 竖版_9x16.jpg 720x1280
03_pewaris_hilang_失落的继承人 竖版_9x16.jpg 720x1280
04_nikah_kontrak_契约婚姻 竖版_9x16.jpg 720x1280
05_alpha_terakhir_最后的Alpha 竖版_9x16.jpg 720x1280
06_dokter_hatiku_我心中的医生 竖版_9x16.jpg 720x1280
07_kembali_untukmu_为你重来 竖版_9x16.jpg 720x1280
08_gadis_pembantu_女仆与亿万富翁 竖版_9x16.jpg 720x1280
09_kembar_rahasia_秘密双胞胎 竖版_9x16.jpg 720x1280
10_pengawal_cintaku_我的保镖恋人 竖版_9x16.jpg 720x1280
Interpretation: Indonesian titles and Chinese meanings match the source directories, and all 10 selected covers are the 720x1280 vertical 9:16 artwork.
2026-10-20 ReelShort:K28-A 客户端四 Tab 与浏览页
- 分支:
feature/flutter-k28-a - 功能提交:
959edc0 feat(flutter): 重构四 Tab 与浏览页 - develop 合并提交:
f981f88 merge: 合并 K28-A 客户端 UI 重构,已推送。 - 底部导航:首页 / 剧场 / 创作 / 我的,Key 为
tab-home、tab-theater、tab-create、tab-mine。 - 首页:搜索、头像、星期、热门/免费/新剧/榜单频道、Hero Banner、继续观看、双列剧目卡;卡片、Banner、继续观看均推入全屏
PlayerPage。 - 剧场:固定搜索顶栏、服务端分类 chips、五种语言 chips、双列剧卡、搜索与下拉刷新;语言 chips 本批只做选中态,不按语言过滤数据。
- 创作:AI 制作 / 上传发布两张诚实占位卡,不调用不存在的创作接口。
- 播放回归:清屏/退出清屏、暂停态中心播放按钮、清屏跨集保持、倍速弹窗、拖动进度时间预览均保留;同时将播放器“更多”面板改为可滚动,避免小屏溢出。
- 测试整理:移除已不存在的沉浸式首页旧断言,改为覆盖四 Tab、首页频道、剧场语言选中、Home/剧场进入全屏播放、继续观看续集、播放预加载与互动、认证门槛、收藏、320 宽度布局。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:30 +373: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
44.5s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,373 条测试全部通过,debug APK 构建成功。工作区中原有的 pubspec.lock 变更未纳入本批提交。真机验收由用户执行。
2026-10-20 ReelShort:K28-A1 范围校正
- 2026-10-20 K28-A1 开始
- 重复指令复核:同名任务已由
49f3e63完成并以0d23674合入 develop;本轮不重复实现,仅补记开始标记。 - K28-A1 取代上一条 K28-A 范围:本批只交付 4 Tab 与首页浏览化,剧场仅改 Tab 名称并保留原 DiscoverPage 布局。
- 分支:
feature/flutter-k28-a1 - 功能提交:
49f3e63 feat(flutter): 完成 K28-A1 四 Tab 首页 - develop 合并提交:
0d23674 merge: 合并 K28-A1 客户端四 Tab 首页,已推送。 - 撤出上批越界的剧场语言 chips、分类 chips 和两列卡片重排;恢复原搜索、分类九宫格、Banner、榜单、全部剧目结构。
- 首页保留:搜索进入剧场搜索、头像进入我的、l10n 星期、热门/免费/新剧/榜单、Hero Banner(无 Banner 回退首剧封面)、最近未完成续看、热门双列卡片。
- 首页续看复用
ContinueWatchingCard,并增加“第 n 集 · 还剩 m 分钟”展示;首页 Banner、卡片、续看均推入全屏PlayerPage(homeMode=false)。 - 创作页本批仅保留标题与副标题占位,不提供假制作或假上传流程。
- 播放页清屏、暂停态中心按钮、清屏跨集保持、倍速弹窗、进度拖动时间预览回归通过。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:31 +373: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
6.9s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,373 条测试全部通过,debug APK 构建成功。剧场已停在 A1 边界,语言筛选与剧场卡片重排留待 K28-A2。工作区原有 pubspec.lock 变更未纳入本批提交。真机验收由用户执行。
2026-10-20 ReelShort:K28-S 浅色暖橙视觉主题
- 分支:
feature/flutter-k28-style - 功能提交:
634b63e feat(flutter): 应用浅色暖橙视觉主题 - develop 合并提交:
e448003 merge: 合并 K28-S 浅色暖橙视觉主题,已推送。 - 全局 token:背景
#FFF8F0、顶部渐变#FFE9D6、卡片#FFFFFF、主色#FF7A1A、主文字#1F1B16、次要文字#8C837B、弱文字#B3AAA1、描边#F0E4D6、粉色角标#FFE3EC/#FF6A8A。 - 主题:切换为浅色模式,状态栏与系统导航栏图标改为深色;卡片/封面圆角 16、弹层 20、按钮与 chips 胶囊圆角 999;卡片阴影
0x14FF8A3D、blur 18、y 6。 - 导航:按本任务正文实现五槽——首页 / 剧场 / 中央橙色渐变
+/ 创作 / 我的;中央按钮 Key 为nav-center-action,四个原 Tab Key 保留,点击中央按钮进入创作页。 - 剧卡:粉色左上角标、右上锁定数量、右下米色集数胶囊、橙色圆形
+、白色卡片与暖色轻阴影;首页和剧场剧卡统一换肤。 - 播放页:仅调整视觉,清屏、暂停才显示中心按钮、跨集清屏保持、倍速弹窗、拖动时间预览均通过回归。
- 口径说明:FruitServer 后续文档提交
c40bd52曾将导航修正为四槽,但本条 K28-S 任务正文明确要求五槽与nav-center-action,本次按任务正文执行。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:33 +373: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
7.8s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,373 条测试全部通过,debug APK 构建成功。工作区原有 pubspec.lock 变更未纳入本批提交。真机验收由用户执行。
2026-10-20 ReelShort:K28-S 四槽导航口径修正
- 分支:
fix/flutter-k28-nav-4slot - 修正提交:
2f1a4c5 fix(flutter): 回退底部导航为四槽 - develop 合并提交:
678b976 merge: 合并 K28-S 四槽导航修正,已推送。 - 按最新规范恢复四槽:首页 / 剧场 / 创作 / 我的。
- 删除中央「+」按钮、
AppBottomNavCenterAction、中央渐变/尺寸 token 及nav-center-actionKey。 - 原
tab-home、tab-theater、tab-create、tab-mine保持;选中图标与文字继续使用橙色,未选中使用暖灰。 - 浅色暖橙 token、剧卡、chips、粉色/米色角标、圆角阴影、深色状态栏图标及播放页视觉均保留。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:31 +373: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
7.4s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,373 条测试全部通过,debug APK 构建成功。底部导航已按最新口径保持四槽,源码中不存在中央按钮或 nav-center-action。工作区原有 pubspec.lock 变更未纳入本批提交。真机验收由用户执行。
2026-10-20 ReelShort:K28-A2 剧场与首页 Hero 重设计
- 分支:
feature/flutter-k28-a2 - 功能提交:
73aef4e feat(flutter): 重设计剧场与首页 Hero - develop 合并提交:
d50c6e6 merge: 合并 K28-A2 剧场与 Hero 重设计,已推送。 - 首页 Hero:高度提升为 240,海报全宽铺满并使用底部深色渐变;剧名 28px、副标题 14px,分页点叠加在图片底部。
- 剧场顶栏:搜索框与头像同排固定。
- 分类 chips:全部 + 服务端分类,选中橙色实心白字。
- 语言 chips:全部语言 / 中文 / 印尼语 / 马来语 / 英语,仅切换选中态,不筛选数据。
- 剧场列表:双列剧卡、分类筛选、搜索、页面失焦和下拉刷新保留。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:32 +374: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
8.4s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,374 条测试全部通过,debug APK 构建成功。工作区原有 pubspec.lock 变更未纳入本批提交。真机验收由用户执行。
2026-10-20 ReelShort:K28-B 创作与我的页面重设计
- 分支:
feature/flutter-k28-b - 功能提交:
03c3964 feat(flutter): 重设计创作与我的页面 - develop 合并提交:
148fbc3 merge: 合并 K28-B 创作与我的页面,已推送。 - 创作页:大标题 + 副标题;新增 AI 制作、上传发布两张白卡与右箭头;点击进入诚实占位页,不连接假接口。
- 我的页:身份卡、三宫格快捷入口、金币余额卡与充值按钮、会员卡、五项菜单。
- 快捷入口保持收藏/追剧、观看历史、本地下载可达;通知、设置继续进入现有页面。
- 我的作品、创作者中心、帮助与反馈进入“即将开放”占位页。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:31 +374: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
7.5s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,374 条测试全部通过,debug APK 构建成功。工作区原有 pubspec.lock 变更未纳入本批提交。真机验收由用户执行。
2026-10-20 ReelShort:K28-C 播放页与四面板重设计
- 分支:
feature/flutter-k28-c - 基线:
148fbc3 merge: 合并 K28-B 创作与我的页面 - 功能提交:
9a4269b feat(flutter): 重设计播放页与操作面板 - develop 合并提交:
f1efbc5 merge: 合并 K28-C 播放页与操作面板,已推送。 - 播放页:顶部大标题 + 橙点、剧集副标题、清屏与更多圆形按钮;海报作为视频加载前后的 Hero 底图;题材胶囊与页码点;右侧点赞/评论/收藏/分享 rail;底部剧名、第 n 集、题材标签 + 追剧、简介、常驻当前/总时长、进度条、选集/下一集/更多。
- 选集面板:六列等宽网格,当前集橙色高亮,锁定集显示锁标;标题区含剧名、总集数与关闭按钮。
- 评论面板:白底圆角弹层、评论数与关闭按钮、现有评论列表/翻页/回复/点赞/举报/输入发布逻辑保持。
- 更多面板:倍速、清晰度、下载、文字大小、画中画、投诉;倍速继续打开原有
player-speed-sheet,文字大小即时作用于播放页标题、副标题与简介。 - 内容解锁面板:金币解锁连接真实
unlockEpisode;广告和会员入口按当前契约缺口显示“即将开放”并禁用,底部注明“具体解锁方式以作品而定”。 - 清理:删除不再被引用的
player_featured_comment.dart,全仓检索零引用后提交;player_view.dart由 1212 行拆至 489 行,新增浮层、模型、部件、面板文件均低于 500 行。 - 未回退:清屏/退出清屏、仅暂停时显示中心播放按钮、清屏跨集保持、倍速弹窗、拖动进度显示时间;新增锁定集、六列选集、更多操作与解锁面板结构测试。
- 数据缺口:剧级评论数暂无独立下发,未伪造数字;点赞数仅在服务端返回后显示;广告/VIP 解锁和文字大小持久化仍需后续契约或偏好能力。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:33 +378: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
7.1s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,378 条测试全部通过,debug APK 构建成功。工作区原有 pubspec.lock 变更未纳入本批提交。真机验收由用户执行。
2026-10-20 ReelShort:K29 播放页重构与语言入口
- 分支:
feature/flutter-k29-player-language - 功能提交:
8c43e9e feat(flutter): 重构播放页并增加语言切换 - develop 合并提交:
c4ad5d7 merge: 合并 K29 播放页与语言切换,已推送。 - 全屏胶囊补充修复:
6dbeb3e fix(flutter): 支持全屏胶囊双态切换 - 修复合并提交:
7b4a792 merge: 合并 K29 全屏胶囊双态切换,已推送。 - 播放页:顶栏改为返回 + 第 n 集 + 倍速入口 + 更多;移除旧大标题/副标题/题材胶囊/分页点和顶栏清屏按钮;视频下方增加「全屏观看」胶囊;右侧 rail 调整为收藏、评论、点赞、分享,没有服务端计数的项目不显示虚假数字。
- 底部黑色信息面板:剧名可进详情、第 n 集/简介可展开收起、作者声明有数据才显示、细进度条和当前/总时长;底栏保留选集/总集数/免费观看入口,PiP 可用时显示小窗按钮。
- 更多面板:倍速分段(0.75/1/1.25/1.5/2/3)、清晰度分段(仅接口下发档位可用,AUTO 之外显示不可用)、不感兴趣、清屏播放、弹幕与弹幕设置、离线缓存、字体大小、投屏、定时关闭、投诉;无后端能力项禁用并明确标注。
- 评论面板:
n 条评论标题、评论数、关闭、头像/昵称/内容/时间/回复/点赞和底部输入框;保留现有评论翻页、回复、删除、举报能力。 - 清屏、退出清屏、跨集清屏保持、暂停才显示中心播放按钮、倍速即时生效和拖动进度显示时间功能保留。
- 剧场移除
theater-language-chips、TheaterLanguage状态和筛选代码;分类 chips、搜索、失焦、下拉刷新保留。 - 我的页新增
mine-language菜单和mine-language-zh/en/id三选一弹窗;新增LocaleController通过 Provider 接管MaterialApp.locale,首次启动仍跟随resolveAppLocale,选择即时生效并持久化到app.locale。 - 删除失活的
player_text_size_sheet.dart、quality_sheet.dart及旧清晰度弹窗测试,保留播放页内嵌字体大小和清晰度分段能力。 - 数据缺口:评论总数/收藏数在接口未提供时隐藏;投屏、定时关闭、弹幕设置等无后端契约能力保持禁用,不伪造功能。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:35 +383: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
7.2s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,383 条测试全部通过,debug APK 构建成功。工作区原有 pubspec.lock 变更未纳入本批提交。真机验收由用户执行。
2026-10-20 ReelShort:K29.1 播放页视觉收紧
- 分支:
fix/flutter-k29-player-polish - 功能提交:
cf93d8d fix(flutter): 收紧播放页底部与互动栏 - develop 合并提交:
cc26c54 merge: 合并 K29.1 播放页视觉收紧,已推送。 - 去黑底补充分支:
fix/flutter-k29-player-light-panel - 补充提交:
e216277 fix(flutter): 改为浅色播放页底栏 - 补充合并提交:
9429257 merge: 合并 K29.1 浅色播放页底栏,已推送。 - 播放器背景改为
AppColors.ink;底部信息面板改为AppColors.card白底、深色文字和浅色顶部分割线;顶栏保留深色渐变,右侧 rail 保留深色半透明圆底。 - 删除「全屏观看」胶囊、
player-fullscreen-toggleKey、相关 l10n 和测试;清屏仍从更多面板「清屏播放」进入,右上退出按钮退出。 - 底部面板实测:390×844 基准下折叠高度 118px、上沿 726px;简介展开后仍不超过 200px、上沿不低于屏高 78%。默认只显示单行简介,点击整行展开,作者声明仅在展开且存在数据时显示。
- 右侧 rail 从屏高约 55% 下移到 464.2px,底部到 698.2px;与底部面板上沿 726px 不重叠。按钮图标 24px、数字 11px、按钮组间距 18px。
- 保留暂停才显示中心播放按钮、清屏跨集保持、倍速即时生效、拖动进度显示时间等既有口径。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:33 +383: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
7.0s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,383 条测试全部通过,debug APK 构建成功。工作区原有 pubspec.lock 变更未纳入本批提交。真机验收由用户执行。
2026-10-20 ReelShort:K29.2 播放页底栏清屏
- 分支:
fix/flutter-k29-bottom-clear - 功能提交:
1666bc2 fix(flutter): 底栏右侧改为清屏 - develop 合并提交:
b2284b3 merge: 合并 K29.2 底栏清屏,已推送。 - 底栏最右侧改为
player-bottom-clear-screen:Icons.fullscreen_rounded、tooltipclearScreen,点击调用actions.onClear进入清屏态,右上退出清屏按钮保留。 - 删除底栏
player-pip;PiP 平台可用时只保留在更多面板的player-more-pip,不重复显示。 - 复核播放器视觉:整页底色为
AppColors.ink,底栏为白色AppColors.card卡片并带浅色分割线;深色仅用于视频画面、顶栏渐变和视频上的 rail 圆底。 - 新增底栏清屏点击用例,并保留面板高度、rail 位置、暂停中心按钮、跨集清屏、倍速和拖动时间测试。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:42 +384: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
12.8s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,384 条测试全部通过,debug APK 构建成功。工作区原有 pubspec.lock 变更未纳入本批提交。真机验收由用户执行。
2026-10-20 ReelShort:K29.8 更多面板增加小窗播放
- 分支:
fix/flutter-k29-more-pip - 功能提交:
0af5de9 fix(flutter): 更多面板增加小窗播放入口 - develop 合并提交:
55d22a9 merge: 合并 K29.8 更多面板小窗播放,已推送。 PlayerMoreActions新增可选onPip;player_view_actions.dart的_openMore仅在logic.pictureInPicture.isPlatformSupported时传入() => logic.enterPip(context),否则为 null。player_more_sheet.dart在「清屏播放」与「离线缓存」之间新增「小窗播放」行,Keyplayer-more-pip,图标Icons.picture_in_picture_alt_rounded,文案复用三语已有的pictureInPicture;仅在onPip != null时渲染,不支持时整行隐藏、不置灰。- 点击后先关闭更多面板,再在下一帧触发
onPip,与清屏、离线缓存动作的关闭时序一致;底栏右侧仍为「清屏」,未重复放置 PiP。 - 新增
test/player/player_more_sheet_test.dart:onPip 为空时不渲染该行、传入时渲染且三行顺序为清屏→小窗→离线缓存、点击后回调一次且弹窗关闭。 player_fullscreen_test.dart用TargetPlatformVariant覆盖平台分支:Android 下更多面板出现player-more-pip,macOS 下不出现;原「已删除项」断言移除 pip。- 其余弹窗项(倍速、清晰度、清屏播放、离线缓存)与播放逻辑未改动。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:36 +388: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
25.4s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,388 条测试全部通过(较 K29.7 新增 4 条小窗用例),debug APK 构建成功。工作区原有 pubspec.lock 变更未纳入本批提交。真机验收由用户执行。
2026-10-20 ReelShort:K29.3 恢复播放器深色外观
- 分支:
fix/flutter-k29-dark-player - 功能提交:
1dbe2cb fix(flutter): 恢复播放器深色外观 - develop 合并提交:
d762511 merge: 合并 K29.3 深色播放器,已推送。 - 新增播放器专用色值:页面/面板
#0D0D10、次要文字#BBBBBB、底栏胶囊#1C1C1E、分割线#2A2A2D;不影响其他浅色页面。 - 页面背景改为
AppColors.playerBackground;底部信息面板改为深色AppColors.playerPanel,主文字白色、次文字#BBBBBB、分割线深色。 - 底栏「选集 · 全 n 集 · 免费观看」改为
#1C1C1E胶囊 + 白字;右侧继续保持 K29.2 的清屏按钮。 - 进度条保留橙色播放进度与白色 thumb,并将未播放轨道改为白色低透明度;拖动时时间预览不变。
- 移除
player_view.dart覆盖整页的四段式黑色渐变(0x66000000 → 0xE6000000);顶栏黑色渐变、视频画面和右侧 rail 深色半透明圆底保留。 - 其他口径不变:暂停才显示中心按钮、清屏跨集保持、倍速即时生效、拖动进度显示时间。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:44 +384: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
13.3s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,384 条测试全部通过,debug APK 构建成功。工作区原有 pubspec.lock 变更未纳入本批提交。真机验收由用户执行。
2026-10-20 ReelShort:K29.4 播放页透明化
- 分支:
fix/flutter-k29-transparent-player - 功能提交:
0af68f2 fix(flutter): 播放页改为透明叠层 - develop 合并提交:
a26b007 merge: 合并 K29.4 透明播放页,已推送。 - 播放页
Scaffold改为透明,不再绘制整页底色;视频未就绪时才使用黑色兜底,视频就绪后由视频画面铺满。 - 底部信息区移除整块背景、分割线和圆角卡片,剧名、
第 n 集 | 简介与进度条直接叠在视频上,并使用白色文字和阴影。 - 只有「选集 · 全 n 集 · 免费观看」保留
#B3000000深色半透明胶囊 + 白字;底栏右侧清屏按钮保留自己的圆形底。 - 顶栏移除整条渐变,仅保留文字/图标阴影和按钮圆形底;右侧互动 rail 保留深色半透明圆钮。
- 已确认播放器文件中不存在旧四段式黑渐变(
0x66000000 → 0xE6000000)。 - 其他口径不变:暂停才显示中心按钮、清屏跨集保持、倍速即时生效、拖动进度显示时间。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:35 +384: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
7.3s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,384 条测试全部通过,debug APK 构建成功。工作区原有 pubspec.lock 变更未纳入本批提交。真机验收由用户执行。
2026-10-20 ReelShort:K29.5 清屏范围与退出位置调整
- 分支:
fix/flutter-k29-clear-scope - 功能提交:
3068eb9 fix(flutter): 收窄清屏范围并保留底栏 - develop 合并提交:
b26ca6c merge: 合并 K29.5 清屏范围,已推送。 - 进度条口径补丁提交:
d849834 fix(flutter): 清屏时保留进度条 - 补丁合并提交:
08440b0 merge: 合并 K29.5 进度条保留修正,已推送。 - 清屏态现在只隐藏右侧互动 rail 和底部信息文案区(剧名、第 n 集/简介);进度条从文案区拆出,清屏时仍显示。
- 顶栏(返回/第 n 集/倍速/更多)、底部选集胶囊和右下角双态按钮保持可见。
- 右下角按钮普通态为清屏,清屏态切换为退出清屏;退出只恢复 rail 和底部文案,不改变播放态。
- 移除右上角旧退出清屏按钮;首页 feed 的独立退出按钮不受影响。
- 清屏态点击画面仍切换播放/暂停,清屏状态跨集保持。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:33 +384: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
7.8s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,384 条测试全部通过,debug APK 构建成功。工作区原有 pubspec.lock 变更未纳入本批提交。真机验收由用户执行。
进度条常驻补丁门禁:
$ flutter test
00:33 +384: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
7.6s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
2026-10-20 ReelShort:K29.6 精简更多面板
- 分支:
fix/flutter-k29-more-sheet - 功能提交:
c4797cd fix(flutter): 精简播放页更多面板 - develop 合并提交:
1e3e5b6 merge: 合并 K29.6 更多面板精简,已推送。 - 更多面板只保留倍速、清晰度、清屏播放、离线缓存四项;删除不感兴趣、弹幕开关、弹幕设置、文字大小、投屏、定时关闭,以及原有的无关额外项。
- 倍速和清晰度改为紧凑分段控件:高度 28、字号 12、圆角 8、左右 padding 10、段间距 6;选中为主色实心白字,未选中浅底深字。
- 弹窗加入顶部拖拽条,标题改为 15px,操作行高 44,分组间距 12,保留底部安全区留白;无粗描边。
- 清晰度仍按接口下发档位启用;仅 AUTO 时其他档位保持禁用并显示不可用说明。
- 移除已无引用的
player_text_scale.dart和文字大小弹窗相关状态,不影响清屏、暂停中心按钮、倍速或拖动进度逻辑。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:33 +384: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
7.1s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,384 条测试全部通过,debug APK 构建成功。工作区原有 pubspec.lock 变更未纳入本批提交。真机验收由用户执行。
2026-10-20 ReelShort:K29.7 更多弹窗倍速/清晰度单行排列
- 分支:
fix/flutter-k29-sheet-single-row - 功能提交:
f083a16 fix(flutter): 更多面板倍速清晰度改为单行排列 - develop 合并提交:
3b2bdb8 merge: 合并 K29.7 更多面板单行排列,已推送。 player_more_sheet.dart删除倍速、清晰度上方两组独立标题,改为_optionRow()单行结构:左侧固定 88px 图标 + 名称,右侧SingleChildScrollView(scrollDirection: Axis.horizontal)+Row横向排列选项;每组行高 44。- 分段样式沿用 K29.6:高度 28、字号 12、圆角 8、左右 padding 10、段间距 6;选中主色实心白字,未选中浅底深字。
- 档位多于行宽时可横向滑动(390 宽下 0.75x–3.0x 六个档位属此情形),不发生竖向换行;清晰度仍按接口下发档位启用,仅 AUTO 时其余置灰。
- 新增 Key:
player-more-speed-row、player-more-quality-row;原player-more-speed、player-more-quality语义保留在横向滚动容器上。 - 测试补充:两组行高 44、滚动方向为横向、点击 1.5x 后选中态(w700)与 1.0x 取消选中(w500)。
- 未改动播放逻辑;清屏、暂停中心按钮、跨集清屏、倍速即时生效、拖动进度时间等口径不变。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:34 +384: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
7.5s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,384 条测试全部通过,debug APK 构建成功。工作区原有 pubspec.lock 变更未纳入本批提交。真机验收由用户执行。
2026-10-20 ReelShort:K29.9 播放页底部细节调整
- 分支:
fix/flutter-k29-bottom-detail - 功能提交:
d25519b fix(flutter): 调整播放页底部信息排版 - develop 合并提交:
e39aa76 merge: 合并 K29.9 播放页底部细节,已推送。 - 标题行:
_detailRow由Expanded改为Flexible,剧名文本按内容宽度排布,>紧跟标题(间距 4),整行仍通过player-open-detail进入详情。 - 集数与简介:同一行、同为 12 号字并使用
CrossAxisAlignment.baseline基线对齐;简介maxLines: 1+ 省略。 - 展开/收起:删除右侧上下箭头图标,改为紧贴简介末尾的文字按钮(Key
player-synopsis-toggle,默认「展开/More/Selengkapnya」,展开后「收起/Less/Lebih sedikit」);展开显示简介全文,作者声明有值时一并显示,再点收起;新增 l10n keyexpandSynopsis三语。 - 进度条:
Slider显式设置padding: EdgeInsets.zero,去掉默认 24px 内缩,轨道改与上方文字共用 14px 水平内边距;拖动时间预览与 seek 逻辑不变。 - 选集条:字号 11→13.5、字重 w800,圆角 999→7,保持
playerOverlayPill深色半透明底 + 白字,上下 padding 增至 8。 - 清屏按钮:30×30→40×40,图标 17→22,与选集条在同一 Row 中线对齐;清屏范围与退出清屏行为未变。
- 长文本:标题、集号、简介、选集条文案均
maxLines: 1+TextOverflow.ellipsis且置于Flexible内;320 宽长标题/长简介用例无溢出。 - 展开态高度会增长(简介全文),原 K29.1 的 200px 上限调整为:收起态仍 ≤200 且位于屏高 78% 以下,展开态 ≤330 且不低于屏高 50%,并断言无布局异常。
测试补充:
should_toggle_synopsis_with_inline_text_button:默认单行 + 「More」紧贴简介,点击展开为「Less」且maxLines == null,再点恢复单行。should_fit_long_title_and_synopsis_at_320_width:长标题 + 长简介下箭头紧贴标题、简介单行省略、选集条不越界、takeException为空。should_keep_compact_bottom_panel_and_lower_rail:新增选集条字号 13.5、圆角 7、清屏按钮 40×40、Slider.padding == EdgeInsets.zero断言。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:33 +390: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
8.2s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,390 条测试全部通过(较 K29.8 新增 2 条底部排版用例),debug APK 构建成功。工作区原有 pubspec.lock 变更未纳入本批提交。真机验收由用户执行。
2026-10-20 FruitServer:K30-A 详情接口补互动数量
- 分支:
feature/backend-drama-counts - 功能提交:
671953b feat(app-api): 详情补充互动数量字段 - develop 合并提交:
f19d21e merge: 合并 K30-A 详情互动数量,已推送。 - 契约先行:先在
docs/api-phase1.md的 1.3 内容浏览补上/app/dramas/{id}完整响应示例与互动数量字段表,再改代码;明确Long计数按全局约定以 JSON 字符串下发,与既有viewCount一致。 AppDramaDetailVO新增likeCount、favoriteCount、commentCount(Long),JSON 字段同名,既有字段语义未动。AppCatalogService.dramaDetail装配:likeCount取drama.like_count、favoriteCount取drama.favorite_count、commentCount调互动域CommentService.countByDrama(dramaId)。CommentService.countByDrama:按drama_id统计content_comment,排除status = 'deleted';数据库逻辑删除记录由 MyBatis-Plus@TableLogic自动过滤;dramaId为空直接返回 0,不查库。- 未改管理端接口与管理端 VO;未改表结构(
drama.like_count/drama.favorite_count原已存在)。
测试补充:
AppCatalogControllerContractTest详情用例新增viewCount/likeCount/favoriteCount/commentCount断言,验证契约里的字符串序列化形态。- 新增
AppCatalogServiceTest:用替身依赖验证详情 VO 三个数量来源正确、调用countByDrama。 - 新增
CommentServiceCountTest:捕获查询条件验证按剧过滤且排除 deleted,同时覆盖空剧 ID 不查库。
门禁原始输出:
$ mvn test
[INFO] Reactor Summary for fruitshorts 1.0.0-SNAPSHOT:
[INFO] fruitshorts-module-commerce ......................... SUCCESS
[INFO] fruitshorts-admin-api .............................. SUCCESS (Tests run: 21)
[INFO] fruitshorts-app-api ................................ SUCCESS (Tests run: 59)
[INFO] fruitshorts-transcode-worker ....................... SUCCESS (Tests run: 12)
[INFO] BUILD SUCCESS
[INFO] Total time: 11.338 s
$ mvn -pl fruitshorts-app-api -am package -DskipTests
[INFO] fruitshorts-app-api ................................ SUCCESS
[INFO] BUILD SUCCESS
[INFO] Total time: 5.545 s
解读:全量后端测试 125 条(commerce 33 + admin-api 21 + app-api 59 + worker 12)全部通过,0 失败 0 错误;app-api 及其依赖模块打包成功。管理端未改动,表结构未改动。
2026-10-20 ReelShort:K30-B 播放页互动数量与评论面板收紧
- 分支:
feature/flutter-k30-counts-comments - 功能提交:
bed6bbb feat(flutter): 播放页互动数量与评论面板收紧 - develop 合并提交:
ced1ec3 merge: 合并 K30-B 播放页数量与评论面板,已推送。 Drama模型新增可选likeCount/favoriteCount/commentCount,详情 JSON 按字符串解析(沿用jsonToInt),卡片缺字段时保持 null,界面才回退文字标签。- 新增
formatInteractionCount:<10000显示原数,>=10000显示一位小数的「万」(如1.2万),并配单测钉住边界 9999 / 10000。 - 播放页右侧 rail:收藏、评论、喜欢显示数量,分享保持文字标签;点赞展示优先用点赞接口返回的最新计数(
InteractionController.likeCount),无接口结果时用详情快照;收藏按服务端确认后的状态 ±1 跟随。 - 评论面板收紧:面板左右 padding 20→12,标题 20→18,标题与列表间距 12→8;列表项上下 padding 8、头像 32→28(回复 22)、昵称 12、时间 10、正文 14→13 且行高 1.2。
- 输入区:输入框固定高 40、内部左右 padding 12、字号 13、圆角 20;发送按钮 32×32、图标 18,间距 8。
- 发送成功调用
FocusScope.of(context).unfocus()收起键盘;失败分支不清理输入、不移动焦点,继续保留原文便于修改。 - 其余播放/评论逻辑(分页、回复、点赞、删除、举报、票据、清屏)未改动。
测试补充(395 条,较 K29.9 新增 5 条):
should_show_rail_counts_from_detail_and_follow_server_results:详情数量1.2万 / 3200 / 96,分享无数量;点赞后按接口结果变2.3万;收藏后 3200→3201。should_unfocus_input_after_successful_post:发送成功后输入框失焦;阻断用例补充「失败保留焦点」断言。should_use_compact_comment_sizes:发送按钮 32×32、输入框高 40、头像半径 14、正文 13/行高 1.2。count_format_test与json_id_parsing_test覆盖计数格式化与字符串解析。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:34 +395: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
7.8s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,395 条测试全部通过,debug APK 构建成功。工作区原有 pubspec.lock 变更未纳入本批提交。真机验收由用户执行。
2026-10-20 ReelShort:K30-C 评论面板视觉重做
- 分支:
fix/flutter-k30-comments-polish - 功能提交:
9493ad2 fix(flutter): 重做评论面板视觉 - develop 合并提交:
edcd25f merge: 合并 K30-C 评论面板视觉重做,已推送。 - 仅改 Flutter:未动后端接口、VO 与字段。
- 输入区:输入框高 44、圆角 22、内部左右 14、底色新 token
AppColors.commentInput = #F5EFE8、文字/占位 14;发送按钮 36 圆形(主色底白图标,图标 18),与输入框垂直居中;底部继续由SafeArea(top: false)留出安全区。 - 评论列表:头像 32(回复 24)、昵称 13 粗体、时间 11 灰、正文 14 行高 1.4、点赞数字 11;列表项上下 padding 12、头像与内容间距 10;项间浅色分割线改为
AppColors.border并左缩进 42(与正文左边缘对齐)。 - 「展开 n 条回复」「回复」改为 12 号主色文字按钮,紧凑点按区域(最小高 28),点赞按钮同样收紧。
- 弹窗顶部:新增 36×4 拖拽条,标题「n 条评论」15 粗体 + 紧凑关闭按钮(20),标题区与列表间距 8;剧名副标题保留。
- 发送成功后
FocusScope.of(context).unfocus()收起键盘(沿用 K30-B);失败保留输入与焦点。 - 测试:原紧凑尺寸断言更新为 44 高输入框、36×36 发送按钮、头像半径 16、正文 14/1.4、输入框底色
commentInput,并新增拖拽条存在断言;发送成功失焦与失败保留焦点用例继续通过。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:34 +395: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
9.2s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,395 条测试全部通过,debug APK 构建成功。工作区原有 pubspec.lock 变更未纳入本批提交。真机验收由用户执行。
2026-10-20 ReelShort:K30-D 评论输入框尺寸与圆角修正
- 分支:
fix/flutter-k30-comment-input - 功能提交:
8709b64 fix(flutter): 修正评论输入框高度与圆角 - develop 合并提交:
ced0fae merge: 合并 K30-D 评论输入框尺寸修正,已推送。 - 仅改 Flutter 输入框区域:
_composerHeight44→52、_composerRadius22→12、_sendButtonSize36→40。 _composerDecoration的contentPadding改为EdgeInsets.symmetric(horizontal: 16, vertical: 14),保留isDense: true;底色AppColors.commentInput、无描边、hint/输入字号 14 均未变。TextField继续maxLines: 1+textAlignVertical: center,发送按钮 40×40 与输入框垂直居中、图标 18;回复提示条与输入框间距 6、发送成功收起键盘均保持原样。- 评论列表、弹窗其它区域、接口与后端零改动。
测试(先红后绿):先把既有尺寸断言改为 40×40 / 52,跑红灯确认实际仍是 36/44,再改实现转绿;should_use_polished_comment_sizes 现覆盖输入框高 52、发送按钮 40。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:36 +395: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
7.9s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,395 条测试全部通过,debug APK 构建成功。工作区原有 pubspec.lock 变更未纳入本批提交。真机验收由用户执行。
2026-10-20 ReelShort:K30-E 选集条箭头靠右
- 分支:
fix/flutter-k30-episodes-arrow - 功能提交:
90769de fix(flutter): 选集条箭头靠右排列 - develop 合并提交:
427e7a7 merge: 合并 K30-E 选集条箭头靠右,已推送。 - 仅改
player_overlay.dart的_bottomActions():选集胶囊内文本Flexible→Expanded,文本与keyboard_arrow_up_rounded间距SizedBox(width: 3)→8,箭头被推到胶囊内最右侧。 - 胶囊内边距(horizontal 14 / vertical 8)、背景、圆角 7、箭头颜色/尺寸 18/阴影、onTap 行为、右侧清屏按钮间距 8 均未变;进度条、标题行、清屏按钮与其它播放控件未动。
- 测试(先红后绿):新增
should_push_episodes_arrow_to_pill_right,在 900 宽视口断言箭头右边缘距胶囊右内边距 14、箭头与文本间距 8;改布局前实测箭头距右边缘 390.25(红灯),改后通过。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:37 +396: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
7.6s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,396 条测试全部通过,debug APK 构建成功。工作区原有 pubspec.lock 变更未纳入本批提交。真机验收由用户执行。
2026-10-20 ReelShort:K30-F 简介灰字统一与透明暂停按钮
- 分支:
fix/flutter-k30-synopsis-pause - 功能提交:
02763c3 fix(flutter): 简介灰字统一并透明暂停按钮 - develop 合并提交:
ac73bf2 merge: 合并 K30-F 简介灰字与透明暂停按钮,已推送。 _EpisodeSynopsisState:「第 n 集」、分隔符|、简介正文统一为同一套_lineStyle(fontSize 12、AppColors.playerMuted、w500、行高 1.35、文字阴影保留);分隔符用同色 0.6 透明度,不再使用白色。删除了原来的白色 w700_labelStyle。- 「展开/收起」按钮仍为主色 12 号;作者备注 10 号灰色未动。
PlayerCenterToggle:去掉AppColors.blue实底圆形与BoxDecoration,改为SizedBox(52×52)+ 白色 26 号图标,点击区域与 Keyplayer-play-toggle不变。- 只改这两处视觉,播放/清屏/选集/接口与后端均未动。
测试(先红后绿):新增 should_share_one_muted_style_across_label_and_synopsis 断言三段文字字号 12、字重 w500、颜色为 playerMuted 且分隔符非白色;player_center_toggle_test 改为断言 52×52 内不再有 Container 底色、图标 26 且为白色。改实现前两条均为红灯,改后通过。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:37 +397: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
14.3s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,397 条测试全部通过,debug APK 构建成功。工作区原有 pubspec.lock 变更未纳入本批提交。真机验收由用户执行。
2026-10-20 ReelShort:K30-F 追加放大透明暂停按钮
- 分支:
fix/flutter-k30-synopsis-pause(同一分支追加) - 功能提交:
8013cc1 fix(flutter): 放大透明播放按钮 - develop 合并提交:
b8d2617 merge: 合并 K30-F 播放按钮放大追加,已推送。 PlayerCenterToggle点击区域 52×52 → 72×72、图标 26 → 40,颜色保持白色;仍为透明背景,未恢复实底。- 图标新增轻微投影
Shadow(color: Colors.black54, blurRadius: 12),无底色与描边;尺寸/图标/阴影统一提取为文件常量。 - 其它组件、简介样式与所有播放逻辑未动。
- 测试(先红后绿):
player_center_toggle_test断言更新为 72×72、图标 40、无 Container 底色且存在阴影;改实现前为红灯,改后通过。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:35 +397: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
7.8s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,397 条测试全部通过,debug APK 构建成功。工作区原有 pubspec.lock 变更未纳入本批提交。真机验收由用户执行。
2026-10-20 ReelShort:K30-F 第二次追加(84/48 半透明圆底)
- 分支:
fix/flutter-k30-synopsis-pause(同一分支第二次追加) - 功能提交:
a72adcf fix(flutter): 放大播放图标并加半透明底 - develop 合并提交:
7bb2714 merge: 合并 K30-F 半透明播放按钮追加,已推送。 PlayerCenterToggle圆形直径 72 → 84、图标 40 → 48,图标保持白色并保留轻微投影。- 背景从完全透明改为半透明黑色圆形底
Colors.black26(不恢复蓝色实底,无描边);尺寸/图标/底色/阴影均为文件常量。 - 其它组件与播放逻辑未动。
- 测试(先红后绿):
player_center_toggle_test断言更新为 84×84、图标 48、圆形底Colors.black26、白色图标且阴影存在;改实现前为红灯,改后通过。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:37 +397: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
7.9s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,397 条测试全部通过,debug APK 构建成功。工作区原有 pubspec.lock 变更未纳入本批提交。真机验收由用户执行。
2026-10-20 ReelShort:K31-A 播放页长按手势(中间更多 / 两侧加速)
- 分支:
feature/flutter-k31-longpress - 功能提交:
96074bc feat(flutter): 播放页长按手势与加速态 - develop 合并提交:
7a7bf0c merge: 合并 K31-A 播放页长按手势,已推送。 player-video-tap增加onLongPressStart/onLongPressEnd/onLongPressCancel,用LayoutBuilder的宽度三分区:中间 1/3 触发onLongPressCenter复用_openMore(context, episode);左右各 1/3 触发onBoostStart,结束与取消都触发onBoostEnd。- 加速态(仅详情/选集进入的全屏播放页;首页
homeMode未接该手势):切 2.0 倍速并同步_playbackSpeed,进入清屏(隐藏 rail 与底部文案),进度条保留;进度条上方新增player-speed-boost-hint(橙色三角 + 13 号 w700 橙色文案 + 播放器文字阴影)。 - 长按状态在
_PlayerPageState:记录长按前的倍速与清屏状态,松手/取消后原样恢复并隐藏提示;长按不改播放/暂停状态;未做上滑锁定倍速。 PlayerOverlayData新增required bool boosting;PlayerOverlayActions新增onLongPressCenter/onBoostStart/onBoostEnd。- l10n 新增
speedBoosting(speed):zh「{speed} 倍速快进中」/ en「{speed}x speed」/ id「{speed}x kecepatan」,三份 arb 后用flutter gen-l10n生成。 - 未动后端与接口。
测试(新增 3 条):should_open_more_sheet_on_center_long_press(中间长按弹更多且仍播放)、should_boost_speed_on_side_long_press_and_restore(左右两侧长按出现提示、进度条仍在、倍速 2.0、松手恢复 1.0 与清屏前状态、播放态不变)、should_keep_previous_clear_state_after_boost(原本清屏则松手后仍清屏)。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:37 +400: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
7.6s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,400 条测试全部通过(较 K30-F 新增 3 条),debug APK 构建成功。工作区原有 pubspec.lock 变更未纳入本批提交。真机验收由用户执行。
2026-10-20 ReelShort:K31-A 追加修正(加速态隐藏底部选集/清屏)
- 分支:
feature/flutter-k31-longpress(同一分支追加) - 功能提交:
033ae59 fix(flutter): 加速态隐藏底部选集与清屏按钮 - develop 合并提交:
36c71e6 merge: 合并 K31-A 加速态底部修正,已推送。 player_overlay.dart的_bottom():data.boosting == true时不再渲染_bottomActions(),长按加速画面只剩进度条与「▸ 2.0 倍速快进中」提示(player-episodes-pill、player-bottom-clear-screen均隐藏)。- 非加速态布局完全不变:普通清屏仍显示选集胶囊与右下恢复按钮,其它控件未动。
- 测试(先红后绿):
should_boost_speed_on_side_long_press_and_restore增加加速态两处 Key 不存在、进度条与提示存在的断言;should_keep_previous_clear_state_after_boost增加松手后选集胶囊与清屏按钮恢复断言。改实现前红灯,改后通过。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:38 +400: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
12.9s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,400 条测试全部通过,debug APK 构建成功。工作区原有 pubspec.lock 变更未纳入本批提交。真机验收由用户执行。
2026-10-20 ReelShort:K31-B 首页频道悬浮轮播 + 全宽直角 + 下划线选中
- 分支:
feature/flutter-k31-home-channels - 功能提交:
a24f1fa feat(flutter): 首页频道叠加轮播并改下划线选中 - develop 合并提交:
290b92c merge: 合并 K31-B 首页频道与轮播改版,已推送。 home_browse_view.dart:新增_heroWithChannels(),SizedBox(heroBannerHeight)内 Stack,底层Positioned.fill放轮播、顶层Positioned(top:8)放频道行;无 banner 时退化为普通频道行。- 频道行去掉 ChoiceChip/StadiumBorder:44 高横向滚动,间距 20、左右 16;选中 15 号 w800、未选中 w600;图上白字(未选中 white70 + 阴影)、非叠加 onSurface/muted;选中下划线 18×2 圆角 1(图上白色、非叠加主色),未选中透明占位。Key 保持
home-channels/home-channel-<name>,新增home-channel-underline-<name>。 FeedBannerCarousel新增可选flush(默认 false):首页 hero 传flush: true且去掉左右 padding,轮播宽度等于屏宽、ClipRRect 与点击层圆角均为 0;发现页保持 0.94 视口与原圆角。- 交互不变:点击仍调用
logic.selectChannel。
测试(改写 + 新增):
should_switch_home_channel_when_underline_tab_is_tapped:选中白色下划线/未选中透明、字重 800/600、图上文字 white/white70,点击后横线与字重切换。should_render_flush_hero_with_channels_overlaid:home-hero-banner宽 390=屏宽、left=0、ClipRRect 圆角 0,频道行位于home-hero-section内且 top=hero.top+8。- 发现页轮播、首页布局相关用例继续通过(flush 默认 false)。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:35 +401: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
7.0s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,401 条测试全部通过,debug APK 构建成功。工作区原有 pubspec.lock 变更未纳入本批提交。真机验收由用户执行。
2026-10-20 ReelShort:K31-C 首页频道选中态改主题色
- 分支:
fix/flutter-k31-channel-accent - 功能提交:
0e48c07 fix(flutter): 首页频道选中态改用主题色 - develop 合并提交:
cfc41ef merge: 合并 K31-C 频道选中态主题色,已推送。 _channelItem():选中项文字与下划线统一为AppColors.blue(叠加图上与非叠加场景一致),文字阴影保留;未选中保持图上white70/ 非叠加muted,字重 w600、字号 15 不变。- 横线 18×2、圆角 1、间距 4 与所有 Key 不变;其它布局未动。
- 测试同步:
should_switch_home_channel_when_underline_tab_is_tapped的选中态断言改为AppColors.blue(文字与横线),并补充切换后未选中项回到 white70。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:36 +401: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
7.0s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,401 条测试全部通过,debug APK 构建成功。工作区原有 pubspec.lock 变更未纳入本批提交。真机验收由用户执行。
2026-10-20 ReelShort:K31-D 首页频道行滚动吸顶
- 分支:
feature/flutter-k31-sticky-channels - 功能提交:
7cc65b7 feat(flutter): 首页频道行滚动吸顶 - develop 合并提交:
8e2cd5c merge: 合并 K31-D 首页频道吸顶,已推送。 home_browse_view.dart:频道行从 ListView 内容移出,_body改为Stack;底层Positioned.fill(RefreshIndicator + ListView(controller)),顶层Positioned(top:0)放频道层,初始仍悬浮在轮播图上。ScrollController监听偏移:offset >= heroBannerHeight - 44(196)切吸顶态——背景AppColors.ink+ 底部 1px 分隔线,未选中AppColors.muted,选中仍为AppColors.blue,并挂home-channels-pinned;未过阈值保持透明叠加配色(未选中 white70、选中主题色)。- 无 banner 时频道行始终吸顶并使用非叠加配色;
HomeBrowseHeader、刷新逻辑与既有 Key 未动。 - 频道行外层加纵向拖动转发(
onVerticalDragUpdate手动滚动页面列表),自身横向滚动不受影响,纵向手势不会被挡住。 - 测试:改写 K31-B 叠加用例(频道层不在
home-browse-page内、top 与 hero 顶部一致、无 pinned key);新增should_pin_home_channels_when_scrolling:上滑 300 后home-channel-hot的屏幕 y 不变且出现home-channels-pinned。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:36 +402: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
7.1s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,402 条测试全部通过(较 K31-C 新增 1 条吸顶用例),debug APK 构建成功。工作区原有 pubspec.lock 变更未纳入本批提交。真机验收由用户执行。
2026-10-20 ReelShort:K31-E 首页剧卡压缩 + 播放次数上封面 + 去掉加号
- 分支:
feature/flutter-k31-home-card-compact - 功能提交:
124ba75 feat(flutter): 压缩首页剧卡并把播放次数上封面 - develop 合并提交:
40e2379 merge: 合并 K31-E 首页剧卡压缩,已推送。 home_drama_grid.dart:封面比例 3/4 → 5/6(覆盖高度由卡宽 1.33 倍降到 1.2 倍);卡片内边距 12 → 8;封面→标题 10 → 6;标题/题材/元信息间距 4 → 2(统一为文件常量)。- 播放次数移到封面左下角
Positioned(left:8,bottom:8):AppColors.playerOverlayPill胶囊 + 10 号白色播放图标 +formatInteractionCount(viewCount)文案(3200 / 1.2万),Keyhome-drama-views-<id>迁到该角标。 - 删除
_addSize/_addIconSize与圆形加号;_metadata()只保留集数文本(Key 与样式不变)。 - 其它角标(免费/原创、锁定集数、总集数)与标题、题材未动。
测试:home_card_style_test 改为断言加号不存在、views 角标在封面内且文案为 1.2万、封面高宽比 1.2、卡片总高 < 卡宽×1.6;同时给吸顶用例补充 10 部剧的数据,保证压缩后页面仍有足够内容滚过阈值。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:36 +402: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
7.3s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,402 条测试全部通过,debug APK 构建成功。工作区原有 pubspec.lock 变更未纳入本批提交。真机验收由用户执行。
2026-10-20 ReelShort:K31-F 首页剧卡移除封面锁定角标
- 分支:
fix/flutter-k31-remove-lock - 功能提交:
1fc25ec fix(flutter): 首页剧卡移除封面锁定角标 - develop 合并提交:
e32fa58 merge: 合并 K31-F 移除封面锁定角标,已推送。 home_drama_grid.dart:删除_cover()中_lockedBadge()分支、_lockedBadge()方法与仅供其使用的_lockedCountgetter;左上免费/原创、左下播放次数、右下总集数保持不变。- 发现页
lib/pages/discover/widgets/drama_grid.dart未改动,锁定角标保留。 - 测试:
home_card_style_test去掉18 locked断言,改为断言home-drama-locked-style-drama不存在;首页与发现页其余用例保持通过。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:36 +402: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
7.2s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,402 条测试全部通过,debug APK 构建成功。工作区原有 pubspec.lock 变更未纳入本批提交。真机验收由用户执行。
2026-10-20 ReelShort:K31-G 首页顶栏通知铃铛
- 分支:
feature/flutter-k31-home-bell - 功能提交:
524b7f5 feat(flutter): 首页顶栏改为通知铃铛入口 - develop 合并提交:
2abb8c7 merge: 合并 K31-G 首页通知铃铛,已推送。 home_browse_header.dart:删除星期文字与_weekday(),替换为Icons.notifications_none_rounded铃铛按钮,尺寸/圆形底/图标色与头像一致(AppDimens.tapTarget、AppColors.card、AppColors.onSurface),Keyhome-notifications,Semantics 用l10n.notices。- 点击直接
Navigator.push现有NoticesPage,无登录门槛;顶栏仍是「搜索(Expanded) → 铃铛 → 头像」,间距spaceSm不变,构造参数未新增。 - arb 中 weekday 文案 key 保留未删;其它页面未动。
测试:home_preview_layout_test 的 home-weekday 断言改为 home-notifications,新增「点击铃铛后出现 notices-page」用例。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:37 +403: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
12.8s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,403 条测试全部通过(较 K31-F 新增 1 条铃铛入口用例),debug APK 构建成功。工作区原有 pubspec.lock 变更未纳入本批提交。真机验收由用户执行。
2026-10-20 ReelShort:K32-A 剧场页按参考图重做
- 分支:
feature/flutter-k32-theater-redesign - 功能提交:
5a51af4 feat(flutter): 剧场页按参考图重做 - develop 合并提交:
edfef61 merge: 合并 K32-A 剧场页重做,已推送。 - 顶栏:去掉头像,搜索框整行(高 40、白底、圆角 18),右侧内嵌「识剧」胶囊(Key
discover-identify,浅灰底 + 定位图标 + 文案),点击显示 SnackBar;discover-searchKey 未变。 - 分类:去掉 ChoiceChip,改为 44 高横向纯文字 tab(间距 20、左右 14),选中 16 w800 onSurface、未选中 15 w500 muted;Key
theater-category-chips/theater-category-*保留。 - 工具行:筛选/排行榜/新剧/预约 四个等宽按钮(白底、圆角 10、1px 边框、高 36、彩色图标),Key
theater-toolbar-*;筛选打开底部面板(theater-filter-sheet、选项 Keytheater-filter-option-*)并调用selectCategory,其余三个提示即将上线。 - 卡片:去掉白卡底/阴影/内边距/锁定/总集数/加号;封面 3/4 圆角 10 全宽
BoxFit.cover;左上绿色「免费/原创」角标;左下热度角标(火焰 +formatInteractionCount+ 热度,Keydrama-heat-*);标题最多两行 15 w700;题材标签最多 3 个灰底胶囊(Keydrama-tag-chip-<id>-<index>)。网格左右 12、列距 8、行距 14。 - l10n:新增
reserve/identifyDrama/heatLabel(count),comingSoon中文改为「即将上线」,三份 arb 后flutter gen-l10n。 - 搜索态、刷新、错误/空态、详情跳转与底部 4 槽导航均未改。
测试:新增工具按钮/热度/题材标签断言、筛选面板用例、识剧 SnackBar 用例;discover-profile 断言改为 discover-identify;横向分类 ListView 与纵向列表并存导致的两处 find.byType(ListView) 歧义改为只匹配纵向列表。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:36 +405: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
12.7s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,405 条测试全部通过(较 K31-G 新增 2 条),debug APK 构建成功。工作区原有 pubspec.lock 变更未纳入本批提交。真机验收由用户执行。
2026-10-20 ReelShort:K32-A 追加移除「识剧」入口
- 分支:
feature/flutter-k32-theater-redesign(同一分支追加) - 功能提交:
5e2fba1 fix(flutter): 移除搜索框识剧入口 - develop 合并提交:
698fb12 merge: 合并 K32-A 识别入口移除,已推送。 - 搜索框移除「识剧」胶囊(
discover-identify)、onIdentify回调与_identifyPill,搜索框仍整行占满(高 40、白底、圆角 18、左侧放大镜 + 输入区),顶栏不加回头像。 - l10n 删除
identifyDrama(三份 arb + 生成文件);comingSoon仍供筛选外三个工具按钮使用。 - 测试:移除
discover-identify存在性与点击 SnackBar 用例;搜索输入、分类切换、筛选面板等断言保留。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:40 +404: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
7.7s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,404 条测试全部通过,debug APK 构建成功。工作区原有 pubspec.lock 变更未纳入本批提交。真机验收由用户执行。
2026-10-20 ReelShort:K33-A 首页改为沉浸式 feed 流
- 分支:
feature/flutter-k33-home-feed - 功能提交:
b7926d6 feat(flutter): 首页改为沉浸式 feed 流 - develop 合并提交:
53cd2db merge: 合并 K33-A 首页沉浸式 feed,已推送。 home_view.dart的_home()改为PlayerPage(homeMode: true, embedded: true, active: tab==0, drama: 首部, feedDramas: 全部, onDramaChanged/onImmersiveChanged 接 HomeLogic, onSearch 跳剧场并聚焦, onDiscover/onMy 切 Tab);浏览型首页组件全部保留未删,仅取消首页引用。- 首页打开即竖向 feed,上滑沿用播放器现有 PageView 换剧;清屏仍通过
onImmersiveChanged隐藏底栏;切 Tab 暂停、切回保持当前剧与集;底部仍 4 槽。 - 测试迁移:
discover_banner_test(首页轮播 hero 集成)删除,轮播组件测试保留;home_preview_layout_test/home_nav_ui_test/widget_test的浏览首页断言改为 feed(home-feed-title);k28_a_navigation_test重写为 feed 版:进入首页即 feed、上滑标题变化、切剧场 feed 隐藏、feed 搜索跳剧场聚焦、剧场筛选/卡片跳转/320 宽度;HomeDramaCard组件测试保留。 widget_test预加载用例改为在首页 feed 创建播放器后清空记录,再统计剧场播放器。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:38 +399: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
7.2s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,399 条测试全部通过,debug APK 构建成功。工作区原有 pubspec.lock 变更未纳入本批提交。真机验收由用户执行。
K33-A 补充:失效轮播用例清理
- 功能分支遗漏了旧测试删除(
test/discover/discover_banner_test.dart),已在fix/flutter-k33-drop-banner-test补提交fe84244 test(flutter): 移除失效的首页轮播用例,并以d6b055d merge: 合并 K33-A 失效轮播用例清理合并回 develop 推送。 - 合并后在 develop 复跑
dart analyze lib test零告警、flutter test399 条全过。
2026-10-20 ReelShort:K33-B 首页 feed 浮层按参考图重做
- 分支:
feature/flutter-k33-feed-overlay - 功能提交:
ee6f0d7 feat(flutter): 按参考图重做首页 feed 浮层 - develop 合并提交:
ea28420 merge: 合并 K33-B 首页 feed 浮层重做,已推送。 - 顶部:汉堡
home-feed-menu(打开更多)、4 个纯文字 tab(关注/漫剧/真人剧/推荐,推荐默认选中,白字 + 18×2 白横线),关注/漫剧提示即将上线,右侧仅搜索home-feed-search;清屏改为更多弹窗里的home-feed-clear。 - 右侧 rail:收藏/评论/喜欢/分享,前三项数量用
formatInteractionCount(Keyrail-*-count)。 - 底部信息:弹幕胶囊
home-feed-danmaku+ 全屏观看胶囊home-feed-fullscreen、系列信息home-feed-series-meta、两行剧名home-feed-title、最多 4 个标签home-feed-tags、作者声明(非空才显示);删除旧 GlassPanel 信息卡与追剧/选集按钮。 - 底部整集进度条
home-feed-full-series:0xCC000000 横条 + 播放图标 + 「观看完整剧集 · 全N集」+ 右箭头 + 2px 橙色进度线(跟随播放进度),点击打开选集面板。 player_viewhomeMode 分支补充 controller、favorite/comment/like 数量、onDetail、onFullscreen(推入全屏播放页)。- l10n 新增
danmaku/watchFullscreen/seriesMeta/watchFullSeries/feedTab*,另加authorNoteLabel供作者声明前缀(三语),执行flutter gen-l10n。 - 浮层拆分为
home_feed_overlay.dart(479 行)+home_feed_overlay_parts.dart(393 行),满足单文件 ≤500 行;320 宽下弹幕/全屏胶囊改为 Flexible + ellipsis,消除 25px 溢出。
测试:feed 结构用例改写为新版(顶部 tab、数量格式化、整集进度条、标签),新增「点击整集进度条打开选集」「弹幕/关注提示即将上线」。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:39 +400: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
8.6s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,400 条测试全部通过,debug APK 构建成功。工作区原有 pubspec.lock 变更未纳入本批提交。真机验收由用户执行。
2026-10-20 ReelShort:K33-B 追加(去掉关注 tab + 首页深色导航)
- 分支:
feature/flutter-k33-feed-overlay(同一分支追加) - 功能提交:
d36d62f fix(flutter): 去除关注 tab 并加深色首页导航 - develop 合并提交:
435fbbb merge: 合并 K33-B 深色首页导航追加,已推送。 - feed 顶部只保留「漫剧 / 真人剧 / 推荐」三个 tab(推荐默认选中),漫剧提示即将上线;
feedTabFollowing从三份 arb 与生成文件删除。 AppBottomNav新增dark(默认 false):dark 时背景0xE6000000、顶边 1pxColors.white12、未选中图标/文字Colors.white70,选中仍为主题橙;浅色样式保持AppColors.bar+AppColors.border+navUnselected。home_view._nav只传dark: logic.tab == 0,不再手动指定背景色。- 测试:首页断言深色背景/白色分隔线/未选中 white70,切到剧场后恢复浅色背景与分隔线;关注 tab 用例改为漫剧。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:38 +400: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
7.4s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,400 条测试全部通过,debug APK 构建成功。工作区原有 pubspec.lock 变更未纳入本批提交。真机验收由用户执行。
2026-10-20 ReelShort:K33-C 首页 feed 精修
- 分支:
fix/flutter-k33-feed-polish - 功能提交:
321c626 fix(flutter): 精修首页 feed 交互与底色 - develop 合并提交:
c3f5f43 merge: 合并 K33-C 首页 feed 精修,已推送。 - 删除底部弹幕/全屏观看两个胶囊及 l10n
danmaku/watchFullscreen(三份 arb + 生成文件)。 - 新增公共
interaction_rail.dart:34×34 深色圆底 IconButton、图标 24、11 号 w600 白字、项间距 18;播放页与 feed 共用,播放页 Keyplayer-rail-*、feed Keyrail-*,数量formatInteractionCount,无数据显示文字。 - 整集条点击改为打开全屏播放页:
PlayerPage新增onOpenFullPlayer(Drama, Episode),home_view 用logic.playDrama(..., episodeId);底部进度线改为 20px 手势区,可点按/拖动 seek(home-feed-progress,onScrubStart/onSeek接logic.beginScrub/seekTo)。 - 首页 feed 纯黑底:
_HomeTabsState._scaffold在 tab==0 时backgroundColor: Colors.black;其它 Tab 保持透明暖色。 - 顶部左侧改为刷新按钮
home-feed-refresh(Icons.refresh_rounded,tooltipretry),点击触发PlayerPage.onRefreshFeed→catalog.load;为保证原有「清屏/下载/小窗」入口不丢失,更多弹窗改为长按刷新按钮打开。 - 其余结构(三 tab、系列信息、标题、标签、作者声明、深色底栏、滑动切剧)未变。
测试:移除弹幕/全屏断言;新增首页黑底、刷新按钮、进度拖动 seek、整集条跳全屏播放页断言;播放页 rail 断言保持通过。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:37 +401: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
7.5s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,401 条测试全部通过,debug APK 构建成功。工作区原有 pubspec.lock 变更未纳入本批提交。真机验收由用户执行。
K33-C 补充:清理遗留 danmaku 文案 key
- 发现旧批次残留的
danmakul10n key(无代码引用),已用fix/flutter-k33-drop-danmaku-key提交521ebfc fix(flutter): 清理未使用的弹幕文案 key并合并(f94926c)。 - 合并后复跑
dart analyze lib test零告警、flutter test401 条全过、flutter build apk --debug成功。
2026-10-20 ReelShort:K33-D 首页 feed 去底色 + 整集条优化 + 返回续播
- 分支:
fix/flutter-k33-feed-clean - 功能提交:
636b369 fix(flutter): 首页 feed 去底色并优化整集条 - develop 合并提交:
a312672 merge: 合并 K33-D 首页 feed 精修,已推送。 - 首页无底色:Scaffold 背景回到透明;首页 Tab 不再绘制
pageGradient(渐变只在非首页 Tab 绘制,带 Keyhome-page-gradient);HomeFeedOverlay删除顶部/底部黑色 scrim;首页状态栏用SystemUiOverlayStyle.light。 - 整集条:去掉 0xCC000000 深色底,高度 44,图标/文案/箭头垂直居中;2px 进度线贴底,20px 手势区可点按/拖动 seek;新增白色进度圆点 Key
home-feed-progress-thumb,常态 6×6、拖动 10×10。 - 返回续播:
PlayerPage.onOpenFullPlayer改为异步,await 路由返回后仅在mounted && widget.active(仍在首页 Tab)时logic.session.setUserWantsPlay(true),当前剧/集不重置。 - 其余结构(三 tab、刷新、系列信息、标题、标签、作者声明、rail、清屏、滑动切剧、深色底栏)未变。
测试:新增首页透明底/无渐变、状态栏浅色、切剧场恢复深色状态栏、整集条高 44 且文案垂直居中、圆点 6→10→6、从整集条进入播放页返回后恢复播放。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:37 +403: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
7.3s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,403 条测试全部通过,debug APK 构建成功。工作区原有 pubspec.lock 变更未纳入本批提交。真机验收由用户执行。
2026-10-20 ReelShort:K33-E 首页 feed 无感刷新 / rail 下移 / 进度细节
- 分支:
fix/flutter-k33-feed-refresh - 功能提交:
82fe237 fix(flutter): 首页 feed 静默刷新与进度条细节 - develop 合并提交:
564c0db merge: 合并 K33-E 首页 feed 刷新与进度优化,已推送。 CatalogController.refresh():静默 fetchHomeFeed,成功替换并 notify、返回 true;失败返回 false,且不改loading/error/旧数据。feed 刷新按钮改用catalog.refresh(),失败在player_view弹catalogErrorSnackBar,刷新期间不出现全屏 loading。- rail 对齐
Alignment(1.0, 0.68),底部不与信息区/整集条重叠。 - 整集条背景
0x4D000000通栏、高 44;进度圆点中心与轨道中心严格重合(都以距条底 6px 为基准);常态轨道 2px / 圆点 6px,拖动中 4px / 10px,松手回落;手势区 24px。进度区只接管横向拖动,整条点击仍打开全屏播放页,避免点文字被 seek 抢走。 - 其余结构未变。
测试:新增 CatalogController.refresh 成功/失败用例(失败保留旧数据且 loading 不变);首页刷新不出现全屏 loading;rail 位于底部信息上方;整集条背景色/高度、圆点与轨道同心、拖动 4/10 与松手 2/6。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:39 +407: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
12.7s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,407 条测试全部通过,debug APK 构建成功。工作区原有 pubspec.lock 变更未纳入本批提交。真机验收由用户执行。
2026-10-20 ReelShort:K33-F 首页 feed rail 下移 / 拖动放大 / 刷新转圈 / 长按加速
- 分支:
fix/flutter-k33-feed-longpress - 功能提交:
ea9ea6e fix(flutter): feed 长按加速与刷新转圈 - develop 合并提交:
e800f59 merge: 合并 K33-F feed 长按与刷新,已推送。 - rail 对齐改
Alignment(1.0, 0.80),底边仍在底部信息上方。 - 进度拖动:常态轨道 2px / 圆点 6px,拖动中轨道 6px / 圆点 14px;圆点与轨道中心统一以距条底 8px 为基准严格同心。
- 刷新转圈:
onRefreshFeed改回Future<bool> Function();点击后按钮换 18×18 白色CircularProgressIndicator(Keyhome-feed-refreshing),期间禁重复点击,完成恢复图标;不触发全屏 loading。 - 长按与播放页一致:HomeFeedOverlay 底层
Positioned.fill手势层,中间 1/3 长按打开更多弹窗,左右 1/3 长按触发_startBoost/_endBoost(2.0x + 清屏);加速态隐藏顶部 tab/rail/底部信息,保留整集条与橙色进度线,并在整集条上方显示home-feed-speed-boost-hint;松手或指针取消都会恢复。清屏态下 overlay 常驻挂载,用visible控制内容。 - 其余结构未变。
测试:rail 位置、拖动 6/14 与同心、刷新转圈出现并在完成后消失且不重复触发、长按中间弹更多、长按两侧出现加速提示且整集条仍在、松手恢复。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:38 +410: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
7.3s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,410 条测试全部通过,debug APK 构建成功。工作区原有 pubspec.lock 变更未纳入本批提交。真机验收由用户执行。
2026-10-20 ReelShort:K33-G feed rail 底部对齐 + 更多弹窗复用播放页
- 分支:
fix/flutter-k33-feed-more - 功能提交:
7e415f6 fix(flutter): feed rail 底部对齐并复用播放页更多 - develop 合并提交:
28ff9a7 merge: 合并 K33-G feed rail 与更多弹窗,已推送。 - rail 在 Expanded 区内改为
Align(Alignment.bottomRight)+ 底部 12 内边距,紧贴底部信息上方,不再使用百分比对齐。 HomeFeedOverlay新增required VoidCallback onMore:中间 1/3 长按与刷新按钮长按都走该入口;删除 feed 私有_FeedMoreSheet/_openMore及onPip参数。player_viewhomeMode 传onMore: () => _openMore(context, episode),复用播放页PlayerMoreSheet(倍速/清晰度/清屏/下载/小窗),状态取_playbackSpeed/logic.qualities,清屏复用_hideChrome。- 其余(rail 样式、两侧长按加速、刷新转圈、整集条、底部信息、深色底栏、滑动切剧、返回续播)未变。
测试:rail 底部对齐(与底部信息间距 ≤20)、长按中间出现 player-more-sheet、旧 home-feed-clear/download/pip 不存在。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:38 +410: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
7.4s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,410 条测试全部通过,debug APK 构建成功。工作区原有 pubspec.lock 变更未纳入本批提交。真机验收由用户执行。
2026-10-20 ReelShort:K33-H 画中画回前台复位
- 分支:
fix/flutter-k33-pip-resume - 功能提交:
bc8f3bc fix(flutter): 回前台复位残留画中画状态 - develop 合并提交:
9b99d96 merge: 合并 K33-H 画中画回前台复位,已推送。 PlayerLogic.onLifecycle:回前台时若pip || pipPreparing为 true,先复位两者再notify()+notifyImmersive(),随后照常做票据重取与setAppResumed(true)。- 修复部分机型退出画中画不回调
onPipChanged(false)导致chromeHidden恒 true、播放浮层与首页底栏全部消失的问题;未改原生代码、未改正常进出画中画流程,当前剧/集与进度不变,feed 与全屏页同时生效。 - 测试:新增
should_clear_stale_pip_when_app_returns_to_foreground,模拟 pip 残留后 resumed,断言 pip/pipPreparing 复位、chromeHidden 为 false、onImmersiveChanged 最后为 false。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:39 +411: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
1.953s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,411 条测试全部通过,debug APK 构建成功。工作区原有 pubspec.lock 变更未纳入本批提交。真机验收由用户执行。
2026-10-20 ReelShort:K33-I feed rail 再下移 / 拖动恢复播放 / 清屏保留顶栏与进度
- 分支:
fix/flutter-k33-feed-clear - 功能提交:
c87798f fix(flutter): feed 清屏保留顶栏并寻址恢复播放 - develop 合并提交:
8327c1d merge: 合并 K33-I feed 清屏与寻址恢复,已推送。 - rail 移出 Column,改为最外层 Stack 的
Positioned(right: 10, bottom: 56)(整集条 44 + 12);底部信息区右侧预留 56 内边距,标题/标签不再进入 rail 区域。 PlayerLogic.seekTo成功后调用resumeAfterSeek():暂停态拖动进度直接恢复播放;播放页 SeekProgressBar 与 feed 整集条共用该逻辑。- feed 清屏:overlay 常驻挂载,清屏仅隐藏 rail 与底部系列信息/标题/标签/作者声明;顶部(刷新/tab/搜索)与整集条(含拖动进度线)保留;退出清屏按钮从右上角移到右下
Positioned(right: 12, bottom: 56),Key 不变;清屏点击画面切播放/暂停与长按行为保持。 - 其余(深色底栏、刷新转圈、返回续播、画中画回前台复位、滑动切剧)未变。
测试:rail 底边距整集条 12、标题右缘不进入 rail;resumeAfterSeek 在暂停时置为播放;清屏后顶部三件套与整集条仍在、rail/标题消失、退出按钮在右下,点击恢复全部控件。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:38 +413: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
7.4s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,413 条测试全部通过,debug APK 构建成功。工作区原有 pubspec.lock 变更未纳入本批提交。真机验收由用户执行。
2026-10-20 ReelShort:K33-J 清屏态进度可拖动 + 暂停时长按恢复播放
- 分支:
fix/flutter-k33-feed-clear-seek - 功能提交:
b2c219d fix(flutter): 清屏态进度可拖动并长按恢复播放 - develop 合并提交:
33de925 merge: 合并 K33-J 清屏进度与长按恢复,已推送。 - 删除 player_view 清屏态叠加的全屏
home-feed-video-tap手势层(它盖住 overlay 整集条、吞掉拖动);点击播放切换统一由 overlay 的home-feed-gesture处理,清屏态整集条(2px 进度线、圆点、24px 手势区)保持可点按/拖动 seek。 _startBoost:若当前userWantsPlay == false,先setUserWantsPlay(true)再切 2.0 倍速;_endBoost仅恢复倍速与清屏状态,不恢复暂停;播放页与 feed 共用。- 其余不变。
测试:清屏态下 overlay 仍显示顶栏与整集条,拖动进度触发 seek;暂停时长按两侧后中心播放按钮消失(已恢复播放)、出现 2.0 倍速提示,松手后仍为播放。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:38 +415: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
7.1s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,415 条测试全部通过,debug APK 构建成功。工作区原有 pubspec.lock 变更未纳入本批提交。真机验收由用户执行。
2026-10-20 ReelShort:暂停按钮缩小(68 / 36)
- 分支:
fix/flutter-k33-pause-size - 功能提交:
551da77 fix(flutter): 缩小播放暂停按钮 - develop 合并提交:
1cb4c56 merge: 合并 K33 暂停按钮尺寸调整,已推送。 PlayerCenterToggle直径 84 → 68、图标 48 → 36;半透明黑底Colors.black26、白色图标与轻投影不变;点击区域随之为 68×68,Keyplayer-play-toggle/home-feed-center-play不变。- 测试同步:共享按钮用例改为 68 / 36。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:39 +415: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
7.3s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,415 条测试全部通过,debug APK 构建成功。工作区原有 pubspec.lock 变更未纳入本批提交。真机验收由用户执行。
2026-10-20 ReelShort:K33-K 首页 feed 顶栏固定悬浮
- 分支:
fix/flutter-k33-feed-header - 功能提交:
9175a7f fix(flutter): 首页 feed 顶栏固定悬浮 - develop 合并提交:
f9d4f98 merge: 合并 K33-K 首页 feed 固定顶栏,已推送。 - 新增
home_feed_header.dart:HomeFeedHeader(l10n, onRefresh, onSearch, onMore),自带刷新转圈与 tab 选中;Keyhome-feed-refresh/home-feed-refreshing/home-feed-tab-anime|real|recommend/home-feed-search全部迁入。 PlayerPagehomeMode 在竖向 PageView 之外的 Stack 顶层用Positioned(top:0,left:0,right:0)+ SafeArea 固定渲染 header;显示条件!_boosting && !(pip || pipPreparing),清屏态仍显示;切 Tab 时整页 offstage。HomeFeedOverlay移除 header 及 tab/refresh 状态,只保留手势层、rail、底部信息、整集条、加速提示;构造参数同步精简(移除 onEpisodes/onDownload/onClear/onSearch/onRefreshFeed/onPip)。- 其余行为不变:刷新静默、长按中间更多、长按两侧加速、整集条、清屏、返回续播、画中画复位。
测试:新增「上滑切剧后刷新/tab/搜索屏幕坐标不变」;加速态 header 隐藏、松手恢复;清屏态 header 仍显示(既有用例);刷新转圈用例迁到 HomeFeedHeader。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:38 +416: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
7.3s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,416 条测试全部通过,debug APK 构建成功。工作区原有 pubspec.lock 变更未纳入本批提交。真机验收由用户执行。
2026-10-20 ReelShort:K34-A 剧场页搜索精致化 + 筛选吸顶 + 下拉刷新
- 分支:
feature/flutter-k34-theater-polish - 功能提交:
5283ab2 feat(flutter): 剧场页搜索与吸顶筛选精致化 - develop 合并提交:
63ace3b merge: 合并 K34-A 剧场页精致化,已推送。 - 搜索框:高 40、圆角 20、白底 + 1px
AppColors.border+ 轻阴影;图标 17、hint 13.5;聚焦时描边主题橙、阴影加深,AnimatedContainer160ms 过渡;Keydiscover-search不变,新增外壳 Keydiscover-search-shell。 - 分类 tab + 工具按钮合并为吸顶头
theater-sticky-header:放在滚动区外的 Stack 顶层(列表顶部预留 102 头高),滚动时原地不动;offset > 0时背景 200ms 渐变为AppColors.ink+ 底部 1px 分隔线 + 轻阴影,回顶恢复透明;分类 tab 仍横向滚动。 - 下拉刷新:
RefreshIndicator主色、strokeWidth: 2、edgeOffset = 102 + 8;刷新时保留网格与滚动位置,只有首屏为空才显示整块 loading。 - 其余(搜索态、分类切换、工具按钮、卡片、底栏)未变。
测试:搜索框圆角/边框与聚焦变蓝;滑动后吸顶头位置不变且背景变 ink;刷新指示器颜色/strokeWidth/edgeOffset 断言。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:49 +419: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
12.2s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,419 条测试全部通过,debug APK 构建成功。工作区原有 pubspec.lock 变更未纳入本批提交。真机验收由用户执行。
2026-10-20 ReelShort:K34-B 剧场搜索框改为参考图样式
- 分支:
fix/flutter-k34-theater-search - 功能提交:
eccd3c6 fix(flutter): 剧场搜索框改为浅灰胶囊 - develop 合并提交:
7a75ee6 merge: 合并 K34-B 剧场搜索框样式,已推送。 - 常态:填充
AppColors.commentInput、无边框、无阴影、高 44、圆角 22、左右内边距 14。 - 图标 18
AppColors.subtle与文字间距 8;hint/输入 14,垂直居中;聚焦时填充变白并显示 1pxAppColors.blue描边(160ms 过渡),失焦恢复浅灰无边框。 - Key
discover-search/discover-search-shell保留,右侧无按钮,onTapOutside 行为不变;吸顶筛选头与edgeOffset(102 + 8)不受影响,刷新指示器仍在筛选头下方。 - 测试:常态断言圆角 22、填充 commentInput、透明边框、高 44;聚焦后填充 card、描边主题橙。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:39 +419: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
12.5s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,419 条测试全部通过,debug APK 构建成功。工作区原有 pubspec.lock 变更未纳入本批提交。真机验收由用户执行。
2026-10-20 ReelShort:K34-C 搜索框白底 + 榜单/新剧/预约页
- 分支:
feature/flutter-k34-ranking-pages - 功能提交:
bfba2b7 feat(flutter): 剧场搜索框改白底并新增榜单新剧预约页 - develop 合并提交:
ffedde0 merge: 合并 K34-C 榜单新剧预约页,已推送。 - 搜索框:常态改回白色
AppColors.card(高 44、圆角 22、无描边无阴影),聚焦 1px 主题橙描边,160ms 过渡。 - 新增
PlainPageScaffold:ink 背景 + 返回栏 + 标题/副标题 + 可滚动内容,无底部导航;返回 Key 由各页面传入。 - 榜单页
RankingPage(Keyranking-page):按 viewCount 降序取前 50,行内 TOP n(第 1 主色 22 w900、2#B8860B、3#8C837B、其余 subtle 18)、72×96 封面、两行标题、题材标签、火焰+热度,白卡圆角 14 轻阴影,点击进详情;Keyranking-row-<i>/ranking-top-<n>。 - 新剧页
NewReleasesPage(Keynew-releases-page):按 id 倒序,复用DramaGrid;预约页ReservePage(Keyreserve-page):reserve-empty空态 + 禁用「即将上线」按钮,不伪造列表。 - 剧场工具行「排行榜/新剧/预约」改为 Navigator 跳转新页面,筛选仍开分类面板。
- l10n 新增
newReleasesSubtitle/reserveSubtitle/reserveEmptyTitle/reserveEmptyHint/topLabel(n)(三语)。
测试:搜索框常态白底;榜单 TOP 1 且播放量最高者置顶、点击进详情;新剧页 DramaGrid 数据按 id 倒序;预约页空态与禁用按钮;三处跳转与返回。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:39 +423: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
7.4s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,423 条测试全部通过,debug APK 构建成功。工作区原有 pubspec.lock 变更未纳入本批提交。真机验收由用户执行。
2026-10-20 ReelShort:K34-D 榜单页三强横排 + 第 4 名起列表
- 分支:
fix/flutter-k34-ranking-podium - 功能提交:
881088a feat(flutter): 榜单页三强横排与第四名起列表 - develop 合并提交:
d80fff7 merge: 合并 K34-D 榜单三强横排,已推送。 - 前三横排:TOP 2(左)/ TOP 1(中)/ TOP 3(右),Row 底边对齐;中间封面 120×160、两侧 92×124、圆角 12;封面左上角 TOP 角标(Key
ranking-top-1/2/3,主色/金色/古铜渐变胶囊、白字 11 w800);封面下剧名(中间 15 w800、两侧 13 w700,1 行省略),点击进详情;不足 3 部只渲染实际名次。 - 第 4 名起:纵向列表,Key
ranking-row-<index>(index 从 3 开始),TOP n 名次 18 w800、72×96 封面、两行标题、题材标签、火焰+热度。 - 前三与列表在同一 ListView 内滚动;页面仍为 ink 背景 + 返回栏 + 标题/副标题;其它页面与搜索框白底未变。
- 测试:前三封面尺寸、左右位置、底边对齐;5 部数据时出现
ranking-row-3且无ranking-row-2;1 部数据时只有ranking-top-1。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:39 +426: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
9.0s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,426 条测试全部通过,debug APK 构建成功。工作区原有 pubspec.lock 变更未纳入本批提交。真机验收由用户执行。
2026-10-20 ReelShort:K34-E 榜单铺满/列表补内容 + 剧场仅分类吸顶与下划线
- 分支:
fix/flutter-k34-podium-sticky - 功能提交:
04a1a4e feat(flutter): 榜单前三铺满与剧场分类吸顶下划线 - develop 合并提交:
9949b61 merge: 合并 K34-E 榜单与吸顶优化,已推送。 - 榜单 TOP3:改为
Expanded(flex 100 / 115 / 100)+ 间距 8,封面AspectRatio(3/4)自适应铺满整行(左右 14),底边对齐,角标与详情跳转不变。 - 榜单第 4 名起:标题 2 行 + 简介(2 行、12 muted,空值不占位)+ 题材标签最多 3 个 + 火焰热度 + 共 N 集;行内 padding 10、行距 12、白卡圆角 14。
- 剧场:吸顶头只保留分类 tab(44 高),工具行回到列表内随滚动;分类选中态 16 w800 + 下方 18×2 主题色横线(Key
theater-category-underline-<id|all>),未选中 15 w500 muted + 透明占位;吸顶背景动效保留,edgeOffset重算为 44 + 8 = 52。 - 其它页面与搜索框白底未变。
测试:TOP3 铺满(左右边距、中间更宽、底边对齐)、第 4 名行展示简介、分类下划线随选中切换、滚动后分类行不动而工具行滚出、刷新 edgeOffset 52。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:39 +427: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
7.3s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,427 条测试全部通过,debug APK 构建成功。工作区原有 pubspec.lock 变更未纳入本批提交。真机验收由用户执行。
2026-10-20 ReelShort:K34-E 追加(剧场/榜单/新剧卡片直达播放页)
- 分支:
fix/flutter-k34-podium-sticky(同一分支追加) - 功能提交:
720fd26 fix(flutter): 剧场与榜单卡片直接进播放页 - develop 合并提交:
963f376 merge: 合并 K34-E 卡片直达播放追加,已推送。 - 新增
lib/pages/player/open_player.dart的playDramaFromCatalog(context, drama, {episodeId}):先CatalogController.requireDetail补齐剧集(失败回退卡片数据),再携带WalletController/DownloadControllerpushPlayerPage。 - 剧场双列卡片、榜单 TOP3 与第 4 名起列表、新剧页
DramaGrid全部改为直接进播放页,不再进详情页;HomeLogic.playDrama也改为复用该方法,去掉重复实现与多余导入。 - 播放页内的详情入口、首页 feed 标题点击详情等既有行为未变。
测试:榜单 TOP1 与新剧页卡片点击断言 player-scaffold;剧场卡片用例保持通过。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:41 +428: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
7.2s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,428 条测试全部通过,debug APK 构建成功。工作区原有 pubspec.lock 变更未纳入本批提交。真机验收由用户执行。
2026-10-20 ReelShort:K34-G 修复剧场分类行上滑闪烁 + 收紧间距
- 分支:
fix/flutter-k34-theater-flicker - 功能提交:
d1abfd4 fix(flutter): 修复剧场吸顶分类行闪烁并压缩间距 - develop 合并提交:
72410b2 merge: 合并 K34-G 剧场吸顶修复,已推送。 - 吸顶状态改用
ValueNotifier<bool> _headerPinned:滚动监听只在阈值状态变化时写值,不再setState重建整页;ValueListenableBuilder只重建背景层,分类行内容通过KeyedSubtree('theater-sticky-content')缓存不随滚动重建。 - 分类行与工具行间距:工具行上内边距 10 → 2,分类行下与工具行间隙 ≤6;工具行到网格仍为 12。
- 吸顶背景动效(200ms、ink + 1px 分隔线 + 轻阴影)、下划线选中、工具行滚走、下拉刷新 edgeOffset 52 均保持。
测试:连续上滑两次再回顶,分类行屏幕 y 三次都与初始一致;分类行底与工具行顶间距在 0–6 之间;既有吸顶/下划线/刷新用例继续通过。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:40 +430: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
7.1s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,430 条测试全部通过,debug APK 构建成功。工作区原有 pubspec.lock 变更未纳入本批提交。真机验收由用户执行。
2026-10-20 ReelShort:K35-A 剧场封面去角标 + 创作页按参考重做
- 分支:
feature/flutter-k35-create-redesign - 功能提交:
6e9a93c feat(flutter): 去掉剧场封面角标并重做创作页 - develop 合并提交:
fcc1995 merge: 合并 K35-A 创作页重做,已推送。 - 剧场卡片:删除封面左上「免费/原创」角标(
drama-tag-<id>及其方法/常量);左下热度角标、标题与题材标签保留。 - 创作页:28 w800「创作」+ 副标题;两张 196 高竖排白卡(Key
create-ai/create-upload,圆角 20、阴影、标题 22 w900 + 副标题 13 muted、右上 36 圆形箭头),右下插画区分别为渐变块 + auto_awesome + 星点 + "Every Story Matters" 与渐变块 + cloud_upload + 胶片装饰 + "Ready to publish";点击仍进占位页。 - 底部新增两行标语(Key
create-motto-primary/secondary)+ 96×2 主色横线(create-motto-line);l10n 新增createMottoPrimary/createMottoSecondary(三语)。 - 页面背景仍为暖色渐变,底部导航不变。
测试:剧场封面不存在 drama-tag-*;创作页卡片高 196、标语与横线尺寸断言,原有占位页跳转用例继续通过。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:41 +430: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
7.4s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,430 条测试全部通过,debug APK 构建成功。工作区原有 pubspec.lock 变更未纳入本批提交。真机验收由用户执行。
2026-10-20 ReelShort:K34-H 彻底修复剧场分类行上滑闪动
- 分支:
fix/flutter-k34-sticky-flash - 功能提交:
6463436 fix(flutter): 吸顶分类行背景常驻清除闪动 - develop 合并提交:
fdee89b merge: 合并 K34-H 吸顶闪动修复,已推送。 - 根因:吸顶行背景在 offset==0 时透明,滚动后 200ms 渐变为 ink,动画期间列表内容透出形成闪动。
- 修复:吸顶背景常驻
AppColors.ink不再动画;ValueListenableBuilder只切换底部 1px 分隔线与阴影(160ms 过渡);分类行仍用KeyedSubtree('theater-sticky-content')不随滚动重建。 - 剧场页内容区(含嵌入首页 Tab)包
ColoredBox(Key theater-page-surface, AppColors.ink),覆盖外层暖色渐变,搜索框区域与吸顶行同色无接缝。 - 间距、下划线选中、工具行滚走、刷新 edgeOffset 52 保持不变。
测试:offset 0 与上滑后吸顶背景均为 AppColors.ink、上滑后出现底部 AppColors.border 分隔线;剧场页面底色为 ink。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:44 +431: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
7.6s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,431 条测试全部通过,debug APK 构建成功。工作区原有 pubspec.lock 变更未纳入本批提交。真机验收由用户执行。
2026-10-20 ReelShort:K36-A 新剧首映厅 + 档期预约页
- 前置状态:K34-H 已合并,功能提交
6463436,develop 合并提交fdee89b;剧场吸顶背景常驻AppColors.ink,闪动修复已留痕。 - 分支:
feature/flutter-k36-premiere-reserve - 功能提交:
4f81bcf feat(flutter): 新剧首映厅与档期预约页 - develop 合并提交:
85ba2a4 merge: 合并 K36-A 首映厅与档期预约,已推送。 - 新剧页:暗棕渐变首映厅视觉、浅色状态栏、返回栏、标题与本周上新数量胶囊;16:9 今日首映 Hero(NEW 角标、剧名、题材、热度、主色播放键);22 高胶片分隔;最多 12 部的横向更多新剧卡片(108×144、剧名、MM/dd);Hero 与卡片均直达播放页;无数据时显示空态。
- 预约页:
AppColors.ink背景、返回栏与档期预约标题;本周 7 天可切换日期胶囊,今天默认主色选中;票根式空态卡(圆角 20、两侧半圆缺口、虚线 CustomPainter、铃铛及空态文案)与「去新剧页看看」跳转;「预约后你会得到」三张步骤卡;未伪造预约数据。 - 剧场工具行「新剧 / 预约」分别进入上述页面,其它页面保持不变。
- l10n:新增
newReleasesTitle、newReleasesCount(n)、premiereToday、newBadge、reserveTitle、goNewReleases、reserveStepsTitle、reserveStep1/2/3、reserveWeek,同步 zh/en/id 三份 ARB 并执行flutter gen-l10n。
测试:覆盖新剧页首映 Hero、横向新剧列表、NEW 角标与直达播放页;预约页 7 天周历、今天选中态、票根空态、三张步骤卡与「去新剧页看看」跳转;剧场工具行入口继续通过。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:48 +431: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
8.0s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,431 条测试全部通过,debug APK 构建成功。工作区原有 pubspec.lock 变更未纳入本批提交。真机验收由用户执行。
2026-10-20 ReelShort:K37-A 剧场筛选页
- 前置状态:K34-H 已合并(功能提交
6463436,合并提交fdee89b);K36-A 已合并(功能提交4f81bcf,合并提交85ba2a4)。 - 分支:
feature/flutter-k37-filter-page - 功能提交:
850f8e7 feat(flutter): 新增剧场筛选页 - develop 合并提交:
7250b5f merge: 合并 K37-A 剧场筛选页,已推送。 - 新增
lib/pages/filter/filter_page.dart(Keyfilter-page):返回栏与居中标题;体裁、主题、语言、推荐四组条件,左侧当前值胶囊与右侧 Wrap 选项;默认展示前两组,200ms 展开/收起;三列实时结果网格。 - 新增
lib/pages/filter/widgets/filter_result_card.dart:3:4 封面、圆角 10、爆剧角标、单行标题与「集数 · 热度 · 分类」元信息,点击统一走playDramaFromCatalog直达播放页。 - 数据来源:体裁取自
CategoryController.categories;主题取自目录genre/category去重拆词;语言取自目录language;推荐排序为全部推荐、最新上架(id 倒序)和最高热度(viewCount 倒序)。无结果时显示filter-empty。 - 剧场工具行「筛选」改为 push 独立筛选页,不再打开旧分类底部弹窗。
- l10n:新增
filterGroupCategory、filterGroupTheme、filterGroupLanguage、filterGroupSort、sortNewest、sortHottest、expandFilters、collapseFilters、filterEmpty、hotBadge、filterAll,同步 zh/en/id 三份 ARB 并执行flutter gen-l10n。
测试:新增筛选页 4 个用例,覆盖分组展开、分类筛选、最新/热度排序、爆剧角标与元信息、卡片直达播放和组合条件空态;剧场入口用例改验独立页打开与返回。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:44 +435: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
7.4s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,435 条测试全部通过,debug APK 构建成功。工作区原有 pubspec.lock 变更未纳入本批提交。真机验收由用户执行。
2026-10-20 ReelShort:K38-A 短剧详情页重做
- 前置状态:K37-A 已合并,功能提交
850f8e7,合并提交7250b5f。 - 分支:
feature/flutter-k38-detail-redesign - 功能提交:
69faa78 feat(flutter): 重做短剧详情页 - develop 合并提交:
7b2970d merge: 合并 K38-A 短剧详情页重做,已推送。 - 页面结构:暖色渐变操作区与主信息区,返回/分享/更多;96×128 封面、20 w800 标题、总集数与独立收藏按钮;三列数据卡展示热度、收藏和点赞,缺失收藏回退总集数、缺失点赞显示
—。 - 内容区:简介默认三行并按实际文本溢出显示展开/收起;分类、题材、语言去重后最多四个浅橙胶囊;六列选集紧接简介,格高 44、圆角 10,免费/锁定/当前集分别使用白底描边、raised 加锁和主色实底。
- 底部固定 CTA 高 46、圆角 23,保留续播进度与进度错误重试;加载、失败、空剧集统一为暖橙浅色配色;移除无数据支撑的评分、演员与剧评模块。
- 组件拆分:
drama_detail_header.dart、drama_detail_sections.dart、drama_detail_bottom_bar.dart,页面与组件均控制在 500 行以内。 - l10n:新增
synopsisTitle,同步 zh/en/id 三份 ARB 并执行flutter gen-l10n。
测试:覆盖新版顶部结构、封面尺寸、收藏样式切换、三列数据与空值回退、简介三行截断及展开、六列选集排序、锁定角标、点击选集进入原始索引、固定 CTA 与 320 宽紧凑视口。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:47 +437: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
7.9s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,437 条测试全部通过,debug APK 构建成功。工作区原有 pubspec.lock 变更未纳入本批提交。真机验收由用户执行。
2026-10-20 ReelShort:K39-A 二级页头统一与新剧暖色恢复
- 前置状态:K38-A 已合并,功能提交
69faa78,合并提交7b2970d。 - 分支:
feature/flutter-k39-subpage-header - 功能提交:
1c6c921 feat(flutter): 统一二级页头并恢复新剧暖色 - develop 合并提交:
9864c8e merge: 合并 K39-A 二级页头统一,已推送。 - 新增
lib/core/widgets/subpage_header.dart:AppSubpageHeader高 52/带副标题 64、左右 14、透明背景;返回按钮 36×36,浅色页 card 圆底、深色页透明底白图标;标题 18 w800 左对齐,和返回按钮间距 12;支持副标题、actions 与 onBack。 PlainPageScaffold改为复用公共页头,统一覆盖榜单、设置、观看记录、收藏、下载、钱包、商店、分类页、通知、账户四页和「我的」占位页;筛选、预约、新剧、创作占位页直接接入公共页头;详情页返回按钮复用同一 36×36 深色实现。- 删除二级页面默认
AppBar和私有返回栏实现,保留原有<page>-backKey,并为原先缺少 Key 的页面补齐稳定返回 Key。 - 新剧页恢复暖色首映厅:
AppColors.ink背景 +surfaceTop顶部渐变、深色状态栏;统一页头;NEW 角标主色;本周上新胶囊badgeBeige + blue;胶片分隔条改 raised 底与 border 孔洞;横向更多新剧改白卡、深色剧名和弱化日期。 - 预约、筛选、榜单配色保持不变,仅替换页头。
测试:新增公共页头尺寸、标题规格、按钮间距、副标题高度与深色模式测试;抽查筛选、榜单、预约、新剧、设置、通知页返回按钮 36×36 与标题 18 w800;新剧页额外断言 ink 背景和主色 NEW 角标。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:45 +440: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
7.7s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,440 条测试全部通过,debug APK 构建成功。工作区原有 pubspec.lock 变更未纳入本批提交。真机验收由用户执行。
2026-10-20 ReelShort:K40-A 播放 loading 主题色与封面占位
- 前置状态:K39-A 已合并,功能提交
1c6c921,合并提交9864c8e。 - 分支:
fix/flutter-k40-player-loading - 功能提交:
fa5fd12 fix(flutter): 优化播放加载占位与主题色 - develop 合并提交:
1eea9fa merge: 合并 K40-A 播放加载修复,已推送。 - 播放未就绪时
player-fallback-background改为剧集封面RemoteImage+0x66000000遮罩;封面为空时仍回落纯黑。 - 票据 loading 与播放会话 loading 的颜色统一改为
AppColors.blue,并增加稳定测试 Key。
测试:更新播放器 fallback 覆盖断言,新增空封面回落黑色用例;播放器专项 27 条全部通过。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:44 +441: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
7.4s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,441 条测试全部通过,debug APK 构建成功。工作区原有 pubspec.lock 变更未纳入本批提交。真机验收由用户执行。
2026-10-20 ReelShort:K40-B 评论输入登录闸
- 前置状态:K40-A 已合并,功能提交
fa5fd12,合并提交1eea9fa。 - 分支:
fix/flutter-k40-comment-auth - 功能提交:
d0c1a5f fix(flutter): 评论输入增加登录闸 - develop 合并提交:
457d2fa merge: 合并 K40-B 评论登录闸,已推送。 - 未登录时评论输入框
readOnly + canRequestFocus=false,点击只触发ensureSignedIn,不会先聚焦或弹键盘;取消保持失焦,登录成功返回后自动聚焦。 - 未登录点击发送时先走登录闸,再判断空内容;不再先走空内容短路。已登录空内容与提交行为保持原样。
- 未登录 hint 使用新增
commentLoginHint(登录后参与评论 / Sign in to comment / Masuk untuk berkomentar),已登录仍使用writeComment。 - 评论列表匿名可读,回复、点赞、删除、举报既有登录闸不变。
测试:新增未登录点击输入框不聚焦、取消后保持失焦、登录成功返回后聚焦、未登录发送不产生评论;评论面板专项 16 条全部通过,既有评论用例保持通过。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:43 +444: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
7.8s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,444 条测试全部通过,debug APK 构建成功。工作区原有 pubspec.lock 变更未纳入本批提交。真机验收由用户执行。
2026-10-20 ReelShort:K63-A 首页 feed 跳转登录页时暂停播放
- 前置状态:K62-A 已完成并合并,develop 合并提交
911f13f。 - 分支:
fix/player-pause-on-route - 功能提交:
699fd42 fix(player): 路由覆盖时暂停播放 - develop 合并提交:
210ccc9 merge: 合并 K63-A 首页 feed 跳转登录页暂停播放,已推送。 - 新增全局
appRouteObserver并挂到MaterialApp.navigatorObservers;PlayerPage通过RouteAware防重复订阅当前PageRoute,路由被普通页面覆盖时调用onRouteCovered(),返回时调用onRouteRevealed()。 PlayerLogic.onRouteCovered()关闭路由可见状态、取消拖动并保存进度;onRouteRevealed()在当前页面仍挂载时恢复当前活动 Tab 的播放状态。首页 feed 进入登录页会暂停,返回后恢复。- 测试新增普通
PageRoute覆盖后暂停/返回恢复,以及首页 feed 进入AuthPage后暂停、返回恢复两个场景。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:48 +475: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
8.0s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,475 条测试全部通过,debug APK 构建成功。真机验收由用户执行。
2026-10-20 ReelShort:K62-A 安卓桌面图标资源改造
- 前置状态:K61-A 已完成并合并,develop 合并提交
51e9402。 - 分支:
fix/android-launcher-icon - 功能提交:
4c8ae7b fix(android): 按设计源图重做桌面图标资源 - develop 合并提交:
911f13f merge: 合并 K62 安卓桌面图标资源,已推送。 - 按设计源图重做 Android 五档密度桌面图标、前景图和独立背景图,共提交 16 个资源文件(11 个修改、5 个新增)。
mipmap-anydpi-v26/ic_launcher.xml使用五档@mipmap/ic_launcher_background与@drawable/ic_launcher_foreground自适应图标组合,不再使用旧 inset/72% 缩放配置。- 未修改 Dart 代码、启动图或其它资源;未使用
git add -A,未夹带无关文件。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:54 +473: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
10.5s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,473 条测试全部通过,debug APK 构建成功。安卓桌面图标改造等待用户真机验收。
2026-10-20 ReelShort:K41-A 登录页输入修复与视觉升级
- 前置状态:评论入口登录闸与详情页按钮修正均已合并,develop 最新合并提交为
f72cb41。 - 分支:
feature/flutter-k41-auth-redesign - 功能提交:
81bb154 feat(flutter): 修复登录输入并升级登录页 - develop 合并提交:
7285a1c merge: 合并 K41-A 登录页重设计,已推送。 - 修复邮箱/密码输入不可见:文字改为
AppColors.onSurface15 号、光标主色;输入框白底、1px border、圆角 14、高 52,聚焦主色描边,错误态红色描边,hint 14 subtle。 - 落地页升级:暖色页面渐变 + 右上 surfaceTop / 左下 gold 0.18 光斑;72 Logo 渐变圆角 20 + 白色播放图标 36;品牌 24 w900、副标语 13 muted;手机号/邮箱 CTA 均高 50、圆角 25,主次样式与 12 间距符合口径。
- 邮箱卡片:白卡、圆角 20、内边距 20、轻阴影;登录/注册分段高 36;字段标签 12 w700、间距 6/14;提交按钮高 50、圆角 25,错误文案红 12。
- auth-back 改为复用公共 40×40 白底描边阴影返回按钮;键盘 viewInsets 处理与所有既有 Key 保持。
测试:新增输入文字颜色/光标、CTA 高度与主次样式、卡片圆角/内边距/阴影、错误字号、auth-back 40×40;既有登录、注册、错误提示、密码可见性、小屏键盘布局用例全部保持通过。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:45 +447: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
13.4s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,447 条测试全部通过,debug APK 构建成功。工作区原有 pubspec.lock 变更未纳入本批提交。真机验收由用户执行。
2026-10-20 ReelShort:K42-A 收藏页/观看历史页 UI 重做与刷新修复
- 前置状态:K41-A 已合并,develop 合并提交
7285a1c。 - 分支:
feature/flutter-k42-library-pages - 功能提交:
794dc87 feat(flutter): 重做收藏与观看历史页 - develop 合并提交:
9f4dc93 merge: 合并 K42-A 收藏与观看历史页重做,已推送。 - 修复观看历史刷新一直转圈:
WatchRecordsController._uniqueRecords()命中详情缓存时直接回填drama且detailLoading=false;_hydrate()也会把缓存回填到本次重建的 records;刷新失败保留旧列表,刷新期间不清空、不切整页 loading。 - 观看历史页改用
AppSubpageHeader,新增条数统计与主色清空按钮;卡片改为白底圆角 14、阴影、72×96 封面、15 w700 onSurface 标题、4px 主色进度条、11 号进度与更新时间,右上为 32 圆形删除按钮。 - 收藏页改用
AppSubpageHeader,新增收藏数量;自定义白卡包含 80×106 封面、28 星标取消按钮、两行标题、单行题材标签、热度与总集数。 - 两页下拉刷新统一为
AppColors.blue、strokeWidth 2,使用AlwaysScrollableScrollPhysics;空态、错误态与详情跳转保持。
测试:新增连续两次 load 后缓存详情无 detailLoading 残留、刷新失败保留旧列表;两页补充页头/统计/标题颜色/封面尺寸/删除按钮/紧凑刷新断言。
门禁原始输出:
$ dart analyze lib test
Analyzing 2 items...
No issues found! (ran in 3.7s)
$ flutter test
00:45 +449: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
7.8s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,449 条测试全部通过,debug APK 构建成功。环境产生的 pubspec.lock 版本漂移已还原,未纳入本批提交。真机验收由用户执行。
追加修正:
- 追加提交:
f623240 fix(flutter): 优化观看历史删除按钮 - develop 合并提交:
4c9bb18 merge: 合并 K42-A 观看历史删除按钮修正,已推送。 - 观看历史卡片叉号替换为 32×32 圆形删除按钮,浅灰 raised 底、18 号
delete_outline_rounded、muted 色,保留 ripple、watch-record-remove-<id>Key 与原删除行为。 - 测试同步断言删除图标存在、
close_rounded不存在。 - 追加重跑门禁:
dart analyze lib test零告警,449 条测试全部通过,debug APK 构建成功(7.1s)。
收藏页星标追加修正:
- 追加提交:
1d8582d fix(flutter): 调整收藏页星标操作 - develop 合并提交:
37802b2 merge: 合并 K42-A 收藏页星标修正,已推送。 - 收藏按钮由粉色爱心改为 20 号星形,已收藏
star_rounded、未收藏star_border_rounded;28×28 浅灰圆底,点击保留轻震动并取消收藏。 - 移除卡片长按取消行为和顶部「长按卡片可取消收藏」提示,同时删除三语文案 Key;空收藏态也改用星形图标。
- 测试同步断言星形存在、爱心不存在,点击后对应卡片消失。
- 门禁:
dart analyze lib test零告警,449 条测试全部通过,debug APK 构建成功(8.0s)。
2026-10-20 ReelShort:K43-A 修复首页冷启动灰屏
- 前置状态:K42-A 主任务、观看历史删除按钮、收藏页星标两条追加均已合并,develop 合并提交
37802b2。 - 分支:
fix/flutter-k43-cold-start-flash - 功能提交:
0d2680e fix(flutter): 修复首页冷启动灰屏 - develop 合并提交:
dc73f4e merge: 合并 K43-A 首页冷启动灰屏修复,已推送。 RemoteImage新增可选fallbackColor,默认仍为AppColors.bar,列表、详情、收藏等其它页面占位不变。- 播放页未就绪封面占位使用
fallbackColor: Colors.black,黑色遮罩从0x66000000调整为0x4D000000,避免近白底色与遮罩混合成中灰。 - 首页 feed 每页最底层新增纯黑
ColoredBox(Keyhome-feed-black-background),player-fallback-background、封面与遮罩 Key 均保留;_HomeTabsValueKey 策略未改。
测试:新增播放未就绪封面的 fallbackColor == Colors.black、遮罩颜色 0x4D000000、首页 feed 纯黑底层存在断言。
门禁原始输出:
$ dart analyze lib test
Analyzing 2 items...
No issues found! (ran in 3.1s)
$ flutter test
00:46 +449: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
7.8s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,449 条测试全部通过,debug APK 构建成功。真机冷启动是否仍有灰屏由用户验收。
2026-10-20 ReelShort:K44-A 个人资料页精简与保存文案修正
- 前置状态:K43-A 已合并,develop 合并提交
dc73f4e。 - 分支:
fix/flutter-k44-profile - 功能提交:
b2a8bfa fix(flutter): 精简个人资料并修正保存文案 - develop 合并提交:
0ad2cd5 merge: 合并 K44-A 个人资料页修正,已推送。 - 删除个人资料页生日字段、
_birthday状态、日期选择与格式化逻辑,以及account-birthdayKey;保存时不再向页面保存调用传 birthday。 - 中文
save文案由「收藏」修正为「保存」;英文保持Save、印尼语保持Simpan,该 Key 仍仅由个人资料保存按钮使用。 - 昵称、性别、只读资料、保存错误提示与统一返回按钮均保持不变。
测试:个人资料页用例改为中文环境,断言无 account-birthday、按钮显示「保存」、昵称保存成功且提交的 birthday 为 null。
门禁原始输出:
$ dart analyze lib test
Analyzing 2 items...
No issues found! (ran in 2.6s)
$ flutter test
00:46 +449: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
7.6s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,449 条测试全部通过,debug APK 构建成功。真机验收由用户执行。
2026-10-20 ReelShort:K45-A 全站文字下拉刷新
- 前置状态:K44-A 已合并,develop 合并提交
0ad2cd5。 - 分支:
feature/flutter-k45-pull-to-refresh - 功能提交:
5bdcb98 feat(flutter): 统一文字下拉刷新 - develop 合并提交:
805762f merge: 合并 K45-A 文字下拉刷新,已推送。 - 新增
AppPullToRefresh:监听顶部过度滚动 0~96px,56px 进入 armed;指示区固定悬浮、不挤压列表,支持「下拉刷新 / 松手刷新 / 正在刷新…」三态、箭头翻转、18px 主题色进度圈、完成后 200ms 收回及刷新中防重入。 - 替换 discover、favorites、watch_records、downloads、notices 三处、wallet、home_browse 共 9 处
RefreshIndicator;discover 保留吸顶头高度 + 8 的偏移,下载与钱包列表补齐AlwaysScrollableScrollPhysics。 - 新增三语
pullToRefresh、releaseToRefresh、refreshingLabel。
测试:新增组件三态、松手触发一次刷新与完成收回用例;同步更新 discover、favorites、watch_records 断言,全量测试增至 450 条。
门禁原始输出:
$ dart analyze lib test
Analyzing 2 items...
No issues found! (ran in 3.6s)
$ flutter test
00:46 +450: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
8.1s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,450 条测试全部通过,debug APK 构建成功。真机交互与刷新手感由用户验收。
2026-10-20 ReelShort:K46-A 榜单/新剧分页与预约刷新
- 前置状态:K45-A 已合并,develop 合并提交
805762f。 - 分支:
feature/flutter-k46-paged-pages - 功能提交:
c4dcb71 feat(flutter): 增加榜单新剧分页与预约刷新 - develop 合并提交:
8f3049f merge: 合并 K46-A 榜单新剧分页与预约刷新,已推送。 - 新增
PagedLocalListController与PagedLoadFooter:每页 20 条、距底 200 内自动追加、加载态至少 300ms、20px 主题色转圈、防重复触发、到底展示「没有更多了」。 - 榜单整页接入
AppPullToRefresh,前三名保持领奖台,第 4 名起按页追加;下拉静默catalog.refresh()后回到第一页并滚回顶部。 - 新剧页接入下拉刷新;今日首映取第一页第一条,横滑区保留前 12 条,新增「全部新剧」双列网格并按 20 条分页。
- 预约页接入下拉刷新,保留票根空态,不显示加载更多。
- 三页滚动体均使用
AlwaysScrollableScrollPhysics(parent: BouncingScrollPhysics());新增三语noMore与newReleasesAll。
测试:榜单与新剧覆盖首屏 20、追加到 40、300ms 加载态、到底提示与刷新重置;预约覆盖下拉触发静默刷新且无加载更多。全量测试增至 453 条。
门禁原始输出:
$ dart analyze lib test
Analyzing 2 items...
No issues found! (ran in 2.8s)
$ flutter test
00:45 +453: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
7.5s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,453 条测试全部通过,debug APK 构建成功。真机分页滚动与刷新手感由用户验收。
下拉跟随追加修正:
- 追加提交:
69eaacd fix(flutter): 修复下拉刷新页面跟随 - develop 合并提交:
fb0585c merge: 合并下拉刷新页面跟随修正,已推送。 AppPullToRefresh提供统一 Bouncing + AlwaysScrollable 物理,全部 12 个接入点同步替换。AppPullToRefresh通过 Android 负向滚动 overscroll 和 PointerUp/Cancel 识别下拉与松手,内容由滚动体跟随回弹;组件不再位移内容。- 指示区高度 64、背景透明,按 0~56px 下拉进度淡入并最多平移 10px,阈值后切换「松手刷新」。
- 公共组件测试断言下拉时滚动位置为负值;discover、favorites、watch_records、ranking、new_releases、reserve 同步断言统一物理配置。
- 门禁:
dart analyze lib test零告警,453 条测试全部通过,debug APK 构建成功(7.3s)。
下拉刷新文案主色追加修正:
- 追加提交:
107ae40 fix(flutter): 统一下拉刷新主色文案 - develop 合并提交:
3041849 merge: 合并下拉刷新主色文案修正,已推送。 - 「下拉刷新」「松手刷新」「正在刷新…」统一为
AppColors.blue、13 号 w600;箭头同为AppColors.blue;18×18 转圈保持主题色、strokeWidth 2。 - 指示区背景和布局不变;公共组件测试增加三种状态文字颜色均为主色的断言。
- 在包含 K47 的合并结果上重跑门禁:静态分析零告警,454 条测试全部通过,debug APK 构建成功(7.2s)。
2026-10-20 ReelShort:K47 剧场搜索框清空按钮
- 前置状态:K45-A、K46-A 与下拉跟随修正均已合并,develop 合并提交
fb0585c。 - 分支:
fix/flutter-k47-search-clear - 功能提交:
9870502 fix(flutter): 增加剧场搜索清空按钮 - develop 合并提交:
8bcd882 merge: 合并 K47 剧场搜索清空修正,已推送。 - 搜索框右侧预留固定 42px 尾部区域,有内容时显示 18×18 浅灰圆底、12px
close_rounded清空按钮;加载圈与清空按钮同时出现时,加载圈位于左侧。 - 清空按钮调用
controller.clear(),手动触发onChanged(''),随后重新请求焦点;内容为空时按钮隐藏,hint 与输入区宽度不因按钮出现/隐藏而跳动。 - 现有 44 高、22 圆角、聚焦描边与
discover-search/discover-search-shellKey 保持不变。
测试:新增搜索框输入后出现清空按钮、加载圈位置、18×18 尺寸、点击后空文本与空串回调、按钮隐藏及焦点保持用例。全量测试增至 454 条。
门禁原始输出:
$ dart analyze lib test
Analyzing 2 items...
No issues found! (ran in 3.1s)
$ flutter test
00:47 +454: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
7.4s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,454 条测试全部通过,debug APK 构建成功。真机搜索交互由用户验收。
2026-10-20 ReelShort:K48 分类 tab 弧线与自动滚动
- 前置状态:K46-A、下拉跟随、刷新文案颜色与 K47 搜索清空修正均已合并,develop 合并提交
3041849。 - 分支:
fix/flutter-k48-category-tabs - 功能提交:
5af70c3 fix(flutter): 优化分类弧线与自动滚动 - develop 合并提交:
3ce2599 merge: 合并 K48 分类 tab 修正,已推送。 - 分类选中线改为 20×3 的
CustomPaint,用二次贝塞尔曲线、2px 主色圆头描边从左下拱到右下;未选中绘制同尺寸透明线占位。 - 分类行改为带
ScrollController的横向单滚动体,所有 tab 保持可定位;点击后通过Scrollable.ensureVisible在 200ms、easeOutCubic 动画内居中到可视区。 - 首次构建会按当前选中分类自动滚入;吸顶、间距、文字选中样式、工具行滚走与下拉刷新行为保持不变。
测试:更新下划线为 CustomPaint/CategoryUnderlinePainter 断言并验证 20×3 尺寸;新增靠右分类点击后左右边界均处于 390px 屏幕内的用例。全量测试增至 455 条。
门禁原始输出:
$ dart analyze lib test
Analyzing 2 items...
No issues found! (ran in 2.9s)
$ flutter test
00:49 +455: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
7.2s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,455 条测试全部通过,debug APK 构建成功。真机分类横滑与弧线效果由用户验收。
分类弧线方向追加修正:
- 追加提交:
420da29 fix(flutter): 调整分类弧线开口方向 - develop 合并提交:
030a0e7 merge: 合并分类弧线方向修正,已推送。 - 二次贝塞尔曲线端点保持在基线上方,控制点移动到端点下方,线条改为开口朝上的 U 形。
- 20×3 尺寸、2px 主色圆头描边、未选中透明占位及 K48 的滚动定位行为均保持不变。
- 门禁:静态分析零告警,455 条测试全部通过,debug APK 构建成功(7.8s)。
2026-10-20 ReelShort:K49 首页加速态隐藏恢复清屏按钮
- 前置状态:K48-A 与分类弧线方向修正均已合并,develop 合并提交
030a0e7。 - 分支:
fix/flutter-k49-boost-clear - 功能提交:
5034ac7 fix(flutter): 隐藏首页加速态恢复清屏按钮 - develop 合并提交:
499e42b merge: 合并 K49 加速态清屏按钮修正,已推送。 - 首页 feed 的
home-feed-exit-clear-screen显示条件增加!_boosting;加速期间顶部 header、互动栏和底部信息保持隐藏,整集条、橙色进度线与「2.0 倍速快进中」继续显示。 - 松手退出加速后恢复长按前清屏状态;若原为清屏态,恢复按钮重新出现。全屏播放页加速态未改。
测试:新增清屏态进入加速后恢复按钮不存在、整集条与提示仍存在,松手后按钮和顶部搜索恢复的用例。全量测试增至 456 条。
门禁原始输出:
$ dart analyze lib test
Analyzing 2 items...
No issues found! (ran in 3.8s)
$ flutter test
00:45 +456: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
7.6s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,456 条测试全部通过,debug APK 构建成功。真机长按加速效果由用户验收。
2026-10-20 ReelShort:K50-A 品牌开屏动画
- 前置状态:K48-A、弧线方向修正与 K49-A 均已合并,develop 合并提交
499e42b。 - 分支:
feature/flutter-k50-splash-animation - 功能提交:
15570f1 feat(flutter): 重做品牌开屏动画 - develop 合并提交:
da78d87 merge: 合并 K50 品牌开屏动画,已推送。 - 开屏背景改为
#100C0A,状态栏使用浅色图标;使用 1200msAnimationController分段呈现 Logo、FruitShorts、中文标语与加载圈。 - Logo 使用 96×96、圆角 24、暖橙径向柔光和 40px blur,从 0.86 缩放到 1.0;
FruitShorts为 28 号 w900 Outfit 白字并上滑淡入;「水果短剧」为 13 号 white70、字距 4;底部加载圈 22×22 主题色。 splash-screen、splash-brand、splash-tagline、splash-loadingKey 齐备,首页数据就绪后仍由现有 HomePage 门控替换。- Trae 提供的图标 PNG、
colors.xml与 iOS AppIcon 资源均未覆盖、未纳入本次提交;debug 构建已使用当前本地资源完成接入校验。
测试:新增背景色、浅色状态栏、三个品牌 Key 及 1200ms 后 Logo/品牌/标语/加载圈 opacity 均为 1 的断言。全量测试增至 457 条。
门禁原始输出:
$ dart analyze lib test
Analyzing 2 items...
No issues found! (ran in 2.5s)
$ flutter test
00:44 +457: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
8.5s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,457 条测试全部通过,debug APK 构建成功。桌面图标和开屏动画由用户安装真机验收。
2026-10-20 ReelShort:K51-A 修复详情页跳转灰屏
- 前置状态:K50-A 已完成并合并,develop 合并提交
da78d87。 - 分支:
fix/flutter-k51-detail-flash - 功能提交:
353196a fix(flutter): 修复详情页跳转灰屏 - develop 合并提交:
375b013 merge: 合并 K51 详情页灰屏修复,已推送。 PlayerLogic.openDetail()改为先session.setOverlayOpen(true)再直接 push 详情页,路由返回后关闭 overlay 并保存进度;删除 push 前的setRouteVisible(false)、playbackSettled等待和进度写入。- 详情覆盖期间当前播放器保持挂载并仅暂停,返回后恢复原有播放状态与进度,不重新 seek;首页 feed 标题与系列信息入口继续共用
openDetail(),详情页自身加载态未改。
测试:新增详情页打开期间 session.active、当前集与播放意图不变,播放器只暂停且不写进度;返回后恢复播放、进度仍为 37 秒并写入对应观看记录的用例。全量测试增至 458 条。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:49 +458: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
13.4s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,458 条测试全部通过,debug APK 构建成功。工作区原有桌面图标、开屏资源与 colors.xml 改动未纳入本批提交。灰屏修复效果由用户真机验收。
2026-10-20 ReelShort:K50 品牌图标资源入库
- 前置状态:K51-A 已完成并合并,develop 合并提交
375b013。 - 分支:
feature/flutter-k50-app-icon - 功能提交:
7e60e5e feat(flutter): 替换水果短剧品牌图标与开屏图 - 首次合并提交:
04609ac merge: 合并 K50 品牌图标资源,已推送。 - 首次提交包含 Android
mipmap-*、drawable-*、iOS AppIcon、共享品牌图及colors.xml的#FFF1E5背景色,共 39 个资源文件;未使用git add -A,没有夹带代码改动。 - Trae 在首次提交后继续写出最终 PNG 版本;核对文件尺寸与哈希稳定后,追加提交
dfaff97 fix(flutter): 同步水果短剧品牌图标最终资源,最终合并提交为fcf30ff merge: 合并 K50 图标最终资源,已推送。 - 最终
develop工作区干净,39 个品牌图标/开屏资源全部入库;1024、512 与 Android 各密度图片尺寸匹配。
门禁在最终图标版本 fcf30ff 上复跑:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:46 +458: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
23.2s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,458 条测试全部通过,debug APK 构建成功。构建产物已包含最终品牌图标与开屏资源,桌面图标和新版开屏动画由用户安装真机验收。
2026-10-20 ReelShort:K50 开屏品牌视觉强化
- 前置状态:新版浓橙渐变、放大果篮元素和更新后的
splash_mark.png已包含在资源提交dfaff97中,并随fcf30ff合并到 develop。 - 本轮没有再生成空资源提交;核对工作区后确认上述图标与开屏 logo 已全部入库,无遗漏资源差异。
- 分支:
feature/flutter-k50-app-icon - 开屏调整提交:
c147645 feat(flutter): 强化开屏品牌标识展示 - develop 合并提交:
53591ab merge: 合并 K50 开屏品牌强化,已推送。 SplashPage继续使用assets/icon/splash_mark.png,logo 展示尺寸由 96 提升至 112,柔光透明度由0x33提升至0x40;品牌字体、动画区间和 1200ms 总时序保持不变。- 测试新增资源路径、112×112 展示尺寸和柔光颜色断言。
按口径执行 flutter clean 后重新解析依赖并复跑门禁:
$ flutter clean
Cleaning Xcode workspace...
Deleting build...
Deleting .dart_tool...
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:55 +458: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
27.5s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:清理旧构建与 asset 缓存后,静态检查零告警,458 条测试全部通过,debug APK 从零重新构建成功。新版桌面图标与开屏 logo 的真机视觉效果由用户安装验收。
2026-10-20 ReelShort:K52-A 清理原生静态开屏
- 前置状态:K51-A 合并提交
375b013;图标资源最终合并fcf30ff;开屏 logo 强化合并53591ab,均已推送到 develop。 - 分支:
feature/flutter-k52-native-splash-clean - 功能提交:
fe5b6e6 feat(flutter): 移除原生静态开屏 - develop 合并提交:
a11ba50 merge: 合并 K52 原生开屏清理,已推送。 - Android 三个
launch_background.xml仅保留@color/splash_background,删除splash_iconbitmap 图层;splash_background继续为#FF100C0A。 - 新增透明
drawable/splash_transparent.xml,values-v31与values-night-v31的系统开屏图标均指向该 drawable,并删除windowSplashScreenIconBackgroundColor。 - iOS
LaunchScreen.storyboard删除LaunchImageimageView、相关 constraints 与图片资源声明,仅保留现有深色背景;LaunchImage 文件仍保留但不再出现在启动界面。 - Flutter 动画开屏继续作为原生纯色过渡后的第一个品牌画面。
静态检查:
三个 launch_background.xml:无 bitmap / splash_icon
values-v31 与 values-night-v31:无 windowSplashScreenIconBackgroundColor
LaunchScreen.storyboard:无 LaunchImage
xmllint --noout:全部通过
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:47 +458: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
5.7s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,458 条测试全部通过,debug APK 构建成功。冷启动应从深色原生底直接过渡到 Flutter 动画开屏,最终效果由用户真机验收。
2026-10-20 ReelShort:K54-A 修复 iOS 启动网络加载
- 前置状态:K52-A 合并提交
a11ba50,K53-A 合并提交2305957,均已推送到 develop。 - 分支:
fix/ios-k54-network - 功能提交:
a63334f fix(flutter): 修复 iOS 启动网络加载 - develop 合并提交:
ae11846 merge: 合并 K54 iOS 网络修复,已推送。 - iOS
Info.plist的 ATS 增加NSAllowsArbitraryLoads,保留NSAllowsLocalNetworking;新增127.0.0.1、localhost、192.168.31.187、39.162.50.99四个例外域,均允许不安全 HTTP 并包含子域。 AppConfig.probeAndApplyBaseUrl()固定按127.0.0.1 → devHostBaseUrl → publicBaseUrl探测,首个返回 200 的地址生效,每项整体超时 2 秒。- 全部候选失败时使用平台默认地址:模拟器/桌面为
127.0.0.1,真机为devHostBaseUrl,不再无条件回落公网;Android 有adb reverse时仍优先 127。
测试:新增 127 优先、三项候选顺序、全部失败使用平台默认值的单元测试。Info.plist 通过 plutil -lint。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:48 +463: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
19.9s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,463 条测试全部通过,debug APK 构建成功。本机 Flutter 自动改写的 pubspec.lock 已恢复,未纳入提交。iOS 模拟器/真机启动加载由用户在 Xcode 验收。
2026-10-20 ReelShort:钉住 shared_preferences_foundation 2.5.6
- 前置状态:K54-A 已完成并合并,develop 合并提交
ae11846。 - 分支:
fix/ios-k54-shared-prefs - 功能提交:
aac9195 fix(flutter): 钉住 shared_preferences_foundation 2.5.6 兼容当前 Xcode。 - develop 合并提交:
d68734c merge: 合并 iOS shared_preferences 兼容修复,已推送。 pubspec.yaml显式增加shared_preferences_foundation: 2.5.6,并注明规避 2.6.0 Pigeon 生成代码尾随逗号依赖新版 Swift;shared_preferences: 2.3.3与shared_preferences_android: 2.4.28保持不变。flutter pub get已成功执行,最终pubspec.lock中shared_preferences_foundation实际版本为2.5.6,dependency 为direct main;.dart_tool/package_config.json指向本机缓存的 2.5.6。- 检查时
ios/Pods与ios/Podfile.lock均不存在,无需删除。后续需在 Xcode 重新执行 Pod install 并运行 App。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:47 +463: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
18.7s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,463 条测试全部通过,Android debug APK 构建成功。iOS 未执行真机构建,由用户在 Xcode 重新 Pod install 后验收 Swift 编译。
2026-10-20 ReelShort:K55-A 目录加载诊断与前台重试
- 前置状态:
shared_preferences_foundation 2.5.6已完成并合并,develop 合并提交d68734c。 - 分支:
fix/ios-k55-diagnostics - 功能提交:
730a965 feat(flutter): 增加目录加载诊断与前台重试 - develop 合并提交:
eab5d3e merge: 合并 K55 目录加载诊断,已推送。 - 首页与剧场错误态在 debug 下增加
catalog-debug-endpoint、catalog-debug-error两行诊断,展示当前AppConfig.apiBaseUrl与原始错误,12 号 subtle、最多 2 行省略;release 不展示。 CatalogController.load/refresh失败输出[catalog] base=... error=...;CategoryController同样输出目录诊断;地址探测逐项输出[probe] url -> ok/fail(reason),全部仅 debug。- 首页和剧场重试统一使用
retryCatalogLoad,先重新探测服务地址再加载数据;App 从后台回到resumed且目录仍失败时,自动重新探测并只重载失败的数据源一次,不弹提示。
测试:新增首页失败态地址/原始错误和 12 号 subtle 样式断言,以及“探测先于 load”顺序测试;剧场错误态增加两个诊断 Key 和原始异常文本断言。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:51 +465: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
9.0s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,465 条测试全部通过,debug APK 构建成功。本机 Flutter 自动改写的 pubspec.lock 已恢复,未纳入提交。iOS 复现时可直接查看失败页服务地址与错误,或从 Xcode 日志筛选 [probe]、[catalog]。
2026-10-20 ReelShort:K56-A debug 服务地址编辑器
- 前置状态:K55-A 已完成并合并,develop 合并提交
eab5d3e。 - 分支:
feature/flutter-k56-endpoint-editor - 功能提交:
c259b0b feat(flutter): 增加 debug 服务地址编辑器 - develop 合并提交:
ca67765 merge: 合并 K56 服务地址编辑器,已推送。 - 首页和剧场 debug 失败页在保留 K55 两行诊断的基础上增加
catalog-debug-endpoint-edit按钮,release 不显示。 - 对话框预填
AppConfig.apiBaseUrl,支持输入http://IP:端口;合法地址经ServerEndpoint.normalize归一化后执行 save → probe → reload,非法地址在弹框内显示红字且不保存。 - 对话框附带提示:手机需与电脑同一 Wi-Fi,并在 iOS 设置-隐私与安全性-本地网络 中允许本应用。
ServerEndpoint.save成功后立即应用运行时地址,探测时显式自定义地址优先;无自定义地址时仍保持 K54 的 127 → 开发机 → 公网顺序。
测试:新增 debug 入口、合法地址 save/probe/load 顺序、非法地址不保存提示、自定义运行时地址优先探测,以及剧场入口断言。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:45 +468: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
20.6s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,468 条测试全部通过,debug APK 构建成功。工作区无锁文件残留。iOS 真机可打开 debug 失败页手动切换服务地址,实际连通性由用户验收。
2026-10-20 ReelShort:K57-A 视频首帧诊断与防闪
- 前置状态:K56-A 已完成并合并,develop 合并提交
ca67765。 - 分支:
fix/ios-k57-video-flash - 功能提交:
6b39701 fix(flutter): 修复 iOS 视频首帧闪屏 - develop 合并提交:
576f2b9 merge: 合并 K57 视频首帧防闪,已推送。 - 新增共用
PlayerVideoSurface:封面player-fallback-background始终保留为底层,视频层使用 200msAnimatedOpacity,仅在初始化、尺寸有效且首帧播放进度/播放状态到位后淡入;视频未重建,controller 与VideoPlayerKey 保持稳定。 - debug 下右下角显示
player-debug-video状态:initialized / buffering / error: 描述 / loading;状态变化输出[video] init=... err=... host=host:port。 - debug 下视频错误时封面中央显示
player-video-error,最多 3 行;现有票据错误重试入口未改动。播放页与首页 feed 均复用同一组件。
测试:新增未初始化封面可见且 opacity 0、初始化后 200ms 淡入到 1、错误摘要出现且封面仍保留的组件测试,并保持播放页回归通过。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:46 +471: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
8.1s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,471 条测试全部通过,debug APK 构建成功。工作区无锁文件残留。iOS 复现时查看 player-debug-video 文案或 Xcode 中 [video] 日志即可定位视频源状态。
2026-10-20 ReelShort:K58-A 浅色开屏与原生过渡
- 前置状态:K57-A 已完成并合并,develop 合并提交
576f2b9。 - 分支:
feature/flutter-k58-light-splash - 功能提交:
398dc3f feat(flutter): 优化浅色开屏与原生过渡 - develop 合并提交:
da54949 merge: 合并 K58 浅色开屏,已推送。 - Android
splash_background改为#FFF8F0,三个launch_background.xml仍仅使用该纯色;v31 与 night-v31 的windowSplashScreenBackground同步使用该颜色,透明系统图标继续保留,避免 Android 12 纯透明背景被渲染成黑色。 - Flutter 开屏背景改为
AppColors.ink(#FFF8F0),状态栏深色图标;FruitShorts 改AppColors.onSurface28 w900,中文标语改AppColors.muted13 字距 4,柔光透明度改0x33FF7A1A,转圈与动画时序、Key 均未变。 - 不修改任何图标 PNG。最新 APK 内图标资源已包含;若 Android 桌面仍显示旧图标,属于启动器缓存,需要重启桌面或重新添加图标。
测试:开屏测试更新为浅暖背景、深色状态栏、品牌 onSurface、标语 muted 和 0x33 柔光;原生颜色静态检查与 XML 校验通过。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:50 +471: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
9.4s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,471 条测试全部通过,debug APK 构建成功。原生浅暖色与 Flutter 开屏无缝衔接,不再出现原生黑屏;新桌面图标因启动器缓存的显示问题由用户真机重启桌面后验收。
2026-10-20 ReelShort:K59 隐藏视频常驻调试文字
- 前置状态:K58-A 已完成并合并,develop 合并提交
da54949。 - 分支:
fix/flutter-k59-hide-video-debug - 功能提交:
a756fac fix(flutter): 隐藏视频常驻调试文字 - develop 合并提交:
7c2fd09 merge: 合并 K59 隐藏视频调试文字,已推送。 - 删除播放页与首页 feed 视频画面中的
player-debug-video常驻文字,不再显示 initialized / buffering / loading。 - 保留
[video] init=... err=... host=host:portdebugPrint;视频错误时继续在封面中央显示player-video-error,最多 3 行。 - 未修改任何图标 PNG。APK 内 mipmap/adaptive foreground 已校验为最新,桌面旧图标属于启动器缓存,由用户卸载重装或重启启动器处理。
测试:正常和初始化状态均断言 player-debug-video 不存在;错误态继续断言 player-video-error 存在、封面保留且错误摘要可见。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:48 +471: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
15.0s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,471 条测试全部通过,debug APK 构建成功。视频正常播放界面不再出现调试小字,错误诊断仍可通过错误摘要和 Xcode [video] 日志获取。
2026-10-20 ReelShort:K60-A flutter_native_splash 原生开屏
- 前置状态:K58-A 与 K59-A 均已合并,develop 合并提交分别为
da54949、7c2fd09。 - 分支:
feature/flutter-k60-native-splash - 功能提交:
983e99a feat(flutter): 接入 flutter_native_splash 原生开屏 - develop 合并提交:
9eec9ed merge: 合并 K60 flutter_native_splash 原生开屏,已推送。 dev_dependencies增加当前稳定版flutter_native_splash: ^2.4.8,配置color、color_dark、android_12.color、android_12.color_dark、icon_background_color全部为#FFF8F0,不配置 image;Android/iOS 开启,web 关闭。- 已执行
dart run flutter_native_splash:create。生成器在无 image 时仍会创建 1×1 background/LaunchImage 资源;为满足硬性无图片要求,已清理这些生成图片、Android 12 旧图标、splash_transparent.xml和 iOS LaunchImage 图片集。 - Android 五个 launch_background 均为纯色且无 bitmap,v31/night-v31 背景为
#FFF8F0,系统动画图标使用@android:color/transparent;iOS storyboard 仅保留#FFF8F0背景,无 LaunchImage。 pubspec.yaml已注明以后修改开屏配置必须重新执行dart run flutter_native_splash:create。K58-A 的 Flutter 浅色动画开屏保持不变。
静态检查:splash 配置五项均为 #FFF8F0;XML 校验通过;Android 资源无 splash_icon/splash_transparent/android12splash/background.png 引用;iOS 无 LaunchImage。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:49 +471: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
29.8s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,471 条测试全部通过,debug APK 构建成功。原生启动只保留浅暖纯色过渡,无静态 logo 或 LaunchImage,随后直接进入 Flutter 动画开屏。
2026-10-20 ReelShort:K61-A 修复底部导航栏闪白
- 前置状态:K60-A 已完成并合并,develop 合并提交
9eec9ed。 - 分支:
fix/flutter-k61-navbar-flash - 功能提交:
0aa5a99 fix(flutter): 修复详情与播放器底部闪白 - develop 合并提交:
51e9402 merge: 合并 K61 导航栏闪白修复,已推送。 - 全局
appSystemOverlayStyle改导航栏为AppColors.ink,分隔线透明、关闭systemNavigationBarContrastEnforced,状态栏保持透明。 AppTheme.light()的 BottomSheet 背景、modal 背景和 surface tint 全部透明;播放页覆盖黑色导航栏和浅色图标,详情页覆盖 ink 导航栏和深色图标,底部操作条保持 ink。- EpisodePickerSheet 打开期间覆盖
AppColors.card导航栏,底部显式 SafeArea,关闭后恢复所属页面 overlay。
测试:新增全局 overlay/主题断言、首页 feed 与全屏播放器黑导航、详情页 ink 导航、选集弹层 card 导航与 SafeArea 断言。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:56 +473: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
14.2s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,473 条测试全部通过,debug APK 构建成功。全局、路由和弹层三层导航栏颜色已统一,Android 15/16 edge-to-edge 对比遮罩被关闭。
2026-10-20 ReelShort:K53-A 详情页首帧直出
- 前置状态:K52-A 已完成并合并,develop 合并提交
a11ba50。 - 分支:
fix/flutter-k53-detail-first-frame - 功能提交:
bb92996 fix(flutter): 修复详情页首帧闪屏 - develop 合并提交:
2305957 merge: 合并 K53 详情页首帧修复,已推送。 - 删除
logic.loading时整页 loading 的短路:只要传入卡片已有标题或封面,首帧立即渲染 Header、数据卡、简介与标签;只有标题和封面同时为空时才保留整页 loading/failed。 - 选集区独立展示状态:无剧集且加载中显示 6 个呼吸骨架格
detail-episodes-loading;接口失败显示detail-episodes-retry,上方卡片内容保持可见;成功后切换完整选集网格。 - 完整选集未就绪时底部 CTA 使用灰色禁用态,加载成功后恢复可点击;新增独立测试文件覆盖首帧直出、骨架、失败保留标题和 CTA 状态。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:48 +460: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
21.8s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,460 条测试全部通过,debug APK 构建成功。本机 Flutter 自动改写的 pubspec.lock 已恢复,未纳入提交。详情页首帧与选集加载体验由用户真机验收。
2026-10-20 ReelShort:详情页顶部圆形按钮统一修正
- 前置状态:K40-B 评论入口登录闸已合并,合并提交
230f16a。 - 分支:
fix/flutter-k39-detail-back - 功能提交:
c1dd033 fix(flutter): 统一详情页顶部圆形按钮 - develop 合并提交:
f72cb41 merge: 合并详情页顶部按钮统一,已推送。 - 公共页头新增
AppSubpageCircleButton,返回按钮包装并复用同一实现;详情页返回、分享、更多统一为 40×40 深色圆形按钮,底色0x59000000、白色图标 22、阴影0x33000000/ blur 8。 - 删除详情页私有分享按钮实现和旧的 36 尺寸常量;更多菜单按钮改为公共按钮视觉层,PopupMenu 交互保持不变。
- 详情加载、失败、空态页头也改用同一深色公共返回按钮;
detail-back、detail-share、detail-moreKey 保持不变。
测试:详情页断言返回、分享、更多均为 40×40、深色半透明 Material 底;公共按钮测试继续覆盖浅色描边阴影与深色半透明阴影。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:42 +446: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
7.1s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,446 条测试全部通过,debug APK 构建成功。工作区原有 pubspec.lock 变更未纳入本批提交。真机验收由用户执行。
2026-10-20 ReelShort:K40-B 追加修正评论入口登录闸
- 前置状态:K39 返回按钮优化已合并,合并提交
a5c84b0。 - 分支:
fix/flutter-k40-comment-auth(同步最新 develop 后追加修正) - 功能提交:
870a170 fix(flutter): 评论入口增加登录闸 - develop 合并提交:
230f16a merge: 合并 K40-B 评论入口登录闸,已推送。 - 新增
lib/pages/player/comments_auth.dart的openCommentsWithAuth:已登录直接打开评论;未登录先走ensureSignedIn,登录成功且页面仍存在时再调用原showComments,取消不执行任何操作。 - 全屏播放页与首页 feed 两处
onComments均改用该 helper,避免入口重复实现登录判断。 - K40-B 原有输入框/发送二次登录闸与
commentLoginHint保留;回复、点赞、删除、举报既有登录闸不变。
测试:新增未登录点评论入口出现登录闸且不打开评论面板;已登录从首页 feed 点评论入口正常打开评论面板;评论面板原有 16 条登录与交互用例继续通过。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:53 +446: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
7.4s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,446 条测试全部通过,debug APK 构建成功。工作区原有 pubspec.lock 变更未纳入本批提交。真机验收由用户执行。
2026-10-20 ReelShort:K39 二级页面返回按钮视觉优化
- 前置状态:K39-A、K40-A、K40-B 均已合并,develop 合并提交分别为
9864c8e、1eea9fa、457d2fa。 - 分支:
fix/flutter-k39-back-button - 功能提交:
8493c4e fix(flutter): 优化二级页面返回按钮样式 - develop 合并提交:
a5c84b0 merge: 合并 K39 返回按钮优化,已推送。 - 公共返回按钮由 36 调整为 40 圆形;浅色页使用白色 card 底、1px border 描边和
0x14000000阴影(blur 8、offset 0/2)。 - 深色返回按钮改为
0x59000000半透明黑底、白色图标和0x33000000阴影;图标字号 22,Material Symbols 字重 600,保留 InkWell 水波纹。 - 组件继续由筛选、榜单、新剧、预约、通知、设置、记录、收藏、下载、钱包、商城、账号与详情页复用,各页
<page>-backKey 未变化。
测试:公共页头测试同步断言 40×40、浅色描边与阴影、深色半透明底与阴影、图标 22 / w600;页面抽查测试同步更新为 40×40,详情页补充深色按钮实际生效断言。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:43 +444: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
7.1s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,444 条测试全部通过,debug APK 构建成功。工作区原有 pubspec.lock 变更未纳入本批提交。真机验收由用户执行。
2026-10-20 ReelShort:K64-A 原生开屏改为品牌启动图
- 前置状态:K63-A 已完成并合并,develop 合并提交
210ccc9。 - 分支:
feat/native-splash-logo - 功能提交:
8f60046 feat(splash): 原生开屏改为品牌启动图 - develop 合并提交:
1199db7 merge: 合并 K64-A 原生品牌启动图,已推送。 - 使用
flutter_native_splash生成 Android 旧版splash、Android 12+android12splash日/夜资源及 iOSLaunchImage/LaunchBackground,原生背景统一为深暖底#1F1B16。 - 删除 Flutter 自定义
SplashPage与对应测试,首页首帧加载态改为同色深底、浅色状态栏和主题色转圈,避免原生开屏到首页之间闪白。 - 本次精确提交 37 个任务文件,未提交
pubspec.lock、AndroidManifest.xml、Info.plist;门禁产生的 lock 漂移已还原。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
01:01 +473: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
2,498ms
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,473 条测试全部通过,debug APK 构建成功。真机验收由用户执行。
2026-10-20 ReelShort:K65-A 冷启动提前拉取首页数据
- 前置状态:K64-A 已完成并合并,develop 合并提交
1199db7。 - 分支:
feat/startup-prefetch - 功能提交:
9b31d83 perf(home): 冷启动提前拉取首页数据 - develop 合并提交:
c76b388 merge: 合并 K65-A 冷启动首页预取,已推送。 main()不再等待地址探测,先启动AppConfig.ready并立即runApp;竖屏设置与本地服务地址读取仍保持等待。- 三个地址候选改为
Future.wait并行探测,全部返回后仍按本机、开发机、公网的原有优先级选择首个成功地址;全部失败继续使用指定 fallback 或平台默认地址。 CatalogController.load()首帧先进入 loading,再等待 ready 后请求首页;默认 ready 按需生成已完成 Future,避免 fake-async 跨用例复用造成挂起。ApiClient未显式指定 baseUrl 时,在每次请求前同步最新运行时地址;显式 baseUrl 保持固定,确保启动探测完成后首页请求真正发往选中地址。
测试:新增并行探测门闩、优先级选择、ready 完成前零请求、最终地址生效及客户端先构造后探测动态地址用例;全量既有用例保持通过。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:48 +475: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
7.5s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,475 条测试全部通过,debug APK 构建成功。真机验收由用户执行。
2026-10-20 ReelShort:K66-A 启动页停留到首页就绪再进首页
- 前置状态:K65-A 已完成并合并,develop 合并提交
c76b388。 - 分支:
feat/startup-splash-hold - 功能提交:
7871b0c feat(home): 启动页停留至首页就绪 - develop 合并提交:
d2174c5 merge: 合并 K66-A 启动页停留至首页就绪,已推送。 pubspec.yaml将 Android 12 与通用品牌开屏图加入 Flutter 资产,应用内启动阶段可直接复用原生开屏图。- 首次
catalog.loading && !settled时显示深底品牌启动图,不再显示单独转圈;Android 使用splash_logo_android12.png288 逻辑像素,其它平台使用splash_logo.png384 逻辑像素。 catalog.settled后的失败重试仍显示原深底主题色转圈;目录数据完成后启动图同帧移除并进入首页 feed。- 门禁产生的
pubspec.lock依赖漂移已还原,未纳入本批提交。
测试:新增首次启动品牌图 Android/iOS 路径与尺寸、settled 重试转圈、数据完成后启动图消失并出现首页 feed 三条用例。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:57 +478: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
7.8s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,478 条测试全部通过,debug APK 构建成功。真机验收由用户执行。
2026-10-20 ReelShort:K67-A 删除无引用代码与无用资源
- 前置状态:K66-A 已完成并合并,develop 合并提交
d2174c5。 - 分支:
chore/cleanup-unused - 功能提交:
3fefd54 chore(cleanup): 删除无引用代码与无用资源 - develop 合并提交:
2c5ff35 merge: 合并 K67-A 删除无引用代码与资源,已推送。 - 删除无引用 Dart 文件:
library_drama_tile.dart、auth_binding.dart、category_dramas_page.dart、category_grid.dart、ranking_section.dart、home_browse_view.dart、home_browse_logic.dart、home_browse_header.dart、home_menu_sheet.dart、continue_watching_card.dart,共 1544 行。 - 删除 Android 五档密度遗留
splash_icon.png,并删除colors.xml中无引用的ic_launcher_background颜色。 - 清理本机未纳入 Git 的
assets/media/(315MB)与assets/images/(3.7MB),合计释放约 319MB;清理后assets/为 556KB。 - 全局搜索确认无删除文件类名、import、
splash_icon或颜色名残留;part文件、assets/fonts、品牌源图、启动图、背景图、android12splash、前景图与 mipmap 均保留。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:51 +478: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
3.9s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,478 条测试全部通过,debug APK 构建成功。真机验收由用户执行。
2026-10-20 ReelShort:K68-A 指定 API_BASE_URL 时跳过地址探测
- 前置状态:K67-A 已完成并合并,develop 合并提交
2c5ff35。 - 分支:
fix/lock-compiled-base-url - 功能提交:
9ebb54e fix(config): 指定 API_BASE_URL 时跳过地址探测 - develop 合并提交:
51c3635 merge: 合并 K68-A 锁定编译期接口地址,已推送。 probeAndApplyBaseUrl()新增仅测试注入用的compiledOverride;编译期地址非空时立即返回,不再发起任何候选探测。- 编译期地址仅在运行时地址为空时应用;用户运行时地址仍保持最高优先级,不会被
API_BASE_URL覆盖。 - 未指定编译期地址时,环回、开发机、公网的候选顺序、并行探测、超时与 fallback 行为均保持不变。
测试:新增编译期地址零探测、运行时地址不被覆盖、空编译期地址继续原探测流程三条用例;测试结束复位运行时地址。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:51 +481: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
8.4s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,481 条测试全部通过,debug APK 构建成功。正式包由 Trae 按任务书命令重打并验收。
2026-10-20 ReelShort:K69-A 发布分支同步 main
- 初始状态:
origin/release/v1.0.0为35364c9,origin/develop为51c3635,origin/main为5c174b0。 - release 合并提交:
0cb57d0 merge: 将 develop 合入 release/v1.0.0,作者Zhou Weidong <502333560@qq.com>,已推送35364c9..0cb57d0。 - release 合并冲突仅 3 个文件:
lib/core/config/app_config.dart、lib/main.dart、test/config/server_endpoint_test.dart,全部采用 develop 版本;无其它冲突,无冲突标记残留。 - 门禁产生的
pubspec.lock工作区漂移已恢复为 develop 版本,未改变合并提交内容。 - main 先以
--ff-only从本地61454e3快进到origin/main的5c174b0,再生成合并提交8bb365d merge: 将 release/v1.0.0 合入 main,作者Zhou Weidong <502333560@qq.com>。 - 正常推送 main 成功:
5c174b0..8bb365d;未使用 force push,远端未因保护分支拒绝。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
01:14 +481: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
6.5s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:release 合并结果静态检查零告警、481 条测试全部通过、debug APK 构建成功;release 与 main 均已推送,等待发布验收。
2026-10-20 ReelShort:K70-A 开发默认地址改为公网
- 前置状态:K69-A 已完成,develop 合并提交
51c3635。 - 分支:
chore/dev-default-public-host - 功能提交:
0c6a103 chore(config): 开发默认地址改为公网 39.162.50.99 - develop 合并提交:
ac1202c merge: 合并 K70-A 开发默认公网地址,已推送。 devHostBaseUrl改为http://39.162.50.99:8081,注释同步说明当前默认指向公网,切换局域网时只改这一行且不带结尾斜杠。- 探测候选使用条件追加去重:
lanBaseUrl始终在前,devHostBaseUrl与publicBaseUrl相同时只探测一次;未来 dev 改回独立地址时会自动恢复 lan、dev、public 三候选顺序。 API_BASE_URL覆盖逻辑、运行时地址优先级、2 秒超时与 fallback 均未改动。
测试:默认地址字面量断言改为公网;并行探测、顺序、全失败及运行时优先用例的候选数量同步为两个唯一地址。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:54 +481: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
47.6s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,481 条测试全部通过,debug APK 构建成功。真机验收由用户执行。
2026-10-20 ReelShort:K71-A 首页深色底部导航补齐安全区底色
- 前置状态:K70-A 已完成并合并,develop 合并提交
ac1202c。 - 分支:
fix/home-nav-safe-area-color - 功能提交:
66e9062 fix(home): 首页深色底部导航补齐安全区底色 - develop 合并提交:
1dbc3ac merge: 合并 K71-A 首页导航安全区底色,已推送。 - 深色分支改为
ColoredBox(Colors.black) + SafeArea(top: false) + 纯黑导航条 Container,底部安全区与导航条统一为纯黑,移除无效的BackdropFilter。 barKey仍挂在AppDimens.navHeight的导航条 Container 上;浅色分支继续保留ClipRect + BackdropFilter + SafeArea + 0.95背景,观感未改。- 顶部
Colors.white12分隔线保留;无安全区时总高度仍为 64。
测试:新增深色模式底部安全区 34 时总高 98、导航条自身 64、外层背景纯黑三条断言;既有浅色高度和首页深色导航断言同步保持通过。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:55 +482: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
8.7s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,482 条测试全部通过,debug APK 构建成功。真机验收由用户执行。
2026-10-20 ReelShort:K72-A develop 同步 release 与 main
- 初始状态:
origin/develop为1dbc3ac,origin/release/v1.0.0为0cb57d0,origin/main为8bb365d。 - release 合并提交:
182b7e3 merge: 将 develop 同步到 release/v1.0.0,作者Zhou Weidong <502333560@qq.com>,已推送0cb57d0..182b7e3。 - release 合并无冲突,自动合入 K70-A 默认公网地址与 K71-A 导航安全区底色共 5 个文件。
- main 合并提交:
6ae9e8e merge: 将 release/v1.0.0 同步到 main,作者Zhou Weidong <502333560@qq.com>,已推送8bb365d..6ae9e8e。 - main 正常推送成功,未触发保护分支拒绝,全程未使用 force push。
- 工作区外部存在 Xcode 自动重排的
ios/Runner/Base.lproj/Main.storyboard未暂存改动,未进入 release/main 合并提交,也未擅自还原。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:57 +482: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
5.2s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:release 合并结果静态检查零告警、482 条测试全部通过、debug APK 构建成功;release 与 main 均已推送,等待发布验收。
2026-10-21 ReelShort:K73-A C3 埋点同步 release 与 main
- 初始状态:
origin/develop为827c972,origin/release/v1.0.0为182b7e3,origin/main为6ae9e8e。 - release 合并提交:
05e2952 merge: 将 C3 埋点同步到 release/v1.0.0,作者Zhou Weidong <502333560@qq.com>,已推送182b7e3..05e2952。 - release 合并无冲突,自动合入
EventTracker批量上报服务及app.dart接入,共 2 个文件。 - main 合并提交:
2577797 merge: 将 C3 埋点同步到 main,作者Zhou Weidong <502333560@qq.com>,已推送6ae9e8e..2577797。 - main 正常推送成功,未触发保护分支拒绝,全程未使用 force push。
- 发布完成后已切回 develop,未修改 develop 内容。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:48 +482: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
14.4s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:release 合并结果静态检查零告警、482 条测试全部通过、debug APK 构建成功;release 与 main 均已推送,等待发布验收。
2026-10-21 ReelShort:K74-A 开发默认地址改回本机 IP
- 前置状态:K73-A 已完成并合并,develop 合并提交
827c972。 - 分支:
chore/dev-host-local-ip - 功能提交:
d13b601 chore(config): 开发默认地址改回本机 10.39.237.1 - develop 合并提交:
3a636ca merge: 合并 K74-A 开发本机地址,已推送。 devHostBaseUrl改为http://10.39.237.1:8081,不带结尾斜杠;注释保留“换网络时只改这一行”的说明。- 候选去重逻辑保持原实现;devHost 与 public 不同后自动恢复
127.0.0.1 → 10.39.237.1 → 公网三候选顺序,并行探测与超时不变。 - 本任务只修改
app_config.dart与对应配置测试,未改动其它业务文件。
测试:默认地址字面量断言改为 10.39.237.1;并行探测、顺序、全失败与运行时优先用例的候选数量同步恢复为三个唯一地址。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
01:07 +482: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
14.2s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,482 条测试全部通过,debug APK 构建成功。该地址随网络变化,换网时只改 devHostBaseUrl 一行;真机验收由用户执行。
2026-10-21 ReelShort:K75-A 首页详情与播放页淡入转场
- 前置状态:K74-A 已完成并合并,develop 合并提交
3a636ca。 - 分支:
feat/fade-route-home-feed - 功能提交:
8c04099 feat(player): 首页进详情与播放页改为淡入转场 - develop 合并提交:
c0697c0 merge: 合并 K75-A 首页淡入转场,已推送。 - 新增
FadePageRoute<T>:正向 220ms、反向 180ms,只通过FadeTransition改变透明度,无左右位移,路由保持 opaque。 PlayerLogic.openDetail()、PlayerLogic.openSeriesAt()、playDramaFromCatalog()三处改用FadePageRoute;登录、我的、收藏、观看记录、发现页等其它入口保持原路由。
测试:新增路由专项测试,锁定 220ms/180ms、opaque、转场中存在 FadeTransition 且透明度处于中间态;现有播放与首页测试全部保持通过。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:55 +483: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
8.8s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,483 条测试全部通过,debug APK 构建成功。首页详情/播放页淡入效果等待真机验收。
2026-10-21 ReelShort:K76-A 开发默认地址改回 192.168.31.187
- 前置状态:K75-A 已完成并合并,develop 合并提交
c0697c0。 - 分支:
chore/dev-host-192-168-31-187 - 功能提交:
99b45e4 chore(config): 开发默认地址改回 192.168.31.187 - develop 合并提交:
76cc52a merge: 合并 K76-A 开发默认地址,已推送c0697c0..76cc52a。 devHostBaseUrl改为http://192.168.31.187:8081,不带结尾斜杠;注释保留“换网络时只改这一行”的说明。- 探测候选保持
127.0.0.1 → 192.168.31.187 → 公网 39.162.50.99的顺序,地址去重、并行探测与运行时优先逻辑未改。 - 本任务只修改
app_config.dart与对应配置测试;对应默认地址字面量断言同步为192.168.31.187。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:53 +483: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
15.0s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,483 条测试全部通过,debug APK 构建成功。真机验收由用户执行。
2026-10-21 ReelShort:K77-A 视频未就绪改由进度条展示加载态
- 前置状态:K76-A 已完成并合并,develop 合并提交
76cc52a。 - 分支:
feat/progress-loading-state - 功能提交:
cf4b07a feat(player): 未就绪改由进度条展示加载态 - develop 合并提交:
0ba6ea9 merge: 合并 K77-A 播放加载进度态,已推送76cc52a..0ba6ea9。 PlayerVideoSurface删除posterUrl、封面与黑色遮罩占位,只保留纯黑player-fallback-background;视频首帧就绪后仍按原逻辑淡入。- 新增
LoadingProgressTrack:28% 主题色高光沿轨道循环滑动,控制器 1200ms repeat、Curves.easeInOut,整体 Key 为progress-loading;动画仅在应用处于 resumed 状态时运行。 - 首页 feed 与全屏
SeekProgressBar在未初始化或 buffering 时切换到加载轨道,并隐藏原有已播进度、滑块、拇指和时间文案;正常播放及拖动 seek 逻辑保持不变。 - 测试覆盖纯黑视频底、旧封面 Key 不存在、加载高光位置变化、null/buffering 时加载轨道、正常时 Slider、feed 加载态,并同步修正原有播放器测试对 Slider 的假设。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:49 +486: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
8.0s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,486 条测试全部通过,debug APK 构建成功。真机验收由用户执行。
2026-10-21 ReelShort:K79-A 拖动进度条加载态闪烁修复
- 前置状态:K78-A 已完成并合并,develop 合并提交
7270863。 - 分支:
fix/progress-scrub-flicker - 功能提交:
1993ff1 fix(player): 修复拖动进度条时加载态闪烁 - develop 合并提交:
c06a67c merge: 合并 K79-A 进度拖动防闪,已推送7270863..c06a67c。 - 全屏
SeekProgressBar与首页 feed_FeedProgressBar均增加 350ms buffering 去抖;短暂 buffering 不再切换加载轨道,缓冲结束立即取消计时器并恢复。 - 未初始化状态仍立即显示
progress-loading;_previewFraction/_preview存在时始终保留正常进度条和滑块,不显示加载态。 - 控制器切换时正确移除旧监听、取消计时器并监听新控制器,销毁时移除监听并清理计时器;首页 feed 加载态期间禁用拖动回调。
- 测试覆盖 200ms 短暂缓冲仍显示 Slider、400ms 持续缓冲显示加载轨道、拖动中持续 buffering 仍保留 Slider,以及首页 feed 的去抖和拖动保护。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
01:01 +488: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
13.3s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,488 条测试全部通过,debug APK 构建成功。真机验收由用户执行。
2026-10-21 ReelShort:K78-A 底部导航图标与文字放大
- 前置状态:K77-A 已完成并合并,develop 合并提交
0ba6ea9。 - 分支:
feat/bottom-nav-larger - 功能提交:
d6b2d30 feat(nav): 底部导航图标与文字放大 - develop 合并提交:
7270863 merge: 合并 K78-A 底部导航放大,已推送0ba6ea9..7270863。 AppDimens.navIcon由 20 调整为 24,navLabel由 10 调整为 12,navHeight由 64 调整为 68。AppBottomNav图标与文字间距由 2 调整为 3;四等分布局、选中态、浅色与深色底均未改动。- 尺寸测试同步增加
navIcon = 24断言,并更新navLabel = 12、navHeight = 68。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:50 +486: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
14.3s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,486 条测试全部通过,debug APK 构建成功。真机验收由用户执行。
2026-10-21 ReelShort:K80-A 播放页「更多」面板重做
- 前置状态:K79-A 已完成并合并,develop 合并提交
c06a67c。 - 分支:
feat/player-more-sheet-redesign - 功能提交:
7fccd16 feat(player): 更多面板按参考图重做 - develop 合并提交:
62f8704 merge: 合并 K80-A 更多面板重做,已推送c06a67c..62f8704。 - 面板改为
AppColors.ink暖白底,内容边距12/8/12/16,保留 36×4 把手与顶部圆角 20,删除标题和关闭按钮。 - 倍速/清晰度、清屏/PiP/离线缓存拆为两张白底圆角 16 分组卡片;选项行与操作行统一为 56 高、22 图标、14 图标间距、16 w600 标签。
- 选项外层改为 34 高浅色胶囊条,内部胶囊 26 高;选中态为白色胶囊、深色 w700 文字和轻阴影,未选中及禁用态分别使用 muted/subtle。
- 保留全部既有功能 Key,移除
player-more-close;选项点击、横滑、PiP、离线缓存、清屏和点外部关闭行为保持。 - 测试新增面板底色、分组胶囊尺寸、图标/标签规格、选中/未选中/禁用颜色及阴影断言,并更新全屏播放器行高、胶囊尺寸和关闭路径。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:47 +489: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
7.5s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,489 条测试全部通过,debug APK 构建成功。真机验收由用户执行。
2026-10-21 ReelShort:K81-A 更多面板文字减重与标签缩小
- 前置状态:K80-A 已完成并合并,develop 合并提交
62f8704。 - 分支:
fix/player-more-typography - 功能提交:
622dc2f fix(player): 更多面板文字减重并缩小标签 - develop 合并提交:
e6a31a6 merge: 合并 K81-A 更多面板文字减重,已推送62f8704..e6a31a6。 - 选项行与操作行标签由 16 w600 调整为 15 w500。
- 倍速/清晰度胶囊文字由 14 调整为 13;选中态改为 w600,未选中态改为 w400。
- 行高 56、图标 22、胶囊 26/外层条 34、分组卡片与整体布局均未改动。
- 相关测试同步更新标签字号/字重、选中与未选中胶囊字号/字重断言。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:47 +489: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
13.4s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,489 条测试全部通过,debug APK 构建成功。真机验收由用户执行。
2026-10-21 ReelShort:K82-A 右侧互动栏图标替换与放大
- 前置状态:K81-A 已完成并合并,develop 合并提交
e6a31a6。 - 分支:
feat/rail-icons-refresh - 功能提交:
4b1aea2 feat(player): 右侧互动栏图标按参考图替换并放大 - develop 合并提交:
35de409 merge: 合并 K82-A 右侧互动栏图标升级,已推送e6a31a6..35de409。 - 删除互动项深色圆底,点击区域由 34 调整为 44,图标由 24 调整为 30,项间距由 18 调整为 22,标签字号由 11 调整为 12。
InteractionRailItem新增mirrorIcon;首页 feed 与全屏播放页分享图标改为reply_rounded并横向镜像为右弯箭头。- 收藏与喜欢统一使用实心
star_rounded、favorite_rounded,评论保持气泡描边图标,选中态颜色逻辑不变。 - 放大后的全屏互动栏起始位置适度上移,避免遮挡底部信息区与简介操作,所有 Key 与互动回调保持不变。
- 测试覆盖无背景、44 点击区、30 图标、分享箭头镜像、实心收藏/喜欢、气泡评论与 12 号标签。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:49 +490: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
7.7s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,490 条测试全部通过,debug APK 构建成功。真机验收由用户执行。
2026-10-21 ReelShort:K83-A 互动栏改用参考图图标资源
- 前置状态:K82-A 已完成并合并,develop 合并提交
35de409。 - 分支:
feat/rail-icon-assets - 功能提交:
cbb9f60 feat(player): 互动栏改用参考图同款图标资源 - develop 合并提交:
97bbced merge: 合并 K83-A 互动栏图标资源,已推送35de409..97bbced。 - 按产品资源原样提交
rail_save.png、rail_comment.png、rail_like.png、rail_share.png,未重绘或改形。 pubspec.yaml注册assets/icon/rail/;互动项改为String asset,使用Image.asset、32px、BlendMode.srcIn着色,点击区保持 44、间距调整为 24。- 删除
mirrorIcon与 Material 图标切换逻辑,选中态仅改变图片颜色;首页 feed 与全屏播放页统一使用四张 PNG,所有 Key 与互动行为不变。 - 测试改为校验四个
AssetImage.assetName、32px 尺寸与srcIn着色;APK 内已确认包含全部四张 PNG。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:50 +490: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
16.4s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:静态检查零告警,490 条测试全部通过,debug APK 构建成功。真机验收由用户执行。
2026-10-21 FruitServer:K84-A 列表卡片与后台补充互动计数
- 前置状态:K83-A 文档留痕完成,FruitServer develop 提交
f903369。 - 分支:
feat/drama-card-counts AppDramaCardVO新增likeCount/favoriteCount/commentCount,首页、发现、分类、收藏、搜索等复用卡片的接口统一返回三个字段。AppCatalogService.cards()对每批卡片只调用一次CommentService.countByDramas(ids),点赞/收藏取Drama实体冗余字段,评论缺失时回填 0,避免逐条查询。CommentService新增按drama_id分组批量统计,过滤逻辑删除与status = 'deleted',空集合不查询数据库。- 后台
DramaRespVO新增三个字段;module-content只填点赞/收藏,admin-api的分页和详情接口从module-interaction批量回填评论数,模块依赖方向保持不变。 docs/api-phase1.md已同步卡片互动计数契约;未修改 Flutter 客户端、specs 仓库或其它业务逻辑。- 测试覆盖列表卡片三个字段契约、单次批量查询、空集合、多剧分组统计,以及后台分页/详情三个字段回填。
门禁说明:本机默认 JDK 27 不兼容既有 Mockito inline 测试,首次尝试在既有 commerce 模块失败;按项目要求固定 JDK 21 后完整重跑通过。
门禁原始输出:
$ JAVA_HOME=/opt/homebrew/Cellar/openjdk@21/21.0.12.1/libexec/openjdk.jdk/Contents/Home mvn test
[INFO] Reactor Summary for fruitshorts 1.0.0-SNAPSHOT:
[INFO] fruitshorts-module-interaction ..................... SUCCESS
[INFO] fruitshorts-admin-api ............................... SUCCESS
[INFO] fruitshorts-app-api ................................. SUCCESS
[INFO] fruitshorts-transcode-worker ........................ SUCCESS
[INFO] BUILD SUCCESS
[INFO] Total time: 14.294 s
解读:JDK 21 下完整 Maven 测试通过,App/Admin 互动计数契约与既有模块测试均保持绿色。接口联调验收由用户执行。
2026-10-21 K85:收藏数 / 评论数实时更新(进行中)
- 计划文档:
docs/plans/2026-10-21-K85-interaction-count.md - FruitServer 分支:
fix/favorite-comment-count - ReelShort 分支:
fix/interaction-count-refresh - 根因采用任务书已确认结论,不重复排查。
- A 部分代码完成:收藏计数同步维护、评论总数接口、收藏数回填脚本和对应测试已加入。
- A 部分定向测试通过:app-api 及依赖模块
Tests run: 68, Failures: 0, Errors: 0。 - FruitServer 完整
mvn test通过:14 个模块BUILD SUCCESS,总耗时 11.824s。 mvn -pl fruitshorts-app-api -am package -DskipTests通过,产出fruitshorts-app-api/target/fruitshorts-app-api-1.0.0-SNAPSHOT.jar。- 本地执行
sql/backfill_favorite_count.sql:UPDATE 8;校验count_mismatches=0,剧 1/2/5 收藏数分别为 4/3/5,与有效收藏关系一致。 - FruitServer 功能提交:
65e8fbf fix(interaction): 收藏计数同步维护并新增评论数接口。 - FruitServer develop 合并提交:
c08fb7b merge: 合并 K85 收藏与评论计数,已推送。 - ReelShort B 部分完成:
CommentApi/CommentRepository新增评论总数查询,兼容数字与字符串 Long;播放器按剧缓存评论数,评论面板关闭后重新拉取,失败静默保留旧值。 - 首页 feed 收藏改为复用
_toggleSave,与实际收藏状态变化同步 ±1;详情页新增本地收藏增量,成功且状态变化时更新,失败保持原值。 - ReelShort 功能提交:
5e2b8d9 fix(player): 收藏与评论数实时刷新。 - ReelShort develop 合并提交:
bdd3a53 merge: 合并 K85 收藏与评论数实时刷新,已推送97bbced..bdd3a53。
$ JAVA_HOME=/opt/homebrew/Cellar/openjdk@21/21.0.12.1/libexec/openjdk.jdk/Contents/Home mvn test
[INFO] BUILD SUCCESS
[INFO] Total time: 11.824 s
$ mvn -pl fruitshorts-app-api -am package -DskipTests
[INFO] BUILD SUCCESS
[INFO] Total time: 9.520 s
$ psql -f sql/backfill_favorite_count.sql
UPDATE 8
解读:后端完整测试和 app-api 打包均成功;本地收藏计数已回填,抽查剧 1/2/5 与关系表计数完全一致。
ReelShort 门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:48 +494 ~2: All tests passed!
解读:客户端静态检查零告警;494 条测试通过,2 条需要本机联调服务的用例按既有保护跳过。K85 A/B 均已完成合并与推送,真机验收由用户执行。
2026-10-21 K85 补修:评论数接口匿名放行
- 验收问题:
GET /app/comments/count未登录调用返回业务码 401。 - 根因:
SecurityConfig只放行评论列表GET /app/comments,新增的/app/comments/count落入默认登录校验。 - 修复:增加
GET /app/comments/count的permitAll(),保持评论列表与评论总数一致的匿名只读语义;发布、删除等写接口仍要求登录。 - 新增
AppCommentCountAnonymousSecurityTest,装配真实SecurityConfig安全过滤链,未登录请求必须进入控制器并返回code=0,避免仅测控制器时漏掉路由放行问题。 - 定向安全链测试通过:
Tests run: 1, Failures: 0, Errors: 0。 - 功能提交:
7579d31 fix(security): 放行评论数接口匿名访问。 - 完整门禁通过:JDK 21 下 14 个模块
BUILD SUCCESS,app-apiTests run: 69, Failures: 0, Errors: 0;全仓仅保留既有 ffmpeg smoke 用例 1 条环境跳过。
2026-10-21 ReelShort:K86 评论面板按参考图重做
- 计划文档:
docs/plans/2026-10-21-K86-comments-sheet.md,计划提交76d6cc9。 - 功能分支:
fix/comments-sheet-style,从 ReelShort developbdd3a53创建。 - 功能提交:
7862e0b fix(player): 评论面板按参考图重做。 - develop 合并提交:
22cb74d merge: 合并 K86 评论面板重做,已推送bdd3a53..22cb74d。 - 顶部删除拖拽把手和剧名行,改为左侧 44x44 向下箭头、居中 16 w600 评论数标题;关闭箭头保留
player-comments-close,标题保留comment-count-label。 - 评论行改为 40 圆头像(回复 28)、12 muted 昵称、16 cream 正文;时间与回复合并为灰色元信息行,更多菜单移至右上角 18px 横向三点。
- 评论点赞按钮、心形和数字全部从 UI 移除,
CommentController的点赞能力保持不动;所有comment-like-*Key 已消失。 - 展开/收起回复改为 12 muted 文本、16x1 border 短横线和灰色箭头;展开回复缩进到正文列,取消评论行分隔线。
- 底部输入区改为整宽 44 高、22 圆角 commentInput 胶囊,右侧橙色发送按钮 38;登录提示、回复态 banner、键盘避让及面板高度 clamp 保持。
- 测试专项 17 条通过,新增无点赞控件、向下箭头关闭、标题居中及新尺寸断言;删除原依赖
comment-like-10的展示用例。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:47 +497: All tests passed!
解读:ReelShort 静态检查零告警,497 条测试全部通过。未安装真机,等待用户验收。
2026-10-21 ReelShort:K86.1 评论总数与相对时间补修
- 功能分支:
fix/comments-sheet-polish,从 ReelShort develop22cb74d创建。 - 功能提交:
2659c29 fix(player): 评论总数含回复并改用相对时间。 - develop 合并提交:
9773576 merge: 合并 K86.1 评论面板补修,已推送22cb74d..9773576。 - 面板标题不再只使用
CommentController.exactCount:打开面板时调用CommentRepository.count(),发布/删除成功后重新查询后端总数;请求失败或无结果时回退到顶层评论精确数,再回退通用「评论」文案。 - 使用请求序号防止初始化与发布/删除期间较早返回的总数覆盖较新结果;父页面关闭面板后的既有评论数刷新逻辑保持不变。
- 新增纯函数
formatRelativeDateTime:小于 1 分钟显示刚刚,小于 60 分钟显示分钟前,小于 24 小时显示小时前,同年显示MM-DD,跨年显示yyyy-MM-DD,统一使用本地时间。 - 三份 ARB 新增
justNow/hoursAgo并重新生成 l10n;评论行时间切到相对时间,其它页面时间格式未改。 - 测试新增相对时间 59 分钟、23 小时、同年、跨年边界,后端评论总数含回复、总数请求失败回退、发布后重新查询,并更新页面关闭后二次查询评论数的断言。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:47 +504: All tests passed!
解读:ReelShort 静态检查零告警,504 条测试全部通过。未安装真机,等待用户验收。
2026-10-21 ReelShort:K86.2 评论面板间距与键盘修正
- 功能分支:
fix/comments-sheet-keyboard,从 ReelShort develop9773576创建。 - 功能提交:
ab476ca fix(player): 评论面板自适应高度并只顶起输入框。 - develop 合并提交:
5160ab4 merge: 合并 K86.2 评论面板间距与键盘修正,已推送9773576..5160ab4。 - 删除固定
clamp(280,520)高度,改为内容自适应和最大 520;空态/错误态/加载态保持至少 220。 - 评论少时面板按内容收缩;评论多时保持 520 上限并在列表内部滚动。
- 面板高度计算不再扣除键盘
viewInsets,外层整体不再随键盘上移;输入区使用 150msAnimatedPadding单独上移。 - 列表底部 padding 使用「输入框高度 + 键盘高度」,保证最后一条评论可以滚动到输入框上方。
- 左右内边距收紧为 16;列表顶部 4;评论上下间距改为 10/12;正文与元信息间距改为 4;输入区上边距 8,尺寸与圆角保持 44/22。
- 新增短列表自适应、空态最小高度、长列表滚动、键盘时面板顶部和列表首项不动且输入区上移的测试。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:56 +508: All tests passed!
解读:ReelShort 静态检查零告警,508 条测试全部通过。未安装真机,等待用户验收。
2026-10-21 ReelShort:K86.6 修复评论输入聚焦时面板消失
- 功能分支:
fix/comments-keyboard-focus,从 ReelShort develop226ac59创建。 - 功能提交:
c7b2302 fix(player): 修复评论输入聚焦时面板消失。 - develop 合并提交:
33b49c1 merge: 合并 K86.6 评论输入聚焦修复,已推送226ac59..33b49c1。 - 列表态与聚焦态改为同一棵稳定布局树,复用同一个
TextField、TextEditingController和FocusNode;切换时只隐藏标题与列表,输入内容和焦点不丢失。 - 新增 Android
KeyboardInsetNotifierMethodChannel;原生使用ViewCompat监听WindowInsetsCompat.Type.ime(),并在 inset 变化时回传,Dart 侧按设备像素比换算后与MediaQuery.viewInsets取最大值。 - 聚焦时面板仅按可靠键盘高度上移,保留多行输入框和右对齐发布按钮;键盘收起时释放焦点并恢复列表与单行胶囊输入。
- 测试验证聚焦前后
EditableTextState实例不变、键盘出现时面板仍存在且列表隐藏、输入框位于键盘上方、收起后恢复列表且文本不丢失。 - 未新增第三方依赖,未修改 iOS 行为,未改后端业务代码。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
01:48 +505: All tests passed!
$ flutter build apk --debug
✓ Built build/app/outputs/flutter-apk/app-debug.apk
解读:ReelShort 静态检查零告警,505 条测试全部通过,Android debug APK 构建成功。未安装真机,等待用户验收。
2026-10-21 ReelShort:K86.4 评论聚焦态展开输入面板
- 功能分支:
fix/comments-composer-expanded,从 ReelShort develop8b51a7c创建。 - 功能提交:
519cab2 fix(player): 评论聚焦态改为展开输入面板。 - develop 合并提交:
838beaa merge: 合并 K86.4 评论展开输入面板,已推送8b51a7c..838beaa。 - TextField 获得焦点后面板切换为输入模式:隐藏标题栏与评论列表,只保留贴键盘上沿的白色顶部圆角卡片。
- 多行输入框支持
minLines: 1、maxLines: 4自动增高,commentInput 灰底、12 圆角、15 号文字,无边框;保留comment-inputKey 和原 FocusNode。 - 发布按钮使用
postComment文案、32 高度、8 圆角;空内容或提交中禁用,有内容时主色浅底与主色文字,保留comment-postKey。 - 回复态 banner 保留在输入框上方;没有图片、表情或 @ 图标。
- 发送成功后清空内容并保持聚焦;失败提示与内容保留逻辑不变。失焦后恢复 K86.2 的列表和单行胶囊输入。
- 测试覆盖聚焦展开、列表隐藏、多行输入尺寸、无附加图标、按钮启停、发送后清空并保持聚焦、失焦恢复列表,以及键盘 inset 下卡片底边跟随键盘。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:47 +509: All tests passed!
解读:ReelShort 静态检查零告警,509 条测试全部通过。未安装真机,等待用户验收。
2026-10-21 ReelShort:K86.5 暂时隐藏评论举报与删除入口
- 功能分支:
fix/comments-hide-actions,从 ReelShort develop838beaa创建。 - 功能提交:
9bd4652 fix(player): 评论暂时隐藏举报与删除入口。 - develop 合并提交:
226ac59 merge: 合并 K86.5 隐藏评论操作入口,已推送838beaa..226ac59。 - 删除评论行右上角更多菜单、
comment-menu-{id}、举报/删除文字和对应 UI 回调。 CommentInteractionHandlers仅保留回复回调;评论面板删除举报/删除方法及report_dialog依赖。- 后端接口、
CommentController.delete()与CommentController.report()保持不动,仅暂时不暴露 UI 入口。 - 删除依赖评论菜单的举报、举报失败、举报登录闸和本人评论举报测试;新增评论行无
comment-menu-*、无举报/删除文字、无更多图标的断言。 - K86.4 展开输入态、发布、回复、点赞隐藏、相对时间和键盘避让行为均未改动。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:50 +506: All tests passed!
解读:ReelShort 静态检查零告警,506 条测试全部通过。未安装真机,等待用户验收。
2026-10-21 ReelShort:K86.3 Android 键盘窗口不压缩整页
- 功能分支:
fix/ime-adjust-nothing,从 ReelShort develop5160ab4创建。 - 功能提交:
dbeb988 fix(android): 键盘弹出不再压缩整页。 - develop 合并提交:
8b51a7c merge: 合并 K86.3 Android 键盘窗口修正,已推送5160ab4..8b51a7c。 - Android
MainActivity的windowSoftInputMode由adjustResize改为adjustNothing,系统键盘不再缩小 Flutter 窗口。 - 评论面板继续使用 K86.2 的自适应高度和输入区
AnimatedPadding,面板顶部与列表保持稳定,仅输入框随viewInsets.bottom上移。 - 全量检查输入页面:登录页已有
viewInsets底部 padding,关闭 Scaffold 自动 resize 以避免双重避让;手机号登录 Sheet 使用手动底部 padding;举报/服务地址弹窗使用 Dialog 的键盘 inset;个人资料与账号注销页由 Scaffold inset 避让;搜索框位于页面顶部,不会被键盘遮挡。 - 评论面板键盘测试新增输入框底边偏移断言,验证输入框底边跟随 180px
viewInsets精确上移。 - 未新增依赖,未修改 iOS 行为。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:46 +508: All tests passed!
解读:ReelShort 静态检查零告警,508 条测试全部通过。未安装真机,等待用户验收。
2026-10-21 ReelShort:K86.7 键盘弹出不压缩视频页
- 功能分支:
fix/player-ignore-keyboard-resize,从 ReelShort develop33b49c1创建。 - 功能提交:
1776c62 fix(player): 键盘弹出不压缩视频页。 - develop 合并提交:
de99c09 merge: 合并 K86.7 键盘弹出不压缩视频页,已推送33b49c1..de99c09。 - 首页 feed 主 Scaffold 与全屏播放页 Scaffold 均显式设置
resizeToAvoidBottomInset: false,键盘 inset 变化时视频页、右侧互动栏和底部信息不再被 Scaffold 压缩上移。 - 登录、搜索、举报、钱包等表单页面保持默认键盘避让;评论面板继续使用 K86.6 的
KeyboardInsetNotifier与自身输入区 padding,不重复叠加。 - 复核首页 feed 的选集、更多、解锁弹层均无输入控件,不依赖 body 收缩;播放相关输入只存在于评论面板。
- 新增首页 feed 与全屏播放页测试:模拟 300px
viewInsets.bottom,断言 Scaffold 禁止自动收缩且视频区域/互动栏位置尺寸不变。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:47 +507: All tests passed!
解读:ReelShort 静态检查零告警,507 条测试全部通过。未安装真机,等待用户验收。
2026-10-21 ReelShort:K86.8 聚焦时保留评论列表并稳定焦点
- 功能分支:
fix/comments-keep-panel-open,从 ReelShort developde99c09创建。 - 功能提交:
ad69ef7 fix(player): 聚焦时保留评论列表并稳定焦点。 - develop 合并提交:
a7c0576 merge: 合并 K86.8 评论列表与焦点保持,已推送de99c09..a7c0576。 - 删除聚焦时隐藏标题栏和评论列表的分支,标题、列表、回复 banner 始终保留;聚焦只把输入区从单行胶囊切换为多行输入与右对齐发布按钮。
- 输入区使用同一
TextField/FocusNode/TextEditingController,通过 200mseaseOut动画独立抬到键盘上方;面板高度在键盘周期内锁定,避免底部滚动 padding 把整个面板顶起。 - 列表底部 padding 使用输入区预留高度加实时键盘高度,长列表可将最后一条评论滚到浮动输入区上方。
- 删除键盘高度归零时自动
unfocus的逻辑,键盘 0→180→0 过渡和动画瞬时零值不再踢掉焦点;点面板外仍会主动失焦。 - 测试覆盖标题/列表持续存在、面板与列表位置不变、输入框位于键盘上方、滚动 padding、同一
EditableTextState实例、文本与焦点在键盘显示/收起后保持。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:50 +507: All tests passed!
解读:ReelShort 静态检查零告警,507 条测试全部通过。未安装真机,等待用户验收。
2026-10-21 ReelShort:K86.9 修正评论面板键盘态布局重叠
- 功能分支:
fix/comments-keyboard-layout,从 ReelShort developa7c0576创建。 - 功能提交:
bc4c84a fix(player): 修正评论面板键盘态布局重叠。 - develop 合并提交:
9876772 merge: 合并 K86.9 评论面板键盘态布局修复,已推送a7c0576..9876772。 - 删除 composer 的
Matrix4.translationValues视觉位移和 K86.8 pinned height;面板外层改回AnimatedPadding(bottom: keyboardHeight),以 200mseaseOut整体抬到键盘正上方。 - 面板内部恢复普通 Column:标题栏 → Flexible(ListView) → 回复 banner → 输入区,列表视口和输入区不再重叠。
- 键盘态高度使用
min(键盘弹起前高度, 屏幕可用高度 - keyboardHeight - 24),并通过AnimatedSize平滑收放;键盘收起后恢复内容自适应及 520 上限。 - 列表底部 padding 保持输入区预留高度加键盘高度;同一个 TextField/FocusNode/TextEditingController 不因键盘变化重建,也未恢复自动 unfocus。
- 测试覆盖键盘态列表与输入框矩形不相交、面板底边贴键盘上沿、输入框位于键盘上方、收起后恢复 44 高单行胶囊、文本与焦点保持。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:47 +507: All tests passed!
解读:ReelShort 静态检查零告警,507 条测试全部通过。未安装真机,等待用户验收。
2026-10-21 ReelShort:K86.10 评论面板保持高度并两段式收起
- 功能分支:
fix/comments-dismiss-flow,从 ReelShort develop9876772创建。 - 功能提交:
d081cff fix(player): 评论面板保持高度并两段式收起。 - develop 合并提交:
a142a6c merge: 合并 K86.10 评论面板高度与收起流程,已推送9876772..a142a6c。 - 键盘弹出时继续使用弹出前测量的面板高度,仅当「高度 + 键盘」超过可用高度时压缩;面板通过 200ms
AnimatedPadding整体平滑上移,内部标题/列表/输入区仍为 K86.9 的不重叠 Column。 - 评论 modal 设置
isDismissible: false、enableDrag: false,关闭动作统一交给面板处理。 - DramaCommentsSheet 外层新增全屏透明点击层;第一次点击在输入聚焦或键盘可见时只执行失焦,第二次点击才关闭面板。面板内部使用 opaque 手势区域,列表、输入框和按钮点击不会误触外层。
- 顶部向下箭头仍一次点击直接关闭;移除 TextField 自身的
onTapOutside,避免手势竞争造成第一击误关闭。 - 测试覆盖键盘弹出前后面板高度一致、点内部不关闭、第一次外点仅失焦且面板保留、模拟键盘落下后第二次外点关闭。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:47 +508: All tests passed!
解读:ReelShort 静态检查零告警,508 条测试全部通过。未安装真机,等待用户验收。
2026-10-21 ReelShort:K86.11 评论入口改为假输入框
- 功能分支:
fix/comments-fake-input,从 ReelShort developa142a6c创建。 - 功能提交:
425ea4c fix(player): 评论入口改为假输入框点击唤起。 - develop 合并提交:
146cd2a merge: 合并 K86.11 评论假输入框入口,已推送a142a6c..146cd2a。 - 未聚焦态改为灰底、22 圆角、44 高的假胶囊,左侧文案与右侧发送图标都不接收文字;点击整条或发送图标只请求真实输入焦点,未登录时仍进入登录闸。
- 真实 TextField、FocusNode 和 TextEditingController 始终挂载;未聚焦时由 Offstage 隐藏,不能点击、绘制或进入读屏语义,聚焦后同一实例直接显示为 1~4 行输入和右对齐发布按钮。
- 聚焦态继续沿用 K86.9 的面板整体上移、K86.10 的高度保持与两段式外层收起;键盘态面板基准改为测量真实布局内容而非扩展容器,并仅在未聚焦时记录。
- 更新评论发布、回复、访客登录、播放页集成测试;新增假条点击、假发送图标点击、隐藏 TextField 不存在于可见树等断言。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:48 +509: All tests passed!
解读:ReelShort 静态检查零告警,509 条测试全部通过。未安装真机,等待用户验收。
2026-10-21 ReelShort:K86.12 评论入口文字垂直居中
- 功能分支:
fix/comments-hint-center,从 ReelShort develop146cd2a创建。 - 功能提交:
f87b0d2 fix(player): 评论入口文字垂直居中。 - develop 合并提交:
fc877f2 merge: 合并 K86.12 评论文字居中修复,已推送146cd2a..fc877f2。 - 未聚焦假输入条的
写评论文案改为Align(centerLeft)内的height: 1Text,不再依赖 TextField contentPadding;胶囊保持 44 高、文案 14、图标 18。 - 假条与右侧发送图标位于同一水平中线,右侧视觉留白调整为 16;测试断言两者 center.dy 偏差小于 1px。
- 聚焦真实 TextField 单行使用
TextAlignVertical.center与对称 contentPadding;出现换行后切到顶部对齐,文字和 hint 行高统一为 1.4。 - K86.9/K86.10/K86.11 的面板高度、两段式收起和假条唤起行为保持,相关既有测试全部通过。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:48 +509: All tests passed!
解读:ReelShort 静态检查零告警,509 条测试全部通过。未安装真机,等待用户验收。
2026-10-21 ReelShort:K86.13 评论面板固定半屏
- 功能分支:
fix/comments-half-screen,从 ReelShort developfc877f2创建。 - 功能提交:
50edbf4 fix(player): 评论面板固定半屏高度。 - develop 合并提交:
aa14d0a merge: 合并 K86.13 评论面板半屏高度,已推送fc877f2..aa14d0a。 - 删除
_sheetHeightWithoutKeyboard、_measureSheetWithoutKeyboard、GlobalKey 和内容高度测量逻辑,面板高度不再随评论条数变化。 - 面板高度固定为
round(MediaQuery.height * 0.5),并以屏幕高度 - 顶部安全区作为上限保护。 - 内部列表改为 Expanded 占满剩余空间,输入区固定面板底部;评论少时底部留白,评论多时列表内部滚动。
- 键盘弹出继续沿用 200ms
AnimatedPadding整体上移且高度不变;K86.9 布局、K86.10 两段式收起、K86.11 假条、K86.12 文字居中均保持。 - 测试覆盖 1 条与 20 条评论时面板高度均等于半屏、键盘前后高度一致、长列表仍可滚动。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:47 +509: All tests passed!
解读:ReelShort 静态检查零告警,509 条测试全部通过。未安装真机,等待用户验收。
2026-10-21 ReelShort:K86.14 评论输入改为独立弹窗
- 功能分支:
fix/comments-composer-sheet,从 ReelShort developaa14d0a创建。 - 功能提交:
282f51c fix(player): 评论输入改为独立弹窗。 - develop 合并提交:
c8ac2c9 merge: 合并 K86.14 评论输入独立弹窗,已推送aa14d0a..c8ac2c9。 - 评论面板底部继续使用 K86.11/K86.12 的假输入条;点击后通过独立的
showModalBottomSheet打开CommentComposerSheet,原评论面板保持半屏高度和位置不变。 - 新输入弹窗固定为半屏高度,白色顶部圆角卡片内只保留 1~4 行输入框与右对齐发布按钮,不包含图片、表情或 @ 入口。
- 键盘高度取
MediaQuery.viewInsets与KeyboardInsetNotifier的较大值,弹窗用 200mseaseOut上移到键盘上方;键盘收起或提交成功后关闭,失败时保留弹窗、输入与焦点。 - 新弹窗复用原
CommentController发布并更新评论列表,没有创建第二个列表控制器;发布成功后刷新评论总数。登录闸、回复目标与待审核流程继续沿用原逻辑。 - 更新评论面板及播放页集成测试,覆盖独立弹窗出现、原评论面板尺寸与位置不变、输入弹窗半屏高度、键盘上移、提交关闭、失败保留、回复与登录场景。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test --no-pub
00:49 +509: All tests passed!
解读:ReelShort 静态检查零告警,509 条测试全部通过。未安装真机,等待用户验收。
2026-10-21 ReelShort:K86.14 修正输入弹窗为紧凑高度
- 修正分支:继续使用
fix/comments-composer-sheet,从已合并的 ReelShort developc8ac2c9快进后修改,未新开分支。 - 修正提交:
e0024ed fix(player): 评论输入弹窗改为紧凑高度。 - develop 合并提交:
9c0c1b8 merge: 合并 K86.14 评论输入紧凑弹窗修正,已推送c8ac2c9..9c0c1b8。 - 删除新输入弹窗的屏幕 50% 固定高度与
Expanded空白占位,改为Column(mainAxisSize: MainAxisSize.min)内容自适应;卡片仅保留 12px 上下内边距、16px 左右内边距、12px 输入与按钮间距。 - 单行输入弹窗高度落在约 100
150 逻辑像素,多行输入按 14 行自然增高;评论列表面板继续固定半屏且位置不变。 - 键盘高度仍取
MediaQuery.viewInsets与KeyboardInsetNotifier的较大值,弹窗通过 200mseaseOut上移并使底边紧贴键盘上沿。 - 更新测试断言紧凑高度、换行增高且小于半屏、键盘前后高度一致和底边贴键盘;提交、失焦关闭、回复、登录与无图片/表情/@ 行为保持。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test --no-pub
00:52 +509: All tests passed!
解读:ReelShort 静态检查零告警,509 条测试全部通过。未安装真机,等待用户验收。
2026-10-21 ReelShort:K86.15 评论发布成功提示
- 功能分支:
fix/comment-post-toast,从 ReelShort develop9c0c1b8创建。 - 功能提交:
e86daf5 feat(player): 评论发布成功提示。 - develop 合并提交:
c3e6e02 merge: 合并 K86.15 评论发布成功提示,已推送9c0c1b8..c3e6e02。 - 三份 ARB 新增
commentPostSuccess:zh 为「发表成功」、en 为 "Comment posted"、id 为 "Komentar terkirim",并通过flutter gen-l10n重新生成 AppLocalizations。 CommentController.publish成功后清空输入、关闭独立输入弹窗并刷新评论总数;服务端返回的评论继续由原控制器插入列表。失败时仍保留输入与焦点并显示原错误提示,不显示成功提示。- 评论面板路由内增加独立
ScaffoldMessenger;成功 SnackBar 使用 floating、无 action、1500ms、深色圆角底白字,并通过面板高度加 12px 的底部 margin 显示在半屏评论面板上方,不遮挡底部假输入条。 - 评论面板和独立输入弹窗共用该发布结果链路,首页 feed 与播放页两处入口均可显示成功提示。
- 测试覆盖 zh 成功文案「发表成功」、SnackBar 样式与位置、失败不出现成功提示,以及原有提交关闭、刷新总数和登录场景。
门禁原始输出:
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test --no-pub
00:48 +509: All tests passed!
解读:ReelShort 静态检查零告警,509 条测试全部通过。未安装真机,等待用户验收。