由于视频被删除、年龄限制或删除,依赖 YouTube 精选播放列表的频道会不断丢失内容。本教程每天通过 Scavio 的 YouTube 播放列表端点跟踪播放列表删除情况,并发出差异,以便您可以在观看者注意到之前替换已删除的视频。
前置条件
- Python 3.10+
- Scavio API 密钥
- YouTube 播放列表 URL 或 ID
- SQLite 用于每日快照
操作指南
步骤 1: 获取播放列表
Scavio 返回带有状态标志的所有视频。
Python
import requests, os
API_KEY = os.environ['SCAVIO_API_KEY']
def playlist(pid):
r = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': API_KEY},
json={'platform': 'youtube_playlist', 'query': pid})
return r.json().get('videos', [])步骤 2: SQLite 快照
每个视频每天一行。
Python
import sqlite3
conn = sqlite3.connect('pl.db')
conn.execute('CREATE TABLE IF NOT EXISTS snap (date TEXT, playlist TEXT, video_id TEXT, title TEXT, status TEXT)')
def snapshot(pid, videos):
for v in videos:
conn.execute('INSERT INTO snap VALUES (date(\'now\'), ?, ?, ?, ?)',
(pid, v['id'], v['title'], v.get('status', 'available')))
conn.commit()步骤 3: 与昨天的差异
新搬迁=昨天-今天。
Python
def diff(pid):
y = set(r[0] for r in conn.execute('SELECT video_id FROM snap WHERE date = date(\'now\', \'-1 day\') AND playlist = ?', (pid,)))
t = set(r[0] for r in conn.execute('SELECT video_id FROM snap WHERE date = date(\'now\') AND playlist = ?', (pid,)))
return y - t步骤 4: 关于移除的警报
当移除量 > 0 时,可松弛或通过电子邮件发送。
Python
def alert(removed):
if removed:
print(f'ALERT: {len(removed)} videos removed: {list(removed)}')步骤 5: 安排每日跑步
UTC 时间早上 6 点的 cron 或 GitHub Actions。
Bash
0 6 * * * /usr/bin/python3 /path/to/playlist_watch.pyPython 示例
Python
import os, requests, sqlite3
API_KEY = os.environ['SCAVIO_API_KEY']
PID = 'PLxxxxxxxx'
conn = sqlite3.connect('pl.db')
conn.execute('CREATE TABLE IF NOT EXISTS snap (date TEXT, video_id TEXT)')
r = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': API_KEY},
json={'platform': 'youtube_playlist', 'query': PID})
for v in r.json().get('videos', []):
conn.execute('INSERT INTO snap VALUES (date(\'now\'), ?)', (v['id'],))
conn.commit()
print('snapshot saved')JavaScript 示例
JavaScript
const API_KEY = process.env.SCAVIO_API_KEY;
export async function snap(playlistId) {
const r = await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST',
headers: { 'x-api-key': API_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({ platform: 'youtube_playlist', query: playlistId })
});
return (await r.json()).videos;
}预期输出
JSON
Daily diff per playlist, highlighting removed video IDs and titles. Typical finding: 1-5% of a 200-video playlist goes unavailable per month.