Media Tools
El toolkit de media del lab: 9 herramientas que se componen end-to-end en un pipeline de movie/series research → find → subtitle/dub → playback. Comandos concretos, contratos y patrones de composición.
Propósito
El media toolkit es la colección del lab de 9 herramientas para automatización de entretenimiento. Es una aplicación concreta del patrón de Tooling Layer a un dominio específico: búsqueda de películas/series, descubrimiento de subtítulos, detección de audio doblado, extracción de metadatos técnicos y reproducción multi-backend.
Esta página documenta el contrato de cada herramienta, el pipeline end-to-end y los patrones de composición. El formato TOOL.md por herramienta está en Tool Spec. La estructura estándar de herramienta está en Tool Structure. El esquema tools.json está en Tool Registry. El Media Lab Server está en Media Lab Server.
Inventario de herramientas
| # | Herramienta | Status | Layer | Función |
|---|---|---|---|---|
| 1 | torrent-finder | Implemented | search | Find BitTorrent sources for a title. |
| 2 | subtitle-finder | Implemented | search | Find subtitles in one or more languages. |
| 3 | dubbed-finder | Implemented | search | Detect releases with dubbed audio for a language. |
| 4 | media-info | Implemented | metadata | Extract technical video metadata via ffprobe. |
| 5 | media-organizer | Planned | library | Organize downloaded media into a library structure. |
| 6 | chromecast | Implemented | playback | Discover and control Cast devices on the LAN. |
| 7 | vlc | Implemented | playback | Spawn and control VLC locally or on a remote host. |
| 8 | media-playback | Implemented | dispatcher | High-level dispatcher that picks the right backend. |
| 9 | media-lab-server | Implemented | generation | Local HTTP server (:8765) for image and music generation. |
Las herramientas se dividen en cuatro layers: search, metadata, playback, dispatcher y generation. El Media Agent compone los layers en un pipeline end-to-end.
Quick reference: pipeline de media end-to-end
El flujo típico de request del Media Agent:
Una request completa corre en 3 a 7 segundos (search + selection + backend dispatch) sin transcoding; con transcoding, 1-3 minutos.
torrent-finder
Herramienta CLI. Busca fuentes públicas de torrent para una película o serie por título, año, calidad o codec.
Activación
Activar cuando:
- El usuario pide fuentes de torrent para un título específico.
- Una request de media requiere identificación de fuente.
- El Media Agent necesita un release candidato.
Inputs
| Name | Tipo | Requerido | Constraints |
|---|---|---|---|
title | string | yes | non-empty |
year | integer | no | 1900 to current year |
quality | string | no | 480p, 720p, 1080p, 2160p |
codec | string | no | x264, x265, h264, h265, hevc, av1 |
limit | integer | no | default 20, max 100 |
Command shape
Outputs
Sources y sus características
La configuración por defecto consulta tres fuentes; cada una tiene sus quirks.
| Source | Protocolo | Soporte de filtros | Filtros de calidad | Notas |
|---|---|---|---|---|
solidtorrents.net | HTML | strong | 4K, 1080p, HDR, DV, x265, x264 | Aggregator con filtros ricos. |
1377x.to | HTML | medium | 1080p, 720p | Altos seed counts; más releases 1080p. |
bt4g.com | HTML | weak | none built-in | Alta cobertura; menor signal/noise. |
La herramienta normaliza la respuesta entre fuentes para que el JSON de salida tenga una única forma.
Filtros y detección de calidad
La herramienta corre cada candidato por un filtro multi-paso:
- Normalización de título. Strip el año, la resolución, el codec, el grupo y cualquier carácter especial.
- Match de calidad. Compara el tag de calidad del release con la calidad pedida. Un release
1080pno pasa un filtro4K. - Match de codec. Compara el tag de codec del release con el codec pedido.
h265yhevcson equivalentes. - Sanity check de tamaño. Un release
4Kpor debajo de 1 GB se rechaza como probablemente CAM/TS. - Umbral de seeders. Un release con 0 seeders se rechaza.
Failure modes
| Failure | Handling |
|---|---|
| Las tres fuentes timeout | Reintentar cada una una vez; devolver error. |
| Una fuente devuelve 4xx | Saltar; probar las otras dos. |
| Todas las fuentes devuelven 4xx | Devolver error con los status codes upstream. |
| No hay resultados que matcheen el filtro | Devolver array sources vacío con count: 0. |
| Magnet URL es malformed | Saltar la entrada; loguear el issue. |
El count de resultados excede limit | Ordenar por seeders, tomar top limit. |
Configuración
| Variable | Default | Propósito |
|---|---|---|
TORRENT_SOURCES | [solidtorrents.net, 1377x.to, bt4g.com] | Sources a consultar. |
TORRENT_TIMEOUT_S | 30 | Timeout por request. |
TORRENT_USER_AGENT | (random per request) | String del user agent. |
TORRENT_PROXY_URL | (none) | Proxy HTTP/HTTPS opcional. |
TORRENT_MIN_SEEDERS | 0 | Mínimo de seeders para incluir un release. |
Dependencies
requests>=2.28: cliente HTTP.beautifulsoup4>=4.11: parsing de HTML.lxml>=4.9: parser de XML/HTML.pydantic>=2.0: validación del esquema de salida.
subtitle-finder
Herramienta CLI. Busca sitios públicos de subtítulos para una película o serie.
Activación
- El usuario pide subtítulos para un título específico.
- Una request de media requiere descubrimiento de subtítulos.
Inputs
| Name | Tipo | Requerido | Constraints |
|---|---|---|---|
title | string | yes | non-empty |
year | integer | no | 1900 to current year |
season | integer | no | 1 to 99 (series) |
episode | integer | no | 1 to 999 (series) |
language | string | yes | ISO 639-1 code (p. ej., es, en) |
limit | integer | no | default 20, max 100 |
Command shape
Outputs
Failure modes
| Failure | Handling |
|---|---|
| Todos los sitios de subtítulos down | Devolver error con el status upstream. |
| No hay resultados | Devolver array subtitles vacío. |
| Release name no matchea | Surface en los metadatos del resultado; el usuario puede elegir. |
dubbed-finder
Herramienta CLI. Detecta releases que tienen audio doblado en un idioma dado.
Activación
- El usuario pide una versión doblada de un título.
- Una request de media requiere información del idioma del audio.
Inputs
| Name | Tipo | Requerido | Constraints |
|---|---|---|---|
title | string | yes | non-empty |
year | integer | no | 1900 to current year |
language | string | yes | ISO 639-1 code |
limit | integer | no | default 20, max 100 |
Outputs
Cómo detecta el audio doblado
La herramienta usa dos señales:
- Release name. Strings como
Spanish,Castellano,VOSE,Dual-Audio,Multison señales fuertes. - Cross-check con media-info. Cuando el usuario tiene un fichero local,
media-infodevuelve los idiomas de las pistas de audio; la herramienta usa eso como ground truth.
El cross-check con media-info de la herramienta es la señal más fiable; el release name es un hint.
media-info
Herramienta CLI. Extrae metadatos técnicos de vídeo a través de ffprobe o mediainfo.
Activación
- El usuario pide info técnica de un fichero de vídeo.
- Una request de media necesita resolución, codec o duración.
- El Media Agent necesita verificar que el fichero descargado matchea la calidad pedida.
Inputs
| Name | Tipo | Requerido | Constraints |
|---|---|---|---|
path | string | yes | ruta absoluta a un fichero de vídeo |
mode | string | no | full, quick (default full) |
Command shape
Outputs (full)
Failure modes
| Failure | Handling |
|---|---|
ffprobe no está en PATH | Devolver error: backend unavailable. |
| Fichero no encontrado | Devolver error con la ruta. |
| El fichero no es un fichero de media | Devolver error con la detección de formato. |
| Permiso denegado | Devolver error con el permiso necesario. |
media-organizer (planned)
Herramienta CLI. Organiza el media descargado en una estructura de librería basada en metadatos. Status: planned; la implementación seguirá la CLI Python tool template.
Inputs planeados:
source: ruta al directorio fuente.library: ruta a la raíz de la librería.strategy:movie-tmdb|series-tvdb|flat.
Outputs planeados:
chromecast
Herramienta CLI. Descubre dispositivos Cast en la LAN y controla la reproducción en un dispositivo seleccionado.
Activación
- El usuario quiere reproducir un cloud stream en una TV.
- El selector de backend del Media Agent escoge Chromecast para una request.
Protocolo
La herramienta usa el protocolo Cast de Google. El discovery es mDNS (_googlecast._tcp.local.). El control es HTTPS en el puerto devuelto por el registro mDNS (típicamente 8009).
Acciones
| Acción | Inputs | Outputs |
|---|---|---|
discover | none | list of devices |
play | device, url, content_type, title?, thumb? | playback status |
pause | device | ack |
resume | device | ack |
stop | device | ack |
status | device | current state |
volume | device, volume | new volume |
Command shape
Outputs
Para discover:
Para play:
Failure modes
| Failure | Handling |
|---|---|
| No hay dispositivos en la LAN | Devolver lista vacía; el usuario puede reintentar. |
| Dispositivo inaccesible | Reintentar una vez; luego devolver error. |
play falla (p. ej., URL mala) | Devolver el mensaje de error de Cast. |
| Volume fuera de rango | Clamp a 0.0-1.0. |
vlc
Herramienta CLI. Lanza y controla VLC local o en un host remoto sobre la interfaz RC (TCP) o HTTP.
Activación
- La fuente es un fichero local y el usuario quiere reproducirlo en un dispositivo remoto.
- La fuente es un stream de red que necesita transcoding o enviar a un dispositivo no-Cast.
- El usuario pide VLC explícitamente.
- El selector de backend del Media Agent escoge VLC para una request (p. ej., cuando se requiere transcoding).
Protocolo
VLC se controla a través de su interfaz RC (TCP) o HTTP. El puerto por defecto para RC es 4212. El puerto por defecto para HTTP es 8080. La herramienta soporta ambos.
Acciones
| Acción | Inputs | Outputs |
|---|---|---|
play | host, source | started / enqueued / failed |
enqueue | host, source | started / enqueued / failed |
pause | host | ack |
resume | host | ack |
stop | host | ack |
status | host | state and position |
transcode | host, source, profile | started / failed with sout URL |
duplicate | host, source, profile | started / failed with duplicate URL |
quit | host | ack |
Command shape
Outputs
Para play:
Para transcode:
Profiles
El argumento profile es un perfil sout de VLC con nombre. Profiles built-in:
| Profile | Output | Caso de uso |
|---|---|---|
hls-1080p | HLS 1080p @ 5 Mbps | Streaming en red local a una TV |
hls-720p | HLS 720p @ 2.5 Mbps | Dispositivos de bajo ancho de banda o antiguos |
dash-1080p | DASH 1080p @ 5 Mbps | Smart TVs modernas |
raw-copy | Copy the source without re-encoding | Local playback |
audio-only | Strip video, keep audio | Casting to speakers |
Los profiles custom se pueden añadir en la configuración.
Failure modes
| Failure | Resultado |
|---|---|
| Host inaccesible (TCP connect refused) | Devolver un resultado "host unreachable". |
| Autenticación RC falla | Devolver un resultado "auth failed". |
add o play devuelve un error de VLC | Devolver el mensaje de error en el resultado. |
Puerto de la URL sout ya en uso | Incrementar y reintentar una vez. |
| Binario de VLC no encontrado en PATH | Devolver un resultado "backend unavailable". |
| Fichero fuente no encontrado | Devolver un resultado "source not found". |
Configuración
| Variable | Default | Propósito |
|---|---|---|
VLC_BINARY | vlc | Ruta al binario de VLC. |
VLC_RC_PORT | 4212 | Puerto RC por defecto. |
VLC_RC_PASSWORD | (none) | Password RC por defecto. |
VLC_HOSTS | (none) | Hosts con nombre (p. ej., kitchen:192.168.1.50). |
media-playback
Dispatcher de alto nivel. Selecciona el backend de playback correcto (Chromecast, VLC o direct) para una fuente y target dados, y luego invoca la herramienta apropiada. El flujo de request del Media Agent llama a esta herramienta en lugar de llamar directamente a chromecast, vlc o al direct player.
Algoritmo de selección de backend
El dispatcher usa las siguientes reglas en orden:
- Backend explícito. Si el caller pasó
backendexplícitamente, usarlo. - Tipo de dispositivo target. Si el target es un dispositivo Cast (el nombre matchea un Cast descubierto), usar
chromecast. - Tipo de fuente y target. Si la fuente es un fichero local y el target es un host VLC con nombre, usar
vlc. - Tipo de fuente y transcoding. Si la fuente es un fichero local y se requiere transcoding, usar
vlc. - La fuente es un stream de red. Si la fuente es un stream HLS/DASH y el target es un dispositivo Cast, usar
chromecast. - Default. Si ninguno de los anteriores matchea, usar
direct(lanzar el reproductor por defecto del SO).
Inputs
| Name | Tipo | Requerido | Constraints |
|---|---|---|---|
source | object | yes | la fuente a reproducir (URL, ruta de fichero o descriptor de stream) |
target | object | no | el dispositivo target (nombre Cast, host VLC o localhost) |
backend | string | no | elección explícita de backend: chromecast, vlc o direct |
options | object | no | opciones específicas del backend |
Outputs
Direct player
El direct player lanza el reproductor de media por defecto del SO:
- macOS:
open <path>uopen <url>. - Linux:
xdg-open <path>oxdg-open <url>.
El direct player es el backend más simple; no tiene controles ni tracking de estado.
media-lab-server
Un servidor HTTP local que genera imágenes y música. No es una herramienta CLI sino un servicio HTTP. Documentado en detalle en Media Lab Server.
Quick reference:
- Escucha en
127.0.0.1:8765. - Expone
/api/imagey/api/music. - Web UI en
http://127.0.0.1:8765/.
Coordinación de herramientas
Las herramientas de media se componen en un pipeline. El Media Agent corre el pipeline.
Etapas del pipeline
- Discovery —
torrent-finderproduce una lista de candidatos. - Selection — el usuario (o el agente, por defecto) escoge un candidato.
- Descubrimiento de subtítulos (opcional) —
subtitle-finderproduce candidatos de subtítulos. - Descubrimiento de audio doblado (opcional) —
dubbed-finderencuentra releases con el idioma pedido. - Metadatos (opcional) —
media-infoextrae info técnica del fichero local. - Selección de backend —
media-playbackescoge un backend. - Dispatch —
media-playbackinvoca la herramienta de backend elegida. - Playback — el usuario ve/escucha.
El pipeline es la base del workflow del Media Agent.
Sequential vs parallel
Las etapas 1, 3 y 4 pueden correr en paralelo cuando los candidatos de búsqueda son independientes. Las etapas 5 y 7 deben correr secuencialmente porque dependen de una única fuente. La etapa 6 debe correr tras las etapas 1-5 porque necesita la fuente seleccionada.
Una run paralela típica:
torrent-finder(search sources) — 5-15 ssubtitle-finder(find subs) — 2-5 s — paralleldubbed-finder(find dubbed) — 2-5 s — parallelmedia-info(verify local file) — 1-2 s — solo cuando el fichero ya está descargado
Caché
Las herramientas cachean sus resultados:
torrent-findercachea los resultados de búsqueda en un fichero local (~/.cache/torrent-finder/) durante 1 hora.subtitle-findercachea durante 1 hora.media-infocachea el resultado por fichero indefinidamente (el mtime del fichero es la clave de caché).
La caché reduce trabajo duplicado cuando el usuario vuelve a un mismo título.
Recovery de errores
El pipeline es resiliente: una etapa que falla no aborta el pipeline a menos que el usuario requiera su salida. Por ejemplo, si subtitle-finder falla, el usuario puede reproducir el release sin subtítulos igualmente.
El Media Agent surface el error al usuario y continúa con la siguiente etapa.
Ejemplos de entradas del registry
Las herramientas de media se registran en tools.json. Entradas reales:
Los tags los usa el skill loader para activar la herramienta correcta cuando aparece un topic relevante en una request.