Пример #1
0
def CreateServersIndex():
    logger.info("Creando indice de servers")
    import hashlib
    JSONData=[]
    for server in os.listdir(os.path.join(config.get_runtime_path() ,"servers","")):
      server = os.path.join(os.path.join(config.get_runtime_path() ,"servers",server))
      if server.endswith(".py"):
          serverdata = open(server, 'rb').read().replace("\r\n","\n")
          JSONServer={}
          JSONServer["name"] = os.path.basename(server)
          JSONServer["size"] = len(serverdata)
          path = os.path.dirname(config.get_runtime_path())
          if not path.endswith(os.sep): path +=os.sep
          JSONServer["path"] = "/".join(server.replace(path,"",1).split(os.sep))
          JSONServer["url"] = "https://api.github.com/repos/divadres/pelisalacarta/contents/" +JSONServer["path"] +"?ref=" + branch
          JSONServer["type"] = "file"
          JSONServer["sha"] =  hashlib.sha1("blob " + str(JSONServer["size"]) + "\0" + serverdata).hexdigest()
          JSONServer["download_url"] = "https://raw.githubusercontent.com/divadres/pelisalacarta/"+ branch + "/" + JSONServer["path"] 
          JSONServer["git_url"] = "https://api.github.com/repos/divadres/pelisalacarta/git/blobs/" + JSONServer["sha"]
          JSONServer["html_url"] = "https://github.com/divadres/pelisalacarta/blob/"+ branch + "/"+ JSONServer["path"]
          JSONServer["_links"]={}
          JSONServer["_links"]["git"] = JSONServer["git_url"]
          JSONServer["_links"]["html"] = JSONServer["html_url"]
          JSONServer["_links"]["self"] = JSONServer["url"] 
          JSONData.append(JSONServer)
    JSONData.sort(key=lambda item: item["name"])
    open(serverspath,"w").write(json.dumps(JSONData, indent=4, sort_keys=True))
def updatechannel(channel_name):
    '''
    Funcion experimental para actualizar el canal desde github basandose en la fecha de modificacion de los archivos.
    '''
    if channel_name == "channelselector":
        remote_files_url = "https://github.com/superberny70/plugin.video.pelisalacarta"
        local_files_path=os.path.join( config.get_runtime_path() , channel_name+'.py')
    else:
        remote_files_url = "https://github.com/superberny70/plugin.video.pelisalacarta/tree/master/pelisalacarta/channels"
        local_files_path=os.path.join( config.get_runtime_path(), PLUGIN_NAME , 'channels' , channel_name + '.py')
     
    data = re.sub(r"\n|\r|\t|\s{2}|(<!--.*?-->)","",scrapertools.cache_page(remote_files_url))
    #last_commit= scrapertools.find_single_match(data,'<time class="updated" datetime="([^"]+)"')
    
    patron = '<td class="content">.*?title="'+ channel_name +'\.py".*?' 
    patron += '<time datetime="([^"]+)"' # date_time
    
    date= scrapertools.find_single_match(data,patron).replace('T',' ').replace('Z','')
    
    if date =='': # El canal no esta en el repositorio remoto
        return False
        
    struct= time.strptime(date,'%Y-%m-%d %H:%M:%S')    
    dt_remote = datetime.datetime.fromtimestamp(time.mktime(struct))
    
    if os.path.exists(local_files_path):
        dt_local =datetime.datetime.fromtimestamp(os.path.getmtime (local_files_path))
    
    #logger.info("[updater.py] remote_data= "+str(dt_remote) + " local_data= " + str(dt_local ))
    if dt_remote > dt_local:
        dialogo('Actualizando canal', 'Actualizando canal ' + channel_name )
        return download_channel(channel_name)
        
    return False
def get_channel_parameters(channel_name):
    #logger.info("streamondemand.core.channeltools get_channel_parameters channel_name="+channel_name)

    channel_xml = os.path.join(config.get_runtime_path(), 'channels', channel_name+".xml")

    if os.path.exists(channel_xml):
        # logger.info("channel_name+".xml found")

        infile = open(channel_xml, "rb")
        data = infile.read()
        infile.close()

        channel_parameters = dict()
        channel_parameters["title"] = scrapertools.find_single_match(data, "<name>([^<]*)</name>")
        channel_parameters["channel"] = scrapertools.find_single_match(data, "<id>([^<]*)</id>")
        channel_parameters["active"] = scrapertools.find_single_match(data, "<active>([^<]*)</active>")
        channel_parameters["adult"] = scrapertools.find_single_match(data, "<adult>([^<]*)</adult>")
        channel_parameters["language"] = scrapertools.find_single_match(data, "<language>([^<]*)</language>")
        # Imagenes: se admiten url y archivos locales dentro de "resources/images"
        channel_parameters["thumbnail"] = scrapertools.find_single_match(data, "<thumbnail>([^<]*)</thumbnail>")
        channel_parameters["bannermenu"] = scrapertools.find_single_match(data, "<bannermenu>([^<]*)</bannermenu>")
        channel_parameters["fanart"] = scrapertools.find_single_match(data, "<fanart>([^<]*)</fanart>")
        channel_parameters["update_url"] = scrapertools.find_single_match(data, "<update_url>([^<]*)</update_url>")

        if channel_parameters["thumbnail"] and "://" not in channel_parameters["thumbnail"]:
            channel_parameters["thumbnail"] = os.path.join(config.get_runtime_path(), "resources", "images", "squares",
                                                           channel_parameters["thumbnail"])
        if channel_parameters["bannermenu"] and "://" not in channel_parameters["bannermenu"]:
            channel_parameters["bannermenu"] = os.path.join(config.get_runtime_path(), "resources", "images",
                                                            "bannermenu", channel_parameters["bannermenu"])
        if channel_parameters["fanart"] and "://" not in channel_parameters["fanart"]:
            channel_parameters["fanart"] = os.path.join(config.get_runtime_path(), "resources", "images", "fanart",
                                                        channel_parameters["fanart"])

        if channel_parameters["update_url"]=="":
            channel_parameters["update_url"] = DEFAULT_UPDATE_URL

        channel_parameters["include_in_global_search"] = scrapertools.find_single_match(
            data, "<include_in_global_search>([^<]*)</include_in_global_search>")

        category_list = []
        matches = scrapertools.find_multiple_matches(data, "<category>([^<]*)</category>")
        for match in matches:
            category_list.append(match)

        channel_parameters["categories"] = category_list

        logger.info(channel_name+" -> "+repr(channel_parameters))

    else:
        logger.info(channel_name+".xml NOT found")

        channel_parameters = dict()
        channel_parameters["adult"] = "false"
        channel_parameters["update_url"] = DEFAULT_UPDATE_URL

    return channel_parameters
Пример #4
0
def get_server_local_path(server_name):
    local_server_path = os.path.join(config.get_runtime_path(), 'servers', server_name + ".py")
    local_version_path = os.path.join(config.get_runtime_path(), 'servers', server_name + ".xml")
    local_compiled_path = os.path.join(config.get_runtime_path(), 'servers', server_name + ".pyo")

    logger.info("fusionse.core.updater local_servers_path=" + local_server_path)
    logger.info("fusionse.core.updater local_version_path=" + local_version_path)
    logger.info("fusionse.core.updater local_compiled_path=" + local_compiled_path)

    return local_server_path, local_version_path, local_compiled_path
def get_path_url_channel(channel_name):
    if channel_name == "channelselector":
        #remote_files_url= URL_BASE_REPOSITORIO + '/' + channel_name
        remote_files_url="https://raw.githubusercontent.com/superberny70/plugin.video.pelisalacarta/master/channelselector.py"
        local_files_path=os.path.join( config.get_runtime_path() , channel_name)
    else:
        #remote_files_url= URL_BASE_REPOSITORIO + '/' + PLUGIN_NAME + '/' + "channels" + '/' + channel_name  
        remote_files_url = "https://raw.githubusercontent.com/superberny70/plugin.video.pelisalacarta/master/pelisalacarta/channels/" +  channel_name 
        local_files_path=os.path.join( config.get_runtime_path(), PLUGIN_NAME , 'channels' , channel_name)
    return remote_files_url, local_files_path
def get_path_url_channel(channel_name):
    if channel_name == "channelselector":
        #remote_files_url= URL_BASE_REPOSITORIO + '/' + channel_name
        remote_files_url = "https://raw.githubusercontent.com/superberny70/plugin.video.pelisalacarta/master/channelselector.py"
        local_files_path = os.path.join(config.get_runtime_path(),
                                        channel_name)
    else:
        #remote_files_url= URL_BASE_REPOSITORIO + '/' + PLUGIN_NAME + '/' + "channels" + '/' + channel_name
        remote_files_url = "https://raw.githubusercontent.com/superberny70/plugin.video.pelisalacarta/master/pelisalacarta/channels/" + channel_name
        local_files_path = os.path.join(config.get_runtime_path(), PLUGIN_NAME,
                                        'channels', channel_name)
    return remote_files_url, local_files_path
Пример #7
0
def update(item):
    logger.info("Actualizando plugin...")

    LOCAL_FILE = os.path.join(config.get_runtime_path(), "..",
                              "pelisalacarta-" + item.url + ".zip")
    REMOTE_FILE = downloadurl + "/update/pelisalacarta-mediaserver-" + item.url + ".zip"
    DESTINATION_FOLDER = os.path.join(config.get_runtime_path(), "..")

    logger.info("Archivo Remoto: " + REMOTE_FILE)
    logger.info("Archivo Local: " + LOCAL_FILE)

    from core import downloadtools
    if os.path.isfile(LOCAL_FILE):
        os.remove(LOCAL_FILE)
    ret = downloadtools.downloadfile(REMOTE_FILE, LOCAL_FILE)
    if ret is None:
        logger.info("Descomprimiendo fichero...")
        import ziptools
        unzipper = ziptools.ziptools()
        logger.info("Destino: " + DESTINATION_FOLDER)

        if os.path.isfile(channelspath): os.remove(channelspath)
        if os.path.isfile(serverspath): os.remove(serverspath)
        if os.path.isfile(lastupdatepath): os.remove(lastupdatepath)

        import shutil
        for file in os.listdir(
                os.path.join(DESTINATION_FOLDER, "pelisalacarta")):
            if not file in [".", ".."]:
                if os.path.isdir(
                        os.path.join(DESTINATION_FOLDER, "pelisalacarta",
                                     file)):
                    shutil.rmtree(
                        os.path.join(DESTINATION_FOLDER, "pelisalacarta",
                                     file))
                if os.path.isfile(
                        os.path.join(DESTINATION_FOLDER, "pelisalacarta",
                                     file)):
                    os.remove(
                        os.path.join(DESTINATION_FOLDER, "pelisalacarta",
                                     file))
                pass

        unzipper.extract(LOCAL_FILE, DESTINATION_FOLDER)
        os.remove(LOCAL_FILE)
        guitools.Dialog_OK(
            "Actualizacion",
            "Pelisalacarta se reiniciara\nEspera 20 segundos y actualiza la página."
        )
        os._exit(0)
    else:
        guitools.Dialog_OK("Actualizacion",
                           "Se ha producido un error al descargar el archivo")
Пример #8
0
def get_channel_parameters(channel_name):
    # logger.info("channel_name="+channel_name)

    channel_xml = os.path.join(config.get_runtime_path(), 'channels', channel_name+".xml")

    if os.path.exists(channel_xml):
        # logger.info("channel_name+".xml found")

        infile = open(channel_xml, "rb")
        data = infile.read()
        infile.close()

        channel_parameters = dict()
        channel_parameters["title"] = scrapertools.find_single_match(data, "<name>([^<]*)</name>")
        channel_parameters["channel"] = scrapertools.find_single_match(data, "<id>([^<]*)</id>")
        channel_parameters["active"] = scrapertools.find_single_match(data, "<active>([^<]*)</active>")
        channel_parameters["adult"] = scrapertools.find_single_match(data, "<adult>([^<]*)</adult>")
        channel_parameters["language"] = scrapertools.find_single_match(data, "<language>([^<]*)</language>")
        # Imagenes: se admiten url y archivos locales dentro de "resources/images"
        channel_parameters["thumbnail"] = scrapertools.find_single_match(data, "<thumbnail>([^<]*)</thumbnail>")
        channel_parameters["bannermenu"] = scrapertools.find_single_match(data, "<bannermenu>([^<]*)</bannermenu>")
        channel_parameters["fanart"] = scrapertools.find_single_match(data, "<fanart>([^<]*)</fanart>")

        if channel_parameters["thumbnail"] and "://" not in channel_parameters["thumbnail"]:
            channel_parameters["thumbnail"] = os.path.join(config.get_runtime_path(), "resources", "images", "squares",
                                                           channel_parameters["thumbnail"])
        if channel_parameters["bannermenu"] and "://" not in channel_parameters["bannermenu"]:
            channel_parameters["bannermenu"] = os.path.join(config.get_runtime_path(), "resources", "images",
                                                            "bannermenu", channel_parameters["bannermenu"])
        if channel_parameters["fanart"] and "://" not in channel_parameters["fanart"]:
            channel_parameters["fanart"] = os.path.join(config.get_runtime_path(), "resources", "images", "fanart",
                                                        channel_parameters["fanart"])
        channel_parameters["include_in_global_search"] = scrapertools.find_single_match(
            data, "<include_in_global_search>([^<]*)</include_in_global_search>")

        category_list = []
        matches = scrapertools.find_multiple_matches(data, "<category>([^<]*)</category>")
        for match in matches:
            category_list.append(match)

        channel_parameters["categories"] = category_list

        logger.info(channel_name+" -> "+repr(channel_parameters))

    else:
        logger.info(channel_name+".xml NOT found")

        channel_parameters = dict()
        channel_parameters["adult"] = "false"

    return channel_parameters
Пример #9
0
def download_and_install(remote_file_name, local_file_name):
    logger.info("from " + remote_file_name + " to " + local_file_name)

    if os.path.exists(local_file_name):
        os.remove(local_file_name)

    # Descarga el fichero
    inicio = time.clock()
    from core import downloadtools
    downloadtools.downloadfile(remote_file_name,
                               local_file_name,
                               continuar=False)
    fin = time.clock()
    logger.info("Descargado en %d segundos " % (fin - inicio + 1))

    logger.info("descomprime fichero...")
    import ziptools
    unzipper = ziptools.ziptools()

    # Lo descomprime en "addons" (un nivel por encima del plugin)
    installation_target = os.path.join(config.get_runtime_path(), "..")
    logger.info("installation_target=%s" % installation_target)

    unzipper.extract(local_file_name, installation_target)

    # Borra el zip descargado
    logger.info("borra fichero...")
    os.remove(local_file_name)
    logger.info("...fichero borrado")
Пример #10
0
def get_server_local_path(server_name):
    local_server_path = os.path.join(config.get_runtime_path(), 'servers',
                                     server_name + ".py")
    local_version_path = os.path.join(config.get_runtime_path(), 'servers',
                                      server_name + ".xml")
    local_compiled_path = os.path.join(config.get_runtime_path(), 'servers',
                                       server_name + ".pyo")

    logger.info("streamondemand.core.updater local_servers_path=" +
                local_server_path)
    logger.info("streamondemand.core.updater local_version_path=" +
                local_version_path)
    logger.info("streamondemand.core.updater local_compiled_path=" +
                local_compiled_path)

    return local_server_path, local_version_path, local_compiled_path
Пример #11
0
def get_channel_parameters(channel_name):
    logger.info("pelisalacarta.core.channeltools get_channel_parameters channel_name="+channel_name)

    channel_xml = os.path.join( config.get_runtime_path() , 'channels' , channel_name+".xml" )

    if os.path.exists(channel_xml):
        logger.info("pelisalacarta.core.channeltools get_channel_parameters "+channel_name+".xml found")

        infile = open( channel_xml , "rb" )
        data = infile.read()
        infile.close();

        # TODO: Pendiente del json :)
        channel_parameters = {}
        channel_parameters["category"] = re.compile("<category>([^<]*)</category>",re.DOTALL).findall(data)
        channel_parameters["title"] = scrapertools.find_single_match(data,"<name>([^<]*)</name>")
        channel_parameters["channel"] = scrapertools.find_single_match(data,"<id>([^<]*)</id>")
        channel_parameters["active"] = scrapertools.find_single_match(data,"<active>([^<]*)</active>")
        channel_parameters["adult"] = scrapertools.find_single_match(data,"<adult>([^<]*)</adult>")
        channel_parameters["language"] = scrapertools.find_single_match(data,"<language>([^<]*)</language>")
        channel_parameters["thumbnail"] = scrapertools.find_single_match(data,"<thumbnail>([^<]*)</thumbnail>")
        channel_parameters["fanart"] = scrapertools.find_single_match(data,"<fanart>([^<]*)</fanart>")
        channel_parameters["type"] = "generic"

        logger.info("pelisalacarta.core.channeltools get_channel_parameters channel_parameters="+repr(channel_parameters) )

    else:
        logger.info("pelisalacarta.core.channeltools get_channel_parameters "+channel_name+".xml NOT found")

        channel_parameters = {}
        channel_parameters["adult"] = "false"

    return channel_parameters
def checkforupdates():
    '''
    Comprueba si hay una nueva version del plugin
    Retorna un lista de items con un solo item si hay nueva version o vacia si no la hay.
    '''
    logger.info("[updater.py] checkforupdates")
    itemlist = []
    data = scrapertools.cachePage(REMOTE_VERSION_FILE)
    patron = '<tag>([^<]+)</tag>'
    matches = re.compile(patron, re.DOTALL).findall(data)
    versiondescargada = matches[0]
    archivo = open(os.path.join(config.get_runtime_path(), "version.xml"))
    data = archivo.read()
    archivo.close()
    matches = re.compile(patron, re.DOTALL).findall(data)
    versionlocal = matches[0]

    if StrictVersion(versiondescargada) > StrictVersion(versionlocal):
        itemlist.append(
            Item(title="Descargar version " + versiondescargada,
                 channel="updater",
                 url=versiondescargada,
                 action="update",
                 thumbnail=channelselector.get_thumbnail_path() +
                 "Crystal_Clear_action_info.png"))

    return itemlist
Пример #13
0
def Dialog_Select(title, opciones):  #----------------------------------OK
    import ui
    resultado = ui.SelectWindow("ListDialog.xml",
                                config.get_runtime_path()).setOptions(
                                    title, opciones)
    if resultado == -1: resultado = None
    return resultado
def checkforupdates():
    """
    Comprueba si hay una nueva version del plugin
    Retorna un lista de items con un solo item si hay nueva version o vacia si no la hay.
    """
    logger.info("[updater.py] checkforupdates")
    itemlist = []
    data = scrapertools.cachePage(REMOTE_VERSION_FILE)
    patron = "<tag>([^<]+)</tag>"
    matches = re.compile(patron, re.DOTALL).findall(data)
    versiondescargada = matches[0]
    archivo = open(os.path.join(config.get_runtime_path(), "version.xml"))
    data = archivo.read()
    archivo.close()
    matches = re.compile(patron, re.DOTALL).findall(data)
    versionlocal = matches[0]

    if StrictVersion(versiondescargada) > StrictVersion(versionlocal):
        itemlist.append(
            Item(
                title="Descargar version " + versiondescargada,
                channel="updater",
                url=versiondescargada,
                action="update",
                thumbnail=channelselector.get_thumbnail_path() + "Crystal_Clear_action_info.png",
            )
        )

    return itemlist
Пример #15
0
def get_current_servers_version():

    f = open( os.path.join( config.get_runtime_path() , "servers" , "version.xml" ) )
    data = f.read()
    f.close()

    return int(scrapertools.find_single_match(data,"<version>([^<]+)</version>"))
Пример #16
0
def download_and_install(remote_file_name, local_file_name):
    logger.info("streamondemand.core.updater download_and_install from " + remote_file_name + " to " + local_file_name)

    if os.path.exists(local_file_name):
        os.remove(local_file_name)

    # Descarga el fichero
    inicio = time.clock()
    from core import downloadtools
    downloadtools.downloadfile(remote_file_name, local_file_name, continuar=False)
    fin = time.clock()
    logger.info("streamondemand.core.updater Descargado en %d segundos " % (fin - inicio + 1))

    logger.info("streamondemand.core.updater descomprime fichero...")
    import ziptools
    unzipper = ziptools.ziptools()

    # Lo descomprime en "addons" (un nivel por encima del plugin)
    installation_target = os.path.join(config.get_runtime_path(), "..")
    logger.info("streamondemand.core.updater installation_target=%s" % installation_target)

    unzipper.extract(local_file_name, installation_target)

    # Borra el zip descargado
    logger.info("streamondemand.core.updater borra fichero...")
    os.remove(local_file_name)
    logger.info("streamondemand.core.updater ...fichero borrado")
def download_server(server_name):
    '''
        Descarga un conector/server desde el repositorio
        Cuando se porte pelisalacarta a la GitHub oficial hay q modificar la url.
    '''
    logger.info("[updater.py] download_server('"+server_name+"')")
    ret= True
    remote_files_url = "https://raw.githubusercontent.com/superberny70/plugin.video.pelisalacarta/master/servers/" + server_name
    local_files_path = os.path.join( config.get_runtime_path(), 'servers', server_name)
    
    # Descarga el server
    try:
        outfile = open(local_files_path ,"w")
        outfile.write(scrapertools.cachePage(remote_files_url))
        outfile.flush()
        outfile.close()
        logger.info("[updater.py] Grabando " + local_files_path)
        
        # Actualizar listado de servidores
        if os.path.exists(PATH_LIST_SERVERS_JSON): # Si existe list_servers.json lo abrimos...
            with codecs.open(PATH_LIST_SERVERS_JSON,'r','utf-8') as input_file:
                indice_servers= json.load(input_file)
            indice_servers['ultima_actualizacion']={"fecha":datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}
            indice_servers[server_name]= {"fecha":str(datetime.datetime.fromtimestamp(os.path.getmtime (local_files_path)))}
            with codecs.open(PATH_LIST_SERVERS_JSON, 'w','utf-8') as outfile:
                json.dump(indice_servers, outfile, sort_keys = True, indent = 4, ensure_ascii=False, encoding="utf8")
            
        else: # Si no existe list_servers.json lo creamos
            ini_list_servers_json()
    except:
        logger.info("[updater.py] Error al grabar " + local_files_path)
        ret= False
        for line in sys.exc_info():
            logger.error( "%s" % line )
    return ret
def ini_list_servers_json():
    '''
        Inicializa un archivo json con el listado de conectores/servers instalados
    '''
    local_files_path = os.path.join(config.get_runtime_path(), 'servers')
    dialogo('Sincronizando servidores', 'Iniciando el indice de servidores...')

    files_locales = os.listdir(local_files_path)
    files_locales = [
        c for c in files_locales if c.endswith('.py') and not c.startswith('_')
    ]

    indice_servers = {}
    indice_servers['__ultima_actualizacion__'] = {
        "fecha": datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    }
    for s in files_locales:
        indice_servers[s] = {
            "fecha":
            str(
                datetime.datetime.fromtimestamp(
                    os.path.getmtime(os.path.join(local_files_path, s))))
        }

    # Guardamos list_servers.json
    with codecs.open(PATH_LIST_SERVERS_JSON, 'w', 'utf-8') as outfile:
        json.dump(indice_servers,
                  outfile,
                  sort_keys=True,
                  indent=4,
                  ensure_ascii=False,
                  encoding="utf8")

    return indice_servers
def get_channel_parameters(channel_name):
    #logger.info("streamondemand.core.channeltools get_channel_parameters channel_name="+channel_name)

    channel_xml = os.path.join(config.get_runtime_path(), 'channels',
                               channel_name + ".xml")

    if os.path.exists(channel_xml):
        #logger.info("streamondemand.core.channeltools get_channel_parameters "+channel_name+".xml found")

        infile = open(channel_xml, "rb")
        data = infile.read()
        infile.close()

        # TODO: Pendiente del json :)
        channel_parameters = {}
        channel_parameters["title"] = scrapertools.find_single_match(
            data, "<name>([^<]*)</name>")
        channel_parameters["channel"] = scrapertools.find_single_match(
            data, "<id>([^<]*)</id>")
        channel_parameters["active"] = scrapertools.find_single_match(
            data, "<active>([^<]*)</active>")
        channel_parameters["adult"] = scrapertools.find_single_match(
            data, "<adult>([^<]*)</adult>")
        channel_parameters["language"] = scrapertools.find_single_match(
            data, "<language>([^<]*)</language>")
        channel_parameters["thumbnail"] = scrapertools.find_single_match(
            data, "<thumbnail>([^<]*)</thumbnail>")
        channel_parameters["bannermenu"] = scrapertools.find_single_match(
            data, "<bannermenu>([^<]*)</bannermenu>")
        channel_parameters["fanart"] = scrapertools.find_single_match(
            data, "<fanart>([^<]*)</fanart>")
        channel_parameters[
            "include_in_global_search"] = scrapertools.find_single_match(
                data,
                "<include_in_global_search>([^<]*)</include_in_global_search>")

        category_list = []
        matches = scrapertools.find_multiple_matches(
            data, "<category>([^<]*)</category>")
        for match in matches:
            category_list.append(match)

        channel_parameters["categories"] = category_list

        logger.info(
            "streamondemand.core.channeltools get_channel_parameters " +
            channel_name + " -> " + repr(channel_parameters))

    else:
        logger.info(
            "streamondemand.core.channeltools get_channel_parameters " +
            channel_name + ".xml NOT found")

        channel_parameters = dict()
        channel_parameters["adult"] = "false"

    return channel_parameters
Пример #20
0
def CreateChannelsIndex():
    logger.info("Creando indice de canales")
    import hashlib
    JSONData = []
    for channel in os.listdir(
            os.path.join(config.get_runtime_path(), "pelisalacarta",
                         "channels", "")):
        channel = os.path.join(
            os.path.join(config.get_runtime_path(), "pelisalacarta",
                         "channels", channel))
        if channel.endswith(".py"):
            channeldata = open(channel, 'rb').read().replace("\r\n", "\n")
            JSONChannel = {}
            JSONChannel["name"] = os.path.basename(channel)
            JSONChannel["size"] = len(channeldata)
            path = os.path.dirname(config.get_runtime_path())
            if not path.endswith(os.sep): path += os.sep

            JSONChannel["path"] = "/".join(
                channel.replace(path, "", 1).split(os.sep))
            JSONChannel[
                "url"] = "https://api.github.com/repos/divadres/pelisalacarta/contents/" + JSONChannel[
                    "path"] + "?ref=" + branch
            JSONChannel["type"] = "file"
            JSONChannel["sha"] = hashlib.sha1("blob " +
                                              str(JSONChannel["size"]) + "\0" +
                                              channeldata).hexdigest()
            JSONChannel[
                "download_url"] = "https://raw.githubusercontent.com/divadres/pelisalacarta/" + branch + "/" + JSONChannel[
                    "path"]
            JSONChannel[
                "git_url"] = "https://api.github.com/repos/divadres/pelisalacarta/git/blobs/" + JSONChannel[
                    "sha"]
            JSONChannel[
                "html_url"] = "https://github.com/divadres/pelisalacarta/blob/" + branch + "/" + JSONChannel[
                    "path"]
            JSONChannel["_links"] = {}
            JSONChannel["_links"]["git"] = JSONChannel["git_url"]
            JSONChannel["_links"]["html"] = JSONChannel["html_url"]
            JSONChannel["_links"]["self"] = JSONChannel["url"]
            JSONData.append(JSONChannel)
    JSONData.sort(key=lambda item: item["name"])
    open(channelspath,
         "w").write(json.dumps(JSONData, indent=4, sort_keys=True))
def list_local_channels():  
    '''
    Obtiene una lista de los canales locales (archivos con extension py y que no comienzan con guion bajo)
    '''
    local_files_path = os.path.join( config.get_runtime_path(), 'pelisalacarta', 'channels')
            
    files_locales= os.listdir(local_files_path)
    files_locales= [c for c in files_locales if c.endswith('.py') and not c.startswith('_')]
    
    #logger.info("updater.list_local_channels :"  + str(files_locales))
    return files_locales
def read_channel_py(file_channel_py):
    """
    Abre file_channel_py y retorna un diccionario con las siguientes claves:
    title, channel, language, category, type, adult, thumbnail y version.
    """
    path_fichero_canal = os.path.join(config.get_runtime_path(), "pelisalacarta", "channels", file_channel_py)
    infile = open(path_fichero_canal)
    data = infile.read()
    infile.close()

    return scraper_channel_py(data)
Пример #23
0
def show_channel_settings(**kwargs):
    """
    Muestra un cuadro de configuracion personalizado para cada canal y guarda los datos al cerrarlo.

    Los parámetros que se le pasan se puede ver en la el método al que se llama

    @return: devuelve la ventana con los elementos
    @rtype: SettingsWindow
    """
    from xbmc_config_menu import SettingsWindow
    return SettingsWindow("ChannelSettings.xml", config.get_runtime_path()).start(**kwargs)
def list_local_channels():
    """
    Obtiene una lista de los canales locales (archivos con extension py y que no comienzan con guion bajo)
    """
    local_files_path = os.path.join(config.get_runtime_path(), "pelisalacarta", "channels")

    files_locales = os.listdir(local_files_path)
    files_locales = [c for c in files_locales if c.endswith(".py") and not c.startswith("_")]

    # logger.info("updater.list_local_channels :"  + str(files_locales))
    return files_locales
Пример #25
0
def show_video_info(*args, **kwargs):
    """
    Muestra una ventana con la info del vídeo.

    Los parámetros que se le pasan se puede ver en la el método al que se llama

    @return: devuelve la ventana con los elementos
    @rtype: InfoWindow
    """

    from xbmc_info_window import InfoWindow
    return InfoWindow("InfoWindow.xml", config.get_runtime_path()).start(*args, **kwargs)
Пример #26
0
def get_channel_local_path(channel_name):

    if channel_name <> "channelselector":
        local_channel_path = os.path.join(config.get_runtime_path(),
                                          'channels', channel_name + ".py")
        local_version_path = os.path.join(config.get_runtime_path(),
                                          'channels', channel_name + ".xml")
        local_compiled_path = os.path.join(config.get_runtime_path(),
                                           'channels', channel_name + ".pyo")
    else:
        local_channel_path = os.path.join(config.get_runtime_path(),
                                          channel_name + ".py")
        local_version_path = os.path.join(config.get_runtime_path(),
                                          channel_name + ".xml")
        local_compiled_path = os.path.join(config.get_runtime_path(),
                                           channel_name + ".pyo")

    logger.info(
        "pelisalacarta.core.channeltools get_channel_local_path local_channel_path="
        + local_channel_path)
    logger.info(
        "pelisalacarta.core.channeltools get_channel_local_path local_version_path="
        + local_version_path)
    logger.info(
        "pelisalacarta.core.channeltools get_channel_local_path local_compiled_path="
        + local_compiled_path)

    return local_channel_path, local_version_path, local_compiled_path
def updatechannel(channel_name):
    '''
    Funcion experimental para actualizar el canal desde github basandose en la fecha de modificacion de los archivos.
    '''
    if channel_name == "channelselector":
        remote_files_url = "https://github.com/superberny70/plugin.video.pelisalacarta"
        local_files_path = os.path.join(config.get_runtime_path(),
                                        channel_name + '.py')
    else:
        remote_files_url = "https://github.com/superberny70/plugin.video.pelisalacarta/tree/master/pelisalacarta/channels"
        local_files_path = os.path.join(config.get_runtime_path(), PLUGIN_NAME,
                                        'channels', channel_name + '.py')

    data = re.sub(r"\n|\r|\t|\s{2}|(<!--.*?-->)", "",
                  scrapertools.cache_page(remote_files_url))
    #last_commit= scrapertools.find_single_match(data,'<time class="updated" datetime="([^"]+)"')

    patron = '<td class="content">.*?title="' + channel_name + '\.py".*?'
    patron += '<time datetime="([^"]+)"'  # date_time

    date = scrapertools.find_single_match(data, patron).replace('T',
                                                                ' ').replace(
                                                                    'Z', '')

    if date == '':  # El canal no esta en el repositorio remoto
        return False

    struct = time.strptime(date, '%Y-%m-%d %H:%M:%S')
    dt_remote = datetime.datetime.fromtimestamp(time.mktime(struct))

    if os.path.exists(local_files_path):
        dt_local = datetime.datetime.fromtimestamp(
            os.path.getmtime(local_files_path))

    #logger.info("[updater.py] remote_data= "+str(dt_remote) + " local_data= " + str(dt_local ))
    if dt_remote > dt_local:
        dialogo('Actualizando canal', 'Actualizando canal ' + channel_name)
        return download_channel(channel_name)

    return False
Пример #28
0
def get_channel_local_path(channel_name):
    # TODO: (3.2) El XML debería escribirse en el userdata, de forma que se leerán dos ficheros locales: el del userdata y el que está junto al py (vendrá con el plugin). El mayor de los 2 es la versión actual, y si no existe fichero se asume versión 0
    if channel_name <> "channelselector":
        local_channel_path = os.path.join(config.get_runtime_path(),
                                          'channels', channel_name + ".py")
        local_version_path = os.path.join(config.get_runtime_path(),
                                          'channels', channel_name + ".xml")
        local_compiled_path = os.path.join(config.get_runtime_path(),
                                           'channels', channel_name + ".pyo")
    else:
        local_channel_path = os.path.join(config.get_runtime_path(),
                                          channel_name + ".py")
        local_version_path = os.path.join(config.get_runtime_path(),
                                          channel_name + ".xml")
        local_compiled_path = os.path.join(config.get_runtime_path(),
                                           channel_name + ".pyo")

    logger.info("streamondemand.core.updater local_channel_path=" +
                local_channel_path)
    logger.info("streamondemand.core.updater local_version_path=" +
                local_version_path)
    logger.info("streamondemand.core.updater local_compiled_path=" +
                local_compiled_path)

    return local_channel_path, local_version_path, local_compiled_path
Пример #29
0
def update(item):
    logger.info("Actualizando plugin...")   
    
    LOCAL_FILE = os.path.join( config.get_runtime_path(), "..","pelisalacarta-"+item.url+".zip" )
    REMOTE_FILE = downloadurl + "/update/pelisalacarta-mediaserver-"+item.url+".zip"
    DESTINATION_FOLDER = os.path.join(config.get_runtime_path(),"..")

    logger.info("Archivo Remoto: " + REMOTE_FILE)
    logger.info("Archivo Local: " + LOCAL_FILE)
    
    from core import downloadtools
    if os.path.isfile(LOCAL_FILE):
      os.remove(LOCAL_FILE)
    ret = downloadtools.downloadfile(REMOTE_FILE, LOCAL_FILE)
    if ret is None:
      logger.info("Descomprimiendo fichero...")
      import ziptools
      unzipper = ziptools.ziptools()
      logger.info("Destino: " + DESTINATION_FOLDER)
      
      if os.path.isfile(channelspath): os.remove(channelspath)
      if os.path.isfile(serverspath): os.remove(serverspath)
      if os.path.isfile(lastupdatepath): os.remove(lastupdatepath)
      
      import shutil
      for file in os.listdir(os.path.join(DESTINATION_FOLDER,"pelisalacarta")):
        if not file in [".",".."]:
          if os.path.isdir(os.path.join(DESTINATION_FOLDER,"pelisalacarta", file)):
            shutil.rmtree(os.path.join(DESTINATION_FOLDER,"pelisalacarta", file))
          if os.path.isfile(os.path.join(DESTINATION_FOLDER,"pelisalacarta", file)):
            os.remove(os.path.join(DESTINATION_FOLDER,"pelisalacarta", file))
          pass
     
      unzipper.extract(LOCAL_FILE,DESTINATION_FOLDER)
      os.remove(LOCAL_FILE)
      guitools.Dialog_OK("Actualizacion", "Pelisalacarta se reiniciara\nEspera 20 segundos y actualiza la página.")
      os._exit(0)
    else:
      guitools.Dialog_OK("Actualizacion", "Se ha producido un error al descargar el archivo")
def read_channel_py(file_channel_py):
    '''
    Abre file_channel_py y retorna un diccionario con las siguientes claves:
    title, channel, language, category, type, adult, thumbnail y version.
    '''
    path_fichero_canal = os.path.join(config.get_runtime_path(),
                                      'pelisalacarta', 'channels',
                                      file_channel_py)
    infile = open(path_fichero_canal)
    data = infile.read()
    infile.close()

    return scraper_channel_py(data)
Пример #31
0
def set_color(title, category):
    #logger.info()
    from core import jsontools

    styles_path = os.path.join(config.get_runtime_path(), 'resources',
                               'color_styles.json')
    preset = config.get_setting("preset_style", default="Estilo 1")
    logger.debug(preset)
    color_setting = jsontools.load((open(styles_path, "r").read()))[preset]

    color_scheme = {'otro': 'white', 'dual': 'white'}

    #logger.debug('category antes de remove: %s' % category)
    category = remove_format(category).lower()
    #logger.debug('category despues de remove: %s' % category)
    # Lista de elementos posibles en el titulo
    color_list = [
        'movie', 'tvshow', 'year', 'rating_1', 'rating_2', 'rating_3',
        'quality', 'cast', 'lat', 'vose', 'vos', 'vo', 'server', 'library',
        'update', 'no_update'
    ]

    # Se verifica el estado de la opcion de colores personalizados
    custom_colors = config.get_setting('title_color')

    # Se Forma el diccionario de colores para cada elemento, la opcion esta activas utiliza la configuracion del
    #  usuario, si no  pone el titulo en blanco.
    if title not in ['', ' ']:

        for element in color_list:
            if custom_colors:
                color_scheme[element] = remove_format(
                    config.get_setting('%s_color' % element))
            else:
                color_scheme[element] = remove_format(
                    color_setting.get(element, 'white'))
                #color_scheme[element] = 'white'

        if category in ['update', 'no_update']:
            #logger.debug('title antes de updates: %s' % title)
            title = re.sub(r'\[COLOR .*?\]',
                           '[COLOR %s]' % color_scheme[category], title)
        else:
            if category not in ['movie', 'tvshow', 'library', 'otro']:
                title = "[COLOR %s][%s][/COLOR]" % (color_scheme[category],
                                                    title)
            else:
                title = "[COLOR %s]%s[/COLOR]" % (color_scheme[category],
                                                  title)
    return title
def list_local_channels():
    '''
    Obtiene una lista de los canales locales (archivos con extension py y que no comienzan con guion bajo)
    '''
    local_files_path = os.path.join(config.get_runtime_path(), 'pelisalacarta',
                                    'channels')

    files_locales = os.listdir(local_files_path)
    files_locales = [
        c for c in files_locales if c.endswith('.py') and not c.startswith('_')
    ]

    #logger.info("updater.list_local_channels :"  + str(files_locales))
    return files_locales
def download_server(server_name):
    '''
        Descarga un conector/server desde el repositorio
        Cuando se porte pelisalacarta a la GitHub oficial hay q modificar la url.
    '''
    logger.info("[updater.py] download_server('" + server_name + "')")
    ret = True
    remote_files_url = "https://raw.githubusercontent.com/superberny70/plugin.video.pelisalacarta/master/servers/" + server_name
    local_files_path = os.path.join(config.get_runtime_path(), 'servers',
                                    server_name)

    # Descarga el server
    try:
        outfile = open(local_files_path, "w")
        outfile.write(scrapertools.cachePage(remote_files_url))
        outfile.flush()
        outfile.close()
        logger.info("[updater.py] Grabando " + local_files_path)

        # Actualizar listado de servidores
        if os.path.exists(PATH_LIST_SERVERS_JSON
                          ):  # Si existe list_servers.json lo abrimos...
            with codecs.open(PATH_LIST_SERVERS_JSON, 'r',
                             'utf-8') as input_file:
                indice_servers = json.load(input_file)
            indice_servers['ultima_actualizacion'] = {
                "fecha": datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
            }
            indice_servers[server_name] = {
                "fecha":
                str(
                    datetime.datetime.fromtimestamp(
                        os.path.getmtime(local_files_path)))
            }
            with codecs.open(PATH_LIST_SERVERS_JSON, 'w', 'utf-8') as outfile:
                json.dump(indice_servers,
                          outfile,
                          sort_keys=True,
                          indent=4,
                          ensure_ascii=False,
                          encoding="utf8")

        else:  # Si no existe list_servers.json lo creamos
            ini_list_servers_json()
    except:
        logger.info("[updater.py] Error al grabar " + local_files_path)
        ret = False
        for line in sys.exc_info():
            logger.error("%s" % line)
    return ret
Пример #34
0
def get_channel_json(channel_name):
    # logger.info("channel_name=" + channel_name)
    import filetools
    try:
        channel_path = filetools.join(config.get_runtime_path(), "channels",
                                      channel_name + ".json")
        # logger.info("channel_data=" + channel_path)
        channel_json = jsontools.load(filetools.read(channel_path))
        # logger.info("channel_json= %s" % channel_json)

    except Exception, ex:
        template = "An exception of type %s occured. Arguments:\n%r"
        message = template % (type(ex).__name__, ex.args)
        logger.error(" %s" % message)
        channel_json = None
Пример #35
0
def torrent_client_installed(show_tuple=False):
    # Plugins externos se encuentra en servers/torrent.json nodo clients
    from core import filetools
    from core import jsontools
    torrent_clients = jsontools.get_node_from_file(
        "torrent.json", "clients",
        filetools.join(config.get_runtime_path(), "servers"))
    torrent_options = []
    for client in torrent_clients:
        if xbmc.getCondVisibility('System.HasAddon("%s")' % client["id"]):
            if show_tuple:
                torrent_options.append(
                    ["Plugin externo: %s" % client["name"], client["url"]])
            else:
                torrent_options.append("Plugin externo: %s" % client["name"])
    return torrent_options
Пример #36
0
def get_channel_parameters(channel_name):
    logger.info("pelisalacarta.core.channeltools get_channel_parameters channel_name=" + channel_name)

    channel_xml = os.path.join(config.get_runtime_path(), "channels", channel_name + ".xml")

    if os.path.exists(channel_xml):
        logger.info("pelisalacarta.core.channeltools get_channel_parameters " + channel_name + ".xml found")

        infile = open(channel_xml, "rb")
        data = infile.read()
        infile.close()

        # TODO: Pendiente del json :)
        channel_parameters = {}
        channel_parameters["title"] = scrapertools.find_single_match(data, "<name>([^<]*)</name>")
        channel_parameters["channel"] = scrapertools.find_single_match(data, "<id>([^<]*)</id>")
        channel_parameters["active"] = scrapertools.find_single_match(data, "<active>([^<]*)</active>")
        channel_parameters["adult"] = scrapertools.find_single_match(data, "<adult>([^<]*)</adult>")
        channel_parameters["language"] = scrapertools.find_single_match(data, "<language>([^<]*)</language>")
        channel_parameters["thumbnail"] = scrapertools.find_single_match(data, "<thumbnail>([^<]*)</thumbnail>")
        channel_parameters["bannermenu"] = scrapertools.find_single_match(data, "<bannermenu>([^<]*)</bannermenu>")
        channel_parameters["fanart"] = scrapertools.find_single_match(data, "<fanart>([^<]*)</fanart>")
        channel_parameters["include_in_global_search"] = scrapertools.find_single_match(
            data, "<include_in_global_search>([^<]*)</include_in_global_search>"
        )
        channel_parameters["type"] = "generic"

        category_list = []
        matches = scrapertools.find_multiple_matches(data, "<category>([^<]*)</category>")
        for match in matches:
            category_list.append(match)

        channel_parameters["categories"] = category_list

        logger.info(
            "pelisalacarta.core.channeltools get_channel_parameters channel_parameters=" + repr(channel_parameters)
        )

    else:
        logger.info("pelisalacarta.core.channeltools get_channel_parameters " + channel_name + ".xml NOT found")

        channel_parameters = {}
        channel_parameters["adult"] = "false"

    return channel_parameters
def ini_list_servers_json():
    '''
        Inicializa un archivo json con el listado de conectores/servers instalados
    '''
    local_files_path = os.path.join( config.get_runtime_path(), 'servers')
    dialogo('Sincronizando servidores', 'Iniciando el indice de servidores...')
    
    files_locales= os.listdir(local_files_path)
    files_locales= [c for c in files_locales if c.endswith('.py') and not c.startswith('_')]
    
    indice_servers={}
    indice_servers['__ultima_actualizacion__']={"fecha":datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}
    for s in files_locales:
        indice_servers[s]= {"fecha":str(datetime.datetime.fromtimestamp(os.path.getmtime (os.path.join( local_files_path, s))))}
        
    # Guardamos list_servers.json
    with codecs.open(PATH_LIST_SERVERS_JSON, 'w','utf-8') as outfile:
        json.dump(indice_servers, outfile, sort_keys = True, indent = 4, ensure_ascii=False, encoding="utf8")
        
    return indice_servers
Пример #38
0
def get_channel_local_path(channel_name):

    if channel_name != "channelselector":
        local_channel_path = os.path.join(config.get_runtime_path(), 'channels', channel_name + ".py")
        local_version_path = os.path.join(config.get_runtime_path(), 'channels', channel_name + ".xml")
        local_compiled_path = os.path.join(config.get_runtime_path(), 'channels', channel_name + ".pyo")
    else:
        local_channel_path = os.path.join(config.get_runtime_path(), channel_name + ".py")
        local_version_path = os.path.join(config.get_runtime_path(), channel_name + ".xml")
        local_compiled_path = os.path.join(config.get_runtime_path(), channel_name + ".pyo")

    logger.info("local_channel_path=" + local_channel_path)
    logger.info("local_version_path=" + local_version_path)
    logger.info("local_compiled_path=" + local_compiled_path)

    return local_channel_path, local_version_path, local_compiled_path
Пример #39
0
def get_channel_local_path(channel_name):
    # TODO: (3.2) El XML debería escribirse en el userdata, de forma que se leerán dos ficheros locales: el del userdata y el que está junto al py (vendrá con el plugin). El mayor de los 2 es la versión actual, y si no existe fichero se asume versión 0
    if channel_name<>"channelselector":
        local_channel_path = os.path.join( config.get_runtime_path() , 'channels' , channel_name+".py" )
        local_version_path = os.path.join( config.get_runtime_path() , 'channels' , channel_name+".xml" )
        local_compiled_path = os.path.join( config.get_runtime_path() , 'channels' , channel_name+".pyo" )
    else:
        local_channel_path = os.path.join( config.get_runtime_path() , channel_name+".py" )
        local_version_path = os.path.join( config.get_runtime_path() , channel_name+".xml" )
        local_compiled_path = os.path.join( config.get_runtime_path() , channel_name+".pyo" )

    logger.info("pelisalacarta.core.updater local_channel_path="+local_channel_path)
    logger.info("pelisalacarta.core.updater local_version_path="+local_version_path)
    logger.info("pelisalacarta.core.updater local_compiled_path="+local_compiled_path)
    
    return local_channel_path , local_version_path , local_compiled_path
Пример #40
0
def download_and_install(remote_file_name, local_file_name):
    logger.info("Stefano.core.updater download_and_install from " +
                remote_file_name + " to " + local_file_name)

    if os.path.exists(local_file_name):
        os.remove(local_file_name)

    # Descarga el fichero
    inicio = time.clock()
    from core import downloadtools
    downloadtools.downloadfile(remote_file_name,
                               local_file_name,
                               continuar=False)
    fin = time.clock()
    logger.info("Stefano.core.updater Descargado en %d segundos " %
                (fin - inicio + 1))

    logger.info("Stefano.core.updater descomprime fichero...")
    import xbmc
    from core import filetools
    path_channels = xbmc.translatePath(
        "special://home/addons/plugin.video.Stefano/channels")
    filetools.rmdirtree(path_channels)
    path_servers = xbmc.translatePath(
        "special://home/addons/plugin.video.Stefano/servers")
    filetools.rmdirtree(path_servers)
    import ziptools
    unzipper = ziptools.ziptools()

    # Lo descomprime en "addons" (un nivel por encima del plugin)
    installation_target = os.path.join(config.get_runtime_path(), "..")
    logger.info("Stefano.core.updater installation_target=%s" %
                installation_target)

    unzipper.extract(local_file_name, installation_target)

    # Borra el zip descargado
    logger.info("Stefano.core.updater borra fichero...")
    os.remove(local_file_name)
    logger.info("Stefano.core.updater ...fichero borrado")
def get_channel_local_path(channel_name):

    if channel_name != "channelselector":
        local_channel_path = os.path.join(config.get_runtime_path(), 'channels', channel_name + ".py")
        local_version_path = os.path.join(config.get_runtime_path(), 'channels', channel_name + ".xml")
        local_compiled_path = os.path.join(config.get_runtime_path(), 'channels', channel_name + ".pyo")
    else:
        local_channel_path = os.path.join(config.get_runtime_path(), channel_name + ".py")
        local_version_path = os.path.join(config.get_runtime_path(), channel_name + ".xml")
        local_compiled_path = os.path.join(config.get_runtime_path(), channel_name + ".pyo")

    logger.info("streamondemand.core.channeltools get_channel_local_path local_channel_path=" + local_channel_path)
    logger.info("streamondemand.core.channeltools get_channel_local_path local_version_path=" + local_version_path)
    logger.info("streamondemand.core.channeltools get_channel_local_path local_compiled_path=" + local_compiled_path)
    
    return local_channel_path, local_version_path, local_compiled_path
Пример #42
0
def get_channel_json(channel_name):
    #logger.info("deportesalacarta.core.channeltools get_channel_json channel_name="+channel_name)
    channel_xml = os.path.join(config.get_runtime_path(), 'channels',
                               channel_name + ".xml")
    channel_json = jsontools.xmlTojson(channel_xml)
    return channel_json['channel']
Пример #43
0
def get_channel_parameters(channel_name):
    # logger.info("streamondemand.core.channeltools get_channel_parameters channel_name="+channel_name)
    channel_xml = os.path.join(config.get_runtime_path(), 'channels',
                               channel_name + ".xml")

    if os.path.exists(channel_xml):
        # logger.info("channel_name+".xml found")

        infile = open(channel_xml, "rb")
        data = infile.read()
        infile.close()

        channel_parameters = dict()
        channel_parameters["title"] = scrapertools.find_single_match(
            data, "<name>([^<]*)</name>")
        channel_parameters["channel"] = scrapertools.find_single_match(
            data, "<id>([^<]*)</id>")
        channel_parameters["active"] = str_to_bool(
            scrapertools.find_single_match(data, "<active>([^<]*)</active>"))
        channel_parameters["adult"] = str_to_bool(
            scrapertools.find_single_match(data, "<adult>([^<]*)</adult>"))
        channel_parameters["language"] = scrapertools.find_single_match(
            data, "<language>([^<]*)</language>")
        channel_parameters["version"] = scrapertools.find_single_match(
            data, "<version>([^<]*)</version>")

        # Imagenes: se admiten url y archivos locales dentro de "resources/images"
        channel_parameters["thumbnail"] = scrapertools.find_single_match(
            data, "<thumbnail>([^<]*)</thumbnail>")
        channel_parameters["bannermenu"] = scrapertools.find_single_match(
            data, "<bannermenu>([^<]*)</bannermenu>")
        channel_parameters["fanart"] = scrapertools.find_single_match(
            data, "<fanart>([^<]*)</fanart>")

        if channel_parameters["thumbnail"] and "://" not in channel_parameters[
                "thumbnail"]:
            channel_parameters["thumbnail"] = os.path.join(
                config.get_runtime_path(), "resources", "images", "squares",
                channel_parameters["thumbnail"])
        if channel_parameters[
                "bannermenu"] and "://" not in channel_parameters["bannermenu"]:
            channel_parameters["bannermenu"] = os.path.join(
                config.get_runtime_path(), "resources", "images", "bannermenu",
                channel_parameters["bannermenu"])
        if channel_parameters["fanart"] and "://" not in channel_parameters[
                "fanart"]:
            channel_parameters["fanart"] = os.path.join(
                config.get_runtime_path(), "resources", "images", "fanart",
                channel_parameters["fanart"])

        channel_parameters["update_url"] = scrapertools.find_single_match(
            data, "<update_url>([^<]*)</update_url>")
        if channel_parameters["update_url"] == "":
            channel_parameters["update_url"] = DEFAULT_UPDATE_URL

        include_in_global_search = scrapertools.find_single_match(
            data,
            "<include_in_global_search>([^<]*)</include_in_global_search>")

        if include_in_global_search in ["", "true"]:
            channel_parameters["include_in_global_search"] = True
        else:
            channel_parameters["include_in_global_search"] = False

        category_list = []
        matches = scrapertools.find_multiple_matches(
            data, "<category>([^<]*)</category>")
        for match in matches:
            category_list.append(match)

        channel_parameters["categories"] = category_list

        # Obtenemos si el canal tiene opciones de configuración
        channel_parameters["has_settings"] = False
        # esta regex devuelve 2 valores por elemento <settings>, el contenido del propio nodo y un \t, por lo que hay
        # posteriormente coger solo el valor del indice 0.
        matches = scrapertools.find_multiple_matches(
            data, "<settings>((.|\n)*?)<\/settings>")
        for match in matches:
            _id = scrapertools.find_single_match(match[0], "<id>([^<]*)</id>")
            if _id and "include_in_" not in _id:
                channel_parameters["has_settings"] = True
                break

        # Inicio - condiciones para mostrar canal compatible
        python_condition = scrapertools.find_single_match(
            data, "<python>([^<]*)</python>")
        if python_condition:
            import sys

            def versiontuple(v):
                return tuple(map(int, (v.split("."))))

            if sys.version_info < versiontuple(python_condition):
                python_compatible = False
            else:
                python_compatible = True
        else:
            python_compatible = True

        addon_version_condition = scrapertools.find_single_match(
            data, "<addon_version>([^<]*)</addon_version>")
        if addon_version_condition:
            import versiontools
            addon_version = int(
                addon_version_condition.replace(".", "").ljust(
                    len(str(versiontools.get_current_plugin_version())), '0'))
            if versiontools.get_current_plugin_version() < addon_version:
                addon_version_compatible = False
            else:
                addon_version_compatible = True
        else:
            addon_version_compatible = True

        channel_parameters["compatible"] = True

        if not python_compatible or not addon_version_compatible:
            channel_parameters["compatible"] = False
        # Fin - condiciones para mostrar canal compatible

        logger.info(channel_name + " -> " + repr(channel_parameters))

    else:
        logger.info(channel_name + ".xml NOT found")

        channel_parameters = dict()
        channel_parameters["adult"] = False
        channel_parameters["update_url"] = DEFAULT_UPDATE_URL

    return channel_parameters
Пример #44
0
import config
import logger

# FIXME: Esto está repetido en el channelselector, debería ir a config
thumbnail_type = config.get_setting("thumbnail_type")
if thumbnail_type=="":
    thumbnail_type="2"
logger.info("thumbnail_type="+thumbnail_type)
if thumbnail_type=="0":
    IMAGES_PATH = 'http://media.tvalacarta.info/pelisalacarta/posters/'
elif thumbnail_type=="1":
    IMAGES_PATH = 'http://media.tvalacarta.info/pelisalacarta/banners/'
elif thumbnail_type=="2":
    IMAGES_PATH = 'http://media.tvalacarta.info/pelisalacarta/squares/'

ROOT_DIR = config.get_runtime_path()

REMOTE_VERSION_FILE = "http://descargas.tvalacarta.info/"+config.PLUGIN_NAME+"-version.xml"
LOCAL_VERSION_FILE = os.path.join( ROOT_DIR , "version.xml" )
LOCAL_FILE = os.path.join( ROOT_DIR , config.PLUGIN_NAME+"-" )

try:
    # Añadida a la opcion : si plataforma xbmcdharma es "True", no debe ser con la plataforma de la xbox
    # porque seria un falso "True", ya que el xbmc en las xbox no son dharma por lo tanto no existen los addons
    logger.info("pelisalacarta.core.updater get_platform="+config.PLATFORM_NAME)
    if config.get_platform()=="kodi-isengard":
        import xbmc
        REMOTE_FILE = "http://descargas.tvalacarta.info/"+config.PLUGIN_NAME+"-kodi-isengard-"
        DESTINATION_FOLDER = xbmc.translatePath( "special://home/addons")
    elif config.get_platform()=="kodi-helix":
        import xbmc
def sincronizar_canales():
    """
    Actualiza el fichero "config.get_data_path() + channels/list_channels.json" con los canales añadidos 
    o eliminados (segun config.get_setting("outsider_channel")).
    Dicho fichero se utiliza como indice de canales
    Retorna el objeto JSON que representa al indice de canales
    """
    logger.info("[updater] sincronizar_canales")

    lista_borrables = []
    lista_nuevos = []
    files_remotos = list_remote_channels()

    if len(files_remotos) == 0:
        return None

    files_locales = list_local_channels()

    for channel in files_remotos:
        if channel not in files_locales:
            lista_nuevos.append(channel)
            dialogo("Nuevos canales", "Añadiendo canal " + channel.replace(".py", ""))
            download_channel(channel.replace(".py", ""))

    files_locales.extend(lista_nuevos)
    logger.info("updater.sincronizar_canales Canales nuevos: " + str(len(lista_nuevos)))

    """ Opciones para config.get_setting("outsider_channel")
        Opcion Mostrar (por defecto): config.get_setting("outsider_channel")=='0' Los canales seran mostrados en el menu como si estuviesen en SVN tambien. 
        Opcion Ignorar: config.get_setting("outsider_channel")=='1' Los canales no seran borrados, ni mostrados en el menu.
        Opcion Eliminar: config.get_setting("outsider_channel")=='2' Elimina todos los canales locales que no este subidos al SVN.
    """
    for channel in files_locales:
        if channel not in files_remotos:
            if (
                config.get_setting("outsider_channel") == "2"
            ):  # Elimina todos los canales locales que no este subidos al SVN.
                lista_borrables.append(channel)
                files_locales.remove(channel)
                # Borra definitivamente el canal de nuestro HDD!!!
                os.remove(os.path.join(config.get_runtime_path(), "pelisalacarta/channels", channel))
                if os.path.exists(
                    os.path.join(config.get_runtime_path(), "pelisalacarta/channels", channel.replace(".py", ".pyo"))
                ):
                    os.remove(
                        os.path.join(
                            config.get_runtime_path(), "pelisalacarta/channels", channel.replace(".py", ".pyo")
                        )
                    )
                if os.path.exists(
                    os.path.join(config.get_runtime_path(), "pelisalacarta/channels", channel.replace(".py", ".xml"))
                ):
                    os.remove(
                        os.path.join(
                            config.get_runtime_path(), "pelisalacarta/channels", channel.replace(".py", ".xml")
                        )
                    )
                if os.path.exists(os.path.join(DIRECTORIO_PATH_CONFIG, channel.replace(".py", ".xml"))):
                    os.remove(os.path.join(DIRECTORIO_PATH_CONFIG, channel.replace(".py", ".xml")))
            elif (
                config.get_setting("outsider_channel") == "1"
            ):  # Los canales no seran borrados, ni mostrados en el menu.
                lista_borrables.append(channel)
                files_locales.remove(channel)
            else:  #  Los canales seran mostrados en el menu como si estuviesen en SVN tambien.
                # lista_nuevos.append(channel)
                pass

    if not os.path.exists(PATH_LIST_CHANNELS_JSON):  # si no existe el json lo creamos
        ini_list_channels_json()

    indice_canales = {}

    logger.info("updater.sincronizar_canales Canales eliminados: " + str(len(lista_borrables)))
    # if len(lista_nuevos) >0 or len(lista_borrables)>0:
    if len(lista_borrables) > 0:
        logger.info("updater.sincronizar_canales editar " + PATH_LIST_CHANNELS_JSON)

        with codecs.open(PATH_LIST_CHANNELS_JSON, "r", "utf-8") as input_file:
            indice_canales = json.load(input_file)

        # logger.info("updater.sincronizar_canales indice_canales: " + str(indice_canales))

        for c in lista_borrables:
            if c in indice_canales:
                del indice_canales[c]

        # Guardamos de nuevo list_channels.json
        with codecs.open(PATH_LIST_CHANNELS_JSON, "w", "utf-8") as outfile:
            json.dump(indice_canales, outfile, sort_keys=True, indent=4, ensure_ascii=False, encoding="utf8")

        logger.info("updater.sincronizar_canales Canales totales: " + str(len(files_locales)))
    return indice_canales
def checkforupdates(plugin_mode=True):
    logger.info("streamondemand.core.updater checkforupdates")

    # Descarga el fichero con la versión en la web
    logger.info("streamondemand.core.updater Verificando actualizaciones...")
    logger.info("streamondemand.core.updater Version remota: "+REMOTE_VERSION_FILE)
    data = scrapertools.cachePage( REMOTE_VERSION_FILE )

    '''    
    <?xml version="1.0" encoding="utf-8" standalone="yes"?>
    <version>
            <name>streamondemand</name>
            <tag>4.0     </tag>
            <version>4000</tag>
            <date>20/03/2015</date>
            <changes>New release</changes>
    </version>
    '''

    version_publicada = scrapertools.find_single_match(data,"<version>([^<]+)</version>").strip()
    tag_publicada = scrapertools.find_single_match(data,"<tag>([^<]+)</tag>").strip()
    logger.info("streamondemand.core.updater version remota="+tag_publicada+" "+version_publicada)
    
    # Lee el fichero con la versión instalada
    localFileName = LOCAL_VERSION_FILE
    logger.info("streamondemand.core.updater fichero local version: "+localFileName)
    infile = open( localFileName )
    data = infile.read()
    infile.close();
    #logger.info("xml local="+data)

    version_local = scrapertools.find_single_match(data,"<version>([^<]+)</version>").strip()
    tag_local = scrapertools.find_single_match(data,"<tag>([^<]+)</tag>").strip()
    logger.info("streamondemand.core.updater version local="+tag_local+" "+version_local)

    try:
        numero_version_publicada = int(version_publicada)
        numero_version_local = int(version_local)
    except:
        import traceback
        logger.info(traceback.format_exc())
        version_publicada = ""
        version_local = ""

    if version_publicada=="" or version_local=="":
        arraydescargada = tag_publicada.split(".")
        arraylocal = tag_local.split(".")

        # local 2.8.0 - descargada 2.8.0 -> no descargar
        # local 2.9.0 - descargada 2.8.0 -> no descargar
        # local 2.8.0 - descargada 2.9.0 -> descargar
        if len(arraylocal) == len(arraydescargada):
            logger.info("caso 1")
            hayqueactualizar = False
            for i in range(0, len(arraylocal)):
                print arraylocal[i], arraydescargada[i], int(arraydescargada[i]) > int(arraylocal[i])
                if int(arraydescargada[i]) > int(arraylocal[i]):
                    hayqueactualizar = True
        # local 2.8.0 - descargada 2.8 -> no descargar
        # local 2.9.0 - descargada 2.8 -> no descargar
        # local 2.8.0 - descargada 2.9 -> descargar
        if len(arraylocal) > len(arraydescargada):
            logger.info("caso 2")
            hayqueactualizar = False
            for i in range(0, len(arraydescargada)):
                #print arraylocal[i], arraydescargada[i], int(arraydescargada[i]) > int(arraylocal[i])
                if int(arraydescargada[i]) > int(arraylocal[i]):
                    hayqueactualizar = True
        # local 2.8 - descargada 2.8.8 -> descargar
        # local 2.9 - descargada 2.8.8 -> no descargar
        # local 2.10 - descargada 2.9.9 -> no descargar
        # local 2.5 - descargada 3.0.0
        if len(arraylocal) < len(arraydescargada):
            logger.info("caso 3")
            hayqueactualizar = True
            for i in range(0, len(arraylocal)):
                #print arraylocal[i], arraydescargada[i], int(arraylocal[i])>int(arraydescargada[i])
                if int(arraylocal[i]) > int(arraydescargada[i]):
                    hayqueactualizar =  False
                elif int(arraylocal[i]) < int(arraydescargada[i]):
                    hayqueactualizar =  True
                    break
    else:
        hayqueactualizar = (numero_version_publicada > numero_version_local)

    if hayqueactualizar:
    
        if plugin_mode:
    
            logger.info("streamondemand.core.updater actualizacion disponible")
            
            # Añade al listado de XBMC
            import xbmcgui
            #thumbnail = IMAGES_PATH+"Crystal_Clear_action_info.png"
            thumbnail = os.path.join(config.get_runtime_path() , "resources" , "images", "service_update.png")
            logger.info("thumbnail="+thumbnail)
            listitem = xbmcgui.ListItem( "Scarica la versione "+tag_publicada, thumbnailImage=thumbnail )
            itemurl = '%s?action=update&version=%s' % ( sys.argv[ 0 ] , tag_publicada )
            import xbmcplugin
            xbmcplugin.addDirectoryItem( handle = int(sys.argv[ 1 ]), url = itemurl , listitem=listitem, isFolder=True)
            
            # Avisa con un popup
            dialog = xbmcgui.Dialog()
            dialog.ok("Versione "+tag_publicada+" disponibile","E' possibile scaricare la nuova versione del plugin\nattraverso l'opzione nel menù principale.")

        else:

            import xbmcgui
            yes_pressed = xbmcgui.Dialog().yesno( "Versione "+tag_publicada+" disponibile" , "Installarla?" )

            if yes_pressed:
                params = {"version":tag_publicada}
                update(params)

    '''
def get_channel_json(channel_name):
    # logger.info("channel_name="+channel_name)
    channel_xml = os.path.join(config.get_runtime_path(), 'channels', channel_name + ".xml")
    channel_json = jsontools.xmlTojson(channel_xml)
    return channel_json['channel']
Пример #48
0
def Dialog_Select(title, opciones): #----------------------------------OK
    import ui
    resultado = ui.SelectWindow("ListDialog.xml",config.get_runtime_path()).setOptions(title, opciones)
    if resultado ==-1: resultado = None
    return resultado
Пример #49
0
def checkforupdates(): 
  import time
  logger.info("checkforupdates")
  
  #Actualizaciones del plugin
  if config.get_setting("updatecheck2") == "true":
    logger.info("Comprobando actualizaciones de pelisalcarta")
    if os.path.isfile(lastupdatepath): 
      UltimaConsulta = float(open(lastupdatepath,"rb").read())
    else:
      UltimaConsulta = 0
    if int(time.time() - UltimaConsulta) > 3600:
    
      REMOTE_VERSION_FILE = downloadurl + "/update/version.xml"
      LOCAL_VERSION_FILE = os.path.join( config.get_runtime_path(), "version.xml" )
      data = scrapertools.cachePage(REMOTE_VERSION_FILE)

      if data:
        patron  = '<tag>([^<]+)</tag>'
        matches = re.compile(patron,re.DOTALL).findall(data)
        versiondescargada = matches[0]
      else:
        versiondescargada = 0
        
      data = open(LOCAL_VERSION_FILE).read()
      matches = re.compile(patron,re.DOTALL).findall(data)
      versionlocal = matches[0]
      
      logger.info("Versión local: " + versionlocal)
      logger.info("Versión remota: " + versiondescargada)
      
      from distutils.version import StrictVersion
      if StrictVersion(versiondescargada) > StrictVersion(versionlocal):
        if guitools.Dialog_YesNo("pelisalacarta","¡Hay una nueva versión lista para descargar!\nVersión actual: "+versionlocal+" - Nueva versión: "+versiondescargada+"\nQuieres instalarla ahora?"):
          update(Item(url=versiondescargada))
        else:
         if guitools.Dialog_YesNo("pelisalacarta","¿No volver a mostrar en una hora?"):
            open(lastupdatepath,"wb").write(str(time.time()))
            logger.info("Opciñon seleccionada: No Descargar")
    else:
        logger.info("No preguntar hasta: " + str(3600 - int(time.time() - UltimaConsulta)) + " Segundos" )
        
  #Actualizacion de canales      
  if config.get_setting("updatechannels") == "true":
    logger.info("Comprobando actualizaciones de canales")
    data = scrapertools.cache_page(giturl + "/pelisalacarta/pelisalacarta/channels?ref="+branch, headers=headers)
    RemoteJSONData = json.loads(data)
    
    if not os.path.isfile(channelspath): CreateChannelsIndex()
    f = open(channelspath,"r")
    JSONData = json.loads(f.read())
    f.close()

    downloadchannels=[]
    if RemoteJSONData == JSONData:
      logger.info("Todos los canales estan actualizados")
    else:
      logger.info("Hay canales para actualizar")
      for file in RemoteJSONData:
        if not file in JSONData:
          
          downloadchannels.append(file)
          
    logger.info("Comprobando actualizaciones de servers")
    data = scrapertools.cache_page(giturl + "/pelisalacarta/servers?ref="+branch, headers=headers)
    RemoteJSONData = json.loads(data)
    
    if not os.path.isfile(serverspath): CreateServersIndex()
    f = open(serverspath,"r")
    JSONData = json.loads(f.read())
    f.close()

    downloadservers=[]
    if RemoteJSONData == JSONData:
      logger.info("Todos los servers estan actualizados")
    else:
      logger.info("Hay servers para actualizar")
      for file in RemoteJSONData:
        if not file in JSONData:
          downloadservers.append(file)

    if downloadchannels or downloadservers:
        dialog = guitools.Dialog_Progress("Actualizando...","")
        
        for file in downloadchannels:
          if dialog.IsCanceled(): break
          logger.info("Actualizando: " + file["name"])
          dialog.Actualizar(downloadchannels.index(file)*100 / (len(downloadchannels) + len(downloadservers)), "Actualizando canal: " + file["name"].encode("utf8")) 
          data = scrapertools.cachePage(file["download_url"])
          open(os.path.join(config.get_runtime_path(), "..", *file["path"].split("/")),"wb").write(data)
          import inspect 
          for module in sys.modules.keys(): 
            if inspect.ismodule(sys.modules[module]): 
              if file["name"].encode("utf8").replace(".py","") in module:
                reload(sys.modules[module]) 

        for file in downloadservers:
          if dialog.IsCanceled(): break
          logger.info("Actualizando: " + file["name"])
          dialog.Actualizar((downloadservers.index(file) + len(downloadchannels)) *100 / (len(downloadchannels) + len(downloadservers)), "Actualizando server: " + file["name"].encode("utf8")) 
          data = scrapertools.cachePage(file["download_url"])
          open(os.path.join(config.get_runtime_path(), "..", *file["path"].split("/")),"wb").write(data)
          import inspect 
          for module in sys.modules.keys(): 
            if inspect.ismodule(sys.modules[module]): 
              if file["name"].encode("utf8").replace(".py","") in module:
                reload(sys.modules[module]) 

        
        if dialog.IsCanceled(): 
          dialog.Cerrar()
          CreateChannelsIndex()
          CreateServersIndex()
          guitools.Dialog_OK("Actualizaciones", "¡El proceso se ha cancelado!" )

        else:
          dialog.Cerrar()
          CreateChannelsIndex()
          CreateServersIndex()
          guitools.Dialog_OK("Actualizaciones", "¡Canales descargados con éxito!" )
Пример #50
0
def render_items(itemlist, parent_item):
    """
    Función encargada de mostrar el itemlist en kodi, se pasa como parametros el itemlist y el item del que procede
    @type itemlist: list
    @param itemlist: lista de elementos a mostrar

    @type parent_item: item
    @param parent_item: elemento padre
    """
    # Si el itemlist no es un list salimos
    if not type(itemlist) == list:

        return

    if parent_item.start:
        menu_icon = get_thumb('menu.png')
        menu = Item(channel="channelselector",
                    action="getmainlist",
                    viewmode="movie",
                    thumbnail=menu_icon,
                    title='Menu')
        itemlist.insert(0, menu)

    # Si no hay ningun item, mostramos un aviso
    if not len(itemlist):
        itemlist.append(Item(title="No hay elementos que mostrar"))

    # Recorremos el itemlist
    for item in itemlist:
        # Si el item no contiene categoria, le ponemos la del item padre
        if item.category == "":
            item.category = parent_item.category

        # Si el item no contiene fanart, le ponemos el del item padre
        if item.fanart == "":
            item.fanart = parent_item.fanart

        # Formatear titulo
        if item.text_color:
            item.title = '[COLOR %s]%s[/COLOR]' % (item.text_color, item.title)
        if item.text_bold:
            item.title = '[B]%s[/B]' % item.title
        if item.text_italic:
            item.title = '[I]%s[/I]' % item.title

        # Añade headers a las imagenes si estan en un servidor con cloudflare
        from core import httptools
        item.thumbnail = httptools.get_url_headers(item.thumbnail)
        item.fanart = httptools.get_url_headers(item.fanart)

        # IconImage para folder y video
        if item.folder:
            icon_image = "DefaultFolder.png"
        else:
            icon_image = "DefaultVideo.png"

        # Ponemos el fanart
        if item.fanart:
            fanart = item.fanart
        else:
            fanart = os.path.join(config.get_runtime_path(), "fanart.jpg")

        # Creamos el listitem
        listitem = xbmcgui.ListItem(item.title)

        # values icon, thumb or poster are skin dependent.. so we set all to avoid problems
        # if not exists thumb it's used icon value
        if config.get_platform(True)['num_version'] >= 16.0:
            listitem.setArt({
                'icon': icon_image,
                'thumb': item.thumbnail,
                'poster': item.thumbnail,
                'fanart': fanart
            })
        else:
            listitem.setIconImage(icon_image)
            listitem.setThumbnailImage(item.thumbnail)
            listitem.setProperty('fanart_image', fanart)

        # No need it, use fanart instead
        # xbmcplugin.setPluginFanart(int(sys.argv[1]), os.path.join(config.get_runtime_path(), "fanart.jpg"))

        # Esta opcion es para poder utilizar el xbmcplugin.setResolvedUrl()
        # if item.isPlayable == True or (config.get_setting("player_mode") == 1 and item.action == "play"):
        if config.get_setting("player_mode") == 1 and item.action == "play":
            if item.folder:
                item.folder = False
            listitem.setProperty('IsPlayable', 'true')

        # Añadimos los infoLabels
        set_infolabels(listitem, item)

        # Montamos el menu contextual
        context_commands = set_context_commands(item, parent_item)

        # Añadimos el item
        if config.get_platform(True)['num_version'] >= 17.0:
            listitem.addContextMenuItems(context_commands)
        else:
            listitem.addContextMenuItems(context_commands, replaceItems=True)

        if not item.totalItems:
            item.totalItems = 0
        xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]),
                                    url='%s?%s' % (sys.argv[0], item.tourl()),
                                    listitem=listitem,
                                    isFolder=item.folder,
                                    totalItems=item.totalItems)

    # Fijar los tipos de vistas...
    if config.get_setting("forceview"):
        # ...forzamos segun el viewcontent
        xbmcplugin.setContent(int(sys.argv[1]), parent_item.viewcontent)
    elif parent_item.channel not in ["channelselector", ""]:
        # ... o segun el canal
        xbmcplugin.setContent(int(sys.argv[1]), "movies")

    # Fijamos el "breadcrumb"
    xbmcplugin.setPluginCategory(handle=int(sys.argv[1]),
                                 category=parent_item.category.capitalize())

    # No ordenar items
    xbmcplugin.addSortMethod(handle=int(sys.argv[1]),
                             sortMethod=xbmcplugin.SORT_METHOD_NONE)

    # Cerramos el directorio
    xbmcplugin.endOfDirectory(handle=int(sys.argv[1]), succeeded=True)

    # Fijar la vista
    if config.get_setting("forceview"):
        viewmode_id = get_viewmode_id(parent_item)
        xbmc.executebuiltin("Container.SetViewMode(%s)" % viewmode_id)
    if parent_item.mode in ['silent', 'get_cached', 'set_cache', 'finish']:
        xbmc.executebuiltin("Container.SetViewMode(500)")
Пример #51
0
# Logger multiplataforma
#------------------------------------------------------------
# pelisalacarta
# http://blog.tvalacarta.info/plugin-xbmc/pelisalacarta/
#------------------------------------------------------------
# Creado por: Jesús ([email protected])
# Licencia: GPL (http://www.gnu.org/licenses/gpl-3.0.html)
#------------------------------------------------------------
# Historial de cambios:
#------------------------------------------------------------

import platform_name
import os
import config

if os.path.exists(os.path.join( config.get_runtime_path(),"platformcode",platform_name.PLATFORM_NAME,"logger.py")):
  exec "import platformcode."+platform_name.PLATFORM_NAME+".logger as platformlogger"
  default = False
else:
  default = True

def info(texto):
    if config.get_setting("debug")=="true":
        if not default:
            platformlogger.info(texto)
        else:
            print texto

def debug(texto):
    if config.get_setting("debug")=="true":
        if not default:
def get_channel_parameters(channel_name):
    #logger.info("streamondemand.core.channeltools get_channel_parameters channel_name="+channel_name)

    channel_xml = os.path.join(config.get_runtime_path(), 'channels', channel_name+".xml")

    if os.path.exists(channel_xml):
        # logger.info("channel_name+".xml found")

        infile = open(channel_xml, "rb")
        data = infile.read()
        infile.close()

        channel_parameters = dict()
        channel_parameters["title"] = scrapertools.find_single_match(data, "<name>([^<]*)</name>")
        channel_parameters["channel"] = scrapertools.find_single_match(data, "<id>([^<]*)</id>")
        channel_parameters["active"] = scrapertools.find_single_match(data, "<active>([^<]*)</active>")
        channel_parameters["adult"] = scrapertools.find_single_match(data, "<adult>([^<]*)</adult>")
        channel_parameters["language"] = scrapertools.find_single_match(data, "<language>([^<]*)</language>")
        # Imagenes: se admiten url y archivos locales dentro de "resources/images"
        channel_parameters["thumbnail"] = scrapertools.find_single_match(data, "<thumbnail>([^<]*)</thumbnail>")
        channel_parameters["bannermenu"] = scrapertools.find_single_match(data, "<bannermenu>([^<]*)</bannermenu>")
        channel_parameters["fanart"] = scrapertools.find_single_match(data, "<fanart>([^<]*)</fanart>")
        channel_parameters["update_url"] = scrapertools.find_single_match(data, "<update_url>([^<]*)</update_url>")

        if channel_parameters["thumbnail"] and "://" not in channel_parameters["thumbnail"]:
            channel_parameters["thumbnail"] = os.path.join(config.get_runtime_path(), "resources", "images", "squares",
                                                           channel_parameters["thumbnail"])
        if channel_parameters["bannermenu"] and "://" not in channel_parameters["bannermenu"]:
            channel_parameters["bannermenu"] = os.path.join(config.get_runtime_path(), "resources", "images",
                                                            "bannermenu", channel_parameters["bannermenu"])
        if channel_parameters["fanart"] and "://" not in channel_parameters["fanart"]:
            channel_parameters["fanart"] = os.path.join(config.get_runtime_path(), "resources", "images", "fanart",
                                                        channel_parameters["fanart"])

        if channel_parameters["update_url"] == "":
            channel_parameters["update_url"] = DEFAULT_UPDATE_URL

        channel_parameters["include_in_global_search"] = scrapertools.find_single_match(
            data, "<include_in_global_search>([^<]*)</include_in_global_search>")

        category_list = []
        matches = scrapertools.find_multiple_matches(data, "<category>([^<]*)</category>")
        for match in matches:
            category_list.append(match)

        channel_parameters["categories"] = category_list
        # Obtenemos si el canal tiene opciones de configuración
        channel_parameters["has_settings"] = False
        # esta regex devuelve 2 valores por elemento <settings>, el contenido del propio nodo y un \t, por lo que hay
        # posteriormente coger solo el valor del indice 0.
        matches = scrapertools.find_multiple_matches(data, "<settings>((.|\n)*?)<\/settings>")
        for match in matches:
            _id = scrapertools.find_single_match(match[0], "<id>([^<]*)</id>")
            if _id and "include_in_" not in _id:
                channel_parameters["has_settings"] = True
                break

        logger.info(channel_name+" -> "+repr(channel_parameters))

    else:
        logger.info(channel_name+".xml NOT found")

        channel_parameters = dict()
        channel_parameters["adult"] = "false"
        channel_parameters["update_url"] = DEFAULT_UPDATE_URL

    return channel_parameters
Пример #53
0
def Dialog_YesNo(title, text):
    import ui
    return ui.YesNoWindow("YesNoDialog.xml",config.get_runtime_path()).show(title,text)
Пример #54
0
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with streamondemand 5.  If not, see <http://www.gnu.org/licenses/>.
# --------------------------------------------------------------------------------
# Updater process
# --------------------------------------------------------------------------------

import os
import time

import config
import logger
import scrapertools

ROOT_DIR = config.get_runtime_path()

REMOTE_VERSION_FILE = "https://raw.githubusercontent.com/streamondemand/plugin.video.streamondemand/master/version.xml"
REMOTE_FILE = "https://github.com/streamondemand/plugin.video.streamondemand/archive/master.zip"

LOCAL_FILE = os.path.join(ROOT_DIR, config.PLUGIN_NAME + "-")

# DESTINATION_FOLDER sera siempre el lugar donde este la carpeta del plugin,
# No hace falta "xbmc.translatePath", get_runtime_path() ya tiene que devolver la ruta correcta
DESTINATION_FOLDER = os.path.join(ROOT_DIR, "..")


def get_current_plugin_version():
    return int(config.get_setting("plugin_version_number"))

Пример #55
0
def show_recaptcha(key, referer):
    from recaptcha import Recaptcha
    return Recaptcha("Recaptcha.xml",
                     config.get_runtime_path()).Start(key, referer)
Пример #56
0
def Dialog_OK(title, text):
    import ui
    ui.OKWindow("DialogOk.xml",config.get_runtime_path()).show(title,text)
Пример #57
0
import config
import logger

# FIXME: Esto está repetido en el channelselector, debería ir a config
thumbnail_type = config.get_setting("thumbnail_type")
if thumbnail_type == "":
    thumbnail_type = "2"
logger.info("thumbnail_type=" + thumbnail_type)
if thumbnail_type == "0":
    IMAGES_PATH = 'http://media.tvalacarta.info/pelisalacarta/posters/'
elif thumbnail_type == "1":
    IMAGES_PATH = 'http://media.tvalacarta.info/pelisalacarta/banners/'
elif thumbnail_type == "2":
    IMAGES_PATH = 'http://media.tvalacarta.info/pelisalacarta/squares/'

ROOT_DIR = config.get_runtime_path()

REMOTE_VERSION_FILE = "https://raw.githubusercontent.com/streamondemand/plugin.video.streamondemand/master/version.xml"
LOCAL_VERSION_FILE = os.path.join(ROOT_DIR, "version.xml")
LOCAL_FILE = os.path.join(ROOT_DIR, config.PLUGIN_NAME + "-")

try:
    # Añadida a la opcion : si plataforma xbmcdharma es "True", no debe ser con la plataforma de la xbox
    # porque seria un falso "True", ya que el xbmc en las xbox no son dharma por lo tanto no existen los addons
    logger.info("streamondemand.core.updater get_platform=" +
                config.get_platform())
    logger.info("streamondemand.core.updater get_system_platform=" +
                config.get_system_platform())
    if config.get_platform() == "kodi-jarvis":
        import xbmc
        REMOTE_FILE = "https://github.com/streamondemand/plugin.video.streamondemand/archive/master.zip"
Пример #58
0
import os
import downloadtools
import config
import logger
import samba
import scrapertools
from item import Item
from xml.dom import minidom
import scrapertools

CHANNELNAME = "wiideoteca"
DEBUG = True
XML = os.path.join( config.get_setting("bookmarkpath"),"series.xml")
if not os.path.exists(XML) and os.path.exists(config.get_setting("bookmarkpath")):
    import shutil
    shutil.copyfile( os.path.join(config.get_runtime_path(),"resources","wiideoteca.xml") , XML )

XML2 = XML.replace("series","pruebas")
title = []
fulltitle = []
thumbnail = []
channel = []
directory = []
idioma = []
plot = []
solonuevos = []
ultimo = []
url = []
borrar = []

def isGeneric():
Пример #59
0
def checkforupdates(plugin_mode=True):
    logger.info("streamondemand.core.updater checkforupdates")

    # Descarga el fichero con la versión en la web
    logger.info("streamondemand.core.updater Verificando actualizaciones...")
    logger.info("streamondemand.core.updater Version remota: " +
                REMOTE_VERSION_FILE)
    data = scrapertools.cachePage(REMOTE_VERSION_FILE)
    '''    
    <?xml version="1.0" encoding="utf-8" standalone="yes"?>
    <version>
            <name>streamondemand</name>
            <tag>4.0     </tag>
            <version>4000</tag>
            <date>20/03/2015</date>
            <changes>New release</changes>
    </version>
    '''

    version_publicada = scrapertools.find_single_match(
        data, "<version>([^<]+)</version>").strip()
    tag_publicada = scrapertools.find_single_match(
        data, "<tag>([^<]+)</tag>").strip()
    logger.info("streamondemand.core.updater version remota=" + tag_publicada +
                " " + version_publicada)

    # Lee el fichero con la versión instalada
    localFileName = LOCAL_VERSION_FILE
    logger.info("streamondemand.core.updater fichero local version: " +
                localFileName)
    infile = open(localFileName)
    data = infile.read()
    infile.close()
    #logger.info("xml local="+data)

    version_local = scrapertools.find_single_match(
        data, "<version>([^<]+)</version>").strip()
    tag_local = scrapertools.find_single_match(data,
                                               "<tag>([^<]+)</tag>").strip()
    logger.info("streamondemand.core.updater version local=" + tag_local +
                " " + version_local)

    try:
        numero_version_publicada = int(version_publicada)
        numero_version_local = int(version_local)
    except:
        import traceback
        logger.info(traceback.format_exc())
        version_publicada = ""
        version_local = ""

    if version_publicada == "" or version_local == "":
        arraydescargada = tag_publicada.split(".")
        arraylocal = tag_local.split(".")

        # local 2.8.0 - descargada 2.8.0 -> no descargar
        # local 2.9.0 - descargada 2.8.0 -> no descargar
        # local 2.8.0 - descargada 2.9.0 -> descargar
        if len(arraylocal) == len(arraydescargada):
            logger.info("caso 1")
            hayqueactualizar = False
            for i in range(0, len(arraylocal)):
                print arraylocal[i], arraydescargada[i], int(
                    arraydescargada[i]) > int(arraylocal[i])
                if int(arraydescargada[i]) > int(arraylocal[i]):
                    hayqueactualizar = True
        # local 2.8.0 - descargada 2.8 -> no descargar
        # local 2.9.0 - descargada 2.8 -> no descargar
        # local 2.8.0 - descargada 2.9 -> descargar
        if len(arraylocal) > len(arraydescargada):
            logger.info("caso 2")
            hayqueactualizar = False
            for i in range(0, len(arraydescargada)):
                #print arraylocal[i], arraydescargada[i], int(arraydescargada[i]) > int(arraylocal[i])
                if int(arraydescargada[i]) > int(arraylocal[i]):
                    hayqueactualizar = True
        # local 2.8 - descargada 2.8.8 -> descargar
        # local 2.9 - descargada 2.8.8 -> no descargar
        # local 2.10 - descargada 2.9.9 -> no descargar
        # local 2.5 - descargada 3.0.0
        if len(arraylocal) < len(arraydescargada):
            logger.info("caso 3")
            hayqueactualizar = True
            for i in range(0, len(arraylocal)):
                #print arraylocal[i], arraydescargada[i], int(arraylocal[i])>int(arraydescargada[i])
                if int(arraylocal[i]) > int(arraydescargada[i]):
                    hayqueactualizar = False
                elif int(arraylocal[i]) < int(arraydescargada[i]):
                    hayqueactualizar = True
                    break
    else:
        hayqueactualizar = (numero_version_publicada > numero_version_local)

    if hayqueactualizar:

        if plugin_mode:

            logger.info("streamondemand.core.updater actualizacion disponible")

            # Añade al listado de XBMC
            import xbmcgui
            #thumbnail = IMAGES_PATH+"Crystal_Clear_action_info.png"
            thumbnail = os.path.join(config.get_runtime_path(), "resources",
                                     "images", "service_update.png")
            logger.info("thumbnail=" + thumbnail)
            listitem = xbmcgui.ListItem("Scarica la versione " + tag_publicada,
                                        thumbnailImage=thumbnail)
            itemurl = '%s?action=update&version=%s' % (sys.argv[0],
                                                       tag_publicada)
            import xbmcplugin
            xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]),
                                        url=itemurl,
                                        listitem=listitem,
                                        isFolder=True)

            # Avisa con un popup
            dialog = xbmcgui.Dialog()
            dialog.ok(
                "Versione " + tag_publicada + " disponibile",
                "E' possibile scaricare la nuova versione del plugin\nattraverso l'opzione nel menù principale."
            )

        else:

            import xbmcgui
            yes_pressed = xbmcgui.Dialog().yesno(
                "Versione " + tag_publicada + " disponibile", "Installarla?")

            if yes_pressed:
                params = {"version": tag_publicada}
                update(params)
    '''
# http://blog.tvalacarta.info/plugin-xbmc/pelisalacarta
# XBMC Plugin
#------------------------------------------------------------

import urlparse,urllib2,urllib,re
import os
import sys
import scrapertools
import time
import config
import logger

PLUGIN_NAME = "tvalacarta"

if config.get_setting("thumbnail_type")=="0":
    IMAGES_PATH = os.path.join( config.get_runtime_path(), 'resources' , 'images' , 'posters' )
else:
    IMAGES_PATH = os.path.join( config.get_runtime_path(), 'resources' , 'images' , 'banners' )

ROOT_DIR = config.get_runtime_path()

REMOTE_VERSION_FILE = "http://blog.tvalacarta.info/descargas/"+PLUGIN_NAME+"-version.xml"
LOCAL_VERSION_FILE = os.path.join( ROOT_DIR , "version.xml" )
LOCAL_FILE = os.path.join( ROOT_DIR , PLUGIN_NAME+"-" )

try:
    # Añadida a la opcion : si plataforma xbmcdharma es "True", no debe ser con la plataforma de la xbox
    # porque seria un falso "True", ya que el xbmc en las xbox no son dharma por lo tanto no existen los addons
    logger.info("[updater.py] get_platform="+config.get_platform())
    logger.info("[updater.py] get_system_platform="+config.get_system_platform())
    if config.get_platform()=="xbmcdharma" and not config.get_system_platform() == "xbox":