forked from viewit/KX-Bridge-Release
fix: Review-Fixes für PR #32 (Content-Disposition + DE-Übersetzungen)
Nach Squash-Merge von #32 die Reviews-Anpassungen nachgereicht, die im Dev-Repo (viewit/KX-Bridge@7c834bc) bereits enthalten waren: - Content-Disposition mit RFC5987 filename*=UTF-8 + ASCII-Fallback - DE-Strings im Verify-Dialog übersetzt (msg/confirm/abort)
This commit is contained in:
@@ -2,8 +2,10 @@
|
||||
# Kopiere diese Datei nach config.ini und trage deine Werte ein:
|
||||
# cp config.ini.example config.ini
|
||||
#
|
||||
# Credentials mit extract_credentials.exe (Windows) oder
|
||||
# extract_credentials (Linux) aus dem laufenden AnycubicSlicerNext auslesen.
|
||||
# Credentials automatisch eintragen:
|
||||
# python3 tools/fetch_credentials.py --ip 192.168.x.x --write-config
|
||||
# Alternativ (Windows, ohne Drucker-IP bekannt):
|
||||
# extract_credentials.exe --write-env (liest aus laufendem AnycubicSlicerNext)
|
||||
|
||||
[connection]
|
||||
# IP-Adresse des Druckers im lokalen Netzwerk
|
||||
@@ -29,9 +31,65 @@ default_ams_slot = auto
|
||||
# Auto-Leveling vor jedem Druck (1 = an, 0 = aus)
|
||||
auto_leveling = 1
|
||||
|
||||
# Kamera-Stream bei Druckstart automatisch einschalten (1 = an, 0 = aus)
|
||||
camera_on_print = 0
|
||||
|
||||
# Warnung vor Druck von Web-Uploads (1 = an, 0 = aus)
|
||||
web_upload_warning = 1
|
||||
|
||||
[bridge]
|
||||
# Poll-Intervall in Sekunden
|
||||
poll_interval = 3
|
||||
|
||||
# ─── Multi-Printer (optional) ──────────────────────────────────────────────────
|
||||
# Mehrere Drucker können als [printer_1], [printer_2], … definiert werden.
|
||||
# Jede Bridge-Instanz verbindet sich mit einem Drucker (je eigener Port).
|
||||
# bridge_url zeigt auf die jeweilige Bridge-Instanz (für den /kx/printers-Endpunkt).
|
||||
# Die [connection]-Sektion wird weiterhin als Fallback für diese Instanz verwendet.
|
||||
#
|
||||
# Beispiel:
|
||||
# [printer_1]
|
||||
# name = Kobra X Links
|
||||
# bridge_url = http://192.168.178.95:7125
|
||||
# printer_ip = 192.168.178.95
|
||||
# mqtt_port = 9883
|
||||
# username = userXXXXXXXXXX
|
||||
# password = XXXXXXXXXXXXXXX
|
||||
# device_id = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
# mode_id = 20030
|
||||
#
|
||||
# [printer_2]
|
||||
# name = Kobra X Rechts
|
||||
# bridge_url = http://192.168.178.96:7125
|
||||
# printer_ip = 192.168.178.96
|
||||
# mqtt_port = 9883
|
||||
# username = userYYYYYYYYYY
|
||||
# password = YYYYYYYYYYYYYYY
|
||||
# device_id = yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
|
||||
# mode_id = 20030
|
||||
|
||||
[ace_dry_presets]
|
||||
# Vordefinierte Dry-Set Presets (Temp in °C, Dauer in Sekunden)
|
||||
pla_temp = 45
|
||||
pla_duration_sec = 14400
|
||||
pla_plus_temp = 45
|
||||
pla_plus_duration_sec = 14400
|
||||
petg_temp = 50
|
||||
petg_duration_sec = 14400
|
||||
tpu_temp = 55
|
||||
tpu_duration_sec = 14400
|
||||
abs_asa_temp = 45
|
||||
abs_asa_duration_sec = 28800
|
||||
pa_pc_temp = 55
|
||||
pa_pc_duration_sec = 43200
|
||||
|
||||
# Custom Presets (Name + Temp + Dauer)
|
||||
custom_1_name = Custom 1
|
||||
custom_1_temp = 45
|
||||
custom_1_duration_sec = 14400
|
||||
custom_2_name = Custom 2
|
||||
custom_2_temp = 45
|
||||
custom_2_duration_sec = 14400
|
||||
custom_3_name = Custom 3
|
||||
custom_3_temp = 45
|
||||
custom_3_duration_sec = 14400
|
||||
|
||||
@@ -45,6 +45,7 @@ import tempfile
|
||||
import time
|
||||
import threading
|
||||
import html
|
||||
from urllib.parse import quote
|
||||
|
||||
# Bei PyInstaller-Binary liegt alles neben sys.executable, sonst neben __file__
|
||||
_BASE = os.path.dirname(sys.executable) if getattr(sys, "frozen", False) else os.path.dirname(os.path.abspath(__file__))
|
||||
@@ -1523,9 +1524,13 @@ class KobraXBridge:
|
||||
if not path or not os.path.isfile(path):
|
||||
return self._json_cors({"error": "not found"}, status=404)
|
||||
filename = os.path.basename(f.get("filename") or path)
|
||||
return web.FileResponse(path, headers={
|
||||
"Content-Disposition": f'attachment; filename="{filename}"'
|
||||
})
|
||||
# RFC 5987: filename* mit URL-encoding für Sonderzeichen/UTF-8,
|
||||
# plus ASCII-fallback (alle " und \ aus filename strippen für den
|
||||
# quoted-string-Part).
|
||||
ascii_fallback = filename.encode("ascii", "replace").decode("ascii").replace('"', "").replace("\\", "")
|
||||
encoded = quote(filename, safe="")
|
||||
disposition = f'attachment; filename="{ascii_fallback}"; filename*=UTF-8\'\'{encoded}'
|
||||
return web.FileResponse(path, headers={"Content-Disposition": disposition})
|
||||
|
||||
async def handle_kx_file_verify(self, request):
|
||||
file_id = request.match_info["file_id"]
|
||||
|
||||
@@ -150,9 +150,9 @@ var LANG_DE={
|
||||
store_delete_confirm:'Datei löschen?',
|
||||
store_print_confirm:'Datei drucken?',
|
||||
store_web_verify_title:'Datei verifizieren',
|
||||
store_web_verify_msg:'Please verify this file was made for Anycubic Kobra X.',
|
||||
store_web_verify_confirm:'Confirm',
|
||||
store_web_verify_abort:'Abort',
|
||||
store_web_verify_msg:'Bitte bestätige, dass diese Datei für den Anycubic Kobra X erstellt wurde.',
|
||||
store_web_verify_confirm:'Bestätigen',
|
||||
store_web_verify_abort:'Abbrechen',
|
||||
store_no_results:'Keine Dateien gefunden.',
|
||||
store_never:'noch nicht gedruckt',
|
||||
sf_all:'Alle',sf_ok:'✓ Erfolgreich',sf_err:'✗ Fehler',sf_new:'Neu',
|
||||
|
||||
@@ -465,18 +465,18 @@
|
||||
</nav>
|
||||
|
||||
|
||||
<!-- Filament-Slot-Dialog -->
|
||||
<!-- Web-Upload-Verify-Dialog -->
|
||||
<div class="modal-overlay" id="store-web-verify-dialog" onclick="if(event.target===this)closeStoreWebVerifyDialog()">
|
||||
<div class="modal-box" style="max-width:420px;width:100%">
|
||||
<div class="modal-header" style="margin-bottom:14px">
|
||||
<span class="modal-title" id="store-web-verify-title">Datei verifizieren</span>
|
||||
<button onclick="closeStoreWebVerifyDialog()" style="background:none;border:none;font-size:18px;cursor:pointer;color:var(--txt2)">✕</button>
|
||||
</div>
|
||||
<p id="store-web-verify-msg" style="font-size:13px;color:var(--txt);margin-bottom:12px">Please verify this file was made for Anycubic Kobra X.</p>
|
||||
<p id="store-web-verify-msg" style="font-size:13px;color:var(--txt);margin-bottom:12px">Bitte bestätige, dass diese Datei für den Anycubic Kobra X erstellt wurde.</p>
|
||||
<div id="store-web-verify-status" style="font-size:12px;color:var(--txt2);min-height:16px;margin-bottom:8px"></div>
|
||||
<div style="display:flex;gap:8px;justify-content:flex-end">
|
||||
<button id="store-web-verify-abort" onclick="closeStoreWebVerifyDialog()" style="padding:8px 16px;background:var(--raised);border:1px solid var(--border);border-radius:8px;color:var(--txt);cursor:pointer">Abort</button>
|
||||
<button id="store-web-verify-confirm" onclick="confirmStoreWebVerify()" style="padding:8px 18px;background:var(--accent);color:#fff;border:none;border-radius:8px;cursor:pointer;font-weight:600">Confirm</button>
|
||||
<button id="store-web-verify-abort" onclick="closeStoreWebVerifyDialog()" style="padding:8px 16px;background:var(--raised);border:1px solid var(--border);border-radius:8px;color:var(--txt);cursor:pointer">Abbrechen</button>
|
||||
<button id="store-web-verify-confirm" onclick="confirmStoreWebVerify()" style="padding:8px 18px;background:var(--accent);color:#fff;border:none;border-radius:8px;cursor:pointer;font-weight:600">Bestätigen</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user