|
|
|
|
@@ -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)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|