mebuki-thread-favicon

めぶきちゃんねるの各スレにてそのスレッド画像をfaviconに設定します

// ==UserScript==
// @name         mebuki-thread-favicon
// @namespace    https://mebuki.moe/
// @version      0.1.0
// @description  めぶきちゃんねるの各スレにてそのスレッド画像をfaviconに設定します
// @author       ame-chan
// @match        https://mebuki.moe/app*
// @license      MIT
// @run-at       document-idle
// ==/UserScript==
(async () => {
  'use strict';
  let currentFavicon = '';
  const getThumbnailElm = () => document.querySelector('.thread-messages > li .pspw-item img');
  const createFavionElm = () => {
    const iconElm = document.querySelector('link[rel="icon"]');
    const thumbnailElm = getThumbnailElm();
    if (!(thumbnailElm instanceof HTMLImageElement) || currentFavicon === thumbnailElm.src) {
      return;
    }
    if (iconElm instanceof HTMLLinkElement) {
      iconElm.href = thumbnailElm.src;
    } else {
      const link = document.createElement('link');
      link.rel = 'icon';
      link.type = 'image/jpeg';
      link.href = thumbnailElm.src;
      link.id = 'userjs-mebuki-favicon';
      document.head.insertAdjacentElement('afterbegin', link);
    }
    currentFavicon = thumbnailElm.src;
  };
  const deleteFaviconElm = () => {
    const userjsFaviconElm = document.querySelector('#userjs-mebuki-favicon');
    if (userjsFaviconElm instanceof HTMLLinkElement) {
      userjsFaviconElm.href = 'https://mebuki.moe/symbol/mebuki.png';
    }
  };
  const observer = new MutationObserver(() => {
    const threadElm = document.querySelector('.thread-messages');
    const isCatalogPage = /https:\/\/mebuki\.moe\/app\/?/.test(location.href);
    if (threadElm) {
      createFavionElm();
    } else if (isCatalogPage) {
      deleteFaviconElm();
    }
  });
  createFavionElm();
  observer.observe(document.body, {
    childList: true,
    subtree: true,
  });
})();