view surugaya-fixes.user.js @ 114:817b62848b27

Backed out changeset 055f5d084706
author nanaya <me@nanaya.net>
date Sun, 15 Jan 2023 23:43:40 +0900
parents ef21ef445fc6
children
line wrap: on
line source

// ==UserScript==
// @name         suruga-ya fixes
// @namespace    https://nanaya.net
// @version      2.0.2
// @description  Show all products with fast image
// @author       nanaya
// @match        https://www.suruga-ya.jp/*
// @grant        none
// @downloadURL  https://hg.nanaya.net/ec-userscripts/raw-file/tip/surugaya-fixes.user.js
// ==/UserScript==

'use strict';

// always inject adult consent cookie
function alwaysConsent () {
  const hasAdultCookie = document.cookie.split('; ').includes('adult=1');
  if (!hasAdultCookie) {
    const d = new Date();
    d.setTime(d.getTime() + (100 * 24 * 60 * 60 * 1000));
    document.cookie = `adult=1; expires=${d.toGMTString()}; path=/`;
    window.location.reload();
  }
}

// skip loading image through php which seems to take forever
function directImage () {
  const itemImageRegexp = /photo\.php\?shinaban=([0-9A-Z]+)/;
  function fix (image) {
    const origSrc = image.getAttribute('src');
    if (origSrc == null) return;
    const found = origSrc.match(itemImageRegexp);
    if (found == null) return;

    const src = `https://www.suruga-ya.jp/database/pics_light/game/${found[1].toLowerCase()}.jpg`;
    const setNotFound = () => {
      image.removeEventListener('error', setNotFound);
      image.setAttribute('src', 'https://www.suruga-ya.jp/database/images/no_photo.jpg');
    };
    image.addEventListener('error', setNotFound);
    image.setAttribute('src', src);
  }

  function run (node) {
    if (!(node instanceof window.HTMLElement)) return;

    fix(node);
    for (const image of node.querySelectorAll('img')) {
      fix(image);
    }
  }

  function onMutate (mutations) {
    for (const mutation of mutations) {
      for (const node of mutation.addedNodes) {
        run(node);
      }
    }
  }

  const observer = new window.MutationObserver(onMutate);
  observer.observe(document, { childList: true, subtree: true });
  run(document.body);
}

alwaysConsent();
directImage();