Les chaînes qui s'appuient sur des playlists YouTube organisées perdent constamment du contenu à mesure que des vidéos sont supprimées, soumises à une limite d'âge ou effacées. Ce tutoriel suit les suppressions de playlists quotidiennement via le point de terminaison des playlists YouTube de Scavio et émet un diff pour vous permettre de remplacer les vidéos supprimées avant que vos spectateurs ne les remarquent.
Prérequis
- Python 3.10+
- Une clé API Scavio
- Une URL ou un ID de playlist YouTube
- SQLite pour les instantanés quotidiens
Parcours
Étape 1: Récupérer la playlist
Scavio renvoie toutes les vidéos avec des indicateurs d'état.
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', [])Étape 2: Instantané vers SQLite
Une ligne par vidéo par jour.
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()Étape 3: Diff par rapport à hier
Nouvelles suppressions = hier - aujourd'hui.
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Étape 4: Alerte en cas de suppression
Slack ou email lorsque les suppressions > 0.
def alert(removed):
if removed:
print(f'ALERT: {len(removed)} videos removed: {list(removed)}')Étape 5: Planifier une exécution quotidienne
cron ou GitHub Actions à 6h UTC.
0 6 * * * /usr/bin/python3 /path/to/playlist_watch.pyExemple 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')Exemple 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;
}Sortie attendue
Daily diff per playlist, highlighting removed video IDs and titles. Typical finding: 1-5% of a 200-video playlist goes unavailable per month.