NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==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); } }); }); }); } });