Los canales que dependían de listas de reproducción seleccionadas de YouTube pierden contenido constantemente a medida que los videos se eliminan, se les aplica una restricción de edad o se eliminan. Este tutorial rastrea las eliminaciones de listas de reproducción diariamente a través del punto final de listas de reproducción de YouTube de Scavio y emite una diferencia para que pueda reemplazar los videos eliminados antes de que sus espectadores se den cuenta.
Requisitos previos
- Python 3.10+
- Una clave API de Scavio
- Una URL o ID de una lista de reproducción de YouTube
- SQLite para instantáneas diarias
Guia paso a paso
Paso 1: Obtener la lista de reproducción
Scavio devuelve todos los vídeos con indicadores de estado.
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', [])Paso 2: Instantánea a SQLite
Una fila por video por día.
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()Paso 3: Diferencia con ayer
Nuevas mudanzas = ayer - hoy.
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 - tPaso 4: Alerta sobre mudanzas
Slack o correo electrónico cuando las eliminaciones sean > 0.
def alert(removed):
if removed:
print(f'ALERT: {len(removed)} videos removed: {list(removed)}')Paso 5: Programar ejecución diaria
Acciones cron o GitHub a las 6 a. m. UTC.
0 6 * * * /usr/bin/python3 /path/to/playlist_watch.pyEjemplo en 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')Ejemplo en 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;
}Salida esperada
Daily diff per playlist, highlighting removed video IDs and titles. Typical finding: 1-5% of a 200-video playlist goes unavailable per month.