← back to 1970swallpaper

scripts/pull-1970s.js

83 lines

// Pull 1970s-specific wallpapers from live DW Shopify
const https = require('https');
const fs = require('fs');

const SEVENTIES_TAGS = /^(1970s|70s|psychedelic|disco|earth tone|earthy|macram[ée]|granny chic|geometric|op art|mod|funk|brown|orange|harvest gold|avocado|burnt orange|terracotta|wood|shag)$/i;
const SEVENTIES_TITLE = /\b(70s|1970s|psychedelic|disco|macram[ée]|funk|harvest gold|avocado|burnt orange|earth tone)\b/i;
// Inclusive secondary signal: products with ALL of (geometric or abstract or paisley) AND (brown/orange/yellow/green palette tag)
const SEVENTIES_COMBINE_FORM = /^(geometric|abstract|paisley|moroccan|chevron|art deco|argyle|ikat|kilim|trellis)$/i;
const SEVENTIES_COMBINE_PALETTE = /^(brown|orange|yellow|gold|harvest|amber|rust|sienna|terracotta|olive|mustard|bronze|copper|chocolate|tan|beige|tobacco|earth)$/i;

const REJECT_TITLE = /(visual.{0,3}merchandiser|bh.?90210|beverly.?hills.?90210|iconic.{0,4}bh|\bimage[ _-]?4\b|lamp|rug|pillow|throw|tripod|frame|mirror|vase|candle|sculpture|figurine)/i;

function fetchPage(page) {
  return new Promise((resolve, reject) => {
    https.get(`https://designerwallcoverings.com/products.json?limit=250&page=${page}`, {
      headers: { 'User-Agent': 'Mozilla/5.0 1970swallpaper-builder' }
    }, (res) => {
      let data = '';
      res.on('data', c => data += c);
      res.on('end', () => { try { resolve(JSON.parse(data).products || []); } catch(e) { reject(e); } });
    }).on('error', reject);
  });
}

function feel(tags, title) {
  const t = (tags || []).map(x => x.toLowerCase()).join(' ');
  const tt = (title || '').toLowerCase();
  if (/psychedelic|op art|disco|funk/.test(t + ' ' + tt)) return 'psychedelic';
  if (/macram[ée]|earth|harvest|avocado|olive|tobacco|terracotta|brown/.test(t + ' ' + tt)) return 'earthy';
  if (/orange|burnt|rust|sienna|amber|copper|harvest gold|gold/.test(t + ' ' + tt)) return 'sunset';
  if (/geometric|trellis|chevron|argyle|fretwork|ikat|kilim/.test(t + ' ' + tt)) return 'geometric';
  if (/paisley|moroccan|persian|suzani/.test(t + ' ' + tt)) return 'paisley';
  if (/abstract|moder/.test(t + ' ' + tt)) return 'abstract';
  return 'seventies';
}

(async () => {
  const all = [];
  for (let page = 1; page <= 35; page++) {
    const products = await fetchPage(page);
    if (!products.length) break;
    all.push(...products);
    process.stdout.write(`page ${page}: ${products.length} (total ${all.length})\n`);
    if (products.length < 250) break;
  }
  console.log(`fetched ${all.length}`);

  const filtered = all
    .filter(p => p.product_type && /wallcovering/i.test(p.product_type))
    .filter(p => !REJECT_TITLE.test(p.title || ''))
    .filter(p => p.images && p.images.length > 0 && p.images[0].src)
    .filter(p => {
      const tags = p.tags || [];
      const tt = p.title || '';
      const directTagHit = tags.some(t => SEVENTIES_TAGS.test(t));
      const directTitleHit = SEVENTIES_TITLE.test(tt);
      // 70s "combinator": form tag + earthy palette tag
      const hasFormTag = tags.some(t => SEVENTIES_COMBINE_FORM.test(t));
      const hasPaletteTag = tags.some(t => SEVENTIES_COMBINE_PALETTE.test(t));
      return directTagHit || directTitleHit || (hasFormTag && hasPaletteTag);
    })
    .map(p => ({
      sku: p.handle, handle: p.handle,
      title: p.title, vendor: (p.vendor || '').trim(),
      product_type: p.product_type,
      image_url: p.images[0].src,
      tags: p.tags || [],
      aesthetic: feel(p.tags, p.title),
      product_url: `https://designerwallcoverings.com/products/${p.handle}`,
    }));

  console.log(`70s filtered: ${filtered.length}`);
  const breakdown = {};
  filtered.forEach(p => breakdown[p.aesthetic] = (breakdown[p.aesthetic] || 0) + 1);
  console.log('feels:', breakdown);

  const tmp = '/Users/macstudio3/Projects/1970swallpaper/data/products.json.tmp';
  const final = '/Users/macstudio3/Projects/1970swallpaper/data/products.json';
  fs.writeFileSync(tmp, JSON.stringify(filtered, null, 2));
  fs.renameSync(tmp, final);
  console.log('wrote data/products.json');
})();