← back to Hollywood Import

innov-price.mjs

25 lines

import { chromium } from 'playwright';
import fs from 'node:fs';
const items=JSON.parse(fs.readFileSync('/tmp/inn24.json','utf8'));
const b=await chromium.launch({channel:'chrome',headless:true});
const p=await (await b.newContext({storageState:'./innov-auth.json',viewport:{width:1400,height:1000}})).newPage();
const getPrice=async(url)=>{const r=await p.goto(url,{waitUntil:'domcontentloaded',timeout:30000}).catch(()=>null);
  if(!r||r.status()>=400)return null; await p.waitForTimeout(1500);
  return p.evaluate(()=>{const m=document.body.innerText.match(/\$\s?([\d,]+\.\d{2})\s*(\/\s*(yard|yd|roll|panel|sq))?/i);const t404=/not found|404/i.test(document.title);return t404?null:(m?{price:m[1],unit:m[2]||''}:null);});};
const out=[];
for(const it of items){
  const sku=it.col3.toLowerCase().replace(/\s.*$/,'').replace(/[^a-z0-9-]/g,'');
  // ARP- -> arpora ; ILL- -> try illusion (ils) variants
  const cands=[];
  if(/^arp-/.test(sku)) cands.push(`https://www.innovationsusa.com/item/arpora/${sku}`);
  if(/^ill-/.test(sku)){ cands.push(`https://www.innovationsusa.com/item/illusion/${sku}`); cands.push(`https://www.innovationsusa.com/item/illusion/${sku.replace('ill-','ils-')}`); }
  cands.push(`https://www.innovationsusa.com/item/arpora/${sku}`);
  let res=null,used=null;
  for(const u of cands){ res=await getPrice(u); if(res){used=u;break;} }
  out.push({...it,sku,price:res?.price||null,unit:res?.unit||null,url:used});
  console.log(`${it.mfr} [${it.col3}] → ${res?('$'+res.price+(res.unit?' '+res.unit:'')+'  '+used.replace('https://www.innovationsusa.com','')):'NO PRICE / 404'}`);
}
fs.writeFileSync('innov-prices.json',JSON.stringify(out,null,2));
console.log('priced:',out.filter(x=>x.price).length,'/',out.length);
await b.close();