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 1 Octubre 2012: # self.debug(u"Probando método de 1 de uno de Octubre de 2012") # url = "http://www.rtve.es/ztnr/consumer/xl/video/alta/" + videoID + "_es_292525252525111" # self.debug(url) # user_agent="Mozilla" # opener = urllib2.build_opener(NoRedirectHandler()) # urllib2.install_opener(opener) # headers = { 'User-Agent' : user_agent } # req = urllib2.Request(url, None, headers) # u = urllib2.urlopen(req) # try: # urlVideo = u.info().getheaders("Location")[0] # except: # raise Error.GeneralPyspainTVsError("No se encuentra Location") # u.close() # if urlVideo != "": # url_video = urlVideo.replace("www.rtve.es", "media5.rtve.es") # titulo = sourceHTML.split("<title>")[1].split("</")[0].replace("RTVE.es", "").replace("-", "").strip() # filename = titulo + ".mp4" # filename = Utiles.formatearNombre(filename) # #sourceHTML = sourceHTML.split("<div id=\"video")[1].split("flashvars")[0] # Me quedo solo con la parte del vídeo principal # url_img = sourceHTML.split("\"thumbnail\" content=\"")[1].split("\"")[0] # else: # raise Error.GeneralPyspainTVsError("No se pudo encontrar el enlace de descarga") # -- Método 1 Octubre 2012 FIN # -- Método 24 Mayo 2013 self.debug(u"Probando método de 24 de uno de Mayo de 2013") manager = re.findall('data-idManager="(.*?)"', sourceHTML)[0] or re.findall('idManager="(.*?)"', sourceHTML)[0] or "default" tipo = "videos" url = "http://www.rtve.es/ztnr/movil/thumbnail/%s/%s/%s.png" % (manager, tipo, videoID) self.debug(u"Probando url:", url) tmp_ = decode(Descargar.get(url)) 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 if urlVideo != "": if not urlVideo.endswith(".mp4"): urlVideo = urlVideo.replace(urlVideo.split(".mp4")[1], "") url_video = urlVideo.replace("www.rtve.es", "media5.rtve.es") titulo = sourceHTML.split("<title>")[1].split("</")[0].replace("RTVE.es", "").replace("-", "").strip() filename = titulo + ".mp4" filename = Utiles.formatearNombre(filename) url_img = sourceHTML.split("\"thumbnail\" content=\"")[1].split("\"")[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 }
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 }