# `promotion/social/`

统一放 **关注我们二维码** 与 **首页产品视频** 的封面/视频，**仅用英文名、小写、连字符**，避免 URL 编码与网关问题。

## 关注我们（已有）

| 文件 | 说明 |
|------|------|
| `xiaohongshu.png` | 小红书 |
| `douyin.png` | 抖音 |
| `wechat-official.png` | 公众号 |
| `wechat-channels.jpg` | 视频号 |

## 产品视频（与 `promotionVideos.js` 一致）

| 文件 | 说明 |
|------|------|
| `video-calc-demo-1-cover.jpg` / `video-calc-demo-1.mp4` | 操作与计算（一） |
| `video-calc-demo-2-cover.jpg` / `video-calc-demo-2.mp4` | 操作与计算（二） |
| `video-aiword-cover.jpg` / `video-aiword.mp4` | AI Word |
| `video-voice-office-cover.jpg` / `video-voice-office.mp4` | 语音办公 |
| `video-invoice-ai-cover.jpg` / `video-invoice-ai.mp4` | 办发票 |

### 从 .mov 转码为 .mp4（推荐）

剪辑软件常导出 **.mov**，浏览器兼容性差；前台统一使用 **`.mp4`（H.264+AAC）**（见 `src/data/promotionVideos.js`）。

**服务端自动转码（推荐，线上）**  
上传到 **`promotion/...`** 的 **`.mov`** 时，API 容器/主机需在 PATH 中有 **`ffmpeg`**（`server/Dockerfile`、`Dockerfile.run` 已 `apk add ffmpeg`）。服务会：

1. **上传后**：异步将 `.mov` 转为同名 `.mp4`，删除原 `.mov`，并更新 `site_assets` 中路径与大小。  
2. **启动后约 3 秒**：扫描 `uploads/sites/*/promotion/**/*.mov`，对遗留文件补转码并写库。

环境变量 **`SKIP_PROMOTION_TRANSCODE=1`** 可关闭转码（无 ffmpeg 时避免报错日志）。

部署 API 镜像更新后请执行 **`docker compose build api`**（或等价命令），确保运行环境含 ffmpeg。

**仅静态站、无 API 时（本地可选）**  
可在 `web/` 执行 `npm run transcode`（见 `scripts/auto-transcode-promotion.mjs`），或仓库根目录 `scripts/transcode-promotion-videos.sh` / `.ps1`。

线上访问示例：`https://你的域名/promotion/social/douyin.png`  
（须将 `web/promotion` 同步到 **`deploy/web/dist/promotion`**，见 `pull-and-restart.sh`。）

首页产品视频：只对**第一条**的封面与视频各探测一次静态；若任一不存在则**全部**走 `promotion-media` API（避免 Network 里 10+ 条 404）。若素材**只在上传目录**，可在 `web/.env.production` 设 **`VITE_PROMOTION_API_ONLY=true`** 并配合 **`VITE_DEFAULT_SITE_ID`**，不再发静态探测请求。

## 从旧「视频发布」目录迁移

**仅同步到源码 `social/`（给静态站用）：**

```bash
./scripts/sync-video-assets-to-social.sh
```

**一键写入「统一 API」目录 + 数据库 `site_assets`（推荐线上，免后台手传）：**

需与 API 共用 `server/.env`（`MONGODB_URI`、`MONGODB_DB`），并指定官网站点 `site_id`（与 `/api/web/routes` 一致）：

```bash
chmod +x scripts/import-promotion-to-api.sh
./scripts/import-promotion-to-api.sh -site=你的站点MongoID
# 预览：./scripts/import-promotion-to-api.sh -site=xxx -dry-run
# 自定义路径：-src=/www/yh_web/web/promotion/视频发布 -upload=/www/yh_web/data/uploads
```

效果：文件落到 `data/uploads/sites/<site_id>/promotion/social/`（英文名），MongoDB 写入与后台上传相同结构的记录，并附带 `import_source`、`source_relpath` 便于对照原中文路径。对外 URL 仍为  
`/api/web/sites/<site_id>/promotion-media/social/<文件名>`。

## 后台上传

目录：`promotion/social/`，上传上表文件名，勾选 **保留原文件名**。API 路径为  
`/api/web/sites/<site_id>/promotion-media/social/<文件名>`。
