Initial commit: What To Cook (WTC) v4.4 - Digitales Kochbuch, Wochenmenueplan & Buchdruck
This commit is contained in:
@@ -0,0 +1,41 @@
|
||||
import os
|
||||
import zipfile
|
||||
|
||||
SRC = '/home/maxi/Projekt/wtc.waiswuaschd.de/data/import_2026'
|
||||
IMG_OUT = '/home/maxi/Projekt/wtc.waiswuaschd.de/app/static/uploads/recipes'
|
||||
os.makedirs(IMG_OUT, exist_ok=True)
|
||||
|
||||
extracted_images = {}
|
||||
|
||||
for f in sorted(os.listdir(SRC)):
|
||||
path = os.path.join(SRC, f)
|
||||
base = os.path.splitext(f)[0]
|
||||
ext = os.path.splitext(f)[1].lower()
|
||||
|
||||
if ext in ['.docx', '.pptx']:
|
||||
try:
|
||||
with zipfile.ZipFile(path, 'r') as z:
|
||||
# Find images in word/media or ppt/media
|
||||
media_files = [m for m in z.namelist() if m.startswith(('word/media/', 'ppt/media/')) and m.lower().endswith(('.jpg', '.jpeg', '.png'))]
|
||||
# Filter out tiny icons (e.g. < 5KB)
|
||||
large_media = []
|
||||
for m in media_files:
|
||||
info = z.getinfo(m)
|
||||
if info.file_size > 15000: # > 15KB
|
||||
large_media.append((m, info.file_size))
|
||||
|
||||
large_media.sort(key=lambda x: x[1], reverse=True)
|
||||
if large_media:
|
||||
best_img = large_media[0][0]
|
||||
img_ext = os.path.splitext(best_img)[1].lower()
|
||||
safe_name = "".join(c for c in base if c.isalnum() or c in (' ', '_', '-')).strip().replace(' ', '_').lower()
|
||||
target_file = f"{safe_name}{img_ext}"
|
||||
target_path = os.path.join(IMG_OUT, target_file)
|
||||
with open(target_path, 'wb') as out_f:
|
||||
out_f.write(z.read(best_img))
|
||||
extracted_images[f] = f"/static/uploads/recipes/{target_file}"
|
||||
print(f"Extracted image for {f}: {target_file} ({large_media[0][1]} bytes)")
|
||||
except Exception as e:
|
||||
print(f"Error extracting image from {f}: {e}")
|
||||
|
||||
print(f"\nTotal images extracted: {len(extracted_images)}")
|
||||
Reference in New Issue
Block a user