diff --git a/lib/generictools.py b/lib/generictools.py index c1167ce1..90cd326c 100644 --- a/lib/generictools.py +++ b/lib/generictools.py @@ -1747,483 +1747,484 @@ def web_intervenida(item, data, desactivar=True): def redirect_clone_newpct1(item, head_nfo=None, it=None, path=False, overwrite=False, lookup=False): - logger.info() - - """ - - Llamada para redirigir cualquier llamada a un clone de NewPct1 a NewPct1.py, o de una url de un canal caido a una alternativa - Incluye las llamadas estándar del canal y la llamadas externas: - - Play fron Library - - Videolibrary Update - - La lógica es reemplazar item.channel por "newpct1" y dejar el nombre del clone en item.category. - De esta forma utiliza siempre el código de NewPct1.py, aunque con las urls y apariencia del clone seleccionado por el usuario. - - En el caso de un canal/clone caído o intervenido judicialmente, puede reemplazar el canal en item.channel, o el clone en item.category, y la parte de item.url que se introduzca en una tabla. Esta conversión sólo se realiza si el canal original está inactivo, pero lo realiza siempre para los clones, o si el canal de origen y destino son los mismos. - - Este método interroga el .json de NewPct1 para extraer la lista de canales clones. Si item.channel es un clone de NewPct1 y está en esa lista, actualiza item.channel='newpct1' - - También en este .json está la tabla para la conversión de canales y urls: - - activo: está o no activa esta entrada - - canal_org: canal o clone de origen - - canal_des: canal o clone de destino (puede ser el mismo) - - url_org: parte de la url a sustituir de canal o clone de origen - - url_des: parte de la url a sustituir de canal o clone de destino - - patron1: expresión Regex aplicable a la url (opcional) - - patron2: expresión Regex aplicable a la url (opcional) - - patron3: expresión Regex aplicable a la url (opcional) - - patron4: expresión Regex aplicable a la url (opcional) - - patron5: expresión Regex aplicable a la url (opcional) - - content_inc: contenido al que aplica esta entrada, o * (item.contentType o item.extra) - - content_exc: contenido que se excluye de esta entrada (item.contentType) (opcional). opción para 'emerg' - - ow_force: indicador para la acción de "videolibrary_service.py". Puede crear la variable item.ow_force: - - 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 - - del: borra las estrucuturas de un determinado canal en videolibrary_service, quizás creadas por errores de un canal - - emerg: funcionalidad muy similar a la de "del". se general dinámicamente cada vez que entra un canal con el estado activado en el .json de "emergency_urls". Permite cargar las urls de emergencia en todos los elementos existentes de la Videoteca para canal afectado - 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'), - ('1', 'torrentrapid', 'torrentrapid', '', '', '', '', '', '', '', '*', '1 ó 2', 'emerg'), - - 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. - - """ - #logger.debug(item) - #if it != None: logger.debug(it) - if not it: - it = Item() - item_back = item.clone() - it_back = item.clone() - ow_force_param = True - update_stat = 0 - delete_stat = 0 - canal_org_des_list = [] - json_path_list = [] - emergency_urls_force = False - status_migration = False - - #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 quedar activado de una pasada anterior - del it.ow_force - if path and it.infoLabels['mediatype'] == 'tvshow': - 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 - logger.error(traceback.format_exc()) - - #Array con los datos de los canales alternativos - #Cargamos en .json de Newpct1 para ver las listas de valores en settings - fail_over_list = channeltools.get_channel_json(channel_py) - for settings in fail_over_list['settings']: #Se recorren todos los settings - if settings['id'] == "clonenewpct1_channels_list": #Encontramos en setting - fail_over_list = settings['default'] #Carga lista de clones - if settings['id'] == "intervenidos_channels_list": #Encontramos en setting - intervencion = settings['default'] #Carga lista de clones y canales intervenidos - - #primero tratamos los clones de Newpct1 - channel_alt = item.channel - #if item.url and not it.library_urls: - # channel_alt = scrapertools.find_single_match(item.url, 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/').lower() #Salvamos en nombre del canal o clone - # if not channel_alt: - # channel_alt = item.channel - channel = "'%s'" % channel_alt - category = '' - if channel_alt != 'videolibrary': - item.category = channel_alt.capitalize() - category = "'%s'" % channel_alt - channel_py_alt = 'xyz123' - 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 - - if it.emergency_urls: - item.emergency_urls = it.emergency_urls #Refrescar desde el .nfo - - #Analizamos si hay series o películas que migrar, debido a que se ha activado en el .json del canal la opción "guardar" - #"emergency_urls = 1", y hay que calcularla para todos los episodios y película existentes en la Videoteca. - #Si "emergency_urls" está activada para uno o más canales, se verifica en el .nfo del vídeo si ya se ha realizado - #la carga de las urls de emergencia. Sí se ha hecho, se ignora el proceso de conversión. Si no, se convierte por el - #canal en curso cuando hay item.url, o para todos los canales en item.library_urls si no hay un canal específico en curso. - #El mecanismo consiste en generar una regla temporal de migración para cada canal activado. Esta regla actua borrando - #todos los .json de la serie/película. En el caso de la serie, el proceso de actualización de la videoteca los regenerará - #automáticamente. En el caso de peliculas, se general aquí el json actualizado y se marca el .nfo como actualizado. - #Cuando en el .json se activa "Borrar", "emergency_urls = 2", se borran todos los enlaces existentes - #Cuando en el .json se activa "Actualizar", "emergency_urls = 3", se actualizan todos los enlaces existentes - - """ - status_migration = regenerate_clones() #TEMPORAL: Reparación de Videoteca con Newpct1 - - verify_cached_torrents() #TEMPORAL: verificamos si los .torrents son correctos - try: #Si ha habido errores, vemos la lista y los reparamos - json_error_path = filetools.join(config.get_runtime_path(), 'error_cached_torrents.json') - if filetools.exists(json_error_path): #hay erroer que hay que reparar? - from core import jsontools - json_error_file = jsontools.load(filetools.read(json_error_path)) #Leemos la lista de errores - if not json_error_file: - filetools.remove(json_error_path) #si ya no quedan errores, borramos el .json - elif path in json_error_file: #está este títu,o en la lista de errores? - json_error_file.pop(path) #sí. Lo quitamos - if not json_error_file: - filetools.remove(json_error_path) #si ya no quedan errores, borramos el .json - else: - filetools.write(json_error_path, jsontools.dump(json_error_file)) #si quedan, actualizamos el .json - if item.contentType == 'movie': #si es una pelicula, forzamos su actualización - emergency_urls_force = True - else: #si es una serie, que regenere los episodios que faltan (en error) - item.ow_force = '1' #... de todas las temporadas - except: - logger.error('Error en el proceso de REPARACION de vídeos con .torrents dañados') - logger.error(traceback.format_exc()) - - #Arreglo temporal para Newpct1 - try: - if channel in fail_over_list or channel_alt == 'videolibrary': - channel_bis = channel_py - if not item.url and it.library_urls and channel_alt == 'videolibrary': - for canal_vid, url_vid in it.library_urls.items(): #Se recorre "item.library_urls" para buscar canales candidatos - canal_vid_alt = "'%s'" % canal_vid - if canal_vid_alt in fail_over_list: #Se busca si es un clone de newpct1 - channel_bis = channel_py - channel_alt = canal_vid - channel = "'%s'" % channel_alt - break - else: - channel_bis = canal_vid - if channel_bis == channel_py and config.get_setting("emergency_urls", channel_bis) == 1 and config.get_setting("emergency_urls_torrents", channel_bis) and item.emergency_urls and item.emergency_urls.get(channel_alt, False): - raiz, carpetas_series, ficheros = filetools.walk(path).next() - objetivo = '[%s]_01.torrent' % channel_alt - encontrado = False - for fichero in ficheros: - if objetivo in fichero: - encontrado = True - break - if not encontrado: - logger.error('REGENERANDO: ' + str(item.emergency_urls)) - item.emergency_urls.pop(channel_alt, None) - except: - logger.error('Error en el proceso de RECARGA de URLs de Emergencia') - logger.error(traceback.format_exc()) - """ - - try: - if item.url and not channel_py in item.url and it.emergency_urls: #Viene de actualización de videoteca de series - #Analizamos si el canal ya tiene las urls de emergencia: guardar o borrar - if (config.get_setting("emergency_urls", item.channel) == 1 and (not item.emergency_urls or (item.emergency_urls and not item.emergency_urls.get(channel_alt, False)))) or (config.get_setting("emergency_urls", item.channel) == 2 and item.emergency_urls.get(channel_alt, False)) or config.get_setting("emergency_urls", item.channel) == 3 or emergency_urls_force: - intervencion += ", ('1', '%s', '%s', '', '', '', '', '', '', '', '*', '%s', 'emerg')" % (channel_alt, channel_alt, config.get_setting("emergency_urls", item.channel)) - - elif it.library_urls: #Viene de "listar peliculas´" - for canal_vid, url_vid in it.library_urls.items(): #Se recorre "item.library_urls" para buscar canales candidatos - if canal_vid == channel_py: #Si tiene Newcpt1 en canal, es un error - continue - canal_vid_alt = "'%s'" % canal_vid - if canal_vid_alt in fail_over_list: #Se busca si es un clone de newpct1 - channel_bis = channel_py - else: - channel_bis = canal_vid - #Analizamos si el canal ya tiene las urls de emergencia: guardar o borrar - if (config.get_setting("emergency_urls", channel_bis) == 1 and (not it.emergency_urls or (it.emergency_urls and not it.emergency_urls.get(canal_vid, False)))) or (config.get_setting("emergency_urls", channel_bis) == 2 and it.emergency_urls.get(canal_vid, False)) or config.get_setting("emergency_urls", channel_bis) == 3 or emergency_urls_force: - intervencion += ", ('1', '%s', '%s', '', '', '', '', '', '', '', '*', '%s', 'emerg')" % (canal_vid, canal_vid, config.get_setting("emergency_urls", channel_bis)) - except: - logger.error('Error en el proceso de ALMACENAMIENTO de URLs de Emergencia') - logger.error(traceback.format_exc()) - - #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_py_alt not in intervencion and category not in intervencion and channel_alt != 'videolibrary') or not item.infoLabels or status_migration: #lookup o migración - return (item, it, overwrite) #... el canal/clone está listado - - import ast - 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 - i = 0 - for activo, canal_org, canal_des, url_org, url_des, patron1, patron2, patron3, patron4, patron5, content_inc, content_exc, ow_force in intervencion_list: - i += 1 - opt = '' - #Es esta nuestra entrada? - if activo == '1' and (canal_org == channel_alt or canal_org == item.category.lower() or channel_alt == 'videolibrary' or ow_force == 'del' or ow_force == 'emerg'): - - if item.url: - logger.debug('INTERV. LIST: ' + str(intervencion_list[i-1]) + ' / CHANNEL: ' + str(channel_alt) + ' / URL: ' + str(item.url)) - - if ow_force == 'del' or ow_force == 'emerg': #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 and ow_force == 'del': - 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... - if ow_force == 'emerg': opt = content_exc #Salvamos la opción de Guardar o Borrar enlaces - canal_org_des_list += [(canal_org, canal_des, url_total, opt, ow_force)] #salvamos el resultado para su proceso - - 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 - channel_enabled = 0 - channel_enabled_alt = 1 - if item.channel != channel_py: - try: - if channeltools.is_enabled(channel_alt): channel_enabled = 1 #Verificamos que el canal esté inactivo - if config.get_setting('enabled', channel_alt) == False: channel_enabled_alt = 0 - channel_enabled = channel_enabled * channel_enabled_alt #Si está inactivo en algún sitio, tomamos eso - except: - pass - 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 - 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 encuentra la serie, normalmente... - update_stat += 1 #Ya hemos actualizado algo - canal_org_des_list += [(canal_org, canal_des, url_total, opt, 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, opt_def, ow_force_def in canal_org_des_list: #pasamos por todas las "parejas" cambiadas - url_total_def = url_total - if ow_force_def != 'del' and ow_force_def != 'emerg': - 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.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' 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 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 - - #Verificamos que las webs de los canales estén activas antes de borrar los .json, para asegurar que se pueden regenerar - i = 0 - canal_org_des_list_ALT = [] #Creamos esta lista para salvar las parejas - canal_org_des_list_ALT.extend(canal_org_des_list) #... y borrar de la original las web caidas - for canal_org_def, canal_des_def, url_total, opt_def, ow_force_def in canal_org_des_list_ALT: #pasamos por las "parejas" a borrar - if "magnet:" in url_total or type(url_total) != str: #Si la url es un Magnet, o es una lista, pasamos - i += 1 - continue - try: - response = httptools.downloadpage(url_total) - except: - logger.error(traceback.format_exc()) - logger.error('Web ' + canal_des_def.upper() + ' ERROR. Regla no procesada: ' + str(canal_org_des_list[i])) - del canal_org_des_list[i] #Borro regla - continue #... y paso a la siguiente - if not response: - logger.error('Web ' + canal_des_def.upper() + ' INACTIVA. Regla no procesada: ' + str(canal_org_des_list[i])) - del canal_org_des_list[i] #Borro regla - continue #... y paso a la siguiente - i += 1 - if i == 0: - item = item_back.clone() #Restauro las imágenes inciales - it = it_back.clone() - item.torrent_caching_fail = True #Marcamos el proceso como fallido - return (item, it, False) - - # Listamos todos los ficheros de la serie, asi evitamos tener que comprobar si existe uno por uno - canal_erase_list = [] - from core import videolibrarytools - 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 - #logger.error(ficheros) - for archivo in ficheros: - for canal_org_def, canal_des_def, url_total, opt_def, ow_force_def in canal_org_des_list: #pasamos por las "parejas" a borrar - canal_erase = '[%s]' % canal_org_def - canal_erase_alt = "'%s'" % canal_org_def - canal_new = '[%s]' % canal_des_def - archivo_alt = "'%s'" % scrapertools.find_single_match(archivo, '\[(\w+)\].json') - if archivo_alt == "''": archivo_alt = "'xyz123'" - #logger.error(canal_erase + canal_new + archivo + archivo_alt) - #Borramos los .json que sean de los canal afectados, incluidos todos los de los clones de newpct1 si éste es el canal - if canal_erase in archivo or (ow_force_def == 'emerg' and canal_erase_alt in fail_over_list and archivo_alt in fail_over_list and it.contentType != 'movie'): - if canal_des_def and it.contentType == 'movie' and not '.torrent' in archivo: #Si es película ... - item_json = '' - item_json = Item().fromjson(filetools.read(archivo)) #leemos el .json ante de borrarlo para salvar... - if not item_json: #error al leer el .json. Algo no funciona... - continue - 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, ow_force_def, opt_def, archivo)] - filetools.remove(archivo) #Borramos el .json y el .torrent - logger.error('** BORRAMOS: ' + str(archivo)) - if ow_force_def == 'del' or ow_force_def == 'emerg': #Si la función es 'del' or 'emerg' ... - 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 it.nfo: del it.nfo #Borramos variables innecesarias - if it.path: del it.path #Borramos variables innecesarias - if it.text_color: del it.text_color #Borramos variables innecesarias - if item.contentType == "movie" and ".nfo" in archivo: #Para películas - archivo_nfo = archivo #Guardamos el path del .nfo para futuro uso - if it.ow_force: del it.ow_force - filetools.write(archivo, head_nfo + it.tojson()) #escribo el .nfo de la peli - if item.contentType != "movie" and "tvshow.nfo" in archivo: - archivo_nfo = archivo #Guardamos el path del .nfo para futuro uso - 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 - item_movie = item.clone() - if item_movie.ow_force: del item_movie.ow_force - item_movie.update_last = '1' - if item_movie.update_last: del item_movie.update_last - if item_movie.library_playcounts: del item_movie.library_playcounts #Borramos lo que no es necesario en el .json - if item_movie.library_urls: del item_movie.library_urls - if item_movie.nfo: del item_movie.nfo - if item_movie.path: del item_movie.path - if item_movie.strm_path: del item_movie.strm_path - if item_movie.text_color: del item_movie.text_color - if item_movie.channel_host: del item_movie.channel_host - 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, ow_force_def, opt_def, archivo in json_path_list: #pasamos por todos canales - logger.error('** ESCRIBIMOS: ' + json_path) - item_movie.emergency_urls = False - del item_movie.emergency_urls - 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 - - if ow_force_def == 'emerg' and opt_def in ['1', '3']: #Si era una op. para añadir/actualizar urls de emergencia ... - item_movie = videolibrarytools.emergency_urls(item_movie, None, archivo) #... ejecutamos "findvideos" del canal para obtenerlas - if item_movie.channel_host: del item_movie.channel_host - if item_movie.unify: del item_movie.unify - if item_movie.extra2: del item_movie.extra2 - if item_movie.emergency_urls: #... si las hay ... - if it.emergency_urls and not isinstance(it.emergency_urls, dict): - del it.emergency_urls - if not it.emergency_urls: #... lo actualizamos en el .nfo - it.emergency_urls = dict() #... iniciamos la variable si no existe - it.emergency_urls.update({canal_des_def: True}) #... se marca como activo - if it.ow_force: del it.ow_force - filetools.write(archivo_nfo, head_nfo + it.tojson()) #actualizo el .nfo de la peli - else: - logger.error('Error en FINDVIDEOS: ' + archivo + ' / Regla: ' + canal_org_def + ', ' + opt_def + ', ' + ow_force_def) - - if ow_force_def == 'emerg' and opt_def == '2': #Si era una operación para borrar urls de emergencia ... - if it.emergency_urls and not isinstance(it.emergency_urls, dict): - del it.emergency_urls - if it.emergency_urls and it.emergency_urls.get(item_movie.channel, False): - it.emergency_urls.pop(item_movie.channel, None) #borramos la entrada del .nfo - if it.ow_force: del it.ow_force - filetools.write(archivo_nfo, head_nfo + it.tojson()) #actualizo el .nfo de la peli - - 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') - if it.emergency_urls: - logger.error(it.emergency_urls) - logger.error(item) - - return (item, it, overwrite) + # logger.info() + # + # """ + # + # Llamada para redirigir cualquier llamada a un clone de NewPct1 a NewPct1.py, o de una url de un canal caido a una alternativa + # Incluye las llamadas estándar del canal y la llamadas externas: + # - Play fron Library + # - Videolibrary Update + # + # La lógica es reemplazar item.channel por "newpct1" y dejar el nombre del clone en item.category. + # De esta forma utiliza siempre el código de NewPct1.py, aunque con las urls y apariencia del clone seleccionado por el usuario. + # + # En el caso de un canal/clone caído o intervenido judicialmente, puede reemplazar el canal en item.channel, o el clone en item.category, y la parte de item.url que se introduzca en una tabla. Esta conversión sólo se realiza si el canal original está inactivo, pero lo realiza siempre para los clones, o si el canal de origen y destino son los mismos. + # + # Este método interroga el .json de NewPct1 para extraer la lista de canales clones. Si item.channel es un clone de NewPct1 y está en esa lista, actualiza item.channel='newpct1' + # + # También en este .json está la tabla para la conversión de canales y urls: + # - activo: está o no activa esta entrada + # - canal_org: canal o clone de origen + # - canal_des: canal o clone de destino (puede ser el mismo) + # - url_org: parte de la url a sustituir de canal o clone de origen + # - url_des: parte de la url a sustituir de canal o clone de destino + # - patron1: expresión Regex aplicable a la url (opcional) + # - patron2: expresión Regex aplicable a la url (opcional) + # - patron3: expresión Regex aplicable a la url (opcional) + # - patron4: expresión Regex aplicable a la url (opcional) + # - patron5: expresión Regex aplicable a la url (opcional) + # - content_inc: contenido al que aplica esta entrada, o * (item.contentType o item.extra) + # - content_exc: contenido que se excluye de esta entrada (item.contentType) (opcional). opción para 'emerg' + # - ow_force: indicador para la acción de "videolibrary_service.py". Puede crear la variable item.ow_force: + # - 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 + # - del: borra las estrucuturas de un determinado canal en videolibrary_service, quizás creadas por errores de un canal + # - emerg: funcionalidad muy similar a la de "del". se general dinámicamente cada vez que entra un canal con el estado activado en el .json de "emergency_urls". Permite cargar las urls de emergencia en todos los elementos existentes de la Videoteca para canal afectado + # 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'), + # ('1', 'torrentrapid', 'torrentrapid', '', '', '', '', '', '', '', '*', '1 ó 2', 'emerg'), + # + # 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. + # + # """ + # #logger.debug(item) + # #if it != None: logger.debug(it) + # if not it: + # it = Item() + # item_back = item.clone() + # it_back = item.clone() + # ow_force_param = True + # update_stat = 0 + # delete_stat = 0 + # canal_org_des_list = [] + # json_path_list = [] + # emergency_urls_force = False + # status_migration = False + # + # #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 quedar activado de una pasada anterior + # del it.ow_force + # if path and it.infoLabels['mediatype'] == 'tvshow': + # 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 + # logger.error(traceback.format_exc()) + # + # #Array con los datos de los canales alternativos + # #Cargamos en .json de Newpct1 para ver las listas de valores en settings + # fail_over_list = channeltools.get_channel_json(channel_py) + # for settings in fail_over_list['settings']: #Se recorren todos los settings + # if settings['id'] == "clonenewpct1_channels_list": #Encontramos en setting + # fail_over_list = settings['default'] #Carga lista de clones + # if settings['id'] == "intervenidos_channels_list": #Encontramos en setting + # intervencion = settings['default'] #Carga lista de clones y canales intervenidos + # + # #primero tratamos los clones de Newpct1 + # channel_alt = item.channel + # #if item.url and not it.library_urls: + # # channel_alt = scrapertools.find_single_match(item.url, 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/').lower() #Salvamos en nombre del canal o clone + # # if not channel_alt: + # # channel_alt = item.channel + # channel = "'%s'" % channel_alt + # category = '' + # if channel_alt != 'videolibrary': + # item.category = channel_alt.capitalize() + # category = "'%s'" % channel_alt + # channel_py_alt = 'xyz123' + # 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 + # + # if it.emergency_urls: + # item.emergency_urls = it.emergency_urls #Refrescar desde el .nfo + # + # #Analizamos si hay series o películas que migrar, debido a que se ha activado en el .json del canal la opción "guardar" + # #"emergency_urls = 1", y hay que calcularla para todos los episodios y película existentes en la Videoteca. + # #Si "emergency_urls" está activada para uno o más canales, se verifica en el .nfo del vídeo si ya se ha realizado + # #la carga de las urls de emergencia. Sí se ha hecho, se ignora el proceso de conversión. Si no, se convierte por el + # #canal en curso cuando hay item.url, o para todos los canales en item.library_urls si no hay un canal específico en curso. + # #El mecanismo consiste en generar una regla temporal de migración para cada canal activado. Esta regla actua borrando + # #todos los .json de la serie/película. En el caso de la serie, el proceso de actualización de la videoteca los regenerará + # #automáticamente. En el caso de peliculas, se general aquí el json actualizado y se marca el .nfo como actualizado. + # #Cuando en el .json se activa "Borrar", "emergency_urls = 2", se borran todos los enlaces existentes + # #Cuando en el .json se activa "Actualizar", "emergency_urls = 3", se actualizan todos los enlaces existentes + # + # """ + # status_migration = regenerate_clones() #TEMPORAL: Reparación de Videoteca con Newpct1 + # + # verify_cached_torrents() #TEMPORAL: verificamos si los .torrents son correctos + # try: #Si ha habido errores, vemos la lista y los reparamos + # json_error_path = filetools.join(config.get_runtime_path(), 'error_cached_torrents.json') + # if filetools.exists(json_error_path): #hay erroer que hay que reparar? + # from core import jsontools + # json_error_file = jsontools.load(filetools.read(json_error_path)) #Leemos la lista de errores + # if not json_error_file: + # filetools.remove(json_error_path) #si ya no quedan errores, borramos el .json + # elif path in json_error_file: #está este títu,o en la lista de errores? + # json_error_file.pop(path) #sí. Lo quitamos + # if not json_error_file: + # filetools.remove(json_error_path) #si ya no quedan errores, borramos el .json + # else: + # filetools.write(json_error_path, jsontools.dump(json_error_file)) #si quedan, actualizamos el .json + # if item.contentType == 'movie': #si es una pelicula, forzamos su actualización + # emergency_urls_force = True + # else: #si es una serie, que regenere los episodios que faltan (en error) + # item.ow_force = '1' #... de todas las temporadas + # except: + # logger.error('Error en el proceso de REPARACION de vídeos con .torrents dañados') + # logger.error(traceback.format_exc()) + # + # #Arreglo temporal para Newpct1 + # try: + # if channel in fail_over_list or channel_alt == 'videolibrary': + # channel_bis = channel_py + # if not item.url and it.library_urls and channel_alt == 'videolibrary': + # for canal_vid, url_vid in it.library_urls.items(): #Se recorre "item.library_urls" para buscar canales candidatos + # canal_vid_alt = "'%s'" % canal_vid + # if canal_vid_alt in fail_over_list: #Se busca si es un clone de newpct1 + # channel_bis = channel_py + # channel_alt = canal_vid + # channel = "'%s'" % channel_alt + # break + # else: + # channel_bis = canal_vid + # if channel_bis == channel_py and config.get_setting("emergency_urls", channel_bis) == 1 and config.get_setting("emergency_urls_torrents", channel_bis) and item.emergency_urls and item.emergency_urls.get(channel_alt, False): + # raiz, carpetas_series, ficheros = filetools.walk(path).next() + # objetivo = '[%s]_01.torrent' % channel_alt + # encontrado = False + # for fichero in ficheros: + # if objetivo in fichero: + # encontrado = True + # break + # if not encontrado: + # logger.error('REGENERANDO: ' + str(item.emergency_urls)) + # item.emergency_urls.pop(channel_alt, None) + # except: + # logger.error('Error en el proceso de RECARGA de URLs de Emergencia') + # logger.error(traceback.format_exc()) + # """ + # + # try: + # if item.url and not channel_py in item.url and it.emergency_urls: #Viene de actualización de videoteca de series + # #Analizamos si el canal ya tiene las urls de emergencia: guardar o borrar + # if (config.get_setting("emergency_urls", item.channel) == 1 and (not item.emergency_urls or (item.emergency_urls and not item.emergency_urls.get(channel_alt, False)))) or (config.get_setting("emergency_urls", item.channel) == 2 and item.emergency_urls.get(channel_alt, False)) or config.get_setting("emergency_urls", item.channel) == 3 or emergency_urls_force: + # intervencion += ", ('1', '%s', '%s', '', '', '', '', '', '', '', '*', '%s', 'emerg')" % (channel_alt, channel_alt, config.get_setting("emergency_urls", item.channel)) + # + # elif it.library_urls: #Viene de "listar peliculas´" + # for canal_vid, url_vid in it.library_urls.items(): #Se recorre "item.library_urls" para buscar canales candidatos + # if canal_vid == channel_py: #Si tiene Newcpt1 en canal, es un error + # continue + # canal_vid_alt = "'%s'" % canal_vid + # if canal_vid_alt in fail_over_list: #Se busca si es un clone de newpct1 + # channel_bis = channel_py + # else: + # channel_bis = canal_vid + # #Analizamos si el canal ya tiene las urls de emergencia: guardar o borrar + # if (config.get_setting("emergency_urls", channel_bis) == 1 and (not it.emergency_urls or (it.emergency_urls and not it.emergency_urls.get(canal_vid, False)))) or (config.get_setting("emergency_urls", channel_bis) == 2 and it.emergency_urls.get(canal_vid, False)) or config.get_setting("emergency_urls", channel_bis) == 3 or emergency_urls_force: + # intervencion += ", ('1', '%s', '%s', '', '', '', '', '', '', '', '*', '%s', 'emerg')" % (canal_vid, canal_vid, config.get_setting("emergency_urls", channel_bis)) + # except: + # logger.error('Error en el proceso de ALMACENAMIENTO de URLs de Emergencia') + # logger.error(traceback.format_exc()) + # + # #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_py_alt not in intervencion and category not in intervencion and channel_alt != 'videolibrary') or not item.infoLabels or status_migration: #lookup o migración + # return (item, it, overwrite) #... el canal/clone está listado + # + # import ast + # 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 + # i = 0 + # for activo, canal_org, canal_des, url_org, url_des, patron1, patron2, patron3, patron4, patron5, content_inc, content_exc, ow_force in intervencion_list: + # i += 1 + # opt = '' + # #Es esta nuestra entrada? + # if activo == '1' and (canal_org == channel_alt or canal_org == item.category.lower() or channel_alt == 'videolibrary' or ow_force == 'del' or ow_force == 'emerg'): + # + # if item.url: + # logger.debug('INTERV. LIST: ' + str(intervencion_list[i-1]) + ' / CHANNEL: ' + str(channel_alt) + ' / URL: ' + str(item.url)) + # + # if ow_force == 'del' or ow_force == 'emerg': #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 and ow_force == 'del': + # 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... + # if ow_force == 'emerg': opt = content_exc #Salvamos la opción de Guardar o Borrar enlaces + # canal_org_des_list += [(canal_org, canal_des, url_total, opt, ow_force)] #salvamos el resultado para su proceso + # + # 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 + # channel_enabled = 0 + # channel_enabled_alt = 1 + # if item.channel != channel_py: + # try: + # if channeltools.is_enabled(channel_alt): channel_enabled = 1 #Verificamos que el canal esté inactivo + # if config.get_setting('enabled', channel_alt) == False: channel_enabled_alt = 0 + # channel_enabled = channel_enabled * channel_enabled_alt #Si está inactivo en algún sitio, tomamos eso + # except: + # pass + # 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 + # 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 encuentra la serie, normalmente... + # update_stat += 1 #Ya hemos actualizado algo + # canal_org_des_list += [(canal_org, canal_des, url_total, opt, 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, opt_def, ow_force_def in canal_org_des_list: #pasamos por todas las "parejas" cambiadas + # url_total_def = url_total + # if ow_force_def != 'del' and ow_force_def != 'emerg': + # 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.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' 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 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 + # + # #Verificamos que las webs de los canales estén activas antes de borrar los .json, para asegurar que se pueden regenerar + # i = 0 + # canal_org_des_list_ALT = [] #Creamos esta lista para salvar las parejas + # canal_org_des_list_ALT.extend(canal_org_des_list) #... y borrar de la original las web caidas + # for canal_org_def, canal_des_def, url_total, opt_def, ow_force_def in canal_org_des_list_ALT: #pasamos por las "parejas" a borrar + # if "magnet:" in url_total or type(url_total) != str: #Si la url es un Magnet, o es una lista, pasamos + # i += 1 + # continue + # try: + # response = httptools.downloadpage(url_total) + # except: + # logger.error(traceback.format_exc()) + # logger.error('Web ' + canal_des_def.upper() + ' ERROR. Regla no procesada: ' + str(canal_org_des_list[i])) + # del canal_org_des_list[i] #Borro regla + # continue #... y paso a la siguiente + # if not response: + # logger.error('Web ' + canal_des_def.upper() + ' INACTIVA. Regla no procesada: ' + str(canal_org_des_list[i])) + # del canal_org_des_list[i] #Borro regla + # continue #... y paso a la siguiente + # i += 1 + # if i == 0: + # item = item_back.clone() #Restauro las imágenes inciales + # it = it_back.clone() + # item.torrent_caching_fail = True #Marcamos el proceso como fallido + # return (item, it, False) + # + # # Listamos todos los ficheros de la serie, asi evitamos tener que comprobar si existe uno por uno + # canal_erase_list = [] + # from core import videolibrarytools + # 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 + # #logger.error(ficheros) + # for archivo in ficheros: + # for canal_org_def, canal_des_def, url_total, opt_def, ow_force_def in canal_org_des_list: #pasamos por las "parejas" a borrar + # canal_erase = '[%s]' % canal_org_def + # canal_erase_alt = "'%s'" % canal_org_def + # canal_new = '[%s]' % canal_des_def + # archivo_alt = "'%s'" % scrapertools.find_single_match(archivo, '\[(\w+)\].json') + # if archivo_alt == "''": archivo_alt = "'xyz123'" + # #logger.error(canal_erase + canal_new + archivo + archivo_alt) + # #Borramos los .json que sean de los canal afectados, incluidos todos los de los clones de newpct1 si éste es el canal + # if canal_erase in archivo or (ow_force_def == 'emerg' and canal_erase_alt in fail_over_list and archivo_alt in fail_over_list and it.contentType != 'movie'): + # if canal_des_def and it.contentType == 'movie' and not '.torrent' in archivo: #Si es película ... + # item_json = '' + # item_json = Item().fromjson(filetools.read(archivo)) #leemos el .json ante de borrarlo para salvar... + # if not item_json: #error al leer el .json. Algo no funciona... + # continue + # 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, ow_force_def, opt_def, archivo)] + # filetools.remove(archivo) #Borramos el .json y el .torrent + # logger.error('** BORRAMOS: ' + str(archivo)) + # if ow_force_def == 'del' or ow_force_def == 'emerg': #Si la función es 'del' or 'emerg' ... + # 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 it.nfo: del it.nfo #Borramos variables innecesarias + # if it.path: del it.path #Borramos variables innecesarias + # if it.text_color: del it.text_color #Borramos variables innecesarias + # if item.contentType == "movie" and ".nfo" in archivo: #Para películas + # archivo_nfo = archivo #Guardamos el path del .nfo para futuro uso + # if it.ow_force: del it.ow_force + # filetools.write(archivo, head_nfo + it.tojson()) #escribo el .nfo de la peli + # if item.contentType != "movie" and "tvshow.nfo" in archivo: + # archivo_nfo = archivo #Guardamos el path del .nfo para futuro uso + # 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 + # item_movie = item.clone() + # if item_movie.ow_force: del item_movie.ow_force + # item_movie.update_last = '1' + # if item_movie.update_last: del item_movie.update_last + # if item_movie.library_playcounts: del item_movie.library_playcounts #Borramos lo que no es necesario en el .json + # if item_movie.library_urls: del item_movie.library_urls + # if item_movie.nfo: del item_movie.nfo + # if item_movie.path: del item_movie.path + # if item_movie.strm_path: del item_movie.strm_path + # if item_movie.text_color: del item_movie.text_color + # if item_movie.channel_host: del item_movie.channel_host + # 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, ow_force_def, opt_def, archivo in json_path_list: #pasamos por todos canales + # logger.error('** ESCRIBIMOS: ' + json_path) + # item_movie.emergency_urls = False + # del item_movie.emergency_urls + # 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 + # + # if ow_force_def == 'emerg' and opt_def in ['1', '3']: #Si era una op. para añadir/actualizar urls de emergencia ... + # item_movie = videolibrarytools.emergency_urls(item_movie, None, archivo) #... ejecutamos "findvideos" del canal para obtenerlas + # if item_movie.channel_host: del item_movie.channel_host + # if item_movie.unify: del item_movie.unify + # if item_movie.extra2: del item_movie.extra2 + # if item_movie.emergency_urls: #... si las hay ... + # if it.emergency_urls and not isinstance(it.emergency_urls, dict): + # del it.emergency_urls + # if not it.emergency_urls: #... lo actualizamos en el .nfo + # it.emergency_urls = dict() #... iniciamos la variable si no existe + # it.emergency_urls.update({canal_des_def: True}) #... se marca como activo + # if it.ow_force: del it.ow_force + # filetools.write(archivo_nfo, head_nfo + it.tojson()) #actualizo el .nfo de la peli + # else: + # logger.error('Error en FINDVIDEOS: ' + archivo + ' / Regla: ' + canal_org_def + ', ' + opt_def + ', ' + ow_force_def) + # + # if ow_force_def == 'emerg' and opt_def == '2': #Si era una operación para borrar urls de emergencia ... + # if it.emergency_urls and not isinstance(it.emergency_urls, dict): + # del it.emergency_urls + # if it.emergency_urls and it.emergency_urls.get(item_movie.channel, False): + # it.emergency_urls.pop(item_movie.channel, None) #borramos la entrada del .nfo + # if it.ow_force: del it.ow_force + # filetools.write(archivo_nfo, head_nfo + it.tojson()) #actualizo el .nfo de la peli + # + # 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') + # if it.emergency_urls: + # logger.error(it.emergency_urls) + # logger.error(item) + # + # return (item, it, overwrite) + return item, Item(), False def verify_cached_torrents(): diff --git a/lib/unshortenit.py b/lib/unshortenit.py index ed87873d..894b2998 100644 --- a/lib/unshortenit.py +++ b/lib/unshortenit.py @@ -26,7 +26,7 @@ def find_in_text(regex, text, flags=re.IGNORECASE | re.DOTALL): class UnshortenIt(object): - _adfly_regex = r'adf\.ly|j\.gs|q\.gs|u\.bb|ay\.gy|atominik\.com|tinyium\.com|microify\.com|threadsphere\.bid|clearload\.bid|activetect\.net|swiftviz\.net|briskgram\.net|activetect\.net|baymaleti\.net|thouth\.net|uclaut.net' + _adfly_regex = r'adf\.ly|j\.gs|q\.gs|u\.bb|ay\.gy|atominik\.com|tinyium\.com|microify\.com|threadsphere\.bid|clearload\.bid|activetect\.net|swiftviz\.net|briskgram\.net|activetect\.net|baymaleti\.net|thouth\.net|uclaut\.net|gloyah\.net' _linkbucks_regex = r'linkbucks\.com|any\.gs|cash4links\.co|cash4files\.co|dyo\.gs|filesonthe\.net|goneviral\.com|megaline\.co|miniurls\.co|qqc\.co|seriousdeals\.net|theseblogs\.com|theseforums\.com|tinylinks\.co|tubeviral\.com|ultrafiles\.net|urlbeat\.net|whackyvidz\.com|yyv\.co' _adfocus_regex = r'adfoc\.us' _lnxlu_regex = r'lnx\.lu' diff --git a/servers/openload.json b/servers/openload.json index bfa940c2..ba1a2c24 100644 --- a/servers/openload.json +++ b/servers/openload.json @@ -4,7 +4,7 @@ "ignore_urls": [], "patterns": [ { - "pattern": "(?:openload|oload).*?/(?:embed|f)/([0-9a-zA-Z-_]+)", + "pattern": "(?:openload|oload|openloads).*?/(?:embed|f|e)/([0-9a-zA-Z-_]+)", "url": "https://openload.co/embed/\\1/" } ]