spark-server/docs/media.md
DESKTOP-L8OUL9F\gfl0034 753c276496 feat: PopAdmin 拉取管理、签到能量 API 与图片 150KiB 硬上限
管理端按用户查询开启通讯录/相册/媒体拉取;服务端写入路径自动压图;新增 /v1/sign 与 /v1/energy。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-11-02 12:44:06 +08:00

63 lines
2.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 媒体压缩与检测
> **服务端图片硬上限:≤ 150 KiB。**
> 经 `objectstore.Put` / `PutLarge` 写入的图片会自动压缩;用户直传对象存储时由凭证/发帖声明 size 校验(`user_reject=true` 拒收超限)。
## 规格
| 类型 | 最长边 | 体积上限 |
|------|--------|----------|
| 普通图片(广场/朋友圈/封面/bot 等) | ≤ **1080** | ≤ **150 KiB** |
| 视频 | ≤ **720** | ≤ 100 MiB |
| 头像 | ≤ **200×200** | ≤ **150 KiB** |
## 自动压缩(服务端写路径)
| 时机 | 位置 | 行为 |
|------|------|------|
| 任意图片 Put | `objectstore.Put` / `PutLarge` → `media.EnsureUnderLimit` | JPEG 质量阶梯下调,必要时缩边至 ≥240px,直到 ≤150 KiB |
| 管理端音乐封面/背景 | `music.UploadCover` / `UploadBackground` → PutLarge | 同上 |
| 字母头像 / 群拼接头像 | `user.putLetterPNG` / `group.putAvatar` → Put | 同上 |
| RSS/bot 配图 | `squarebot` → `PrepareBotImage` → PutLarge | 同上(`media.bot_compress`) |
压缩策略:先压到 `image_max_edge`,再按 JPEG 质量 85→22 试压;仍超则按 80% 逐步缩边至 `MinImageEdge`(240)。
## 检测点(用户直传)
| 时机 | 位置 | 行为 |
|------|------|------|
| 申请上传凭证 | `upload/logic.CreateCredential` → `checkDeclaredSize` | 声明 `size` > 150 KiB → **40005**(`user_reject=true`) |
| 广场/朋友圈发帖 | `checkMediaMeta` | 同上 |
App 上传前仍应压缩;服务端对**经本机写入**的路径再保底压一次。直传 S3/RustFS 的字节流服务端看不到,只能靠凭证 size 拒收。
## 配置
见 `configs/config.yaml` / `deploy/docker/config.docker.yaml` 的 `media:`:
```yaml
media:
enabled: true
user_reject: true
bot_compress: true
image_max_bytes: 153600 # 150 KiB
avatar_max_bytes: 153600
```
## 存量超限图
本地/挂载目录批量压缩(保留 `.bak`):
```bash
go run ./cmd/compress-images -dir /path/to/images -max-bytes 153600
# 预览:加 -dry-run
```
生产 RustFS/对象存储需另做 List+Get+Put 任务;勿 wipe、勿改 admin JWT。
## 部署注意
- 视频压缩依赖主机 **`ffmpeg`**(`media.ffmpeg_path`)。运行镜像已 `apk add ffmpeg`。
- 错误码:`40005` / `media_oversized`。
- 验证:上传一张 >150 KiB 的封面/头像后,对象体积应 ≤153600。