miércoles, 19 de diciembre de 2012

Descarga automática de pelis en HD

... torrents, RaspberryPi y Piratebay

Una de las ventajas de poder dejar un equipo conectado las 24 horas del día, es programarle ciertas tareas periódicas. Recuerda que tu RaspberryPi conectado 24 horas, 365 días al año, te hará un consumo eléctrico de unos 5€ al año.
Tal y como vimos en este post, podemos decirle que busque continuamente los capítulos y subtítulos de nuestras series preferidas. Desde los comentarios, me habéis sugerido un par de herramientas, que no he conseguido poner en marcha (prometo seguir intentándolo). Ahora le toca el turno a las películas, prepara las palomitas ...

ACTUALIZACIÓN:
el script se ha quedado anticuado ... y es muy feo, pásate por este otro post que esta mucho mejor.

El siguiente script, se encarga de buscar las películas en español, de 1080p o 720p de calidad, con más seeders, publicadas en Pirate Bay. Además aplica algunos filtros, tales como palabras baneadas, géneros que no nos gustan e incluso una puntuación mínima sacada de IMDB, nada más y nada menos. El script es /usr/local/bin/busca_pelis.sh:
#!/bin/bash
# programado por Juanmol para http://rsppi.blogspot.com

descargadas=/root/pelisdescargadas/listado.txt
wget http://thepiratebay.se/search/es%7Ccastellano/0/7/207 -O /tmp/salida_pelis 2> /dev/null
listado=$(cat /tmp/salida_pelis | sed 's/\t/\n/g' | grep -e 1080 -e 720 | grep -v -i -e screener -i -e dublado -i -e documental -i -e saga -i -e evangelion -i -e 3d -e [0000-9999]-[0000-9999] -i -e "juego de tronos" -i -e oacute | cut -f2 -d\" | grep -v magnet | cut -f4 -d\/ | cut -f1 -d\[ | cut -f1 -d\( | sed 's/\./\ /g' | sed 's/_/\ /g' | sed 's/720p//g' | sed 's/BluRay//g' | sed 's/DTS-ES//g' | sed 's/x264-PublicHD//g' | sed 's/x264-ESiR//g' | sed 's/1080p//g' | sed 's/-ESiR//g' | sed 's/\ \ /\+/g' | cut -f1 -d\+)

IFS=$'\n' ; for n in $listado ;
do
        wget "http://www.imdb.com/find?q=$n&s=all" -O /tmp/busqueda_pelis 2> /dev/null;
        if [ $(cat /tmp/busqueda_pelis | grep "Find - IMDb" | wc -l) = 0 ];
        then
                echo se ha encontrado del tiron > /dev/null ;
        else
                echo no se ha encontrado, hay que filtrar > /dev/null ;
                filtrado=$(cat /tmp/busqueda_pelis | grep "findResult odd" | sed 's/\ /\n/g' | grep href | head -1 | cut -f3 -d\/);
                wget "http://www.imdb.com/title/$filtrado/" -O /tmp/busqueda_pelis 2> /dev/null ;
        fi
        rating=$(cat /tmp/busqueda_pelis | grep ratingValue | cut -f3 -d\< | cut -f2 -d\>);
        genero=$(echo $(cat /tmp/busqueda_pelis | grep -i "href=\"/genre/" | sed 's/\=/\n/g' | grep -i "\"/genre/" | grep itemprop | cut -f2 -d\" | cut -f3 -d\/));

        if [ "$(echo $rating | sed 's/\.//g')" -gt "80" ];
        then
                if [ $(echo $genero | grep -e Musica -e Drama -e Romance | wc -l) = 0 ];
                then
                        if [ $(cat $descargadas | grep "$n" | wc -l) = 0 ];
                        then
                                wget "http://thepiratebay.se/search/$n es%7Ccastellano/0/99/0" -O /tmp/lapeli_pelis 2> /dev/null;
                                magnet=$(cat /tmp/lapeli_pelis | grep -m1 magnet | cut -f2 -d\") ;
                                echo $n >> $descargadas ;
                                transmission-remote -a "$magnet";
                                /usr/local/bin/encola_whatsapp.sh 666777888 "descargando automaticamente $n";
                        fi
                fi
        fi
done
rm -f /tmp/salida_pelis
rm -f /tmp/busqueda_pelis
rm -f /tmp/lapeli_pelis

parece un poco caótico ... pero de verdad lo es ;) Simplemente tenéis que configurar esta línea:
listado=$(cat /tmp/salida_pelis | sed 's/\t/\n/g' | grep -e 1080 -e 720 | grep -v -i -e screener -i -e dublado -i -e documental -i -e saga -i -e evangelion -i -e 3d -e [0000-9999]-[0000-9999] -i -e "juego de tronos" -i -e oacute | cut -f2 -d\" | grep -v magnet | cut -f4 -d\/ | cut -f1 -d\[ | cut -f1 -d\( | sed 's/\./\ /g' | sed 's/_/\ /g' | sed 's/720p//g' | sed 's/BluRay//g' | sed 's/DTS-ES//g' | sed 's/x264-PublicHD//g' | sed 's/x264-ESiR//g' | sed 's/1080p//g' | sed 's/-ESiR//g' | sed 's/\ \ /\+/g' | cut -f1 -d\+)

para que banee algunos resultados, yo le he puesto screener, dublado, documental, saga, evangelion, 3d ... puedes añadirle o quitarle los que quieras. Esta otra línea:
if [ "$(echo $rating | sed 's/\.//g')" -gt "80" ];

indica la puntuación mínima, en mi caso le he puesto 80 (8.0), por supuesto podéis ponerle la que queráis, si le pones un 12 (1.2) posiblemente se descargaría pelis como "Carate a Muerte en Torremolinos". Esta otra línea:
if [ $(echo $genero | grep -e Musica -e Drama -e Romance | wc -l) = 0 ];

es la que se encarga de NO descargar pelis con esos géneros, en concreto Música, Drama, Romance ... que una vez más podéis modificar. Si le dejáis Romance y una puntuación de 10 (1.0), lo más seguro es que se descargue Crepúsculo.
¿por que no he puesto todas las configuraciones "manuales" arriba del script en variables? ... porque me sentía un poco perro al hacer el script ;)
Bueno ahora sólo queda crear un registro vacío para que vaya apuntando las pelis que descarga y no las vuelva a bajar:
mkdir -p /root/pelisdescargadas
touch /root/pelisdescargadas/listado.txt

y añadir esta línea al /etc/crontab para que busque pelis nuevas cada media hora:
*/30 * * * *    root    /bin/bash /usr/local/bin/busca_pelis.sh

Las últimas líneas mandan el enlace magnet al transmission-daemon y nos manda Whatsapp para avisarnos.
Se aceptan ruegos y sugerencias.

37 comentarios:

  1. Vaya ritmo de posteo!! Casi no me da tiempo a probarlo todo!!! Sigue asi, sigue asi! Estoy aprendiendo como nunca...

    ResponderEliminar
  2. Está claro que la magia no se crea con técnica, si no con ingenio. Una aplicación así para Android seguro que te clavan 10 leuros en el market.

    Gran trabajo Juan.

    ResponderEliminar
  3. Hola,
    Como ya comenté en el post de las series, si no se tienen las habiliades de scripting de Juanmol, Flexget es tu amigo (también vale para trakt)
    ¿Que problemas has encontrado para no hacerlo funcionar?
    Si te puedo ayudar házmelo saber :)

    ResponderEliminar
  4. Yo aún no tuve tiempo de empezar a trastear pero sufro de orgasmos mentales en la lectura de cada post...

    ResponderEliminar
  5. Para el que tenga problema al insertar un torrent porque tenga usuario y contraseña hay que poner en la línea 31.

    transmission-remote -n usuario:contraseña -a "$magnet";

    Saludos!

    ResponderEliminar
  6. Hola
    tengo el siguiente problema, al cabo de unos minutos me sale el siguiente mensaje:

    transmission-remote: (http://localhost:9091/transmission/rpc/) Timeout was reached

    He buscado y no he encontrado nada, quien me da una idea?

    Saludos

    ResponderEliminar
  7. Hola primero de todo felicitarte por tu fantástico blog, lo he descubierto hace unos días y todavía estoy alucinando con los geniales posts que haces.

    He ejecutado el script con unas pequeñas variaciones:

    he comentado la notificación por whatshapp y he borrado la opción documental para que también me busque documentales.
    El script me ha encontrado dos películas:
    The avengers 2012 y Finding Nemo 2013.
    A la espera de que se descarguen, creo que estas películas que me ha encontrado no están en castellano.

    Además cuando ejecuto el scrip me muestra el siguiente mensaje:
    line 22: [: : integer expression expected

    Saludos.

    ResponderEliminar
    Respuestas
    1. A mi me sale el mismo error.

      línea 22: [: : se esperaba una expresión entera

      Algo pasa en ese 'if' de la línea 22

      Eliminar
  8. Una preguntilla. ¿Qué pasaría si la memoria donde descargamos las pelis se llena? ¿se para de descargar? ¿explota mi casa?

    ResponderEliminar
    Respuestas
    1. evidentemente explotaria, totalmente logico. Al script le faltan muchas cosas: comprobar que hay internet, comprobar que no se a caido la web de piratebay, comprobar espacios disponibles, comprobar que el agua del grifo no tenga demasiada cal ... poco a poco lo iremos completando y perfeccionando ;-)

      Eliminar
    2. Aunque pensándolo bien, el script lo que hace es buscar, nada más. El que se encarga de descargar es el Transmission, el cuál sí que te advierte de memoria llena... y pausa la descarga en el punto donde esté, esperando a que vacíes la memoria.

      En el caso de que no haya internet o la web de PirateBay esté caida, tampoco pasaría nada ya que en media hora, el script volvería a intentarlo él solo, ¿no?

      Eliminar
  9. Juanmol, para cuando tus shell-scripts en github para que podamos hacer forks :-)

    Haz que te mande por wasap una lista de pelis interesantes y que tú puedas elegir respondiendole

    Hasta lue!

    ResponderEliminar
    Respuestas
    1. Eso sería genial :D
      Daría mucho juego y probablemente se ampliaran algunos de los scripts con cosas más interesantes...

      Eliminar
  10. personalmente creo que seria util que la peli a buscar este en una valiable asi al llamar al script le añadimos la peli despues y busca directamente la peli sin necesidad de editar el fichero, yo he estado buscando unas cuantas pelis y no me detecta ninguna supongo que igual es por los filtros...
    seguiré investigando, aun asi felicidades por el script es bueno y tiene una gran faena y paciencia.
    felicidades por la web cada dia te lo curras mas

    ResponderEliminar
    Respuestas
    1. mis filtros son muy restrictivos, desde que lo puse en marcha se ha bajado V de vendetta y Los Vengadores, tienes que ajustarlo a tus preferencias.
      Con respecto a lo de llamar al script y añadir la película ... pierde toda la gracia ¿no? lo cachondo es que sea el script el que baje lo que "cree" que te gustaría.

      Eliminar
  11. Increíble! Con este script me he hecho fan tuyo!. El problema que le veo es que va a ser imposible ver todas las pelis!

    Para nota seria que se pusiese en la carpeta correcta para el XBMC y actualizase la bd!

    ResponderEliminar
    Respuestas
    1. bueno eso no es un problema, indícale otro directorio de videos al xbmc y que este sea donde van las descargas del transmission ¿no?

      Eliminar
    2. Yo tengo otra opcion para eso, cuando acaba las descargas transmission me he creado un script para enviar cada cosa a su carpeta... los avi mkv etc.. a la carpeta pelis :)
      El script es muy sencillo, lo posteo por si a alguien le es util:

      #!/bin/bash

      down=/media/datos/descargas
      music=/media/datos/musica
      img=/media/datos/fotos
      vid=/media/datos/videos


      #Videos
      find $down -type f -name *.avi -exec mv {} $vid \;
      find $down -type f -name *.mp4 -exec mv {} $vid \;
      find $down -type f -name *.mkv -exec mv {} $vid \;
      find $down -type f -name *.mov -exec mv {} $vid \;
      find $down -type f -name *.divx -exec mv {} $vid \;

      Eliminar
  12. Antes de nada dar mis felicitaciones por este maravilloso blog, es simplemete IMPRESIONANTE. Me uno al carro de línea 22: [: : se esperaba una expresión entera,
    no consigo que empiece a bajar las pelis.
    Alguna idea?

    Saludos,

    ResponderEliminar
    Respuestas
    1. OJO! si da ese fallo no es que no este funcionando, es que no ha encontrado la puntuacion en IMDB, si lo cambiais al > en lugar de -gt no hará la comprobación pertinente ... y se bajará crepúsculo ...

      Eliminar
  13. Hola, perdonar la ignorancia... ¿En que directorio se dejarían las series descargadas?

    Gracias!!

    ResponderEliminar
    Respuestas
    1. Hola "Anonimo",

      No puedes realizar este post de descargas automaticas sin antes haber configurado el Transmission como dice aqui:
      http://rsppi.blogspot.com.es/2012/06/cliente-torrent-para-raspberrypi.html

      Si realizas primero ese post veras que el directorio de descargas lo configuras sonde tu quieras. JuanMol sugiere /mnt/porver para las descargadas y /mnt/tmptorrents para los temporales.

      Eliminar
    2. Hola Rumoku,

      Gracias por tu respuesta.

      Si, el transmission lo tengo configurado en mi raspberry y va perfecto. La pregunta la hice porque llevo dos días con el script y no veo que se añada nada nuevo a las descargas de transmission ni en la carpeta de descargas. Además tanto para este script de pelis como para el de descarga automática de capítulos, si que veo que se escriben películas/series en el archivo listado.txt correspondiente.

      Disculpad de nuevo mi ignorancia en linux, ¿Puedo ver en algún sitio un log o algo donde se vea si hay algún problema o siquiera si está arrancando el script?

      Muchas gracias

      Eliminar
    3. desde que lo puse en marcha 3 dias antes de publicar el script, solo se ha descargado los vengadores y v de vendeta. Si haces una busqueda manual, veras que no hay pelis que cumplan esos criterios. Si le indicas que la puntuacion es menor y añades generos como animacion, veras que rapidamente te encuentra 4 o 5. De todas formas cuando tenga un pc delante te dire como ponerle un log para que compruebes que funciona correctamente.

      Eliminar
    4. Lo primero enhorabuena por el blog...

      Un tema que no entiendo es que en el archivo listado.txt veo que encuentra peliculas, y si bajo la nota de IMDB, encuentra más, pero luego en el transmission no veo que se añadan esas películas ni que estén en la carpeta de descargas.

      Eliminar
    5. hola, has hecho la prueba de coger el enlace magnet y ejecutarlo a pelo?:
      transmission-remote -a "magnet:blahblahblahblah"

      Eliminar
    6. Me da el error:

      "Unexpected response: < h1 >401: UnauthorizedUnauthorized User"

      Voy a repasar tu post del transmission a ver si me falta algo de permisos. Me había saltado este paso porque ya estaba descargando torrents a traves de mi ip... ip:9091

      Eliminar
    7. Hola anonimo:

      Para evitar este error tienes que poner transmission-remote -n usuario:contraseña -a "$magnet";
      Con el usuario y contraseña que hayas configurado en el fichero settings.json (/etc/transmission/).

      Para los que os da el error en la linea 22: [: : se esperaba una expresión entera,
      hay que quitar las comillas dejandolo asi:
      if [ $(echo $rating | sed 's/\.//g') -gt "80" ];

      Si me equivoco en algo corregirme (Tengo 0 idea de programar).

      Saludos

      Eliminar
    8. Muchas gracias a todos, ya me va perfecto...

      la línea 22 yo la he dejado así:

      if [ $(echo $rating | sed 's/\.//g') > "80" ];

      Me daba error el -gt

      Eliminar
  14. Qué gozada de blog, me empapo de todo que me interesa muuuuucho

    GRacias por compartir tus conocimientos y proyectos, son muy interesantes

    ResponderEliminar
  15. Algo estoy haciendo mal...
    me da este error

    pi@raspberrypi ~ $ */30 * * * * root /bin/bash /usr/local/bin/busca_pelis.sh
    -bash: */30: No such file or directory

    ResponderEliminar
    Respuestas
    1. Chelo esa linea va dentro del archivo /etc/crontab

      Eliminar
    2. gracias ya lo he puesto, pero ahora me da un error.
      busca_pelis.sh: 22: [: -gt: unexpected operator

      le he modificado la linea 22 eliminando las "" de if [ "$(echo $rating | sed 's/\.//g')" -gt "80" ]; dejandolo if [ $(echo $rating | sed 's/\.//g') -gt "80" ];

      ahora para ejecutar el script me toca pi@raspberrypi /usr/local/bin $ sudo sh busca_pelis.sh , lo estoy haciendo mal?

      otra cosita.. xD, en lugar de que me avise por whatsapp podrian decirme como hacerlo para que me avise por correo
      gracias!

      Eliminar
    3. ese fallo sale cuando no encuentra la peli en el imdb, tengo que actualizar el script para que no fallen esas cosas.
      Para ejecutarlo a mano, es como dices, pero si lo tienes configurado en el /etc/crontab, se ejecutará solo cada 30 minutos.
      Para que avise por correo, pasate primero por:
      http://rsppi.blogspot.com.es/2013/01/envio-de-emails-desde-consola-y-con.html

      Eliminar
  16. Agrego otra cosa para los que como yo no sabían: en la carpeta donde colocan el script usar
    chmod +x ejemplo.sh
    es para dar permisos de ejecución al script
    saludos.
    PD: Juan Mol, voy a mirar que puedo hacer y luego le cuento, gracias!

    ResponderEliminar