Exemplo n.º 1
0
 def __getUrl2down(self, ID, startTime, endTime):
     '''
         Tercer método implementado:
         
         TK3 - Pass de "M":
         ==================
         force_http -> 1
         hash -> encode(serverTime;id;startTime;endTime)
         id -> /url/url/url.mp4
         startTime -> 0
         endTime -> 0
     '''
     self.debug(u"Probando el que era el Método 3")
     AES = aes.AES() 
     #tokenizer = self.TOKENIZER
     server_time = Descargar.get(self.URL_TIME).strip()
     toEncode = server_time+";"+ID+";"+startTime+";"+endTime
     data = AES.encrypt(toEncode, p('eG84NWtUK1FIejNmUk1jSE1YcDljQQ=='), 256)
     post_args = {
                 'hash' : data,
                 'id' : ID,
                 'startTime' : '0',
                 'endTime': '0'
                 }
     
     try:
         #data = Descargar.doPOST(self.URL_POST, tokenizer, post_args, doseq=True)
         data = Descargar.doPOST("aabilio.me", "/pydowntv/mitele.php", post_args, doseq=True)
     except Exception, e:
         raise Error.GeneralPyspainTVsError("mitele.es: Error en Tokenizer: "+e.__str__())
Exemplo n.º 2
0
    def __getUrl2down(self, ID, startTime, endTime, html):
        """
            Tercer método implementado:
            
            TK3 - Pass de "M":
            ==================
            force_http -> 1
            hash -> encode(serverTime;id;startTime;endTime)
            id -> /url/url/url.mp4
            startTime -> 0
            endTime -> 0
        """
        self.debug(u"Probando el que era el Método 3")
        tokenizer = self.TOKENIZER
        server_time = Descargar.get(self.URL_TIME).strip()
        toEncode = server_time + ";" + ID + ";" + startTime + ";" + endTime
        data = Descargar.get("http://www.pydowntv.com/utils/YXRyZXNwbGF5ZXJfcmFuZG9tXzI/%s" % (toEncode))
        post_args = {"hash": data, "id": ID.replace(" ", ""), "startTime": "0", "endTime": "0"}
        self.debug(u"Token: %s" % post_args)

        try:
            # data = Descargar.doPOST(self.URL_POST, tokenizer, post_args, doseq=True)
            data = Descargar.doPOST("aabilio.hl161.dinaserver.com", "/pydowntv/mitele2.php", post_args, doseq=True)
        except Exception, e:
            raise Error.GeneralPyspainTVsError("mitele.es: Error en Tokenizer: " + e.__str__())
Exemplo n.º 3
0
    def __getUrl2down(self, ID, startTime, endTime):
        """
            Tercer método implementado:
            
            TK3 - Pass de "M":
            ==================
            force_http -> 1
            hash -> encode(serverTime;id;startTime;endTime)
            id -> /url/url/url.mp4
            startTime -> 0
            endTime -> 0
        """
        self.debug(u"Probando el que era el Método 3")
        AES = aes.AES()
        tokenizer = self.TOKENIZER
        passwd = self.PASSWD
        server_time = Descargar.get(self.URL_TIME).strip()
        toEncode = server_time + ";" + ID + ";" + startTime + ";" + endTime
        data = AES.encrypt(toEncode, passwd, 256)
        post_args = {"hash": data, "id": ID, "startTime": "0", "endTime": "0"}

        try:
            data = Descargar.doPOST(self.URL_POST, tokenizer, post_args, doseq=True)
            # data = Descargar.doPOST("linfox.es", "/pydowntv/mitele.php", post_args, doseq=True)
        except Exception, e:
            raise Error.GeneralPyspainTVsError("mitele.es: Error en Tokenizer: " + e.__str__())
Exemplo n.º 4
0
class MiTele(Canal.Canal):
    '''
        Clase para manejar los vídeos de Mi Tele
    '''

    #URL_TIME  = "http://www.mitele.es/media/clock.php"
    #URL_TIME = "http://servicios.telecinco.es/tokenizer/clock.php"
    URL_TIME = "http://token.mitele.es/clock.php"

    #TOKENIZER = "/tokenizer/tk3.php"
    TOKENIZER = "/"

    URL_POST = "token.mitele.es"

    #URL_POST = "servicios.telecinco.es/tokenizer/tkjs.php"

    def __init__(self, url="", opcs=None):
        Canal.Canal.__init__(self, url, opcs, url_validas, __name__)

    def __getUrl2down(self, ID, startTime, endTime, html):
        '''
            Tercer método implementado:
            
            TK3 - Pass de "M":
            ==================
            force_http -> 1
            hash -> encode(serverTime;id;startTime;endTime)
            id -> /url/url/url.mp4
            startTime -> 0
            endTime -> 0
        '''
        self.debug(u"Probando el que era el Método 3")
        tokenizer = self.TOKENIZER
        header = {
            "Referer":
            "http://www.mitele.es/series-online/aida/temporada-10/capitulo-219/",
            "Accept": "*/*",
            "Accept-Language": "es,en;q=0.8",
            "Connection": "keep-alive",
            "User-Agent":
            "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36",
            "Host": "token.mitele.es"
        }
        server_time = Descargar.get(self.URL_TIME).strip()

        toEncode = (server_time + ";" + ID + ";" + startTime + ";" +
                    endTime).replace(" ", "")
        self.debug("[DEBUG] server_time: %s" % server_time)
        self.debug(u"[DEBUG] toEncode: %s" % toEncode)
        self.debug(
            u"[DEBUG] Util URL: http://www.pydowntv.com/utils/YXRyZXNwbGF5ZXJfcmFuZG9tXzI/%s"
            % (toEncode))

        data = Descargar.get(
            "http://www.pydowntv.com/utils/YXRyZXNwbGF5ZXJfcmFuZG9tXzI/%s" %
            (toEncode))

        # Datos actuales para el get
        get_args = data + "&id=" + ID.replace(" ",
                                              "") + "&startTime=0&endTime=0"
        # Datos antiguos para el POST
        post_args = {
            'hash': data,
            'id': ID.replace(" ", ""),
            'startTime': '0',
            'endTime': '0'
        }

        self.debug(u"Token: %s" % post_args)

        try:
            header = {
                "Referer":
                "http://static1.tele-cinco.net/comun/swf/playerMitele.swf",
                "Accept":
                "*/*",
                "Origin":
                "http://static1.tele-cinco.net",
                "Connection":
                "keep-alive",
                "User-Agent":
                "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36",
                "Accept-Language":
                "de,en;q=0.7,en-us;q=0.3",
                "Content-type":
                "application/x-www-form-urlencoded",
                "Cookie":
                "s_cc=true;s_fid=7B0AC1148C6D6D16-0521A69344CCF613;s_ppv=" +
                self.url + ",49,49,1186;s_sq=[[B]];"
            }
            # Método antiguo, ahora utilizamos GET (guardamos POST para descubrir enlaces de mitele)
            #data = Descargar.doPOST("pydowntv.pydowntv.com", "/pydowntv/mitele2.php", post_args, doseq=True)

            # Devuelve enlaces de Telecinco
            #data = Descargar.get("http://token.mitele.es?hash="+get_args, withHeader=True, header=header)
            #data = Descargar.get("http://pydowntv.pydowntv.com/pydowntv/mitele3.php?url=%s&referer=%s" % (urllib2.quote("http://token.mitele.es?hash="+get_args), urllib2.quote(self.url)))
            data = Descargar.get(
                "http://pydowntv.pydowntv.com/pydowntv/mitele3.php?url=%s&referer=%s"
                % (urllib2.quote("http://token.mitele.es?hash=" + get_args),
                   urllib2.quote(self.url)))

        except Exception, e:
            raise Error.GeneralPyspainTVsError(
                "mitele.es: Error en Tokenizer: " + e.__str__())

        if data is None:
            return None
        else:
            self.debug("[DEBUG] DATA:\n" + data)
            if data.find("<stream>") != -1 or data.find(
                    "Contenido no reproducible") != -1:
                #self.__mediasetSearch(html) # DEPRECATED

                newData = Descargar.get(
                    "http://www.pydowntv.com/utils/YXRyZXNwbGF5ZXJfcmFuZG9tXzI/%s?method=a"
                    % (toEncode))
                #rtmpinfo = Descargar.doPOST(self.URL_POST, tokenizer, {'hash':newData}, doseq=True)
                rtmpinfo = Descargar.doPOST("pydowntv.pydowntv.com",
                                            "/pydowntv/mitele2.php",
                                            {'hash': newData},
                                            doseq=True)
                self.debug("NEW DATA:\n" + rtmpinfo)

                rtmpinfo = rtmpinfo.replace("&amp;", "&")
                rtmp_r = "\"" + re.findall("\<stream\>(.*?)\<\/stream\>",
                                           rtmpinfo)[0] + "/" + "\""
                rtmp_y = "\"" + re.findall("\<file.*>(.*?)\<\/file\>",
                                           rtmpinfo)[0] + "\""
                rtmp_a = "\"" + rtmp_r.split("/")[-2] + "?" + rtmp_y.split(
                    "?")[1]  #+"\""
                rtmp_u = "\"" + rtmp_y.split("?")[1]  #+"\""
                rtmp_s = "\"" + 'http://static1.tele-cinco.net/comun/swf/playerMitele.swf' + "\""

                url = [
                    rtmp_r, "-y", rtmp_y, "-a", rtmp_a, "-u", rtmp_u, "-s",
                    rtmp_s
                ]
            elif data.find("file") != -1:
                try:
                    url = data.split("<url><file>")[1].split(
                        "</file></url>")[0].replace("&amp;",
                                                    "&").replace(" ", "")
                except IndexError:
                    url = data.split("<file geoblocked=\"true\">")[1].split(
                        "</file></url>")[0].replace("&amp;",
                                                    "&").replace(" ", "")
            elif data.find("tokenizedUrl") != -1:
                url = data.split('"tokenizedUrl":"')[1].split('"')[0].replace(
                    " ", "").replace("\/", "/")
            else:
                print "no entiendo lo que pone"
                return None
            return url
Exemplo n.º 5
0
    def getInfo(self):
        '''
            Devuelve toda la información asociada a la URL recibida, de la siguiente forma:
            {
             "exito"     : bool,  <-- True (si se han obtenido videos)
             "num_video" : int,   <-- Número de vídeos obtenidos
             "mensaje"   : u"" ,  <-- Mensajes de la API (ej.: El vídeo no ha sido encontrado ["exito": False])
             "videos"    :  [{
                            "url_video" : [],   <-- Url de descarga de vídeo
                            "url_img"   : "",   <-- Url de la miniatura del video
                            "filename"  : [],   <-- Nombre de las partes para guardar en disco
                            "tipo"      : "",   <-- http, rtmp[e,..], mms, ...
                            "partes"    : int,  <-- Número de partes que tiene el vídeo
                            "rtmpd_cmd" : [],   <-- Comando rtmpdump (si tipo == rtmp) sino None
                            "menco_cmd" : [],   <-- Comando mencoder (Si tipo == rtmp) sino None
                            "url_publi" : "",   <-- Url del vídeo de publicidad asociado al vídeo
                            "otros"     : [],   <-- Lista donde se pueden pasar cosas opcionales
                            "mensaje"   : ""    <-- Mensajes de la API
                            }], <-- Debe ser una lista de tamaño "num_videos"
             "titulos"   : [u""], <-- Titulos de los videos
             "descs"     : [u""] <-- Descripción de cada vídeo
            }
            
            Los valores que no se rellenen, deberán devolver None.
            La clave "exito" es obligatoria, sino se puede encontrar el vídeo se puede devolver directamente:
            {
            "exito": False,
            "mensaje": "No se pudo descargar el video"  
            }
            
            "videos", "mesajes" y "descs" deben ser listas de cadenas (si no son None)
            "url_video", "filename", "rtmp_cmd", "menco_cmd" (de "videos") deben ser listas de cadenas (si no son None)
        '''
        #TODO: Cuida con las paginas que tiene más de un vídeo. De momento funciona porque es el primer video que aparece!
        
        # Primero: nos quedamos con le id dependiendo si el user metio la url con
        # una barra (/) final o no y si tiene extensión (no es alacarta)
        logging.debug(self.url)
        
        videoID = self.url.split('/')[-1]
        if videoID == "":
            videoID = self.url.split('/')[-2]
        elif videoID.find(".shtml") != -1 or videoID.find(".html") != -1 or \
            videoID.find(".html") != -1:
            videoID = videoID.split('.')[0]
        
        if not videoID.isdigit(): videoID = self.getID(self.url)
            
        try: self.debug(u"ID del vídeo en url = " + videoID)
        except: pass
        #if self.url.find("rtve.es/infantil/") != -1: self.url = self.url.replace("/#","") # Vídeos de Clan a veces falla con el ancla
        
        # Añadido para vídeos nuevos (periodo de prueba):
        sourceHTML = Descargar.getHtml(self.url).decode('string-escape')
        #sourceHTML = self.toUtf(sourceHTML)
        videoID_comp = None
        if sourceHTML.find("flashcontentId:\'videoplayer") != -1:
            videoID_comp = sourceHTML.split("flashcontentId:\'videoplayer")[1].split("\'")[0]
            if videoID_comp != videoID: videoID = videoID_comp
        if sourceHTML.find("<div id=\"video") != -1:
            videoID_comp = sourceHTML.split("<div id=\"video")[1].split("\"")[0]
            if videoID_comp != videoID and videoID_comp.isdigit(): videoID = videoID_comp
        ########################################################
        
        self.debug(u"ID del vídeo en HTML = " + videoID_comp if videoID_comp else "No ID en HTML")
        self.log(u"[INFO] ID del Vídeo :", videoID)
        
        if videoID is None: raise Error.GeneralPyspainTVsError(u"No se encuentra el ID del vídeo")
        
        if self.url.find("rtve.es/infantil/") != -1:
            return self.__ClanTV(sourceHTML, videoID)

        # -- Método 24 Mayo 2013
        self.debug(u"Probando método de 24 de uno de Mayo de 2013")
        try: manager = re.findall('data-idManager="(.*?)"', sourceHTML)[0]
        except:
            try: manager = re.findall('idManager="(.*?)"', sourceHTML)[0]
            except: manager = "default"

        # # Nuevo método (22/02/14) , dejo el actual que todavía funciona
        # if sourceHTML.find("themadvideo.com/player/js/MadVideo.js.php") != -1:
            
        #     themadvideo_id = re.findall('<iframe.*id\=\"visor(.*)\"' , sourceHTML)[0]
        #     xmldata = Descargar.get("http://studio.themadvideo.com/api/videos/%s/player_data" % themadvideo_id).decode('utf8')
        #     xmltree = xml.etree.ElementTree.fromstring(xmldata)

        #     urlVideo = xmltree.find('./Layout/VideoPlayer/Data/src').text
        #     url_img = xmltree.find('./Layout/VideoPlayer/Data/Keyframe').text
        #     titulo = xmltree.find('.').attrib['title']
        #     try: name = Utiles.formatearNombre(titulo) + ".mp4"
        #     except: name = "VideoRtve.mp4"
        #     desc = None
        
        tipo = "videos"
        url = "http://www.rtve.es/ztnr/movil/thumbnail/%s/%s/%s.png" % (manager, tipo, videoID)

        self.debug(u"Probando url:", url)
        try:
            tmp_ = decode(Descargar.getHtmlHeaders(url, {"Referer": "http://www.rtve.es"}))
            tmp = re.findall(".*tEXt(.*)#[\x00]*([0-9]*).*", tmp_)[0]
            tmp = [n for n in tmp]
            cyphertext = tmp[0]
            key = tmp[1]
            tmp = tmp = [0 for n in range(500)]

            # Créditos para: http://sgcg.es/articulos/2012/09/11/nuevos-cambios-en-el-mecanismo-para-descargar-contenido-multimedia-de-rtve-es-2/
            intermediate_cyphertext = ""
            increment = 1
            text_index = 0
            while text_index < len(cyphertext):
                text_index = text_index + increment
                try: intermediate_cyphertext = intermediate_cyphertext + cyphertext[text_index-1]
                except: pass
                increment = increment + 1
                if increment == 5: increment = 1

            plaintext = ""
            key_index = 0
            increment = 4
            while key_index < len(key):
                key_index = key_index + 1
                text_index = int(key[key_index-1]) * 10
                key_index = key_index + increment
                try: text_index = text_index + int(key[key_index-1])
                except: pass
                text_index = text_index + 1
                increment = increment + 1
                if increment == 5: increment = 1
                plaintext = plaintext + intermediate_cyphertext[text_index-1]
                #try: plaintext = plaintext + intermediate_cyphertext[text_index-1]
                #except: pass
            urlVideo = plaintext
        except:
             ads  = "6037182945"
             str1 = "51%s-" % videoID
             inverted_str1 = str1[::-1]
             s = "".join([ads[int(n)] for n in inverted_str1[1:]])
             url  = "http://ztnr.rtve.es/ztnr/pub/%s/%s/%s/%s/%s" % (s[0],s[1],s[2],s[3],s)
             self.debug(u"Probando url:", url)
             xmldata = Descargar.doPOST("www.pydowntv.com", "/utils/cnR2ZV9yYW5kb21fNA/", {"encrypted":Descargar.get(url)})
             self.debug(xmldata.replace(xmldata[xmldata.find("</quality>")+10:],""))

             try:
                 xmltree = xml.etree.ElementTree.fromstring(xmldata.replace(xmldata[xmldata.find("</quality>")+10:],""))
                 for node in xmltree.findall("./preset"):
                     if node.attrib.get('type') == "Alta":
                         for url in node.findall("./response/url"):
                             if url.attrib.get('provider') == "AKAMAI_STR-1030":
                                 urlVideo = url.text
             except:
                 urlVideo = re.findall("<url.*>(.*)</url>", xmldata)[0]



        
        if urlVideo != "":
            if not urlVideo.endswith(".mp4"): urlVideo = urlVideo.replace(urlVideo.split(".mp4")[1], "")
            url_video = urlVideo.replace("www.rtve.es", "media5.rtve.es").replace("iphonelive","mvod")
            
            titulo = sourceHTML.split("<title>")[1].split("</")[0].replace("RTVE.es", "").replace("-", "").strip()
            filename = titulo + ".mp4"
            filename = Utiles.formatearNombre(filename)

            try: url_img = sourceHTML.split("\"thumbnail\" content=\"")[1].split("\"")[0]
            except:
                try: url_img = re.findall('<link.*rel\=\"image_src\".*href\=\"(.*)\"' , sourceHTML)[0]
                except: url_img = re.findall('<meta.*name\=\"RTVE\.thumb_video\".*content\=\"(.*)\"',sourceHTML)[0]
        else:
            raise Error.GeneralPyspainTVsError("No se pudo encontrar el enlace de descarga")

        #TEMP FIX:
        #url_video = url_video.replace(url_video.split(".")[1], url_video.split(".")[1][:3])

        # -- Método 24 Mayo 2013 FIN
        
        desc = None
        try: #obtener descripción del video
            desc = Utiles.recortar(sourceHTML, "<meta itemprop=\"description\" content=\"", "\"").strip()
        except:
            try:
                desc = Utiles.recortar(sourceHTML, "<meta property=\"og:description\" content=\"", "\"").strip()
            except:
                try:
                    desc = Utiles.recortar(sourceHTML, "<meta name=\"description\" content=\"", "\"").strip()
                except:
                    desc = u"Vídeos de Televión Española"
        
        # Comprobar si existe calidad FLV
        url_flv = url_video.replace("mp4", "flv")
        if Descargar.isReachableHead(url_flv):
            msgCalidad = u'''Este vídeo dispone de dos calidades. 
            Para los vídeos de RTVE, la mejor suele ser la que se presenta en formato FLV. 
            En los vídeos con más tiempo puede que el audio al principio no esté bien sincronizado 
            con el audio. Este problema será menos grave en el formato FLV llegándose incluso a 
            sincronizar totalmente pasados unos segundos.'''.encode('utf8')

            return {"exito" : True,
                    "num_videos" : 2,
                    "mensaje"   : u"URL obtenido correctamente",
                    "videos":[{
                            "url_video" : [url_video],
                            "url_img"   : url_img,
                            "filename"  : [filename],
                            "tipo"      : "http",
                            "partes"    : 1,
                            "rtmpd_cmd" : None,
                            "menco_cmd" : None,
                            "url_publi" : None,
                            "otros"     : "MP4",
                            "mensaje"   : msgCalidad
                            },
                            {
                            "url_video" : [url_flv],
                            "url_img"   : url_img,
                            "filename"  : [filename.replace(".mp4", ".flv")],
                            "tipo"      : "http",
                            "partes"    : 1,
                            "rtmpd_cmd" : None,
                            "menco_cmd" : None,
                            "url_publi" : None,
                            "otros"     : "FLV",
                            "mensaje"   : msgCalidad
                            }],
                    "titulos": [titulo,titulo],
                    "descs": [desc, desc]
                    }
        else:
            return {"exito" : True,
                    "num_videos" : 1,
                    "mensaje"   : u"URL obtenido correctamente",
                    "videos":[{
                            "url_video" : [url_video],
                            "url_img"   : url_img,
                            "filename"  : [filename],
                            "tipo"      : "http",
                            "partes"    : 1,
                            "rtmpd_cmd" : None,
                            "menco_cmd" : None,
                            "url_publi" : None,
                            "otros"     : None,
                            "mensaje"   : None
                            }],
                    "titulos": [titulo],
                    "descs": [desc] if desc is not None else None
                    }