mirror of
https://github.com/maziggy/bambuddy.git
synced 2026-10-08 23:21:58 +02:00
Fix empty archive tiles on P2S printer
P2S printer creates fallback archives without thumbnails/metadata because FTP couldn't find 3MF files. The P2S uses different directory structure (/data/Metadata/) and doesn't have a /cache directory. Changes: - Add P2S to SKIP_SESSION_REUSE_MODELS for SSL compatibility - Add /data/ and /data/Metadata/ to 3MF download paths - Update fallback search to try multiple directories instead of just /cache - Add /data paths to FTP storage scan directories Closes #146
This commit is contained in:
+48
-40
@@ -672,6 +672,8 @@ async def on_print_start(printer_id: int, data: dict):
|
||||
remote_paths = [
|
||||
f"/cache/{try_filename}",
|
||||
f"/model/{try_filename}",
|
||||
f"/data/{try_filename}",
|
||||
f"/data/Metadata/{try_filename}",
|
||||
f"/{try_filename}",
|
||||
]
|
||||
|
||||
@@ -713,48 +715,54 @@ async def on_print_start(printer_id: int, data: dict):
|
||||
if downloaded_filename:
|
||||
break
|
||||
|
||||
# If still not found, try listing /cache to find matching file
|
||||
# If still not found, try listing directories to find matching file
|
||||
# Different printer models use different directory structures
|
||||
if not downloaded_filename and (filename or subtask_name):
|
||||
search_term = (subtask_name or filename).lower().replace(".gcode", "").replace(".3mf", "")
|
||||
logger.info(f"Direct FTP download failed, listing /cache to find '{search_term}'")
|
||||
try:
|
||||
cache_files = await list_files_async(printer.ip_address, printer.access_code, "/cache")
|
||||
threemf_files = [f.get("name") for f in cache_files if f.get("name", "").endswith(".3mf")]
|
||||
logger.info(
|
||||
f"Found {len(threemf_files)} 3MF files in /cache: {threemf_files[:5]}{'...' if len(threemf_files) > 5 else ''}"
|
||||
)
|
||||
for f in cache_files:
|
||||
if f.get("is_directory"):
|
||||
continue
|
||||
fname = f.get("name", "")
|
||||
if fname.endswith(".3mf") and search_term in fname.lower():
|
||||
logger.info(f"Found matching file: {fname}")
|
||||
temp_path = app_settings.archive_dir / "temp" / fname
|
||||
temp_path.parent.mkdir(parents=True, exist_ok=True)
|
||||
if ftp_retry_enabled:
|
||||
downloaded = await with_ftp_retry(
|
||||
download_file_async,
|
||||
printer.ip_address,
|
||||
printer.access_code,
|
||||
f"/cache/{fname}",
|
||||
temp_path,
|
||||
max_retries=ftp_retry_count,
|
||||
retry_delay=ftp_retry_delay,
|
||||
operation_name=f"Download 3MF from /cache/{fname}",
|
||||
)
|
||||
else:
|
||||
downloaded = await download_file_async(
|
||||
printer.ip_address,
|
||||
printer.access_code,
|
||||
f"/cache/{fname}",
|
||||
temp_path,
|
||||
)
|
||||
if downloaded:
|
||||
downloaded_filename = fname
|
||||
logger.info(f"Found and downloaded from cache: {fname}")
|
||||
break
|
||||
except Exception as e:
|
||||
logger.warning(f"Failed to list cache: {e}")
|
||||
logger.info(f"Direct FTP download failed, searching directories for '{search_term}'")
|
||||
search_dirs = ["/cache", "/model", "/data", "/data/Metadata"]
|
||||
for search_dir in search_dirs:
|
||||
if downloaded_filename:
|
||||
break
|
||||
try:
|
||||
dir_files = await list_files_async(printer.ip_address, printer.access_code, search_dir)
|
||||
threemf_files = [f.get("name") for f in dir_files if f.get("name", "").endswith(".3mf")]
|
||||
if threemf_files:
|
||||
logger.info(
|
||||
f"Found {len(threemf_files)} 3MF files in {search_dir}: {threemf_files[:5]}{'...' if len(threemf_files) > 5 else ''}"
|
||||
)
|
||||
for f in dir_files:
|
||||
if f.get("is_directory"):
|
||||
continue
|
||||
fname = f.get("name", "")
|
||||
if fname.endswith(".3mf") and search_term in fname.lower():
|
||||
logger.info(f"Found matching file in {search_dir}: {fname}")
|
||||
temp_path = app_settings.archive_dir / "temp" / fname
|
||||
temp_path.parent.mkdir(parents=True, exist_ok=True)
|
||||
if ftp_retry_enabled:
|
||||
downloaded = await with_ftp_retry(
|
||||
download_file_async,
|
||||
printer.ip_address,
|
||||
printer.access_code,
|
||||
f"{search_dir}/{fname}",
|
||||
temp_path,
|
||||
max_retries=ftp_retry_count,
|
||||
retry_delay=ftp_retry_delay,
|
||||
operation_name=f"Download 3MF from {search_dir}/{fname}",
|
||||
)
|
||||
else:
|
||||
downloaded = await download_file_async(
|
||||
printer.ip_address,
|
||||
printer.access_code,
|
||||
f"{search_dir}/{fname}",
|
||||
temp_path,
|
||||
)
|
||||
if downloaded:
|
||||
downloaded_filename = fname
|
||||
logger.info(f"Found and downloaded from {search_dir}: {fname}")
|
||||
break
|
||||
except Exception as e:
|
||||
logger.debug(f"Failed to list {search_dir}: {e}")
|
||||
|
||||
if not downloaded_filename or not temp_path:
|
||||
logger.warning(f"Could not find 3MF file for print: {filename or subtask_name}")
|
||||
|
||||
@@ -78,7 +78,7 @@ class BambuFTPClient:
|
||||
FTP_PORT = 990
|
||||
DEFAULT_TIMEOUT = 30 # Default timeout in seconds (increased for A1 printers)
|
||||
# Models that need SSL session reuse disabled (A1 series has FTP issues with session reuse)
|
||||
SKIP_SESSION_REUSE_MODELS = ("A1", "A1 Mini", "P1S", "P1P")
|
||||
SKIP_SESSION_REUSE_MODELS = ("A1", "A1 Mini", "P1S", "P1P", "P2S")
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
@@ -323,7 +323,7 @@ class BambuFTPClient:
|
||||
# Calculate used space by listing root directories
|
||||
try:
|
||||
total_used = 0
|
||||
dirs_to_scan = ["/cache", "/timelapse", "/model"]
|
||||
dirs_to_scan = ["/cache", "/timelapse", "/model", "/data", "/data/Metadata"]
|
||||
|
||||
for dir_path in dirs_to_scan:
|
||||
try:
|
||||
|
||||
Reference in New Issue
Block a user