(New) Baidu™ WebDisk Helper v2 (dupan-helper)

Enhancements for Baidu™ WebDisk.

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==UserScript==
// @name              新度盘助手 (v2)
// @name:en           (New) Baidu™ WebDisk Helper v2 (dupan-helper)
// @namespace         moe.jixun.dupan.v2
// @version           0.0.1
// @description       度盘增强
// @description:en    Enhancements for Baidu™ WebDisk.
// @author            Jixun<https://jixun.moe/>

// @match             https://pan.baidu.com/disk/main*
// @match             https://yun.baidu.com/disk/main*

// @compatible        chrome Violentmonkey

// @license           BSD-3-Clause
// @homepageURL       https://github.com/jixunmoe/dupan-helper-v2/
// @supportURL        https://github.com/jixunmoe/dupan-helper-v2/issues
// @contributionURL   https://jixun.moe/donate

// @grant             none
// @run-at            document-start
// ==/UserScript==

function entryPoint () {
  "use strict";
  
  var css_248z$2 =
    ".jx-align-right {\n  text-align: right;\n}\n\n.jx-compact-form-items .u-form-item--small.u-form-item {\n  margin-bottom: 0;\n}\n\n.jx-compact-form-items .u-form-item--small .u-form-item__label {\n  font-family: sans-serif;\n  width: 7em;\n  text-align: right;\n  user-select: none;\n  line-height: 1.25em;\n}\n\n.jx-compact-form-items .u-form-item--small .u-form-item__content {\n  line-height: 1.25em;\n  overflow: hidden;\n}\n";
  styleInject(css_248z$2);
  
  const CHUNK_EARLY_HOOK = "home";
  const ENTRY_ID = "jixun: entry :D";
  const __default = "a";
  // module name
  var WEBPACK_MODULE_ID;
  (function (WEBPACK_MODULE_ID) {
    WEBPACK_MODULE_ID["RegisterComponent"] = "0083";
    WEBPACK_MODULE_ID["Globals"] = "49fe";
    WEBPACK_MODULE_ID["Vue"] = "7231";
    WEBPACK_MODULE_ID["PolyfillMakeClass"] = "1586";
  })(WEBPACK_MODULE_ID || (WEBPACK_MODULE_ID = {}));
  // require.x keys
  var WEBPACK_REQUIRE_KEYS;
  (function (WEBPACK_REQUIRE_KEYS) {
    WEBPACK_REQUIRE_KEYS["CACHED_MODULES"] = "c";
    WEBPACK_REQUIRE_KEYS["EXPORT_ES6_MEMBER"] = "d";
  })(WEBPACK_REQUIRE_KEYS || (WEBPACK_REQUIRE_KEYS = {}));
  // module keys
  var WEBPACK_MODULE_KEYS;
  (function (WEBPACK_MODULE_KEYS) {
    WEBPACK_MODULE_KEYS["MODULE_ID"] = "i";
    WEBPACK_MODULE_KEYS["MODULE_LOADED"] = "l";
    WEBPACK_MODULE_KEYS["EXPORTS"] = "exports";
  })(WEBPACK_MODULE_KEYS || (WEBPACK_MODULE_KEYS = {}));
  const EVENTS = {
    SHOW_CODE_UPLOAD_DIALOG: Symbol("SHOW_CODE_UPLOAD_DIALOG"),
    ADD_RAPID_UPLOAD_TASKS: Symbol("ADD_RAPID_UPLOAD_TASKS"),
  };
  
  class DelayedValue {
    constructor() {
      this.queue = [];
      this.setValue = (value) => {
        this.value = value;
        for (const resolve of this.queue) {
          resolve(value);
        }
        this.queue = [];
      };
      this.getValue = () => {
        return this.value;
      };
      this.get = (callback) => {
        if (this.value !== undefined) {
          if (callback) {
            return callback(this.value);
          } else {
            return Promise.resolve(this.value);
          }
        }
        if (callback) {
          this.queue.push(callback);
        } else {
          return new Promise((resolve) => {
            this.queue.push(resolve);
          });
        }
      };
      this.getAsync = async () => {
        return new Promise((resolve) => {
          this.get(resolve);
        });
      };
    }
    get isSet() {
      return this.value !== undefined;
    }
  }
  
  var BAIDU_GLOBALS_KEY;
  (function (BAIDU_GLOBALS_KEY) {
    BAIDU_GLOBALS_KEY["SOME_API_URLS"] = "a";
    BAIDU_GLOBALS_KEY["ENTERPRISE_URLS"] = "b";
    BAIDU_GLOBALS_KEY["ERROR_MESSAGES"] = "c";
  })(BAIDU_GLOBALS_KEY || (BAIDU_GLOBALS_KEY = {}));
  const baiduContext = new DelayedValue();
  const baiduGlobals = new DelayedValue();
  
  const reorderMD5 = (str) => {
    return str.slice(8, 16) + str.slice(0, 8) + str.slice(24) + str.slice(16, 24);
  };
  const scrambleMD5 = (hash) => {
    // 百度的实现就是如此,应该是写错了?
    if (parseInt(hash) & Number(hash.length !== 32)) {
      return hash;
    }
    // 如果包含非法字符,不进行处理。
    // 可能是防止二次调用?
    if (/[^0-9a-f]/.test(hash)) {
      return hash;
    }
    let result = reorderMD5(hash)
      .split("")
      .map((c, i) => {
        let byte = (parseInt(c, 16) ^ i) & 0x0f;
        if (i === 9) {
          return String.fromCharCode(byte + 0x67);
        }
        return byte.toString(16);
      })
      .join("");
    // 百度的实现如此,补位 String.fromCharString(NaN) - 被转换为字符码 0 的字符串
    if (result.length < 10) result += "\x00";
    return result;
  };
  
  const URL_RAPID_UPLOAD = "/api/rapidupload";
  const DAYS_IN_SECONDS = 86400;
  const DAYS_90 = DAYS_IN_SECONDS * 90;
  const DAYS_180 = DAYS_IN_SECONDS * 180;
  const rand = (a, b) => (b - a) * Math.random();
  const generateMTime = () => (Date.now() / 1000 - rand(DAYS_90, DAYS_180)) | 0;
  class BaiduUploadAPI {
    constructor() {
      baiduContext.get((baidu) => {
        this.baidu = baidu;
      });
    }
    async rapidUpload(opt) {
      if (!this.baidu) {
        return Promise.reject("Baidu Context 尚未初始化");
      }
      const { ctx } = this.baidu;
      const { replaceType, name, sliceMD5, contentMD5, size } = opt;
      const { bdstoken } = ctx.yunData;
      const dirPath = ctx.currentPath;
      const fullPath = dirPath + "/" + name;
      return ctx.$http.request({
        url: `${URL_RAPID_UPLOAD}?rtype=${replaceType}&bdstoken=${bdstoken}`,
        method: "POST",
        data: {
          path: fullPath,
          "content-length": size,
          "content-md5": scrambleMD5(contentMD5),
          "slice-md5": scrambleMD5(sliceMD5),
          target_path: dirPath,
          local_mtime: generateMTime(),
        },
      });
    }
  }
  const baiduUploadAPI = new BaiduUploadAPI();
  
  class EventBus {
    constructor() {
      this.handler = new Map();
    }
    on(name, callback) {
      if (this.handler.has(name)) {
        this.handler.get(name)?.add(callback);
      } else {
        this.handler.set(name, new Set([callback]));
      }
    }
    off(name, callback) {
      if (!callback) {
        this.handler.delete(name);
      } else if (this.handler.has(name)) {
        this.handler.get(name)?.delete(callback);
      }
    }
    emit(name, ...data) {
      const handlers = this.handler.get(name);
      if (handlers) {
        for (const callback of handlers) {
          callback.apply(null, data);
        }
      }
    }
  }
  const bus = new EventBus();
  
  bus.on(
    EVENTS.ADD_RAPID_UPLOAD_TASKS,
    async (items, replaceType, updateProgress) => {
      for (const item of items) {
        const { md5, md5s, name, size } = item;
        const resp = await baiduUploadAPI.rapidUpload({
          contentMD5: md5,
          sliceMD5: md5s,
          name,
          size,
          replaceType,
        });
        updateProgress(item, resp);
      }
      // 刷新所在目录
      const ctx = await baiduContext.getAsync();
      ctx.ctx.currentInstance.reloadList();
    }
  );
  
  class DelayedFunctionCall {
    constructor() {
      this.value = new DelayedValue();
      this.setImpl = (f) => {
        this.value.setValue(f);
      };
      this.getImpl = () => {
        return this.value.getValue();
      };
      this.call = (...args) => {
        return this.callWithContext(null, ...args);
      };
      this.callWithContext = (ctx, ...args) => {
        const f = this.value.getValue();
        if (f) {
          return f.apply(ctx, args);
        }
        return new Promise((resolve, reject) => {
          this.value.get((f) => {
            try {
              resolve(f.apply(ctx, args));
            } catch (err) {
              reject(err);
            }
          });
        });
      };
    }
  }
  
  const webpackRequire = new DelayedFunctionCall();
  const waitModuleLoad = new DelayedFunctionCall();
  function hookOnSet(obj, name, callback) {
    let value = obj[name];
    Object.defineProperty(obj, name, {
      configurable: false,
      enumerable: true,
      get() {
        return value;
      },
      set(v) {
        if (v !== value) {
          callback(v);
          value = v;
        }
      },
    });
  }
  function setWebpackRequire(require) {
    // DEBUG
    window.__require = require;
    webpackRequire.setImpl(require);
    waitModuleLoad.setImpl((moduleId, callback) => {
      hookOnSet(
        require[WEBPACK_REQUIRE_KEYS.CACHED_MODULES],
        moduleId,
        (module) => {
          hookOnSet(module, WEBPACK_MODULE_KEYS.MODULE_LOADED, (loaded) => {
            if (loaded) {
              callback(module, require);
            }
          });
        }
      );
    });
  }
  
  const Vue = new DelayedValue();
  
  const logFactory = (level) => {
    {
      return (..._) => {};
    }
  };
  const debug = logFactory();
  
  function hookMixinPluginContainer(createdFn) {
    return function () {
      const result = createdFn.apply(this, arguments);
      this.previewPlugin.push({
        compName: "JixunCodeUploadContainer",
        show: true,
        key: "Jixun Code Input Dialog",
        compProps: {
          fileMetaList: [],
          currentFileMeta: null,
          otherParam: null,
        },
      });
      return result;
    };
  }
  function hookListToolActions(listToolActions) {
    return function () {
      const result = listToolActions.apply(this, arguments);
      if (result?.[0]?.comp === "upload-button") {
        result.splice(1, 0, {
          comp: "JixunCodeUploadButton",
          evt: "instant-code-upload",
          icon: "u-icon-upper-shelf",
          plugin: "[email protected]",
          text: "秒传",
        });
      }
      // console.info("listToolActions:", result);
      return result;
    };
  }
  function hookComponentInit(componentInit) {
    return function (component) {
      debug("register component: ", component);
      if (component?.computed?.listToolActions) {
        component.computed.listToolActions = hookListToolActions(
          component.computed.listToolActions
        );
      }
      if (component?.computed?.hideHeader) {
        component.mixins?.forEach((plugin) => {
          if (plugin?.methods?.handlePreview && plugin.created) {
            plugin.created = hookMixinPluginContainer(plugin.created);
          }
        });
      }
      return componentInit.apply(this, arguments);
    };
  }
  
  var JixunButton = {
    render: function () {
      var _vm = this;
      var _h = _vm.$createElement;
      var _c = _vm._self._c || _h;
      return _c(
        "u-button",
        _vm._g(
          {
            attrs: {
              size: "medium",
              round: "",
              nativeType: "button",
              disabled: _vm.disabled,
              type: _vm.primary ? "primary" : "",
            },
          },
          _vm.$listeners
        ),
        [_vm._t("default")],
        2
      );
    },
    props: {
      primary: {
        type: Boolean,
        default: false,
      },
      disabled: {
        type: Boolean,
        default: false,
      },
    },
  };
  
  var css_248z$1 =
    "\r\na.jx-upload-button-container {\r\n  margin-left: 0.5em;\r\n}\r\n\r\n  a.jx-upload-button-container > button {\r\n    display: inline-flex;\r\n    align-items: center;\r\n    justify-content: center;\r\n\r\n    background-color: #ac13f2;\r\n    border: 1px solid #eeabf4;\r\n\r\n    transition: all 0.3s;\r\n  }\r\n\r\n  a.jx-upload-button-container > button:hover,\r\n    a.jx-upload-button-container > button:focus {\r\n      background-color: #890fc2;\r\n      border-color: #eeabf4;\r\n    }\r\n";
  styleInject(css_248z$1);
  
  var JixunCodeUploadButton = {
    render: function () {
      var _vm = this;
      var _h = _vm.$createElement;
      var _c = _vm._self._c || _h;
      return _c(
        "a",
        {
          staticClass:
            "nd-upload-button upload-wrapper jx-upload-button-container",
        },
        [
          _c(
            "u-button",
            {
              staticClass: "nd-file-list-toolbar-action-item",
              class: { "is-has-icon": _vm.conf.icon },
              attrs: {
                size: "small",
                round: "",
                type: "primary",
                icon: "u-icon " + _vm.conf.icon,
              },
              on: { click: _vm.handleClick },
            },
            [_vm._v("\n    " + _vm._s(_vm.conf.text) + "\n  ")]
          ),
        ],
        1
      );
    },
    props: {
      conf: {
        type: Object,
        default: function () {},
      },
    },
    methods: {
      handleClick: function () {
        bus.emit(EVENTS.SHOW_CODE_UPLOAD_DIALOG);
      },
    },
  };
  
  var css_248z =
    "\n.jx-dialog {\n  margin-top: 24px;\n  color: #424e67;\n}\n\n  .jx-dialog textarea {\n    width: 100%;\n    min-height: 10em;\n    border: 1px solid #ccc;\n  }\n\n  .jx-dialog p {\n    padding-top: 0.55em;\n  }\n\n  .jx-dialog label > span {\n      cursor: pointer;\n    }\n";
  styleInject(css_248z);
  
  const hex = (value) => {
    const hex = Math.floor(value).toString(16);
    return `0${hex}`.slice(-2);
  };
  /**
   * UTF-8 字符转换成 base64 后在 JS 里解析会出毛病。
   * 这个转换会进行一些特别的纠正。
   */
  const decodeBase64 = (str) => {
    try {
      str = atob(str);
    } catch (e) {
      console.error("base64 decode failed: %s", str);
      return "";
    }
    return decodeURIComponent(
      str.replace(/[^\x00-\x7F]/g, (z) => `%${hex(z.charCodeAt(0))}`)
    );
  };
  
  const slice = Function.prototype.call.bind(Array.prototype.slice);
  /**
   * 一个简单的类似于 NodeJS Buffer 的实现.
   * 用于解析游侠度娘提取码。
   */
  class SimpleBuffer {
    constructor(str) {
      this.buf = new Uint8Array();
      this.fromString(str);
    }
    fromString(str) {
      const len = str.length;
      this.buf = new Uint8Array(len);
      for (let i = 0; i < len; i++) {
        this.buf[i] = str.charCodeAt(i);
      }
    }
    readUnicode(index, size) {
      const bufText = slice(this.buf, index, index + size).map(hex);
      const buf = [""];
      for (let i = 0; i < size; i += 2) {
        buf.push(bufText[i + 1] + bufText[i]);
      }
      return JSON.parse(`"${buf.join("\\u")}"`);
    }
    /**
     * Read a number (Big Endian) from buffer.
     * @param index Index
     * @param size Integer size
     * @returns {number} an integer representing the value at given index
     */
    readNumber(index, size) {
      let ret = 0;
      for (let i = index + size; i > index; i--) {
        // 2^8 = 256
        ret = this.buf[i] + ret * 256;
      }
      return ret;
    }
    readUInt(index) {
      return this.readNumber(index, 4);
    }
    readULong(index) {
      return this.readNumber(index, 8);
    }
    readHex(index, size) {
      const blob = slice(this.buf, index, index + size);
      return blob.map(hex).join("");
    }
  }
  
  const trim = (str) => String.prototype.trim.call(str);
  /**
   * 百度网盘用的(非官方)标准提取码。
   * 支持解析:
   * 1. 游侠的 `BDLINK` 提取码
   * 2. 我的“标准提取码”
   * 3. PanDownload 的 `bdpan://` 协议。
   */
  class DuParser {
    constructor() {
      this.results = [];
      this.versions = new Set();
      this.reset();
    }
    reset() {
      this.results = [];
      this.versions = new Set();
    }
    /**
     * 判断地址类型并解析。
     * @param url
     */
    parse(url) {
      this.reset();
      // 游侠的格式是多行,不好判断结束位置。
      // 所以一次只能解析一条数据。
      if (url.indexOf("BDLINK") === 0) {
        this.parseAli(url);
        return;
      }
      // 其他两个格式一行一个文件信息。
      const links = url.split("\n").map(trim);
      for (const link of links) {
        if (link.startsWith("bdpan://")) {
          this.parsePanDownload(link);
        } else {
          this.parseStandard(link);
        }
      }
    }
    get hasResults() {
      return this.results.length;
    }
    parseAli(url) {
      const raw = atob(url.slice(6).replace(/\s/g, ""));
      if (raw.slice(0, 5) !== "BDFS\x00") return null;
      const buf = new SimpleBuffer(raw);
      let ptr = 9;
      const fileCount = buf.readUInt(5);
      if (fileCount === 0) {
        return null;
      }
      this.versions.add("游侠 v1");
      for (let i = 0; i < fileCount; i++) {
        // 大小 (8 bytes)
        // MD5 + MD5S (0x20)
        // nameSize (4 bytes)
        // Name (unicode)
        const fileInfo = Object.create(null);
        fileInfo.size = buf.readULong(ptr);
        fileInfo.md5 = buf.readHex(ptr + 8, 0x10);
        fileInfo.md5s = buf.readHex(ptr + 0x18, 0x10);
        const sizeofName = buf.readUInt(ptr + 0x28) * 2;
        ptr += 0x2c;
        fileInfo.name = buf.readUnicode(ptr, sizeofName);
        this.results.push(fileInfo);
        ptr += sizeofName;
      }
      return true;
    }
    parseStandard(line) {
      const match = line.match(
        /^([\dA-F]{32})#([\dA-F]{32})#([\d]{1,20})#([\s\S]+)$/i
      );
      if (match) {
        const [, md5, md5s, size, name] = match;
        this.versions.add("梦姬标准");
        this.results.push({
          md5,
          md5s,
          size: parseInt(size, 10),
          name,
        });
      }
      return null;
    }
    parsePanDownload(line) {
      const match = decodeBase64(line.slice(8)).match(
        /^([\s\S]+)\|([\d]{1,20})\|([\dA-F]{32})\|([\dA-F]{32})$/i
      );
      if (match) {
        const [, name, size, md5, md5s] = match;
        this.versions.add("PanDownload");
        this.results.push({
          md5,
          md5s,
          size: parseInt(size, 10),
          name,
        });
      }
      return null;
    }
  }
  
  var RAPID_UPLOAD_REPLACE;
  (function (RAPID_UPLOAD_REPLACE) {
    RAPID_UPLOAD_REPLACE[(RAPID_UPLOAD_REPLACE["FAILURE"] = 0)] = "FAILURE";
    RAPID_UPLOAD_REPLACE[(RAPID_UPLOAD_REPLACE["DUPLICATE"] = 1)] = "DUPLICATE";
    // UNKNOWN_REPLACE_RULE = 2,
    RAPID_UPLOAD_REPLACE[(RAPID_UPLOAD_REPLACE["REPLACE"] = 3)] = "REPLACE";
  })(RAPID_UPLOAD_REPLACE || (RAPID_UPLOAD_REPLACE = {}));
  
  /**
   * 将数字形式的文件大小转换为更可读的文本形式
   */
  function readableSize(size) {
    let unit = "MiB";
    let sizeInUnit = size / 1024 / 1024;
    // 超过 GB
    if (sizeInUnit > 1024) {
      unit = "GiB";
      sizeInUnit /= 1024;
    }
    return `${sizeInUnit.toFixed(2)} ${unit}`;
  }
  
  var JixunBaiduError = {
    render: function () {
      var _vm = this;
      var _h = _vm.$createElement;
      var _c = _vm._self._c || _h;
      return _c("span", [
        _vm._v(_vm._s(_vm.text) + " (错误码 " + _vm._s(_vm.errno) + ")"),
      ]);
    },
    props: {
      errno: Number,
    },
    data() {
      return {
        text: "",
      };
    },
    async created() {
      const globals = await baiduGlobals.get();
      const ctx = await baiduContext.get();
      let message = globals[BAIDU_GLOBALS_KEY.ERROR_MESSAGES][this.errno];
      if (!message) {
        message = `未知错误`;
      } else if (typeof message === "function") {
        message = message(ctx.ctx.userInfo);
      }
      this.text = message.replace(/<\/?.*?>/g, "").replace(/\s+/, " ");
    },
  };
  
  var JixunDuParseEntryFormItems = {
    render: function () {
      var _vm = this;
      var _h = _vm.$createElement;
      var _c = _vm._self._c || _h;
      return _c(
        "div",
        [
          _c("u-form-item", { attrs: { label: "文件名" } }, [
            _c("code", [_vm._v(_vm._s(_vm.data.name))]),
          ]),
          _vm._v(" "),
          _c("u-form-item", { attrs: { label: "文件大小" } }, [
            _c("code", [_vm._v(_vm._s(_vm.readableSize(_vm.data.size)))]),
          ]),
          _vm._v(" "),
          _c("u-form-item", { attrs: { label: "文件 MD5" } }, [
            _c("code", [_vm._v(_vm._s(_vm.data.md5))]),
          ]),
          _vm._v(" "),
          _c("u-form-item", { attrs: { label: "首片 MD5" } }, [
            _c("code", [_vm._v(_vm._s(_vm.data.md5s))]),
          ]),
        ],
        1
      );
    },
    props: {
      data: {
        type: Object,
      },
    },
    methods: {
      readableSize,
    },
  };
  
  var JixunUploadResultTable = {
    render: function () {
      var _vm = this;
      var _h = _vm.$createElement;
      var _c = _vm._self._c || _h;
      return _c(
        "section",
        { staticClass: "jx-compact-form-items" },
        [
          _c(
            "u-table",
            {
              attrs: {
                data: _vm.data,
                height: _vm.height,
                "row-key": "request_id",
                stripe: true,
                size: "small",
              },
            },
            [
              _c("u-table-column", {
                attrs: { type: "expand" },
                scopedSlots: _vm._u([
                  {
                    key: "default",
                    fn: function (scope) {
                      return [
                        _c(
                          "u-form",
                          { attrs: { "label-position": "left", size: "small" } },
                          [
                            _c("jixun-du-parse-entry-form-items", {
                              attrs: { data: scope.row },
                            }),
                            _vm._v(" "),
                            _c(
                              "u-form-item",
                              { attrs: { label: "上传结果" } },
                              [
                                _c("jixun-baidu-error", {
                                  attrs: { errno: scope.row.errno },
                                }),
                              ],
                              1
                            ),
                            _vm._v(" "),
                            _c("u-form-item", { attrs: { label: "提取码" } }, [
                              _c("pre", [_vm._v(_vm._s(_vm.toCode(scope.row)))]),
                            ]),
                          ],
                          1
                        ),
                      ];
                    },
                  },
                ]),
              }),
              _vm._v(" "),
              _c("u-table-column", {
                attrs: { prop: "name", label: "文件名" },
                scopedSlots: _vm._u([
                  {
                    key: "default",
                    fn: function (scope) {
                      return [_c("code", [_vm._v(_vm._s(scope.row.name))])];
                    },
                  },
                ]),
              }),
              _vm._v(" "),
              _c("u-table-column", {
                attrs: { prop: "result", label: "结果", width: "80" },
                scopedSlots: _vm._u([
                  {
                    key: "default",
                    fn: function (scope) {
                      return [
                        _c(
                          "u-tag",
                          {
                            attrs: { type: scope.row.resultType, effect: "dark" },
                          },
                          [
                            _vm._v(
                              "\n          " +
                                _vm._s(scope.row.result) +
                                "\n        "
                            ),
                          ]
                        ),
                      ];
                    },
                  },
                ]),
              }),
            ],
            1
          ),
        ],
        1
      );
    },
    components: { JixunBaiduError, JixunDuParseEntryFormItems },
    props: {
      data: {
        type: [],
        required: true,
      },
    },
    methods: {
      readableSize,
      toCode(entry) {
        const { name, size, md5, md5s } = entry;
        return `${md5}#${md5s}#${size}#${name}`;
      },
    },
  };
  
  var JixunCodeUploadDialog = {
    render: function () {
      var _vm = this;
      var _h = _vm.$createElement;
      var _c = _vm._self._c || _h;
      return _c(
        "div",
        { staticClass: "nd-dialog-common" },
        [
          _vm.showForm
            ? _c(
                "u-dialog",
                {
                  staticClass: "u-dialog__wrapper nd-dialog-common-header",
                  attrs: {
                    title: "标准提取码",
                    width: "600px",
                    lockScroll: false,
                    visible: true,
                  },
                  on: { "update:visible": _vm.updateVisible },
                },
                [
                  _c(
                    "div",
                    { staticClass: "jx-dialog" },
                    [
                      _c("section", [
                        _c(
                          "label",
                          [
                            _c("span", [_vm._v("秒传链接,一行一个:")]),
                            _vm._v(" "),
                            _c("u-input", {
                              attrs: {
                                type: "textarea",
                                rows: 5,
                                placeholder: "请输入内容",
                              },
                              on: { input: _vm.validateLinks },
                              model: {
                                value: _vm.links,
                                callback: function ($v) {
                                  _vm.links = $v;
                                },
                                expression: "links",
                              },
                            }),
                          ],
                          1
                        ),
                      ]),
                      _vm._v(" "),
                      _c(
                        "p",
                        [
                          _c("span", [_vm._v("文件重复时:")]),
                          _vm._v(" "),
                          _c(
                            "u-radio-group",
                            {
                              attrs: { size: "small" },
                              model: {
                                value: _vm.ondup,
                                callback: function ($v) {
                                  _vm.ondup = $v;
                                },
                                expression: "ondup",
                              },
                            },
                            [
                              _c(
                                "u-radio-button",
                                {
                                  attrs: {
                                    label: _vm.RAPID_UPLOAD_REPLACE.DUPLICATE,
                                  },
                                },
                                [_vm._v("\n            建立副本\n          ")]
                              ),
                              _vm._v(" "),
                              _c(
                                "u-radio-button",
                                {
                                  attrs: {
                                    label: _vm.RAPID_UPLOAD_REPLACE.REPLACE,
                                  },
                                },
                                [_vm._v("\n            覆盖文件\n          ")]
                              ),
                            ],
                            1
                          ),
                        ],
                        1
                      ),
                      _vm._v(" "),
                      _c("jixun-du-parse-table", {
                        attrs: { data: _vm.previewResults, height: 180 },
                      }),
                    ],
                    1
                  ),
                  _vm._v(" "),
                  _c(
                    "div",
                    {
                      staticClass: "jx-align-right",
                      attrs: { slot: "footer" },
                      slot: "footer",
                    },
                    [
                      _c(
                        "jixun-button",
                        {
                          on: {
                            click: function ($event) {
                              return _vm.updateVisible(false);
                            },
                          },
                        },
                        [_vm._v("取消")]
                      ),
                      _vm._v(" "),
                      _c(
                        "jixun-button",
                        {
                          attrs: {
                            primary: "",
                            disabled: _vm.previewResults.length === 0,
                          },
                          on: { click: _vm.handleAddURL },
                        },
                        [_vm._v("\n        确定\n      ")]
                      ),
                    ],
                    1
                  ),
                ]
              )
            : _vm._e(),
          _vm._v(" "),
          _vm.showProgress
            ? _c(
                "u-dialog",
                {
                  staticClass: "u-dialog__wrapper nd-dialog-common-header",
                  attrs: {
                    title:
                      "标准提取码 - " +
                      (_vm.rapidUploadFinished ? "完成" : "进行中"),
                    width: "600px",
                    lockScroll: false,
                    visible: true,
                    "show-close": _vm.rapidUploadFinished,
                    "close-on-click-modal": _vm.rapidUploadFinished,
                    "close-on-press-escape": _vm.rapidUploadFinished,
                  },
                  on: { "update:visible": _vm.updateVisible },
                },
                [
                  _c(
                    "div",
                    { staticClass: "jx-dialog" },
                    [
                      _c("u-progress", {
                        attrs: { percentage: _vm.progress, status: "success" },
                      }),
                      _vm._v(" "),
                      _c("jixun-upload-result-table", {
                        attrs: { data: _vm.uploadResults, height: 180 },
                      }),
                    ],
                    1
                  ),
                ]
              )
            : _vm._e(),
        ],
        1
      );
    },
    components: { JixunUploadResultTable },
    data() {
      return {
        RAPID_UPLOAD_REPLACE,
        showForm: true,
        showProgress: false,
        parser: new DuParser(),
        ondup: RAPID_UPLOAD_REPLACE.DUPLICATE,
        radioOverwrite: 1111,
        links: "",
        previewResults: [],
        parsedLinks: [],
        uploadResults: [],
      };
    },
    computed: {
      progress() {
        if (this.rapidUploadFinished) {
          return 100;
        }
        return (this.uploadResults.length / this.parsedLinks.length) * 100;
      },
      rapidUploadFinished() {
        return this.uploadResults.length === this.parsedLinks.length;
      },
    },
    methods: {
      updateVisible(visible) {
        if (!visible) {
          this.$emit("hide");
        }
      },
      handleAddURL() {
        const results = this.parseLinks();
        if (results.length > 0) {
          this.showForm = false;
          this.resetProgress(results);
          this.showProgress = true;
          this.beginUpload();
        }
      },
      resetProgress(parsedLinks) {
        this.uploadResults = [];
        this.parsedLinks = parsedLinks;
      },
      beginUpload() {
        bus.emit(
          EVENTS.ADD_RAPID_UPLOAD_TASKS,
          this.parsedLinks,
          this.ondup,
          this.updateProgress
        );
      },
      updateProgress(entry, resp) {
        const success = resp.errno === 0;
        this.uploadResults.unshift({
          ...entry,
          ...resp,
          result: success ? "成功" : "失败",
          resultType: success ? "success" : "danger",
        });
      },
      validateLinks() {
        this.previewResults = this.parseLinks();
      },
      parseLinks() {
        this.parser.parse(this.links);
        return this.parser.results;
      },
    },
  };
  
  var JixunCodeUploadContainer = {
    render: function () {
      var _vm = this;
      var _h = _vm.$createElement;
      var _c = _vm._self._c || _h;
      return _vm.showCodeUploadDialog
        ? _c("jixun-code-upload-dialog", {
            on: {
              hide: function ($event) {
                _vm.showCodeUploadDialog = false;
              },
            },
          })
        : _vm._e();
    },
    components: { JixunCodeUploadDialog },
    beforeDestroy: function () {
      bus.off(EVENTS.SHOW_CODE_UPLOAD_DIALOG, this.renderCodeUploadDialog);
    },
    mounted: function () {
      bus.on(EVENTS.SHOW_CODE_UPLOAD_DIALOG, this.renderCodeUploadDialog);
    },
    data: function () {
      return {
        showCodeUploadDialog: false,
      };
    },
    methods: {
      renderCodeUploadDialog: function () {
        this.showCodeUploadDialog = true;
      },
    },
  };
  
  var JixunDuParseTable = {
    render: function () {
      var _vm = this;
      var _h = _vm.$createElement;
      var _c = _vm._self._c || _h;
      return _c(
        "section",
        { staticClass: "jx-compact-form-items" },
        [
          _c(
            "u-table",
            {
              attrs: {
                data: _vm.data,
                height: _vm.height,
                stripe: true,
                size: "small",
              },
            },
            [
              _c("u-table-column", {
                attrs: { type: "expand" },
                scopedSlots: _vm._u([
                  {
                    key: "default",
                    fn: function (scope) {
                      return [
                        _c(
                          "u-form",
                          { attrs: { "label-position": "left", size: "small" } },
                          [
                            _c("jixun-du-parse-entry-form-items", {
                              attrs: { data: scope.row },
                            }),
                          ],
                          1
                        ),
                      ];
                    },
                  },
                ]),
              }),
              _vm._v(" "),
              _c("u-table-column", {
                attrs: { prop: "name", label: "文件名" },
                scopedSlots: _vm._u([
                  {
                    key: "default",
                    fn: function (scope) {
                      return [_c("code", [_vm._v(_vm._s(scope.row.name))])];
                    },
                  },
                ]),
              }),
              _vm._v(" "),
              _c("u-table-column", {
                attrs: { prop: "size", label: "大小", width: "110" },
                scopedSlots: _vm._u([
                  {
                    key: "default",
                    fn: function (scope) {
                      return [
                        _c("code", [
                          _vm._v(_vm._s(_vm.readableSize(scope.row.size))),
                        ]),
                      ];
                    },
                  },
                ]),
              }),
            ],
            1
          ),
        ],
        1
      );
    },
    components: { JixunDuParseEntryFormItems },
    props: {
      data: {
        type: Array,
        required: true,
      },
      height: {
        type: Number,
        required: true,
      },
    },
    methods: {
      readableSize,
    },
  };
  
  /**
   * Register available components.
   * @param Vue
   * @param require
   */
  function registerComponents(Vue, require) {
    Vue.component("JixunButton", JixunButton);
    Vue.component("JixunCodeUploadButton", JixunCodeUploadButton);
    Vue.component("JixunCodeUploadContainer", JixunCodeUploadContainer);
    Vue.component("JixunCodeUploadDialog", JixunCodeUploadDialog);
    Vue.component("JixunDuParseTable", JixunDuParseTable);
  }
  
  function hookModuleDefaultExport(moduleId, hookMethod) {
    waitModuleLoad.call(moduleId, (module, require) => {
      const originalExports = module[WEBPACK_MODULE_KEYS.EXPORTS];
      const originalDefaultExport = originalExports[__default];
      const newExports = {};
      module[WEBPACK_MODULE_KEYS.EXPORTS] = newExports;
      const hookedDefaultExport = hookMethod(originalDefaultExport);
      require[WEBPACK_REQUIRE_KEYS.EXPORT_ES6_MEMBER](
        newExports,
        __default,
        () => hookedDefaultExport
      );
    });
  }
  
  const byKey = (key) => (item) => {
    return key === item.key;
  };
  function hookMakeClass(callback) {
    hookModuleDefaultExport(
      WEBPACK_MODULE_ID.PolyfillMakeClass,
      (makeClass) => (ctr, p, s) => {
        return callback(makeClass, ctr, p, s);
      }
    );
  }
  
  waitModuleLoad.call(WEBPACK_MODULE_ID.Vue, (module, require) => {
    debug("Vue loaded");
    const Vue$1 = module[WEBPACK_MODULE_KEYS.EXPORTS].default;
    Object.defineProperty(Vue$1.config, "devtools", {
      get() {
        return true;
      },
      set() {},
    });
    Vue.setValue(Vue$1);
    registerComponents(Vue$1);
  });
  hookModuleDefaultExport(
    WEBPACK_MODULE_ID.RegisterComponent,
    (originalRegisterComponent) => {
      debug("RegisterComponent hooked");
      return hookComponentInit(originalRegisterComponent);
    }
  );
  waitModuleLoad.call(WEBPACK_MODULE_ID.Globals, (module, require) => {
    const globals = module[WEBPACK_MODULE_KEYS.EXPORTS];
    baiduGlobals.setValue(globals);
    debug("baiduGlobals init ok", globals);
  });
  hookMakeClass((makeClass, ctr, p, s) => {
    if (Array.isArray(p)) {
      try {
        if (p.some(byKey("_sendFileInChunkStyle"))) {
          const getInstanceMethod = s.find(byKey("getInstance"));
          const getInstance = getInstanceMethod.value;
          getInstanceMethod.value = (ctx) => {
            debug("baiduContext init ok", ctx);
            baiduContext.setValue(ctx);
            return getInstance(ctx);
          };
          debug("class hooked w/ _sendFileInChunkStyle");
        }
      } catch (err) {
        console.error("hook make class failed", err);
      }
    }
    return makeClass(ctr, p, s);
  });
  (window.webpackJsonp = window.webpackJsonp || []).push([
    [
      /* 新百度网盘 */
    ],
    {
      [ENTRY_ID]: function (module, exports, require) {
        debug("Entry loaded");
        setWebpackRequire(require);
      },
    },
    [[ENTRY_ID, CHUNK_EARLY_HOOK]],
  ]);
  
  // eslint-disable-next-line no-unused-vars
  function styleInject(css) {
    function addStyle(cssText) {
      const style = document.createElement("style");
      style.textContent = cssText;
      document.head.appendChild(style);
    }
  
    if (document.head) {
      addStyle(css);
    } else if (styleInject.pending) {
      styleInject.pending.push(css);
    } else {
      const injectPendingCSS = () => {
        styleInject.pending.forEach(addStyle);
        styleInject.pending = undefined;
        window.removeEventListener("DOMContentLoaded", injectPendingCSS);
      };
  
      styleInject.pending = [css];
      window.addEventListener("DOMContentLoaded", injectPendingCSS);
    }
  }
  
}
const isGm = (typeof unsafeWindow !== 'undefined') && (unsafeWindow !== window);
if (isGm) {
  const INFO = '[仓库助手]';

  console.info('%s 以 GreaseMonkey 兼容模式执行。该脚本管理器所遇到的问题不能保证能够修复。', INFO);
  unsafeWindow.eval(`;(${entryPoint})();`);
} else {
  entryPoint();
}