频道三千条视频的缩略图,我按分辨率分桶才发现问题
频道有 3200 条视频,做封面归档时我想按缩略图分辨率分类:高清、标清、无封面。原以为 maxresdefault.jpg 存在就是高清,直接 curl -I 看 200 还是 404。结果跑完发现 1400 多条被判成「无封面」,抽查几条明明在网页上有图。
我的做法是先别信 HTTP 状态码,改成下载前 1KB 看真实内容。maxres 缺失时 YouTube 会返回一张默认占位图,状态码是 200,Content-Length 固定在一个很小的值,跟真实封面差一个量级。
for id in $(cat video_ids.txt); do
url="https://i.ytimg.com/vi/$id/maxresdefault.jpg"
size=$(curl -sI "$url" | awk 'tolower($1)=="content-length:"{print $2}' | tr -d '\r')
if [ -z "$size" ] || [ $size -lt 20000 ]; then
echo "$id fallback" >> need_sd.txt
else
echo "$id hd" >> hd.txt
fi
done
阈值 20000 是我这批数据里试出来的:真实 maxres 普遍在 30KB 以上,占位图不到 10KB。中间那批 15–25KB 的我单独列出来人工看,大约 60 条,多数是老视频的低清源被放大。
为什么用 -I 而不是先下载:3200 条全下载按每条 200KB 算是 600MB 上下,流量不是大问题,但要跑两遍才能知道哪些该回退,先 HEAD 一遍把范围缩小到 400 条左右,下载量砍掉八成。代价是 HEAD 请求本身也有 3200 次,碰到限速要加 sleep,我最后是每 20 条停 1 秒。
失效的地方有两个。一是 Content-Length 不一定回传,CDN 偶尔给 chunked,这时 awk 取不到值,脚本会误判成 fallback,所以我把空值也归进待定而不是直接判死。二是占位图大小不是绝对稳定,我隔了一周重跑,同一批里有 3 条的 size 从 9KB 变成 11KB,阈值卡太紧会漂。更稳的做法是比对图片的宽高而不是字节数,但那就得真下载,取舍看你要不要再跑第二次。
另一个坑跟分辨率无关:频道里有些视频删了,但缩略图 CDN 还留着缓存,HEAD 返回 200 且有正常大小,点进视频页却是 404。这批我没法从缩略图侧识别,只能拿视频页状态再交叉一次。
现在的问题是,你们归档封面时怎么判断「这条视频还活着」?我目前只有视频页 HEAD 这一条路,但跑全量太慢,想找个更轻的信号。
0 条评论
还没有评论,写下第一条。