MikeSiLVO/script.skinshortcuts

Submenu gets de-linked from main menu item

Closed this issue ยท 112 comments

When changing the action for a main menu item, the submenu is getting de-linked - e.g. clicking on 'Edit submenu' takes you to a blank menu, even if the menu item previously had submenu items.

Internally, this is likely linked to the none type error you've been getting when editing menu items. When changing items, copies are made and properties are added to it - most likely, at some point the properties which tell the script which submenu was originally linked to it aren't getting copied across.

Not sure if latest commits have fixed this but I can't reproduce it ATM.

What are the exact steps?

I changed action then clicked edit submenu. I also tried changing the action, let the menu rebuild, and tried to edit submenu and it is working for me.

@BobCratchett Just curious if the submenu is still getting de-linked?

Thanks ๐Ÿ˜ƒ

We now testing against the python3 branch? I'll try to test tomorrow morning, otherwise I should be able to Sunday afternoon/evening.

Yes sir. I really messed something up in the test_branch so I deleted it and added everything to python_3.

I am now trying to fix the last error I keep getting which is:

2019-09-06 12:10:00.116 T:18446744073709551614   DEBUG: script.skinshortcuts: Unable to generate hash for b'C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\16x9\\script-skinshortcuts-includes.xml'
2019-09-06 12:10:00.116 T:18446744073709551614   DEBUG: script.skinshortcuts: (ea7112d8dd88c63a16f35784ceb572ed > ?)

Any pointers on where to focus on in the code?
Seems like the same need to encode the file read as before but not sure where, if it even is a different place, this one is coming from.

Looks like it is adding \\ so maybe there is another check like this one or I messed that up.

Can't give you line numbers as my local code is out of kilter with the current, but that hash is generated at the end of the writexml function in xmlfunctions - the code block

        # Save the tree
        DATA.indent( tree.getroot() )
        for path in paths:
            tree.write( path, encoding="UTF-8" )

            # Save the hash of the file we've just written
            with open(path, "r+") as f:
                DATA._save_hash( path, f.read() )
                f.close()

is saving the includes file and then generating its hash.

Not sure if I am getting this right but the problem seems to be reading the hash and not generating it.

I am not sure so just want to explain what I see to check if that is correct.

This (ea7112d8dd88c63a16f35784ceb572ed > ?) looks like it is getting the hash[1] which is the one from the .hash file or maybe somewhere else and not the one from the actual xml file using hasher.hexdigest()?

I don't know if I am making any sense...

I swear I could remember some comments explaining what hash[0] and hash[1] was but I can't seem to find it ATM...

Hash[0] tells the script what type of information is contained in hash[1] - for example, if hash[0] is ::XBMCVER::, then hash[1] contains the Kodi version number that the script last built against. But fundamentally, you're right - it looks like its generated the hash correctly when writing the includes and the .hash file.

If it isn't something what ::'s around it, then hash[0] contains the path and name of the file whose hash is contained in hash[1]. First instinct, is the path contained in hash[0] exactly correct...?

Second instinct, remove the try: except: block - leave the code within the try block (obviously re-indenting after removing the try command), and remove the except entirely. The script will crash, but it will produce a full error message and traceback and tell you exactly why it failed!

(edit - the path in hash[0] isn't correct - it's a byte, not a string so its encoding is wrong - so the script can't load that path to try and check the hash)

        # Save the tree
        DATA.indent( tree.getroot() )
        for path in paths:
            tree.write( path, encoding="UTF-8" )

            # Save the hash of the file we've just written
            with open(path, "r+") as f:
                DATA._save_hash( path, f.read() )
                f.close()

in the DATA._save_hash line, path needs encoding/decoding/etc before being passed to the _save_hash function

Could this part be messing it up also?
https://github.com/mikesilvo164/script.skinshortcuts/blob/python_3/resources/lib/xmlfunctions.py#L85
or not related?

Something like this maybe?

            # Save the hash of the file we've just written
            with open(path.decode("utf-8"), "r+") as f:
                DATA._save_hash( path, f.read().encode("utf-8"))
                f.close()

Nope that's wrong no attribute decode for str...

Yes, that could be messing it up also. There shouldn't (unless it just can't be worked around) be any strings anywhere in the script that are b"" - technically they're not strings, they're byte arrays.

Nope, nothing like that. It's just the saving of the path string that's not working. Saving the file itself and generating its hash is working fine, so something like

            with open(path, "r+") as f:
                DATA._save_hash( path.encode("utf-8"), f.read())
                f.close()

(or possibly decode - my brain can't remember right now!)

Alright changed that but no effect on the unable to get the hash issue and removing the b causes the below error which made me add it in the first place.

ERROR: EXCEPTION Thrown (PythonToCppException) : -->Python callback/script returned the following error<--
   - NOTE: IGNORING THIS CAN LEAD TO MEMORY LEAKS!
  Error Type: <class 'TypeError'>
  Error Contents: a bytes-like object is required, not 'str'
  Traceback (most recent call last):
    File "C:\Kodi (Python 3)\portable_data\addons\script.skinshortcuts\default.py", line 449, in <module>
      Main()
    File "C:\Kodi (Python 3)\portable_data\addons\script.skinshortcuts\default.py", line 89, in __init__
      XML.buildMenu( self.MENUID, self.GROUP, self.LEVELS, self.MODE, self.OPTIONS, self.MINITEMS )
    File "C:\Kodi (Python 3)\portable_data\addons\script.skinshortcuts\resources\lib\xmlfunctions.py", line 85, in buildMenu
      if "://" in dir and sys.version_info.major == 3:
  TypeError: a bytes-like object is required, not 'str'
-->End of Python script error report<--

Still learning the basics here so my apologies and please bare with me here as I make a fool of myself ๐Ÿ˜œ

Just wondering if I can delete all that if "//" and just default to translatepath...?

What is now showing in your .hash file? Preferably, all the entries (aside from the :: one's), should be something on the lines of

['/full/path/to/file/file.xml','hashstring']

or possibly, due to py2/3 differences

[u'/full/path/to/file/file.xml',u'hashstring']

(note, non should be [b'/full/path/to/file/file.xml','hashstring'])

If they are, then we're now saving them as strings, so your code that is throwing an error is no longer required (we're not now loading a bytes array - we're loading a string!).

There may still be some py2/3 differences if one is saving them with a u before the string and one not - but ideally they will both be saving them the same way (from what I gather, the big BIG difference between py2/3 on Kodi is that Kodi itself will return strings in different formats dependant on the version - ideally, anything the script is saving itself will be saved in the same format on both.) We definitely won't need to be checking if if b"://" because we're not saving it as a byte array.

Does that make sense?

And please don't worry about making a fool of yourself when it comes to all this encoding/decoding stuff. It's an absolute bloody nightmare. Remember that 'try_decode()' block I said was a bodge? I wrote that because I just got to the point where I couldn't be arsed trying to work out if I should be decoding something or not, and thought I might as well throw it to a block that will try and not give an error if it can't ๐Ÿ˜

Currently after making the changes you said and fixing some other errors on my part that did not come to light before those changes it looks like this:
[['::PROFILELIST::', [['C:\\Kodi (Python 3)\\portable_data\\userdata\\special:\\\\masterprofile\\', 'String.IsEqual(System.ProfileName,Master user)', 'Master user']]], ['::SCRIPTVER::', '1.0.20'], ['::XBMCVER::', '19'], ['::HIDEPVR::', 'false'], ['::SHARED::', 'true'], ['::SKINDIR::', 'skin.aeon.nox.silvo'], ['C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\overrides.xml', '39b1c16685a38957bb7e7d2ea1cbf317'], [b'C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\template.xml', 'f7e0ef8faf2cba2bd5c677bdb7c1838c'], ['::FULLMENU::', 'True'], ['C:\\Kodi (Python 3)\\portable_data\\userdata\\special:\\\\masterprofile\\addon_data\\script.skinshortcuts\\mainmenu.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\mainmenu.DATA.xml', '743915f4c146e2fed7313bb3b2d07a8b'], ['C:\\Kodi (Python 3)\\portable_data\\userdata\\special:\\\\masterprofile\\overrides.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\mainmenu.DATA.xml', '743915f4c146e2fed7313bb3b2d07a8b'], ['C:\\Kodi (Python 3)\\portable_data\\userdata\\special:\\\\masterprofile\\addon_data\\script.skinshortcuts\\1.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\pictures.DATA.xml', '5bcd60d1f73d0e171a3fe578c297b256'], ['C:\\Kodi (Python 3)\\portable_data\\userdata\\special:\\\\masterprofile\\addon_data\\script.skinshortcuts\\1-1.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\1-1.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\script.skinshortcuts\\resources\\shortcuts\\1-1.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\userdata\\special:\\\\masterprofile\\addon_data\\script.skinshortcuts\\1-2.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\1-2.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\script.skinshortcuts\\resources\\shortcuts\\1-2.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\userdata\\special:\\\\masterprofile\\addon_data\\script.skinshortcuts\\music.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\music.DATA.xml', 'af6d0e4bff5766c8d0345aab43308adb'], ['C:\\Kodi (Python 3)\\portable_data\\userdata\\special:\\\\masterprofile\\addon_data\\script.skinshortcuts\\music-1.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\music-1.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\script.skinshortcuts\\resources\\shortcuts\\music-1.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\userdata\\special:\\\\masterprofile\\addon_data\\script.skinshortcuts\\music-2.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\music-2.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\script.skinshortcuts\\resources\\shortcuts\\music-2.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\userdata\\special:\\\\masterprofile\\addon_data\\script.skinshortcuts\\20342.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\movies.DATA.xml', '905523884ea3c3ee249c19d3fe0d1b5d'], ['C:\\Kodi (Python 3)\\portable_data\\userdata\\special:\\\\masterprofile\\addon_data\\script.skinshortcuts\\20342-1.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\20342-1.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\script.skinshortcuts\\resources\\shortcuts\\20342-1.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\userdata\\special:\\\\masterprofile\\addon_data\\script.skinshortcuts\\20342-2.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\20342-2.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\script.skinshortcuts\\resources\\shortcuts\\20342-2.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\userdata\\special:\\\\masterprofile\\addon_data\\script.skinshortcuts\\tvshows.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\tvshows.DATA.xml', '130fa44814485da7da95711b38bc19aa'], ['C:\\Kodi (Python 3)\\portable_data\\userdata\\special:\\\\masterprofile\\addon_data\\script.skinshortcuts\\tvshows-1.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\tvshows-1.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\script.skinshortcuts\\resources\\shortcuts\\tvshows-1.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\userdata\\special:\\\\masterprofile\\addon_data\\script.skinshortcuts\\tvshows-2.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\tvshows-2.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\script.skinshortcuts\\resources\\shortcuts\\tvshows-2.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\userdata\\special:\\\\masterprofile\\addon_data\\script.skinshortcuts\\31502.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\livetv.DATA.xml', 'a75b3ce76253bdd15eebcdd691f0f479'], ['C:\\Kodi (Python 3)\\portable_data\\userdata\\special:\\\\masterprofile\\addon_data\\script.skinshortcuts\\31502-1.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\31502-1.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\script.skinshortcuts\\resources\\shortcuts\\31502-1.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\userdata\\special:\\\\masterprofile\\addon_data\\script.skinshortcuts\\31502-2.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\31502-2.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\script.skinshortcuts\\resources\\shortcuts\\31502-2.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\userdata\\special:\\\\masterprofile\\addon_data\\script.skinshortcuts\\videos.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\videos.DATA.xml', '1783e1a991681f953a21921c0be2519f'], ['C:\\Kodi (Python 3)\\portable_data\\userdata\\special:\\\\masterprofile\\addon_data\\script.skinshortcuts\\videos-1.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\videos-1.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\script.skinshortcuts\\resources\\shortcuts\\videos-1.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\userdata\\special:\\\\masterprofile\\addon_data\\script.skinshortcuts\\videos-2.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\videos-2.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\script.skinshortcuts\\resources\\shortcuts\\videos-2.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\userdata\\special:\\\\masterprofile\\addon_data\\script.skinshortcuts\\31957.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\programs.DATA.xml', 'b00920f9704f6f79a93a8d00fc34cc8f'], ['C:\\Kodi (Python 3)\\portable_data\\userdata\\special:\\\\masterprofile\\addon_data\\script.skinshortcuts\\31957-1.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\31957-1.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\script.skinshortcuts\\resources\\shortcuts\\31957-1.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\userdata\\special:\\\\masterprofile\\addon_data\\script.skinshortcuts\\31957-2.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\31957-2.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\script.skinshortcuts\\resources\\shortcuts\\31957-2.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\userdata\\special:\\\\masterprofile\\addon_data\\script.skinshortcuts\\15016.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\games.DATA.xml', '48aa3134b8b33ed873e2937008be99d3'], ['C:\\Kodi (Python 3)\\portable_data\\userdata\\special:\\\\masterprofile\\addon_data\\script.skinshortcuts\\15016-1.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\15016-1.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\script.skinshortcuts\\resources\\shortcuts\\15016-1.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\userdata\\special:\\\\masterprofile\\addon_data\\script.skinshortcuts\\15016-2.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\15016-2.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\script.skinshortcuts\\resources\\shortcuts\\15016-2.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\userdata\\special:\\\\masterprofile\\addon_data\\script.skinshortcuts\\13000.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\settings.DATA.xml', '6115c8cbc133ece28074944e42078f47'], ['C:\\Kodi (Python 3)\\portable_data\\userdata\\special:\\\\masterprofile\\addon_data\\script.skinshortcuts\\13000-1.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\13000-1.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\script.skinshortcuts\\resources\\shortcuts\\13000-1.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\userdata\\special:\\\\masterprofile\\addon_data\\script.skinshortcuts\\13000-2.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\13000-2.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\script.skinshortcuts\\resources\\shortcuts\\13000-2.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\userdata\\special:\\\\masterprofile\\addon_data\\script.skinshortcuts\\137.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\search.DATA.xml', '48aa3134b8b33ed873e2937008be99d3'], ['C:\\Kodi (Python 3)\\portable_data\\userdata\\special:\\\\masterprofile\\addon_data\\script.skinshortcuts\\137-1.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\137-1.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\script.skinshortcuts\\resources\\shortcuts\\137-1.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\userdata\\special:\\\\masterprofile\\addon_data\\script.skinshortcuts\\137-2.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\137-2.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\script.skinshortcuts\\resources\\shortcuts\\137-2.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\userdata\\special:\\\\masterprofile\\addon_data\\script.skinshortcuts\\31958.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\playdisc.DATA.xml', 'c44c3e67ba791781178206ae0d7d2d37'], ['C:\\Kodi (Python 3)\\portable_data\\userdata\\special:\\\\masterprofile\\addon_data\\script.skinshortcuts\\31958-1.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\31958-1.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\script.skinshortcuts\\resources\\shortcuts\\31958-1.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\userdata\\special:\\\\masterprofile\\addon_data\\script.skinshortcuts\\31958-2.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\31958-2.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\script.skinshortcuts\\resources\\shortcuts\\31958-2.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\userdata\\special:\\\\masterprofile\\addon_data\\script.skinshortcuts\\33060.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\power.DATA.xml', '6ff3e500a0f24f05dc6aba1021965649'], ['C:\\Kodi (Python 3)\\portable_data\\userdata\\special:\\\\masterprofile\\addon_data\\script.skinshortcuts\\33060-1.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\33060-1.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\script.skinshortcuts\\resources\\shortcuts\\33060-1.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\userdata\\special:\\\\masterprofile\\addon_data\\script.skinshortcuts\\33060-2.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\33060-2.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\script.skinshortcuts\\resources\\shortcuts\\33060-2.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\userdata\\special:\\\\masterprofile\\addon_data\\script.skinshortcuts\\1036.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\favourites.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\script.skinshortcuts\\resources\\shortcuts\\favourites.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\userdata\\special:\\\\masterprofile\\addon_data\\script.skinshortcuts\\1036-1.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\1036-1.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\script.skinshortcuts\\resources\\shortcuts\\1036-1.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\userdata\\special:\\\\masterprofile\\addon_data\\script.skinshortcuts\\1036-2.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\1036-2.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\script.skinshortcuts\\resources\\shortcuts\\1036-2.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\userdata\\special:\\\\masterprofile\\addon_data\\script.skinshortcuts\\weather.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\weather.DATA.xml', '48aa3134b8b33ed873e2937008be99d3'], ['C:\\Kodi (Python 3)\\portable_data\\userdata\\special:\\\\masterprofile\\addon_data\\script.skinshortcuts\\weather-1.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\weather-1.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\script.skinshortcuts\\resources\\shortcuts\\weather-1.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\userdata\\special:\\\\masterprofile\\addon_data\\script.skinshortcuts\\weather-2.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\weather-2.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\script.skinshortcuts\\resources\\shortcuts\\weather-2.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\userdata\\special:\\\\masterprofile\\addon_data\\script.skinshortcuts\\musicvideos.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\musicvideos.DATA.xml', 'e7d34e999a125d4b92c99584f90c8a3f'], ['C:\\Kodi (Python 3)\\portable_data\\userdata\\special:\\\\masterprofile\\addon_data\\script.skinshortcuts\\musicvideos-1.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\musicvideos-1.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\script.skinshortcuts\\resources\\shortcuts\\musicvideos-1.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\userdata\\special:\\\\masterprofile\\addon_data\\script.skinshortcuts\\musicvideos-2.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\musicvideos-2.DATA.xml', None], ['C:\\Kodi (Python 3)\\portable_data\\addons\\script.skinshortcuts\\resources\\shortcuts\\musicvideos-2.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\16x9\\script-skinshortcuts-includes.xml', '1aa03c88dab6169e31d2bc768ef15cd5'], ['::SKINVER::', '7.9.2']]

I see at least one 'b' but before I made these last changes they were, I think all prefaced with a 'b'.

I commented out the if"//" stuff just to get the script to run and made another change adding decode here to fix yet another error that popped:
dir = xbmc.translatePath(os.path.join("special://masterprofile", dir.decode("utf-8")))

My previous .hash file before these changes is in the last comment in
#5

Can I get a .hash file from py2 to compare? ๐Ÿ‘ผ

That is the old one listed in issue 5. I can post it here if it's more convenient.
#5

I can't see a .hash file in that (getting a 404 error following the link) - I'm actually just curious if they're prepended with a u or not. But I do see two with b's in this file. So let's sort them.

The first is the template.xml file. This is in template.py - quick fix would be in _save_hash function, something alongs the lines of (if py3)

filename = filename.decode("utf-8")

Then the includes.xml is still being saved with a b, so that probably wants to be decode() rather then encode() (hence why I've gone for decode in template.py).

They're the only 2 I can see from a quick scan of the .hash file...

I see a 'u' from my master branch using latest Kodi Leia.
Will post it below just in case it is helpful. Weird about the link it just goes to issue 5...

[['::PROFILELIST::', [[u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\', u'String.IsEqual(System.ProfileName,Master user)', u'Master user'], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Guest\\', u'String.IsEqual(System.ProfileName,Guest)', u'Guest'], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Kids\\', u'String.IsEqual(System.ProfileName,Kids)', u'Kids']]], ['::SCRIPTVER::', '1.0.20'], ['::XBMCVER::', '18'], ['::HIDEPVR::', 'false'], ['::SHARED::', 'false'], ['::SKINDIR::', 'skin.aeon.nox.silvo'], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\overrides.xml', '9cbd409a00763c0a5921041f145a0de4'], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\template.xml', '2cda790c2e846e77cc12df2e61914b2b'], ['::FULLMENU::', 'True'], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-mainmenu.DATA.xml', '101951f32a616f1ba674a59f05fb0b4a'], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\overrides.xml', None], ['C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo.properties', '03459e22e96d197cfde784a57a1cc2a2'], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\mainmenu.DATA.xml', '6f2a3dea8b92cf92a0916ec101bad243'], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-games.DATA.xml', '379c0cb0f0c8c3963235d19fe6e1308b'], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-games-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\games-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\games-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-games-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\games-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\games-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-music.DATA.xml', '7072d3b425ef367a68e4e37be0458d11'], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-music-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\music-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\music-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-music-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\music-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\music-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-tvshows.DATA.xml', '8665a0518e8c209ab84fbaa49e1fa792'], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-tvshows-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\tvshows-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\tvshows-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-tvshows-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\tvshows-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\tvshows-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-20342.DATA.xml', 'c54e774b9d04efb72c8853e7bcf3dcbd'], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-20342-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\20342-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\20342-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-20342-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\20342-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\20342-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-videos.DATA.xml', '84605e580f0b2fc9393a6f4e59d65482'], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-videos-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\videos-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\videos-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-videos-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\videos-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\videos-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-31957.DATA.xml', '6c7c6b3e04347dad9629ad0e286abdfb'], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-31957-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\31957-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\31957-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-31957-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\31957-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\31957-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-13000.DATA.xml', 'b40b4a79c2948a009268273ef7cf44f0'], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-13000-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\13000-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\13000-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-13000-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\13000-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\13000-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-31958.DATA.xml', 'febfa78ff3be36181571a55dd7ca1304'], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-31958-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\31958-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\31958-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-31958-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\31958-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\31958-2.DATA.xml', None], ['::FULLMENU::', 'True'], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Guest\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-mainmenu.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\mainmenu.DATA.xml', '6f2a3dea8b92cf92a0916ec101bad243'], ['C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Guest\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo.properties', 'b25053358e96e2ed44822baf52ca9c66'], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\mainmenu.DATA.xml', '6f2a3dea8b92cf92a0916ec101bad243'], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Guest\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\pictures.DATA.xml', 'e20936999c984c7b01edb1772ff81392'], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Guest\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-1-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\1-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\1-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Guest\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-1-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\1-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\1-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Guest\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-music.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\music.DATA.xml', '2e9a71a151aa2cc996c24beb4f6628c8'], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Guest\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-music-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\music-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\music-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Guest\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-music-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\music-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\music-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Guest\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-20342.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\movies.DATA.xml', '731bf78febe8ec5d84ffa2b2de76c833'], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Guest\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-20342-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\20342-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\20342-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Guest\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-20342-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\20342-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\20342-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Guest\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-tvshows.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\tvshows.DATA.xml', '7f1330fbb9a900bb279d1744cadee1df'], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Guest\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-tvshows-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\tvshows-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\tvshows-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Guest\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-tvshows-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\tvshows-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\tvshows-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Guest\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-31502.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\livetv.DATA.xml', '5eb9539fbee3222dc4e29739f26d5abe'], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Guest\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-31502-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\31502-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\31502-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Guest\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-31502-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\31502-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\31502-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Guest\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-videos.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\videos.DATA.xml', '219ca09edc52f2dc50b7214411448998'], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Guest\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-videos-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\videos-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\videos-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Guest\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-videos-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\videos-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\videos-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Guest\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-31957.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\programs.DATA.xml', '3f424aa8e2b39202f99469dfb7b0c727'], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Guest\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-31957-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\31957-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\31957-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Guest\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-31957-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\31957-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\31957-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Guest\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-15016.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\games.DATA.xml', '57f8fb6d7a0362d75cc460ae611109d3'], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Guest\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-15016-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\15016-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\15016-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Guest\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-15016-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\15016-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\15016-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Guest\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-13000.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\settings.DATA.xml', '66240cc073e845e801ce31824dbdc930'], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Guest\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-13000-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\13000-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\13000-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Guest\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-13000-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\13000-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\13000-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Guest\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-137.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\search.DATA.xml', '57f8fb6d7a0362d75cc460ae611109d3'], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Guest\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-137-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\137-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\137-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Guest\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-137-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\137-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\137-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Guest\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-31958.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\playdisc.DATA.xml', '08c7a4c887e76c3ee19d59708d2723fa'], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Guest\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-31958-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\31958-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\31958-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Guest\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-31958-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\31958-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\31958-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Guest\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-33060.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\power.DATA.xml', 'a1148ef2705c54440920a30d9ac3041b'], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Guest\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-33060-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\33060-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\33060-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Guest\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-33060-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\33060-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\33060-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Guest\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-1036.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\favourites.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\favourites.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Guest\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-1036-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\1036-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\1036-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Guest\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-1036-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\1036-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\1036-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Guest\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-weather.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\weather.DATA.xml', '57f8fb6d7a0362d75cc460ae611109d3'], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Guest\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-weather-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\weather-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\weather-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Guest\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-weather-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\weather-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\weather-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Guest\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-musicvideos.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\musicvideos.DATA.xml', 'c4f029dc0222de03d9075bc6be27d09e'], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Guest\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-musicvideos-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\musicvideos-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\musicvideos-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Guest\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-musicvideos-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\musicvideos-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\musicvideos-2.DATA.xml', None], ['::FULLMENU::', 'True'], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Kids\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-mainmenu.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\mainmenu.DATA.xml', '6f2a3dea8b92cf92a0916ec101bad243'], ['C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Kids\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo.properties', '3ebea811c8dcf0b851bd7b6e7ac0a76e'], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\mainmenu.DATA.xml', '6f2a3dea8b92cf92a0916ec101bad243'], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Kids\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\pictures.DATA.xml', 'e20936999c984c7b01edb1772ff81392'], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Kids\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-1-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\1-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\1-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Kids\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-1-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\1-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\1-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Kids\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-music.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\music.DATA.xml', '2e9a71a151aa2cc996c24beb4f6628c8'], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Kids\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-music-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\music-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\music-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Kids\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-music-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\music-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\music-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Kids\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-20342.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\movies.DATA.xml', '731bf78febe8ec5d84ffa2b2de76c833'], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Kids\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-20342-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\20342-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\20342-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Kids\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-20342-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\20342-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\20342-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Kids\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-tvshows.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\tvshows.DATA.xml', '7f1330fbb9a900bb279d1744cadee1df'], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Kids\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-tvshows-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\tvshows-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\tvshows-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Kids\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-tvshows-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\tvshows-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\tvshows-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Kids\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-31502.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\livetv.DATA.xml', '5eb9539fbee3222dc4e29739f26d5abe'], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Kids\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-31502-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\31502-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\31502-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Kids\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-31502-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\31502-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\31502-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Kids\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-videos.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\videos.DATA.xml', '219ca09edc52f2dc50b7214411448998'], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Kids\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-videos-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\videos-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\videos-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Kids\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-videos-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\videos-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\videos-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Kids\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-31957.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\programs.DATA.xml', '3f424aa8e2b39202f99469dfb7b0c727'], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Kids\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-31957-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\31957-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\31957-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Kids\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-31957-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\31957-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\31957-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Kids\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-15016.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\games.DATA.xml', '57f8fb6d7a0362d75cc460ae611109d3'], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Kids\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-15016-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\15016-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\15016-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Kids\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-15016-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\15016-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\15016-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Kids\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-13000.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\settings.DATA.xml', '66240cc073e845e801ce31824dbdc930'], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Kids\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-13000-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\13000-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\13000-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Kids\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-13000-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\13000-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\13000-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Kids\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-137.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\search.DATA.xml', '57f8fb6d7a0362d75cc460ae611109d3'], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Kids\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-137-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\137-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\137-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Kids\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-137-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\137-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\137-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Kids\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-31958.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\playdisc.DATA.xml', '08c7a4c887e76c3ee19d59708d2723fa'], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Kids\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-31958-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\31958-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\31958-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Kids\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-31958-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\31958-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\31958-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Kids\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-33060.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\power.DATA.xml', 'a1148ef2705c54440920a30d9ac3041b'], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Kids\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-33060-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\33060-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\33060-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Kids\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-33060-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\33060-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\33060-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Kids\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-1036.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\favourites.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\favourites.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Kids\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-1036-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\1036-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\1036-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Kids\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-1036-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\1036-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\1036-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Kids\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-weather.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\weather.DATA.xml', '57f8fb6d7a0362d75cc460ae611109d3'], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Kids\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-weather-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\weather-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\weather-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Kids\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-weather-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\weather-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\weather-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Kids\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-musicvideos.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\musicvideos.DATA.xml', 'c4f029dc0222de03d9075bc6be27d09e'], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Kids\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-musicvideos-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\musicvideos-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\musicvideos-1.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\userdata\\profiles\\Kids\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-musicvideos-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\shortcuts\\musicvideos-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\script.skinshortcuts\\resources\\shortcuts\\musicvideos-2.DATA.xml', None], [u'C:\\Users\\mikes\\AppData\\Roaming\\Kodi\\addons\\Aeon-Nox-SiLVO\\16x9\\script-skinshortcuts-includes.xml', 'c9454f10c1a9a40be473d6d6cd2aa303'], ['::SKINVER::', '7.0.6']]

Thanks for confirming. I'm starting to get the feeling we're setting ourselves up here for major problems with our international friends - the 'u' denotes unicode, which helps us with paths with รŸ's and รฉ's and the like. It's possible the b is just py3's equivalent and we actually want it. But, let's start by getting the code saving and loading everything in one encoding before we worry about that (and I have a VM here somewhere set up to test for issues like that, so once we've got the code working with one encoding, I should be easily able to adjust it to work for another - so leave that with me)

Getting error saving:

ERROR: Traceback (most recent call last):
2019-09-06 15:19:30.889 T:18446744073709551614   ERROR:   File "C:\Kodi (Python 3)\portable_data\addons\script.skinshortcuts\resources\lib\template.py", line 55, in __init__
                                                self._save_hash( templatepath, xbmcvfs.File( templatepath ).read() )
2019-09-06 15:19:30.889 T:18446744073709551614   ERROR:   File "C:\Kodi (Python 3)\portable_data\addons\script.skinshortcuts\resources\lib\template.py", line 914, in _save_hash
                                                filename = filename.decode("utf-8")
2019-09-06 15:19:30.889 T:18446744073709551614   ERROR: AttributeError: 'str' object has no attribute 'decode'
2019-09-06 15:19:30.889 T:18446744073709551614   ERROR: 
                                            During handling of the above exception, another exception occurred:
2019-09-06 15:19:30.889 T:18446744073709551614   ERROR: Traceback (most recent call last):
2019-09-06 15:19:30.889 T:18446744073709551614   ERROR:   File "C:\Kodi (Python 3)\portable_data\addons\script.skinshortcuts\resources\lib\xmlfunctions.py", line 113, in buildMenu
                                                self.writexml( profilelist, mainmenuID, groups, numLevels, buildMode, progress, options, minitems )
2019-09-06 15:19:30.889 T:18446744073709551614   ERROR:   File "C:\Kodi (Python 3)\portable_data\addons\script.skinshortcuts\resources\lib\xmlfunctions.py", line 355, in writexml
                                                Template = template.Template()
2019-09-06 15:19:30.889 T:18446744073709551614   ERROR:   File "C:\Kodi (Python 3)\portable_data\addons\script.skinshortcuts\resources\lib\template.py", line 61, in __init__
                                                self._save_hash( templatepath, xbmcvfs.File( templatepath ).read() )
2019-09-06 15:19:30.889 T:18446744073709551614   ERROR:   File "C:\Kodi (Python 3)\portable_data\addons\script.skinshortcuts\resources\lib\template.py", line 914, in _save_hash
                                                filename = filename.decode("utf-8")
2019-09-06 15:19:30.889 T:18446744073709551614   ERROR: AttributeError: 'str' object has no attribute 'decode'

I'll paste full log in new post below.

From my limited understanding all strings are unicode by default in Python 3.
๐Ÿค”

Found this explanation if it helps:

Literal strings are unicode by default in Python3.

Assuming that text is a bytes object, just use text.decode('utf-8')

unicode of Python2 is equivalent to str in Python3, so you can also write:

str(text, 'utf-8')

I'm about at the limit of what I can do - I don't have the ability to actually touch code at this moment. But where we're at is that we need to get all the paths in the hash saving with the same encoding (then we can easily modify them all if that encoding is wrong, depending on the encoding decoding; load them all in the same way, so forth). We've identified the two file names (did you spot any more in the .hash?) which aren't saving in the same way as the others, and where in the code they're saving. We just haven't got the encoding right.

Is that about right?

If so, I'll try to look properly in the morning, otherwise I definitely will have the ability Sunday :)

(But ultimately, it's the encoding/decoding of path and filename at the two places we've identified ... I think!)

(And thanks for that - so, if I'm reading that correctly we want and expect the 'u' on py2, we want and expect no leading letter on py3)

I just see the two currently.

I think it is encode and decode consistently or remove them except where we need to specify to avoid an error.

I think I may be onto something here just gonna spend some time with it and test to find out.

Thanks :)

@BobCratchett
Quick update.

I was having a lot more trouble adding the code you suggested so it was easier for me to make it all bytes since you said it would be ok if they were all the same encoding.

I will push a new test_branch for you to peruse when you get a chance.

The new .hash file looks like this now:

[['::PROFILELIST::', [['C:\\Kodi (Python 3)\\portable_data\\userdata\\', 'String.IsEqual(System.ProfileName,Master user)', 'Master user']]], ['::SCRIPTVER::', '1.0.20'], ['::XBMCVER::', '19'], ['::HIDEPVR::', 'false'], ['::SHARED::', 'true'], ['::SKINDIR::', 'skin.aeon.nox.silvo'], [b'C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\overrides.xml', '39b1c16685a38957bb7e7d2ea1cbf317'], [b'C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\template.xml', 'f7e0ef8faf2cba2bd5c677bdb7c1838c'], ['::FULLMENU::', 'True'], [b'C:\\Kodi (Python 3)\\portable_data\\userdata\\addon_data\\script.skinshortcuts\\mainmenu.DATA.xml', '20ece20e0c618ffc62f74c2f11ab8c6b'], [b'C:\\Kodi (Python 3)\\portable_data\\userdata\\overrides.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\userdata\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo.properties', 'f7bc1791fc112307567bd9c039041cd5'], [b'C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\mainmenu.DATA.xml', '743915f4c146e2fed7313bb3b2d07a8b'], [b'C:\\Kodi (Python 3)\\portable_data\\userdata\\addon_data\\script.skinshortcuts\\15016.DATA.xml', '379c0cb0f0c8c3963235d19fe6e1308b'], [b'C:\\Kodi (Python 3)\\portable_data\\userdata\\addon_data\\script.skinshortcuts\\15016-1.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\15016-1.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\addons\\script.skinshortcuts\\resources\\shortcuts\\15016-1.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\userdata\\addon_data\\script.skinshortcuts\\15016-2.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\15016-2.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\addons\\script.skinshortcuts\\resources\\shortcuts\\15016-2.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\userdata\\addon_data\\script.skinshortcuts\\music.DATA.xml', 'd8c3c1682adb6dd6cde4c607db7322cd'], [b'C:\\Kodi (Python 3)\\portable_data\\userdata\\addon_data\\script.skinshortcuts\\music-1.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\music-1.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\addons\\script.skinshortcuts\\resources\\shortcuts\\music-1.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\userdata\\addon_data\\script.skinshortcuts\\music-2.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\music-2.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\addons\\script.skinshortcuts\\resources\\shortcuts\\music-2.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\userdata\\addon_data\\script.skinshortcuts\\20342.DATA.xml', '6eeaf46b98d5ea899b98b12f7780f2cf'], [b'C:\\Kodi (Python 3)\\portable_data\\userdata\\addon_data\\script.skinshortcuts\\20342-1.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\20342-1.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\addons\\script.skinshortcuts\\resources\\shortcuts\\20342-1.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\userdata\\addon_data\\script.skinshortcuts\\20342-2.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\20342-2.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\addons\\script.skinshortcuts\\resources\\shortcuts\\20342-2.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\userdata\\addon_data\\script.skinshortcuts\\tvshows.DATA.xml', 'f5954bf276ec46f3fbc89b89db83b198'], [b'C:\\Kodi (Python 3)\\portable_data\\userdata\\addon_data\\script.skinshortcuts\\tvshows-1.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\tvshows-1.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\addons\\script.skinshortcuts\\resources\\shortcuts\\tvshows-1.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\userdata\\addon_data\\script.skinshortcuts\\tvshows-2.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\tvshows-2.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\addons\\script.skinshortcuts\\resources\\shortcuts\\tvshows-2.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\userdata\\addon_data\\script.skinshortcuts\\videos.DATA.xml', '1d975c3924bb206bf8ea27255f4339db'], [b'C:\\Kodi (Python 3)\\portable_data\\userdata\\addon_data\\script.skinshortcuts\\videos-1.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\videos-1.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\addons\\script.skinshortcuts\\resources\\shortcuts\\videos-1.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\userdata\\addon_data\\script.skinshortcuts\\videos-2.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\videos-2.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\addons\\script.skinshortcuts\\resources\\shortcuts\\videos-2.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\userdata\\addon_data\\script.skinshortcuts\\31957.DATA.xml', '0d43c87dba81165c0b6f5dcf55a6d2f6'], [b'C:\\Kodi (Python 3)\\portable_data\\userdata\\addon_data\\script.skinshortcuts\\31957-1.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\31957-1.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\addons\\script.skinshortcuts\\resources\\shortcuts\\31957-1.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\userdata\\addon_data\\script.skinshortcuts\\31957-2.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\31957-2.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\addons\\script.skinshortcuts\\resources\\shortcuts\\31957-2.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\userdata\\addon_data\\script.skinshortcuts\\13000.DATA.xml', 'c71f3dab22b68294168a3461d44dd1ba'], [b'C:\\Kodi (Python 3)\\portable_data\\userdata\\addon_data\\script.skinshortcuts\\13000-1.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\13000-1.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\addons\\script.skinshortcuts\\resources\\shortcuts\\13000-1.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\userdata\\addon_data\\script.skinshortcuts\\13000-2.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\13000-2.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\addons\\script.skinshortcuts\\resources\\shortcuts\\13000-2.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\userdata\\addon_data\\script.skinshortcuts\\31958.DATA.xml', '16715120710f7a36e36ecf320ab05cf9'], [b'C:\\Kodi (Python 3)\\portable_data\\userdata\\addon_data\\script.skinshortcuts\\31958-1.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\31958-1.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\addons\\script.skinshortcuts\\resources\\shortcuts\\31958-1.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\userdata\\addon_data\\script.skinshortcuts\\31958-2.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\31958-2.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\addons\\script.skinshortcuts\\resources\\shortcuts\\31958-2.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\16x9\\script-skinshortcuts-includes.xml', 'b646098886be03429de15da137f2a3bc'], ['::SKINVER::', '7.9.2']]

The best solution is always the one that works ๐Ÿ˜‰. Can I presume now that all the files in the .hash file are saved with the same encoding in the file, and so we can load them all with the same code? If so, that's great - we're at a point where everything is working, and we can now adjust all of them at once rather than try to manage them individually.

My suspicion is the best way to get the script to the ideal point (which is where we're saving everything as strings, not bytes - and that being the best solution because, without diving into the code, my suspicion is in the vast majority of cases we're going to be encoding/decoding at load, and then inverting that at save) is to get all of them into the correct format (string, as primarily we're using them as just strings) as early as possible, especially when they're coming from xbmcvfs, which I suspect is where the byte array version is coming from. I'll do my best when I'm actually in a position to mess with code rather than just look at it, to see how early and easily we can possibly do that :)

Everything appears to be bytes except the beginning profile location:

[['::PROFILELIST::', [['C:\\Kodi (Python 3)\\portable_data\\userdata\\', 'String.IsEqual(System.ProfileName,Master user)', 'Master user']]], ['::SCRIPTVER::', '1.0.20'], ['::XBMCVER::', '19'], ['::HIDEPVR::', 'false'], ['::SHARED::', 'true'], ['::SKINDIR::', 'skin.aeon.nox.silvo']

Past this all 63 of them start with b.

Also everything works except the unable to hash the script-skinshortcuts-includes.xml file.
Can't find anything that doesn't work.

That and probably the single build mode due to a basestring still there:
if buildMode == "single" and not isinstance( item, basestring ):

Sorry, should have been clear - I was asking specifically about the filenames/hashes (as these are saved in three - that I can think of - places, but all processed by one code block, so it's important that they're all saved the same so they can be processed the same. The :: encased blocks are all saved and processed individually, so their encoding is less important.

If you still can't hash the includes file, take a look at my earlier comment about removing the try: except: block - that will give a more specific error - but is likely still that the script can't convert the bytes array to a string that it can understand - and I'll take a proper look when I'm able in the next day or two.

I'm not aware of the single build mode issue, so again post a debug log and I'll look in the next day or two :)

Pretty sure the bytes array is from me encoding the filename to stop the build loop due to needing to encode the hash to prevent TypeError: Unicode-objects must be encoded before hashing:

            hasher.update(file.encode("utf8"))
            hashlist.list.append([filename.encode("utf8"), hasher.hexdigest()])
        else:
            hashlist.list.append([filename.encode("utf8"), None])

I don't know if there is an issue for single buildmode I just assume there will be because basestring isn't available in Python 3.

I'm not sure which try: except: to remove...?

If the hashes also need to be bytes can't I just add encoding to the hexdigest as well?

EDIT: Yep it is bytes now after encoding that.
[b'C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\overrides.xml', b'39b1c16685a38957bb7e7d2ea1cbf317']

I can't honestly remember what single build mode is off hand, so I'll just add that to my list of things the check ๐Ÿ˜‰

In xmlfunctions, the shouldwerun function, changing the code from

                else:
                    try:
                        hasher = hashlib.md5()
                        hasher.update(xbmcvfs.File(hash[0]).read().encode("utf-8"))
                        if hasher.hexdigest() != hash[1]:
                            log( "Hash does not match on file " + hash[0] )
                            log( "(" + hash[1] + " > " + hasher.hexdigest() + ")" )
                            return True
                    except:
                        log( "Unable to generate hash for %s" %( hash[ 0 ] ) )
                        log( "(%s > ?)" %( hash[ 1 ] ) )

to

                else:
                    hasher = hashlib.md5()
                    hasher.update(xbmcvfs.File(hash[0]).read().encode("utf-8"))
                    if hasher.hexdigest() != hash[1]:
                        log( "Hash does not match on file " + hash[0] )
                        log( "(" + hash[1] + " > " + hasher.hexdigest() + ")" )
                        return True

means the error wouldn't be caught by the try: except: block so, though the script would crash, it will give a full traceback on the error.

If it works, sure, add the encoding there. As the script only uses bytes for reading and writing files (file.read, file.write operations) the ideal solution is that they are strings at all other times, and are converted into bytes only when necessary. But, as I said, the best solution is always the one that works (and, once everything is being written/read/processed consistently, it's easier to change them all, rather than working on each one individually.)

edit: sorry, only required to use bytes for, not only uses bytes for

Now it is the same error I had with the profile logging.
I fixed it by changing:
log("Profile found: " + name + " (" + dir + ")")
to
log("Profile found: " + name.decode("utf-8") + " (" + dir.decode("utf-8") + ")")

Probably cause it is encoded with:

                name = profile.find( "name" ).text.encode( "utf-8" )
                dir = profile.find( "directory" ).text.encode( "utf-8" )

Here is the error without the try except block:

ERROR: EXCEPTION Thrown (PythonToCppException) : -->Python callback/script returned the following error<--
   - NOTE: IGNORING THIS CAN LEAD TO MEMORY LEAKS!
  Error Type: <class 'TypeError'>
  Error Contents: can only concatenate str (not "bytes") to str
  Traceback (most recent call last):
    File "C:\Kodi (Python 3)\portable_data\addons\script.skinshortcuts\default.py", line 449, in <module>
      Main()
    File "C:\Kodi (Python 3)\portable_data\addons\script.skinshortcuts\default.py", line 89, in __init__
      XML.buildMenu( self.MENUID, self.GROUP, self.LEVELS, self.MODE, self.OPTIONS, self.MINITEMS )
    File "C:\Kodi (Python 3)\portable_data\addons\script.skinshortcuts\resources\lib\xmlfunctions.py", line 100, in buildMenu
      if self.shouldwerun( profilelist ) == False:
    File "C:\Kodi (Python 3)\portable_data\addons\script.skinshortcuts\resources\lib\xmlfunctions.py", line 308, in shouldwerun
      log( "Hash does not match on file " + hash[0] )
  TypeError: can only concatenate str (not "bytes") to str
  -->End of Python script error report<--

OK, should have expected that ๐Ÿ˜‰

There's still a logging line, and it still expects a string and not a bytes array. Interestingly, though, it appears as if the hasher function is managing to generate a hash for the file it's being passed. Whether it can actually generate that from the bytes array that is being passed into it, or whether it has its own error handling is another matter. (a bytes array really isn't what we want to be dealing with here!)

It ultimately still comes down to what we want to be saving/loading is a string, and not a bytes array (but, as I say, I'll look into this). You could try adding the following lines before the if statement, just as a general debugging exercise:

print(hash[0])
print(hash[1])
print(hasher.hexdigest)

(note, the built-in Python print function isn't allowed in Kodi addons within the Kodi repo, but its fantastic for debugging because it will output to the Kodi log pretty much anything you throw at it, without any thought of encoding!)

This is right before the exception occurs:

2019-09-06 18:50:02.830 T:18446744073709551614   DEBUG: script.skinshortcuts: Profile found: Master user (special://masterprofile/)
2019-09-06 18:50:02.832 T:18446744073709551614   DEBUG: b'C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\overrides.xml'
2019-09-06 18:50:02.832 T:18446744073709551614   DEBUG: b'39b1c16685a38957bb7e7d2ea1cbf317'
2019-09-06 18:50:02.832 T:18446744073709551614   DEBUG: <built-in method hexdigest of _hashlib.HASH object at 0x000001AEEECDE3C8>

Missed the closing ()

DEBUG: b'C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\overrides.xml'
DEBUG: b'39b1c16685a38957bb7e7d2ea1cbf317'
DEBUG: 39b1c16685a38957bb7e7d2ea1cbf317

Looks the hexdigest isn't bytes like the others...

OK, that's hexdigest basically telling you it's chocked on what you're sending it - hasher.update(xbmcvfs.File(hash[0]).read().encode("utf-8")). You almost certainly shouldn't be encoding here (you're not dealing with a string that has been read/written - you're directly reading a file, and chances are the .read function knows what encoding it should be using!)

edit: My energy levels have gone - did I read the hasher.update line in one of your posts, or am I imagining that...?

Looks like hexdigest result is just a string - which honestly is what the hash file should be...

We need though for the hashing right?

   ERROR: EXCEPTION Thrown (PythonToCppException) : -->Python callback/script returned the following error<--
   - NOTE: IGNORING THIS CAN LEAD TO MEMORY LEAKS!
  Error Type: <class 'TypeError'>
  Error Contents: Unicode-objects must be encoded before hashing
  Traceback (most recent call last):
    File "C:\Kodi (Python 3)\portable_data\addons\script.skinshortcuts\default.py", line 449, in <module>
      Main()
    File "C:\Kodi (Python 3)\portable_data\addons\script.skinshortcuts\default.py", line 89, in __init__
      XML.buildMenu( self.MENUID, self.GROUP, self.LEVELS, self.MODE, self.OPTIONS, self.MINITEMS )
    File "C:\Kodi (Python 3)\portable_data\addons\script.skinshortcuts\resources\lib\xmlfunctions.py", line 100, in buildMenu
      if self.shouldwerun( profilelist ) == False:
    File "C:\Kodi (Python 3)\portable_data\addons\script.skinshortcuts\resources\lib\xmlfunctions.py", line 306, in shouldwerun
      hasher.update(xbmcvfs.File(hash[0]).read())
  TypeError: Unicode-objects must be encoded before hashing
  -->End of Python script error report<--

This is where we're getting, once again, past the point where I can help without being able to play with the code. If it needs to be encoded, it needs to be encoded. However,

DEBUG: b'39b1c16685a38957bb7e7d2ea1cbf317'
DEBUG: 39b1c16685a38957bb7e7d2ea1cbf317

means that we're checking two objects encoded differently - one as a bytes array, one as a string. So if we have to encode to send it to the hasher, then we need to decode it from the hasher. A bytes array will never be == to a string, the same as "one" will never be == to "1"

Yeah changing the logging and commenting out the part that cause an exception shows this:

script.skinshortcuts: Hash does not match on file
2019-09-06 19:04:49.244 T:18446744073709551614   DEBUG: b'C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\overrides.xml'
2019-09-06 19:04:49.244 T:18446744073709551614   DEBUG: b'39b1c16685a38957bb7e7d2ea1cbf317'
2019-09-06 19:04:49.244 T:18446744073709551614   DEBUG: 39b1c16685a38957bb7e7d2ea1cbf317

That cause a build loop again so I need to encode the digest and it should work...

Right?

As it is (and, as I say, ideally the .hash file should be saved as a string but we can deal with that once we've got this sorted) the hasher function is returning a string, so you need to encode that to a bytes array the same as the .hash file if hasher.hexdigest().encode("utf-8") != hash[1]: OR you need to decode the hash to a string if hasher.hexdigest() != hash[1].decode("utf-8"):. Both should work, but the best solution is for hash[1] to already be a string, the same as the hasher...

Nope still build loop when encoding hexdigest and exception cause of
AttributeError: 'str' object has no attribute 'decode'

Is there another place in the code where hexdigest is set or possibly decoded?

That would strongly suggest at least one file in the .hash doesn't have a 'b' preceding it, and so is a string and doesn't need decoding...

hexdigest is written when we write the .hash file. There's a few places where that happens (three that I can think of), but the answer is in the .hash file - aside from the :: entries, which don't have a 'b' in front of them?

I took another look and only None has no b

I did notice something else though.

Adding hasher.hexdigest().encode("utf-8") changes the digest so it doesn't match causing the build loop.

Still no b but it is also different and not just missing the b

DEBUG: b'C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\16x9\\script-skinshortcuts-includes.xml'
DEBUG: b'b646098886be03429de15da137f2a3bc'
DEBUG: 115604295a0dd4c47d07787cc5a1664b

Without encoding hexdigest it goes back to:

DEBUG: b'C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\overrides.xml'
DEBUG: b'39b1c16685a38957bb7e7d2ea1cbf317'
DEBUG: 39b1c16685a38957bb7e7d2ea1cbf317

Also appears to change the hash too ๐Ÿ˜•

As I say, I'm really past the point I can help here when I'm not in a position where I can actually play with code. But ultimately, the hash that is saved in the .hash file is generated by the same function that generates the hash we check against. We need to ensure that the file we send to that is encoded correctly both times we send it to it, and the result is encoded correctly both times when we check it.

At present, we're either encoding/decoding necessarily when saving the file, or encoding/decoding unnecessarily when loading it. What's not happening is encoding/decoding when saving, and undoing that when loading. Or not encoding/decoding at either end, so that it just matches.

Leave this with me. It looks suspiciously like I'm going to be stuck here overnight, but that should mean I'm absolutely able to have a proper look at all of this Sunday afternoon.

I think I'm starting to get it. I have a little compulsion where I really don't like to leave things unfinished so I'm probably gonna keep at it until I royally mess up or get too tired ๐Ÿ˜

If I am understanding correctly hexdigest is either encoded/not encoded or decoded/not decoded correctly somewhere and I just have to figure out where...

That's correct, right?

That's half of it. When we load, hash[1] also needs to be encoded/decoded correctly before comparing to hexdigest.

Ideally, both of them will be returning strings. There's no reason either of them (other than py2 compatibility) should be bytes arrays (from what I've read, the py3 equivalent of encode("utf-8") - which just isn't necessary for py3). If either aren't returning strings, they need to be decoded into a string. (edit - and don't forget the try_decode function, which is designed for exactly these situations where we're not sure whether we should actually be decoding or not!)

Good luck ๐Ÿ˜

Also, remember there are two parts to this. Once you get the hash of the file (hash[1]) encoding/decoding/neither correct, you need to ensure hash[0] (the actual path) encoded, decoded, neither correct, so that the hasher function can find and load the correct file...

(This is all about making sure all (three?) places where you're generating the file/hash are doing so in the same way!)

Thanks Bob, will try my best and see what I can figure out.

Right now I'm gonna start simple and add some more basic logging so I can see what is going on and try to understand the flow better.

Thanks for the help and advice ๐Ÿ˜ƒ

Honestly - though I can't always say when I'll be able to answer, I'm genuinely happy to talk anyone through the code as best I can. Feel free to hit me up anytime.

Update: Reset back to python_3 branch and left try except but added logging.

DEBUG: File to match hash is
DEBUG: b'C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\overrides.xml'
DEBUG: File hash is
DEBUG: 39b1c16685a38957bb7e7d2ea1cbf317
DEBUG: Hexdigest is
DEBUG: 39b1c16685a38957bb7e7d2ea1cbf317
DEBUG: File to match hash is
DEBUG: b'C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\template.xml'
DEBUG: File hash is
DEBUG: f7e0ef8faf2cba2bd5c677bdb7c1838c
DEBUG: Hexdigest is
DEBUG: f7e0ef8faf2cba2bd5c677bdb7c1838c
DEBUG: File to match hash is
DEBUG: b'C:\\Kodi (Python 3)\\portable_data\\userdata\\addon_data\\script.skinshortcuts\\mainmenu.DATA.xml'
DEBUG: File hash is
DEBUG: 86d0c137242c0d65a9117b721887b9af
DEBUG: Hexdigest is
DEBUG: 86d0c137242c0d65a9117b721887b9af
DEBUG: File to match hash is
DEBUG: b'C:\\Kodi (Python 3)\\portable_data\\userdata\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo.properties'
DEBUG: File hash is
DEBUG: e8e5ef68d053c3ebcc7361e7b4dfb2c3
DEBUG: Hexdigest is
DEBUG: e8e5ef68d053c3ebcc7361e7b4dfb2c3
DEBUG: File to match hash is
DEBUG: b'C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\mainmenu.DATA.xml'
DEBUG: File hash is
DEBUG: 743915f4c146e2fed7313bb3b2d07a8b
DEBUG: Hexdigest is
DEBUG: 743915f4c146e2fed7313bb3b2d07a8b
DEBUG: File to match hash is
DEBUG: b'C:\\Kodi (Python 3)\\portable_data\\userdata\\addon_data\\script.skinshortcuts\\1.DATA.xml'
DEBUG: File hash is
DEBUG: a3b385d5e804a37d3ea84090e0981a9f
DEBUG: Hexdigest is
DEBUG: a3b385d5e804a37d3ea84090e0981a9f
DEBUG: File to match hash is
DEBUG: b'C:\\Kodi (Python 3)\\portable_data\\userdata\\addon_data\\script.skinshortcuts\\music.DATA.xml'
DEBUG: File hash is
DEBUG: d8c3c1682adb6dd6cde4c607db7322cd
DEBUG: Hexdigest is
DEBUG: d8c3c1682adb6dd6cde4c607db7322cd
DEBUG: File to match hash is
DEBUG: b'C:\\Kodi (Python 3)\\portable_data\\userdata\\addon_data\\script.skinshortcuts\\20342.DATA.xml'
DEBUG: File hash is
DEBUG: 6eeaf46b98d5ea899b98b12f7780f2cf
DEBUG: Hexdigest is
DEBUG: 6eeaf46b98d5ea899b98b12f7780f2cf
DEBUG: File to match hash is
DEBUG: b'C:\\Kodi (Python 3)\\portable_data\\userdata\\addon_data\\script.skinshortcuts\\tvshows.DATA.xml'
DEBUG: File hash is
DEBUG: f5954bf276ec46f3fbc89b89db83b198
DEBUG: Hexdigest is
DEBUG: f5954bf276ec46f3fbc89b89db83b198
DEBUG: File to match hash is
DEBUG: b'C:\\Kodi (Python 3)\\portable_data\\userdata\\addon_data\\script.skinshortcuts\\31502.DATA.xml'
DEBUG: File hash is
DEBUG: ac9d7538eb22baf009e1e9e671da1ac7
DEBUG: Hexdigest is
DEBUG: ac9d7538eb22baf009e1e9e671da1ac7
DEBUG: File to match hash is
DEBUG: b'C:\\Kodi (Python 3)\\portable_data\\userdata\\addon_data\\script.skinshortcuts\\videos.DATA.xml'
DEBUG: File hash is
DEBUG: 1d975c3924bb206bf8ea27255f4339db
DEBUG: Hexdigest is
DEBUG: 1d975c3924bb206bf8ea27255f4339db
DEBUG: File to match hash is
DEBUG: b'C:\\Kodi (Python 3)\\portable_data\\userdata\\addon_data\\script.skinshortcuts\\31957.DATA.xml'
DEBUG: File hash is
DEBUG: 0d43c87dba81165c0b6f5dcf55a6d2f6
DEBUG: Hexdigest is
DEBUG: 0d43c87dba81165c0b6f5dcf55a6d2f6
DEBUG: File to match hash is
DEBUG: b'C:\\Kodi (Python 3)\\portable_data\\userdata\\addon_data\\script.skinshortcuts\\15016.DATA.xml'
DEBUG: File hash is
DEBUG: 379c0cb0f0c8c3963235d19fe6e1308b
DEBUG: Hexdigest is
DEBUG: 379c0cb0f0c8c3963235d19fe6e1308b
DEBUG: Thread Timer 16308 terminating
DEBUG: File to match hash is
DEBUG: b'C:\\Kodi (Python 3)\\portable_data\\userdata\\addon_data\\script.skinshortcuts\\13000.DATA.xml'
DEBUG: File hash is
DEBUG: c71f3dab22b68294168a3461d44dd1ba
DEBUG: Hexdigest is
DEBUG: Thread Timer start, auto delete: false
DEBUG: c71f3dab22b68294168a3461d44dd1ba
DEBUG: File to match hash is
DEBUG: b'C:\\Kodi (Python 3)\\portable_data\\userdata\\addon_data\\script.skinshortcuts\\137.DATA.xml'
DEBUG: File hash is
DEBUG: 379c0cb0f0c8c3963235d19fe6e1308b
DEBUG: Hexdigest is
DEBUG: 379c0cb0f0c8c3963235d19fe6e1308b
DEBUG: File to match hash is
DEBUG: b'C:\\Kodi (Python 3)\\portable_data\\userdata\\addon_data\\script.skinshortcuts\\31958.DATA.xml'
DEBUG: File hash is
DEBUG: 16715120710f7a36e36ecf320ab05cf9
DEBUG: Hexdigest is
DEBUG: 16715120710f7a36e36ecf320ab05cf9
DEBUG: File to match hash is
DEBUG: b'C:\\Kodi (Python 3)\\portable_data\\userdata\\addon_data\\script.skinshortcuts\\33060.DATA.xml'
DEBUG: File hash is
DEBUG: 8289791555fd51a08e2558191d2ea523
DEBUG: Hexdigest is
DEBUG: 8289791555fd51a08e2558191d2ea523
DEBUG: File to match hash is
DEBUG: b'C:\\Kodi (Python 3)\\portable_data\\userdata\\addon_data\\script.skinshortcuts\\1036.DATA.xml'
DEBUG: File hash is
DEBUG: 379c0cb0f0c8c3963235d19fe6e1308b
DEBUG: Hexdigest is
DEBUG: 379c0cb0f0c8c3963235d19fe6e1308b
DEBUG: File to match hash is
DEBUG: b'C:\\Kodi (Python 3)\\portable_data\\userdata\\addon_data\\script.skinshortcuts\\weather.DATA.xml'
DEBUG: File hash is
DEBUG: 379c0cb0f0c8c3963235d19fe6e1308b
DEBUG: Hexdigest is
DEBUG: 379c0cb0f0c8c3963235d19fe6e1308b
DEBUG: File to match hash is
DEBUG: b'C:\\Kodi (Python 3)\\portable_data\\userdata\\addon_data\\script.skinshortcuts\\musicvideos.DATA.xml'
DEBUG: File hash is
DEBUG: e50fc011393626f72ca4ff45b18e1ef7
DEBUG: Hexdigest is
DEBUG: e50fc011393626f72ca4ff45b18e1ef7
DEBUG: File to match hash is
DEBUG: b'C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\16x9\\script-skinshortcuts-includes.xml'
DEBUG: File hash is
DEBUG: df6161755fd0ed72ba53684fda9581cb
DEBUG: Hexdigest is
DEBUG: b5a8b0f10c4947fa6650e546bbbdb95c

So whatever I did in that branch has the script-skinshortcuts-includes.xml file getting the hash now but it doesn't match...

I just wanted to post this cause I am done for the day and wanted to write it down ๐Ÿ˜‰

I only changed this in the python_3 branch:

                else:
                    try:
                        hasher = hashlib.md5()
                        hasher.update(xbmcvfs.File(hash[0]).read().encode("utf-8"))
                        print("File to match hash is")
                        print(hash[0])
                        print("File hash is")
                        print(hash[1])
                        print("Hexdigest is")
                        print(hasher.hexdigest())
                        if hasher.hexdigest() != hash[1]:
                            log( "Hash does not match on file " + hash[0] )
                            log( "(" + hash[1] + " > " + hasher.hexdigest() + ")" )
                            return True
                    except:
                        log( "Unable to generate hash for %s" %( hash[ 0 ] ) )
                        log( "(%s > ?)" %( hash[ 1 ] ) )

Ok disregard previous. Not sure what happened there but after hours and hours of testing different scenarios including taking latest master branch addon_data/script.skinshortcuts files from existing leia install and many python_3 reset menus it always comes down to one thing and it is comparing the hash file to the includes file.

DEBUG: script.skinshortcuts: Unable to generate hash for b'C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\16x9\\script-skinshortcuts-includes.xml'
DEBUG: script.skinshortcuts: (1aa03c88dab6169e31d2bc768ef15cd5 > ?)
DEBUG: script.skinshortcuts: Menu is up to date
DEBUG: script.skinshortcuts: script stopped

The bytes don't appear to matter and it looks like it needs to be encoded that way otherwise you cannot hash the file to begin with.

.hash file:

[['::PROFILELIST::', [['C:\\Kodi (Python 3)\\portable_data\\userdata\\', 'String.IsEqual(System.ProfileName,Master user)', 'Master user']]], ['::SCRIPTVER::', '1.0.20'], ['::XBMCVER::', '19'], ['::HIDEPVR::', 'false'], ['::SHARED::', 'false'], ['::SKINDIR::', 'skin.aeon.nox.silvo'], [b'C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\overrides.xml', '39b1c16685a38957bb7e7d2ea1cbf317'], [b'C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\template.xml', 'f7e0ef8faf2cba2bd5c677bdb7c1838c'], ['::FULLMENU::', 'True'], [b'C:\\Kodi (Python 3)\\portable_data\\userdata\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-mainmenu.DATA.xml', '101951f32a616f1ba674a59f05fb0b4a'], [b'C:\\Kodi (Python 3)\\portable_data\\userdata\\overrides.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\userdata\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo.properties', '35d65de3143d95bf0dd13ad7cffbd8cf'], [b'C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\mainmenu.DATA.xml', '743915f4c146e2fed7313bb3b2d07a8b'], [b'C:\\Kodi (Python 3)\\portable_data\\userdata\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-games.DATA.xml', '379c0cb0f0c8c3963235d19fe6e1308b'], [b'C:\\Kodi (Python 3)\\portable_data\\userdata\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-games-1.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\games-1.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\addons\\script.skinshortcuts\\resources\\shortcuts\\games-1.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\userdata\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-games-2.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\games-2.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\addons\\script.skinshortcuts\\resources\\shortcuts\\games-2.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\userdata\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-music.DATA.xml', '7072d3b425ef367a68e4e37be0458d11'], [b'C:\\Kodi (Python 3)\\portable_data\\userdata\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-music-1.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\music-1.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\addons\\script.skinshortcuts\\resources\\shortcuts\\music-1.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\userdata\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-music-2.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\music-2.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\addons\\script.skinshortcuts\\resources\\shortcuts\\music-2.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\userdata\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-tvshows.DATA.xml', '8665a0518e8c209ab84fbaa49e1fa792'], [b'C:\\Kodi (Python 3)\\portable_data\\userdata\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-tvshows-1.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\tvshows-1.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\addons\\script.skinshortcuts\\resources\\shortcuts\\tvshows-1.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\userdata\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-tvshows-2.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\tvshows-2.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\addons\\script.skinshortcuts\\resources\\shortcuts\\tvshows-2.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\userdata\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-20342.DATA.xml', 'c54e774b9d04efb72c8853e7bcf3dcbd'], [b'C:\\Kodi (Python 3)\\portable_data\\userdata\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-20342-1.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\20342-1.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\addons\\script.skinshortcuts\\resources\\shortcuts\\20342-1.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\userdata\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-20342-2.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\20342-2.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\addons\\script.skinshortcuts\\resources\\shortcuts\\20342-2.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\userdata\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-videos.DATA.xml', '84605e580f0b2fc9393a6f4e59d65482'], [b'C:\\Kodi (Python 3)\\portable_data\\userdata\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-videos-1.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\videos-1.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\addons\\script.skinshortcuts\\resources\\shortcuts\\videos-1.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\userdata\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-videos-2.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\videos-2.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\addons\\script.skinshortcuts\\resources\\shortcuts\\videos-2.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\userdata\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-31957.DATA.xml', '6c7c6b3e04347dad9629ad0e286abdfb'], [b'C:\\Kodi (Python 3)\\portable_data\\userdata\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-31957-1.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\31957-1.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\addons\\script.skinshortcuts\\resources\\shortcuts\\31957-1.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\userdata\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-31957-2.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\31957-2.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\addons\\script.skinshortcuts\\resources\\shortcuts\\31957-2.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\userdata\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-13000.DATA.xml', 'b40b4a79c2948a009268273ef7cf44f0'], [b'C:\\Kodi (Python 3)\\portable_data\\userdata\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-13000-1.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\13000-1.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\addons\\script.skinshortcuts\\resources\\shortcuts\\13000-1.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\userdata\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-13000-2.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\13000-2.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\addons\\script.skinshortcuts\\resources\\shortcuts\\13000-2.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\userdata\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-31958.DATA.xml', 'febfa78ff3be36181571a55dd7ca1304'], [b'C:\\Kodi (Python 3)\\portable_data\\userdata\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-31958-1.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\31958-1.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\addons\\script.skinshortcuts\\resources\\shortcuts\\31958-1.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\userdata\\addon_data\\script.skinshortcuts\\skin.aeon.nox.silvo-31958-2.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\shortcuts\\31958-2.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\addons\\script.skinshortcuts\\resources\\shortcuts\\31958-2.DATA.xml', None], [b'C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\16x9\\script-skinshortcuts-includes.xml', '033bcaf02f002fdcc658abbb04306bb5'], ['::SKINVER::', '7.9.2']]

LOG
Small snippet:

DEBUG: File hash is
DEBUG: febfa78ff3be36181571a55dd7ca1304
DEBUG: Hexdigest is
DEBUG: febfa78ff3be36181571a55dd7ca1304
DEBUG: File to match hash is
DEBUG: b'C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\16x9\\script-skinshortcuts-includes.xml'
DEBUG: File hash is
DEBUG: 033bcaf02f002fdcc658abbb04306bb5
DEBUG: Hexdigest is
DEBUG: f38c4d7bd281a466666ca0e95ae84946
DEBUG: script.skinshortcuts: Unable to generate hash for b'C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\16x9\\script-skinshortcuts-includes.xml'
DEBUG: script.skinshortcuts: (033bcaf02f002fdcc658abbb04306bb5 > ?)
DEBUG: script.skinshortcuts: Menu is up to date

The only places I see that reference the includes file are here:

                    if sys.version_info.major == 3:
                        path = xbmc.translatePath(os.path.join("special://skin/", resolution.attrib.get( "folder" ), "script-skinshortcuts-includes.xml"))
                    else:
                        path = xbmc.translatePath(os.path.join("special://skin/", resolution.attrib.get( "folder" ), "script-skinshortcuts-includes.xml").encode("utf-8")).decode("utf-8")

And here:

                    if sys.version_info.major == 3:
                        path = xbmc.translatePath(os.path.join(try_decode(self.skinDir), try_decode(resolution.attrib.get("folder")), "script-skinshortcuts-includes.xml"))
                    else:
                        path = xbmc.translatePath( os.path.join( try_decode( self.skinDir ) , try_decode( resolution.attrib.get( "folder" ) ), "script-skinshortcuts-includes.xml").encode("utf-8") ).decode('utf-8')

In xmlfunctions.xml

I did a online md5 hash check and the .hash file hexdigest is saved accurately.

I just can't figure out why this is happening for just this one file.

Maybe it is the try_decode but I removed it and nothing changed. I also tried everything I could remember that we talked about changing previously and things just got worse. The weird thing is right now everything works and I mean everything I could test except matching that darn hash.

Anyway I am gonna give up for now unless I get an itch that I just can't scratch or get bored.

Got bored...
I keep trying things and now a different result.
I changed the logging causing an exception and apparently that is what was preventing the build loop:

                        if hasher.hexdigest() != hash[1]:
                            log("Hash does not match on file " + hash[0].decode("utf-8"))
                            log( "(" + hash[1] + " > " + hasher.hexdigest() + ")" )
                            return True
                    except:
                        log( "Unable to generate hash for %s" %( hash[ 0 ] ) )
                        log( "(%s > ?)" %( hash[ 1 ] ) )
                        print_exc()
DEBUG: script.skinshortcuts: Hash does not match on file C:\Kodi (Python 3)\portable_data\addons\skin.aeon.nox.silvo\16x9\script-skinshortcuts-includes.xml
DEBUG: script.skinshortcuts: (033bcaf02f002fdcc658abbb04306bb5 > f38c4d7bd281a466666ca0e95ae84946)

So with the hash[0] being a byte and causing concatenation error it cannot generate the hash but updates the .hash file correctly.

Decoding byte to string and then it doesn't update the .hash file...

Ok it is working when changing in management dialog or for new installs and writing the .hash file but the RunScript(script.skinshortcuts,type=buildxml&amp;mainmenuID=9000&amp;levels=2&amp;options=noGroups) on home does not write/compare the script-skinshortcuts-includes.xml hash...

python_3 branch is still working correctly for me regarding the hashes, but if you push your latest non-working attempt (or tell me which branch its on), I've got an hour now I can look at it, and I can look properly tomorrow.

(The submenu no longer appears to be getting delinked - nice work ๐Ÿ‘ )

It is python_3 branch. I just pushed my extra logging & that exception fix.

Don't know how I fixed it but thanks ๐Ÿ˜

Yup, that branch is working fine here on a Mac saving and checking the hashes - https://pastebin.com/BpgHUC6T

Off topic and I'm taking a look at your log now but that exception for library data provider I fixed on my forked version of the script.

I have your Nox Silvo repo installed - is the forked version not on it?

I'm wondering if this is some kind of xbmc.translatePath issue or something due to the / \ difference.

I also have script.skinshortcuts: Hash does not match on file C:\Kodi (Python 3)\portable_data\addons\skin.aeon.nox.silvo\16x9\script-skinshortcuts-includes.xml no double slashes in the skin shortcuts debug output.
Is there in the print though:
b'C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\16x9\\script-skinshortcuts-includes.xml'

I have not maintained anything on my personal repo since getting the skin and skin.info.service script into the Kodi repo.

Assuming the includes.xml is being written correctly (it is actually being written, right...? ๐Ÿ˜‰), there's something funky going on with that file path. Is its path the same as the others in the .hash file - all starting with a b, all with double slashes, and so on?

Potentially interesting and quick test, what prints in the log if you add the line print(len(xbmcvfs.File(hash[0]).read())) right before the hasher.update line in shouldwerun? If it's not 0, then we're able to load the file fine...

With the latest commit I'm in a build loop but that commit just added extra logging and fixed an exception.

Before that menu and everything else worked without a build loop just unable to hash includes

Output of new logging is:

DEBUG: File hash0 read
DEBUG: 90980

That doesn't look right...
EDIT: You said not 0 is good so maybe this is expected result.

This is what I added:

                        hasher = hashlib.md5()
                        print("File hash0 read")
                        print(len(xbmcvfs.File(hash[0]).read()))
                        hasher.update(xbmcvfs.File(hash[0]).read().encode("utf-8"))

Yes all double slashes in hash file preceded with a b'

OK, that's good. It means the file is being read correctly (its saying the length of the file is 90980 bytes/bits/characters/whatever its measuring it in.) It's reading the file correctly.

Next, lets double check its writing it correctly - can you rename your includes.xml file and just ensure a new one is written. (If, for whatever reason, it wasn't actually writing the changes where we expect, then the hashes wouldn't match...)

When deleted I get my new building menu "screen" and a new one is built just then I get a build loop due to hash not matching.

All other hashes match except the includes file...

OK, now we're cooking. We now that the file is being read correctly and the hash generated correctly. Meaning the only other possibility is we're not generating the hash correctly when writing the includes file. Just working on some debug code...

As I think about it the double slashes are correct right? Those are to escape \ so it is read the right way IIRC.

Kodi log output might have some fancy pants auto fix the path magic so it outputs correctly there but not when using simple print statement...

Do you want push rights to the repo? Might be easier for me to use your debug unless it is easier for you to just use your repo...

I was just going to give you the debug code - copy paste is probably the quickest for something simple like this. Somewhere around line 724, replace the code block with

        # Save the tree
        DATA.indent( tree.getroot() )
        for path in paths:
            print (path)
            tree.write( path, encoding="UTF-8" )

            # Save the hash of the file we've just written
            hasher = hashlib.md5()
            hasher.update(xbmcvfs.File(path).read().encode("utf-8"))
            print(hasher.hexdigest())

            with open(path, "r+") as f:
                DATA._save_hash( path, f.read() )
                f.close()

There will now be a hash written to the log when writing the menu. Does the hash in the log match the hash in the .hash file?

That's the one for the file but it doesn't update the hash file with it.

OK, so a different hash is written to the .hash file?

No I don't think anything is updated for it. Stays the same.

It does update when using management dialog though just not the shouldwerun check on home screen when no changes are happening.

I suspect it is updating - its just generating the wrong hash when writing the .hash file for some bizarre (probably encode/decode) reason.

Probably right. I just don't know where it would be doing that and why it works on your end.

As soon as I re-add that exception this happens:

2019-09-07 17:42:35.225 T:18446744073709551614   DEBUG: script.skinshortcuts: Unable to generate hash for b'C:\\Kodi (Python 3)\\portable_data\\addons\\skin.aeon.nox.silvo\\16x9\\script-skinshortcuts-includes.xml'
2019-09-07 17:42:35.225 T:18446744073709551614   DEBUG: script.skinshortcuts: (033bcaf02f002fdcc658abbb04306bb5 > ?)
2019-09-07 17:42:35.226 T:18446744073709551614   ERROR: Traceback (most recent call last):
2019-09-07 17:42:35.226 T:18446744073709551614   ERROR:   File "C:\Kodi (Python 3)\portable_data\addons\script.skinshortcuts\resources\lib\xmlfunctions.py", line 318, in shouldwerun
                                                log("Hash does not match on file " + hash[0])
2019-09-07 17:42:35.226 T:18446744073709551614   ERROR: TypeError: can only concatenate str (not "bytes") to str

Then if i make changes in management dialog the .hash file updates correctly

Actually you are 100% correct it is the wrong md5

Is writing this:
6b1a0eb9d419c84f24cebf78288f38e1
Should be:
EF078D089073547D1BCE374306C46F80

according to online md5 hash generator

The where is easy datafunctions, _save_hash function, around line 1140. Why it works for me, not you ... I don't know. The correct solution is equally hard until we know the why, but as a stop-gap, let's switch to using the hasher method we just proved works...

    def _save_hash( self, filename, file ):
        if file is not None:
            hasher = hashlib.md5()
            hasher.update(xbmcvfs.File(filename).read().encode("utf-8"))
            hashlist.list.append( [filename, hasher.hexdigest()] )
        else:
            hashlist.list.append( [filename, None] )

(This isn't ideal because it means we're going to be reading every damn file twice, when we've already got them open. But for now, this should - with every finger I've got crossed - work...)

My first thought was portable install vs default.

But hash doesn't match.

Sorry - datafunctions.py, not xmlfunctions ๐Ÿ˜Š

I know already changed it. Starting to memorize where it all is. Also change the one in template.xml right?

Shouldn't need to change that one, assuming the hash for the template.xml file is being generated/written correctly to the .hash file (which it will be, as its hash will be compared much earlier in the process than the includes)

Success!!!

C:\Kodi (Python 3)\portable_data\addons\skin.aeon.nox.silvo\16x9\script-skinshortcuts-includes.xml
2019-09-07 17:56:43.753 T:18446744073709551614   DEBUG: File hash is
2019-09-07 17:56:43.753 T:18446744073709551614   DEBUG: f38c4d7bd281a466666ca0e95ae84946
2019-09-07 17:56:43.753 T:18446744073709551614   DEBUG: Hexdigest is
2019-09-07 17:56:43.753 T:18446744073709551614   DEBUG: f38c4d7bd281a466666ca0e95ae84946
2019-09-07 17:56:43.753 T:18446744073709551614   DEBUG: script.skinshortcuts: Menu is up to date

Maybe I was messing it up cause I tried this but always matched the one in template.xml to the datafunctions one...

Nah, it's most likely an encoding/decoding problem. I'll see if I can set up an old machine with Windows so I can fix it properly tomorrow.

Looking closer, I never tried this part:
hasher.update(xbmcvfs.File(filename).read().encode("utf-8"))

It isn't fixed now?

It's a bad solution. We've already opened and read every file that we hash to actually build the menu from. The _save_hash function just grabs the hash from them whilst we've got them. With this fix, though, we're opening and reading them all a second time. Not ideal!