// ==UserScript==
// @name GBookDown - Download Google Books
// @description Saves all available Preview pages from a Google Book as PNGs
// @author nikisby
// @namespace nikisby
// @include https://books.google.*/books*
// @version 1.2
// @require https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.0/jquery.min.js
// @require https://cdnjs.cloudflare.com/ajax/libs/jszip/2.5.0/jszip.min.js
// @require https://cdnjs.cloudflare.com/ajax/libs/FileSaver.js/1.3.8/FileSaver.min.js
// @grant GM_xmlhttpRequest
// ==/UserScript==
this.$ = this.jQuery = jQuery.noConflict(true);
(function () {
var css = [
'#savePNG {',
' position: fixed;',
' padding: 7px;',
' background-color: #F8EEB1;',
' border: 2px solid #333;',
' border-radius: 6px;',
' z-index: 9999;',
' font-size: 18px;',
' right: 30px;',
' bottom: 20px;',
' color: #000;',
' width: 650px;',
' text-align: center;',
' box-shadow: 0 1px 4px rgba(0, 0, 0, 0.5), 0 0 15px rgba(0, 0, 0, 0.3);',
'}',
'#savePNG button {',
' font-size: 18px;',
' width: 100px;',
' cursor: pointer;',
'}',
'#savePNG input {',
' width: 60px;',
' font-size: 18px;',
' text-align: center;',
'}'
].join('\n');
if (typeof GM_addStyle != 'undefined') {
GM_addStyle(css);
} else if (typeof PRO_addStyle != 'undefined') {
PRO_addStyle(css);
} else if (typeof addStyle != 'undefined') {
addStyle(css);
} else {
var node = document.createElement('style');
node.type = 'text/css';
node.appendChild(document.createTextNode(css));
var heads = document.getElementsByTagName('head');
if (heads.length > 0) {
heads[0].appendChild(node);
} else {
// no head yet, stick it whereever
document.documentElement.appendChild(node);
}
}
}) ();
var html = '<div id="savePNG">' +
'<span>There are max </span> ' +
'<input type="text" id="total" value="---" readonly> ' +
'<span>pages available. Input the page range to download </span> ' +
'<input type="text" id="count" value="0"> ' +
'<input type="text" id="max" value="1"> ' +
'<span>.</span> ' +
'<button>Start</button>' +
'</div>';
$('body').prepend(html);
$('#count').select();
var title, id, zipfile, zipname;
var zipflag = false;
var next = true;
var zip = new JSZip();
var pids = [];
$('#savePNG button').click(function(){
doTheMagic();
})
$("#count").keyup(function(event){
if(event.keyCode == 13){
$("#savePNG button").click();
}
});
function addIMG(url, name, count) {
var filename = name + '.png';
GM_xmlhttpRequest({
method: 'GET',
synchronous: true,
url: url,
overrideMimeType: 'image/png; charset=x-user-defined',
onload: function (response) {
$('#savePNG button').prop('disabled', true).text('Working…');
$('#count').val(count);
$('#count').css('font-weight', 'normal').css('text-decoration', 'none');
zip.file(filename, response.responseText, {
binary: true
});
}
});
}
function saveZip(count, number) {
zipname = title + '_' + id + '_' +
pad(count, number.toString().length) +
'_' + number + '.zip';
zipfile = zip.generate({
type: 'blob'
});
$('#savePNG button').prop('disabled', false).text('Start');
saveAs(zipfile, zipname);
}
function pad(num, size) {
var s = "000000000" + num;
return s.substr(s.length-size);
}
function doTheMagic() {
$('#savePNG button').prop('disabled', true);
var href = window.location.href;
var domain = href.split('/') [2];
id = href.match(/id=([^&]+)/) [1];
title = $('title').text().split(' - ')[0].replace(/\s+/g,'_');
var pid = 'PP1';
var count = parseInt($('#count').val());
var max = parseInt($('#max').val());
var url = 'https://' + domain + '/books?id=' + id + '&lpg=' + pid + '&pg=' + pid + '&jscmd=click3';
$.ajax({
dataType: 'json',
async: false,
url: url,
}).done(function (data) {
pids = $.map(data.page, function (val, i) {
if (i > 3) {
return val.pid;
}
});
});
var number = pids.length;
$('#total').val(number);
if (count >= number) {
alert('Wrong number of pages. There are only ' + number + ' available.');
$('#savePNG button').prop('disabled', false);
} else {
var i = count;
var timer = setInterval(function () {
if (i == max || i == number) {
clearInterval(timer);
alert('Downloaded every available page out of '+ number + ' total. Saving…');
saveZip(i, number);
return false;
}
var url = 'https://' + domain + '/books?id=' + id + '&lpg=' + pids[i] + '&pg=' + pids[i] + '&jscmd=click3';
$.ajax({
dataType: 'json',
async: false,
url: url,
}).done(function (data) {
if (data.page[0].hasOwnProperty('src') || data.page[0].flags == 8) {
var url = data.page[0].src + '&w=1600';
var name = pad((i+1), number.toString().length) + '_' + pids[i];
if (data.page[0].flags == 8) {
$('#count').val(i + 1);
$('#count').css('font-weight', 'bold').css('text-decoration', 'line-through');
} else {
addIMG(url, name, (i + 1));
}
i++;
} else {
clearInterval(timer);
alert('Can\'t download more.\n' +
'Saving ' + i + ' out of ' + number + ' pages…\n' +
'Change your IP and continue!');
saveZip(i, number);
}
});
}, 400);
}
}