From b9b25ca3f873bad03213e9c49f59423d86edf040 Mon Sep 17 00:00:00 2001 From: Kingbox <37674310+lopezvg@users.noreply.github.com> Date: Wed, 29 Aug 2018 12:18:35 +0200 Subject: [PATCH] NewPct1: mejoras de Fail-over MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Mejoras en la redirección y fail-over de clones de Newpct1 - Función para borrar canales (basura) de la videoteca --- plugin.video.alfa/channels/newpct1.json | 2 +- plugin.video.alfa/channels/newpct1.py | 19 +- plugin.video.alfa/lib/generictools.py | 373 +++++++++++++++------- plugin.video.alfa/videolibrary_service.py | 9 +- 4 files changed, 269 insertions(+), 134 deletions(-) diff --git a/plugin.video.alfa/channels/newpct1.json b/plugin.video.alfa/channels/newpct1.json index 63ed5864..71fbcd79 100644 --- a/plugin.video.alfa/channels/newpct1.json +++ b/plugin.video.alfa/channels/newpct1.json @@ -60,7 +60,7 @@ "id": "intervenidos_channels_list", "type": "text", "label": "Lista de canales y clones de NewPct1 intervenidos y orden de sustitución de URLs", - "default": "('0', 'canal_org', 'canal_des', 'url_org', 'url_des', 'patron1', 'patron2', 'patron3', 'patron4', 'patron5', 'content_inc', 'content_exc', 'ow_force'), ('1', 'mejortorrent', 'mejortorrent1', 'http://www.mejortorrent.com/', 'https://mejortorrent1.com/', '(http.?:\/\/.*?\/)', 'http.?:\/\/.*?\/.*?-torrent.?-[^-]+-(?:[^-]+-)([^0-9]+-)', 'http.?:\/\/.*?\/.*?-torrent.?-[^-]+-(?:[^-]+-)[^0-9]+-\\d+-(Temporada-).html', 'http.?:\/\/.*?\/.*?-torrent.?-[^-]+-(?:[^-]+-)[^0-9]+-(\\d+)-', '', 'tvshow, season', '', 'force'), ('1', 'mejortorrent', 'mejortorrent1', 'http://www.mejortorrent.com/', 'https://mejortorrent1.com/', '(http.?:\/\/.*?\/)', 'http.?:\/\/.*?\/.*?-torrent.?-[^-]+-([^.]+).html', '', '', '', 'movie', '', 'force')", + "default": "('0', 'canal_org', 'canal_des', 'url_org', 'url_des', 'patron1', 'patron2', 'patron3', 'patron4', 'patron5', 'content_inc', 'content_exc', 'ow_force'), ('1', 'mejortorrent', 'mejortorrent1', 'http://www.mejortorrent.com/', 'https://mejortorrent1.com/', '(http.?:\/\/.*?\/)', 'http.?:\/\/.*?\/.*?-torrent.?-[^-]+-(?:[^-]+-)([^0-9]+-)', 'http.?:\/\/.*?\/.*?-torrent.?-[^-]+-(?:[^-]+-)[^0-9]+-\\d+-(Temporada-).html', 'http.?:\/\/.*?\/.*?-torrent.?-[^-]+-(?:[^-]+-)[^0-9]+-(\\d+)-', '', 'tvshow, season', '', 'force'), ('1', 'mejortorrent', 'mejortorrent1', 'http://www.mejortorrent.com/', 'https://mejortorrent1.com/', '(http.?:\/\/.*?\/)', 'http.?:\/\/.*?\/.*?-torrent.?-[^-]+-([^.]+).html', '', '', '', 'movie', '', 'force'), ('1', 'newpct1', '', '', '', '', '', '', '', '', '*', '', 'del'), ('1', 'videolibrary', '', '', '', '', '', '', '', '', '*', '', 'del')", "enabled": true, "visible": false }, diff --git a/plugin.video.alfa/channels/newpct1.py b/plugin.video.alfa/channels/newpct1.py index 489713fc..7a11e3aa 100644 --- a/plugin.video.alfa/channels/newpct1.py +++ b/plugin.video.alfa/channels/newpct1.py @@ -1165,6 +1165,8 @@ def findvideos(item): logger.info() itemlist = [] + #logger.debug(item) + #Renombramos el canal al nombre de clone elegido. Actualizados URL host = scrapertools.find_single_match(item.url, '(http.?\:\/\/(?:www.)?\w+\.\w+\/)') item.channel_host = host @@ -1306,7 +1308,7 @@ def findvideos(item): item.category = category_servidores #restauramos valores originales item.url = url_servidores - # Nuevo sistema de scrapeo de servidores creado por Torrentlocula, compatible con otros clones de Newpct1 + # Sistema de scrapeo de servidores creado por Torrentlocula, compatible con otros clones de Newpct1 patron = '
<\/div[^<]+
([^<]+)?<\/div[^<]+
([^<]+)?' patron += '<\/div[^<]+
([^<]+)?<\/div[^<]+
0 and ver_enlaces_descargas != 0: @@ -1530,12 +1531,12 @@ def findvideos(item): ver_enlaces_descargas = 0 #FORZAR SALIR de DESCARGAS break #Si se ha agotado el contador de verificación, se sale de "Enlace" - if item_local.alive == "??": #dudoso + if "??" in item_local.alive: #dudoso if not item.unify: #Si titles Inteligentes NO seleccionados: parte_title = '[COLOR yellow][?][/COLOR] %s' % (parte_title) else: parte_title = '[COLOR yellow]%s[/COLOR]-%s' % (item_local.alive, parte_title) - elif item_local.alive.lower() == "no": #No está activo. Lo preparo, pero no lo pinto + elif "no" in item_local.alive.lower(): #No está activo. Lo preparo, pero no lo pinto if not item.unify: #Si titles Inteligentes NO seleccionados: parte_title = '[COLOR red][%s][/COLOR] %s' % (item_local.alive, parte_title) else: @@ -1552,7 +1553,7 @@ def findvideos(item): item_local.title = re.sub(r'\[COLOR \w+\]-\[\/COLOR\]', '', item_local.title).strip() itemlist.append(item_local.clone()) except: - pass + logger.error('ERROR al procesar enlaces DESCARGAR DIRECTOS: ' + servidor + ' / ' + enlace) return itemlist diff --git a/plugin.video.alfa/lib/generictools.py b/plugin.video.alfa/lib/generictools.py index d569c642..bed1e5fe 100644 --- a/plugin.video.alfa/lib/generictools.py +++ b/plugin.video.alfa/lib/generictools.py @@ -241,7 +241,6 @@ def post_tmdb_listado(item, itemlist): #Ajustamos el nombre de la categoría if not item.category_new: item.category_new = '' - item.category = scrapertools.find_single_match(item.url, 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/').capitalize() for item_local in itemlist: #Recorremos el Itenlist generado por el canal title = item_local.title @@ -262,7 +261,8 @@ def post_tmdb_listado(item, itemlist): del item_local.extra2 #Ajustamos el nombre de la categoría - item_local.category = scrapertools.find_single_match(item_local.url, 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/').capitalize() + if item_local.channel == channel_py: + item_local.category = scrapertools.find_single_match(item_local.url, 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/').capitalize() #Restauramos la info adicional guarda en la lista title_subs, y la borramos de Item title_add = ' ' @@ -616,7 +616,8 @@ def post_tmdb_episodios(item, itemlist): del item.contentSeason_save #Ajustamos el nombre de la categoría - item.category = scrapertools.find_single_match(item.url, 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/').capitalize() + if item.channel == channel_py: + item.category = scrapertools.find_single_match(item.url, 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/').capitalize() #Restauramos valores si ha habido fail-over channel_alt = '' @@ -640,6 +641,10 @@ def post_tmdb_episodios(item, itemlist): del item.ow_force if item.season_colapse: del item.season_colapse + if item.from_action: + del item.from_action + if item.from_channel: + del item.from_channel for item_local in itemlist: #Recorremos el Itemlist generado por el canal if item_local.add_videolibrary: @@ -670,10 +675,15 @@ def post_tmdb_episodios(item, itemlist): del item_local.ow_force if item_local.season_colapse: del item_local.season_colapse + if item_local.from_action: + del item_local.from_action + if item_local.from_channel: + del item_local.from_channel #logger.debug(item_local) #Ajustamos el nombre de la categoría si es un clone de NewPct1 - item_local.category = scrapertools.find_single_match(item_local.url, 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/').capitalize() + if item_local.channel == channel_py: + item_local.category = scrapertools.find_single_match(item_local.url, 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/').capitalize() #Restauramos valores para cada Episodio si ha habido fail-over de un clone de NewPct1 if item_local.channel == channel_py: @@ -777,7 +787,10 @@ def post_tmdb_episodios(item, itemlist): if num_episodios and not item_local.infoLabels['temporada_num_episodios']: item_local.infoLabels['temporada_num_episodios'] = num_episodios num_episodios_flag = False - num_episodios_lista[item_local.contentSeason] = num_episodios + try: + num_episodios_lista[item_local.contentSeason] = num_episodios + except: + pass #logger.debug("title: " + item_local.title + " / url: " + item_local.url + " / calidad: " + item_local.quality + " / Season: " + str(item_local.contentSeason) + " / EpisodeNumber: " + str(item_local.contentEpisodeNumber) + " / num_episodios_lista: " + str(num_episodios_lista) + str(num_episodios_flag)) #logger.debug(item_local) @@ -932,6 +945,10 @@ def post_tmdb_findvideos(item, itemlist): except: pass + #Ajustamos el nombre de la categoría + if item.channel == channel_py: + item.category = scrapertools.find_single_match(item.url, 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/').capitalize() + #Quitamos el la categoría o nombre del título, si lo tiene if item.contentTitle: item.contentTitle = re.sub(r' -%s-' % item.category, '', item.contentTitle) @@ -986,7 +1003,7 @@ def post_tmdb_findvideos(item, itemlist): horas = tiempo_final / 60 #Lo transformo a horas resto = tiempo_final - (horas * 60) #guardo el resto de minutos de la hora if not scrapertools.find_single_match(item.quality, '(\[\d+:\d+)'): #si ya tiene la duración, pasamos - item.quality += ' [COLOR white][%s:%s h]' % (str(horas).zfill(2), str(resto).zfill(2)) #Lo agrego a Calidad del Servidor + item.quality += ' [/COLOR][COLOR white][%s:%s h]' % (str(horas).zfill(2), str(resto).zfill(2)) #Lo agrego a Calidad del Servidor except: pass @@ -1186,44 +1203,43 @@ def fail_over_newpct1(item, patron, patron2=None, timeout=None): data = '' channel_failed = '' url_alt = [] - if not item.category: - item.category = scrapertools.find_single_match(item.url, 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/').capitalize() + item.category = scrapertools.find_single_match(item.url, 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/').capitalize() if not item.extra2: item.extra2 = 'z9z8z7z6z5' #Array con los datos de los canales alternativos #Cargamos en .json del canal para ver las listas de valores en settings fail_over = channeltools.get_channel_json(channel_py) - for settings in fail_over['settings']: #Se recorren todos los settings - if settings['id'] == "clonenewpct1_channels_list": #Encontramos en setting - fail_over = settings['default'] #Carga lista de clones + for settings in fail_over['settings']: #Se recorren todos los settings + if settings['id'] == "clonenewpct1_channels_list": #Encontramos en setting + fail_over = settings['default'] #Carga lista de clones break fail_over_list = ast.literal_eval(fail_over) - if item.from_channel: #Desde search puede venir con el nombre de canal equivocado + if item.from_channel and item.from_channel != 'videolibrary': #Desde search puede venir con el nombre de canal equivocado item.channel = item.from_channel #Recorremos el Array identificando el canal que falla for active, channel, channel_host, contentType, action_excluded in fail_over_list: if item.channel == channel_py: - if channel != item.category.lower(): #es el canal/categoría que falla? + if channel != item.category.lower(): #es el canal/categoría que falla? continue else: - if channel != item.channel: #es el canal que falla? + if channel != item.channel: #es el canal que falla? continue - channel_failed = channel #salvamos el nombre del canal o categoría - channel_host_failed = channel_host #salvamos el nombre del host - channel_url_failed = item.url #salvamos la url - if patron == True and active == '1': #solo nos han pedido verificar el clone - return (item, data) #nos vamos, con el mismo clone, si está activo + channel_failed = channel #salvamos el nombre del canal o categoría + channel_host_failed = channel_host #salvamos el nombre del host + channel_url_failed = item.url #salvamos la url + if patron == True and active == '1': #solo nos han pedido verificar el clone + return (item, data) #nos vamos, con el mismo clone, si está activo if (item.action == 'episodios' or item.action == 'findvideos') and item.contentType not in contentType: #soporta el fail_over de este contenido? logger.error("ERROR 99: " + item.action.upper() + ": Acción no soportada para Fail-Over en canal: " + item.url) - return (item, data) #no soporta el fail_over de este contenido, no podemos hacer nada + return (item, data) #no soporta el fail_over de este contenido, no podemos hacer nada break if not channel_failed: logger.error('Patrón: ' + str(patron) + ' / fail_over_list: ' + str(fail_over_list)) logger.error(item) - return (item, data) #Algo no ha funcionado, no podemos hacer nada + return (item, data) #Algo no ha funcionado, no podemos hacer nada #Recorremos el Array identificando canales activos que funcionen, distintos del caído, que soporten el contenido for active, channel, channel_host, contentType, action_excluded in fail_over_list: @@ -1447,7 +1463,12 @@ def redirect_clone_newpct1(item, head_nfo=None, it=None, path=False, overwrite=F - force: indica al canal que analize toda la serie y que videolibrary_service la reescriba - auto: indica a videolibrary_service que la reescriba - no: no acción para videolibrary_service, solo redirige en visionado de videolibrary - ejemplo: ('1', 'mejortorrent', 'mejortorrent1', 'http://www.mejortorrent.com/', 'https://mejortorrent1.com/', 'auto') + - del: borra las estrucuturas de un determinado canal en videolibrary_service, quizás creadas por errores de un canal + ejemplos: + ('1', 'mejortorrent', 'mejortorrent1', 'http://www.mejortorrent.com/', 'https://mejortorrent1.com/', '(http.?:\/\/.*?\/)', 'http.?:\/\/.*?\/.*?-torrent.?-[^-]+-(?:[^-]+-)([^0-9]+-)', 'http.?:\/\/.*?\/.*?-torrent.?-[^-]+-(?:[^-]+-)[^0-9]+-\\d+-(Temporada-).html', 'http.?:\/\/.*?\/.*?-torrent.?-[^-]+-(?:[^-]+-)[^0-9]+-(\\d+)-', '', 'tvshow, season', '', 'force'), + ('1', 'mejortorrent', 'mejortorrent1', 'http://www.mejortorrent.com/', 'https://mejortorrent1.com/', '(http.?:\/\/.*?\/)', 'http.?:\/\/.*?\/.*?-torrent.?-[^-]+-([^.]+).html', '', '', '', 'movie', '', 'force')", + ('1', 'torrentrapid', 'torrentlocura', 'http://torrentrapid.com/', 'http://torrentlocura.com/', '', '', '', '', '', '*', '', 'no'), + ('1', 'newpct1', '', '', '', '', '', '', '', '', '*', '', 'del'), La llamada recibe el parámetro Item, el .nfo y los devuleve actualizados, así como opcionalmente el parámetro "overwrite· que puede forzar la reescritura de todos los archivos de la serie, y el parámetro "path" si viene de videolibrary_service. Por último, recibe opcionalmente el parámetro "lookup" si se quiere solo averigurar si habrá migración para ese título, pero sin realizarla. @@ -1458,6 +1479,22 @@ def redirect_clone_newpct1(item, head_nfo=None, it=None, path=False, overwrite=F ow_force_param = True channel_enabled = False update_stat = 0 + delete_stat = 0 + canal_org_des_list = [] + json_path_list = [] + + if item.ow_force == '1': #Ha podido qudar activado de una pasada anteriores + del item.ow_force + logger.error('** item.ow_force: ' + item.path) #aviso que ha habido una incidencia + if it.ow_force == '1': #Ha podido qudar activado de una pasada anteriores + del it.ow_force + if path and it.contentType != 'movies': + try: + nfo = filetools.join(path, '/tvshow.nfo') + filetools.write(nfo, head_nfo + it.tojson()) #escribo el .nfo de la peli por si aborta update + logger.error('** .nfo ACTUALIZADO: it.ow_force: ' + nfo) #aviso que ha habido una incidencia + except: + logger.error('** .nfo ERROR actualizar: it.ow_force: ' + nfo) #aviso que ha habido una incidencia #Array con los datos de los canales alternativos #Cargamos en .json de Newpct1 para ver las listas de valores en settings @@ -1469,133 +1506,223 @@ def redirect_clone_newpct1(item, head_nfo=None, it=None, path=False, overwrite=F intervencion = settings['default'] #Carga lista de clones y canales intervenidos #primero tratamos los clones de Newpct1 - channel_alt = item.channel #Salvamos en nombre del canal o clone - channel = "'%s'" % item.channel - if channel in fail_over_list: #Si es un clone de Newpct1, se actualiza el canal + channel_alt = item.channel + if item.url: + channel_alt = scrapertools.find_single_match(item.url, 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/').lower() #Salvamos en nombre del canal o clone + channel = "'%s'" % channel_alt + category = '' + if channel_alt != 'videolibrary': + item.category = channel_alt.capitalize() + category = "'%s'" % channel_alt + channel_py_alt = '' + if channel in fail_over_list : #Si es un clone de Newpct1, se actualiza el canal y la categoría item.channel = channel_py - + channel_py_alt = "'%s'" % channel_py + if item.channel_host: #y se borran resto de pasadas anteriores + del item.channel_host + #Ahora tratamos las webs intervenidas, tranformamos la url, el nfo y borramos los archivos obsoletos de la serie - if channel not in intervencion and channel_alt != 'videolibrary': #Hacemos una lookup para ver si... + if channel not in intervencion and channel_py_alt not in intervencion and category not in intervencion and channel_alt != 'videolibrary': #lookup return (item, it, overwrite) #... el canal/clone está listado import ast - intervencion_list = ast.literal_eval(intervencion) #Convertir a Array el string + intervencion_list = ast.literal_eval(intervencion) #Convertir a Array el string #logger.debug(intervencion_list) if lookup == True: - overwrite = False #Solo avisamos si hay cambios + overwrite = False #Solo avisamos si hay cambios for activo, canal_org, canal_des, url_org, url_des, patron1, patron2, patron3, patron4, patron5, content_inc, content_exc, ow_force in intervencion_list: - if activo == '1' and (canal_org == channel_alt or channel_alt == 'videolibrary'): #Es esta nuestra entrada? - if channel_alt == 'videolibrary': #Viene de videolibrary.list_movies - for canal_vid, url_vid in item.library_urls.items(): - if canal_org != canal_vid: #Miramos si canal_org de la regla está en item.library_urls - continue - else: - channel_alt = canal_org #Sí, ponermos el nombre del canal de origen - channel_b = "'%s'" % canal_org - if channel_b in fail_over_list: #Si es un clone de Newpct1, se actualiza a newpct1 - channel_alt = channel_py - if channel_alt == 'videolibrary': - continue - if item.contentType == "list": #Si viene de Videolibrary, le cambiamos ya el canal - if item.channel != channel_py: - item.channel = canal_des #Cambiamos el canal. Si es clone, lo hace el canal - continue #Salimos sin hacer nada más. item está casi vacío - if item.contentType not in content_inc and "*" not in content_inc: #Está el contenido el la lista de incluidos - continue - if item.contentType in content_exc: #Está el contenido excluido? - continue - if item.channel != channel_py: - channel_enabled = channeltools.is_enabled(channel_alt) #Verificamos que el canal esté inactivo - channel_enabled_alt = config.get_setting('enabled', channel_alt) - channel_enabled = channel_enabled * channel_enabled_alt #Si está inactivo en algún sitio, tomamos eso - if channel_enabled == 1 and canal_org != canal_des: #Si el canal está activo, puede ser solo... - continue #... una intervención que afecte solo a una región - if ow_force == 'no' and it.library_urls: #Esta regla solo vale para findvideos... - continue #... salidmos si estamos actualizando - if lookup == True: #Queremos que el canal solo visualice sin migración? - if ow_force != 'no': - overwrite = True #Avisamos que hay cambios - continue #Salimos sin tocar archivos - url_total = '' - if item.url: - url_total = item.url - elif not item.url and item.library_urls: - url_total = item.library_urls[canal_org] - url_total = url_total.replace(url_org, url_des) #reemplazamos una parte de url - url = '' - if patron1: #Hay expresión regex? - url += scrapertools.find_single_match(url_total, patron1) #La aplicamos a url - if patron2: #Hay más expresión regex? - url += scrapertools.find_single_match(url_total, patron2) #La aplicamos a url - if patron3: #Hay más expresión regex? - url += scrapertools.find_single_match(url_total, patron3) #La aplicamos a url - if patron4: #Hay más expresión regex? - url += scrapertools.find_single_match(url_total, patron4) #La aplicamos a url - if patron5: #Hay más expresión regex? - url += scrapertools.find_single_match(url_total, patron5) #La aplicamos a url - if url: - url_total = url #Guardamos la suma de los resultados intermedios - update_stat += 1 #Ya hemos actualizado algo - canal_org_def = canal_org - canal_des_def = canal_des - ow_force_def = ow_force + #Es esta nuestra entrada? + if activo == '1' and (canal_org == channel_alt or canal_org == item.channel or channel_alt == 'videolibrary' or ow_force == 'del'): - if update_stat > 0: #Ha habido alguna actualización? Entonces salvamos - if item.channel == channel_py or channel in fail_over_list: #Si es Newpct1... - if item.contentType == "tvshow": - url_total = re.sub(r'\/\d+\/?$', '', url_total) #parece que con el título ecuentra la serie, normalmente... - if item.url: - item.url = url_total #Salvamos la url convertida - if item.library_urls: - item.library_urls.pop(canal_org_def, None) - item.library_urls = {canal_des_def: url_total} - it.library_urls = item.library_urls - if item.channel != channel_py and item.channel != 'videolibrary': - item.channel = canal_des_def #Cambiamos el canal. Si es clone, lo hace el canal - if channel_alt == item.category.lower(): #Actualizamos la Categoría y si la tenía - item.category = item.channel.capitalize() - if ow_force_def == 'force' and item.contentType != "movie": #Queremos que el canal revise la serie entera? - item.ow_force = '1' #Se lo decimos - if ow_force_def in ['force', 'auto']: #Sobreescribir la series? - overwrite = True #Sí, lo marcamos + if ow_force == 'del': #Si es un borrado de estructuras erroneas, hacemos un proceso aparte + canal_des_def = canal_des #Si hay canal de sustitución para item.library_urls, lo usamos + if not canal_des_def and canal_org in item.library_urls and len(item.library_urls) == 1: #Si no, lo extraemos de la url + canal_des_def = scrapertools.find_single_match(item.library_urls[canal_org], 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/').lower() #salvamos la url actual de la estructura a borrar + url_total = '' + if item.url: + url_total = item.url #Si existe item.url, lo salvamos para futuro uso + if item.library_urls and canal_org in item.library_urls: #Si existe una entrada con el canal a borrar, lo procesamos + if lookup == True: #Queremos que el canal solo visualice sin migración? + overwrite = True #Avisamos que hay cambios + continue + logger.error('** REGLA: ' + canal_org + ', ' + canal_des+ ', ' + ow_force) + logger.error('item.library_urls PREVIA: ' + str(item.library_urls)) + url_total = item.library_urls[canal_org] #salvamos la url actual de la estructura a borrar + url_total_status = False + if len(item.library_urls) == 1 or canal_des: #si el nuevo canal no existe ya... + item.library_urls.update({canal_des_def: url_total}) #restauramos la url con el nuevo canal + url_total_status = True #marcamos esta url como válida + overwrite = True #Le decimos que sobreescriba todos los .jsons + item.ow_force = '1' #Le decimos que revise todas las temporadas + if len(item.library_urls) > 1: + item.library_urls.pop(canal_org, None) #borramos la url del canal a borrar + overwrite = True #Le decimos que sobreescriba todos los .jsons + item.ow_force = '1' #Le decimos que revise todas las temporadas + if it.library_urls: + it.library_urls = item.library_urls #lo salvamos en el .nfo, si lo hay + + if item.url and item.url == url_total and url_total_status == False: #si la url es la del canal borrado... + for canal_vid, url_vid in item.library_urls.items(): + canal_vid_alt = "'%s'" % canal_vid + if canal_vid_alt not in intervencion: #... la sustituimos por la primera válida + item.url = url_vid + break + if canal_vid_alt in fail_over_list: #Si es un clone de Newpct1, salvamos la nueva categoría + item.category = scrapertools.find_single_match(item.url, 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/').lower() #Salvamos categoría + else: + item.category = canal_vid.capitalize() #si no, salvamos nueva categoría + logger.error('item.library_urls ACTUALIZADA: ' + str(item.library_urls)) + + if lookup == False: #si es migración completa... + delete_stat += 1 #Ya hemos actualizado algo, o habrá que hacerlo... + canal_org_des_list += [(canal_org, canal_des, url_total, ow_force)] #salvamos el resultado para su proceso - #logger.debug(canal_org_def + canal_des_def + ow_force_def) - if it.library_urls and path != False and ow_force_def != 'no': #Continuamos si hay .nfo, path, y queremos actualizarlo - if item.update_next: - del item.update_next #Borramos estos campos para forzar la actualización ya - if it.update_next: - del it.update_next + else: + if channel_alt == 'videolibrary': #Viene de videolibrary.list_movies: IMPRESCINDIBLE + for canal_vid, url_vid in item.library_urls.items(): + if canal_org != canal_vid: #Miramos si canal_org de la regla está en item.library_urls + continue + else: + channel_alt = canal_org #Sí, ponermos el nombre del canal de origen + channel_b = "'%s'" % canal_org + if channel_b in fail_over_list: #Si es un clone de Newpct1, se actualiza a newpct1 + channel_alt = channel_py + if channel_alt == 'videolibrary': + continue + if item.contentType == "list": #Si viene de Videolibrary, le cambiamos ya el canal + if item.channel != channel_py: + item.channel = canal_des #Cambiamos el canal. Si es clone, lo hace el canal + continue #Salimos sin hacer nada más. item está casi vacío + if item.contentType not in content_inc and "*" not in content_inc: #Está el contenido el la lista de incluidos + continue + if item.contentType in content_exc: #Está el contenido excluido? + continue + if item.channel != channel_py: + channel_enabled = channeltools.is_enabled(channel_alt) #Verificamos que el canal esté inactivo + channel_enabled_alt = config.get_setting('enabled', channel_alt) + channel_enabled = channel_enabled * channel_enabled_alt #Si está inactivo en algún sitio, tomamos eso + if channel_enabled == 1 and canal_org != canal_des: #Si el canal está activo, puede ser solo... + continue #... una intervención que afecte solo a una región + if ow_force == 'no' and it.library_urls: #Esta regla solo vale para findvideos... + continue #... salidmos si estamos actualizando + if lookup == True: #Queremos que el canal solo visualice sin migración? + if ow_force != 'no': + overwrite = True #Avisamos que hay cambios + continue #Salimos sin tocar archivos + url_total = '' + if item.url: + url_total = item.url + elif not item.url and item.library_urls: + url_total = item.library_urls[canal_org] + url_total = url_total.replace(url_org, url_des) #reemplazamos una parte de url + url = '' + if patron1: #Hay expresión regex? + url += scrapertools.find_single_match(url_total, patron1) #La aplicamos a url + if patron2: #Hay más expresión regex? + url += scrapertools.find_single_match(url_total, patron2) #La aplicamos a url + if patron3: #Hay más expresión regex? + url += scrapertools.find_single_match(url_total, patron3) #La aplicamos a url + if patron4: #Hay más expresión regex? + url += scrapertools.find_single_match(url_total, patron4) #La aplicamos a url + if patron5: #Hay más expresión regex? + url += scrapertools.find_single_match(url_total, patron5) #La aplicamos a url + if url: + url_total = url #Guardamos la suma de los resultados intermedios + update_stat += 1 #Ya hemos actualizado algo + canal_org_des_list += [(canal_org, canal_des, url_total, ow_force)] #salvamos el resultado para su proceso + + if update_stat > 0 or delete_stat > 0: #Ha habido alguna actualización o borrado? Entonces salvamos + if (update_stat > 0 and path != False) or item.ow_force == '1': + logger.error('** Lista de Actualizaciones a realizar: ' + str(canal_org_des_list)) + for canal_org_def, canal_des_def, url_total, ow_force_def in canal_org_des_list: #pasamos por todas las "parejas" cambiadas + if ow_force_def != 'del': + url_total_def = url_total + if item.channel == channel_py or channel in fail_over_list: #Si es Newpct1... + if item.contentType == "tvshow": + url_total_def = re.sub(r'\/\d+\/?$', '', url_total) #parece que con el título encuentra la serie, normalmente... + if item.url: + item.url = url_total_def #Salvamos la url convertida + if item.library_urls: + item.library_urls.pop(canal_org_def, None) + item.library_urls.update({canal_des_def: url_total}) + it.library_urls = item.library_urls + if item.channel != channel_py and item.channel != 'videolibrary': + item.channel = canal_des_def #Cambiamos el canal. Si es clone, lo hace el canal + if channel_alt == item.category.lower(): #Actualizamos la Categoría y si la tenía + item.category = item.channel.capitalize() + if ow_force_def == 'force': #Queremos que el canal revise la serie entera? + item.ow_force = '1' #Se lo decimos + if ow_force_def in ['force', 'auto']: #Sobreescribir la series? + overwrite = True #Sí, lo marcamos + + if it.library_urls and path != False and ow_force_def != 'no': #Continuamos si hay .nfo, path, y queremos actualizarlo + item.update_next = '1' + del item.update_next #Borramos estos campos para forzar la actualización ya + it.update_next = '1' + del it.update_next # Listamos todos los ficheros de la serie, asi evitamos tener que comprobar si existe uno por uno + canal_erase_list = [] raiz, carpetas_series, ficheros = filetools.walk(path).next() - ficheros = [filetools.join(path, f) for f in ficheros] #Almacenamos la lista de archivos de la carpeta - canal_erase = '[%s]' % canal_org_def + ficheros = [filetools.join(path, f) for f in ficheros] #Almacenamos la lista de archivos de la carpeta for archivo in ficheros: - if canal_erase in archivo: #Borramos los .json que sean del canal intervenido - json_path = archivo.replace(canal_org_def, canal_des_def) #Salvamos el path del .json para luego crearlo - filetools.remove(archivo) + for canal_org_def, canal_des_def, url_total, ow_force_def in canal_org_des_list: #pasamos por todas las "parejas" a borrar + canal_erase = '[%s]' % canal_org_def + canal_new = '[%s]' % canal_des_def + if canal_erase in archivo: #Borramos los .json que sean de los canal afectados + if canal_des_def: + item_json = Item().fromjson(filetools.read(archivo)) #leemos el .json ante de borrarlo para salvar... + title = item_json.title #... el título con su formato + language = item_json.language #... los idiomas, que no están en el .nfo + wanted = item_json.wanted #... y wanted con el título original + json_path = archivo.replace(canal_erase, canal_new) #Salvamos el path del .json para luego crearlo + json_path_list += [(canal_org_def, canal_des_def, url_total, json_path, title, language, wanted)] + filetools.remove(archivo) #Borramos el .json + logger.error('** BORRAMOS: ' + str(archivo)) + if ow_force_def == 'del': #Si la función es 'del' ... + overwrite = True #Le decimos que sobreescriba todos los .jsons + item.ow_force = '1' #Le decimos que revise todas las temporadas + + #Si se ha cambiado algo, se actualizan los .nfo if item.contentType == "movie" and ".nfo" in archivo: - filetools.write(archivo, head_nfo + it.tojson()) #escribo el .nfo de la peli por si aborta update + if it.ow_force: del it.ow_force + filetools.write(archivo, head_nfo + it.tojson()) #escribo el .nfo de la peli por si aborta update if item.contentType != "movie" and "tvshow.nfo" in archivo: - filetools.write(archivo, head_nfo + it.tojson()) #escribo el tvshow.nfo por si aborta update + filetools.write(archivo, head_nfo + it.tojson()) #escribo el tvshow.nfo por si aborta update #Aquí convertimos las películas. Después de borrado el .json, dejamos que videolibrarytools lo regenere - if item.contentType == "movie": #Dejamos que regenere el archivo .json + if item.contentType == "movie": #Dejamos que regenere el archivo .json item_movie = item.clone() - item_movie.channel = canal_des_def #mombre del canal migrado - del item_movie.library_playcounts #Borramos lo que no es necesario en el .json + if item_movie.ow_force: del item_movie.ow_force + item_movie.update_last = '1' + del item_movie.update_last + del item_movie.library_playcounts #Borramos lo que no es necesario en el .json del item_movie.library_urls - item_movie.url = url_total #url migrada del item_movie.nfo del item_movie.path del item_movie.strm_path del item_movie.text_color - filetools.write(json_path, item_movie.tojson()) #Salvamos el nuevo .json de la película + if not item_movie.context: item_movie.context = "['buscar_trailer']" + if not item_movie.extra: item_movie.extra = "peliculas" + + if json_path_list: + logger.error('** .json LIST: ' + str(json_path_list)) + for canal_org_def, canal_des_def, url_total, json_path, title, language, wanted in json_path_list: #pasamos por todas canales + logger.error('** ESCRIBIMOS: ' + json_path) + item_movie.channel = canal_des_def #mombre del canal migrado + if not item_movie.category: item_movie.category = canal_des_def.capitalize() #categoría + item_movie.url = url_total #url migrada + if title: item_movie.title = title #restaurmos el título con formato + if language: item_movie.language = language #restaurmos los idiomas + if wanted: item_movie.wanted = wanted #restaurmos wanted + item_movie.added_replacing = canal_org_def #guardamos la traza del canal reemplazado + filetools.write(json_path, item_movie.tojson()) #Salvamos el nuevo .json de la película + + if (update_stat > 0 and path != False and ow_force_def in ['force', 'auto']) or item.ow_force == '1' or len(json_path_list) > 0: + logger.error('ITEM cambiado') + logger.error(item) - if update_stat > 0 and path != False and ow_force_def != 'no': - logger.debug(item) - return (item, it, overwrite) diff --git a/plugin.video.alfa/videolibrary_service.py b/plugin.video.alfa/videolibrary_service.py index 0452fa02..5259bad2 100644 --- a/plugin.video.alfa/videolibrary_service.py +++ b/plugin.video.alfa/videolibrary_service.py @@ -177,6 +177,8 @@ def check_for_update(overwrite=True): if overwrite or config.get_setting("updatetvshows_interval", "videolibrary") == 0: # ... forzar actualizacion independientemente del intervalo serie_actualizada = update(path, p_dialog, i, t, serie, overwrite) + if not serie_actualizada: + update_next = hoy + datetime.timedelta(days=interval) elif interval == 1 and update_next <= hoy: # ...actualizacion diaria @@ -201,9 +203,14 @@ def check_for_update(overwrite=True): serie_actualizada = update(path, p_dialog, i, t, serie, overwrite) if not serie_actualizada: update_next += datetime.timedelta(days=interval) + + if serie_actualizada: + update_last = hoy + update_next = hoy + datetime.timedelta(days=interval) head_nfo, serie = videolibrarytools.read_nfo(tvshow_file) #Vuelve a leer el.nfo, que ha sido modificado - if interval != int(serie.active) or update_next.strftime('%Y-%m-%d') != serie.update_next: + if interval != int(serie.active) or update_next.strftime('%Y-%m-%d') != serie.update_next or update_last.strftime('%Y-%m-%d') != serie.update_last: + serie.update_last = update_last.strftime('%Y-%m-%d') if update_next > hoy: serie.update_next = update_next.strftime('%Y-%m-%d') serie.active = interval