# Asset Pipeline · TOS 桶资源压缩 + 打包

把 `public/portraits/` 和 `public/videos/` 转成桶友好的体积（WebP + H.264），输出到仓库外的 `../assets-compressed/`。

## 输出结构（与桶目录对齐）

```
assets-compressed/
├── portraits/
│   ├── 001.webp
│   ├── 001-2.webp
│   ├── 001-3.webp
│   ├── 001-view.webp
│   └── ...
└── videos/
    ├── hero-pv.mp4
    └── artists/001.mp4 ...
```

## 压缩参数

| 类型 | 处理 | 目标体积 |
|---|---|---|
| 立绘 / 氛围图 PNG | WebP q82, 最大宽 1600 | ≤ 800KB |
| 三视图 `-view.png` | WebP q82, 最大宽 2400 | ≤ 1.5MB |
| 视频 MP4 | libx264 CRF 28, 最大宽 1920, AAC 96k, faststart | 单条 ≤ 3MB / Hero PV ≤ 15MB |

## 用法

```bash
cd tools/asset-pipeline
npm install           # 装 sharp + ffmpeg-installer (各自带二进制, 无需系统装)
npm run compress      # 压缩, 已存在且新于源的输出会跳过 (可恢复中断)
npm run pack          # 打包成 cyber-star-assets.tar.gz
```

输出文件：

```
../../assets-compressed/                # 压缩后的源文件 (供回滚 / 抽查)
../../cyber-star-assets.tar.gz          # 发给运维上传的最终包
```

## 上传到桶

运维拿到 `cyber-star-assets.tar.gz` 解压后，用 tosutil 整目录推：

```bash
tar -xzf cyber-star-assets.tar.gz
tosutil cp -r -f assets-compressed/* tos://cyber-star/
```
