Booru Revamped

This adds a couple of changes to the layout and behaviour of the site

Stan na 17-04-2022. Zobacz najnowsza wersja.

Aby zainstalować ten skrypt, wymagana jest instalacje jednego z następujących rozszerzeń: Tampermonkey, Greasemonkey lub Violentmonkey.

You will need to install an extension such as Tampermonkey to install this script.

Aby zainstalować ten skrypt, wymagana jest instalacje jednego z następujących rozszerzeń: Tampermonkey, Violentmonkey.

Aby zainstalować ten skrypt, wymagana będzie instalacja rozszerzenia Tampermonkey lub Userscripts.

You will need to install an extension such as Tampermonkey to install this script.

Aby zainstalować ten skrypt, musisz zainstalować rozszerzenie menedżera skryptów użytkownika.

(Mam już menedżera skryptów użytkownika, pozwól mi to zainstalować!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

Będziesz musiał zainstalować rozszerzenie menedżera stylów użytkownika, aby zainstalować ten styl.

Będziesz musiał zainstalować rozszerzenie menedżera stylów użytkownika, aby zainstalować ten styl.

Musisz zainstalować rozszerzenie menedżera stylów użytkownika, aby zainstalować ten styl.

(Mam już menedżera stylów użytkownika, pozwól mi to zainstalować!)

"use strict";
// ==UserScript==
// @name         Booru Revamped
// @namespace    westerhold78
// @version      2.2
// @description  This adds a couple of changes to the layout and behaviour of the site
// @match        *://gelbooru.com/*
// @match        *://yande.re/*
// @match        *://danbooru.donmai.us/*
// @match        *://safebooru.org/*
// @match        *://konachan.com/*
// @match        *://konachan.net/*
// @match        *://rule34.paheal.net/*
// @match        *://rule34.xxx/*
// @icon         data:image/png;base64,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
// @copyright    2022, westerhold78
// @grant        GM_addStyle
// @grant        GM_xmlhttpRequest
// ==/UserScript==
const style = [];
const newTabForDetailPage = true;
const zoomScale = 2.5;
const zoomDelay = 0.4;
const imageTypes = ['jpg', 'png', 'jpeg', 'gif'];
const movieExtensions = ['mp4', 'webm'];
const rule34pahealSelectorImg = '#image-list .shm-thumb-link img';
const rule34pahealSelectorVideo = '#image-list .shm-thumb-link video';
const replaceMeString = '>>[[REPLACEME]]<<';
const { hash, hostname, pathname, searchParams } = new URL(window.location.href);
let anchorElement;
const configuration = {
    'yande.re': {
        pages: {
            list: {
                pathname: /^\/post$/,
            },
            post: {
                pathname: /^\/post\/show\/.*$/,
            },
        },
        selectors: {
            anchor: '#post-list-posts .inner .thumb',
            image: '#post-list-posts .inner .thumb img.preview',
        },
        sample: {
            type: 'selector',
            selector: '#image',
        },
        original: {
            type: 'selector',
            selector: '#highres',
        },
        postPageImageId: 'image',
        maxHeight: 'calc(100vh - 260px)',
        maxWidth: 'calc(100vw - 310px)',
    },
    'gelbooru.com': {
        pages: {
            list: {
                searchParams: {
                    page: 'post',
                    s: 'list',
                },
            },
            post: {
                searchParams: {
                    page: 'post',
                    s: 'view',
                },
            },
        },
        selectors: {
            anchor: '#container main .thumbnail-container .thumbnail-preview a',
            image: '#container main .thumbnail-container .thumbnail-preview a img',
        },
        sample: {
            type: 'selector',
            selector: '#image',
        },
        original: {
            type: 'ogImage',
        },
        postPageImageId: 'image',
        maxHeight: 'calc(100vh - 285px)',
        maxWidth: 'calc(100vw - 260px)',
    },
    'safebooru.org': {
        pages: {
            list: {
                searchParams: {
                    page: 'post',
                    s: 'list',
                },
            },
            post: {
                searchParams: {
                    page: 'post',
                    s: 'view',
                },
            },
        },
        selectors: {
            anchor: '#post-list .content .thumb a',
            image: '#post-list .content .thumb a img.preview',
        },
        sample: {
            type: 'selector',
            selector: '#image',
        },
        original: {
            type: 'ogImage',
        },
        postPageImageId: 'image',
        maxHeight: 'calc(100vh - 200px)',
        maxWidth: 'calc(100vw - 260px)',
    },
    'danbooru.donmai.us': {
        pages: {
            list: {
                pathname: /^\/posts$/,
            },
            post: {
                pathname: /^\/posts\/.*$/,
            },
        },
        selectors: {
            anchor: '#posts .posts-container article .post-preview-link',
            image: '#posts .posts-container article .post-preview-link img.post-preview-image',
        },
        sample: {
            type: 'ogImage',
        },
        original: {
            type: 'selector',
            selector: '#image',
        },
        postPageImageId: 'image',
        maxHeight: 'calc(100vh - 200px)',
        maxWidth: 'calc(100vw - 260px)',
    },
    'konachan.net': {
        pages: {
            list: {
                pathname: /^\/post$/,
            },
            post: {
                pathname: /^\/post\/show\/.*$/,
            },
        },
        selectors: {
            anchor: '#post-list-posts .inner .thumb',
            image: '#post-list-posts .inner .thumb img.preview',
        },
        sample: {
            type: 'selector',
            selector: '#image',
        },
        original: {
            type: 'selector',
            selector: '#highres',
        },
        postPageImageId: 'image',
        maxHeight: 'calc(100vh - 240px)',
        maxWidth: 'calc(100vw - 280px)',
    },
    'konachan.com': {
        pages: {
            list: {
                pathname: /^\/post$/,
            },
            post: {
                pathname: /^\/post\/show\/.*$/,
            },
        },
        selectors: {
            anchor: '#post-list-posts .inner .thumb',
            image: '#post-list-posts .inner .thumb img.preview',
        },
        sample: {
            type: 'ogImage',
        },
        original: {
            type: 'selector',
            selector: '#image',
        },
        postPageImageId: 'image',
        maxHeight: 'calc(100vh - 240px)',
        maxWidth: 'calc(100vw - 280px)',
    },
    'rule34.paheal.net': {
        pages: {
            list: {
                pathname: /^\/post\/list\/.*$/,
            },
            post: {
                pathname: /^\/post\/view\/.*$/,
            },
        },
        selectors: {
            anchor: '.shm-image-list .shm-thumb-link',
            image: '.shm-image-list .shm-thumb-link img',
        },
        sample: {
            type: 'ogImage',
        },
        original: {
            type: 'selector',
            selector: '#main_image',
        },
        postPageImageId: 'main_image',
        maxHeight: 'calc(100vh - 345px)',
        maxWidth: 'calc(100vw - 380px)',
    },
    'rule34.xxx': {
        pages: {
            list: {
                searchParams: {
                    page: 'post',
                    s: 'list',
                },
            },
            post: {
                searchParams: {
                    page: 'post',
                    s: 'view',
                },
            },
        },
        selectors: {
            anchor: '#post-list .content .image-list .thumb a',
            image: '#post-list .content .image-list .thumb a img',
        },
        sample: {
            type: 'selector',
            selector: '#image',
        },
        original: {
            type: 'ogImage',
            fallback: {
                type: 'selector',
                selector: '#gelcomVideoPlayer',
            },
        },
        postPageImageId: 'image',
        maxHeight: 'calc(100vh - 220px)',
        maxWidth: 'calc(100vw - 270px)',
    },
};
const stylesArr = {
    'yande.re': {
        overflowSelector: '#post-list-posts .inner',
        frameSelector: '#post-list .content .thumb video',
        scalingSelector: '#post-list .content .thumb *:is(img, video):hover',
        zIndexSelector: '#post-list .content .thumb *:is(img, video):hover',
    },
    'gelbooru.com': {
        scalingSelector: 'article.thumbnail-preview *:is(img, video):hover',
        frameSelector: 'article.thumbnail-preview video',
        zIndexSelector: 'article.thumbnail-preview *:is(img, video):hover',
    },
    'danbooru.donmai.us': {
        scalingSelector: 'a.post-preview-link *:is(img, video):hover',
        frameSelector: 'a.post-preview-link video',
        zIndexSelector: 'a.post-preview-link *:is(img, video):hover',
    },
    'safebooru.org': {
        scalingSelector: '#post-list .content .thumb a *:is(img, video):hover',
        zIndexSelector: '#post-list .content .thumb a *:is(img, video):hover',
    },
    'konachan.com': {
        overflowSelector: '#post-list-posts .inner',
        scalingSelector: '#post-list-posts .inner a.thumb *:is(img, video):hover',
        zIndexSelector: '#post-list-posts .inner a.thumb *:is(img, video):hover',
    },
    'konachan.net': {
        overflowSelector: '#post-list-posts .inner',
        scalingSelector: '#post-list-posts .inner a.thumb *:is(img, video):hover',
        zIndexSelector: '#post-list-posts .inner a.thumb *:is(img, video):hover',
    },
    'rule34.paheal.net': {
        scalingSelector: '#image-list .shm-image-list .shm-thumb-link *:is(img, video):hover',
        zIndexSelector: '#image-list .shm-image-list .shm-thumb-link *:is(img, video):hover',
    },
    'rule34.xxx': {
        scalingSelector: '#post-list .content .image-list .thumb a *:is(img, video):hover',
        zIndexSelector: '#post-list .content .image-list .thumb a *:is(img, video):hover',
    },
};
const element = stylesArr[hostname];
const { scalingSelector, frameSelector, overflowSelector, zIndexSelector } = element || {};
if (scalingSelector) {
    style.push(`${scalingSelector} {
      transform: scale(${zoomScale});
      -moz-transform: scale(${zoomScale});
      -webkit-transform: scale(${zoomScale});
      transition-delay: ${zoomDelay}s;
      transition-property: transform;
    }`);
}
if (frameSelector) {
    style.push(`${element.frameSelector} {
      border: 3px solid #0000ff;
  }`);
}
if (overflowSelector) {
    style.push(`${overflowSelector} {
      position: inherit;
      overflow: visible !important;
    }`);
}
if (zIndexSelector) {
    style.push(`${zIndexSelector} {
      position: relative;
      z-index: 9001;
    }`);
}
style.push(`[data-ext="mp4"] a video, [data-ext="webm"] a video {
    border: 3px solid #0000ff;
  }`);
GM_addStyle(style.join('\n'));
// -- - - - - -
const onLoad = () => {
    // handleHostname()
    handlePaths();
};
// start of the application code
if (document.readyState !== 'loading') {
    onLoad();
}
else {
    document.addEventListener('DOMContentLoaded', () => {
        onLoad();
    });
}
function handlePaths() {
    var _a, _b, _c, _d;
    const pathnameMatch = (_b = (_a = Object.entries(configuration[hostname].pages).filter(([pageName, page]) => { var _a, _b, _c; return ((_c = (_b = (_a = page.pathname) === null || _a === void 0 ? void 0 : _a.exec(pathname)) === null || _b === void 0 ? void 0 : _b.length) !== null && _c !== void 0 ? _c : 0) > 0; })) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b[0];
    const searchParamsMatch = (_d = (_c = Object.entries(configuration[hostname].pages).filter(([pageName, page]) => {
        var _a;
        const searchParamsLength = Object.entries(page.searchParams || []).filter(([key, param]) => {
            return param === searchParams.get(key);
        }).length;
        const pageSearchParamsLength = Object.keys((_a = page.searchParams) !== null && _a !== void 0 ? _a : []).length;
        return (searchParamsLength === pageSearchParamsLength &&
            searchParamsLength > 0 &&
            pageSearchParamsLength > 0);
    })) === null || _c === void 0 ? void 0 : _c[0]) === null || _d === void 0 ? void 0 : _d[0];
    if (pathnameMatch === 'list' ||
        searchParamsMatch === 'list' ||
        (hostname === 'danbooru.donmai.us' && pathname === '/')) {
        // on the list page
        openImageInNewTab();
        document
            .querySelectorAll(configuration[hostname].selectors.image)
            .forEach(async (image) => {
            image.addEventListener('mouseover', async (event) => await onImageMouseOver(event));
        });
    }
    else if (pathnameMatch === 'post' || searchParamsMatch === 'post') {
        // on the post page
        const original = getUrl(document, 'original');
        const imageElement = document.getElementById(configuration[hostname].postPageImageId);
        imageElement.onclick = null;
        imageElement === null || imageElement === void 0 ? void 0 : imageElement.addEventListener('click', () => {
            window.open(original, '_self');
        });
        imageElement.style.maxHeight = configuration[hostname].maxHeight;
        imageElement.style.maxWidth = configuration[hostname].maxWidth;
        imageElement.style.height = 'unset';
        imageElement.style.width = 'unset';
        imageElement === null || imageElement === void 0 ? void 0 : imageElement.scrollIntoView({
            behavior: 'smooth',
            block: 'end',
        });
    }
}
function openImageInNewTab() {
    // Open detail page in new tab
    if (newTabForDetailPage) {
        const thumbs = document.querySelectorAll(configuration[hostname].selectors.anchor);
        Array.from(thumbs).map(thumb => thumb.setAttribute('target', '_blank'));
    }
}
async function onImageMouseOver(event) {
    var _a;
    const image = event.target;
    // remove tooltip
    image.title = '';
    if (!image.classList.contains('loaded')) {
        const urlList = await getURLList(image);
        if (hostname === 'rule34.paheal.net') {
            const parent = (_a = image.parentElement) === null || _a === void 0 ? void 0 : _a.parentElement;
            const sibling = parent === null || parent === void 0 ? void 0 : parent.children[2];
            urlList.original = sibling.href;
        }
        const type = await getType(image);
        if (type === 'video') {
            await swapVideo(image, urlList.original);
        }
        else {
            await swapImageURLs(image, urlList);
        }
    }
}
async function getType(image) {
    var _a, _b;
    switch (hostname) {
        case 'gelbooru.com':
            return movieExtensions.includes(image.classList[0]) ? 'video' : 'image';
        case 'danbooru.donmai.us': {
            const url = new URL(((_a = image.parentElement) === null || _a === void 0 ? void 0 : _a.parentElement).href);
            const doc = await getDocFromURL(url.href);
            const type = getPostType(doc);
            return type;
        }
        case 'rule34.paheal.net': {
            const extension = ((_b = image.parentElement) === null || _b === void 0 ? void 0 : _b.parentElement)
                .dataset['ext'];
            return movieExtensions.includes(extension) ? 'video' : 'image';
        }
        case 'rule34.xxx': {
            const url = new URL(image.parentElement.href);
            const doc = await getDocFromURL(url.href);
            const type = getPostType(doc);
            return type;
        }
        default:
            return null;
    }
}
async function swapImageURLs(image, urlList) {
    const { sample, original } = urlList;
    if (sample !== undefined) {
        setAsyncImage(image, sample).then(img => {
            if (original !== undefined) {
                setImage(image, original, image.width);
            }
        });
    }
    else {
        if (original !== undefined) {
            setImage(image, original, image.width);
        }
    }
}
async function getURLList(image) {
    var _a;
    switch (hostname) {
        case 'danbooru.donmai.us': {
            const url = ((_a = image === null || image === void 0 ? void 0 : image.parentElement) === null || _a === void 0 ? void 0 : _a.parentElement)
                .href;
            const list = await fetchImageURLGeneric(url);
            return list;
        }
        default: {
            const url = (image === null || image === void 0 ? void 0 : image.parentElement).href;
            const list = await fetchImageURLGeneric(url);
            return list !== null && list !== void 0 ? list : {};
        }
    }
}
function swapVideo(image, url) {
    const video = document.createElement('video');
    video.autoplay = true;
    video.loop = true;
    video.muted = true;
    video.poster = image.src;
    video.height = image.height;
    video.width = image.width;
    const source = document.createElement('source');
    source.type = 'video/mp4';
    source.src = url;
    video.appendChild(source);
    image.replaceWith(video);
}
async function fetchImageURLGeneric(url) {
    const doc = await getDocFromURL(url);
    const sample = getUrl(doc, 'sample');
    const original = getUrl(doc, 'original');
    const returnValue = {
        ...(original !== undefined && original.length > 0 && { original }),
        ...(sample !== undefined && sample !== original && { sample }),
    };
    return returnValue;
}
async function getDocFromURL(url) {
    const doc = await fetch(url)
        .then(response => {
        // The API call was successful!
        return response.text();
    })
        .then(html => {
        // Convert the HTML string into a document object
        const parser = new DOMParser();
        const doc = parser.parseFromString(html, 'text/html');
        return doc;
    });
    return doc;
}
function getUrl(doc, quality) {
    var _a, _b;
    const settings = configuration[hostname][quality];
    switch (settings.type) {
        case 'ogImage':
            return doc
                .querySelector("meta[property='og:image']")
                .getAttribute('content');
        case 'selector': {
            const element = doc.querySelector(settings.selector);
            return ((_b = (_a = element === null || element === void 0 ? void 0 : element.src) !== null && _a !== void 0 ? _a : element === null || element === void 0 ? void 0 : element.href) !== null && _b !== void 0 ? _b : element === null || element === void 0 ? void 0 : element.getElementsByTagName('source')[0].src);
        }
        default:
            return '';
    }
}
function getPostType(doc) {
    var _a;
    const element = (_a = doc.querySelector(configuration[hostname]['original'].selector)) !== null && _a !== void 0 ? _a : doc.querySelector(configuration[hostname]['original'].fallback.selector);
    return element instanceof HTMLVideoElement
        ? 'video'
        : element instanceof HTMLImageElement
            ? 'image'
            : null;
}
function setImage(image, url, width) {
    return new Promise((resolve, reject) => {
        var _a;
        image.onload = () => resolve();
        image.onerror = () => reject();
        image.width = width;
        image.src = url;
        if (hostname === 'danbooru.donmai.us') {
            (_a = image.previousElementSibling) === null || _a === void 0 ? void 0 : _a.remove();
        }
    });
}
async function setAsyncImage(image, url) {
    return new Promise((resolve, reject) => {
        setTimeout(async () => {
            try {
                if (url === undefined) {
                    return;
                }
                await setImage(image, url, image.width);
                return url;
            }
            catch (error) {
                console.error(error);
                reject(error);
                return;
            }
            finally {
                resolve(url);
            }
        });
    });
}
//# sourceMappingURL=index.js.map