SGCG

…esto no es un subtítulo…

Ir a: contenido categorías calendario archivo suscripción

Volver arriba

Bajar vídeos de la mediateca de RTVE

2010-02-20

Actualización:
El sistema de distribución de vídeo de la página de RTVE ha cambiado varias veces desde la escritura de este artículo y el método aquí descrito está obsoleto. El método que funciona en el momento de escribir esta actualización (septiembre de 2012) está en un artículo más reciente. También hay una versión al día del programita rtve-mediateca-dl que implementa esté método.

Llega otra entrega de *nix en casos prácticos. Hoy veremos un modo conveniente de automatizar la descarga de vídeos de la Mediateca de Radio Televisión Española. Así podremos reunir cómodamente nuestros vídeos favoritos en nuestro propio espacio de almacenamiento para verlos una vez tras otra y conservarlos durante mucho tiempo sin tener que acceder una vez tras otra a los servidores de RTVE, de modo que incluso reduciremos los gastos de la corporación pública… ¡gracias a nuestro ingenio y nuestra destreza en el uso de nuestra poderosa estación de trabajo!

*nix en casos prácticos no es un curso para absolutos principiantes, sino que está pensado para estimular la curiosidad de quien ya tiene una mínima capacidad de autodefensa en la línea de órdenes y tiene la capacidad de comprender los ejemplos (¡aunque sea consultando un manual!) y, con un poquito de suerte, crear sus propias soluciones a problemas semejantes a los presentados.

La solución de este ejercicio está recogida en un pequeño script: rtve-mediateca-dl (versión 1.0). Sus únicas dependencias: un entorno POSIX y GNU Wget. También hay un tarball con un instalador y documentación (por el momento en inglés).

Cómo se originó la idea

Ante todo, debo darle las gracias al autor de Pisando charcos, Carlos Jaime Puente Sánchez, quien publicó una solución a un problema muy similar al aquí resuelto y, al ver mi interés, me planteó éste.

Radio Televisión Española tiene en su página web un servicio de visionado de su programación mediante streaming.

Corría el mes de diciembre cuando encontré este curioso artículo en Pisando charcos: Descargar vídeos de TVE (GNU/Linux). El autor de la bitácora publicó un sencillo y eficaz programa informático para descargar los vídeos de la sección con la programación reciente de TVE de la página de RTVE, TVE a la Carta. El programa (que es software libre) aparece descrito con sus instrucciones de uso en el artículo. Al mirar en sus tripas (¡maravillas del software libre!) encontramos que hace los siguientes pasos:

  1. Coge la dirección de una página con vídeo incrustado (por ejemplo, http://www.rtve.es/alacarta/player/[XXXXXX].html, donde [XXXXXX] es un número decimal de 6 cifras).
  2. A partir de esa dirección genera otra que es el resultado de sustituir la secuencia final html por xml: http://www.rtve.es/alacarta/player/[XXXXXX].xml.
  3. Descarga este fichero que guarda en su interior la dirección en la que se aloja el vídeo, algo así como rtmp://stream.rtve.es/stream/resources/alacarta/flv/… (los puntos suspensivos omiten el final de la dirección). Esta dirección figura entre las secuencias <location> y </location>.
  4. Sustituye la primera parte de esta dirección por http://www.rtve.es/, de modo que queda así: http://www.rtve.es/stream/resources/alacarta/flv/….
  5. Descarga este último recurso, que resulta ser el vídeo buscado.

Vemos, pues, que los vídeos están referenciados en unos ficheros XML. Cada uno de estos ficheros XML contiene la dirección del vídeo, pero el esquema es RTMP, un protocolo propietario que no nos interesa. Afortunadamente, también podemos acceder al vídeo por HTTP, así que basta con hacer unas pequeñas sustituciones. Podemos construir una solución rápida con una tubería de la línea de órdenes (mucho más espartana que la del artículo original) usa las herramientas estándar de *nix y un programa de descargas (por ejemplo, GNU Wget:
echo "$DIRECCION" | sed 's/html$/xml/' | wget -i - -O - \ | sed 's_^.*<location>__;s_</location>.*$__' \ | sed 's_rtmp://stream_http://www_' \ | wget -i -
Hemos supuesto que la dirección de la página con el vídeo incrustado está en la variable DIRECCION. Vemos que los pasos son:

  1. Sustituir con sed la secuencia final html por xml en la dirección de la página que tiene el reproductor de vídeo incrustado.
  2. Descargar con wget el recurso XML con esta nueva dirección.
  3. Transformar con sed la dirección del vídeo que aparece dentro de este recurso XML para que sea una cosa un poquito más manejable.
  4. Finalmente, descargar con wget el vídeo.

Es decir, lo mismo que hacía el programa original.

Todo ha sido muy sencillo hasta ahora.

Conoce a tu enemigo: la mediateca

El autor de Pisando charcos me animó a buscar el modo de descargar vídeos no de TVE a la carta, sino de la mediateca, otra sección que usa un sistema un poquito diferente al anterior:

Ahora toca ensuciarse (virtualmente) las manos un poquito. La solución del problema está dentro del código de la página con el reproductor de vídeo incrustado. Si miramos su contenido, encontramos material sospechoso. El reproductor de vídeo arranca desde un trocito de código JavaScript: var so[XXXXXX] = new SWFObject('/swf/v2/RTVEPlayer.swf',flashcontentId,ancho,alto,'9');

La secuencia [XXXXXX] es un número de 6 cifras y cambia de un vídeo a otro. Este número es bastante revelador y parece identificar el vídeo que pretendemos descargar. En vez de sacar el identificador del vídeo de ahí, vamos a hacerlo a partir del parámetro flashcontentId, ya que con ese nombre no le queda más remedio que ser el auténtico identificador del vídeo. En efecto, unas líneas más arriba encontramos: var flashcontentId = 'vidplayer[XXXXXX]';

Con este número construimos la dirección del recurso XML correspondiente:
http://www.rtve.es/alacarta/player/[XXXXXX].xml.
El proceso final es el mismo que el que usamos con TVE a la carta: bajar el recurso XML, extraer la dirección del vídeo de su interior, construir una dirección del vídeo válida y aceptable y, finalmente, descargar el vídeo.

La solución

Vamos a ir paso por paso:

  1. Escogemos una página de la mediateca con el reproductor de vídeo incrustado y a la variable DIRECCION le asignamos su dirección.
  2. Descargamos esta página con wget y sacamos el resultado por la salida estándar porque vamos a trabajar con una tubería: wget "$DIRECCION" -O -
  3. La salida de la anterior orden tiene el código de la página. Buscamos la línea que asigna un valor a flashcontentId con grep: | grep 'var flashcontentId ='
  4. La salida de la anterior orden tiene la línea con el valor de flashcontentId. Eliminamos todo lo que no es la parte numérica con sed: | sed 's/[^0-9]//g'
  5. La salida de la anterior orden tiene el número que identifica el recurso XML. Construimos la dirección del recurso con una línea de printf. Como este programa no acepta datos por su entrada estándar, sino que sólo acepta listas de argumentos, usamos xargs para generar su lista de argumentos: | xargs printf 'http://www.rtve.es/alacarta/player/%s.xml'
  6. La salida de la anterior orden es la dirección del recurso XML que podemos descargar con wget. | wget -i - -O -
  7. La salida de la anterior orden contiene el texto del recurso XML. Eliminamos todo lo que no es la dirección del vídeo con sed: sed 's_^.*<location>__;s_</location>.*$__'
  8. La salida de la anterior orden es una dirección RTMP que no nos interesa usar. Afortunadamente, hay una dirección HTTP correspondiente que también vale. Modificamos la dirección usando sed: | sed 's_rtmp://stream_http://www_'
  9. La salida de la anterior orden es la dirección del vídeo que queremos descargar. Usamos wget para hacer la magia final (añadimos la opción -c para que wget reanude la descarga por el punto en el que se quedó si ésta fue abortada): | wget -c -i -

El resultado final queda así:
wget "$DIRECCION" -O - \ | grep 'var flashcontentId =' \ | sed 's/[^0-9]//g' \ | xargs printf 'http://www.rtve.es/alacarta/player/%s.xml' \ | wget -i - -O - \ | sed 's_^.*<location>__;s_</location>.*$__' \ | sed 's_rtmp://stream_http://www_' \ | wget -c -i -

La lógica anterior (con algunas mejoras) está recogida en un pequeño script (distribuido bajo la licencia GNU GPL, versión 3 ó posterior): rtve-mediateca-dl. El uso es sencillo:

Actualización:
El sistema de distribución de vídeo de la página de RTVE ha cambiado varias veces desde la escritura de este artículo y el método aquí descrito está obsoleto. El método que funciona en el momento de escribir esta actualización (septiembre de 2012) está en un artículo más reciente. También hay una versión al día del programita rtve-mediateca-dl que implementa esté método.


Categorías: Informática

Permalink: https://sgcg.es/articulos/2010/02/20/bajar-videos-de-la-mediateca-de-rtve/