Booru-Selector-Downloader

selector the pictures, consolog which you want and download the pictures online or use Node.js

As of 2019-08-12. See the latest version.

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

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

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

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

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

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

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.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==UserScript==
// @name         Booru-Selector-Downloader
// @namespace    http://tampermonkey.net/
// @version      3.2
// @description  selector the pictures, consolog which you want and download the pictures online or use Node.js
// @author       Beats0
// @match          *://yande.re/post*
// @match          *://konachan.com/*
// @match          *://danbooru.donmai.us/*
// @include     *://yande.re/*
// @include     *://konachan.com/*
// @include     *://konachan.net/*
// @include     *://konachan.com/*
// @include     *://danbooru.donmai.us/*
// @grant        GM_download
// @grant        GM_info
// @grant       GM.download
// @grant       GM.info
// ==/UserScript==

(function () {
    'use strict';
    var originUrl = document.location.origin;
    var REyande = /yande/,
        REkonachan = /konachan/,
        REdanbooru = /danbooru/;
    var re1 = /\d\w+/,
        re2 = /([a-fA-F0-9]{32})/,
        re3 =/\.[0-9a-z]+$/i;
    var REyandeResult = REyande.test(originUrl);
    var REkonachanResult = REkonachan.test(originUrl);
    var REdanbooruResult = REdanbooru.test(originUrl);
    if (REyandeResult === true) {
        yandeInit();
    } else if (REkonachanResult === true) {
        konachanInit();
    } else if (REdanbooruResult === true) {
        danbooruInit();
    }

    function yandeInit() {
        var main_menu = document.getElementById("main-menu");
        var confBord = document.createElement('li');
        var posts = document.getElementById('post-list-posts');
        if (!posts) return
        confBord.setAttribute('class', 'static');
        confBord.innerHTML = `<a href="#">Download</a>
 <a class="submenu-button" href="#">■</a> 
 <ul class="submenu" style="display: block;">
  <li>
  <a class="help-item post current-menu ManagementButton" id="ButtonSelectAll" onclick="UpdateBatchCount();" style="color: #ee8887;display: inline;cursor:pointer;">Select All</a>
   </li>
   <li>
    <a style="color: #ee8887;display: inline;cursor:pointer;" onclick="logJson()">logJson</a>
   </li>
   <li>
    <a style="color: #ee8887;display: inline;cursor:pointer;">press X download larger version</a>
   </li>
   </ul>`;
        main_menu.firstElementChild.appendChild(confBord);
        var postsItems = posts.querySelectorAll('li');
        for (let i = 0; i < postsItems.length; i++) {
            postsItems[i].classList.add('imgItem');
            postsItems[i].firstElementChild.firstElementChild.setAttribute('onclick', 'return false');
            var p = (re1.exec(postsItems[i].id)[0]);
            // var md5 = (re2.exec(postsItems[i].querySelectorAll('.directlink, .largeimg')[0].href)[0]);
            document.getElementById("p" + p).setAttribute('onclick', `myselect('${p}')`);
            var checkboxEl = document.createElement('div');
            checkboxEl.style.position = 'relative'
            checkboxEl.style.textAlign = 'center'
            checkboxEl.innerHTML = '<input type="checkbox"  class="checkbox" id="cb(' + p + ')" >';
            postsItems[i].insertBefore(checkboxEl, postsItems[i].firstChild);
        }
    }

    /* konachan */
    function konachanInit() {
        var main_menu = document.getElementById("main-menu");
        var confBord = document.createElement('li');
        var posts = document.getElementById('post-list-posts');
        if (!posts) return
        confBord.setAttribute('class', 'static');
        confBord.innerHTML = '<a href="#">Download</a> <a class="submenu-button" href="#">■</a> <ul class="submenu" style="display: block;"> <li><a class="help-item post current-menu ManagementButton" id="ButtonSelectAll" onclick="UpdateBatchCount();" style="color: #ee8887;display: inline;cursor:pointer;">Select All</a> </li><li><a style="color: #ee8887;display: inline;cursor:pointer;" onclick="logJson()">logJson</a></li><li><a style="color: #ee8887;display: inline;cursor:pointer;">press X download larger version</a></li></ul>';
        main_menu.firstElementChild.appendChild(confBord);
        var postsItems = posts.querySelectorAll('li');
        for (let i = 0; i < postsItems.length; i++) {
            postsItems[i].classList.add('imgItem');
            postsItems[i].firstElementChild.firstElementChild.setAttribute('onclick', 'return false');
            var p = (re1.exec(postsItems[i].id)[0]);
            document.getElementById("p" + p).setAttribute('onclick', `myselect('${p}')`);
            var checkboxEl = document.createElement('div');
            checkboxEl.style.position = 'relative'
            checkboxEl.style.textAlign = 'center'
            checkboxEl.innerHTML = '<input type="checkbox"  class="checkbox" id="cb(' + p + ')" >';
            postsItems[i].insertBefore(checkboxEl, postsItems[i].firstChild);
        }
    }

    /* danbooru */
    function danbooruInit() {
        var main_menu = document.getElementById('nav');
        var confBord = document.createElement('li');
        var posts = document.getElementById('posts');
        if (!posts) return;
        confBord.setAttribute('class', 'static');
        confBord.innerHTML = '<a href="#">Download</a> <a class="submenu-button" href="#">■</a> <ul class="submenu" style="display: block;"> <li><a class="help-item post current-menu ManagementButton" id="ButtonSelectAll" onclick="UpdateBatchCount();" style="color: #ee8887;display: inline;cursor:pointer;">Select All</a> </li><li><a style="color: #ee8887;display: inline;cursor:pointer;" onclick="logDanbooruJson()">logJson</a></li></ul>';
        main_menu.firstElementChild.appendChild(confBord);
        var postsItems = posts.querySelectorAll('article');
        for (let i = 0; i < postsItems.length; i++) {
            postsItems[i].classList.add('imgItem');
            postsItems[i].firstElementChild.setAttribute('onclick', 'return false');
            var p = postsItems[i].dataset.id;
            postsItems[i].setAttribute('onclick', `myselect('${p}')`);
            var checkboxEl = document.createElement('div');
            checkboxEl.setAttribute('position', 'relative');
            checkboxEl.innerHTML = '<input type="checkbox"  class="checkbox" id="cb(' + p + ')" >';
            postsItems[i].insertBefore(checkboxEl, postsItems[i].firstChild);
        }
    }

    function loadCssCode(code) {
        var style = document.createElement('style');
        style.type = 'text/css';
        style.rel = 'stylesheet';
        style.appendChild(document.createTextNode(code));
        var head = document.getElementsByTagName('head')[0];
        head.appendChild(style);
    }

    loadCssCode('ul#post-list-posts li {float:none}.imgItem:hover, .imgItem:focus { outline: 1px solid Highlight;outline: 1px auto -webkit-focus-ring-color; } .imgItemChecked { outline: 1px solid Highlight;outline: 1px auto -webkit-focus-ring-color; } article.post-preview { float:none;}');

    var removeFav = document.getElementById('remove-from-favs')
    var addFav = document.getElementById('add-to-favs')

    function downloadLarger() {
        pUrls.map(pic => {
            GMDownload(`${pic.largeFileUrl}`, `${pic.id}${re3.exec(pic.largeFileUrl)[0]}`)
        })
    }

    function downloadOriginal() {
        pUrls.map(pic => {
            GMDownload(`${pic.fileUrl}`, `${pic.id}${re3.exec(pic.fileUrl)[0]}`)
        })
    }

    // GM downloader
    function GMDownload(url, fileName) {
        var arg = {
            url,
            name: fileName,
            onprogress: downloadProgress
        }
        console.log(arg)
        GM_download(arg)
    }

    // press key 'Left' or 'Right' to paginate
    var pageRight = document.querySelector('#paginator > div > a.next_page')
    var pageLeft = document.querySelector('#paginator > div > a.previous_page')

    // in single page
    var largerImage = document.getElementById('highres-show')

    function GMhandler(e) {
        // danbooru
        if(REdanbooruResult) {
            GMhandlerDanbooru(e)
            return;
        }
        // yande.re || konachan
        // larger
        if (e.key === 'x') {
            if (largerImage) {
                GMDownload(largerImage.href, largerImage.href.match(re2)[0])
            } else {
                logJson()
                downloadLarger()
            }
        }
        // change fav
        if (e.key === 'c' && removeFav && addFav) {
            var addLink = addFav.firstElementChild
            var removeLink = removeFav.firstElementChild
            removeFav.style.display === 'none' ? addLink.click() : removeLink.click()
        }
        // paginate
        if (e.key === 'd' && pageRight) {
            pageRight.click()
        }
        if (e.key === 'a' && pageLeft) {
            pageLeft.click()
        }
    }

    function GMhandlerDanbooru(e) {
        // larger
        if (e.key === 'x') {
            logDanbooruJson()
            downloadLarger()
        }
        // original
        if (e.key === 's') {
            logDanbooruJson()
            downloadOriginal()
        }
    }

    window.addEventListener('keydown', GMhandler, false)

    // create progress
    var body = document.getElementsByTagName('body')[0];
    var progressEl = document.createElement('div');
    progressEl.innerHTML = `
    <div id='stripe' style="
    position: fixed;
    height: 2px;
    width: 0;
    margin: 0 -3em;
    top: 0;
    background: #ee8887;
    box-shadow: 0 0 10px rgba(249,144,141,0.7);
    transition: width .4s ease;
"></div>`
    body.appendChild(progressEl)

    // downloader progress
    function downloadProgress(xhr) {
        try {
            if (!xhr.lengthComputable)
                return;
            var stripe = document.getElementById('stripe'),
                width = Math.floor(xhr.loaded / xhr.total * 100);
            width === 100 ? stripe.style.width = 0 : stripe.style.width = `${width}%`
        } catch (e) {
            console.error(e);
        }
    }

    // myselect.js
    var HeadEl = document.getElementsByTagName('head').item(0);
    var ScriptEl = document.createElement("script");
    ScriptEl.type = "text/javascript";
    ScriptEl.src = "https://beats0.github.io/scripter/Booru-Selector-Downloader/myselect.js";
    HeadEl.appendChild(ScriptEl);
})();