Saltar a contenido

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

  1. Autentica contra el tracker usando una cookie de sesión
  2. Itera mediante paginación (/users/{USERNAME}/uploads?page=N)
  3. Parsea el HTML con BeautifulSoup buscando patrones /torrents/{ID}
  4. Extrae IDs numéricos únicos
  5. Detiene cuando no encuentra nuevos IDs (fin del catálogo)

Resultado

Archivo: ids.txt

12345
12346
12347
...

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

  1. Itera sobre cada ID de ids.txt
  2. Para cada ID, extrae el campo name del formulario de edición (/torrents/{ID}/edit)
  3. Busca en TMP_ROOT (carpeta temporal local) un meta.json que coincida con ese nombre
  4. Crea un mapeo biunívoco: {nombre_tracker: ruta_local_meta.json}
  5. 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 por 01_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

  1. Carga mapeo_maestro.json
  2. 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.txt d. Metadata Injection: Inyecta desde meta.json:

    • imdb_id → campo imdb (sin prefijo tt)
    • tmdb → campo tmdb_movie_id (películas) o tmdb_tv_id (series)
    • tvdb_id → campo tvdb
    • mal_id → campo mal (si es anime) e. Description Update: Reemplaza mensajes viejos (e.g., MSG_VIEJOMSG_NUEVO) f. PATCH: Envía el formulario actualizado g. Checkpoint: Registra el ID en completados.txt si tuvo éxito
  3. Aplica Jitter (4.5-7.5 segundos entre peticiones) para simular comportamiento humano

Resultado

  • Tracker: Torrents actualizados con metadatos y descripciones sincronizadas
  • Local: completados.txt con IDs editados exitosamente

Detección de Categoría

El script detecta automáticamente si un torrent es película o serie:

is_tv = meta.get('category') == 'TV' or 
        meta.get('tmdb_type') == 'TV' or 
        "Season" in nombre_tracker

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

  1. Purga de Firmas: Elimina bloques definidos en FIRMAS_VIEJAS (p.ej. "PLEASE SEED", banners deprecated)
  2. Sanitización de URLs: Ejecuta expresiones regulares para eliminar referencias a hosts muertos (p.ej. pixhost.to.*)
  3. Reupload de Imágenes:
  4. Localiza .jpg / .png en la carpeta local del torrent
  5. Sube a ImgBB o PtScreens (según disponibilidad de API)
  6. Genera URLs nuevas y permanentes
  7. Reestructuración: Reorganiza la descripción en orden estándar:
    [Trailer] → [Galería Nueva] → [Banner Nuevo] → [Sinopsis Limpia]
    
  8. 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.txt sincronizado 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