From 42e8a91b6dd414c52849fe355a7266fe5b41e490 Mon Sep 17 00:00:00 2001 From: jurialmunkey Date: Sun, 19 May 2024 14:56:19 +1000 Subject: [PATCH] :sparkles: Allow a [] for node values outside current template context --- addon.xml | 2 +- resources/lib/shortcuts/node.py | 90 +++++++++++++++++++++++++---- resources/lib/shortcuts/template.py | 17 +++++- 3 files changed, 94 insertions(+), 15 deletions(-) diff --git a/addon.xml b/addon.xml index 6764067..0dddd11 100644 --- a/addon.xml +++ b/addon.xml @@ -1,6 +1,6 @@ diff --git a/resources/lib/shortcuts/node.py b/resources/lib/shortcuts/node.py index 5e5b226..64bca44 100644 --- a/resources/lib/shortcuts/node.py +++ b/resources/lib/shortcuts/node.py @@ -190,6 +190,45 @@ def cache_meta_from_file(filepath, fileprop, refresh=False): return meta +def get_menunode_lookup(lookup, skin, menu, item=None, node=None, mode=None, guid=None, **kwargs): + node_obj = ListGetShortcutsNode(None, None) + node_obj.refresh = True # Refresh mem cache because we want to build from the file + node_obj.skin = skin + node_obj.menu = menu + node_obj.item = item + node_obj.node = node + node_obj.mode = mode + node_obj.guid = guid + node_obj.edit = False + + if not node_obj.menunode: + return '' + + key_filters = {k[7:]: v for k, v in kwargs.items() if k.startswith('filter_')} + + def _is_filtered(i): + for k, v in key_filters.items(): + if k not in i: + return + if i[k] != v: + return + return i + + item = None + + for x, i in enumerate(node_obj.menunode): + if not isinstance(i, dict): + i = {'value': i} + item = _is_filtered(i) + if item: + break + + if not item: + return '' + + return item.get(lookup) or '' + + class GetDirectoryItems(): def __init__(self, grouping=GROUPING_DEFAULT, use_rawpath=False, folder_name=None): self.grouping = grouping @@ -314,6 +353,41 @@ def nodename(self): self._nodename = get_nodename(self.node) return self._nodename + @property + def node(self): + return self._node + + @node.setter + def node(self, value): + try: + self._node = tuple([int(i) for i in value.split('.') if i]) + except (TypeError, AttributeError): + self._node = tuple() + + @property + def mode(self): + try: + return self._mode or 'submenu' + except AttributeError: + self._mode = 'submenu' + return self._mode + + @mode.setter + def mode(self, value): + self._mode = value + + @property + def edit(self): + try: + return self._edit + except AttributeError: + self._edit = False + return self._edit + + @edit.setter + def edit(self, value): + self._edit = boolean(value) + class NodeSubmenuMethods(): def do_submenu_item(self, mode='submenu'): @@ -809,19 +883,11 @@ def get_directory( self.menu = menu self.skin = skin - self.mode = mode or 'submenu' + self.mode = mode self.guid = guid - self.edit = boolean(edit) - - try: - self.node = tuple([int(i) for i in node.split('.') if i]) - except (TypeError, AttributeError): - self.node = tuple() - - try: - self.item = item - except TypeError: - self.item = None + self.node = node + self.item = item + self.edit = edit if func == 'node': return self.menunode diff --git a/resources/lib/shortcuts/template.py b/resources/lib/shortcuts/template.py index a299b41..02105b2 100644 --- a/resources/lib/shortcuts/template.py +++ b/resources/lib/shortcuts/template.py @@ -7,11 +7,11 @@ import xbmcaddon from json import loads from jurialmunkey.logger import TimerFunc -from jurialmunkey.parser import parse_math, boolean +from jurialmunkey.parser import parse_math, boolean, parse_paramstring from jurialmunkey.futils import load_filecontent, write_skinfile, make_hash from resources.lib.kodiutils import ProgressDialog, get_localized from resources.lib.operations import RuleOperations, check_condition -from resources.lib.shortcuts.node import ListGetShortcutsNode +from resources.lib.shortcuts.node import ListGetShortcutsNode, get_menunode_lookup from resources.lib.shortcuts.xmltojson import xml_to_json from xml.dom import minidom from copy import deepcopy @@ -59,9 +59,22 @@ def parse_condition(self, conditions): conditions = conditions if isinstance(conditions, list) else [conditions] return all([check_condition(self.get_formatted(condition)) for condition in conditions]) + def parse_lookup(self, string): + """ $LOOKUP[lookup_key?menu=sidemenu&filter_guid=xyz] """ + LOOKUP_REGEX = r'\$LOOKUP\[(.*?)\]' + match = re.search(LOOKUP_REGEX, string) + if not match: + return string + lookup, paramstring = match.group(1).split('?', 1) + params = parse_paramstring(paramstring) + output = get_menunode_lookup(lookup, skin=self.skinid, **params) + string = string.replace(match.group(0), output) + return self.parse_lookup(string) + def get_formatted(self, string, params=None): string = string.format_map(params or self.params) string = parse_math(string) + string = self.parse_lookup(string) return string def get_conditional_value(self, items):