Files
streetmerchant/src/store/model/very.ts
T

84 lines
2.0 KiB
TypeScript

import {Link, Store} from './store';
import {logger} from '../../logger';
import {parseCard} from './helpers/card';
export const Very: Store = {
labels: {
inStock: {
container: '.stockMessaging .indicator',
text: ['available', 'low stock']
},
maxPrice: {
container: '.priceNow',
euroFormat: false // Note: Very uses non-euroFromat as price seperator
},
outOfStock: {
container: '.stockMessaging .indicator',
text: ['pre-order']
}
},
links: [
{
brand: 'test:brand',
model: 'test:model',
series: 'test:series',
url: 'https://www.very.co.uk/msi-geforce-gtx-1660-ti-gaming-x-6g-graphics-card/1600350984.prd'
}
],
linksBuilder: {
builder: (docElement, series) => {
const productElements = docElement.find('.productList .product');
const links: Link[] = [];
for (let i = 0; i < productElements.length; i++) {
const productElement = productElements.eq(i);
const titleElement = productElement.find('.productTitle').first();
const title = titleElement.text()?.replace(/\n/g, ' ').trim();
if (!title || ['RTX', series]
.map(x => title.toLowerCase().includes(x.toLowerCase()))
.filter(x => !x).length > 0
) {
continue;
}
const url = titleElement.attr()?.href;
if (!url) {
continue;
}
const card = parseCard(title);
if (card) {
links.push({
brand: card.brand as any,
model: card.model,
series,
url
});
} else {
logger.error(`Failed to parse card: ${title}`);
}
}
return links;
},
ttl: 300000,
urls: [
{
series: '3070',
url: 'https://www.very.co.uk/electricals/pc-components/graphics-cards/e/b/118786.end?sort=newin,0&numProducts=100'
},
{
series: '3080',
url: 'https://www.very.co.uk/electricals/pc-components/graphics-cards/e/b/118786.end?sort=newin,0&numProducts=100'
},
{
series: '3090',
url: 'https://www.very.co.uk/electricals/pc-components/graphics-cards/e/b/118786.end?sort=newin,0&numProducts=100'
}
]
},
name: 'very'
};