feat: KöPi - 11er Kasten mit kasten_front.png

This commit is contained in:
2026-07-09 15:47:36 +02:00
parent b53f58956a
commit 5a14fec92d
7 changed files with 32 additions and 37 deletions

View File

@@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 129 KiB

View File

@@ -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 && (
<div style={{ margin:'-12px -14px 8px -14px', borderRadius:'8px 8px 0 0', overflow:'hidden', background:'#1a1a1a', display:'flex', alignItems:'center', justifyContent:'center', maxHeight:220 }}>
<img src={offer.image} alt="König Pilsener"
style={{ maxWidth:'100%', maxHeight:220, width:'auto', height:'auto', display:'block', objectFit:'contain' }}
onError={e => { e.target.parentElement.style.display='none'; }}
{/* Bild oben */}
{offer.imageLocal && (
<div style={{ margin:'-12px -14px 8px -14px', borderRadius:'8px 8px 0 0', background:'transparent', height:180, display:'flex', alignItems:'center', justifyContent:'center' }}>
<img src={offer.imageLocal} alt="König Pilsener"
style={{ maxWidth:'100%', maxHeight:'180px', width:'auto', height:'auto', display:'block', objectFit:'contain' }}
/>
</div>
)}