So here's the debug output. Looks like something to do with the ITVX plugin.
If this is the cause, then I presume that even if you disable a Kodi plugin, it still loads and impacts the system somehow, because disabling the plugin didn't stop the crashes. Completely removing the plugin (only a 10 minute test,) seems to have fixed it for now, though.
gdb.txt:
#3 Frame 0x7fffc5c01bc0, for file /usr/lib/python3/dist-packages/simplejson/errors.py, line 7, in linecol (doc='no continue watching items', pos=0)
lineno = doc.count('\n', 0, pos) + 1
#3 Frame 0x7fffc5c01ae8, for file /usr/lib/python3/dist-packages/simplejson/errors.py, line 16, in errmsg (msg='Expecting value', doc='no continue watching items', pos=0, end=None)
lineno, colno = linecol(doc, pos)
#3 Frame 0x7fffc5c01a30, for file /usr/lib/python3/dist-packages/simplejson/errors.py, line 41, in __init__ (self=<JSONDecodeError at remote 0x7fffb8206e40>, msg='Expecting value', doc='no continue watching items', pos=0, end=None)
ValueError.__init__(self, errmsg(msg, doc, pos, end=end))
#18 Frame 0x7fffc5c01980, for file /usr/lib/python3/dist-packages/simplejson/decoder.py, line 416, in raw_decode (self=<JSONDecoder(encoding='utf-8', object_hook=None, object_pairs_hook=None, parse_float=<type at remote 0x7ffff7b58600>, parse_int=<type at remote 0x7ffff7b5adc0>, parse_constant=None, strict=True, parse_object=<function at remote 0x7fffb21e3b00>, parse_array=<function at remote 0x7fffb21e2200>, parse_string=<built-in method scanstring of module object at remote 0x7fff2c3f27a0>, memo={}, scan_once=<simplejson._speedups.Scanner at remote 0x7fff2398a2d0>) at remote 0x7fff44236420>, s='no continue watching items', idx=0, _w=<builtin_method at remote 0x7fffa4f93d80>, _PY3=True, ord0=110)
return self.scan_once(s, idx=_w(s, idx).end())
#18 Frame 0x7fffc5c018c8, for file /usr/lib/python3/dist-packages/simplejson/decoder.py, line 386, in decode (self=<JSONDecoder(encoding='utf-8', object_hook=None, object_pairs_hook=None, parse_float=<type at remote 0x7ffff7b58600>, parse_int=<type at remote 0x7ffff7b5adc0>, parse_constant=None, strict=True, parse_object=<function at remote 0x7fffb21e3b00>, parse_array=<function at remote 0x7fffb21e2200>, parse_string=<built-in method scanstring of module object at remote 0x7fff2c3f27a0>, memo={}, scan_once=<simplejson._speedups.Scanner at remote 0x7fff2398a2d0>) at remote 0x7fff44236420>, s='no continue watching items', _w=<builtin_method at remote 0x7fffa4f93f10>, _PY3=True)
obj, end = self.raw_decode(s)
#18 Frame 0x7fffc5c01800, for file /usr/lib/python3/dist-packages/simplejson/__init__.py, line 514, in loads (s='no continue watching items', encoding=None, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, use_decimal=False, allow_nan=False, kw={})
return _default_decoder.decode(s)
#18 Frame 0x7fffc5c01768, for file /home/james/.kodi/addons/script.module.requests/lib/requests/models.py, line 971, in json (self=<Response(_content=b'no continue watching items', _content_consumed=True, _next=None, status_code=404, headers=<CaseInsensitiveDict(_store={'content-type': ('Content-Type', 'text/plain; charset=UTF-8'), 'content-length': ('Content-Length', '26'), 'connection': ('Connection', 'keep-alive'), 'access-control-allow-headers': ('access-control-allow-headers', 'accept, authorization, content-type'), 'access-control-allow-methods': ('access-control-allow-methods', 'OPTIONS, GET, HEAD'), 'access-control-allow-origin': ('access-control-allow-origin', '*'), 'access-control-expose-headers': ('access-control-expose-headers', '*'), 'date': ('date', 'Sun, 01 Sep 2024 17:34:19 GMT'), 'server': ('server', 'istio-envoy'), 'trace-id': ('trace-id', '3c01880f55c6c31afe7da1cc3803e551'), 'x-content-type-options': ('x-content-type-options', 'nosniff'), 'x-envoy-decorator-operation': ('x-envoy-decorator-opera...(truncated)
return complexjson.loads(self.text, **kwargs)
#18 Frame 0x7fffc5c01688, for file /home/james/.kodi/addons/plugin.video.viwx/resources/lib/fetch.py, line 271, in web_request (method='GET', url='https://content.prd.user.itv.com/lastwatched/user/4610af58-a330-4640-b519-4cfe54a89b9e/ctv?features=hd,progressive,single-track,mpeg-dash,widevine,widevine-download,inband-ttml,hls,aes,inband-webvtt,outband-webvtt,inband-audio-description', headers={'Accept': 'application/json', 'accept': 'application/vnd.user.content.v1+json', 'authorization': 'Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJodHRwczovL2F1dGguaXR2LmNvbSIsInN1YiI6IjQ2MTBhZjU4LWEzMzAtNDY0MC1iNTE5LTRjZmU1NGE4OWI5ZSIsImV4cCI6MTcyNTI5OTgyNCwiaWF0IjoxNzI1MjA5ODI0LCJicm9hZGNhc3RFcnJvck1zZyI6IiIsImJyb2FkY2FzdFJlc3BvbnNlQ29kZSI6IjIwMCIsImJyb2FkY2FzdGVyIjoiSVRWIiwiaXNBY3RpdmUiOnRydWUsIm5vbmNlIjoieTZlZzhTeWo0RElPQ2tEa0JSN3oiLCJuYW1lIjoiQ2F0aGVyaW5lIiwic2NvcGUiOiJjb250ZW50IiwiZW50aXRsZW1lbnRzIjpbXSwicGF5bWVudFNvdXJjZSI6IiIsInNob3dQcml2YWN5Tm90aWNlIjpmYWxzZSwidW5kZXIxOCI6ZmFsc2UsImFjY291bnRQcm9maWxlSWRJblVzZ...(truncated)
resp_data = resp.json()
#18 Frame 0x7fffc5c015e8, for file /home/james/.kodi/addons/plugin.video.viwx/resources/lib/fetch.py, line 315, in get_json (url='https://content.prd.user.itv.com/lastwatched/user/4610af58-a330-4640-b519-4cfe54a89b9e/ctv?features=hd,progressive,single-track,mpeg-dash,widevine,widevine-download,inband-ttml,hls,aes,inband-webvtt,outband-webvtt,inband-audio-description', headers={'accept': 'application/vnd.user.content.v1+json', 'authorization': 'Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJodHRwczovL2F1dGguaXR2LmNvbSIsInN1YiI6IjQ2MTBhZjU4LWEzMzAtNDY0MC1iNTE5LTRjZmU1NGE4OWI5ZSIsImV4cCI6MTcyNTI5OTgyNCwiaWF0IjoxNzI1MjA5ODI0LCJicm9hZGNhc3RFcnJvck1zZyI6IiIsImJyb2FkY2FzdFJlc3BvbnNlQ29kZSI6IjIwMCIsImJyb2FkY2FzdGVyIjoiSVRWIiwiaXNBY3RpdmUiOnRydWUsIm5vbmNlIjoieTZlZzhTeWo0RElPQ2tEa0JSN3oiLCJuYW1lIjoiQ2F0aGVyaW5lIiwic2NvcGUiOiJjb250ZW50IiwiZW50aXRsZW1lbnRzIjpbXSwicGF5bWVudFNvdXJjZSI6IiIsInNob3dQcml2YWN5Tm90aWNlIjpmYWxzZSwidW5kZXIxOCI6ZmFsc2UsImFjY291bnRQcm9maWxlSWRJblVzZSI6bnVsbCwicmVnaW9uIjoiY2VudHJhbF9lYXN0IiwicG9z...(truncated)
resp = web_request('GET', url, dflt_headers, **kwargs)
#18 Frame 0x7fffc5c01510, for file /home/james/.kodi/addons/plugin.video.viwx/resources/lib/itv_account.py, line 277, in fetch_authenticated (funct=<function at remote 0x7fff5cd536a0>, url='https://content.prd.user.itv.com/lastwatched/user/4610af58-a330-4640-b519-4cfe54a89b9e/ctv?features=hd,progressive,single-track,mpeg-dash,widevine,widevine-download,inband-ttml,hls,aes,inband-webvtt,outband-webvtt,inband-audio-description', login=True, kwargs={'headers': {'accept': 'application/vnd.user.content.v1+json', 'authorization': 'Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJodHRwczovL2F1dGguaXR2LmNvbSIsInN1YiI6IjQ2MTBhZjU4LWEzMzAtNDY0MC1iNTE5LTRjZmU1NGE4OWI5ZSIsImV4cCI6MTcyNTI5OTgyNCwiaWF0IjoxNzI1MjA5ODI0LCJicm9hZGNhc3RFcnJvck1zZyI6IiIsImJyb2FkY2FzdFJlc3BvbnNlQ29kZSI6IjIwMCIsImJyb2FkY2FzdGVyIjoiSVRWIiwiaXNBY3RpdmUiOnRydWUsIm5vbmNlIjoieTZlZzhTeWo0RElPQ2tEa0JSN3oiLCJuYW1lIjoiQ2F0aGVyaW5lIiwic2NvcGUiOiJjb250ZW50IiwiZW50aXRsZW1lbnRzIjpbXSwicGF5bWVudFNvdXJjZSI6IiIsInNob3dQcml2YWN5Tm90aWNlIjpmYWxzZSwidW5kZXIxOCI6Z...(truncated)
return funct(url=url, **kwargs)
#18 Frame 0x7fffc5c01448, for file /home/james/.kodi/addons/plugin.video.viwx/resources/lib/itvx.py, line 528, in get_last_watched (user_id='4610af58-a330-4640-b519-4cfe54a89b9e', cache_key='last_watched_4610af58-a330-4640-b519-4cfe54a89b9e', cached_data=None, url='https://content.prd.user.itv.com/lastwatched/user/4610af58-a330-4640-b519-4cfe54a89b9e/ctv?features=hd,progressive,single-track,mpeg-dash,widevine,widevine-download,inband-ttml,hls,aes,inband-webvtt,outband-webvtt,inband-audio-description', header={'accept': 'application/vnd.user.content.v1+json', 'authorization': 'Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJodHRwczovL2F1dGguaXR2LmNvbSIsInN1YiI6IjQ2MTBhZjU4LWEzMzAtNDY0MC1iNTE5LTRjZmU1NGE4OWI5ZSIsImV4cCI6MTcyNTI5OTgyNCwiaWF0IjoxNzI1MjA5ODI0LCJicm9hZGNhc3RFcnJvck1zZyI6IiIsImJyb2FkY2FzdFJlc3BvbnNlQ29kZSI6IjIwMCIsImJyb2FkY2FzdGVyIjoiSVRWIiwiaXNBY3RpdmUiOnRydWUsIm5vbmNlIjoieTZlZzhTeWo0RElPQ2tEa0JSN3oiLCJuYW1lIjoiQ2F0aGVyaW5lIiwic2NvcGUiOiJjb250ZW50IiwiZW50aXRsZW1lbnRzIjpbXSwicGF5bWVudFNvdXJjZSI6I...(truncated)
data = itv_account.fetch_authenticated(fetch.get_json, url, headers=header)
#18 Frame 0x7fffa6d3d288, for file /home/james/.kodi/addons/plugin.video.viwx/resources/lib/main.py, line 254, in generic_list (addon=<Route(_title='Continue Watching', handle=9, update_listing=False, category='Continue Watching', cache_to_disc=True, redirect_single_item=False, sort_methods=[40, 9, 3], content_type='videos', autosort=False) at remote 0x7fff38178290>, list_type='watching', filter_char=None, page_nr=0)
shows_list = itvx.get_last_watched()
#27 Frame 0x7fffc5c013b8, for file /home/james/.kodi/addons/plugin.video.viwx/resources/lib/main.py, line 79, in wrapper (args=(<Route(_title='Continue Watching', handle=9, update_listing=False, category='Continue Watching', cache_to_disc=True, redirect_single_item=False, sort_methods=[40, 9, 3], content_type='videos', autosort=False) at remote 0x7fff38178290>,), kwargs={'list_type': 'watching', 'filter_char': None}, result=<generator at remote 0x7fffa6d3d240>)
result = list(result)
#27 Frame 0x7fffc5c01328, for file /home/james/.kodi/addons/script.module.codequick/lib/codequick/script.py, line 169, in __call__ (self=<Route(_title='Continue Watching', handle=9, update_listing=False, category='Continue Watching', cache_to_disc=True, redirect_single_item=False, sort_methods=[40, 9, 3], content_type='videos', autosort=False) at remote 0x7fff38178290>, route=<Route at remote 0x7fff21192080>, args=[], kwargs={'list_type': 'watching', 'filter_char': None})
return route.function(self, *args, **kwargs)
#27 Frame 0x7fffc5c01268, for file /home/james/.kodi/addons/script.module.codequick/lib/codequick/route.py, line 195, in __call__ (self=<Route(_title='Continue Watching', handle=9, update_listing=False, category='Continue Watching', cache_to_disc=True, redirect_single_item=False, sort_methods=[40, 9, 3], content_type='videos', autosort=False) at remote 0x7fff38178290>, route=<Route at remote 0x7fff21192080>, args=[], kwargs={'list_type': 'watching', 'filter_char': None}, cache_ttl=-1, cache=None, session_id='a4a6d7cf9fd3f859bf43ea471629807bb5a8fa6d')
results = super(Route, self).__call__(route, args, kwargs)
#27 Frame 0x7fffc5c011c8, for file /home/james/.kodi/addons/plugin.video.viwx/resources/lib/cc_patch.py, line 29, in patched_call (self=<Route(_title='Continue Watching', handle=9, update_listing=False, category='Continue Watching', cache_to_disc=True, redirect_single_item=False, sort_methods=[40, 9, 3], content_type='videos', autosort=False) at remote 0x7fff38178290>, route=<Route at remote 0x7fff21192080>, args=[], kwargs={'list_type': 'watching', 'filter_char': None})
original_call(self, route, args, kwargs)
#33 Frame 0x7fffc5c010f0, for file /home/james/.kodi/addons/script.module.codequick/lib/codequick/support.py, line 306, in run_callback (self=<Dispatcher(registered_delayed=[(<function at remote 0x7fff2cd7d940>, (), {}, 0)], registered_routes={'root': <Route at remote 0x7fff21192140>, '/resources/lib/main/sub_menu_my_itvx': <Route at remote 0x7fff211920e0>, '/resources/lib/main/wrapper.generic_list': <Route at remote 0x7fff21192080>, '/resources/lib/main/sub_menu_live': <Route at remote 0x7fff21191fc0>, '/resources/lib/main/list_collections': <Route at remote 0x7fff21191f60>, '/resources/lib/main/wrapper.list_collection_content': <Route at remote 0x7fff21191f00>, '/resources/lib/main/list_categories': <Route at remote 0x7fff21191e40>, '/resources/lib/main/wrapper.list_category': <Route at remote 0x7fff21191de0>, '/resources/lib/main/wrapper.list_news_sub_category': <Route at remote 0x7fff21191d20>, '/resources/lib/main/wrapper.list_productions': <Route at remote 0x7fff21191c60>, '/resources/lib/main/wrapper.do_se...(truncated)
redirect = parent_ins(route, arg_params, self.callback_params)
#33 Frame 0x7fffc5c01078, for file /home/james/.kodi/addons/plugin.video.viwx/resources/lib/main.py, line 647, in run ()
if isinstance(cc_run(), Exception):
#33 Frame 0x7fffc5c01020, for file /home/james/.kodi/addons/plugin.video.viwx/addon.py, line 21, in <module> ()
main.run()
Happy to report this as a bug in their git, if I know what I'm reporting.