def __modoSalonNuevo(self, streamXML): '''Nuevos vídeos con extensión .m4v''' self.log(u"[INFO] Modo Salón") self.log(u"[INFO] Nuevos vídeos en formato f4v") if streamXML.find("000.f4v"): url2down1 = self.URL_DE_DESCARGA + streamXML.split("<archivo><![CDATA[")[1].split("]")[0] else: url2down1 = self.URL_DE_DESCARGA + \ streamXML.split("<archivo><![CDATA[")[1].split("001.f4v]]></archivo>")[0] + "000.f4v" if Descargar.isReachable(url2down1): # Vídeo en una parte url2down = url2down1 name = streamXML.split("<nombre><![CDATA[")[1].split("]]>")[0] + ".f4v" else: # Vídeo en varias partes self.info(u"[!!!] No se puede encuentra el vídeo en un archivo (000.m4v)") self.info(u"[INFO] El vídeo consta de varias partes") parts = re.findall("\<archivo\>\<\!\[CDATA\[.*\.f4v\]\]\>\<\/archivo\>", streamXML) if parts: name1 = streamXML.split("<nombre><![CDATA[")[1].split("]]>")[0] url2down = [] name = [] for i in parts: url2down.append(self.URL_DE_DESCARGA + i.split("<archivo><![CDATA[")[1].split("]]></archivo>")[0]) name.append(name1 + "_" + i.split("]")[0].split("/")[-1]) else: raise Error.GeneralPyspainTVsError("Grupo Antena 3. No se encuentra ninguna parte de contenido.") return [url2down, name]
def __modoNormalConURL(self, streamHTML): url2down = streamHTML.split(".seoURL='")[1].split("'")[0] if not Descargar.isReachable(url2down): # A veces el vídeo de .seoURL da NOT FOUND! xmlURL = Utiles.recortar(streamHTML, ".xml=\'", "\'") streamXML = Descargar.getHtml(self.URL_DE_ANTENA3 + xmlURL) self.URL_DE_DESCARGA = self.__getUrlDescarga(streamXML) url2down = self.URL_DE_DESCARGA + \ streamXML.split("<archivo><![CDATA[")[1].split("]]></archivo>")[0] name = streamXML.split("<nombre><![CDATA[")[1].split("]]>")[0] + ".mp4" return [url2down, name] url2down = url2down.replace("deslasexta", "desprogresiva") try: # Parece que a veces aunque en el código aparezca el html, este no existe.. name = Descargar.getHtml(self.URL_DE_ANTENA3 + streamHTML.split(".xml='")[1].split("'")[0]).split("<nombre><![CDATA[")[1].split("]]>")[0] + ".mp4" except: name = Utiles.recortar(streamHTML, "<title>", "</title>").replace("ANTENA 3 TV", "").replace("-", "").strip() + ".mp4" return [url2down, name]
def __modoSalon(self, streamHTML): #TODO: Poner cada Canal su URL, no solo a todos la de antena 3 ;) self.log(u"[INFO] Modo Salón") if streamHTML.find("so.addVariable(\"xml\"") != -1: streamXML = \ Descargar.getHtml(self.URL_DE_ANTENA3 + streamHTML.split("so.addVariable(\"xml\",\"")[1].split("\"")[0]) elif streamHTML.find("player_capitulo.xml='") != -1: streamXML = \ Descargar.getHtml(self.URL_DE_ANTENA3 + streamHTML.split("player_capitulo.xml='")[1].split("'")[0]) else: raise Error.GeneralPyspainTVsError("Grupo Antena 3. No se encuentra XML.") # Comprobar aquí si se puede descargar 000.mp4: if streamXML.find(".mp4") != -1: tipo = ".mp4" url2down1 = self.URL_DE_DESCARGA + \ streamXML.split("<archivo><![CDATA[")[1].split("001.mp4]]></archivo>")[0] + "000.mp4" elif streamXML.find(".flv") != -1: tipo = ".flv" url2down1 = self.URL_DE_DESCARGA + \ streamXML.split("<archivo><![CDATA[")[1].split("001.flv]]></archivo>")[0] + "000.flv" elif streamXML.find(".f4v") != -1: [url2down, name] = self.__modoSalonNuevo(streamXML) return [url2down, name] else: raise Error.GeneralPyspainTVsError("Grupo Antena 3. No se encuentra mp4, f4v ni flv") if Descargar.isReachable(url2down1): # Vídeo completo en una parte url2down = url2down1 name = streamXML.split("<nombre><![CDATA[")[1].split("]]>")[0] + tipo else: # Vídeo en varias partes self.info(u"[!!!] No se puede encuentra el vídeo en un archivo (000.m4v)") self.info(u"[INFO] El vídeo consta de varias partes") parts = re.findall("\<archivo\>\<\!\[CDATA\[.*"+tipo+"\]\]\>\<\/archivo\>", streamXML) if parts: name1 = streamXML.split("<nombre><![CDATA[")[1].split("]]>")[0] url2down = [] name = [] for i in parts: url2down.append(self.URL_DE_DESCARGA + i.split("<archivo><![CDATA[")[1].split("]]></archivo>")[0]) name.append(name1 + "_" + i.split("]")[0].split("/")[-1]) else: raise Error.GeneralPyspainTVsError("Grupo Antena 3. No se encuentra niguna parte de contenido.") return [url2down, name]
def __modoNormalConURL(self, streamHTML): url2down = streamHTML.split(".seoURL='")[1].split("'")[0] if not Descargar.isReachable( url2down): # A veces el vídeo de .seoURL da NOT FOUND! xmlURL = Utiles.recortar(streamHTML, ".xml=\'", "\'") streamXML = Descargar.getHtml(self.URL_DE_ANTENA3 + xmlURL) self.URL_DE_DESCARGA = self.__getUrlDescarga(streamXML) url2down = self.URL_DE_DESCARGA + \ streamXML.split("<archivo><![CDATA[")[1].split("]]></archivo>")[0] name = streamXML.split("<nombre><![CDATA[")[1].split( "]]>")[0] + ".mp4" return [url2down, name] url2down = url2down.replace("deslasexta", "desprogresiva") try: # Parece que a veces aunque en el código aparezca el html, este no existe.. name = Descargar.getHtml(self.URL_DE_ANTENA3 + streamHTML.split( ".xml='")[1].split("'")[0]).split( "<nombre><![CDATA[")[1].split("]]>")[0] + ".mp4" except: name = Utiles.recortar(streamHTML, "<title>", "</title>").replace( "ANTENA 3 TV", "").replace("-", "").strip() + ".mp4" return [url2down, name]
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] 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: partes = 1 name = streamHTML.split("<div id=\"sobreElVideo\">")[1].split( "<h3>")[1].split("</h3>")[0] + ".mp4" streamHTML = streamHTML.replace(" ", "") try: url = streamHTML.split("html5")[1].split( "\'file\':\'")[1].split("\'")[0] except: url = streamHTML.split("html5")[0].split( "\'file\':\'")[1].split("\'")[0] 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í, arreglat todo esto de desc y de tit_vid 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 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) ''' html = Descargar.get(self.url) rtmp = False try: url = html.split("<param name=\"movie\"")[1].split("file=")[1].split("&")[0] except: try: url = Utiles.unescape(Utiles.recortar(html, "value=\"src=", "&")) rtmp = True except: #TODO: Añadir vídeos de listas raise Error.GeneralPyspainTVsError("No se pudo obtener la url de descarga") try: tit = html.split("<td class=\"contentheading\"")[1].split(">")[1].split("<")[0].decode('iso-8859-1').encode('utf8') except: try: tit = Utiles.recortar(html, "<meta name=\"title\" content=\"", "\"").decode('iso-8859-1').encode('utf8') except: tit = u"Vídeo de Rias Baixas Televisión".encode('utf8') try: desc = html.split("<table class=\"contentpaneopen\">")[1].split("</strong>")[1].split("</table>")[0].decode('iso-8859-1').encode('utf8') #desc = desc.replace(desc.find("<!-- JW AllVideos"), new) except: desc = tit try: if rtmp: imgs = html.split("MM_preloadImages('")[1] for i in imgs.split("<a href="): if i.find(self.url) != -1: img = self.URL_RB + "/" + i.split("MM_swapImage(")[1].split(",")[2].replace("\'", "").strip() break else: img = None else: img = html.split("<param name=\"movie\"")[1].split("image=")[1].split("&")[0] if Descargar.isReachable(img): pass else: img = None except: img = None try: name = Utiles.formatearNombre(tit) + ".flv" except: name = "Video_RiasBaixas.mp4" if rtmp: rtmpd_cmd = "rtmpdump -r \'"+url+"\' -o \'"+name+"\'" return {"exito" : True, "num_videos" : 1, "mensaje" : u"URL obtenido correctamente", "videos":[{ "url_video" : [url], "url_img" : img if img is not None else None, "filename" : [name] if name is not None else None, "tipo" : "http" if not rtmp else "rtmp", "partes" : 1, "rtmpd_cmd" : [rtmpd_cmd] if rtmp else None, "menco_cmd" : None, "url_publi" : None, "otros" : None, "mensaje" : None }], "titulos": [tit] if tit 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] 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: partes = 1 name = streamHTML.split("<div id=\"sobreElVideo\">")[1].split("<h3>")[1].split("</h3>")[0] + ".mp4" streamHTML = streamHTML.replace(" ", "") try: url = streamHTML.split("html5")[1].split("\'file\':\'")[1].split("\'")[0] except: url = streamHTML.split("html5")[0].split("\'file\':\'")[1].split("\'")[0] 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 try: #imagen del vídeo img = self.URL_RTPA + Utiles.recortar(htmlBackup, "\'image\': \'", "\'") except: img = None desc = None try: # Descripción del vídeo desc = htmlBackup.split("<div class=\"overview\">")[1].split("<div>")[1].split("</div>")[0].strip() except: desc = u"Vídeo de la web de Radio Televisión del Principado de Asturias" else: if desc is not None and desc == "": desc = u"Vídeo de la web de Radio Televisión del Principado de Asturias" tit_vid = None try: #Título del vídeo tit_vid = htmlBackup.split("<div id=\"sobreElVideo\">")[1].split("<h3>")[1].split("</h3>")[0] except: tit_vid = None else: if tit_vid is not None and tit_vid == "": tit_vid = u"Vídeo de la web de Radio Televisión del Principado de Asturias" 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) ''' html = Descargar.get(self.url) rtmp = False try: url = html.split("<param name=\"movie\"")[1].split( "file=")[1].split("&")[0] except: try: url = Utiles.unescape( Utiles.recortar(html, "value=\"src=", "&")) rtmp = True except: #TODO: Añadir vídeos de listas raise Error.GeneralPyspainTVsError( "No se pudo obtener la url de descarga") try: tit = html.split("<td class=\"contentheading\"")[1].split( ">")[1].split("<")[0].decode('iso-8859-1').encode('utf8') except: try: tit = Utiles.recortar(html, "<meta name=\"title\" content=\"", "\"").decode('iso-8859-1').encode('utf8') except: tit = u"Vídeo de Rias Baixas Televisión".encode('utf8') try: desc = html.split("<table class=\"contentpaneopen\">")[1].split( "</strong>")[1].split("</table>")[0].decode( 'iso-8859-1').encode('utf8') #desc = desc.replace(desc.find("<!-- JW AllVideos"), new) except: desc = tit try: if rtmp: imgs = html.split("MM_preloadImages('")[1] for i in imgs.split("<a href="): if i.find(self.url) != -1: img = self.URL_RB + "/" + i.split( "MM_swapImage(")[1].split(",")[2].replace( "\'", "").strip() break else: img = None else: img = html.split("<param name=\"movie\"")[1].split( "image=")[1].split("&")[0] if Descargar.isReachable(img): pass else: img = None except: img = None try: name = Utiles.formatearNombre(tit) + ".flv" except: name = "Video_RiasBaixas.mp4" if rtmp: rtmpd_cmd = "rtmpdump -r \'" + url + "\' -o \'" + name + "\'" return { "exito": True, "num_videos": 1, "mensaje": u"URL obtenido correctamente", "videos": [{ "url_video": [url], "url_img": img if img is not None else None, "filename": [name] if name is not None else None, "tipo": "http" if not rtmp else "rtmp", "partes": 1, "rtmpd_cmd": [rtmpd_cmd] if rtmp else None, "menco_cmd": None, "url_publi": None, "otros": None, "mensaje": None }], "titulos": [tit] if tit is not None else None, "descs": [desc] if desc is not None else None }