Pipeline: Las 4 Fases
01_scraper.py — El Cosechador
Misión
Navega por tu perfil en el tracker y extrae los IDs numéricos de todos los torrents que has subido.
Funcionamiento
- Autentica contra el tracker usando una cookie de sesión
- Itera mediante paginación (
/users/{USERNAME}/uploads?page=N) - Parsea el HTML con BeautifulSoup buscando patrones
/torrents/{ID} - Extrae IDs numéricos únicos
- Detiene cuando no encuentra nuevos IDs (fin del catálogo)
Resultado
Archivo: ids.txt
Parámetros Configurables
| Parámetro | Ubicación | Efecto |
|---|---|---|
MAX_PAGES |
Línea ~18 | Máximo número de páginas a consultar (default: 80) |
COOKIE_VALUE |
singularity_config.py |
Sesión autenticada (crítica) |
USERNAME |
singularity_config.py |
De quién obtener uploads |
Velocidad de Ejecución
- ~80 páginas × 1 seg/página = ~1.5 minutos
- Incluye retraso de 1s entre peticiones para ser amable
Session Timeout
Si la cookie expira durante la ejecución, el script detiene el scraping. Genera un aviso pero continúa con los IDs ya extraídos.
02_indexer.py — El Archivista
Misión
Lee ids.txt, consulta el tracker para obtener el nombre exacto de cada torrent, y vincula ese nombre con la ruta absoluta a su meta.json local.
Funcionamiento
- Itera sobre cada ID de
ids.txt - Para cada ID, extrae el campo
namedel formulario de edición (/torrents/{ID}/edit) - Busca en
TMP_ROOT(carpeta temporal local) unmeta.jsonque coincida con ese nombre - Crea un mapeo biunívoco:
{nombre_tracker: ruta_local_meta.json} - Guardar en
mapeo_maestro.json
Resultado
Archivo: mapeo_maestro.json
{
"The Matrix 1999 1080p BluRay": "/app/RawLoadrr/tmp/matrix/meta.json",
"Inception 2010 2160p HEVC": "/app/RawLoadrr/tmp/inception/meta.json",
"Breaking Bad S05E16": "/app/RawLoadrr/tmp/bb_final/meta.json"
}
Dependencias Críticas
ids.txt(generado por01_scraper.py)- Estructura local:
TMP_ROOT/{carpetas}/meta.json - Acceso de lectura a
TMP_ROOT
Fallos de Mapeo
Si un torrent del tracker no tiene un meta.json local correspondiente, no aparecerá en mapeo_maestro.json. El script continúa sin asumir valores predeterminados.
03_mass_updater.py — El Cirujano de Metadatos
Misión
Realiza una edición quirúrgica en cada torrent: inyecta banners, limpia firmas obsoletas y fuerza la reinserción de metadatos correctos desde el meta.json local.
Funcionamiento
- Carga
mapeo_maestro.json -
Para cada ID: a. GET: Obtiene el formulario de edición (
/torrents/{ID}/edit) b. Parse: Extrae nombre, todos los campos del formulario c. Local Sync: Lee descripción limpia desde[MILNU]DESCRIPTION.txtd. Metadata Injection: Inyecta desdemeta.json:imdb_id→ campoimdb(sin prefijott)tmdb→ campotmdb_movie_id(películas) otmdb_tv_id(series)tvdb_id→ campotvdbmal_id→ campomal(si es anime) e. Description Update: Reemplaza mensajes viejos (e.g.,MSG_VIEJO→MSG_NUEVO) f. PATCH: Envía el formulario actualizado g. Checkpoint: Registra el ID encompletados.txtsi tuvo éxito
-
Aplica Jitter (4.5-7.5 segundos entre peticiones) para simular comportamiento humano
Resultado
- Tracker: Torrents actualizados con metadatos y descripciones sincronizadas
- Local:
completados.txtcon IDs editados exitosamente
Detección de Categoría
El script detecta automáticamente si un torrent es película o serie:
Esto determina si inyectar tmdb_movie_id o tmdb_tv_id.
Manejo de Errores
| Código HTTP | Acción |
|---|---|
| 200, 302 | ✅ Éxito, registra en completados.txt |
| 429 | ⏸️ Rate Limit, pausa 30s e intenta 3 veces |
| 502, 503, 504 | ⏸️ Cloudflare, pausa 30s e intenta 3 veces |
| 422 | ❌ Error de validación, salta al siguiente ID |
| Otros (4xx, 5xx) | ❌ Error, salta al siguiente ID |
Cookie Expirada (422 persistente)
Si recibe errores 422 repetidamente con mensaje de validación oscuro, la cookie probablemente expiró. El script se detiene.
Rendimiento
- Promedio: 1 torrent cada ~5 segundos (incluyendo Jitter)
- 1000 torrents ≈ 1.5 horas
- Reanudar desde checkpoint: especificar ID_START en modo manual
04_image_resurrector.py — El Resucitador de Imágenes
Misión
Fase final de reconstrucción visual. Detecta y elimina firmas obsoletas, limpia hosts muertos, sube imágenes nuevas y reordena el contenido en un formato estándar.
Funcionamiento
- Purga de Firmas: Elimina bloques definidos en
FIRMAS_VIEJAS(p.ej. "PLEASE SEED", banners deprecated) - Sanitización de URLs: Ejecuta expresiones regulares para eliminar referencias a hosts muertos (p.ej.
pixhost.to.*) - Reupload de Imágenes:
- Localiza
.jpg/.pngen la carpeta local del torrent - Sube a ImgBB o PtScreens (según disponibilidad de API)
- Genera URLs nuevas y permanentes
- Reestructuración: Reorganiza la descripción en orden estándar:
- Sincronización Doble: Actualiza tanto el tracker como el archivo local
[MILNU]DESCRIPTION.txt
Resultado
- Tracker: Descripciones visualmente perfectas, sin imágenes rotas
- Local:
[MILNU]DESCRIPTION.txtsincronizado con versión remota
Dependencias de API
| API | Parámetro | Uso |
|---|---|---|
| ImgBB (recomendado) | IMGBB_API en config |
Upload de imágenes .jpg / .png |
| PtScreens (opcional) | PTSCREENS_API en config |
Fallback si ImgBB falla |
Estrategia de Upload
El script intenta ImgBB primero. Si falla o API-key no disponible, registra la imagen como "pendiente" en log. PtScreens se usa como fallback opcional.
Expresiones Regulares de Sanitización
Por defecto elimina:
- pixhost\.to.*
- prnt\.sc.* (Lightshot)
- URLs muertas con pattern común
Limpieza Agresiva
El script aplica regex destructivas. Se recomienda backup local de descripciones antes de ejecutar. Los cambios se revierten localmente si el upload falla.
Checkpoint
Genera completados_resurrector.txt análogo al de 03_mass_updater.py para reanudar si se interrumpe.
Tabla de Decisión Rápida
| ¿Quiero...? | Ejecutar |
|---|---|
| Extraer IDs de mis torrents | 01_scraper.py |
| Mapear torrents a meta.json | 01_scraper.py + 02_indexer.py |
| Restaurar metadatos perdidos | 02_indexer.py + 03_mass_updater.py |
| Cambiar banner masivamente | 03_mass_updater.py (ajusta MSG_VIEJO/MSG_NUEVO) |
| Reparar imágenes rotas | 04_image_resurrector.py |
| Restauración COMPLETA | Todos los 4 scripts en orden |