Sfoglia il codice sorgente

Look for a print's file when the printer says it is on the card
(#2780 regression)

A print of a file already on the printer -- a reprint from the
touchscreen, from Handy, or a slicer send-to-storage followed by a print
-- reports its location as a path rather than as a fresh upload:
file:///media/usb0/<name>. Since #2780 landed on 2026-08-14 Bambuddy read
anything that was not ftp:// as "the printer kept this internally",
skipped the FTPS sweep, and archived the print with a name and timing
only. Measured on an H2D: the file was listable and downloadable over
FTPS at the moment Bambuddy declared it unreachable. Before that change
those prints archived normally, so this is a regression, and it is not
confined to the H2 series the change was about -- an X1C reprint from its
own screen loses its thumbnail exactly the same way.

That module's own rule is to skip only on positive evidence, and a
file:// path is not evidence of internal storage. It now reads the path:
the printer's model cache under /userdata is a genuine skip, anything
else is unknown and sweeps, which is what it did before. Unknown rather
than external on purpose -- the empty-slot check still runs ahead of it,
so a file:// print on a printer with nothing in the slot reports the
missing card instead of sweeping for something that cannot be there.

The user-facing copy shipped this morning is corrected in the same
change, because it was written before we understood how Bambu Studio
actually chooses. Its Print button always uses internal memory; only Send
offers Cache or External, and that defaults to Cache too. So the advice
now leads with the two routes that take one step -- start the print from
Bambuddy, or slice in OrcaSlicer -- and offers Send-with-External and a
separate print start as the way to stay in Bambu Studio. The earlier
wording named no remedy at all and blamed the printer's firmware for a
choice the slicer makes. Banner and diagnostic, thirteen locales, README,
bundle rebuilt.

maziggy 2 settimane fa
parent
commit
ad644bca48

+ 0 - 817
README.md

@@ -1,817 +0,0 @@
-<p align="center">
-  <img src="static/img/bambuddy_logo_dark.png" alt="Bambuddy Logo" width="300">
-</p>
-
-<h1 align="center">Bambuddy</h1>
-
-<p align="center">
-  <strong>Your printers. No cloud. Your rules.</strong><br>
-  Self-hosted command center for Bambu Lab &mdash; from one A1 to an entire print farm.
-</p>
-
-<p align="center">
-  <a href="https://github.com/maziggy/bambuddy/releases"><img src="https://img.shields.io/github/v/release/maziggy/bambuddy?style=flat-square&color=blue&cacheSeconds=3600" alt="Release"></a>
-  <img src="https://github.com/maziggy/bambuddy/actions/workflows/ci.yml/badge.svg?branch=main">
-  <img src="https://github.com/maziggy/bambuddy/actions/workflows/github-code-scanning/codeql/badge.svg">
-  <img src="https://github.com/maziggy/bambuddy/actions/workflows/security.yml/badge.svg">
-  <a href="https://github.com/maziggy/bambuddy/blob/main/LICENSE"><img src="https://img.shields.io/github/license/maziggy/bambuddy?style=flat-square&cacheSeconds=3600" alt="License"></a>
-  <a href="https://github.com/maziggy/bambuddy/stargazers"><img src="https://img.shields.io/github/stars/maziggy/bambuddy?style=flat-square&cacheSeconds=3600" alt="Stars"></a>
-  <a href="https://github.com/maziggy/bambuddy/issues"><img src="https://img.shields.io/github/issues/maziggy/bambuddy?style=flat-square&cacheSeconds=3600" alt="Issues"></a>
-  <a href="https://discord.gg/aFS3ZfScHM"><img src="https://img.shields.io/discord/1461241694715645994?style=flat-square&logo=discord&logoColor=white&label=Discord&color=5865F2" alt="Discord"></a>
-  <a href="https://github.com/sponsors/maziggy"><img src="https://img.shields.io/badge/GitHub_Sponsors-Sponsor-ea4aaa?style=flat-square&logo=github-sponsors&logoColor=white" alt="GitHub Sponsors"></a>
-  <a href="https://sponsors.bambuddy.cool"><img src="https://img.shields.io/badge/Sponsors_Portal-sponsors.bambuddy.cool-2dd4bf?style=flat-square&logo=heart&logoColor=white" alt="Sponsors Portal"></a>
-  <a href="https://ko-fi.com/maziggy"><img src="https://img.shields.io/badge/Ko--fi-Support-ff5e5b?style=flat-square&logo=ko-fi&logoColor=white" alt="Ko-fi" target=_blank></a>
-</p>
-
-<p align="center">
-  <sub><strong>Backed by</strong></sub><br>
-  <a href="https://northpole3dprinting.com/"><img src="static/img/sponsors/northpole-3d-printing.jpg" alt="North Pole 3D Printing" height="60"></a>
-</p>
-
-<p align="center">
-  <a href="https://demo.bambuddy.cool"><strong>🎮 Try the Live Demo</strong></a> •
-  <a href="#-features">Features</a> •
-  <a href="#-screenshots">Screenshots</a> •
-  <a href="#-quick-start">Quick Start</a> •
-  <a href="http://wiki.bambuddy.cool">Documentation</a> •
-  <a href="https://discord.gg/aFS3ZfScHM">Discord</a> •
-  <a href="#-contributing">Contributing</a>
-</p>
-
-<p align="center">
-  <a href="https://demo.bambuddy.cool">
-    <img src="https://img.shields.io/badge/🎮_Live_Demo-demo.bambuddy.cool-00ae42?style=for-the-badge&labelColor=0a0d14" alt="Live Demo">
-  </a>
-  <br>
-  <em>Spin up your own private Bambuddy in ~10 seconds — no install, no signup, 30-minute session.</em>
-</p>
-
----
-
-> [!IMPORTANT]
-> **H2-series and P2S owners — how you send a print decides what gets archived.**
-> Bambu Studio's **Print** button sends sliced files to the printer's internal memory, which Bambuddy cannot read — so those prints archive with a name and timing but no thumbnail, filament total or cost. The printer's "Store sent files on external storage" option does not change it (measured on an H2C and an H2D with it enabled); [BambuStudio#10481](https://github.com/bambulab/BambuStudio/issues/10481) tracks the default upstream.
-> **Start the print from Bambuddy, or slice in OrcaSlicer** — both put the file on the card in one step. Staying in Bambu Studio means using **Send** with **External** picked and starting the print afterwards, because Print itself offers no choice. All of them need a card or stick in the printer; X1 and P1 series are unaffected.
-> [Why this happens →](https://wiki.bambuddy.cool/reference/troubleshooting/#archive-card-has-only-a-name)
-
----
-
-## 📰 As Featured In
-
-> **"Bambuddy is the companion app that Bambu Lab should have built from day one."**
-> — Adam Conway, [XDA-Developers](https://www.xda-developers.com/finally-have-full-control-bambu-lab-printer-ditched-bambu-cloud/)
-
-<p align="center">
-  <a href="https://hackaday.com/2026/06/13/bambuddy-says-bye-to-bambu-lab-cloud-services/"><img src="https://img.shields.io/badge/Hackaday-Read-F2A724?style=flat-square&labelColor=000000" alt="Hackaday"></a>
-  <a href="https://www.xda-developers.com/finally-have-full-control-bambu-lab-printer-ditched-bambu-cloud/"><img src="https://img.shields.io/badge/XDA--Developers-Read-C8102E?style=flat-square" alt="XDA-Developers"></a>
-  <a href="https://www.howtogeek.com/free-your-bambu-lab-3d-printer-from-the-cloud/"><img src="https://img.shields.io/badge/How--To%20Geek-Read-33A6CA?style=flat-square" alt="How-To Geek"></a>
-  <a href="https://www.makeuseof.com/free-browser-tool-beats-bambu-lab-at-own-game/"><img src="https://img.shields.io/badge/MakeUseOf-Read-E02D2D?style=flat-square" alt="MakeUseOf"></a>
-  <a href="https://www.fabbaloo.com/news/bambuddy-launches-as-open-source-alternative-to-bambu-labs-cloud"><img src="https://img.shields.io/badge/Fabbaloo-Read-F77B0F?style=flat-square" alt="Fabbaloo"></a>
-  <a href="https://itsfoss.com/news/bambuddy-self-hosted-bambu-lab-alternative/"><img src="https://img.shields.io/badge/It's%20FOSS-Read-00B5AD?style=flat-square" alt="It's FOSS"></a>
-  <a href="https://www.igorslab.de/en/bambuddy-the-silent-alternative-to-the-bamboo-cloud/"><img src="https://img.shields.io/badge/Igor's%20Lab-Read-E10000?style=flat-square" alt="Igor's Lab"></a>
-  <a href="https://3druck.com/en/programs/bambuddy-open-source-tool-replaces-bambu-cloud-for-management-and-automation-of-3d-print-jobs-38153226/"><img src="https://img.shields.io/badge/3Druck-Read-0080C0?style=flat-square" alt="3Druck"></a>
-  <a href="https://www.fastblinker.com/bambuddy-the-open-source-solution-thats-revolutionizing-bambu-lab-3d-printer-management/"><img src="https://img.shields.io/badge/FastBlinker-Read-00B0FF?style=flat-square" alt="FastBlinker"></a>
-</p>
-
-Two leading 3D-printing publications independently concluded that Bambuddy's feature set **already exceeds Bambu's own cloud**:
-
-> *"The features seem to exceed those provided by Bambu Lab's own cloud."* — [Fabbaloo](https://www.fabbaloo.com/news/bambuddy-launches-as-open-source-alternative-to-bambu-labs-cloud)
->
-> *"The list of functions seems so extensive that it even goes beyond what Bambu Lab offers in its own cloud."* — [3Druck.com](https://3druck.com/en/programs/bambuddy-open-source-tool-replaces-bambu-cloud-for-management-and-automation-of-3d-print-jobs-38153226/)
-
-📄 **[See all press coverage →](https://bambuddy.cool/press.html)**
-
----
-
-## 🌐 NEW: Remote Printing with Proxy Mode
-
-<p align="center">
-  <img src="docs/images/proxy-mode-diagram.png" alt="Proxy Mode Architecture" width="800">
-</p>
-
-**Print from anywhere in the world** — Bambuddy's new Proxy Mode acts as a secure relay between your slicer and printer:
-
-- 🔒 **End-to-end TLS encryption** — FTP, file transfer, and camera are transparently proxied with the printer's real TLS certificate
-- 🛡️ **Optional Tailscale integration** — per-VP toggle + Docker socket mount surface the host's Tailscale IP on the VP card, so you know which `100.x.x.x` to paste into the slicer when you want a virtual printer reachable over your tailnet ([setup](https://wiki.bambuddy.cool/features/virtual-printer/)). Bambuddy's self-signed CA import is still required on the slicer side: Bambu Studio / OrcaSlicer validate printer TLS against a bundled BBL CA (not the system trust store), **and** their Add Printer dialog is IP-only (no hostname to match an LE cert against), so a publicly-trusted cert can't help on either dimension. Tailscale's role is the private tunnel (reachability from anywhere, no port forwarding), not cert-import elimination.
-- 🌍 **No cloud dependency** — Direct connection through your own Bambuddy server
-- 🔑 **Uses printer's access code** — No additional credentials needed
-- ⚡ **Full-speed printing** — Transparent TCP proxy, only MQTT is decrypted for IP rewriting
-
-Perfect for remote print farms, traveling makers, or accessing your home printer from work.
-
-👉 **[Setup Guide →](https://wiki.bambuddy.cool/features/virtual-printer/#proxy-mode-new-in-017)**
-
----
-
-## 🍰 NEW: Integrated Slicing — Slice & Print, All In One Place
-
-**No desktop slicer required.** Drop an STL or 3MF into Bambuddy's File Manager, hit **Slice**, and the result lands as a ready-to-print `.gcode.3mf` in the same folder — without ever opening Bambu Studio or Orca Slicer.
-
-- 🍰 **One-click slicing** — Slice from any browser. The job runs server-side in a [tiny sidecar container](slicer-api/README.md), progress streams back as a toast, and the sliced file appears in your library when it's done.
-- 📱 **Slice from your phone or tablet** — Bambuddy's PWA + the new server-side slicer means you can drop an STL in from mobile and queue a print without ever touching a desktop.
-- 🎒 **Bring your own profiles** — Import a `Printer Preset Bundle` (`.bbscfg`) exported from Bambu Studio: pick a curated **printer + process + filament** triplet from a dropdown in the Slice dialog, no more juggling JSON files.
-- 🔄 **Re-slice for a different printer in one click** — Open any sliced archive in Bambuddy and re-slice it for any printer, including across the single-nozzle ↔ dual-nozzle (H2D / H2D Pro) boundary that BambuStudio's CLI would normally reject. Bambuddy detects the class change and auto-arranges objects laid out for the source bed (e.g. X1C 256×256) so they land safely on the target (e.g. H2D 350×320 with its per-nozzle dead zones).
-- 🍱 **Slice all plates at once** — Multi-plate projects (parted statues, multi-part kits) get a "Slice all N plates" toggle in the Slice dialog. One click produces a single `.gcode.3mf` containing every plate's gcode, ready for the printer. The toast shows "Plate 2 of 5 — Generating G-code (47%)" as the loop runs.
-- 🔁 **Same dispatch as the rest of Bambuddy** — The sliced output flows into the existing queue / plate-picker / AMS-mapping path, so all the regular conveniences (multi-printer dispatch, AMS routing, scheduled prints) just work.
-
-Optional but recommended — drop the [`slicer-api/` Compose stack](slicer-api/README.md) next to your Bambuddy install and the **Slice** button lights up everywhere.
-
-👉 **[Slicer Integration Guide →](https://wiki.bambuddy.cool/features/slicer-api/)**
-
----
-
-## 🧩 NEW: Slicer Pipelines — Save a Recipe, Reuse in One Click
-
-**Stop re-picking the same printer + process + filament + bed-type combination every slice.** Save a Slicer **Pipeline** once from the Slice dialog, then apply the whole bundle to any file with a single click — from File Manager, Archives, or MakerWorld imports.
-
-- 🧩 **One-click reuse** — A pipeline captures the entire Slice modal selection (printer + process + per-AMS-slot filaments + bed type) and surfaces as **Run with pipeline → \<name\>** on every sliceable row.
-- 🎯 **Specific printer or printer class** — Pin a pipeline to one printer, or to a *class* (e.g. *any X1C*) and let the queue scheduler pick the first available match. Identical-fleet farms get a single recipe instead of one-per-printer.
-- 🪢 **Multi-copy fanout** — Slice once, dispatch up to N copies. With class targeting the copies fan out across the matching printers in parallel — **Spread** (fastest wall-clock), **Single printer** (minimise colour-change overhead), or **First N** (one to each).
-- 📊 **Runs dashboard** — A new **Pipelines** tab on the Print Queue page lists every run with colour-coded status badges (queued / slicing / dispatching / in-progress / completed / partial-failure / failed / cancelled), per-copy detail on expand, filter dropdowns (Pipeline / Status / Target), and a **Retry failed** button that re-runs only the copies that didn't complete — successful copies are never re-printed.
-- 🔒 **Permission-gated** — Three permissions (`pipelines:read` / `pipelines:write` / `pipelines:run`) let you split authoring the recipe from spending filament with it.
-
-👉 **[Slicer Pipelines Guide →](https://wiki.bambuddy.cool/features/slicer-pipelines/)**
-
----
-
-## Why Bambuddy?
-
-- **Own your data** — All print history stored locally, no cloud dependency
-- **Works offline** — Uses Developer Mode for direct printer control via local network
-- **Full automation** — Schedule prints, auto power-off, get notified when done
-- **Multi-printer support** — Manage your entire print farm from one interface
-
----
-
-## ✨ Features
-
-<table>
-<tr>
-<td width="50%" valign="top">
-
-### 📦 Print Archive
-- Automatic 3MF archiving with metadata
-- 3D model preview (Three.js)
-- Duplicate detection & full-text search
-- Photo attachments & failure analysis
-- Timelapse editor (trim, speed, music) with automatic AVI-to-MP4 conversion for P1-series printers, manual upload & remove
-- Re-print to any connected printer with AMS mapping (auto-match or manual slot selection, multi-plate support, nozzle-aware matching for dual-nozzle H2D/H2D Pro, **Filament Track Switch (FTS) support** — when the FTS accessory is installed the per-nozzle filter is suppressed since the FTS routes any AMS slot to either extruder)
-- Plate thumbnail browsing for multi-plate archives (hover to navigate between plates)
-- Archive comparison (side-by-side diff)
-- Tag management (rename/delete across all archives)
-- **Per-archive print history** — Each archive card shows an `N prints` badge whenever a model has been printed more than once (reprint + failed retries all counted). Click the badge for the full per-archive Print Log — every individual run with date, status, duration, filament used, cost, and failure reason. Reprints contribute new rows so a failed retry never overwrites the source archive's data — the original 100 g successful print stays visible alongside the 10 g failed reprint, and Quick Stats add up to 110 g across both events.
-- **Print Log** — Chronological table view of all print activity with columns for date/time, print name, printer, user, status, duration, and filament. Filterable by search, printer, user, status, and date range. Pagination with configurable page size. Clear button removes log entries without affecting archives.
-
-### 📊 Monitoring & Control
-- Real-time printer status via WebSocket
-- **Print progress in the browser tab** — optional (off by default, toggle under Settings → Appearance): shows the soonest-finishing print's percentage in the tab title and a progress-ring favicon in your theme accent colour
-- Live camera streaming (MJPEG) & snapshots with multi-viewer support — most Bambu printers only allow one upstream connection, so Bambuddy fans out a single shared stream to all browser tabs / cards / overlays
-- **Cam Wall view** — Toggle the Printers page from cards into a responsive grid of camera tiles for at-a-glance monitoring across the whole farm. On-screen tiles stream live up to a configurable cap (default 4) so RPi installs stay sustainable; the rest fall back to periodic snapshot polling, and off-screen tiles pause entirely. Per-user settings (live cap, snapshot interval); click any tile to open the floating viewer or the dedicated camera window depending on your existing camera-view preference
-- **Long-lived camera tokens** for Home Assistant / Frigate / kiosks — mint a token from Settings → API Keys, paste it once, capped at 365 days, revocable at any time (no infinite tokens — leaked permanent tokens are unsafe by design)
-- **Streaming overlay for OBS** - Embeddable page with camera + status for live streaming (`/overlay/:printerId`), configurable FPS (`?fps=30`), status-only mode (`?camera=false`)
-- External camera support (MJPEG, RTSP, HTTP snapshot, USB/V4L2) with layer-based timelapse
-- **Build plate empty detection** - Auto-pause print if objects detected on plate (multi-reference calibration, ROI adjustment)
-- Fan monitoring and **speed control** for part-cooling, auxiliary, and chamber fans (0–100% with customizable quick-select presets)
-- Printer control (stop, pause, resume, chamber light, print speed, **airduct mode** for P2S/H2*, **temperature setpoints** for nozzle / bed / **chamber heater** on H2C/H2D/H2DPro/H2S/X2D, **Z-jog / XY-jog / extruder jog**, customizable temperature & fan presets under Settings → Workflow)
-- **Status badges on printer card**: SD Card (green / red), Enclosure Door (green / yellow — X1/P1S/P2S/H2*), Airduct Mode (cooling / heating)
-- **Force Refresh** menu item — request a full status push from the printer without reconnecting
-- **Maintenance Mode** — put a printer "out of service" without removing it. Toggle from the card's three-dot menu, the in-card amber banner, or the Edit Printer dialog; the printer disconnects MQTT, drops out of queue dispatch, the scheduler, model-based filament lookups, metrics, and notifications until you take it out again. The card stays visible (amber wrench banner + Exit button) so the printer never disappears from your dashboard. Useful for parallel Bambuddy installs sharing the same hardware, printers under repair or awaiting parts, and temporary suspension.
-- Bulk printer actions (multi-select cards, then stop/pause/resume/clear all — select by state or location)
-- Printer search and filters — live search by name/model/location/serial plus status and location dropdown filters (WebSocket-reactive, mobile-friendly)
-- Resizable printer cards (S/M/L/XL)
-- Skip objects during print
-- AMS slot RFID re-read
-- **AMS slot Load / Unload from the printer card** — Hover any AMS slot or external spool, click the menu button, and load that tray or unload the currently-loaded one without going to the touchscreen; supports dual-extruder H2D (Ext-L / Ext-R drive their own nozzle)
-- **AMS Filament Backup status + control with pair view** — Mirrors BambuStudio's per-printer "AMS Filament Backup" auto-switch (when a spool runs out, the printer rolls over to a same-preset, same-colour spool in another slot). A small badge in the Filaments section header on each printer card shows the live state (blue circular-arrow icon = ON, dim = OFF, "?" = A1 family with no `cfg` field yet); click to open the AMS Filament Backup modal — a BambuStudio Auto Refill-style ring graphic per backup pair, with the filament colour as the ring fill and member slot labels (e.g. `A·1`, `B·3`) on contrast-aware pills around the band. Dual-extruder printers (H2D / H2C / X2D) carry an `R` / `L` badge per ring because the firmware can't cross extruders. State syncs in real time whether you toggled from Bambuddy, BambuStudio, or the printer's touchscreen. Bambuddy's "insufficient filament" check is **backup-aware**: when Backup is ON, the deficit check pools remaining grams across same-`(preset, colour)` spools on the printer, so the warning doesn't fire spuriously when the firmware will swap to a peer mid-print (#1762). Bambuddy's **Prefer Lowest Remaining Filament** sort also respects the toggle — when Backup is OFF the dispatcher skips the prefer-lowest sort entirely so it won't reach for a near-empty spool the printer can't roll off of.
-- AMS slot configuration (model-filtered presets, K profiles, color picker, pre-population for configured slots)
-- AMS info card (hover for serial number, firmware version) with custom friendly names that persist across printers
-- **AMS remote drying** — Start, monitor, and stop drying sessions for AMS 2 Pro and AMS-HT directly from the Printers page with filament-based temperature/duration presets, optional spool rotation; automatic PSU detection and HMS power error reporting. Rotate-spool toggle is disabled per-AMS when any tray has filament threaded into the feed tube (the AMS mechanism is locked there — rotating would jam the filament)
-- **Queue auto-drying** — Automatically dry filament between scheduled prints when humidity exceeds threshold; configurable presets per filament type, optional blocking mode
-- **Ambient drying** — Automatically keep filament dry on idle printers based on humidity, regardless of whether prints are queued
-- **Continue drying while printing** — On capable hardware (H2D 01.03.00.00+, H2C / H2S / P2S / H2D Pro 01.02.00.00+, X2D / A2L 01.01.00.00+, X1C 01.11.02.00+), auto-drying can keep running during a print. Default off, opt-in toggle in Settings → Print Queue. Drying temperature is automatically capped 5°C below the idle preset (floor 40°C) to protect spools inside the hot enclosure
-- Configurable drying presets per filament type (temperature & duration for AMS 2 Pro and AMS-HT)
-- **Per-filament humidity threshold** — Set a different humidity trigger per filament type (e.g. Nylon at 20%, PLA at 60%, ASA at 30%) instead of one global value. Mixed-material AMS units use the most-restrictive threshold across the loaded spools so a single PLA + Nylon unit triggers at Nylon's level. Drives both the auto-drying scheduler and the hourly humidity alarm so the two can never disagree on whether a unit is "too humid"
-- Dual external spool support for H2D (Ext-L / Ext-R)
-- **HMS error monitoring with one-click actions** — Live HMS error log with history and the same Resume / Stop / Continue / Retry / Check Assistant / Don't Remind Me action buttons BambuStudio shows. Click and the matching MQTT command goes back to the printer — no more walking to the device just to dismiss a paused-print dialog. Catalog covers every Bambu model (X1 / P1 / A1 / H2 series); buttons are translated in all 13 supported locales
-- **Heater history charts** — Bambuddy logs nozzle, bed, and chamber readings every minute and surfaces them via a tiny chart icon on each heater tile in the printer card. Click for a per-heater modal with current / average / min / max stats, target overlay, and a 6h / 24h / 48h / 7d time range — works on read-only chamber sensors (X1C / P2S) too. AMS humidity and temperature get the same treatment (already shipped).
-- Print success rates & trends
-- Filament usage tracking
-- Cost analytics & failure analysis
-- **AI print-failure detection** — Optional integration with a self-hosted [Obico](https://github.com/TheSpaghettiDetective/obico-server) ML API: watches each running print's camera feed, smooths scores over time (30-frame warmup + EWM + rolling means), and fires a configurable action once per print (notify / pause / pause-and-off)
-- Per-user statistics filtering (admin permission gated)
-- CSV/Excel export
-
-### ⏰ Scheduling & Automation
-- **Unified dispatch through the queue** — Every print Bambuddy starts (File Manager, archive reprint, printer-card upload-and-print, scheduled queue items) flows through the same queue scheduler, so each print is visible on the queue page, attributable to the user that started it, deficit-checked, and cancellable from one place. FTP uploads and print-start commands run in the background with real-time WebSocket progress toasts (per-job upload bars, status badges, cancel button). Installations with custom groups or API keys: the immediate-print actions now require the `queue:create` permission alongside the existing `printers:control` — see [the permissions guide](https://wiki.bambuddy.cool/admin/permissions/) if you've granted control without queue-create
-- Print queue with three tabs (Queue / History / Timeline), multi-select drag-and-drop, batch grouping, and a Gantt-style timeline
-- Multi-printer selection (send to multiple printers at once)
-- Batch grouping — multi-plate prints auto-group into a collapsible row; any 2+ selected items can be grouped manually via "Group as batch", with ungroup on the batch parent
-- Batch print quantity (print multiple copies — set quantity in the print/schedule dialog, first copy prints immediately, rest are queued)
-- Staggered batch start (start printers in groups with configurable interval to avoid power spikes — works in both Print and Queue dialogs)
-- Configurable default print options (bed levelling, flow/vibration calibration, first layer inspection, timelapse) in Settings → Workflow
-- Model-based queue assignment (send to "any X1C" for load balancing) with location filtering
-- Filament override for model-based queue (swap filament colors/types before scheduling)
-- Filament validation (only assign to printers with required filaments)
-- Prefer lowest remaining filament (consume partial spools first when multiple match)
-- Per-printer AMS mapping (individual slot configuration for print farms)
-- Scheduled prints (date/time)
-- Shortest Job First scheduling (SJF toggle on queue page — scheduler picks shorter prints first, with starvation guard)
-- Queue Only mode (stage without auto-start)
-- Clear plate confirmation between queued prints (can be disabled in settings for farm workflows)
-- Auto-print G-code injection (per-model start/end snippets for Farmloop, SwapMod, AutoClear, Printflow 3D — toggle per queue item)
-- **Preheat & Heat Soak before queued prints** — Heat the bed (and the chamber, on supported printers) and hold at temperature between FTP upload and print start. Per-print Inherit / On / Off override in the Print Options panel; per-filament chamber-target map under Settings → Workflow so PA wants 50°C, ABS 45°C, PETG-CF 40°C, PLA 0°C (skips chamber phase automatically). Hardware-aware: H-series / X2D / X1E actively heat the chamber via M141; X1C / P2S rely on bed radiation with a chamber-sensor wait; P1S / P1P / A1 family have no chamber sensor so only the soak timer applies. The cooling/heating airduct flap on H-series / X2D / P2S auto-switches to match the resolved chamber target — preheat for ABS opens nothing and recirculates warm air; preheat for PLA opens the exhaust and vents — so engineering filaments actually reach target instead of fighting the open flap, and PLA prints don't inherit a previously-hot recirculation. M191 (wait-for-chamber-temp) isn't honoured by Bambu firmware, so doing this at the orchestration layer is the only place it works
-- Smart plug integration (Tasmota, Home Assistant, MQTT, REST/Webhook)
-- REST smart plugs: Control any device with an HTTP API (openHAB, ioBroker, FHEM, Node-RED) with separate power/energy URLs and unit multipliers
-- MQTT smart plugs: Subscribe to Zigbee2MQTT, Shelly, or any MQTT topic for energy monitoring
-- Energy consumption tracking (per-print kWh and cost) — restart-resilient: mid-print backend restarts no longer lose per-print energy
-- Energy statistics by date range (Today / Week / Month / …) in total-consumption mode via hourly lifetime-counter snapshots
-- HA energy sensor support (for plugs with separate power/energy sensors)
-- Auto power-on before print
-- Auto power-off after cooldown
-
-### 📁 File Manager (Library)
-- Upload and organize sliced files (3MF, gcode, STL)
-- **External folder mounting** - Mount host directories (NAS, USB, network shares) without copying files. Operator-controlled via the `BAMBUDDY_EXTERNAL_ROOTS` env var (colon-separated allowlist of host paths users are permitted to register; empty by default to disable the feature). See [Docker → External library folders](https://wiki.bambuddy.cool/getting-started/docker/#external-library-folders-bambuddy_external_roots).
-- **STL thumbnail generation** - Auto-generate previews for STL files on upload or batch generate for existing files
-- ZIP file extraction with folder structure preservation
-- Option to create folder from ZIP filename
-- Folder structure with drag-and-drop
-- Rename files and folders via context menu
-- Print directly to any printer with full options
-- Add to queue without creating archive upfront
-- Plate selection for multi-plate 3MF files
-- Duplicate detection via file hash
-- Mobile-friendly with always-visible action buttons
-- **Server-side Slice button** (optional) — slice STL/3MF without a desktop slicer when the [`slicer-api/` Compose stack](slicer-api/README.md) is running; the result lands as a new `.gcode.3mf` in the same folder, with progress shown via a toast tracker that follows the job to completion. Supports importing **Bambu Studio Printer Preset Bundles** (`.bbscfg`) so a curated printer + process + filament triplet can be picked in the Slice dialog without re-uploading JSON profiles ([details](https://wiki.bambuddy.cool/features/slicer-api/#slicer-bundles-bbscfg))
-
-### 🌍 MakerWorld Integration
-- Paste any `makerworld.com/models/…` URL → preview, plate picker, and import without leaving Bambuddy
-- Per-plate **Save** or **Save & Slice in Bambu Studio / OrcaSlicer** (your preferred slicer from Settings)
-- **Import all plates** button for multi-plate models
-- Auto-creates a "MakerWorld" folder in File Manager; override with any existing folder via the picker
-- Per-plate image gallery with keyboard-navigable lightbox
-- Recent imports sidebar — last 10 MakerWorld imports with one-click jump to File Manager or slicer
-- Remove-from-library for imported plates with confirm modal (no LAN cookie paste, no browser extension)
-- Reuses your existing Bambu Cloud login — no separate OAuth flow or browser extension to install
-
-### 📁 Projects
-- Group related prints (e.g., "Voron Build")
-- Track plates (print jobs) and parts separately
-- Auto-detect parts count from 3MF files
-- Color-coded project badges
-- **Project URL + cover photo** — paste a MakerWorld/Printables/Thingiverse link and upload a hero image so each card is immediately recognisable; the URL renders as a one-click link beside the project name
-- Bulk assign archives via multi-select toolbar
-- Import/Export projects as ZIP (includes files) or JSON
-- Print or queue files from linked library folders directly in the project view (resulting archive auto-linked to the project)
-
-</td>
-<td width="50%" valign="top">
-
-### 🔔 Notifications
-- WhatsApp, Telegram, Discord
-- Email, Pushover, ntfy (with per-event priority — Min / Low / Default / High / Urgent)
-- Home Assistant persistent notifications
-- Custom webhooks
-- Quiet hours & daily digest
-- Customizable message templates with per-filament usage details
-- Print finish photo URL in notifications
-- Filament usage and progress in failed/cancelled print notifications
-- **Missing spool assignment warning** — Toast and push notification when a print starts with unassigned AMS trays
-- HMS error alerts (AMS, nozzle, etc.)
-- Build plate detection alerts
-- First layer complete alert (with camera snapshot)
-- Bed cooled alerts (configurable threshold)
-- Queue events (waiting, skipped, failed)
-
-### 🧵 Spool Inventory
-- Built-in spool inventory with AMS slot assignment, usage tracking, and remaining weight management
-- Automatic filament consumption tracking: 3MF slicer estimates for all spools (primary), AMS remain% delta as fallback
-- Mid-print spool reassignment support: uses live assignment if changed during print, snapshot otherwise
-- Per-layer gcode accuracy for partial prints (failed/cancelled), with linear scaling fallback
-- **Per-spool cost tracking** — Set cost/kg on each spool; costs are automatically calculated at print completion and aggregated to archives. Print modal shows real-time cost preview. Configurable default cost and currency in Settings.
-- **Bulk spool addition** — Add multiple identical spools at once (quantity 1–100) with a single form submission. Quick Add mode for stock spools that only need material, color, and weight.
-- Spool catalog, color catalog, PA profile matching, and low-stock alerts
-- **Multi-colour gradients, transparency, and visual effects** — Paste a comma-separated hex list (e.g. from 3dfilamentprofiles.com) to render a spool as a gradient or conic colour wheel; transparency shows through a checkerboard so the alpha you set is the alpha you see; pick a visual effect (sparkle, wood, marble, glow, matte) for the swatch overlay. Same fields are editable on the colour catalog so combos can be reused across spools.
-- **Printable spool labels** — Generate PDF labels for any selection of spools in four pre-built sizes: AMS holder (30×15 mm), box label (62×29 mm), Avery L7160 sheet (A4, 21 per page), and Avery 5160 sheet (US Letter, 30 per page). Each label shows the colour swatch, brand, material, name, the **spool ID** (for at-a-glance identification across many similar spools), and a QR code that deep-links straight back to the spool's row in Bambuddy when scanned with a phone. Pick from the inventory page — search, filter by material, multi-select spools, then print or save to PDF.
-
-### 🔧 Integrations
-- [Spoolman](https://github.com/Donkie/Spoolman) filament sync with per-filament usage tracking and fill level display
-- MQTT publishing for Home Assistant, Node-RED, etc.
-- **Prometheus metrics** - Export printer telemetry for Grafana dashboards
-- Bambu Cloud profile management
-- **Orca Cloud profile sync** — read your OrcaSlicer 2.4.0+ cloud-synced profiles directly in Bambuddy, usable for slicing alongside Bambu Cloud / local / standard presets. Four sign-in providers (Google / Apple / GitHub / email+password)
-- **Local Profiles** - Import OrcaSlicer presets (`.orca_filament`, `.bbscfg`, `.bbsflmt`, `.zip`, `.json`) without Bambu Cloud
-- K-profiles (pressure advance)
-- **GitHub backup** - Schedule automatic backups of cloud profiles, k profiles and settings to GitHub
-- **Scheduled local backups** - Automatic backup snapshots on hourly/daily/weekly schedule with retention management and NAS-mountable output
-- External sidebar links
-- Webhooks & API keys
-  - Per-user ownership — each key acts on behalf of its creator
-  - Optional **cloud-access scope** — opt in to let an API key read its owner's Bambu Cloud + Orca Cloud presets / filament catalogue / device list (off by default)
-- Interactive API browser with live testing
-
-### 🖨️ Virtual Printer & Remote Printing
-- **🌐 Proxy Mode** — Print remotely from anywhere via secure TLS relay
-- **🪞 Live target-printer mirror in non-proxy modes (NEW!)** — Immediate / Review / Queue VPs now mirror their target printer's live state to the slicer: AMS slot contents, FTS / dual-extruder routing, k-profiles, AMS load / dry / calibration commands, and the camera stream all flow through the VP. Use the slicer as a full remote for the printer behind the VP without giving up Bambuddy's queue / archive / dispatch features.
-- Emulates a Bambu Lab printer on your network
-- Send prints directly from Bambu Studio/Orca Slicer
-- Configurable printer model (X1C, P1S, A1, H2D, etc.)
-- Archive mode, Review mode, Queue mode, or Proxy mode
-- Queue mode: optional **force-color-match** so the scheduler refuses to dispatch onto a printer with the wrong filament loaded
-- SSDP discovery (same LAN) or manual IP entry (VPN/remote)
-- Network interface override for multi-NIC/Docker/VPN setups
-- Secure TLS/MQTT/FTP communication
-
-### 🛠️ Maintenance & Support
-- Maintenance scheduling & tracking
-- Interval reminders (hours/days)
-- Print time accuracy stats
-- File manager for printer storage
-- Firmware update helper with version badge (LAN-only printers) — lists all announced versions with Usable/Unavailable/Installed badges and supports rollback to older firmware
-- Debug logging toggle with live indicator
-- Live application log viewer with filtering
-- Support bundle generator with comprehensive diagnostics (privacy-filtered)
-- **In-app bug reporting** — Submit bug reports directly from the UI with optional screenshot (upload, paste, or drag & drop), interactive debug log capture (start logging, reproduce at your own pace, stop & submit), and system info. Reports create GitHub issues via a secure relay. Privacy-first: all logs are sanitized and sensitive data (IPs, serials, credentials) is never included.
-
-### 🔒 Optional Authentication
-- Enable/disable authentication any time
-- Group-based permissions (80+ granular permissions)
-- Default groups: Administrators, Operators, Viewers
-- JWT tokens with secure password hashing
-- Comprehensive API protection (200+ endpoints secured)
-- User management (create, edit, delete, groups)
-- User activity tracking (who uploaded archives, library files, queued prints, started prints)
-- **Per-user Bambu Cloud accounts** — Each user has their own independent Cloud login for profiles
-- **Advanced Auth via Email** — SMTP integration for automated user onboarding and self-service password resets
-- Admin creates users with email — system sends secure random password automatically
-- Users can reset their own password from the login screen (no admin needed)
-- Customizable email templates (welcome email, password reset)
-- **Two-Factor Authentication (TOTP + Email OTP)** — Per-user opt-in 2FA compatible with Google Authenticator, Authy, 2FAS and any standard TOTP app, or a 6-digit code delivered by email. Each user gets 10 single-use backup codes. Brute-force-protected (per-user + per-IP rate limits), replay-protected (same code cannot be accepted twice in the same 30 s window), and the pre-auth token is a single-use DB-backed challenge bound to the browser session via an HttpOnly cookie.
-- **Single Sign-On (OIDC / SSO)** — Log in via PocketID, Authentik, Keycloak, or any standards-compliant OIDC provider. PKCE (S256) for public clients, `email_verified` gating, issuer & `aud`/`nonce` validation, opt-in account linking via verified email, optional auto-provisioning of new BamBuddy accounts, and strict SSRF hardening on every URL pulled from the OIDC discovery document (scheme + private/loopback/link-local IP checks).
-- **Per-user email notifications** — Users receive email alerts for their own print jobs (start, complete, failed, stopped) with individual toggle controls
-
-</td>
-</tr>
-</table>
-
-**Plus:** Configurable slicer (Bambu Studio / OrcaSlicer) • Customizable themes (style, background, accent) • Mobile responsive • Keyboard shortcuts • Multi-language (EN/DE/JA/IT) • Auto updates • Database backup/restore • System info dashboard
-
----
-
-## 🎬 Demo
-
-<p align="center">
-  <a href="https://demo.bambuddy.cool">
-    <img src="https://img.shields.io/badge/🎮_Try_It_Live-demo.bambuddy.cool-00ae42?style=for-the-badge&labelColor=0a0d14" alt="Live Demo">
-  </a>
-  <br>
-  <em>Spin up your own private Bambuddy with simulated printers and pre-loaded print history. Click around freely — it's your sandbox. ~10 seconds to spawn, 30-minute session, no signup.</em>
-</p>
-
-<p align="center">
-  <strong>Prefer a video walkthrough?</strong>
-</p>
-
-<p align="center">
-  <a href="https://youtu.be/bmq2Z0lEXeo">
-    <img src="https://img.youtube.com/vi/bmq2Z0lEXeo/maxresdefault.jpg" alt="Bambuddy Demo Video" width="800">
-  </a>
-  <br><em>Click to watch the demo on YouTube</em>
-</p>
-
----
-
-## 📸 Screenshots
-
-> **Refreshed printer card in 1.2.5b2** — tighter layout, popovers for all controls (temperature setpoints, fan speeds, jog), and a bottom-aligned power row. The screenshots below predate the refresh.
-
-<details>
-<summary><strong>Click to expand screenshots</strong></summary>
-
-<p align="center">
-  <img src="docs/screenshots/printers.png" alt="Printers" width="800">
-  <br><em>Real-time printer monitoring with AMS status</em>
-</p>
-
-<p align="center">
-  <img src="docs/screenshots/archives.png" alt="Archives" width="800">
-  <br><em>Print archive with 3D preview and project assignment</em>
-</p>
-
-<p align="center">
-  <img src="docs/screenshots/reprint_ams_mapping.png" alt="Reprint AMS Mapping" width="800">
-  <br><em>Re-print with AMS filament mapping preview</em>
-</p>
-
-<p align="center">
-  <img src="docs/screenshots/edit-timelapse.png" alt="Timelapse Editor" width="800">
-  <br><em>Built-in timelapse editor with trim, speed, and music</em>
-</p>
-
-<p align="center">
-  <img src="docs/screenshots/projects.png" alt="Projects" width="800">
-  <br><em>Group related prints into projects</em>
-</p>
-
-<p align="center">
-  <img src="docs/screenshots/project-detail-1.png" alt="Project Detail" width="800">
-  <br><em>Project detail view with assigned archives</em>
-</p>
-
-<p align="center">
-  <img src="docs/screenshots/project-detail-2.png" alt="Project Detail Timeline" width="800">
-  <br><em>Project timeline and print history</em>
-</p>
-
-<p align="center">
-  <img src="docs/screenshots/print-queue.png" alt="Queue" width="800">
-  <br><em>Print scheduling and queue management</em>
-</p>
-
-<p align="center">
-  <img src="docs/screenshots/schedule-print.png" alt="Schedule Print" width="800">
-  <br><em>Schedule prints for specific date and time</em>
-</p>
-
-<p align="center">
-  <img src="docs/screenshots/statistics.png" alt="Statistics" width="800">
-  <br><em>Customizable statistics dashboard</em>
-</p>
-
-<p align="center">
-  <img src="docs/screenshots/maintenance-1.png" alt="Maintenance" width="800">
-  <br><em>Maintenance tracking per printer</em>
-</p>
-
-<p align="center">
-  <img src="docs/screenshots/maintenance-2.png" alt="Maintenance Settings" width="800">
-  <br><em>Configure maintenance types and intervals</em>
-</p>
-
-<p align="center">
-  <img src="docs/screenshots/cloud_profiles-1.png" alt="Cloud Profiles" width="800">
-  <br><em>Bambu Cloud filament profiles</em>
-</p>
-
-<p align="center">
-  <img src="docs/screenshots/cloud_profiles-2.png" alt="Cloud Profiles Edit" width="800">
-  <br><em>Edit filament preset settings</em>
-</p>
-
-<p align="center">
-  <img src="docs/screenshots/k_profiles-1.png" alt="K-Profiles" width="800">
-  <br><em>Pressure advance (K-factor) profiles</em>
-</p>
-
-<p align="center">
-  <img src="docs/screenshots/k_profiles-2.png" alt="K-Profiles Edit" width="800">
-  <br><em>Edit K-factor profile settings</em>
-</p>
-
-<p align="center">
-  <img src="docs/screenshots/settings-general.png" alt="Settings" width="800">
-  <br><em>General configuration and integrations</em>
-</p>
-
-<p align="center">
-  <img src="docs/screenshots/settings-powerplugs.png" alt="Smart Plugs" width="800">
-  <br><em>Smart plug control and energy monitoring</em>
-</p>
-
-<p align="center">
-  <img src="docs/screenshots/settings_notifications.png" alt="Notifications" width="800">
-  <br><em>Multi-provider notification system</em>
-</p>
-
-<p align="center">
-  <img src="docs/screenshots/settings_api_keys.png" alt="API Keys" width="800">
-  <br><em>API keys and webhook endpoints</em>
-</p>
-
-<p align="center">
-  <img src="docs/screenshots/settings-virtual-printer.png" alt="Virtual Printer Settings" width="800">
-  <br><em>Virtual printer configuration</em>
-</p>
-
-<p align="center">
-  <img src="docs/screenshots/slicer-virtual-printer.png" alt="Slicer Virtual Printer" width="800">
-  <br><em>Virtual printer appears in Bambu Studio/Orca Slicer</em>
-</p>
-
-<p align="center">
-  <img src="docs/screenshots/mqtt-debug-log.png" alt="MQTT Debug Log" width="800">
-  <br><em>MQTT debug logging for troubleshooting</em>
-</p>
-
-<p align="center">
-  <img src="docs/screenshots/quick_power_plug_sidebar.png" alt="Quick Power Plug" width="400">
-  <br><em>Quick power plug control in sidebar</em>
-</p>
-
-</details>
-
----
-
-## 🚀 Quick Start
-
-### Requirements
-- Python 3.10+ (3.11/3.12 recommended)
-- Bambu Lab printer with **Developer Mode** enabled (see below)
-- **"Store sent files on external storage"** enabled in Bambu Studio/OrcaSlicer
-- Same local network as printer
-
-### Installation
-
-#### Windows (Native Installer)
-
-Self-contained `.exe` — no Python, Node, Docker, or Git required on the target machine. The installer bundles Python 3.13, the React frontend, ffmpeg, and registers Bambuddy as a Windows service.
-
-Download the latest installer:
-
-> https://github.com/maziggy/bambuddy/releases/latest/download/bambuddy-windows-x64-setup.exe
-
-Run it (one-time UAC prompt — admin install) → Bambuddy starts as a Windows service and the dashboard opens at **http://localhost:8000** automatically. Data lives at `C:\ProgramData\Bambuddy\`, install at `C:\Program Files\Bambuddy\`. To update, just run a newer installer over the existing install — your database and archives are preserved.
-
-> **SmartScreen warning:** until our SignPath OSS code-signing approval lands, you'll see "Windows protected your PC" on first run. Click **More info → Run anyway**.
-
-See the [Windows Installer Guide](https://wiki.bambuddy.cool/getting-started/windows-installer/) for service management, logs, and troubleshooting.
-
-#### Docker (Linux / macOS / Windows via Docker Desktop)
-
-**Option A: Pre-built image (fastest)**
-```bash
-mkdir bambuddy && cd bambuddy
-curl -O https://raw.githubusercontent.com/maziggy/bambuddy/main/docker-compose.yml
-docker compose up -d
-```
-
-**Option B: Build from source**
-```bash
-git clone https://github.com/maziggy/bambuddy.git
-cd bambuddy
-docker compose up -d --build
-```
-
-Open **http://localhost:8000** in your browser.
-
-> **Multi-architecture support:** Pre-built images are available for `linux/amd64` and `linux/arm64` (Raspberry Pi 4/5).
-
-> **macOS/Windows users:** Docker Desktop doesn't support `network_mode: host`. Edit docker-compose.yml: comment out `network_mode: host` and uncomment the `ports:` section. Printer discovery won't work - add printers manually by IP.
-
-> **Linux users:** If you get "permission denied" errors, either prefix commands with `sudo` (e.g., `sudo docker compose up -d`) or [add your user to the docker group](https://docs.docker.com/engine/install/linux-postinstall/).
-
-<details>
-<summary><strong>Docker Configuration & Commands</strong></summary>
-
-**Environment Variables:**
-
-| Variable | Default | Description |
-|----------|---------|-------------|
-| `TZ` | `UTC` | Your timezone (e.g., `America/New_York`, `Europe/Berlin`) |
-| `PORT` | `8000` | Port BamBuddy runs on (with host networking mode) |
-| `DEBUG` | `false` | Enable debug logging |
-| `LOG_LEVEL` | `INFO` | Log level: `DEBUG`, `INFO`, `WARNING`, `ERROR` |
-
-**Data Persistence:**
-
-| Volume | Purpose |
-|--------|---------|
-| `bambuddy.db` | SQLite database with all your print data (not used with PostgreSQL) |
-| `archive/` | Archived 3MF files and thumbnails |
-| `logs/` | Application logs |
-
-**Updating:**
-
-```bash
-# Pre-built image: just pull the latest
-docker compose pull && docker compose up -d
-
-# From source: rebuild after pulling changes
-cd bambuddy && git pull && docker compose up -d --build
-```
-
-**Daily Beta Builds:**
-
-Beta builds with the latest fixes are pushed regularly to the same beta version tag:
-
-```bash
-# Pull the current beta
-docker pull ghcr.io/maziggy/bambuddy:0.2.2b1
-# or from Docker Hub
-docker pull maziggy/bambuddy:0.2.2b1
-```
-
-Use [Watchtower](https://containrrr.dev/watchtower/) to automatically update when new daily builds are pushed.
-
-> **Note:** Beta builds use version tags like `0.2.2b1` — they are never tagged as `latest`. Your stable installation won't auto-update to a beta unless you explicitly pull a beta tag.
-
-**Useful Commands:**
-
-```bash
-# View logs
-docker compose logs -f
-
-# Stop/Start
-docker compose down
-docker compose up -d
-
-# Shell access
-docker compose exec bambuddy /bin/bash
-```
-
-**Custom Port:**
-
-```yaml
-ports:
-  - "3000:8000"  # Access on port 3000
-```
-
-**Reverse Proxy (Nginx):**
-
-```nginx
-server {
-    listen 443 ssl http2;
-    server_name bambuddy.yourdomain.com;
-
-    ssl_certificate /path/to/cert.pem;
-    ssl_certificate_key /path/to/key.pem;
-
-    location / {
-        proxy_pass http://localhost:8000;
-        proxy_http_version 1.1;
-        proxy_set_header Upgrade $http_upgrade;
-        proxy_set_header Connection "upgrade";
-        proxy_set_header Host $host;
-        proxy_set_header X-Real-IP $remote_addr;
-        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
-        proxy_set_header X-Forwarded-Proto $scheme;
-        proxy_read_timeout 86400;
-    }
-}
-```
-
-> **Note:** WebSocket support is required for real-time printer updates.
-
-**Network Mode Host** (required for printer discovery and camera streaming):
-
-```yaml
-services:
-  bambuddy:
-    build: .
-    network_mode: host
-```
-
-> **Note:** Docker's default bridge networking cannot receive SSDP multicast packets for automatic printer discovery. When using `network_mode: host`, Bambuddy auto-detects your network subnet and can discover printers via subnet scanning in the Add Printer dialog.
-
-</details>
-
-#### Manual Installation (Linux/macOS)
-
-```bash
-# Clone and setup
-git clone https://github.com/maziggy/bambuddy.git
-cd bambuddy
-python3 -m venv venv
-source venv/bin/activate
-pip install -r requirements.txt
-
-# Run (--loop asyncio avoids a uvloop TLS bug that can truncate VP FTP uploads)
-uvicorn backend.app.main:app --host 0.0.0.0 --port 8000 --loop asyncio
-```
-
-Open **http://localhost:8000** and add your printer!
-
-> **Need detailed instructions?** See the [Installation Guide](http://wiki.bambuddy.cool/getting-started/installation/)
-
-### Windows Native Installation
-
-Windows PowerShell (run as Administrator — the installer self-elevates via UAC if not):
-
-```powershell
-powershell -ExecutionPolicy Bypass -Command "iwr -useb https://raw.githubusercontent.com/maziggy/bambuddy/main/install/windows-installer.ps1 -OutFile windows-installer.ps1; .\windows-installer.ps1"
-```
-
-> Installs Bambuddy natively on Windows using Git, Python, a virtual environment, separate data/log directories, and optional NSSM Windows Service registration. See the [Windows Installer Guide](http://wiki.bambuddy.cool/getting-started/windows-installer/) for parameters and unattended-install options.
-
-### Enabling Developer Mode
-
-Developer Mode allows third-party software like Bambuddy to control your printer over the local network.
-
-1. On printer: **Settings** → **Network** → **LAN Only Mode** → Enable
-2. Enable **Developer Mode** (appears after LAN Only Mode is enabled)
-3. Note the **Access Code** displayed
-4. Find IP address in network settings
-5. Find Serial Number in device info
-
-> **Note:** Developer Mode disables cloud features but provides full local control. Standard LAN Mode (without Developer Mode) only allows read-only monitoring.
-
-### Slicer Settings
-
-In Bambu Studio or OrcaSlicer, enable **"Store sent files on external storage"** so that print files (3MF) are saved to the printer's SD card. Bambuddy needs these files to extract thumbnails and 3D model previews.
-
-1. Open **Bambu Studio** or **OrcaSlicer**
-2. Go to the **Device** tab for your printer
-3. In **Print Options**, enable **Store Sent Files on External Storage**
-
----
-
-## 📚 Documentation
-
-Full documentation available at **[wiki.bambuddy.cool](http://wiki.bambuddy.cool)**:
-
-- [Installation](http://wiki.bambuddy.cool/getting-started/installation/) — All installation methods
-- [Getting Started](http://wiki.bambuddy.cool/getting-started/) — First printer setup
-- [Features](http://wiki.bambuddy.cool/features/) — Detailed feature guides
-- [Troubleshooting](http://wiki.bambuddy.cool/reference/troubleshooting/) — Common issues & solutions
-- [API Reference](http://wiki.bambuddy.cool/reference/api/) — REST API documentation
-
----
-
-## 🖨️ Supported Printers
-
-| Series | Models |
-|--------|--------|
-| X1 | X1, X1 Carbon, X1E |
-| X2 | X2D |
-| H2 | H2D, H2D Pro, H2C, H2S |
-| P1 | P1P, P1S |
-| P2 | P2S |
-| A1 | A1, A1 Mini |
-| A2 | A2L |
-
----
-
-## 🛠️ Tech Stack
-
-| Component | Technology |
-|-----------|------------|
-| Backend | Python, FastAPI, SQLAlchemy |
-| Frontend | React, TypeScript, Tailwind CSS |
-| Database | SQLite (default) or PostgreSQL |
-| 3D Viewer | Three.js |
-| Communication | MQTT (TLS), FTPS |
-
----
-
-## 🤝 Contributing
-
-Contributions welcome! Ways to help:
-
-1. **📝 Document** — Improve the wiki and guides *(urgently needed!)*
-2. **Test** — Report issues with your printer model
-3. **Translate** — Add new languages
-4. **Code** — Submit PRs for bugs or features
-5. **🔒 Security review** — *(specifically wanted, see below)*
-
-Not sure where to start? Reach out on [Discord](https://discord.gg/aFS3ZfScHM) or email **martin@bambuddy.cool** — I'll help you find something that fits.
-
-### 🔒 Looking for a security-focused contributor
-
-I'm bringing on a contributor whose specific focus is keeping an eye on Bambuddy's security.
-
-Concretely:
-
-Track the `dev` branch and flag changes touching auth, permissions, token handling, or the CI security backstops. Async post-merge — no gating of in-flight PRs.
-
-What matters more than formal qualifications: fail-closed thinking by default, comfortable reading the auth layer (FastAPI + SQLAlchemy on the backend, a small React surface), willing to push back on `except Exception` shapes in security-sensitive code.
-
-No fixed time commitment. If you're interested — or know someone who fits — email `martin@bambuddy.cool` or DM on Discord.
-
-See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.
-
----
-
-## 📄 License
-
-AGPL-3.0 License — see [LICENSE](LICENSE) for details.
-
----
-
-## 🙏 Acknowledgments
-
-- [SpoolEase](https://github.com/yanshay/SpoolEase) by yanshay — early inspiration for NFC-based spool tracking and AMS inventory concepts
-- [Bambu Lab](https://bambulab.com/) for amazing printers
-- The reverse engineering community for protocol documentation
-- All testers and contributors
-
----
-
-## 💖 Support Bambuddy
-
-Bambuddy stays independent because real people support it directly. If Bambuddy makes your printers more useful, please consider:
-
-- **[GitHub Sponsors](https://github.com/sponsors/maziggy)** — five recurring tiers from $5/mo (Backer) to $300/mo (Corporate). Supporter+ ($15/mo) get access to a private sponsors space with a monthly newsletter and early release notes. Patron+ ($35/mo) vote on the quarterly roadmap. Sustaining Sponsor+ ($150/mo) get a direct async email line for technical questions (~2-3 business days). Corporate ($300/mo) get priority email response (next business day), README header logo, sitewide footer logo on [bambuddy.cool](https://bambuddy.cool), and [Press page](https://bambuddy.cool/press.html) placement.
-- **[Ko-fi](https://ko-fi.com/maziggy)** — one-time tip or recurring.
-
-Sponsors get listed in [BACKERS.md](BACKERS.md). Need commercial support (SLA, multi-printer consulting)? Email `martin@bambuddy.cool`.
-
----
-
-<p align="center">
-  Made with ❤️ for the 3D printing community
-  <br><br>
-  <a href="https://discord.gg/aFS3ZfScHM">Join our Discord</a> •
-  <a href="https://github.com/maziggy/bambuddy/issues">Report Bug</a> •
-  <a href="https://github.com/maziggy/bambuddy/issues">Request Feature</a> •
-  <a href="http://wiki.bambuddy.cool">Documentation</a>
-</p>

+ 31 - 6
backend/app/services/print_storage.py

@@ -30,12 +30,24 @@ from __future__ import annotations
 
 
 from dataclasses import dataclass
 from dataclasses import dataclass
 
 
-# The one URL scheme that means "on external storage, reachable over FTPS".
-# Anything else -- brtc://emmc today, whatever Bambu ships next -- is somewhere
-# port 990 does not serve. Matching the reachable value rather than the
-# unreachable one is what keeps a new scheme from silently reading as fine.
+# The scheme that means "uploaded to external storage, reachable over FTPS".
+# An unknown scheme -- whatever Bambu ships next -- must not read as fine, so
+# this matches the reachable value rather than the unreachable one.
 _EXTERNAL_STORAGE_SCHEME = "ftp"
 _EXTERNAL_STORAGE_SCHEME = "ftp"
 
 
+# ``file://`` means the file was already on the printer when the print started:
+# a reprint from the touchscreen, from Handy, or a Studio send-to-storage
+# followed by a print. The path says which storage, and only the printer's own
+# internal roots are out of reach of port 990. Measured on an H2D, 2026-08-17:
+# ``file:///media/usb0/foobar.gcode.3mf`` while that exact file was listable and
+# downloadable over FTPS.
+_LOCAL_FILE_SCHEME = "file"
+
+# Internal roots seen in ``file://`` paths. ``/userdata`` is where the model
+# cache lives (``/userdata/model/history/<name>``, confirmed via the printer's
+# own file listing), and port 990 does not serve it.
+_INTERNAL_FILE_PREFIXES = ("/userdata/",)
+
 # Reason slugs. These cross the API into the UI and into the connection
 # Reason slugs. These cross the API into the UI and into the connection
 # diagnostic, so they are part of the contract: the frontend maps each to its
 # diagnostic, so they are part of the contract: the frontend maps each to its
 # own explanation and its own advice. Keep them stable.
 # own explanation and its own advice. Keep them stable.
@@ -68,13 +80,26 @@ def url_is_external_storage(project_url: str | None) -> bool | None:
     # string is not an answer.
     # string is not an answer.
     if not isinstance(project_url, str) or not project_url:
     if not isinstance(project_url, str) or not project_url:
         return None
         return None
-    scheme, separator, _ = project_url.partition("://")
+    scheme, separator, path = project_url.partition("://")
     if not separator:
     if not separator:
         # No scheme at all. Real dispatches always carry one, so rather than
         # No scheme at all. Real dispatches always carry one, so rather than
         # guess at a bare path, decline to answer and let the caller fall
         # guess at a bare path, decline to answer and let the caller fall
         # through to its existing behaviour.
         # through to its existing behaviour.
         return None
         return None
-    return scheme.lower() == _EXTERNAL_STORAGE_SCHEME
+    scheme = scheme.lower()
+    if scheme == _EXTERNAL_STORAGE_SCHEME:
+        return True
+    if scheme == _LOCAL_FILE_SCHEME:
+        # Only a known-internal path is positive evidence of somewhere FTPS
+        # cannot reach. Anything else is unknown, which sweeps -- this module
+        # skips only on positive evidence, and a path we do not recognise is
+        # not that. Returning False here instead is what made a print of a file
+        # sitting on the stick report as internal storage and archive with no
+        # 3MF, when the sweep would have found it immediately.
+        if path.startswith(_INTERNAL_FILE_PREFIXES):
+            return False
+        return None
+    return False
 
 
 
 
 def external_storage_present(state: object | None) -> bool:
 def external_storage_present(state: object | None) -> bool:

+ 65 - 0
backend/tests/unit/test_print_storage_2780.py

@@ -77,6 +77,71 @@ class TestUrlScheme:
         """None is a third answer and must not collapse into False."""
         """None is a third answer and must not collapse into False."""
         assert url_is_external_storage(url) is None
         assert url_is_external_storage(url) is None
 
 
+
+class TestFileScheme:
+    """A print of a file that was already on the printer.
+
+    ``file://`` is what the printer reports for a reprint from its own screen,
+    from Handy, or after a slicer sends to storage and then prints. Measured on
+    an H2D 2026-08-17: ``file:///media/usb0/foobar.gcode.3mf`` while that exact
+    file was listable and downloadable over FTPS. Reading it as internal storage
+    skipped the sweep and produced an archive with no 3MF, for a file sitting
+    right there -- and it did so on every model, not just the H2 series.
+    """
+
+    @pytest.mark.parametrize(
+        "url",
+        [
+            "file:///media/usb0/foobar.gcode.3mf",
+            "file:///media/sdcard/Benchy.gcode.3mf",
+            "file:///media/usb0/timelapse/video.mp4",
+        ],
+    )
+    def test_an_external_mount_is_not_evidence_of_internal_storage(self, url):
+        """None, not True: the path is good reason to look, and looking is what
+        the caller's default already does."""
+        assert url_is_external_storage(url) is None
+
+    def test_the_model_cache_is_internal(self):
+        """``/userdata/model/history/<name>`` is where the printer's own file
+        listing puts cached models, and port 990 does not serve it."""
+        assert url_is_external_storage("file:///userdata/model/history/Cube.gcode.3mf") is False
+
+    def test_an_unrecognised_path_sweeps_rather_than_skips(self):
+        """Skip only on positive evidence -- a path we do not know is not that."""
+        assert url_is_external_storage("file:///somewhere/new/Cube.3mf") is None
+
+    def test_the_sweep_runs_for_a_file_on_the_card(self):
+        """The regression in one assertion."""
+        state = FakeState(
+            current_project_url="file:///media/usb0/foobar.gcode.3mf",
+            sdcard=True,
+            sdcard_reported=True,
+        )
+        assert print_file_reachable_over_ftp(state).reachable is True
+
+    def test_an_empty_slot_still_wins(self):
+        """With nothing in the slot the file cannot be on it, whatever the path
+        says -- and the operator gets the reason they can act on."""
+        state = FakeState(
+            current_project_url="file:///media/usb0/foobar.gcode.3mf",
+            sdcard=False,
+            sdcard_reported=True,
+        )
+        verdict = print_file_reachable_over_ftp(state)
+        assert verdict.reachable is False
+        assert verdict.reason == REASON_NO_EXTERNAL_STORAGE
+
+    def test_the_model_cache_still_skips(self):
+        state = FakeState(
+            current_project_url="file:///userdata/model/history/Cube.gcode.3mf",
+            sdcard=True,
+            sdcard_reported=True,
+        )
+        verdict = print_file_reachable_over_ftp(state)
+        assert verdict.reachable is False
+        assert verdict.reason == REASON_INTERNAL_STORAGE
+
     @pytest.mark.parametrize("url", [12345, [], {}, object()])
     @pytest.mark.parametrize("url", [12345, [], {}, object()])
     def test_a_non_string_url_declines_too(self, url):
     def test_a_non_string_url_declines_too(self, url):
         """The value arrives straight off the wire, so it is whatever the
         """The value arrives straight off the wire, so it is whatever the

+ 2 - 2
frontend/src/i18n/locales/de.ts

@@ -877,7 +877,7 @@ export default {
       docsLink: 'Installationsschritt 4 anzeigen',
       docsLink: 'Installationsschritt 4 anzeigen',
       docsLinkInternalStorage: 'Warum das passiert',
       docsLinkInternalStorage: 'Warum das passiert',
       titleInternalStorage: 'Einige kürzliche Drucke blieben im internen Speicher des Druckers',
       titleInternalStorage: 'Einige kürzliche Drucke blieben im internen Speicher des Druckers',
-      bodyInternalStorage: 'Bambu Studio hat die geslicte Datei im internen Speicher des Druckers statt auf der Karte abgelegt, daher gab es für Bambuddy nichts über FTP zu lesen. Bei der H2-Serie und dem P2S macht Bambu Studio das unabhängig davon, wie "Gesendete Dateien auf externem Speicher speichern" eingestellt ist. Diese Drucke werden weiterhin mit Namen und Zeiten archiviert, nur ohne Vorschaubild und Slicer-Metadaten. Für vollständige Archive den Druck aus Bambuddy starten oder in OrcaSlicer slicen — das lädt immer auf die Karte. Beides setzt eine Karte oder einen Stick im Drucker voraus.',
+      bodyInternalStorage: 'Bambu Studio hat die geslicte Datei im internen Speicher des Druckers statt auf der Karte abgelegt, daher gab es für Bambuddy nichts über FTP zu lesen. Bei der H2-Serie und dem P2S macht die Schaltfläche "Drucken" das immer — nur "Senden" bietet eine Auswahl, und auch die steht standardmäßig auf "Cache". Diese Drucke werden weiterhin mit Namen und Zeiten archiviert, nur ohne Vorschaubild und Slicer-Metadaten. Für vollständige Archive den Druck aus Bambuddy starten oder in OrcaSlicer slicen — oder in Bambu Studio "Senden" mit "Extern" verwenden und den Druck danach starten. Alle setzen eine Karte oder einen Stick im Drucker voraus.',
       titleNoExternalStorage: 'Einige kürzliche Drucke konnten nicht archiviert werden — kein Speicher im Drucker',
       titleNoExternalStorage: 'Einige kürzliche Drucke konnten nicht archiviert werden — kein Speicher im Drucker',
       bodyNoExternalStorage: 'Der Drucker meldet weder Karte noch Stick im Steckplatz, daher hatte die geslicte Datei keinen Ablageort und Bambuddy nichts zu lesen. Legen Sie einen ein, dann wird der nächste Druck vollständig archiviert.',
       bodyNoExternalStorage: 'Der Drucker meldet weder Karte noch Stick im Steckplatz, daher hatte die geslicte Datei keinen Ablageort und Bambuddy nichts zu lesen. Legen Sie einen ein, dann wird der nächste Druck vollständig archiviert.',
       dismissLabel: 'Hinweis schließen',
       dismissLabel: 'Hinweis schließen',
@@ -6803,7 +6803,7 @@ export default {
         skip: 'Nicht geprüft — eine aktive MQTT-Verbindung ist erforderlich. Bei älteren Slicern, in denen diese Einstellung nur im Slicer existiert, meldet sie der Drucker nicht — diese Prüfung besteht auch dann, wenn die Option deaktiviert ist. Prüfen Sie Installationsschritt 4 in diesem Fall manuell.',
         skip: 'Nicht geprüft — eine aktive MQTT-Verbindung ist erforderlich. Bei älteren Slicern, in denen diese Einstellung nur im Slicer existiert, meldet sie der Drucker nicht — diese Prüfung besteht auch dann, wenn die Option deaktiviert ist. Prüfen Sie Installationsschritt 4 in diesem Fall manuell.',
         skip_unsupported_model: 'Dieses Modell hat einen SD-Slot, aber keine Möglichkeit, die Option zu aktivieren — die aktuelle P1-Firmware zeigt den Schalter in Bambu Studio nicht an und der Drucker hat kein Display. Hier gibt es nichts zu beheben; archivierten Drucken fehlen möglicherweise Vorschaubilder und Slicer-Metadaten, bis Bambu Lab dies per Firmware unterstützt.',
         skip_unsupported_model: 'Dieses Modell hat einen SD-Slot, aber keine Möglichkeit, die Option zu aktivieren — die aktuelle P1-Firmware zeigt den Schalter in Bambu Studio nicht an und der Drucker hat kein Display. Hier gibt es nichts zu beheben; archivierten Drucken fehlen möglicherweise Vorschaubilder und Slicer-Metadaten, bis Bambu Lab dies per Firmware unterstützt.',
         fail_no_media: 'Die Option ist aktiviert, aber der Drucker meldet weder Karte noch Stick im Steckplatz, daher können gesendete Dateien nirgends abgelegt werden. Legen Sie einen ein und drucken Sie erneut — bis dahin fehlen jedem archivierten Druck Vorschaubild und Slicer-Metadaten.',
         fail_no_media: 'Die Option ist aktiviert, aber der Drucker meldet weder Karte noch Stick im Steckplatz, daher können gesendete Dateien nirgends abgelegt werden. Legen Sie einen ein und drucken Sie erneut — bis dahin fehlen jedem archivierten Druck Vorschaubild und Slicer-Metadaten.',
-        warn_internal_storage: 'Die Option ist aktiviert und ein Speicher ist vorhanden, aber der letzte Druck landete dennoch im internen Speicher des Druckers, den Bambuddy nicht lesen kann. Bei der H2-Serie und dem P2S macht Bambu Studio das unabhängig von dieser Option. Drucke werden mit Namen und Zeiten archiviert, aber ohne Vorschaubild und Slicer-Metadaten. Für vollständige Archive Drucke aus Bambuddy starten oder in OrcaSlicer slicen — das lädt immer auf den externen Speicher.',
+        warn_internal_storage: 'Die Option ist aktiviert und ein Speicher ist vorhanden, aber der letzte Druck landete dennoch im internen Speicher des Druckers, den Bambuddy nicht lesen kann. Bei der H2-Serie und dem P2S sendet die Schaltfläche "Drucken" in Bambu Studio unabhängig von dieser Option immer dorthin. Drucke werden mit Namen und Zeiten archiviert, aber ohne Vorschaubild und Slicer-Metadaten. Für vollständige Archive den Druck aus Bambuddy starten oder in OrcaSlicer slicen — oder in Bambu Studio "Senden" mit "Extern" verwenden und den Druck danach starten.',
       },
       },
       port_rtsps: {
       port_rtsps: {
         title: 'Kameraport ({{protocol}} {{port}})',
         title: 'Kameraport ({{protocol}} {{port}})',

+ 2 - 2
frontend/src/i18n/locales/en.ts

@@ -883,7 +883,7 @@ export default {
       dismissLabel: 'Dismiss this notice',
       dismissLabel: 'Dismiss this notice',
       docsLinkInternalStorage: 'Why this happens',
       docsLinkInternalStorage: 'Why this happens',
       titleInternalStorage: 'Some recent prints stayed on the printer\'s internal storage',
       titleInternalStorage: 'Some recent prints stayed on the printer\'s internal storage',
-      bodyInternalStorage: 'Bambu Studio put the sliced file on the printer\'s internal storage instead of the card, so there was nothing for Bambuddy to read over FTP. It does this on H2-series and P2S whatever "Store sent files on external storage" is set to. Those prints are still archived with their name and timing, just without a thumbnail or slicer metadata. For complete archives, start the print from Bambuddy, or slice in OrcaSlicer — it always uploads to the card. Both need a card or stick in the printer.',
+      bodyInternalStorage: 'Bambu Studio put the sliced file on the printer\'s internal storage instead of the card, so there was nothing for Bambuddy to read over FTP. On H2-series and P2S its Print button always does that — only Send offers a choice, and that defaults to Cache too. Those prints are still archived with their name and timing, just without a thumbnail or slicer metadata. For complete archives, start the print from Bambuddy, or slice in OrcaSlicer — or in Bambu Studio use Send with External selected and start the print afterwards. All of them need a card or stick in the printer.',
       titleNoExternalStorage: 'Some recent prints couldn\'t be archived — no storage in the printer',
       titleNoExternalStorage: 'Some recent prints couldn\'t be archived — no storage in the printer',
       bodyNoExternalStorage: 'The printer reports no card or stick in its slot, so the sliced file had nowhere to land and Bambuddy had nothing to read. Insert one and the next print will archive in full.',
       bodyNoExternalStorage: 'The printer reports no card or stick in its slot, so the sliced file had nowhere to land and Bambuddy had nothing to read. Insert one and the next print will archive in full.',
     },
     },
@@ -6853,7 +6853,7 @@ export default {
         skip: 'Not checked — needs a live MQTT connection. On older slicers where this setting lives only in the slicer the printer never reports it, so this check will pass even when the option is off — verify install step 4 manually.',
         skip: 'Not checked — needs a live MQTT connection. On older slicers where this setting lives only in the slicer the printer never reports it, so this check will pass even when the option is off — verify install step 4 manually.',
         skip_unsupported_model: 'This model has an SD slot but no way to turn the option on — current P1-series firmware doesn\'t expose the toggle in Bambu Studio and the printer has no screen. Nothing to fix here; archived prints may lack thumbnails and slicer metadata until Bambu Lab adds firmware support.',
         skip_unsupported_model: 'This model has an SD slot but no way to turn the option on — current P1-series firmware doesn\'t expose the toggle in Bambu Studio and the printer has no screen. Nothing to fix here; archived prints may lack thumbnails and slicer metadata until Bambu Lab adds firmware support.',
         fail_no_media: 'The option is on, but the printer reports no card or stick in its slot, so there is nowhere for sent files to go. Insert one and print again — until then every archived print will be missing its thumbnail and slicer metadata.',
         fail_no_media: 'The option is on, but the printer reports no card or stick in its slot, so there is nowhere for sent files to go. Insert one and print again — until then every archived print will be missing its thumbnail and slicer metadata.',
-        warn_internal_storage: 'The option is on and storage is present, but the last print still went to the printer\'s internal storage, which Bambuddy cannot read. Bambu Studio does this on H2-series and P2S whatever this option is set to. Prints archive with their name and timing, but without a thumbnail or slicer metadata. For complete archives, start prints from Bambuddy, or slice in OrcaSlicer — it always uploads to external storage.',
+        warn_internal_storage: 'The option is on and storage is present, but the last print still went to the printer\'s internal storage, which Bambuddy cannot read. On H2-series and P2S, Bambu Studio\'s Print button always sends there whatever this option is set to. Prints archive with their name and timing, but without a thumbnail or slicer metadata. For complete archives, start prints from Bambuddy or slice in OrcaSlicer — or in Bambu Studio use Send with External selected, then start the print.',
       },
       },
       port_rtsps: {
       port_rtsps: {
         title: 'Camera port ({{protocol}} {{port}})',
         title: 'Camera port ({{protocol}} {{port}})',

+ 2 - 2
frontend/src/i18n/locales/es.ts

@@ -877,7 +877,7 @@ export default {
       docsLink: 'Ver paso 4 de instalación',
       docsLink: 'Ver paso 4 de instalación',
       docsLinkInternalStorage: 'Por qué ocurre',
       docsLinkInternalStorage: 'Por qué ocurre',
       titleInternalStorage: 'Algunas impresiones recientes se quedaron en el almacenamiento interno de la impresora',
       titleInternalStorage: 'Algunas impresiones recientes se quedaron en el almacenamiento interno de la impresora',
-      bodyInternalStorage: 'Bambu Studio guardó el archivo laminado en el almacenamiento interno de la impresora en lugar de la tarjeta, así que Bambuddy no tenía nada que leer por FTP. En la serie H2 y la P2S lo hace independientemente de cómo esté «Guardar archivos enviados en almacenamiento externo». Esas impresiones se siguen archivando con su nombre y sus tiempos, solo que sin miniatura ni metadatos del laminador. Para archivos completos, inicia la impresión desde Bambuddy o lamina en OrcaSlicer — siempre sube a la tarjeta. Ambas opciones requieren una tarjeta o memoria en la impresora.',
+      bodyInternalStorage: 'Bambu Studio guardó el archivo laminado en el almacenamiento interno de la impresora en lugar de la tarjeta, así que Bambuddy no tenía nada que leer por FTP. En la serie H2 y la P2S su botón «Imprimir» siempre lo hace: solo «Enviar» ofrece elección, y también viene con «Caché» por defecto. Esas impresiones se siguen archivando con su nombre y sus tiempos, solo que sin miniatura ni metadatos del laminador. Para archivos completos, inicia la impresión desde Bambuddy o lamina en OrcaSlicer, o bien en Bambu Studio usa «Enviar» con «Externo» y luego inicia la impresión. Todas requieren una tarjeta o memoria en la impresora.',
       titleNoExternalStorage: 'Algunas impresiones recientes no se pudieron archivar — no hay almacenamiento en la impresora',
       titleNoExternalStorage: 'Algunas impresiones recientes no se pudieron archivar — no hay almacenamiento en la impresora',
       bodyNoExternalStorage: 'La impresora no detecta ninguna tarjeta ni memoria en su ranura, así que el archivo laminado no tenía dónde aterrizar y Bambuddy nada que leer. Inserte una y la próxima impresión se archivará por completo.',
       bodyNoExternalStorage: 'La impresora no detecta ninguna tarjeta ni memoria en su ranura, así que el archivo laminado no tenía dónde aterrizar y Bambuddy nada que leer. Inserte una y la próxima impresión se archivará por completo.',
       dismissLabel: 'Descartar este aviso',
       dismissLabel: 'Descartar este aviso',
@@ -6811,7 +6811,7 @@ export default {
         skip: 'No comprobado — se necesita una conexión MQTT activa. En slicers más antiguos donde este ajuste solo existe en el slicer, la impresora no lo reporta, así que esta comprobación pasa aunque la opción esté desactivada — verifique el paso 4 de la instalación manualmente.',
         skip: 'No comprobado — se necesita una conexión MQTT activa. En slicers más antiguos donde este ajuste solo existe en el slicer, la impresora no lo reporta, así que esta comprobación pasa aunque la opción esté desactivada — verifique el paso 4 de la instalación manualmente.',
         skip_unsupported_model: 'Este modelo tiene ranura SD pero no hay forma de activar la opción — el firmware actual de la serie P1 no muestra el interruptor en Bambu Studio y la impresora no tiene pantalla. Aquí no hay nada que arreglar; a las impresiones archivadas pueden faltarles miniaturas y metadatos del slicer hasta que Bambu Lab lo admita por firmware.',
         skip_unsupported_model: 'Este modelo tiene ranura SD pero no hay forma de activar la opción — el firmware actual de la serie P1 no muestra el interruptor en Bambu Studio y la impresora no tiene pantalla. Aquí no hay nada que arreglar; a las impresiones archivadas pueden faltarles miniaturas y metadatos del slicer hasta que Bambu Lab lo admita por firmware.',
         fail_no_media: 'La opción está activada, pero la impresora no detecta ninguna tarjeta ni memoria en su ranura, así que los archivos enviados no tienen dónde ir. Inserte una e imprima de nuevo — hasta entonces, cada impresión archivada carecerá de miniatura y de metadatos del laminador.',
         fail_no_media: 'La opción está activada, pero la impresora no detecta ninguna tarjeta ni memoria en su ranura, así que los archivos enviados no tienen dónde ir. Inserte una e imprima de nuevo — hasta entonces, cada impresión archivada carecerá de miniatura y de metadatos del laminador.',
-        warn_internal_storage: 'La opción está activada y hay almacenamiento presente, pero la última impresión aun así fue al almacenamiento interno de la impresora, que Bambuddy no puede leer. En la serie H2 y la P2S, Bambu Studio lo hace independientemente de este ajuste. Las impresiones se archivan con su nombre y sus tiempos, pero sin miniatura ni metadatos del laminador. Para archivos completos, inicia las impresiones desde Bambuddy o lamina en OrcaSlicer — siempre sube al almacenamiento externo.',
+        warn_internal_storage: 'La opción está activada y hay almacenamiento presente, pero la última impresión aun así fue al almacenamiento interno de la impresora, que Bambuddy no puede leer. En la serie H2 y la P2S, el botón «Imprimir» de Bambu Studio siempre envía ahí, sea cual sea este ajuste. Las impresiones se archivan con su nombre y sus tiempos, pero sin miniatura ni metadatos del laminador. Para archivos completos, inicia las impresiones desde Bambuddy o lamina en OrcaSlicer, o bien en Bambu Studio usa «Enviar» con «Externo» y luego inicia la impresión.',
       },
       },
       port_rtsps: {
       port_rtsps: {
         title: 'Puerto de la cámara ({{protocol}} {{port}})',
         title: 'Puerto de la cámara ({{protocol}} {{port}})',

+ 2 - 2
frontend/src/i18n/locales/fr.ts

@@ -877,7 +877,7 @@ export default {
       docsLink: 'Voir l\'étape 4 de l\'installation',
       docsLink: 'Voir l\'étape 4 de l\'installation',
       docsLinkInternalStorage: 'Pourquoi cela arrive',
       docsLinkInternalStorage: 'Pourquoi cela arrive',
       titleInternalStorage: 'Certaines impressions récentes sont restées dans le stockage interne de l\'imprimante',
       titleInternalStorage: 'Certaines impressions récentes sont restées dans le stockage interne de l\'imprimante',
-      bodyInternalStorage: 'Bambu Studio a placé le fichier tranché dans le stockage interne de l\'imprimante au lieu de la carte, Bambuddy n\'avait donc rien à lire en FTP. Sur les séries H2 et P2S, il le fait quel que soit le réglage « Stocker les fichiers envoyés sur stockage externe ». Ces impressions restent archivées avec leur nom et leurs durées, simplement sans miniature ni métadonnées slicer. Pour des archives complètes, lancez l\'impression depuis Bambuddy ou tranchez dans OrcaSlicer — il envoie toujours sur la carte. Les deux nécessitent une carte ou une clé dans l\'imprimante.',
+      bodyInternalStorage: 'Bambu Studio a placé le fichier tranché dans le stockage interne de l\'imprimante au lieu de la carte, Bambuddy n\'avait donc rien à lire en FTP. Sur les séries H2 et P2S, son bouton « Imprimer » le fait toujours : seul « Envoyer » propose un choix, et il est lui aussi réglé sur « Cache » par défaut. Ces impressions restent archivées avec leur nom et leurs durées, simplement sans miniature ni métadonnées slicer. Pour des archives complètes, lancez l\'impression depuis Bambuddy ou tranchez dans OrcaSlicer, ou bien dans Bambu Studio utilisez « Envoyer » avec « Externe » puis lancez l\'impression. Toutes nécessitent une carte ou une clé dans l\'imprimante.',
       titleNoExternalStorage: 'Certaines impressions récentes n\'ont pas pu être archivées — aucun stockage dans l\'imprimante',
       titleNoExternalStorage: 'Certaines impressions récentes n\'ont pas pu être archivées — aucun stockage dans l\'imprimante',
       bodyNoExternalStorage: 'L\'imprimante ne signale ni carte ni clé dans son emplacement, le fichier tranché n\'avait donc nulle part où atterrir et Bambuddy rien à lire. Insérez-en une et la prochaine impression sera archivée complètement.',
       bodyNoExternalStorage: 'L\'imprimante ne signale ni carte ni clé dans son emplacement, le fichier tranché n\'avait donc nulle part où atterrir et Bambuddy rien à lire. Insérez-en une et la prochaine impression sera archivée complètement.',
       dismissLabel: 'Ignorer ce message',
       dismissLabel: 'Ignorer ce message',
@@ -6793,7 +6793,7 @@ export default {
         skip: 'Non vérifié — une connexion MQTT active est requise. Sur les slicers plus anciens où ce paramètre n\'existe que dans le slicer, l\'imprimante ne le signale pas, donc cette vérification passe même si l\'option est désactivée — vérifiez l\'étape 4 de l\'installation manuellement.',
         skip: 'Non vérifié — une connexion MQTT active est requise. Sur les slicers plus anciens où ce paramètre n\'existe que dans le slicer, l\'imprimante ne le signale pas, donc cette vérification passe même si l\'option est désactivée — vérifiez l\'étape 4 de l\'installation manuellement.',
         skip_unsupported_model: 'Ce modèle a un emplacement SD mais aucun moyen d\'activer l\'option — le firmware actuel de la série P1 n\'affiche pas le bouton dans Bambu Studio et l\'imprimante n\'a pas d\'écran. Il n\'y a rien à corriger ici ; les impressions archivées peuvent manquer de miniatures et de métadonnées du slicer jusqu\'à ce que Bambu Lab l\'ajoute par firmware.',
         skip_unsupported_model: 'Ce modèle a un emplacement SD mais aucun moyen d\'activer l\'option — le firmware actuel de la série P1 n\'affiche pas le bouton dans Bambu Studio et l\'imprimante n\'a pas d\'écran. Il n\'y a rien à corriger ici ; les impressions archivées peuvent manquer de miniatures et de métadonnées du slicer jusqu\'à ce que Bambu Lab l\'ajoute par firmware.',
         fail_no_media: 'L\'option est activée, mais l\'imprimante ne signale ni carte ni clé dans son emplacement : les fichiers envoyés n\'ont nulle part où aller. Insérez-en une et relancez une impression — d\'ici là, chaque impression archivée sera dépourvue de miniature et de métadonnées slicer.',
         fail_no_media: 'L\'option est activée, mais l\'imprimante ne signale ni carte ni clé dans son emplacement : les fichiers envoyés n\'ont nulle part où aller. Insérez-en une et relancez une impression — d\'ici là, chaque impression archivée sera dépourvue de miniature et de métadonnées slicer.',
-        warn_internal_storage: 'L\'option est activée et un stockage est présent, mais la dernière impression est tout de même allée dans le stockage interne de l\'imprimante, que Bambuddy ne peut pas lire. Sur les séries H2 et P2S, Bambu Studio le fait quel que soit ce réglage. Les impressions sont archivées avec leur nom et leurs durées, mais sans miniature ni métadonnées slicer. Pour des archives complètes, lancez les impressions depuis Bambuddy ou tranchez dans OrcaSlicer — il envoie toujours sur le stockage externe.',
+        warn_internal_storage: 'L\'option est activée et un stockage est présent, mais la dernière impression est tout de même allée dans le stockage interne de l\'imprimante, que Bambuddy ne peut pas lire. Sur les séries H2 et P2S, le bouton « Imprimer » de Bambu Studio y envoie toujours, quel que soit ce réglage. Les impressions sont archivées avec leur nom et leurs durées, mais sans miniature ni métadonnées slicer. Pour des archives complètes, lancez les impressions depuis Bambuddy ou tranchez dans OrcaSlicer, ou bien dans Bambu Studio utilisez « Envoyer » avec « Externe » puis lancez l\'impression.',
       },
       },
       port_rtsps: {
       port_rtsps: {
         title: 'Port caméra ({{protocol}} {{port}})',
         title: 'Port caméra ({{protocol}} {{port}})',

+ 2 - 2
frontend/src/i18n/locales/it.ts

@@ -877,7 +877,7 @@ export default {
       docsLink: 'Vedi passo 4 dell\'installazione',
       docsLink: 'Vedi passo 4 dell\'installazione',
       docsLinkInternalStorage: 'Perché succede',
       docsLinkInternalStorage: 'Perché succede',
       titleInternalStorage: 'Alcune stampe recenti sono rimaste nella memoria interna della stampante',
       titleInternalStorage: 'Alcune stampe recenti sono rimaste nella memoria interna della stampante',
-      bodyInternalStorage: 'Bambu Studio ha messo il file elaborato nella memoria interna della stampante anziché sulla scheda, quindi Bambuddy non aveva nulla da leggere via FTP. Sulla serie H2 e sulla P2S lo fa a prescindere da come è impostato «Salva i file inviati su memoria esterna». Quelle stampe restano archiviate con nome e tempi, solo senza miniatura né metadati dello slicer. Per archivi completi, avvia la stampa da Bambuddy oppure elabora in OrcaSlicer — carica sempre sulla scheda. Entrambe richiedono una scheda o una chiavetta nella stampante.',
+      bodyInternalStorage: 'Bambu Studio ha messo il file elaborato nella memoria interna della stampante anziché sulla scheda, quindi Bambuddy non aveva nulla da leggere via FTP. Sulla serie H2 e sulla P2S il pulsante «Stampa» lo fa sempre: solo «Invia» offre una scelta, e anche quella è impostata su «Cache». Quelle stampe restano archiviate con nome e tempi, solo senza miniatura né metadati dello slicer. Per archivi completi, avvia la stampa da Bambuddy oppure elabora in OrcaSlicer, oppure in Bambu Studio usa «Invia» con «Esterna» e avvia la stampa dopo. Tutte richiedono una scheda o una chiavetta nella stampante.',
       titleNoExternalStorage: 'Alcune stampe recenti non sono state archiviate — nessuna memoria nella stampante',
       titleNoExternalStorage: 'Alcune stampe recenti non sono state archiviate — nessuna memoria nella stampante',
       bodyNoExternalStorage: 'La stampante non rileva né scheda né chiavetta nel suo slot, quindi il file elaborato non aveva dove finire e Bambuddy nulla da leggere. Inseriscine una e la prossima stampa verrà archiviata per intero.',
       bodyNoExternalStorage: 'La stampante non rileva né scheda né chiavetta nel suo slot, quindi il file elaborato non aveva dove finire e Bambuddy nulla da leggere. Inseriscine una e la prossima stampa verrà archiviata per intero.',
       dismissLabel: 'Chiudi questo avviso',
       dismissLabel: 'Chiudi questo avviso',
@@ -6792,7 +6792,7 @@ export default {
         skip: 'Non verificato — è necessaria una connessione MQTT attiva. Negli slicer più vecchi dove questa impostazione esiste solo nello slicer, la stampante non la segnala, quindi questo controllo passa anche se l\'opzione è disattivata — verifica manualmente il passo 4 dell\'installazione.',
         skip: 'Non verificato — è necessaria una connessione MQTT attiva. Negli slicer più vecchi dove questa impostazione esiste solo nello slicer, la stampante non la segnala, quindi questo controllo passa anche se l\'opzione è disattivata — verifica manualmente il passo 4 dell\'installazione.',
         skip_unsupported_model: 'Questo modello ha uno slot SD ma nessun modo per attivare l\'opzione — il firmware attuale della serie P1 non mostra l\'interruttore in Bambu Studio e la stampante non ha uno schermo. Non c\'è nulla da correggere qui; alle stampe archiviate potrebbero mancare miniature e metadati dello slicer finché Bambu Lab non aggiungerà il supporto via firmware.',
         skip_unsupported_model: 'Questo modello ha uno slot SD ma nessun modo per attivare l\'opzione — il firmware attuale della serie P1 non mostra l\'interruttore in Bambu Studio e la stampante non ha uno schermo. Non c\'è nulla da correggere qui; alle stampe archiviate potrebbero mancare miniature e metadati dello slicer finché Bambu Lab non aggiungerà il supporto via firmware.',
         fail_no_media: 'L\'opzione è attiva, ma la stampante non rileva né scheda né chiavetta nel suo slot, quindi i file inviati non hanno dove andare. Inseriscine una e stampa di nuovo — fino ad allora ogni stampa archiviata sarà priva di miniatura e metadati dello slicer.',
         fail_no_media: 'L\'opzione è attiva, ma la stampante non rileva né scheda né chiavetta nel suo slot, quindi i file inviati non hanno dove andare. Inseriscine una e stampa di nuovo — fino ad allora ogni stampa archiviata sarà priva di miniatura e metadati dello slicer.',
-        warn_internal_storage: 'L\'opzione è attiva ed è presente una memoria, ma l\'ultima stampa è comunque finita nella memoria interna della stampante, che Bambuddy non può leggere. Sulla serie H2 e sulla P2S Bambu Studio lo fa a prescindere da questa opzione. Le stampe vengono archiviate con nome e tempi, ma senza miniatura né metadati dello slicer. Per archivi completi, avvia le stampe da Bambuddy oppure elabora in OrcaSlicer — carica sempre sulla memoria esterna.',
+        warn_internal_storage: 'L\'opzione è attiva ed è presente una memoria, ma l\'ultima stampa è comunque finita nella memoria interna della stampante, che Bambuddy non può leggere. Sulla serie H2 e sulla P2S il pulsante «Stampa» di Bambu Studio invia sempre lì, a prescindere da questa opzione. Le stampe vengono archiviate con nome e tempi, ma senza miniatura né metadati dello slicer. Per archivi completi, avvia le stampe da Bambuddy oppure elabora in OrcaSlicer, oppure in Bambu Studio usa «Invia» con «Esterna» e avvia la stampa dopo.',
       },
       },
       port_rtsps: {
       port_rtsps: {
         title: 'Porta fotocamera ({{protocol}} {{port}})',
         title: 'Porta fotocamera ({{protocol}} {{port}})',

+ 2 - 2
frontend/src/i18n/locales/ja.ts

@@ -876,7 +876,7 @@ export default {
       docsLink: 'インストール手順4を参照',
       docsLink: 'インストール手順4を参照',
       docsLinkInternalStorage: '原因について',
       docsLinkInternalStorage: '原因について',
       titleInternalStorage: '最近の一部の印刷はプリンターの内部ストレージに残りました',
       titleInternalStorage: '最近の一部の印刷はプリンターの内部ストレージに残りました',
-      bodyInternalStorage: 'Bambu Studio がスライス済みファイルをカードではなくプリンターの内部ストレージに保存したため、Bambuddy が FTP で読み取れるものがありませんでした。H2 シリーズと P2S では、「送信ファイルを外部ストレージに保存」の設定に関係なくこの動作になります。これらの印刷は名前と時間付きでアーカイブされますが、サムネイルとスライサーのメタデータはありません。完全なアーカイブを残すには、Bambuddy から印刷を開始するか、OrcaSlicer でスライスしてください。OrcaSlicer は常にカードにアップロードします。どちらの場合もプリンターにカードまたは USB メモリーが必要です。',
+      bodyInternalStorage: 'Bambu Studio がスライス済みファイルをカードではなくプリンターの内部ストレージに保存したため、Bambuddy が FTP で読み取れるものがありませんでした。H2 シリーズと P2S では「印刷」ボタンは常にそうなり、選択できるのは「送信」だけで、そちらも既定は「キャッシュ」です。これらの印刷は名前と時間付きでアーカイブされますが、サムネイルとスライサーのメタデータはありません。完全なアーカイブを残すには、Bambuddy から印刷を開始するか、OrcaSlicer でスライスしてください。Bambu Studio を使う場合は「送信」で「外部ストレージ」を選び、その後に印刷を開始します。いずれもプリンターにカードまたは USB メモリーが必要です。',
       titleNoExternalStorage: '最近の一部の印刷をアーカイブできませんでした — プリンターにストレージがありません',
       titleNoExternalStorage: '最近の一部の印刷をアーカイブできませんでした — プリンターにストレージがありません',
       bodyNoExternalStorage: 'プリンターのスロットにカードもUSBメモリも検出されないため、スライス済みファイルの保存先がなく、Bambuddyが読み取るものもありませんでした。挿入すれば次の印刷は完全にアーカイブされます。',
       bodyNoExternalStorage: 'プリンターのスロットにカードもUSBメモリも検出されないため、スライス済みファイルの保存先がなく、Bambuddyが読み取るものもありませんでした。挿入すれば次の印刷は完全にアーカイブされます。',
       dismissLabel: 'この通知を閉じる',
       dismissLabel: 'この通知を閉じる',
@@ -6804,7 +6804,7 @@ export default {
         skip: '未確認 — アクティブなMQTT接続が必要です。古いスライサーでこの設定がスライサー側のみに存在する場合、プリンターはそれを報告しないため、オプションが無効でもこのチェックは通過します — インストール手順4を手動で確認してください。',
         skip: '未確認 — アクティブなMQTT接続が必要です。古いスライサーでこの設定がスライサー側のみに存在する場合、プリンターはそれを報告しないため、オプションが無効でもこのチェックは通過します — インストール手順4を手動で確認してください。',
         skip_unsupported_model: 'このモデルにはSDスロットがありますが、オプションを有効にする方法がありません — 現在のP1シリーズのファームウェアはBambu Studioにトグルを表示せず、プリンターに画面もありません。ここで修正すべきことはありません。Bambu Labがファームウェアで対応するまで、アーカイブされた印刷にはサムネイルやスライサーのメタデータが欠ける場合があります。',
         skip_unsupported_model: 'このモデルにはSDスロットがありますが、オプションを有効にする方法がありません — 現在のP1シリーズのファームウェアはBambu Studioにトグルを表示せず、プリンターに画面もありません。ここで修正すべきことはありません。Bambu Labがファームウェアで対応するまで、アーカイブされた印刷にはサムネイルやスライサーのメタデータが欠ける場合があります。',
         fail_no_media: 'オプションは有効ですが、プリンターのスロットにカードもUSBメモリも検出されないため、送信ファイルの保存先がありません。挿入して再度印刷してください。それまでアーカイブされる印刷にはサムネイルとスライサーメタデータがありません。',
         fail_no_media: 'オプションは有効ですが、プリンターのスロットにカードもUSBメモリも検出されないため、送信ファイルの保存先がありません。挿入して再度印刷してください。それまでアーカイブされる印刷にはサムネイルとスライサーメタデータがありません。',
-        warn_internal_storage: 'オプションは有効でストレージも装着されていますが、直近の印刷は Bambuddy が読み取れないプリンターの内部ストレージに保存されました。H2 シリーズと P2S では、この設定に関係なく Bambu Studio がそのように動作します。印刷は名前と時間付きでアーカイブされますが、サムネイルとスライサーのメタデータはありません。完全なアーカイブを残すには、Bambuddy から印刷を開始するか、OrcaSlicer でスライスしてください。OrcaSlicer は常に外部ストレージにアップロードします。',
+        warn_internal_storage: 'オプションは有効でストレージも装着されていますが、直近の印刷は Bambuddy が読み取れないプリンターの内部ストレージに保存されました。H2 シリーズと P2S では、この設定に関係なく Bambu Studio の「印刷」ボタンは常にそちらへ送信します。印刷は名前と時間付きでアーカイブされますが、サムネイルとスライサーのメタデータはありません。完全なアーカイブを残すには、Bambuddy から印刷を開始するか、OrcaSlicer でスライスするか、Bambu Studio で「送信」から「外部ストレージ」を選んだあとに印刷を開始してください。',
       },
       },
       port_rtsps: {
       port_rtsps: {
         title: 'カメラポート ({{protocol}} {{port}})',
         title: 'カメラポート ({{protocol}} {{port}})',

+ 2 - 2
frontend/src/i18n/locales/ko.ts

@@ -833,7 +833,7 @@ export default {
       docsLink: '설치 단계 4 보기',
       docsLink: '설치 단계 4 보기',
       docsLinkInternalStorage: '왜 이런 일이 생기나요',
       docsLinkInternalStorage: '왜 이런 일이 생기나요',
       titleInternalStorage: '최근 일부 출력물이 프린터 내부 저장소에 남았습니다',
       titleInternalStorage: '최근 일부 출력물이 프린터 내부 저장소에 남았습니다',
-      bodyInternalStorage: '슬라이싱된 파일을 Bambu Studio가 카드가 아니라 프린터 내부 저장소에 저장해서 Bambuddy가 FTP로 읽을 것이 없었습니다. H2 시리즈와 P2S에서는 «보낸 파일을 외부 저장소에 저장» 설정과 관계없이 이렇게 동작합니다. 해당 출력물은 이름과 시간과 함께 계속 보관되지만 썸네일과 슬라이서 메타데이터는 없습니다. 완전한 기록을 남기려면 Bambuddy에서 출력을 시작하거나 OrcaSlicer로 슬라이싱하세요. OrcaSlicer는 항상 카드에 업로드합니다. 두 방법 모두 프린터에 카드나 USB 메모리가 필요합니다.',
+      bodyInternalStorage: '슬라이싱된 파일을 Bambu Studio가 카드가 아니라 프린터 내부 저장소에 저장해서 Bambuddy가 FTP로 읽을 것이 없었습니다. H2 시리즈와 P2S에서는 «인쇄» 버튼이 항상 그렇게 동작하며, 선택할 수 있는 것은 «보내기»뿐인데 그것도 기본값이 «캐시»입니다. 해당 출력물은 이름과 시간과 함께 계속 보관되지만 썸네일과 슬라이서 메타데이터는 없습니다. 완전한 기록을 남기려면 Bambuddy에서 출력을 시작하거나 OrcaSlicer로 슬라이싱하세요. Bambu Studio를 쓴다면 «보내기»에서 «외부 저장소»를 고른 뒤 출력을 시작하면 됩니다. 모두 프린터에 카드나 USB 메모리가 필요합니다.',
       titleNoExternalStorage: '최근 일부 출력물을 보관하지 못했습니다 — 프린터에 저장소가 없습니다',
       titleNoExternalStorage: '최근 일부 출력물을 보관하지 못했습니다 — 프린터에 저장소가 없습니다',
       bodyNoExternalStorage: '프린터 슬롯에 카드도 USB도 감지되지 않아 슬라이싱된 파일이 저장될 곳이 없었고 Bambuddy가 읽을 것도 없었습니다. 하나 넣으면 다음 출력물은 온전히 보관됩니다.',
       bodyNoExternalStorage: '프린터 슬롯에 카드도 USB도 감지되지 않아 슬라이싱된 파일이 저장될 곳이 없었고 Bambuddy가 읽을 것도 없었습니다. 하나 넣으면 다음 출력물은 온전히 보관됩니다.',
       dismissLabel: '이 알림 닫기'
       dismissLabel: '이 알림 닫기'
@@ -6904,7 +6904,7 @@ export default {
         skip: '확인되지 않음 — 활성 MQTT 연결이 필요합니다. 이 설정이 슬라이서에만 존재하는 이전 슬라이서에서는 프린터가 보고하지 않으므로, 옵션이 꺼져 있어도 이 검사는 통과합니다 — 설치 단계 4를 수동으로 확인하세요.',
         skip: '확인되지 않음 — 활성 MQTT 연결이 필요합니다. 이 설정이 슬라이서에만 존재하는 이전 슬라이서에서는 프린터가 보고하지 않으므로, 옵션이 꺼져 있어도 이 검사는 통과합니다 — 설치 단계 4를 수동으로 확인하세요.',
         skip_unsupported_model: '이 모델에는 SD 슬롯이 있지만 옵션을 켤 방법이 없습니다 — 현재 P1 시리즈 펌웨어는 Bambu Studio에 토글을 표시하지 않으며 프린터에 화면도 없습니다. 여기서 고칠 것은 없습니다. Bambu Lab이 펌웨어로 지원할 때까지 보관된 출력물에는 썸네일과 슬라이서 메타데이터가 없을 수 있습니다.',
         skip_unsupported_model: '이 모델에는 SD 슬롯이 있지만 옵션을 켤 방법이 없습니다 — 현재 P1 시리즈 펌웨어는 Bambu Studio에 토글을 표시하지 않으며 프린터에 화면도 없습니다. 여기서 고칠 것은 없습니다. Bambu Lab이 펌웨어로 지원할 때까지 보관된 출력물에는 썸네일과 슬라이서 메타데이터가 없을 수 있습니다.',
         fail_no_media: '옵션은 켜져 있지만 프린터 슬롯에 카드도 USB도 감지되지 않아 보낸 파일이 갈 곳이 없습니다. 하나 넣고 다시 출력하세요. 그전까지는 보관되는 모든 출력물에 썸네일과 슬라이서 메타데이터가 없습니다.',
         fail_no_media: '옵션은 켜져 있지만 프린터 슬롯에 카드도 USB도 감지되지 않아 보낸 파일이 갈 곳이 없습니다. 하나 넣고 다시 출력하세요. 그전까지는 보관되는 모든 출력물에 썸네일과 슬라이서 메타데이터가 없습니다.',
-        warn_internal_storage: '옵션이 켜져 있고 저장소도 있지만 마지막 출력물은 Bambuddy가 읽을 수 없는 프린터 내부 저장소에 저장되었습니다. H2 시리즈와 P2S에서는 이 설정과 관계없이 Bambu Studio가 이렇게 동작합니다. 출력물은 이름과 시간과 함께 보관되지만 썸네일과 슬라이서 메타데이터는 없습니다. 완전한 기록을 남기려면 Bambuddy에서 출력을 시작하거나 OrcaSlicer로 슬라이싱하세요. OrcaSlicer는 항상 외부 저장소에 업로드합니다.',
+        warn_internal_storage: '옵션이 켜져 있고 저장소도 있지만 마지막 출력물은 Bambuddy가 읽을 수 없는 프린터 내부 저장소에 저장되었습니다. H2 시리즈와 P2S에서는 이 설정과 관계없이 Bambu Studio의 «인쇄» 버튼이 항상 그쪽으로 보냅니다. 출력물은 이름과 시간과 함께 보관되지만 썸네일과 슬라이서 메타데이터는 없습니다. 완전한 기록을 남기려면 Bambuddy에서 출력을 시작하거나, OrcaSlicer로 슬라이싱하거나, Bambu Studio에서 «보내기»로 «외부 저장소»를 고른 뒤 출력을 시작하세요.',
       },
       },
       port_rtsps: {
       port_rtsps: {
         title: '카메라 포트 ({{protocol}} {{port}})',
         title: '카메라 포트 ({{protocol}} {{port}})',

+ 2 - 2
frontend/src/i18n/locales/pt-BR.ts

@@ -877,7 +877,7 @@ export default {
       docsLink: 'Ver passo 4 da instalação',
       docsLink: 'Ver passo 4 da instalação',
       docsLinkInternalStorage: 'Por que isso acontece',
       docsLinkInternalStorage: 'Por que isso acontece',
       titleInternalStorage: 'Algumas impressões recentes ficaram no armazenamento interno da impressora',
       titleInternalStorage: 'Algumas impressões recentes ficaram no armazenamento interno da impressora',
-      bodyInternalStorage: 'O Bambu Studio colocou o arquivo fatiado no armazenamento interno da impressora em vez do cartão, então o Bambuddy não tinha nada para ler via FTP. Na série H2 e na P2S ele faz isso independentemente de como «Armazenar arquivos enviados em armazenamento externo» esteja configurado. Essas impressões continuam arquivadas com nome e tempos, apenas sem miniatura nem metadados do fatiador. Para arquivos completos, inicie a impressão pelo Bambuddy ou fatie no OrcaSlicer — ele sempre envia para o cartão. Ambos precisam de um cartão ou pendrive na impressora.',
+      bodyInternalStorage: 'O Bambu Studio colocou o arquivo fatiado no armazenamento interno da impressora em vez do cartão, então o Bambuddy não tinha nada para ler via FTP. Na série H2 e na P2S o botão «Imprimir» sempre faz isso: só «Enviar» oferece escolha, e ela também vem com «Cache» por padrão. Essas impressões continuam arquivadas com nome e tempos, apenas sem miniatura nem metadados do fatiador. Para arquivos completos, inicie a impressão pelo Bambuddy ou fatie no OrcaSlicer, ou então no Bambu Studio use «Enviar» com «Externo» e inicie a impressão depois. Todos precisam de um cartão ou pendrive na impressora.',
       titleNoExternalStorage: 'Algumas impressões recentes não puderam ser arquivadas — sem armazenamento na impressora',
       titleNoExternalStorage: 'Algumas impressões recentes não puderam ser arquivadas — sem armazenamento na impressora',
       bodyNoExternalStorage: 'A impressora não detecta cartão nem pendrive no slot, então o arquivo fatiado não tinha onde ficar e o Bambuddy nada para ler. Insira um e a próxima impressão será arquivada por completo.',
       bodyNoExternalStorage: 'A impressora não detecta cartão nem pendrive no slot, então o arquivo fatiado não tinha onde ficar e o Bambuddy nada para ler. Insira um e a próxima impressão será arquivada por completo.',
       dismissLabel: 'Dispensar este aviso',
       dismissLabel: 'Dispensar este aviso',
@@ -6792,7 +6792,7 @@ export default {
         skip: 'Não verificado — é necessária uma conexão MQTT ativa. Em fatiadores mais antigos onde essa configuração existe apenas no fatiador, a impressora não a reporta, então esta verificação passa mesmo com a opção desligada — verifique o passo 4 da instalação manualmente.',
         skip: 'Não verificado — é necessária uma conexão MQTT ativa. Em fatiadores mais antigos onde essa configuração existe apenas no fatiador, a impressora não a reporta, então esta verificação passa mesmo com a opção desligada — verifique o passo 4 da instalação manualmente.',
         skip_unsupported_model: 'Este modelo tem slot SD mas nenhuma forma de ativar a opção — o firmware atual da série P1 não mostra o botão no Bambu Studio e a impressora não tem tela. Não há nada a corrigir aqui; as impressões arquivadas podem ficar sem miniaturas e metadados do fatiador até que a Bambu Lab adicione suporte por firmware.',
         skip_unsupported_model: 'Este modelo tem slot SD mas nenhuma forma de ativar a opção — o firmware atual da série P1 não mostra o botão no Bambu Studio e a impressora não tem tela. Não há nada a corrigir aqui; as impressões arquivadas podem ficar sem miniaturas e metadados do fatiador até que a Bambu Lab adicione suporte por firmware.',
         fail_no_media: 'A opção está ligada, mas a impressora não detecta cartão nem pendrive no slot, então os arquivos enviados não têm para onde ir. Insira um e imprima novamente — até lá, toda impressão arquivada ficará sem miniatura e sem metadados do fatiador.',
         fail_no_media: 'A opção está ligada, mas a impressora não detecta cartão nem pendrive no slot, então os arquivos enviados não têm para onde ir. Insira um e imprima novamente — até lá, toda impressão arquivada ficará sem miniatura e sem metadados do fatiador.',
-        warn_internal_storage: 'A opção está ligada e há armazenamento presente, mas a última impressão ainda assim foi para o armazenamento interno da impressora, que o Bambuddy não consegue ler. Na série H2 e na P2S o Bambu Studio faz isso independentemente desta opção. As impressões são arquivadas com nome e tempos, mas sem miniatura nem metadados do fatiador. Para arquivos completos, inicie as impressões pelo Bambuddy ou fatie no OrcaSlicer — ele sempre envia para o armazenamento externo.',
+        warn_internal_storage: 'A opção está ligada e há armazenamento presente, mas a última impressão ainda assim foi para o armazenamento interno da impressora, que o Bambuddy não consegue ler. Na série H2 e na P2S o botão «Imprimir» do Bambu Studio sempre envia para lá, independentemente desta opção. As impressões são arquivadas com nome e tempos, mas sem miniatura nem metadados do fatiador. Para arquivos completos, inicie as impressões pelo Bambuddy ou fatie no OrcaSlicer, ou então no Bambu Studio use «Enviar» com «Externo» e inicie a impressão depois.',
       },
       },
       port_rtsps: {
       port_rtsps: {
         title: 'Porta da câmera ({{protocol}} {{port}})',
         title: 'Porta da câmera ({{protocol}} {{port}})',

+ 2 - 2
frontend/src/i18n/locales/ru.ts

@@ -832,7 +832,7 @@ export default {
       docsLink: "См. шаг 4 установки",
       docsLink: "См. шаг 4 установки",
       docsLinkInternalStorage: 'Почему так происходит',
       docsLinkInternalStorage: 'Почему так происходит',
       titleInternalStorage: 'Некоторые недавние печати остались во внутренней памяти принтера',
       titleInternalStorage: 'Некоторые недавние печати остались во внутренней памяти принтера',
-      bodyInternalStorage: 'Bambu Studio сохранил нарезанный файл во внутренней памяти принтера, а не на карте, поэтому Bambuddy было нечего читать по FTP. На серии H2 и P2S он делает это независимо от того, как выставлен параметр «Сохранять отправленные файлы на внешнем накопителе». Эти печати по-прежнему архивируются с именем и временем, только без миниатюры и метаданных слайсера. Чтобы архивы были полными, запускайте печать из Bambuddy или нарезайте в OrcaSlicer — он всегда загружает на карту. В обоих случаях в принтере нужна карта или флешка.',
+      bodyInternalStorage: 'Bambu Studio сохранил нарезанный файл во внутренней памяти принтера, а не на карте, поэтому Bambuddy было нечего читать по FTP. На серии H2 и P2S кнопка «Печать» всегда делает так: выбор есть только в «Отправить», и там по умолчанию тоже «Кэш». Эти печати по-прежнему архивируются с именем и временем, только без миниатюры и метаданных слайсера. Чтобы архивы были полными, запускайте печать из Bambuddy или нарезайте в OrcaSlicer, либо в Bambu Studio используйте «Отправить» с «Внешним накопителем», а печать запускайте после этого. Во всех случаях в принтере нужна карта или флешка.',
       titleNoExternalStorage: 'Некоторые недавние печати не удалось архивировать — в принтере нет накопителя',
       titleNoExternalStorage: 'Некоторые недавние печати не удалось архивировать — в принтере нет накопителя',
       bodyNoExternalStorage: 'Принтер не видит ни карты, ни флешки в слоте, поэтому нарезанному файлу некуда было попасть, а Bambuddy нечего читать. Вставьте накопитель, и следующая печать будет заархивирована полностью.',
       bodyNoExternalStorage: 'Принтер не видит ни карты, ни флешки в слоте, поэтому нарезанному файлу некуда было попасть, а Bambuddy нечего читать. Вставьте накопитель, и следующая печать будет заархивирована полностью.',
       dismissLabel: "Закрыть это уведомление",
       dismissLabel: "Закрыть это уведомление",
@@ -6432,7 +6432,7 @@ export default {
         skip: "Не проверено — требуется активное подключение MQTT. В старых версиях слайсеров этот параметр существует только в слайсере и принтер его не сообщает, поэтому проверка может пройти даже при выключенном параметре. Проверьте шаг 4 установки вручную.",
         skip: "Не проверено — требуется активное подключение MQTT. В старых версиях слайсеров этот параметр существует только в слайсере и принтер его не сообщает, поэтому проверка может пройти даже при выключенном параметре. Проверьте шаг 4 установки вручную.",
         skip_unsupported_model: "В этой модели есть слот SD-карты, но включить соответствующую функцию невозможно: текущая прошивка серии P1 не предоставляет переключатель в Bambu Studio, а у принтера нет экрана. Исправлять здесь нечего. Пока Bambu Lab не добавит поддержку в прошивку, архивные задания могут сохраняться без миниатюр и метаданных слайсера.",
         skip_unsupported_model: "В этой модели есть слот SD-карты, но включить соответствующую функцию невозможно: текущая прошивка серии P1 не предоставляет переключатель в Bambu Studio, а у принтера нет экрана. Исправлять здесь нечего. Пока Bambu Lab не добавит поддержку в прошивку, архивные задания могут сохраняться без миниатюр и метаданных слайсера.",
         fail_no_media: 'Параметр включён, но принтер не видит ни карты, ни флешки в слоте, поэтому отправленным файлам некуда деваться. Вставьте накопитель и напечатайте снова — до тех пор у каждой архивной печати не будет ни миниатюры, ни метаданных слайсера.',
         fail_no_media: 'Параметр включён, но принтер не видит ни карты, ни флешки в слоте, поэтому отправленным файлам некуда деваться. Вставьте накопитель и напечатайте снова — до тех пор у каждой архивной печати не будет ни миниатюры, ни метаданных слайсера.',
-        warn_internal_storage: 'Параметр включён и накопитель на месте, но последняя печать всё равно ушла во внутреннюю память принтера, которую Bambuddy не может прочитать. На серии H2 и P2S Bambu Studio делает это независимо от этого параметра. Печати архивируются с именем и временем, но без миниатюры и метаданных слайсера. Чтобы архивы были полными, запускайте печать из Bambuddy или нарезайте в OrcaSlicer — он всегда загружает на внешний накопитель.',
+        warn_internal_storage: 'Параметр включён и накопитель на месте, но последняя печать всё равно ушла во внутреннюю память принтера, которую Bambuddy не может прочитать. На серии H2 и P2S кнопка «Печать» в Bambu Studio всегда отправляет туда, независимо от этого параметра. Печати архивируются с именем и временем, но без миниатюры и метаданных слайсера. Чтобы архивы были полными, запускайте печать из Bambuddy, нарезайте в OrcaSlicer или в Bambu Studio используйте «Отправить» с «Внешним накопителем», а затем запускайте печать.',
       },
       },
       port_rtsps: {
       port_rtsps: {
         title: "Порт камеры ({{protocol}} {{port}})",
         title: "Порт камеры ({{protocol}} {{port}})",

+ 2 - 2
frontend/src/i18n/locales/tr.ts

@@ -877,7 +877,7 @@ export default {
       docsLink: 'Kurulum adımı 4\'ü görüntüle',
       docsLink: 'Kurulum adımı 4\'ü görüntüle',
       docsLinkInternalStorage: 'Bu neden oluyor',
       docsLinkInternalStorage: 'Bu neden oluyor',
       titleInternalStorage: 'Bazı son baskılar yazıcının dahili depolamasında kaldı',
       titleInternalStorage: 'Bazı son baskılar yazıcının dahili depolamasında kaldı',
-      bodyInternalStorage: 'Bambu Studio dilimlenmiş dosyayı karta değil yazıcının dahili depolamasına yazdı, bu yüzden Bambuddy\'nin FTP üzerinden okuyacağı bir şey yoktu. H2 serisi ve P2S\'de bunu «Gönderilen dosyaları harici depolamada sakla» ayarından bağımsız olarak yapar. Bu baskılar adları ve süreleriyle yine arşivlenir, yalnızca küçük resim ve dilimleyici meta verileri olmadan. Eksiksiz arşivler için baskıyı Bambuddy üzerinden başlatın ya da OrcaSlicer ile dilimleyin — o her zaman karta yükler. Her ikisi de yazıcıda kart ya da bellek gerektirir.',
+      bodyInternalStorage: 'Bambu Studio dilimlenmiş dosyayı karta değil yazıcının dahili depolamasına yazdı, bu yüzden Bambuddy\'nin FTP üzerinden okuyacağı bir şey yoktu. H2 serisi ve P2S\'de «Yazdır» düğmesi bunu her zaman yapar; seçim yalnızca «Gönder» ile mümkündür ve orada da varsayılan «Önbellek»tir. Bu baskılar adları ve süreleriyle yine arşivlenir, yalnızca küçük resim ve dilimleyici meta verileri olmadan. Eksiksiz arşivler için baskıyı Bambuddy üzerinden başlatın ya da OrcaSlicer ile dilimleyin; Bambu Studio kullanacaksanız «Gönder» ile «Harici» seçip baskıyı sonrasında başlatın. Hepsi yazıcıda kart ya da bellek gerektirir.',
       titleNoExternalStorage: 'Bazı son baskılar arşivlenemedi — yazıcıda depolama yok',
       titleNoExternalStorage: 'Bazı son baskılar arşivlenemedi — yazıcıda depolama yok',
       bodyNoExternalStorage: 'Yazıcı yuvasında kart veya bellek bildirmiyor, bu yüzden dilimlenmiş dosyanın ineceği bir yer ve Bambuddy\'nin okuyacağı bir şey yoktu. Bir tane takın, sonraki baskı eksiksiz arşivlenecek.',
       bodyNoExternalStorage: 'Yazıcı yuvasında kart veya bellek bildirmiyor, bu yüzden dilimlenmiş dosyanın ineceği bir yer ve Bambuddy\'nin okuyacağı bir şey yoktu. Bir tane takın, sonraki baskı eksiksiz arşivlenecek.',
       dismissLabel: 'Bu bildirimi kapat',
       dismissLabel: 'Bu bildirimi kapat',
@@ -6742,7 +6742,7 @@ export default {
         skip: 'Kontrol edilmedi — etkin bir MQTT bağlantısı gerekli. Bu ayarın yalnızca dilimleyicide bulunduğu eski dilimleyicilerde yazıcı bunu bildirmez, bu nedenle seçenek kapalı olsa bile bu kontrol geçer — kurulum adımı 4\'ü manuel olarak doğrulayın.',
         skip: 'Kontrol edilmedi — etkin bir MQTT bağlantısı gerekli. Bu ayarın yalnızca dilimleyicide bulunduğu eski dilimleyicilerde yazıcı bunu bildirmez, bu nedenle seçenek kapalı olsa bile bu kontrol geçer — kurulum adımı 4\'ü manuel olarak doğrulayın.',
         skip_unsupported_model: 'Bu modelde SD yuvası var ancak seçeneği açmanın bir yolu yok — mevcut P1 serisi bellenim, Bambu Studio\'da bu anahtarı göstermiyor ve yazıcının ekranı yok. Burada düzeltilecek bir şey yok; Bambu Lab bellenim desteği ekleyene kadar arşivlenen baskılarda küçük resimler ve dilimleyici meta verileri eksik olabilir.',
         skip_unsupported_model: 'Bu modelde SD yuvası var ancak seçeneği açmanın bir yolu yok — mevcut P1 serisi bellenim, Bambu Studio\'da bu anahtarı göstermiyor ve yazıcının ekranı yok. Burada düzeltilecek bir şey yok; Bambu Lab bellenim desteği ekleyene kadar arşivlenen baskılarda küçük resimler ve dilimleyici meta verileri eksik olabilir.',
         fail_no_media: 'Seçenek açık, ancak yazıcı yuvasında kart veya bellek bildirmiyor, dolayısıyla gönderilen dosyaların gideceği bir yer yok. Bir tane takıp yeniden yazdırın — o zamana kadar arşivlenen her baskıda küçük resim ve dilimleyici meta verileri eksik olacak.',
         fail_no_media: 'Seçenek açık, ancak yazıcı yuvasında kart veya bellek bildirmiyor, dolayısıyla gönderilen dosyaların gideceği bir yer yok. Bir tane takıp yeniden yazdırın — o zamana kadar arşivlenen her baskıda küçük resim ve dilimleyici meta verileri eksik olacak.',
-        warn_internal_storage: 'Seçenek açık ve depolama takılı, ancak son baskı yine de Bambuddy\'nin okuyamadığı dahili depolamaya gitti. H2 serisi ve P2S\'de Bambu Studio bunu bu ayardan bağımsız olarak yapar. Baskılar adları ve süreleriyle arşivlenir, ancak küçük resim ve dilimleyici meta verileri olmadan. Eksiksiz arşivler için baskıları Bambuddy üzerinden başlatın ya da OrcaSlicer ile dilimleyin — o her zaman harici depolamaya yükler.',
+        warn_internal_storage: 'Seçenek açık ve depolama takılı, ancak son baskı yine de Bambuddy\'nin okuyamadığı dahili depolamaya gitti. H2 serisi ve P2S\'de Bambu Studio\'nun «Yazdır» düğmesi bu ayardan bağımsız olarak her zaman oraya gönderir. Baskılar adları ve süreleriyle arşivlenir, ancak küçük resim ve dilimleyici meta verileri olmadan. Eksiksiz arşivler için baskıları Bambuddy üzerinden başlatın, OrcaSlicer ile dilimleyin ya da Bambu Studio\'da «Gönder» ile «Harici» seçip baskıyı sonrasında başlatın.',
       },
       },
       port_rtsps: {
       port_rtsps: {
         title: 'Kamera portu ({{protocol}} {{port}})',
         title: 'Kamera portu ({{protocol}} {{port}})',

+ 2 - 2
frontend/src/i18n/locales/uk.ts

@@ -881,7 +881,7 @@ export default {
       docsLink: "Переглянути крок 4 встановлення",
       docsLink: "Переглянути крок 4 встановлення",
       docsLinkInternalStorage: 'Чому так стається',
       docsLinkInternalStorage: 'Чому так стається',
       titleInternalStorage: 'Деякі нещодавні друки залишилися у внутрішній пам\'яті принтера',
       titleInternalStorage: 'Деякі нещодавні друки залишилися у внутрішній пам\'яті принтера',
-      bodyInternalStorage: 'Bambu Studio зберіг нарізаний файл у внутрішній пам\'яті принтера, а не на картці, тож Bambuddy не мав чого читати через FTP. На серії H2 та P2S він робить це незалежно від того, як налаштовано «Зберігати надіслані файли на зовнішньому носії». Ці друки й далі архівуються з назвою та часом, лише без мініатюри та метаданих слайсера. Щоб архіви були повними, запускайте друк із Bambuddy або нарізайте в OrcaSlicer — він завжди вивантажує на картку. В обох випадках у принтері потрібна картка або флешка.',
+      bodyInternalStorage: 'Bambu Studio зберіг нарізаний файл у внутрішній пам\'яті принтера, а не на картці, тож Bambuddy не мав чого читати через FTP. На серії H2 та P2S кнопка «Друк» завжди робить саме так: вибір є лише в «Надіслати», і там за замовчуванням теж «Кеш». Ці друки й далі архівуються з назвою та часом, лише без мініатюри та метаданих слайсера. Щоб архіви були повними, запускайте друк із Bambuddy або нарізайте в OrcaSlicer, або в Bambu Studio скористайтеся «Надіслати» із «Зовнішнім носієм», а друк запускайте потім. Усі варіанти потребують картки або флешки в принтері.',
       titleNoExternalStorage: 'Деякі нещодавні друки не вдалося заархівувати — у принтері немає носія',
       titleNoExternalStorage: 'Деякі нещодавні друки не вдалося заархівувати — у принтері немає носія',
       bodyNoExternalStorage: 'Принтер не бачить ані картки, ані флешки у слоті, тож нарізаному файлу не було куди потрапити, а Bambuddy — що читати. Вставте носій, і наступний друк заархівується повністю.',
       bodyNoExternalStorage: 'Принтер не бачить ані картки, ані флешки у слоті, тож нарізаному файлу не було куди потрапити, а Bambuddy — що читати. Вставте носій, і наступний друк заархівується повністю.',
       dismissLabel: "Відхилити це повідомлення",
       dismissLabel: "Відхилити це повідомлення",
@@ -6846,7 +6846,7 @@ export default {
         skip: "Не перевірено — потрібне активне MQTT-з’єднання. У старіших слайсерах, де цей параметр існує лише в самому слайсері, принтер його не повідомляє. Тому перевірка може бути успішною навіть за вимкненого параметра — перевірте крок установлення 4 вручну.",
         skip: "Не перевірено — потрібне активне MQTT-з’єднання. У старіших слайсерах, де цей параметр існує лише в самому слайсері, принтер його не повідомляє. Тому перевірка може бути успішною навіть за вимкненого параметра — перевірте крок установлення 4 вручну.",
         skip_unsupported_model: "Ця модель має слот для SD-картки, але не дає змоги ввімкнути цей параметр: поточна прошивка принтерів серії P1 не показує перемикач у Bambu Studio, а сам принтер не має екрана. Виправляти нічого не потрібно; доки Bambu Lab не додасть підтримку в прошивці, в архівованих друках можуть бути відсутні мініатюри та метадані слайсера.",
         skip_unsupported_model: "Ця модель має слот для SD-картки, але не дає змоги ввімкнути цей параметр: поточна прошивка принтерів серії P1 не показує перемикач у Bambu Studio, а сам принтер не має екрана. Виправляти нічого не потрібно; доки Bambu Lab не додасть підтримку в прошивці, в архівованих друках можуть бути відсутні мініатюри та метадані слайсера.",
         fail_no_media: 'Параметр увімкнено, але принтер не бачить ані картки, ані флешки у слоті, тож надісланим файлам немає куди подітися. Вставте носій і надрукуйте ще раз — доти кожен заархівований друк буде без мініатюри та метаданих слайсера.',
         fail_no_media: 'Параметр увімкнено, але принтер не бачить ані картки, ані флешки у слоті, тож надісланим файлам немає куди подітися. Вставте носій і надрукуйте ще раз — доти кожен заархівований друк буде без мініатюри та метаданих слайсера.',
-        warn_internal_storage: 'Параметр увімкнено і носій на місці, але останній друк усе одно потрапив у внутрішню пам\'ять принтера, яку Bambuddy не може прочитати. На серії H2 та P2S Bambu Studio робить це незалежно від цього параметра. Друки архівуються з назвою та часом, але без мініатюри та метаданих слайсера. Щоб архіви були повними, запускайте друк із Bambuddy або нарізайте в OrcaSlicer — він завжди вивантажує на зовнішній носій.',
+        warn_internal_storage: 'Параметр увімкнено і носій на місці, але останній друк усе одно потрапив у внутрішню пам\'ять принтера, яку Bambuddy не може прочитати. На серії H2 та P2S кнопка «Друк» у Bambu Studio завжди надсилає туди, незалежно від цього параметра. Друки архівуються з назвою та часом, але без мініатюри та метаданих слайсера. Щоб архіви були повними, запускайте друк із Bambuddy, нарізайте в OrcaSlicer або в Bambu Studio скористайтеся «Надіслати» із «Зовнішнім носієм», а потім запускайте друк.',
       },
       },
       port_rtsps: {
       port_rtsps: {
         title: "Порт камери ({{protocol}} {{port}})",
         title: "Порт камери ({{protocol}} {{port}})",

+ 2 - 2
frontend/src/i18n/locales/zh-CN.ts

@@ -877,7 +877,7 @@ export default {
       docsLink: '查看安装步骤 4',
       docsLink: '查看安装步骤 4',
       docsLinkInternalStorage: '为什么会这样',
       docsLinkInternalStorage: '为什么会这样',
       titleInternalStorage: '最近有些打印留在了打印机的内部存储中',
       titleInternalStorage: '最近有些打印留在了打印机的内部存储中',
-      bodyInternalStorage: 'Bambu Studio 把切片文件保存到了打印机的内部存储而不是存储卡上,因此 Bambuddy 通过 FTP 读不到任何东西。在 H2 系列和 P2S 上,无论「将发送的文件存储到外部存储」如何设置,它都会这样做。这些打印仍会带着名称和时间归档,只是没有缩略图和切片元数据。要获得完整归档,请从 Bambuddy 启动打印,或改用 OrcaSlicer 切片——它始终上传到存储卡。两种方式都需要打印机中插有存储卡或 U 盘。',
+      bodyInternalStorage: 'Bambu Studio 把切片文件保存到了打印机的内部存储而不是存储卡上,因此 Bambuddy 通过 FTP 读不到任何东西。在 H2 系列和 P2S 上,「打印」按钮总是这样做,只有「发送」才提供选择,而它的默认值也是「缓存」。这些打印仍会带着名称和时间归档,只是没有缩略图和切片元数据。要获得完整归档,请从 Bambuddy 启动打印,或改用 OrcaSlicer 切片;若要继续用 Bambu Studio,请用「发送」并选择「外部存储」,之后再启动打印。以上都需要打印机中插有存储卡或 U 盘。',
       titleNoExternalStorage: '最近有些打印无法归档 — 打印机中没有存储介质',
       titleNoExternalStorage: '最近有些打印无法归档 — 打印机中没有存储介质',
       bodyNoExternalStorage: '打印机的插槽中未检测到存储卡或U盘,切片文件无处存放,Bambuddy 也无从读取。插入一个,下次打印就会完整归档。',
       bodyNoExternalStorage: '打印机的插槽中未检测到存储卡或U盘,切片文件无处存放,Bambuddy 也无从读取。插入一个,下次打印就会完整归档。',
       dismissLabel: '关闭此通知',
       dismissLabel: '关闭此通知',
@@ -6791,7 +6791,7 @@ export default {
         skip: '未检查 — 需要有效的 MQTT 连接。在该设置仅存在于切片机中的较旧切片机上,打印机不会报告此设置,因此即使选项已关闭,此检查也会通过 — 请手动验证安装步骤 4。',
         skip: '未检查 — 需要有效的 MQTT 连接。在该设置仅存在于切片机中的较旧切片机上,打印机不会报告此设置,因此即使选项已关闭,此检查也会通过 — 请手动验证安装步骤 4。',
         skip_unsupported_model: '此型号有 SD 卡槽,但无法开启该选项 — 当前 P1 系列固件不会在 Bambu Studio 中显示此开关,且打印机没有屏幕。这里无需修复;在 Bambu Lab 通过固件添加支持之前,存档的打印可能缺少缩略图和切片元数据。',
         skip_unsupported_model: '此型号有 SD 卡槽,但无法开启该选项 — 当前 P1 系列固件不会在 Bambu Studio 中显示此开关,且打印机没有屏幕。这里无需修复;在 Bambu Lab 通过固件添加支持之前,存档的打印可能缺少缩略图和切片元数据。',
         fail_no_media: '该选项已开启,但打印机的插槽中未检测到存储卡或U盘,发送的文件无处存放。插入一个再打印一次 — 在此之前,每一次归档的打印都会缺少缩略图和切片元数据。',
         fail_no_media: '该选项已开启,但打印机的插槽中未检测到存储卡或U盘,发送的文件无处存放。插入一个再打印一次 — 在此之前,每一次归档的打印都会缺少缩略图和切片元数据。',
-        warn_internal_storage: '该选项已开启且存储介质在位,但上一次打印仍进入了 Bambuddy 无法读取的打印机内部存储。在 H2 系列和 P2S 上,无论此选项如何设置,Bambu Studio 都会这样做。打印会带着名称和时间归档,但没有缩略图和切片元数据。要获得完整归档,请从 Bambuddy 启动打印,或改用 OrcaSlicer 切片——它始终上传到外部存储。',
+        warn_internal_storage: '该选项已开启且存储介质在位,但上一次打印仍进入了 Bambuddy 无法读取的打印机内部存储。在 H2 系列和 P2S 上,无论此选项如何设置,Bambu Studio 的「打印」按钮总是发送到那里。打印会带着名称和时间归档,但没有缩略图和切片元数据。要获得完整归档,请从 Bambuddy 启动打印、改用 OrcaSlicer 切片,或在 Bambu Studio 中用「发送」选择「外部存储」后再启动打印。',
       },
       },
       port_rtsps: {
       port_rtsps: {
         title: '摄像头端口({{protocol}} {{port}})',
         title: '摄像头端口({{protocol}} {{port}})',

+ 2 - 2
frontend/src/i18n/locales/zh-TW.ts

@@ -877,7 +877,7 @@ export default {
       docsLink: '檢視安裝步驟 4',
       docsLink: '檢視安裝步驟 4',
       docsLinkInternalStorage: '為什麼會這樣',
       docsLinkInternalStorage: '為什麼會這樣',
       titleInternalStorage: '最近有些列印留在了印表機的內部儲存中',
       titleInternalStorage: '最近有些列印留在了印表機的內部儲存中',
-      bodyInternalStorage: 'Bambu Studio 把切片檔案儲存到了印表機的內部儲存而不是記憶卡上,因此 Bambuddy 透過 FTP 讀不到任何東西。在 H2 系列與 P2S 上,無論「將傳送的檔案儲存到外部儲存」如何設定,它都會這樣做。這些列印仍會帶著名稱與時間歸檔,只是沒有縮圖與切片中繼資料。要取得完整歸檔,請從 Bambuddy 啟動列印,或改用 OrcaSlicer 切片——它始終上傳到記憶卡。兩種方式都需要印表機中插有記憶卡或 USB 隨身碟。',
+      bodyInternalStorage: 'Bambu Studio 把切片檔案儲存到了印表機的內部儲存而不是記憶卡上,因此 Bambuddy 透過 FTP 讀不到任何東西。在 H2 系列與 P2S 上,「列印」按鈕總是這樣做,只有「傳送」才提供選擇,而它的預設值也是「快取」。這些列印仍會帶著名稱與時間歸檔,只是沒有縮圖與切片中繼資料。要取得完整歸檔,請從 Bambuddy 啟動列印,或改用 OrcaSlicer 切片;若要繼續用 Bambu Studio,請用「傳送」並選擇「外部儲存」,之後再啟動列印。以上都需要印表機中插有記憶卡或 USB 隨身碟。',
       titleNoExternalStorage: '最近有些列印無法歸檔 — 印表機中沒有儲存媒體',
       titleNoExternalStorage: '最近有些列印無法歸檔 — 印表機中沒有儲存媒體',
       bodyNoExternalStorage: '印表機的插槽中未偵測到記憶卡或隨身碟,切片檔案無處存放,Bambuddy 也無從讀取。插入一個,下次列印就會完整歸檔。',
       bodyNoExternalStorage: '印表機的插槽中未偵測到記憶卡或隨身碟,切片檔案無處存放,Bambuddy 也無從讀取。插入一個,下次列印就會完整歸檔。',
       dismissLabel: '關閉此通知',
       dismissLabel: '關閉此通知',
@@ -6791,7 +6791,7 @@ export default {
         skip: '未檢查 — 需要有效的 MQTT 連線。在該設定僅存在於切片機中的較舊切片機上,印表機不會回報此設定,因此即使選項已關閉,此檢查也會通過 — 請手動驗證安裝步驟 4。',
         skip: '未檢查 — 需要有效的 MQTT 連線。在該設定僅存在於切片機中的較舊切片機上,印表機不會回報此設定,因此即使選項已關閉,此檢查也會通過 — 請手動驗證安裝步驟 4。',
         skip_unsupported_model: '此型號有 SD 卡槽,但無法開啟該選項 — 目前 P1 系列韌體不會在 Bambu Studio 中顯示此開關,且印表機沒有螢幕。這裡無需修復;在 Bambu Lab 透過韌體加入支援之前,封存的列印可能缺少縮圖和切片中繼資料。',
         skip_unsupported_model: '此型號有 SD 卡槽,但無法開啟該選項 — 目前 P1 系列韌體不會在 Bambu Studio 中顯示此開關,且印表機沒有螢幕。這裡無需修復;在 Bambu Lab 透過韌體加入支援之前,封存的列印可能缺少縮圖和切片中繼資料。',
         fail_no_media: '該選項已開啟,但印表機的插槽中未偵測到記憶卡或隨身碟,傳送的檔案無處存放。插入一個再列印一次 — 在此之前,每一次歸檔的列印都會缺少縮圖與切片中繼資料。',
         fail_no_media: '該選項已開啟,但印表機的插槽中未偵測到記憶卡或隨身碟,傳送的檔案無處存放。插入一個再列印一次 — 在此之前,每一次歸檔的列印都會缺少縮圖與切片中繼資料。',
-        warn_internal_storage: '該選項已開啟且儲存媒體在位,但上一次列印仍進入了 Bambuddy 無法讀取的印表機內部儲存。在 H2 系列與 P2S 上,無論此選項如何設定,Bambu Studio 都會這樣做。列印會帶著名稱與時間歸檔,但沒有縮圖與切片中繼資料。要取得完整歸檔,請從 Bambuddy 啟動列印,或改用 OrcaSlicer 切片——它始終上傳到外部儲存。',
+        warn_internal_storage: '該選項已開啟且儲存媒體在位,但上一次列印仍進入了 Bambuddy 無法讀取的印表機內部儲存。在 H2 系列與 P2S 上,無論此選項如何設定,Bambu Studio 的「列印」按鈕總是傳送到那裡。列印會帶著名稱與時間歸檔,但沒有縮圖與切片中繼資料。要取得完整歸檔,請從 Bambuddy 啟動列印、改用 OrcaSlicer 切片,或在 Bambu Studio 中用「傳送」選擇「外部儲存」後再啟動列印。',
       },
       },
       port_rtsps: {
       port_rtsps: {
         title: '攝影機連接埠({{protocol}} {{port}})',
         title: '攝影機連接埠({{protocol}} {{port}})',

File diff suppressed because it is too large
+ 0 - 0
static/assets/index-Q-Fl-YCy.js


+ 1 - 1
static/index.html

@@ -26,7 +26,7 @@
 
 
     <!-- Splash screens for iOS -->
     <!-- Splash screens for iOS -->
     <link rel="apple-touch-startup-image" href="/img/android-chrome-512x512.png" />
     <link rel="apple-touch-startup-image" href="/img/android-chrome-512x512.png" />
-    <script type="module" crossorigin src="/assets/index-Ip2wNW-O.js"></script>
+    <script type="module" crossorigin src="/assets/index-Q-Fl-YCy.js"></script>
     <link rel="stylesheet" crossorigin href="/assets/index-C_NRLB80.css">
     <link rel="stylesheet" crossorigin href="/assets/index-C_NRLB80.css">
   </head>
   </head>
   <body>
   <body>

Some files were not shown because too many files changed in this diff