diff --git a/core/autoplay.py b/core/autoplay.py index 7ce25ebb..d5eace64 100644 --- a/core/autoplay.py +++ b/core/autoplay.py @@ -39,166 +39,20 @@ def start(itemlist, item): if not config.is_xbmc(): return itemlist + # Save the current value of "Action and Player Mode" in preferences + user_config_setting_action = config.get_setting("default_action") + # user_config_setting_player = config.get_setting("player_mode") + + # Enable the "View in high quality" action (if the server returns more than one quality, eg gdrive) + if not user_config_setting_action: config.set_setting("default_action", 2) + if config.get_setting('autoplay'): - url_list_valid = [] - autoplay_list = [] - autoplay_b = [] - favorite_quality = [] - favorite_servers = [] - blacklisted_servers = config.get_setting("black_list", server='servers', default = []) - favorite_servers = config.get_setting('favorites_servers_list', server='servers', default = []) + from core.servertools import sort_servers + autoplay_list = sort_servers(itemlist) - from core import servertools - - servers_list = list(servertools.get_servers_list().items()) - for server, server_parameters in servers_list: - if config.get_setting('favorites_servers_list', server=server) and server.lower() not in favorite_servers: - favorite_servers.append(server.lower()) - - if not favorite_servers: - config.set_setting('favorites_servers_list', [], server='servers') - favorite_servers = [] - else: - s_list = [] - for s in favorite_servers: - if s not in blacklisted_servers: - s_list.append(s) - favorite_servers = s_list - - # Save the current value of "Action and Player Mode" in preferences - user_config_setting_action = config.get_setting("default_action") - # user_config_setting_player = config.get_setting("player_mode") - - # Enable the "View in high quality" action (if the server returns more than one quality, eg gdrive) - if not user_config_setting_action: config.set_setting("default_action", 2) - - # if user_config_setting_player != 0: config.set_setting("player_mode", 0) - - # Priorities when ordering itemlist: - # 0: Servers and qualities - # 1: Qualities and servers - # 2: Servers only - # 3: Only qualities - # 4: Do not order - - if config.get_setting('favorites_servers') and favorite_servers and config.get_setting('default_action'): - priority = 0 # 0: Servers and qualities or 1: Qualities and servers - elif config.get_setting('favorites_servers') and favorite_servers: - priority = 2 # Servers only - elif config.get_setting('default_action'): - priority = 3 # Only qualities - else: - priority = 4 # Do not order - - if config.get_setting('default_action') == 1: - quality_list.reverse() - favorite_quality = quality_list - for item in itemlist: - autoplay_elem = dict() - b_dict = dict() - - # We check that it is a video item - if 'server' not in item: - continue - - if item.server.lower() in blacklisted_servers: - continue - - # If it does not have a defined quality, it assigns a 'default' quality. - if item.quality.lower() not in quality_list: - item.quality = 'default' - # The list for custom settings is created - - if priority < 2: # 0: Servers and qualities or 1: Qualities and servers - - # if the server and the quality are not in the favorites lists or the url is repeated, we discard the item - if item.server.lower() not in favorite_servers or item.quality.lower() not in favorite_quality or item.url in url_list_valid: - item.type_b = True - item.window = base_item.window - b_dict['videoitem']= item - autoplay_b.append(b_dict) - continue - autoplay_elem["indice_server"] = favorite_servers.index(item.server.lower()) - autoplay_elem["indice_quality"] = favorite_quality.index(item.quality.lower()) - - elif priority == 2: # Servers only - - # if the server is not in the favorites list or the url is repeated, we discard the item - if item.server.lower() not in favorite_servers or item.url in url_list_valid: - item.type_b = True - item.window = base_item.window - b_dict['videoitem'] = item - autoplay_b.append(b_dict) - continue - autoplay_elem["indice_server"] = favorite_servers.index(item.server.lower()) - - elif priority == 3: # Only qualities - - # if the quality is not in the favorites list or the url is repeated, we discard the item - if item.quality.lower() not in favorite_quality or item.url in url_list_valid: - item.type_b = True - item.window = base_item.window - b_dict['videoitem'] = item - autoplay_b.append(b_dict) - continue - autoplay_elem["indice_quality"] = favorite_quality.index(item.quality.lower()) - - else: # Do not order - - # if the url is repeated, we discard the item - item.window = base_item.window - if item.url in url_list_valid: - continue - - # If the item reaches here we add it to the list of valid urls and to autoplay_list - url_list_valid.append(item.url) - item.plan_b=True - item.window = base_item.window - autoplay_elem['videoitem'] = item - autoplay_list.append(autoplay_elem) - - # We order according to priority - if priority == 0: autoplay_list.sort(key=lambda orden: ((orden['indice_server'], orden['indice_quality']))) # Servers and qualities - elif priority == 1: autoplay_list.sort(key=lambda orden: (orden['indice_quality'], orden['indice_server'])) # Qualities and servers - elif priority == 2: autoplay_list.sort(key=lambda orden: (orden['indice_server'])) # Servers only - elif priority == 3: autoplay_list.sort(key=lambda orden: (orden['indice_quality'])) # Only qualities - - logger.debug('PRIORITY',priority, autoplay_list) - - # if quality priority is active - if priority == 0 and config.get_setting('quality_priority'): - max_quality = autoplay_list[0]["indice_quality"] if autoplay_list and "indice_quality" in autoplay_list[0] else 0 - for n, item in enumerate(itemlist): - if 'server' not in item: - continue - - if item.server.lower() in blacklisted_servers: - continue - - # If it does not have a defined quality, it assigns a 'default' quality. - if item.quality == '': - item.quality = 'default' - - if favorite_quality.index(item.quality.lower()) < max_quality: - item.type_b = False - autoplay_elem["indice_server"] = n - autoplay_elem["indice_quality"] = favorite_quality.index(item.quality.lower()) - autoplay_elem['videoitem'] = item - autoplay_list.append(autoplay_elem) - autoplay_list.sort(key=lambda orden: (orden['indice_quality'], orden['indice_server'])) - - # Plan b is prepared, in case it is active the non-favorite elements are added at the end - # try: plan_b = settings_node['plan_b'] - # except: - plan_b = True - text_b = '' - if plan_b: autoplay_list.extend(autoplay_b) - # If there are elements in the autoplay list, an attempt is made to reproduce each element, until one is found or all fail. - - if autoplay_list or (plan_b and autoplay_b): - - max_intentos = 5 - max_intentos_servers = {} + if autoplay_list: + max_intents = 5 + max_intents_servers = {} # If something is playing it stops playing if platformtools.is_playing(): @@ -206,27 +60,23 @@ def start(itemlist, item): for autoplay_elem in autoplay_list: play_item = Item - channel_id = autoplay_elem['videoitem'].channel - if autoplay_elem['videoitem'].channel == 'videolibrary': - channel_id = autoplay_elem['videoitem'].contentChannel + channel_id = autoplay_elem.channel + if autoplay_elem.channel == 'videolibrary': + channel_id = autoplay_elem.contentChannel - # If it is not a favorite element if you add the text plan b - if autoplay_elem['videoitem'].type_b: - text_b = '(Plan B)' if not platformtools.is_playing() and not PLAYED: - videoitem = autoplay_elem['videoitem'] - if videoitem.server.lower() not in max_intentos_servers: - max_intentos_servers[videoitem.server.lower()] = max_intentos + videoitem = autoplay_elem + if videoitem.server.lower() not in max_intents_servers: + max_intents_servers[videoitem.server.lower()] = max_intents # If the maximum number of attempts of this server have been reached, we jump to the next - if max_intentos_servers[videoitem.server.lower()] == 0: + if max_intents_servers[videoitem.server.lower()] == 0: continue - lang = " " - if hasattr(videoitem, 'language') and videoitem.language != "": - lang = " '%s' " % videoitem.language + lang = " [{}]".format(videoitem.language) if videoitem.language else '' + quality = ' [{}]'.format(videoitem.quality) if videoitem.quality and videoitem.quality != 'default' else '' name = servername(videoitem.server) - platformtools.dialog_notification("AutoPlay %s" %text_b, "%s%s%s" % (name, lang, videoitem.quality.upper()), sound=False) + platformtools.dialog_notification('AutoPlay', '{}{}{}'.format(name, lang, quality), sound=False) # Try to play the links If the channel has its own play method, use it try: channel = __import__('channels.%s' % channel_id, None, None, ["channels.%s" % channel_id]) @@ -251,7 +101,7 @@ def start(itemlist, item): platformtools.play_video(videoitem, autoplay=True) except: pass - sleep(3) + # sleep(3) try: if platformtools.is_playing(): PLAYED = True @@ -260,13 +110,13 @@ def start(itemlist, item): logger.debug(str(len(autoplay_list))) # If we have come this far, it is because it could not be reproduced - max_intentos_servers[videoitem.server.lower()] -= 1 + max_intents_servers[videoitem.server.lower()] -= 1 # If the maximum number of attempts of this server has been reached, ask if we want to continue testing or ignore it. - if max_intentos_servers[videoitem.server.lower()] == 0: + if max_intents_servers[videoitem.server.lower()] == 0: text = config.get_localized_string(60072) % name if not platformtools.dialog_yesno("AutoPlay", text, config.get_localized_string(60073)): - max_intentos_servers[videoitem.server.lower()] = max_intentos + max_intents_servers[videoitem.server.lower()] = max_intents # If there are no items in the list, it is reported if autoplay_elem == autoplay_list[-1]: diff --git a/core/servertools.py b/core/servertools.py index 9ee6d423..a51ed28a 100644 --- a/core/servertools.py +++ b/core/servertools.py @@ -9,24 +9,17 @@ import sys PY3 = False if sys.version_info[0] >= 3: PY3 = True; unicode = str; unichr = chr; long = int -if PY3: - #from future import standard_library - #standard_library.install_aliases() - import urllib.parse as urlparse #It is very slow in PY2. In PY3 it is native -else: - import urlparse # We use the native of PY2 which is faster +if PY3: import urllib.parse as urlparse +else: import urlparse from future.builtins import range from past.utils import old_div import re -from core import filetools -from core import httptools -from core import jsontools +from core import filetools, httptools, jsontools from core.item import Item -from platformcode import config, logger -from platformcode import platformtools +from platformcode import config, logger, platformtools from lib import unshortenit dict_servers_parameters = {} @@ -522,26 +515,6 @@ def get_server_parameters(server): return dict_servers_parameters[server] -# def get_server_json(server_name): -# # logger.info("server_name=" + server_name) -# try: -# server_path = filetools.join(config.get_runtime_path(), "servers", server_name + ".json") -# if not filetools.exists(server_path): -# server_path = filetools.join(config.get_runtime_path(), "servers", "debriders", server_name + ".json") -# -# # logger.info("server_path=" + server_path) -# server_json = jsontools.load(filetools.read(server_path)) -# # logger.info("server_json= %s" % server_json) -# -# except Exception as ex: -# template = "An exception of type %s occured. Arguments:\n%r" -# message = template % (type(ex).__name__, ex.args) -# logger.error(" %s" % message) -# server_json = None -# -# return server_json - - def get_server_host(server_name): from core import scrapertools return [scrapertools.get_domain_from_url(pattern['url']) for pattern in get_server_parameters(server_name)['find_videos']['patterns']] @@ -669,9 +642,10 @@ def get_servers_list(): for server in filetools.listdir(filetools.join(config.get_runtime_path(), "servers")): if server.endswith(".json") and not server == "version.json": server_parameters = get_server_parameters(server) - server_list[server.split(".")[0]] = server_parameters + if server_parameters['active']: + server_list[server.split(".")[0]] = server_parameters - # if type(server_list) != dict: server_list = sort_servers(server_list) + if type(server_list) != dict: server_list = sort_servers(server_list) return server_list @@ -699,13 +673,96 @@ def sort_servers(servers_list): :param servers_list: List of servers to order. The items in the servers_list can be strings or Item objects. In which case it is necessary that they have an item.server attribute of type str. :return: List of the same type of objects as servers_list ordered according to the favorite servers. """ - if servers_list: - if isinstance(servers_list[0], Item): - servers_list = sorted(servers_list, key=lambda x: config.get_setting("favorites_servers_list", server=x.server, default=999)) - else: - servers_list = sorted(servers_list, key=lambda x: config.get_setting("favorites_servers_list", server=x, default=999)) + if not servers_list: + return [] - return servers_list + blacklisted_servers = config.get_setting("black_list", server='servers', default=[]) + favorite_servers = config.get_setting('favorites_servers_list', server='servers', default=[]) + favorite_servers = [s for s in favorite_servers if s not in blacklisted_servers] + if isinstance(servers_list[0], str): + servers_list = sorted(servers_list, key=lambda x: favorite_servers.index(x) if x in favorite_servers else 999) + return servers_list + + quality_list = ['4k', '2160p', '2160', '4k2160p', '4k2160', '4k 2160p', '4k 2160', '2k', + 'fullhd', 'fullhd 1080', 'fullhd 1080p', 'full hd', 'full hd 1080', 'full hd 1080p', 'hd1080', 'hd1080p', 'hd 1080', 'hd 1080p', '1080', '1080p', + 'hd', 'hd720', 'hd720p', 'hd 720', 'hd 720p', '720', '720p', 'hdtv', + 'sd', '480p', '480', '360p', '360', '240p', '240', + ''] + + sorted_list = [] + url_list_valid = [] + favorite_quality = [] + + # Priorities when ordering itemlist: + # 0: Servers and qualities + # 1: Servers only + # 2: Only qualities + # 3: Do not order + + if config.get_setting('favorites_servers') and favorite_servers and config.get_setting('default_action'): + priority = 0 # 0: Servers and qualities + elif config.get_setting('favorites_servers') and favorite_servers: + priority = 1 # Servers only + elif config.get_setting('default_action'): + priority = 2 # Only qualities + else: + priority = 3 # Do not order + + if config.get_setting('default_action') == 1: + quality_list.reverse() + favorite_quality = quality_list + for item in servers_list: + element = dict() + + # We check that it is a video item + if 'server' not in item: + continue + + if item.server.lower() in blacklisted_servers: + continue + + + if priority < 2: # 0: Servers and qualities or 1: Qualities and servers + element["indice_server"] = favorite_servers.index(item.server.lower()) if item.server.lower() in favorite_servers else 999 + element["indice_quality"] = favorite_quality.index(item.quality.lower()) + + elif priority == 2: # Servers only + element["indice_server"] = favorite_servers.index(item.server.lower()) + + elif priority == 3: # Only qualities + element["indice_quality"] = favorite_quality.index(item.quality.lower()) + + else: # Do not order + if item.url in url_list_valid: + continue + + element['videoitem'] = item + sorted_list.append(element) + + + # We order according to priority + if priority == 0: sorted_list.sort(key=lambda orden: ((orden['indice_server'], orden['indice_quality']))) # Servers and qualities + elif priority == 1: sorted_list.sort(key=lambda orden: (orden['indice_server'])) # Servers only + elif priority == 3: sorted_list.sort(key=lambda orden: (orden['indice_quality'])) # Only qualities + + + # if quality priority is active + if priority == 0 and config.get_setting('quality_priority'): + max_quality = sorted_list[0]["indice_quality"] if sorted_list and "indice_quality" in sorted_list[0] else 0 + for n, item in enumerate(servers_list): + + if not item.server or item.server.lower() in blacklisted_servers: + continue + + if favorite_quality.index(item.quality.lower()) < max_quality: + element["indice_server"] = n + element["indice_quality"] = favorite_quality.index(item.quality.lower()) + element['videoitem'] = item + sorted_list.append(element) + + sorted_list.sort(key=lambda orden: (orden['indice_quality'], orden['indice_server'])) + + return [v['videoitem'] for v in sorted_list if v] # Checking links @@ -733,10 +790,11 @@ def check_list_links(itemlist, numero='', timeout=3): it = res[0] verificacion = res[1] it.title = verificacion + ' ' + it.title.strip() - logger.info('VERIFICATION= ' + verificacion) + logger.debug('VERIFICATION= ' + verificacion) it.alive = verificacion return itemlist + def check_video_link(item, timeout=3): """ Check if the link to a video is valid and return a 2-position string with verification. @@ -777,11 +835,30 @@ def check_video_link(item, timeout=3): httptools.HTTPTOOLS_DEFAULT_DOWNLOAD_TIMEOUT = ant_timeout # Restore download time return item, resultado - logger.debug("[check_video_link] There is no test_video_exists for server: %s" % server) + logger.debug("[check_video_link] There is no test_video_exists for server:", server) return item, NK + def translate_server_name(name): - if '@' in name: - return config.get_localized_string(int(name.replace('@',''))) - else: - return name + if '@' in name: return config.get_localized_string(int(name.replace('@',''))) + else: return name + + +# def get_server_json(server_name): +# # logger.info("server_name=" + server_name) +# try: +# server_path = filetools.join(config.get_runtime_path(), "servers", server_name + ".json") +# if not filetools.exists(server_path): +# server_path = filetools.join(config.get_runtime_path(), "servers", "debriders", server_name + ".json") +# +# # logger.info("server_path=" + server_path) +# server_json = jsontools.load(filetools.read(server_path)) +# # logger.info("server_json= %s" % server_json) +# +# except Exception as ex: +# template = "An exception of type %s occured. Arguments:\n%r" +# message = template % (type(ex).__name__, ex.args) +# logger.error(" %s" % message) +# server_json = None +# +# return server_json diff --git a/resources/settings.xml b/resources/settings.xml index 1e28af6f..2821386f 100644 --- a/resources/settings.xml +++ b/resources/settings.xml @@ -21,8 +21,8 @@ - - + + diff --git a/specials/setting.py b/specials/setting.py index 774236a3..26a049f0 100644 --- a/specials/setting.py +++ b/specials/setting.py @@ -265,19 +265,19 @@ def servers_blacklist(item): def cb_servers_blacklist(dict_values): - blaklisted = [] - progreso = platformtools.dialog_progress(config.get_localized_string(60557), config.get_localized_string(60558)) - n = len(dict_values) - i = 1 - for k, v in list(dict_values.items()): - if v: # If the server is blacklisted it cannot be in the favorites list - config.set_setting("favorites_servers_list", 0, server=k) - blaklisted.append(k) - progreso.update(old_div((i * 100), n), config.get_localized_string(60559) % k) - i += 1 - config.set_setting("black_list", blaklisted, server='servers') + blaklisted = [k for k in dict_values.keys()] + # progreso = platformtools.dialog_progress(config.get_localized_string(60557), config.get_localized_string(60558)) + # n = len(dict_values) + # i = 1 + # for k, v in list(dict_values.items()): + # if v: # If the server is blacklisted it cannot be in the favorites list + # config.set_setting("favorites_servers_list", 0, server=k) + # blaklisted.append(k) + # progreso.update(old_div((i * 100), n), config.get_localized_string(60559) % k) + # i += 1 + # config.set_setting("black_list", blaklisted, server='servers') - progreso.close() + # progreso.close() def servers_favorites(item): @@ -302,16 +302,16 @@ def servers_favorites(item): dict_values['favorites_servers'] = False server_names = [config.get_localized_string(59992)] + favorites = config.get_setting("favorites_servers_list", server='servers', default=[]) + blacklisted = config.get_setting("black_list", server='servers', default=[]) for server in sorted(server_list.keys()): - if config.get_setting("black_list", server=server): + if server in blacklisted or config.get_setting("black_list", server=server): continue server_names.append(server_list[server]['name']) - - orden = config.get_setting("favorites_servers_list", server=server, default=999) - if type(orden) != int: orden = 999 - if orden > 0: + if server in favorites: + orden = favorites.index(server) + 1 dict_values[orden] = len(server_names) - 1 for x in range(1, 12): @@ -331,7 +331,6 @@ def servers_favorites(item): def cb_servers_favorites(server_names, dict_values): dict_name = {} dict_favorites = {} - progreso = platformtools.dialog_progress(config.get_localized_string(60557), config.get_localized_string(60558)) for i, v in list(dict_values.items()): if i == "favorites_servers": @@ -342,30 +341,17 @@ def cb_servers_favorites(server_names, dict_values): dict_name[server_names[v]] = int(i) servers_list = list(servertools.get_servers_list().items()) - n = len(servers_list) - i = 1 for server, server_parameters in servers_list: if server_parameters['name'] in list(dict_name.keys()): dict_favorites[dict_name[server_parameters['name']]] = server - config.set_setting("favorites_servers_list", dict_name[server_parameters['name']], server=server) - else: - config.set_setting("favorites_servers_list", 999, server=server) - progreso.update(old_div((i * 100), n), config.get_localized_string(60559) % server_parameters['name']) - i += 1 - c = 1 - logger.debug(dict_favorites) - favorites_servers_list = [] - while c in dict_favorites: - favorites_servers_list.append(dict_favorites[c]) - c += 1 + favorites_servers_list = [dict_favorites[k] for k in sorted(dict_favorites.keys())] + config.set_setting("favorites_servers_list", favorites_servers_list, server='servers') - if not dict_name: # If there is no server in the list, deactivate it + if not favorites_servers_list: # If there is no server in the list, deactivate it config.set_setting("favorites_servers", False) - progreso.close() - def settings(item): config.open_settings()