""" 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]