From e60da3daf6637537193f7dd4bf274d1a176574eb Mon Sep 17 00:00:00 2001
From: nadja
Date: Wed, 26 Aug 2026 18:29:39 +0200
Subject: [PATCH] fix Analyse
---
.env.example | 4 ---
backend/routes/recipes.js | 40 --------------------------
backend/services/instagram.js | 39 -------------------------
docker-compose.yml | 1 -
frontend/src/api.js | 7 -----
frontend/src/components/RecipeCard.jsx | 2 +-
frontend/src/pages/AddRecipe.jsx | 30 +++++++------------
frontend/src/pages/Home.jsx | 2 +-
frontend/src/pages/RecipeDetail.jsx | 20 ++++---------
9 files changed, 18 insertions(+), 127 deletions(-)
delete mode 100644 backend/services/instagram.js
diff --git a/.env.example b/.env.example
index 20a8ec0..a6aa602 100644
--- a/.env.example
+++ b/.env.example
@@ -9,7 +9,3 @@ ADMIN_PASS=DEIN-SICHERES-PASSWORT
# Ollama KI-Modell (optional, Standard: mistral)
# OLLAMA_MODEL=mistral
-
-# Instagram oEmbed Token (optional, für Instagram Reels Extraktion)
-# Benötigt ein Facebook App Access Token
-# INSTAGRAM_TOKEN=dein-token-hier
diff --git a/backend/routes/recipes.js b/backend/routes/recipes.js
index 23c84a6..ab659c8 100644
--- a/backend/routes/recipes.js
+++ b/backend/routes/recipes.js
@@ -4,7 +4,6 @@ import {
updateRecipe, deleteRecipe, getCategories, getDb
} from '../db.js';
import { getTikTokData } from '../services/tiktok.js';
-import { getInstagramData } from '../services/instagram.js';
import { isOllamaAvailable, extractRecipe } from '../services/ai.js';
import { trackEvent } from '../analytics-db.js';
@@ -111,43 +110,4 @@ router.post('/from-tiktok', async (req, res) => {
}
});
-router.post('/from-instagram', async (req, res) => {
- try {
- const { url } = req.body;
- if (!url) return res.status(400).json({ error: 'URL erforderlich' });
-
- const instagramData = await getInstagramData(url);
-
- const ollamaAvailable = await isOllamaAvailable();
- let extracted = null;
- let aiStatus = ollamaAvailable ? 'available' : 'unavailable';
-
- let aiMessage = '';
- if (ollamaAvailable && instagramData.title) {
- try {
- extracted = await extractRecipe(instagramData.title);
- aiStatus = 'success';
- } catch (e) {
- console.error('Ollama Extraktion fehlgeschlagen:', e.message);
- aiStatus = 'error';
- aiMessage = e.message;
- }
- } else if (!ollamaAvailable) {
- aiMessage = 'Ollama-Server nicht erreichbar';
- } else if (!instagramData.title) {
- aiMessage = 'Kein Titel im Video gefunden';
- }
-
- res.json({
- instagram: instagramData,
- ollama: ollamaAvailable,
- aiStatus,
- aiMessage,
- extracted,
- });
- } catch (error) {
- res.status(500).json({ error: error.message });
- }
-});
-
export default router;
diff --git a/backend/services/instagram.js b/backend/services/instagram.js
deleted file mode 100644
index f494f06..0000000
--- a/backend/services/instagram.js
+++ /dev/null
@@ -1,39 +0,0 @@
-const INSTAGRAM_TOKEN = process.env.INSTAGRAM_TOKEN;
-
-export async function getInstagramData(url) {
- const reelMatch = url.match(/instagram\.com\/(?:p|reel)\/([A-Za-z0-9_-]+)/);
- const usernameMatch = url.match(/instagram\.com\/([^/]+)\//);
-
- if (INSTAGRAM_TOKEN) {
- try {
- const oembedUrl = `https://graph.facebook.com/v18.0/instagram_oembed?url=${encodeURIComponent(url)}&fields=author_name,thumbnail_url,title,html&access_token=${INSTAGRAM_TOKEN}`;
- const response = await fetch(oembedUrl);
- if (response.ok) {
- const data = await response.json();
- return {
- title: data.title || '',
- author: data.author_name || '',
- authorUrl: `https://www.instagram.com/${data.author_name || ''}`,
- thumbnail: data.thumbnail_url || '',
- embedHtml: data.html || '',
- reelId: reelMatch ? reelMatch[1] : null,
- };
- }
- } catch (e) {
- console.error('Instagram oEmbed Fehler:', e.message);
- }
- }
-
- return {
- title: '',
- author: usernameMatch ? usernameMatch[1] : '',
- authorUrl: usernameMatch ? `https://www.instagram.com/${usernameMatch[1]}` : '',
- thumbnail: '',
- embedHtml: '',
- reelId: reelMatch ? reelMatch[1] : null,
- };
-}
-
-export function isInstagramUrl(url) {
- return /instagram\.com\/(p|reel)\//.test(url);
-}
diff --git a/docker-compose.yml b/docker-compose.yml
index efb4a11..a844d74 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -18,7 +18,6 @@ services:
- JWT_SECRET=${JWT_SECRET}
- ADMIN_USER=${ADMIN_USER:-admin}
- ADMIN_PASS=${ADMIN_PASS}
- - INSTAGRAM_TOKEN=${INSTAGRAM_TOKEN:-}
volumes:
- ./data:/app/data
depends_on:
diff --git a/frontend/src/api.js b/frontend/src/api.js
index 46fd2d4..f4ff1b1 100644
--- a/frontend/src/api.js
+++ b/frontend/src/api.js
@@ -52,13 +52,6 @@ export async function extractFromTikTok(url) {
});
}
-export async function extractFromInstagram(url) {
- return apiFetch(`${API_BASE}/from-instagram`, {
- method: 'POST',
- headers: { 'Content-Type': 'application/json' },
- body: JSON.stringify({ url }),
- });
-}
export async function fetchCategories() {
return apiFetch(`${API_BASE}/categories`);
diff --git a/frontend/src/components/RecipeCard.jsx b/frontend/src/components/RecipeCard.jsx
index bd921f7..3d39cd5 100644
--- a/frontend/src/components/RecipeCard.jsx
+++ b/frontend/src/components/RecipeCard.jsx
@@ -28,7 +28,7 @@ export default function RecipeCard({ recipe }) {
)}
- {author && @{author} ({source === 'instagram' ? 'IG' : 'TT'})}
+ {author && @{author} (TT)}
{recipe.ingredients?.length || 0} Zutaten
{recipe.steps?.length || 0} Schritte
diff --git a/frontend/src/pages/AddRecipe.jsx b/frontend/src/pages/AddRecipe.jsx
index b7fc067..b2f9a19 100644
--- a/frontend/src/pages/AddRecipe.jsx
+++ b/frontend/src/pages/AddRecipe.jsx
@@ -1,6 +1,6 @@
import { useState } from 'react';
import { useNavigate } from 'react-router-dom';
-import { extractFromTikTok, extractFromInstagram, saveRecipe } from '../api';
+import { extractFromTikTok, saveRecipe } from '../api';
import { useAuth } from '../context/AuthContext';
import IngredientList from '../components/IngredientList';
import StepList from '../components/StepList';
@@ -8,7 +8,6 @@ import StepList from '../components/StepList';
const CATEGORIES = ['Frühstück', 'Hauptgericht', 'Dessert', 'Snack', 'Getränk', 'Sonstiges'];
function detectSource(url) {
- if (/instagram\.com\/(p|reel)\//.test(url)) return 'instagram';
if (/tiktok\.com\//.test(url)) return 'tiktok';
return null;
}
@@ -37,7 +36,7 @@ export default function AddRecipe() {
if (!url.trim()) return;
const detected = detectSource(url);
if (!detected) {
- setError('URL muss von TikTok oder Instagram sein.');
+ setError('URL muss von TikTok sein.');
return;
}
@@ -46,20 +45,11 @@ export default function AddRecipe() {
setAiStatus(null);
setAiMessage('');
try {
- let data;
- if (detected === 'instagram') {
- data = await extractFromInstagram(url);
- const ig = data.instagram;
- setThumbnail(ig.thumbnail);
- setSourceAuthor(ig.author);
- setSource('instagram');
- } else {
- data = await extractFromTikTok(url);
- const tt = data.tiktok;
- setThumbnail(tt.thumbnail);
- setSourceAuthor(tt.author);
- setSource('tiktok');
- }
+ const data = await extractFromTikTok(url);
+ const tt = data.tiktok;
+ setThumbnail(tt.thumbnail);
+ setSourceAuthor(tt.author);
+ setSource('tiktok');
if (data.extracted) {
setName(data.extracted.name || '');
@@ -68,7 +58,7 @@ export default function AddRecipe() {
setIngredients(data.extracted.ingredients || []);
setSteps(data.extracted.steps || []);
} else {
- setName(detected === 'instagram' ? (data.instagram?.title || '') : (data.tiktok?.title || ''));
+ setName(data.tiktok?.title || '');
}
setAiStatus(data.aiStatus || (data.extracted ? 'success' : 'unavailable'));
setAiMessage(data.aiMessage || '');
@@ -106,14 +96,14 @@ export default function AddRecipe() {
setUrl(e.target.value)}
- placeholder="https://www.tiktok.com/@user/video/... oder https://www.instagram.com/reel/..."
+ placeholder="https://www.tiktok.com/@user/video/..."
className="flex-1 px-4 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500"
onKeyDown={e => e.key === 'Enter' && handleExtract()}
/>
diff --git a/frontend/src/pages/Home.jsx b/frontend/src/pages/Home.jsx
index b1c46be..9acdc5e 100644
--- a/frontend/src/pages/Home.jsx
+++ b/frontend/src/pages/Home.jsx
@@ -107,7 +107,7 @@ export default function Home() {
Keine Rezepte gefunden
- Füge dein erstes Rezept über TikTok- oder Instagram-Links hinzu!
+ Füge dein erstes Rezept über TikTok-Links hinzu!
) : (
diff --git a/frontend/src/pages/RecipeDetail.jsx b/frontend/src/pages/RecipeDetail.jsx
index 11daa36..9691534 100644
--- a/frontend/src/pages/RecipeDetail.jsx
+++ b/frontend/src/pages/RecipeDetail.jsx
@@ -53,18 +53,10 @@ export default function RecipeDetail() {
let videoId = null;
let embedUrl = null;
if (sourceUrl) {
- if (sourceType === 'instagram') {
- const igMatch = sourceUrl.match(/instagram\.com\/(?:p|reel)\/([A-Za-z0-9_-]+)/);
- if (igMatch) {
- videoId = igMatch[1];
- embedUrl = `https://www.instagram.com/reel/${videoId}/embed/`;
- }
- } else {
- const ttMatch = sourceUrl.match(/video\/(\d+)/);
- if (ttMatch) {
- videoId = ttMatch[1];
- embedUrl = `https://www.tiktok.com/embed/v2/${videoId}`;
- }
+ const ttMatch = sourceUrl.match(/video\/(\d+)/);
+ if (ttMatch) {
+ videoId = ttMatch[1];
+ embedUrl = `https://www.tiktok.com/embed/v2/${videoId}`;
}
}
@@ -78,7 +70,7 @@ export default function RecipeDetail() {