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
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
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 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
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")
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
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
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
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>"))
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
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)
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
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)
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
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
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)
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
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
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
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
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
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
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
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']
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
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']
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(): 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!" )
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)")
# 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
def Dialog_YesNo(title, text): import ui return ui.YesNoWindow("YesNoDialog.xml",config.get_runtime_path()).show(title,text)
# 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"))
def show_recaptcha(key, referer): from recaptcha import Recaptcha return Recaptcha("Recaptcha.xml", config.get_runtime_path()).Start(key, referer)
def Dialog_OK(title, text): import ui ui.OKWindow("DialogOk.xml",config.get_runtime_path()).show(title,text)
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"
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():
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":