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() {
{embedUrl && ( -
+