2025-06-18 23:03:32 +02:00
import json
import sys
from pathlib import Path
from datetime import timedelta
import re
import os
from tqdm import tqdm
import csv
from collections import defaultdict
from config import *
def grams ( ingredient ) :
conversion = None
for c in ingredient [ " conversions " ] :
if c [ " unit " ] in [ " g / Gramm " , " g " ] :
conversion = c
if conversion :
return conversion . get ( ' amount ' )
def allergens_for_step_ingredients ( step ) :
l = [ ]
for ingredient in step [ " ingredients " ] :
if not ingredient . get ( " food " ) :
raise ValueError ( " No food in ingredient " )
continue
i_grams = grams ( ingredient )
i_name = ingredient [ " food " ] [ " name " ]
i_description = ingredient [ " food " ] [ " description " ]
if match := re . search ( r " ^Allergene: (.*)$ " , i_description , re . MULTILINE ) :
i_allergens = match . group ( 1 )
else :
i_allergens = " ❗ keine Allergene hinterlegt "
l . append ( ( i_grams , i_name , i_allergens ) )
return l
def allergens_for_recipe ( recipe ) :
l = [ ]
for step in recipe [ " steps " ] :
l + = allergens_for_step_ingredients ( step )
return l
def link ( recipe ) :
return f " { TANDOOR_URL + " /view/recipe/ " + str ( recipe [ " id " ] ) } "
def wiki_link ( recipe ) :
wiki_slug = recipe [ " name " ]
wiki_slug = re . sub ( " " , " _ " , wiki_slug )
return f " { WIKI_URL + WIKI_ARTICLE_PREFIX + wiki_slug } "
def decruft_ingredient ( i_name : str ) :
i_name = i_name . replace ( " (trocken) " , " " )
i_name = i_name . replace ( " (frisch) " , " " )
i_name = i_name . replace ( " (TK) " , " " )
i_name = i_name . replace ( " (Dose) " , " " )
i_name = i_name . replace ( " (getrocknet) " , " " )
return i_name
def aggregate_zutaten ( data ) :
result = defaultdict ( int )
for grams , item in data :
result [ item ] + = grams
return [ ( g , n ) for n , g in result . items ( ) ]
def main ( ) :
Path ( " fruehstueck.csv " ) . unlink ( missing_ok = True )
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 )
2026-04-08 22:12:28 +02:00
recipes . sort ( key = lambda r : r [ " name " ] )
2025-06-18 23:03:32 +02:00
# filter "Frühstück"
recipes = [ r for r in recipes if any ( k [ " name " ] == " Fr \u00fc hst \u00fc ck " for k in r [ " keywords " ] ) ]
2026-04-08 22:15:53 +02:00
with open ( " fruehstueck.csv " , " w " , newline = " " ) as f :
fwriter = csv . writer ( f , delimiter = ' ; ' , quotechar = ' " ' , quoting = csv . QUOTE_MINIMAL , lineterminator = " \n " )
2025-06-18 23:03:32 +02:00
fwriter . writerow ( [ " title " , " url " , " isVegan " , " ingredients " , " comment " ] )
for recipe in recipes :
zutaten = [ ]
for i_grams , i_name , i_allergens in allergens_for_recipe ( recipe ) :
if i_grams is None :
i_grams = 0
zn = decruft_ingredient ( i_name )
if i_allergens != " (keine) " :
i_allergens = i_allergens . replace ( " ⁉ \ufe0f " , " \\ faExclamationTriangle " )
zn + = f " ( \\ Alg {{ { i_allergens } }} ) "
zutaten . append ( ( i_grams , zn ) )
zutaten = aggregate_zutaten ( zutaten )
zutaten . sort ( key = lambda z : z [ 0 ] , reverse = True )
fwriter . writerow ( [
recipe [ " name " ] ,
wiki_link ( recipe ) ,
1 , # XXX hardcoded
" , " . join ( z [ 1 ] for z in zutaten ) ,
" "
] )
if __name__ == " __main__ " :
main ( )