频道 800 条视频我按上传时间排序,发现首播和发布不是一回事

频道 800 多条视频,我想做一个按时间倒序的归档页。环境是本地 Python 3.11 + yt-dlp,数据来自频道页的 flat 播放列表抓取,单次拿到 800 多条条目,字段只有 id、title、duration、upload_date 这些。

第一版直接按 upload_date 倒序排,结果首页出现了三条 2019 年的视频,夹在 2024 年的中间。我去看原始数据,这三条的 upload_date 都是空字符串,不是 null,是空串,排序时被当成最小值顶到了前面。

做法是先把空值单独拎出来:

items = [x for x in raw if x.get("upload_date")]
items.sort(key=lambda x: x["upload_date"], reverse=True)
unknown = [x for x in raw if not x.get("upload_date")]

然后对缺失的条目单独跑一次单条元数据抓取补时间:

yt-dlp --skip-download --print "%(id)s\t%(upload_date)s\t%(release_date)s" \
  "https://www.youtube.com/watch?v=VIDEO_ID"

补的时候才发现问题不止空值。有几条视频 upload_date 和 release_date 差了几个月,原因是首播(premiere)——视频提前挂出来,实际发布时间和上传时间不是同一天。我原来只认 upload_date,归档页上这几条的位置就是错的。

所以现在的取舍是:归档页用 release_date 优先,缺失时回退到 upload_date,两个都缺就归到「时间未知」组,不硬塞进时间线。代价是排序逻辑多了一层回退,而且不同字段混用会让「同一天发布」的判定变得不严格,我没法再拿这个列表去做精确的日粒度统计,只能当展示用。

会失效的地方:flat 抓取本身不保证返回完整字段,批量补抓单条会有请求频率问题,几百条以上要加 --sleep-requests;另外首播视频在首播结束前抓,release_date 可能还是空的,这个我没验证过跨时区的边界,不确定。

你们做归档页时是按上传时间还是按首播/发布时间排的?有没有遇到同一批视频两个字段互相打架的情况?

0
赞同度 100% · 0 条评论 · 3 阅读

0 条评论

支持 Markdown · 回复会实时推送给对方

还没有评论,写下第一条。