一个极简的图片/音频/视频随机分发服务:
- 框架: Gin
- 数据库: SQLite(modernc.org/sqlite,纯 Go、无需系统依赖)
- 特性: 启动扫描
MEDIA_ROOT自动入库;随机获取单个/批量;文件直出(支持常规浏览器播放);健康检查;CORS
# 可选:如拉依赖受限,先设置代理镜像
$env:GOPROXY="https://goproxy.cn,https://goproxy.io,https://mirrors.aliyun.com/goproxy/,direct"
$env:GOSUMDB="sum.golang.google.cn"
# 运行参数
$env:LISTEN_ADDR=":8080"
$env:MEDIA_ROOT="media"
$env:DATABASE_URL="file:media.db?cache=shared&mode=rwc&_fk=1"
# 安装依赖并运行
go mod tidy
go run ./cmd/server将图片/音频/视频文件放入 media/ 目录(允许子目录),服务启动时会自动扫描入库(按文件后缀分类)。
- 健康检查:
GET /healthz - 随机获取:
GET /api/v1/random?type=image|audio|video&count=1..50&exclude=1,2,3- 返回单条:
{ item, url } - 返回多条:
{ items: [{ item, url }, ...] }
- 返回单条:
- 查询元数据:
GET /api/v1/media/:id - 获取文件:
GET /api/v1/media/:id/file
示例(获取 5 张随机图片,排除 id=1,2):
curl "http://localhost:8080/api/v1/random?type=image&count=5&exclude=1,2"- 图片:jpg、jpeg、png、gif、webp、bmp、tiff
- 音频:mp3、wav、flac、aac、ogg、m4a
- 视频:mp4、mkv、mov、avi、webm
- LISTEN_ADDR:监听地址(默认
:8080) - MEDIA_ROOT:媒体根目录(默认
media) - DATABASE_URL:SQLite DSN(默认
file:media.db?cache=shared&mode=rwc&_fk=1)
cmd/server/ # 程序入口
internal/api/ # 路由与处理器
internal/config/ # 配置加载
internal/scanner/ # 启动时扫描入库
internal/storage/ # DB 打开与迁移
internal/media/ # 领域模型
- 目前随机采用 SQLite 的
ORDER BY RANDOM(),适合小规模;后续可切换为“密集 id 抽样/预生成池”。 - 仅基于后缀分类,未做深度媒体探测(时长/尺寸等元数据可后续接入 ffprobe/libvips)。
- 文件直出,未接入对象存储与预签名 URL;上线建议放到 CDN。
遵循仓库内 LICENSE 文件。