diff --git a/cookbook/views/api.py b/cookbook/views/api.py
index c0a25bd63..b0c6a9b3c 100644
--- a/cookbook/views/api.py
+++ b/cookbook/views/api.py
@@ -1697,17 +1697,22 @@ class RecipeUrlImportView(APIView):
url = serializer.validated_data.get('url', None)
data = unquote(serializer.validated_data.get('data', None))
+
+ duplicate = False
+ if url:
+ # Check for existing recipes with provided url
+ existing_recipe = Recipe.objects.filter(source_url=url).first()
+ if existing_recipe:
+ duplicate = True
+
if not url and not data:
return Response({'error': True, 'msg': _('Nothing to do.')}, status=status.HTTP_400_BAD_REQUEST)
elif url and not data:
if re.match('^(https?://)?(www\\.youtube\\.com|youtu\\.be)/.+$', url):
if validate_import_url(url):
- return Response({'recipe_json': get_from_youtube_scraper(url, request), 'recipe_images': [], },
- status=status.HTTP_200_OK)
- if re.match(
- '^(.)*/view/recipe/[0-9]+/[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$',
- url):
+ return Response({'recipe_json': get_from_youtube_scraper(url, request), 'recipe_images': [], 'duplicate': duplicate}, status=status.HTTP_200_OK)
+ if re.match('^(.)*/view/recipe/[0-9]+/[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$', url):
recipe_json = requests.get(
url.replace('/view/recipe/', '/api/recipe/').replace(re.split('/view/recipe/[0-9]+', url)[1],
'') + '?share='
@@ -1724,8 +1729,7 @@ class RecipeUrlImportView(APIView):
filetype=pathlib.Path(recipe_json['image']).suffix),
name=f'{uuid.uuid4()}_{recipe.pk}{pathlib.Path(recipe_json["image"]).suffix}')
recipe.save()
- return Response({'link': request.build_absolute_uri(reverse('view_recipe', args={recipe.pk}))},
- status=status.HTTP_201_CREATED)
+ return Response({'link': request.build_absolute_uri(reverse('view_recipe', args={recipe.pk})), 'duplicate': duplicate}, status=status.HTTP_201_CREATED)
else:
try:
if validate_import_url(url):
@@ -1764,6 +1768,7 @@ class RecipeUrlImportView(APIView):
return Response({
'recipe_json': helper.get_from_scraper(scrape, request),
'recipe_images': list(dict.fromkeys(get_images_from_soup(scrape.soup, url))),
+ 'duplicate': duplicate
},
status=status.HTTP_200_OK)
diff --git a/vue/src/apps/ImportView/ImportView.vue b/vue/src/apps/ImportView/ImportView.vue
index b1743944c..fbd5a0402 100644
--- a/vue/src/apps/ImportView/ImportView.vue
+++ b/vue/src/apps/ImportView/ImportView.vue
@@ -83,6 +83,11 @@
+
+
+ {{ duplicateWarning }}
+
+
@@ -463,6 +468,7 @@ export default {
},
// URL import
LS_IMPORT_RECENT: 'import_recent_urls', //TODO use central helper to manage all local storage keys (and maybe even access)
+ duplicateWarning: '',
website_url: '',
website_url_list: '',
import_multiple: false,
@@ -643,6 +649,12 @@ export default {
return
}
+ if ('duplicate' in response.data && response.data['duplicate']) {
+ this.duplicateWarning = "A recipe with this URL already exists.";
+ } else {
+ this.duplicateWarning = "";
+ }
+
this.loading = false
this.recipe_json = response.data['recipe_json'];
@@ -763,6 +775,16 @@ export default {