← back to Dw Sarah Rowland Searchfix

upload-all-portraits.mjs

29 lines

import fs from 'node:fs'; import os from 'node:os';
const env=fs.readFileSync(`${os.homedir()}/Projects/secrets-manager/.env`,'utf8');
const tok=(k)=>(env.match(new RegExp('^'+k+'=(.+)$','m'))||[])[1]?.trim();
const T=tok('SHOPIFY_THEME_TOKEN')||tok('SHOPIFY_CONTENT_TOKEN')||tok('SHOPIFY_ADMIN_TOKEN');
const S='designer-laboratory-sandbox.myshopify.com',A='2024-10',ID='144396058675';
const data=JSON.parse(fs.readFileSync(new URL('./designers.json',import.meta.url)));
const slug=(n)=>n.toLowerCase().replace(/[^a-z0-9]+/g,'-').replace(/^-|-$/g,'');
const map={};
for(const d of data.designers){
  const s=slug(d.name);
  try{
    const img=await fetch(d.portrait_koroseal,{headers:{'User-Agent':'Mozilla/5.0'}});
    const ct=img.headers.get('content-type')||'image/jpeg';
    const ext=/png/.test(ct)?'png':'jpg';
    const buf=Buffer.from(await img.arrayBuffer());
    const key=`assets/designer-${s}.${ext}`;
    const put=await fetch(`https://${S}/admin/api/${A}/themes/${ID}/assets.json`,{method:'PUT',
      headers:{'X-Shopify-Access-Token':T,'Content-Type':'application/json'},
      body:JSON.stringify({asset:{key, attachment:buf.toString('base64')}})});
    const j=await put.json();
    if(put.status!==200){ console.log(`✗ ${d.name}: PUT ${put.status} ${JSON.stringify(j).slice(0,120)}`); continue; }
    map[s]=j.asset.public_url.split('?')[0];
    console.log(`✓ ${d.name.padEnd(24)} ${(buf.length/1024|0)}KB ${ext}  ${map[s].slice(-46)}`);
  }catch(e){ console.log(`✗ ${d.name}: ${e.message}`); }
  await new Promise(z=>setTimeout(z,150));
}
fs.writeFileSync(new URL('./portrait-cdn-map.json',import.meta.url), JSON.stringify(map,null,2));
console.log(`\nuploaded ${Object.keys(map).length}/${data.designers.length}`);