Просмотр исходного кода

Add explanatory comments to 265 empty except blocks

CodeQL flags except blocks where `pass` has no comment explaining
why the exception is silently ignored (py/empty-except rule).

Added context-specific comments to all 265 instances across 31 files:
- database.py (~112): ALTER TABLE migrations — "Already applied"
- archive/library/3MF parsing (~64): "Skip unparseable metadata"
- virtual_printer network cleanup (~32): "Best-effort socket cleanup"
- discovery/SSDP (~13): "SO_REUSEPORT not available" / socket cleanup
- bambu_ftp/mqtt (~13): FTP cleanup, JSON decode, signal parsing
- remaining routes/services (~31): context-specific comments
maziggy 3 месяцев назад
Родитель
Сommit
5b0a985da2
31 измененных файлов с 266 добавлено и 268 удалено
  1. 19 19
      backend/app/api/routes/archives.py
  2. 1 1
      backend/app/api/routes/camera.py
  3. 12 12
      backend/app/api/routes/library.py
  4. 4 4
      backend/app/api/routes/pending_uploads.py
  5. 2 2
      backend/app/api/routes/print_queue.py
  6. 10 10
      backend/app/api/routes/printers.py
  7. 1 1
      backend/app/api/routes/support.py
  8. 1 1
      backend/app/api/routes/system.py
  9. 1 1
      backend/app/api/routes/updates.py
  10. 112 112
      backend/app/core/database.py
  11. 6 6
      backend/app/main.py
  12. 16 16
      backend/app/services/archive.py
  13. 7 7
      backend/app/services/bambu_ftp.py
  14. 6 6
      backend/app/services/bambu_mqtt.py
  15. 1 1
      backend/app/services/camera.py
  16. 13 13
      backend/app/services/discovery.py
  17. 1 1
      backend/app/services/external_camera.py
  18. 1 1
      backend/app/services/firmware_check.py
  19. 1 1
      backend/app/services/homeassistant.py
  20. 2 2
      backend/app/services/mqtt_smart_plug.py
  21. 1 1
      backend/app/services/plate_detection.py
  22. 3 3
      backend/app/services/print_scheduler.py
  23. 3 3
      backend/app/services/printer_manager.py
  24. 1 1
      backend/app/services/spoolman_tracking.py
  25. 1 1
      backend/app/services/timelapse_processor.py
  26. 4 4
      backend/app/services/virtual_printer/ftp_server.py
  27. 4 6
      backend/app/services/virtual_printer/manager.py
  28. 7 7
      backend/app/services/virtual_printer/mqtt_server.py
  29. 10 10
      backend/app/services/virtual_printer/ssdp_server.py
  30. 7 7
      backend/app/services/virtual_printer/tcp_proxy.py
  31. 8 8
      backend/app/utils/threemf_tools.py

+ 19 - 19
backend/app/api/routes/archives.py

@@ -1883,7 +1883,7 @@ async def get_archive_capabilities(
                                 found_mesh = True
                                 found_mesh = True
                                 break
                                 break
                         except (KeyError, UnicodeDecodeError):
                         except (KeyError, UnicodeDecodeError):
-                            pass
+                            pass  # Skip unreadable .model entries in archive
 
 
                 # Extract filament colors from project_settings.config
                 # Extract filament colors from project_settings.config
                 if "Metadata/project_settings.config" in names:
                 if "Metadata/project_settings.config" in names:
@@ -1905,7 +1905,7 @@ async def get_archive_capabilities(
                                             max_x = max(max_x, x)
                                             max_x = max(max_x, x)
                                             max_y = max(max_y, y)
                                             max_y = max(max_y, y)
                                         except ValueError:
                                         except ValueError:
-                                            pass
+                                            pass  # Skip non-numeric printable_area coordinate
                             if max_x > 0 and max_y > 0:
                             if max_x > 0 and max_y > 0:
                                 volume["x"] = max_x
                                 volume["x"] = max_x
                                 volume["y"] = max_y
                                 volume["y"] = max_y
@@ -1916,7 +1916,7 @@ async def get_archive_capabilities(
                             try:
                             try:
                                 volume["z"] = int(printable_height)
                                 volume["z"] = int(printable_height)
                             except (ValueError, TypeError):
                             except (ValueError, TypeError):
-                                pass
+                                pass  # Skip unparseable printable_height value
 
 
                         # Extract filament colors
                         # Extract filament colors
                         raw_colors = config_data.get("filament_colour", [])
                         raw_colors = config_data.get("filament_colour", [])
@@ -1925,9 +1925,9 @@ async def get_archive_capabilities(
                                 if color and isinstance(color, str):
                                 if color and isinstance(color, str):
                                     colors.append(color)
                                     colors.append(color)
                     except (json.JSONDecodeError, KeyError, ValueError, TypeError):
                     except (json.JSONDecodeError, KeyError, ValueError, TypeError):
-                        pass
+                        pass  # Skip malformed project_settings.config
         except zipfile.BadZipFile:
         except zipfile.BadZipFile:
-            pass
+            pass  # File is not a valid zip/3MF archive
 
 
         return found_mesh, colors, volume
         return found_mesh, colors, volume
 
 
@@ -1958,7 +1958,7 @@ async def get_archive_capabilities(
                                 has_model = True
                                 has_model = True
                                 break
                                 break
                         except (KeyError, UnicodeDecodeError):
                         except (KeyError, UnicodeDecodeError):
-                            pass
+                            pass  # Skip unreadable .model entries in archive
 
 
             # Extract filament colors from slice_info.config (for gcode preview)
             # Extract filament colors from slice_info.config (for gcode preview)
             # These are the actual filaments used in the print, indexed by tool/extruder
             # These are the actual filaments used in the print, indexed by tool/extruder
@@ -1985,14 +1985,14 @@ async def get_archive_capabilities(
                                 if tool_id >= 0 and used_amount > 0:
                                 if tool_id >= 0 and used_amount > 0:
                                     filament_map[tool_id] = fcolor
                                     filament_map[tool_id] = fcolor
                             except ValueError:
                             except ValueError:
-                                pass
+                                pass  # Skip filament entry with non-numeric ID
 
 
                     if filament_map:
                     if filament_map:
                         max_tool = max(filament_map.keys())
                         max_tool = max(filament_map.keys())
                         for i in range(max_tool + 1):
                         for i in range(max_tool + 1):
                             slice_colors.append(filament_map.get(i, "#00AE42"))
                             slice_colors.append(filament_map.get(i, "#00AE42"))
                 except (KeyError, ValueError, ET.ParseError, UnicodeDecodeError):
                 except (KeyError, ValueError, ET.ParseError, UnicodeDecodeError):
-                    pass
+                    pass  # Skip malformed slice_info.config XML
 
 
             # Use slice_info colors if we don't have colors from source yet
             # Use slice_info colors if we don't have colors from source yet
             if not filament_colors and slice_colors:
             if not filament_colors and slice_colors:
@@ -2018,7 +2018,7 @@ async def get_archive_capabilities(
                                             max_x = max(max_x, x)
                                             max_x = max(max_x, x)
                                             max_y = max(max_y, y)
                                             max_y = max(max_y, y)
                                         except ValueError:
                                         except ValueError:
-                                            pass
+                                            pass  # Skip non-numeric printable_area coordinate
                             if max_x > 0 and max_y > 0:
                             if max_x > 0 and max_y > 0:
                                 build_volume["x"] = max_x
                                 build_volume["x"] = max_x
                                 build_volume["y"] = max_y
                                 build_volume["y"] = max_y
@@ -2028,7 +2028,7 @@ async def get_archive_capabilities(
                             try:
                             try:
                                 build_volume["z"] = int(printable_height)
                                 build_volume["z"] = int(printable_height)
                             except (ValueError, TypeError):
                             except (ValueError, TypeError):
-                                pass
+                                pass  # Skip unparseable printable_height value
 
 
                         # Fallback colors from project_settings if still empty
                         # Fallback colors from project_settings if still empty
                         if not filament_colors:
                         if not filament_colors:
@@ -2038,7 +2038,7 @@ async def get_archive_capabilities(
                                     if color and isinstance(color, str):
                                     if color and isinstance(color, str):
                                         filament_colors.append(color)
                                         filament_colors.append(color)
                     except (json.JSONDecodeError, KeyError, ValueError, TypeError):
                     except (json.JSONDecodeError, KeyError, ValueError, TypeError):
-                        pass
+                        pass  # Skip malformed project_settings.config
 
 
     except zipfile.BadZipFile:
     except zipfile.BadZipFile:
         raise HTTPException(400, "Invalid 3MF file")
         raise HTTPException(400, "Invalid 3MF file")
@@ -2127,7 +2127,7 @@ async def get_plate_preview(
                     if plate_elem is not None:
                     if plate_elem is not None:
                         plate_num = int(plate_elem.get("value", "1"))
                         plate_num = int(plate_elem.get("value", "1"))
                 except (KeyError, ValueError, ET.ParseError, UnicodeDecodeError):
                 except (KeyError, ValueError, ET.ParseError, UnicodeDecodeError):
-                    pass
+                    pass  # Default plate_num=1 if slice_info is missing or malformed
 
 
             # Try plate-specific image first, then fall back to plate_1
             # Try plate-specific image first, then fall back to plate_1
             preview_paths = [
             preview_paths = [
@@ -2290,7 +2290,7 @@ async def get_archive_plates(
                         plate_str = gf[15:-6]  # Remove "Metadata/plate_" and ".gcode"
                         plate_str = gf[15:-6]  # Remove "Metadata/plate_" and ".gcode"
                         plate_indices.append(int(plate_str))
                         plate_indices.append(int(plate_str))
                     except ValueError:
                     except ValueError:
-                        pass
+                        pass  # Skip gcode file with non-numeric plate index
             else:
             else:
                 plate_json_files = [n for n in namelist if n.startswith("Metadata/plate_") and n.endswith(".json")]
                 plate_json_files = [n for n in namelist if n.startswith("Metadata/plate_") and n.endswith(".json")]
                 plate_png_files = [
                 plate_png_files = [
@@ -2356,7 +2356,7 @@ async def get_archive_plates(
                                 try:
                                 try:
                                     plater_id = int(value)
                                     plater_id = int(value)
                                 except ValueError:
                                 except ValueError:
-                                    pass
+                                    pass  # Skip plate with non-numeric plater_id
                             elif key == "plater_name" and value:
                             elif key == "plater_name" and value:
                                 plater_name = value.strip()
                                 plater_name = value.strip()
                         if plater_id is not None and plater_name:
                         if plater_id is not None and plater_name:
@@ -2393,17 +2393,17 @@ async def get_archive_plates(
                             try:
                             try:
                                 plate_index = int(value)
                                 plate_index = int(value)
                             except ValueError:
                             except ValueError:
-                                pass
+                                pass  # Skip plate with non-numeric index
                         elif key == "prediction" and value:
                         elif key == "prediction" and value:
                             try:
                             try:
                                 plate_info["prediction"] = int(value)
                                 plate_info["prediction"] = int(value)
                             except ValueError:
                             except ValueError:
-                                pass
+                                pass  # Skip non-numeric print time prediction
                         elif key == "weight" and value:
                         elif key == "weight" and value:
                             try:
                             try:
                                 plate_info["weight"] = float(value)
                                 plate_info["weight"] = float(value)
                             except ValueError:
                             except ValueError:
-                                pass
+                                pass  # Skip non-numeric filament weight
 
 
                     # Get filaments used in this plate
                     # Get filaments used in this plate
                     for filament_elem in plate_elem.findall("filament"):
                     for filament_elem in plate_elem.findall("filament"):
@@ -2545,7 +2545,7 @@ async def get_plate_thumbnail(
                 data = zf.read(thumb_path)
                 data = zf.read(thumb_path)
                 return Response(content=data, media_type="image/png")
                 return Response(content=data, media_type="image/png")
     except (zipfile.BadZipFile, KeyError, OSError):
     except (zipfile.BadZipFile, KeyError, OSError):
-        pass
+        pass  # Fall through to 404 if archive is unreadable or thumbnail missing
 
 
     raise HTTPException(404, f"Thumbnail for plate {plate_index} not found")
     raise HTTPException(404, f"Thumbnail for plate {plate_index} not found")
 
 
@@ -2596,7 +2596,7 @@ async def get_filament_requirements(
                                 try:
                                 try:
                                     plate_index = int(meta.get("value", "0"))
                                     plate_index = int(meta.get("value", "0"))
                                 except ValueError:
                                 except ValueError:
-                                    pass
+                                    pass  # Skip plate with non-numeric index metadata
                                 break
                                 break
 
 
                         if plate_index == plate_id:
                         if plate_index == plate_id:

+ 1 - 1
backend/app/api/routes/camera.py

@@ -153,7 +153,7 @@ async def generate_chamber_mjpeg_stream(
             writer.close()
             writer.close()
             await writer.wait_closed()
             await writer.wait_closed()
         except OSError:
         except OSError:
-            pass
+            pass  # Connection already closed or broken; cleanup is best-effort
         logger.info("Chamber image stream stopped for %s (stream_id=%s)", ip_address, stream_id)
         logger.info("Chamber image stream stopped for %s (stream_id=%s)", ip_address, stream_id)
 
 
 
 

+ 12 - 12
backend/app/api/routes/library.py

@@ -162,7 +162,7 @@ def extract_gcode_thumbnail(file_path: Path) -> bytes | None:
                         if thumbnail_data is None or best_size > 0:
                         if thumbnail_data is None or best_size > 0:
                             thumbnail_data = decoded
                             thumbnail_data = decoded
                     except (binascii.Error, ValueError):
                     except (binascii.Error, ValueError):
-                        pass
+                        pass  # Skip thumbnail with invalid base64 data
                 in_thumbnail = False
                 in_thumbnail = False
                 thumbnail_lines = []
                 thumbnail_lines = []
                 continue
                 continue
@@ -222,7 +222,7 @@ def create_image_thumbnail(file_path: Path, thumbnails_dir: Path, max_size: int
                 shutil.copy2(file_path, thumb_path)
                 shutil.copy2(file_path, thumb_path)
                 return str(thumb_path)
                 return str(thumb_path)
         except OSError:
         except OSError:
-            pass
+            pass  # File inaccessible; fall through to return None
         return None
         return None
     except Exception as e:
     except Exception as e:
         logger.warning("Failed to create image thumbnail: %s", e)
         logger.warning("Failed to create image thumbnail: %s", e)
@@ -1088,7 +1088,7 @@ async def extract_zip_file(
         try:
         try:
             os.unlink(tmp_path)
             os.unlink(tmp_path)
         except OSError:
         except OSError:
-            pass
+            pass  # Best-effort temp file cleanup; ignore if already removed
 
 
 
 
 # ============ STL Thumbnail Batch Generation ============
 # ============ STL Thumbnail Batch Generation ============
@@ -1351,7 +1351,7 @@ async def get_library_file_plates(
                         plate_str = gf[15:-6]  # Remove "Metadata/plate_" and ".gcode"
                         plate_str = gf[15:-6]  # Remove "Metadata/plate_" and ".gcode"
                         plate_indices.append(int(plate_str))
                         plate_indices.append(int(plate_str))
                     except ValueError:
                     except ValueError:
-                        pass
+                        pass  # Skip gcode file with non-numeric plate index
             else:
             else:
                 plate_json_files = [n for n in namelist if n.startswith("Metadata/plate_") and n.endswith(".json")]
                 plate_json_files = [n for n in namelist if n.startswith("Metadata/plate_") and n.endswith(".json")]
                 plate_png_files = [
                 plate_png_files = [
@@ -1410,7 +1410,7 @@ async def get_library_file_plates(
                                 try:
                                 try:
                                     plater_id = int(value)
                                     plater_id = int(value)
                                 except ValueError:
                                 except ValueError:
-                                    pass
+                                    pass  # Ignore plate with non-numeric plater_id
                             elif key == "plater_name" and value:
                             elif key == "plater_name" and value:
                                 plater_name = value.strip()
                                 plater_name = value.strip()
                         if plater_id is not None and plater_name:
                         if plater_id is not None and plater_name:
@@ -1427,7 +1427,7 @@ async def get_library_file_plates(
                                         if obj_id not in plate_object_ids[plater_id]:
                                         if obj_id not in plate_object_ids[plater_id]:
                                             plate_object_ids[plater_id].append(obj_id)
                                             plate_object_ids[plater_id].append(obj_id)
                 except (KeyError, ValueError, ET.ParseError, UnicodeDecodeError):
                 except (KeyError, ValueError, ET.ParseError, UnicodeDecodeError):
-                    pass
+                    pass  # model_settings.config is optional; skip if missing or malformed
 
 
             # Parse slice_info.config for plate metadata
             # Parse slice_info.config for plate metadata
             plate_metadata = {}
             plate_metadata = {}
@@ -1446,17 +1446,17 @@ async def get_library_file_plates(
                             try:
                             try:
                                 plate_index = int(value)
                                 plate_index = int(value)
                             except ValueError:
                             except ValueError:
-                                pass
+                                pass  # Ignore plate with non-numeric index
                         elif key == "prediction" and value:
                         elif key == "prediction" and value:
                             try:
                             try:
                                 plate_info["prediction"] = int(value)
                                 plate_info["prediction"] = int(value)
                             except ValueError:
                             except ValueError:
-                                pass
+                                pass  # Leave prediction as None if not a valid integer
                         elif key == "weight" and value:
                         elif key == "weight" and value:
                             try:
                             try:
                                 plate_info["weight"] = float(value)
                                 plate_info["weight"] = float(value)
                             except ValueError:
                             except ValueError:
-                                pass
+                                pass  # Leave weight as None if not a valid number
 
 
                     # Get filaments used in this plate
                     # Get filaments used in this plate
                     for filament_elem in plate_elem.findall("filament"):
                     for filament_elem in plate_elem.findall("filament"):
@@ -1595,7 +1595,7 @@ async def get_library_file_plate_thumbnail(
                 data = zf.read(thumb_path)
                 data = zf.read(thumb_path)
                 return Response(content=data, media_type="image/png")
                 return Response(content=data, media_type="image/png")
     except (zipfile.BadZipFile, KeyError, OSError):
     except (zipfile.BadZipFile, KeyError, OSError):
-        pass
+        pass  # Archive unreadable or thumbnail missing; fall through to 404
 
 
     raise HTTPException(status_code=404, detail=f"Thumbnail for plate {plate_index} not found")
     raise HTTPException(status_code=404, detail=f"Thumbnail for plate {plate_index} not found")
 
 
@@ -1656,7 +1656,7 @@ async def get_library_file_filament_requirements(
                                 try:
                                 try:
                                     plate_index = int(meta.get("value", ""))
                                     plate_index = int(meta.get("value", ""))
                                 except ValueError:
                                 except ValueError:
-                                    pass
+                                    pass  # Skip plate with non-numeric index value
                                 break
                                 break
 
 
                         if plate_index == plate_id:
                         if plate_index == plate_id:
@@ -1885,7 +1885,7 @@ async def print_library_file(
                         plate_id = int(plate_str)
                         plate_id = int(plate_str)
                         break
                         break
         except (ValueError, zipfile.BadZipFile, OSError):
         except (ValueError, zipfile.BadZipFile, OSError):
-            pass
+            pass  # Default plate_id=1 if archive is unreadable or has no gcode
 
 
     logger.info(
     logger.info(
         f"Print library file {file_id}: archive_id={archive.id}, plate_id={plate_id}, "
         f"Print library file {file_id}: archive_id={archive.id}, plate_id={plate_id}, "

+ 4 - 4
backend/app/api/routes/pending_uploads.py

@@ -114,7 +114,7 @@ async def archive_all_pending(
                 try:
                 try:
                     file_path.unlink()
                     file_path.unlink()
                 except OSError:
                 except OSError:
-                    pass
+                    pass  # Best-effort temp file cleanup after archiving
             else:
             else:
                 failed += 1
                 failed += 1
         except Exception:  # Mixed async DB + archive operations
         except Exception:  # Mixed async DB + archive operations
@@ -145,7 +145,7 @@ async def discard_all_pending(
             file_path = Path(pending.file_path)
             file_path = Path(pending.file_path)
             file_path.unlink(missing_ok=True)
             file_path.unlink(missing_ok=True)
         except OSError:
         except OSError:
-            pass
+            pass  # Best-effort file deletion; record is still marked discarded
 
 
         pending.status = "discarded"
         pending.status = "discarded"
         discarded += 1
         discarded += 1
@@ -231,7 +231,7 @@ async def archive_pending_upload(
     try:
     try:
         file_path.unlink()
         file_path.unlink()
     except OSError:
     except OSError:
-        pass
+        pass  # Best-effort temp file cleanup after successful archive
 
 
     return {
     return {
         "id": archive.id,
         "id": archive.id,
@@ -258,7 +258,7 @@ async def discard_pending_upload(
     try:
     try:
         file_path.unlink(missing_ok=True)
         file_path.unlink(missing_ok=True)
     except OSError:
     except OSError:
-        pass
+        pass  # Best-effort file deletion on discard
 
 
     # Update status
     # Update status
     pending.status = "discarded"
     pending.status = "discarded"

+ 2 - 2
backend/app/api/routes/print_queue.py

@@ -66,7 +66,7 @@ def _extract_filament_types_from_3mf(file_path: Path, plate_id: int | None = Non
                             try:
                             try:
                                 plate_index = int(meta.get("value", "0"))
                                 plate_index = int(meta.get("value", "0"))
                             except ValueError:
                             except ValueError:
-                                pass
+                                pass  # Skip plate with unparseable index
                             break
                             break
 
 
                     if plate_index == plate_id:
                     if plate_index == plate_id:
@@ -124,7 +124,7 @@ def _extract_print_time_from_3mf(file_path: Path, plate_id: int | None = None) -
                             try:
                             try:
                                 plate_index = int(meta.get("value", "0"))
                                 plate_index = int(meta.get("value", "0"))
                             except ValueError:
                             except ValueError:
-                                pass
+                                pass  # Skip plate with unparseable index
                             break
                             break
 
 
                     if plate_index == plate_id:
                     if plate_index == plate_id:

+ 10 - 10
backend/app/api/routes/printers.py

@@ -248,7 +248,7 @@ async def get_printer_status(
             try:
             try:
                 kprofile_map[kp.slot_id] = float(kp.k_value)
                 kprofile_map[kp.slot_id] = float(kp.k_value)
             except (ValueError, TypeError):
             except (ValueError, TypeError):
-                pass
+                pass  # Skip K-profile entries with unparseable values
 
 
     if "ams" in raw_data and isinstance(raw_data["ams"], list):
     if "ams" in raw_data and isinstance(raw_data["ams"], list):
         ams_exists = True
         ams_exists = True
@@ -299,12 +299,12 @@ async def get_printer_status(
                 try:
                 try:
                     humidity_value = int(humidity_raw)
                     humidity_value = int(humidity_raw)
                 except (ValueError, TypeError):
                 except (ValueError, TypeError):
-                    pass
+                    pass  # Skip unparseable humidity; will try index fallback
             if humidity_value is None and humidity_idx is not None:
             if humidity_value is None and humidity_idx is not None:
                 try:
                 try:
                     humidity_value = int(humidity_idx)
                     humidity_value = int(humidity_idx)
                 except (ValueError, TypeError):
                 except (ValueError, TypeError):
-                    pass
+                    pass  # Skip unparseable humidity index; humidity remains None
             # AMS-HT has 1 tray, regular AMS has 4 trays
             # AMS-HT has 1 tray, regular AMS has 4 trays
             is_ams_ht = len(trays) == 1
             is_ams_ht = len(trays) == 1
 
 
@@ -893,7 +893,7 @@ async def get_printer_file_plates(
                         plate_str = gf[15:-6]  # Remove "Metadata/plate_" and ".gcode"
                         plate_str = gf[15:-6]  # Remove "Metadata/plate_" and ".gcode"
                         plate_indices.append(int(plate_str))
                         plate_indices.append(int(plate_str))
                     except ValueError:
                     except ValueError:
-                        pass
+                        pass  # Skip gcode files with non-numeric plate indices
             else:
             else:
                 plate_json_files = [n for n in namelist if n.startswith("Metadata/plate_") and n.endswith(".json")]
                 plate_json_files = [n for n in namelist if n.startswith("Metadata/plate_") and n.endswith(".json")]
                 plate_png_files = [
                 plate_png_files = [
@@ -946,13 +946,13 @@ async def get_printer_file_plates(
                                 try:
                                 try:
                                     plater_id = int(value)
                                     plater_id = int(value)
                                 except ValueError:
                                 except ValueError:
-                                    pass
+                                    pass  # Skip plate with unparseable ID
                             elif key == "plater_name" and value:
                             elif key == "plater_name" and value:
                                 plater_name = value.strip()
                                 plater_name = value.strip()
                         if plater_id is not None and plater_name:
                         if plater_id is not None and plater_name:
                             plate_names[plater_id] = plater_name
                             plate_names[plater_id] = plater_name
                 except Exception:
                 except Exception:
-                    pass
+                    pass  # Plate names are optional; continue without them
 
 
             # Parse slice_info.config for plate metadata
             # Parse slice_info.config for plate metadata
             plate_metadata = {}
             plate_metadata = {}
@@ -971,17 +971,17 @@ async def get_printer_file_plates(
                             try:
                             try:
                                 plate_index = int(value)
                                 plate_index = int(value)
                             except ValueError:
                             except ValueError:
-                                pass
+                                pass  # Skip plate with unparseable index
                         elif key == "prediction" and value:
                         elif key == "prediction" and value:
                             try:
                             try:
                                 plate_info["prediction"] = int(value)
                                 plate_info["prediction"] = int(value)
                             except ValueError:
                             except ValueError:
-                                pass
+                                pass  # Skip unparseable prediction; leave as None
                         elif key == "weight" and value:
                         elif key == "weight" and value:
                             try:
                             try:
                                 plate_info["weight"] = float(value)
                                 plate_info["weight"] = float(value)
                             except ValueError:
                             except ValueError:
-                                pass
+                                pass  # Skip unparseable weight; leave as None
 
 
                     # Get filaments used in this plate
                     # Get filaments used in this plate
                     for filament_elem in plate_elem.findall("filament"):
                     for filament_elem in plate_elem.findall("filament"):
@@ -1115,7 +1115,7 @@ async def get_printer_file_plate_thumbnail(
                 image_data = zf.read(thumb_path)
                 image_data = zf.read(thumb_path)
                 return Response(content=image_data, media_type="image/png")
                 return Response(content=image_data, media_type="image/png")
     except (zipfile.BadZipFile, KeyError, OSError):
     except (zipfile.BadZipFile, KeyError, OSError):
-        pass
+        pass  # Corrupt or unreadable 3MF; fall through to 404
 
 
     raise HTTPException(status_code=404, detail=f"Thumbnail for plate {plate_index} not found")
     raise HTTPException(status_code=404, detail=f"Thumbnail for plate {plate_index} not found")
 
 

+ 1 - 1
backend/app/api/routes/support.py

@@ -59,7 +59,7 @@ async def _get_debug_setting(db: AsyncSession) -> tuple[bool, datetime | None]:
         try:
         try:
             enabled_at = datetime.fromisoformat(enabled_at_setting.value)
             enabled_at = datetime.fromisoformat(enabled_at_setting.value)
         except ValueError:
         except ValueError:
-            pass
+            pass  # Ignore malformed timestamp; enabled_at stays None
 
 
     return enabled, enabled_at
     return enabled, enabled_at
 
 

+ 1 - 1
backend/app/api/routes/system.py

@@ -32,7 +32,7 @@ def get_directory_size(path: Path) -> int:
             if entry.is_file():
             if entry.is_file():
                 total += entry.stat().st_size
                 total += entry.stat().st_size
     except (PermissionError, OSError):
     except (PermissionError, OSError):
-        pass
+        pass  # Return partial total if directory traversal is interrupted
     return total
     return total
 
 
 
 

+ 1 - 1
backend/app/api/routes/updates.py

@@ -39,7 +39,7 @@ def _is_docker_environment() -> bool:
             if "docker" in f.read():
             if "docker" in f.read():
                 return True
                 return True
     except (FileNotFoundError, PermissionError):
     except (FileNotFoundError, PermissionError):
-        pass
+        pass  # cgroup file unavailable; continue with other detection methods
     git_dir = settings.base_dir / ".git"
     git_dir = settings.base_dir / ".git"
     return not git_dir.exists()
     return not git_dir.exists()
 
 

+ 112 - 112
backend/app/core/database.py

@@ -170,43 +170,43 @@ async def run_migrations(conn):
     try:
     try:
         await conn.execute(text("ALTER TABLE smart_plugs ADD COLUMN power_alert_enabled BOOLEAN DEFAULT 0"))
         await conn.execute(text("ALTER TABLE smart_plugs ADD COLUMN power_alert_enabled BOOLEAN DEFAULT 0"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
     try:
     try:
         await conn.execute(text("ALTER TABLE smart_plugs ADD COLUMN power_alert_high REAL"))
         await conn.execute(text("ALTER TABLE smart_plugs ADD COLUMN power_alert_high REAL"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
     try:
     try:
         await conn.execute(text("ALTER TABLE smart_plugs ADD COLUMN power_alert_low REAL"))
         await conn.execute(text("ALTER TABLE smart_plugs ADD COLUMN power_alert_low REAL"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
     try:
     try:
         await conn.execute(text("ALTER TABLE smart_plugs ADD COLUMN power_alert_last_triggered DATETIME"))
         await conn.execute(text("ALTER TABLE smart_plugs ADD COLUMN power_alert_last_triggered DATETIME"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
 
 
     # Migration: Add schedule columns to smart_plugs
     # Migration: Add schedule columns to smart_plugs
     try:
     try:
         await conn.execute(text("ALTER TABLE smart_plugs ADD COLUMN schedule_enabled BOOLEAN DEFAULT 0"))
         await conn.execute(text("ALTER TABLE smart_plugs ADD COLUMN schedule_enabled BOOLEAN DEFAULT 0"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
     try:
     try:
         await conn.execute(text("ALTER TABLE smart_plugs ADD COLUMN schedule_on_time VARCHAR(5)"))
         await conn.execute(text("ALTER TABLE smart_plugs ADD COLUMN schedule_on_time VARCHAR(5)"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
     try:
     try:
         await conn.execute(text("ALTER TABLE smart_plugs ADD COLUMN schedule_off_time VARCHAR(5)"))
         await conn.execute(text("ALTER TABLE smart_plugs ADD COLUMN schedule_off_time VARCHAR(5)"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
 
 
     # Migration: Add daily digest columns to notification_providers
     # Migration: Add daily digest columns to notification_providers
     try:
     try:
         await conn.execute(text("ALTER TABLE notification_providers ADD COLUMN daily_digest_enabled BOOLEAN DEFAULT 0"))
         await conn.execute(text("ALTER TABLE notification_providers ADD COLUMN daily_digest_enabled BOOLEAN DEFAULT 0"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
     try:
     try:
         await conn.execute(text("ALTER TABLE notification_providers ADD COLUMN daily_digest_time VARCHAR(5)"))
         await conn.execute(text("ALTER TABLE notification_providers ADD COLUMN daily_digest_time VARCHAR(5)"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
 
 
     # Migration: Add project_id column to print_archives
     # Migration: Add project_id column to print_archives
     try:
     try:
@@ -214,7 +214,7 @@ async def run_migrations(conn):
             text("ALTER TABLE print_archives ADD COLUMN project_id INTEGER REFERENCES projects(id) ON DELETE SET NULL")
             text("ALTER TABLE print_archives ADD COLUMN project_id INTEGER REFERENCES projects(id) ON DELETE SET NULL")
         )
         )
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
 
 
     # Migration: Add project_id column to print_queue
     # Migration: Add project_id column to print_queue
     try:
     try:
@@ -222,7 +222,7 @@ async def run_migrations(conn):
             text("ALTER TABLE print_queue ADD COLUMN project_id INTEGER REFERENCES projects(id) ON DELETE SET NULL")
             text("ALTER TABLE print_queue ADD COLUMN project_id INTEGER REFERENCES projects(id) ON DELETE SET NULL")
         )
         )
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
 
 
     # Migration: Create FTS5 virtual table for archive full-text search
     # Migration: Create FTS5 virtual table for archive full-text search
     try:
     try:
@@ -241,7 +241,7 @@ async def run_migrations(conn):
         """)
         """)
         )
         )
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
 
 
     # Migration: Create triggers to keep FTS index in sync
     # Migration: Create triggers to keep FTS index in sync
     try:
     try:
@@ -254,7 +254,7 @@ async def run_migrations(conn):
         """)
         """)
         )
         )
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
 
 
     try:
     try:
         await conn.execute(
         await conn.execute(
@@ -266,7 +266,7 @@ async def run_migrations(conn):
         """)
         """)
         )
         )
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
 
 
     try:
     try:
         await conn.execute(
         await conn.execute(
@@ -280,29 +280,29 @@ async def run_migrations(conn):
         """)
         """)
         )
         )
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
 
 
     # Migration: Add auto_off_pending columns to smart_plugs (for restart recovery)
     # Migration: Add auto_off_pending columns to smart_plugs (for restart recovery)
     try:
     try:
         await conn.execute(text("ALTER TABLE smart_plugs ADD COLUMN auto_off_pending BOOLEAN DEFAULT 0"))
         await conn.execute(text("ALTER TABLE smart_plugs ADD COLUMN auto_off_pending BOOLEAN DEFAULT 0"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
     try:
     try:
         await conn.execute(text("ALTER TABLE smart_plugs ADD COLUMN auto_off_pending_since DATETIME"))
         await conn.execute(text("ALTER TABLE smart_plugs ADD COLUMN auto_off_pending_since DATETIME"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
 
 
     # Migration: Add AMS alarm notification columns to notification_providers
     # Migration: Add AMS alarm notification columns to notification_providers
     try:
     try:
         await conn.execute(text("ALTER TABLE notification_providers ADD COLUMN on_ams_humidity_high BOOLEAN DEFAULT 0"))
         await conn.execute(text("ALTER TABLE notification_providers ADD COLUMN on_ams_humidity_high BOOLEAN DEFAULT 0"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
     try:
     try:
         await conn.execute(
         await conn.execute(
             text("ALTER TABLE notification_providers ADD COLUMN on_ams_temperature_high BOOLEAN DEFAULT 0")
             text("ALTER TABLE notification_providers ADD COLUMN on_ams_temperature_high BOOLEAN DEFAULT 0")
         )
         )
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
 
 
     # Migration: Add AMS-HT alarm notification columns to notification_providers
     # Migration: Add AMS-HT alarm notification columns to notification_providers
     try:
     try:
@@ -310,67 +310,67 @@ async def run_migrations(conn):
             text("ALTER TABLE notification_providers ADD COLUMN on_ams_ht_humidity_high BOOLEAN DEFAULT 0")
             text("ALTER TABLE notification_providers ADD COLUMN on_ams_ht_humidity_high BOOLEAN DEFAULT 0")
         )
         )
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
     try:
     try:
         await conn.execute(
         await conn.execute(
             text("ALTER TABLE notification_providers ADD COLUMN on_ams_ht_temperature_high BOOLEAN DEFAULT 0")
             text("ALTER TABLE notification_providers ADD COLUMN on_ams_ht_temperature_high BOOLEAN DEFAULT 0")
         )
         )
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
 
 
     # Migration: Add plate not empty notification column to notification_providers
     # Migration: Add plate not empty notification column to notification_providers
     try:
     try:
         await conn.execute(text("ALTER TABLE notification_providers ADD COLUMN on_plate_not_empty BOOLEAN DEFAULT 1"))
         await conn.execute(text("ALTER TABLE notification_providers ADD COLUMN on_plate_not_empty BOOLEAN DEFAULT 1"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
 
 
     # Migration: Add notes column to projects (Phase 2)
     # Migration: Add notes column to projects (Phase 2)
     try:
     try:
         await conn.execute(text("ALTER TABLE projects ADD COLUMN notes TEXT"))
         await conn.execute(text("ALTER TABLE projects ADD COLUMN notes TEXT"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
 
 
     # Migration: Add attachments column to projects (Phase 3)
     # Migration: Add attachments column to projects (Phase 3)
     try:
     try:
         await conn.execute(text("ALTER TABLE projects ADD COLUMN attachments JSON"))
         await conn.execute(text("ALTER TABLE projects ADD COLUMN attachments JSON"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
 
 
     # Migration: Add tags column to projects (Phase 4)
     # Migration: Add tags column to projects (Phase 4)
     try:
     try:
         await conn.execute(text("ALTER TABLE projects ADD COLUMN tags TEXT"))
         await conn.execute(text("ALTER TABLE projects ADD COLUMN tags TEXT"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
 
 
     # Migration: Add due_date column to projects (Phase 5)
     # Migration: Add due_date column to projects (Phase 5)
     try:
     try:
         await conn.execute(text("ALTER TABLE projects ADD COLUMN due_date DATETIME"))
         await conn.execute(text("ALTER TABLE projects ADD COLUMN due_date DATETIME"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
 
 
     # Migration: Add priority column to projects (Phase 5)
     # Migration: Add priority column to projects (Phase 5)
     try:
     try:
         await conn.execute(text("ALTER TABLE projects ADD COLUMN priority VARCHAR(20) DEFAULT 'normal'"))
         await conn.execute(text("ALTER TABLE projects ADD COLUMN priority VARCHAR(20) DEFAULT 'normal'"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
 
 
     # Migration: Add budget column to projects (Phase 6)
     # Migration: Add budget column to projects (Phase 6)
     try:
     try:
         await conn.execute(text("ALTER TABLE projects ADD COLUMN budget REAL"))
         await conn.execute(text("ALTER TABLE projects ADD COLUMN budget REAL"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
 
 
     # Migration: Add is_template column to projects (Phase 8)
     # Migration: Add is_template column to projects (Phase 8)
     try:
     try:
         await conn.execute(text("ALTER TABLE projects ADD COLUMN is_template BOOLEAN DEFAULT 0"))
         await conn.execute(text("ALTER TABLE projects ADD COLUMN is_template BOOLEAN DEFAULT 0"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
 
 
     # Migration: Add template_source_id column to projects (Phase 8)
     # Migration: Add template_source_id column to projects (Phase 8)
     try:
     try:
         await conn.execute(text("ALTER TABLE projects ADD COLUMN template_source_id INTEGER"))
         await conn.execute(text("ALTER TABLE projects ADD COLUMN template_source_id INTEGER"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
 
 
     # Migration: Add parent_id column to projects (Phase 10)
     # Migration: Add parent_id column to projects (Phase 10)
     try:
     try:
@@ -378,77 +378,77 @@ async def run_migrations(conn):
             text("ALTER TABLE projects ADD COLUMN parent_id INTEGER REFERENCES projects(id) ON DELETE SET NULL")
             text("ALTER TABLE projects ADD COLUMN parent_id INTEGER REFERENCES projects(id) ON DELETE SET NULL")
         )
         )
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
 
 
     # Migration: Rename quantity_printed to quantity_acquired in project_bom_items
     # Migration: Rename quantity_printed to quantity_acquired in project_bom_items
     try:
     try:
         await conn.execute(text("ALTER TABLE project_bom_items RENAME COLUMN quantity_printed TO quantity_acquired"))
         await conn.execute(text("ALTER TABLE project_bom_items RENAME COLUMN quantity_printed TO quantity_acquired"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
 
 
     # Migration: Add unit_price column to project_bom_items
     # Migration: Add unit_price column to project_bom_items
     try:
     try:
         await conn.execute(text("ALTER TABLE project_bom_items ADD COLUMN unit_price REAL"))
         await conn.execute(text("ALTER TABLE project_bom_items ADD COLUMN unit_price REAL"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
 
 
     # Migration: Add sourcing_url column to project_bom_items
     # Migration: Add sourcing_url column to project_bom_items
     try:
     try:
         await conn.execute(text("ALTER TABLE project_bom_items ADD COLUMN sourcing_url VARCHAR(512)"))
         await conn.execute(text("ALTER TABLE project_bom_items ADD COLUMN sourcing_url VARCHAR(512)"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
 
 
     # Migration: Rename notes to remarks in project_bom_items
     # Migration: Rename notes to remarks in project_bom_items
     try:
     try:
         await conn.execute(text("ALTER TABLE project_bom_items RENAME COLUMN notes TO remarks"))
         await conn.execute(text("ALTER TABLE project_bom_items RENAME COLUMN notes TO remarks"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
 
 
     # Migration: Add show_in_switchbar column to smart_plugs
     # Migration: Add show_in_switchbar column to smart_plugs
     try:
     try:
         await conn.execute(text("ALTER TABLE smart_plugs ADD COLUMN show_in_switchbar BOOLEAN DEFAULT 0"))
         await conn.execute(text("ALTER TABLE smart_plugs ADD COLUMN show_in_switchbar BOOLEAN DEFAULT 0"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
 
 
     # Migration: Add runtime tracking columns to printers
     # Migration: Add runtime tracking columns to printers
     try:
     try:
         await conn.execute(text("ALTER TABLE printers ADD COLUMN runtime_seconds INTEGER DEFAULT 0"))
         await conn.execute(text("ALTER TABLE printers ADD COLUMN runtime_seconds INTEGER DEFAULT 0"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
     try:
     try:
         await conn.execute(text("ALTER TABLE printers ADD COLUMN last_runtime_update DATETIME"))
         await conn.execute(text("ALTER TABLE printers ADD COLUMN last_runtime_update DATETIME"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
 
 
     # Migration: Add quantity column to print_archives for tracking item count
     # Migration: Add quantity column to print_archives for tracking item count
     try:
     try:
         await conn.execute(text("ALTER TABLE print_archives ADD COLUMN quantity INTEGER DEFAULT 1"))
         await conn.execute(text("ALTER TABLE print_archives ADD COLUMN quantity INTEGER DEFAULT 1"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
 
 
     # Migration: Add manual_start column to print_queue for staged prints
     # Migration: Add manual_start column to print_queue for staged prints
     try:
     try:
         await conn.execute(text("ALTER TABLE print_queue ADD COLUMN manual_start BOOLEAN DEFAULT 0"))
         await conn.execute(text("ALTER TABLE print_queue ADD COLUMN manual_start BOOLEAN DEFAULT 0"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
 
 
     # Migration: Add wiki_url column to maintenance_types for documentation links
     # Migration: Add wiki_url column to maintenance_types for documentation links
     try:
     try:
         await conn.execute(text("ALTER TABLE maintenance_types ADD COLUMN wiki_url VARCHAR(500)"))
         await conn.execute(text("ALTER TABLE maintenance_types ADD COLUMN wiki_url VARCHAR(500)"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
 
 
     # Migration: Add ams_mapping column to print_queue for storing filament slot assignments
     # Migration: Add ams_mapping column to print_queue for storing filament slot assignments
     try:
     try:
         await conn.execute(text("ALTER TABLE print_queue ADD COLUMN ams_mapping TEXT"))
         await conn.execute(text("ALTER TABLE print_queue ADD COLUMN ams_mapping TEXT"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
 
 
     # Migration: Add target_parts_count column to projects for tracking total parts needed
     # Migration: Add target_parts_count column to projects for tracking total parts needed
     try:
     try:
         await conn.execute(text("ALTER TABLE projects ADD COLUMN target_parts_count INTEGER"))
         await conn.execute(text("ALTER TABLE projects ADD COLUMN target_parts_count INTEGER"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
 
 
     # Migration: Make printer_id nullable in print_queue for unassigned queue items
     # Migration: Make printer_id nullable in print_queue for unassigned queue items
     # SQLite doesn't support ALTER COLUMN, so we need to recreate the table
     # SQLite doesn't support ALTER COLUMN, so we need to recreate the table
@@ -492,19 +492,19 @@ async def run_migrations(conn):
             await conn.execute(text("DROP TABLE print_queue"))
             await conn.execute(text("DROP TABLE print_queue"))
             await conn.execute(text("ALTER TABLE print_queue_new RENAME TO print_queue"))
             await conn.execute(text("ALTER TABLE print_queue_new RENAME TO print_queue"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
 
 
     # Migration: Add plug_type column to smart_plugs for HA integration
     # Migration: Add plug_type column to smart_plugs for HA integration
     try:
     try:
         await conn.execute(text("ALTER TABLE smart_plugs ADD COLUMN plug_type VARCHAR(20) DEFAULT 'tasmota'"))
         await conn.execute(text("ALTER TABLE smart_plugs ADD COLUMN plug_type VARCHAR(20) DEFAULT 'tasmota'"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
 
 
     # Migration: Add ha_entity_id column to smart_plugs for HA integration
     # Migration: Add ha_entity_id column to smart_plugs for HA integration
     try:
     try:
         await conn.execute(text("ALTER TABLE smart_plugs ADD COLUMN ha_entity_id VARCHAR(100)"))
         await conn.execute(text("ALTER TABLE smart_plugs ADD COLUMN ha_entity_id VARCHAR(100)"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
 
 
     # Migration: Add project_id column to library_folders for linking folders to projects
     # Migration: Add project_id column to library_folders for linking folders to projects
     try:
     try:
@@ -512,7 +512,7 @@ async def run_migrations(conn):
             text("ALTER TABLE library_folders ADD COLUMN project_id INTEGER REFERENCES projects(id) ON DELETE SET NULL")
             text("ALTER TABLE library_folders ADD COLUMN project_id INTEGER REFERENCES projects(id) ON DELETE SET NULL")
         )
         )
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
 
 
     # Migration: Add archive_id column to library_folders for linking folders to archives
     # Migration: Add archive_id column to library_folders for linking folders to archives
     try:
     try:
@@ -522,7 +522,7 @@ async def run_migrations(conn):
             )
             )
         )
         )
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
 
 
     # Migration: Make ip_address nullable for HA plugs (SQLite requires table recreation)
     # Migration: Make ip_address nullable for HA plugs (SQLite requires table recreation)
     try:
     try:
@@ -582,39 +582,39 @@ async def run_migrations(conn):
             await conn.execute(text("DROP TABLE smart_plugs"))
             await conn.execute(text("DROP TABLE smart_plugs"))
             await conn.execute(text("ALTER TABLE smart_plugs_new RENAME TO smart_plugs"))
             await conn.execute(text("ALTER TABLE smart_plugs_new RENAME TO smart_plugs"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
 
 
     # Migration: Add plate_id column to print_queue for multi-plate 3MF support
     # Migration: Add plate_id column to print_queue for multi-plate 3MF support
     try:
     try:
         await conn.execute(text("ALTER TABLE print_queue ADD COLUMN plate_id INTEGER"))
         await conn.execute(text("ALTER TABLE print_queue ADD COLUMN plate_id INTEGER"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
 
 
     # Migration: Add print options columns to print_queue
     # Migration: Add print options columns to print_queue
     try:
     try:
         await conn.execute(text("ALTER TABLE print_queue ADD COLUMN bed_levelling BOOLEAN DEFAULT 1"))
         await conn.execute(text("ALTER TABLE print_queue ADD COLUMN bed_levelling BOOLEAN DEFAULT 1"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
     try:
     try:
         await conn.execute(text("ALTER TABLE print_queue ADD COLUMN flow_cali BOOLEAN DEFAULT 0"))
         await conn.execute(text("ALTER TABLE print_queue ADD COLUMN flow_cali BOOLEAN DEFAULT 0"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
     try:
     try:
         await conn.execute(text("ALTER TABLE print_queue ADD COLUMN vibration_cali BOOLEAN DEFAULT 1"))
         await conn.execute(text("ALTER TABLE print_queue ADD COLUMN vibration_cali BOOLEAN DEFAULT 1"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
     try:
     try:
         await conn.execute(text("ALTER TABLE print_queue ADD COLUMN layer_inspect BOOLEAN DEFAULT 0"))
         await conn.execute(text("ALTER TABLE print_queue ADD COLUMN layer_inspect BOOLEAN DEFAULT 0"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
     try:
     try:
         await conn.execute(text("ALTER TABLE print_queue ADD COLUMN timelapse BOOLEAN DEFAULT 0"))
         await conn.execute(text("ALTER TABLE print_queue ADD COLUMN timelapse BOOLEAN DEFAULT 0"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
     try:
     try:
         await conn.execute(text("ALTER TABLE print_queue ADD COLUMN use_ams BOOLEAN DEFAULT 1"))
         await conn.execute(text("ALTER TABLE print_queue ADD COLUMN use_ams BOOLEAN DEFAULT 1"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
 
 
     # Migration: Add library_file_id column to print_queue and make archive_id nullable
     # Migration: Add library_file_id column to print_queue and make archive_id nullable
     # This allows queue items to reference library files directly (archive created at print start)
     # This allows queue items to reference library files directly (archive created at print start)
@@ -625,7 +625,7 @@ async def run_migrations(conn):
             )
             )
         )
         )
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
 
 
     # Check if archive_id needs to be made nullable (requires table recreation in SQLite)
     # Check if archive_id needs to be made nullable (requires table recreation in SQLite)
     try:
     try:
@@ -676,21 +676,21 @@ async def run_migrations(conn):
             await conn.execute(text("DROP TABLE print_queue"))
             await conn.execute(text("DROP TABLE print_queue"))
             await conn.execute(text("ALTER TABLE print_queue_new2 RENAME TO print_queue"))
             await conn.execute(text("ALTER TABLE print_queue_new2 RENAME TO print_queue"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
 
 
     # Migration: Add HA energy sensor entity columns to smart_plugs
     # Migration: Add HA energy sensor entity columns to smart_plugs
     try:
     try:
         await conn.execute(text("ALTER TABLE smart_plugs ADD COLUMN ha_power_entity VARCHAR(100)"))
         await conn.execute(text("ALTER TABLE smart_plugs ADD COLUMN ha_power_entity VARCHAR(100)"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
     try:
     try:
         await conn.execute(text("ALTER TABLE smart_plugs ADD COLUMN ha_energy_today_entity VARCHAR(100)"))
         await conn.execute(text("ALTER TABLE smart_plugs ADD COLUMN ha_energy_today_entity VARCHAR(100)"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
     try:
     try:
         await conn.execute(text("ALTER TABLE smart_plugs ADD COLUMN ha_energy_total_entity VARCHAR(100)"))
         await conn.execute(text("ALTER TABLE smart_plugs ADD COLUMN ha_energy_total_entity VARCHAR(100)"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
 
 
     # Migration: Create users table for authentication
     # Migration: Create users table for authentication
     try:
     try:
@@ -709,39 +709,39 @@ async def run_migrations(conn):
         )
         )
         await conn.execute(text("CREATE INDEX IF NOT EXISTS ix_users_username ON users(username)"))
         await conn.execute(text("CREATE INDEX IF NOT EXISTS ix_users_username ON users(username)"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
 
 
     # Migration: Add external camera columns to printers
     # Migration: Add external camera columns to printers
     try:
     try:
         await conn.execute(text("ALTER TABLE printers ADD COLUMN external_camera_url VARCHAR(500)"))
         await conn.execute(text("ALTER TABLE printers ADD COLUMN external_camera_url VARCHAR(500)"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
     try:
     try:
         await conn.execute(text("ALTER TABLE printers ADD COLUMN external_camera_type VARCHAR(20)"))
         await conn.execute(text("ALTER TABLE printers ADD COLUMN external_camera_type VARCHAR(20)"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
     try:
     try:
         await conn.execute(text("ALTER TABLE printers ADD COLUMN external_camera_enabled BOOLEAN DEFAULT 0"))
         await conn.execute(text("ALTER TABLE printers ADD COLUMN external_camera_enabled BOOLEAN DEFAULT 0"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
 
 
     # Migration: Add external_url column to print_archives for user-defined links (Printables, etc.)
     # Migration: Add external_url column to print_archives for user-defined links (Printables, etc.)
     try:
     try:
         await conn.execute(text("ALTER TABLE print_archives ADD COLUMN external_url VARCHAR(500)"))
         await conn.execute(text("ALTER TABLE print_archives ADD COLUMN external_url VARCHAR(500)"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
 
 
     # Migration: Add sliced_for_model column to print_archives for model-based queue assignment
     # Migration: Add sliced_for_model column to print_archives for model-based queue assignment
     try:
     try:
         await conn.execute(text("ALTER TABLE print_archives ADD COLUMN sliced_for_model VARCHAR(50)"))
         await conn.execute(text("ALTER TABLE print_archives ADD COLUMN sliced_for_model VARCHAR(50)"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
 
 
     # Migration: Add is_external column to library_files for external cloud files
     # Migration: Add is_external column to library_files for external cloud files
     try:
     try:
         await conn.execute(text("ALTER TABLE library_files ADD COLUMN is_external BOOLEAN DEFAULT 0"))
         await conn.execute(text("ALTER TABLE library_files ADD COLUMN is_external BOOLEAN DEFAULT 0"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
 
 
     # Migration: Add project_id column to library_files
     # Migration: Add project_id column to library_files
     try:
     try:
@@ -749,51 +749,51 @@ async def run_migrations(conn):
             text("ALTER TABLE library_files ADD COLUMN project_id INTEGER REFERENCES projects(id) ON DELETE SET NULL")
             text("ALTER TABLE library_files ADD COLUMN project_id INTEGER REFERENCES projects(id) ON DELETE SET NULL")
         )
         )
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
 
 
     # Migration: Add is_external column to library_folders for external cloud folders
     # Migration: Add is_external column to library_folders for external cloud folders
     try:
     try:
         await conn.execute(text("ALTER TABLE library_folders ADD COLUMN is_external BOOLEAN DEFAULT 0"))
         await conn.execute(text("ALTER TABLE library_folders ADD COLUMN is_external BOOLEAN DEFAULT 0"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
 
 
     # Migration: Add external folder settings columns to library_folders
     # Migration: Add external folder settings columns to library_folders
     try:
     try:
         await conn.execute(text("ALTER TABLE library_folders ADD COLUMN external_readonly BOOLEAN DEFAULT 0"))
         await conn.execute(text("ALTER TABLE library_folders ADD COLUMN external_readonly BOOLEAN DEFAULT 0"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
     try:
     try:
         await conn.execute(text("ALTER TABLE library_folders ADD COLUMN external_show_hidden BOOLEAN DEFAULT 0"))
         await conn.execute(text("ALTER TABLE library_folders ADD COLUMN external_show_hidden BOOLEAN DEFAULT 0"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
     try:
     try:
         await conn.execute(text("ALTER TABLE library_folders ADD COLUMN external_path VARCHAR(500)"))
         await conn.execute(text("ALTER TABLE library_folders ADD COLUMN external_path VARCHAR(500)"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
 
 
     # Migration: Add plate_detection_enabled column to printers
     # Migration: Add plate_detection_enabled column to printers
     try:
     try:
         await conn.execute(text("ALTER TABLE printers ADD COLUMN plate_detection_enabled BOOLEAN DEFAULT 0"))
         await conn.execute(text("ALTER TABLE printers ADD COLUMN plate_detection_enabled BOOLEAN DEFAULT 0"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
 
 
     # Migration: Add plate detection ROI columns to printers
     # Migration: Add plate detection ROI columns to printers
     try:
     try:
         await conn.execute(text("ALTER TABLE printers ADD COLUMN plate_detection_roi_x REAL"))
         await conn.execute(text("ALTER TABLE printers ADD COLUMN plate_detection_roi_x REAL"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
     try:
     try:
         await conn.execute(text("ALTER TABLE printers ADD COLUMN plate_detection_roi_y REAL"))
         await conn.execute(text("ALTER TABLE printers ADD COLUMN plate_detection_roi_y REAL"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
     try:
     try:
         await conn.execute(text("ALTER TABLE printers ADD COLUMN plate_detection_roi_w REAL"))
         await conn.execute(text("ALTER TABLE printers ADD COLUMN plate_detection_roi_w REAL"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
     try:
     try:
         await conn.execute(text("ALTER TABLE printers ADD COLUMN plate_detection_roi_h REAL"))
         await conn.execute(text("ALTER TABLE printers ADD COLUMN plate_detection_roi_h REAL"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
 
 
     # Migration: Remove UNIQUE constraint from smart_plugs.printer_id
     # Migration: Remove UNIQUE constraint from smart_plugs.printer_id
     # This allows HA scripts to coexist with regular plugs (scripts are for multi-device control)
     # This allows HA scripts to coexist with regular plugs (scripts are for multi-device control)
@@ -860,61 +860,61 @@ async def run_migrations(conn):
             await conn.execute(text("DROP TABLE smart_plugs"))
             await conn.execute(text("DROP TABLE smart_plugs"))
             await conn.execute(text("ALTER TABLE smart_plugs_temp RENAME TO smart_plugs"))
             await conn.execute(text("ALTER TABLE smart_plugs_temp RENAME TO smart_plugs"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
 
 
     # Migration: Add show_on_printer_card column to smart_plugs
     # Migration: Add show_on_printer_card column to smart_plugs
     try:
     try:
         await conn.execute(text("ALTER TABLE smart_plugs ADD COLUMN show_on_printer_card BOOLEAN DEFAULT 1"))
         await conn.execute(text("ALTER TABLE smart_plugs ADD COLUMN show_on_printer_card BOOLEAN DEFAULT 1"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
 
 
     # Migration: Add MQTT smart plug fields (legacy)
     # Migration: Add MQTT smart plug fields (legacy)
     try:
     try:
         await conn.execute(text("ALTER TABLE smart_plugs ADD COLUMN mqtt_topic VARCHAR(200)"))
         await conn.execute(text("ALTER TABLE smart_plugs ADD COLUMN mqtt_topic VARCHAR(200)"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
     try:
     try:
         await conn.execute(text("ALTER TABLE smart_plugs ADD COLUMN mqtt_power_path VARCHAR(100)"))
         await conn.execute(text("ALTER TABLE smart_plugs ADD COLUMN mqtt_power_path VARCHAR(100)"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
     try:
     try:
         await conn.execute(text("ALTER TABLE smart_plugs ADD COLUMN mqtt_energy_path VARCHAR(100)"))
         await conn.execute(text("ALTER TABLE smart_plugs ADD COLUMN mqtt_energy_path VARCHAR(100)"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
     try:
     try:
         await conn.execute(text("ALTER TABLE smart_plugs ADD COLUMN mqtt_state_path VARCHAR(100)"))
         await conn.execute(text("ALTER TABLE smart_plugs ADD COLUMN mqtt_state_path VARCHAR(100)"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
     try:
     try:
         await conn.execute(text("ALTER TABLE smart_plugs ADD COLUMN mqtt_multiplier REAL DEFAULT 1.0"))
         await conn.execute(text("ALTER TABLE smart_plugs ADD COLUMN mqtt_multiplier REAL DEFAULT 1.0"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
 
 
     # Migration: Add enhanced MQTT smart plug fields (separate topics and multipliers)
     # Migration: Add enhanced MQTT smart plug fields (separate topics and multipliers)
     try:
     try:
         await conn.execute(text("ALTER TABLE smart_plugs ADD COLUMN mqtt_power_topic VARCHAR(200)"))
         await conn.execute(text("ALTER TABLE smart_plugs ADD COLUMN mqtt_power_topic VARCHAR(200)"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
     try:
     try:
         await conn.execute(text("ALTER TABLE smart_plugs ADD COLUMN mqtt_power_multiplier REAL DEFAULT 1.0"))
         await conn.execute(text("ALTER TABLE smart_plugs ADD COLUMN mqtt_power_multiplier REAL DEFAULT 1.0"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
     try:
     try:
         await conn.execute(text("ALTER TABLE smart_plugs ADD COLUMN mqtt_energy_topic VARCHAR(200)"))
         await conn.execute(text("ALTER TABLE smart_plugs ADD COLUMN mqtt_energy_topic VARCHAR(200)"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
     try:
     try:
         await conn.execute(text("ALTER TABLE smart_plugs ADD COLUMN mqtt_energy_multiplier REAL DEFAULT 1.0"))
         await conn.execute(text("ALTER TABLE smart_plugs ADD COLUMN mqtt_energy_multiplier REAL DEFAULT 1.0"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
     try:
     try:
         await conn.execute(text("ALTER TABLE smart_plugs ADD COLUMN mqtt_state_topic VARCHAR(200)"))
         await conn.execute(text("ALTER TABLE smart_plugs ADD COLUMN mqtt_state_topic VARCHAR(200)"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
     try:
     try:
         await conn.execute(text("ALTER TABLE smart_plugs ADD COLUMN mqtt_state_on_value VARCHAR(50)"))
         await conn.execute(text("ALTER TABLE smart_plugs ADD COLUMN mqtt_state_on_value VARCHAR(50)"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
 
 
     # Migration: Copy existing mqtt_topic to mqtt_power_topic for backward compatibility
     # Migration: Copy existing mqtt_topic to mqtt_power_topic for backward compatibility
     try:
     try:
@@ -927,7 +927,7 @@ async def run_migrations(conn):
         """)
         """)
         )
         )
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
 
 
     # Migration: Create groups table for permission-based access control
     # Migration: Create groups table for permission-based access control
     try:
     try:
@@ -946,7 +946,7 @@ async def run_migrations(conn):
         )
         )
         await conn.execute(text("CREATE INDEX IF NOT EXISTS ix_groups_name ON groups(name)"))
         await conn.execute(text("CREATE INDEX IF NOT EXISTS ix_groups_name ON groups(name)"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
 
 
     # Migration: Create user_groups association table
     # Migration: Create user_groups association table
     try:
     try:
@@ -962,65 +962,65 @@ async def run_migrations(conn):
         """)
         """)
         )
         )
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
 
 
     # Migration: Add model-based queue assignment columns to print_queue
     # Migration: Add model-based queue assignment columns to print_queue
     try:
     try:
         await conn.execute(text("ALTER TABLE print_queue ADD COLUMN target_model VARCHAR(50)"))
         await conn.execute(text("ALTER TABLE print_queue ADD COLUMN target_model VARCHAR(50)"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
     try:
     try:
         await conn.execute(text("ALTER TABLE print_queue ADD COLUMN required_filament_types TEXT"))
         await conn.execute(text("ALTER TABLE print_queue ADD COLUMN required_filament_types TEXT"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
     try:
     try:
         await conn.execute(text("ALTER TABLE print_queue ADD COLUMN waiting_reason TEXT"))
         await conn.execute(text("ALTER TABLE print_queue ADD COLUMN waiting_reason TEXT"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
 
 
     # Migration: Add nozzle_count column to printers (for dual-extruder detection)
     # Migration: Add nozzle_count column to printers (for dual-extruder detection)
     try:
     try:
         await conn.execute(text("ALTER TABLE printers ADD COLUMN nozzle_count INTEGER DEFAULT 1"))
         await conn.execute(text("ALTER TABLE printers ADD COLUMN nozzle_count INTEGER DEFAULT 1"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
 
 
     # Migration: Add print_hours_offset column to printers (baseline hours adjustment)
     # Migration: Add print_hours_offset column to printers (baseline hours adjustment)
     try:
     try:
         await conn.execute(text("ALTER TABLE printers ADD COLUMN print_hours_offset REAL DEFAULT 0.0"))
         await conn.execute(text("ALTER TABLE printers ADD COLUMN print_hours_offset REAL DEFAULT 0.0"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
 
 
     # Migration: Add queue notification event columns to notification_providers
     # Migration: Add queue notification event columns to notification_providers
     try:
     try:
         await conn.execute(text("ALTER TABLE notification_providers ADD COLUMN on_queue_job_added BOOLEAN DEFAULT 0"))
         await conn.execute(text("ALTER TABLE notification_providers ADD COLUMN on_queue_job_added BOOLEAN DEFAULT 0"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
     try:
     try:
         await conn.execute(
         await conn.execute(
             text("ALTER TABLE notification_providers ADD COLUMN on_queue_job_assigned BOOLEAN DEFAULT 0")
             text("ALTER TABLE notification_providers ADD COLUMN on_queue_job_assigned BOOLEAN DEFAULT 0")
         )
         )
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
     try:
     try:
         await conn.execute(text("ALTER TABLE notification_providers ADD COLUMN on_queue_job_started BOOLEAN DEFAULT 0"))
         await conn.execute(text("ALTER TABLE notification_providers ADD COLUMN on_queue_job_started BOOLEAN DEFAULT 0"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
     try:
     try:
         await conn.execute(text("ALTER TABLE notification_providers ADD COLUMN on_queue_job_waiting BOOLEAN DEFAULT 1"))
         await conn.execute(text("ALTER TABLE notification_providers ADD COLUMN on_queue_job_waiting BOOLEAN DEFAULT 1"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
     try:
     try:
         await conn.execute(text("ALTER TABLE notification_providers ADD COLUMN on_queue_job_skipped BOOLEAN DEFAULT 1"))
         await conn.execute(text("ALTER TABLE notification_providers ADD COLUMN on_queue_job_skipped BOOLEAN DEFAULT 1"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
     try:
     try:
         await conn.execute(text("ALTER TABLE notification_providers ADD COLUMN on_queue_job_failed BOOLEAN DEFAULT 1"))
         await conn.execute(text("ALTER TABLE notification_providers ADD COLUMN on_queue_job_failed BOOLEAN DEFAULT 1"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
     try:
     try:
         await conn.execute(text("ALTER TABLE notification_providers ADD COLUMN on_queue_completed BOOLEAN DEFAULT 0"))
         await conn.execute(text("ALTER TABLE notification_providers ADD COLUMN on_queue_completed BOOLEAN DEFAULT 0"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
 
 
     # Migration: Add created_by_id column to print_archives for user tracking (Issue #206)
     # Migration: Add created_by_id column to print_archives for user tracking (Issue #206)
     try:
     try:
@@ -1028,7 +1028,7 @@ async def run_migrations(conn):
             text("ALTER TABLE print_archives ADD COLUMN created_by_id INTEGER REFERENCES users(id) ON DELETE SET NULL")
             text("ALTER TABLE print_archives ADD COLUMN created_by_id INTEGER REFERENCES users(id) ON DELETE SET NULL")
         )
         )
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
 
 
     # Migration: Add created_by_id column to print_queue for user tracking (Issue #206)
     # Migration: Add created_by_id column to print_queue for user tracking (Issue #206)
     try:
     try:
@@ -1036,7 +1036,7 @@ async def run_migrations(conn):
             text("ALTER TABLE print_queue ADD COLUMN created_by_id INTEGER REFERENCES users(id) ON DELETE SET NULL")
             text("ALTER TABLE print_queue ADD COLUMN created_by_id INTEGER REFERENCES users(id) ON DELETE SET NULL")
         )
         )
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
 
 
     # Migration: Add created_by_id column to library_files for user tracking (Issue #206)
     # Migration: Add created_by_id column to library_files for user tracking (Issue #206)
     try:
     try:
@@ -1044,13 +1044,13 @@ async def run_migrations(conn):
             text("ALTER TABLE library_files ADD COLUMN created_by_id INTEGER REFERENCES users(id) ON DELETE SET NULL")
             text("ALTER TABLE library_files ADD COLUMN created_by_id INTEGER REFERENCES users(id) ON DELETE SET NULL")
         )
         )
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
 
 
     # Migration: Add target_location column to print_queue for location-based filtering (Issue #220)
     # Migration: Add target_location column to print_queue for location-based filtering (Issue #220)
     try:
     try:
         await conn.execute(text("ALTER TABLE print_queue ADD COLUMN target_location VARCHAR(100)"))
         await conn.execute(text("ALTER TABLE print_queue ADD COLUMN target_location VARCHAR(100)"))
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
 
 
     # Migration: Convert absolute paths to relative paths in library_files table
     # Migration: Convert absolute paths to relative paths in library_files table
     # This ensures backup/restore portability across different installations
     # This ensures backup/restore portability across different installations
@@ -1080,7 +1080,7 @@ async def run_migrations(conn):
             {"base_dir": base_dir_str, "pattern": base_dir_str + "%"},
             {"base_dir": base_dir_str, "pattern": base_dir_str + "%"},
         )
         )
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
 
 
     # Create active_print_spoolman table for Spoolman per-filament tracking
     # Create active_print_spoolman table for Spoolman per-filament tracking
     try:
     try:
@@ -1100,7 +1100,7 @@ async def run_migrations(conn):
         """)
         """)
         )
         )
     except OperationalError:
     except OperationalError:
-        pass
+        pass  # Already applied
 
 
 
 
 async def seed_notification_templates():
 async def seed_notification_templates():

+ 6 - 6
backend/app/main.py

@@ -2043,7 +2043,7 @@ async def on_print_complete(printer_id: int, data: dict):
             try:
             try:
                 cancel_session(printer_id)
                 cancel_session(printer_id)
             except Exception:
             except Exception:
-                pass
+                pass  # Best-effort timelapse session cancellation on error
 
 
     asyncio.create_task(_background_layer_timelapse())
     asyncio.create_task(_background_layer_timelapse())
     log_timing("All background tasks scheduled")
     log_timing("All background tasks scheduled")
@@ -2187,14 +2187,14 @@ async def record_ams_history():
                     try:
                     try:
                         humidity_threshold = float(setting.value)
                         humidity_threshold = float(setting.value)
                     except (ValueError, TypeError):
                     except (ValueError, TypeError):
-                        pass
+                        pass  # Keep default threshold if stored value is invalid
                 result = await db.execute(select(Settings).where(Settings.key == "ams_temp_fair"))
                 result = await db.execute(select(Settings).where(Settings.key == "ams_temp_fair"))
                 setting = result.scalar_one_or_none()
                 setting = result.scalar_one_or_none()
                 if setting:
                 if setting:
                     try:
                     try:
                         temp_threshold = float(setting.value)
                         temp_threshold = float(setting.value)
                     except (ValueError, TypeError):
                     except (ValueError, TypeError):
-                        pass
+                        pass  # Keep default threshold if stored value is invalid
 
 
                 recorded_count = 0
                 recorded_count = 0
                 for printer in printers:
                 for printer in printers:
@@ -2219,12 +2219,12 @@ async def record_ams_history():
                             try:
                             try:
                                 humidity = float(humidity_raw)
                                 humidity = float(humidity_raw)
                             except (ValueError, TypeError):
                             except (ValueError, TypeError):
-                                pass
+                                pass  # Skip unparseable humidity; will try fallback
                         if humidity is None and humidity_idx is not None:
                         if humidity is None and humidity_idx is not None:
                             try:
                             try:
                                 humidity = float(humidity_idx)
                                 humidity = float(humidity_idx)
                             except (ValueError, TypeError):
                             except (ValueError, TypeError):
-                                pass
+                                pass  # Skip unparseable humidity index value
 
 
                         # Get temperature
                         # Get temperature
                         temperature = None
                         temperature = None
@@ -2233,7 +2233,7 @@ async def record_ams_history():
                             try:
                             try:
                                 temperature = float(temp_str)
                                 temperature = float(temp_str)
                             except (ValueError, TypeError):
                             except (ValueError, TypeError):
-                                pass
+                                pass  # Skip unparseable temperature value
 
 
                         # Skip if no data
                         # Skip if no data
                         if humidity is None and temperature is None:
                         if humidity is None and temperature is None:

+ 16 - 16
backend/app/services/archive.py

@@ -58,7 +58,7 @@ class ThreeMFParser:
                 self.metadata.pop("_slice_filament_color", None)
                 self.metadata.pop("_slice_filament_color", None)
                 self.metadata.pop("_plate_index", None)
                 self.metadata.pop("_plate_index", None)
         except (KeyError, ValueError, zipfile.BadZipFile, XMLParseError, UnicodeDecodeError):
         except (KeyError, ValueError, zipfile.BadZipFile, XMLParseError, UnicodeDecodeError):
-            pass
+            pass  # Return whatever metadata was extracted before the error
         return self.metadata
         return self.metadata
 
 
     def _parse_slice_info(self, zf: zipfile.ZipFile):
     def _parse_slice_info(self, zf: zipfile.ZipFile):
@@ -99,7 +99,7 @@ class ThreeMFParser:
                                 # Store in metadata for print_name generation
                                 # Store in metadata for print_name generation
                                 self.metadata["_plate_index"] = extracted_index
                                 self.metadata["_plate_index"] = extracted_index
                             except ValueError:
                             except ValueError:
-                                pass
+                                pass  # Skip non-numeric plate index
                         elif key == "prediction" and value:
                         elif key == "prediction" and value:
                             self.metadata["print_time_seconds"] = int(value)
                             self.metadata["print_time_seconds"] = int(value)
                         elif key == "weight" and value:
                         elif key == "weight" and value:
@@ -118,7 +118,7 @@ class ThreeMFParser:
                             try:
                             try:
                                 printable_objects[int(identify_id)] = name
                                 printable_objects[int(identify_id)] = name
                             except ValueError:
                             except ValueError:
-                                pass
+                                pass  # Skip objects with non-numeric identify_id
 
 
                     if printable_objects:
                     if printable_objects:
                         self.metadata["printable_objects"] = printable_objects
                         self.metadata["printable_objects"] = printable_objects
@@ -153,7 +153,7 @@ class ThreeMFParser:
                     if colors:
                     if colors:
                         self.metadata["_slice_filament_color"] = ",".join(colors)
                         self.metadata["_slice_filament_color"] = ",".join(colors)
         except (KeyError, ValueError, XMLParseError, UnicodeDecodeError):
         except (KeyError, ValueError, XMLParseError, UnicodeDecodeError):
-            pass
+            pass  # Skip unparseable slice_info metadata
 
 
     def _parse_project_settings(self, zf: zipfile.ZipFile):
     def _parse_project_settings(self, zf: zipfile.ZipFile):
         """Parse project settings for print configuration."""
         """Parse project settings for print configuration."""
@@ -165,9 +165,9 @@ class ThreeMFParser:
                     self._extract_filament_info(data)
                     self._extract_filament_info(data)
                     self._extract_print_settings(data)
                     self._extract_print_settings(data)
                 except json.JSONDecodeError:
                 except json.JSONDecodeError:
-                    pass
+                    pass  # Skip malformed project_settings JSON
         except (KeyError, ValueError, UnicodeDecodeError):
         except (KeyError, ValueError, UnicodeDecodeError):
-            pass
+            pass  # Skip unreadable project settings file
 
 
     def _parse_gcode_header(self, zf: zipfile.ZipFile):
     def _parse_gcode_header(self, zf: zipfile.ZipFile):
         """Parse G-code file header for total layer count and printer model."""
         """Parse G-code file header for total layer count and printer model."""
@@ -199,7 +199,7 @@ class ThreeMFParser:
                     raw_model = match.group(1).strip()
                     raw_model = match.group(1).strip()
                     self.metadata["sliced_for_model"] = normalize_printer_model(raw_model)
                     self.metadata["sliced_for_model"] = normalize_printer_model(raw_model)
         except (KeyError, ValueError, UnicodeDecodeError):
         except (KeyError, ValueError, UnicodeDecodeError):
-            pass
+            pass  # G-code header parsing is best-effort; metadata may come from other sources
 
 
     def _extract_filament_info(self, data: dict):
     def _extract_filament_info(self, data: dict):
         """Extract filament info, preferring non-support filaments."""
         """Extract filament info, preferring non-support filaments."""
@@ -240,7 +240,7 @@ class ThreeMFParser:
                 self.metadata["filament_color"] = ",".join(non_support_colors)
                 self.metadata["filament_color"] = ",".join(non_support_colors)
 
 
         except (KeyError, ValueError, TypeError, IndexError):
         except (KeyError, ValueError, TypeError, IndexError):
-            pass
+            pass  # Filament info is optional; fall back to slice_info values
 
 
     def _extract_print_settings(self, data: dict):
     def _extract_print_settings(self, data: dict):
         """Extract print settings from JSON config."""
         """Extract print settings from JSON config."""
@@ -287,7 +287,7 @@ class ThreeMFParser:
 
 
                 self.metadata["sliced_for_model"] = normalize_printer_model(data["printer_model"])
                 self.metadata["sliced_for_model"] = normalize_printer_model(data["printer_model"])
         except (KeyError, ValueError, TypeError):
         except (KeyError, ValueError, TypeError):
-            pass
+            pass  # Print settings are optional; missing values are left unset
 
 
     def _extract_settings_from_content(self, content: str):
     def _extract_settings_from_content(self, content: str):
         """Extract print settings from config content."""
         """Extract print settings from config content."""
@@ -311,7 +311,7 @@ class ThreeMFParser:
                         value = content[value_start:value_end].strip().strip('"')
                         value = content[value_start:value_end].strip().strip('"')
                         self.metadata[key] = converter(value)
                         self.metadata[key] = converter(value)
                 except (ValueError, TypeError):
                 except (ValueError, TypeError):
-                    pass
+                    pass  # Skip settings with unconvertible values
 
 
     def _parse_3dmodel(self, zf: zipfile.ZipFile):
     def _parse_3dmodel(self, zf: zipfile.ZipFile):
         """Parse 3D/3dmodel.model for MakerWorld metadata."""
         """Parse 3D/3dmodel.model for MakerWorld metadata."""
@@ -358,7 +358,7 @@ class ThreeMFParser:
                 self.metadata["print_name"] = makerworld_fields["Title"]
                 self.metadata["print_name"] = makerworld_fields["Title"]
 
 
         except (KeyError, ValueError, UnicodeDecodeError):
         except (KeyError, ValueError, UnicodeDecodeError):
-            pass
+            pass  # MakerWorld/3dmodel metadata is optional
 
 
     def _extract_thumbnail(self, zf: zipfile.ZipFile):
     def _extract_thumbnail(self, zf: zipfile.ZipFile):
         """Extract thumbnail image from 3MF.
         """Extract thumbnail image from 3MF.
@@ -436,7 +436,7 @@ def extract_printable_objects_from_3mf(
                     try:
                     try:
                         plate_idx = int(meta.get("value", "1"))
                         plate_idx = int(meta.get("value", "1"))
                     except ValueError:
                     except ValueError:
-                        pass
+                        pass  # Use default plate_idx if value is non-numeric
                     break
                     break
 
 
             # Load position data from plate_N.json if we need positions
             # Load position data from plate_N.json if we need positions
@@ -457,7 +457,7 @@ def extract_printable_objects_from_3mf(
                                     bbox_by_name[obj_name] = []
                                     bbox_by_name[obj_name] = []
                                 bbox_by_name[obj_name].append(bbox)
                                 bbox_by_name[obj_name].append(bbox)
                     except (json.JSONDecodeError, KeyError):
                     except (json.JSONDecodeError, KeyError):
-                        pass
+                        pass  # Position data is optional; objects will lack x/y coordinates
 
 
             # Extract objects from slice_info.config
             # Extract objects from slice_info.config
             for obj in plate.findall("object"):
             for obj in plate.findall("object"):
@@ -481,10 +481,10 @@ def extract_printable_objects_from_3mf(
                         else:
                         else:
                             printable_objects[obj_id] = name
                             printable_objects[obj_id] = name
                     except ValueError:
                     except ValueError:
-                        pass
+                        pass  # Skip objects with non-numeric identify_id
 
 
     except (KeyError, ValueError, zipfile.BadZipFile, XMLParseError, UnicodeDecodeError):
     except (KeyError, ValueError, zipfile.BadZipFile, XMLParseError, UnicodeDecodeError):
-        pass
+        pass  # Return empty dict if 3MF is corrupt or unreadable
 
 
     if include_positions:
     if include_positions:
         return printable_objects, bbox_all
         return printable_objects, bbox_all
@@ -630,7 +630,7 @@ class ProjectPageParser:
                     content_type = content_types.get(ext, "application/octet-stream")
                     content_type = content_types.get(ext, "application/octet-stream")
                     return (data, content_type)
                     return (data, content_type)
         except (KeyError, zipfile.BadZipFile, OSError):
         except (KeyError, zipfile.BadZipFile, OSError):
-            pass
+            pass  # Return None if image cannot be extracted from 3MF
         return None
         return None
 
 
     def update_metadata(self, updates: dict) -> bool:
     def update_metadata(self, updates: dict) -> bool:

+ 7 - 7
backend/app/services/bambu_ftp.py

@@ -182,7 +182,7 @@ class BambuFTPClient:
             try:
             try:
                 self._ftp.quit()
                 self._ftp.quit()
             except (OSError, ftplib.error_reply):
             except (OSError, ftplib.error_reply):
-                pass
+                pass  # Best-effort FTP cleanup; connection may already be closed
             self._ftp = None
             self._ftp = None
 
 
     def list_files(self, path: str = "/") -> list[dict]:
     def list_files(self, path: str = "/") -> list[dict]:
@@ -227,7 +227,7 @@ class BambuFTPClient:
                             time_str = f"{month} {day} {time_or_year}"
                             time_str = f"{month} {day} {time_or_year}"
                             mtime = datetime.strptime(time_str, "%b %d %Y")
                             mtime = datetime.strptime(time_str, "%b %d %Y")
                     except (ValueError, IndexError):
                     except (ValueError, IndexError):
-                        pass
+                        pass  # Non-critical: mtime parsing is best-effort; file entry works without it
 
 
                     file_entry = {
                     file_entry = {
                         "name": name,
                         "name": name,
@@ -279,7 +279,7 @@ class BambuFTPClient:
                 try:
                 try:
                     local_path.unlink()
                     local_path.unlink()
                 except OSError:
                 except OSError:
-                    pass
+                    pass  # Best-effort partial file cleanup; not critical if removal fails
             return False
             return False
 
 
     def diagnose_storage(self) -> dict:
     def diagnose_storage(self) -> dict:
@@ -491,7 +491,7 @@ class BambuFTPClient:
                 response = self._ftp.sendcmd("STAT")
                 response = self._ftp.sendcmd("STAT")
                 logger.debug("STAT response: %s", response)
                 logger.debug("STAT response: %s", response)
             except (OSError, ftplib.error_reply):
             except (OSError, ftplib.error_reply):
-                pass
+                pass  # Both AVBL and STAT unsupported; storage info will rely on directory scan
 
 
         # Calculate used space by listing root directories
         # Calculate used space by listing root directories
         try:
         try:
@@ -510,13 +510,13 @@ class BambuFTPClient:
                             try:
                             try:
                                 total_used += int(parts[4])
                                 total_used += int(parts[4])
                             except ValueError:
                             except ValueError:
-                                pass
+                                pass  # Skip entries with non-numeric size fields
                 except (OSError, ftplib.error_reply):
                 except (OSError, ftplib.error_reply):
-                    pass
+                    pass  # Directory may not exist on this printer model; skip it
 
 
             result["used_bytes"] = total_used
             result["used_bytes"] = total_used
         except (OSError, ftplib.error_reply):
         except (OSError, ftplib.error_reply):
-            pass
+            pass  # Storage scan failed; return whatever info was collected above
 
 
         return result if result else None
         return result if result else None
 
 

+ 6 - 6
backend/app/services/bambu_mqtt.py

@@ -379,7 +379,7 @@ class BambuMQTTClient:
                 )
                 )
             self._process_message(payload)
             self._process_message(payload)
         except json.JSONDecodeError:
         except json.JSONDecodeError:
-            pass
+            pass  # Ignore non-JSON MQTT messages (e.g. binary or malformed payloads)
 
 
     def _process_message(self, payload: dict):
     def _process_message(self, payload: dict):
         """Process incoming MQTT message from printer."""
         """Process incoming MQTT message from printer."""
@@ -421,7 +421,7 @@ class BambuMQTTClient:
                 try:
                 try:
                     self.state.wifi_signal = int(wifi_signal.replace("dBm", "").strip())
                     self.state.wifi_signal = int(wifi_signal.replace("dBm", "").strip())
                 except ValueError:
                 except ValueError:
-                    pass
+                    pass  # Ignore unparseable wifi_signal strings; field is non-critical
 
 
         if "print" in payload:
         if "print" in payload:
             print_data = payload["print"]
             print_data = payload["print"]
@@ -856,7 +856,7 @@ class BambuMQTTClient:
                                     try:
                                     try:
                                         ams_on_extruder.append(int(ams_id_str))
                                         ams_on_extruder.append(int(ams_id_str))
                                     except ValueError:
                                     except ValueError:
-                                        pass
+                                        pass  # Skip AMS IDs that aren't valid integers
 
 
                             if len(ams_on_extruder) == 1:
                             if len(ams_on_extruder) == 1:
                                 # Single AMS on this extruder - unambiguous
                                 # Single AMS on this extruder - unambiguous
@@ -1038,7 +1038,7 @@ class BambuMQTTClient:
                         f"[{self.serial_number}] AMS {ams_id} info={info_val} (bit8={bit8}) -> extruder {extruder_id}"
                         f"[{self.serial_number}] AMS {ams_id} info={info_val} (bit8={bit8}) -> extruder {extruder_id}"
                     )
                     )
                 except (ValueError, TypeError):
                 except (ValueError, TypeError):
-                    pass
+                    pass  # Skip AMS units with unparseable info bitmask values
         if ams_extruder_map:
         if ams_extruder_map:
             self.state.raw_data["ams_extruder_map"] = ams_extruder_map
             self.state.raw_data["ams_extruder_map"] = ams_extruder_map
             self.state.ams_extruder_map = ams_extruder_map  # Also set on state for inference logic
             self.state.ams_extruder_map = ams_extruder_map  # Also set on state for inference logic
@@ -1681,7 +1681,7 @@ class BambuMQTTClient:
                 try:
                 try:
                     self.state.wifi_signal = int(wifi_signal.replace("dBm", "").strip())
                     self.state.wifi_signal = int(wifi_signal.replace("dBm", "").strip())
                 except ValueError:
                 except ValueError:
-                    pass
+                    pass  # Ignore unparseable wifi_signal strings; field is non-critical
 
 
         # Parse print speed level (1=silent, 2=standard, 3=sport, 4=ludicrous)
         # Parse print speed level (1=silent, 2=standard, 3=sport, 4=ludicrous)
         if "spd_lvl" in data:
         if "spd_lvl" in data:
@@ -2414,7 +2414,7 @@ class BambuMQTTClient:
                             )
                             )
                         )
                         )
                     except (ValueError, TypeError):
                     except (ValueError, TypeError):
-                        pass
+                        pass  # Skip malformed K-profile entries; remaining profiles still usable
             self.state.kprofiles = profiles
             self.state.kprofiles = profiles
             return
             return
 
 

+ 1 - 1
backend/app/services/camera.py

@@ -218,7 +218,7 @@ async def read_chamber_image_frame(
             try:
             try:
                 await writer.wait_closed()
                 await writer.wait_closed()
             except OSError:
             except OSError:
-                pass
+                pass  # Socket already closed; cleanup is best-effort
 
 
     except TimeoutError:
     except TimeoutError:
         logger.error("Chamber image: connection timeout to %s:%s", ip_address, port)
         logger.error("Chamber image: connection timeout to %s:%s", ip_address, port)

+ 13 - 13
backend/app/services/discovery.py

@@ -36,7 +36,7 @@ def is_running_in_docker() -> bool:
             if "docker" in content or "containerd" in content or "kubepods" in content:
             if "docker" in content or "containerd" in content or "kubepods" in content:
                 return True
                 return True
     except (FileNotFoundError, PermissionError):
     except (FileNotFoundError, PermissionError):
-        pass
+        pass  # /proc/1/cgroup may not exist or be readable; fall through to env check
 
 
     # Check for container environment variable
     # Check for container environment variable
     return bool(os.environ.get("CONTAINER") or os.environ.get("DOCKER_CONTAINER"))
     return bool(os.environ.get("CONTAINER") or os.environ.get("DOCKER_CONTAINER"))
@@ -121,7 +121,7 @@ class PrinterDiscoveryService:
             try:
             try:
                 await self._task
                 await self._task
             except asyncio.CancelledError:
             except asyncio.CancelledError:
-                pass
+                pass  # Expected when cancelling the discovery task
         self._task = None
         self._task = None
 
 
     async def _discover(self, duration: float):
     async def _discover(self, duration: float):
@@ -140,7 +140,7 @@ class PrinterDiscoveryService:
             try:
             try:
                 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
                 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
             except (AttributeError, OSError):
             except (AttributeError, OSError):
-                pass
+                pass  # SO_REUSEPORT not available on all platforms; non-critical
 
 
             # Set non-blocking mode
             # Set non-blocking mode
             sock.setblocking(False)
             sock.setblocking(False)
@@ -206,7 +206,7 @@ class PrinterDiscoveryService:
                 try:
                 try:
                     sock.close()
                     sock.close()
                 except OSError:
                 except OSError:
-                    pass
+                    pass  # Best-effort socket cleanup
 
 
     async def _discover_alternative(self, duration: float):
     async def _discover_alternative(self, duration: float):
         """Alternative discovery using a random port (less reliable)."""
         """Alternative discovery using a random port (less reliable)."""
@@ -232,7 +232,7 @@ class PrinterDiscoveryService:
                     data, addr = sock.recvfrom(4096)
                     data, addr = sock.recvfrom(4096)
                     self._handle_response(data.decode("utf-8", errors="ignore"), addr[0])
                     self._handle_response(data.decode("utf-8", errors="ignore"), addr[0])
                 except BlockingIOError:
                 except BlockingIOError:
-                    pass
+                    pass  # No data available yet on non-blocking socket
                 except OSError as e:
                 except OSError as e:
                     logger.debug("SSDP receive error: %s", e)
                     logger.debug("SSDP receive error: %s", e)
 
 
@@ -242,7 +242,7 @@ class PrinterDiscoveryService:
                         sock.sendto(SSDP_MSEARCH.encode(), (SSDP_ADDR, SSDP_PORT))
                         sock.sendto(SSDP_MSEARCH.encode(), (SSDP_ADDR, SSDP_PORT))
                         last_send = now
                         last_send = now
                     except OSError:
                     except OSError:
-                        pass
+                        pass  # Best-effort M-SEARCH resend; will retry next interval
 
 
                 await asyncio.sleep(0.1)
                 await asyncio.sleep(0.1)
 
 
@@ -254,7 +254,7 @@ class PrinterDiscoveryService:
                 try:
                 try:
                     sock.close()
                     sock.close()
                 except OSError:
                 except OSError:
-                    pass
+                    pass  # Best-effort socket cleanup
 
 
     def _handle_response(self, response: str, ip_address: str):
     def _handle_response(self, response: str, ip_address: str):
         """Parse SSDP response and extract printer info."""
         """Parse SSDP response and extract printer info."""
@@ -585,9 +585,9 @@ class TasmotaScanner:
             # Hard timeout of 5 seconds max per host
             # Hard timeout of 5 seconds max per host
             await asyncio.wait_for(self._do_probe(ip), timeout=5.0)
             await asyncio.wait_for(self._do_probe(ip), timeout=5.0)
         except TimeoutError:
         except TimeoutError:
-            pass
+            pass  # Host did not respond in time; skip
         except Exception:
         except Exception:
-            pass
+            pass  # Probe failed for this host; skip silently
 
 
     async def _do_probe(self, ip: str):
     async def _do_probe(self, ip: str):
         """Actually probe the host."""
         """Actually probe the host."""
@@ -661,7 +661,7 @@ class TasmotaScanner:
                                     device_name = friendly[0]
                                     device_name = friendly[0]
                             module = status.get("Module")
                             module = status.get("Module")
                 except Exception:
                 except Exception:
-                    pass
+                    pass  # Status query is optional; proceed with defaults
 
 
                 device = {
                 device = {
                     "ip_address": ip,
                     "ip_address": ip,
@@ -675,11 +675,11 @@ class TasmotaScanner:
                 logger.info("Discovered Tasmota device: %s at %s", device_name, ip)
                 logger.info("Discovered Tasmota device: %s at %s", device_name, ip)
 
 
         except httpx.TimeoutException:
         except httpx.TimeoutException:
-            pass
+            pass  # Host unreachable or too slow; not a Tasmota device
         except httpx.ConnectError:
         except httpx.ConnectError:
-            pass
+            pass  # Connection refused; no HTTP server on this host
         except Exception:
         except Exception:
-            pass
+            pass  # Unexpected error probing host; skip silently
 
 
     def stop(self):
     def stop(self):
         """Stop the current scan."""
         """Stop the current scan."""

+ 1 - 1
backend/app/services/external_camera.py

@@ -462,7 +462,7 @@ async def test_connection(url: str, camera_type: str) -> dict:
                         resolution = f"{width}x{height}"
                         resolution = f"{width}x{height}"
                         break
                         break
             except (IndexError, ValueError):
             except (IndexError, ValueError):
-                pass
+                pass  # Resolution detection is optional; fall back to default
 
 
             return {"success": True, "resolution": resolution}
             return {"success": True, "resolution": resolution}
         else:
         else:

+ 1 - 1
backend/app/services/firmware_check.py

@@ -363,7 +363,7 @@ class FirmwareCheckService:
                 try:
                 try:
                     temp_path.unlink()
                     temp_path.unlink()
                 except OSError:
                 except OSError:
-                    pass
+                    pass  # Best-effort cleanup of failed download temp file
             return None
             return None
 
 
     async def close(self):
     async def close(self):

+ 1 - 1
backend/app/services/homeassistant.py

@@ -181,7 +181,7 @@ class HomeAssistantService:
             if state and state not in ("unknown", "unavailable"):
             if state and state not in ("unknown", "unavailable"):
                 return float(state)
                 return float(state)
         except (httpx.HTTPError, OSError, ValueError):
         except (httpx.HTTPError, OSError, ValueError):
-            pass
+            pass  # Sensor read is best-effort; caller handles None
         return None
         return None
 
 
     async def test_connection(self, url: str, token: str) -> dict:
     async def test_connection(self, url: str, token: str) -> dict:

+ 2 - 2
backend/app/services/mqtt_smart_plug.py

@@ -266,14 +266,14 @@ class MQTTSmartPlugService:
                         data.power = float(raw_value) * config.multiplier
                         data.power = float(raw_value) * config.multiplier
                         logger.debug("MQTT smart plug %s: power=%s", plug_id, data.power)
                         logger.debug("MQTT smart plug %s: power=%s", plug_id, data.power)
                     except (ValueError, TypeError):
                     except (ValueError, TypeError):
-                        pass
+                        pass  # Ignore unparseable power reading from MQTT
 
 
                 elif data_type == "energy":
                 elif data_type == "energy":
                     try:
                     try:
                         data.energy = float(raw_value) * config.multiplier
                         data.energy = float(raw_value) * config.multiplier
                         logger.debug("MQTT smart plug %s: energy=%s", plug_id, data.energy)
                         logger.debug("MQTT smart plug %s: energy=%s", plug_id, data.energy)
                     except (ValueError, TypeError):
                     except (ValueError, TypeError):
-                        pass
+                        pass  # Ignore unparseable energy reading from MQTT
 
 
                 elif data_type == "state":
                 elif data_type == "state":
                     state_str = str(raw_value)
                     state_str = str(raw_value)

+ 1 - 1
backend/app/services/plate_detection.py

@@ -646,7 +646,7 @@ async def capture_camera_image(
                 try:
                 try:
                     tmp_path.unlink()
                     tmp_path.unlink()
                 except OSError:
                 except OSError:
-                    pass
+                    pass  # Best-effort cleanup of temporary camera capture file
 
 
     return image_data, camera_source
     return image_data, camera_source
 
 

+ 3 - 3
backend/app/services/print_scheduler.py

@@ -145,7 +145,7 @@ class PrintScheduler:
                         try:
                         try:
                             required_types = json.loads(item.required_filament_types)
                             required_types = json.loads(item.required_filament_types)
                         except json.JSONDecodeError:
                         except json.JSONDecodeError:
-                            pass
+                            pass  # Ignore malformed filament types; treat as no constraint
 
 
                     printer_id, waiting_reason = await self._find_idle_printer_for_model(
                     printer_id, waiting_reason = await self._find_idle_printer_for_model(
                         db, item.target_model, busy_printers, required_types, item.target_location
                         db, item.target_model, busy_printers, required_types, item.target_location
@@ -450,7 +450,7 @@ class PrintScheduler:
                                             }
                                             }
                                         )
                                         )
                                 except (ValueError, TypeError):
                                 except (ValueError, TypeError):
-                                    pass
+                                    pass  # Skip filament entry with unparseable usage data
                             break
                             break
                 else:
                 else:
                     # No plate_id - extract all filaments with used_g > 0
                     # No plate_id - extract all filaments with used_g > 0
@@ -474,7 +474,7 @@ class PrintScheduler:
                                     }
                                     }
                                 )
                                 )
                         except (ValueError, TypeError):
                         except (ValueError, TypeError):
-                            pass
+                            pass  # Skip filament entry with unparseable usage data
 
 
                 filaments.sort(key=lambda x: x["slot_id"])
                 filaments.sort(key=lambda x: x["slot_id"])
         except Exception as e:
         except Exception as e:

+ 3 - 3
backend/app/services/printer_manager.py

@@ -498,7 +498,7 @@ def printer_state_to_dict(state: PrinterState, printer_id: int | None = None, mo
             try:
             try:
                 kprofile_map[kp.slot_id] = float(kp.k_value)
                 kprofile_map[kp.slot_id] = float(kp.k_value)
             except (ValueError, TypeError):
             except (ValueError, TypeError):
-                pass
+                pass  # Skip K-profile entries with unparseable values
 
 
     if "ams" in raw_data and isinstance(raw_data["ams"], list):
     if "ams" in raw_data and isinstance(raw_data["ams"], list):
         for ams_data in raw_data["ams"]:
         for ams_data in raw_data["ams"]:
@@ -543,13 +543,13 @@ def printer_state_to_dict(state: PrinterState, printer_id: int | None = None, mo
                 try:
                 try:
                     humidity_value = int(humidity_raw)
                     humidity_value = int(humidity_raw)
                 except (ValueError, TypeError):
                 except (ValueError, TypeError):
-                    pass
+                    pass  # Skip unparseable humidity; will try index fallback
             # Fall back to index if no raw value (index is 1-5, not percentage)
             # Fall back to index if no raw value (index is 1-5, not percentage)
             if humidity_value is None and humidity_idx is not None:
             if humidity_value is None and humidity_idx is not None:
                 try:
                 try:
                     humidity_value = int(humidity_idx)
                     humidity_value = int(humidity_idx)
                 except (ValueError, TypeError):
                 except (ValueError, TypeError):
-                    pass
+                    pass  # Skip unparseable humidity index; humidity remains None
 
 
             # AMS-HT has 1 tray, regular AMS has 4 trays
             # AMS-HT has 1 tray, regular AMS has 4 trays
             is_ams_ht = len(trays) == 1
             is_ams_ht = len(trays) == 1

+ 1 - 1
backend/app/services/spoolman_tracking.py

@@ -132,7 +132,7 @@ async def store_print_data(printer_id: int, archive_id: int, file_path: str, db,
         try:
         try:
             slot_to_tray = json.loads(queue_item.ams_mapping)
             slot_to_tray = json.loads(queue_item.ams_mapping)
         except json.JSONDecodeError:
         except json.JSONDecodeError:
-            pass
+            pass  # Ignore malformed AMS mapping; fall back to default slot assignment
 
 
     # Parse G-code for per-layer filament usage (for accurate partial usage tracking)
     # Parse G-code for per-layer filament usage (for accurate partial usage tracking)
     layer_usage = extract_layer_filament_usage_from_3mf(full_path)
     layer_usage = extract_layer_filament_usage_from_3mf(full_path)

+ 1 - 1
backend/app/services/timelapse_processor.py

@@ -66,7 +66,7 @@ class TimelapseProcessor:
             else:
             else:
                 fps = float(r_frame_rate)
                 fps = float(r_frame_rate)
         except (ValueError, ZeroDivisionError):
         except (ValueError, ZeroDivisionError):
-            pass
+            pass  # Keep default fps if frame rate string is unparseable
 
 
         return {
         return {
             "duration": float(data.get("format", {}).get("duration", 0)),
             "duration": float(data.get("format", {}).get("duration", 0)),

+ 4 - 4
backend/app/services/virtual_printer/ftp_server.py

@@ -118,14 +118,14 @@ class FTPSession:
             try:
             try:
                 await self.data_server.wait_closed()
                 await self.data_server.wait_closed()
             except OSError:
             except OSError:
-                pass
+                pass  # Best-effort data server cleanup; may already be closed
             self.data_server = None
             self.data_server = None
 
 
         try:
         try:
             self.writer.close()
             self.writer.close()
             await self.writer.wait_closed()
             await self.writer.wait_closed()
         except OSError:
         except OSError:
-            pass
+            pass  # Best-effort control connection cleanup; client may have disconnected
 
 
     # FTP Commands
     # FTP Commands
 
 
@@ -303,7 +303,7 @@ class FTPSession:
                 self._data_writer.close()
                 self._data_writer.close()
                 await self._data_writer.wait_closed()
                 await self._data_writer.wait_closed()
             except OSError:
             except OSError:
-                pass
+                pass  # Best-effort data writer cleanup; peer may have closed already
             self._data_writer = None
             self._data_writer = None
             self._data_reader = None
             self._data_reader = None
 
 
@@ -312,7 +312,7 @@ class FTPSession:
                 self.data_server.close()
                 self.data_server.close()
                 await self.data_server.wait_closed()
                 await self.data_server.wait_closed()
             except OSError:
             except OSError:
-                pass
+                pass  # Best-effort data server shutdown; port may already be released
             self.data_server = None
             self.data_server = None
 
 
         # Only delay if we actually closed something
         # Only delay if we actually closed something

+ 4 - 6
backend/app/services/virtual_printer/manager.py

@@ -535,7 +535,7 @@ class VirtualPrinterManager:
             try:
             try:
                 file_path.unlink()
                 file_path.unlink()
             except OSError:
             except OSError:
-                pass
+                pass  # Best-effort removal of non-3MF file; may already be gone
             return
             return
 
 
         try:
         try:
@@ -562,8 +562,7 @@ class VirtualPrinterManager:
                     try:
                     try:
                         file_path.unlink()
                         file_path.unlink()
                     except OSError:
                     except OSError:
-                        pass
-
+                        pass  # Best-effort cleanup of uploaded file after archiving
                     # Remove from pending
                     # Remove from pending
                     self._pending_files.pop(file_path.name, None)
                     self._pending_files.pop(file_path.name, None)
                 else:
                 else:
@@ -629,7 +628,7 @@ class VirtualPrinterManager:
             try:
             try:
                 file_path.unlink()
                 file_path.unlink()
             except OSError:
             except OSError:
-                pass
+                pass  # Best-effort removal of non-3MF file; may already be gone
             return
             return
 
 
         try:
         try:
@@ -671,8 +670,7 @@ class VirtualPrinterManager:
                     try:
                     try:
                         file_path.unlink()
                         file_path.unlink()
                     except OSError:
                     except OSError:
-                        pass
-
+                        pass  # Best-effort cleanup of uploaded file after archiving and queuing
                     # Remove from pending
                     # Remove from pending
                     self._pending_files.pop(file_path.name, None)
                     self._pending_files.pop(file_path.name, None)
                 else:
                 else:

+ 7 - 7
backend/app/services/virtual_printer/mqtt_server.py

@@ -210,7 +210,7 @@ class SimpleMQTTServer:
             )
             )
             logger.info("MQTT SSL cert info: %s", result.stdout.strip())
             logger.info("MQTT SSL cert info: %s", result.stdout.strip())
         except (OSError, subprocess.SubprocessError):
         except (OSError, subprocess.SubprocessError):
-            pass
+            pass  # Certificate info is for debug logging only; not critical
 
 
         logger.info("MQTT SSL context: TLS 1.2+, cert=%s", self.cert_path)
         logger.info("MQTT SSL context: TLS 1.2+, cert=%s", self.cert_path)
 
 
@@ -286,7 +286,7 @@ class SimpleMQTTServer:
             try:
             try:
                 await self._status_push_task
                 await self._status_push_task
             except asyncio.CancelledError:
             except asyncio.CancelledError:
-                pass
+                pass  # Expected when stopping the periodic status push task
             self._status_push_task = None
             self._status_push_task = None
 
 
         # Close all client connections (iterate over copy to avoid modification during iteration)
         # Close all client connections (iterate over copy to avoid modification during iteration)
@@ -295,7 +295,7 @@ class SimpleMQTTServer:
                 writer.close()
                 writer.close()
                 await writer.wait_closed()
                 await writer.wait_closed()
             except OSError:
             except OSError:
-                pass
+                pass  # Best-effort client connection cleanup; client may have disconnected
         self._clients.clear()
         self._clients.clear()
 
 
         if self._server:
         if self._server:
@@ -303,7 +303,7 @@ class SimpleMQTTServer:
                 self._server.close()
                 self._server.close()
                 await self._server.wait_closed()
                 await self._server.wait_closed()
             except OSError:
             except OSError:
-                pass
+                pass  # Best-effort server shutdown; port may already be released
             self._server = None
             self._server = None
 
 
     async def _periodic_status_push(self) -> None:
     async def _periodic_status_push(self) -> None:
@@ -386,7 +386,7 @@ class SimpleMQTTServer:
                     break
                     break
 
 
         except asyncio.CancelledError:
         except asyncio.CancelledError:
-            pass
+            pass  # Expected when server is shutting down and cancels client tasks
         except Exception as e:
         except Exception as e:
             logger.debug("MQTT client error: %s", e)
             logger.debug("MQTT client error: %s", e)
         finally:
         finally:
@@ -397,7 +397,7 @@ class SimpleMQTTServer:
                 writer.close()
                 writer.close()
                 await writer.wait_closed()
                 await writer.wait_closed()
             except OSError:
             except OSError:
-                pass
+                pass  # Best-effort socket cleanup on client disconnect
 
 
     async def _read_remaining_length(self, reader: asyncio.StreamReader) -> int | None:
     async def _read_remaining_length(self, reader: asyncio.StreamReader) -> int | None:
         """Read MQTT remaining length (variable byte integer)."""
         """Read MQTT remaining length (variable byte integer)."""
@@ -783,7 +783,7 @@ class SimpleMQTTServer:
                             await self._notify_print_command(filename, print_data)
                             await self._notify_print_command(filename, print_data)
 
 
                 except json.JSONDecodeError:
                 except json.JSONDecodeError:
-                    pass
+                    pass  # Non-JSON payloads on request topic are safely ignored
 
 
         except (IndexError, ValueError, OSError) as e:
         except (IndexError, ValueError, OSError) as e:
             logger.debug("MQTT PUBLISH error: %s", e)
             logger.debug("MQTT PUBLISH error: %s", e)

+ 10 - 10
backend/app/services/virtual_printer/ssdp_server.py

@@ -140,7 +140,7 @@ class VirtualPrinterSSDPServer:
             try:
             try:
                 self._socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
                 self._socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
             except (AttributeError, OSError):
             except (AttributeError, OSError):
-                pass
+                pass  # SO_REUSEPORT not available on all platforms; non-critical
 
 
             # Set non-blocking mode
             # Set non-blocking mode
             self._socket.setblocking(False)
             self._socket.setblocking(False)
@@ -177,7 +177,7 @@ class VirtualPrinterSSDPServer:
                     message = data.decode("utf-8", errors="ignore")
                     message = data.decode("utf-8", errors="ignore")
                     await self._handle_message(message, addr)
                     await self._handle_message(message, addr)
                 except BlockingIOError:
                 except BlockingIOError:
-                    pass
+                    pass  # No data available on non-blocking socket; will retry
                 except OSError as e:
                 except OSError as e:
                     if self._running:
                     if self._running:
                         logger.debug("SSDP receive error: %s", e)
                         logger.debug("SSDP receive error: %s", e)
@@ -215,12 +215,12 @@ class VirtualPrinterSSDPServer:
                 # Send byebye message
                 # Send byebye message
                 await self._send_byebye()
                 await self._send_byebye()
             except OSError:
             except OSError:
-                pass
+                pass  # Best-effort byebye broadcast; socket may already be closed
 
 
             try:
             try:
                 self._socket.close()
                 self._socket.close()
             except OSError:
             except OSError:
-                pass
+                pass  # Best-effort socket close; may already be released
             self._socket = None
             self._socket = None
 
 
     async def _send_notify(self) -> None:
     async def _send_notify(self) -> None:
@@ -254,7 +254,7 @@ class VirtualPrinterSSDPServer:
             self._socket.sendto(message.encode(), (SSDP_BROADCAST_ADDR, SSDP_PORT))
             self._socket.sendto(message.encode(), (SSDP_BROADCAST_ADDR, SSDP_PORT))
             logger.debug("Sent SSDP byebye")
             logger.debug("Sent SSDP byebye")
         except OSError:
         except OSError:
-            pass
+            pass  # Best-effort byebye send; network may be unavailable during shutdown
 
 
     async def _handle_message(self, message: str, addr: tuple[str, int]) -> None:
     async def _handle_message(self, message: str, addr: tuple[str, int]) -> None:
         """Handle incoming SSDP message.
         """Handle incoming SSDP message.
@@ -325,7 +325,7 @@ class SSDPProxy:
                     key, value = line.split(":", 1)
                     key, value = line.split(":", 1)
                     headers[key.strip().lower()] = value.strip()
                     headers[key.strip().lower()] = value.strip()
         except Exception:
         except Exception:
-            pass
+            pass  # Return partial headers if parsing fails; malformed packets are common
         return headers
         return headers
 
 
     def _rewrite_ssdp_location(self, data: bytes) -> bytes:
     def _rewrite_ssdp_location(self, data: bytes) -> bytes:
@@ -371,7 +371,7 @@ class SSDPProxy:
             try:
             try:
                 self._local_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
                 self._local_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
             except (AttributeError, OSError):
             except (AttributeError, OSError):
-                pass
+                pass  # SO_REUSEPORT not available on all platforms; non-critical
             self._local_socket.setblocking(False)
             self._local_socket.setblocking(False)
             # Bind to all interfaces to receive broadcasts
             # Bind to all interfaces to receive broadcasts
             self._local_socket.bind(("", SSDP_PORT))
             self._local_socket.bind(("", SSDP_PORT))
@@ -391,7 +391,7 @@ class SSDPProxy:
             try:
             try:
                 self._remote_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
                 self._remote_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
             except (AttributeError, OSError):
             except (AttributeError, OSError):
-                pass
+                pass  # SO_REUSEPORT not available on all platforms; non-critical
             self._remote_socket.setblocking(False)
             self._remote_socket.setblocking(False)
             # Bind to remote interface
             # Bind to remote interface
             self._remote_socket.bind((self.remote_interface_ip, 0))
             self._remote_socket.bind((self.remote_interface_ip, 0))
@@ -412,7 +412,7 @@ class SSDPProxy:
                     data, addr = self._local_socket.recvfrom(4096)
                     data, addr = self._local_socket.recvfrom(4096)
                     await self._handle_local_packet(data, addr)
                     await self._handle_local_packet(data, addr)
                 except BlockingIOError:
                 except BlockingIOError:
-                    pass
+                    pass  # No data available on non-blocking socket; will retry
                 except OSError as e:
                 except OSError as e:
                     if self._running:
                     if self._running:
                         logger.debug("SSDP proxy receive error: %s", e)
                         logger.debug("SSDP proxy receive error: %s", e)
@@ -448,7 +448,7 @@ class SSDPProxy:
                 try:
                 try:
                     sock.close()
                     sock.close()
                 except OSError:
                 except OSError:
-                    pass
+                    pass  # Best-effort socket close; may already be released
         self._local_socket = None
         self._local_socket = None
         self._remote_socket = None
         self._remote_socket = None
 
 

+ 7 - 7
backend/app/services/virtual_printer/tcp_proxy.py

@@ -137,7 +137,7 @@ class TLSProxy:
                 try:
                 try:
                     self.on_disconnect(client_id)
                     self.on_disconnect(client_id)
                 except Exception:
                 except Exception:
-                    pass
+                    pass  # Ignore disconnect callback errors during shutdown
 
 
         self._active_connections.clear()
         self._active_connections.clear()
 
 
@@ -164,7 +164,7 @@ class TLSProxy:
             try:
             try:
                 self.on_connect(client_id)
                 self.on_connect(client_id)
             except Exception:
             except Exception:
-                pass
+                pass  # Ignore connect callback errors; connection proceeds regardless
 
 
         # Connect to target printer with TLS
         # Connect to target printer with TLS
         try:
         try:
@@ -220,7 +220,7 @@ class TLSProxy:
                 try:
                 try:
                     await task
                     await task
                 except asyncio.CancelledError:
                 except asyncio.CancelledError:
-                    pass
+                    pass  # Expected when cancelling the other forwarding direction
 
 
         except Exception as e:
         except Exception as e:
             logger.debug("%s proxy connection error: %s", self.name, e)
             logger.debug("%s proxy connection error: %s", self.name, e)
@@ -233,7 +233,7 @@ class TLSProxy:
                     writer.close()
                     writer.close()
                     await writer.wait_closed()
                     await writer.wait_closed()
                 except OSError:
                 except OSError:
-                    pass
+                    pass  # Best-effort connection cleanup; peer may have disconnected
 
 
             logger.info("%s proxy: client %s disconnected", self.name, client_id)
             logger.info("%s proxy: client %s disconnected", self.name, client_id)
 
 
@@ -241,7 +241,7 @@ class TLSProxy:
                 try:
                 try:
                     self.on_disconnect(client_id)
                     self.on_disconnect(client_id)
                 except Exception:
                 except Exception:
-                    pass
+                    pass  # Ignore disconnect callback errors; cleanup continues
 
 
     async def _forward(
     async def _forward(
         self,
         self,
@@ -273,7 +273,7 @@ class TLSProxy:
                 logger.debug("%s proxy %s: %s bytes", self.name, direction, len(data))
                 logger.debug("%s proxy %s: %s bytes", self.name, direction, len(data))
 
 
         except asyncio.CancelledError:
         except asyncio.CancelledError:
-            pass
+            pass  # Expected when the other forwarding direction closes first
         except ConnectionResetError:
         except ConnectionResetError:
             logger.debug("%s proxy %s: connection reset", self.name, direction)
             logger.debug("%s proxy %s: connection reset", self.name, direction)
         except BrokenPipeError:
         except BrokenPipeError:
@@ -409,7 +409,7 @@ class SlicerProxyManager:
             try:
             try:
                 self.on_activity(name, message)
                 self.on_activity(name, message)
             except Exception:
             except Exception:
-                pass
+                pass  # Ignore activity callback errors; logging is non-critical
 
 
     @property
     @property
     def is_running(self) -> bool:
     def is_running(self) -> bool:

+ 8 - 8
backend/app/utils/threemf_tools.py

@@ -85,7 +85,7 @@ def parse_gcode_layer_filament_usage(gcode_content: str) -> dict[int, dict[int,
                             layer_filaments[current_layer] = cumulative_extrusion.copy()
                             layer_filaments[current_layer] = cumulative_extrusion.copy()
                         current_layer = new_layer
                         current_layer = new_layer
                     except ValueError:
                     except ValueError:
-                        pass
+                        pass  # Skip G-code lines with unparseable layer numbers
 
 
         # Filament change: M620 S<filament>
         # Filament change: M620 S<filament>
         # Bambu uses M620 for AMS filament switching
         # Bambu uses M620 for AMS filament switching
@@ -105,7 +105,7 @@ def parse_gcode_layer_filament_usage(gcode_content: str) -> dict[int, dict[int,
                             if match:
                             if match:
                                 active_filament = int(match.group(1))
                                 active_filament = int(match.group(1))
                         except (ValueError, AttributeError):
                         except (ValueError, AttributeError):
-                            pass
+                            pass  # Skip unparseable filament switch commands
 
 
         # Extrusion moves: G0/G1/G2/G3 with E parameter
         # Extrusion moves: G0/G1/G2/G3 with E parameter
         # Only G1 typically has extrusion, but check all for safety
         # Only G1 typically has extrusion, but check all for safety
@@ -122,7 +122,7 @@ def parse_gcode_layer_filament_usage(gcode_content: str) -> dict[int, dict[int,
                             current = cumulative_extrusion.get(active_filament, 0)
                             current = cumulative_extrusion.get(active_filament, 0)
                             cumulative_extrusion[active_filament] = current + extrusion
                             cumulative_extrusion[active_filament] = current + extrusion
                     except ValueError:
                     except ValueError:
-                        pass
+                        pass  # Skip G-code lines with unparseable extrusion values
 
 
     # Save final layer state
     # Save final layer state
     if cumulative_extrusion:
     if cumulative_extrusion:
@@ -237,7 +237,7 @@ def extract_filament_properties_from_3mf(file_path: Path) -> dict[int, dict]:
                             "density": DEFAULT_FILAMENT_DENSITY,
                             "density": DEFAULT_FILAMENT_DENSITY,
                         }
                         }
                     except ValueError:
                     except ValueError:
-                        pass
+                        pass  # Skip filament entries with unparseable IDs
 
 
             # Try project_settings.config for density values
             # Try project_settings.config for density values
             if "Metadata/project_settings.config" in zf.namelist():
             if "Metadata/project_settings.config" in zf.namelist():
@@ -258,9 +258,9 @@ def extract_filament_properties_from_3mf(file_path: Path) -> dict[int, dict]:
                         except (ValueError, TypeError):
                         except (ValueError, TypeError):
                             properties[fid]["density"] = DEFAULT_FILAMENT_DENSITY
                             properties[fid]["density"] = DEFAULT_FILAMENT_DENSITY
                 except json.JSONDecodeError:
                 except json.JSONDecodeError:
-                    pass
+                    pass  # Skip malformed project_settings.config JSON
     except (zipfile.BadZipFile, OSError, KeyError, ValueError, XMLParseError, UnicodeDecodeError):
     except (zipfile.BadZipFile, OSError, KeyError, ValueError, XMLParseError, UnicodeDecodeError):
-        pass
+        pass  # Return whatever properties were collected before the error
 
 
     return properties
     return properties
 
 
@@ -302,8 +302,8 @@ def extract_filament_usage_from_3mf(file_path: Path) -> list[dict]:
                             }
                             }
                         )
                         )
                 except (ValueError, TypeError):
                 except (ValueError, TypeError):
-                    pass
+                    pass  # Skip filament entries with unparseable usage values
     except (zipfile.BadZipFile, OSError, KeyError, ValueError, XMLParseError, UnicodeDecodeError):
     except (zipfile.BadZipFile, OSError, KeyError, ValueError, XMLParseError, UnicodeDecodeError):
-        pass
+        pass  # Return whatever usage data was collected before the error
 
 
     return filament_usage
     return filament_usage