viernes, 13 de abril de 2012

Descarga torrents "un poquito más rápido"

Esta entrada está inspirada un poco en "El diario de Juanito" y su "¡batch, con dos cojones!" (ya veréis por qué), y la posibilidad que tenemos de descargar pelis por medio de la web elitetorrent.net. La idea es un script en batch (no me matéis) que automatice un poco lo que es la descarga del torrent, y posteriormente el fichero de la película correspondiente. El software empleado para la descarga de torrents es uTorrent en este caso. Esto no es la nueva revolución o la herramienta definitiva, ni mucho menos. Solo he querido compartir las cosillas que me he ido encontrando por el camino, y básicamente aprender de lo realizado. A continuación, el código:



Bien, tenemos dos cosillas que resolver, por un lado descargarnos el archivo .torrent de la web, y luego, abrirlo con el uTorrent para proceder a la descarga de la peli.

1. Descarga de el/los archivo/s .torrent

Aquí entra en juego nuestro amigo wget (yo he usado la versión 1.11.4). Si os fijáis en las opciones que he empleado en la llamada del comando, creo un log que añade la fecha actual al nombre del fichero, le digo que espere 30 segundos en caso de reintento de descarga, y lo más curioso, empleo el parámetro content-disposition. Esto último es por lo siguiente: por ejemplo, si nos vamos a descargar la de "Transformers 3", una vez estemos en la página pertinente, le daríamos al botón de "Descargar el .torrent":


Cuando pulsamos el enlace, lo que ocurre es que se abre el cuadro de diálogo para salvar el archivo .torrent. Esto viene determinado por la respuesta HTTP que recibimos del servidor, que contiene el parámetro Content-Disposition, aclarado en el RFC 1806. Os pongo el intercambio de cabeceras HTTP obtenido con el plug-in de Firefox HTTP Live Headers, para que lo veáis más claro:


Bien, según el RFC, el valor "attachment" da la posibilidad al usuario de guardar el fichero. Por otro lado, el parámetro "filename" indica qué fichero u objeto es el que podemos bajarnos. Como curiosidad podéis ver que están usando un nginx.

El script tiene como parámetros de entrada un rango de valores numéricos (un ID inicial y un ID final). He querido llamar ID al número que emplean en la web para clasificar las películas. Por ejemplo, en la petición que he realizado, sería el número que vemos al final de la URL:

http://www.elitetorrent.net/get-torrent/16184

Por lo tanto, comenzará a descargarse torrents, tomando ese número de la URL, desde uno inicial hasta uno final que le pongamos. Ahora, si lo que hacía era lanzar una tras otra las llamadas a wget (un flooding en toda regla), lo que me pasaba era que me redireccionaba a una página .php que mostraba un CAPTCHA, para verificar que era un humano y no un robot. Lo que quise probar primero era ver qué criterio empleaban para hacer esa detección. Abrí la misma web con Firefox, y luego con Chrome, y de ambas maneras me mostraba el CAPTCHA. Con esto, por lo menos, podía concluir que no están usando el User-Agent como parámetro de verificación ni nada por el estilo, y que simplemente estarían comprobando la IP de origen. El "parche" que se me ocurrió entonces fue lanzar las peticiones de forma aleatoria en el tiempo, y no seguidas, usando el random módulo 60, ya que no creo que se tarde más de un minuto entre una descarga y otra si lo hicieras de forma manual. También es verdad que esto no emula al 100% una interacción manual, pero bueno, la cosa es que ya se descargaban los torrents sin problemas en la carpeta designada.

2. Ejecutar uTorrent con los .torrent obtenidos en el punto anterior

Primer problema, abrir el uTorrent con todos los ficheros de un taponazo. Para ello uso el bucle for, pero al no poder acumular los valores en una variable dentro del loop, tuve que emplear el call. Segundo, ejecuto el uTorrent con start para que el script continúe con su ejecución, porque si no, lo que pasaba era que había que cerrar la aplicación de forma manual para que el script siguiera corriendo. Por defecto he puesto un timeout de 4 horas, pero bueno, eso es a gusto del consumidor. Finalmente, una vez pase el periodo señalado, termino el uTorrent con un taskkill, ya que, aunque tiene opciones de autoapagado, no están disponibles por línea de comandos (o al menos yo no las he encontrado). Lo he puesto en comentario, pero ya si quisiéramos, podríamos proceder a apagar la máquina (se le podría añadir un retardo para que de tiempo a cerrar todo de forma ordenada y limpia).

3. Conclusiones

  • Esto es más bien para dejarlo corriendo durante la noche, o algo así, y tener al día siguiente las pelis descargadas.
  • Se podría adaptar a otras webs, para que no estar limitados a un solo site.
  • Optimizar los parámetros de configuración del uTorrent para mejorar las descargas, (quizás un tema para otro post).
  • La siguiente vez que arranques uTorrent, lo que hace éste es comprobar el estado de las descargas activas (Check), por lo que la puesta en marcha es más lenta.
  • Probar las posibilidades de otra aplicación que no sea uTorrent.
  • El problema con lo de las IDs es que, en el rango que pongas, pueden estar mezcladas películas de baja calidad, series, películas HD, etc. por lo que ahí te puedes estar descargando cualquier cosa de lo más variopinta.
  • El lugar de destino de las descargas podría ser un NAS o cualquier otra ubicación de gran capacidad.
  • Mejoras y más ideas, además de mucho más óptimas hay seguro, vamos. Prueba de ello son algunas cosillas que he visto por los foros, que empleaban listas RSS para estarse actualizados, etc., o en la entrevista de PaulDotCom en Español a Jorge Martínez (o como me gusta llamarlo, "El hombre que susurra a las máquinas", jejeje), en el que el tío cuenta como anécdota las virguerías que se montó con algo por el estilo.

Bueno, espero que os haya parecido interesante por lo menos :P Seguiré en ello, a ver qué más cosas se me ocurren. Cualquier comentario o crítica, más que bien recibida, que eso también es parte del aprendizaje. Además, me gustaría hacer algo por el estilo en Python.

Saludos ;)