// ==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: "code-upload@com.baidu.pan",
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();
}