def downloadfile(url, nombrefichero, headers=[]): logger.info("[downloadtools.py] downloadfile: url=" + url) logger.info("[downloadtools.py] downloadfile: nombrefichero=" + nombrefichero) # antes #f=open(nombrefichero,"wb") try: import xbmc nombrefichero = xbmc.makeLegalFilename(nombrefichero) except: pass logger.info("[downloadtools.py] downloadfile: nombrefichero=" + nombrefichero) # despues if os.path.exists(nombrefichero): f = open(nombrefichero, 'r+b') existSize = os.path.getsize(nombrefichero) logger.info( "[downloadtools.py] downloadfile: el fichero existe, size=%d" % existSize) grabado = existSize f.seek(existSize) else: existSize = 0 logger.info("[downloadtools.py] downloadfile: el fichero no existe") f = open(nombrefichero, 'wb') grabado = 0 # Crea el diálogo de progreso try: import xbmcgui progreso = xbmcgui.DialogProgress() progreso.create("plugin", "Descargando...", url, nombrefichero) #progreso.create( "plugin" , "Descargando..." , os.path.basename(nombrefichero)+" desde "+urlparse.urlparse(url).hostname ) except: progreso = "" # Login y password Filenium # http://abcd%40gmail.com:[email protected]/get/Oi8vd3d3/LmZpbGVz/ZXJ2ZS5j/b20vZmls/ZS9kTnBL/dm11/b0/?.zip if "filenium" in url: from servers import filenium url, authorization_header = filenium.extract_authorization_header(url) headers.append(["Authorization", authorization_header]) # Timeout del socket a 60 segundos socket.setdefaulttimeout(10) h = urllib2.HTTPHandler(debuglevel=0) request = urllib2.Request(url) for header in headers: logger.info("[downloadtools.py] Header=" + header[0] + ": " + header[1]) request.add_header(header[0], header[1]) if existSize > 0: request.add_header('Range', 'bytes=%d-' % (existSize, )) opener = urllib2.build_opener(h) urllib2.install_opener(opener) try: connexion = opener.open(request) except urllib2.HTTPError, e: logger.info( "[downloadtools.py] downloadfile: error %d (%s) al abrir la url %s" % (e.code, e.msg, url)) #print e.code #print e.msg #print e.hdrs #print e.fp f.close() try: progreso.close() except: pass # El error 416 es que el rango pedido es mayor que el fichero => es que ya está completo if e.code == 416: return 0 else: return -2
def downloadfile(url,nombrefichero,headers=[],silent=False,continuar=False): plugintools.log("[downloadtools.py] downloadfile: url="+url) plugintools.log("[downloadtools.py] downloadfile: nombrefichero="+nombrefichero) try: # Si no es XBMC, siempre a "Silent" try: import xbmcgui except: silent=True # antes #f=open(nombrefichero,"wb") try: import xbmc nombrefichero = xbmc.makeLegalFilename(nombrefichero) except: pass plugintools.log("[downloadtools.py] downloadfile: nombrefichero="+nombrefichero) # El fichero existe y se quiere continuar if os.path.exists(nombrefichero) and continuar: #try: # import xbmcvfs # f = xbmcvfs.File(nombrefichero) # existSize = f.size(nombrefichero) #except: f = open(nombrefichero, 'r+b') existSize = os.path.getsize(nombrefichero) plugintools.log("[downloadtools.py] downloadfile: el fichero existe, size=%d" % existSize) grabado = existSize f.seek(existSize) # el fichero ya existe y no se quiere continuar, se aborta elif os.path.exists(nombrefichero) and not continuar: plugintools.log("[downloadtools.py] downloadfile: el fichero existe, no se descarga de nuevo") return # el fichero no existe else: existSize = 0 plugintools.log("[downloadtools.py] downloadfile: el fichero no existe") #try: # import xbmcvfs # f = xbmcvfs.File(nombrefichero,"w") #except: f = open(nombrefichero, 'wb') grabado = 0 # Crea el diálogo de progreso if not silent: progreso = xbmcgui.DialogProgress() progreso.create( "plugin" , "Descargando..." , url , nombrefichero ) #progreso.create( "plugin" , "Descargando..." , os.path.basename(nombrefichero)+" desde "+urlparse.urlparse(url).hostname ) else: progreso = "" # Login y password Filenium # http://abcd%40gmail.com:[email protected]/get/Oi8vd3d3/LmZpbGVz/ZXJ2ZS5j/b20vZmls/ZS9kTnBL/dm11/b0/?.zip if "filenium" in url: from servers import filenium url , authorization_header = filenium.extract_authorization_header(url) headers.append( [ "Authorization", authorization_header ] ) if "|" in url: additional_headers = url.split("|")[1] if "&" in additional_headers: additional_headers = additional_headers.split("&") else: additional_headers = [ additional_headers ] for additional_header in additional_headers: plugintools.log("[downloadtools.py] additional_header: "+additional_header) name = re.findall( "(.*?)=.*?" , additional_header )[0] value = urllib.unquote_plus(re.findall( ".*?=(.*?)$" , additional_header )[0]) headers.append( [ name,value ] ) url = url.split("|")[0] plugintools.log("[downloadtools.py] downloadfile: url="+url) # Timeout del socket a 60 segundos socket.setdefaulttimeout(60) h=urllib2.HTTPHandler(debuglevel=0) request = urllib2.Request(url) for header in headers: plugintools.log("[downloadtools.py] Header="+header[0]+": "+header[1]) request.add_header(header[0],header[1]) if existSize > 0: request.add_header('Range', 'bytes=%d-' % (existSize, )) opener = urllib2.build_opener(h) urllib2.install_opener(opener) try: connexion = opener.open(request) except urllib2.HTTPError,e: plugintools.log("[downloadtools.py] downloadfile: error %d (%s) al abrir la url %s" % (e.code,e.msg,url)) #print e.code #print e.msg #print e.hdrs #print e.fp f.close() if not silent: progreso.close() # El error 416 es que el rango pedido es mayor que el fichero => es que ya está completo if e.code==416: return 0 else: return -2 try: totalfichero = int(connexion.headers["Content-Length"]) except: totalfichero = 1 if existSize > 0: totalfichero = totalfichero + existSize plugintools.log("Content-Length=%s" % totalfichero) blocksize = 100*1024 bloqueleido = connexion.read(blocksize) plugintools.log("Iniciando descarga del fichero, bloqueleido=%s" % len(bloqueleido)) maxreintentos = 10 while len(bloqueleido)>0: try: # Escribe el bloque leido #try: # import xbmcvfs # f.write( bloqueleido ) #except: f.write(bloqueleido) grabado = grabado + len(bloqueleido) percent = int(float(grabado)*100/float(totalfichero)) totalmb = float(float(totalfichero)/(1024*1024)) descargadosmb = float(float(grabado)/(1024*1024)) # Lee el siguiente bloque, reintentando para no parar todo al primer timeout reintentos = 0 while reintentos <= maxreintentos: try: before = time.time() bloqueleido = connexion.read(blocksize) after = time.time() if (after - before) > 0: velocidad=len(bloqueleido)/((after - before)) falta=totalfichero-grabado if velocidad>0: tiempofalta=falta/velocidad else: tiempofalta=0 #plugintools.log(sec_to_hms(tiempofalta)) if not silent: #progreso.update( percent , "Descargando %.2fMB de %.2fMB (%d%%)" % ( descargadosmb , totalmb , percent),"Falta %s - Velocidad %.2f Kb/s" % ( sec_to_hms(tiempofalta) , velocidad/1024 ), os.path.basename(nombrefichero) ) progreso.update( percent , "%.2fMB/%.2fMB (%d%%) %.2f Kb/s %s falta " % ( descargadosmb , totalmb , percent , velocidad/1024 , sec_to_hms(tiempofalta))) break except: reintentos = reintentos + 1 plugintools.log("ERROR en la descarga del bloque, reintento %d" % reintentos) import traceback plugintools.log( traceback.print_exc() ) # El usuario cancelo la descarga try: if progreso.iscanceled(): plugintools.log("Descarga del fichero cancelada") f.close() progreso.close() return -1 except: pass # Ha habido un error en la descarga if reintentos > maxreintentos: plugintools.log("ERROR en la descarga del fichero") f.close() if not silent: progreso.close() return -2 except: import traceback plugintools.log( traceback.print_exc() ) f.close() if not silent: progreso.close() #advertencia = xbmcgui.Dialog() #resultado = advertencia.ok('Error al descargar' , 'Se ha producido un error' , 'al descargar el archivo') return -2
def download_file(self): headers = [] # Se asegura de que el fichero se podrá crear logger.info("DownloadThread.download_file nombrefichero=" + self.file_name) self.file_name = xbmc.makeLegalFilename(self.file_name) logger.info("DownloadThread.download_file nombrefichero=" + self.file_name) logger.info("DownloadThread.download_file url=" + self.url) # Crea el fichero existSize = 0 f = open(self.file_name, 'wb') grabado = 0 # Login y password Filenium # http://abcd%40gmail.com:[email protected]/get/Oi8vd3d3/LmZpbGVz/ZXJ2ZS5j/b20vZmls/ZS9kTnBL/dm11/b0/?.zip if "filenium" in self.url: from servers import filenium self.url, authorization_header = filenium.extract_authorization_header( self.url) headers.append(["Authorization", authorization_header]) # Interpreta las cabeceras en una URL como en XBMC if "|" in self.url: additional_headers = self.url.split("|")[1] if "&" in additional_headers: additional_headers = additional_headers.split("&") else: additional_headers = [additional_headers] for additional_header in additional_headers: logger.info( "DownloadThread.download_file additional_header: " + additional_header) name = re.findall("(.*?)=.*?", additional_header)[0] value = urllib.unquote_plus( re.findall(".*?=(.*?)$", additional_header)[0]) headers.append([name, value]) self.url = self.url.split("|")[0] logger.info("DownloadThread.download_file url=" + self.url) # Timeout del socket a 60 segundos socket.setdefaulttimeout(60) # Crea la petición y añade las cabeceras h = urllib2.HTTPHandler(debuglevel=0) request = urllib2.Request(self.url) for header in headers: logger.info("DownloadThread.download_file Header=" + header[0] + ": " + header[1]) request.add_header(header[0], header[1]) # Lanza la petición opener = urllib2.build_opener(h) urllib2.install_opener(opener) try: connexion = opener.open(request) except urllib2.HTTPError, e: logger.info( "DownloadThread.download_file error %d (%s) al abrir la url %s" % (e.code, e.msg, self.url)) #print e.code #print e.msg #print e.hdrs #print e.fp f.close() # El error 416 es que el rango pedido es mayor que el fichero => es que ya está completo if e.code == 416: return 0 else: return -2
def get_header_from_response(url,header_to_get="",post=None,headers=[['User-Agent', 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; es-ES; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12']]): header_to_get = header_to_get.lower() if (DEBUG==True): logger.info("[scrapertools.py] get_header_from_response url="+url+", header_to_get="+header_to_get) if post is not None: if (DEBUG==True): logger.info("[scrapertools.py] post="+post) else: if (DEBUG==True): logger.info("[scrapertools.py] post=None") # Inicializa la librería de las cookies ficherocookies = os.path.join( config.get_setting("cookies.dir"), 'cookies.dat' ) if (DEBUG==True): logger.info("[scrapertools.py] ficherocookies="+ficherocookies) cj = None ClientCookie = None cookielib = None import cookielib # importing cookielib worked urlopen = urllib2.urlopen Request = urllib2.Request cj = cookielib.MozillaCookieJar() # This is a subclass of FileCookieJar # that has useful load and save methods if os.path.isfile(ficherocookies): if (DEBUG==True): logger.info("[scrapertools.py] Leyendo fichero cookies") # if we have a cookie file already saved # then load the cookies into the Cookie Jar try: cj.load(ficherocookies) except: if (DEBUG==True): logger.info("[scrapertools.py] El fichero de cookies existe pero es ilegible, se borra") os.remove(ficherocookies) if header_to_get=="location": opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj),NoRedirectHandler()) else: opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) urllib2.install_opener(opener) # Contador inicio = time.clock() # Diccionario para las cabeceras txheaders = {} # Traza la peticion if post is None: if (DEBUG==True): logger.info("[scrapertools.py] petición GET") else: if (DEBUG==True): logger.info("[scrapertools.py] petición POST") # Login y password Filenium # http://abcd%40gmail.com:[email protected]/get/Oi8vd3d3/LmZpbGVz/ZXJ2ZS5j/b20vZmls/ZS9kTnBL/dm11/b0/?.zip if "filenium" in url: from servers import filenium url , authorization_header = filenium.extract_authorization_header(url) headers.append( [ "Authorization",authorization_header ] ) # Array de cabeceras if (DEBUG==True): logger.info("[scrapertools.py] ---------------------------") for header in headers: if (DEBUG==True): logger.info("[scrapertools.py] header=%s" % str(header[0])) txheaders[header[0]]=header[1] if (DEBUG==True): logger.info("[scrapertools.py] ---------------------------") # Construye el request req = Request(url, post, txheaders) handle = urlopen(req) # Actualiza el almacén de cookies cj.save(ficherocookies) # Lee los datos y cierra #data=handle.read() info = handle.info() if (DEBUG==True): logger.info("[scrapertools.py] Respuesta") if (DEBUG==True): logger.info("[scrapertools.py] ---------------------------") location_header="" for header in info: if (DEBUG==True): logger.info("[scrapertools.py] "+header+"="+info[header]) if header==header_to_get: location_header=info[header] handle.close() if (DEBUG==True): logger.info("[scrapertools.py] ---------------------------") # Tiempo transcurrido fin = time.clock() if (DEBUG==True): logger.info("[scrapertools.py] Descargado en %d segundos " % (fin-inicio+1)) return location_header
def downloadfile(url, nombrefichero, headers=[], silent=False, continuar=False): logger.info("[downloadtools.py] downloadfile: url=" + url) logger.info("[downloadtools.py] downloadfile: nombrefichero=" + nombrefichero) try: # Si no es XBMC, siempre a "Silent" try: import xbmcgui except: silent = True # antes #f=open(nombrefichero,"wb") try: import xbmc nombrefichero = xbmc.makeLegalFilename(nombrefichero) except: pass logger.info("[downloadtools.py] downloadfile: nombrefichero=" + nombrefichero) # El fichero existe y se quiere continuar if os.path.exists(nombrefichero) and continuar: #try: # import xbmcvfs # f = xbmcvfs.File(nombrefichero) # existSize = f.size(nombrefichero) #except: f = open(nombrefichero, 'r+b') existSize = os.path.getsize(nombrefichero) logger.info( "[downloadtools.py] downloadfile: el fichero existe, size=%d" % existSize) grabado = existSize f.seek(existSize) # el fichero ya existe y no se quiere continuar, se aborta elif os.path.exists(nombrefichero) and not continuar: logger.info( "[downloadtools.py] downloadfile: el fichero existe, no se descarga de nuevo" ) return # el fichero no existe else: existSize = 0 logger.info( "[downloadtools.py] downloadfile: el fichero no existe") #try: # import xbmcvfs # f = xbmcvfs.File(nombrefichero,"w") #except: f = open(nombrefichero, 'wb') grabado = 0 # Crea el diálogo de progreso if not silent: progreso = xbmcgui.DialogProgress() progreso.create("plugin", "Descargando...", url, nombrefichero) #progreso.create( "plugin" , "Descargando..." , os.path.basename(nombrefichero)+" desde "+urlparse.urlparse(url).hostname ) else: progreso = "" # Login y password Filenium # http://abcd%40gmail.com:[email protected]/get/Oi8vd3d3/LmZpbGVz/ZXJ2ZS5j/b20vZmls/ZS9kTnBL/dm11/b0/?.zip if "filenium" in url: from servers import filenium url, authorization_header = filenium.extract_authorization_header( url) headers.append(["Authorization", authorization_header]) if "|" in url: additional_headers = url.split("|")[1] if "&" in additional_headers: additional_headers = additional_headers.split("&") else: additional_headers = [additional_headers] for additional_header in additional_headers: logger.info("[downloadtools.py] additional_header: " + additional_header) name = re.findall("(.*?)=.*?", additional_header)[0] value = urllib.unquote_plus( re.findall(".*?=(.*?)$", additional_header)[0]) headers.append([name, value]) url = url.split("|")[0] logger.info("[downloadtools.py] downloadfile: url=" + url) # Timeout del socket a 60 segundos socket.setdefaulttimeout(60) h = urllib2.HTTPHandler(debuglevel=0) request = urllib2.Request(url) for header in headers: logger.info("[downloadtools.py] Header=" + header[0] + ": " + header[1]) request.add_header(header[0], header[1]) if existSize > 0: request.add_header('Range', 'bytes=%d-' % (existSize, )) opener = urllib2.build_opener(h) urllib2.install_opener(opener) try: connexion = opener.open(request) except urllib2.HTTPError, e: logger.info( "[downloadtools.py] downloadfile: error %d (%s) al abrir la url %s" % (e.code, e.msg, url)) #print e.code #print e.msg #print e.hdrs #print e.fp f.close() if not silent: progreso.close() # El error 416 es que el rango pedido es mayor que el fichero => es que ya está completo if e.code == 416: return 0 else: return -2 try: totalfichero = int(connexion.headers["Content-Length"]) except: totalfichero = 1 if existSize > 0: totalfichero = totalfichero + existSize logger.info("Content-Length=%s" % totalfichero) blocksize = 100 * 1024 bloqueleido = connexion.read(blocksize) logger.info("Iniciando descarga del fichero, bloqueleido=%s" % len(bloqueleido)) maxreintentos = 10 while len(bloqueleido) > 0: try: # Escribe el bloque leido #try: # import xbmcvfs # f.write( bloqueleido ) #except: f.write(bloqueleido) grabado = grabado + len(bloqueleido) percent = int(float(grabado) * 100 / float(totalfichero)) totalmb = float(float(totalfichero) / (1024 * 1024)) descargadosmb = float(float(grabado) / (1024 * 1024)) # Lee el siguiente bloque, reintentando para no parar todo al primer timeout reintentos = 0 while reintentos <= maxreintentos: try: before = time.time() bloqueleido = connexion.read(blocksize) after = time.time() if (after - before) > 0: velocidad = len(bloqueleido) / ((after - before)) falta = totalfichero - grabado if velocidad > 0: tiempofalta = falta / velocidad else: tiempofalta = 0 #logger.info(sec_to_hms(tiempofalta)) if not silent: #progreso.update( percent , "Descargando %.2fMB de %.2fMB (%d%%)" % ( descargadosmb , totalmb , percent),"Falta %s - Velocidad %.2f Kb/s" % ( sec_to_hms(tiempofalta) , velocidad/1024 ), os.path.basename(nombrefichero) ) progreso.update( percent, "%.2fMB/%.2fMB (%d%%) %.2f Kb/s %s falta " % (descargadosmb, totalmb, percent, velocidad / 1024, sec_to_hms(tiempofalta))) break except: reintentos = reintentos + 1 logger.info( "ERROR en la descarga del bloque, reintento %d" % reintentos) for line in sys.exc_info(): logger.error("%s" % line) # El usuario cancelo la descarga try: if progreso.iscanceled(): logger.info("Descarga del fichero cancelada") f.close() progreso.close() return -1 except: pass # Ha habido un error en la descarga if reintentos > maxreintentos: logger.info("ERROR en la descarga del fichero") f.close() if not silent: progreso.close() return -2 except: import traceback, sys from pprint import pprint exc_type, exc_value, exc_tb = sys.exc_info() lines = traceback.format_exception(exc_type, exc_value, exc_tb) for line in lines: line_splits = line.split("\n") for line_split in line_splits: logger.error(line_split) f.close() if not silent: progreso.close() #advertencia = xbmcgui.Dialog() #resultado = advertencia.ok('Error al descargar' , 'Se ha producido un error' , 'al descargar el archivo') return -2
def get_header_from_response( url, header_to_get="", post=None, headers=[[ 'User-Agent', 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; es-ES; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12' ]]): header_to_get = header_to_get.lower() logger.info("[scrapertools.py] get_header_from_response url=" + url + ", header_to_get=" + header_to_get) if post is not None: logger.info("[scrapertools.py] post=" + post) else: logger.info("[scrapertools.py] post=None") # Inicializa la librería de las cookies ficherocookies = os.path.join(config.get_setting("cookies.dir"), 'cookies.dat') logger.info("[scrapertools.py] ficherocookies=" + ficherocookies) cj = None ClientCookie = None cookielib = None import cookielib # importing cookielib worked urlopen = urllib2.urlopen Request = urllib2.Request cj = cookielib.MozillaCookieJar() # This is a subclass of FileCookieJar # that has useful load and save methods if os.path.isfile(ficherocookies): logger.info("[scrapertools.py] Leyendo fichero cookies") # if we have a cookie file already saved # then load the cookies into the Cookie Jar try: cj.load(ficherocookies) except: logger.info( "[scrapertools.py] El fichero de cookies existe pero es ilegible, se borra" ) os.remove(ficherocookies) if header_to_get == "location": opener = urllib2.build_opener( urllib2.HTTPHandler(debuglevel=DEBUG_LEVEL), urllib2.HTTPCookieProcessor(cj), NoRedirectHandler()) else: opener = urllib2.build_opener( urllib2.HTTPHandler(debuglevel=DEBUG_LEVEL), urllib2.HTTPCookieProcessor(cj)) urllib2.install_opener(opener) # Contador inicio = time.clock() # Diccionario para las cabeceras txheaders = {} # Traza la peticion if post is None: logger.info("[scrapertools.py] petición GET") else: logger.info("[scrapertools.py] petición POST") # Login y password Filenium # http://abcd%40gmail.com:[email protected]/get/Oi8vd3d3/LmZpbGVz/ZXJ2ZS5j/b20vZmls/ZS9kTnBL/dm11/b0/?.zip if "filenium" in url: from servers import filenium url, authorization_header = filenium.extract_authorization_header(url) headers.append(["Authorization", authorization_header]) # Array de cabeceras logger.info("[scrapertools.py] ---------------------------") for header in headers: logger.info("[scrapertools.py] header=%s" % str(header[0])) txheaders[header[0]] = header[1] logger.info("[scrapertools.py] ---------------------------") # Construye el request req = Request(url, post, txheaders) handle = urlopen(req) # Actualiza el almacén de cookies cj.save(ficherocookies) # Lee los datos y cierra #data=handle.read() info = handle.info() logger.info("[scrapertools.py] Respuesta") logger.info("[scrapertools.py] ---------------------------") location_header = "" for header in info: logger.info("[scrapertools.py] " + header + "=" + info[header]) if header == header_to_get: location_header = info[header] handle.close() logger.info("[scrapertools.py] ---------------------------") # Tiempo transcurrido fin = time.clock() logger.info("[scrapertools.py] Descargado en %d segundos " % (fin - inicio + 1)) return location_header
def downloadfile(url,nombrefichero,headers=[]): logger.info("[downloadtools.py] downloadfile: url="+url) logger.info("[downloadtools.py] downloadfile: nombrefichero="+nombrefichero) # antes #f=open(nombrefichero,"wb") try: import xbmc nombrefichero = xbmc.makeLegalFilename(nombrefichero) except: pass logger.info("[downloadtools.py] downloadfile: nombrefichero="+nombrefichero) # despues if os.path.exists(nombrefichero): f = open(nombrefichero, 'r+b') existSize = os.path.getsize(nombrefichero) logger.info("[downloadtools.py] downloadfile: el fichero existe, size=%d" % existSize) grabado = existSize f.seek(existSize) else: existSize = 0 logger.info("[downloadtools.py] downloadfile: el fichero no existe") f = open(nombrefichero, 'wb') grabado = 0 # Crea el diálogo de progreso try: import xbmcgui progreso = xbmcgui.DialogProgress() progreso.create( "plugin" , "Descargando..." , url , nombrefichero ) #progreso.create( "plugin" , "Descargando..." , os.path.basename(nombrefichero)+" desde "+urlparse.urlparse(url).hostname ) except: progreso = "" # Login y password Filenium # http://abcd%40gmail.com:[email protected]/get/Oi8vd3d3/LmZpbGVz/ZXJ2ZS5j/b20vZmls/ZS9kTnBL/dm11/b0/?.zip if "filenium" in url: from servers import filenium url , authorization_header = filenium.extract_authorization_header(url) headers.append( [ "Authorization", authorization_header ] ) # Timeout del socket a 60 segundos socket.setdefaulttimeout(10) h=urllib2.HTTPHandler(debuglevel=0) request = urllib2.Request(url) for header in headers: logger.info("[downloadtools.py] Header="+header[0]+": "+header[1]) request.add_header(header[0],header[1]) if existSize > 0: request.add_header('Range', 'bytes=%d-' % (existSize, )) opener = urllib2.build_opener(h) urllib2.install_opener(opener) try: connexion = opener.open(request) except urllib2.HTTPError,e: logger.info("[downloadtools.py] downloadfile: error %d (%s) al abrir la url %s" % (e.code,e.msg,url)) #print e.code #print e.msg #print e.hdrs #print e.fp f.close() try: progreso.close() except: pass # El error 416 es que el rango pedido es mayor que el fichero => es que ya está completo if e.code==416: return 0 else: return -2
def download_file(self): headers=[] # Se asegura de que el fichero se podrá crear logger.info("DownloadThread.download_file nombrefichero="+self.file_name) self.file_name = xbmc.makeLegalFilename(self.file_name) logger.info("DownloadThread.download_file nombrefichero="+self.file_name) logger.info("DownloadThread.download_file url="+self.url) # Crea el fichero existSize = 0 f = open(self.file_name, 'wb') grabado = 0 # Login y password Filenium # http://abcd%40gmail.com:[email protected]/get/Oi8vd3d3/LmZpbGVz/ZXJ2ZS5j/b20vZmls/ZS9kTnBL/dm11/b0/?.zip if "filenium" in self.url: from servers import filenium self.url , authorization_header = filenium.extract_authorization_header(self.url) headers.append( [ "Authorization", authorization_header ] ) # Interpreta las cabeceras en una URL como en XBMC if "|" in self.url: additional_headers = self.url.split("|")[1] if "&" in additional_headers: additional_headers = additional_headers.split("&") else: additional_headers = [ additional_headers ] for additional_header in additional_headers: logger.info("DownloadThread.download_file additional_header: "+additional_header) name = re.findall( "(.*?)=.*?" , additional_header )[0] value = urllib.unquote_plus(re.findall( ".*?=(.*?)$" , additional_header )[0]) headers.append( [ name,value ] ) self.url = self.url.split("|")[0] logger.info("DownloadThread.download_file url="+self.url) # Timeout del socket a 60 segundos socket.setdefaulttimeout(60) # Crea la petición y añade las cabeceras h=urllib2.HTTPHandler(debuglevel=0) request = urllib2.Request(self.url) for header in headers: logger.info("DownloadThread.download_file Header="+header[0]+": "+header[1]) request.add_header(header[0],header[1]) # Lanza la petición opener = urllib2.build_opener(h) urllib2.install_opener(opener) try: connexion = opener.open(request) except urllib2.HTTPError,e: logger.info("DownloadThread.download_file error %d (%s) al abrir la url %s" % (e.code,e.msg,self.url)) #print e.code #print e.msg #print e.hdrs #print e.fp f.close() # El error 416 es que el rango pedido es mayor que el fichero => es que ya está completo if e.code==416: return 0 else: return -2