gpn23-recipes/1_clean_json.py
2025-06-12 23:21:45 +02:00

103 lines
2.6 KiB
Python

import json
import re
import os
from config import *
def clean_recipe(recipe):
# remove useless ever-changing fields
for keyword in recipe["keywords"]:
keyword.pop("updated_at", None)
# remove buggy food properties
recipe.pop("food_properties", None)
for step in recipe["steps"]:
for ingredient in step["ingredients"]:
ingredient["food"].pop("properties", None)
# sort conversions
recipe.pop("food_properties", None)
for step in recipe["steps"]:
for ingredient in step["ingredients"]:
ingredient["conversions"] = sorted(ingredient["conversions"], key=lambda c: c["unit"])
return recipe
def check_recipe(recipe) -> list:
md = []
if "steps" in recipe:
steps = recipe["steps"]
else:
steps = []
md.append("No steps?")
for i, step in enumerate(steps, 1):
md += check_ingredients(step)
return md
def normalize_amount(a):
if a == round(a):
return round(a)
else:
return a
def check_ingredients(step):
md = []
for ingredient in step["ingredients"]:
i_amount = ingredient["amount"]
i_amount = normalize_amount(i_amount)
if not ingredient.get("unit"):
i_unit = ""
if i_amount:
md.append("- Amount but no unit?")
else:
i_unit = ingredient["unit"]["name"]
if i_unit and i_unit not in VALID_UNITS:
md.append(f"- Invalid unit {i_unit}")
if not ingredient.get("food"):
md.append("- No food element in ingredient?")
continue
return md
def make_link(recipe):
return f"[{recipe["name"]}]({TANDOOR_URL + "/view/recipe/" + str(recipe["id"])})"
def main():
# Clean
for json_file in os.listdir(OUTDIR_JSON):
with open(os.path.join(OUTDIR_JSON, json_file), "r", encoding="utf-8") as f:
recipe = json.load(f)
recipe = clean_recipe(recipe)
with open(os.path.join(OUTDIR_JSON, json_file), "w", encoding="utf-8") as f:
json.dump(recipe, f, sort_keys=True, indent=2)
# Read all and check
recipes = []
for json_file in os.listdir(OUTDIR_JSON):
with open(os.path.join(OUTDIR_JSON, json_file), "r", encoding="utf-8") as f:
data = json.load(f)
recipes.append(data)
for recipe in recipes:
md = check_recipe(recipe)
if not md:
print(f"## 💚 {make_link(recipe)}")
else:
print(f"## 💔 {make_link(recipe)}")
for line in md:
print(line)
if __name__ == "__main__":
main()