Restructure stop decorator and LibraryException

This commit is contained in:
Odd Stråbø 2025-09-15 02:43:39 +02:00
commit 3de5b2e43d
5 changed files with 67 additions and 46 deletions

View file

@ -13,7 +13,12 @@ from .objects import Movies, TVShows, MusicVideos, Music
from .database import Database, get_sync, save_sync, jellyfin_db from .database import Database, get_sync, save_sync, jellyfin_db
from .helper import translate, settings, window, progress, dialog, LazyLogger, xmls from .helper import translate, settings, window, progress, dialog, LazyLogger, xmls
from .helper.utils import get_screensaver, set_screensaver from .helper.utils import get_screensaver, set_screensaver
from .helper.exceptions import LibraryException, PathValidationException from .helper.exceptions import (
LibraryException,
LibraryExitException,
LibrarySyncLaterException,
PathValidationException,
)
################################################################################################## ##################################################################################################
@ -169,11 +174,13 @@ class FullSync(object):
selection = dialog("multi", translate(33120), choices) selection = dialog("multi", translate(33120), choices)
if selection is None: if selection is None:
raise LibraryException("LibrarySelection") # TODO: Why are we handling these two differently?
# presumably one means the dialog got aborted, the other means that we just pressed ok without selecting any libraries
raise LibraryException("Library selection dialog returned None.")
elif not selection: elif not selection:
LOG.info("Nothing was selected.") LOG.info("Nothing was selected.")
raise LibraryException("SyncLibraryLater") raise LibrarySyncLaterException("No libraries where selected, sync later.")
if 0 in selection: if 0 in selection:
selection = list(range(1, len(libraries) + 1)) selection = list(range(1, len(libraries) + 1))
@ -275,11 +282,13 @@ class FullSync(object):
media[library["CollectionType"]](library) media[library["CollectionType"]](library)
except LibraryException as error: except LibraryException as error:
# TODO: Fixme; We're catching all LibraryException here,
if error.status == "StopCalled": # but silently ignoring any that isn't the exit condition.
# Investigate what would be appropriate behavior here.
if isinstance(error, LibraryExitException):
save_sync(self.sync) save_sync(self.sync)
raise raise
LOG.warning("Ignoring exception %s", error)
except PathValidationException: except PathValidationException:
raise raise

View file

@ -19,9 +19,15 @@ class HTTPException(Exception):
class LibraryException(Exception): class LibraryException(Exception):
# Jellyfin library sync exception pass
def __init__(self, status):
self.status = status
class LibraryExitException(LibraryException):
"Exception raised to propagate application exit."
class LibrarySyncLaterException(LibraryException):
"Raised when no libraries are selected for sync."
class PathValidationException(Exception): class PathValidationException(Exception):
@ -30,5 +36,3 @@ class PathValidationException(Exception):
TODO: Investigate the usage of this to see if it can be done better. TODO: Investigate the usage of this to see if it can be done better.
""" """
pass

View file

@ -162,18 +162,6 @@ def dialog(dialog_type, *args, **kwargs):
return types[dialog_type](*args, **kwargs) return types[dialog_type](*args, **kwargs)
def should_stop():
"""Checkpoint during the sync process."""
if xbmc.Monitor().waitForAbort(0.00001):
return True
if window("jellyfin_should_stop.bool"):
LOG.info("exiiiiitttinggg")
return True
return not window("jellyfin_online.bool")
def get_screensaver(): def get_screensaver():
"""Get the current screensaver value.""" """Get the current screensaver value."""
result = JSONRPC("Settings.getSettingValue").execute( result = JSONRPC("Settings.getSettingValue").execute(

View file

@ -4,11 +4,12 @@ from __future__ import division, absolute_import, print_function, unicode_litera
################################################################################################# #################################################################################################
import xbmcgui import xbmcgui
import xbmc
from . import LazyLogger from . import LazyLogger
from .utils import should_stop from .utils import window
from .exceptions import LibraryException from .exceptions import LibraryExitException
from .translate import translate from .translate import translate
################################################################################################# #################################################################################################
@ -55,14 +56,15 @@ def stop(func):
def wrapper(*args, **kwargs): def wrapper(*args, **kwargs):
try: if xbmc.Monitor().waitForAbort(0.00001):
if should_stop(): # ??? TODO: Fixme raise LibraryExitException("Kodi aborted, exiting...")
raise Exception
except Exception as error: if window("jellyfin_should_stop.bool"):
LOG.exception(error) LOG.info("exiiiiitttinggg")
raise LibraryExitException("Should stop flag raised, exiting...")
raise LibraryException("StopCalled") if not window("jellyfin_online.bool"):
raise LibraryExitException("Jellyfin not online, exiting...")
return func(*args, **kwargs) return func(*args, **kwargs)

View file

@ -19,7 +19,11 @@ from .views import Views
from .downloader import GetItemWorker from .downloader import GetItemWorker
from .helper import translate, api, stop, settings, window, dialog, event, LazyLogger from .helper import translate, api, stop, settings, window, dialog, event, LazyLogger
from .helper.utils import split_list, set_screensaver, get_screensaver from .helper.utils import split_list, set_screensaver, get_screensaver
from .helper.exceptions import LibraryException from .helper.exceptions import (
LibraryException,
LibraryExitException,
LibrarySyncLaterException,
)
from .jellyfin import Jellyfin from .jellyfin import Jellyfin
################################################################################################## ##################################################################################################
@ -93,7 +97,8 @@ class Library(threading.Thread):
try: try:
self.service() self.service()
except LibraryException: except LibraryException as error:
LOG.warning(error)
break break
except Exception as error: except Exception as error:
LOG.exception(error) LOG.exception(error)
@ -438,11 +443,9 @@ class Library(threading.Thread):
return True return True
return True return True
except LibraryException as error:
except LibrarySyncLaterException as error:
LOG.error(error.status) LOG.error(error.status)
if error.status in "SyncLibraryLater":
dialog("ok", "{jellyfin}", translate(33129)) dialog("ok", "{jellyfin}", translate(33129))
settings("SyncInstallRunDone.bool", True) settings("SyncInstallRunDone.bool", True)
sync = get_sync() sync = get_sync()
@ -451,6 +454,9 @@ class Library(threading.Thread):
return True return True
except LibraryException as error:
LOG.error(error.status)
except Exception as error: except Exception as error:
LOG.exception(error) LOG.exception(error)
@ -758,8 +764,12 @@ class UpdateWorker(threading.Thread):
(item["Type"], api.API(item).get_naming()) (item["Type"], api.API(item).get_naming())
) )
except LibraryException as error: except LibraryException as error:
if error.status == "StopCalled": # TODO: Fixme; We're catching all LibraryException here,
# but silently ignoring any that isn't the exit condition.
# Investigate what would be appropriate behavior here.
if isinstance(error, LibraryExitException):
break break
LOG.warning("Ignoring exception %s", error)
except Exception as error: except Exception as error:
LOG.exception(error) LOG.exception(error)
@ -823,8 +833,12 @@ class UserDataWorker(threading.Thread):
elif item["Type"] == "Audio": elif item["Type"] == "Audio":
music.userdata(item) music.userdata(item)
except LibraryException as error: except LibraryException as error:
if error.status == "StopCalled": # TODO: Fixme; We're catching all LibraryException here,
# but silently ignoring any that isn't the exit condition.
# Investigate what would be appropriate behavior here.
if isinstance(error, LibraryExitException):
break break
LOG.warning("Ignoring exception %s", error)
except Exception as error: except Exception as error:
LOG.exception(error) LOG.exception(error)
@ -943,8 +957,12 @@ class RemovedWorker(threading.Thread):
try: try:
obj(item["Id"]) obj(item["Id"])
except LibraryException as error: except LibraryException as error:
if error.status == "StopCalled": # TODO: Fixme; We're catching all LibraryException here,
# but silently ignoring any that isn't the exit condition.
# Investigate what would be appropriate behavior here.
if isinstance(error, LibraryExitException):
break break
LOG.warning("Ignoring exception %s", error)
except Exception as error: except Exception as error:
LOG.exception(error) LOG.exception(error)
finally: finally: