extract_metadata: Add support for extracting Cura thumbnails
Signed-off-by: Eric Callahan <arksine.code@gmail.com>
This commit is contained in:
parent
0d515e4938
commit
aac11a9fb8
|
@ -9,8 +9,10 @@ import argparse
|
||||||
import re
|
import re
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
import time
|
import base64
|
||||||
import traceback
|
import traceback
|
||||||
|
import io
|
||||||
|
from PIL import Image
|
||||||
|
|
||||||
# regex helpers
|
# regex helpers
|
||||||
def _regex_find_floats(pattern, data, strict=False):
|
def _regex_find_floats(pattern, data, strict=False):
|
||||||
|
@ -50,7 +52,8 @@ def _regex_find_first(pattern, data, cast=float):
|
||||||
|
|
||||||
# Slicer parsing implementations
|
# Slicer parsing implementations
|
||||||
class BaseSlicer(object):
|
class BaseSlicer(object):
|
||||||
def __init__(self):
|
def __init__(self, file_path):
|
||||||
|
self.path = file_path
|
||||||
self.header_data = self.footer_data = self.log = None
|
self.header_data = self.footer_data = self.log = None
|
||||||
|
|
||||||
def set_data(self, header_data, footer_data, log):
|
def set_data(self, header_data, footer_data, log):
|
||||||
|
@ -280,6 +283,39 @@ class Cura(BaseSlicer):
|
||||||
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):
|
||||||
|
thumbName = os.path.splitext(
|
||||||
|
os.path.basename(self.path))[0] + ".png"
|
||||||
|
thumbPath = os.path.join(
|
||||||
|
os.path.dirname(self.path), "thumbs", thumbName)
|
||||||
|
if not os.path.isfile(thumbPath):
|
||||||
|
return None
|
||||||
|
# read file
|
||||||
|
thumbs = []
|
||||||
|
try:
|
||||||
|
with open(thumbPath, 'rb') as thumbFile:
|
||||||
|
fbytes = thumbFile.read()
|
||||||
|
with Image.open(io.BytesIO(fbytes)) as im:
|
||||||
|
thumbFull = base64.b64encode(fbytes).decode()
|
||||||
|
thumbs.append({
|
||||||
|
'width': im.width, 'height': im.height,
|
||||||
|
'size': len(thumbFull), 'data': thumbFull
|
||||||
|
})
|
||||||
|
# Create 32x32 thumbnail
|
||||||
|
im.thumbnail((32, 32), Image.ANTIALIAS)
|
||||||
|
tmpThumb = io.BytesIO()
|
||||||
|
im.save(tmpThumb, format="PNG")
|
||||||
|
thumbSmall = base64.b64encode(
|
||||||
|
tmpThumb.getbuffer()).decode()
|
||||||
|
tmpThumb.close()
|
||||||
|
thumbs.insert(0, {
|
||||||
|
'width': im.width, 'height': im.height,
|
||||||
|
'size': len(thumbSmall), 'data': thumbSmall
|
||||||
|
})
|
||||||
|
except Exception as e:
|
||||||
|
self.log.append(str(e))
|
||||||
|
return None
|
||||||
|
return thumbs
|
||||||
|
|
||||||
class Simplify3D(BaseSlicer):
|
class Simplify3D(BaseSlicer):
|
||||||
def check_identity(self, data):
|
def check_identity(self, data):
|
||||||
|
@ -486,7 +522,7 @@ SUPPORTED_DATA = [
|
||||||
|
|
||||||
def extract_metadata(file_path, log):
|
def extract_metadata(file_path, log):
|
||||||
metadata = {}
|
metadata = {}
|
||||||
slicers = [s() for s in SUPPORTED_SLICERS]
|
slicers = [s(file_path) for s in SUPPORTED_SLICERS]
|
||||||
header_data = footer_data = slicer = None
|
header_data = footer_data = slicer = None
|
||||||
size = os.path.getsize(file_path)
|
size = os.path.getsize(file_path)
|
||||||
metadata['size'] = size
|
metadata['size'] = size
|
||||||
|
@ -502,7 +538,7 @@ def extract_metadata(file_path, log):
|
||||||
metadata.update(ident)
|
metadata.update(ident)
|
||||||
break
|
break
|
||||||
if slicer is None:
|
if slicer is None:
|
||||||
slicer = UnknownSlicer()
|
slicer = UnknownSlicer(file_path)
|
||||||
metadata['slicer'] = "Unknown"
|
metadata['slicer'] = "Unknown"
|
||||||
if size > READ_SIZE * 2:
|
if size > READ_SIZE * 2:
|
||||||
f.seek(size - READ_SIZE)
|
f.seek(size - READ_SIZE)
|
||||||
|
|
Loading…
Reference in New Issue