wnacgDownload

Enhanced download of wnacg

当前为 2019-09-15 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         wnacgDownload
// @namespace    yrWnacg
// @version      2.2
// @description  Enhanced download of wnacg
// @require      https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js
// @author       Toudaimori
// @match        https://*.wnacg.com/photos-index-aid-*.html
// @match        https://*.wnacg.org/photos-index-aid-*.html
// @grant 	     GM.xmlHttpRequest
// @grant 	     GM_download
// ==/UserScript==

'use strict';

/*
* GM_download() polyfill
*
* A polyfill to make your userscript supports GM_download().
*
* Inspired by:
*   https://tampermonkey.net/documentation.php?ext=dhdg#GM_download
*
* Supported:
*   onabort
*
* Not supported:
*   saveAs
*
* Contributor(s):
*   ccloli (original author)
*   Jan Biniok (the blacklist and whitelist from Tampermonkey)
*   janekptacijarabaci
*
*/

// *****************************************************************************

const API = {
    "name": {
    "basic": "GM_download",
    "fully": "GM_download()",
    },
    "nameInternal": {
    "basic": "GM.xmlHttpRequest",
    "fully": "GM.xmlHttpRequest()",
    },
};

// *****************************************************************************

// User settings.

const LOCALE = {
    "_default": "en-US",
    "_enforce": null,
    "cs": {
    "error": {
        "download": {
        "error": API.name.fully
            + ":%1",
        "failed": API.name.fully
            + " se nezdařilo.%1",
        "noUrl": API.name.fully
            + ": url nenalezeno.%1",
        "onabortIsNotFunction": API.name.fully
            + ": details.onabort není funkce!",
        "onerrorIsNotFunction": API.name.fully
            + ": details.onerror není funkce!",
        "onloadIsNotFunction": API.name.fully
            + ": details.onload není funkce!",
        "onprogressIsNotFunction": API.name.fully
            + ": details.onprogress není funkce!",
        "ontimeoutIsNotFunction": API.name.fully
            + ": details.ontimeout není funkce!",
        "xmlhttpRequest": {
            "require": API.nameInternal.fully
                + ' - typeof: "%1".'
                + "\n"
                + 'Nastavte "@grant '
                + API.nameInternal.basic
                + '" v "metadata block".',
        },
        },
    },
    "file": {
        "name": "soubor",
        // It should be on the whitelist.
        "extension": "bin",
    },
    },
    "en-US": {
    "error": {
        "download": {
        "error": API.name.fully
            + ":%1",
        "failed": API.name.fully
            + " failed:%1",
        "noUrl": API.name.fully
            + ": url not found.%1",
        "onabortIsNotFunction": API.name.fully
            + ": details.onabort is not a function!",
        "onerrorIsNotFunction": API.name.fully
            + ": details.onerror is not a function!",
        "onloadIsNotFunction": API.name.fully
            + ": details.onload is not a function!",
        "onprogressIsNotFunction": API.name.fully
            + ": details.onprogress is not a function!",
        "ontimeoutIsNotFunction": API.name.fully
            + ": details.ontimeout is not a function!",
        "xmlhttpRequest": {
            "require": API.nameInternal.fully
                + ' - typeof: "%1".'
                + "\n"
                + 'Set "@grant '
                + API.nameInternal.basic
                + '" at "metadata block".',
        },
        },
    },
    "file": {
        "name": "filename",
        // It should be on the whitelist.
        "extension": "bin",
    },
    },
};

const NAME_EXTENSION_BLACKLIST = false;

const NAME_EXTENSION = {
    "blacklist": [
    "bat",
    "com",
    "crx",
    "exe",
    "scr",
    "sh",
    ],
    "blacklistRegexp": [
    ],
    "whitelist": [
    "7z",
    "avi",
    "bin",
    "divx",
    // "flv",
    "gif",
    "ico",
    "idx",
    "iso",
    "jpe",
    "jpeg",
    "mkv",
    "mp3",
    "mp4",
    "mpe",
    "mpeg",
    "png",
    "rar",
    "srt",
    "sub",
    "txt",
    "wav",
    "webm",
    "zip",
    ],
    "whitelistRegexp": [
    "r(ar|[0-9]{2,2})",
    ],
};

// *****************************************************************************

var _language = ((LOCALE._enforce) ? LOCALE._enforce
    : (navigator.language ? navigator.language
    : LOCALE._default));
_language = (_language in LOCALE) ? _language : LOCALE._default;

const _LOCALE = {
    "result": {
    "error": {
        "download": {
        "error": LOCALE[_language].error.download.error,
        "failed": LOCALE[_language].error.download.failed,
        "noUrl": LOCALE[_language].error.download.noUrl,
        "onabortIsNotFunction":
            LOCALE[_language].error.download.onabortIsNotFunction,
        "onerrorIsNotFunction":
            LOCALE[_language].error.download.onerrorIsNotFunction,
        "onloadIsNotFunction":
            LOCALE[_language].error.download.onloadIsNotFunction,
        "onprogressIsNotFunction":
            LOCALE[_language].error.download.onprogressIsNotFunction,
        "ontimeoutIsNotFunction":
            LOCALE[_language].error.download.ontimeoutIsNotFunction,
        "xmlhttpRequest": {
            "require": LOCALE[_language].error.download.xmlhttpRequest.require,
        },
        },
    },
    "file": {
        "name": LOCALE[_language].file.name,
        "extension": LOCALE[_language].file.extension,
    },
    },
};

const _RESULT = {
    "error": {
    "BLACKLISTED": "blacklisted",
    "NOT_SUCCEEDED": "not_succeeded",
    "NOT_WHITELISTED": "not_whitelisted",
    },
};

// *****************************************************************************

if (typeof GM_download != "function") {
    if (typeof GM.xmlHttpRequest != "function") {
    throw new Error(
        _LOCALE.result.error.download.xmlhttpRequest.require
        .replace("%1", typeof GM.xmlHttpRequest));
    }

    console.log('Detect no GM_download! Use Polyfill instead!')

    var GM_download = function(aDetailsOrUrl, aName) {
        let _functionEmpty = function () {};

        var message = "";

        var details = {
            "url": null,
            "name": _LOCALE.result.file.name + "." + _LOCALE.result.file.extension,
            "onabort": _functionEmpty,
            "onerror": _functionEmpty,
            "onload": _functionEmpty,
            "onprogress": _functionEmpty,
            "ontimeout": _functionEmpty,
        };

        var _details = {};

        if (aDetailsOrUrl) {
            if (typeof aDetailsOrUrl == "object") {
            for (let i in aDetailsOrUrl) {
                _details[i] = aDetailsOrUrl[i];
            }
            } else if (typeof aDetailsOrUrl == "string") {
            details.url = aDetailsOrUrl;
            }
        }

        if (_details.url && (typeof _details.url == "string")) {
            details.url = _details.url;
        }
        if (_details.name && (typeof _details.name == "string")) {
            details.name = _details.name;
        }
        if (_details.onabort) {
            details.onabort = _details.onabort;
        }
        if (_details.onerror) {
            details.onerror = _details.onerror;
        }
        if (_details.onload) {
            details.onload = _details.onload;
        }
        if (_details.onprogress) {
            details.onprogress = _details.onprogress;
        }
        if (_details.ontimeout) {
            details.ontimeout = _details.ontimeout;
        }

        for (let i in _details) {
            if (!(i in details)) {
            details[i] = _details[i];
            }
        }

        if (details.url == null) {
            message = "\n" + "url: " + details.url;
            message += "\n" + "name: " + details.name;
            message = _LOCALE.result.error.download.noUrl
                .replace("%1", message);
            details.onerror({
            "details": message,
            "error": _RESULT.error.NOT_SUCCEEDED,
            });

            return false;
        }

        if (typeof details.onabort != "function") {
            message = _LOCALE.result.error.download.onabortIsNotFunction;
            message += "\n" + "url: " + details.url;
            message += "\n" + "name: " + details.name;
            details.onerror({
            "details": message,
            "error": _RESULT.error.NOT_SUCCEEDED,
            });

            return false;
        }
        if (typeof details.onerror != "function") {
            message = _LOCALE.result.error.download.onerrorIsNotFunction;
            message += "\n" + "url: " + details.url;
            message += "\n" + "name: " + details.name;
            console.error(message);

            return false;
        }
        if (typeof details.onload != "function") {
            message = _LOCALE.result.error.download.onloadIsNotFunction;
            message += "\n" + "url: " + details.url;
            message += "\n" + "name: " + details.name;
            details.onerror({
            "details": message,
            "error": _RESULT.error.NOT_SUCCEEDED,
            });

            return false;
        }
        if (typeof details.onprogress != "function") {
            message = _LOCALE.result.error.download.onprogressIsNotFunction;
            message += "\n" + "url: " + details.url;
            message += "\n" + "name: " + details.name;
            details.onerror({
            "details": message,
            "error": _RESULT.error.NOT_SUCCEEDED,
            });

            return false;
        }
        if (typeof details.ontimeout != "function") {
            message = _LOCALE.result.error.download.ontimeoutIsNotFunction;
            message += "\n" + "url: " + details.url;
            message += "\n" + "name: " + details.name;
            details.onerror({
            "details": message,
            "error": _RESULT.error.NOT_SUCCEEDED,
            });

            return false;
        }

        if (aName) {
            if (typeof aName == "string") {
            details.name = aName;
            }
        }

        let nameCheckBlacklist = false;
        if (NAME_EXTENSION_BLACKLIST && (NAME_EXTENSION.blacklist.length > 0)) {
            nameCheckBlacklist = NAME_EXTENSION.blacklist.some(function (aItem) {
            return details.name.toLowerCase().endsWith("." + aItem.toLowerCase());
            });
        }
        let nameCheckBlacklistRegexp = false;
        if (NAME_EXTENSION_BLACKLIST
            && (NAME_EXTENSION.blacklistRegexp.length > 0)) {
            nameCheckBlacklistRegexp = NAME_EXTENSION.blacklistRegexp.some(
                function (aItem) {
                return (new RegExp("\\." + aItem + "$", "i")).test(details.name);
                });
        }
        let nameCheckWhitelist = false;
        if (NAME_EXTENSION.whitelist.length > 0) {
            nameCheckWhitelist = NAME_EXTENSION.whitelist.some(function (aItem) {
            return details.name.toLowerCase().endsWith("." + aItem.toLowerCase());
            });
        }
        let nameCheckWhitelistRegexp = false;
        if (NAME_EXTENSION.whitelistRegexp.length > 0) {
            nameCheckWhitelistRegexp = NAME_EXTENSION.whitelistRegexp.some(
                function (aItem) {
                return (new RegExp("\\." + aItem + "$", "i")).test(details.name);
                });
        }

        if (NAME_EXTENSION_BLACKLIST
            && (nameCheckBlacklist || nameCheckBlacklistRegexp)) {
            details.onerror({
            "error": _RESULT.error.BLACKLISTED,
            });

            return false;
        }
        if (!nameCheckWhitelist && !nameCheckWhitelistRegexp) {
            details.onerror({
            "error": _RESULT.error.NOT_WHITELISTED,
            });

            return false;
        }

        let data = {
            "method": "GET",
            // "responseType": "arraybuffer",
            "responseType": "blob",
            "url": details.url,

            "onabort": function (aResponse) {
                details.onabort(aResponse);
            },
            "onerror": function (aResponse) {
                message = "\n" + "url: " + details.url;
                message += "\n" + "name: " + details.name;
                message = _LOCALE.result.error.download.failed
                    .replace("%1", message);
                details.onerror({
                    "details": message,
                    "error": _RESULT.error.NOT_SUCCEEDED,
                });

                return false;
            },
            "onload": function (aResponse) {
                let separators = {
                    "headers": "\n",
                    "nameValue": ":",
                };
                var contentTypeStartsWith = "content-type" + separators.nameValue;
                let responseHeaders = aResponse.responseHeaders
                    .split(separators.headers);
                let contentType = responseHeaders.find(function (aHeader) {
                    return aHeader.toLowerCase().trim().startsWith(contentTypeStartsWith);
                });
                if (contentType) {
                    contentType = contentType.split(separators.nameValue, 2);
                    contentType = contentType[1] ? contentType[1].trim() : undefined;
                }
                let type = details.overrideMimeType || contentType
                    || "application/octet-stream";
                let blob = new Blob([aResponse.response], {
                    "type": type,
                });
                let url = URL.createObjectURL(blob);

                let a = document.createElement("a");
                a.setAttribute("href", url);
                a.setAttribute("download", details.name);
                a.setAttribute("style", "display: none;");
                document.documentElement.appendChild(a);

                let event = new MouseEvent("click");
                a.dispatchEvent(event);

                document.documentElement.removeChild(a);

                setTimeout(function () {
                    URL.revokeObjectURL(url);
                    blob = undefined;
                }, 1000);

                details.onload(aResponse);
            },
            "onprogress": function (aResponse) {
                details.onprogress(aResponse);
            },
            "ontimeout": function (aResponse) {
                details.ontimeout(aResponse);
            },
        };

        for (let i in details) {
            if (!(i in data)) {
                data[i] = details[i];
            }
        }

        try {
            return GM.xmlHttpRequest(data);
        }
        catch (e) {
            message = "\n" + "error: " + e.toString();
            message += "\n" + "url: " + details.url;
            message += "\n" + "name: " + details.name;
            message = _LOCALE.result.error.download.error
                .replace("%1", message);
            details.onerror({
            "details": message,
            "error": _RESULT.error.NOT_SUCCEEDED,
            });

            return false;
        }
    }
}
else {
    console.log('GM_download Founded.')
}


// Main Code Here...

const title = $('#bodywrap h2').text();
const img = `data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHgAAAAjCAYAAABfLc7mAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKTWlDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVN3WJP3Fj7f92UPVkLY8LGXbIEAIiOsCMgQWaIQkgBhhBASQMWFiApWFBURnEhVxILVCkidiOKgKLhnQYqIWotVXDjuH9yntX167+3t+9f7vOec5/zOec8PgBESJpHmomoAOVKFPDrYH49PSMTJvYACFUjgBCAQ5svCZwXFAADwA3l4fnSwP/wBr28AAgBw1S4kEsfh/4O6UCZXACCRAOAiEucLAZBSAMguVMgUAMgYALBTs2QKAJQAAGx5fEIiAKoNAOz0ST4FANipk9wXANiiHKkIAI0BAJkoRyQCQLsAYFWBUiwCwMIAoKxAIi4EwK4BgFm2MkcCgL0FAHaOWJAPQGAAgJlCLMwAIDgCAEMeE80DIEwDoDDSv+CpX3CFuEgBAMDLlc2XS9IzFLiV0Bp38vDg4iHiwmyxQmEXKRBmCeQinJebIxNI5wNMzgwAABr50cH+OD+Q5+bk4eZm52zv9MWi/mvwbyI+IfHf/ryMAgQAEE7P79pf5eXWA3DHAbB1v2upWwDaVgBo3/ldM9sJoFoK0Hr5i3k4/EAenqFQyDwdHAoLC+0lYqG9MOOLPv8z4W/gi372/EAe/tt68ABxmkCZrcCjg/1xYW52rlKO58sEQjFu9+cj/seFf/2OKdHiNLFcLBWK8ViJuFAiTcd5uVKRRCHJleIS6X8y8R+W/QmTdw0ArIZPwE62B7XLbMB+7gECiw5Y0nYAQH7zLYwaC5EAEGc0Mnn3AACTv/mPQCsBAM2XpOMAALzoGFyolBdMxggAAESggSqwQQcMwRSswA6cwR28wBcCYQZEQAwkwDwQQgbkgBwKoRiWQRlUwDrYBLWwAxqgEZrhELTBMTgN5+ASXIHrcBcGYBiewhi8hgkEQcgIE2EhOogRYo7YIs4IF5mOBCJhSDSSgKQg6YgUUSLFyHKkAqlCapFdSCPyLXIUOY1cQPqQ28ggMor8irxHMZSBslED1AJ1QLmoHxqKxqBz0XQ0D12AlqJr0Rq0Hj2AtqKn0UvodXQAfYqOY4DRMQ5mjNlhXIyHRWCJWBomxxZj5Vg1Vo81Yx1YN3YVG8CeYe8IJAKLgBPsCF6EEMJsgpCQR1hMWEOoJewjtBK6CFcJg4Qxwicik6hPtCV6EvnEeGI6sZBYRqwm7iEeIZ4lXicOE1+TSCQOyZLkTgohJZAySQtJa0jbSC2kU6Q+0hBpnEwm65Btyd7kCLKArCCXkbeQD5BPkvvJw+S3FDrFiOJMCaIkUqSUEko1ZT/lBKWfMkKZoKpRzame1AiqiDqfWkltoHZQL1OHqRM0dZolzZsWQ8ukLaPV0JppZ2n3aC/pdLoJ3YMeRZfQl9Jr6Afp5+mD9HcMDYYNg8dIYigZaxl7GacYtxkvmUymBdOXmchUMNcyG5lnmA+Yb1VYKvYqfBWRyhKVOpVWlX6V56pUVXNVP9V5qgtUq1UPq15WfaZGVbNQ46kJ1Bar1akdVbupNq7OUndSj1DPUV+jvl/9gvpjDbKGhUaghkijVGO3xhmNIRbGMmXxWELWclYD6yxrmE1iW7L57Ex2Bfsbdi97TFNDc6pmrGaRZp3mcc0BDsax4PA52ZxKziHODc57LQMtPy2x1mqtZq1+rTfaetq+2mLtcu0W7eva73VwnUCdLJ31Om0693UJuja6UbqFutt1z+o+02PreekJ9cr1Dund0Uf1bfSj9Rfq79bv0R83MDQINpAZbDE4Y/DMkGPoa5hpuNHwhOGoEctoupHEaKPRSaMnuCbuh2fjNXgXPmasbxxirDTeZdxrPGFiaTLbpMSkxeS+Kc2Ua5pmutG003TMzMgs3KzYrMnsjjnVnGueYb7ZvNv8jYWlRZzFSos2i8eW2pZ8ywWWTZb3rJhWPlZ5VvVW16xJ1lzrLOtt1ldsUBtXmwybOpvLtqitm63Edptt3xTiFI8p0in1U27aMez87ArsmuwG7Tn2YfYl9m32zx3MHBId1jt0O3xydHXMdmxwvOuk4TTDqcSpw+lXZxtnoXOd8zUXpkuQyxKXdpcXU22niqdun3rLleUa7rrStdP1o5u7m9yt2W3U3cw9xX2r+00umxvJXcM970H08PdY4nHM452nm6fC85DnL152Xlle+70eT7OcJp7WMG3I28Rb4L3Le2A6Pj1l+s7pAz7GPgKfep+Hvqa+It89viN+1n6Zfgf8nvs7+sv9j/i/4XnyFvFOBWABwQHlAb2BGoGzA2sDHwSZBKUHNQWNBbsGLww+FUIMCQ1ZH3KTb8AX8hv5YzPcZyya0RXKCJ0VWhv6MMwmTB7WEY6GzwjfEH5vpvlM6cy2CIjgR2yIuB9pGZkX+X0UKSoyqi7qUbRTdHF09yzWrORZ+2e9jvGPqYy5O9tqtnJ2Z6xqbFJsY+ybuIC4qriBeIf4RfGXEnQTJAntieTE2MQ9ieNzAudsmjOc5JpUlnRjruXcorkX5unOy553PFk1WZB8OIWYEpeyP+WDIEJQLxhP5aduTR0T8oSbhU9FvqKNolGxt7hKPJLmnVaV9jjdO31D+miGT0Z1xjMJT1IreZEZkrkj801WRNberM/ZcdktOZSclJyjUg1plrQr1zC3KLdPZisrkw3keeZtyhuTh8r35CP5c/PbFWyFTNGjtFKuUA4WTC+oK3hbGFt4uEi9SFrUM99m/ur5IwuCFny9kLBQuLCz2Lh4WfHgIr9FuxYji1MXdy4xXVK6ZHhp8NJ9y2jLspb9UOJYUlXyannc8o5Sg9KlpUMrglc0lamUycturvRauWMVYZVkVe9ql9VbVn8qF5VfrHCsqK74sEa45uJXTl/VfPV5bdra3kq3yu3rSOuk626s91m/r0q9akHV0IbwDa0b8Y3lG19tSt50oXpq9Y7NtM3KzQM1YTXtW8y2rNvyoTaj9nqdf13LVv2tq7e+2Sba1r/dd3vzDoMdFTve75TsvLUreFdrvUV99W7S7oLdjxpiG7q/5n7duEd3T8Wej3ulewf2Re/ranRvbNyvv7+yCW1SNo0eSDpw5ZuAb9qb7Zp3tXBaKg7CQeXBJ9+mfHvjUOihzsPcw83fmX+39QjrSHkr0jq/dawto22gPaG97+iMo50dXh1Hvrf/fu8x42N1xzWPV56gnSg98fnkgpPjp2Snnp1OPz3Umdx590z8mWtdUV29Z0PPnj8XdO5Mt1/3yfPe549d8Lxw9CL3Ytslt0utPa49R35w/eFIr1tv62X3y+1XPK509E3rO9Hv03/6asDVc9f41y5dn3m978bsG7duJt0cuCW69fh29u0XdwruTNxdeo94r/y+2v3qB/oP6n+0/rFlwG3g+GDAYM/DWQ/vDgmHnv6U/9OH4dJHzEfVI0YjjY+dHx8bDRq98mTOk+GnsqcTz8p+Vv9563Or59/94vtLz1j82PAL+YvPv655qfNy76uprzrHI8cfvM55PfGm/K3O233vuO+638e9H5ko/ED+UPPR+mPHp9BP9z7nfP78L/eE8/sl0p8zAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAhLSURBVHja7JttbFvVGcd/1762r3P9ntRJE0ISTCgUuS8woi20azQ2oamwl36INO1NHdJUTf3QCXVap/UDVCqbBFs/VFpBQxpMXVlBBcGqiU3VVNgyqduomkChtE6alqRpSO0ktuO3e333wb43tmMn6UusuvL/i6+Pj+1znv95/ud5nnuuoGkaddy5EPULQRDmW18bfgTR8kvQOtAQ6ma6zRGfeZfDv3qBvx8OAxm9WdM0BN2DDYJfv/Q9RMvL6xyC1W2+Nf9fukLqmnFrMZbSGI7EzvO7n32b998MAcnyBB8d7cZi/bDXLVh9Yt1wtYRP5jQuDI+c5Ce924ExIK1pGqaiXiZh71q5Tm4t4v4GAeddXVv4xo+/Bnh04Zwn+M0rZkziN++21Y1Vq2i1CfDwV58EVgHWYoKVTLdDFFxiPaSqWXhEYFVbAGgCpBKC083WKpMbdIgcWO8l6Fj+nvD0vU6evtdZ8fO9a9zsXeOuunErzaWwvUMyr+gYrAJgbXABTsBWlCaRTplAXpGJO0VT2c8CDpGAy8oGj7ViH4CB6bRx3S6LBSFD7jVbEJY3SiYCLivBsThDMWXBb+3odNz0nP46kWA0qdLrsS46l6iSxSnmxtPtsPCde5yMxTP89twso0n1ltvaJABmszkvz+ZigrPqivjvUwEnAZd10T79Xc5FP3/y/atl2x+URZ4KFH/Xbs4Zd/daD+FUsRF3nYmwtf3mF/HgdJrRpMqeoHfRuYRm0xwdjQMwkVQ5Mhxle7eL5x9q5M8jUd64klgBi2tCXpmFYoJXCC+Hoot6cH+Xk6MjUUJlvK2c5/lsZuO9XBAwBFxWQrNpEmqW0GzaINsnmRmLG7k/zw1FKv7HnqCX8bjCK8PRRcfycSyz4LfKzUX3YB3HJhKcj2XYvdbDuWimupWslYIuk9ta7PhL9qBVebI6ZQtymUVw6GLMuC71vK3tMqHZNLvORNjWYifgsvLe1STHJhJF+3Wf3FDUXij35ZBQs0v2KSf1leaitz/WbGddXtIHJpM82iQxqyRWRKqrSrCOLzdLFaW6xy+VbS8kWPeWH96Tk8BXhqNElSwA/5hK8nhrA9u7XfwvL5+9Hit9qxsIzaaLSF8OOiTzkoa/321Z0BaaTdMomWiUTAu2jLtksagd4F9Tydr34FID7DoTWbLfgfXeBYtB96p+NWu839Zi59Gm3OK4llKxiwJfb7HnPKa1AYDLccXwtsHp9JLe2SZbOPhIE0PhFC+GohWJLt16Hmu20+OXym4Be4JeTodTHLoYw5vfViKKdmdIdKnxDqz3LqvfjapCqZT3rW6oGJGXlWglS0KBoM/G824rJ8bnipRkqeCxNPAqJfyJFjv9XU52/mdqxeW56gTfKvhsZl58qJHT4VSRIuzodNDrl9g7GLlh44VTKs98NM2POh30rW5ga7vMRp+Ng5/OFKVdu85EitKkch48llSNcegB4Sa/nUhKrQq5VSd4LJ65IYnukMz8oMNBt9uC16YHaiqyKBhGdoqCIcttkpm2MkWFj2OZZUljRNF44UKUv00k2Hmfm1ZZZP/GRo5fjhd5sx51J9SsEd33d8iGCunePx5XaJdFgg6RVlnk+OV41WxeVYIDLivvbG6+7u+5RIEev0QkpZJUNWOhvLO5eYEEl5PJQrlcToRcmAH8fDBc5M16kUPHPycThGJK3oPNRt6rB4N6ZO6zmflWm2wUSu5IgiMplYHJpSPHXr9U4Kk5Q+vkFO7huhx+qclG3+oGTk0mOXF13ng/XeshoWQ59OlsUf56XWPOe/OH02lk0bRAWjf57TzcuNCDfQUK8slMhq3tVnr8Zk5NJqsmz1UnOKFoDC7Dgzb6bHhtLBkcDUyn6ZDMfNFvJ6lqvFVQntzR6UAyCxwZjl+X11bCu1Opsu3L8eCRgoX16mjMKOEOLVHcqTmCW2WxonzeVOnwWop1jTb2b2xkKJziUlwxCiHHVlgOS8ushfM7Hc4tii5HLisYjyuG9+7f2MjRkSh//GzuziF4OWVAffW3yssb2mhSZd+5GbyiwO41boI+G0GfzciBvaKwYjnnc0MRI3Db0elga7ts1M2DDpFZRWNbi91I3Vrl3B0lPQCMVyEXXlGCOySzUXjQ96h1HuuS37PnU4rCAgVAi2Q2as46gg6RDR4rm/x2Y1GcmkzS7bbQt7rB2JvfqnB36UZRKVgs155UNd6+FKO/y8kv1nr4LJ4bx/lYprYJbpPMZWvIy0Vh38Lra8ksjzfZ2PmAp8iIpyaTvDoaM2Sw12Olv0Omxy/R45duaXGh9A5XqQd7RYGXelYB8OxgmKGYQqdsoccv0SqLRFJq7e/BA9Ppirf6rhdxJYssmogrWf4ykSCiaGzJ77eVSpAD+fZej5WAQ1yS3OOX40ze4AIoDR4jisazg2EjCwDYd26G78czPOC2cmQ0VpVtcf5U5R+GvuJrWnWi110/s1OriKpw8uLVq2xfvxMY0DRtfL5arqoJtW6jmkY6C6QScxQcPZ8nePTshZmMlq0fSq9dxLNAZHIKUAC1mOB93w2TTn4QztQNVav4PK3BR/8+C8yRf4Sl8A60ytTY70eTdR+uRYyn4cq1SJhjB/8LhMk/vlJ8xGDn5sPjU9feOxvX6s8P1RAm0vDBjKLyp1+/wVx0HPgcSBVH0bmHz8xs2HI32585QPt9T7gtgqluvtsfM9MzEV7/zTHefukkMAhcAOLlny7MnaltJrjpC7QFHkTJSGhaPXe6nXHiSAiIACPARWAWyFYiGMACuAA3YF8g5XXcbsgAUWAaSABZqPR8cEERJE+scYi6jtsWWj4tyhY1ahr/HwAyfamGlOahLwAAAABJRU5ErkJggg==`
const element = `<a class="downloadbtn" style="width:120px; background: url(${img})" href=${$('.btn[href^="/download"]').attr('href')}>&nbsp;</a>`
const btn = $(element);

$('.asTBcell.uwthumb').append(btn);

$.ajax(btn.attr('href')).done( data => {
    const link = $('.down_btn', $(data)).attr('href')
    btn.on('click', event => {
        event.stopPropagation();
        event.preventDefault();
        console.log(`start downloading ${link} as ${title}.zip, it might take a while...`)
      	GM_download(link, `${title}.zip`)
        return false
    })
});