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[^<]+
([^<]+)?<'
@@ -1338,10 +1340,9 @@ def findvideos(item):
size = size.replace(".", ",") #sustituimos . por , porque Unify lo borra
if not size:
size = scrapertools.find_single_match(item.quality, '\s\[(\d+,?\d*?\s\w[b|B])\]')
- else:
+ if size:
item.title = re.sub(r'\s\[\d+,?\d*?\s\w[b|B]\]', '', item.title) #Quitamos size de título, si lo traía
item.title = '%s [%s]' % (item.title, size) #Agregamos size al final del título
- if size:
size = size.replace('GB', 'G B').replace('Gb', 'G b').replace('MB', 'M B').replace('Mb', 'M b')
item.quality = re.sub(r'\s\[\d+,?\d*?\s\w[b|B]\]', '', item.quality) #Quitamos size de calidad, si lo traía
@@ -1440,9 +1441,9 @@ def findvideos(item):
break #Si se ha agotado el contador de verificación, se sale de Ver Online
#Si el link no está activo se ignora
- if item_local.alive == "??": #dudoso
+ if "??" in item_local.alive: #dudoso
item_local.title = '[COLOR yellow][?][/COLOR] [COLOR yellow][%s][/COLOR] [COLOR limegreen][%s][/COLOR] [COLOR red]%s[/COLOR]' % (servidor.capitalize(), item_local.quality, str(item_local.language))
- 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
item_local.title = '[COLOR red][%s][/COLOR] [COLOR yellow][%s][/COLOR] [COLOR limegreen][%s][/COLOR] [COLOR red]%s[/COLOR]' % (item_local.alive, servidor.capitalize(), item_local.quality, str(item_local.language))
logger.debug(item_local.alive + ": ALIVE / " + title + " / " + servidor + " / " + enlace)
raise
@@ -1458,7 +1459,7 @@ def findvideos(item):
item_local.title = re.sub(r'\s\[COLOR \w+\]\[\/COLOR\]', '', item_local.title).strip()
itemlist.append(item_local.clone())
except:
- pass
+ logger.error('ERROR al procesar enlaces VER DIRECTOS: ' + servidor + ' / ' + enlace)
#Ahora vemos los enlaces de DESCARGAR
if len(enlaces_descargar) > 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