# app/__init__.py (App-Factory) import logging import threading import time import os from flask import Flask from .utils.logging import setup_logging, cleanup_old_log_dirs from .bluetooth.manager import init_bluetooth logger = logging.getLogger(__name__) # ← Logger für diese Datei def create_app(): app = Flask(__name__, template_folder='../templates', # ← Root/templates statt app/templates static_folder='../static') # ← Root/static # Config laden app.config.from_object('config.Config') # Logging zuerst (vor allem anderen) setup_logging(app) # Bluetooth initialisieren (Monitor-Thread startet automatisch) init_bluetooth() # pygame initialisieren (einmalig). Ein Audiofehler darf die Hub-Steuerung # nicht am Start hindern; die API versucht die Initialisierung später erneut. from config import Config if Config.AUDIO_DEVICE: os.environ['AUDIODEV'] = Config.AUDIO_DEVICE import pygame try: init_args = { 'frequency': Config.AUDIO_FREQ, 'size': Config.AUDIO_SIZE, 'channels': Config.AUDIO_CHANNELS, 'buffer': Config.AUDIO_BUFFER, } if Config.AUDIO_DEVICE: init_args['devicename'] = Config.AUDIO_DEVICE pygame.mixer.init(**init_args) pygame.mixer.set_num_channels(Config.AUDIO_NUM_CHANNELS) pygame.mixer.music.set_volume(0.8) app.logger.info(f"pygame initialisiert (Gerät: {Config.AUDIO_DEVICE or 'SDL-Standard'})") except pygame.error as e: app.logger.error(f"Audio konnte nicht initialisiert werden: {e}") if Config.AUDIO_REQUIRED: raise # Blueprints registrieren from .routes.main import main_bp from .routes.admin import admin_bp from .routes.api import api_bp # Blueprints registrieren app.register_blueprint(main_bp) app.register_blueprint(admin_bp, url_prefix='/admin') app.register_blueprint(api_bp, url_prefix='/api') # Täglicher Cleanup-Thread starten (einmalig) def daily_cleanup(): while True: cleanup_old_log_dirs(90) time.sleep(86400) # 24 Stunden cleanup_thread = threading.Thread(target=daily_cleanup, daemon=True) cleanup_thread.start() logger.info("Täglicher Log-Cleanup-Thread gestartet (24h Intervall)") return app