foxygit / infodisplay Log in
commits tags

/kiosk/addon_loader.py · 2.51 KB

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