Tool black: auto-format Python code

This commit is contained in:
Odd Stråbø 2024-06-10 09:19:47 +00:00
commit 7763762212
54 changed files with 6545 additions and 4723 deletions

View file

@ -18,7 +18,15 @@ from .. import client
from .. import library
from .. import monitor
from ..views import Views
from ..helper import translate, window, settings, event, dialog, set_addon_mode, LazyLogger
from ..helper import (
translate,
window,
settings,
event,
dialog,
set_addon_mode,
LazyLogger,
)
from ..helper.utils import JsonDebugPrinter, translate_path
from ..helper.xmls import verify_kodi_defaults
from ..jellyfin import Jellyfin
@ -37,83 +45,98 @@ class Service(xbmc.Monitor):
monitor = None
play_event = None
warn = True
settings = {'last_progress': datetime.today(), 'last_progress_report': datetime.today()}
settings = {
"last_progress": datetime.today(),
"last_progress_report": datetime.today(),
}
def __init__(self):
window('jellyfin_should_stop', clear=True)
window("jellyfin_should_stop", clear=True)
self.settings['addon_version'] = client.get_version()
self.settings['profile'] = translate_path('special://profile')
self.settings['mode'] = settings('useDirectPaths')
self.settings['log_level'] = settings('logLevel') or "1"
self.settings['auth_check'] = True
self.settings['enable_context'] = settings('enableContext.bool')
self.settings['enable_context_transcode'] = settings('enableContextTranscode.bool')
self.settings['kodi_companion'] = settings('kodiCompanion.bool')
window('jellyfin_kodiProfile', value=self.settings['profile'])
settings('platformDetected', client.get_platform())
self.settings["addon_version"] = client.get_version()
self.settings["profile"] = translate_path("special://profile")
self.settings["mode"] = settings("useDirectPaths")
self.settings["log_level"] = settings("logLevel") or "1"
self.settings["auth_check"] = True
self.settings["enable_context"] = settings("enableContext.bool")
self.settings["enable_context_transcode"] = settings(
"enableContextTranscode.bool"
)
self.settings["kodi_companion"] = settings("kodiCompanion.bool")
window("jellyfin_kodiProfile", value=self.settings["profile"])
settings("platformDetected", client.get_platform())
if self.settings['enable_context']:
window('jellyfin_context.bool', True)
if self.settings['enable_context_transcode']:
window('jellyfin_context_transcode.bool', True)
if self.settings["enable_context"]:
window("jellyfin_context.bool", True)
if self.settings["enable_context_transcode"]:
window("jellyfin_context_transcode.bool", True)
LOG.info("--->>>[ %s ]", client.get_addon_name())
LOG.info("Version: %s", client.get_version())
LOG.info("KODI Version: %s", xbmc.getInfoLabel('System.BuildVersion'))
LOG.info("Platform: %s", settings('platformDetected'))
LOG.info("KODI Version: %s", xbmc.getInfoLabel("System.BuildVersion"))
LOG.info("Platform: %s", settings("platformDetected"))
LOG.info("Python Version: %s", sys.version)
LOG.info("Using dynamic paths: %s", settings('useDirectPaths') == "0")
LOG.info("Log Level: %s", self.settings['log_level'])
LOG.info("Using dynamic paths: %s", settings("useDirectPaths") == "0")
LOG.info("Log Level: %s", self.settings["log_level"])
verify_kodi_defaults()
window('jellyfin.connected.bool', True)
settings('groupedSets.bool', objects.utils.get_grouped_set())
window("jellyfin.connected.bool", True)
settings("groupedSets.bool", objects.utils.get_grouped_set())
xbmc.Monitor.__init__(self)
def service(self):
"""Keeps the service monitor going.
Exit on Kodi shutdown or profile switch.
''' Keeps the service monitor going.
Exit on Kodi shutdown or profile switch.
if profile switch happens more than once,
Threads depending on abortRequest will not trigger.
'''
if profile switch happens more than once,
Threads depending on abortRequest will not trigger.
"""
self.monitor = monitor.Monitor()
player = self.monitor.player
self.connect = connect.Connect()
self.start_default()
self.settings['mode'] = settings('useDirectPaths')
self.settings["mode"] = settings("useDirectPaths")
while self.running:
if window('jellyfin_online.bool'):
if window("jellyfin_online.bool"):
if self.settings['profile'] != window('jellyfin_kodiProfile'):
LOG.info("[ profile switch ] %s", self.settings['profile'])
if self.settings["profile"] != window("jellyfin_kodiProfile"):
LOG.info("[ profile switch ] %s", self.settings["profile"])
break
if player.isPlaying() and player.is_playing_file(player.get_playing_file()):
difference = datetime.today() - self.settings['last_progress']
if player.isPlaying() and player.is_playing_file(
player.get_playing_file()
):
difference = datetime.today() - self.settings["last_progress"]
if difference.seconds > 10:
self.settings['last_progress'] = datetime.today()
self.settings["last_progress"] = datetime.today()
update = (datetime.today() - self.settings['last_progress_report']).seconds > 250
event('ReportProgressRequested', {'Report': update})
update = (
datetime.today() - self.settings["last_progress_report"]
).seconds > 250
event("ReportProgressRequested", {"Report": update})
if update:
self.settings['last_progress_report'] = datetime.today()
self.settings["last_progress_report"] = datetime.today()
if window('jellyfin.restart.bool'):
if window("jellyfin.restart.bool"):
window('jellyfin.restart', clear=True)
dialog("notification", heading="{jellyfin}", message=translate(33193), icon="{jellyfin}", time=1000, sound=False)
window("jellyfin.restart", clear=True)
dialog(
"notification",
heading="{jellyfin}",
message=translate(33193),
icon="{jellyfin}",
time=1000,
sound=False,
)
raise Exception('RestartService')
raise Exception("RestartService")
if self.waitForAbort(1):
break
@ -126,14 +149,14 @@ class Service(xbmc.Monitor):
try:
self.connect.register()
if not settings('SyncInstallRunDone.bool'):
if not settings("SyncInstallRunDone.bool"):
set_addon_mode()
except Exception as error:
LOG.exception(error)
def stop_default(self):
window('jellyfin_online', clear=True)
window("jellyfin_online", clear=True)
Jellyfin().close()
if self.library_thread is not None:
@ -142,59 +165,93 @@ class Service(xbmc.Monitor):
self.library_thread = None
def onNotification(self, sender, method, data):
''' All notifications are sent via NotifyAll built-in or Kodi.
Central hub.
'''
if sender.lower() not in ('plugin.video.jellyfin', 'xbmc'):
"""All notifications are sent via NotifyAll built-in or Kodi.
Central hub.
"""
if sender.lower() not in ("plugin.video.jellyfin", "xbmc"):
return
if sender == 'plugin.video.jellyfin':
method = method.split('.')[1]
if sender == "plugin.video.jellyfin":
method = method.split(".")[1]
if method not in ('ServerUnreachable', 'ServerShuttingDown', 'UserDataChanged', 'ServerConnect',
'LibraryChanged', 'ServerOnline', 'SyncLibrary', 'RepairLibrary', 'RemoveLibrary',
'SyncLibrarySelection', 'RepairLibrarySelection', 'AddServer',
'Unauthorized', 'UserConfigurationUpdated', 'ServerRestarting',
'RemoveServer', 'UpdatePassword', 'AddLibrarySelection', 'RemoveLibrarySelection'):
if method not in (
"ServerUnreachable",
"ServerShuttingDown",
"UserDataChanged",
"ServerConnect",
"LibraryChanged",
"ServerOnline",
"SyncLibrary",
"RepairLibrary",
"RemoveLibrary",
"SyncLibrarySelection",
"RepairLibrarySelection",
"AddServer",
"Unauthorized",
"UserConfigurationUpdated",
"ServerRestarting",
"RemoveServer",
"UpdatePassword",
"AddLibrarySelection",
"RemoveLibrarySelection",
):
return
data = json.loads(data)[0]
else:
if method not in ('System.OnQuit', 'System.OnSleep', 'System.OnWake'):
if method not in ("System.OnQuit", "System.OnSleep", "System.OnWake"):
return
data = json.loads(data)
LOG.debug("[ %s: %s ] %s", sender, method, JsonDebugPrinter(data))
if method == 'ServerOnline':
if data.get('ServerId') is None:
if method == "ServerOnline":
if data.get("ServerId") is None:
window('jellyfin_online.bool', True)
self.settings['auth_check'] = True
window("jellyfin_online.bool", True)
self.settings["auth_check"] = True
self.warn = True
if settings('connectMsg.bool'):
if settings("connectMsg.bool"):
users = [user for user in (settings('additionalUsers') or "").split(',') if user]
users.insert(0, settings('username'))
dialog("notification", heading="{jellyfin}", message="%s %s" % (translate(33000), ", ".join(users)),
icon="{jellyfin}", time=1500, sound=False)
users = [
user
for user in (settings("additionalUsers") or "").split(",")
if user
]
users.insert(0, settings("username"))
dialog(
"notification",
heading="{jellyfin}",
message="%s %s" % (translate(33000), ", ".join(users)),
icon="{jellyfin}",
time=1500,
sound=False,
)
if self.library_thread is None:
self.library_thread = library.Library(self)
self.library_thread.start()
elif method in ('ServerUnreachable', 'ServerShuttingDown'):
elif method in ("ServerUnreachable", "ServerShuttingDown"):
if self.warn or data.get('ServerId'):
if self.warn or data.get("ServerId"):
self.warn = data.get('ServerId') is not None
dialog("notification", heading="{jellyfin}", message=translate(33146) if data.get('ServerId') is None else translate(33149), icon=xbmcgui.NOTIFICATION_ERROR)
self.warn = data.get("ServerId") is not None
dialog(
"notification",
heading="{jellyfin}",
message=(
translate(33146)
if data.get("ServerId") is None
else translate(33149)
),
icon=xbmcgui.NOTIFICATION_ERROR,
)
if data.get('ServerId') is None:
if data.get("ServerId") is None:
self.stop_default()
if self.waitForAbort(120):
@ -202,12 +259,19 @@ class Service(xbmc.Monitor):
self.start_default()
elif method == 'Unauthorized':
dialog("notification", heading="{jellyfin}", message=translate(33147) if data['ServerId'] is None else translate(33148), icon=xbmcgui.NOTIFICATION_ERROR)
elif method == "Unauthorized":
dialog(
"notification",
heading="{jellyfin}",
message=(
translate(33147) if data["ServerId"] is None else translate(33148)
),
icon=xbmcgui.NOTIFICATION_ERROR,
)
if data.get('ServerId') is None and self.settings['auth_check']:
if data.get("ServerId") is None and self.settings["auth_check"]:
self.settings['auth_check'] = False
self.settings["auth_check"] = False
self.stop_default()
if self.waitForAbort(5):
@ -215,12 +279,17 @@ class Service(xbmc.Monitor):
self.start_default()
elif method == 'ServerRestarting':
if data.get('ServerId'):
elif method == "ServerRestarting":
if data.get("ServerId"):
return
if settings('restartMsg.bool'):
dialog("notification", heading="{jellyfin}", message=translate(33006), icon="{jellyfin}")
if settings("restartMsg.bool"):
dialog(
"notification",
heading="{jellyfin}",
message=translate(33006),
icon="{jellyfin}",
)
self.stop_default()
@ -229,67 +298,72 @@ class Service(xbmc.Monitor):
self.start_default()
elif method == 'ServerConnect':
self.connect.register(data['Id'])
elif method == "ServerConnect":
self.connect.register(data["Id"])
xbmc.executebuiltin("Container.Refresh")
elif method == 'AddServer':
elif method == "AddServer":
self.connect.setup_manual_server()
xbmc.executebuiltin("Container.Refresh")
elif method == 'RemoveServer':
elif method == "RemoveServer":
self.connect.remove_server(data['Id'])
self.connect.remove_server(data["Id"])
xbmc.executebuiltin("Container.Refresh")
elif method == 'UpdatePassword':
elif method == "UpdatePassword":
self.connect.setup_login_manual()
elif method == 'UserDataChanged' and self.library_thread:
if data.get('ServerId') or not window('jellyfin_startup.bool'):
elif method == "UserDataChanged" and self.library_thread:
if data.get("ServerId") or not window("jellyfin_startup.bool"):
return
LOG.info("[ UserDataChanged ] %s", data)
self.library_thread.userdata(data['UserDataList'])
self.library_thread.userdata(data["UserDataList"])
elif method == 'LibraryChanged' and self.library_thread:
if data.get('ServerId') or not window('jellyfin_startup.bool'):
elif method == "LibraryChanged" and self.library_thread:
if data.get("ServerId") or not window("jellyfin_startup.bool"):
return
LOG.info("[ LibraryChanged ] %s", data)
self.library_thread.updated(data['ItemsUpdated'] + data['ItemsAdded'])
self.library_thread.removed(data['ItemsRemoved'])
self.library_thread.updated(data["ItemsUpdated"] + data["ItemsAdded"])
self.library_thread.removed(data["ItemsRemoved"])
elif method == 'System.OnQuit':
window('jellyfin_should_stop.bool', True)
elif method == "System.OnQuit":
window("jellyfin_should_stop.bool", True)
self.running = False
elif method in ('SyncLibrarySelection', 'RepairLibrarySelection', 'AddLibrarySelection', 'RemoveLibrarySelection'):
elif method in (
"SyncLibrarySelection",
"RepairLibrarySelection",
"AddLibrarySelection",
"RemoveLibrarySelection",
):
self.library_thread.select_libraries(method)
elif method == 'SyncLibrary':
if not data.get('Id'):
elif method == "SyncLibrary":
if not data.get("Id"):
return
self.library_thread.add_library(data['Id'], data.get('Update', False))
self.library_thread.add_library(data["Id"], data.get("Update", False))
xbmc.executebuiltin("Container.Refresh")
elif method == 'RepairLibrary':
if not data.get('Id'):
elif method == "RepairLibrary":
if not data.get("Id"):
return
libraries = data['Id'].split(',')
libraries = data["Id"].split(",")
for lib in libraries:
if not self.library_thread.remove_library(lib):
return
self.library_thread.add_library(data['Id'])
self.library_thread.add_library(data["Id"])
xbmc.executebuiltin("Container.Refresh")
elif method == 'RemoveLibrary':
libraries = data['Id'].split(',')
elif method == "RemoveLibrary":
libraries = data["Id"].split(",")
for lib in libraries:
@ -298,10 +372,10 @@ class Service(xbmc.Monitor):
xbmc.executebuiltin("Container.Refresh")
elif method == 'System.OnSleep':
elif method == "System.OnSleep":
LOG.info("-->[ sleep ]")
window('jellyfin_should_stop.bool', True)
window("jellyfin_should_stop.bool", True)
if self.library_thread is not None:
@ -312,7 +386,7 @@ class Service(xbmc.Monitor):
self.monitor.server = []
self.monitor.sleep = True
elif method == 'System.OnWake':
elif method == "System.OnWake":
if not self.monitor.sleep:
LOG.warning("System.OnSleep was never called, skip System.OnWake")
@ -322,14 +396,14 @@ class Service(xbmc.Monitor):
LOG.info("--<[ sleep ]")
xbmc.sleep(10000) # Allow network to wake up
self.monitor.sleep = False
window('jellyfin_should_stop', clear=True)
window("jellyfin_should_stop", clear=True)
try:
self.connect.register()
except Exception as error:
LOG.exception(error)
elif method == 'GUI.OnScreensaverDeactivated':
elif method == "GUI.OnScreensaverDeactivated":
LOG.info("--<[ screensaver ]")
xbmc.sleep(5000)
@ -337,60 +411,80 @@ class Service(xbmc.Monitor):
if self.library_thread is not None:
self.library_thread.fast_sync()
elif method == 'UserConfigurationUpdated' and data.get('ServerId') is None:
elif method == "UserConfigurationUpdated" and data.get("ServerId") is None:
Views().get_views()
def onSettingsChanged(self):
''' React to setting changes that impact window values.
'''
if window('jellyfin_should_stop.bool'):
"""React to setting changes that impact window values."""
if window("jellyfin_should_stop.bool"):
return
if settings('logLevel') != self.settings['log_level']:
if settings("logLevel") != self.settings["log_level"]:
log_level = settings('logLevel')
self.settings['logLevel'] = log_level
log_level = settings("logLevel")
self.settings["logLevel"] = log_level
LOG.info("New log level: %s", log_level)
if settings('enableContext.bool') != self.settings['enable_context']:
if settings("enableContext.bool") != self.settings["enable_context"]:
window('jellyfin_context', settings('enableContext'))
self.settings['enable_context'] = settings('enableContext.bool')
LOG.info("New context setting: %s", self.settings['enable_context'])
window("jellyfin_context", settings("enableContext"))
self.settings["enable_context"] = settings("enableContext.bool")
LOG.info("New context setting: %s", self.settings["enable_context"])
if settings('enableContextTranscode.bool') != self.settings['enable_context_transcode']:
if (
settings("enableContextTranscode.bool")
!= self.settings["enable_context_transcode"]
):
window('jellyfin_context_transcode', settings('enableContextTranscode'))
self.settings['enable_context_transcode'] = settings('enableContextTranscode.bool')
LOG.info("New context transcode setting: %s", self.settings['enable_context_transcode'])
window("jellyfin_context_transcode", settings("enableContextTranscode"))
self.settings["enable_context_transcode"] = settings(
"enableContextTranscode.bool"
)
LOG.info(
"New context transcode setting: %s",
self.settings["enable_context_transcode"],
)
if settings('useDirectPaths') != self.settings['mode'] and self.library_thread.started:
if (
settings("useDirectPaths") != self.settings["mode"]
and self.library_thread.started
):
self.settings['mode'] = settings('useDirectPaths')
LOG.info("New playback mode setting: %s", self.settings['mode'])
self.settings["mode"] = settings("useDirectPaths")
LOG.info("New playback mode setting: %s", self.settings["mode"])
if not self.settings.get('mode_warn'):
if not self.settings.get("mode_warn"):
self.settings['mode_warn'] = True
self.settings["mode_warn"] = True
dialog("yesno", "{jellyfin}", translate(33118))
if settings('kodiCompanion.bool') != self.settings['kodi_companion']:
self.settings['kodi_companion'] = settings('kodiCompanion.bool')
if settings("kodiCompanion.bool") != self.settings["kodi_companion"]:
self.settings["kodi_companion"] = settings("kodiCompanion.bool")
if not self.settings['kodi_companion']:
if not self.settings["kodi_companion"]:
dialog("ok", "{jellyfin}", translate(33138))
def reload_objects(self):
''' Reload objects which depends on the patch module.
This allows to see the changes in code without restarting the python interpreter.
'''
reload_modules = ['objects.movies', 'objects.musicvideos', 'objects.tvshows',
'objects.music', 'objects.obj', 'objects.actions', 'objects.kodi.kodi',
'objects.kodi.movies', 'objects.kodi.musicvideos', 'objects.kodi.tvshows',
'objects.kodi.music', 'objects.kodi.artwork', 'objects.kodi.queries',
'objects.kodi.queries_music', 'objects.kodi.queries_texture']
"""Reload objects which depends on the patch module.
This allows to see the changes in code without restarting the python interpreter.
"""
reload_modules = [
"objects.movies",
"objects.musicvideos",
"objects.tvshows",
"objects.music",
"objects.obj",
"objects.actions",
"objects.kodi.kodi",
"objects.kodi.movies",
"objects.kodi.musicvideos",
"objects.kodi.tvshows",
"objects.kodi.music",
"objects.kodi.artwork",
"objects.kodi.queries",
"objects.kodi.queries_music",
"objects.kodi.queries_texture",
]
for mod in reload_modules:
del sys.modules[mod]
@ -407,14 +501,22 @@ class Service(xbmc.Monitor):
def shutdown(self):
LOG.info("---<[ EXITING ]")
window('jellyfin_should_stop.bool', True)
window("jellyfin_should_stop.bool", True)
properties = [ # TODO: review
"jellyfin_state", "jellyfin_serverStatus", "jellyfin_currUser",
"jellyfin_play", "jellyfin_online", "jellyfin.connected", "jellyfin_startup",
"jellyfin.external", "jellyfin.external_check", "jellyfin_deviceId", "jellyfin_db_check", "jellyfin_pathverified",
"jellyfin_sync"
"jellyfin_state",
"jellyfin_serverStatus",
"jellyfin_currUser",
"jellyfin_play",
"jellyfin_online",
"jellyfin.connected",
"jellyfin_startup",
"jellyfin.external",
"jellyfin.external_check",
"jellyfin_deviceId",
"jellyfin_db_check",
"jellyfin_pathverified",
"jellyfin_sync",
]
for prop in properties:
window(prop, clear=True)