Skip to content

Commit

Permalink
✨ Allow a [] for node values outside current template context
Browse files Browse the repository at this point in the history
  • Loading branch information
jurialmunkey committed May 19, 2024
1 parent fbbb038 commit 42e8a91
Show file tree
Hide file tree
Showing 3 changed files with 94 additions and 15 deletions.
2 changes: 1 addition & 1 deletion addon.xml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<addon id="script.skinvariables"
version="2.1.13"
version="2.1.14"
name="Skin Variables"
provider-name="jurialmunkey">
<requires>
Expand Down
90 changes: 78 additions & 12 deletions resources/lib/shortcuts/node.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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'):
Expand Down Expand Up @@ -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
Expand Down
17 changes: 15 additions & 2 deletions resources/lib/shortcuts/template.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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):
Expand Down

0 comments on commit 42e8a91

Please sign in to comment.