metadata: always create a miniature thumbnail

Don't require that gcode files embed two thumbnails.  When
a single large thumbnail is parsed use pillow to create a
small one.

Signed-off-by:  Eric Callahan <arksine.code@gmail.com>
This commit is contained in:
Eric Callahan 2021-12-22 06:41:19 -05:00
parent 5766d16edc
commit cc1a55a871
1 changed files with 28 additions and 31 deletions

View File

@ -298,6 +298,7 @@ class PrusaSlicer(BaseSlicer):
return None return None
thumb_base = os.path.splitext(os.path.basename(self.path))[0] thumb_base = os.path.splitext(os.path.basename(self.path))[0]
parsed_matches: List[Dict[str, Any]] = [] parsed_matches: List[Dict[str, Any]] = []
has_miniature: bool = False
for match in thumb_matches: for match in thumb_matches:
lines = re.split(r"\r?\n", match.replace('; ', '')) lines = re.split(r"\r?\n", match.replace('; ', ''))
info = _regex_find_ints(r".*", lines[0]) info = _regex_find_ints(r".*", lines[0])
@ -321,6 +322,33 @@ class PrusaSlicer(BaseSlicer):
'width': info[0], 'height': info[1], 'width': info[0], 'height': info[1],
'size': os.path.getsize(thumb_path), 'size': os.path.getsize(thumb_path),
'relative_path': rel_thumb_path}) 'relative_path': rel_thumb_path})
if info[0] == 32 and info[1] == 32:
has_miniature = True
if len(parsed_matches) > 0 and not has_miniature:
# find the largest thumb index
largest_match = parsed_matches[0]
for item in parsed_matches:
if item['size'] > largest_match['size']:
largest_match = item
# Create miniature thumbnail if one does not exist
thumb_full_name = largest_match['relative_path'].split("/")[-1]
thumb_path = os.path.join(thumb_dir, f"{thumb_full_name}")
rel_path_small = os.path.join(".thumbs", f"{thumb_base}-32x32.png")
thumb_path_small = os.path.join(
thumb_dir, f"{thumb_base}-32x32.png")
# read file
try:
with Image.open(thumb_path) as im:
# Create 32x32 thumbnail
im.thumbnail((32, 32))
im.save(thumb_path_small, format="PNG")
parsed_matches.insert(0, {
'width': im.width, 'height': im.height,
'size': os.path.getsize(thumb_path_small),
'relative_path': rel_path_small
})
except Exception as e:
log_to_stderr(str(e))
return parsed_matches return parsed_matches
def parse_first_layer_extr_temp(self) -> Optional[float]: def parse_first_layer_extr_temp(self) -> Optional[float]:
@ -655,37 +683,6 @@ class IdeaMaker(PrusaSlicer):
return _regex_find_first( return _regex_find_first(
r"M190 S(\d+\.?\d*)", self.header_data) r"M190 S(\d+\.?\d*)", self.header_data)
def parse_thumbnails(self) -> Optional[List[Dict[str, Any]]]:
# Attempt to parse thumbnails from file metadata
thumbs = super().parse_thumbnails()
if thumbs is not None:
# Check for extracted single size thumbnail from gcode
thumb_dir = os.path.join(os.path.dirname(self.path), ".thumbs")
thumb_base = os.path.splitext(os.path.basename(self.path))[0]
thumb_full_name = thumbs[0]['relative_path'].split("/")[1]
thumb_path = os.path.join(thumb_dir, f"{thumb_full_name}")
rel_path_small = os.path.join(".thumbs", f"{thumb_base}-32x32.png")
thumb_path_small = os.path.join(
thumb_dir, f"{thumb_base}-32x32.png")
if not os.path.isfile(thumb_path):
return None
# read file
try:
with Image.open(thumb_path) as im:
# Create 32x32 thumbnail
im.thumbnail((32, 32))
im.save(thumb_path_small, format="PNG")
thumbs.insert(0, {
'width': im.width, 'height': im.height,
'size': os.path.getsize(thumb_path_small),
'relative_path': rel_path_small
})
except Exception as e:
log_to_stderr(str(e))
return None
return thumbs
class IceSL(BaseSlicer): class IceSL(BaseSlicer):
def check_identity(self, data) -> Optional[Dict[str, Any]]: def check_identity(self, data) -> Optional[Dict[str, Any]]:
match = re.search(r"; <IceSL.*>", data) match = re.search(r"; <IceSL.*>", data)