Repository navigation
Imports drop total time, unread times, nutrition and difficulty without a word #434
Description
Parent
What to build
The Mealie and Paprika readers drop what a cook typed without a word. Neither the recipe nor the Import Report keeps it, so a cook who deletes the old app after checking the Report has lost it. #411 promises the opposite: "nothing is lost silently before the old app is deleted".
Found by reading every field of the real test files against what each reader reads:
- Total time. Kamosu keeps prep and cook time only. Mealie's
total_timeis dropped on 8 of the 16 recipes intests/fixtures/mealie/, and Paprika's on 30 of the 746 in the corpus archive. The Mealie pre-v1 beef stew has a total time and no other, so it arrives with no time at all. - A prep or cook time Kamosu cannot read. The timer reader knows seconds, minutes and hours in English, French and Spanish.
1 Day(the pre-v1 pizza dough),15 Minuten,45 Minutenand1 Stunde 30 Minuten(the German recipes ofv2-export.zip), a bare2from Mealie, and1 dayfrom Paprika (two corpus recipes) all vanish. - Nutrition beyond calories. Mealie's protein, fat, carbohydrate, fibre, sugar, sodium and the rest are dropped on 5 recipes. The pre-v1 beef stew has six figures and no calories, so all of it goes.
- Paprika's difficulty (
Easy,Medium…), on 83 corpus recipes.
The rule, for every reader: what a cook typed either lands in a field of the recipe or is written into its Note, word for word. Bookkeeping (ids, hashes, file names, created and updated dates, settings) is neither. For these four:
- Each goes into the Note as a line of its own, after what the Note already holds, worded in the recipe's Language as Mealie's
Equipment:line is:Total time: 2 Hours 30 Minutes,Prep time: 1 Day,Cook time: 15 Minuten,Difficulty: Easy,Nutrition: protein 30, fat 12, …. - A time that does land in its field is not repeated in the Note. Total time always goes into the Note, since no field holds it.
- Nutrition lines name each figure as the app names it, with its unit where the app gave one, and leave out calories when they landed in the nutrition field.
- Paprika's free-text nutrition is written into the Note as it stands, and is no longer counted on the Report as
nutrition: nothing of it stays in Paprika. Thenutritionkind stays declared for a reader that cannot keep a figure.
Crouton is read by the same rule. Its neutritionalInfo is dropped by ADR 0025 as scrape debris; check the real export for anything else a cook typed, and record the result on this ticket either way.
Re-importing after this fix. A recipe that gains a Note line is a changed recipe, so importing the same file again offers it instead of finding it unchanged. Say so in the changelog line.
Acceptance criteria
- A table on this ticket lists every field present in the real Mealie, Paprika and Crouton test files, and says for each: the field it lands in, written into the Note, counted on the Report, or bookkeeping.
- The pre-v1 beef stew arrives with
Total time: 2 Hours 30 Minutesand its six nutrition figures in its Note; the pre-v1 pizza dough withPrep time: 1 Day. - A German Mealie recipe keeps its
15 Minutentimes in its Note. - A Paprika recipe with a difficulty and a total time keeps both in its Note; one checked in the corpus test.
- A French recipe's lines are worded in French.
- A time that landed in its field is not repeated in the Note.
- The corpus checks for Paprika and Crouton still pass, with the new Note lines counted.
- The changelog line from One place to import from another app, recognising the file #412 says what now arrives, and that recipes imported before are offered once on the next import.
Blocked by
None.
Activity
BattermanZ commentedon Oct 24, 2026
The Mealie half of this ticket shipped with #418 (PR #441), since a backup goes through the export's reader and #418's field table needed it. For the export and the backup alike,
src/mealie.rsnow writes a total time, a prep or cook time Kamosu cannot read, and nutrition beyond calories into the Note, each a line of its own worded in the recipe's Language, and leaves out a time that landed in its field. A total held in seconds alone is said in words. Tested inthe_export_from_before_mealie_1_is_read(the beef stew'sTotal time: 2 Hours 30 Minutesand six figures; the pizza dough'sPrep time: 1 Day) andthe_export_of_2025_is_read(German15 Minutenand45 Minuten, FrenchTemps total : 50 minutes, a landed time not repeated). The changelog line says Mealie recipes imported before are offered once. What is left here is Paprika's difficulty, total time and free-text nutrition, and the Crouton check.BattermanZ commentedon Oct 24, 2026
Every field of the real Mealie, Paprika and Crouton files, accounted for
Lands is the recipe field it goes to. Note means it is written into the Note word for word, as a paragraph of its own after the description and notes, led in the recipe's Language (
Temps total :,Tiempo total:; the table gives the English). Report means it is counted on the Import Report under what stayed in the old app. Bookkeeping covers ids, hashes, file names, dates and settings.Mealie's export
Every field present in
tests/fixtures/mealie/pre-v1-export.zip,v2-export.zipandv3-export*.zip. A backup goes through this same reader; its tables are accounted for on #418.namedescriptionnotes(title,text)prep_time,perform_time,cook_timePrep time:orCook time:and the time as typedprep_time_seconds,perform_time_secondstotal_time,total_time_secondsTotal time:(no field holds it); a total held in seconds alone is said in wordsrecipe_yield,recipe_yield_quantity,recipe_servingsorg_urlrecipe_ingredient:display,quantity,unit,food,note,disable_amountrecipe_ingredient:titlerecipe_ingredient:referenced_reciperecipe_ingredient:original_textrecipe_ingredient:reference_idrecipe_instructions:text,title,summaryrecipe_instructions:idnutrition:caloriesnutrition: every other figureNutrition:line, each figure named in the recipe's Languagerecipe_category,tags(name)tools(name)Equipment:lineassetsextra_photosfor any other picture,attached_filesfor any other fileimageratingratingscommentscommentssettings(public,show_nutrition,show_assets,landscape_view)id,slug,group_id,household_id,user_id,created_at,updated_at,date_added,date_updated,last_made,extraslast_madeandextrasare empty in every file)Paprika
Every field present in
tests/fixtures/paprika/mealie-sample.zipand the 746-recipe corpus archive.nameingredientsdirectionsdescription,notesprep_time,cook_time1 day,14 days,30 d), or reads only part (35 to 40 mins,about 1 1/2 hours,40 mins (plus proving)), also Note,Prep time:orCook time:and the time as typed: 8 prep and 29 cook in the corpus (new)total_timeTotal time:and the time as typed (30 in the corpus) (new)servingsa big pot) or the count is a range's lower end (Serves 4 to 6), also Note,Servings:and the servings as typed (89 in the corpus, nearly all ranges) (new)difficultyDifficulty:(83 in the corpus) (new)nutritional_infoNutrition:unless its first line already names it (141 led, 19 already labelled). No longer counted on the Report (new)source,source_urlcategoriesphoto_dataimage_urlphotosextra_photosratingratingsuidphoto,photo_large,photo_hash,hash,createdon_favoritesis read as Report:favourites, though no real file sets it.Crouton
Every field present in the 86-recipe export of 23 September 2026. Result of the check: nothing a cook typed is dropped, apart from
neutritionalInfo, which ADR 0025 drops on purpose. It was not even counted, so the Report now counts it undernutrition(17 recipes), the kind this ticket keeps "for a reader that cannot keep a figure".nameingredients:ingredient.name,quantity(amount,secondaryAmount,quantityType)SECTION; every unit in the export has a wordingredients:ordersteps:step,isSection,orderduration,cookingDurationservesnotessourceName,webLinktags(name)imagesextra_photospast the first,unreadable_photossourceImagesite_icon(the site's favicon, ADR 0017)neutritionalInfonutrition(new); dropped by ADR 0025 as scrape debrisdefaultScalefolderIDs,isPublicRecipeuuid,duplicatedFromRecipeUUID,tags.uuid,tags.color,ingredients.uuid,ingredient.uuid,steps.uuidBattermanZ commentedon Oct 24, 2026
Paprika and Crouton done, live pass recorded
The Paprika half and the Crouton check are built on
fix/434-paprika-note-lines. The field table is the comment above.What changed
src/paprika.rswrites into the Note, each a line of its own led in the recipe's Language: the total time as typed, a prep or cook time Kamosu cannot read or reads only in part (1 day,35 to 40 mins,40 mins (plus proving)), servings with no count or a range's upper end (Servings: Serves 4 to 6), the difficulty, and the free-text nutrition as it stands (noNutrition:lead where its first line already names it). Nutrition is no longer counted on the Report. A time that landed whole is not repeated.src/crouton.rscounts a recipe'sneutritionalInfoon the Report asnutrition. ADR 0025 still keeps it out of the recipe.src/schema_org.rsgivesWordsaServings:and aDifficulty:lead in English, French and Spanish.Two calls beyond the ticket's text, both under its rule that what a cook typed lands in a field or the Note: servings, which the ticket did not name (89 corpus recipes, nearly all ranges), and times read only in part, which the defects review found (8 prep and 29 cook in the corpus).
Checks.
just checkandjust testpass. Both corpus checks pass:cargo test --test paprika_corpus -- --ignoredwith the new counts pinned and the Blueberry Pie checked (Total time: 3 hours,Difficulty: Medium, prep and cook landed and not repeated), andcargo test --test crouton_corpus -- --ignoredwith 17nutritionrows.Live pass, through
POST /api/uploadsandimport_from_another_applive-434, since ended):tests/fixtures/paprika/mealie-sample.zip. Three recipes arrive withDifficulty: Easyas their Note, the others with none. Imported again: all fiveunchanged. The recipe page shows the line under the steps (phone, 390 px).40 mins (plus proving),Serves 4 to 6, nutrition), imported first by the code before this change (b5d4541) and then by this branch on the same data. The old code countednutritionon the Report. The new code offered the four recipes that gained a line, once, left the fifthunchanged, and counted no nutrition.Temps total : 50 minutes,Temps de cuisson : 1 jour,Portions : pour une tablée,Difficulté : Facile. Zucchinipuffer's readsTotal time: 1 hr 15 mins,Prep time: 40 mins (plus proving),Servings: Serves 4 to 6,Difficulty: Medium,Nutrition: Calories: 250 / Protein: 8 g, and its20 minscook time is in the field only.neutritionalInfoeach have anutritionrow on the Report, and the third has none.Found along the way and not fixed here: the Report's "needs you" line says "changed in Crouton since the last import" on every app's import (
report_changedinui/messages/*.json). It came in before this ticket.Merge pull request #443 from BatterWorks/fix/434-paprika-note-lines
github-actions commentedon Oct 24, 2026
Closed by #443, merged into
dev.github-actions commentedon Oct 24, 2026
Closed by #443, merged into
dev.