From c25b58e40464a0fe01e9ba73bb41f33796e0b132 Mon Sep 17 00:00:00 2001 From: Michael Genson <71845777+michael-genson@users.noreply.github.com> Date: Sun, 23 Jul 2023 12:50:47 -0500 Subject: [PATCH] fix: Missing Paprika and Nextcloud Migration Data (#2434) * fixed paprika url key * fixed paprika total and prep time aliases * added nextcloud time parsing * mapped paprika categories to tags * cleaned up netcloud parsetime --- mealie/services/migrations/nextcloud.py | 27 ++++++++++++++++++++++++- mealie/services/migrations/paprika.py | 7 ++++++- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/mealie/services/migrations/nextcloud.py b/mealie/services/migrations/nextcloud.py index 661a3a979b52..c4d5678743f6 100644 --- a/mealie/services/migrations/nextcloud.py +++ b/mealie/services/migrations/nextcloud.py @@ -1,3 +1,4 @@ +import re import tempfile import zipfile from dataclasses import dataclass @@ -43,7 +44,10 @@ class NextcloudMigrator(BaseMigrator): self.key_aliases = [ MigrationAlias(key="tags", alias="keywords", func=split_by_comma), - MigrationAlias(key="org_url", alias="url", func=None), + MigrationAlias(key="orgURL", alias="url", func=None), + MigrationAlias(key="totalTime", alias="totalTime", func=parse_time), + MigrationAlias(key="prepTime", alias="prepTime", func=parse_time), + MigrationAlias(key="performTime", alias="cookTime", func=parse_time), ] def _migrate(self) -> None: @@ -69,3 +73,24 @@ class NextcloudMigrator(BaseMigrator): nc_dir = nextcloud_dirs[slug] if nc_dir.image: import_image(nc_dir.image, recipe_id) + + +def parse_time(time: str) -> str: + """Parses a Nextcloud time string in the format 'PT{hours}H{minutes}M{seconds}S'""" + + # TODO: make singular and plural translatable + hours = {"singular": "hour", "plural": "hours", "exp": r"\d+(?=H)"} + minutes = {"singular": "minute", "plural": "minutes", "exp": r"\d+(?=M)"} + seconds = {"singular": "second", "plural": "seconds", "exp": r"\d+(?=S)"} + + return_strings: list[str] = [] + for time_part in [hours, minutes, seconds]: + val_search = re.search(time_part["exp"], time) + if not val_search: + continue + val = val_search.group() + if val == "0": + continue + return_strings.append(f'{val} {time_part["singular"] if val == "1" else time_part["plural"]}') + + return " ".join(return_strings) if return_strings else time diff --git a/mealie/services/migrations/paprika.py b/mealie/services/migrations/paprika.py index 231d886478c9..d0b64ac38596 100644 --- a/mealie/services/migrations/paprika.py +++ b/mealie/services/migrations/paprika.py @@ -39,9 +39,14 @@ class PaprikaMigrator(BaseMigrator): self.key_aliases = [ MigrationAlias(key="recipeIngredient", alias="ingredients", func=lambda x: x.split("\n")), - MigrationAlias(key="orgUrl", alias="source_url", func=None), + MigrationAlias(key="orgURL", alias="source_url", func=None), + MigrationAlias(key="totalTime", alias="total_time", func=None), + MigrationAlias(key="prepTime", alias="prep_time", func=None), MigrationAlias(key="performTime", alias="cook_time", func=None), MigrationAlias(key="recipeYield", alias="servings", func=None), + MigrationAlias( + key="tags", alias="categories", func=None + ), # Paprika doesn't support tags, and instead puts tags in categories MigrationAlias(key="image", alias="image_url", func=None), MigrationAlias(key="dateAdded", alias="created", func=lambda x: x[: x.find(" ")]), MigrationAlias(