Ejemplo n.º 1
0
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
Ejemplo n.º 2
0
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,""
Ejemplo n.º 3
0
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()