"""
Addon-loader för kiosk.
Skannar kiosk/addons/ efter underpaket med ett ADDON-manifest (dict i __init__.py).
Registrerar aktiverade addons som Flask-Blueprints och SocketIO-handlers vid uppstart.
"""
import pkgutil
import importlib
import db
_loaded_addons = [] # lista av ADDON-dicts i laddningsordning
def discover_and_load(app, socketio):
"""
Skanna addons/-paketet och ladda aktiverade addons.
Anropas efter att app och socketio skapats, innan socketio.run().
"""
import addons # kiosk/addons/__init__.py
for finder, name, is_pkg in pkgutil.iter_modules(addons.__path__):
if not is_pkg:
continue
try:
mod = importlib.import_module(f'addons.{name}')
except Exception as e:
print(f'[addon_loader] Kunde inte importera addon "{name}": {e}')
continue
manifest = getattr(mod, 'ADDON', None)
if not manifest:
continue
# Kolla aktiverat i DB; faller tillbaka på default_enabled
state_key = f'addon_{name}_enabled'
db_val = db.get_state().get(state_key)
if db_val is None:
enabled = manifest.get('default_enabled', True)
else:
enabled = db_val == '1'
if not enabled:
print(f'[addon_loader] Addon "{name}" är inaktiverat, hoppar över.')
continue
# Registrera Flask Blueprint
if hasattr(mod, 'create_blueprint'):
try:
bp = mod.create_blueprint()
app.register_blueprint(bp)
except Exception as e:
print(f'[addon_loader] Blueprint-fel för addon "{name}": {e}')
continue
# Registrera SocketIO-handlers
if manifest.get('has_socketio') and hasattr(mod, 'register_socketio'):
try:
mod.register_socketio(socketio)
except Exception as e:
print(f'[addon_loader] SocketIO-fel för addon "{name}": {e}')
_loaded_addons.append(manifest)
print(f'[addon_loader] Laddade addon: {name} ({manifest.get("label", name)})')
_loaded_addons.sort(key=lambda m: m.get('order', 99))
def get_loaded_addons():
"""Returnerar en kopia av listan med laddade addon-manifest."""
return list(_loaded_addons)
def get_all_addon_names():
"""
Returnerar alla addon-namn som finns i addons/-mappen
(både aktiverade och inaktiverade).
"""
import addons
return [name for _, name, is_pkg in pkgutil.iter_modules(addons.__path__) if is_pkg]