Andaba necesitando un programa para descargarme los videos de youtube y como no siempre andaba en firefox ( eso aparte del hecho que ultimamente no me han funcionado muy bien el videoDownloader ) me vi en la tortuosa necesidad de escribirme uno.

Mi script, enteramente hecho en python, realizar una busqueda de un parametro oculto en la pagina web del video de youtube, el parametro t. Este parametro nos sirve para hacer la consulta al servidor youtube y que este nos indique donde esta el video a descargar.

Haber, expliquemos un poco como funciona esto de youtube.

Youtube tiene una interfaz web que todos conocemos www.youtube.com. Cuando alguien quiere ver algun video de youtube, pues se va a la web y busca el video. Una vez ahi tenemos una url algo asi :

http://youtube.com/watch?v=Fa6r4Y2eGzQ

puede haber otros parametros extra en la url, pero de momento solo nos interesa el parametro v.

Este parametro indica el id del video. Sin embargo, si alguien penso que con solo eso basta, pues se equivoco.
Youtube tiene varios servidores, donde almacena el contenido de los videos y desde donde los sirve cuando estos son solicitados. Sin embargo, y muy al contrario de lo  que se podria creer estos servidores no son espejos, es decir, no todos tienen todos los videos.

Asi es que para encontrar el servidor exacto donde se encuentra el video, youtube usa un simpatico truco.

Recuerdan que antes mencione el parametro t ?. Pues bien este parametro se encuentra oculto en la pagina web del video, pero una vez que lo obtenemos lanzamos una consulta al servidor de esta forma

http://youtube.com/get_video?video_id=Fa6r4Y2eGzQ&t=HUKMuhu23678thu

El servidor nos responde con una pagina de error, que dice 303 “See Others “. Hasta ahi nosotros hemos visto una simple pagina de error, y hubieramos abortado nuestros intentos por conseguir el video. Pero el truco de youtube, consiste en que no hay que buscar en el mensaje o la pagina que responde youtube, sino dentro de la cabecera de la respuesta.

En dicha cabecera hay un parametro llamado location. Este parametro contiene la verdadera URL desde la cual es posible descargar el video.

Bueno ahi les dejo el script en cuestion, espero lo disfruten. OJO, es la primera version y no es un modelo de seguridad, solo lo hice para entender como funcionaba youtube.

import urllib
import httplib
import re
import sys

class Video:

    def __init__(self,WebURL):
        WebURL = self.validateURI(WebURL)
        self.WebURL = WebURL
        self.VideoID = self.getVideoID()

    def validateURI(self,uri):
        return uri

    def getVideoID(self):
        rex = re.compile(”.*(video_id=[a-zA-Z0-9]*).*&(t=[a-z_A-Z0-9]*)&”)
        match = rex.search(self.getWebData())
        if match is None :
            print “Error: Patrones no coinciden”
            sys.exit(0)
        return str(match.group(1))+”&”+str(match.group(2))

    def getWebData(self):
        youtube = urllib.urlopen(self.WebURL)
        return youtube.read()

    def getVideoURI(self):
        youtube = httplib.HTTPConnection(”www.youtube.com”,80)
        youtube.request(”GET”, “/get_video?”+self.getVideoID())
        r1 = youtube.getresponse()
        return r1.getheader(’location’)

    def download(self,filename):
        data = urllib.urlopen(self.getVideoURI())
        f = open(filename,”w”)
        f.write(data.read())

params = sys.argv

if ( len(params )) <= 2:
    print “Error: Numero de parametros incorrectos”
    sys.exit(0)

video = Video(params[1])
video.download(params[2])

UPDATE: Aca la ultima version del script: youtube

Technorati Tags: , ,