// ==UserScript==
// @name HentaiLx Downloader
// @namespace https://holy-donkey.github.io/
// @description Download manga on hentaiLx.com
// @version 1.1.1
// @icon http://i.imgur.com/ICearPQ.png
// @author The Holy Donkey
// @license MIT
// @include http://hentailx.com/*
// @include http://hentailx.com/doc-truyen/*
// @exclude http://hentailx.com/
// @exclude http://hentailx.com/index.aspx
// @exclude http://hentailx.com/danhsach/*
// @exclude http://hentailx.com/Theloai/*
// @exclude http://hentailx.com/trangthai/*
// @exclude http://hentailx.com/Users/*
// @exclude http://hentailx.com/dang-ky-thanh-vien.html
// @exclude http://hentailx.com/nhom-dich/*
// @exclude http://hentailx.com/Tacgia/*
// @require https://cdn.jsdelivr.net/jquery/2.2.4/jquery.min.js
// @require https://cdn.jsdelivr.net/jszip/3.1.3/jszip.min.js
// @require https://cdn.jsdelivr.net/filesaver.js/1.3.3/FileSaver.min.js
// @noframes
// @connect self
// @connect blogspot.com
// @supportURL https://github.com/holy-donkey/UserScripts/issues
// @run-at document-idle
// @grant GM_xmlhttpRequest
// ==/UserScript==
jQuery(function ($) {
'use strict';
function deferredAddZip(url, filename, current, total, zip, $download) {
var deferred = $.Deferred();
GM_xmlhttpRequest({
method: 'GET',
url: url,
responseType: 'arraybuffer',
onload: function (response) {
zip.file(filename, response.response);
$download.text(counter[current] + '/' + total);
++counter[current];
deferred.resolve(response);
},
onerror: function (err) {
console.error(err);
deferred.reject(err);
}
});
return deferred;
}
function getChaper(obj) {
var $this = $(obj.download),
zip = new JSZip(),
deferreds = [],
images = [];
$this.text('Waiting...');
obj.contentChap.children('img').each(function (i, v) {
images[i] = v.src;
});
$.each(images, function (i, v) {
var filename = v.replace(/.*\//g, '');
deferreds.push(deferredAddZip(images[i], filename, obj.current, images.length, zip, $this));
});
$.when.apply($, deferreds).done(function () {
zip.generateAsync({
type: 'blob'
}).then(function (blob) {
var zipName = obj.nameChap.replace(/\s/g, '_') + '.zip';
$this.text('Complete').css('color', 'green').attr({
href: window.URL.createObjectURL(blob),
download: zipName
}).off('click');
saveAs(blob, zipName);
doc.title = '[⇓ ' + (++complete) + '/' + progress + '] ' + tit;
}, function (reason) {
console.error(reason);
});
}).fail(function (err) {
$this.text('Fail').css('color', 'red');
console.error(err);
}).always(function () {
if (--alertUnload <= 0) {
$(window).off('beforeunload');
}
});
}
var $download = $('<a>', {
'class': 'chapter-download',
href: '#download',
text: 'Download'
}),
counter = [],
current = 0,
alertUnload = 0,
complete = 0,
progress = 0,
doc = document,
tit = doc.title;
window.URL = window.URL || window.webkitURL;
if (!location.pathname.indexOf('/doc-truyen/')) {
$('.chapter-info').find('ul').append('<span class="glyphicon glyphicon-save"></span> ').append($download);
$download.one('click', function (e) {
e.preventDefault();
++progress;
$download.attr('href', '#download');
$(window).on('beforeunload', function () {
return 'Progress is running...';
});
++alertUnload;
counter[current] = 1;
getChaper({
download: this,
contentChap: $('#content_chap'),
nameChap: $('.link_truyen').eq(0).text() + ' ' + $('.link_truyen').eq(1).text(),
current: current
});
});
} else {
$('.chapter-name-label').attr('class', 'chapter-name-label col-xs-6 col-sm-6 col-md-6');
$('.chap-link').attr('class', 'chap-link col-xs-6 col-sm-6 col-md-6');
$('.list-group-item').eq(2).append('<div class="col-xs-3 col-sm-3 col-md-3 text-right chapter-view-download">Download</div>');
$('.item_chap:not(:last)').append($('<span>', {
'class': 'col-xs-3 col-sm-3 col-md-3 text-right chapter-view-download'
}).append($download));
$('.chapter-download').each(function () {
$(this).one('click', function (e) {
e.preventDefault();
++progress;
var _this = this,
$chapLink = $(_this).closest('.item_chap').find('.chap-link');
$(_this).attr('href', '#download');
if (alertUnload <= 0) {
$(window).on('beforeunload', function () {
return 'Progress is running...';
});
}
++alertUnload;
GM_xmlhttpRequest({
method: 'GET',
url: $chapLink.attr('href'),
responseType: 'text',
onload: function (response) {
var $data = $(response.responseText);
counter[current] = 1;
getChaper({
download: _this,
contentChap: $data.filter('#content_chap'),
nameChap: $('.breadcrumb').find('.active').text() + ' ' + $chapLink.text(),
current: current
});
++current;
},
onerror: function (err) {
console.error(err);
}
});
});
});
}
});