laoyang
3459eea8f3
v64:观影豆瓣自动获取 + 海报/多图上传(移动端 API)
端上「记一场」要与网页端同步实现(用户 2026-10-19 六条),
服务端这一半只加**移动端入口**,网页端(index.php 那条路由)一行没动。
- ApiHandler:新增 `/movies/douban` 子路由(action=suggest / action=thumb /
默认抓详情+海报落盘),逻辑与网页端 `movies/douban` 逐条对齐;
新增 `/movies/<id>/poster` 与 `/movies/<id>/photos`(multipart 上传),
字段名与端上一致(poster / photo);
新增 `normalizeFiles()` 把 `photo[]` 的多文件从"按字段竖切"转成"一行一个";
`movieData()` 认 `poster_key` 并**校验形态**(只接受 posters/xxx 形式);
features 声明 movies_douban / movie_media(端上可探测老服务端)。
- Douban:新增 `apiThumbUrl()` —— 端上打不到 `index.php?r=...`,
把豆瓣图片代理换成 `/api/v1/...` 形式(拼法只此一处);
联想候选带上**过白名单后**的原始图片地址(未过白名单给空串,不下发 SSRF 跳板)。
- Movie:新增 `setPoster()`(单字段更新 —— 端上是"先建记录再传图"两段式,
用 update() 要拼一份完整草稿,漏一个字段就静默覆盖用户刚填的内容)与
`addPhotos()`(**追加**语义,与网页表单用的 savePhotos() 替换语义并存不混用)。
验证:接口 e2e 57/0(自带豆瓣 mock,离线可跑)· 反向验证 18/0 ·
本地全量 e2e 1521/0 · 线上部署 + 站点自检 19 条全过 +
`/api/v1/movies/douban` 401(路由通)· ping.features 已含两条新能力
2026-10-19 23:41:15 +08:00
..
2026-10-14 01:20:40 +08:00
2026-09-30 00:49:53 +08:00
2026-09-30 13:24:26 +08:00
2026-10-19 12:51:17 +08:00
2026-10-19 12:51:17 +08:00
2026-10-18 03:34:47 +08:00
2026-10-19 23:41:15 +08:00
2026-10-18 03:34:47 +08:00
2026-10-03 08:18:05 +08:00
2026-10-06 17:33:48 +08:00
2026-10-02 09:28:07 +08:00
2026-10-03 08:18:05 +08:00
2026-10-05 10:58:17 +08:00
2026-10-05 10:58:17 +08:00
2026-10-05 10:58:17 +08:00
2026-10-03 15:01:38 +08:00
2026-10-15 20:19:09 +08:00
2026-10-19 12:51:17 +08:00
2026-10-13 11:53:58 +08:00
2026-10-06 20:41:04 +08:00
2026-10-01 00:12:04 +08:00
2026-10-13 11:53:58 +08:00
2026-10-17 00:15:06 +08:00
2026-09-30 00:49:53 +08:00
2026-09-30 00:49:53 +08:00
2026-10-19 23:41:15 +08:00
2026-10-05 13:26:49 +08:00
2026-10-18 20:14:50 +08:00
2026-10-05 16:45:10 +08:00
2026-10-14 19:05:13 +08:00
2026-10-14 01:20:40 +08:00
2026-10-18 03:34:47 +08:00
2026-10-19 17:27:37 +08:00
2026-10-05 10:58:17 +08:00
2026-10-15 20:19:09 +08:00
2026-10-05 10:58:17 +08:00
2026-10-03 08:18:05 +08:00
2026-10-07 15:31:26 +08:00
2026-09-30 09:44:55 +08:00
2026-10-18 11:35:13 +08:00
2026-10-07 18:22:55 +08:00
2026-10-19 23:41:15 +08:00
2026-10-01 00:12:04 +08:00
2026-10-11 10:12:11 +08:00
2026-10-08 02:20:19 +08:00
2026-10-07 05:52:40 +08:00
2026-09-30 13:24:26 +08:00
2026-10-05 16:45:10 +08:00
2026-10-15 23:04:25 +08:00
2026-10-09 07:25:08 +08:00
2026-10-15 23:04:25 +08:00
2026-10-19 17:27:37 +08:00
2026-10-19 15:27:08 +08:00
2026-10-03 19:27:14 +08:00
2026-10-18 03:34:47 +08:00
2026-10-15 23:04:25 +08:00
2026-10-17 00:15:06 +08:00
2026-10-03 11:30:48 +08:00
2026-10-07 11:35:31 +08:00
2026-10-02 22:08:13 +08:00
2026-10-03 11:30:48 +08:00
2026-10-03 15:01:38 +08:00
2026-10-19 17:27:37 +08:00
2026-09-30 00:49:53 +08:00
2026-10-06 03:14:18 +08:00
2026-10-12 15:31:03 +08:00
2026-10-17 00:15:06 +08:00
2026-10-02 09:28:07 +08:00
2026-09-30 11:06:22 +08:00
2026-10-13 11:53:58 +08:00
2026-10-05 16:45:10 +08:00
2026-10-10 22:13:20 +08:00
2026-10-14 01:20:40 +08:00
2026-10-08 10:54:43 +08:00