{t("vmLxc.appEditor.localLogoHelp")}
{/* Web links — each port becomes a clickable link (built as diff --git a/AppImage/messages/en/common.json b/AppImage/messages/en/common.json index 050cd5ab..140bcca0 100644 --- a/AppImage/messages/en/common.json +++ b/AppImage/messages/en/common.json @@ -1790,6 +1790,11 @@ "catalogPort": "port {port}", "trackingAvailable": "tracking available", "logoUrlLabel": "Logo URL", + "discoverLocalLogo": "Find icon from local application", + "localLogoPort": "Application port for icon lookup", + "localLogoHelp": "Reads only the selected port in this running container. External icons are not fetched. The icon is applied when you save.", + "localLogoStopped": "The container is stopped. Start it before looking for its icon.", + "localLogoUnavailable": "No usable local icon was found. Check the selected web port and try again. Your current icon is unchanged.", "webLinks": "Web links", "addPort": "Add port", "detectedPorts": "Ports detected in the container — click to add:", diff --git a/AppImage/messages/sk/common.json b/AppImage/messages/sk/common.json index e2156568..5b9a15e5 100644 --- a/AppImage/messages/sk/common.json +++ b/AppImage/messages/sk/common.json @@ -1729,6 +1729,11 @@ "catalogPort": "port {port}", "trackingAvailable": "možno sledovať verziu", "logoUrlLabel": "URL loga", + "discoverLocalLogo": "Zistiť ikonu z lokálnej aplikácie", + "localLogoPort": "Port aplikácie na hľadanie ikony", + "localLogoHelp": "Číta iba vybraný port v tomto spustenom kontajneri. Externé ikony nesťahuje. Ikona sa použije až po uložení.", + "localLogoStopped": "Kontajner je vypnutý. Pred hľadaním ikony ho spusti.", + "localLogoUnavailable": "Použiteľná lokálna ikona sa nenašla. Skontroluj vybraný webový port a skús to znova. Pôvodná ikona zostala nezmenená.", "webLinks": "Webové odkazy", "addPort": "Pridať port", "detectedPorts": "Porty nájdené v kontajneri — kliknutím ich pridáte:", diff --git a/AppImage/scripts/build_appimage.sh b/AppImage/scripts/build_appimage.sh index 4bee9953..af79e072 100755 --- a/AppImage/scripts/build_appimage.sh +++ b/AppImage/scripts/build_appimage.sh @@ -150,6 +150,7 @@ cp "$SCRIPT_DIR/lxc_update_observation.py" "$APP_DIR/usr/bin/" cp "$SCRIPT_DIR/lxc_update_finalization.py" "$APP_DIR/usr/bin/" cp "$SCRIPT_DIR/lxc_check_job.py" "$APP_DIR/usr/bin/" cp "$SCRIPT_DIR/native_app_discovery.py" "$APP_DIR/usr/bin/" +cp "$SCRIPT_DIR/local_app_icons.py" "$APP_DIR/usr/bin/" cp "$SCRIPT_DIR/lxc_apps.py" "$APP_DIR/usr/bin/" 2>/dev/null || echo "⚠️ lxc_apps.py not found" cp "$SCRIPT_DIR/custom_links.py" "$APP_DIR/usr/bin/" 2>/dev/null || echo "⚠️ custom_links.py not found" cp "$SCRIPT_DIR/recreate_docker_container.py" "$APP_DIR/usr/bin/" 2>/dev/null || echo "⚠️ recreate_docker_container.py not found" @@ -358,7 +359,8 @@ pip3 install --target "$APP_DIR/usr/lib/python3/dist-packages" --upgrade --no-de PyJWT \ pyotp \ segno \ - beautifulsoup4 + beautifulsoup4 \ + defusedxml==0.7.1 # WebSocket with modern h11 (no need for the legacy pin anymore) pip3 install --target "$APP_DIR/usr/lib/python3/dist-packages" --upgrade \ @@ -386,6 +388,7 @@ install_gevent_runtime() { --upgrade \ --only-binary=:all: \ --platform manylinux_2_28_x86_64 \ + --platform manylinux_2_27_x86_64 \ --platform manylinux2014_x86_64 \ --implementation cp \ --python-version "$python_version" \ @@ -395,7 +398,8 @@ install_gevent_runtime() { "greenlet==${GREENLET_VERSION}" \ "zope.interface==${ZOPE_INTERFACE_VERSION}" \ "zope.event==${ZOPE_EVENT_VERSION}" \ - "gevent-websocket==${GEVENT_WEBSOCKET_VERSION}" + "gevent-websocket==${GEVENT_WEBSOCKET_VERSION}" \ + "Pillow==13.0.0" } install_gevent_runtime "3.11" "cp311" @@ -408,7 +412,8 @@ for abi in cp311 cp313; do for extension in \ "gevent/_gevent_c_hub_local.cpython-${abi_digits}-*.so" \ "greenlet/_greenlet.cpython-${abi_digits}-*.so" \ - "zope/interface/_zope_interface_coptimizations.cpython-${abi_digits}-*.so"; do + "zope/interface/_zope_interface_coptimizations.cpython-${abi_digits}-*.so" \ + "PIL/_imaging.cpython-${abi_digits}-*.so"; do if ! compgen -G "$abi_dir/$extension" >/dev/null; then echo "❌ Missing ${abi} extension: ${extension}" >&2 exit 1 diff --git a/AppImage/scripts/flask_server.py b/AppImage/scripts/flask_server.py index 70cc4174..edd06170 100644 --- a/AppImage/scripts/flask_server.py +++ b/AppImage/scripts/flask_server.py @@ -14130,6 +14130,35 @@ def api_vm_apps_native_discovery(vmid): result, suggestions, sidecar.get('apps') or [])) +@app.route('/api/vms/{t("vmLxc.appEditor.localLogoHelp")}