NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name Worldcosplay download // @name:vi Worldcosplay download // @namespace http://devs.forumvi.com/ // @description Download photo(s) on WorldCosplay. // @description:vi Tải ảnh từ WorldCosplay. // @version 3.1.6 // @icon http://i.imgur.com/gJLjIzb.png // @author Zzbaivong // @oujs:author baivong // @license MIT; https://baivong.mit-license.org/license.txt // @match https://worldcosplay.net/*/photos* // @match https://worldcosplay.net/*/favorites* // @match https://worldcosplay.net/photo/* // @match https://worldcosplay.net/tag/* // @match https://worldcosplay.net/search/photos?* // @match https://worldcosplay.net/collections/* // @match https://worldcosplay.net/character/* // @match https://worldcosplay.net/title/* // @match https://worldcosplay.net/photos // @match https://worldcosplay.net/popular // @match https://worldcosplay.net/ranking/good* // @match https://worldcosplay.net/member/*/characters/* // @match https://worldcosplay.net/*/photo/* // @match https://worldcosplay.net/*/tag/* // @match https://worldcosplay.net/*/search/photos?* // @match https://worldcosplay.net/*/collections/* // @match https://worldcosplay.net/*/character/* // @match https://worldcosplay.net/*/title/* // @match https://worldcosplay.net/*/photos // @match https://worldcosplay.net/*/popular // @match https://worldcosplay.net/*/ranking/good* // @match https://worldcosplay.net/*/member/*/characters/* // @require https://code.jquery.com/jquery-3.3.1.slim.min.js // @require https://unpkg.com/file-saver@2.0.1/dist/FileSaver.min.js // @require https://greasyfork.org/scripts/6250-waitforkeyelements/code/waitForKeyElements.js?version=23756 // @require https://greasemonkey.github.io/gm4-polyfill/gm4-polyfill.js?v=a834d46 // @noframes // @connect self // @connect sakurastorage.jp // @supportURL https://github.com/lelinhtinh/Userscript/issues // @run-at document-idle // @grant GM.xmlHttpRequest // @grant GM_xmlhttpRequest // @grant GM.openInTab // @grant GM_openInTab // ==/UserScript== /* global waitForKeyElements */ (function($, window) { 'use strict'; window.URL = window.URL || window.webkitURL; function downloadPhoto(el, url) { var photoName = url.replace(/.*\//g, ''), $icon = $(el).find('.fa'); $icon.addClass('fa-spinner fa-spin'); GM.xmlHttpRequest({ method: 'GET', url: url, responseType: 'blob', onload: function(response) { var blob = response.response; $(el) .attr({ href: window.URL.createObjectURL(blob), download: photoName, }) .off('click'); $icon.removeClass('fa-spinner fa-spin').addClass('fa-download'); saveAs(blob, photoName); }, onerror: function(err) { $icon.removeClass('fa-spinner fa-spin').addClass('fa-times'); console.error(err); }, }); } function getImage3000(url) { var hasMax = url.match(/\/max-(\d+)\//); if (hasMax) return url.replace(/-[\dx]+\./, '-' + hasMax[1] + '.'); return url.replace(/-[\dx]+\./, '-3000.'); } if (/^(\/[a-z-]+)?\/photo\/\d+$/.test(location.pathname)) { var $btn = $('<a>', { href: '#download', class: 'download-this-photo', title: 'Click to download this image\nRight Click to open in new tab', html: '<div class="side_buttons" style="right: 250px;"><div class="like-this-photo button fave fa fa-download"><div class="effect-ripple"></div></div></div>', }), img = $('#photoContainer') .find('.img') .attr('src'); $btn .on('click', function(e) { e.preventDefault(); e.stopPropagation(); downloadPhoto(this, getImage3000(img)); }) .on('contextmenu', function(e) { e.preventDefault(); e.stopPropagation(); GM.openInTab(getImage3000(img)); }); $btn.insertAfter('.side_buttons'); } else { var addBtn = function() { $('.preview') .not('.added-download-btn') .each(function() { var $this = $(this), $btn = $('<a>', { href: '#download', class: 'download-this-photo', title: 'Click to download this image\nRight Click to open in new tab', html: '<div class="item likes" style="top: 50px;"><span class="like-this-photo"><i class="fa fa-download"></i><span class="effect-ripple"></span></span></div>', }); $btn .on('click', function(e) { e.preventDefault(); e.stopPropagation(); downloadPhoto( this, getImage3000( $this .find('.photo_img') .css('backgroundImage') .slice(5, -2) ) ); }) .on('contextmenu', function(e) { e.preventDefault(); e.stopPropagation(); GM.openInTab( getImage3000( $this .find('.photo_img') .css('backgroundImage') .slice(5, -2) ) ); }); $this.find('.options').append($btn); $this.addClass('added-download-btn'); }); }; addBtn(); waitForKeyElements('.preview', addBtn); } })(jQuery, window);