diff --git a/backend/src/tools/koepi/routes.js b/backend/src/tools/koepi/routes.js index 15e1534..75c01f0 100644 --- a/backend/src/tools/koepi/routes.js +++ b/backend/src/tools/koepi/routes.js @@ -99,41 +99,37 @@ async function scrapeMarktguru() { const description = descEl?.textContent?.trim() || ''; const img = card.querySelector('img.offer-list-item-img'); const badge = card.querySelector('.badge, .discount-badge')?.textContent?.trim() || ''; - const imgSrc = img?.src || null; + const imgSrc = img?.src?.replace('/medium.webp', '/large.webp') || img?.src || null; return { name, brand, price, oldPrice, retailer, dateRange, validity, description, badge, address: '', image: imgSrc }; }); }); - // Bilder via Node https mit exakten Browser-Headers laden - const nodeHttps = require('https'); - for (let i = 0; i < offers.length; i++) { - const url = offers[i].image; - if (!url || !url.startsWith('https://')) continue; - offers[i].image = await new Promise(resolve => { - const req = nodeHttps.get(url, { - headers: { - 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', - 'Accept': 'image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8', - 'Accept-Language': 'de-DE,de;q=0.9', - 'Referer': 'https://www.marktguru.de/', - 'Origin': 'https://www.marktguru.de', - 'sec-fetch-dest': 'image', - 'sec-fetch-mode': 'no-cors', - 'sec-fetch-site': 'cross-site', - } - }, res => { - if (res.statusCode !== 200) return resolve(null); - const chunks = []; - res.on('data', c => chunks.push(c)); - res.on('end', () => { - const b64 = Buffer.concat(chunks).toString('base64'); - const mime = res.headers['content-type'] || 'image/webp'; - resolve(`data:${mime};base64,${b64}`); - }); - }); - req.on('error', () => resolve(null)); - req.setTimeout(8000, () => { req.destroy(); resolve(null); }); - }); + // Lokale Bilder auswählen basierend auf Beschreibung + for (const offer of offers) { + const desc = (offer.description || '').toLowerCase(); + if (desc.includes('steini')) { + // Steini-Kasten + offer.imageLocal = '/koepi/kasten_steini.png'; + } else if (desc.includes('0,33') && (desc.includes('24') || desc.includes('24 x'))) { + // 24x0,33l Kasten + offer.imageLocal = '/koepi/kasten_033.png'; + } else if (desc.includes('11') && desc.includes('0,5')) { + // 11x0,5l Kasten (von vorne) + offer.imageLocal = '/koepi/kasten_front.png'; + } else if (desc.includes('0,5') && (desc.includes('20') || desc.includes('20 x'))) { + // 20x0,5l Langhalsflasche + offer.imageLocal = '/koepi/kasten_lang.png'; + } else if (desc.includes('flasche') || desc.includes('6 x') || desc.includes('6x')) { + // 6er Träger + offer.imageLocal = '/koepi/traeger.png'; + } else if (desc.includes('0,5')) { + offer.imageLocal = '/koepi/kasten_050.png'; + } else if (desc.includes('0,33')) { + offer.imageLocal = '/koepi/kasten_033.png'; + } else { + offer.imageLocal = '/koepi/kasten_050.png'; // default + } + offer.image = null; // CDN nicht mehr nötig } // Filtern auf Ziel-Händler + nur König Pilsener diff --git a/frontend/public/koepi/kasten_033.png b/frontend/public/koepi/kasten_033.png new file mode 100644 index 0000000..62cc964 Binary files /dev/null and b/frontend/public/koepi/kasten_033.png differ diff --git a/frontend/public/koepi/kasten_050.png b/frontend/public/koepi/kasten_050.png new file mode 100644 index 0000000..5f768b5 Binary files /dev/null and b/frontend/public/koepi/kasten_050.png differ diff --git a/frontend/public/koepi/kasten_lang.png b/frontend/public/koepi/kasten_lang.png new file mode 100644 index 0000000..fb9bd60 Binary files /dev/null and b/frontend/public/koepi/kasten_lang.png differ diff --git a/frontend/public/koepi/kasten_steini.png b/frontend/public/koepi/kasten_steini.png new file mode 100644 index 0000000..6eac8c0 Binary files /dev/null and b/frontend/public/koepi/kasten_steini.png differ diff --git a/frontend/public/koepi/traeger.png b/frontend/public/koepi/traeger.png new file mode 100644 index 0000000..54b7ba3 Binary files /dev/null and b/frontend/public/koepi/traeger.png differ diff --git a/frontend/src/tools/koepi.jsx b/frontend/src/tools/koepi.jsx index 0bcd4b4..8487c70 100644 --- a/frontend/src/tools/koepi.jsx +++ b/frontend/src/tools/koepi.jsx @@ -34,12 +34,11 @@ function OfferCard({ offer }) { border:'1px solid rgba(255,255,255,0.1)', display:'flex', flexDirection:'column', gap:8, }}> - {/* Bild oben, volle Breite */} - {offer.image && ( -
- König Pilsener { e.target.parentElement.style.display='none'; }} + {/* Bild oben */} + {offer.imageLocal && ( +
+ König Pilsener
)}