Greasy Fork

GrimRipper

BW Canvas Ripper

目前为 2023-01-04 提交的版本。查看 最新版本

// ==UserScript==
// @name         GrimRipper
// @namespace    http://tampermonkey.net/
// @version      1.7
// @description  BW Canvas Ripper
// @author       XXXXXXXXXIII
// @match        https://viewer.bookwalker.jp/*
// @match        https://viewer-trial.bookwalker.jp/*
// @license      MIT
// ==/UserScript==

const height = 3200; // USER: Maximize enderer size, this allows downloading with no side margins
const width = 2250;

(function() {
    'use strict';
    console.log("Hello There");

    var id = setInterval(function setRenderer() {
        var renderer = getRenderer();
        if (!renderer) return;
        renderer.style.width = width + 'px';
        renderer.style.height = height + 'px';
        //clearInterval(id); // Keep it running
    }, 10);

    console.log("Ripper will start rippin' in 5 seconds");
    setTimeout(main, 5000);
})();

function main() {
    var saved = false;
    var page = -1;
    setInterval(() => {
        try {
            if (page < 1) page = getPageNum();
            if (page != getPageNum()) saved = false;
            if (page < 1 || saved) return;
            if (isLoading()) return;
            console.log("rippin' page " + getPageNum());
            let canvas = getActiveCanvas();
            saveCanvas(canvas, getPageNum());
            saved = true;
            page = getPageNum();
            NFBR.a6G.Initializer.Z4p.menu.options.a6l.moveToNext(); // USER: Auto page flip, comment out if not needed
        } catch (e) {
            console.log("Not Ready");
            saved = false;
        }
    }, 3000); // USER: Auto flip time interval
}

function getRenderer() {
    return document.getElementById('renderer');
}

function saveCanvas(canvas, page) {
    //let image = canvas.toDataURL("image/jpeg", 1.0); // Very Slow, highly not recommended.
    var crop = document.createElement("CANVAS");
    crop.width = canvas.width;
    crop.height = canvas.height - Math.floor(canvas.height / 500); // Crop bottom barcode
    var ctx = crop.getContext("2d");
    ctx.drawImage(canvas, 0, 0);
    crop.toBlob((blob) => {
        var image = URL.createObjectURL(blob);
        var a = document.createElement('a');
        a.href = image;
        document.body.appendChild(a);
        a.download = page + ".png";
        a.click(); // USER: Disable ask where to store file location setting for usability
        document.body.removeChild(a);
    }, "image/png", 1.0);
}

function isLoading() {
    if (document.getElementById('viewport0').style.visibility == 'visible') {
        return document.getElementById('viewport0').getElementsByClassName("loading")[0].style.visibility == 'visible';
    } else {
        return document.getElementById('viewport1').getElementsByClassName("loading")[0].style.visibility == 'visible';
    }
}

function getActiveCanvas() {
    if (document.getElementById('viewport0').style.visibility == 'visible') {
        return document.getElementById('viewport0').getElementsByTagName("CANVAS")[0];
    } else {
        return document.getElementById('viewport1').getElementsByTagName("CANVAS")[0];
    }
}

function getPageNum() {
    var pageNum = document.getElementById('pageSliderCounter').innerHTML;
    return Number(pageNum.replace(/\/.*/i, ""));
}