fix: KöPi - Duplikate korrekt zusammengefasst, Bilder Base64

This commit is contained in:
2026-07-09 08:56:05 +02:00
parent a9973a8a07
commit d37e4e768b

View File

@@ -94,15 +94,20 @@ async function scrapeMarktguru() {
if (!offer.image) continue; if (!offer.image) continue;
try { try {
const imgData = await page.evaluate(async (url) => { const imgData = await page.evaluate(async (url) => {
const resp = await fetch(url); try {
const blob = await resp.blob(); const resp = await fetch(url, {credentials:'include'});
return new Promise(resolve => { if (!resp.ok) return null;
const reader = new FileReader(); const blob = await resp.blob();
reader.onloadend = () => resolve(reader.result); return new Promise(resolve => {
reader.readAsDataURL(blob); const reader = new FileReader();
}); reader.onloadend = () => resolve(reader.result);
reader.onerror = () => resolve(null);
reader.readAsDataURL(blob);
});
} catch { return null; }
}, offer.image); }, offer.image);
offer.image = imgData; // base64 data URL if (imgData) offer.image = imgData;
else offer.image = null;
} catch { offer.image = null; } } catch { offer.image = null; }
} }
@@ -113,18 +118,26 @@ async function scrapeMarktguru() {
return hasKP && isTargetRetailer(o.retailer); return hasKP && isTargetRetailer(o.retailer);
}); });
// Deduplizieren: gleicher Händler + gleicher Preis → zusammenfassen // Händler normalisieren: E center = EDEKA
for (const o of filtered) {
if (o.retailer?.toLowerCase().includes('e center')) o.retailerDisplay = o.retailer;
else o.retailerDisplay = o.retailer;
}
// Deduplizieren: gleicher normalisierter Händler + gleicher Preis → ein Eintrag
// Kürzeste Beschreibung nehmen (sauberste)
const merged = new Map(); const merged = new Map();
for (const o of filtered) { for (const o of filtered) {
const key = `${o.retailer}|${o.price}`; const normalizedRetailer = o.retailer?.toLowerCase().replace('e center','edeka') || '';
const key = `${normalizedRetailer}|${o.price}`;
if (merged.has(key)) { if (merged.has(key)) {
// Beschreibungen zusammenführen falls unterschiedlich
const existing = merged.get(key); const existing = merged.get(key);
if (o.description && o.description !== existing.description) { // Kürzere Beschreibung bevorzugen
existing.description = existing.description if (o.description && (!existing.description || o.description.length < existing.description.length)) {
? `${existing.description} / ${o.description}` existing.description = o.description;
: o.description;
} }
// Besseres Bild (erstes das nicht null ist behalten)
if (!existing.image && o.image) existing.image = o.image;
} else { } else {
merged.set(key, { ...o }); merged.set(key, { ...o });
} }