flashforge-python-api 1.3.1__py3-none-any.whl → 1.3.3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -6,9 +6,12 @@ Handles the parsing, storage, and manipulation of 3D print file thumbnail images
6
6
 
7
7
  import asyncio
8
8
  import base64
9
+ import logging
9
10
  from pathlib import Path
10
11
  from typing import Optional
11
12
 
13
+ logger = logging.getLogger(__name__)
14
+
12
15
 
13
16
  class ThumbnailInfo:
14
17
  """
@@ -50,7 +53,7 @@ class ThumbnailInfo:
50
53
  return None
51
54
 
52
55
  binary_buffer = replay.encode("latin1")
53
- magic_marker = b"\xA2\xA2\x2A\x2A"
56
+ magic_marker = b"\xa2\xa2\x2a\x2a"
54
57
  magic_offset = binary_buffer.find(magic_marker)
55
58
  if magic_offset >= 0 and len(binary_buffer) >= magic_offset + 8:
56
59
  payload_length = int.from_bytes(
@@ -65,7 +68,7 @@ class ThumbnailInfo:
65
68
  # Find where the PNG data starts (after the "ok" text delimiter)
66
69
  ok_index = replay.find("ok")
67
70
  if ok_index == -1:
68
- print("ThumbnailInfo: No 'ok' found in response")
71
+ logger.warning("ThumbnailInfo: no 'ok' delimiter found in the response.")
69
72
  return None
70
73
 
71
74
  # Skip the 'ok' text and any immediately following control characters
@@ -87,11 +90,11 @@ class ThumbnailInfo:
87
90
  self._image_data = binary_buffer[png_start:]
88
91
  return self
89
92
  else:
90
- print("ThumbnailInfo: No PNG signature found in binary data")
93
+ logger.warning("ThumbnailInfo: no PNG signature found in the binary data.")
91
94
  return None
92
95
 
93
96
  except Exception as e:
94
- print(f"ThumbnailInfo: Error parsing response: {e}")
97
+ logger.warning("ThumbnailInfo: error parsing the response: %s", e)
95
98
  return None
96
99
 
97
100
  def get_image_data(self) -> str | None:
@@ -157,7 +160,7 @@ class ThumbnailInfo:
157
160
  True if the file was saved successfully, False otherwise
158
161
  """
159
162
  if not self._image_data:
160
- print("ThumbnailInfo: No image data to save")
163
+ logger.warning("ThumbnailInfo: no image data to save.")
161
164
  return False
162
165
 
163
166
  try:
@@ -169,18 +172,20 @@ class ThumbnailInfo:
169
172
  file_path = f"{base_name}.png"
170
173
 
171
174
  if not file_path:
172
- print("ThumbnailInfo: No file path provided and no filename to generate one from")
175
+ logger.warning(
176
+ "ThumbnailInfo: no file path provided and no filename to generate one from."
177
+ )
173
178
  return False
174
179
 
175
180
  # Write the bytes to file in a separate thread to avoid blocking the event loop
176
181
  loop = asyncio.get_running_loop()
177
182
  await loop.run_in_executor(None, self._write_file_sync, file_path, self._image_data)
178
183
 
179
- print(f"ThumbnailInfo: Saved thumbnail to {file_path}")
184
+ logger.debug("ThumbnailInfo: saved the thumbnail to %s", file_path)
180
185
  return True
181
186
 
182
187
  except Exception as e:
183
- print(f"ThumbnailInfo: Error saving thumbnail to file: {e}")
188
+ logger.warning("ThumbnailInfo: error saving the thumbnail to a file: %s", e)
184
189
  return False
185
190
 
186
191
  def save_to_file_sync(self, file_path: str | None = None) -> bool:
@@ -194,7 +199,7 @@ class ThumbnailInfo:
194
199
  True if the file was saved successfully, False otherwise
195
200
  """
196
201
  if not self._image_data:
197
- print("ThumbnailInfo: No image data to save")
202
+ logger.warning("ThumbnailInfo: no image data to save.")
198
203
  return False
199
204
 
200
205
  try:
@@ -206,18 +211,20 @@ class ThumbnailInfo:
206
211
  file_path = f"{base_name}.png"
207
212
 
208
213
  if not file_path:
209
- print("ThumbnailInfo: No file path provided and no filename to generate one from")
214
+ logger.warning(
215
+ "ThumbnailInfo: no file path provided and no filename to generate one from."
216
+ )
210
217
  return False
211
218
 
212
219
  # Write the bytes to file
213
220
  with open(file_path, "wb") as f:
214
221
  f.write(self._image_data)
215
222
 
216
- print(f"ThumbnailInfo: Saved thumbnail to {file_path}")
223
+ logger.debug("ThumbnailInfo: saved the thumbnail to %s", file_path)
217
224
  return True
218
225
 
219
226
  except Exception as e:
220
- print(f"ThumbnailInfo: Error saving thumbnail to file: {e}")
227
+ logger.warning("ThumbnailInfo: error saving the thumbnail to a file: %s", e)
221
228
  return False
222
229
 
223
230
  def get_image_size(self) -> tuple[int, int]:
@@ -150,10 +150,9 @@ class FlashForgeTcpClient:
150
150
  logger.error("Upload failed: remote file name resolved to an empty value.")
151
151
  return False
152
152
 
153
- start_command = (
154
- GCodes.CMD_PREP_FILE_UPLOAD.replace("%%size%%", str(file_path.stat().st_size))
155
- .replace("%%filename%%", normalized_file_name)
156
- )
153
+ start_command = GCodes.CMD_PREP_FILE_UPLOAD.replace(
154
+ "%%size%%", str(file_path.stat().st_size)
155
+ ).replace("%%filename%%", normalized_file_name)
157
156
 
158
157
  async with self._socket_lock:
159
158
  try:
@@ -184,7 +183,9 @@ class FlashForgeTcpClient:
184
183
  GCodes.CMD_COMPLETE_FILE_UPLOAD
185
184
  )
186
185
  if not finish_response:
187
- logger.error("Upload failed: printer did not respond to M29 upload finalization.")
186
+ logger.error(
187
+ "Upload failed: printer did not respond to M29 upload finalization."
188
+ )
188
189
  return False
189
190
 
190
191
  return self._is_successful_upload_boundary_response(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: flashforge-python-api
3
- Version: 1.3.1
3
+ Version: 1.3.3
4
4
  Summary: A comprehensive Python library for controlling FlashForge 3D printers
5
5
  Project-URL: Homepage, https://github.com/GhostTypes/ff-5mp-api-py
6
6
  Project-URL: Documentation, https://github.com/GhostTypes/ff-5mp-api-py#readme
@@ -0,0 +1,48 @@
1
+ flashforge/__init__.py,sha256=0PGa08cJ2RjAlIyJqX4MW3w1I-FUIg8ftaJ6I-A5cc0,5336
2
+ flashforge/client.py,sha256=nDtnv3y9XlEQknIkgIUiuOYAiyTEGbQ7tHBdCs2fg1I,21432
3
+ flashforge/api/__init__.py,sha256=vQz-DkG6LTH39bI4fyiUc0D9jQzemLh45pORLptSOlg,335
4
+ flashforge/api/constants/__init__.py,sha256=Q0HL2tqSBYPd4Oz49VHLS3qUvRuv__GCvTGecaLrQ-Y,163
5
+ flashforge/api/constants/commands.py,sha256=XM2rooBESPDaywlZrfW2ECTaLLFaSKXkJ7FQ-RBmVdY,578
6
+ flashforge/api/constants/endpoints.py,sha256=oZtOFfkU64THDeCMUIVv6_0L-BOUZzgLKAUfjHkUhi8,337
7
+ flashforge/api/controls/__init__.py,sha256=53s-H25Pjwr0kvPk8MZ2Twy8VHGqGcO6Q6uBphhEOh4,293
8
+ flashforge/api/controls/control.py,sha256=OgE7K6NkFLwFN1r_q5g1RPwYC8MCt0f6L5CZxDW44d8,15151
9
+ flashforge/api/controls/creator5_palette.py,sha256=zdD3PIXx7hCVj2Fmv1CSFOaqogRUPeBaymgY2DFiMxk,8835
10
+ flashforge/api/controls/files.py,sha256=25yxln9NROas9TtFMZR9e8LtA8ruk8RUu2C81vpNgTk,8043
11
+ flashforge/api/controls/info.py,sha256=jvP4mCkywfV79Uz_z1uJ7qWvEx0MwRoB6ziuvwps_YU,18206
12
+ flashforge/api/controls/job_control.py,sha256=NnACm4LPUz4n8lnRiUl33jilWekS1b6HQTbP--nDzZc,33225
13
+ flashforge/api/controls/temp_control.py,sha256=EOO5TkODirjFcnQ7rZrirxAweHBdVin032AWj-Z8VQs,13040
14
+ flashforge/api/filament/__init__.py,sha256=isT2dl0hzUS0xMTXMm4Tip0GTG1gCsm8LKWa9xPu4Y8,104
15
+ flashforge/api/filament/filament.py,sha256=TtcC2G2nD9Sq4cOrCZzFLZ6Q0Ve-zfrfuEF9uQ8M3eE,1214
16
+ flashforge/api/misc/__init__.py,sha256=1AG7vOMRBZQtHp6QUzfr9alcJPeNv3JpU44NrznxDHs,211
17
+ flashforge/api/misc/redaction.py,sha256=8LG2WsFXhdBqbZ4AXYwpm8hQ_PxaOeAKmZBeG5kzAT4,2675
18
+ flashforge/api/misc/scientific_notation.py,sha256=KSMTrrYhPWLv0gbcEAD6u-jEOcIwUjOCOPMBi0LiO-k,826
19
+ flashforge/api/misc/temperature.py,sha256=qeHlCdPzLyqGDEB874Ib5AgYHMR9Qtw61shnw4G095E,1066
20
+ flashforge/api/network/__init__.py,sha256=G5fBoAlq-NQPDkWp579mFIqsj0v7B1Lb2TAzO6IZA0Q,164
21
+ flashforge/api/network/fnet_code.py,sha256=BR2niVKKk4ZfXtizUDIMXzDhlCxPHzqWg5AQQIcoj3g,402
22
+ flashforge/api/network/utils.py,sha256=Q5-Vj_1VN611QV_TGpDzrrZ2X8PqaGT0j00BhSHv5MM,2096
23
+ flashforge/discovery/__init__.py,sha256=G0WiP70EhfHdjXR1RNlv6xjhyHOdo-HWyOm9J0ds4SM,828
24
+ flashforge/discovery/discovery.py,sha256=-hOmVIpn8gu-rPYo8FRBfhKb_tBqwamLfmoPVYaDzLI,27614
25
+ flashforge/models/__init__.py,sha256=hdcK0E4KeDfv_A8Y2aPOHgHziwTjP1RPb_VP-89dOzQ,1086
26
+ flashforge/models/machine_info.py,sha256=UD-BQ-VzceSIoFFrpuFPJLpaisdgxBRxVD8SZ20mF4E,19384
27
+ flashforge/models/responses.py,sha256=10-8yFfZtLuDmH1TK2xVYl-Uf-zT2WEJnpb2H5ZK3ZU,10637
28
+ flashforge/tcp/__init__.py,sha256=hpnqoWHeRtTwJPzdsVlwGt1njKbAkrgIHKADkLSIRec,1317
29
+ flashforge/tcp/a3_client.py,sha256=Aqb6MuKkjnNUVdE2LbZKd7bPlFK8XPIm17C_BG_PuNU,15867
30
+ flashforge/tcp/a4_client.py,sha256=snmAvTCpSWFjxb8h6V7H4tk5yOoMqKEzKoBY_1JaaPs,11213
31
+ flashforge/tcp/ff_client.py,sha256=CJXk0Qei2FVSpbXxZhiEQgAEcTJaBab1ouooqyC4OL4,20235
32
+ flashforge/tcp/tcp_client.py,sha256=Ae5Z5rLJFoDYxP3T6Q_PtVNkUr94QqFEWPKtgFyMIJw,17027
33
+ flashforge/tcp/gcode/__init__.py,sha256=tFGlqCPFxVJNizXsIG4pMOK7IPFNnc_vIEMciULYkMY,271
34
+ flashforge/tcp/gcode/a3_gcode_controller.py,sha256=x84_xo_Ll5k6hMAwDWuNUo54znV-BBIfwnmeOiEa9Fs,3688
35
+ flashforge/tcp/gcode/gcode_controller.py,sha256=6K1VGgX59AcE_Kh_gm13dmxCY_kuzV_d2ooSpheONRI,10075
36
+ flashforge/tcp/gcode/gcodes.py,sha256=55Ii1JpJNJNmOnBivyF83vz3TZUPDtp01lX72NINfPQ,3658
37
+ flashforge/tcp/parsers/__init__.py,sha256=kDaJmiH0JcR5i693Fj3pwmINLWN0ipirN3LWGFvPst0,730
38
+ flashforge/tcp/parsers/endstop_status.py,sha256=k7C5P_TiKlqBxSq2ybRoBDaaDcQ_EgiZe2NLYo7ubiE,9902
39
+ flashforge/tcp/parsers/location_info.py,sha256=0fbqCmQ2EQQe8z9fiX0zP1YsnuVayTs81zmF3_HuGZM,2895
40
+ flashforge/tcp/parsers/print_status.py,sha256=C-KzukhK0TR86AP3t3XrMH4dief6pa3I-yiST4rL0mk,6271
41
+ flashforge/tcp/parsers/printer_info.py,sha256=CHPs6nJfEByXyG3co7Nb8_ygggxkYuc7A9O9bpQEqXE,5441
42
+ flashforge/tcp/parsers/temp_info.py,sha256=9wRGUM9cKvDiZD3SIxBx_qVLZbeXoYsoY3-R3vN3H4g,7938
43
+ flashforge/tcp/parsers/thumbnail_info.py,sha256=1U1S_gcIZ2lDpEA4622ywUew6TVw0BnzjlBAiihQwzk,10478
44
+ flashforge_python_api-1.3.3.dist-info/METADATA,sha256=UpYv26NPSHt5nqH57396UOE9s-JcirHPuNsD8e1afBM,4970
45
+ flashforge_python_api-1.3.3.dist-info/WHEEL,sha256=lCkmxWfQsSc9CfIClYeavTdQeEX2toPqufh9gI35EQA,87
46
+ flashforge_python_api-1.3.3.dist-info/entry_points.txt,sha256=AkOxlsLvQ7cvMLxn7tlzfKp_DCH2hXhbVceHIXxawpU,66
47
+ flashforge_python_api-1.3.3.dist-info/licenses/LICENSE,sha256=-cTA-hrmvlb3pqlQrBZQXUnKayhUjsLJMPb7TD91frM,1067
48
+ flashforge_python_api-1.3.3.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: hatchling 1.30.1
2
+ Generator: hatchling 1.31.0
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
@@ -1,47 +0,0 @@
1
- flashforge/__init__.py,sha256=0PGa08cJ2RjAlIyJqX4MW3w1I-FUIg8ftaJ6I-A5cc0,5336
2
- flashforge/client.py,sha256=y2LjwfBhlS8fwIFEITybvq1Wi_9JdIiJ4pEzw0OdqEo,20463
3
- flashforge/api/__init__.py,sha256=vQz-DkG6LTH39bI4fyiUc0D9jQzemLh45pORLptSOlg,335
4
- flashforge/api/constants/__init__.py,sha256=Q0HL2tqSBYPd4Oz49VHLS3qUvRuv__GCvTGecaLrQ-Y,163
5
- flashforge/api/constants/commands.py,sha256=XM2rooBESPDaywlZrfW2ECTaLLFaSKXkJ7FQ-RBmVdY,578
6
- flashforge/api/constants/endpoints.py,sha256=oZtOFfkU64THDeCMUIVv6_0L-BOUZzgLKAUfjHkUhi8,337
7
- flashforge/api/controls/__init__.py,sha256=53s-H25Pjwr0kvPk8MZ2Twy8VHGqGcO6Q6uBphhEOh4,293
8
- flashforge/api/controls/control.py,sha256=N1DGpuyvuPWzyMd4_CvbyaQQwoacPIRE8yBaFyy0d9g,14715
9
- flashforge/api/controls/creator5_palette.py,sha256=hB0OF4sOrf7bVy3n4cPocJkfr8uM1MHRRg4ccCd6xfU,8780
10
- flashforge/api/controls/files.py,sha256=BhSQxXMt8MX2acyWtRzyNXfPYHsy6IkCwH04ksMCIp4,7114
11
- flashforge/api/controls/info.py,sha256=fQ5ICxAfIK4VojcSee_TYM8H585oPJWRDAgwv8MH5Mk,17029
12
- flashforge/api/controls/job_control.py,sha256=uLZQgtzto15AOauUgNg-031cSy_m1W28p9H8y3vZi9M,31955
13
- flashforge/api/controls/temp_control.py,sha256=x9KWkkk6dgdOFR1DAWj2fW7tn-PH0ne-xyrB0XidsTo,12865
14
- flashforge/api/filament/__init__.py,sha256=isT2dl0hzUS0xMTXMm4Tip0GTG1gCsm8LKWa9xPu4Y8,104
15
- flashforge/api/filament/filament.py,sha256=TtcC2G2nD9Sq4cOrCZzFLZ6Q0Ve-zfrfuEF9uQ8M3eE,1214
16
- flashforge/api/misc/__init__.py,sha256=1AG7vOMRBZQtHp6QUzfr9alcJPeNv3JpU44NrznxDHs,211
17
- flashforge/api/misc/scientific_notation.py,sha256=KSMTrrYhPWLv0gbcEAD6u-jEOcIwUjOCOPMBi0LiO-k,826
18
- flashforge/api/misc/temperature.py,sha256=qeHlCdPzLyqGDEB874Ib5AgYHMR9Qtw61shnw4G095E,1066
19
- flashforge/api/network/__init__.py,sha256=G5fBoAlq-NQPDkWp579mFIqsj0v7B1Lb2TAzO6IZA0Q,164
20
- flashforge/api/network/fnet_code.py,sha256=BR2niVKKk4ZfXtizUDIMXzDhlCxPHzqWg5AQQIcoj3g,402
21
- flashforge/api/network/utils.py,sha256=Q5-Vj_1VN611QV_TGpDzrrZ2X8PqaGT0j00BhSHv5MM,2096
22
- flashforge/discovery/__init__.py,sha256=G0WiP70EhfHdjXR1RNlv6xjhyHOdo-HWyOm9J0ds4SM,828
23
- flashforge/discovery/discovery.py,sha256=c_lT8pgegEAp9LV5seljp5TQLjNxEQcE8CXAAOvpWQ4,27566
24
- flashforge/models/__init__.py,sha256=hdcK0E4KeDfv_A8Y2aPOHgHziwTjP1RPb_VP-89dOzQ,1086
25
- flashforge/models/machine_info.py,sha256=wqVOTkxhRf2zrt0yr3SGJGr8SRnMXYiqEBZzQBLJHc0,17064
26
- flashforge/models/responses.py,sha256=q5DtcTys0g_QIdn_CeYMykQrzyg5TGo11B7T5OCYj-A,9654
27
- flashforge/tcp/__init__.py,sha256=hpnqoWHeRtTwJPzdsVlwGt1njKbAkrgIHKADkLSIRec,1317
28
- flashforge/tcp/a3_client.py,sha256=a1jdDcBnTSNrzJFKTuVV13fSLbZmxKEZ94n3cGf3wOA,15603
29
- flashforge/tcp/a4_client.py,sha256=0KH5zfsbWaPRd7xSKb7YA3oZTkCVdsdcTA9LPl3S55Q,11167
30
- flashforge/tcp/ff_client.py,sha256=CJXk0Qei2FVSpbXxZhiEQgAEcTJaBab1ouooqyC4OL4,20235
31
- flashforge/tcp/tcp_client.py,sha256=KjymxUXiXgEp9y7mjr5tNO_Y2-bsGEyP-oG5en7rCCs,16996
32
- flashforge/tcp/gcode/__init__.py,sha256=tFGlqCPFxVJNizXsIG4pMOK7IPFNnc_vIEMciULYkMY,271
33
- flashforge/tcp/gcode/a3_gcode_controller.py,sha256=x84_xo_Ll5k6hMAwDWuNUo54znV-BBIfwnmeOiEa9Fs,3688
34
- flashforge/tcp/gcode/gcode_controller.py,sha256=6K1VGgX59AcE_Kh_gm13dmxCY_kuzV_d2ooSpheONRI,10075
35
- flashforge/tcp/gcode/gcodes.py,sha256=55Ii1JpJNJNmOnBivyF83vz3TZUPDtp01lX72NINfPQ,3658
36
- flashforge/tcp/parsers/__init__.py,sha256=kDaJmiH0JcR5i693Fj3pwmINLWN0ipirN3LWGFvPst0,730
37
- flashforge/tcp/parsers/endstop_status.py,sha256=4jTtodJiiAVeeU8Z5daFtETm8ExPGo5P1CQWZ9KYrfg,9815
38
- flashforge/tcp/parsers/location_info.py,sha256=n1lUUmbk4kuuuBUbIA65dlPa4tsVGUJFlwnoeRW0yx8,2865
39
- flashforge/tcp/parsers/print_status.py,sha256=4q9ZlJfO0c7_t1o15tgxbguMxpDjEW9pMyaFU6a0Nfk,6164
40
- flashforge/tcp/parsers/printer_info.py,sha256=QY6LECfcOhVHSIdsvQZwJago0OjXroUwiX0H-uQaH2A,5411
41
- flashforge/tcp/parsers/temp_info.py,sha256=9Waf68tt-4QBcChyUwfMHDwWdIzM4mmDpZAKeAzklgs,7908
42
- flashforge/tcp/parsers/thumbnail_info.py,sha256=ZmxdEbVFOzqR1AfhXXZyjENVI66BdRdE7Q8LQ8an9FY,10201
43
- flashforge_python_api-1.3.1.dist-info/METADATA,sha256=MKOJ1wtL99yZP8QjZjSSBcb44BboYqLMMtpwzoDHzGQ,4970
44
- flashforge_python_api-1.3.1.dist-info/WHEEL,sha256=mffPy8wBnZQn2VnJUU5jE99KsxaSfiyMHV9Yt0aLVxs,87
45
- flashforge_python_api-1.3.1.dist-info/entry_points.txt,sha256=AkOxlsLvQ7cvMLxn7tlzfKp_DCH2hXhbVceHIXxawpU,66
46
- flashforge_python_api-1.3.1.dist-info/licenses/LICENSE,sha256=-cTA-hrmvlb3pqlQrBZQXUnKayhUjsLJMPb7TD91frM,1067
47
- flashforge_python_api-1.3.1.dist-info/RECORD,,