← back to Interiordesignershowroom

_ctest.js

21 lines

const sharp = require('sharp');
const db = require('./lib/db');
function rgbToHsv(r,g,b){r/=255;g/=255;b/=255;const mx=Math.max(r,g,b),mn=Math.min(r,g,b),d=mx-mn;let h=0;if(d){if(mx===r)h=((g-b)/d)%6;else if(mx===g)h=(b-r)/d+2;else h=(r-g)/d+4;h*=60;if(h<0)h+=360;}return{h,s:mx===0?0:d/mx,v:mx};}
function bucketFor(r,g,b){const{h,s,v}=rgbToHsv(r,g,b);if(s<0.12){if(v<0.2)return'black';if(v<0.65)return'gray';return'neutral';}const warm=(h>=345||h<45);if(v<0.45&&warm)return'brown';if(h>=345||h<15)return'red';if(h<45)return'brown';if(h<70)return'yellow';if(h<165)return'green';if(h<255)return'blue';if(h<285)return'blue';if(h<345)return'pink';return'red';}
(async()=>{
  const {rows}=await db.query("SELECT id,title,image_url FROM products WHERE image_url IS NOT NULL AND NOT is_wall_paint ORDER BY random() LIMIT 12");
  for(const r of rows){
    try{
      const ctrl=new AbortController();const t=setTimeout(()=>ctrl.abort(),8000);
      const res=await fetch(r.image_url,{signal:ctrl.signal,headers:{'User-Agent':'test'}});clearTimeout(t);
      const buf=Buffer.from(await res.arrayBuffer());
      const {data,info}=await sharp(buf).resize(16,16,{fit:'inside'}).removeAlpha().raw().toBuffer({resolveWithObject:true});
      const ch=info.channels;let rw=0,gw=0,bw=0,ws=0;
      for(let i=0;i+ch-1<data.length;i+=ch){const R=data[i],G=data[i+1],B=data[i+2];const nw=R>235&&G>235&&B>235;const w=nw?0.08:1;rw+=R*w;gw+=G*w;bw+=B*w;ws+=w;}
      const R=rw/ws,G=gw/ws,B=bw/ws;
      console.log(bucketFor(R,G,B).padEnd(8),`rgb(${R|0},${G|0},${B|0})`.padEnd(18),(r.title||'').slice(0,45));
    }catch(e){console.log('SKIP    ',e.message,r.id);}
  }
  await db.pool.end();
})();