めぶきちゃんねるの各スレにてそのスレッド画像をfaviconに設定します
// ==UserScript==
// @name mebuki-thread-favicon
// @namespace https://mebuki.moe/
// @version 0.1.2
// @description めぶきちゃんねるの各スレにてそのスレッド画像をfaviconに設定します
// @author ame-chan
// @match https://mebuki.moe/app*
// @license MIT
// @run-at document-idle
// @require https://update.greasyfork.org/scripts/552225/1688013/mebuki-page-state.js
// ==/UserScript==
(async () => {
'use strict';
if (typeof window.USER_SCRIPT_MEBUKI_STATE === 'undefined') {
return;
}
const { subscribe, getState } = window.USER_SCRIPT_MEBUKI_STATE;
let defaultFavicon = '';
let currentFavicon = '';
const getThumbnailElm = () => document.querySelector('.thread-messages > [id^="message-"] .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) {
defaultFavicon = iconElm.href;
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';
} else {
const iconElm = document.querySelector('link[rel="icon"]');
if (iconElm instanceof HTMLLinkElement) {
iconElm.href = defaultFavicon;
}
}
};
subscribe((state) => {
if (state.isThreadPage) {
createFavionElm();
} else if (state.isCatalogPage) {
deleteFaviconElm();
}
});
if (getState().isThreadPage) {
createFavionElm();
}
})();