def por_tecleado(item): logger.info("[buscador.py] por_tecleado") import time tecleado =item.url itemlist = [] salvar_busquedas(item) channels = channelselector.listchannels(Item(category="")) channels.remove(channels[0]) from threading import Thread from core import guitools progreso = guitools.Dialog_Progress("Buscador","Buscando '"+item.url+"'") x = 0 for channel in channels: x+=1 IndexConfig, ConfigCanales = ExtraerIndice(channel.channel) if ConfigCanales[IndexConfig].split(",")[1] == "1": if config.get_setting("buscador_multithread") =="1": Trd = Thread(target=buscar,args=[itemlist,channel,tecleado]) progreso.Actualizar(x*100/len(channels),"Lanzando búsqueda: '"+item.url+"' \nEn canal: "+channel.channel) Trd.setDaemon(True) Threads[Trd.name] =None Trd.start() if progreso.IsCanceled(): break else: Inicio = time.time() progreso.Actualizar(x*100/len(channels),"Buscando: '"+item.url+"' \nEn canal: "+channel.channel) buscar(itemlist, channel, tecleado) GuardarTiempo(channel.channel, time.time()-Inicio) if progreso.IsCanceled(): break time.sleep(0.5) if config.get_setting("buscador_multithread") =="1": Pendientes = [] for busqueda in Threads: if Threads[busqueda]["Tiempo"] ==None: Pendientes.append(busqueda) while len(Pendientes): Pend = Pendientes for pendiente in Pend: if not Threads[pendiente]["Tiempo"] ==None or time.time() - Threads[pendiente]["Inicio"] > 10: Threads[pendiente]["Tiempo"] = 10 Pendientes.remove(pendiente) progreso.Actualizar(100,"Esperando resultados de: "+str(len(Pendientes)) + " canales") if progreso.IsCanceled(): break for busqueda in Threads: GuardarTiempo(Threads[busqueda]["Canal"], Threads[busqueda]["Tiempo"]) itemlist.sort(key=lambda item: item.title.lower().strip()) progreso.Cerrar() return itemlist
def resolve_video_urls_for_playing(server,url,video_password="",muestra_dialogo=False): logger.info("[servertools.py] resolve_video_urls_for_playing, server="+server+", url="+url) video_urls = [] torrent = False server = server.lower() # Si el vídeo es "directo", no hay que buscar más if server=="directo" or server=="local": logger.info("[servertools.py] server=directo, la url es la buena") try: import urlparse parsed_url = urlparse.urlparse(url) logger.info("parsed_url="+str(parsed_url)) extension = parsed_url.path[-4:] except: extension = url[-4:] video_urls = [[ "%s [%s]" % (extension,server) , url ]] return video_urls,True,"" # Averigua las URL de los vídeos else: #if server=="torrent": # server="filenium" # torrent = True # Carga el conector try: # Muestra un diálogo de progreso if muestra_dialogo: from core import guitools progreso = guitools.Dialog_Progress("pelisalacarta" , "Conectando con "+server) # Sustituye el código por otro "Plex compatible" #exec "from servers import "+server+" as server_connector" servers_module = __import__("servers."+server) server_connector = getattr(servers_module,server) logger.info("[servertools.py] servidor de "+server+" importado") if muestra_dialogo: progreso.Actualizar( 20 , "Conectando con "+server) # Si tiene una función para ver si el vídeo existe, lo comprueba ahora if hasattr(server_connector, 'test_video_exists'): logger.info("[servertools.py] invocando a "+server+".test_video_exists") puedes,motivo = server_connector.test_video_exists( page_url=url ) # Si la funcion dice que no existe, fin if not puedes: logger.info("[servertools.py] test_video_exists dice que el video no existe") if muestra_dialogo: progreso.Cerrar() return video_urls,puedes,motivo else: logger.info("[servertools.py] test_video_exists dice que el video SI existe") # Obtiene enlaces free if server in FREE_SERVERS: logger.info("[servertools.py] invocando a "+server+".get_video_url") video_urls = server_connector.get_video_url( page_url=url , video_password=video_password ) # Si no se encuentran vídeos en modo free, es porque el vídeo no existe if len(video_urls)==0: if muestra_dialogo: progreso.Cerrar() return video_urls,False,"No se puede encontrar el vídeo en "+server # Obtiene enlaces premium si tienes cuenta en el server if server in PREMIUM_SERVERS and config.get_setting(server+"premium")=="true": video_urls = server_connector.get_video_url( page_url=url , premium=(config.get_setting(server+"premium")=="true") , user=config.get_setting(server+"user") , password=config.get_setting(server+"password"), video_password=video_password ) # Si no se encuentran vídeos en modo premium directo, es porque el vídeo no existe if len(video_urls)==0: if muestra_dialogo: progreso.Cerrar() return video_urls,False,"No se puede encontrar el vídeo en "+server # Obtiene enlaces filenium si tienes cuenta if server in FILENIUM_SERVERS and config.get_setting("fileniumpremium")=="true": # Muestra un diálogo de progreso if muestra_dialogo: progreso.Actualizar( 40 , "Conectando con Filenium") from servers import filenium as gen_conector video_gen = gen_conector.get_video_url( page_url=url , premium=(config.get_setting("fileniumpremium")=="true") , user=config.get_setting("fileniumuser") , password=config.get_setting("fileniumpassword"), video_password=video_password ) extension = gen_conector.get_file_extension(video_gen) logger.info("[xbmctools.py] filenium url="+video_gen) video_urls.append( [ extension+" ["+server+"][filenium]", video_gen ] ) # Obtiene enlaces realdebrid si tienes cuenta if server in REALDEBRID_SERVERS and config.get_setting("realdebridpremium")=="true": # Muestra un diálogo de progreso if muestra_dialogo: progreso.Actualizar( 60 , "Conectando con Real-Debrid") from servers import realdebrid as gen_conector video_gen = gen_conector.get_video_url( page_url=url , premium=(config.get_setting("realdebridpremium")=="true") , user=config.get_setting("realdebriduser") , password=config.get_setting("realdebridpassword"), video_password=video_password ) logger.info("[xbmctools.py] realdebrid url="+video_gen) if not "REAL-DEBRID" in video_gen: video_urls.append( [ "."+video_gen.rsplit('.',1)[1]+" [realdebrid]", video_gen ] ) else: if muestra_dialogo: progreso.Cerrar() # Si RealDebrid da error pero tienes un enlace válido, no te dice nada if len(video_urls)==0: return video_urls,False,video_gen # Obtiene enlaces alldebrid si tienes cuenta if server in ALLDEBRID_SERVERS and config.get_setting("alldebridpremium")=="true": # Muestra un diálogo de progreso if muestra_dialogo: progreso.Actualizar( 80 , "Conectando con All-Debrid") from servers import alldebrid as gen_conector video_gen = gen_conector.get_video_url( page_url=url , premium=(config.get_setting("alldebridpremium")=="true") , user=config.get_setting("alldebriduser") , password=config.get_setting("alldebridpassword"), video_password=video_password ) logger.info("[xbmctools.py] alldebrid url="+video_gen) if video_gen.startswith("http"): video_urls.append( [ "."+video_gen.rsplit('.',1)[1]+" [alldebrid]", video_gen ] ) else: # Si Alldebrid da error pero tienes un enlace válido, no te dice nada if len(video_urls)==0: return [],False,video_gen.strip() if muestra_dialogo: progreso.Actualizar( 100 , "Proceso finalizado") # Cierra el diálogo de progreso if muestra_dialogo: progreso.Cerrar() # Llegas hasta aquí y no tienes ningún enlace para ver, así que no vas a poder ver el vídeo if len(video_urls)==0: # ¿Cual es el motivo? # 1) No existe -> Ya está controlado # 2) No tienes alguna de las cuentas premium compatibles # Lista de las cuentas que soportan este servidor listapremium = "" if server in ALLDEBRID_SERVERS: listapremium+="All-Debrid o " if server in FILENIUM_SERVERS: listapremium+="Filenium o " if server in REALDEBRID_SERVERS: listapremium+="Real-Debrid o " if server in PREMIUM_SERVERS: listapremium+=server+" o " listapremium = listapremium[:-3] return video_urls,False,"Para ver un vídeo en "+server+" necesitas<br/>una cuenta en "+listapremium except: if muestra_dialogo: progreso.Cerrar() import traceback 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) return video_urls,False,"Se ha producido un error en<br/>el conector con "+server return video_urls,True,""
def download_all_episodes(item): from servers import servertools from core import downloadtools from core import scrapertools # Esto es poco elegante... # Esta marca es porque el item tiene algo más aparte en el atributo "extra" if item.extra: action = item.extra if item.refered_action: action = item.refered_action if "###" in action: item.extra = action.split("###")[1] action = action.split("###")[0] #Importamos el canal channel = ImportarCanal(item.channel) #Ejecutamos la funcion exec "itemlist = channel." + action + "(item)" #Quitamos estos dos elementos de la lista (si los hay) for episodio in itemlist: if episodio.action == "add_serie_to_library" or episodio.action == "download_all_episodes": itemlist.remove(episodio) #Abrimos el dialogo pDialog = guitools.Dialog_Progress('pelisalacarta', 'Descargando ' + item.show) for x, episodio in enumerate(itemlist): #Si se presiona cancelar, se cancela if pDialog.iscanceled(): return #Extraemos la Temporada y el Episodio episodio.title = scrapertools.get_season_and_episode(episodio.title) #Actualizamos el progreso pDialog.Actualizar(((x) * 100) / len(itemlist), 'Descargando ' + item.show, 'Descargando episodio: ' + episodio.title) # Extrae los mirrors if hasattr(channel, 'findvideos'): mirrors_itemlist = channel.findvideos(episodio) else: mirrors_itemlist = findvideos(episodio, episodio.channel) descargado = False #Descarga el primer mirror que funcione for mirror_item in mirrors_itemlist: if hasattr(channel, 'play'): video_items = channel.play(mirror_item) else: video_items = [mirror_item] if len(video_items) > 0: video_item = video_items[0] # Comprueba que esté disponible video_urls, puedes, motivo = servertools.resolve_video_urls_for_playing( video_item.server, video_item.url, video_password="", muestra_dialogo=False) # Lo descarga if puedes: # El vídeo de más calidad es el último devuelve = downloadtools.downloadbest( video_urls, item.show + " " + episodio.title + " [" + video_item.server + "]", continuar=False) if devuelve == 0: logger.info( "[launcher.py] download_all_episodes - Archivo Descargado" ) descargado = True break elif devuelve == -1: pDialog.Cerrar() logger.info( "[launcher.py] download_all_episodes - Descarga abortada" ) guitools.Dialog_OK("pelisalacarta", "La descarga ha sido cancelada") return else: continue pDialog.Cerrar()