Volafile Upload-Helper

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.

目前为 2021-05-10 提交的版本。查看 最新版本

  1. // ==UserScript==
  2. // @name Volafile Upload-Helper
  3. // @author Arnold François Lecherche and a Vola anon named Adonis
  4. // @namespace greasyfork.org
  5. // @icon https://volafile.org/favicon.ico
  6. // @version 1.01
  7. // @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.
  8. // @include http://volafile.org/*
  9. // @include http://*.volafile.org/*
  10. // @include https://volafile.org/*
  11. // @include https://*.volafile.org/*
  12. // @grant none
  13. // @run-at document-end
  14. // @copyright 2021 Arnold François Lecherche
  15. // ==/UserScript==
  16. (function (w, d, M) {
  17. 'use strict';
  18. var a = false, dlcss = d.createElement('style'),
  19. nbRegEx = /^(?:[a-zA-Z0-9-]{3,},)*[a-zA-Z0-9-]{3,}|none$|^$/,
  20. commasRegExp = /,+$/, commaRegExp = /,/g, extRegExp = /\..+/,
  21. c, ulmenu, ub, r, ex, up, ftt, k;
  22. function getStatusText(t) {
  23. var server, name, blocklist, dl, dlclass;
  24. if (this.upload.currentAttempt && this.upload.currentAttempt.info && this.upload.file.size > 1e3) {
  25. server = this.upload.currentAttempt.info.server;
  26. name = this.file.dom.nameElement;
  27. blocklist = new RegExp((c.ulblock || 'none').replace(commasRegExp, '').replace(commaRegExp, '\\\.|') + '\\\.');
  28. if (blocklist.test(server.replace(extRegExp, '.'))) {
  29. this.upload.tries -= 0.9;
  30. name.className = 'file_name';
  31. this.upload.currentAttempt.abort();
  32. } else {
  33. dl = this.upload.currentAttempt.info.server.replace(extRegExp, '');
  34. dlclass = 'dl_' + dl;
  35. if (!name.classList.contains('dlnum')) {
  36. name.classList.add('dlnum', dlclass);
  37. if (dlcss.textContent.indexOf(dlclass) === -1) dlcss.textContent += '\n.' + dlclass + ':after{content:" \u2022 ' + dl + '\xA0"}';
  38. }
  39. }
  40. }
  41. return this.getStatusText_2(t);
  42. }
  43. function remove() {
  44. if ('undefined' === typeof e) return;
  45. e.removeTimeout = null;
  46. e.forceRemove();
  47. }
  48. function setRemoveTimeout(t) {
  49. if (this.error) {
  50. this.file.dom.nameElement.innerHTML += ' &bull; [<b>UPLOAD FAILED</b>]';
  51. return;
  52. }
  53. if (this.removeTimeout) w.clearTimeout(this.removeTimeout);
  54. this.removeTimeout = w.setTimeout(remove, t);
  55. }
  56. function isUploading() {
  57. var uppy = [up.uploadQueue.uploadQueue, up.runningUploads], i = uppy.length, j;
  58. while (i--) {
  59. j = uppy[i].length;
  60. while (j--) {
  61. uppy[i][j].getStatusText_2 = uppy[i][j].getStatusText_2 || uppy[i][j].getStatusText;
  62. uppy[i][j].getStatusText = getStatusText;
  63. uppy[i][j].setRemoveTimeout = setRemoveTimeout;
  64. }
  65. }
  66. return this.runningUploads.length > 0 || this.uploadQueue.length() > 0;
  67. }
  68. function addFileInfo(t, e) {
  69. var dl, dlclass, a, name;
  70. if (e && e.id && e.thumb) {
  71. dl = e.thumb.server.replace(extRegExp, '');
  72. dlclass = 'dl_' + dl;
  73. a = t.layout.elem;
  74. name = a.querySelector('.file_name');
  75. if (name && !name.classList.contains('dlnum')) {
  76. name.classList.add('dlnum', dlclass);
  77. if (dlcss.textContent.indexOf(dlclass) === -1) dlcss.textContent += '\n.' + dlclass + ':after{content:" \u2022 ' + dl + '\xA0"}';
  78. //ex.filelist.files_by_id[e.id].name += '@' + dl + '$';
  79. //a.href = a.href.replace('//volafile.org', '//'+e.thumb.server);
  80. }
  81. }
  82. this.addFileInfo_2(t, e);
  83. }
  84. function set_mcu() {
  85. var mcu = M.floor(prompt('config.max_concurrent_uploads', c.max_concurrent_uploads));
  86. if (mcu != mcu || mcu < 1 || mcu > 10) return;
  87. this.innerText = '⮅ ' + (c.max_concurrent_uploads = mcu);
  88. }
  89. function set_block() {
  90. var block = prompt('Enter a comma-separated list of server prefixes to block, e.g. "dl8" or "dl7,dl8" (without quotes).', c.ulblock);
  91. if (block === null || block === false || !nbRegEx.test(block)) return;
  92. this.innerText = '⦸ ' + (c.ulblock = block);
  93. }
  94. function init() {
  95. if (a) return k && w.clearInterval(k);
  96. else k = k || w.setInterval(init, 1e3);
  97. c = w.config;
  98. if (!c) return;
  99. ulmenu = d.getElementById('ulmenu') || d.createElement('div');
  100. r = w.RoomInstance;
  101. if (!r) return;
  102. ex = r.extensions;
  103. up = ex.upload;
  104. up.isUploading = isUploading;
  105. ftt = ex.fileTooltips;
  106. ftt.addFileInfo_2 = ftt.addFileInfo_2 || ftt.addFileInfo;
  107. ftt.addFileInfo = addFileInfo;
  108. ulmenu.id = 'ulmenu';
  109. ulmenu.setAttribute('style', 'display:inline-block;font-size:0.9em');
  110. ulmenu.innerHTML = '<a class="button" id="ul_mcu" title="set max concurrent uploads">⮅</a> ' +
  111. '<a class="button" id="ul_block" title="set upload blacklist">⦸</a> &nbsp;';
  112. ub = d.getElementById('upload_container');
  113. ub.insertBefore(ulmenu, ub.firstChild);
  114. d.getElementById('ul_mcu').addEventListener('click', set_mcu, false);
  115. d.getElementById('ul_block').addEventListener('click', set_block, false);
  116. a = true;
  117. if (k) w.clearInterval(k);
  118. }
  119. dlcss.textContent = '.dlnum:after {font-style:italic;opacity:0.5}';
  120. d.documentElement.appendChild(dlcss);
  121. init();
  122. d.addEventListener('DOMContentLoaded', init, false);
  123. w.addEventListener('load', init, false);
  124. })(window, document, Math);