fix(amazon-shopping): verify prime and delivery filters
This commit is contained in:
@@ -76,15 +76,42 @@ function extractHistogramText(root: HTMLElement): string {
|
||||
return parts.join(" ");
|
||||
}
|
||||
|
||||
function deliveryFromText(text: string): DeliverySummary | undefined {
|
||||
function deliveryFromText(text: string, primeSignal = false): DeliverySummary | undefined {
|
||||
const display = text.replace(/\s+/g, " ").trim();
|
||||
if (!display) {
|
||||
return undefined;
|
||||
return primeSignal ? { display: "Prime delivery available", prime: true } : undefined;
|
||||
}
|
||||
return {
|
||||
display,
|
||||
free: /\bfree\b/i.test(display),
|
||||
prime: /\bprime\b/i.test(display)
|
||||
prime: primeSignal || /\bprime\b/i.test(display)
|
||||
};
|
||||
}
|
||||
|
||||
function hasPrimeSignal(root: HTMLElement): boolean {
|
||||
const attributeText = root.querySelectorAll("[id], [class], [aria-label], img[alt]")
|
||||
.map((node) => [
|
||||
attrOf(node, "id"),
|
||||
attrOf(node, "class"),
|
||||
attrOf(node, "aria-label"),
|
||||
attrOf(node, "alt")
|
||||
].join(" "))
|
||||
.join(" ");
|
||||
return /a-icon-prime|prime-logo|primeExclusive|primePopover|amazon\s+prime|\bprime\b/i.test(attributeText);
|
||||
}
|
||||
|
||||
function mergeDelivery(detail: DeliverySummary | undefined, base: DeliverySummary | undefined): DeliverySummary | undefined {
|
||||
if (!detail) {
|
||||
return base;
|
||||
}
|
||||
if (!base) {
|
||||
return detail;
|
||||
}
|
||||
return {
|
||||
display: detail.display || base.display,
|
||||
free: Boolean(detail.free || base.free),
|
||||
prime: Boolean(detail.prime || base.prime),
|
||||
fastestDate: detail.fastestDate ?? base.fastestDate
|
||||
};
|
||||
}
|
||||
|
||||
@@ -113,7 +140,7 @@ export function extractDetailPage(html: string, base: ProductSearchResult): Prod
|
||||
price: parseMoney(priceText) ?? base.price,
|
||||
rating: parseRating(ratingText) ?? base.rating,
|
||||
reviewCount: parseReviewCount(reviewText) ?? base.reviewCount,
|
||||
delivery: deliveryFromText(deliveryText) ?? base.delivery,
|
||||
delivery: mergeDelivery(deliveryFromText(deliveryText, hasPrimeSignal(root)), base.delivery),
|
||||
availability: availability || base.availability,
|
||||
seller: seller || base.seller,
|
||||
bullets: extractBullets(root),
|
||||
|
||||
Reference in New Issue
Block a user