diff --git a/src/blueprints/plugin.py b/src/blueprints/plugin.py index b7a80d860..ead6132e0 100644 --- a/src/blueprints/plugin.py +++ b/src/blueprints/plugin.py @@ -2,9 +2,11 @@ from plugins.plugin_registry import get_plugin_instance from utils.app_utils import resolve_path, handle_request_files, parse_form from refresh_task import ManualRefresh, PlaylistRefresh +import base64 import json -import os import logging +import os +from io import BytesIO logger = logging.getLogger(__name__) plugin_bp = Blueprint("plugin", __name__) @@ -256,3 +258,38 @@ def update_now(): return jsonify({"error": f"An error occurred: {str(e)}"}), 500 return jsonify({"success": True, "message": "Display updated"}), 200 + + +@plugin_bp.route('/preview', methods=['POST']) +def preview(): + """Generate a preview image without updating the display""" + device_config = current_app.config['DEVICE_CONFIG'] + + try: + plugin_settings = parse_form(request.form) + plugin_settings.update(handle_request_files(request.files)) + plugin_id = plugin_settings.pop("plugin_id", None) + if not plugin_id: + return jsonify({"error": "plugin_id is required"}), 400 + + plugin_config = device_config.get_plugin(plugin_id) + if not plugin_config: + return jsonify({"error": f"Plugin '{plugin_id}' not found"}), 404 + + plugin = get_plugin_instance(plugin_config) + image = plugin.generate_image(plugin_settings, device_config) + if image is None: + return jsonify({"error": "An error occurred: NoneType — Chromium may not be installed"}), 500 + + buffer = BytesIO() + image.save(buffer, format='PNG') + image_b64 = base64.b64encode(buffer.getvalue()).decode() + + return jsonify({ + "success": True, + "image": f"data:image/png;base64,{image_b64}" + }), 200 + + except Exception as e: + logger.exception(f"Error in preview: {str(e)}") + return jsonify({"error": f"An error occurred: {str(e)}"}), 500 diff --git a/src/plugins/clock/settings.html b/src/plugins/clock/settings.html index f9600252a..48bf4f39a 100644 --- a/src/plugins/clock/settings.html +++ b/src/plugins/clock/settings.html @@ -1,3 +1,5 @@ +
+