您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Helps Volafile users avoid certain problematic servers when uploading files, shows what server each file was uploaded to on hover, and allows raising the parallel-upload limit, up to 10.
// ==UserScript== // @name Volafile Upload-Helper // @author Arnold François Lecherche and a Vola anon named Adonis // @namespace greasyfork.org // @icon https://volafile.org/favicon.ico // @version 1.01 // @description Helps Volafile users avoid certain problematic servers when uploading files, shows what server each file was uploaded to on hover, and allows raising the parallel-upload limit, up to 10. // @include http://volafile.org/* // @include http://*.volafile.org/* // @include https://volafile.org/* // @include https://*.volafile.org/* // @grant none // @run-at document-end // @copyright 2021 Arnold François Lecherche // ==/UserScript== (function (w, d, M) { 'use strict'; var a = false, dlcss = d.createElement('style'), nbRegEx = /^(?:[a-zA-Z0-9-]{3,},)*[a-zA-Z0-9-]{3,}|none$|^$/, commasRegExp = /,+$/, commaRegExp = /,/g, extRegExp = /\..+/, c, ulmenu, ub, r, ex, up, ftt, k; function getStatusText(t) { var server, name, blocklist, dl, dlclass; if (this.upload.currentAttempt && this.upload.currentAttempt.info && this.upload.file.size > 1e3) { server = this.upload.currentAttempt.info.server; name = this.file.dom.nameElement; blocklist = new RegExp((c.ulblock || 'none').replace(commasRegExp, '').replace(commaRegExp, '\\\.|') + '\\\.'); if (blocklist.test(server.replace(extRegExp, '.'))) { this.upload.tries -= 0.9; name.className = 'file_name'; this.upload.currentAttempt.abort(); } else { dl = this.upload.currentAttempt.info.server.replace(extRegExp, ''); dlclass = 'dl_' + dl; if (!name.classList.contains('dlnum')) { name.classList.add('dlnum', dlclass); if (dlcss.textContent.indexOf(dlclass) === -1) dlcss.textContent += '\n.' + dlclass + ':after{content:" \u2022 ' + dl + '\xA0"}'; } } } return this.getStatusText_2(t); } function remove() { if ('undefined' === typeof e) return; e.removeTimeout = null; e.forceRemove(); } function setRemoveTimeout(t) { if (this.error) { this.file.dom.nameElement.innerHTML += ' • [<b>UPLOAD FAILED</b>]'; return; } if (this.removeTimeout) w.clearTimeout(this.removeTimeout); this.removeTimeout = w.setTimeout(remove, t); } function isUploading() { var uppy = [up.uploadQueue.uploadQueue, up.runningUploads], i = uppy.length, j; while (i--) { j = uppy[i].length; while (j--) { uppy[i][j].getStatusText_2 = uppy[i][j].getStatusText_2 || uppy[i][j].getStatusText; uppy[i][j].getStatusText = getStatusText; uppy[i][j].setRemoveTimeout = setRemoveTimeout; } } return this.runningUploads.length > 0 || this.uploadQueue.length() > 0; } function addFileInfo(t, e) { var dl, dlclass, a, name; if (e && e.id && e.thumb) { dl = e.thumb.server.replace(extRegExp, ''); dlclass = 'dl_' + dl; a = t.layout.elem; name = a.querySelector('.file_name'); if (name && !name.classList.contains('dlnum')) { name.classList.add('dlnum', dlclass); if (dlcss.textContent.indexOf(dlclass) === -1) dlcss.textContent += '\n.' + dlclass + ':after{content:" \u2022 ' + dl + '\xA0"}'; //ex.filelist.files_by_id[e.id].name += '@' + dl + '$'; //a.href = a.href.replace('//volafile.org', '//'+e.thumb.server); } } this.addFileInfo_2(t, e); } function set_mcu() { var mcu = M.floor(prompt('config.max_concurrent_uploads', c.max_concurrent_uploads)); if (mcu != mcu || mcu < 1 || mcu > 10) return; this.innerText = '⮅ ' + (c.max_concurrent_uploads = mcu); } function set_block() { var block = prompt('Enter a comma-separated list of server prefixes to block, e.g. "dl8" or "dl7,dl8" (without quotes).', c.ulblock); if (block === null || block === false || !nbRegEx.test(block)) return; this.innerText = '⦸ ' + (c.ulblock = block); } function init() { if (a) return k && w.clearInterval(k); else k = k || w.setInterval(init, 1e3); c = w.config; if (!c) return; ulmenu = d.getElementById('ulmenu') || d.createElement('div'); r = w.RoomInstance; if (!r) return; ex = r.extensions; up = ex.upload; up.isUploading = isUploading; ftt = ex.fileTooltips; ftt.addFileInfo_2 = ftt.addFileInfo_2 || ftt.addFileInfo; ftt.addFileInfo = addFileInfo; ulmenu.id = 'ulmenu'; ulmenu.setAttribute('style', 'display:inline-block;font-size:0.9em'); ulmenu.innerHTML = '<a class="button" id="ul_mcu" title="set max concurrent uploads">⮅</a> ' + '<a class="button" id="ul_block" title="set upload blacklist">⦸</a> '; ub = d.getElementById('upload_container'); ub.insertBefore(ulmenu, ub.firstChild); d.getElementById('ul_mcu').addEventListener('click', set_mcu, false); d.getElementById('ul_block').addEventListener('click', set_block, false); a = true; if (k) w.clearInterval(k); } dlcss.textContent = '.dlnum:after {font-style:italic;opacity:0.5}'; d.documentElement.appendChild(dlcss); init(); d.addEventListener('DOMContentLoaded', init, false); w.addEventListener('load', init, false); })(window, document, Math);