NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name Kemono Search Button for Patreon // @name:ru Kemono Кнопка Поиска Для Patreon // @namespace https://github.com/Silfilia // @version 1.0.0 // @description Patreon author search button on Kemono // @description:ru Кнопка поиска автора Patreon на Kemono // @author Silfilia // @homepageURL https://github.com/Silfilia/Kemono-Search-Button-for-Patreon-KSBfP- // @downloadURL https://github.com/Silfilia/Kemono-Search-Button-for-Patreon-KSBfP-/raw/refs/heads/main/KSBfP.user.js // @updateURL https://github.com/Silfilia/Kemono-Search-Button-for-Patreon-KSBfP-/raw/refs/heads/main/KSBfP.user.js // @match https://www.patreon.com/* // @license MIT // ==/UserScript== (function () { 'use strict'; function createKemonoButton(authorName) { if (document.querySelector('#kemono-search-button')) return; // Remove all spaces from the author's name const safeName = authorName.replace(/\s+/g, ''); const button = document.createElement('a'); button.id = 'kemono-search-button'; button.textContent = 'Search on Kemono'; button.href = `https://kemono.su/artists?q=${encodeURIComponent(safeName)}`; button.target = '_blank'; button.style.position = 'fixed'; button.style.top = '10px'; button.style.left = '50%'; button.style.transform = 'translateX(-50%)'; button.style.padding = '8px 16px'; button.style.background = 'rgba(24, 24, 24, 0.2)'; button.style.backdropFilter = 'blur(8px)'; button.style.borderRadius = '10px'; button.style.zIndex = '9999'; button.style.color = '#FFF'; button.style.textcolor = 'rgb(255, 255, 255)'; button.style.fontWeight = 'bold'; button.style.textDecoration = 'none'; button.style.transition = 'background 0.3s'; button.onmouseenter = () => button.style.background = 'rgba(24, 24, 24, 0.4)'; button.onmouseleave = () => button.style.background = 'rgba(24, 24, 24, 0.2)'; document.body.appendChild(button); } function getAuthorName() { // Standard author's title const header = document.querySelector('h1#pageheader-title'); if (header && header.textContent.trim()) return header.textContent.trim(); // Alternative selectors const altHeader = document.querySelector('div[data-tag="creator-name"]') || document.querySelector('h1[class*="sc-"]'); if (altHeader && altHeader.textContent.trim()) return altHeader.textContent.trim(); return null; } function waitForAuthorAndInsertButton() { const observer = new MutationObserver(() => { const authorName = getAuthorName(); if (authorName) { createKemonoButton(authorName); observer.disconnect(); } }); observer.observe(document.body, { childList: true, subtree: true }); } waitForAuthorAndInsertButton(); })();