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) ''' url_img = None streamHTML = Descargar.getHtml(self.url) if streamHTML.find("http://level3/") != -1: # Método antiguo self.info(u"[INFO] Método antiguo (mitele)") videoID = streamHTML.split("\'http://level3/")[1].split(".")[0] videoEXT = streamHTML.split("\'http://level3/")[1].split("\'")[0].split(".")[1] videoEXT = "." + videoEXT url2down = self.URL_DESCARGA_TELECINCO + videoID[-1] + "/" + videoID[-2] + "/" + videoID + videoEXT name = None elif streamHTML.find(self.string2split4id[0]) != -1: # Método nuevo newID = streamHTML.split(self.string2split4id[0])[1].split(self.string2split4id[1])[0].split(".")[0] self.info(u"[INFO] Nuevo Video ID:", newID) ask4token = self.URL_ASK4TOKEN + newID[-3:] + "/" + newID + ".mp4" self.debug(u"[+] Pidiendo nuevo token") url2down = Descargar.getHtml(ask4token) name = streamHTML.split("var title = \'")[1].split("\'")[0] + ".mp4" elif self.url.find("videoURL=") != -1: # Forma con el ID en la URL (nueva??) videoID = self.url.split("videoURL=")[1] ask4token = self.URL_ASK4TOKEN + videoID[-3:] + "/" + videoID + ".mp4" self.debug(u"[+] Pidiendo nuevo token") url2down = Descargar.getHtml(ask4token) # Obtner nombre: xmlURL = "http://estaticos.telecinco.es/xml/Video/Video_" + videoID + ".xml" streamXML = Descargar.getHtml(xmlURL) name = streamXML.split("<![CDATA[")[1].split("]")[0] + ".mp4" elif streamHTML.find("MDS.embedObj(video") != -1: contentID = streamHTML.split("MDS.embedObj(video, \"")[1].split("\"")[0] try: clippingID = streamHTML.split("imageClippingId: \'")[1].split("\'")[0] # try por que en la API no funcionaba oO except: clippingID = "1.jpg" try: imageContentID = streamHTML.split("imageContentId: \'")[1].split("\'")[0] # try por problemas com la API oO except: imageContentID = streamHTML.split("MDS.embedObj(video, \"")[1].split("\"")[0] self.debug(u"URL JSON: " + self.URL_JSON + "contentId=" + contentID + "&clippingId=" + clippingID + "&imageContentId=" + imageContentID) streamJSON = Descargar.getHtml(self.URL_JSON + "contentId=" + contentID + "&clippingId=" + clippingID + "&imageContentId=" + imageContentID ) url2down = streamJSON.split("({\"sources\":[{\"src\":\"")[1].split("\"")[0].replace("\/", "/") name = streamHTML.split("<title>")[1].split("<")[0] name += "." + url2down.split(".")[-1].split("?")[0] url_img = streamJSON.split("\"poster\":\"")[1].split("\"")[0].replace("\/", "/") elif streamHTML.find("MSV.embedData") != -1: #rx=re.compile(r"MSV\.embedData\[(.*)\]", re.MULTILINE|re.DOTALL) rx=re.compile(r'/mdsvideo/popup\.html\?(.*)"') videos = rx.findall(streamHTML) if not videos: Error.GeneralPyspainTVsError("Telecinco.es. No se encuentra contenido.") ret = { "exito" : True, "num_videos" : len(videos), "mensaje" : u"URL obtenido correctamente", "videos": [], "titulos": [], "descs": [] } for js in videos: vid = { "url_video" : None, "url_img" : None, "filename" : [], "tipo" : "http", "partes" : 1, "rtmpd_cmd" : None, "menco_cmd" : None, "url_publi" : None, "otros" : None, "mensaje" : None } stream = Descargar.getHtmlUtf8(self.URL_JSON + js + "&imageContentId=" + Utiles.recortar(js, 'contentId=', '&')) info = json.loads(stream[1:-1]) vid['url_video'] = [info['sources'][0]['src']] vid['url_img'] = info['poster'] try: vid['filename'].append(Utiles.formatearNombre(info['nielsen']['title']+'.mp4')) except: vid['filename'].append('VideosDeTelecinco.mp4') ret['videos'].append(vid) ret['titulos'].append(unicode(info['nielsen']['title']).encode('utf8').replace('"','').replace("'","")) ret['descs'].append(u'Cat.: %s. Subcat.: %s. %s'.encode('utf8') % (info['nielsen']['category'].encode('utf8'),info['nielsen']['subcategory'].encode('utf8'),info['nielsen']['title'].encode('utf8'))) return ret else: Error.GeneralPyspainTVsError("Telecinco.es. No se encuentra contenido.") tit_vid = None if name != None: name = name.replace("Ver vídeo online","") tit_vid = name.split(".")[0] name = Utiles.formatearNombre(name) desc = None try: desc = Utiles.recortar(streamHTML, "<h3 class=\"subtitle\">", "<").strip() except: desc = tit_vid if tit_vid is not None else None #TIT FIX: tit_vid = tit_vid.replace('"','').replace("'","") return {"exito" : True, "num_videos" : 1, "mensaje" : u"URL obtenido correctamente", "videos":[{ "url_video" : [url2down], "url_img" : url_img if url_img is not None else None, "filename" : [name] if name is not None else None, "tipo" : "http", "partes" : 1, "rtmpd_cmd" : None, "menco_cmd" : None, "url_publi" : None, "otros" : None, "mensaje" : None }], "titulos": [tit_vid] if tit_vid is not None else None, "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) ''' url_img = None streamHTML = Descargar.getHtml(self.url).decode('string-escape') if streamHTML.find("CUAVID") != -1: self.debug(u"CUAVID") ContentID = streamHTML.split("imageContentId: \'")[1].split("\'")[0] streamJSON = Descargar.getHtml(self.URL_SOURCES + ContentID) url2down = streamJSON.split("\"src\":\"")[1].split("\"")[0].replace("\/", "/") name = streamJSON.split("\"wrpContent\":\"")[1].split("\"")[0] + ".mp4" elif streamHTML.find("MDS.embedObj(video") != -1: # Este parece ser el único método a 16/10/2012 (pero dejo los demás..) self.debug(u"MDS.embedObj") contentID = streamHTML.split("MDS.embedObj(video, \"")[1].split("\"")[0] clippingID = streamHTML.split("imageClippingId: \'")[1].split("\'")[0] imageContentID = streamHTML.split("imageContentId: \'")[1].split("\'")[0] self.debug("URL Json: "+self.URL_JSON + "contentId=" + contentID + "&clippingId=" + clippingID + "&imageContentId=" + imageContentID) streamJSON = Descargar.getHtml( self.URL_JSON + "contentId=" + contentID + "&clippingId=" + clippingID + "&imageContentId=" + imageContentID ) #streamJSON = dict(streamJSON) #url2down = streamJSON["sources"][0]["src"] url2down = streamJSON.split("({\"sources\":[{\"src\":\"")[1].split("\"")[0].replace("\/", "/") name = streamHTML.split("<title>")[1].split("<")[0] name += "." + url2down.split(".")[-1].split("?")[0] url_img = streamJSON.split("\"poster\":\"")[1].split("\"")[0].replace("\/", "/") elif streamHTML.find("src_iframe:") != -1: self.info(u"[INFO] Vídeo Común") name = streamHTML.split("<title>")[1].split("<")[0] urlComunes = self.URL_CUATRO + streamHTML.split("src_iframe:")[1].replace(" ", "").split("\'")[1].split("\'")[0] streamComunes = Descargar.getHtml(urlComunes) url2down = streamComunes.split("document.write(\'<video id=")[1].split("src=\"")[1].split("\"")[0] ext= "." + url2down.split(".")[-1] name += ext elif streamHTML.find("MSV.embedData") != -1: #rx=re.compile(r"MSV\.embedData\[(.*)\]", re.MULTILINE|re.DOTALL) rx=re.compile(r'/mdsvideo/popup\.html\?(.*)"') videos = rx.findall(streamHTML) if not videos: Error.GeneralPyspainTVsError("Telecinco.es. No se encuentra contenido.") ret = { "exito" : True, "num_videos" : len(videos), "mensaje" : u"URL obtenido correctamente", "videos": [], "titulos": [], "descs": [] } for js in videos: vid = { "url_video" : None, "url_img" : None, "filename" : None, "tipo" : "http", "partes" : 1, "rtmpd_cmd" : None, "menco_cmd" : None, "url_publi" : None, "otros" : None, "mensaje" : None } stream = Descargar.getHtmlUtf8(self.URL_JSON + js + "&imageContentId=" + Utiles.recortar(js, 'contentId=', '&')) info = json.loads(stream[1:-1]) vid['url_video'] = [info['sources'][0]['src']] vid['url_img'] = info['poster'] try: vid['filename'] = Utiles.formatearNombre(info['nielsen']['title']+'.mp4') except: vid['filename'] = 'VideosDeTelecinco.mp4' ret['videos'].append(vid) ret['titulos'].append(unicode(info['nielsen']['title']).encode('utf8')) ret['descs'].append(u'Cat.: %s. Subcat.: %s. %s'.encode('utf8') % (info['nielsen']['category'].encode('utf8'),info['nielsen']['subcategory'].encode('utf8'),info['nielsen']['title'].encode('utf8'))) return ret else: raise Error.GeneralPyspainTVsError("Cuatro.com: No se encuentra contenido") tit_vid = None if name: name = name.replace("Ver vídeo online","") tit_vid = name.split(".")[0] name = Utiles.formatearNombre(name) desc = None try: desc = Utiles.recortar(streamHTML, "<h3 class=\"subtitle\">", "<").strip() except: desc = tit_vid if tit_vid is not None else None return {"exito" : True, "num_videos" : 1, "mensaje" : u"URL obtenido correctamente", "videos":[{ "url_video" : [url2down], "url_img" : url_img if url_img is not None else None, "filename" : [name] if name is not None else None, "tipo" : "http", "partes" : 1, "rtmpd_cmd" : None, "menco_cmd" : None, "url_publi" : None, "otros" : None, "mensaje" : None }], "titulos": [tit_vid] if tit_vid is not None else None, "descs": [desc] if desc is not None else None }
def __modoF1(self, streamHTML): # TODO: ¡¡¡Acabar esta función para devolver todos los videos y sus partes!!! """ <param value="_urlData=http://www.antena3.com/gestorf1/swf/player_hitos/xml/data.xml&_image=http://www.antena3.com/gestorf1/pictures/361/361/malasia-portada_crop1.png&_id_list=1405&_promo1=http://www.smartadserver.com/call/pubx/15272/241149/4654/S/&_promo2=http://www.smartadserver.com/call/pubx/15272/241148/4654/S/" name="flashVars"> """ streamHTML = Descargar.getHtmlUtf8(self.url) # Qué vídeo: streamVids = streamHTML.split('<ul class="a3_gp_visor_menu">')[1].split("</ul>")[0].replace("\t", "") streamVids = streamVids.split("<li>")[1:] desc = None try: desc = Utiles.recortar(streamHTML, '<meta property="og:description" content="', '"').strip() except: desc = None # self.debug(streamVids) ret = { "exito": True, "num_videos": 0, "mensaje": u"URLs obtenido correctamente", "videos": [], "titulos": [], "descs": [], } v = -1 for i in streamVids: # todos los vídeos con todas sus partes video = { "url_video": [], "url_img": None, "filename": [], "tipo": "http", "partes": 0, "rtmpd_cmd": None, "menco_cmd": None, "url_publi": None, "otros": None, "mensaje": None, } v += 1 streamVid = streamVids[v] streamVidUrl = self.URL_DE_ANTENA3 + streamVid.split('href="')[1].split('"')[0] self.debug(u"URL Video: " + streamVidUrl) streamHTML = Descargar.getHtml(streamVidUrl) # Partes id_list = streamHTML.split("_id_list=")[1].split("&")[0] listXMLurl = self.URL_DE_F1 + id_list + "_playlist.xml" self.debug(u"URL XML list: " + listXMLurl) listxml = Descargar.getHtml(listXMLurl) video["url_img"] = listxml.split("<picture>")[1].split("</picture>")[0].strip() listxml = listxml.split("<video>")[1:] # print listxml for b in listxml: video["partes"] += 1 # video["mensaje"] = unicode(i.split(">")[1].split("<")[0].capitalize()) endurl = b.split("<url>")[1].split("<")[0] # video["url_video"].append(endurl.replace(endurl.split("mp_")[0],"http://desprogresiva.antena3.com/")) video["url_video"].append(endurl.replace(endurl.split("mp_")[0], self.URL_DE_DESCARGA_LA_SEXTA)) ext = "." + video["url_video"][-1].split(".")[-1] tit = b.split("<title>")[1].split("<")[0] + ext tit = Utiles.formatearNombre(tit) video["filename"].append(tit) ret["titulos"].append(unicode(i.split(">")[1].split("<")[0].capitalize()).encode("utf8")) ret["videos"].append(video) ret["num_videos"] += 1 ret["descs"].append(unicode(desc).encode("utf8")) return ret
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) ''' try: #Tratar de quitar caracteres especiales de las urls que no lo necesitan self.url = self.url.split( "video:")[0] + "video:_" + self.url.split("_")[1] self.debug(u"Adaptar URL: %s" % self.url) except: pass streamHTML = htmlBackup = Descargar.getHtml( self.url).decode('iso-8859-1').encode( 'utf8') #rtpa codigicada en iso.. streamHTML = streamHTML.replace("\n", "").replace("\t", "") partes = None #método 12/11/2012: #if streamHTML.find("html5") != -1: if re.findall("[\'\"]type[\'\"]\ *:\ *[\'\"]html5[\'\"]", streamHTML): partes = 1 videoID = re.findall("\:\_(.*)\.", self.url)[0] url = re.findall("[\'\"]file[\'\"]\ *?:\ *?[\'\"](.*?)[\'\"]", streamHTML)[0] info = json.loads( Descargar.getHtmlUtf8(self.RTPA_API_INFO_ENDPOINT + videoID)) try: name = Utiles.formatearNombre( "%s (%s).mp4" % (info["VOD"][0]["nombre_programa"], info["VOD"][0]["fecha_emision"])) except: name = u"ProgramaRTPA.mp4" else: # Cuantas partes son: try: partes = int(streamHTML.split("&partes=")[1].split("&")[0]) except IndexError: # No existe "&partes" partes = 1 if partes == 1: videoID = streamHTML.split("<param value=\"video1=")[1].split( "&")[0] if videoID.find("http://") != -1: url = videoID name = streamHTML.split("data-text=\"")[1].split( "\"")[0].strip() + "." + url.split(".")[-1] else: # Probar entre TOKEN nuevo y antiguo por reproductor: repro = streamHTML.split( "<param value=\"player/")[1].split("\"")[0] if repro == "reproductorVideoOnDemmand-mp4-rtpa.swf": # Antiguo streamINFO = self.__descHTML(self.TOKEN_ARCHIVO + videoID) url = "http://" + streamINFO.split("http://")[1] else: # Reproductor nuevo: "reproductorVideoOnDemmand.swf" streamINFO = self.__descHTML(self.TOKEN + videoID + "_1") streamINFO = self.__descHTML( streamINFO.split("&url=")[1]) url = "http://" + streamINFO.split("http://")[1] name = streamHTML.split("<div id=\"sobreElVideo\">")[ 1].split("<h3>")[1].split("</h3>")[0] if name == "": name = streamHTML.split("<title>")[1].split( "</title>")[0] + ".mp4" else: name + ".mp4" else: # Recordar que hay videos que ponen varias partes en las que realmente solo existe una: videoID = streamHTML.split("<param value=\"video1=")[1].split( "&")[0] url = [] name = [] for i in range(1, partes + 1): streamINFO = self.__descHTML(self.TOKEN + videoID + "_" + str(i)) streamINFO = self.__descHTML(streamINFO.split("&url=")[1]) tmp_url = "http://" + streamINFO.split("http://")[1] tmp_name = streamHTML.split( "<div id=\"sobreElVideo\">")[1].split("<h3>")[1].split( "</h3>")[0] + "_part" + str(i) if tmp_name == "": tmp_name = streamHTML.split("<title>")[1].split( "</title>")[0] + "_part" + str(i) + ".mp4" else: tmp_name + ".mp4" if Descargar.isReachable(tmp_url): url.append(tmp_url) name.appen(tmp_name) continue else: break #FIXME: Gran fixme aquí, arreglar todo esto de desc y de tit_vid if info: img = info["VOD"][0]["url_imagen"] desc = u"%s (%s)" % (info["VOD"][0]["nombre_programa"], info["VOD"][0]["fecha_emision"]) try: desc = unicode(desc).encode("utf8") except: desc = u"Vídeo de la web de Radio Televisión del Principado de Asturias".encode( "utf8") tit_vid = desc else: try: #imagen del vídeo img = self.URL_RTPA + Utiles.recortar(htmlBackup, "\'image\': \'", "\'") except: img = None desc = u"" try: # Descripción del vídeo d = htmlBackup.split("<div class=\"overview\">")[1].split( "<div>")[1].split("</div>")[0].strip() except: try: d = htmlBackup.split("<div class=\"overview\">")[1].split( "<p>")[1].split("</p>")[0].strip() except: pass try: # desc coding desc = unicode(d).encode("utf8") except: desc = u"Vídeo de la web de Radio Televisión del Principado de Asturias".encode( "utf8") if desc == u"": desc = u"Vídeo de la web de Radio Televisión del Principado de Asturias".encode( "utf8") tit_vid = u"" try: #Título del vídeo tit = htmlBackup.split("<div id=\"sobreElVideo\">")[1].split( "<h3>")[1].split("</h3>")[0].strip() except: try: tit = htmlBackup.split("<div id=\"sobreElVideo\">" )[1].split("<h4 class=\"")[1].split( ">")[1].split("<")[0].strip() except: pass try: #titulo coding tit = Utiles.tituloFormat(tit) tit_vid = unicode(tit).encode("utf8") except: tit_vid = u"Vídeo de la web de Radio Televisión del Principado de Asturias".encode( "utf8") if tit_vid == u"": tit_vid = u"Vídeo de la web de Radio Televisión del Principado de Asturias".encode( "utf8") if type(name) == list: for i in name: b = Utiles.formatearNombre(i) name[name.index(i)] = b else: name = Utiles.formatearNombre(name) return { "exito": True, "num_videos": 1, "mensaje": u"URL obtenida correctamente", "videos": [{ "url_video": [url] if type(url) != list else url, "url_img": img if img is not None else None, "filename": [name] if name is not None else None, "tipo": "http", "partes": partes if partes is not None else 1, "rtmpd_cmd": None, "menco_cmd": None, "url_publi": None, "otros": None, "mensaje": None }], "titulos": [tit_vid] if tit_vid is not None else None, "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) """ try: # Tratar de quitar caracteres especiales de las urls que no lo necesitan self.url = self.url.split("video:")[0] + "video:_" + self.url.split("_")[1] self.debug(u"Adaptar URL: %s" % self.url) except: pass streamHTML = htmlBackup = ( Descargar.getHtml(self.url).decode("iso-8859-1").encode("utf8") ) # rtpa codigicada en iso.. streamHTML = streamHTML.replace("\n", "").replace("\t", "") partes = None # método 12/11/2012: # if streamHTML.find("html5") != -1: if re.findall("['\"]type['\"]\ *:\ *['\"]html5['\"]", streamHTML): partes = 1 videoID = re.findall("\:\_(.*)\.", self.url)[0] url = re.findall("['\"]file['\"]\ *?:\ *?['\"](.*?)['\"]", streamHTML)[0] info = json.loads(Descargar.getHtmlUtf8(self.RTPA_API_INFO_ENDPOINT + videoID)) try: name = Utiles.formatearNombre( "%s (%s).mp4" % (info["VOD"][0]["nombre_programa"], info["VOD"][0]["fecha_emision"]) ) except: name = u"ProgramaRTPA.mp4" else: # Cuantas partes son: try: partes = int(streamHTML.split("&partes=")[1].split("&")[0]) except IndexError: # No existe "&partes" partes = 1 if partes == 1: videoID = streamHTML.split('<param value="video1=')[1].split("&")[0] if videoID.find("http://") != -1: url = videoID name = streamHTML.split('data-text="')[1].split('"')[0].strip() + "." + url.split(".")[-1] else: # Probar entre TOKEN nuevo y antiguo por reproductor: repro = streamHTML.split('<param value="player/')[1].split('"')[0] if repro == "reproductorVideoOnDemmand-mp4-rtpa.swf": # Antiguo streamINFO = self.__descHTML(self.TOKEN_ARCHIVO + videoID) url = "http://" + streamINFO.split("http://")[1] else: # Reproductor nuevo: "reproductorVideoOnDemmand.swf" streamINFO = self.__descHTML(self.TOKEN + videoID + "_1") streamINFO = self.__descHTML(streamINFO.split("&url=")[1]) url = "http://" + streamINFO.split("http://")[1] name = streamHTML.split('<div id="sobreElVideo">')[1].split("<h3>")[1].split("</h3>")[0] if name == "": name = streamHTML.split("<title>")[1].split("</title>")[0] + ".mp4" else: name + ".mp4" else: # Recordar que hay videos que ponen varias partes en las que realmente solo existe una: videoID = streamHTML.split('<param value="video1=')[1].split("&")[0] url = [] name = [] for i in range(1, partes + 1): streamINFO = self.__descHTML(self.TOKEN + videoID + "_" + str(i)) streamINFO = self.__descHTML(streamINFO.split("&url=")[1]) tmp_url = "http://" + streamINFO.split("http://")[1] tmp_name = ( streamHTML.split('<div id="sobreElVideo">')[1].split("<h3>")[1].split("</h3>")[0] + "_part" + str(i) ) if tmp_name == "": tmp_name = streamHTML.split("<title>")[1].split("</title>")[0] + "_part" + str(i) + ".mp4" else: tmp_name + ".mp4" if Descargar.isReachable(tmp_url): url.append(tmp_url) name.appen(tmp_name) continue else: break # FIXME: Gran fixme aquí, arreglar todo esto de desc y de tit_vid if info: img = info["VOD"][0]["url_imagen"] desc = u"%s (%s)" % (info["VOD"][0]["nombre_programa"], info["VOD"][0]["fecha_emision"]) try: desc = unicode(desc).encode("utf8") except: desc = u"Vídeo de la web de Radio Televisión del Principado de Asturias".encode("utf8") tit_vid = desc else: try: # imagen del vídeo img = self.URL_RTPA + Utiles.recortar(htmlBackup, "'image': '", "'") except: img = None desc = u"" try: # Descripción del vídeo d = htmlBackup.split('<div class="overview">')[1].split("<div>")[1].split("</div>")[0].strip() except: try: d = htmlBackup.split('<div class="overview">')[1].split("<p>")[1].split("</p>")[0].strip() except: pass try: # desc coding desc = unicode(d).encode("utf8") except: desc = u"Vídeo de la web de Radio Televisión del Principado de Asturias".encode("utf8") if desc == u"": desc = u"Vídeo de la web de Radio Televisión del Principado de Asturias".encode("utf8") tit_vid = u"" try: # Título del vídeo tit = htmlBackup.split('<div id="sobreElVideo">')[1].split("<h3>")[1].split("</h3>")[0].strip() except: try: tit = ( htmlBackup.split('<div id="sobreElVideo">')[1] .split('<h4 class="')[1] .split(">")[1] .split("<")[0] .strip() ) except: pass try: # titulo coding tit = Utiles.tituloFormat(tit) tit_vid = unicode(tit).encode("utf8") except: tit_vid = u"Vídeo de la web de Radio Televisión del Principado de Asturias".encode("utf8") if tit_vid == u"": tit_vid = u"Vídeo de la web de Radio Televisión del Principado de Asturias".encode("utf8") if type(name) == list: for i in name: b = Utiles.formatearNombre(i) name[name.index(i)] = b else: name = Utiles.formatearNombre(name) return { "exito": True, "num_videos": 1, "mensaje": u"URL obtenida correctamente", "videos": [ { "url_video": [url] if type(url) != list else url, "url_img": img if img is not None else None, "filename": [name] if name is not None else None, "tipo": "http", "partes": partes if partes is not None else 1, "rtmpd_cmd": None, "menco_cmd": None, "url_publi": None, "otros": None, "mensaje": None, } ], "titulos": [tit_vid] if tit_vid is not None else None, "descs": [desc] if desc is not None else None, }
def __modoF1( self, streamHTML ): #TODO: ¡¡¡Acabar esta función para devolver todos los videos y sus partes!!! ''' <param value="_urlData=http://www.antena3.com/gestorf1/swf/player_hitos/xml/data.xml&_image=http://www.antena3.com/gestorf1/pictures/361/361/malasia-portada_crop1.png&_id_list=1405&_promo1=http://www.smartadserver.com/call/pubx/15272/241149/4654/S/&_promo2=http://www.smartadserver.com/call/pubx/15272/241148/4654/S/" name="flashVars"> ''' streamHTML = Descargar.getHtmlUtf8(self.url) # Qué vídeo: streamVids = streamHTML.split( "<ul class=\"a3_gp_visor_menu\">")[1].split("</ul>")[0].replace( "\t", "") streamVids = streamVids.split("<li>")[1:] desc = None try: desc = Utiles.recortar( streamHTML, "<meta property=\"og:description\" content=\"", "\"").strip() except: desc = None #self.debug(streamVids) ret = { "exito": True, "num_videos": 0, "mensaje": u"URLs obtenido correctamente", "videos": [], "titulos": [], "descs": [] } v = -1 for i in streamVids: #todos los vídeos con todas sus partes video = { "url_video": [], "url_img": None, "filename": [], "tipo": "http", "partes": 0, "rtmpd_cmd": None, "menco_cmd": None, "url_publi": None, "otros": None, "mensaje": None } v += 1 streamVid = streamVids[v] streamVidUrl = self.URL_DE_ANTENA3 + streamVid.split( "href=\"")[1].split("\"")[0] self.debug(u"URL Video: " + streamVidUrl) streamHTML = Descargar.getHtml(streamVidUrl) #Partes id_list = streamHTML.split("_id_list=")[1].split("&")[0] listXMLurl = self.URL_DE_F1 + id_list + "_playlist.xml" self.debug(u"URL XML list: " + listXMLurl) listxml = Descargar.getHtml(listXMLurl) video["url_img"] = listxml.split("<picture>")[1].split( "</picture>")[0].strip() listxml = listxml.split("<video>")[1:] #print listxml for b in listxml: video["partes"] += 1 #video["mensaje"] = unicode(i.split(">")[1].split("<")[0].capitalize()) endurl = b.split("<url>")[1].split("<")[0] video["url_video"].append( endurl.replace( endurl.split("mp_")[0], "http://desprogresiva.antena3.com/")) ext = "." + video["url_video"][-1].split(".")[-1] tit = b.split("<title>")[1].split("<")[0] + ext tit = Utiles.formatearNombre(tit) video["filename"].append(tit) ret["titulos"].append( unicode( i.split(">")[1].split("<")[0].capitalize()).encode('utf8')) ret["videos"].append(video) ret["num_videos"] += 1 ret["descs"].append(unicode(desc).encode('utf8')) return ret
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) ''' url_img = None streamHTML = Descargar.getHtml(self.url).decode('string-escape') if streamHTML.find("CUAVID") != -1: self.debug(u"CUAVID") ContentID = streamHTML.split("imageContentId: \'")[1].split("\'")[0] streamJSON = Descargar.getHtml(self.URL_SOURCES + ContentID) url2down = streamJSON.split("\"src\":\"")[1].split("\"")[0].replace("\/", "/") name = streamJSON.split("\"wrpContent\":\"")[1].split("\"")[0] + ".mp4" elif streamHTML.find("MDS.embedObj(video") != -1: # Este parece ser el único método a 16/10/2012 (pero dejo los demás..) self.debug(u"MDS.embedObj") contentID = streamHTML.split("MDS.embedObj(video, \"")[1].split("\"")[0] clippingID = streamHTML.split("imageClippingId: \'")[1].split("\'")[0] imageContentID = streamHTML.split("imageContentId: \'")[1].split("\'")[0] self.debug("URL Json: "+self.URL_JSON + "contentId=" + contentID + "&clippingId=" + clippingID + "&imageContentId=" + imageContentID) streamJSON = Descargar.getHtml( self.URL_JSON + "contentId=" + contentID + "&clippingId=" + clippingID + "&imageContentId=" + imageContentID ) #streamJSON = dict(streamJSON) #url2down = streamJSON["sources"][0]["src"] url2down = streamJSON.split("({\"sources\":[{\"src\":\"")[1].split("\"")[0].replace("\/", "/") name = streamHTML.split("<title>")[1].split("<")[0] name += "." + url2down.split(".")[-1].split("?")[0] url_img = streamJSON.split("\"poster\":\"")[1].split("\"")[0].replace("\/", "/") elif streamHTML.find("src_iframe:") != -1: self.info(u"[INFO] Vídeo Común") name = streamHTML.split("<title>")[1].split("<")[0] urlComunes = self.URL_CUATRO + streamHTML.split("src_iframe:")[1].replace(" ", "").split("\'")[1].split("\'")[0] streamComunes = Descargar.getHtml(urlComunes) url2down = streamComunes.split("document.write(\'<video id=")[1].split("src=\"")[1].split("\"")[0] ext= "." + url2down.split(".")[-1] name += ext elif streamHTML.find("MSV.embedData") != -1: #rx=re.compile(r"MSV\.embedData\[(.*)\]", re.MULTILINE|re.DOTALL) rx=re.compile(r'/mdsvideo/popup\.html\?(.*)"') videos = rx.findall(streamHTML) if not videos: Error.GeneralPyspainTVsError("Telecinco.es. No se encuentra contenido.") ret = { "exito" : True, "num_videos" : len(videos), "mensaje" : u"URL obtenido correctamente", "videos": [], "titulos": [], "descs": [] } for js in videos: vid = { "url_video" : None, "url_img" : None, "filename" : None, "tipo" : "http", "partes" : 1, "rtmpd_cmd" : None, "menco_cmd" : None, "url_publi" : None, "otros" : None, "mensaje" : None } stream = Descargar.getHtmlUtf8(self.URL_JSON + js + "&imageContentId=" + Utiles.recortar(js, 'contentId=', '&')) info = json.loads(stream[1:-1]) vid['url_video'] = [info['sources'][0]['src']] vid['url_img'] = info['poster'] try: vid['filename'] = Utiles.formatearNombre(info['nielsen']['title']+'.mp4') except: vid['filename'] = 'VideosDeTelecinco.mp4' ret['videos'].append(vid) ret['titulos'].append(unicode(info['nielsen']['title']).encode('utf8').replace("\'","")) ret['descs'].append(u'Cat.: %s. Subcat.: %s. %s'.encode('utf8') % (info['nielsen']['category'].encode('utf8'),info['nielsen']['subcategory'].encode('utf8'),info['nielsen']['title'].encode('utf8'))) return ret else: raise Error.GeneralPyspainTVsError("Cuatro.com: No se encuentra contenido") tit_vid = None if name: name = name.replace("Ver vídeo online","") tit_vid = name.split(".")[0] name = Utiles.formatearNombre(name) desc = None try: desc = Utiles.recortar(streamHTML, "<h3 class=\"subtitle\">", "<").strip() except: desc = tit_vid if tit_vid is not None else None return {"exito" : True, "num_videos" : 1, "mensaje" : u"URL obtenido correctamente", "videos":[{ "url_video" : [url2down], "url_img" : url_img if url_img is not None else None, "filename" : [name] if name is not None else None, "tipo" : "http", "partes" : 1, "rtmpd_cmd" : None, "menco_cmd" : None, "url_publi" : None, "otros" : None, "mensaje" : None }], "titulos": [tit_vid] if tit_vid is not None else None, "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) ''' url_img = None streamHTML = Descargar.getHtml(self.url) if streamHTML.find("http://level3/") != -1: # Método antiguo self.info(u"[INFO] Método antiguo (mitele)") videoID = streamHTML.split("\'http://level3/")[1].split(".")[0] videoEXT = streamHTML.split("\'http://level3/")[1].split( "\'")[0].split(".")[1] videoEXT = "." + videoEXT url2down = self.URL_DESCARGA_TELECINCO + videoID[ -1] + "/" + videoID[-2] + "/" + videoID + videoEXT name = None elif streamHTML.find(self.string2split4id[0]) != -1: # Método nuevo newID = streamHTML.split(self.string2split4id[0])[1].split( self.string2split4id[1])[0].split(".")[0] self.info(u"[INFO] Nuevo Video ID:", newID) ask4token = self.URL_ASK4TOKEN + newID[-3:] + "/" + newID + ".mp4" self.debug(u"[+] Pidiendo nuevo token") url2down = Descargar.getHtml(ask4token) name = streamHTML.split("var title = \'")[1].split( "\'")[0] + ".mp4" elif self.url.find( "videoURL=") != -1: # Forma con el ID en la URL (nueva??) videoID = self.url.split("videoURL=")[1] ask4token = self.URL_ASK4TOKEN + videoID[ -3:] + "/" + videoID + ".mp4" self.debug(u"[+] Pidiendo nuevo token") url2down = Descargar.getHtml(ask4token) # Obtner nombre: xmlURL = "http://estaticos.telecinco.es/xml/Video/Video_" + videoID + ".xml" streamXML = Descargar.getHtml(xmlURL) name = streamXML.split("<![CDATA[")[1].split("]")[0] + ".mp4" elif streamHTML.find("MDS.embedObj(video") != -1: contentID = streamHTML.split("MDS.embedObj(video, \"")[1].split( "\"")[0] try: clippingID = streamHTML.split("imageClippingId: \'")[1].split( "\'")[0] # try por que en la API no funcionaba oO except: clippingID = "1.jpg" try: imageContentID = streamHTML.split("imageContentId: \'")[ 1].split("\'")[0] # try por problemas com la API oO except: imageContentID = streamHTML.split( "MDS.embedObj(video, \"")[1].split("\"")[0] self.debug(u"URL JSON: " + self.URL_JSON + "contentId=" + contentID + "&clippingId=" + clippingID + "&imageContentId=" + imageContentID) streamJSON = Descargar.getHtml(self.URL_JSON + "contentId=" + contentID + "&clippingId=" + clippingID + "&imageContentId=" + imageContentID) url2down = streamJSON.split("({\"sources\":[{\"src\":\"")[1].split( "\"")[0].replace("\/", "/") name = streamHTML.split("<title>")[1].split("<")[0] name += "." + url2down.split(".")[-1].split("?")[0] url_img = streamJSON.split("\"poster\":\"")[1].split( "\"")[0].replace("\/", "/") elif streamHTML.find("MSV.embedData") != -1: #rx=re.compile(r"MSV\.embedData\[(.*)\]", re.MULTILINE|re.DOTALL) rx = re.compile(r'/mdsvideo/popup\.html\?(.*)"') videos = rx.findall(streamHTML) if not videos: raise Error.GeneralPyspainTVsError( "Telecinco.es. No se encuentra contenido.") ret = { "exito": True, "num_videos": len(videos), "mensaje": u"URL obtenido correctamente", "videos": [], "titulos": [], "descs": [] } for js in videos: vid = { "url_video": None, "url_img": None, "filename": [], "tipo": "http", "partes": 1, "rtmpd_cmd": None, "menco_cmd": None, "url_publi": None, "otros": None, "mensaje": None } self.debug(u"API ENDPOINT: %s" % self.URL_JSON + js + "&imageContentId=" + Utiles.recortar(js, 'contentId=', '&')) stream = Descargar.getHtmlUtf8( self.URL_JSON + js + "&imageContentId=" + Utiles.recortar(js, 'contentId=', '&')) info = json.loads(stream[1:-1]) vid['url_video'] = [info['sources'][0]['src']] vid['url_img'] = info['poster'] try: vid['filename'].append( Utiles.formatearNombre(info['nielsen']['title'] + '.mp4')) except: vid['filename'].append('VideosDeTelecinco.mp4') ret['videos'].append(vid) ret['titulos'].append( unicode(info['nielsen']['title']).encode('utf8').replace( '"', '').replace("'", "")) ret['descs'].append( u'Cat.: %s. Subcat.: %s. %s'.encode('utf8') % (info['nielsen']['category'].encode('utf8'), info['nielsen']['subcategory'].encode('utf8'), info['nielsen']['title'].encode('utf8'))) return ret else: raise Error.GeneralPyspainTVsError( "Telecinco.es. No se encuentra contenido.") tit_vid = None if name != None: name = name.replace("Ver vídeo online", "") tit_vid = name.split(".")[0] name = Utiles.formatearNombre(name) desc = None try: desc = Utiles.recortar(streamHTML, "<h3 class=\"subtitle\">", "<").strip() except: desc = tit_vid if tit_vid is not None else None #TIT FIX: tit_vid = tit_vid.replace('"', '').replace("'", "") return { "exito": True, "num_videos": 1, "mensaje": u"URL obtenido correctamente", "videos": [{ "url_video": [url2down], "url_img": url_img if url_img is not None else None, "filename": [name] if name is not None else None, "tipo": "http", "partes": 1, "rtmpd_cmd": None, "menco_cmd": None, "url_publi": None, "otros": None, "mensaje": None }], "titulos": [tit_vid] if tit_vid is not None else None, "descs": [desc] if desc is not None else None }