您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
恢复Bilibili旧版页面,为了那些念旧的人。
当前为
// ==UserScript== // @name Bilibili 旧播放页 // @namespace MotooriKashin // @version 9.1.3 // @description 恢复Bilibili旧版页面,为了那些念旧的人。 // @author MotooriKashin, wly5556 // @homepage https://github.com/MotooriKashin/Bilibili-Old // @supportURL https://github.com/MotooriKashin/Bilibili-Old/issues // @icon https://www.bilibili.com/favicon.ico // @match *://*.bilibili.com/* // @connect * // @grant GM_xmlhttpRequest // @grant GM_getResourceText // @grant GM_getResourceURL // @grant GM_getValue // @grant GM_setValue // @grant GM_deleteValue // @grant GM_listValues // @grant GM.cookie // @run-at document-start // @license MIT // @resource bilibiliPlayer.js https://fastly.jsdelivr.net/gh/MotooriKashin/Bilibili-Old@596394f4a2910fd5ca7a52667938e2523a20b2a3/src/bilibili/bilibiliPlayer.min.js // ==/UserScript== const modules =` "use strict"; (() => { var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; var __commonJS = (cb, mod2) => function __require() { return mod2 || (0, cb[__getOwnPropNames(cb)[0]])((mod2 = { exports: {} }).exports, mod2), mod2.exports; }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod2, isNodeMode, target) => (target = mod2 != null ? __create(__getProtoOf(mod2)) : {}, __copyProps( isNodeMode || !mod2 || !mod2.__esModule ? __defProp(target, "default", { value: mod2, enumerable: true }) : target, mod2 )); var __publicField = (obj, key, value) => { __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value); return value; }; // node_modules/@protobufjs/aspromise/index.js var require_aspromise = __commonJS({ "node_modules/@protobufjs/aspromise/index.js"(exports2, module2) { "use strict"; module2.exports = asPromise; function asPromise(fn, ctx) { var params = new Array(arguments.length - 1), offset2 = 0, index = 2, pending = true; while (index < arguments.length) params[offset2++] = arguments[index++]; return new Promise(function executor(resolve, reject) { params[offset2] = function callback(err) { if (pending) { pending = false; if (err) reject(err); else { var params2 = new Array(arguments.length - 1), offset3 = 0; while (offset3 < params2.length) params2[offset3++] = arguments[offset3]; resolve.apply(null, params2); } } }; try { fn.apply(ctx || null, params); } catch (err) { if (pending) { pending = false; reject(err); } } }); } } }); // node_modules/@protobufjs/base64/index.js var require_base64 = __commonJS({ "node_modules/@protobufjs/base64/index.js"(exports2) { "use strict"; var base64 = exports2; base64.length = function length(string) { var p = string.length; if (!p) return 0; var n = 0; while (--p % 4 > 1 && string.charAt(p) === "=") ++n; return Math.ceil(string.length * 3) / 4 - n; }; var b64 = new Array(64); var s64 = new Array(123); for (i = 0; i < 64; ) s64[b64[i] = i < 26 ? i + 65 : i < 52 ? i + 71 : i < 62 ? i - 4 : i - 59 | 43] = i++; var i; base64.encode = function encode(buffer2, start, end) { var parts = null, chunk = []; var i2 = 0, j = 0, t; while (start < end) { var b = buffer2[start++]; switch (j) { case 0: chunk[i2++] = b64[b >> 2]; t = (b & 3) << 4; j = 1; break; case 1: chunk[i2++] = b64[t | b >> 4]; t = (b & 15) << 2; j = 2; break; case 2: chunk[i2++] = b64[t | b >> 6]; chunk[i2++] = b64[b & 63]; j = 0; break; } if (i2 > 8191) { (parts || (parts = [])).push(String.fromCharCode.apply(String, chunk)); i2 = 0; } } if (j) { chunk[i2++] = b64[t]; chunk[i2++] = 61; if (j === 1) chunk[i2++] = 61; } if (parts) { if (i2) parts.push(String.fromCharCode.apply(String, chunk.slice(0, i2))); return parts.join(""); } return String.fromCharCode.apply(String, chunk.slice(0, i2)); }; var invalidEncoding = "invalid encoding"; base64.decode = function decode(string, buffer2, offset2) { var start = offset2; var j = 0, t; for (var i2 = 0; i2 < string.length; ) { var c = string.charCodeAt(i2++); if (c === 61 && j > 1) break; if ((c = s64[c]) === void 0) throw Error(invalidEncoding); switch (j) { case 0: t = c; j = 1; break; case 1: buffer2[offset2++] = t << 2 | (c & 48) >> 4; t = c; j = 2; break; case 2: buffer2[offset2++] = (t & 15) << 4 | (c & 60) >> 2; t = c; j = 3; break; case 3: buffer2[offset2++] = (t & 3) << 6 | c; j = 0; break; } } if (j === 1) throw Error(invalidEncoding); return offset2 - start; }; base64.test = function test(string) { return /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?\$/.test(string); }; } }); // node_modules/@protobufjs/eventemitter/index.js var require_eventemitter = __commonJS({ "node_modules/@protobufjs/eventemitter/index.js"(exports2, module2) { "use strict"; module2.exports = EventEmitter; function EventEmitter() { this._listeners = {}; } EventEmitter.prototype.on = function on(evt, fn, ctx) { (this._listeners[evt] || (this._listeners[evt] = [])).push({ fn, ctx: ctx || this }); return this; }; EventEmitter.prototype.off = function off(evt, fn) { if (evt === void 0) this._listeners = {}; else { if (fn === void 0) this._listeners[evt] = []; else { var listeners = this._listeners[evt]; for (var i = 0; i < listeners.length; ) if (listeners[i].fn === fn) listeners.splice(i, 1); else ++i; } } return this; }; EventEmitter.prototype.emit = function emit(evt) { var listeners = this._listeners[evt]; if (listeners) { var args = [], i = 1; for (; i < arguments.length; ) args.push(arguments[i++]); for (i = 0; i < listeners.length; ) listeners[i].fn.apply(listeners[i++].ctx, args); } return this; }; } }); // node_modules/@protobufjs/float/index.js var require_float = __commonJS({ "node_modules/@protobufjs/float/index.js"(exports2, module2) { "use strict"; module2.exports = factory(factory); function factory(exports3) { if (typeof Float32Array !== "undefined") (function() { var f32 = new Float32Array([-0]), f8b = new Uint8Array(f32.buffer), le = f8b[3] === 128; function writeFloat_f32_cpy(val, buf, pos) { f32[0] = val; buf[pos] = f8b[0]; buf[pos + 1] = f8b[1]; buf[pos + 2] = f8b[2]; buf[pos + 3] = f8b[3]; } function writeFloat_f32_rev(val, buf, pos) { f32[0] = val; buf[pos] = f8b[3]; buf[pos + 1] = f8b[2]; buf[pos + 2] = f8b[1]; buf[pos + 3] = f8b[0]; } exports3.writeFloatLE = le ? writeFloat_f32_cpy : writeFloat_f32_rev; exports3.writeFloatBE = le ? writeFloat_f32_rev : writeFloat_f32_cpy; function readFloat_f32_cpy(buf, pos) { f8b[0] = buf[pos]; f8b[1] = buf[pos + 1]; f8b[2] = buf[pos + 2]; f8b[3] = buf[pos + 3]; return f32[0]; } function readFloat_f32_rev(buf, pos) { f8b[3] = buf[pos]; f8b[2] = buf[pos + 1]; f8b[1] = buf[pos + 2]; f8b[0] = buf[pos + 3]; return f32[0]; } exports3.readFloatLE = le ? readFloat_f32_cpy : readFloat_f32_rev; exports3.readFloatBE = le ? readFloat_f32_rev : readFloat_f32_cpy; })(); else (function() { function writeFloat_ieee754(writeUint, val, buf, pos) { var sign = val < 0 ? 1 : 0; if (sign) val = -val; if (val === 0) writeUint(1 / val > 0 ? 0 : 2147483648, buf, pos); else if (isNaN(val)) writeUint(2143289344, buf, pos); else if (val > 34028234663852886e22) writeUint((sign << 31 | 2139095040) >>> 0, buf, pos); else if (val < 11754943508222875e-54) writeUint((sign << 31 | Math.round(val / 1401298464324817e-60)) >>> 0, buf, pos); else { var exponent = Math.floor(Math.log(val) / Math.LN2), mantissa = Math.round(val * Math.pow(2, -exponent) * 8388608) & 8388607; writeUint((sign << 31 | exponent + 127 << 23 | mantissa) >>> 0, buf, pos); } } exports3.writeFloatLE = writeFloat_ieee754.bind(null, writeUintLE); exports3.writeFloatBE = writeFloat_ieee754.bind(null, writeUintBE); function readFloat_ieee754(readUint, buf, pos) { var uint = readUint(buf, pos), sign = (uint >> 31) * 2 + 1, exponent = uint >>> 23 & 255, mantissa = uint & 8388607; return exponent === 255 ? mantissa ? NaN : sign * Infinity : exponent === 0 ? sign * 1401298464324817e-60 * mantissa : sign * Math.pow(2, exponent - 150) * (mantissa + 8388608); } exports3.readFloatLE = readFloat_ieee754.bind(null, readUintLE); exports3.readFloatBE = readFloat_ieee754.bind(null, readUintBE); })(); if (typeof Float64Array !== "undefined") (function() { var f64 = new Float64Array([-0]), f8b = new Uint8Array(f64.buffer), le = f8b[7] === 128; function writeDouble_f64_cpy(val, buf, pos) { f64[0] = val; buf[pos] = f8b[0]; buf[pos + 1] = f8b[1]; buf[pos + 2] = f8b[2]; buf[pos + 3] = f8b[3]; buf[pos + 4] = f8b[4]; buf[pos + 5] = f8b[5]; buf[pos + 6] = f8b[6]; buf[pos + 7] = f8b[7]; } function writeDouble_f64_rev(val, buf, pos) { f64[0] = val; buf[pos] = f8b[7]; buf[pos + 1] = f8b[6]; buf[pos + 2] = f8b[5]; buf[pos + 3] = f8b[4]; buf[pos + 4] = f8b[3]; buf[pos + 5] = f8b[2]; buf[pos + 6] = f8b[1]; buf[pos + 7] = f8b[0]; } exports3.writeDoubleLE = le ? writeDouble_f64_cpy : writeDouble_f64_rev; exports3.writeDoubleBE = le ? writeDouble_f64_rev : writeDouble_f64_cpy; function readDouble_f64_cpy(buf, pos) { f8b[0] = buf[pos]; f8b[1] = buf[pos + 1]; f8b[2] = buf[pos + 2]; f8b[3] = buf[pos + 3]; f8b[4] = buf[pos + 4]; f8b[5] = buf[pos + 5]; f8b[6] = buf[pos + 6]; f8b[7] = buf[pos + 7]; return f64[0]; } function readDouble_f64_rev(buf, pos) { f8b[7] = buf[pos]; f8b[6] = buf[pos + 1]; f8b[5] = buf[pos + 2]; f8b[4] = buf[pos + 3]; f8b[3] = buf[pos + 4]; f8b[2] = buf[pos + 5]; f8b[1] = buf[pos + 6]; f8b[0] = buf[pos + 7]; return f64[0]; } exports3.readDoubleLE = le ? readDouble_f64_cpy : readDouble_f64_rev; exports3.readDoubleBE = le ? readDouble_f64_rev : readDouble_f64_cpy; })(); else (function() { function writeDouble_ieee754(writeUint, off0, off1, val, buf, pos) { var sign = val < 0 ? 1 : 0; if (sign) val = -val; if (val === 0) { writeUint(0, buf, pos + off0); writeUint(1 / val > 0 ? 0 : 2147483648, buf, pos + off1); } else if (isNaN(val)) { writeUint(0, buf, pos + off0); writeUint(2146959360, buf, pos + off1); } else if (val > 17976931348623157e292) { writeUint(0, buf, pos + off0); writeUint((sign << 31 | 2146435072) >>> 0, buf, pos + off1); } else { var mantissa; if (val < 22250738585072014e-324) { mantissa = val / 5e-324; writeUint(mantissa >>> 0, buf, pos + off0); writeUint((sign << 31 | mantissa / 4294967296) >>> 0, buf, pos + off1); } else { var exponent = Math.floor(Math.log(val) / Math.LN2); if (exponent === 1024) exponent = 1023; mantissa = val * Math.pow(2, -exponent); writeUint(mantissa * 4503599627370496 >>> 0, buf, pos + off0); writeUint((sign << 31 | exponent + 1023 << 20 | mantissa * 1048576 & 1048575) >>> 0, buf, pos + off1); } } } exports3.writeDoubleLE = writeDouble_ieee754.bind(null, writeUintLE, 0, 4); exports3.writeDoubleBE = writeDouble_ieee754.bind(null, writeUintBE, 4, 0); function readDouble_ieee754(readUint, off0, off1, buf, pos) { var lo = readUint(buf, pos + off0), hi = readUint(buf, pos + off1); var sign = (hi >> 31) * 2 + 1, exponent = hi >>> 20 & 2047, mantissa = 4294967296 * (hi & 1048575) + lo; return exponent === 2047 ? mantissa ? NaN : sign * Infinity : exponent === 0 ? sign * 5e-324 * mantissa : sign * Math.pow(2, exponent - 1075) * (mantissa + 4503599627370496); } exports3.readDoubleLE = readDouble_ieee754.bind(null, readUintLE, 0, 4); exports3.readDoubleBE = readDouble_ieee754.bind(null, readUintBE, 4, 0); })(); return exports3; } function writeUintLE(val, buf, pos) { buf[pos] = val & 255; buf[pos + 1] = val >>> 8 & 255; buf[pos + 2] = val >>> 16 & 255; buf[pos + 3] = val >>> 24; } function writeUintBE(val, buf, pos) { buf[pos] = val >>> 24; buf[pos + 1] = val >>> 16 & 255; buf[pos + 2] = val >>> 8 & 255; buf[pos + 3] = val & 255; } function readUintLE(buf, pos) { return (buf[pos] | buf[pos + 1] << 8 | buf[pos + 2] << 16 | buf[pos + 3] << 24) >>> 0; } function readUintBE(buf, pos) { return (buf[pos] << 24 | buf[pos + 1] << 16 | buf[pos + 2] << 8 | buf[pos + 3]) >>> 0; } } }); // node_modules/@protobufjs/inquire/index.js var require_inquire = __commonJS({ "node_modules/@protobufjs/inquire/index.js"(exports, module) { "use strict"; module.exports = inquire; function inquire(moduleName) { try { var mod = eval("quire".replace(/^/, "re"))(moduleName); if (mod && (mod.length || Object.keys(mod).length)) return mod; } catch (e) { } return null; } } }); // node_modules/@protobufjs/utf8/index.js var require_utf8 = __commonJS({ "node_modules/@protobufjs/utf8/index.js"(exports2) { "use strict"; var utf8 = exports2; utf8.length = function utf8_length(string) { var len = 0, c = 0; for (var i = 0; i < string.length; ++i) { c = string.charCodeAt(i); if (c < 128) len += 1; else if (c < 2048) len += 2; else if ((c & 64512) === 55296 && (string.charCodeAt(i + 1) & 64512) === 56320) { ++i; len += 4; } else len += 3; } return len; }; utf8.read = function utf8_read(buffer2, start, end) { var len = end - start; if (len < 1) return ""; var parts = null, chunk = [], i = 0, t; while (start < end) { t = buffer2[start++]; if (t < 128) chunk[i++] = t; else if (t > 191 && t < 224) chunk[i++] = (t & 31) << 6 | buffer2[start++] & 63; else if (t > 239 && t < 365) { t = ((t & 7) << 18 | (buffer2[start++] & 63) << 12 | (buffer2[start++] & 63) << 6 | buffer2[start++] & 63) - 65536; chunk[i++] = 55296 + (t >> 10); chunk[i++] = 56320 + (t & 1023); } else chunk[i++] = (t & 15) << 12 | (buffer2[start++] & 63) << 6 | buffer2[start++] & 63; if (i > 8191) { (parts || (parts = [])).push(String.fromCharCode.apply(String, chunk)); i = 0; } } if (parts) { if (i) parts.push(String.fromCharCode.apply(String, chunk.slice(0, i))); return parts.join(""); } return String.fromCharCode.apply(String, chunk.slice(0, i)); }; utf8.write = function utf8_write(string, buffer2, offset2) { var start = offset2, c1, c2; for (var i = 0; i < string.length; ++i) { c1 = string.charCodeAt(i); if (c1 < 128) { buffer2[offset2++] = c1; } else if (c1 < 2048) { buffer2[offset2++] = c1 >> 6 | 192; buffer2[offset2++] = c1 & 63 | 128; } else if ((c1 & 64512) === 55296 && ((c2 = string.charCodeAt(i + 1)) & 64512) === 56320) { c1 = 65536 + ((c1 & 1023) << 10) + (c2 & 1023); ++i; buffer2[offset2++] = c1 >> 18 | 240; buffer2[offset2++] = c1 >> 12 & 63 | 128; buffer2[offset2++] = c1 >> 6 & 63 | 128; buffer2[offset2++] = c1 & 63 | 128; } else { buffer2[offset2++] = c1 >> 12 | 224; buffer2[offset2++] = c1 >> 6 & 63 | 128; buffer2[offset2++] = c1 & 63 | 128; } } return offset2 - start; }; } }); // node_modules/@protobufjs/pool/index.js var require_pool = __commonJS({ "node_modules/@protobufjs/pool/index.js"(exports2, module2) { "use strict"; module2.exports = pool; function pool(alloc, slice, size) { var SIZE = size || 8192; var MAX = SIZE >>> 1; var slab = null; var offset2 = SIZE; return function pool_alloc(size2) { if (size2 < 1 || size2 > MAX) return alloc(size2); if (offset2 + size2 > SIZE) { slab = alloc(SIZE); offset2 = 0; } var buf = slice.call(slab, offset2, offset2 += size2); if (offset2 & 7) offset2 = (offset2 | 7) + 1; return buf; }; } } }); // node_modules/protobufjs/src/util/longbits.js var require_longbits = __commonJS({ "node_modules/protobufjs/src/util/longbits.js"(exports2, module2) { "use strict"; module2.exports = LongBits; var util = require_minimal(); function LongBits(lo, hi) { this.lo = lo >>> 0; this.hi = hi >>> 0; } var zero = LongBits.zero = new LongBits(0, 0); zero.toNumber = function() { return 0; }; zero.zzEncode = zero.zzDecode = function() { return this; }; zero.length = function() { return 1; }; var zeroHash = LongBits.zeroHash = "\\0\\0\\0\\0\\0\\0\\0\\0"; LongBits.fromNumber = function fromNumber(value) { if (value === 0) return zero; var sign = value < 0; if (sign) value = -value; var lo = value >>> 0, hi = (value - lo) / 4294967296 >>> 0; if (sign) { hi = ~hi >>> 0; lo = ~lo >>> 0; if (++lo > 4294967295) { lo = 0; if (++hi > 4294967295) hi = 0; } } return new LongBits(lo, hi); }; LongBits.from = function from(value) { if (typeof value === "number") return LongBits.fromNumber(value); if (util.isString(value)) { if (util.Long) value = util.Long.fromString(value); else return LongBits.fromNumber(parseInt(value, 10)); } return value.low || value.high ? new LongBits(value.low >>> 0, value.high >>> 0) : zero; }; LongBits.prototype.toNumber = function toNumber(unsigned) { if (!unsigned && this.hi >>> 31) { var lo = ~this.lo + 1 >>> 0, hi = ~this.hi >>> 0; if (!lo) hi = hi + 1 >>> 0; return -(lo + hi * 4294967296); } return this.lo + this.hi * 4294967296; }; LongBits.prototype.toLong = function toLong(unsigned) { return util.Long ? new util.Long(this.lo | 0, this.hi | 0, Boolean(unsigned)) : { low: this.lo | 0, high: this.hi | 0, unsigned: Boolean(unsigned) }; }; var charCodeAt = String.prototype.charCodeAt; LongBits.fromHash = function fromHash(hash) { if (hash === zeroHash) return zero; return new LongBits( (charCodeAt.call(hash, 0) | charCodeAt.call(hash, 1) << 8 | charCodeAt.call(hash, 2) << 16 | charCodeAt.call(hash, 3) << 24) >>> 0, (charCodeAt.call(hash, 4) | charCodeAt.call(hash, 5) << 8 | charCodeAt.call(hash, 6) << 16 | charCodeAt.call(hash, 7) << 24) >>> 0 ); }; LongBits.prototype.toHash = function toHash() { return String.fromCharCode( this.lo & 255, this.lo >>> 8 & 255, this.lo >>> 16 & 255, this.lo >>> 24, this.hi & 255, this.hi >>> 8 & 255, this.hi >>> 16 & 255, this.hi >>> 24 ); }; LongBits.prototype.zzEncode = function zzEncode() { var mask = this.hi >> 31; this.hi = ((this.hi << 1 | this.lo >>> 31) ^ mask) >>> 0; this.lo = (this.lo << 1 ^ mask) >>> 0; return this; }; LongBits.prototype.zzDecode = function zzDecode() { var mask = -(this.lo & 1); this.lo = ((this.lo >>> 1 | this.hi << 31) ^ mask) >>> 0; this.hi = (this.hi >>> 1 ^ mask) >>> 0; return this; }; LongBits.prototype.length = function length() { var part0 = this.lo, part1 = (this.lo >>> 28 | this.hi << 4) >>> 0, part2 = this.hi >>> 24; return part2 === 0 ? part1 === 0 ? part0 < 16384 ? part0 < 128 ? 1 : 2 : part0 < 2097152 ? 3 : 4 : part1 < 16384 ? part1 < 128 ? 5 : 6 : part1 < 2097152 ? 7 : 8 : part2 < 128 ? 9 : 10; }; } }); // node_modules/protobufjs/src/util/minimal.js var require_minimal = __commonJS({ "node_modules/protobufjs/src/util/minimal.js"(exports2) { "use strict"; var util = exports2; util.asPromise = require_aspromise(); util.base64 = require_base64(); util.EventEmitter = require_eventemitter(); util.float = require_float(); util.inquire = require_inquire(); util.utf8 = require_utf8(); util.pool = require_pool(); util.LongBits = require_longbits(); util.isNode = Boolean(typeof global !== "undefined" && global && global.process && global.process.versions && global.process.versions.node); util.global = util.isNode && global || typeof window !== "undefined" && window || typeof self !== "undefined" && self || exports2; util.emptyArray = Object.freeze ? Object.freeze([]) : []; util.emptyObject = Object.freeze ? Object.freeze({}) : {}; util.isInteger = Number.isInteger || function isInteger(value) { return typeof value === "number" && isFinite(value) && Math.floor(value) === value; }; util.isString = function isString(value) { return typeof value === "string" || value instanceof String; }; util.isObject = function isObject2(value) { return value && typeof value === "object"; }; util.isset = util.isSet = function isSet(obj, prop) { var value = obj[prop]; if (value != null && obj.hasOwnProperty(prop)) return typeof value !== "object" || (Array.isArray(value) ? value.length : Object.keys(value).length) > 0; return false; }; util.Buffer = function() { try { var Buffer2 = util.inquire("buffer").Buffer; return Buffer2.prototype.utf8Write ? Buffer2 : null; } catch (e) { return null; } }(); util._Buffer_from = null; util._Buffer_allocUnsafe = null; util.newBuffer = function newBuffer(sizeOrArray) { return typeof sizeOrArray === "number" ? util.Buffer ? util._Buffer_allocUnsafe(sizeOrArray) : new util.Array(sizeOrArray) : util.Buffer ? util._Buffer_from(sizeOrArray) : typeof Uint8Array === "undefined" ? sizeOrArray : new Uint8Array(sizeOrArray); }; util.Array = typeof Uint8Array !== "undefined" ? Uint8Array : Array; util.Long = util.global.dcodeIO && util.global.dcodeIO.Long || util.global.Long || util.inquire("long"); util.key2Re = /^true|false|0|1\$/; util.key32Re = /^-?(?:0|[1-9][0-9]*)\$/; util.key64Re = /^(?:[\\\\x00-\\\\xff]{8}|-?(?:0|[1-9][0-9]*))\$/; util.longToHash = function longToHash(value) { return value ? util.LongBits.from(value).toHash() : util.LongBits.zeroHash; }; util.longFromHash = function longFromHash(hash, unsigned) { var bits = util.LongBits.fromHash(hash); if (util.Long) return util.Long.fromBits(bits.lo, bits.hi, unsigned); return bits.toNumber(Boolean(unsigned)); }; function merge(dst, src, ifNotSet) { for (var keys = Object.keys(src), i = 0; i < keys.length; ++i) if (dst[keys[i]] === void 0 || !ifNotSet) dst[keys[i]] = src[keys[i]]; return dst; } util.merge = merge; util.lcFirst = function lcFirst(str) { return str.charAt(0).toLowerCase() + str.substring(1); }; function newError(name) { function CustomError(message2, properties) { if (!(this instanceof CustomError)) return new CustomError(message2, properties); Object.defineProperty(this, "message", { get: function() { return message2; } }); if (Error.captureStackTrace) Error.captureStackTrace(this, CustomError); else Object.defineProperty(this, "stack", { value: new Error().stack || "" }); if (properties) merge(this, properties); } (CustomError.prototype = Object.create(Error.prototype)).constructor = CustomError; Object.defineProperty(CustomError.prototype, "name", { get: function() { return name; } }); CustomError.prototype.toString = function toString() { return this.name + ": " + this.message; }; return CustomError; } util.newError = newError; util.ProtocolError = newError("ProtocolError"); util.oneOfGetter = function getOneOf(fieldNames) { var fieldMap = {}; for (var i = 0; i < fieldNames.length; ++i) fieldMap[fieldNames[i]] = 1; return function() { for (var keys = Object.keys(this), i2 = keys.length - 1; i2 > -1; --i2) if (fieldMap[keys[i2]] === 1 && this[keys[i2]] !== void 0 && this[keys[i2]] !== null) return keys[i2]; }; }; util.oneOfSetter = function setOneOf(fieldNames) { return function(name) { for (var i = 0; i < fieldNames.length; ++i) if (fieldNames[i] !== name) delete this[fieldNames[i]]; }; }; util.toJSONOptions = { longs: String, enums: String, bytes: String, json: true }; util._configure = function() { var Buffer2 = util.Buffer; if (!Buffer2) { util._Buffer_from = util._Buffer_allocUnsafe = null; return; } util._Buffer_from = Buffer2.from !== Uint8Array.from && Buffer2.from || function Buffer_from(value, encoding) { return new Buffer2(value, encoding); }; util._Buffer_allocUnsafe = Buffer2.allocUnsafe || function Buffer_allocUnsafe(size) { return new Buffer2(size); }; }; } }); // node_modules/protobufjs/src/writer.js var require_writer = __commonJS({ "node_modules/protobufjs/src/writer.js"(exports2, module2) { "use strict"; module2.exports = Writer; var util = require_minimal(); var BufferWriter; var LongBits = util.LongBits; var base64 = util.base64; var utf8 = util.utf8; function Op(fn, len, val) { this.fn = fn; this.len = len; this.next = void 0; this.val = val; } function noop() { } function State(writer) { this.head = writer.head; this.tail = writer.tail; this.len = writer.len; this.next = writer.states; } function Writer() { this.len = 0; this.head = new Op(noop, 0, 0); this.tail = this.head; this.states = null; } var create = function create2() { return util.Buffer ? function create_buffer_setup() { return (Writer.create = function create_buffer() { return new BufferWriter(); })(); } : function create_array() { return new Writer(); }; }; Writer.create = create(); Writer.alloc = function alloc(size) { return new util.Array(size); }; if (util.Array !== Array) Writer.alloc = util.pool(Writer.alloc, util.Array.prototype.subarray); Writer.prototype._push = function push(fn, len, val) { this.tail = this.tail.next = new Op(fn, len, val); this.len += len; return this; }; function writeByte(val, buf, pos) { buf[pos] = val & 255; } function writeVarint32(val, buf, pos) { while (val > 127) { buf[pos++] = val & 127 | 128; val >>>= 7; } buf[pos] = val; } function VarintOp(len, val) { this.len = len; this.next = void 0; this.val = val; } VarintOp.prototype = Object.create(Op.prototype); VarintOp.prototype.fn = writeVarint32; Writer.prototype.uint32 = function write_uint32(value) { this.len += (this.tail = this.tail.next = new VarintOp( (value = value >>> 0) < 128 ? 1 : value < 16384 ? 2 : value < 2097152 ? 3 : value < 268435456 ? 4 : 5, value )).len; return this; }; Writer.prototype.int32 = function write_int32(value) { return value < 0 ? this._push(writeVarint64, 10, LongBits.fromNumber(value)) : this.uint32(value); }; Writer.prototype.sint32 = function write_sint32(value) { return this.uint32((value << 1 ^ value >> 31) >>> 0); }; function writeVarint64(val, buf, pos) { while (val.hi) { buf[pos++] = val.lo & 127 | 128; val.lo = (val.lo >>> 7 | val.hi << 25) >>> 0; val.hi >>>= 7; } while (val.lo > 127) { buf[pos++] = val.lo & 127 | 128; val.lo = val.lo >>> 7; } buf[pos++] = val.lo; } Writer.prototype.uint64 = function write_uint64(value) { var bits = LongBits.from(value); return this._push(writeVarint64, bits.length(), bits); }; Writer.prototype.int64 = Writer.prototype.uint64; Writer.prototype.sint64 = function write_sint64(value) { var bits = LongBits.from(value).zzEncode(); return this._push(writeVarint64, bits.length(), bits); }; Writer.prototype.bool = function write_bool(value) { return this._push(writeByte, 1, value ? 1 : 0); }; function writeFixed32(val, buf, pos) { buf[pos] = val & 255; buf[pos + 1] = val >>> 8 & 255; buf[pos + 2] = val >>> 16 & 255; buf[pos + 3] = val >>> 24; } Writer.prototype.fixed32 = function write_fixed32(value) { return this._push(writeFixed32, 4, value >>> 0); }; Writer.prototype.sfixed32 = Writer.prototype.fixed32; Writer.prototype.fixed64 = function write_fixed64(value) { var bits = LongBits.from(value); return this._push(writeFixed32, 4, bits.lo)._push(writeFixed32, 4, bits.hi); }; Writer.prototype.sfixed64 = Writer.prototype.fixed64; Writer.prototype.float = function write_float(value) { return this._push(util.float.writeFloatLE, 4, value); }; Writer.prototype.double = function write_double(value) { return this._push(util.float.writeDoubleLE, 8, value); }; var writeBytes = util.Array.prototype.set ? function writeBytes_set(val, buf, pos) { buf.set(val, pos); } : function writeBytes_for(val, buf, pos) { for (var i = 0; i < val.length; ++i) buf[pos + i] = val[i]; }; Writer.prototype.bytes = function write_bytes(value) { var len = value.length >>> 0; if (!len) return this._push(writeByte, 1, 0); if (util.isString(value)) { var buf = Writer.alloc(len = base64.length(value)); base64.decode(value, buf, 0); value = buf; } return this.uint32(len)._push(writeBytes, len, value); }; Writer.prototype.string = function write_string(value) { var len = utf8.length(value); return len ? this.uint32(len)._push(utf8.write, len, value) : this._push(writeByte, 1, 0); }; Writer.prototype.fork = function fork() { this.states = new State(this); this.head = this.tail = new Op(noop, 0, 0); this.len = 0; return this; }; Writer.prototype.reset = function reset() { if (this.states) { this.head = this.states.head; this.tail = this.states.tail; this.len = this.states.len; this.states = this.states.next; } else { this.head = this.tail = new Op(noop, 0, 0); this.len = 0; } return this; }; Writer.prototype.ldelim = function ldelim() { var head = this.head, tail = this.tail, len = this.len; this.reset().uint32(len); if (len) { this.tail.next = head.next; this.tail = tail; this.len += len; } return this; }; Writer.prototype.finish = function finish() { var head = this.head.next, buf = this.constructor.alloc(this.len), pos = 0; while (head) { head.fn(head.val, buf, pos); pos += head.len; head = head.next; } return buf; }; Writer._configure = function(BufferWriter_) { BufferWriter = BufferWriter_; Writer.create = create(); BufferWriter._configure(); }; } }); // node_modules/protobufjs/src/writer_buffer.js var require_writer_buffer = __commonJS({ "node_modules/protobufjs/src/writer_buffer.js"(exports2, module2) { "use strict"; module2.exports = BufferWriter; var Writer = require_writer(); (BufferWriter.prototype = Object.create(Writer.prototype)).constructor = BufferWriter; var util = require_minimal(); function BufferWriter() { Writer.call(this); } BufferWriter._configure = function() { BufferWriter.alloc = util._Buffer_allocUnsafe; BufferWriter.writeBytesBuffer = util.Buffer && util.Buffer.prototype instanceof Uint8Array && util.Buffer.prototype.set.name === "set" ? function writeBytesBuffer_set(val, buf, pos) { buf.set(val, pos); } : function writeBytesBuffer_copy(val, buf, pos) { if (val.copy) val.copy(buf, pos, 0, val.length); else for (var i = 0; i < val.length; ) buf[pos++] = val[i++]; }; }; BufferWriter.prototype.bytes = function write_bytes_buffer(value) { if (util.isString(value)) value = util._Buffer_from(value, "base64"); var len = value.length >>> 0; this.uint32(len); if (len) this._push(BufferWriter.writeBytesBuffer, len, value); return this; }; function writeStringBuffer(val, buf, pos) { if (val.length < 40) util.utf8.write(val, buf, pos); else if (buf.utf8Write) buf.utf8Write(val, pos); else buf.write(val, pos); } BufferWriter.prototype.string = function write_string_buffer(value) { var len = util.Buffer.byteLength(value); this.uint32(len); if (len) this._push(writeStringBuffer, len, value); return this; }; BufferWriter._configure(); } }); // node_modules/protobufjs/src/reader.js var require_reader = __commonJS({ "node_modules/protobufjs/src/reader.js"(exports2, module2) { "use strict"; module2.exports = Reader; var util = require_minimal(); var BufferReader; var LongBits = util.LongBits; var utf8 = util.utf8; function indexOutOfRange(reader, writeLength) { return RangeError("index out of range: " + reader.pos + " + " + (writeLength || 1) + " > " + reader.len); } function Reader(buffer2) { this.buf = buffer2; this.pos = 0; this.len = buffer2.length; } var create_array = typeof Uint8Array !== "undefined" ? function create_typed_array(buffer2) { if (buffer2 instanceof Uint8Array || Array.isArray(buffer2)) return new Reader(buffer2); throw Error("illegal buffer"); } : function create_array2(buffer2) { if (Array.isArray(buffer2)) return new Reader(buffer2); throw Error("illegal buffer"); }; var create = function create2() { return util.Buffer ? function create_buffer_setup(buffer2) { return (Reader.create = function create_buffer(buffer3) { return util.Buffer.isBuffer(buffer3) ? new BufferReader(buffer3) : create_array(buffer3); })(buffer2); } : create_array; }; Reader.create = create(); Reader.prototype._slice = util.Array.prototype.subarray || util.Array.prototype.slice; Reader.prototype.uint32 = function read_uint32_setup() { var value = 4294967295; return function read_uint32() { value = (this.buf[this.pos] & 127) >>> 0; if (this.buf[this.pos++] < 128) return value; value = (value | (this.buf[this.pos] & 127) << 7) >>> 0; if (this.buf[this.pos++] < 128) return value; value = (value | (this.buf[this.pos] & 127) << 14) >>> 0; if (this.buf[this.pos++] < 128) return value; value = (value | (this.buf[this.pos] & 127) << 21) >>> 0; if (this.buf[this.pos++] < 128) return value; value = (value | (this.buf[this.pos] & 15) << 28) >>> 0; if (this.buf[this.pos++] < 128) return value; if ((this.pos += 5) > this.len) { this.pos = this.len; throw indexOutOfRange(this, 10); } return value; }; }(); Reader.prototype.int32 = function read_int32() { return this.uint32() | 0; }; Reader.prototype.sint32 = function read_sint32() { var value = this.uint32(); return value >>> 1 ^ -(value & 1) | 0; }; function readLongVarint() { var bits = new LongBits(0, 0); var i = 0; if (this.len - this.pos > 4) { for (; i < 4; ++i) { bits.lo = (bits.lo | (this.buf[this.pos] & 127) << i * 7) >>> 0; if (this.buf[this.pos++] < 128) return bits; } bits.lo = (bits.lo | (this.buf[this.pos] & 127) << 28) >>> 0; bits.hi = (bits.hi | (this.buf[this.pos] & 127) >> 4) >>> 0; if (this.buf[this.pos++] < 128) return bits; i = 0; } else { for (; i < 3; ++i) { if (this.pos >= this.len) throw indexOutOfRange(this); bits.lo = (bits.lo | (this.buf[this.pos] & 127) << i * 7) >>> 0; if (this.buf[this.pos++] < 128) return bits; } bits.lo = (bits.lo | (this.buf[this.pos++] & 127) << i * 7) >>> 0; return bits; } if (this.len - this.pos > 4) { for (; i < 5; ++i) { bits.hi = (bits.hi | (this.buf[this.pos] & 127) << i * 7 + 3) >>> 0; if (this.buf[this.pos++] < 128) return bits; } } else { for (; i < 5; ++i) { if (this.pos >= this.len) throw indexOutOfRange(this); bits.hi = (bits.hi | (this.buf[this.pos] & 127) << i * 7 + 3) >>> 0; if (this.buf[this.pos++] < 128) return bits; } } throw Error("invalid varint encoding"); } Reader.prototype.bool = function read_bool() { return this.uint32() !== 0; }; function readFixed32_end(buf, end) { return (buf[end - 4] | buf[end - 3] << 8 | buf[end - 2] << 16 | buf[end - 1] << 24) >>> 0; } Reader.prototype.fixed32 = function read_fixed32() { if (this.pos + 4 > this.len) throw indexOutOfRange(this, 4); return readFixed32_end(this.buf, this.pos += 4); }; Reader.prototype.sfixed32 = function read_sfixed32() { if (this.pos + 4 > this.len) throw indexOutOfRange(this, 4); return readFixed32_end(this.buf, this.pos += 4) | 0; }; function readFixed64() { if (this.pos + 8 > this.len) throw indexOutOfRange(this, 8); return new LongBits(readFixed32_end(this.buf, this.pos += 4), readFixed32_end(this.buf, this.pos += 4)); } Reader.prototype.float = function read_float() { if (this.pos + 4 > this.len) throw indexOutOfRange(this, 4); var value = util.float.readFloatLE(this.buf, this.pos); this.pos += 4; return value; }; Reader.prototype.double = function read_double() { if (this.pos + 8 > this.len) throw indexOutOfRange(this, 4); var value = util.float.readDoubleLE(this.buf, this.pos); this.pos += 8; return value; }; Reader.prototype.bytes = function read_bytes() { var length = this.uint32(), start = this.pos, end = this.pos + length; if (end > this.len) throw indexOutOfRange(this, length); this.pos += length; if (Array.isArray(this.buf)) return this.buf.slice(start, end); return start === end ? new this.buf.constructor(0) : this._slice.call(this.buf, start, end); }; Reader.prototype.string = function read_string() { var bytes = this.bytes(); return utf8.read(bytes, 0, bytes.length); }; Reader.prototype.skip = function skip(length) { if (typeof length === "number") { if (this.pos + length > this.len) throw indexOutOfRange(this, length); this.pos += length; } else { do { if (this.pos >= this.len) throw indexOutOfRange(this); } while (this.buf[this.pos++] & 128); } return this; }; Reader.prototype.skipType = function(wireType) { switch (wireType) { case 0: this.skip(); break; case 1: this.skip(8); break; case 2: this.skip(this.uint32()); break; case 3: while ((wireType = this.uint32() & 7) !== 4) { this.skipType(wireType); } break; case 5: this.skip(4); break; default: throw Error("invalid wire type " + wireType + " at offset " + this.pos); } return this; }; Reader._configure = function(BufferReader_) { BufferReader = BufferReader_; Reader.create = create(); BufferReader._configure(); var fn = util.Long ? "toLong" : "toNumber"; util.merge(Reader.prototype, { int64: function read_int64() { return readLongVarint.call(this)[fn](false); }, uint64: function read_uint64() { return readLongVarint.call(this)[fn](true); }, sint64: function read_sint64() { return readLongVarint.call(this).zzDecode()[fn](false); }, fixed64: function read_fixed64() { return readFixed64.call(this)[fn](true); }, sfixed64: function read_sfixed64() { return readFixed64.call(this)[fn](false); } }); }; } }); // node_modules/protobufjs/src/reader_buffer.js var require_reader_buffer = __commonJS({ "node_modules/protobufjs/src/reader_buffer.js"(exports2, module2) { "use strict"; module2.exports = BufferReader; var Reader = require_reader(); (BufferReader.prototype = Object.create(Reader.prototype)).constructor = BufferReader; var util = require_minimal(); function BufferReader(buffer2) { Reader.call(this, buffer2); } BufferReader._configure = function() { if (util.Buffer) BufferReader.prototype._slice = util.Buffer.prototype.slice; }; BufferReader.prototype.string = function read_string_buffer() { var len = this.uint32(); return this.buf.utf8Slice ? this.buf.utf8Slice(this.pos, this.pos = Math.min(this.pos + len, this.len)) : this.buf.toString("utf-8", this.pos, this.pos = Math.min(this.pos + len, this.len)); }; BufferReader._configure(); } }); // node_modules/protobufjs/src/rpc/service.js var require_service = __commonJS({ "node_modules/protobufjs/src/rpc/service.js"(exports2, module2) { "use strict"; module2.exports = Service; var util = require_minimal(); (Service.prototype = Object.create(util.EventEmitter.prototype)).constructor = Service; function Service(rpcImpl, requestDelimited, responseDelimited) { if (typeof rpcImpl !== "function") throw TypeError("rpcImpl must be a function"); util.EventEmitter.call(this); this.rpcImpl = rpcImpl; this.requestDelimited = Boolean(requestDelimited); this.responseDelimited = Boolean(responseDelimited); } Service.prototype.rpcCall = function rpcCall(method, requestCtor, responseCtor, request, callback) { if (!request) throw TypeError("request must be specified"); var self2 = this; if (!callback) return util.asPromise(rpcCall, self2, method, requestCtor, responseCtor, request); if (!self2.rpcImpl) { setTimeout(function() { callback(Error("already ended")); }, 0); return void 0; } try { return self2.rpcImpl( method, requestCtor[self2.requestDelimited ? "encodeDelimited" : "encode"](request).finish(), function rpcCallback(err, response) { if (err) { self2.emit("error", err, method); return callback(err); } if (response === null) { self2.end(true); return void 0; } if (!(response instanceof responseCtor)) { try { response = responseCtor[self2.responseDelimited ? "decodeDelimited" : "decode"](response); } catch (err2) { self2.emit("error", err2, method); return callback(err2); } } self2.emit("data", response, method); return callback(null, response); } ); } catch (err) { self2.emit("error", err, method); setTimeout(function() { callback(err); }, 0); return void 0; } }; Service.prototype.end = function end(endedByRPC) { if (this.rpcImpl) { if (!endedByRPC) this.rpcImpl(null, null, null); this.rpcImpl = null; this.emit("end").off(); } return this; }; } }); // node_modules/protobufjs/src/rpc.js var require_rpc = __commonJS({ "node_modules/protobufjs/src/rpc.js"(exports2) { "use strict"; var rpc = exports2; rpc.Service = require_service(); } }); // node_modules/protobufjs/src/roots.js var require_roots = __commonJS({ "node_modules/protobufjs/src/roots.js"(exports2, module2) { "use strict"; module2.exports = {}; } }); // node_modules/protobufjs/src/index-minimal.js var require_index_minimal = __commonJS({ "node_modules/protobufjs/src/index-minimal.js"(exports2) { "use strict"; var protobuf3 = exports2; protobuf3.build = "minimal"; protobuf3.Writer = require_writer(); protobuf3.BufferWriter = require_writer_buffer(); protobuf3.Reader = require_reader(); protobuf3.BufferReader = require_reader_buffer(); protobuf3.util = require_minimal(); protobuf3.rpc = require_rpc(); protobuf3.roots = require_roots(); protobuf3.configure = configure; function configure() { protobuf3.util._configure(); protobuf3.Writer._configure(protobuf3.BufferWriter); protobuf3.Reader._configure(protobuf3.BufferReader); } configure(); } }); // node_modules/@protobufjs/codegen/index.js var require_codegen = __commonJS({ "node_modules/@protobufjs/codegen/index.js"(exports2, module2) { "use strict"; module2.exports = codegen; function codegen(functionParams, functionName) { if (typeof functionParams === "string") { functionName = functionParams; functionParams = void 0; } var body = []; function Codegen(formatStringOrScope) { if (typeof formatStringOrScope !== "string") { var source = toString(); if (codegen.verbose) console.log("codegen: " + source); source = "return " + source; if (formatStringOrScope) { var scopeKeys = Object.keys(formatStringOrScope), scopeParams = new Array(scopeKeys.length + 1), scopeValues = new Array(scopeKeys.length), scopeOffset = 0; while (scopeOffset < scopeKeys.length) { scopeParams[scopeOffset] = scopeKeys[scopeOffset]; scopeValues[scopeOffset] = formatStringOrScope[scopeKeys[scopeOffset++]]; } scopeParams[scopeOffset] = source; return Function.apply(null, scopeParams).apply(null, scopeValues); } return Function(source)(); } var formatParams = new Array(arguments.length - 1), formatOffset = 0; while (formatOffset < formatParams.length) formatParams[formatOffset] = arguments[++formatOffset]; formatOffset = 0; formatStringOrScope = formatStringOrScope.replace(/%([%dfijs])/g, function replace(\$0, \$1) { var value = formatParams[formatOffset++]; switch (\$1) { case "d": case "f": return String(Number(value)); case "i": return String(Math.floor(value)); case "j": return JSON.stringify(value); case "s": return String(value); } return "%"; }); if (formatOffset !== formatParams.length) throw Error("parameter count mismatch"); body.push(formatStringOrScope); return Codegen; } function toString(functionNameOverride) { return "function " + (functionNameOverride || functionName || "") + "(" + (functionParams && functionParams.join(",") || "") + "){\\n " + body.join("\\n ") + "\\n}"; } Codegen.toString = toString; return Codegen; } codegen.verbose = false; } }); // node_modules/@protobufjs/fetch/index.js var require_fetch = __commonJS({ "node_modules/@protobufjs/fetch/index.js"(exports2, module2) { "use strict"; module2.exports = fetch2; var asPromise = require_aspromise(); var inquire2 = require_inquire(); var fs = inquire2("fs"); function fetch2(filename, options, callback) { if (typeof options === "function") { callback = options; options = {}; } else if (!options) options = {}; if (!callback) return asPromise(fetch2, this, filename, options); if (!options.xhr && fs && fs.readFile) return fs.readFile(filename, function fetchReadFileCallback(err, contents) { return err && typeof XMLHttpRequest !== "undefined" ? fetch2.xhr(filename, options, callback) : err ? callback(err) : callback(null, options.binary ? contents : contents.toString("utf8")); }); return fetch2.xhr(filename, options, callback); } fetch2.xhr = function fetch_xhr(filename, options, callback) { var xhr2 = new XMLHttpRequest(); xhr2.onreadystatechange = function fetchOnReadyStateChange() { if (xhr2.readyState !== 4) return void 0; if (xhr2.status !== 0 && xhr2.status !== 200) return callback(Error("status " + xhr2.status)); if (options.binary) { var buffer2 = xhr2.response; if (!buffer2) { buffer2 = []; for (var i = 0; i < xhr2.responseText.length; ++i) buffer2.push(xhr2.responseText.charCodeAt(i) & 255); } return callback(null, typeof Uint8Array !== "undefined" ? new Uint8Array(buffer2) : buffer2); } return callback(null, xhr2.responseText); }; if (options.binary) { if ("overrideMimeType" in xhr2) xhr2.overrideMimeType("text/plain; charset=x-user-defined"); xhr2.responseType = "arraybuffer"; } xhr2.open("GET", filename); xhr2.send(); }; } }); // node_modules/@protobufjs/path/index.js var require_path = __commonJS({ "node_modules/@protobufjs/path/index.js"(exports2) { "use strict"; var path2 = exports2; var isAbsolute = path2.isAbsolute = function isAbsolute2(path3) { return /^(?:\\/|\\w+:)/.test(path3); }; var normalize = path2.normalize = function normalize2(path3) { path3 = path3.replace(/\\\\/g, "/").replace(/\\/{2,}/g, "/"); var parts = path3.split("/"), absolute = isAbsolute(path3), prefix = ""; if (absolute) prefix = parts.shift() + "/"; for (var i = 0; i < parts.length; ) { if (parts[i] === "..") { if (i > 0 && parts[i - 1] !== "..") parts.splice(--i, 2); else if (absolute) parts.splice(i, 1); else ++i; } else if (parts[i] === ".") parts.splice(i, 1); else ++i; } return prefix + parts.join("/"); }; path2.resolve = function resolve(originPath, includePath, alreadyNormalized) { if (!alreadyNormalized) includePath = normalize(includePath); if (isAbsolute(includePath)) return includePath; if (!alreadyNormalized) originPath = normalize(originPath); return (originPath = originPath.replace(/(?:\\/|^)[^/]+\$/, "")).length ? normalize(originPath + "/" + includePath) : includePath; }; } }); // node_modules/protobufjs/src/types.js var require_types = __commonJS({ "node_modules/protobufjs/src/types.js"(exports2) { "use strict"; var types = exports2; var util = require_util(); var s = [ "double", "float", "int32", "uint32", "sint32", "fixed32", "sfixed32", "int64", "uint64", "sint64", "fixed64", "sfixed64", "bool", "string", "bytes" ]; function bake(values, offset2) { var i = 0, o = {}; offset2 |= 0; while (i < values.length) o[s[i + offset2]] = values[i++]; return o; } types.basic = bake([ 1, 5, 0, 0, 0, 5, 5, 0, 0, 0, 1, 1, 0, 2, 2 ]); types.defaults = bake([ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, false, "", util.emptyArray, null ]); types.long = bake([ 0, 0, 0, 1, 1 ], 7); types.mapKey = bake([ 0, 0, 0, 5, 5, 0, 0, 0, 1, 1, 0, 2 ], 2); types.packed = bake([ 1, 5, 0, 0, 0, 5, 5, 0, 0, 0, 1, 1, 0 ]); } }); // node_modules/protobufjs/src/field.js var require_field = __commonJS({ "node_modules/protobufjs/src/field.js"(exports2, module2) { "use strict"; module2.exports = Field; var ReflectionObject = require_object(); ((Field.prototype = Object.create(ReflectionObject.prototype)).constructor = Field).className = "Field"; var Enum = require_enum(); var types = require_types(); var util = require_util(); var Type; var ruleRe = /^required|optional|repeated\$/; Field.fromJSON = function fromJSON(name, json) { return new Field(name, json.id, json.type, json.rule, json.extend, json.options, json.comment); }; function Field(name, id, type, rule, extend, options, comment) { if (util.isObject(rule)) { comment = extend; options = rule; rule = extend = void 0; } else if (util.isObject(extend)) { comment = options; options = extend; extend = void 0; } ReflectionObject.call(this, name, options); if (!util.isInteger(id) || id < 0) throw TypeError("id must be a non-negative integer"); if (!util.isString(type)) throw TypeError("type must be a string"); if (rule !== void 0 && !ruleRe.test(rule = rule.toString().toLowerCase())) throw TypeError("rule must be a string rule"); if (extend !== void 0 && !util.isString(extend)) throw TypeError("extend must be a string"); if (rule === "proto3_optional") { rule = "optional"; } this.rule = rule && rule !== "optional" ? rule : void 0; this.type = type; this.id = id; this.extend = extend || void 0; this.required = rule === "required"; this.optional = !this.required; this.repeated = rule === "repeated"; this.map = false; this.message = null; this.partOf = null; this.typeDefault = null; this.defaultValue = null; this.long = util.Long ? types.long[type] !== void 0 : false; this.bytes = type === "bytes"; this.resolvedType = null; this.extensionField = null; this.declaringField = null; this._packed = null; this.comment = comment; } Object.defineProperty(Field.prototype, "packed", { get: function() { if (this._packed === null) this._packed = this.getOption("packed") !== false; return this._packed; } }); Field.prototype.setOption = function setOption(name, value, ifNotSet) { if (name === "packed") this._packed = null; return ReflectionObject.prototype.setOption.call(this, name, value, ifNotSet); }; Field.prototype.toJSON = function toJSON(toJSONOptions) { var keepComments = toJSONOptions ? Boolean(toJSONOptions.keepComments) : false; return util.toObject([ "rule", this.rule !== "optional" && this.rule || void 0, "type", this.type, "id", this.id, "extend", this.extend, "options", this.options, "comment", keepComments ? this.comment : void 0 ]); }; Field.prototype.resolve = function resolve() { if (this.resolved) return this; if ((this.typeDefault = types.defaults[this.type]) === void 0) { this.resolvedType = (this.declaringField ? this.declaringField.parent : this.parent).lookupTypeOrEnum(this.type); if (this.resolvedType instanceof Type) this.typeDefault = null; else this.typeDefault = this.resolvedType.values[Object.keys(this.resolvedType.values)[0]]; } if (this.options && this.options["default"] != null) { this.typeDefault = this.options["default"]; if (this.resolvedType instanceof Enum && typeof this.typeDefault === "string") this.typeDefault = this.resolvedType.values[this.typeDefault]; } if (this.options) { if (this.options.packed === true || this.options.packed !== void 0 && this.resolvedType && !(this.resolvedType instanceof Enum)) delete this.options.packed; if (!Object.keys(this.options).length) this.options = void 0; } if (this.long) { this.typeDefault = util.Long.fromNumber(this.typeDefault, this.type.charAt(0) === "u"); if (Object.freeze) Object.freeze(this.typeDefault); } else if (this.bytes && typeof this.typeDefault === "string") { var buf; if (util.base64.test(this.typeDefault)) util.base64.decode(this.typeDefault, buf = util.newBuffer(util.base64.length(this.typeDefault)), 0); else util.utf8.write(this.typeDefault, buf = util.newBuffer(util.utf8.length(this.typeDefault)), 0); this.typeDefault = buf; } if (this.map) this.defaultValue = util.emptyObject; else if (this.repeated) this.defaultValue = util.emptyArray; else this.defaultValue = this.typeDefault; if (this.parent instanceof Type) this.parent.ctor.prototype[this.name] = this.defaultValue; return ReflectionObject.prototype.resolve.call(this); }; Field.d = function decorateField(fieldId, fieldType, fieldRule, defaultValue) { if (typeof fieldType === "function") fieldType = util.decorateType(fieldType).name; else if (fieldType && typeof fieldType === "object") fieldType = util.decorateEnum(fieldType).name; return function fieldDecorator(prototype, fieldName) { util.decorateType(prototype.constructor).add(new Field(fieldName, fieldId, fieldType, fieldRule, { "default": defaultValue })); }; }; Field._configure = function configure(Type_) { Type = Type_; }; } }); // node_modules/protobufjs/src/oneof.js var require_oneof = __commonJS({ "node_modules/protobufjs/src/oneof.js"(exports2, module2) { "use strict"; module2.exports = OneOf; var ReflectionObject = require_object(); ((OneOf.prototype = Object.create(ReflectionObject.prototype)).constructor = OneOf).className = "OneOf"; var Field = require_field(); var util = require_util(); function OneOf(name, fieldNames, options, comment) { if (!Array.isArray(fieldNames)) { options = fieldNames; fieldNames = void 0; } ReflectionObject.call(this, name, options); if (!(fieldNames === void 0 || Array.isArray(fieldNames))) throw TypeError("fieldNames must be an Array"); this.oneof = fieldNames || []; this.fieldsArray = []; this.comment = comment; } OneOf.fromJSON = function fromJSON(name, json) { return new OneOf(name, json.oneof, json.options, json.comment); }; OneOf.prototype.toJSON = function toJSON(toJSONOptions) { var keepComments = toJSONOptions ? Boolean(toJSONOptions.keepComments) : false; return util.toObject([ "options", this.options, "oneof", this.oneof, "comment", keepComments ? this.comment : void 0 ]); }; function addFieldsToParent(oneof) { if (oneof.parent) { for (var i = 0; i < oneof.fieldsArray.length; ++i) if (!oneof.fieldsArray[i].parent) oneof.parent.add(oneof.fieldsArray[i]); } } OneOf.prototype.add = function add(field) { if (!(field instanceof Field)) throw TypeError("field must be a Field"); if (field.parent && field.parent !== this.parent) field.parent.remove(field); this.oneof.push(field.name); this.fieldsArray.push(field); field.partOf = this; addFieldsToParent(this); return this; }; OneOf.prototype.remove = function remove(field) { if (!(field instanceof Field)) throw TypeError("field must be a Field"); var index = this.fieldsArray.indexOf(field); if (index < 0) throw Error(field + " is not a member of " + this); this.fieldsArray.splice(index, 1); index = this.oneof.indexOf(field.name); if (index > -1) this.oneof.splice(index, 1); field.partOf = null; return this; }; OneOf.prototype.onAdd = function onAdd(parent) { ReflectionObject.prototype.onAdd.call(this, parent); var self2 = this; for (var i = 0; i < this.oneof.length; ++i) { var field = parent.get(this.oneof[i]); if (field && !field.partOf) { field.partOf = self2; self2.fieldsArray.push(field); } } addFieldsToParent(this); }; OneOf.prototype.onRemove = function onRemove(parent) { for (var i = 0, field; i < this.fieldsArray.length; ++i) if ((field = this.fieldsArray[i]).parent) field.parent.remove(field); ReflectionObject.prototype.onRemove.call(this, parent); }; OneOf.d = function decorateOneOf() { var fieldNames = new Array(arguments.length), index = 0; while (index < arguments.length) fieldNames[index] = arguments[index++]; return function oneOfDecorator(prototype, oneofName) { util.decorateType(prototype.constructor).add(new OneOf(oneofName, fieldNames)); Object.defineProperty(prototype, oneofName, { get: util.oneOfGetter(fieldNames), set: util.oneOfSetter(fieldNames) }); }; }; } }); // node_modules/protobufjs/src/namespace.js var require_namespace = __commonJS({ "node_modules/protobufjs/src/namespace.js"(exports2, module2) { "use strict"; module2.exports = Namespace; var ReflectionObject = require_object(); ((Namespace.prototype = Object.create(ReflectionObject.prototype)).constructor = Namespace).className = "Namespace"; var Field = require_field(); var OneOf = require_oneof(); var util = require_util(); var Type; var Service; var Enum; Namespace.fromJSON = function fromJSON(name, json) { return new Namespace(name, json.options).addJSON(json.nested); }; function arrayToJSON(array, toJSONOptions) { if (!(array && array.length)) return void 0; var obj = {}; for (var i = 0; i < array.length; ++i) obj[array[i].name] = array[i].toJSON(toJSONOptions); return obj; } Namespace.arrayToJSON = arrayToJSON; Namespace.isReservedId = function isReservedId(reserved, id) { if (reserved) { for (var i = 0; i < reserved.length; ++i) if (typeof reserved[i] !== "string" && reserved[i][0] <= id && reserved[i][1] > id) return true; } return false; }; Namespace.isReservedName = function isReservedName(reserved, name) { if (reserved) { for (var i = 0; i < reserved.length; ++i) if (reserved[i] === name) return true; } return false; }; function Namespace(name, options) { ReflectionObject.call(this, name, options); this.nested = void 0; this._nestedArray = null; } function clearCache(namespace) { namespace._nestedArray = null; return namespace; } Object.defineProperty(Namespace.prototype, "nestedArray", { get: function() { return this._nestedArray || (this._nestedArray = util.toArray(this.nested)); } }); Namespace.prototype.toJSON = function toJSON(toJSONOptions) { return util.toObject([ "options", this.options, "nested", arrayToJSON(this.nestedArray, toJSONOptions) ]); }; Namespace.prototype.addJSON = function addJSON(nestedJson) { var ns = this; if (nestedJson) { for (var names = Object.keys(nestedJson), i = 0, nested; i < names.length; ++i) { nested = nestedJson[names[i]]; ns.add( (nested.fields !== void 0 ? Type.fromJSON : nested.values !== void 0 ? Enum.fromJSON : nested.methods !== void 0 ? Service.fromJSON : nested.id !== void 0 ? Field.fromJSON : Namespace.fromJSON)(names[i], nested) ); } } return this; }; Namespace.prototype.get = function get3(name) { return this.nested && this.nested[name] || null; }; Namespace.prototype.getEnum = function getEnum(name) { if (this.nested && this.nested[name] instanceof Enum) return this.nested[name].values; throw Error("no such enum: " + name); }; Namespace.prototype.add = function add(object) { if (!(object instanceof Field && object.extend !== void 0 || object instanceof Type || object instanceof Enum || object instanceof Service || object instanceof Namespace || object instanceof OneOf)) throw TypeError("object must be a valid nested object"); if (!this.nested) this.nested = {}; else { var prev = this.get(object.name); if (prev) { if (prev instanceof Namespace && object instanceof Namespace && !(prev instanceof Type || prev instanceof Service)) { var nested = prev.nestedArray; for (var i = 0; i < nested.length; ++i) object.add(nested[i]); this.remove(prev); if (!this.nested) this.nested = {}; object.setOptions(prev.options, true); } else throw Error("duplicate name '" + object.name + "' in " + this); } } this.nested[object.name] = object; object.onAdd(this); return clearCache(this); }; Namespace.prototype.remove = function remove(object) { if (!(object instanceof ReflectionObject)) throw TypeError("object must be a ReflectionObject"); if (object.parent !== this) throw Error(object + " is not a member of " + this); delete this.nested[object.name]; if (!Object.keys(this.nested).length) this.nested = void 0; object.onRemove(this); return clearCache(this); }; Namespace.prototype.define = function define(path2, json) { if (util.isString(path2)) path2 = path2.split("."); else if (!Array.isArray(path2)) throw TypeError("illegal path"); if (path2 && path2.length && path2[0] === "") throw Error("path must be relative"); var ptr = this; while (path2.length > 0) { var part = path2.shift(); if (ptr.nested && ptr.nested[part]) { ptr = ptr.nested[part]; if (!(ptr instanceof Namespace)) throw Error("path conflicts with non-namespace objects"); } else ptr.add(ptr = new Namespace(part)); } if (json) ptr.addJSON(json); return ptr; }; Namespace.prototype.resolveAll = function resolveAll() { var nested = this.nestedArray, i = 0; while (i < nested.length) if (nested[i] instanceof Namespace) nested[i++].resolveAll(); else nested[i++].resolve(); return this.resolve(); }; Namespace.prototype.lookup = function lookup(path2, filterTypes, parentAlreadyChecked) { if (typeof filterTypes === "boolean") { parentAlreadyChecked = filterTypes; filterTypes = void 0; } else if (filterTypes && !Array.isArray(filterTypes)) filterTypes = [filterTypes]; if (util.isString(path2) && path2.length) { if (path2 === ".") return this.root; path2 = path2.split("."); } else if (!path2.length) return this; if (path2[0] === "") return this.root.lookup(path2.slice(1), filterTypes); var found = this.get(path2[0]); if (found) { if (path2.length === 1) { if (!filterTypes || filterTypes.indexOf(found.constructor) > -1) return found; } else if (found instanceof Namespace && (found = found.lookup(path2.slice(1), filterTypes, true))) return found; } else for (var i = 0; i < this.nestedArray.length; ++i) if (this._nestedArray[i] instanceof Namespace && (found = this._nestedArray[i].lookup(path2, filterTypes, true))) return found; if (this.parent === null || parentAlreadyChecked) return null; return this.parent.lookup(path2, filterTypes); }; Namespace.prototype.lookupType = function lookupType(path2) { var found = this.lookup(path2, [Type]); if (!found) throw Error("no such type: " + path2); return found; }; Namespace.prototype.lookupEnum = function lookupEnum(path2) { var found = this.lookup(path2, [Enum]); if (!found) throw Error("no such Enum '" + path2 + "' in " + this); return found; }; Namespace.prototype.lookupTypeOrEnum = function lookupTypeOrEnum(path2) { var found = this.lookup(path2, [Type, Enum]); if (!found) throw Error("no such Type or Enum '" + path2 + "' in " + this); return found; }; Namespace.prototype.lookupService = function lookupService(path2) { var found = this.lookup(path2, [Service]); if (!found) throw Error("no such Service '" + path2 + "' in " + this); return found; }; Namespace._configure = function(Type_, Service_, Enum_) { Type = Type_; Service = Service_; Enum = Enum_; }; } }); // node_modules/protobufjs/src/mapfield.js var require_mapfield = __commonJS({ "node_modules/protobufjs/src/mapfield.js"(exports2, module2) { "use strict"; module2.exports = MapField; var Field = require_field(); ((MapField.prototype = Object.create(Field.prototype)).constructor = MapField).className = "MapField"; var types = require_types(); var util = require_util(); function MapField(name, id, keyType, type, options, comment) { Field.call(this, name, id, type, void 0, void 0, options, comment); if (!util.isString(keyType)) throw TypeError("keyType must be a string"); this.keyType = keyType; this.resolvedKeyType = null; this.map = true; } MapField.fromJSON = function fromJSON(name, json) { return new MapField(name, json.id, json.keyType, json.type, json.options, json.comment); }; MapField.prototype.toJSON = function toJSON(toJSONOptions) { var keepComments = toJSONOptions ? Boolean(toJSONOptions.keepComments) : false; return util.toObject([ "keyType", this.keyType, "type", this.type, "id", this.id, "extend", this.extend, "options", this.options, "comment", keepComments ? this.comment : void 0 ]); }; MapField.prototype.resolve = function resolve() { if (this.resolved) return this; if (types.mapKey[this.keyType] === void 0) throw Error("invalid key type: " + this.keyType); return Field.prototype.resolve.call(this); }; MapField.d = function decorateMapField(fieldId, fieldKeyType, fieldValueType) { if (typeof fieldValueType === "function") fieldValueType = util.decorateType(fieldValueType).name; else if (fieldValueType && typeof fieldValueType === "object") fieldValueType = util.decorateEnum(fieldValueType).name; return function mapFieldDecorator(prototype, fieldName) { util.decorateType(prototype.constructor).add(new MapField(fieldName, fieldId, fieldKeyType, fieldValueType)); }; }; } }); // node_modules/protobufjs/src/method.js var require_method = __commonJS({ "node_modules/protobufjs/src/method.js"(exports2, module2) { "use strict"; module2.exports = Method; var ReflectionObject = require_object(); ((Method.prototype = Object.create(ReflectionObject.prototype)).constructor = Method).className = "Method"; var util = require_util(); function Method(name, type, requestType, responseType, requestStream, responseStream, options, comment, parsedOptions) { if (util.isObject(requestStream)) { options = requestStream; requestStream = responseStream = void 0; } else if (util.isObject(responseStream)) { options = responseStream; responseStream = void 0; } if (!(type === void 0 || util.isString(type))) throw TypeError("type must be a string"); if (!util.isString(requestType)) throw TypeError("requestType must be a string"); if (!util.isString(responseType)) throw TypeError("responseType must be a string"); ReflectionObject.call(this, name, options); this.type = type || "rpc"; this.requestType = requestType; this.requestStream = requestStream ? true : void 0; this.responseType = responseType; this.responseStream = responseStream ? true : void 0; this.resolvedRequestType = null; this.resolvedResponseType = null; this.comment = comment; this.parsedOptions = parsedOptions; } Method.fromJSON = function fromJSON(name, json) { return new Method(name, json.type, json.requestType, json.responseType, json.requestStream, json.responseStream, json.options, json.comment, json.parsedOptions); }; Method.prototype.toJSON = function toJSON(toJSONOptions) { var keepComments = toJSONOptions ? Boolean(toJSONOptions.keepComments) : false; return util.toObject([ "type", this.type !== "rpc" && this.type || void 0, "requestType", this.requestType, "requestStream", this.requestStream, "responseType", this.responseType, "responseStream", this.responseStream, "options", this.options, "comment", keepComments ? this.comment : void 0, "parsedOptions", this.parsedOptions ]); }; Method.prototype.resolve = function resolve() { if (this.resolved) return this; this.resolvedRequestType = this.parent.lookupType(this.requestType); this.resolvedResponseType = this.parent.lookupType(this.responseType); return ReflectionObject.prototype.resolve.call(this); }; } }); // node_modules/protobufjs/src/service.js var require_service2 = __commonJS({ "node_modules/protobufjs/src/service.js"(exports2, module2) { "use strict"; module2.exports = Service; var Namespace = require_namespace(); ((Service.prototype = Object.create(Namespace.prototype)).constructor = Service).className = "Service"; var Method = require_method(); var util = require_util(); var rpc = require_rpc(); function Service(name, options) { Namespace.call(this, name, options); this.methods = {}; this._methodsArray = null; } Service.fromJSON = function fromJSON(name, json) { var service = new Service(name, json.options); if (json.methods) for (var names = Object.keys(json.methods), i = 0; i < names.length; ++i) service.add(Method.fromJSON(names[i], json.methods[names[i]])); if (json.nested) service.addJSON(json.nested); service.comment = json.comment; return service; }; Service.prototype.toJSON = function toJSON(toJSONOptions) { var inherited = Namespace.prototype.toJSON.call(this, toJSONOptions); var keepComments = toJSONOptions ? Boolean(toJSONOptions.keepComments) : false; return util.toObject([ "options", inherited && inherited.options || void 0, "methods", Namespace.arrayToJSON(this.methodsArray, toJSONOptions) || {}, "nested", inherited && inherited.nested || void 0, "comment", keepComments ? this.comment : void 0 ]); }; Object.defineProperty(Service.prototype, "methodsArray", { get: function() { return this._methodsArray || (this._methodsArray = util.toArray(this.methods)); } }); function clearCache(service) { service._methodsArray = null; return service; } Service.prototype.get = function get3(name) { return this.methods[name] || Namespace.prototype.get.call(this, name); }; Service.prototype.resolveAll = function resolveAll() { var methods = this.methodsArray; for (var i = 0; i < methods.length; ++i) methods[i].resolve(); return Namespace.prototype.resolve.call(this); }; Service.prototype.add = function add(object) { if (this.get(object.name)) throw Error("duplicate name '" + object.name + "' in " + this); if (object instanceof Method) { this.methods[object.name] = object; object.parent = this; return clearCache(this); } return Namespace.prototype.add.call(this, object); }; Service.prototype.remove = function remove(object) { if (object instanceof Method) { if (this.methods[object.name] !== object) throw Error(object + " is not a member of " + this); delete this.methods[object.name]; object.parent = null; return clearCache(this); } return Namespace.prototype.remove.call(this, object); }; Service.prototype.create = function create(rpcImpl, requestDelimited, responseDelimited) { var rpcService = new rpc.Service(rpcImpl, requestDelimited, responseDelimited); for (var i = 0, method; i < this.methodsArray.length; ++i) { var methodName = util.lcFirst((method = this._methodsArray[i]).resolve().name).replace(/[^\$\\w_]/g, ""); rpcService[methodName] = util.codegen(["r", "c"], util.isReserved(methodName) ? methodName + "_" : methodName)("return this.rpcCall(m,q,s,r,c)")({ m: method, q: method.resolvedRequestType.ctor, s: method.resolvedResponseType.ctor }); } return rpcService; }; } }); // node_modules/protobufjs/src/message.js var require_message = __commonJS({ "node_modules/protobufjs/src/message.js"(exports2, module2) { "use strict"; module2.exports = Message; var util = require_minimal(); function Message(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) this[keys[i]] = properties[keys[i]]; } Message.create = function create(properties) { return this.\$type.create(properties); }; Message.encode = function encode(message2, writer) { return this.\$type.encode(message2, writer); }; Message.encodeDelimited = function encodeDelimited(message2, writer) { return this.\$type.encodeDelimited(message2, writer); }; Message.decode = function decode(reader) { return this.\$type.decode(reader); }; Message.decodeDelimited = function decodeDelimited(reader) { return this.\$type.decodeDelimited(reader); }; Message.verify = function verify(message2) { return this.\$type.verify(message2); }; Message.fromObject = function fromObject(object) { return this.\$type.fromObject(object); }; Message.toObject = function toObject(message2, options) { return this.\$type.toObject(message2, options); }; Message.prototype.toJSON = function toJSON() { return this.\$type.toObject(this, util.toJSONOptions); }; } }); // node_modules/protobufjs/src/decoder.js var require_decoder = __commonJS({ "node_modules/protobufjs/src/decoder.js"(exports2, module2) { "use strict"; module2.exports = decoder; var Enum = require_enum(); var types = require_types(); var util = require_util(); function missing(field) { return "missing required '" + field.name + "'"; } function decoder(mtype) { var gen = util.codegen(["r", "l"], mtype.name + "\$decode")("if(!(r instanceof Reader))")("r=Reader.create(r)")("var c=l===undefined?r.len:r.pos+l,m=new this.ctor" + (mtype.fieldsArray.filter(function(field2) { return field2.map; }).length ? ",k,value" : ""))("while(r.pos<c){")("var t=r.uint32()"); if (mtype.group) gen("if((t&7)===4)")("break"); gen("switch(t>>>3){"); var i = 0; for (; i < mtype.fieldsArray.length; ++i) { var field = mtype._fieldsArray[i].resolve(), type = field.resolvedType instanceof Enum ? "int32" : field.type, ref = "m" + util.safeProp(field.name); gen("case %i:", field.id); if (field.map) { gen("if(%s===util.emptyObject)", ref)("%s={}", ref)("var c2 = r.uint32()+r.pos"); if (types.defaults[field.keyType] !== void 0) gen("k=%j", types.defaults[field.keyType]); else gen("k=null"); if (types.defaults[type] !== void 0) gen("value=%j", types.defaults[type]); else gen("value=null"); gen("while(r.pos<c2){")("var tag2=r.uint32()")("switch(tag2>>>3){")("case 1: k=r.%s(); break", field.keyType)("case 2:"); if (types.basic[type] === void 0) gen("value=types[%i].decode(r,r.uint32())", i); else gen("value=r.%s()", type); gen("break")("default:")("r.skipType(tag2&7)")("break")("}")("}"); if (types.long[field.keyType] !== void 0) gen('%s[typeof k==="object"?util.longToHash(k):k]=value', ref); else gen("%s[k]=value", ref); } else if (field.repeated) { gen("if(!(%s&&%s.length))", ref, ref)("%s=[]", ref); if (types.packed[type] !== void 0) gen("if((t&7)===2){")("var c2=r.uint32()+r.pos")("while(r.pos<c2)")("%s.push(r.%s())", ref, type)("}else"); if (types.basic[type] === void 0) gen(field.resolvedType.group ? "%s.push(types[%i].decode(r))" : "%s.push(types[%i].decode(r,r.uint32()))", ref, i); else gen("%s.push(r.%s())", ref, type); } else if (types.basic[type] === void 0) gen(field.resolvedType.group ? "%s=types[%i].decode(r)" : "%s=types[%i].decode(r,r.uint32())", ref, i); else gen("%s=r.%s()", ref, type); gen("break"); } gen("default:")("r.skipType(t&7)")("break")("}")("}"); for (i = 0; i < mtype._fieldsArray.length; ++i) { var rfield = mtype._fieldsArray[i]; if (rfield.required) gen("if(!m.hasOwnProperty(%j))", rfield.name)("throw util.ProtocolError(%j,{instance:m})", missing(rfield)); } return gen("return m"); } } }); // node_modules/protobufjs/src/verifier.js var require_verifier = __commonJS({ "node_modules/protobufjs/src/verifier.js"(exports2, module2) { "use strict"; module2.exports = verifier; var Enum = require_enum(); var util = require_util(); function invalid(field, expected) { return field.name + ": " + expected + (field.repeated && expected !== "array" ? "[]" : field.map && expected !== "object" ? "{k:" + field.keyType + "}" : "") + " expected"; } function genVerifyValue(gen, field, fieldIndex, ref) { if (field.resolvedType) { if (field.resolvedType instanceof Enum) { gen("switch(%s){", ref)("default:")("return%j", invalid(field, "enum value")); for (var keys = Object.keys(field.resolvedType.values), j = 0; j < keys.length; ++j) gen("case %i:", field.resolvedType.values[keys[j]]); gen("break")("}"); } else { gen("{")("var e=types[%i].verify(%s);", fieldIndex, ref)("if(e)")("return%j+e", field.name + ".")("}"); } } else { switch (field.type) { case "int32": case "uint32": case "sint32": case "fixed32": case "sfixed32": gen("if(!util.isInteger(%s))", ref)("return%j", invalid(field, "integer")); break; case "int64": case "uint64": case "sint64": case "fixed64": case "sfixed64": gen("if(!util.isInteger(%s)&&!(%s&&util.isInteger(%s.low)&&util.isInteger(%s.high)))", ref, ref, ref, ref)("return%j", invalid(field, "integer|Long")); break; case "float": case "double": gen('if(typeof %s!=="number")', ref)("return%j", invalid(field, "number")); break; case "bool": gen('if(typeof %s!=="boolean")', ref)("return%j", invalid(field, "boolean")); break; case "string": gen("if(!util.isString(%s))", ref)("return%j", invalid(field, "string")); break; case "bytes": gen('if(!(%s&&typeof %s.length==="number"||util.isString(%s)))', ref, ref, ref)("return%j", invalid(field, "buffer")); break; } } return gen; } function genVerifyKey(gen, field, ref) { switch (field.keyType) { case "int32": case "uint32": case "sint32": case "fixed32": case "sfixed32": gen("if(!util.key32Re.test(%s))", ref)("return%j", invalid(field, "integer key")); break; case "int64": case "uint64": case "sint64": case "fixed64": case "sfixed64": gen("if(!util.key64Re.test(%s))", ref)("return%j", invalid(field, "integer|Long key")); break; case "bool": gen("if(!util.key2Re.test(%s))", ref)("return%j", invalid(field, "boolean key")); break; } return gen; } function verifier(mtype) { var gen = util.codegen(["m"], mtype.name + "\$verify")('if(typeof m!=="object"||m===null)')("return%j", "object expected"); var oneofs = mtype.oneofsArray, seenFirstField = {}; if (oneofs.length) gen("var p={}"); for (var i = 0; i < mtype.fieldsArray.length; ++i) { var field = mtype._fieldsArray[i].resolve(), ref = "m" + util.safeProp(field.name); if (field.optional) gen("if(%s!=null&&m.hasOwnProperty(%j)){", ref, field.name); if (field.map) { gen("if(!util.isObject(%s))", ref)("return%j", invalid(field, "object"))("var k=Object.keys(%s)", ref)("for(var i=0;i<k.length;++i){"); genVerifyKey(gen, field, "k[i]"); genVerifyValue(gen, field, i, ref + "[k[i]]")("}"); } else if (field.repeated) { gen("if(!Array.isArray(%s))", ref)("return%j", invalid(field, "array"))("for(var i=0;i<%s.length;++i){", ref); genVerifyValue(gen, field, i, ref + "[i]")("}"); } else { if (field.partOf) { var oneofProp = util.safeProp(field.partOf.name); if (seenFirstField[field.partOf.name] === 1) gen("if(p%s===1)", oneofProp)("return%j", field.partOf.name + ": multiple values"); seenFirstField[field.partOf.name] = 1; gen("p%s=1", oneofProp); } genVerifyValue(gen, field, i, ref); } if (field.optional) gen("}"); } return gen("return null"); } } }); // node_modules/protobufjs/src/converter.js var require_converter = __commonJS({ "node_modules/protobufjs/src/converter.js"(exports2) { "use strict"; var converter = exports2; var Enum = require_enum(); var util = require_util(); function genValuePartial_fromObject(gen, field, fieldIndex, prop) { if (field.resolvedType) { if (field.resolvedType instanceof Enum) { gen("switch(d%s){", prop); for (var values = field.resolvedType.values, keys = Object.keys(values), i = 0; i < keys.length; ++i) { if (field.repeated && values[keys[i]] === field.typeDefault) gen("default:"); gen("case%j:", keys[i])("case %i:", values[keys[i]])("m%s=%j", prop, values[keys[i]])("break"); } gen("}"); } else gen('if(typeof d%s!=="object")', prop)("throw TypeError(%j)", field.fullName + ": object expected")("m%s=types[%i].fromObject(d%s)", prop, fieldIndex, prop); } else { var isUnsigned = false; switch (field.type) { case "double": case "float": gen("m%s=Number(d%s)", prop, prop); break; case "uint32": case "fixed32": gen("m%s=d%s>>>0", prop, prop); break; case "int32": case "sint32": case "sfixed32": gen("m%s=d%s|0", prop, prop); break; case "uint64": isUnsigned = true; case "int64": case "sint64": case "fixed64": case "sfixed64": gen("if(util.Long)")("(m%s=util.Long.fromValue(d%s)).unsigned=%j", prop, prop, isUnsigned)('else if(typeof d%s==="string")', prop)("m%s=parseInt(d%s,10)", prop, prop)('else if(typeof d%s==="number")', prop)("m%s=d%s", prop, prop)('else if(typeof d%s==="object")', prop)("m%s=new util.LongBits(d%s.low>>>0,d%s.high>>>0).toNumber(%s)", prop, prop, prop, isUnsigned ? "true" : ""); break; case "bytes": gen('if(typeof d%s==="string")', prop)("util.base64.decode(d%s,m%s=util.newBuffer(util.base64.length(d%s)),0)", prop, prop, prop)("else if(d%s.length)", prop)("m%s=d%s", prop, prop); break; case "string": gen("m%s=String(d%s)", prop, prop); break; case "bool": gen("m%s=Boolean(d%s)", prop, prop); break; } } return gen; } converter.fromObject = function fromObject(mtype) { var fields = mtype.fieldsArray; var gen = util.codegen(["d"], mtype.name + "\$fromObject")("if(d instanceof this.ctor)")("return d"); if (!fields.length) return gen("return new this.ctor"); gen("var m=new this.ctor"); for (var i = 0; i < fields.length; ++i) { var field = fields[i].resolve(), prop = util.safeProp(field.name); if (field.map) { gen("if(d%s){", prop)('if(typeof d%s!=="object")', prop)("throw TypeError(%j)", field.fullName + ": object expected")("m%s={}", prop)("for(var ks=Object.keys(d%s),i=0;i<ks.length;++i){", prop); genValuePartial_fromObject(gen, field, i, prop + "[ks[i]]")("}")("}"); } else if (field.repeated) { gen("if(d%s){", prop)("if(!Array.isArray(d%s))", prop)("throw TypeError(%j)", field.fullName + ": array expected")("m%s=[]", prop)("for(var i=0;i<d%s.length;++i){", prop); genValuePartial_fromObject(gen, field, i, prop + "[i]")("}")("}"); } else { if (!(field.resolvedType instanceof Enum)) gen("if(d%s!=null){", prop); genValuePartial_fromObject(gen, field, i, prop); if (!(field.resolvedType instanceof Enum)) gen("}"); } } return gen("return m"); }; function genValuePartial_toObject(gen, field, fieldIndex, prop) { if (field.resolvedType) { if (field.resolvedType instanceof Enum) gen("d%s=o.enums===String?types[%i].values[m%s]:m%s", prop, fieldIndex, prop, prop); else gen("d%s=types[%i].toObject(m%s,o)", prop, fieldIndex, prop); } else { var isUnsigned = false; switch (field.type) { case "double": case "float": gen("d%s=o.json&&!isFinite(m%s)?String(m%s):m%s", prop, prop, prop, prop); break; case "uint64": isUnsigned = true; case "int64": case "sint64": case "fixed64": case "sfixed64": gen('if(typeof m%s==="number")', prop)("d%s=o.longs===String?String(m%s):m%s", prop, prop, prop)("else")("d%s=o.longs===String?util.Long.prototype.toString.call(m%s):o.longs===Number?new util.LongBits(m%s.low>>>0,m%s.high>>>0).toNumber(%s):m%s", prop, prop, prop, prop, isUnsigned ? "true" : "", prop); break; case "bytes": gen("d%s=o.bytes===String?util.base64.encode(m%s,0,m%s.length):o.bytes===Array?Array.prototype.slice.call(m%s):m%s", prop, prop, prop, prop, prop); break; default: gen("d%s=m%s", prop, prop); break; } } return gen; } converter.toObject = function toObject(mtype) { var fields = mtype.fieldsArray.slice().sort(util.compareFieldsById); if (!fields.length) return util.codegen()("return {}"); var gen = util.codegen(["m", "o"], mtype.name + "\$toObject")("if(!o)")("o={}")("var d={}"); var repeatedFields = [], mapFields = [], normalFields = [], i = 0; for (; i < fields.length; ++i) if (!fields[i].partOf) (fields[i].resolve().repeated ? repeatedFields : fields[i].map ? mapFields : normalFields).push(fields[i]); if (repeatedFields.length) { gen("if(o.arrays||o.defaults){"); for (i = 0; i < repeatedFields.length; ++i) gen("d%s=[]", util.safeProp(repeatedFields[i].name)); gen("}"); } if (mapFields.length) { gen("if(o.objects||o.defaults){"); for (i = 0; i < mapFields.length; ++i) gen("d%s={}", util.safeProp(mapFields[i].name)); gen("}"); } if (normalFields.length) { gen("if(o.defaults){"); for (i = 0; i < normalFields.length; ++i) { var field = normalFields[i], prop = util.safeProp(field.name); if (field.resolvedType instanceof Enum) gen("d%s=o.enums===String?%j:%j", prop, field.resolvedType.valuesById[field.typeDefault], field.typeDefault); else if (field.long) gen("if(util.Long){")("var n=new util.Long(%i,%i,%j)", field.typeDefault.low, field.typeDefault.high, field.typeDefault.unsigned)("d%s=o.longs===String?n.toString():o.longs===Number?n.toNumber():n", prop)("}else")("d%s=o.longs===String?%j:%i", prop, field.typeDefault.toString(), field.typeDefault.toNumber()); else if (field.bytes) { var arrayDefault = "[" + Array.prototype.slice.call(field.typeDefault).join(",") + "]"; gen("if(o.bytes===String)d%s=%j", prop, String.fromCharCode.apply(String, field.typeDefault))("else{")("d%s=%s", prop, arrayDefault)("if(o.bytes!==Array)d%s=util.newBuffer(d%s)", prop, prop)("}"); } else gen("d%s=%j", prop, field.typeDefault); } gen("}"); } var hasKs2 = false; for (i = 0; i < fields.length; ++i) { var field = fields[i], index = mtype._fieldsArray.indexOf(field), prop = util.safeProp(field.name); if (field.map) { if (!hasKs2) { hasKs2 = true; gen("var ks2"); } gen("if(m%s&&(ks2=Object.keys(m%s)).length){", prop, prop)("d%s={}", prop)("for(var j=0;j<ks2.length;++j){"); genValuePartial_toObject(gen, field, index, prop + "[ks2[j]]")("}"); } else if (field.repeated) { gen("if(m%s&&m%s.length){", prop, prop)("d%s=[]", prop)("for(var j=0;j<m%s.length;++j){", prop); genValuePartial_toObject(gen, field, index, prop + "[j]")("}"); } else { gen("if(m%s!=null&&m.hasOwnProperty(%j)){", prop, field.name); genValuePartial_toObject(gen, field, index, prop); if (field.partOf) gen("if(o.oneofs)")("d%s=%j", util.safeProp(field.partOf.name), field.name); } gen("}"); } return gen("return d"); }; } }); // node_modules/protobufjs/src/wrappers.js var require_wrappers = __commonJS({ "node_modules/protobufjs/src/wrappers.js"(exports2) { "use strict"; var wrappers = exports2; var Message = require_message(); wrappers[".google.protobuf.Any"] = { fromObject: function(object) { if (object && object["@type"]) { var name = object["@type"].substring(object["@type"].lastIndexOf("/") + 1); var type = this.lookup(name); if (type) { var type_url = object["@type"].charAt(0) === "." ? object["@type"].substr(1) : object["@type"]; if (type_url.indexOf("/") === -1) { type_url = "/" + type_url; } return this.create({ type_url, value: type.encode(type.fromObject(object)).finish() }); } } return this.fromObject(object); }, toObject: function(message2, options) { var googleApi = "type.googleapis.com/"; var prefix = ""; var name = ""; if (options && options.json && message2.type_url && message2.value) { name = message2.type_url.substring(message2.type_url.lastIndexOf("/") + 1); prefix = message2.type_url.substring(0, message2.type_url.lastIndexOf("/") + 1); var type = this.lookup(name); if (type) message2 = type.decode(message2.value); } if (!(message2 instanceof this.ctor) && message2 instanceof Message) { var object = message2.\$type.toObject(message2, options); var messageName = message2.\$type.fullName[0] === "." ? message2.\$type.fullName.substr(1) : message2.\$type.fullName; if (prefix === "") { prefix = googleApi; } name = prefix + messageName; object["@type"] = name; return object; } return this.toObject(message2, options); } }; } }); // node_modules/protobufjs/src/type.js var require_type = __commonJS({ "node_modules/protobufjs/src/type.js"(exports2, module2) { "use strict"; module2.exports = Type; var Namespace = require_namespace(); ((Type.prototype = Object.create(Namespace.prototype)).constructor = Type).className = "Type"; var Enum = require_enum(); var OneOf = require_oneof(); var Field = require_field(); var MapField = require_mapfield(); var Service = require_service2(); var Message = require_message(); var Reader = require_reader(); var Writer = require_writer(); var util = require_util(); var encoder2 = require_encoder(); var decoder = require_decoder(); var verifier = require_verifier(); var converter = require_converter(); var wrappers = require_wrappers(); function Type(name, options) { Namespace.call(this, name, options); this.fields = {}; this.oneofs = void 0; this.extensions = void 0; this.reserved = void 0; this.group = void 0; this._fieldsById = null; this._fieldsArray = null; this._oneofsArray = null; this._ctor = null; } Object.defineProperties(Type.prototype, { fieldsById: { get: function() { if (this._fieldsById) return this._fieldsById; this._fieldsById = {}; for (var names = Object.keys(this.fields), i = 0; i < names.length; ++i) { var field = this.fields[names[i]], id = field.id; if (this._fieldsById[id]) throw Error("duplicate id " + id + " in " + this); this._fieldsById[id] = field; } return this._fieldsById; } }, fieldsArray: { get: function() { return this._fieldsArray || (this._fieldsArray = util.toArray(this.fields)); } }, oneofsArray: { get: function() { return this._oneofsArray || (this._oneofsArray = util.toArray(this.oneofs)); } }, ctor: { get: function() { return this._ctor || (this.ctor = Type.generateConstructor(this)()); }, set: function(ctor) { var prototype = ctor.prototype; if (!(prototype instanceof Message)) { (ctor.prototype = new Message()).constructor = ctor; util.merge(ctor.prototype, prototype); } ctor.\$type = ctor.prototype.\$type = this; util.merge(ctor, Message, true); this._ctor = ctor; var i = 0; for (; i < this.fieldsArray.length; ++i) this._fieldsArray[i].resolve(); var ctorProperties = {}; for (i = 0; i < this.oneofsArray.length; ++i) ctorProperties[this._oneofsArray[i].resolve().name] = { get: util.oneOfGetter(this._oneofsArray[i].oneof), set: util.oneOfSetter(this._oneofsArray[i].oneof) }; if (i) Object.defineProperties(ctor.prototype, ctorProperties); } } }); Type.generateConstructor = function generateConstructor(mtype) { var gen = util.codegen(["p"], mtype.name); for (var i = 0, field; i < mtype.fieldsArray.length; ++i) if ((field = mtype._fieldsArray[i]).map) gen("this%s={}", util.safeProp(field.name)); else if (field.repeated) gen("this%s=[]", util.safeProp(field.name)); return gen("if(p)for(var ks=Object.keys(p),i=0;i<ks.length;++i)if(p[ks[i]]!=null)")("this[ks[i]]=p[ks[i]]"); }; function clearCache(type) { type._fieldsById = type._fieldsArray = type._oneofsArray = null; delete type.encode; delete type.decode; delete type.verify; return type; } Type.fromJSON = function fromJSON(name, json) { var type = new Type(name, json.options); type.extensions = json.extensions; type.reserved = json.reserved; var names = Object.keys(json.fields), i = 0; for (; i < names.length; ++i) type.add( (typeof json.fields[names[i]].keyType !== "undefined" ? MapField.fromJSON : Field.fromJSON)(names[i], json.fields[names[i]]) ); if (json.oneofs) for (names = Object.keys(json.oneofs), i = 0; i < names.length; ++i) type.add(OneOf.fromJSON(names[i], json.oneofs[names[i]])); if (json.nested) for (names = Object.keys(json.nested), i = 0; i < names.length; ++i) { var nested = json.nested[names[i]]; type.add( (nested.id !== void 0 ? Field.fromJSON : nested.fields !== void 0 ? Type.fromJSON : nested.values !== void 0 ? Enum.fromJSON : nested.methods !== void 0 ? Service.fromJSON : Namespace.fromJSON)(names[i], nested) ); } if (json.extensions && json.extensions.length) type.extensions = json.extensions; if (json.reserved && json.reserved.length) type.reserved = json.reserved; if (json.group) type.group = true; if (json.comment) type.comment = json.comment; return type; }; Type.prototype.toJSON = function toJSON(toJSONOptions) { var inherited = Namespace.prototype.toJSON.call(this, toJSONOptions); var keepComments = toJSONOptions ? Boolean(toJSONOptions.keepComments) : false; return util.toObject([ "options", inherited && inherited.options || void 0, "oneofs", Namespace.arrayToJSON(this.oneofsArray, toJSONOptions), "fields", Namespace.arrayToJSON(this.fieldsArray.filter(function(obj) { return !obj.declaringField; }), toJSONOptions) || {}, "extensions", this.extensions && this.extensions.length ? this.extensions : void 0, "reserved", this.reserved && this.reserved.length ? this.reserved : void 0, "group", this.group || void 0, "nested", inherited && inherited.nested || void 0, "comment", keepComments ? this.comment : void 0 ]); }; Type.prototype.resolveAll = function resolveAll() { var fields = this.fieldsArray, i = 0; while (i < fields.length) fields[i++].resolve(); var oneofs = this.oneofsArray; i = 0; while (i < oneofs.length) oneofs[i++].resolve(); return Namespace.prototype.resolveAll.call(this); }; Type.prototype.get = function get3(name) { return this.fields[name] || this.oneofs && this.oneofs[name] || this.nested && this.nested[name] || null; }; Type.prototype.add = function add(object) { if (this.get(object.name)) throw Error("duplicate name '" + object.name + "' in " + this); if (object instanceof Field && object.extend === void 0) { if (this._fieldsById ? this._fieldsById[object.id] : this.fieldsById[object.id]) throw Error("duplicate id " + object.id + " in " + this); if (this.isReservedId(object.id)) throw Error("id " + object.id + " is reserved in " + this); if (this.isReservedName(object.name)) throw Error("name '" + object.name + "' is reserved in " + this); if (object.parent) object.parent.remove(object); this.fields[object.name] = object; object.message = this; object.onAdd(this); return clearCache(this); } if (object instanceof OneOf) { if (!this.oneofs) this.oneofs = {}; this.oneofs[object.name] = object; object.onAdd(this); return clearCache(this); } return Namespace.prototype.add.call(this, object); }; Type.prototype.remove = function remove(object) { if (object instanceof Field && object.extend === void 0) { if (!this.fields || this.fields[object.name] !== object) throw Error(object + " is not a member of " + this); delete this.fields[object.name]; object.parent = null; object.onRemove(this); return clearCache(this); } if (object instanceof OneOf) { if (!this.oneofs || this.oneofs[object.name] !== object) throw Error(object + " is not a member of " + this); delete this.oneofs[object.name]; object.parent = null; object.onRemove(this); return clearCache(this); } return Namespace.prototype.remove.call(this, object); }; Type.prototype.isReservedId = function isReservedId(id) { return Namespace.isReservedId(this.reserved, id); }; Type.prototype.isReservedName = function isReservedName(name) { return Namespace.isReservedName(this.reserved, name); }; Type.prototype.create = function create(properties) { return new this.ctor(properties); }; Type.prototype.setup = function setup() { var fullName = this.fullName, types = []; for (var i = 0; i < this.fieldsArray.length; ++i) types.push(this._fieldsArray[i].resolve().resolvedType); this.encode = encoder2(this)({ Writer, types, util }); this.decode = decoder(this)({ Reader, types, util }); this.verify = verifier(this)({ types, util }); this.fromObject = converter.fromObject(this)({ types, util }); this.toObject = converter.toObject(this)({ types, util }); var wrapper = wrappers[fullName]; if (wrapper) { var originalThis = Object.create(this); originalThis.fromObject = this.fromObject; this.fromObject = wrapper.fromObject.bind(originalThis); originalThis.toObject = this.toObject; this.toObject = wrapper.toObject.bind(originalThis); } return this; }; Type.prototype.encode = function encode_setup(message2, writer) { return this.setup().encode(message2, writer); }; Type.prototype.encodeDelimited = function encodeDelimited(message2, writer) { return this.encode(message2, writer && writer.len ? writer.fork() : writer).ldelim(); }; Type.prototype.decode = function decode_setup(reader, length) { return this.setup().decode(reader, length); }; Type.prototype.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof Reader)) reader = Reader.create(reader); return this.decode(reader, reader.uint32()); }; Type.prototype.verify = function verify_setup(message2) { return this.setup().verify(message2); }; Type.prototype.fromObject = function fromObject(object) { return this.setup().fromObject(object); }; Type.prototype.toObject = function toObject(message2, options) { return this.setup().toObject(message2, options); }; Type.d = function decorateType(typeName) { return function typeDecorator(target) { util.decorateType(target, typeName); }; }; } }); // node_modules/protobufjs/src/root.js var require_root = __commonJS({ "node_modules/protobufjs/src/root.js"(exports2, module2) { "use strict"; module2.exports = Root; var Namespace = require_namespace(); ((Root.prototype = Object.create(Namespace.prototype)).constructor = Root).className = "Root"; var Field = require_field(); var Enum = require_enum(); var OneOf = require_oneof(); var util = require_util(); var Type; var parse; var common; function Root(options) { Namespace.call(this, "", options); this.deferred = []; this.files = []; } Root.fromJSON = function fromJSON(json, root3) { if (!root3) root3 = new Root(); if (json.options) root3.setOptions(json.options); return root3.addJSON(json.nested); }; Root.prototype.resolvePath = util.path.resolve; Root.prototype.fetch = util.fetch; function SYNC() { } Root.prototype.load = function load3(filename, options, callback) { if (typeof options === "function") { callback = options; options = void 0; } var self2 = this; if (!callback) return util.asPromise(load3, self2, filename, options); var sync = callback === SYNC; function finish(err, root3) { if (!callback) return; var cb = callback; callback = null; if (sync) throw err; cb(err, root3); } function getBundledFileName(filename2) { var idx = filename2.lastIndexOf("google/protobuf/"); if (idx > -1) { var altname = filename2.substring(idx); if (altname in common) return altname; } return null; } function process(filename2, source) { try { if (util.isString(source) && source.charAt(0) === "{") source = JSON.parse(source); if (!util.isString(source)) self2.setOptions(source.options).addJSON(source.nested); else { parse.filename = filename2; var parsed = parse(source, self2, options), resolved2, i2 = 0; if (parsed.imports) { for (; i2 < parsed.imports.length; ++i2) if (resolved2 = getBundledFileName(parsed.imports[i2]) || self2.resolvePath(filename2, parsed.imports[i2])) fetch2(resolved2); } if (parsed.weakImports) { for (i2 = 0; i2 < parsed.weakImports.length; ++i2) if (resolved2 = getBundledFileName(parsed.weakImports[i2]) || self2.resolvePath(filename2, parsed.weakImports[i2])) fetch2(resolved2, true); } } } catch (err) { finish(err); } if (!sync && !queued) finish(null, self2); } function fetch2(filename2, weak) { if (self2.files.indexOf(filename2) > -1) return; self2.files.push(filename2); if (filename2 in common) { if (sync) process(filename2, common[filename2]); else { ++queued; setTimeout(function() { --queued; process(filename2, common[filename2]); }); } return; } if (sync) { var source; try { source = util.fs.readFileSync(filename2).toString("utf8"); } catch (err) { if (!weak) finish(err); return; } process(filename2, source); } else { ++queued; self2.fetch(filename2, function(err, source2) { --queued; if (!callback) return; if (err) { if (!weak) finish(err); else if (!queued) finish(null, self2); return; } process(filename2, source2); }); } } var queued = 0; if (util.isString(filename)) filename = [filename]; for (var i = 0, resolved; i < filename.length; ++i) if (resolved = self2.resolvePath("", filename[i])) fetch2(resolved); if (sync) return self2; if (!queued) finish(null, self2); return void 0; }; Root.prototype.loadSync = function loadSync(filename, options) { if (!util.isNode) throw Error("not supported"); return this.load(filename, options, SYNC); }; Root.prototype.resolveAll = function resolveAll() { if (this.deferred.length) throw Error("unresolvable extensions: " + this.deferred.map(function(field) { return "'extend " + field.extend + "' in " + field.parent.fullName; }).join(", ")); return Namespace.prototype.resolveAll.call(this); }; var exposeRe = /^[A-Z]/; function tryHandleExtension(root3, field) { var extendedType = field.parent.lookup(field.extend); if (extendedType) { var sisterField = new Field(field.fullName, field.id, field.type, field.rule, void 0, field.options); sisterField.declaringField = field; field.extensionField = sisterField; extendedType.add(sisterField); return true; } return false; } Root.prototype._handleAdd = function _handleAdd(object) { if (object instanceof Field) { if (object.extend !== void 0 && !object.extensionField) { if (!tryHandleExtension(this, object)) this.deferred.push(object); } } else if (object instanceof Enum) { if (exposeRe.test(object.name)) object.parent[object.name] = object.values; } else if (!(object instanceof OneOf)) { if (object instanceof Type) for (var i = 0; i < this.deferred.length; ) if (tryHandleExtension(this, this.deferred[i])) this.deferred.splice(i, 1); else ++i; for (var j = 0; j < object.nestedArray.length; ++j) this._handleAdd(object._nestedArray[j]); if (exposeRe.test(object.name)) object.parent[object.name] = object; } }; Root.prototype._handleRemove = function _handleRemove(object) { if (object instanceof Field) { if (object.extend !== void 0) { if (object.extensionField) { object.extensionField.parent.remove(object.extensionField); object.extensionField = null; } else { var index = this.deferred.indexOf(object); if (index > -1) this.deferred.splice(index, 1); } } } else if (object instanceof Enum) { if (exposeRe.test(object.name)) delete object.parent[object.name]; } else if (object instanceof Namespace) { for (var i = 0; i < object.nestedArray.length; ++i) this._handleRemove(object._nestedArray[i]); if (exposeRe.test(object.name)) delete object.parent[object.name]; } }; Root._configure = function(Type_, parse_, common_) { Type = Type_; parse = parse_; common = common_; }; } }); // node_modules/protobufjs/src/util.js var require_util = __commonJS({ "node_modules/protobufjs/src/util.js"(exports2, module2) { "use strict"; var util = module2.exports = require_minimal(); var roots = require_roots(); var Type; var Enum; util.codegen = require_codegen(); util.fetch = require_fetch(); util.path = require_path(); util.fs = util.inquire("fs"); util.toArray = function toArray(object) { if (object) { var keys = Object.keys(object), array = new Array(keys.length), index = 0; while (index < keys.length) array[index] = object[keys[index++]]; return array; } return []; }; util.toObject = function toObject(array) { var object = {}, index = 0; while (index < array.length) { var key = array[index++], val = array[index++]; if (val !== void 0) object[key] = val; } return object; }; var safePropBackslashRe = /\\\\/g; var safePropQuoteRe = /"/g; util.isReserved = function isReserved(name) { return /^(?:do|if|in|for|let|new|try|var|case|else|enum|eval|false|null|this|true|void|with|break|catch|class|const|super|throw|while|yield|delete|export|import|public|return|static|switch|typeof|default|extends|finally|package|private|continue|debugger|function|arguments|interface|protected|implements|instanceof)\$/.test(name); }; util.safeProp = function safeProp(prop) { if (!/^[\$\\w_]+\$/.test(prop) || util.isReserved(prop)) return '["' + prop.replace(safePropBackslashRe, "\\\\\\\\").replace(safePropQuoteRe, '\\\\"') + '"]'; return "." + prop; }; util.ucFirst = function ucFirst(str) { return str.charAt(0).toUpperCase() + str.substring(1); }; var camelCaseRe = /_([a-z])/g; util.camelCase = function camelCase(str) { return str.substring(0, 1) + str.substring(1).replace(camelCaseRe, function(\$0, \$1) { return \$1.toUpperCase(); }); }; util.compareFieldsById = function compareFieldsById(a, b) { return a.id - b.id; }; util.decorateType = function decorateType(ctor, typeName) { if (ctor.\$type) { if (typeName && ctor.\$type.name !== typeName) { util.decorateRoot.remove(ctor.\$type); ctor.\$type.name = typeName; util.decorateRoot.add(ctor.\$type); } return ctor.\$type; } if (!Type) Type = require_type(); var type = new Type(typeName || ctor.name); util.decorateRoot.add(type); type.ctor = ctor; Object.defineProperty(ctor, "\$type", { value: type, enumerable: false }); Object.defineProperty(ctor.prototype, "\$type", { value: type, enumerable: false }); return type; }; var decorateEnumIndex = 0; util.decorateEnum = function decorateEnum(object) { if (object.\$type) return object.\$type; if (!Enum) Enum = require_enum(); var enm = new Enum("Enum" + decorateEnumIndex++, object); util.decorateRoot.add(enm); Object.defineProperty(object, "\$type", { value: enm, enumerable: false }); return enm; }; util.setProperty = function setProperty(dst, path2, value) { function setProp(dst2, path3, value2) { var part = path3.shift(); if (part === "__proto__") { return dst2; } if (path3.length > 0) { dst2[part] = setProp(dst2[part] || {}, path3, value2); } else { var prevValue = dst2[part]; if (prevValue) value2 = [].concat(prevValue).concat(value2); dst2[part] = value2; } return dst2; } if (typeof dst !== "object") throw TypeError("dst must be an object"); if (!path2) throw TypeError("path must be specified"); path2 = path2.split("."); return setProp(dst, path2, value); }; Object.defineProperty(util, "decorateRoot", { get: function() { return roots["decorated"] || (roots["decorated"] = new (require_root())()); } }); } }); // node_modules/protobufjs/src/object.js var require_object = __commonJS({ "node_modules/protobufjs/src/object.js"(exports2, module2) { "use strict"; module2.exports = ReflectionObject; ReflectionObject.className = "ReflectionObject"; var util = require_util(); var Root; function ReflectionObject(name, options) { if (!util.isString(name)) throw TypeError("name must be a string"); if (options && !util.isObject(options)) throw TypeError("options must be an object"); this.options = options; this.parsedOptions = null; this.name = name; this.parent = null; this.resolved = false; this.comment = null; this.filename = null; } Object.defineProperties(ReflectionObject.prototype, { root: { get: function() { var ptr = this; while (ptr.parent !== null) ptr = ptr.parent; return ptr; } }, fullName: { get: function() { var path2 = [this.name], ptr = this.parent; while (ptr) { path2.unshift(ptr.name); ptr = ptr.parent; } return path2.join("."); } } }); ReflectionObject.prototype.toJSON = function toJSON() { throw Error(); }; ReflectionObject.prototype.onAdd = function onAdd(parent) { if (this.parent && this.parent !== parent) this.parent.remove(this); this.parent = parent; this.resolved = false; var root3 = parent.root; if (root3 instanceof Root) root3._handleAdd(this); }; ReflectionObject.prototype.onRemove = function onRemove(parent) { var root3 = parent.root; if (root3 instanceof Root) root3._handleRemove(this); this.parent = null; this.resolved = false; }; ReflectionObject.prototype.resolve = function resolve() { if (this.resolved) return this; if (this.root instanceof Root) this.resolved = true; return this; }; ReflectionObject.prototype.getOption = function getOption(name) { if (this.options) return this.options[name]; return void 0; }; ReflectionObject.prototype.setOption = function setOption(name, value, ifNotSet) { if (!ifNotSet || !this.options || this.options[name] === void 0) (this.options || (this.options = {}))[name] = value; return this; }; ReflectionObject.prototype.setParsedOption = function setParsedOption(name, value, propName) { if (!this.parsedOptions) { this.parsedOptions = []; } var parsedOptions = this.parsedOptions; if (propName) { var opt = parsedOptions.find(function(opt2) { return Object.prototype.hasOwnProperty.call(opt2, name); }); if (opt) { var newValue = opt[name]; util.setProperty(newValue, propName, value); } else { opt = {}; opt[name] = util.setProperty({}, propName, value); parsedOptions.push(opt); } } else { var newOpt = {}; newOpt[name] = value; parsedOptions.push(newOpt); } return this; }; ReflectionObject.prototype.setOptions = function setOptions(options, ifNotSet) { if (options) for (var keys = Object.keys(options), i = 0; i < keys.length; ++i) this.setOption(keys[i], options[keys[i]], ifNotSet); return this; }; ReflectionObject.prototype.toString = function toString() { var className = this.constructor.className, fullName = this.fullName; if (fullName.length) return className + " " + fullName; return className; }; ReflectionObject._configure = function(Root_) { Root = Root_; }; } }); // node_modules/protobufjs/src/enum.js var require_enum = __commonJS({ "node_modules/protobufjs/src/enum.js"(exports2, module2) { "use strict"; module2.exports = Enum; var ReflectionObject = require_object(); ((Enum.prototype = Object.create(ReflectionObject.prototype)).constructor = Enum).className = "Enum"; var Namespace = require_namespace(); var util = require_util(); function Enum(name, values, options, comment, comments) { ReflectionObject.call(this, name, options); if (values && typeof values !== "object") throw TypeError("values must be an object"); this.valuesById = {}; this.values = Object.create(this.valuesById); this.comment = comment; this.comments = comments || {}; this.reserved = void 0; if (values) { for (var keys = Object.keys(values), i = 0; i < keys.length; ++i) if (typeof values[keys[i]] === "number") this.valuesById[this.values[keys[i]] = values[keys[i]]] = keys[i]; } } Enum.fromJSON = function fromJSON(name, json) { var enm = new Enum(name, json.values, json.options, json.comment, json.comments); enm.reserved = json.reserved; return enm; }; Enum.prototype.toJSON = function toJSON(toJSONOptions) { var keepComments = toJSONOptions ? Boolean(toJSONOptions.keepComments) : false; return util.toObject([ "options", this.options, "values", this.values, "reserved", this.reserved && this.reserved.length ? this.reserved : void 0, "comment", keepComments ? this.comment : void 0, "comments", keepComments ? this.comments : void 0 ]); }; Enum.prototype.add = function add(name, id, comment) { if (!util.isString(name)) throw TypeError("name must be a string"); if (!util.isInteger(id)) throw TypeError("id must be an integer"); if (this.values[name] !== void 0) throw Error("duplicate name '" + name + "' in " + this); if (this.isReservedId(id)) throw Error("id " + id + " is reserved in " + this); if (this.isReservedName(name)) throw Error("name '" + name + "' is reserved in " + this); if (this.valuesById[id] !== void 0) { if (!(this.options && this.options.allow_alias)) throw Error("duplicate id " + id + " in " + this); this.values[name] = id; } else this.valuesById[this.values[name] = id] = name; this.comments[name] = comment || null; return this; }; Enum.prototype.remove = function remove(name) { if (!util.isString(name)) throw TypeError("name must be a string"); var val = this.values[name]; if (val == null) throw Error("name '" + name + "' does not exist in " + this); delete this.valuesById[val]; delete this.values[name]; delete this.comments[name]; return this; }; Enum.prototype.isReservedId = function isReservedId(id) { return Namespace.isReservedId(this.reserved, id); }; Enum.prototype.isReservedName = function isReservedName(name) { return Namespace.isReservedName(this.reserved, name); }; } }); // node_modules/protobufjs/src/encoder.js var require_encoder = __commonJS({ "node_modules/protobufjs/src/encoder.js"(exports2, module2) { "use strict"; module2.exports = encoder2; var Enum = require_enum(); var types = require_types(); var util = require_util(); function genTypePartial(gen, field, fieldIndex, ref) { return field.resolvedType.group ? gen("types[%i].encode(%s,w.uint32(%i)).uint32(%i)", fieldIndex, ref, (field.id << 3 | 3) >>> 0, (field.id << 3 | 4) >>> 0) : gen("types[%i].encode(%s,w.uint32(%i).fork()).ldelim()", fieldIndex, ref, (field.id << 3 | 2) >>> 0); } function encoder2(mtype) { var gen = util.codegen(["m", "w"], mtype.name + "\$encode")("if(!w)")("w=Writer.create()"); var i, ref; var fields = mtype.fieldsArray.slice().sort(util.compareFieldsById); for (var i = 0; i < fields.length; ++i) { var field = fields[i].resolve(), index = mtype._fieldsArray.indexOf(field), type = field.resolvedType instanceof Enum ? "int32" : field.type, wireType = types.basic[type]; ref = "m" + util.safeProp(field.name); if (field.map) { gen("if(%s!=null&&Object.hasOwnProperty.call(m,%j)){", ref, field.name)("for(var ks=Object.keys(%s),i=0;i<ks.length;++i){", ref)("w.uint32(%i).fork().uint32(%i).%s(ks[i])", (field.id << 3 | 2) >>> 0, 8 | types.mapKey[field.keyType], field.keyType); if (wireType === void 0) gen("types[%i].encode(%s[ks[i]],w.uint32(18).fork()).ldelim().ldelim()", index, ref); else gen(".uint32(%i).%s(%s[ks[i]]).ldelim()", 16 | wireType, type, ref); gen("}")("}"); } else if (field.repeated) { gen("if(%s!=null&&%s.length){", ref, ref); if (field.packed && types.packed[type] !== void 0) { gen("w.uint32(%i).fork()", (field.id << 3 | 2) >>> 0)("for(var i=0;i<%s.length;++i)", ref)("w.%s(%s[i])", type, ref)("w.ldelim()"); } else { gen("for(var i=0;i<%s.length;++i)", ref); if (wireType === void 0) genTypePartial(gen, field, index, ref + "[i]"); else gen("w.uint32(%i).%s(%s[i])", (field.id << 3 | wireType) >>> 0, type, ref); } gen("}"); } else { if (field.optional) gen("if(%s!=null&&Object.hasOwnProperty.call(m,%j))", ref, field.name); if (wireType === void 0) genTypePartial(gen, field, index, ref); else gen("w.uint32(%i).%s(%s)", (field.id << 3 | wireType) >>> 0, type, ref); } } return gen("return w"); } } }); // node_modules/protobufjs/src/index-light.js var require_index_light = __commonJS({ "node_modules/protobufjs/src/index-light.js"(exports2, module2) { "use strict"; var protobuf3 = module2.exports = require_index_minimal(); protobuf3.build = "light"; function load3(filename, root3, callback) { if (typeof root3 === "function") { callback = root3; root3 = new protobuf3.Root(); } else if (!root3) root3 = new protobuf3.Root(); return root3.load(filename, callback); } protobuf3.load = load3; function loadSync(filename, root3) { if (!root3) root3 = new protobuf3.Root(); return root3.loadSync(filename); } protobuf3.loadSync = loadSync; protobuf3.encoder = require_encoder(); protobuf3.decoder = require_decoder(); protobuf3.verifier = require_verifier(); protobuf3.converter = require_converter(); protobuf3.ReflectionObject = require_object(); protobuf3.Namespace = require_namespace(); protobuf3.Root = require_root(); protobuf3.Enum = require_enum(); protobuf3.Type = require_type(); protobuf3.Field = require_field(); protobuf3.OneOf = require_oneof(); protobuf3.MapField = require_mapfield(); protobuf3.Service = require_service2(); protobuf3.Method = require_method(); protobuf3.Message = require_message(); protobuf3.wrappers = require_wrappers(); protobuf3.types = require_types(); protobuf3.util = require_util(); protobuf3.ReflectionObject._configure(protobuf3.Root); protobuf3.Namespace._configure(protobuf3.Type, protobuf3.Service, protobuf3.Enum); protobuf3.Root._configure(protobuf3.Type); protobuf3.Field._configure(protobuf3.Type); } }); // node_modules/protobufjs/light.js var require_light = __commonJS({ "node_modules/protobufjs/light.js"(exports2, module2) { "use strict"; module2.exports = require_index_light(); } }); // src/tampermonkey/polyfill/chrome.ts self.chrome || Reflect.defineProperty(self, "chrome", { value: {} }); // src/tampermonkey/polyfill/replace_children.ts if (typeof Element.prototype.replaceChildren === "undefined") { Reflect.defineProperty(Element.prototype, "replaceChildren", { configurable: true, enumerable: false, value: function() { while (this.lastChild) this.removeChild(this.lastChild); this.append.call(this, ...arguments); } }); } // src/runtime/element/create_element.ts function createSVG(element) { const node4 = document.createElementNS("http://www.w3.org/2000/svg", element.tagName); element.props && Object.entries(element.props).forEach((d) => { node4.setAttribute(d[0], d[1]); }); element.children && element.children.forEach((d) => { node4.appendChild(createSVG(d)); }); return node4; } function createElement(element) { if (element.tagName === "text") { return document.createTextNode(element.text); } if (element.tagName === "svg") { return createSVG(element); } const node4 = document.createElement(element.tagName); element.props && Object.entries(element.props).forEach((d) => { node4.setAttribute(d[0], d[1]); }); element.text && node4.appendChild(document.createTextNode(element.text)); element.event && Object.entries(element.event).forEach((d) => { node4.addEventListener(...d); }); element.children && element.children.forEach((d) => { node4.appendChild(createElement(d)); }); return node4; } function createElements(elements) { const fragment = document.createDocumentFragment(); elements.forEach((d) => { fragment.appendChild(createElement(d)); }); return fragment; } // src/runtime/element/html_vnode.ts var Vnode = class { tagName; props = {}; children = []; text; constructor(tagName) { this.tagName = tagName; } }; var Scanner = class { html; pos = 0; vnode = []; tagNames = []; targets = []; text = ""; quote = ""; constructor(html) { this.html = html; this.targets.push({ children: this.vnode }); while (this.html) { this.organizeTag(); } this.textContent(); } organizeTag() { if (!this.quote && this.html[0] === "<") { if (this.html.startsWith(\`</\${this.tagNames.reduce((s, d) => s = d, void 0)}\`)) { this.textContent(); this.html = this.html.replace(new RegExp(\`^</\${this.tagNames.reduce((s, d) => s = d, void 0)}>\`), ""); this.popNode(); } else { this.removeScanned(); if (this.html.startsWith("!-- ")) { this.html = this.html.replace(/^!--[\\S\\s]+?-->/, ""); } if (/^[a-zA-Z]/.test(this.html)) { this.textContent(); const func = []; let stop = false; for (this.pos = 0; this.pos < this.html.length; this.pos++) { if (stop) { this.pos--; break; } switch (this.html[this.pos]) { case " ": case "\\r": case "\\n": func.push(() => this.organizeProp()); stop = true; break; case ">": this.html[this.pos - 1] === "/" ? func.push(() => this.popNode()) : func.push(() => this.tagSingle()); stop = true; break; } } const tagName = this.html.substring(0, this.pos); const tag = new Vnode(tagName); this.tagNames.push(tagName); this.targets.reduce((s, d) => s = d, void 0).children.push(tag); this.targets.push(tag); this.removeScanned(this.pos + 1); func.forEach((d) => d()); } } } else { switch (this.html[0]) { case "'": !this.quote ? this.quote = "'" : this.quote === "'" && (this.quote = ""); break; case '"': !this.quote ? this.quote = '"' : this.quote === '"' && (this.quote = ""); break; case "\`": !this.quote ? this.quote = "\`" : this.quote === "\`" && (this.quote = ""); break; } this.text += this.html[0]; this.removeScanned(); } } organizeProp() { let value = false; let stop = false; let start = 0; let popd = false; for (this.pos = 0; this.pos < this.html.length; this.pos++) { if (stop) break; switch (this.html[this.pos]) { case '"': value = !value; break; case " ": if (!value) { const str = this.html.substring(start, this.pos).replace(/\\r|\\n|"/g, "").replace(/^ +/, ""); const prop = str.split("="); const key = prop.shift(); key && key !== "/" && (this.targets.reduce((s, d) => s = d, void 0).props[key] = prop.join("=") || key); start = this.pos; } break; case ">": if (!value) { stop = true; const str = this.html.substring(start, this.pos).replace(/\\r|\\n|"/g, "").replace(/^ +/, ""); const prop = str.split("="); const key = prop.shift(); key && key !== "/" && (this.targets.reduce((s, d) => s = d, void 0).props[key] = prop.join("=") || key); if (this.html[this.pos - 1] === "/") { this.popNode(); popd = true; } } break; } } if (!popd) this.tagSingle(); this.removeScanned(this.pos--); } tagSingle() { switch (this.tagNames.reduce((s, d) => s = d, void 0)) { case "area": case "base": case "br": case "col": case "colgroup": case "command": case "embed": case "hr": case "img": case "input": case "keygen": case "link": case "meta": case "param": case "path": case "source": case "track": case "wbr": this.popNode(); break; } } popNode() { this.tagNames.splice(this.tagNames.length - 1, 1); this.targets.splice(this.targets.length - 1, 1); this.text = ""; } removeScanned(length = 1) { this.html = this.html.slice(length); } textContent() { const text = this.text.replace(/\\r|\\n| /g, ""); if (text) { const tag = new Vnode("text"); tag.text = this.text; this.targets.reduce((s, d) => s = d, void 0).children.push(tag); } this.text = ""; } }; function htmlVnode(html) { return new Scanner(html).vnode; } // src/runtime/format/integer.ts function integerFormat(num, byte = 2) { return num < 10 ** byte ? (Array(byte).join("0") + num).slice(-1 * byte) : num; } // src/runtime/format/time.ts function timeFormat(time = new Date().getTime(), type) { const date = new Date(time); const arr2 = date.toLocaleString().split(" "); const day = arr2[0].split("/"); day[1] = integerFormat(day[1], 2); day[2] = integerFormat(day[2], 2); return type ? day.join("-") + " " + arr2[1] : arr2[1]; } // src/runtime/debug.ts var group = { i: 0, call: [] }; function debug(...data) { group.call.push(console.log.bind(console, \`%c[\${timeFormat()}]\`, "color: blue;", ...arguments)); !group.i && setTimeout(group.call.shift()); return debug; } debug.assert = function(condition, ...data) { group.call.push(console.assert.bind(console, \`[\${timeFormat()}]\`, ...arguments)); !group.i && setTimeout(group.call.shift()); return debug; }; debug.clear = function() { group.i = 0; group.call = []; setTimeout(console.clear.bind(console)); return debug; }; debug.debug = function(...data) { group.call.push(console.debug.bind(console, \`[\${timeFormat()}]\`, ...arguments)); !group.i && setTimeout(group.call.shift()); return debug; }; debug.error = function(...data) { group.call.push(console.error.bind(console, \`[\${timeFormat()}]\`, ...arguments)); !group.i && setTimeout(group.call.shift()); return debug; }; debug.group = function(...data) { group.i++; group.call.push(console.group.bind(console, \`[\${timeFormat()}]\`, ...arguments)); return debug; }; debug.groupCollapsed = function(...data) { group.i++; group.call.push(console.groupCollapsed.bind(console, \`[\${timeFormat()}]\`, ...arguments)); return debug; }; debug.groupEnd = function() { if (group.i) { group.i--; group.call.push(console.groupEnd.bind(console)); !group.i && (group.call.push(() => group.call = []), group.call.forEach((d) => setTimeout(d))); } return debug; }; debug.info = function(...data) { group.call.push(console.info.bind(console, \`%c[\${timeFormat()}]\`, "color: blue;", ...arguments)); !group.i && setTimeout(group.call.shift()); return debug; }; debug.log = function(...data) { group.call.push(console.log.bind(console, \`%c[\${timeFormat()}]\`, "color: blue;", ...arguments)); !group.i && setTimeout(group.call.shift()); return debug; }; debug.table = function(tabularData, properties) { group.call.push(console.table.bind(console, ...arguments)); !group.i && setTimeout(group.call.shift()); return debug; }; debug.time = function(label) { console.time(label); return debug; }; debug.timeEnd = function(label) { console.timeEnd(label); return debug; }; debug.timeLog = function(label, ...data) { console.timeLog(label, \`[\${timeFormat()}]\`, ...data); return debug; }; debug.trace = function(...data) { group.call.push(console.trace.bind(console, ...arguments)); !group.i && setTimeout(group.call.shift()); return debug; }; debug.warn = function(...data) { group.call.push(console.warn.bind(console, \`[\${timeFormat()}]\`, ...arguments)); !group.i && setTimeout(group.call.shift()); return debug; }; // src/runtime/lib/typeof.ts var isArray = Array.isArray; var isObject = (val) => val !== null && typeof val === "object"; var isNumber = (val) => !isNaN(parseFloat(val)) && isFinite(val); // src/runtime/format/url.ts var URLES = class { hash; base; params = {}; get param() { return Object.entries(this.params).reduce((s, d) => { return s += \`\${s ? "&" : ""}\${d[0]}=\${d[1]}\`; }, ""); } constructor(url) { const arr1 = url.split("#"); let str = arr1.shift(); this.hash = arr1.join("#"); (this.hash || url.includes("#")) && (this.hash = \`#\${this.hash}\`); const arr2 = str.split("?"); this.base = arr2.shift(); str = arr2.join("?"); if (str) { str.split("&").forEach((d) => { const arr3 = d.split("="); const key = arr3.shift(); let value = arr3.join("=") || ""; try { if (!isNumber(value)) { value = JSON.parse(value); } } catch { value === "undefined" && (value = void 0); value === "NaN" && (value = NaN); } this.params[key] = value; }); } } sort() { this.params = Object.keys(this.params).sort().reduce((s, d) => { s[d] = this.params[d]; return s; }, {}); } toJSON() { return \`\${this.base ? this.param ? this.base + "?" : this.base : ""}\${this.param}\${this.hash || ""}\`; } }; function objUrl(url, obj) { const res = new URLES(url); Object.entries(obj).forEach((d) => { if (d[1] === void 0 || d[1] === null) return; res.params[d[0]] = d[1]; }); return res.toJSON(); } function urlObj(url) { const res = new URLES(url); return res.params; } // src/runtime/hook/node.ts var appendChildHead = HTMLHeadElement.prototype.appendChild; var appendChildBody = HTMLBodyElement.prototype.appendChild; var insertBeforeHead = HTMLHeadElement.prototype.insertBefore; var insertBeforeBody = HTMLBodyElement.prototype.insertBefore; var jsonp = []; HTMLHeadElement.prototype.appendChild = function(newChild) { newChild.nodeName == "SCRIPT" && newChild.src && jsonp.forEach((d) => { d[0].every((d2) => newChild.src.includes(d2)) && d[1].call(newChild); }); return appendChildHead.call(this, newChild); }; HTMLBodyElement.prototype.appendChild = function(newChild) { newChild.nodeName == "SCRIPT" && newChild.src && jsonp.forEach((d) => { d[0].every((d2) => newChild.src.includes(d2)) && d[1].call(newChild); }); return appendChildBody.call(this, newChild); }; HTMLHeadElement.prototype.insertBefore = function(newChild, refChild) { newChild.nodeName == "SCRIPT" && newChild.src && jsonp.forEach((d) => { d[0].every((d2) => newChild.src.includes(d2)) && d[1].call(newChild); }); return insertBeforeHead.call(this, newChild, refChild); }; HTMLBodyElement.prototype.insertBefore = function(newChild, refChild) { newChild.nodeName == "SCRIPT" && newChild.src && jsonp.forEach((d) => { d[0].every((d2) => newChild.src.includes(d2)) && d[1].call(newChild); }); return insertBeforeBody.call(this, newChild, refChild); }; function jsonphook(url, redirect, modifyResponse, once = true) { let id; const one = Array.isArray(url) ? url : [url]; const two = function() { once && id && delete jsonp[id - 1]; if (redirect) try { this.src = redirect(this.src) || this.src; } catch (e) { debug.error("redirect of jsonphook", one, e); } if (modifyResponse) { const obj = urlObj(this.src); if (obj) { const callback = obj.callback; const call = window[callback]; const url2 = this.src; if (call) { window[callback] = function(v) { try { v = modifyResponse(v, url2, call) || v; } catch (e) { debug.error("modifyResponse of jsonphook", one, e); } return v !== true && call(v); }; } } } }; return id = jsonp.push([one, two]); } function jsonphookasync(url, condition, modifyResponse, once = true) { let id; const one = Array.isArray(url) ? url : [url]; const two = function() { try { once && id && delete jsonp[id - 1]; if (!condition || condition(this.src)) { const obj = urlObj(this.src); if (obj) { const callback = obj.callback; const call = window[callback]; if (call) { modifyResponse && modifyResponse(this.src).then((d) => { window[callback](d); this.dispatchEvent(new ProgressEvent("load")); }).catch((e) => { this.dispatchEvent(new ProgressEvent("error")); debug.error("modifyResponse of xhrhookasync", one, e); }); } this.removeAttribute("src"); } } } catch (e) { debug.error("jsonphook", one, e); } }; return id = jsonp.push([one, two]); } function removeJsonphook(id) { id >= 0 && delete jsonp[id - 1]; } // src/tampermonkey/check.ts var isUserScript = false; try { GM_getValue("config"); isUserScript = true; } catch { } // src/runtime/variable/mutex.ts var mutex = Math.random().toString(36).substring(2); // src/runtime/gm.ts var xhrGM = []; var getValue = []; var cookiesEs = []; window.addEventListener("message", (ev) => { if (isUserScript) return; if (typeof ev.data === "object" && ev.data.flag === mutex) { switch (ev.data.\$type) { case "xhrGMResponse": if (xhrGM[ev.data.index]) { Reflect.has(ev.data, "resolve") && xhrGM[ev.data.index][0](ev.data.resolve); Reflect.has(ev.data, "reject") && xhrGM[ev.data.index][1](ev.data.reject); delete xhrGM[ev.data.index]; } break; case "getValueResponse": if (getValue[ev.data.index]) { Reflect.has(ev.data, "resolve") && getValue[ev.data.index][0](ev.data.resolve); Reflect.has(ev.data, "reject") && getValue[ev.data.index][1](ev.data.reject); delete getValue[ev.data.index]; } break; case "cookiesResponse": if (cookiesEs[ev.data.index]) { Reflect.has(ev.data, "resolve") && cookiesEs[ev.data.index][0](ev.data.resolve); Reflect.has(ev.data, "reject") && cookiesEs[ev.data.index][1](ev.data.reject); delete cookiesEs[ev.data.index]; } break; } } }); var GM = { xhr(details) { return new Promise((resolve, reject) => { details.method = details.method || "GET"; details.onload = details.onload || ((xhr2) => { resolve(xhr2.response); }); details.onerror = details.onerror || ((xhr2) => { reject(xhr2.response); }); GM_xmlhttpRequest(details); }); }, xmlHttpRequest(input, init2) { return new Promise((resolve, reject) => { window.postMessage({ \$type: "xhrGM", data: { index: xhrGM.push([resolve, reject]) - 1, input, init: init2, flag: mutex } }); }); }, getValue(key, def) { return new Promise((resolve, reject) => { window.postMessage({ \$type: "getValue", data: { index: getValue.push([resolve, reject]) - 1, key, def, flag: mutex } }); }); }, setValue(key, value) { if (isUserScript) { GM_setValue(key, value); } else { const obj = {}; obj[key] = value; window.postMessage({ \$type: "setValue", data: obj }); } }, deleteValue(...key) { if (isUserScript) { key.forEach((d) => GM_deleteValue(d)); } else { window.postMessage({ \$type: "setValue", data: key }); } }, cookie() { return new Promise((resolve, reject) => { const host = location.host; const arr2 = host.split("."); arr2.length > 2 && arr2.shift(); window.postMessage({ \$type: "getCookies", data: { url: arr2.join("."), index: cookiesEs.push([resolve, reject]) - 1, flag: mutex } }); }); } }; // src/runtime/lib/md5.ts var ERROR = "input is invalid type"; var ARRAY_BUFFER = true; var HEX_CHARS = "0123456789abcdef".split(""); var EXTRA = [128, 32768, 8388608, -2147483648]; var SHIFT = [0, 8, 16, 24]; var OUTPUT_TYPES = ["hex", "array", "digest", "buffer", "arrayBuffer", "base64"]; var BASE64_ENCODE_CHAR = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(""); var buffer = new ArrayBuffer(68); var blocks = new Uint32Array(buffer); var buffer8 = new Uint8Array(buffer); var createOutputMethod = function(outputType) { return function(message2) { return new Md5(true).update(message2)[outputType](); }; }; var createMethod = function() { let method = createOutputMethod("hex"); method.create = function() { return new Md5(); }; method.update = function(message2) { return method.create().update(message2); }; for (let i = 0; i < OUTPUT_TYPES.length; ++i) { let type = OUTPUT_TYPES[i]; method[type] = createOutputMethod(type); } return method; }; var Md5 = class { blocks; buffer8 = new Uint8Array(); h0 = 0; h1 = 0; h2 = 0; h3 = 0; start = 0; bytes = 0; hBytes = 0; finalized = false; hashed = false; first = true; array; buffer; lastByteIndex = 0; constructor(sharedMemory) { if (sharedMemory) { blocks[0] = blocks[16] = blocks[1] = blocks[2] = blocks[3] = blocks[4] = blocks[5] = blocks[6] = blocks[7] = blocks[8] = blocks[9] = blocks[10] = blocks[11] = blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0; this.blocks = blocks; this.buffer8 = buffer8; } else { if (ARRAY_BUFFER) { let buffer2 = new ArrayBuffer(68); this.buffer8 = new Uint8Array(buffer2); this.blocks = new Uint32Array(buffer2); } else { this.blocks = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; } } this.toString = this.hex; this.array = this.digest; this.buffer = this.arrayBuffer; } update(message2) { if (this.finalized) { return; } message2 = typeof message2 === "number" ? message2 + "" : message2; let notString, type = typeof message2; if (type !== "string") { if (type === "object") { if (message2 === null) { throw ERROR; } else if (ARRAY_BUFFER && message2.constructor === ArrayBuffer) { message2 = new Uint8Array(message2); } else if (!Array.isArray(message2)) { if (!ARRAY_BUFFER || !ArrayBuffer.isView(message2)) { throw ERROR; } } } else { throw ERROR; } notString = true; } let code, index = 0, i, length = message2.length, blocks2 = this.blocks; let buffer82 = this.buffer8; while (index < length) { if (this.hashed) { this.hashed = false; blocks2[0] = blocks2[16]; blocks2[16] = blocks2[1] = blocks2[2] = blocks2[3] = blocks2[4] = blocks2[5] = blocks2[6] = blocks2[7] = blocks2[8] = blocks2[9] = blocks2[10] = blocks2[11] = blocks2[12] = blocks2[13] = blocks2[14] = blocks2[15] = 0; } if (notString) { if (ARRAY_BUFFER) { for (i = this.start; index < length && i < 64; ++index) { buffer82[i++] = message2[index]; } } else { for (i = this.start; index < length && i < 64; ++index) { blocks2[i >> 2] |= message2[index] << SHIFT[i++ & 3]; } } } else { if (ARRAY_BUFFER) { for (i = this.start; index < length && i < 64; ++index) { code = message2.charCodeAt(index); if (code < 128) { buffer82[i++] = code; } else if (code < 2048) { buffer82[i++] = 192 | code >> 6; buffer82[i++] = 128 | code & 63; } else if (code < 55296 || code >= 57344) { buffer82[i++] = 224 | code >> 12; buffer82[i++] = 128 | code >> 6 & 63; buffer82[i++] = 128 | code & 63; } else { code = 65536 + ((code & 1023) << 10 | message2.charCodeAt(++index) & 1023); buffer82[i++] = 240 | code >> 18; buffer82[i++] = 128 | code >> 12 & 63; buffer82[i++] = 128 | code >> 6 & 63; buffer82[i++] = 128 | code & 63; } } } else { for (i = this.start; index < length && i < 64; ++index) { code = message2.charCodeAt(index); if (code < 128) { blocks2[i >> 2] |= code << SHIFT[i++ & 3]; } else if (code < 2048) { blocks2[i >> 2] |= (192 | code >> 6) << SHIFT[i++ & 3]; blocks2[i >> 2] |= (128 | code & 63) << SHIFT[i++ & 3]; } else if (code < 55296 || code >= 57344) { blocks2[i >> 2] |= (224 | code >> 12) << SHIFT[i++ & 3]; blocks2[i >> 2] |= (128 | code >> 6 & 63) << SHIFT[i++ & 3]; blocks2[i >> 2] |= (128 | code & 63) << SHIFT[i++ & 3]; } else { code = 65536 + ((code & 1023) << 10 | message2.charCodeAt(++index) & 1023); blocks2[i >> 2] |= (240 | code >> 18) << SHIFT[i++ & 3]; blocks2[i >> 2] |= (128 | code >> 12 & 63) << SHIFT[i++ & 3]; blocks2[i >> 2] |= (128 | code >> 6 & 63) << SHIFT[i++ & 3]; blocks2[i >> 2] |= (128 | code & 63) << SHIFT[i++ & 3]; } } } } this.lastByteIndex = i; this.bytes += i - this.start; if (i >= 64) { this.start = i - 64; this.hash(); this.hashed = true; } else { this.start = i; } } if (this.bytes > 4294967295) { this.hBytes += this.bytes / 4294967296 << 0; this.bytes = this.bytes % 4294967296; } return this; } finalize() { if (this.finalized) { return; } this.finalized = true; let blocks2 = this.blocks, i = this.lastByteIndex; blocks2[i >> 2] |= EXTRA[i & 3]; if (i >= 56) { if (!this.hashed) { this.hash(); } blocks2[0] = blocks2[16]; blocks2[16] = blocks2[1] = blocks2[2] = blocks2[3] = blocks2[4] = blocks2[5] = blocks2[6] = blocks2[7] = blocks2[8] = blocks2[9] = blocks2[10] = blocks2[11] = blocks2[12] = blocks2[13] = blocks2[14] = blocks2[15] = 0; } blocks2[14] = this.bytes << 3; blocks2[15] = this.hBytes << 3 | this.bytes >>> 29; this.hash(); } hash() { let a, b, c, d, bc, da, blocks2 = this.blocks; if (this.first) { a = blocks2[0] - 680876937; a = (a << 7 | a >>> 25) - 271733879 << 0; d = (-1732584194 ^ a & 2004318071) + blocks2[1] - 117830708; d = (d << 12 | d >>> 20) + a << 0; c = (-271733879 ^ d & (a ^ -271733879)) + blocks2[2] - 1126478375; c = (c << 17 | c >>> 15) + d << 0; b = (a ^ c & (d ^ a)) + blocks2[3] - 1316259209; b = (b << 22 | b >>> 10) + c << 0; } else { a = this.h0; b = this.h1; c = this.h2; d = this.h3; a += (d ^ b & (c ^ d)) + blocks2[0] - 680876936; a = (a << 7 | a >>> 25) + b << 0; d += (c ^ a & (b ^ c)) + blocks2[1] - 389564586; d = (d << 12 | d >>> 20) + a << 0; c += (b ^ d & (a ^ b)) + blocks2[2] + 606105819; c = (c << 17 | c >>> 15) + d << 0; b += (a ^ c & (d ^ a)) + blocks2[3] - 1044525330; b = (b << 22 | b >>> 10) + c << 0; } a += (d ^ b & (c ^ d)) + blocks2[4] - 176418897; a = (a << 7 | a >>> 25) + b << 0; d += (c ^ a & (b ^ c)) + blocks2[5] + 1200080426; d = (d << 12 | d >>> 20) + a << 0; c += (b ^ d & (a ^ b)) + blocks2[6] - 1473231341; c = (c << 17 | c >>> 15) + d << 0; b += (a ^ c & (d ^ a)) + blocks2[7] - 45705983; b = (b << 22 | b >>> 10) + c << 0; a += (d ^ b & (c ^ d)) + blocks2[8] + 1770035416; a = (a << 7 | a >>> 25) + b << 0; d += (c ^ a & (b ^ c)) + blocks2[9] - 1958414417; d = (d << 12 | d >>> 20) + a << 0; c += (b ^ d & (a ^ b)) + blocks2[10] - 42063; c = (c << 17 | c >>> 15) + d << 0; b += (a ^ c & (d ^ a)) + blocks2[11] - 1990404162; b = (b << 22 | b >>> 10) + c << 0; a += (d ^ b & (c ^ d)) + blocks2[12] + 1804603682; a = (a << 7 | a >>> 25) + b << 0; d += (c ^ a & (b ^ c)) + blocks2[13] - 40341101; d = (d << 12 | d >>> 20) + a << 0; c += (b ^ d & (a ^ b)) + blocks2[14] - 1502002290; c = (c << 17 | c >>> 15) + d << 0; b += (a ^ c & (d ^ a)) + blocks2[15] + 1236535329; b = (b << 22 | b >>> 10) + c << 0; a += (c ^ d & (b ^ c)) + blocks2[1] - 165796510; a = (a << 5 | a >>> 27) + b << 0; d += (b ^ c & (a ^ b)) + blocks2[6] - 1069501632; d = (d << 9 | d >>> 23) + a << 0; c += (a ^ b & (d ^ a)) + blocks2[11] + 643717713; c = (c << 14 | c >>> 18) + d << 0; b += (d ^ a & (c ^ d)) + blocks2[0] - 373897302; b = (b << 20 | b >>> 12) + c << 0; a += (c ^ d & (b ^ c)) + blocks2[5] - 701558691; a = (a << 5 | a >>> 27) + b << 0; d += (b ^ c & (a ^ b)) + blocks2[10] + 38016083; d = (d << 9 | d >>> 23) + a << 0; c += (a ^ b & (d ^ a)) + blocks2[15] - 660478335; c = (c << 14 | c >>> 18) + d << 0; b += (d ^ a & (c ^ d)) + blocks2[4] - 405537848; b = (b << 20 | b >>> 12) + c << 0; a += (c ^ d & (b ^ c)) + blocks2[9] + 568446438; a = (a << 5 | a >>> 27) + b << 0; d += (b ^ c & (a ^ b)) + blocks2[14] - 1019803690; d = (d << 9 | d >>> 23) + a << 0; c += (a ^ b & (d ^ a)) + blocks2[3] - 187363961; c = (c << 14 | c >>> 18) + d << 0; b += (d ^ a & (c ^ d)) + blocks2[8] + 1163531501; b = (b << 20 | b >>> 12) + c << 0; a += (c ^ d & (b ^ c)) + blocks2[13] - 1444681467; a = (a << 5 | a >>> 27) + b << 0; d += (b ^ c & (a ^ b)) + blocks2[2] - 51403784; d = (d << 9 | d >>> 23) + a << 0; c += (a ^ b & (d ^ a)) + blocks2[7] + 1735328473; c = (c << 14 | c >>> 18) + d << 0; b += (d ^ a & (c ^ d)) + blocks2[12] - 1926607734; b = (b << 20 | b >>> 12) + c << 0; bc = b ^ c; a += (bc ^ d) + blocks2[5] - 378558; a = (a << 4 | a >>> 28) + b << 0; d += (bc ^ a) + blocks2[8] - 2022574463; d = (d << 11 | d >>> 21) + a << 0; da = d ^ a; c += (da ^ b) + blocks2[11] + 1839030562; c = (c << 16 | c >>> 16) + d << 0; b += (da ^ c) + blocks2[14] - 35309556; b = (b << 23 | b >>> 9) + c << 0; bc = b ^ c; a += (bc ^ d) + blocks2[1] - 1530992060; a = (a << 4 | a >>> 28) + b << 0; d += (bc ^ a) + blocks2[4] + 1272893353; d = (d << 11 | d >>> 21) + a << 0; da = d ^ a; c += (da ^ b) + blocks2[7] - 155497632; c = (c << 16 | c >>> 16) + d << 0; b += (da ^ c) + blocks2[10] - 1094730640; b = (b << 23 | b >>> 9) + c << 0; bc = b ^ c; a += (bc ^ d) + blocks2[13] + 681279174; a = (a << 4 | a >>> 28) + b << 0; d += (bc ^ a) + blocks2[0] - 358537222; d = (d << 11 | d >>> 21) + a << 0; da = d ^ a; c += (da ^ b) + blocks2[3] - 722521979; c = (c << 16 | c >>> 16) + d << 0; b += (da ^ c) + blocks2[6] + 76029189; b = (b << 23 | b >>> 9) + c << 0; bc = b ^ c; a += (bc ^ d) + blocks2[9] - 640364487; a = (a << 4 | a >>> 28) + b << 0; d += (bc ^ a) + blocks2[12] - 421815835; d = (d << 11 | d >>> 21) + a << 0; da = d ^ a; c += (da ^ b) + blocks2[15] + 530742520; c = (c << 16 | c >>> 16) + d << 0; b += (da ^ c) + blocks2[2] - 995338651; b = (b << 23 | b >>> 9) + c << 0; a += (c ^ (b | ~d)) + blocks2[0] - 198630844; a = (a << 6 | a >>> 26) + b << 0; d += (b ^ (a | ~c)) + blocks2[7] + 1126891415; d = (d << 10 | d >>> 22) + a << 0; c += (a ^ (d | ~b)) + blocks2[14] - 1416354905; c = (c << 15 | c >>> 17) + d << 0; b += (d ^ (c | ~a)) + blocks2[5] - 57434055; b = (b << 21 | b >>> 11) + c << 0; a += (c ^ (b | ~d)) + blocks2[12] + 1700485571; a = (a << 6 | a >>> 26) + b << 0; d += (b ^ (a | ~c)) + blocks2[3] - 1894986606; d = (d << 10 | d >>> 22) + a << 0; c += (a ^ (d | ~b)) + blocks2[10] - 1051523; c = (c << 15 | c >>> 17) + d << 0; b += (d ^ (c | ~a)) + blocks2[1] - 2054922799; b = (b << 21 | b >>> 11) + c << 0; a += (c ^ (b | ~d)) + blocks2[8] + 1873313359; a = (a << 6 | a >>> 26) + b << 0; d += (b ^ (a | ~c)) + blocks2[15] - 30611744; d = (d << 10 | d >>> 22) + a << 0; c += (a ^ (d | ~b)) + blocks2[6] - 1560198380; c = (c << 15 | c >>> 17) + d << 0; b += (d ^ (c | ~a)) + blocks2[13] + 1309151649; b = (b << 21 | b >>> 11) + c << 0; a += (c ^ (b | ~d)) + blocks2[4] - 145523070; a = (a << 6 | a >>> 26) + b << 0; d += (b ^ (a | ~c)) + blocks2[11] - 1120210379; d = (d << 10 | d >>> 22) + a << 0; c += (a ^ (d | ~b)) + blocks2[2] + 718787259; c = (c << 15 | c >>> 17) + d << 0; b += (d ^ (c | ~a)) + blocks2[9] - 343485551; b = (b << 21 | b >>> 11) + c << 0; if (this.first) { this.h0 = a + 1732584193 << 0; this.h1 = b - 271733879 << 0; this.h2 = c - 1732584194 << 0; this.h3 = d + 271733878 << 0; this.first = false; } else { this.h0 = this.h0 + a << 0; this.h1 = this.h1 + b << 0; this.h2 = this.h2 + c << 0; this.h3 = this.h3 + d << 0; } } hex() { this.finalize(); let h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3; return HEX_CHARS[h0 >> 4 & 15] + HEX_CHARS[h0 & 15] + HEX_CHARS[h0 >> 12 & 15] + HEX_CHARS[h0 >> 8 & 15] + HEX_CHARS[h0 >> 20 & 15] + HEX_CHARS[h0 >> 16 & 15] + HEX_CHARS[h0 >> 28 & 15] + HEX_CHARS[h0 >> 24 & 15] + HEX_CHARS[h1 >> 4 & 15] + HEX_CHARS[h1 & 15] + HEX_CHARS[h1 >> 12 & 15] + HEX_CHARS[h1 >> 8 & 15] + HEX_CHARS[h1 >> 20 & 15] + HEX_CHARS[h1 >> 16 & 15] + HEX_CHARS[h1 >> 28 & 15] + HEX_CHARS[h1 >> 24 & 15] + HEX_CHARS[h2 >> 4 & 15] + HEX_CHARS[h2 & 15] + HEX_CHARS[h2 >> 12 & 15] + HEX_CHARS[h2 >> 8 & 15] + HEX_CHARS[h2 >> 20 & 15] + HEX_CHARS[h2 >> 16 & 15] + HEX_CHARS[h2 >> 28 & 15] + HEX_CHARS[h2 >> 24 & 15] + HEX_CHARS[h3 >> 4 & 15] + HEX_CHARS[h3 & 15] + HEX_CHARS[h3 >> 12 & 15] + HEX_CHARS[h3 >> 8 & 15] + HEX_CHARS[h3 >> 20 & 15] + HEX_CHARS[h3 >> 16 & 15] + HEX_CHARS[h3 >> 28 & 15] + HEX_CHARS[h3 >> 24 & 15]; } digest() { this.finalize(); let h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3; return [ h0 & 255, h0 >> 8 & 255, h0 >> 16 & 255, h0 >> 24 & 255, h1 & 255, h1 >> 8 & 255, h1 >> 16 & 255, h1 >> 24 & 255, h2 & 255, h2 >> 8 & 255, h2 >> 16 & 255, h2 >> 24 & 255, h3 & 255, h3 >> 8 & 255, h3 >> 16 & 255, h3 >> 24 & 255 ]; } arrayBuffer() { this.finalize(); let buffer2 = new ArrayBuffer(16); let blocks2 = new Uint32Array(buffer2); blocks2[0] = this.h0; blocks2[1] = this.h1; blocks2[2] = this.h2; blocks2[3] = this.h3; return buffer2; } base64() { let i, v1, v2, v3, base64Str = "", bytes = this.array(); for (i = 0; i < 15; ) { v1 = bytes[i++]; v2 = bytes[i++]; v3 = bytes[i++]; base64Str += BASE64_ENCODE_CHAR[v1 >>> 2] + BASE64_ENCODE_CHAR[(v1 << 4 | v2 >>> 4) & 63] + BASE64_ENCODE_CHAR[(v2 << 2 | v3 >>> 6) & 63] + BASE64_ENCODE_CHAR[v3 & 63]; } v1 = bytes[i]; base64Str += BASE64_ENCODE_CHAR[v1 >>> 2] + BASE64_ENCODE_CHAR[v1 << 4 & 63] + "=="; return base64Str; } }; var md5 = createMethod(); // src/runtime/lib/sign.ts var Sign = class { static sign(url, obj = {}, id = 0) { this.keySecret = this.decode(id); const res = new URLES(url); Object.assign(res.params, obj); delete res.params.sign; res.params.appkey = this.keySecret[0]; res.sort(); res.params.sign = md5((id === 3 && res.params.api ? \`api=\${decodeURIComponent(res.params.api)}\` : res.param) + this.keySecret[1]); return res.toJSON(); } static decode(id) { if (typeof id === "number") { id = id < this.table.length ? id : 0; return this.table[id].split("").reverse().reduce((s, d) => { s = s + String.fromCharCode(d.charCodeAt(0) + 2); return s; }, "").split(":"); } else { return [id, this.list()[id]]; } } static encode(key, secret) { return (key + ":" + secret).split("").reverse().reduce((s, d) => { s = s + String.fromCharCode(d.charCodeAt(0) - 2); return s; }, ""); } static list() { return this.table.reduce((s, d, i) => { let keySecret = this.decode(i); s[keySecret[0]] = keySecret[1]; return s; }, {}); } }; __publicField(Sign, "table", [ "rbMCKn@KuamXWlPMoJGsKcbiJKUfkPF_8dABscJntvqhRSETg", "/a_206b\`_.61.bca6117.175bcdadc41850c010c..././1\`\`", "157bdd\`6/bc73632.bcd660baa03a.43841211032b5c4\`6b/", "351a7a6b/.b\`d77da1cdccc25_13bc0a81a6d63.7ad13\`c50", "4_/54d\`3_4_73..2c42\`d4.a3__31b358d706d\`._7a.3_b5.", "12a.7c4b76c.a\`12bb4\`2b2b275c667c85b6d\`c_c\`0d5.051", "bb16d652\`04.7/121d3474b_2.c12\`7386\`0/bdd6ca0c7.22", "244_530/7/.ab\`7.//22a15572502b_08c21./_.\`3164\`c36", "16_d52_d/d22_2c0a.6573355/b\`./bd8a\`bc6114a30_4.\`d", "c02ba/d6.33d05cb/5d34.7d_23_\`_2785\`c60.a\`.4343726", "2aa2\`.1_\`_1.73\`.70.67d.bc671c16382a3d\`71a4.bcb3c7", "c4_a.7562_15\`_a416a/63/c2cbcb\`308d706d\`._7a.3_b5.", "40/171b046c/bcc0a603ac620\`372ba_8a/\`//41b30376.b5" ]); __publicField(Sign, "keySecret"); var urlsign = (url, obj = {}, id = 0) => Sign.sign(url, obj, id); urlsign.getKeyById = (id) => Sign.decode(id); urlsign.encode = (key, secret) => Sign.encode(key, secret); urlsign.list = () => Sign.list(); // src/runtime/lib/abv.ts var Abv = class { base58Table = "fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF"; digitMap = [11, 10, 3, 8, 4, 6]; xor = 177451812; add = 8728348608; bvidTemplate = ["B", "V", 1, "", "", 4, "", 1, "", 7, "", ""]; table = {}; constructor() { for (let i = 0; i < 58; i++) this.table[this.base58Table[i]] = i; } check(input) { if (/^[aA][vV][0-9]+\$/.test(String(input)) || /^\\d+\$/.test(String(input))) return this.avToBv(Number(/[0-9]+/.exec(String(input))[0])); if (/^1[fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF]{9}\$/.test(String(input))) return this.bvToAv("BV" + input); if (/^[bB][vV]1[fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF]{9}\$/.test(String(input))) return this.bvToAv(String(input)); throw input; } bvToAv(BV) { let r = 0; for (let i = 0; i < 6; i++) r += this.table[BV[this.digitMap[i]]] * 58 ** i; return r - this.add ^ this.xor; } avToBv(av) { let bv = Array.from(this.bvidTemplate); av = (av ^ this.xor) + this.add; for (let i = 0; i < 6; i++) bv[this.digitMap[i]] = this.base58Table[parseInt(String(av / 58 ** i)) % 58]; return bv.join(""); } }; function abv(input) { return new Abv().check(input); } // src/runtime/do_while.ts function doWhile(check2, callback, delay = 100, stop = 180) { let timer2 = setInterval(() => { const d = check2(); if (d) { clearInterval(timer2); callback(d); } }, delay); stop && setTimeout(() => clearInterval(timer2), stop * 1e3); } // src/runtime/element/add_element.ts function addElement(tag, attribute, parrent, innerHTML, top, replaced) { let element = document.createElement(tag); attribute && Object.entries(attribute).forEach((d) => element.setAttribute(d[0], d[1])); parrent = parrent || document.body; innerHTML && (element.innerHTML = innerHTML); replaced ? replaced.replaceWith(element) : top ? parrent.insertBefore(element, parrent.firstChild) : parrent.appendChild(element); return element; } async function addCss(txt, id, parrent) { if (!parrent && !document.head) { await new Promise((r) => doWhile(() => document.body, r)); } parrent = parrent || document.head; const style = document.createElement("style"); style.setAttribute("type", "text/css"); id && !parrent.querySelector(\`#\${id}\`) && style.setAttribute("id", id); style.appendChild(document.createTextNode(txt)); parrent.appendChild(style); } function loadScript(src, onload) { return new Promise((r, j) => { const script = document.createElement("script"); script.type = "text/javascript"; script.src = src; script.addEventListener("load", () => { script.remove(); onload && onload(); r(true); }); script.addEventListener("error", () => { script.remove(); j(); }); (document.body || document.head || document.documentElement || document).appendChild(script); }); } function addCssEs(path2) { const files = isArray(path2) ? path2 : [path2]; window.postMessage({ \$type: "insertCSS", data: files }); } // src/runtime/unit.ts function jsonCheck(data) { let result = typeof data === "string" ? JSON.parse(data) : data; if ("code" in result && result.code !== 0) { let msg = result.msg || result.message || ""; throw [result.code, msg]; } return result; } function getTotalTop(node4) { var sum = 0; do { sum += node4.offsetTop; node4 = node4.offsetParent; } while (node4); return sum; } function biliQuickLogin() { window.biliQuickLogin ? window.biliQuickLogin() : loadScript("//static.hdslb.com/account/bili_quick_login.js", () => biliQuickLogin()); } function getUrlValue(name) { const reg = new RegExp("(^|&)" + name + "=([^&]*)(&|\$)", "i"); const r = window.location.search.substr(1).match(reg); if (r != null) return decodeURIComponent(r[2]); return null; } function statusCheck(status) { return status >= 200 && status < 300 || status === 304; } // src/runtime/xhr.ts var Record = { default: {}, arraybuffer: {}, blob: {}, document: {}, json: {}, text: {} }; function xhr(details, cache = false) { details.method == "POST" && (details.headers = details.headers || {}, !details.headers["Content-Type"] && Reflect.set(details.headers, "Content-Type", "application/x-www-form-urlencoded")); if (details.async === false) { if (cache && Record[details.responseType || "default"][details.url]) return Record[details.responseType || "default"][details.url]; let xhr2 = new XMLHttpRequest(); xhr2.open(details.method || "GET", details.url, false); details.responseType && (xhr2.responseType = details.responseType); details.credentials && (xhr2.withCredentials = true); details.headers && Object.entries(details.headers).forEach((d) => xhr2.setRequestHeader(d[0], d[1])); details.timeout && (xhr2.timeout = details.timeout); xhr2.send(details.data); Promise.resolve().then(() => Record[details.responseType || "default"][details.url] = xhr2.response); return xhr2.response; } else return new Promise((resolve, reject) => { if (cache && Record[details.responseType || "default"][details.url]) return resolve(Record[details.responseType || "default"][details.url]); let xhr2 = new XMLHttpRequest(); xhr2.open(details.method || "GET", details.url); details.responseType && (xhr2.responseType = details.responseType); details.headers && Object.entries(details.headers).forEach((d) => xhr2.setRequestHeader(d[0], d[1])); details.credentials && (xhr2.withCredentials = true); details.timeout && (xhr2.timeout = details.timeout); xhr2.onabort = details.onabort || reject; xhr2.onerror = details.onerror || reject; details.onloadstart && (xhr2.onloadstart = details.onloadstart); details.onprogress && (xhr2.onprogress = details.onprogress); details.onreadystatechange && (xhr2.onreadystatechange = details.onreadystatechange); xhr2.ontimeout = details.ontimeout || reject; xhr2.onload = details.onload || (() => resolve(xhr2.response)); xhr2.addEventListener("load", () => { Promise.resolve().then(() => Record[details.responseType || "default"][details.url] = xhr2.response); }); xhr2.send(details.data); }); } function get(url, details = {}, cache = false) { !Reflect.has(details, "credentials") && (details.credentials = true); return xhr({ url, ...details }, cache); } xhr.get = get; function post(url, data, contentType = "application/x-www-form-urlencoded", details = {}, cache = false) { !Reflect.has(details, "credentials") && (details.credentials = true); details.headers = { "Content-Type": contentType, ...details.headers }; return xhr({ url, method: "POST", data, ...details }, cache); } xhr.port = post; // src/runtime/url_param.ts var catchs = { aid: {}, ssid: {}, epid: {} }; async function urlParam(url = location.href, redirect = true) { url && !url.includes("?") && (url = "?" + url); const obj = urlObj(url); let { aid, cid, ssid, epid, p } = obj; let pgc = false; !aid && (aid = obj.avid); !aid && url.replace(/[aA][vV]\\d+/, (d) => aid = d.substring(2)); !aid && url.replace(/[bB][vV]1[fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF]{9}/, (d) => aid = abv(d)); !aid && obj.bvid && (aid = abv(obj.bvid)); aid && !Number(aid) && (aid = abv(aid)); p = p || 1; !ssid && (ssid = obj.seasonId); !ssid && (ssid = obj.season_id); !ssid && url.replace(/[sS][sS]\\d+/, (d) => ssid = d.substring(2)); !epid && (epid = obj.episodeId); !epid && (epid = obj.ep_id); !epid && url.replace(/[eE][pP]\\d+/, (d) => epid = d.substring(2)); if (!ssid && !epid && aid) { if (catchs.aid[aid]) return catchs.aid[aid][p - 1] || catchs.aid[aid][0]; if (!cid) { try { let data = jsonCheck(await xhr({ url: objUrl("https://api.bilibili.com/x/web-interface/view", { "aid": aid }) }, true)).data; if (data.redirect_url) return urlParam(objUrl(data.redirect_url, { aid, cid, ssid, epid, p })); catchs.aid[aid] = data.pages; catchs.aid[aid].forEach((d) => d.aid = aid); return catchs.aid[aid][p - 1] || catchs.aid[aid][0]; } catch (e) { debug.error("view", e); try { catchs.aid[aid] = jsonCheck(await xhr({ url: objUrl("https://api.bilibili.com/x/player/pagelist", { "aid": aid }) }, true)).data; catchs.aid[aid].forEach((d) => d.aid = aid); return catchs.aid[aid][p - 1] || catchs.aid[aid][0]; } catch (e2) { debug.error("pagelist", e2); try { catchs.aid[aid] = jsonCheck(await xhr({ url: \`//api.bilibili.com/view?appkey=8e9fc618fbd41e28&id=\${aid}&type=json\` }, true)).list; catchs.aid[aid].forEach((d) => d.aid = aid); return catchs.aid[aid][p - 1] || catchs.aid[aid][0]; } catch (e3) { debug.error("appkey", e3); try { let data = jsonCheck(await xhr({ url: objUrl("https://www.biliplus.com/api/view", { "id": aid }) }, true)); catchs.aid[aid] = data.list || data.v2_app_api && data.v2_app_api.pages; catchs.aid[aid].forEach((d) => d.aid = aid); if (redirect && data.v2_app_api && data.v2_app_api.redirect_url) return urlParam(objUrl(data.v2_app_api.redirect_url, { aid, cid, ssid, epid, p })); return catchs.aid[aid][p - 1] || catchs.aid[aid][0]; } catch (e4) { debug.error("biliplus", e4); } } } } } } if (ssid || epid) { if (ssid && catchs.ssid[ssid]) return catchs.ssid[ssid][p - 1] || catchs.ssid[ssid][0]; if (epid && catchs.epid[epid]) return catchs.epid[epid]; pgc = true; const param2 = { ep_id: epid, season_id: ssid }; let data = jsonCheck(await xhr({ url: objUrl("https://bangumi.bilibili.com/view/web_api/season", param2) }, true)).result; ssid = data.season_id; catchs.ssid[ssid] = []; data.episodes.forEach((d) => { Object.assign(d, { ssid, pgc, epid: d.ep_id }); catchs.aid[d.aid] = catchs.aid[d.aid] || []; catchs.aid[d.aid].push(d); catchs.ssid[ssid].push(catchs.epid[d.ep_id] = d); }); if (epid) return catchs.epid[epid]; return catchs.ssid[ssid][p - 1] || catchs.ssid[ssid][0]; } return { aid, cid, ssid, epid, p, pgc }; } // src/runtime/chrome/setting.json var setting_default = { logReport: false, toast: { status: true, rtl: false, position: "top-right", delay: 4, type: "warning" }, av: true, videoLimit: { switch: false, server: "内置", cn: "", hk: "", tw: "", th: "" }, protobufDanmaku: true, section: true, danmakuHashId: false, flash: false, enlike: false, upList: false, commandDm: false, bangumi: true, watchlater: true, player: true, index: true, ranking: true, read: true, playlist: true, automate: { danmakuFirst: false, showBofqi: false, screenWide: false, noDanmaku: false, autoPlay: false, webFullScreen: false, videospeed: false, electric: false }, heartbeat: false, bangumiEplist: false, history: false, searchHistory: false, liveP2p: true, sleepCheck: true, errands: true, album: false, jointime: false, restore: false, codecType: "AVC", collection: true, search: true, liveRecord: false, closedCaption: true, segProgress: false, videoDisableAA: false, commentLinkDetail: false, downlaodType: [ "mp4" ], TVresource: false, downloadQn: 127, downloadOther: false, danmakuSaveType: "xml", downloadMethod: "默认", userAgent: "Bilibili Freedoooooom/MarkII", referer: "https://www.bilibili.com", filepath: "", aria2: { token: "", server: "http://localhost", port: 6800 }, animatedBanner: false, accessKey: { key: "", date: "" }, timeline: false, episodeData: false, comment: false, lostVideo: false, uposReplace: { nor: "不替换", gat: "不替换", th: "ks3(金山)", dl: "不替换" }, danmakuContact: false, allDanmaku: 3, IDM: { wait: false, silence: false }, development: false, settingEntryType: false, downloadBtn: true, windowStop: false, flacEnabled: true }; // src/runtime/lib/proxy_handler.ts function get2(t, p, r) { try { return Reflect.get(t, p, r); } catch (e) { return t[p]; } } var ProxyHandler = class { constructor(callback) { return { deleteProperty: (target, key) => { Promise.resolve().then(() => callback()); return Reflect.deleteProperty(target, key); }, get: (target, key, receiver) => { const res = get2(target, key, receiver); const targetIsArray = isArray(res); if (isObject(res) || targetIsArray) { return new Proxy(res, new ProxyHandler(callback)); } return res; }, set: (target, key, value, receiver) => { value !== get2(target, key, receiver) && Promise.resolve().then(() => callback()); return Reflect.set(target, key, value, receiver); } }; } }; // src/runtime/storage.ts var LocalStorage = class { clear() { self.localStorage.clear(); } getItem(key) { let str = self.localStorage.getItem(key); try { str = JSON.parse(str); } catch (e) { switch (str) { case "undefined": str = void 0; break; case "null": str = null; break; case "NaN": str = NaN; break; default: } } return str; } keys() { return Object.keys(self.localStorage); } removeItem(key) { self.localStorage.removeItem(key); } setItem(key, value) { switch (typeof value) { case "object": self.localStorage.setItem(key, JSON.stringify(value)); break; case "function": console.warn("函数类型并不适合这样存储!", key, value); break; default: self.localStorage.setItem(key, String(value)); } } get length() { return self.localStorage.length; } }; var SessionStorage = class { clear() { self.sessionStorage.clear(); } getItem(key) { let str = self.sessionStorage.getItem(key); try { str = JSON.parse(str); } catch (e) { switch (str) { case "undefined": str = void 0; break; case "null": str = null; break; case "NaN": str = NaN; break; default: } } return str; } keys() { return Object.keys(self.sessionStorage); } removeItem(key) { self.sessionStorage.removeItem(key); } setItem(key, value) { switch (typeof value) { case "object": self.sessionStorage.setItem(key, JSON.stringify(value)); break; case "function": console.warn("函数类型并不适合这样存储!", key, value); break; default: self.sessionStorage.setItem(key, String(value)); } } get length() { return self.sessionStorage.length; } }; var localStorage = new LocalStorage(); var sessionStorage2 = new SessionStorage(); // src/runtime/setting.ts var setting = setting_default; var newSetting; function getSetting() { if (isUserScript) { newSetting = GM_getValue("config", setting_default); setting = new Proxy(newSetting, new ProxyHandler(saveConfig)); } else { newSetting = sessionStorage2.getItem("setting"); newSetting ? setting = new Proxy(newSetting, new ProxyHandler(saveConfig)) : setTimeout(getSetting); } } function saveConfig() { if (newSetting) { if (isUserScript) { GM_setValue("config", JSON.parse(JSON.stringify(newSetting))); } else { GM.setValue("setting", JSON.parse(JSON.stringify(newSetting))); sessionStorage2.setItem("setting", JSON.parse(JSON.stringify(newSetting))); } } } getSetting(); // src/runtime/lib/file.ts function readAs(file, type = "string", encoding = "utf-8") { return new Promise((resolve, reject) => { const reader = new FileReader(); switch (type) { case "ArrayBuffer": reader.readAsArrayBuffer(file); break; case "DataURL": reader.readAsDataURL(file); break; case "string": reader.readAsText(file, encoding); break; } reader.onload = () => resolve(reader.result); reader.onerror = (e) => reject(e); }); } async function saveAs(content, fileName, contentType = "text/plain") { const a = document.createElement("a"); const file = new Blob([content], { type: contentType }); a.href = URL.createObjectURL(file); a.download = fileName; a.addEventListener("load", () => URL.revokeObjectURL(a.href)); a.click(); } function fileRead(accept, multiple) { return new Promise((resolve) => { const input = document.createElement("input"); input.type = "file"; accept && (input.accept = accept); multiple && (input.multiple = multiple); input.style.opacity = "0"; input.addEventListener("change", () => resolve(input.files)); document.body.appendChild(input); input.click(); }); } // src/runtime/format/size.ts function sizeFormat(size = 0) { let unit = ["B", "K", "M", "G"], i = unit.length - 1, dex = 1024 ** i, vor = 1e3 ** i; while (dex > 1) { if (size >= vor) { size = Number((size / dex).toFixed(2)); break; } dex = dex / 1024; vor = vor / 1e3; i--; } return size ? size + unit[i] : "N/A"; } // src/runtime/hook/xhr.ts var rules = []; var open = XMLHttpRequest.prototype.open; XMLHttpRequest.prototype.open = function(...rest) { const args = [...rest]; args[1] && rules.forEach((d) => { d && d[0].every((d2) => args[1].includes(d2)) && d[1].call(this, args); }); return open.call(this, ...args); }; function xhrhook(url, modifyOpen, modifyResponse, once = true) { let id; const one = Array.isArray(url) ? url : [url]; const two = function(args) { once && id && delete rules[id - 1]; if (modifyOpen) try { modifyOpen(args); } catch (e) { debug.error("modifyOpen of xhrhook", one, e); } if (modifyResponse) try { this.addEventListener("readystatechange", () => { try { if (this.readyState === 4) { const response = { response: this.response, responseType: this.responseType, status: this.status, statusText: this.statusText }; (this.responseType === "" || this.responseType === "text") && (response.responseText = this.responseText); (this.responseType === "" || this.responseType === "document") && (response.responseXML = this.responseXML); modifyResponse(response); Reflect.defineProperty(this, "response", { configurable: true, value: response.response }); response.responseText && Reflect.defineProperty(this, "responseText", { configurable: true, value: response.responseText }); response.responseXML && Reflect.defineProperty(this, "responseXML", { configurable: true, value: response.responseXML }); } } catch (e) { debug.error("modifyResponse of xhrhook", one, e); } }); } catch (e) { debug.error("modifyResponse of xhrhook", one, e); } }; return id = rules.push([one, two]); } function xhrhookAsync(url, condition, modifyResponse, once = true) { let id, temp2; const one = Array.isArray(url) ? url : [url]; const two = function(args) { try { if (!condition || condition(args)) { this.xhrhookTimes = this.xhrhookTimes ? this.xhrhookTimes++ : 1; id && (temp2 = rules[id - 1]); delete rules[id - 1]; this.send = () => true; (!args[2] || args[2] === true) && (this.timeout = 0); const et = setInterval(() => { this.dispatchEvent(new ProgressEvent("progress")); }, 50); Reflect.defineProperty(this, "status", { configurable: true, value: 200 }); Reflect.defineProperty(this, "readyState", { configurable: true, value: 2 }); this.dispatchEvent(new ProgressEvent("readystatechange")); modifyResponse ? modifyResponse(args, this.responseType).then((d) => { clearInterval(et); if (d) { Reflect.defineProperty(this, "response", { configurable: true, value: d.response }); d.responseType && Reflect.defineProperty(this, "responseType", { configurable: true, value: d.responseType }); d.responseText && Reflect.defineProperty(this, "responseText", { configurable: true, value: d.responseText }); d.responseXML && Reflect.defineProperty(this, "responseXML", { configurable: true, value: d.responseXML }); !this.responseURL && Reflect.defineProperty(this, "responseURL", { configurable: true, value: args[1] }); Reflect.defineProperty(this, "readyState", { configurable: true, value: 4 }); this.dispatchEvent(new ProgressEvent("readystatechange")); this.dispatchEvent(new ProgressEvent("load")); this.dispatchEvent(new ProgressEvent("loadend")); } }).catch((d) => { if (this.xhrhookTimes === 1) { if (d && d.response) { Reflect.defineProperty(this, "response", { configurable: true, value: d.response }); d.responseType && Reflect.defineProperty(this, "responseType", { configurable: true, value: d.responseType }); d.responseText && Reflect.defineProperty(this, "responseText", { configurable: true, value: d.responseText }); d.responseXML && Reflect.defineProperty(this, "responseXML", { configurable: true, value: d.responseXML }); !this.responseURL && Reflect.defineProperty(this, "responseURL", { configurable: true, value: args[1] }); Reflect.defineProperty(this, "readyState", { configurable: true, value: 4 }); this.dispatchEvent(new ProgressEvent("readystatechange")); this.dispatchEvent(new ProgressEvent("load")); this.dispatchEvent(new ProgressEvent("loadend")); } else { this.dispatchEvent(new ProgressEvent("error")); } } else { this.xhrhookTimes--; } debug.error("modifyResponse of xhrhookasync", one, d); }).finally(() => { clearInterval(et); !once && (id = rules.push(temp2)); }) : (this.abort(), !once && (id = rules.push(temp2))); clearInterval(et); } } catch (e) { debug.error("condition of xhrhook", one, e); } }; return id = rules.push([one, two]); } function removeXhrhook(id) { id >= 0 && delete rules[id - 1]; } function xhrhookUltra(url, modify) { const one = Array.isArray(url) ? url : [url]; const two = function(args) { try { modify.call(this, this, args); } catch (e) { debug.error("xhrhook modify", one, modify, e); } }; return rules.push([one, two]); } // src/runtime/element/create_scripts.ts function createScripts(elements) { return elements.reduce((s, d) => { s.push(createElement(d)); return s; }, []); } function loopScript(scripts) { return new Promise((r, j) => { const prev = scripts.shift(); if (prev) { if (prev.src) { prev.addEventListener("load", () => r(loopScript(scripts))); prev.addEventListener("abort", () => r(loopScript(scripts))); prev.addEventListener("error", () => r(loopScript(scripts))); return document.body.appendChild(prev); } document.body.appendChild(prev); r(loopScript(scripts)); } else r(void 0); }); } function appendScripts(elements) { return loopScript(createScripts(htmlVnode(elements))); } function loadScriptEs(path2) { const files = isArray(path2) ? path2 : [path2]; window.postMessage({ \$type: "executeScript", data: files }); } // src/images/svg/fork.svg var fork_default = '<svg viewBox="0 0 100 100"><path d="M2 2 L98 98 M 98 2 L2 98Z" stroke-width="10px" stroke="#212121" stroke-linecap="round"></path></svg>'; // src/runtime/toast/toast.html var toast_default = '<div id="toast-container"></div>\\r\\n<style type="text/css">\\r\\n .toast-close-button>svg {\\r\\n width: 12px;\\r\\n height: 12px;\\r\\n }\\r\\n\\r\\n .toast {\\r\\n transition: height 1s ease 0s, padding 1s ease 0s;\\r\\n }\\r\\n\\r\\n #toast-container {\\r\\n font: 12px Helvetica Neue, Helvetica, Arial, Microsoft Yahei, Hiragino Sans GB, Heiti SC, WenQuanYi Micro Hei, sans-serif;\\r\\n }\\r\\n</style>\\r\\n<style type="text/css">\\r\\n /*\\r\\n * Note that this is toastr v2.1.3, the "latest" version in url has no more maintenance,\\r\\n * please go to https://cdnjs.com/libraries/toastr.js and pick a certain version you want to use,\\r\\n * make sure you copy the url from the website since the url may change between versions.\\r\\n */\\r\\n .toast-title {\\r\\n font-weight: bold;\\r\\n }\\r\\n\\r\\n .toast-message {\\r\\n -ms-word-wrap: break-word;\\r\\n word-wrap: break-word;\\r\\n }\\r\\n\\r\\n .toast-message a,\\r\\n .toast-message label {\\r\\n color: #FFFFFF;\\r\\n }\\r\\n\\r\\n .toast-message a:hover {\\r\\n color: #CCCCCC;\\r\\n text-decoration: none;\\r\\n }\\r\\n\\r\\n .toast-close-button {\\r\\n position: relative;\\r\\n right: -0.3em;\\r\\n top: -0.3em;\\r\\n float: right;\\r\\n font-size: 20px;\\r\\n font-weight: bold;\\r\\n color: #FFFFFF;\\r\\n -webkit-text-shadow: 0 1px 0 #ffffff;\\r\\n text-shadow: 0 1px 0 #ffffff;\\r\\n opacity: 0.8;\\r\\n -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=80);\\r\\n filter: alpha(opacity=80);\\r\\n line-height: 1;\\r\\n }\\r\\n\\r\\n .toast-close-button:hover,\\r\\n .toast-close-button:focus {\\r\\n color: #000000;\\r\\n text-decoration: none;\\r\\n cursor: pointer;\\r\\n opacity: 0.4;\\r\\n -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=40);\\r\\n filter: alpha(opacity=40);\\r\\n }\\r\\n\\r\\n .rtl .toast-close-button {\\r\\n left: -0.3em;\\r\\n float: left;\\r\\n right: 0.3em;\\r\\n }\\r\\n\\r\\n /*Additional properties for button version\\r\\n iOS requires the button element instead of an anchor tag.\\r\\n If you want the anchor version, it requires \`href="#"\`.*/\\r\\n button.toast-close-button {\\r\\n padding: 0;\\r\\n cursor: pointer;\\r\\n background: transparent;\\r\\n border: 0;\\r\\n -webkit-appearance: none;\\r\\n }\\r\\n\\r\\n .toast-top-center {\\r\\n top: 0;\\r\\n right: 0;\\r\\n width: 100%;\\r\\n }\\r\\n\\r\\n .toast-bottom-center {\\r\\n bottom: 0;\\r\\n right: 0;\\r\\n width: 100%;\\r\\n }\\r\\n\\r\\n .toast-top-full-width {\\r\\n top: 0;\\r\\n right: 0;\\r\\n width: 100%;\\r\\n }\\r\\n\\r\\n .toast-bottom-full-width {\\r\\n bottom: 0;\\r\\n right: 0;\\r\\n width: 100%;\\r\\n }\\r\\n\\r\\n .toast-top-left {\\r\\n top: 12px;\\r\\n left: 12px;\\r\\n }\\r\\n\\r\\n .toast-top-right {\\r\\n top: 12px;\\r\\n right: 12px;\\r\\n }\\r\\n\\r\\n .toast-bottom-right {\\r\\n right: 12px;\\r\\n bottom: 12px;\\r\\n }\\r\\n\\r\\n .toast-bottom-left {\\r\\n bottom: 12px;\\r\\n left: 12px;\\r\\n }\\r\\n\\r\\n #toast-container {\\r\\n position: fixed;\\r\\n z-index: 999999;\\r\\n pointer-events: none;\\r\\n /*overrides*/\\r\\n }\\r\\n\\r\\n #toast-container * {\\r\\n -moz-box-sizing: border-box;\\r\\n -webkit-box-sizing: border-box;\\r\\n box-sizing: border-box;\\r\\n }\\r\\n\\r\\n #toast-container>div {\\r\\n position: relative;\\r\\n pointer-events: auto;\\r\\n overflow: hidden;\\r\\n margin: 0 0 6px;\\r\\n padding: 15px 15px 15px 50px;\\r\\n width: 300px;\\r\\n -moz-border-radius: 3px 3px 3px 3px;\\r\\n -webkit-border-radius: 3px 3px 3px 3px;\\r\\n border-radius: 3px 3px 3px 3px;\\r\\n background-position: 15px center;\\r\\n background-repeat: no-repeat;\\r\\n -moz-box-shadow: 0 0 12px #999999;\\r\\n -webkit-box-shadow: 0 0 12px #999999;\\r\\n box-shadow: 0 0 12px #999999;\\r\\n color: #FFFFFF;\\r\\n opacity: 0.8;\\r\\n -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=80);\\r\\n filter: alpha(opacity=80);\\r\\n }\\r\\n\\r\\n #toast-container>div.rtl {\\r\\n direction: rtl;\\r\\n padding: 15px 50px 15px 15px;\\r\\n background-position: right 15px center;\\r\\n }\\r\\n\\r\\n #toast-container>div:hover {\\r\\n -moz-box-shadow: 0 0 12px #000000;\\r\\n -webkit-box-shadow: 0 0 12px #000000;\\r\\n box-shadow: 0 0 12px #000000;\\r\\n opacity: 1;\\r\\n -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);\\r\\n filter: alpha(opacity=100);\\r\\n cursor: pointer;\\r\\n }\\r\\n\\r\\n #toast-container>.toast-info {\\r\\n background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGwSURBVEhLtZa9SgNBEMc9sUxxRcoUKSzSWIhXpFMhhYWFhaBg4yPYiWCXZxBLERsLRS3EQkEfwCKdjWJAwSKCgoKCcudv4O5YLrt7EzgXhiU3/4+b2ckmwVjJSpKkQ6wAi4gwhT+z3wRBcEz0yjSseUTrcRyfsHsXmD0AmbHOC9Ii8VImnuXBPglHpQ5wwSVM7sNnTG7Za4JwDdCjxyAiH3nyA2mtaTJufiDZ5dCaqlItILh1NHatfN5skvjx9Z38m69CgzuXmZgVrPIGE763Jx9qKsRozWYw6xOHdER+nn2KkO+Bb+UV5CBN6WC6QtBgbRVozrahAbmm6HtUsgtPC19tFdxXZYBOfkbmFJ1VaHA1VAHjd0pp70oTZzvR+EVrx2Ygfdsq6eu55BHYR8hlcki+n+kERUFG8BrA0BwjeAv2M8WLQBtcy+SD6fNsmnB3AlBLrgTtVW1c2QN4bVWLATaIS60J2Du5y1TiJgjSBvFVZgTmwCU+dAZFoPxGEEs8nyHC9Bwe2GvEJv2WXZb0vjdyFT4Cxk3e/kIqlOGoVLwwPevpYHT+00T+hWwXDf4AJAOUqWcDhbwAAAAASUVORK5CYII=") !important;\\r\\n }\\r\\n\\r\\n #toast-container>.toast-error {\\r\\n background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHOSURBVEhLrZa/SgNBEMZzh0WKCClSCKaIYOED+AAKeQQLG8HWztLCImBrYadgIdY+gIKNYkBFSwu7CAoqCgkkoGBI/E28PdbLZmeDLgzZzcx83/zZ2SSXC1j9fr+I1Hq93g2yxH4iwM1vkoBWAdxCmpzTxfkN2RcyZNaHFIkSo10+8kgxkXIURV5HGxTmFuc75B2RfQkpxHG8aAgaAFa0tAHqYFfQ7Iwe2yhODk8+J4C7yAoRTWI3w/4klGRgR4lO7Rpn9+gvMyWp+uxFh8+H+ARlgN1nJuJuQAYvNkEnwGFck18Er4q3egEc/oO+mhLdKgRyhdNFiacC0rlOCbhNVz4H9FnAYgDBvU3QIioZlJFLJtsoHYRDfiZoUyIxqCtRpVlANq0EU4dApjrtgezPFad5S19Wgjkc0hNVnuF4HjVA6C7QrSIbylB+oZe3aHgBsqlNqKYH48jXyJKMuAbiyVJ8KzaB3eRc0pg9VwQ4niFryI68qiOi3AbjwdsfnAtk0bCjTLJKr6mrD9g8iq/S/B81hguOMlQTnVyG40wAcjnmgsCNESDrjme7wfftP4P7SP4N3CJZdvzoNyGq2c/HWOXJGsvVg+RA/k2MC/wN6I2YA2Pt8GkAAAAASUVORK5CYII=") !important;\\r\\n }\\r\\n\\r\\n #toast-container>.toast-success {\\r\\n background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADsSURBVEhLY2AYBfQMgf///3P8+/evAIgvA/FsIF+BavYDDWMBGroaSMMBiE8VC7AZDrIFaMFnii3AZTjUgsUUWUDA8OdAH6iQbQEhw4HyGsPEcKBXBIC4ARhex4G4BsjmweU1soIFaGg/WtoFZRIZdEvIMhxkCCjXIVsATV6gFGACs4Rsw0EGgIIH3QJYJgHSARQZDrWAB+jawzgs+Q2UO49D7jnRSRGoEFRILcdmEMWGI0cm0JJ2QpYA1RDvcmzJEWhABhD/pqrL0S0CWuABKgnRki9lLseS7g2AlqwHWQSKH4oKLrILpRGhEQCw2LiRUIa4lwAAAABJRU5ErkJggg==") !important;\\r\\n }\\r\\n\\r\\n #toast-container>.toast-warning {\\r\\n background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGYSURBVEhL5ZSvTsNQFMbXZGICMYGYmJhAQIJAICYQPAACiSDB8AiICQQJT4CqQEwgJvYASAQCiZiYmJhAIBATCARJy+9rTsldd8sKu1M0+dLb057v6/lbq/2rK0mS/TRNj9cWNAKPYIJII7gIxCcQ51cvqID+GIEX8ASG4B1bK5gIZFeQfoJdEXOfgX4QAQg7kH2A65yQ87lyxb27sggkAzAuFhbbg1K2kgCkB1bVwyIR9m2L7PRPIhDUIXgGtyKw575yz3lTNs6X4JXnjV+LKM/m3MydnTbtOKIjtz6VhCBq4vSm3ncdrD2lk0VgUXSVKjVDJXJzijW1RQdsU7F77He8u68koNZTz8Oz5yGa6J3H3lZ0xYgXBK2QymlWWA+RWnYhskLBv2vmE+hBMCtbA7KX5drWyRT/2JsqZ2IvfB9Y4bWDNMFbJRFmC9E74SoS0CqulwjkC0+5bpcV1CZ8NMej4pjy0U+doDQsGyo1hzVJttIjhQ7GnBtRFN1UarUlH8F3xict+HY07rEzoUGPlWcjRFRr4/gChZgc3ZL2d8oAAAAASUVORK5CYII=") !important;\\r\\n }\\r\\n\\r\\n #toast-container.toast-top-center>div,\\r\\n #toast-container.toast-bottom-center>div {\\r\\n width: 300px;\\r\\n margin-left: auto;\\r\\n margin-right: auto;\\r\\n }\\r\\n\\r\\n #toast-container.toast-top-full-width>div,\\r\\n #toast-container.toast-bottom-full-width>div {\\r\\n width: 96%;\\r\\n margin-left: auto;\\r\\n margin-right: auto;\\r\\n }\\r\\n\\r\\n .toast {\\r\\n background-color: #030303;\\r\\n }\\r\\n\\r\\n .toast-success {\\r\\n background-color: #51A351;\\r\\n }\\r\\n\\r\\n .toast-error {\\r\\n background-color: #BD362F;\\r\\n }\\r\\n\\r\\n .toast-info {\\r\\n background-color: #2F96B4;\\r\\n }\\r\\n\\r\\n .toast-warning {\\r\\n background-color: #F89406;\\r\\n }\\r\\n\\r\\n .toast-progress {\\r\\n position: absolute;\\r\\n left: 0;\\r\\n bottom: 0;\\r\\n height: 4px;\\r\\n background-color: #000000;\\r\\n opacity: 0.4;\\r\\n -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=40);\\r\\n filter: alpha(opacity=40);\\r\\n }\\r\\n\\r\\n /*Responsive Design*/\\r\\n @media all and (max-width: 240px) {\\r\\n #toast-container>div {\\r\\n padding: 8px 8px 8px 50px;\\r\\n width: 11em;\\r\\n }\\r\\n\\r\\n #toast-container>div.rtl {\\r\\n padding: 8px 50px 8px 8px;\\r\\n }\\r\\n\\r\\n #toast-container .toast-close-button {\\r\\n right: -0.2em;\\r\\n top: -0.2em;\\r\\n }\\r\\n\\r\\n #toast-container .rtl .toast-close-button {\\r\\n left: -0.2em;\\r\\n right: 0.2em;\\r\\n }\\r\\n }\\r\\n\\r\\n @media all and (min-width: 241px) and (max-width: 480px) {\\r\\n #toast-container>div {\\r\\n padding: 8px 8px 8px 50px;\\r\\n width: 18em;\\r\\n }\\r\\n\\r\\n #toast-container>div.rtl {\\r\\n padding: 8px 50px 8px 8px;\\r\\n }\\r\\n\\r\\n #toast-container .toast-close-button {\\r\\n right: -0.2em;\\r\\n top: -0.2em;\\r\\n }\\r\\n\\r\\n #toast-container .rtl .toast-close-button {\\r\\n left: -0.2em;\\r\\n right: 0.2em;\\r\\n }\\r\\n }\\r\\n\\r\\n @media all and (min-width: 481px) and (max-width: 768px) {\\r\\n #toast-container>div {\\r\\n padding: 15px 15px 15px 50px;\\r\\n width: 25em;\\r\\n }\\r\\n\\r\\n #toast-container>div.rtl {\\r\\n padding: 15px 50px 15px 15px;\\r\\n }\\r\\n }\\r\\n</style>'; // src/runtime/toast/toast.ts var ToastContainer = class extends HTMLElement { positionList = ["top-right", "top-left", "bottom-right", "bottom-left"]; typeList = ["success", "error", "info", "warning", ""]; container; status = true; rtl = false; position = "top-right"; delay = 4; constructor() { super(); const root3 = this.attachShadow({ mode: "closed" }); root3.appendChild(createElements(htmlVnode(toast_default))); this.container = root3.children[0]; Object.defineProperties(this, { status: { get: () => setting.toast.status, set: (v) => { if (v === setting.toast.status) return; setting.toast.status = v; } }, rtl: { get: () => setting.toast.rtl, set: (v) => { if (v === setting.toast.rtl) return; setting.toast.rtl = v; v ? this.container.childNodes.forEach((d) => { d.classList.add("rtl"); }) : this.container.childNodes.forEach((d) => { d.classList.remove("rtl"); }); } }, position: { get: () => setting.toast.position, set: (v) => { if (v === setting.toast.position) return; if (!this.positionList.includes(v)) return; setting.toast.position = v; this.container.className = \`toast-\${v}\`; } }, delay: { get: () => setting.toast.delay, set: (v) => { if (v === setting.toast.delay) return; setting.toast.delay = v; } } }); } toast(delay, type, ...data) { if (!this.status) return; document.body.contains(this) || document.body.appendChild(this); this.container.className = \`toast-\${this.position}\`; let html = \`<div class="toast\${type ? " toast-" + type : ""}\${this.rtl ? " rtl" : ""}" aria-live="assertive" style="padding-top: 0px;padding-bottom: 0px;height: 0px;"><div class="toast-message">\`; !delay && (html += \`<div class="toast-close-button">\${fork_default}</div>\`); data.forEach((d, i) => { if (isObject(d)) { try { d = JSON.stringify(d, void 0, "<br>"); } catch (e) { } } html += i ? \`<br>\${d}\` : \`<label>\${d}</label>\`; }); html += "</div></div>"; const node4 = createElements(htmlVnode(html)); const toast2 = node4.children[0]; this.container.insertBefore(node4, this.container.firstChild); toast2.setAttribute("style", \`height: \${toast2.scrollHeight + 30}px;\`); let hovering = false; toast2.addEventListener("mouseover", () => hovering = true); toast2.addEventListener("mouseout", () => hovering = false); Object.defineProperties(toast2, { "type": { get: () => type, set: (v) => { if (v === type) return; if (!this.typeList.includes(v)) return; type && toast2.classList.remove(\`toast-\${type}\`); v && toast2.classList.add(\`toast-\${v}\`); toast2.classList; type = v; } }, "data": { get: () => new Proxy(data, new ProxyHandler(ToastContainer.organizeDate.bind(ToastContainer, toast2))), set: (v) => { if (v === data) return; data = v; ToastContainer.organizeDate(toast2); } }, "delay": { get: () => delay, set: (v) => { if (v === delay) return; if (isNaN(v)) return; if (delay === 0) delay = v, ToastContainer.countDown(toast2); delay = v; if (v === 0) { hovering ? toast2.addEventListener("mouseout", () => ToastContainer.remove(toast2)) : ToastContainer.remove(toast2); } } } }); !delay ? toast2.children[0].children[0].addEventListener("click", () => ToastContainer.remove(toast2)) : ToastContainer.countDown(toast2); return toast2; } static countDown(node4) { node4.delay && setTimeout(() => { node4.delay--; this.countDown(node4); }, 1e3); } static remove(node4) { node4.setAttribute("style", "padding-top: 0px;padding-bottom: 0px;height: 0px;"); setTimeout(() => node4.remove(), 1e3); } static organizeDate(node4) { let html = !node4.delay ? \`<div class="toast-close-button">\${fork_default}</div>\` : ""; node4.data.forEach((d, i) => { if (isObject(d)) { try { d = JSON.stringify(d, void 0, "<br>"); } catch (e) { } } html += i ? \`<br>\${d}\` : \`<label>\${d}</label>\`; }); node4.children[0].replaceChildren(createElements(htmlVnode(html))); node4.setAttribute("style", \`height: \${node4.firstChild.clientHeight + 30}px;\`); !node4.delay && node4.children[0].children[0].addEventListener("click", () => ToastContainer.remove(node4)); } }; customElements.get(\`toast-container\${mutex}\`) || customElements.define(\`toast-container\${mutex}\`, ToastContainer); var node = customElements ? new ToastContainer() : { toast: () => { } }; function Toast(type, ...data) { return node.toast(node.delay, type, ...data); } function toast(...data) { return Toast.bind(node, "")(...data); } toast.success = Toast.bind(node, "success"); toast.error = Toast.bind(node, "error"); toast.info = Toast.bind(node, "info"); toast.warning = Toast.bind(node, "warning"); toast.custom = node.toast.bind(node); // src/runtime/lib/crc32.ts var Midcrc = class { CRCPOLYNOMIAL = 3988292384; crctable = new Array(256); index = new Array(4); constructor() { this.create_table(); } run(input) { let ht = parseInt("0x" + input) ^ 4294967295, snum, i, lastindex, deepCheckData; for (i = 3; i >= 0; i--) { this.index[3 - i] = this.getcrcindex(ht >>> i * 8); snum = this.crctable[this.index[3 - i]]; ht ^= snum >>> (3 - i) * 8; } for (i = 0; i < 1e7; i++) { lastindex = this.crc32lastindex(i); if (lastindex == this.index[3]) { deepCheckData = this.deepCheck(i, this.index); if (deepCheckData[0]) break; } } if (i == 1e7) return -1; return Number(i + "" + deepCheckData[1]); } create_table() { let crcreg, i, j; for (i = 0; i < 256; ++i) { crcreg = i; for (j = 0; j < 8; ++j) { if ((crcreg & 1) !== 0) { crcreg = this.CRCPOLYNOMIAL ^ crcreg >>> 1; } else { crcreg >>>= 1; } } this.crctable[i] = crcreg; } } crc32(input) { if (typeof input != "string") input = input.toString(); let crcstart = 4294967295, len = input.length, index; for (let i = 0; i < len; ++i) { index = (crcstart ^ input.charCodeAt(i)) & 255; crcstart = crcstart >>> 8 ^ this.crctable[index]; } return crcstart; } crc32lastindex(input) { if (typeof input != "string") input = input.toString(); let crcstart = 4294967295, len = input.length, index; for (let i = 0; i < len; ++i) { index = (crcstart ^ input.charCodeAt(i)) & 255; crcstart = crcstart >>> 8 ^ this.crctable[index]; } return index; } getcrcindex(t) { for (let i = 0; i < 256; i++) if (this.crctable[i] >>> 24 == t) return i; return -1; } deepCheck(i, index) { let tc = 0, str = "", hash = this.crc32(i); tc = hash & 255 ^ index[2]; if (!(tc <= 57 && tc >= 48)) return [0]; str += tc - 48; hash = this.crctable[index[2]] ^ hash >>> 8; tc = hash & 255 ^ index[1]; if (!(tc <= 57 && tc >= 48)) return [0]; str += tc - 48; hash = this.crctable[index[1]] ^ hash >>> 8; tc = hash & 255 ^ index[0]; if (!(tc <= 57 && tc >= 48)) return [0]; str += tc - 48; hash = this.crctable[index[0]] ^ hash >>> 8; return [1, str]; } }; var crc = new Midcrc(); function midcrc(input) { return crc.run(input); } function crc32(input) { return ((crc.crc32(input) + 1) * -1 >>> 0).toString(16); } // src/runtime/lib/base64.ts var Base64 = class { static encode(str) { return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function(match, p1) { return String.fromCharCode("0x" + p1); })); } static decode(str) { return decodeURIComponent(atob(str).split("").map(function(c) { return "%" + ("00" + c.charCodeAt(0).toString(16)).slice(-2); }).join("")); } }; // src/runtime/cookies.ts function getCookies() { return document.cookie.split("; ").reduce((s, d) => { let key = d.split("=")[0]; let val = d.split("=")[1]; s[key] = unescape(val); return s; }, {}); } function setCookie(name, value, days = 365) { const exp = new Date(); exp.setTime(exp.getTime() + days * 24 * 60 * 60 * 1e3); document.cookie = name + "=" + escape(value) + ";expires=" + exp.toUTCString() + "; path=/; domain=.bilibili.com"; } // src/runtime/variable/path.ts var path = location.href.split("/"); // src/runtime/element/horizontal/horizontal.html var horizontal_default = '<div class="hr"></div>\\r\\n<style type="text/css">\\r\\n .hr {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n grid-gap: 0;\\r\\n gap: 0;\\r\\n justify-content: space-between;\\r\\n flex-shrink: 0;\\r\\n height: 1px;\\r\\n background-color: rgba(136, 136, 136, 0.1);\\r\\n width: 100%;\\r\\n margin-bottom: 12px;\\r\\n }\\r\\n</style>'; // src/runtime/element/horizontal/horizontal.ts var HorizontalLine = class extends HTMLElement { constructor() { super(); const root3 = this.attachShadow({ mode: "closed" }); root3.appendChild(createElements(htmlVnode(horizontal_default))); } }; customElements.get(\`horizontal-line\${mutex}\`) || customElements.define(\`horizontal-line\${mutex}\`, HorizontalLine); // src/runtime/element/popupbox/popupbox.html var popupbox_default = '<div class="box">\\r\\n <div class="contain"></div>\\r\\n <div class="fork"></div>\\r\\n</div>\\r\\n<style type="text/css">\\r\\n .box {\\r\\n top: 50%;\\r\\n left: 50%;\\r\\n transform: translateX(-50%) translateY(-50%);\\r\\n transition: 0.3s cubic-bezier(0.22, 0.61, 0.36, 1);\\r\\n padding: 12px;\\r\\n background-color: #fff;\\r\\n color: black;\\r\\n border-radius: 8px;\\r\\n box-shadow: 0 4px 12px 0 rgb(0 0 0 / 5%);\\r\\n border: 1px solid rgba(136, 136, 136, 0.13333);\\r\\n box-sizing: border-box;\\r\\n position: fixed;\\r\\n font-size: 13px;\\r\\n z-index: 11115;\\r\\n line-height: 14px;\\r\\n }\\r\\n\\r\\n .contain {\\r\\n display: flex;\\r\\n flex-direction: column;\\r\\n height: 100%;\\r\\n }\\r\\n\\r\\n .fork {\\r\\n position: absolute;\\r\\n transform: scale(0.8);\\r\\n right: 10px;\\r\\n top: 10px;\\r\\n height: 20px;\\r\\n width: 20px;\\r\\n pointer-events: visible;\\r\\n }\\r\\n\\r\\n .fork:hover {\\r\\n border-radius: 50%;\\r\\n background-color: rgba(0, 0, 0, 10%);\\r\\n }\\r\\n</style>'; // src/runtime/element/popupbox/popupbox.ts var ClickRemove = class { cancel; observe; constructor(node4) { node4.addEventListener("click", (e) => e.stopPropagation()); function remove() { node4.remove(); document.removeEventListener("click", remove); } this.cancel = () => document.removeEventListener("click", remove); this.observe = () => { setTimeout(() => { document.addEventListener("click", remove); }, 100); }; } }; var PopupBox = class extends HTMLElement { _children; _style; _fork; _observe; __contain; __fork; constructor(obj) { super(); const { children, style, fork } = obj; const root3 = this.attachShadow({ mode: "closed" }); root3.appendChild(createElements(htmlVnode(popupbox_default.replace('<div class="fork"></div>', \`<div class="fork">\${fork_default}</div>\`)))); this.__contain = root3.children[0].children[0]; this.__fork = root3.children[0].children[1]; this._observe = new ClickRemove(this); Object.defineProperties(obj, { children: { get: () => this._children, set: (v) => { if (this._children === v) return; this._children = v; this.\$children(); } }, style: { get: () => this._style, set: (v) => { if (this._style === v) return; this._style = v; this.\$style(); } }, fork: { get: () => this._fork, set: (v) => { if (this._fork === v) return; this._fork = v; this.\$fork(); } } }); this._children = obj.children = children || document.createDocumentFragment(); this._style = obj.style = style || ""; this._fork = obj.fork = fork || false; this.__fork.addEventListener("click", () => this.remove()); document.body.appendChild(this); } timer = 0; \$children() { clearTimeout(this.timer); this.timer = setTimeout(() => { this.__contain.replaceChildren(this._children); }, 250); } \$style() { this.__contain.setAttribute("style", this._style); } \$fork() { if (this._fork) { this._observe.cancel(); this.__fork.style.display = ""; } else { this._observe.observe(); this.__fork.style.display = "none"; } } }; customElements.get(\`popup-box\${mutex}\`) || customElements.define(\`popup-box\${mutex}\`, PopupBox); // src/runtime/element/push_button/push_button.html var push_button_default = '<div class="button" role="button">按钮</div>\\r\\n<style>\\r\\n .button {\\r\\n width: fit-content;\\r\\n cursor: pointer;\\r\\n line-height: 28px;\\r\\n padding-left: 10px;\\r\\n padding-right: 10px;\\r\\n text-align: right;\\r\\n border: 1px solid #ccd0d7;\\r\\n border-radius: 4px;\\r\\n color: #222;\\r\\n transition: border-color .2s ease, background-color .2s ease;\\r\\n box-sizing: border-box;\\r\\n user-select: none;\\r\\n }\\r\\n\\r\\n .button:hover {\\r\\n color: #00a1d6;\\r\\n border-color: #00a1d6;\\r\\n }\\r\\n\\r\\n .button:active {\\r\\n background-color: #eee;\\r\\n }\\r\\n</style>'; // src/runtime/element/push_button/push_button.ts var PushButton = class extends HTMLElement { button; constructor(obj) { super(); const root3 = this.attachShadow({ mode: "closed" }); const { button, func } = obj; root3.appendChild(createElements(htmlVnode(push_button_default))); const node4 = root3.children[0]; Reflect.defineProperty(obj, "button", { set: (v) => { if (this.button === v) return; node4.textContent = v; this.button = v; }, get: () => this.button }); let timer2; node4.addEventListener("click", () => { clearTimeout(timer2); timer2 = setTimeout(() => { func(); }, 100); }); this.button = obj.button = button || "点击"; } }; customElements.get(\`push-button\${mutex}\`) || customElements.define(\`push-button\${mutex}\`, PushButton); // src/runtime/element/alert.ts function showAlert(data, head, button) { const part = createElements(htmlVnode( \`<div style="text-align: center;font-size: 16px;font-weight: bold;margin-bottom: 10px;"> <span>\${head || "Bilibili Old"}</span> </div> <div style="margin-bottom: 10px;"><div>\${data}</div></div>\` )); let popup; if (button && button.length) { part.appendChild(new HorizontalLine()); const node4 = part.appendChild(createElement({ tagName: "div", props: { style: "display: flex;align-items: center;justify-content: space-around;" } })); button.forEach((d) => { node4.appendChild(new PushButton({ button: d.name, func: () => { d.callback(); popup.remove(); } })); }); } popup = new PopupBox({ children: part, style: "max-width: 360px; max-height: 300px;" }); } // src/runtime/variable/variable.ts var API = { get aid() { return window.aid; }, set aid(v) { window.aid = v; }, get cid() { return window.cid; }, set cid(v) { window.cid = v; }, get ssid() { return window.ssid; }, set ssid(v) { window.ssid = v; }, get epid() { return window.epid; }, set epid(v) { window.epid = v; }, get __INITIAL_STATE__() { return window.__INITIAL_STATE__; }, set __INITIAL_STATE__(v) { window.__INITIAL_STATE__ = v; }, __playinfo__: void 0, limit: void 0, bkg_cover: void 0, cover: void 0, title: void 0, th: void 0, pgc: void 0, playerParam: void 0, rewrite: 0, GM, urlParam, xhr, urlsign, objUrl, urlObj, URLES, addCss, addElement, saveAs, md5, timeFormat, sizeFormat, integerFormat, xhrhook, xhrhookAsync, xhrhookUltra, removeXhrhook, jsonphook, jsonphookasync, removeJsonphook, htmlVnode, loadScript, appendScripts, toast, debug, crc32, Base64, getCookies, setCookie, doWhile, mutex, path, fileRead, showAlert }; setting.development && Reflect.set(window, "API", API); // src/runtime/hook/webpack_jsonp.ts var hook; var arr = []; var param = []; var webpackJsonp = window.webpackJsonp; Reflect.defineProperty(window, "webpackJsonp", { set: (v) => hook = v, get: () => { if (hook) { if (isArray(hook)) { if (API.rewrite) { if (API.rewrite === 2) { hook = void 0; } else if (hook.length > 1) { hook.shift(); } } return hook; } return (chunkIds, moreModules, executeModules) => { if (arr[moreModules.length]) { const obj = arr[moreModules.length]; const pam = param[moreModules.length]; Object.entries(obj).forEach((d) => { let code = moreModules[d[0]]; if (code) { code = code.toString(); d[1].forEach((e) => code = e(code)); moreModules[d[0]] = new Function(pam[0], pam[1], pam[2], \`(\${code})(\${pam[0]},\${pam[1]},\${pam[2]})\`); } }); } return hook(chunkIds, moreModules, executeModules); }; } }, configurable: true }); window.webpackJsonp = webpackJsonp; function webpackhook(len, pos, rpc, params = ["t", "e", "i"]) { if (!arr[len]) { arr[len] = {}; param[len] = params; } arr[len][pos] = arr[len][pos] || []; arr[len][pos].push((code) => rpc(code)); } // src/runtime/danmaku/danmaku_hash_id.css var danmaku_hash_id_default = "/* 反查弹幕发送者相关样式 */\\r\\n.bb-comment,\\r\\n.comment-bilibili-fold {\\r\\n font-family: Microsoft YaHei, Arial, Helvetica, sans-serif;\\r\\n font-size: 0;\\r\\n zoom: 1;\\r\\n min-height: 100px;\\r\\n background: #fff;\\r\\n}\\r\\n\\r\\n.bb-comment .comment-list,\\r\\n.comment-bilibili-fold .comment-list {\\r\\n padding-top: 20px;\\r\\n}\\r\\n\\r\\n.bb-comment *,\\r\\n.comment-bilibili-fold * {\\r\\n box-sizing: content-box;\\r\\n}\\r\\n\\r\\n.bb-comment .comment-list .list-item .reply-box .reply-item .reply-face,\\r\\n.comment-bilibili-fold .comment-list .list-item .reply-box .reply-item .reply-face {\\r\\n display: inline-block;\\r\\n position: relative;\\r\\n margin-right: 10px;\\r\\n vertical-align: top;\\r\\n}\\r\\n\\r\\n.bb-comment .comment-list .list-item .reply-box .reply-item .reply-face img,\\r\\n.comment-bilibili-fold .comment-list .list-item .reply-box .reply-item .reply-face img {\\r\\n width: 24px;\\r\\n height: 24px;\\r\\n border-radius: 50%;\\r\\n}\\r\\n\\r\\n.bb-comment .comment-list .list-item .reply-box .reply-item .reply-con,\\r\\n.comment-bilibili-fold .comment-list .list-item .reply-box .reply-item .reply-con {\\r\\n display: inline-block;\\r\\n width: calc(100% - 34px);\\r\\n}\\r\\n\\r\\n.bb-comment .comment-list .list-item .user,\\r\\n.comment-bilibili-fold .comment-list .list-item .user {\\r\\n font-size: 12px;\\r\\n font-weight: 700;\\r\\n line-height: 18px;\\r\\n padding-bottom: 4px;\\r\\n display: block;\\r\\n word-wrap: break-word;\\r\\n position: relative;\\r\\n}\\r\\n\\r\\n.bb-comment .comment-list .list-item .reply-box .reply-item .reply-con .user .name,\\r\\n.comment-bilibili-fold .comment-list .list-item .reply-box .reply-item .reply-con .user .name {\\r\\n position: relative;\\r\\n top: -1px;\\r\\n}\\r\\n\\r\\n.bb-comment .comment-list .list-item .reply-box .reply-item .level,\\r\\n.comment-bilibili-fold .comment-list .list-item .reply-box .reply-item .level {\\r\\n margin: 0 15px 0 8px;\\r\\n}\\r\\n\\r\\n.bb-comment .comment-list .list-item .user .level.l0,\\r\\n.comment-bilibili-fold .comment-list .list-item .user .level.l0 {\\r\\n background-position: -23px -28px\\r\\n}\\r\\n\\r\\n.bb-comment .comment-list .list-item .user .level.l1,\\r\\n.comment-bilibili-fold .comment-list .list-item .user .level.l1 {\\r\\n background-position: -23px -92px\\r\\n}\\r\\n\\r\\n.bb-comment .comment-list .list-item .user .level.l2,\\r\\n.comment-bilibili-fold .comment-list .list-item .user .level.l2 {\\r\\n background-position: -23px -156px\\r\\n}\\r\\n\\r\\n.bb-comment .comment-list .list-item .user .level.l3,\\r\\n.comment-bilibili-fold .comment-list .list-item .user .level.l3 {\\r\\n background-position: -23px -220px\\r\\n}\\r\\n\\r\\n.bb-comment .comment-list .list-item .user .level.l4,\\r\\n.comment-bilibili-fold .comment-list .list-item .user .level.l4 {\\r\\n background-position: -23px -284px\\r\\n}\\r\\n\\r\\n.bb-comment .comment-list .list-item .user .level.l5,\\r\\n.comment-bilibili-fold .comment-list .list-item .user .level.l5 {\\r\\n background-position: -23px -348px\\r\\n}\\r\\n\\r\\n.bb-comment .comment-list .list-item .user .level.l6,\\r\\n.comment-bilibili-fold .comment-list .list-item .user .level.l6 {\\r\\n background-position: -23px -412px\\r\\n}\\r\\n\\r\\n.bb-comment .comment-list .list-item .user .level.l7,\\r\\n.comment-bilibili-fold .comment-list .list-item .user .level.l7 {\\r\\n background-position: -23px -476px\\r\\n}\\r\\n\\r\\n.bb-comment .comment-list .list-item .user .level.l8,\\r\\n.comment-bilibili-fold .comment-list .list-item .user .level.l8 {\\r\\n background-position: -23px -540px\\r\\n}\\r\\n\\r\\n.bb-comment .comment-list .list-item .user .level.l9,\\r\\n.comment-bilibili-fold .comment-list .list-item .user .level.l9 {\\r\\n background-position: -23px -604px\\r\\n}\\r\\n\\r\\n.bb-comment .comment-list .list-item .user .level,\\r\\n.comment-bilibili-fold .comment-list .list-item .user .level {\\r\\n display: inline-block;\\r\\n width: 19px;\\r\\n height: 9px;\\r\\n vertical-align: middle;\\r\\n margin: 0 8px;\\r\\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA+gAAAPoCAMAAAB6fSTWAAAA51BMVEUAAACYoKhwd3yboqni5emDjJL7+/yZoqoAodbnix8AodYAodaZoqoAodYAodaln5jnix8Aodbnix8AodaZoqoAodbnix8Aodbnix/yXY6ZoqoAodYAodYAodaZoqoAodaZoqryXY7yXY4AodbyXY6ZoqryXY6ZoqoAodaZoqoAodaZoqryXY7nix8AodYAodbnix+ZoqqZoqrnix8AodYAodbnix+Zoqr////19vfM0NcAoda/v7/l6e9MyP//u1PlL+z/s3yS0eWV3bL/bAAVFRX/AACEHPnnix+M2fn/1pbyXY4iIiIkv4BgAAAAOHRSTlMA9fUreZKu4eI+EfDtgtwP7AkexYcv2WfIsP3refnX0mcmGUPyxsScjXkXF++zoZpMMyn+Ppl8Q6/LsKoAAA3QSURBVHja7NvdbtowGIfxP7UsaEqbfkGj0bWVpqofiK0f2nZALyD3f0V7E4KsbULCjpRA9fykQDjw4SOb2BEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG2cF4X64vzAeJc+/sDYeGDH3Q0e1MrV1x9q4eW0LNUTP2j4xPEHDS9gp70O50O1MRk9j5Tu13tZhX4+LdS5ejJvpnUlqCfzZloXsMPym99qFfrZ7Telh54vyop1Xk7VNevbqeas+KT5fD2eOR3b+FhR1/L84dJaz42SZNnPR2UnWZadKV7+Mi1rss7P1THXdB7u47iq83DP/3RsijtQpevQ78bjL/fS29CMHxTvana0vDjT5MTMviuSVb6movvO5Qe+Wr2vLvsRP6H7avW+ujxTOjaErrrw+mq+1K1hrqHWxoo3yjTS2kyRTssQeh9sEg+hO/uIZJN4CN3xLx07G7pC6G/3KaErhD65UKQyUGEfhbplaYfQlRK6Quja29CPj4W/febQn55ahn59vY+hO9VcWuhh/P6GfrxcUvq/PnHo965l6BcTRZruwNLdexnv05buYfzeLt2tc0qPkBi6qb77D31+o3ahP58o1mERQl8U/TyMc3bZjUt9GOfsshvHwzhsDt00jdf3fYZ+d9ky9KtHxcsPe99ec746NJO+veZ8dWiG7TVs9PGfzkOfr0PPb16TQn9eh57dTtoemCm0NQ7MAHH76OOVJylxH/2oNrtufQR2oa1xBBbYN/ZSy7ui8VILsF94TRUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAH3buoMVNIAzA8BxESA5ldyHkUui1p/Y6YrJ71v//g/rFmFoKaaMBdZPngTWzh+/4MqKTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwIMqyirnqizungfWqihzryzum5c6rFVkWrUfoa0i1Unzx+Y9NMfTPKzZvv6ZnlJ02n702ih1wnzz3muUzrrt6rpOS3kbFrMrzp0PpRdj57vOh9LdvbNer/WCob+9bFJn8zJ/6eWl87Y9l16OnW/6xpvuakvnvw5naW7bbX2y3W5f0xI2UXr/MbciV33nffBVLsbNH/vO++CPtnSuxT3o/k/z2td/+JGWEIkv0vmwobf596KcsqE3ORa2dK46nNLuLsNiXpF3/F2kRUTkC3QeqnzpPBadXI2bv3Qei07Mg9CvlR6dLyDnc+ehqqou9Dxu/tJ5zB+70HOCtYf+Nd3sgUKvcqedGno/3widTxL6Lt3skW7do+/ofPKtezh17tadf4YeTp8rCP1Lup2HcR7GMSL00BfeNb5o6N/TzR7r9Vobnd/zeq2Jzr1e47rD35YM/dsujfMwB2bauE4/MNMdl7Ghs2r7+o5HcY7AOgILn4AvtcAz8DVVeAZ+eAKegp+SAgAAAAAAAAAAAAAAAAAAAH6xczctbQRxAIf/RmHDGgyiQWisCkV8gxaF0nZDTjkF+v0/T4dNrIFe6g5JnOR5srksDHP6wTCzDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlKhZdXRY3HjgPzS/Vkybd5fW/FyRxmfOr3RorS/0ZHqUEXqSxufODyRrDD1pckJPmuz5gQihQxc3g8GnwcJDdHAxPp4ct8aXUR6hsx+qp6iiNbx6jvfrP0Y/WvX1KIojdDZtthCbVbVP6+a8S+jt07q4j+IsQjvIDH2eGfpU6Dtutioi2WLoT1d5oT+eRHEWof0+yAt9Ms8LvZkKfbfNoi28/be2GXrcHmaFHmflrd2XoafSs0KfzPNCb6ZC32kfK/SHh7zQL8vbjluGnkrPC30yzwu9mQp9l62Evv2le7zc5oU+OovS/A29J3Q66BT6Vjbjhm+hx6BD6PVb6DGO0ryG3rN0Z41e406/jNBzz9FvI16qZHDX7Rz97DRGJ8n4a5RmGXrPZhzr1Gb92vjyzaYNh3fnMbwaJtFFXX+/j/qkruvTKM4itJ7jNdZq9q/YuFT5j6iiu9PrL9GPIvlghj3yXD1VkWHUfxS60Pnwbg7uIsfF529RJKHDHhA67AEXT8AecJUU7IHG5ZAAAAAAAAAAAAAAAMAfdu6etUEgDuDwNcnkUMgQshS6dmrXeOKSLdDv/3kqlxeELCVXk9T/84Aogtz0w+OUAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAmVqu8ti/ex74RWe5b8dueH43Vj0+8PdWfVsV2mrofOyG8YUOU8ttXWh5Vxd6boUOV4QOt9h2F28pHqETwxD4cBTvmxSO0Lm3/VGqUBd695HCuYT2Uhn6oTL0Xuhzth8rdx4Z+msKJ587/64L/dDVhd5noc/ZPpXCy1E8LPQi3tw9nzuvC/3Q1YXeZ6HP2pOFHm85Lp86rwv90NWF3mehz9so9CeYug+X0Rz7WgidKzN+o0cN3dSdaZ36LufHhL7tRj5TNLk9WliMY0Il69J3xap7paYpkTdNs07h5PZk4fMa09lfS/e3Djlr98MM0WyELnQC2HZfKSShQwBChwBsPAEB2EoKIljaHBIAAAAAAAAAAPhhzw5WGwSiMIzekCGbkF1Wgb5HhzIL3/+lClaCEixCCMl4zwER3H/8OgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADtX2gYlgJ617w1aAD0TOiQgdEhA6JCA0CEBoUMCQocEhA4JCB0SEDokIHRIQOiQgNBJ6nq4xlMu50t0Q+gkdbsd4ilfP+fohtB5o+FPbGTRhU4vhrkYr+CB0OnbEPfChb5O6PTtU0L36i505l4Z+vRkI4dxQqcXi9AHi75C6PRt6nu6+0ZfIXT6NmY99i30/widrg0z/qOvEjo4jBM6WHShQ0ZChwSEDgkIHRIQOiQgdEhA6JDAQ+i1tSp02Je2rLy2cjyWVqvQYUfaYsxPJUbl1KrQYTfaYszjbpx1of+yZ8c4DINAFAW3QJwpFO64/5kiMAUU6eP1jGS5oH76loEcajvGfDlnvdUAnqxc7dOuY8yPWZ/HJYBHK3WN+e9jnQMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPyNfgsgmb6LQeiQTo9Z+P2ERYeUhA4vsIXu0x2y2kOfhA75rL7HW+iQ1cx69O2vO+TVN+7RAQAAAAAAAAAAvuzZwQnAIBBE0a1u+i8pqBch15wm74FawWdFAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvpFjgDK5zSJ0qJPZhZ81JjpUEjr8wBW6qzu0ek10oUOfTJZ1Ch1aZW/JeHWHXrn4RwcAAAAAAHjYs2MbgIEQCIKURv9VWY8dfAGOjhkJUcFGBwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8I9+FRCmb3UIHeJ0TeFzQ+iQR+iwgNBhAaHDAl/f5wsdUk3W07fQIVZf7OgAAAAPe3ZQA0AIQ1Gw7r5/Rxu6lwrgVGYSqIIXCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANyRXwHLZKpD6LBOqgvv1UPosI/Q4QEjdFd32MqJDg9I5ThT6LBVekvKqzvslcE/+sduHZ0AAIIAFHQ5918pMggH6MvuQJzgoQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG/kEcAw2cUmdBgnowqvqSV0mEfo8IEWutcdprqh17joiz07tgEQhgEgmBoEUuQaZZDU3n8lCBUbIFl3hT3BNzaUlC2XtYUOVeU7MpurO9SVH/7oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL+L+YgGVBZzaUBp2xA6FNaP8zqPmEPoUFaPueyxCf1mz45NIIaBIAAqdCKBcOTAgZBDh86uhO+/n9fzTZhjJtgOloNbSKtGm322qGX3jIOsWjwrn2gFSOuMvrLHWYC0WkwXHbKrsc0+t6gFSKvv8bP3AuT139H1HAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4OXGcV3HKEBi4/4st6Z/2bODG4BhEAaArJFnoyjLeP99WnUMuHuwgQXC0NnK2vsbBfR1sqt2TgF9CToM4HSHATzjYIJnJeo16O3mdwvoS9BhhqSA7q51DgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAve3AgAAAAAADk/9oIqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqrCHhwIAAAAAAD5vzaCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqwBwcCAAAAAED+r42gqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqirtwQEJAAAAgKD/r9sRqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8BfEgGFMI1IvvAAAAABJRU5ErkJggg==) no-repeat;\\r\\n}"; // src/runtime/danmaku/danmaku_hash_id.ts function danmakuHashId() { addCss(danmaku_hash_id_default, "danmaku-hash-id"); class DanmakuHashId { static count = 0; static catch = {}; count = 0; hash; mid; node; dm; constructor(crc2) { DanmakuHashId.count = DanmakuHashId.count ? DanmakuHashId.count + 1 : 1; this.count = DanmakuHashId.count; DanmakuHashId.catch = DanmakuHashId.catch || {}; this.hash = crc2; this.mid = midcrc(this.hash); this.getInfo(); } async getInfo() { try { this.node = document.querySelector(".bilibili-player-context-menu-container.active"); if (!this.node) return setTimeout(() => { this.getInfo(); }, 100); this.node = this.node.children[0]; let j = 0; for (let i = this.node.children.length - 1; i >= 0; i--) { if (this.node.children[i].textContent.includes("mid")) { this.dm = this.node.children[i]; j++; if (this.count === j) break; } } if (!this.dm) return setTimeout(() => { this.getInfo(); }, 100); if (this.dm.tagName != "LI") return; DanmakuHashId.catch[this.mid] = DanmakuHashId.catch[this.mid] || jsonCheck(await xhr({ url: objUrl("https://api.bilibili.com/x/web-interface/card", { mid: this.mid }) }, true)); this.dm.innerHTML = '<div style="min-height:0px;z-index:-5;background-color: unset;" class="bb-comment"><div style="padding-top: 0;" class="comment-list"><div class="list-item"><div class="reply-box"><div style="padding:0px" class="reply-item reply-wrap"><div style="margin-left: 15px;vertical-align: middle;" data-usercard-mid="' + this.mid + '" class="reply-face"><img src="' + DanmakuHashId.catch[this.mid].data.card.face + '@52w_52h.webp" alt=""></div><div class="reply-con"><div class="user" style="padding-bottom: 0;top: 3px;"><a style="display:initial;padding: 0px;" data-usercard-mid="' + this.mid + '" href="//space.bilibili.com/' + this.mid + '" target="_blank" class="' + (DanmakuHashId.catch[this.mid].data.card.vip.vipType > 1 ? "name vip-red-name" : "name") + '">' + DanmakuHashId.catch[this.mid].data.card.name + "</a> " + DanmakuHashId.catch[this.mid].data.card.sex + '<a style="display:initial;padding: 0px;" href="//www.bilibili.com/blackboard/help.html#%E4%BC%9A%E5%91%98%E7%AD%89%E7%BA%A7%E7%9B%B8%E5%85%B3" target="_blank"><i class="level l' + (DanmakuHashId.catch[this.mid].data.card.is_senior_member ? 7 : DanmakuHashId.catch[this.mid].data.card.level_info.current_level) + '"></i></a></div></div></div></div></div></div></div>'; DanmakuHashId.count--; } catch (e) { DanmakuHashId.count--; toast.error("反差弹幕发送者信息失败 ಥ_ಥ"); debug.error(e); } } } window.danmakuHashId = (crc2) => { try { const check2 = new DanmakuHashId(crc2); return \`hash: \${check2.hash} mid: \${check2.mid}\`; } catch (e) { debug.error(e); } }; } // src/runtime/variable/fnval.ts var Fnval = class { MP4 = 1; DASH_H265 = 16; HDR = 64; DASH_4K = 128; DOLBYAUDIO = 256; DOLBYVIDEO = 512; DASH_8K = 1024; DASH_AV1 = 2048; }; var _ = new Fnval(); var fnval = Reflect.ownKeys(_).reduce((s, d) => { s += _[d]; return s; }, -1); // src/runtime/lib/url.ts var _a; var UrlPack = class { get ts() { return new Date().getTime(); } access_key = ((_a = setting.accessKey) == null ? void 0 : _a.key) || void 0; jsonUrlDefault = { "api.bilibili.com/pgc/player/web/playurl": { qn: 127, otype: "json", fourk: 1 }, "api.bilibili.com/x/player/playurl": { qn: 127, otype: "json", fourk: 1 }, "interface.bilibili.com/v2/playurl": { appkey: 9, otype: "json", quality: 127, type: "" }, "bangumi.bilibili.com/player/web_api/v2/playurl": { appkey: 9, module: "bangumi", otype: "json", quality: 127, type: "" }, "api.bilibili.com/pgc/player/api/playurlproj": { access_key: this.access_key, appkey: 1, build: "2040100", device: "android", expire: "0", mid: "0", mobi_app: "android_i", module: "bangumi", otype: "json", platform: "android_i", qn: 127, ts: this.ts }, "app.bilibili.com/v2/playurlproj": { access_key: this.access_key, appkey: 1, build: "2040100", device: "android", expire: "0", mid: "0", mobi_app: "android_i", otype: "json", platform: "android_i", qn: 127, ts: this.ts }, "api.bilibili.com/pgc/player/api/playurltv": { appkey: 6, qn: 127, fourk: 1, otype: "json", platform: "android", mobi_app: "android_tv_yst", build: 102801 }, "api.bilibili.com/x/tv/ugc/playurl": { appkey: 6, qn: 127, fourk: 1, otype: "json", platform: "android", mobi_app: "android_tv_yst", build: 102801 }, "app.bilibili.com/x/intl/playurl": { access_key: this.access_key, mobi_app: "android_i", fnver: 0, fnval, qn: 127, platform: "android", fourk: 1, build: 2100110, appkey: 0, otype: "json", ts: this.ts }, "apiintl.biliapi.net/intl/gateway/ogv/player/api/playurl": { access_key: this.access_key, mobi_app: "android_i", fnver: 0, fnval, qn: 127, platform: "android", fourk: 1, build: 2100110, appkey: 0, otype: "json", ts: this.ts }, "api.bilibili.com/view": { type: "json", appkey: "8e9fc618fbd41e28" }, "api.bilibili.com/x/v2/reply/detail": { build: "6042000", channel: "master", mobi_app: "android", platform: "android", prev: "0", ps: "20" }, "app.bilibili.com/x/v2/activity/index": { appkey: 1, build: 303e4, c_locale: "zh_CN", channel: "master", fnval, fnver: 0, force_host: 0, fourk: 1, https_url_req: 0, mobi_app: "android_i", offset: 0, platform: "android", player_net: 1, qn: 32, s_locale: "zh_CN", tab_id: 0, tab_module_id: 0, ts: this.ts }, "app.bilibili.com/x/v2/activity/inline": { appkey: 1, build: 303e4, c_locale: "zh_CN", channel: "master", fnval, fnver: 0, force_host: 0, fourk: 1, https_url_req: 0, mobi_app: "android_i", platform: "android", player_net: 1, qn: 32, s_locale: "zh_CN", ts: this.ts }, "bangumi.bilibili.com/api/season_v5": { appkey: 2, build: "2040100", platform: "android" } }; getJson(url, detail, gm) { const str = objUrl(\`https://\${url}\`, { ...this.jsonUrlDefault[url], ...detail }); return gm ? isUserScript ? GM.xhr({ url: this.jsonUrlDefault[url].appkey > 0 ? urlsign(str, void 0, this.jsonUrlDefault[url].appkey) : str, responseType: "json" }) : GM.xmlHttpRequest(this.jsonUrlDefault[url].appkey > 0 ? urlsign(str, void 0, this.jsonUrlDefault[url].appkey) : str, { credentials: "include" }).then((d) => JSON.parse(d)) : xhr({ url: this.jsonUrlDefault[url].appkey > 0 ? urlsign(str, void 0, this.jsonUrlDefault[url].appkey) : str, responseType: "json", credentials: true }); } }; var urlPack = new UrlPack(); // src/runtime/player/upos_replace.ts var UPOS = { "ks3(金山)": "upos-sz-mirrorks3.bilivideo.com", "ks3b(金山)": "upos-sz-mirrorks3b.bilivideo.com", "ks3c(金山)": "upos-sz-mirrorks3c.bilivideo.com", "ks32(金山)": "upos-sz-mirrorks32.bilivideo.com", "kodo(七牛)": "upos-sz-mirrorkodo.bilivideo.com", "kodob(七牛)": "upos-sz-mirrorkodob.bilivideo.com", "cos(腾讯)": "upos-sz-mirrorcos.bilivideo.com", "cosb(腾讯)": "upos-sz-mirrorcosb.bilivideo.com", "coso1(腾讯)": "upos-sz-mirrorcoso1.bilivideo.com", "coso2(腾讯)": "upos-sz-mirrorcoso2.bilivideo.com", "bos(腾讯)": "upos-sz-mirrorbos.bilivideo.com", "hw(华为)": "upos-sz-mirrorhw.bilivideo.com", "hwb(华为)": "upos-sz-mirrorhwb.bilivideo.com", "uphw(华为)": "upos-sz-upcdnhw.bilivideo.com", "js(华为)": "upos-tf-all-js.bilivideo.com", "hk(香港)": "cn-hk-eq-bcache-01.bilivideo.com", "akamai(海外)": "upos-hz-mirrorakam.akamaized.net" }; var dis = false; var timer = 0; function uposReplace(str, uposName) { if (uposName === "不替换") return str; !dis && toast.custom(10, "warning", "已替换UPOS服务器,卡加载时请到设置中更换服务器或者禁用!", \`CDN:\${uposName}\`, \`UPOS:\${UPOS[uposName]}\`); dis = true; clearTimeout(timer); timer = setTimeout(() => dis = false, 1e3); return str.replace(/:\\\\?\\/\\\\?\\/[^\\/]+\\\\?\\//g, () => \`://\${UPOS[uposName]}/\`); } // src/runtime/node_observer.ts var nodelist = []; function observerAddedNodes(callback) { try { if (typeof callback === "function") nodelist.push(callback); return nodelist.length - 1; } catch (e) { debug.error(e); } } var observe = new MutationObserver((d) => d.forEach((d2) => { d2.addedNodes[0] && nodelist.forEach(async (f) => { try { f(d2.addedNodes[0]); } catch (e) { debug.error(d2).error(e); } }); })); observe.observe(document, { childList: true, subtree: true }); // src/runtime/switch_video.ts var switchlist = []; function switchVideo(callback) { try { if (typeof callback === "function") switchlist.push(callback); } catch (e) { debug.error("switchVideo.js", e); } } observerAddedNodes((node4) => { if (/bilibili-player-area video-state-pause/.test(node4.className)) { switchlist.forEach(async (d) => { try { d(); } catch (e) { debug.error(d); debug.error(e); } }); } }); // src/runtime/download/download_ui.html var download_ui_default = '<div class="table"></div>\\r\\n<style type="text/css">\\r\\n .table {\\r\\n position: fixed;\\r\\n z-index: 11113;\\r\\n bottom: 0;\\r\\n width: 100%;\\r\\n min-height: 50px;\\r\\n display: flex;\\r\\n box-sizing: border-box;\\r\\n background: #fff;\\r\\n border-radius: 8px;\\r\\n box-shadow: 0 6px 12px 0 rgba(106, 115, 133, 22%);\\r\\n transition: transform 0.3s ease-in;\\r\\n flex-wrap: wrap;\\r\\n align-content: center;\\r\\n justify-content: center;\\r\\n align-items: center;\\r\\n }\\r\\n\\r\\n .cell {\\r\\n background-color: #fff;\\r\\n color: #000 !important;\\r\\n border: #ccc 1px solid;\\r\\n border-radius: 3px;\\r\\n display: flex;\\r\\n margin: 3px;\\r\\n flex-wrap: wrap;\\r\\n align-content: center;\\r\\n justify-content: center;\\r\\n align-items: center;\\r\\n flex-direction: row;\\r\\n }\\r\\n\\r\\n .type {\\r\\n color: #000 !important;\\r\\n display: table-cell;\\r\\n min-width: 1.5em;\\r\\n text-align: center;\\r\\n vertical-align: middle;\\r\\n padding: 10px 3px;\\r\\n }\\r\\n\\r\\n .type.mp4 {\\r\\n background-color: #e0e;\\r\\n }\\r\\n\\r\\n .type.av1 {\\r\\n background-color: #feb;\\r\\n }\\r\\n\\r\\n .type.avc {\\r\\n background-color: #07e;\\r\\n }\\r\\n\\r\\n .type.hev {\\r\\n background-color: #7ba;\\r\\n }\\r\\n\\r\\n .type.aac {\\r\\n background-color: #0d0;\\r\\n }\\r\\n\\r\\n .type.flv {\\r\\n background-color: #0dd;\\r\\n }\\r\\n\\r\\n .item {\\r\\n display: table-cell;\\r\\n text-decoration: none;\\r\\n padding: 3px;\\r\\n cursor: pointer;\\r\\n color: #1184B4;\\r\\n }\\r\\n\\r\\n .item:hover {\\r\\n color: #FE3676;\\r\\n }\\r\\n\\r\\n .up {\\r\\n color: #fff !important;\\r\\n text-align: center;\\r\\n padding: 1px 3px;\\r\\n background-color: #777;\\r\\n }\\r\\n\\r\\n .up.yellow {\\r\\n background-color: #ffe42b;\\r\\n background-image: linear-gradient(to right, #ffe42b, #dfb200);\\r\\n }\\r\\n\\r\\n .up.pink {\\r\\n background-color: #ffafc9;\\r\\n background-image: linear-gradient(to right, #ffafc9, #dfada7);\\r\\n }\\r\\n\\r\\n .up.purple {\\r\\n background-color: #c0f;\\r\\n background-image: linear-gradient(to right, #c0f, #90f);\\r\\n }\\r\\n\\r\\n .up.red {\\r\\n background-color: #f00;\\r\\n background-image: linear-gradient(to right, #f00, #c00);\\r\\n }\\r\\n\\r\\n .up.orange {\\r\\n background-color: #f90;\\r\\n background-image: linear-gradient(to right, #f90, #d70);\\r\\n }\\r\\n\\r\\n .up.blue {\\r\\n background-color: #00d;\\r\\n background-image: linear-gradient(to right, #00d, #00b);\\r\\n }\\r\\n\\r\\n .up.green {\\r\\n background-color: #0d0;\\r\\n background-image: linear-gradient(to right, #0d0, #0b0);\\r\\n }\\r\\n\\r\\n .up.lv9 {\\r\\n background-color: #151515;\\r\\n background-image: linear-gradient(to right, #151515, #030303);\\r\\n }\\r\\n\\r\\n .up.lv8 {\\r\\n background-color: #841cf9;\\r\\n background-image: linear-gradient(to right, #841cf9, #620ad7);\\r\\n }\\r\\n\\r\\n .up.lv7 {\\r\\n background-color: #e52fec;\\r\\n background-image: linear-gradient(to right, #e52fec, #c30dca);\\r\\n }\\r\\n\\r\\n .up.lv6 {\\r\\n background-color: #ff0000;\\r\\n background-image: linear-gradient(to right, #ff0000, #dd0000);\\r\\n }\\r\\n\\r\\n .up.lv5 {\\r\\n background-color: #ff6c00;\\r\\n background-image: linear-gradient(to right, #ff6c00, #dd4a00);\\r\\n }\\r\\n\\r\\n .up.lv4 {\\r\\n background-color: #ffb37c;\\r\\n background-image: linear-gradient(to right, #ffb37c, #dd915a);\\r\\n }\\r\\n\\r\\n .up.lv3 {\\r\\n background-color: #92d1e5;\\r\\n background-image: linear-gradient(to right, #92d1e5, #70b0c3);\\r\\n }\\r\\n\\r\\n .up.lv2 {\\r\\n background-color: #95ddb2;\\r\\n background-image: linear-gradient(to right, #95ddb2, #73bb90);\\r\\n }\\r\\n\\r\\n .up.lv1 {\\r\\n background-color: #bfbfbf;\\r\\n background-image: linear-gradient(to right, #bfbfbf, #9d9d9d);\\r\\n }\\r\\n\\r\\n .down {\\r\\n font-size: 90%;\\r\\n margin-top: 2px;\\r\\n text-align: center;\\r\\n padding: 1px 3px;\\r\\n }\\r\\n</style>'; // src/runtime/download/download_ui.ts var BiliOldDownload = class extends HTMLElement { _data; obj; _table; observer = new ClickRemove(this); constructor(obj) { super(); const { data } = obj; const root3 = this.attachShadow({ mode: "closed" }); root3.appendChild(createElements(htmlVnode(download_ui_default))); this._table = root3.children[0]; this.obj = obj; Reflect.defineProperty(obj, "data", { configurable: true, get: () => new Proxy(this._data, new ProxyHandler(() => this.\$data())), set: (v) => { if (v === this._data) return; this._data = v; this.\$data(); } }); this._data = obj.data = data; } \$data() { const vdoms = Object.entries(this._data).reduce((s, d) => { const vdom = { tagName: "div", props: { class: "cell" }, children: [ { tagName: "div", props: { class: \`type \${d[0]}\` }, children: [ { tagName: "text", text: d[0] } ] } ] }; d[1].forEach((d2) => { var _a3; const a = { class: "item", target: "_blank" }; d2.href && (a.href = d2.href); d2.fileName && (a.download = d2.fileName); (_a3 = vdom.children) == null ? void 0 : _a3.push({ tagName: "a", props: a, children: [ { tagName: "div", props: { class: \`up\${d2.color ? \` \${d2.color}\` : ""}\` }, children: [ { tagName: "text", text: d2.up } ] }, { tagName: "div", props: { class: \`down\` }, children: [ { tagName: "text", text: d2.down } ] } ], event: { click: () => { d2.onclick && d2.onclick(); } } }); }); s.push(vdom); return s; }, []); vdoms.length || vdoms.push({ tagName: "div", children: [ { tagName: "text", text: "正在获取下载数据~" } ] }); this._table.replaceChildren(createElements(vdoms)); } show() { if (!document.body.contains(this)) { document.body.appendChild(this); this.observer.observe(); } } }; customElements.get(\`biliold-download\${mutex}\`) || customElements.define(\`biliold-download\${mutex}\`, BiliOldDownload); var downloadUI = new BiliOldDownload({ data: {} }); // src/runtime/format/sub_array.ts function subArray(res, num = 1) { const arr2 = [...res]; const out = []; num = num || 1; num = num < arr2.length ? num : arr2.length; while (out.length < num) { var temp2 = Math.random() * arr2.length >> 0; out.push(arr2.splice(temp2, 1)[0]); } return num === 1 ? out[0] : out; } // src/runtime/download/aria2.ts var Aria2 = class { setting = {}; constructor() { if (!setting) return; setting.userAgent && (this.setting.userAgent = setting.userAgent); setting.referer && (this.setting.referer = setting.referer); setting.filepath && (this.setting.directory = setting.filepath); setting.aria2.token && (this.setting.token = setting.aria2.token); } shell(obj) { return new Promise((r, j) => { let result = "aria2c"; obj = { ...this.setting, ...obj }; obj.urls.forEach((d) => result += \` "\${d}"\`); obj.out && (result += \` --out="\${obj.out}"\`); obj.userAgent && (result += \` --user-agent="\${obj.userAgent}"\`); obj.referer && (result += \` --referer="\${obj.referer}"\`); obj.directory && (result += \` --dir="\${obj.directory}"\`); obj.split && (result += \` --split="\${obj.split}"\`); obj.header && Object.entries(obj.header).forEach((d) => result += \` --header="\${d[0]}: \${d[1]}"\`); navigator.clipboard.writeText(result).then(r, (e) => j(e)); }); } rpc(obj) { obj = { ...this.setting, ...obj }; const options = {}; obj.out && (options.out = obj.out); obj.userAgent && (options["user-agent"] = obj.userAgent); obj.referer && (options["referer"] = obj.referer); obj.directory && (options["dir"] = obj.directory); obj.split && (options["split"] = obj.split); obj.header && (options["header"] = obj.header); return this.postMessage("aria2.addUri", obj.id || new Date().getTime(), [obj.urls, options]); } postMessage(method, id, params = []) { const url = \`\${setting.aria2.server}:\${setting.aria2.port}/jsonrpc\`; setting.aria2.token && params.unshift(\`token:\${setting.aria2.token}\`); return new Promise((r, j) => { xhr({ url, method: "POST", responseType: "json", data: JSON.stringify({ method, id, params }) }).then((d) => { d.error && j(d.error); d.result && r(d.result); }).catch((e) => { xhr({ url: objUrl(url, { method, id, params: Base64.encode(JSON.stringify(params)) }), method: "GET", responseType: "json" }).then((d) => { d.error && j(d.error); d.result && r(d.result); }).catch(() => j(e)); }); }); } getVersion() { return this.postMessage("aria2.getVersion", new Date().getTime()); } }; var aria2 = new Aria2(); // src/runtime/download/ef2.ts var Ef2 = class { setting = {}; constructor() { if (!setting) return; setting.IDM.wait && (this.setting.sendToList = setting.IDM.wait); setting.IDM.silence && (this.setting.toastDisabled = setting.IDM.silence); setting.userAgent && (this.setting.userAgent = setting.userAgent); setting.referer && (this.setting.referer = setting.referer); setting.filepath && (this.setting.directory = setting.filepath); } sendLinkToIDM(data) { data = { ...this.setting, ...data }; const a = document.createElement("a"); a.href = this.encode(data); a.click(); } encode(data) { let result = ""; Object.keys(data).forEach((d) => { switch (d) { case "cookies": result += \` -c "\${data.cookies}"\`; break; case "directory": data.directory = data.directory.replace(/\\//, "\\\\"); data.directory && data.directory[data.directory.length - 1] == "\\\\" && (data.directory = data.directory.substr(0, data.directory.length - 1)); result += \` -o "\${data.directory}"\`; break; case "out": result += \` -s "\${data.out}"\`; break; case "password": result += \` -P "\${data.password}"\`; break; case "postDate": result += \` -d "\${data.postDate}"\`; break; case "referer": result += \` -r "\${data.referer}"\`; break; case "sendToList": result += \` -q\`; break; case "toastDisabled": result += \` -f\`; break; case "url": data.url.startsWith("//") && (data.url = "https:" + data.url); result += \` -u "\${data.url}"\`; break; case "userAgent": result += \` -a "\${data.userAgent}"\`; break; case "userName": result += \` -U "\${data.userName}"\`; break; } }); result && result.startsWith(" ") && (result = result.substr(1, result.length)); return "ef2://" + Base64.encode(result); } decode(ef2ptl) { ef2ptl = ef2ptl.replace("ef2://", ""); ef2ptl = Base64.decode(ef2ptl) + " "; const key = ef2ptl.match(/-\\w /g); const value = ef2ptl.split(/-\\w /); value.shift(); return Array.from(key).reduce((s, d, i) => { value[i] && value[i].endsWith(" ") && (value[i] = value[i].substr(0, value[i].length - 1)); value[i] && value[i].endsWith('"') && (value[i] = value[i].substr(1, value[i].length - 2)); switch (d) { case "-c ": s.cookies = value[i]; break; case "-o ": s.directory = value[i]; break; case "-s ": s.out = value[i]; break; case "-P ": s.password = value[i]; break; case "-d ": s.postDate = value[i]; break; case "-r ": s.referer = value[i]; break; case "-q ": s.sendToList = true; break; case "-f ": s.toastDisabled = true; break; case "-u ": s.url = value[i]; break; case "-a ": s.userAgent = value[i]; break; case "-U ": s.userName = value[i]; break; } return s; }, {}); } }; var ef2 = new Ef2(); // src/runtime/download/playinfo_filter.ts var PlayinfoFiter = class { quality = { 100032: "8K", 100029: "4K", 100028: "1080P60", 100027: "1080P+", 100026: "1080P", 100024: "720P", 100023: "480P", 100022: "360P", 30280: "320Kbps", 30260: "320Kbps", 30259: "128Kbps", 30257: "64Kbps", 30255: "AUDIO", 30251: "FLAC", 30250: "ATMOS", 30232: "128Kbps", 30216: "64Kbps", 30127: "8K", 30126: "Dolby", 30125: "HDR", 30121: "4K", 30120: "4K", 30116: "1080P60", 30112: "1080P+", 30106: "1080P60", 30102: "1080P+", 30080: "1080P", 30077: "1080P", 30076: "720P", 30074: "720P", 30066: "720P", 30064: "720P", 30048: "720P", 30033: "480P", 30032: "480P", 30016: "360P", 30015: "360P", 30011: "360P", 464: "预览", 336: "1080P", 320: "720P", 288: "480P", 272: "360P", 208: "1080P", 192: "720P", 160: "480P", 127: "8K", 126: "Dolby", 125: "HDR", 120: "4K", 116: "1080P60", 112: "1080P+", 80: "1080P", 74: "720P60", 64: "720P", 48: "720P", 32: "480P", 16: "360P", 15: "360P", 6: "240P", 5: "144P" }; codec = { hev: [30127, 30126, 30125, 30121, 30106, 30102, 30077, 30066, 30033, 30011], avc: [30120, 30112, 30080, 30064, 30032, 30016], av1: [100029, 100028, 100027, 100026, 100024, 100023, 100022] }; color = { "8K": "yellow", "Dolby": "pink", "FLAC": "pink", "ATMOS": "pink", "AUDIO": "pink", "HDR": "purple", "4K": "purple", "1080P60": "red", "1080P+": "red", "1080P": "red", "720P60": "orange", "720P": "orange", "480P": "blue", "360P": "green", "320Kbps": "red", "128Kbps": "blue", "64Kbps": "green" }; record = []; fileName; constructor(fileName) { this.fileName = fileName; } filter(playinfo) { if (playinfo) { playinfo.data && this.filter(playinfo.data); playinfo.result && this.filter(playinfo.result); playinfo.durl && this.durl(playinfo.durl); playinfo.dash && this.dash(playinfo.dash); } return this.record; } durl(durl) { let index = 0; durl.forEach((d) => { const url = d.backupUrl || d.backup_url || []; url.unshift(d.url); const qua = this.getQuality(url[0], d.id); const link = { type: "", url, quality: qua, size: sizeFormat(d.size), color: this.color[qua] || "" }; switch (d.url.includes("mp4?")) { case true: link.type = "mp4"; break; case false: link.type = "flv"; index++; link.flv = index; break; } this.fileName && (link.fileName = \`\${this.fileName}\${qua}.\${link.type}\`); this.record.push(link); }); } dash(dash) { dash.video && this.dashVideo(dash.video, dash.duration); dash.audio && this.dashAudio(dash.audio, dash.duration); dash.dolby && dash.dolby.audio && Array.isArray(dash.dolby.audio) && this.dashAudio(dash.dolby.audio, dash.duration); dash.flac && dash.flac.audio && this.dashAudio([dash.flac.audio], dash.duration, ".flac"); } dashVideo(video, duration) { video.forEach((d) => { const url = d.backupUrl || d.backup_url || []; (d.baseUrl || d.base_url) && url.unshift(d.baseUrl || d.base_url); if (!url.length) return; let type = ""; if (d.codecs) { type = d.codecs.includes("avc") ? "avc" : d.codecs.includes("av01") ? "av1" : "hev"; } else { const id = this.getID(url[0]); type = this.codec.hev.find((d2) => d2 === id) ? "hev" : "avc"; } const qua = this.getQuality(url[0], d.id); this.record.push({ type, url, quality: qua, size: sizeFormat(d.bandwidth * duration / 8), color: this.color[qua] || "", fileName: \`\${this.fileName}\${qua}.m4v\` }); }); } dashAudio(audio, duration, fmt = ".m4a") { audio.forEach((d) => { const url = d.backupUrl || d.backup_url || []; (d.baseUrl || d.base_url) && url.unshift(d.baseUrl || d.base_url); const qua = this.getQuality(url[0], d.id); url.length && this.record.push({ type: "aac", url, quality: qua, size: sizeFormat(d.bandwidth * duration / 8), color: this.color[qua] || "", fileName: \`\${this.fileName}\${qua}.\${fmt}\` }); }); } getQuality(url, id) { return this.quality[this.getID(url)] || id && this.quality[id] || "N/A"; } getID(url) { let id = 0; url.replace(/\\d+\\.((flv)|(mp4)|(m4s))/, (d) => id = Number(d.split(".")[0])); return id; } }; function playinfoFiter(playinfo, prev = {}, fileName = API.title) { return new PlayinfoFiter(fileName).filter(playinfo).reduce((s, d) => { s[d.type] || (s[d.type] = []); const obj = { up: Reflect.has(d, "flv") ? \`\${d.quality}*\${d.flv}\` : d.quality, down: d.size, href: subArray(d.url), color: d.color }; if (setting.downloadMethod !== "默认") { delete obj.href; obj.onclick = () => { postData(d); }; } s[d.type].push(obj); return s; }, prev); } function postData(data) { switch (setting.downloadMethod) { case "IDM+ef2": ef2.sendLinkToIDM({ url: data.url[0], out: data.fileName }); break; case "aria2": aria2.shell({ urls: data.url, out: data.fileName }).then(() => toast.success(\`已复制aria2命令行到剪切板,在cmd等shell中使用即可下载~\`)).catch((e) => { toast.error(\`复制aria2命令行失败!\`); debug.error(\`复制aria2命令行失败!\`, e); }); break; case "aria2+rpc": aria2.rpc({ urls: data.url, out: data.fileName }).then((GID) => toast.success(\`已添加下载任务到aria2 RPC主机,任务GID:\${GID}\`)).catch((e) => { toast.error(\`添加下载任务到aria2 RPC主机出错!\`); debug.error(\`添加下载任务到aria2 RPC主机出错!\`, e); }); break; } } // src/runtime/download/download.ts var Record2 = {}; var downloading = false; var isCover = false; switchVideo(() => { isCover = false; Object.keys(Record2).forEach((d) => delete Record2[d]); }); function pushDownload(obj) { Reflect.has(Record2, obj.group) || (Record2[obj.group] = []); const data = { up: obj.up, down: obj.down }; obj.color && (data.color = obj.color); obj.fileName && (data.fileName = obj.fileName); if (obj.url) { data.href = obj.url; } else { data.onclick = () => { if (obj.callback) { return obj.callback(); } isObject(obj.data) ? saveAs(JSON.stringify(obj.data), obj.fileName || "") : saveAs(obj.data, obj.fileName || ""); }; } Record2[obj.group].push(data); } function contactDownloadDate(target, source) { Object.entries(source).forEach((d) => { Reflect.has(target, d[0]) || (target[d[0]] = []); target[d[0]] = target[d[0]].concat(d[1]); }); } function getCover() { if (!setting.downloadOther || isCover) return; isCover = true; const cover = API.cover, bkg_cover = API.bkg_cover, title = API.title; cover && pushDownload({ group: "封面", url: cover, up: "封面", down: "N/A", fileName: \`\${title || \`av\${API.aid}\`}.\${cover.split(".").reduce((s, d) => s = d, void 0) || "jpg"}\` }); bkg_cover && pushDownload({ group: "封面", url: bkg_cover, up: "封面", down: "N/A", fileName: \`\${title || \`av\${API.aid}\`}.\${bkg_cover.split(".").reduce((s, d) => s = d, void 0) || "jpg"}\` }); } async function downloadDefault() { if (downloading) return; downloading = true; if (!API.cid) return toast.warning("请在视频页使用本功能~"); if (API.th) toast.warning("泰区视频!", "请将【referer】置空,【UserAgent】设为默认值,并选用【默认】以外的方式进行下载~"); const data = playinfoFiter(API.__playinfo__); const request = []; const type = setting.downlaodType.join(" ").toLowerCase(); downloadUI.obj.data = data; downloadUI.show(); /mp4/g.test(type) && request.push(getContent("mp4")); data.flv || /flv/g.test(type) && request.push(getContent("flv")); data.aac || /dash/g.test(type) && request.push(getContent("dash")); (await Promise.all(request)).forEach((d) => { playinfoFiter(d, downloadUI.obj.data); }); getCover(); contactDownloadDate(downloadUI.obj.data, Record2); downloadUI.show(); downloading = false; } async function getContent(d) { d = d.toLowerCase(); let result; const pgc = API.pgc; try { switch (d) { case "dash": result = pgc ? await urlPack.getJson(setting.TVresource ? "api.bilibili.com/pgc/player/api/playurltv" : "api.bilibili.com/pgc/player/web/playurl", { avid: API.aid, cid: API.cid, fnver: 0, fnval }) : await urlPack.getJson(setting.TVresource ? "api.bilibili.com/x/tv/ugc/playurl" : "api.bilibili.com/x/player/playurl", { avid: API.aid, cid: API.cid, fnver: 0, fnval }); break; case "flv": result = pgc ? await urlPack.getJson(setting.TVresource ? "api.bilibili.com/pgc/player/api/playurltv" : "api.bilibili.com/pgc/player/web/playurl", { avid: API.aid, cid: API.cid, qn: setting.downloadQn }) : await urlPack.getJson(setting.TVresource ? "api.bilibili.com/x/tv/ugc/playurl" : "api.bilibili.com/x/player/playurl", { avid: API.aid, cid: API.cid, qn: setting.downloadQn }); break; case "mp4": result = pgc ? await urlPack.getJson("api.bilibili.com/pgc/player/api/playurlproj", { cid: API.cid }) : await urlPack.getJson("app.bilibili.com/v2/playurlproj", { cid: API.cid }); break; } } catch (e) { } return JSON.parse(uposReplace(JSON.stringify(result), setting.uposReplace.dl)); } window.addEventListener("message", (ev) => { if (isUserScript) return; if (typeof ev.data === "object") { if (ev.data.\$type == "downloadDefault") { downloadDefault(); } } }); // src/runtime/danmaku/danmaku.ts var import_light = __toESM(require_light()); // src/runtime/variable/uid.ts var uid = Number(getCookies().DedeUserID); // src/runtime/danmaku/bilibili_danmaku.json var bilibili_danmaku_default = { nested: { bilibili: { nested: { DmWebViewReply: { fields: { state: { type: "int32", id: 1 }, text: { type: "string", id: 2 }, textSide: { type: "string", id: 3 }, dmSge: { type: "DmSegConfig", id: 4 }, flag: { type: "DanmakuFlagConfig", id: 5 }, specialDms: { rule: "repeated", type: "string", id: 6 }, checkBox: { type: "bool", id: 7 }, count: { type: "int64", id: 8 }, commandDms: { rule: "repeated", type: "CommandDm", id: 9 }, dmSetting: { type: "DanmuWebPlayerConfig", id: 10 } } }, CommandDm: { fields: { id: { type: "int64", id: 1 }, oid: { type: "int64", id: 2 }, mid: { type: "int64", id: 3 }, command: { type: "string", id: 4 }, content: { type: "string", id: 5 }, progress: { type: "int32", id: 6 }, ctime: { type: "string", id: 7 }, mtime: { type: "string", id: 8 }, extra: { type: "string", id: 9 }, idStr: { type: "string", id: 10 } } }, DmSegConfig: { fields: { pageSize: { type: "int64", id: 1 }, total: { type: "int64", id: 2 } } }, DanmakuFlagConfig: { fields: { recFlag: { type: "int32", id: 1 }, recText: { type: "string", id: 2 }, recSwitch: { type: "int32", id: 3 } } }, DmSegMobileReply: { fields: { elems: { rule: "repeated", type: "DanmakuElem", id: 1 } } }, DanmakuElem: { fields: { id: { type: "int64", id: 1 }, progress: { type: "int32", id: 2 }, mode: { type: "int32", id: 3 }, fontsize: { type: "int32", id: 4 }, color: { type: "uint32", id: 5 }, midHash: { type: "string", id: 6 }, content: { type: "string", id: 7 }, ctime: { type: "int64", id: 8 }, weight: { type: "int32", id: 9 }, action: { type: "string", id: 10 }, pool: { type: "int32", id: 11 }, idStr: { type: "string", id: 12 }, attr: { type: "int32", id: 13 } } }, DanmuWebPlayerConfig: { fields: { dmSwitch: { type: "bool", id: 1 }, aiSwitch: { type: "bool", id: 2 }, aiLevel: { type: "int32", id: 3 }, blocktop: { type: "bool", id: 4 }, blockscroll: { type: "bool", id: 5 }, blockbottom: { type: "bool", id: 6 }, blockcolor: { type: "bool", id: 7 }, blockspecial: { type: "bool", id: 8 }, preventshade: { type: "bool", id: 9 }, dmask: { type: "bool", id: 10 }, opacity: { type: "float", id: 11 }, dmarea: { type: "int32", id: 12 }, speedplus: { type: "float", id: 13 }, fontsize: { type: "float", id: 14 }, screensync: { type: "bool", id: 15 }, speedsync: { type: "bool", id: 16 }, fontfamily: { type: "string", id: 17 }, bold: { type: "bool", id: 18 }, fontborder: { type: "int32", id: 19 }, drawType: { type: "string", id: 20 } } } } } } }; // src/runtime/danmaku/command_dm.css var command_dm_default = '.commandDm-popup {\\r\\n border-radius: 1rem;\\r\\n background-color: #f5f5f5;\\r\\n position: absolute;\\r\\n cursor: default;\\r\\n opacity: 0;\\r\\n transition: opacity 0.2s;\\r\\n padding: 0.8rem 1rem;\\r\\n}\\r\\n\\r\\n.commandDm-popup.on {\\r\\n opacity: 1;\\r\\n}\\r\\n\\r\\n.vote-dialog {\\r\\n overflow: hidden;\\r\\n display: flex;\\r\\n flex-direction: column;\\r\\n}\\r\\n\\r\\n.vote-panel {\\r\\n display: flex;\\r\\n justify-content: space-between;\\r\\n width: 100%;\\r\\n}\\r\\n\\r\\n.vote-title,\\r\\n.grade-title {\\r\\n font-weight: bolder;\\r\\n margin-bottom: 0.5rem;\\r\\n}\\r\\n\\r\\n.vote-option {\\r\\n display: flex;\\r\\n flex-direction: column;\\r\\n width: 100%;\\r\\n}\\r\\n\\r\\n.vote-button {\\r\\n text-align: center;\\r\\n min-width: 85px;\\r\\n display: inline-block;\\r\\n padding: 0.3rem 2rem;\\r\\n border: 1px solid #00a1d6;\\r\\n border-radius: 5px;\\r\\n margin: 0.2rem 0;\\r\\n background-color: #fff;\\r\\n cursor: pointer;\\r\\n}\\r\\n\\r\\n.vote-button:hover {\\r\\n background-color: #1baada;\\r\\n color: #f5f5f5;\\r\\n transition: all 0.15s ease-out;\\r\\n}\\r\\n\\r\\n.vote-button::before {\\r\\n position: absolute;\\r\\n padding: 0 1.8rem;\\r\\n left: 0;\\r\\n content: attr(idx);\\r\\n}\\r\\n\\r\\n.vote-progress-bg {\\r\\n border-radius: 5px;\\r\\n min-width: 85px;\\r\\n margin: 0.2rem 0;\\r\\n border: 1px solid #1a1a1a6b;\\r\\n background-color: white;\\r\\n position: relative;\\r\\n}\\r\\n\\r\\n.vote-progress {\\r\\n transition: width 0.3s, background-color 0.2s;\\r\\n animation: opacity-animation 0.5s;\\r\\n overflow: hidden;\\r\\n display: inline-block;\\r\\n border-radius: 4px 0 0 4px;\\r\\n background-color: #d3d3d3;\\r\\n text-align: left;\\r\\n overflow: visible;\\r\\n position: relative;\\r\\n}\\r\\n\\r\\n.vote-progress-blue {\\r\\n background-color: #9fdef3;\\r\\n}\\r\\n\\r\\n.vote-progress-desc {\\r\\n display: inline-block;\\r\\n margin: 0.3rem 0.8rem;\\r\\n}\\r\\n\\r\\n@keyframes opacity-animation {\\r\\n from {\\r\\n opacity: 0;\\r\\n }\\r\\n\\r\\n to {\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\\r\\n.vote-count {\\r\\n display: inline-block;\\r\\n position: absolute;\\r\\n right: 0.8rem;\\r\\n top: 0.3rem;\\r\\n}\\r\\n\\r\\n.vote-count::after {\\r\\n content: "票";\\r\\n}\\r\\n\\r\\n.bilibili-player-video-popup {\\r\\n z-index: 100;\\r\\n position: absolute;\\r\\n top: 0;\\r\\n left: 0;\\r\\n width: 100%;\\r\\n height: 100%;\\r\\n pointer-events: none;\\r\\n}\\r\\n\\r\\n.bilibili-player-video-popup>* {\\r\\n pointer-events: all;\\r\\n}\\r\\n\\r\\n.link-button {\\r\\n animation: opacity-animation 0.2s;\\r\\n position: absolute;\\r\\n left: 40%;\\r\\n top: 20%;\\r\\n background-color: #f5f5f5;\\r\\n padding: 0.4rem 1rem;\\r\\n border-radius: 0.6rem;\\r\\n font-size: large;\\r\\n box-shadow: #888888c7 0px 0px 6px;\\r\\n}\\r\\n\\r\\n.link-button:hover {\\r\\n color: #00a1d6;\\r\\n cursor: pointer;\\r\\n}\\r\\n\\r\\n.link-button>* {\\r\\n vertical-align: middle;\\r\\n}\\r\\n\\r\\n.link-button>img {\\r\\n transform: scale(0.7) translateY(-1px);\\r\\n}\\r\\n\\r\\n.danmaku-up-icon::before {\\r\\n content: "UP主";\\r\\n background-color: #00a1d6;\\r\\n border-radius: 5px;\\r\\n font-size: 0.8em;\\r\\n padding: 0.1em;\\r\\n transform: translateY(-0.1em);\\r\\n display: inline-block;\\r\\n box-shadow: #888888c7 0px 0px 6px;\\r\\n}\\r\\n\\r\\n.grade-score-area>div {\\r\\n display: inline-block;\\r\\n position: relative;\\r\\n width: 41px;\\r\\n transition: width 0.3s;\\r\\n}\\r\\n\\r\\n.grade-score-area.pointer {\\r\\n cursor: pointer;\\r\\n}\\r\\n\\r\\n.grade-score-area>div:last-child {\\r\\n width: 20px;\\r\\n}\\r\\n\\r\\n.grade-score-area .score-button {\\r\\n filter: grayscale(1);\\r\\n}\\r\\n\\r\\n.grade-score-area .highlight .score-button {\\r\\n filter: none;\\r\\n}\\r\\n\\r\\n.grade-score-area .bg {\\r\\n position: absolute;\\r\\n left: 0;\\r\\n filter: blur(9px);\\r\\n visibility: hidden;\\r\\n}\\r\\n\\r\\n.grade-score-area .highlight .bg {\\r\\n visibility: visible;\\r\\n}\\r\\n\\r\\n.grade-score-info {\\r\\n position: absolute;\\r\\n right: 1rem;\\r\\n bottom: 0.6rem;\\r\\n opacity: 0;\\r\\n}\\r\\n\\r\\n@keyframes grade-score-showup {\\r\\n 0% {\\r\\n opacity: 0;\\r\\n transform: translateY(5px);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 1;\\r\\n transform: translateY(0);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes grade-score-hit {\\r\\n 0% {\\r\\n filter: brightness(1);\\r\\n }\\r\\n\\r\\n 30% {\\r\\n filter: brightness(1.5);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n filter: brightness(1);\\r\\n }\\r\\n}'; // src/runtime/danmaku/command_dm.ts var player; var widgetContainer; var playing = false; var visible = true; var commandDm = { visible: [], hidden: [] }; function init(cdm) { if (window.player) { if (widgetContainer === void 0) widgetContainer = initContainer(); player = window.player; bindEvents(); load(cdm); } else throw "获取window.player失败"; } function load(commandDmRaw) { commandDm.hidden = parseDm(commandDmRaw); resize(); } function initContainer() { let videoWrap = document.getElementsByClassName("bilibili-player-video-wrap")[0]; if (!videoWrap) throw "未能获取播放器div"; let widgetContainer2 = document.createElement("div"); widgetContainer2.className = "bilibili-player-video-popup"; videoWrap.appendChild(widgetContainer2); return widgetContainer2; } function bindEvents() { const EVENT = { VIDEO_MEDIA_PLAYING: "video_media_playing", VIDEO_MEDIA_PAUSE: "video_media_pause", VIDEO_MEDIA_SEEK: "video_media_seek", VIDEO_MEDIA_SEEKED: "video_media_seeked", VIDEO_MEDIA_ENDED: "video_media_ended", VIDEO_RESIZE: "video_resize", VIDEO_PLAYER_RESIZE: "video_player_resize", VIDEO_DESTROY: "video_destroy" }; player.addEventListener(EVENT.VIDEO_MEDIA_PLAYING, play); player.addEventListener(EVENT.VIDEO_MEDIA_PAUSE, pause); player.addEventListener(EVENT.VIDEO_MEDIA_SEEK, pause); player.addEventListener(EVENT.VIDEO_MEDIA_SEEKED, play); player.addEventListener(EVENT.VIDEO_MEDIA_ENDED, pause); player.addEventListener(EVENT.VIDEO_PLAYER_RESIZE, resize); player.addEventListener(EVENT.VIDEO_DESTROY, destroy); document.querySelector("div.bilibili-player-video-control > div.bilibili-player-video-btn.bilibili-player-video-btn-danmaku").addEventListener( "click", (event) => { let option = event.target.getAttribute("name"); if (option == "ctlbar_danmuku_close") { visible = false; pause(); widgetContainer.style.display = "none"; } else if (option == "ctlbar_danmuku_on") { visible = true; play(); widgetContainer.style.display = ""; } } ); } function parseDm(commandDmRaw) { let popupWindow = []; for (let i = 0, cdm, extra, from; i < commandDmRaw.length; i++) { cdm = commandDmRaw[i]; extra = JSON.parse(cdm.extra); from = cdm.progress / 1e3; switch (cdm.command) { case "#ATTENTION#": case "#ACTORFOLLOW#": case "#MANAGERFOLLOW#": debug.warn("未被支持的互动弹幕类型:" + cdm.command); debug.warn(cdm); break; case "#VOTE#": popupWindow.push(new Vote(cdm, extra, from)); break; case "#GRADE#": popupWindow.push(new Grade(cdm, extra, from)); break; case "#LINK#": popupWindow.push(new Link(cdm, extra, from)); break; case "#RESERVE#": case "#ACTOR#": case "#ACTIVITYCOMBO#": debug.warn("未被支持的互动弹幕类型:" + cdm.command); debug.warn(cdm); break; } } return popupWindow; } function play() { if (visible) { playing = true; loop(); } } function pause() { playing = false; loop(); } function resize() { let scaleX = widgetContainer.clientWidth / 680; let scaleY = widgetContainer.clientHeight / 504; for (let i = 0; i < commandDm.visible.length; i++) { commandDm.visible[i].resize(scaleX, scaleY, widgetContainer.clientWidth, widgetContainer.clientHeight); } for (let i = 0; i < commandDm.hidden.length; i++) { commandDm.hidden[i].resize(scaleX, scaleY, widgetContainer.clientWidth, widgetContainer.clientHeight); } } function loop() { let time = player.getCurrentTime(); if (playing) { requestAnimationFrame(loop); } for (let i = 0, cdm; i < commandDm.hidden.length; i++) { cdm = commandDm.hidden[i]; if (cdm.from < time && cdm.to > time) { commandDm.visible.push(cdm); commandDm.hidden.splice(i, 1); cdm.show(); resize(); } } for (let i = 0, cdm; i < commandDm.visible.length; i++) { cdm = commandDm.visible[i]; if (cdm.to < time || cdm.from > time) { commandDm.hidden.push(cdm); commandDm.visible.splice(i, 1); cdm.hide(); } } } function destroy() { playing = false; for (let i = 0; i < commandDm.visible.length; i++) { commandDm.visible[i].destroy(); } for (let i = 0; i < commandDm.hidden.length; i++) { commandDm.hidden[i].destroy(); } commandDm.visible.splice(0, commandDm.visible.length); commandDm.hidden.splice(0, commandDm.hidden.length); } function divClass(className) { let div = document.createElement("div"); div.className = className; return div; } function isLoggedin() { if (uid) return true; player.pause(); toast.warning("请先登录(不可用)!"); biliQuickLogin(); } function post2(url, data, contentType = "application/x-www-form-urlencoded;charset=UTF-8") { data.csrf = getCookies().bili_jct; return xhr({ url, data: objUrl("", data), headers: { "Content-Type": contentType }, method: "POST", credentials: true }); } var PopupWindow = class { popup; duration; from; to; pos_x; pos_y; constructor(cdm, extra, from) { this.duration = extra.duration / 1e3 || 5; this.from = from || 0; this.to = from + (extra.duration / 1e3 || 5); this.pos_x = extra.posX || 200; this.pos_y = extra.posY || 200; this.popup = divClass("commandDm-popup"); this.popup.style.display = "none"; widgetContainer.appendChild(this.popup); } show() { this.popup.style.display = ""; requestAnimationFrame(() => this.popup.className = "commandDm-popup on"); } hide() { this.popup.className = "commandDm-popup"; setTimeout(() => this.popup.style.display = "none", 200); } destroy() { } resize(scaleX, scaleY, containerWidth, containerHeight) { this.popup.style.transform = "translateX(-50%) translateY(-50%) scale(" + Math.min((scaleX + scaleY) / 2, 1.5) + ")"; let left = this.pos_x * scaleX; let top = this.pos_y * scaleY; left = Math.max(left, this.popup.clientWidth / 2); top = Math.max(top, this.popup.clientHeight / 2); left = Math.min(left, containerWidth - this.popup.clientWidth / 2); top = Math.min(top, containerHeight - this.popup.clientHeight / 2); this.popup.style.left = left + "px"; this.popup.style.top = top + "px"; } }; var Vote = class extends PopupWindow { total; voteId; options; question; myVote; dialog; result; button; count; progress; constructor(cdm, extra, from) { super(cdm, extra, from); this.popup.style.width = "150px"; this.total = extra.cnt; this.voteId = extra.vote_id; this.options = extra.options; this.question = extra.question; this.myVote = extra.my_vote; let dialog = divClass("vote-dialog"); let panel = divClass("vote-panel"); let title = divClass("vote-title"); title.innerHTML = this.question; let optionDiv = divClass("vote-option"); let button = []; for (let i = 0, btn, opt; i < this.options.length; i++) { opt = this.options[i]; btn = divClass("vote-button"); btn.innerHTML = opt.desc; btn.setAttribute("idx", opt.idx); btn.onclick = () => this.goVote(opt.idx, i); button[i] = btn; optionDiv.appendChild(btn); } panel.appendChild(optionDiv); dialog.appendChild(title); dialog.appendChild(panel); this.popup.appendChild(dialog); this.dialog = dialog; this.button = button; this.progress = []; if (this.myVote !== 0) { this.showResult(); this.progress[this.myVote - 1].className = "vote-progress vote-progress-blue"; } ; } goVote(idx, i) { if (isLoggedin()) { this.total += 1; this.options[i].cnt += 1; let url = "//api.bilibili.com/x/web-interface/view/dm/vote"; post2(url, { aid: API.aid, cid: API.cid, progress: Math.max(Math.round(1e3 * player.getCurrentTime()), 1), vote: idx, vote_id: this.voteId }).then((resp) => { resp = JSON.parse(resp); biliAPI.verify(resp, "投票"); this.progress[i].className = "vote-progress vote-progress-blue"; }); this.myVote = idx; this.showResult(); this.to += 5; } } showResult() { this.count = []; for (let i = 0, progress, desc; i < this.button.length; i++) { this.button[i].onclick = null; this.button[i].innerHTML = ""; this.button[i].className = "vote-progress-bg"; progress = divClass("vote-progress"); desc = divClass("vote-progress-desc"); desc.innerHTML = this.options[i].desc; progress.appendChild(desc); this.button[i].appendChild(progress); this.progress[i] = progress; let cnt = divClass("vote-count"); cnt.innerHTML = this.options[i].cnt; this.count[i] = cnt; this.button[i].appendChild(cnt); } this.resultAnimation(); } resultAnimation() { for (let i = 0; i < this.progress.length; i++) { this.progress[i].style.width = "0"; requestAnimationFrame(() => this.progress[i].style.width = this.options[i].cnt / this.total * 100 + "%"); } let start = performance.now(); let frame = (t) => { let percentage = (t - start) * 125e-5; if (percentage < 1) requestAnimationFrame(frame); else percentage = 1; for (let i = 0; i < this.count.length; i++) { this.count[i].innerHTML = Math.floor(this.options[i].cnt * percentage); } }; requestAnimationFrame(frame); } show() { super.show(); if (this.myVote !== 0) { this.resultAnimation(); } } hide() { super.hide(); this.to = this.from + this.duration; } }; var Grade = class extends PopupWindow { gradeInfo; scoreInfo; scoreButton; constructor(cdm, info, from) { super(cdm, info, from); this.popup.style.width = "184px"; this.gradeInfo = info; this.popup.innerHTML = \` <div style="display:block" class="grade-title">\${info.msg}</div> <div class="grade-score-area pointer"></div> <div class="grade-score-info" style="display:none"> <div style="color:#6f6f6f;display:inline-block;">平均</div><span style="color:\${info.skin_font_color};font-size:27px" class="grade-avg-score">\${info.avg_score}</span> </div> <span style="position:absolute;right:1rem;top:0.8rem;font-size:12px;color:#6f6f6f" class="grade-score-count">\${info.count}人参与</span> \`; this.scoreInfo = this.popup.getElementsByClassName("grade-score-info")[0]; let scoreArea = this.popup.getElementsByClassName("grade-score-area")[0]; let scoreButton = []; function highlightScores(i) { for (let m = 0; m < 5; m++) { if (m <= i && !scoreButton[m].highlight) { scoreButton[m].highlight = true; scoreButton[m].className = "highlight"; } else if (m > i && scoreButton[m].highlight) { scoreButton[m].highlight = false; scoreButton[m].className = ""; } } } for (let i = 0; i < 5; i++) { let score = document.createElement("div"); scoreButton[i] = score; score.innerHTML = \` <img width=20 hegiht=20 src="\${info.skin_selected}" class="bg"></img> <img width=20 hegiht=20 src="\${info.skin_selected}" class="score-button"></img>\`; scoreArea.appendChild(score); if (info.mid_score === 0) { score.onmouseenter = () => highlightScores(i); score.onclick = () => { if (isLoggedin()) { this.gradeInfo.avg_score = (this.gradeInfo.count * this.gradeInfo.avg_score + (i + 1) * 2) / (this.gradeInfo.count + 1); this.gradeInfo.avg_score = this.gradeInfo.avg_score.toPrecision(2); this.gradeInfo.count += 1; this.popup.getElementsByClassName("grade-avg-score")[0].innerHTML = this.gradeInfo.avg_score; this.popup.getElementsByClassName("grade-score-count")[0].innerHTML = this.gradeInfo.count + "人参与"; this.showResult(); for (let index = 0; index < 5; index++) { if (index <= i) { scoreButton[index].style.animation = "grade-score-hit 0.7s ease forwards"; setTimeout(() => scoreButton[index].style.animation = "", 1e3); } scoreButton[index].onclick = null; scoreButton[index].onmouseenter = null; } scoreArea.onmouseleave = null; scoreArea.classList.remove("pointer"); this.goGrade((i + 1) * 2); } }; } } ; if (info.mid_score === 0) scoreArea.onmouseleave = () => highlightScores(-1); this.scoreButton = scoreButton; if (info.mid_score != 0) { this.showResult(); highlightScores(info.mid_score / 2 - 1); scoreArea.classList.remove("pointer"); } } goGrade(score) { post2("https://api.bilibili.com/x/v2/dm/command/grade/post", { aid: API.aid, cid: API.cid, progress: parseInt(player.getCurrentTime()) * 1e3, grade_id: this.gradeInfo.grade_id, grade_score: score }); this.to += 3; } showResult() { this.scoreInfo.style.display = ""; this.scoreInfo.style.animation = "grade-score-showup 0.3s ease 0.2s forwards"; for (let i = 0; i < 4; i++) { setTimeout(() => this.scoreButton[i].style.width = "24px", i * 50); } } hide() { super.hide(); this.to = this.from + this.duration; } }; var favList = class { static get() { if (this.list.length > 0) return Promise.resolve(this.list); return xhr({ url: objUrl("//api.bilibili.com/x/v3/fav/folder/created/list-all", { type: 2, rid: API.aid, up_mid: uid }), credentials: true }).then((resp) => { resp = JSON.parse(resp); biliAPI.verify(resp, "获取收藏列表"); this.list = resp.data.list; this.list.forEach((v) => v.attr === 1 && (this.defaultFolderId = v.id)); return this.list; }); } static getDefaultFolder() { if (this.defaultFolderId !== 0) return Promise.resolve(this.defaultFolderId); return this.get().then(() => { return this.defaultFolderId; }); } }; __publicField(favList, "list", []); __publicField(favList, "defaultFolderId", 0); var biliAPI = class { static verify(resp, msg) { if (resp.code !== 0) { toast.error(msg + "失败", resp.code, resp.message); throw msg + "失败"; } return resp; } static like(bool) { bool = bool ? 1 : 2; return post2("//api.bilibili.com/x/web-interface/archive/like", { aid: API.aid, like: bool }, "application/json; charset=utf-8").then((resp) => biliAPI.verify(resp, "点赞")); } static follow() { return post2("//api.bilibili.com/x/relation/modify", { aid: API.aid, fid: window.getAuthorInfo().mid, act: 1, re_src: 14 }).then((resp) => { resp = JSON.parse(resp); return biliAPI.verify(resp, "关注"); }); } static coin() { } static fav() { return post2("//api.bilibili.com/x/v3/fav/resource/deal", { rid: API.aid, type: 2, add_media_ids: favList.defaultFolderId }).then((resp) => { resp = JSON.parse(resp); return biliAPI.verify(resp, "收藏"); }); } static triple() { return post2("//api.bilibili.com/x/web-interface/archive/like/triple", { aid: API.aid }, "application/json; charset=utf-8").then((resp) => { biliAPI.verify(resp, "三连"); let d = resp.data; if (d.coin && d.like && d.fav) return; if (!d.coin) toast.error("投币失败"); if (!d.like) toast.error("点赞失败"); if (!d.fav) toast.error("收藏失败"); return d; }); } }; var Link = class { content; aid; from; to; pos_x; pos_y; button; constructor(cdm, extra, from) { this.content = cdm.content; this.aid = extra.aid; this.from = from || 0; this.to = from + 5; this.pos_x = extra.posX || 200; this.pos_y = extra.posY || 200; let button = divClass("link-button"); let img = document.createElement("img"); img.src = "https://static.hdslb.com/images/favicon.ico"; let span = document.createElement("span"); span.innerHTML = this.content; button.appendChild(img); button.appendChild(span); button.style.display = "none"; button.onclick = () => { player.pause(); window.open("https://www.bilibili.com/video/av" + this.aid); }; widgetContainer.appendChild(button); this.button = button; } show() { this.button.style.display = "block"; } hide() { this.button.style.display = "none"; } resize(scaleX, scaleY) { this.button.style.left = this.pos_x * scaleX + "px"; this.button.style.top = this.pos_y * scaleY + "px"; this.button.style.transform = "translateX(-50%) translateY(-50%) scale(" + Math.min(1.5, (scaleX + scaleY) / 2) + ")"; } destroy() { } }; async function loadCommandDm(cdm, aid, cid) { try { addCss(command_dm_default, "command-dm"); if (aid != aid || cid != cid || widgetContainer !== void 0 && document.getElementById("bilibiliPlayer").contains(widgetContainer)) { return; } init(cdm); } catch (e) { toast.error("互动弹幕组件出错~"); debug.error("互动弹幕组件出错~", e); } } // src/runtime/player/video_float.ts function videoFloat(data, hint, callback, time = 5) { const node4 = document.querySelector(".bilibili-player-video-toast-wrp"); if (node4 && data) { const flt = node4.appendChild(createElement(htmlVnode( \`<div class="bilibili-player-video-toast-bottom"> <div class="bilibili-player-video-toast-item bilibili-player-video-toast-pay"> <span class="video-float-hint-text">\${data}</span> \${hint ? \`<span class="video-float-hint-btn\${callback ? " hint-red" : ""}">\${hint}</span>\` : ""} </div> </div>\` )[0])); if (callback && hint) { flt.children[0].children[1].addEventListener("click", callback); } if (time && !isNaN(time)) { setTimeout(() => flt.remove(), time * 1e3); } } } // src/runtime/danmaku/local_danmaku.ts var LocalMedia = class { data = { xml: [], json: [], mp4: [] }; offset = 0; keyboard = false; constructor(files) { this.change(files); } change(files) { if (!window.player) { return toast.warning("请在播放页使用本功能 →_→"); } const file = files; if (file.length === 0) { return toast.warning("请选择本地视频或弹幕文件!", "视频:.mp4(且符合浏览器支持的编码)", "弹幕:.xml, .json"); } this.data = { xml: [], json: [], mp4: [] }; this.data = Array.from(file).reduce((d, i) => { /\\.xml\$/.test(i.name) && d.xml.push(i); /\\.json\$/.test(i.name) && d.json.push(i); /\\.mp4\$/.test(i.name) && d.mp4.push(i); return d; }, this.data); if (!this.data.xml[0] && !this.data.json[0] && !this.data.mp4[0]) { return toast.warning("未能识别到任何有效文件信息 →_→"); } this.video(); this.danmaku(); } async danmaku() { var _a3; if (!danmaku.loadLocalDm) { return toast.error("载入本地弹幕失败:本地弹幕组件丢失!", "本功能只能在旧版播放器使用~"); ; } if (!this.data.xml[0] && !this.data.json[0]) return; this.data.xml.forEach(async (d, i) => { let data = await readAs(d); toast("本地弹幕:" + d.name, "载入模式:" + (i || setting.danmakuContact ? "与当前弹幕合并" : "替换当前弹幕")); danmaku.loadLocalDm(data, Boolean(i) || setting.danmakuContact); }); this.data.json.forEach(async (d, i) => { var _a4; let data = JSON.parse(await readAs(d)) || []; toast("本地弹幕:" + d.name, "载入模式:" + (this.data.xml[0] || i || setting.danmakuContact ? "与当前弹幕合并" : "替换当前弹幕")); (_a4 = window.player) == null ? void 0 : _a4.setDanmaku(data, this.data.xml[0] || Boolean(i) || setting.danmakuContact); }); this.offset = 0; if (!((_a3 = window.player) == null ? void 0 : _a3.offsetDanmaku)) return toast.error("绑定键盘事件失败:弹幕偏移组件丢失!"); else { toast("已绑定键盘事件", "可以通过键盘 , 和 . 两个键(即上标为 < 和 > 的两个键)提前或延后弹幕偏移,频度1秒/次"); if (!this.keyboard) { this.keyboard = true; document.addEventListener("keydown", (ev) => { switch (ev.key) { case ",": window.player.offsetDanmaku(-1); this.offset--; videoFloat("弹幕偏移:", \`\${this.offset} 秒\`); break; case ".": window.player.offsetDanmaku(1); this.offset++; videoFloat("弹幕偏移:", \`\${this.offset} 秒\`); break; default: break; } }); } } } video() { if (this.data.mp4[0]) { toast.warning("载入本地视频中...", "请无视控制台大量报错!"); let video = document.querySelector("#bilibiliPlayer > div.bilibili-player-area.video-state-pause > div.bilibili-player-video-wrap > div.bilibili-player-video > video"); video.src = URL.createObjectURL(this.data.mp4[0]); toast.success("本地视频:" + this.data.mp4[0].name); document.querySelector(".bilibili-player-video-time-total").textContent = this.time(video.duration); } } time(time) { time = Number(time) || 0; let s = time % 60; let m = (time - s) / 60; s = (Array(2).join("0") + s).slice(-2); m = m < 10 ? (Array(2).join("0") + m).slice(-2) : m; return \`\${m}:\${s}\`; } }; // src/runtime/format/unit.ts function unitFormat(num = 0) { num = 1 * num || 0; let unit = ["", "万", "亿"], i = unit.length - 1, dex = 1e4 ** i; while (dex > 1) { if (num >= dex) { num = Number((num / dex).toFixed(1)); break; } dex = dex / 1e4; i--; } return num + unit[i]; } // src/runtime/danmaku/all_danmaku.ts var AllDanmaku = class { pubdate; today; time; arrP; danmaku = []; arrT; timeT; float; note; constructor() { this.note = toast.custom(0, "info", "冷却延时请尽量调大,以免短时间内大量请求被临时封端口!"); this.float = toast.custom(0, "info", "正在尝试获取全部弹幕请耐心等待。。。"); xhr({ url: \`https://api.bilibili.com/x/web-interface/view?aid=\${API.aid}\`, responseType: "json", credentials: true }, true).then((d) => { this.pubdate = d.data.pubdate; this.pubdate = timeFormat(this.pubdate * 1e3, true).split(" ")[0]; this.today = timeFormat(void 0, true).split(" ")[0]; this.time = this.today; this.arrP = this.pubdate.split("-"); this.danmaku = []; if (this.pubdate) { this.arrT = this.time.split("-"); this.check(); } else { return Promise.reject("获取视频上传日期数据失败,已停止~"); } }).catch((e) => { this.floatChange("error", ["获取全弹幕失败,已停止~"], 3); this.noteChange("error", ["ಥ_ಥ"], 3); debug.error("全弹幕装填", e); }); this.pubdate = new Date(2009, 0); } floatChange(type, data, delay) { if (this.float) { this.float.type = type; this.float.data = data; delay !== void 0 && (this.float.delay = delay); } switch (type) { case "error": debug.error(...data); break; case "success": debug.log(...data); break; case "info": debug.log(...data); break; case "warning": debug.warn(...data); break; } } noteChange(type, data, delay) { if (this.note) { this.note.type = type; data.forEach((d) => { var _a3, _b; if (this.note.data.length >= 20) (_a3 = this.note) == null ? void 0 : _a3.data.shift(); (_b = this.note) == null ? void 0 : _b.data.push(d); }); delay !== void 0 && (this.note.delay = delay); } switch (type) { case "error": debug.error(...data); break; case "success": debug.log(...data); break; case "info": debug.log(...data); break; case "warning": debug.warn(...data); break; } } async init() { try { this.arrT = this.time.split("-"); if (this.arrT[0] < this.arrP[0]) return this.done(1); if (this.arrT[0] == this.arrP[0] && this.arrT[1] < this.arrP[1]) return this.done(1); if (this.arrT[0] == this.arrP[0] && this.arrT[1] == this.arrP[1] && this.arrT[2] < this.arrP[2]) return this.done(1); this.noteChange("info", ["正在获取 " + this.time + " 日的弹幕。。。"]); let Dm = await danmaku.getHistoryDanmaku(this.time); danmaku.sortDmById(Dm, "idStr"); Dm.reverse(); this.time = timeFormat(Dm[Dm.length - 1].ctime * 1e3, true).split(" ")[0]; this.danmaku = this.danmaku.concat(Dm); this.floatChange("success", ["数据返回!已获取弹幕数:" + unitFormat(this.danmaku.length)]); this.arrT = this.time.split("-"); if (this.pubdate != this.today) return this.check(); this.done(1); } catch (e) { debug.error("全弹幕装填", e); if (this.danmaku[0]) { this.floatChange("warning", ["弹幕获取出错!", "保留并载入已获取的弹幕"]); this.done(); } else { this.floatChange("error", ["弹幕获取出错!", "已退出!"], 3); this.noteChange("error", ["ಥ_ಥ"], 3); } } } async check() { try { if (this.arrT[0] < this.arrP[0]) return this.done(1); if (this.arrT[0] == this.arrP[0] && this.arrT[1] < this.arrP[1]) return this.done(1); if (this.arrT[0] == this.arrP[0] && this.arrT[1] == this.arrP[1] && this.arrT[2] < this.arrP[2]) return this.done(1); let data = await xhr({ url: objUrl("https://api.bilibili.com/x/v2/dm/history/index", { type: 1, oid: API.cid, month: this.arrT.slice(0, 2).join("-") }), credentials: true }); data = jsonCheck(data).data; if (data && data[0]) { for (let i = data.length - 1; i >= 0; i--) { let date = data[i].split("-"); if (date[2] < this.arrT[2]) { this.timeT = data[i]; break; } } if (this.timeT) { this.time = this.timeT; this.timeT = void 0; this.noteChange("info", [\`技能冷却中。。。请稍待 \${setting.allDanmaku} 秒钟\`]); return setTimeout(() => this.init(), setting.allDanmaku * 1e3); } else { if (this.arrT[1] > 1) { this.arrT[1]--; this.arrT[1] = integerFormat(this.arrT[1], 2); } else this.arrT = [this.arrT[0] - 1, 12, 31]; this.noteChange("info", [\`获取前一个月数据 \${this.arrT.slice(0, 2).join("-")} 请稍待 \${setting.allDanmaku} 秒钟\`]); return setTimeout(() => this.check(), setting.allDanmaku * 1e3); } } else { if (this.arrT[1] > 1) { this.arrT[1]--; if (this.arrT[1] < 10) this.arrT[1] = integerFormat(this.arrT[1], 2); } else this.arrT = [this.arrT[0] - 1, 12, 31]; this.noteChange("info", [\`获取前一个月数据 \${this.arrT.slice(0, 2).join("-")} 请稍待 \${setting.allDanmaku} 秒钟\`]); return setTimeout(() => this.check(), setting.allDanmaku * 1e3); } } catch (e) { e = Array.isArray(e) ? e : [e]; debug.error("全弹幕装填", e); if (this.danmaku[0]) { this.floatChange("warning", ["弹幕获取出错!", "保留并载入已获取的弹幕"]); this.done(); } else { this.floatChange("error", ["弹幕获取出错!", "已退出!"]); this.noteChange("error", ["ಥ_ಥ"], 3); } } } async done(boolean) { var _a3; try { this.noteChange("info", ["正在获取BAS/代码弹幕专包。。。"]); this.danmaku = this.danmaku.concat(await danmaku.specialDms()); } catch (e) { } let Dm = danmaku.danmakuFormat(this.danmaku); if (boolean) { this.floatChange("success", ["全弹幕获取成功,正在装填。。。", "总弹幕量:" + unitFormat(this.danmaku.length), "同时推送至下载面板,可右键保存 π_π"], 3); } this.noteChange("info", ["执行结束~"], 3); (_a3 = window.player) == null ? void 0 : _a3.setDanmaku(Dm); setting.downloadOther && pushDownload({ group: "弹幕", data: Dm, up: "全弹幕", down: \`N/A\`, callback: () => danmaku.saveDanmaku(Dm, \`[全弹幕]\${API.title || API.cid}\`) }); } }; function allDanmaku() { if (!uid) return toast.warning("请登录(不可用)后使用 ಥ_ಥ"); if (!window.player) return toast.warning("请在播放页面使用本功能 →_→"); if (!window.player.setDanmaku) return toast.warning("内部组件丢失!", "请检查【托管原生脚本】功能是否开启!"); new AllDanmaku(); } // src/runtime/danmaku/danmaku.ts var root = import_light.default.Root.fromJSON(bilibili_danmaku_default); var danmakuType = new Proxy({}, { get: (t, p, r) => { if (!t[p]) { t[p] = root.lookupType(\`bilibili.\${p}\`); } return t[p]; }, set: (t, p, v, r) => true }); var loadProgress = { get root() { return document.querySelector(".bilibili-player-danmaku-load-status"); }, _pos: 0, _total: 0, _error: 0, set total(v) { this._total = v; this.root && (this.root.innerHTML = \`载入弹幕数据(\${this._pos || "--"}\${this._error ? this._error : ""}/\${parseInt(this._total) || "--"})\`); }, get total() { return this._total; }, set pos(v) { this._pos = v; this.root && (this.root.innerHTML = \`载入弹幕数据(\${this._pos || "--"}\${this._error ? this._error : ""}/\${parseInt(this._total) || "--"})\`); }, get pos() { return this._pos; }, set error(v) { this._error = v; this.root && (this.root.innerHTML = \`载入弹幕数据(\${this._pos || "--"}\${this._error ? this._error : ""}/\${parseInt(this._total) || "--"})\`); }, get error() { return this._error; }, clear() { if (this._error) { toast.warning("部分弹幕包丢失~", \`\${this._error}/\${parseInt(this._total)}\`); debug.error(\`弹幕分包:\${parseInt(this._total)}\`, \`成功:\${this._pos}\`, \`失败:\${this._error}\`); } else debug("加载弹幕成功~", \`分包总数:\${parseInt(this._total)}\`); this._pos = 0; this._total = 0; this._error = 0; } }; var Danmaku = class { dmView = {}; toXml(danmaku2) { let DM = Reflect.has(danmaku2[0], "idStr") ? this.danmakuFormat(danmaku2) : danmaku2; this.sortDmById(DM, "dmid"); let xml = DM.reduce((s, d) => { s += \`<d p="\${d.stime},\${d.mode},\${d.size},\${d.color},\${d.date},\${d.class},\${d.uid},\${d.dmid}">\${d.text.replace(/[<">'&]/g, (a) => { return { "<": "<", '"': """, ">": ">", "'": "'", "&": "&" }[a]; }).replace(/(\\n|\\r\\n)/g, "/n")}</d>\\r \`; return s; }, '<?xml version="1.0" encoding="UTF-8"?><i><chatserver>chat.api.bilibili.com</chatserver><chatid>' + API.cid + "</chatid><mission>0</mission><maxlimit>99999</maxlimit><state>0</state><real_name>0</real_name><source>e-r</source>\\r\\n"); xml += "</i>"; var regex = /((?:[\\0-\\x08\\x0B\\f\\x0E-\\x1F\\uFFFD\\uFFFE\\uFFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF]))/g; return xml.replace(regex, ""); } sortDmById(danmaku2, key) { let egx = /^\\d+\$/; for (let i = 0, d; i < danmaku2.length; i++) { d = danmaku2[i]; if (!egx.test(d[key])) throw "请输入数字字符串"; if (typeof d[key] !== "string") d[key] = String(d[key]); d[key] = d[key].replace(/^0+/, ""); } danmaku2.sort((a, b) => this.bigInt(a[key], b[key]) ? 1 : -1); } danmakuFormat(dm) { if (!dm) return []; let danmaku2 = dm.map(function(v) { let result = { class: v.pool, color: v.color, date: v.ctime, dmid: v.idStr, mode: v.mode, size: v.fontsize, stime: v.progress / 1e3, text: v.mode != 8 && v.mode != 9 ? v.content.replace(/(\\/n|\\\\n|\\n|\\r\\n)/g, "\\n") : v.content, uid: v.midHash, weight: v.weight }; if (v.action && v.action.startsWith("picture:")) result.html = \`<img src="//\${v.action.split(":")[1]}" style="width:auto;height:56.25px;">\`; if (v.styleClass !== void 0) result.AH = v.styleClass; return result; }); this.sortDmById(danmaku2, "dmid"); return danmaku2; } bigInt(num1, num2) { if (num1.length > num2.length) return true; else if (num1.length < num2.length) return false; else { for (let i = 0; i < num1.length; i++) { if (num1[i] > num2[i]) return true; if (num1[i] < num2[i]) return false; } return false; } } segDmDecode(response) { return danmakuType.DmSegMobileReply.decode(new Uint8Array(response)).elems; } async getSegDanmaku(aid = API.aid, cid = API.cid) { try { if (!aid || !cid) throw \`无法获取弹幕 aid:\${aid} cid:\${cid}\`; const dmMeta = await this.dmWebView(aid, cid); const pageSize = dmMeta.dmSge.pageSize ? dmMeta.dmSge.pageSize / 1e3 : 360; loadProgress.total = window.player && window.player.getDuration && window.player.getDuration() / pageSize + 1 || dmMeta.dmSge.total; if (aid && aid != API.aid) loadProgress.total = dmMeta.dmSge.total; let result = []; const req = []; for (let index = 1; index <= loadProgress.total; index++) { req.push(this.dmWebSeg(index, aid, cid)); } (await Promise.all(req)).forEach((d) => result = result.concat(d)); result = result.concat(await this.specialDms(aid, cid, dmMeta)); dmMeta.commandDms.length > 0 && (result = result.concat(this.upHighlightDm(dmMeta.commandDms))); setting.commandDm && dmMeta.commandDms && Promise.resolve().then(() => { loadCommandDm(dmMeta.commandDms, aid, cid); }); return result; } catch (e) { toast.error("加载弹幕出错~"); debug.error("加载弹幕出错~", e); } } async dmWebView(aid = API.aid, cid = API.cid) { try { if (this.dmView[cid]) return this.dmView[cid]; const data = await xhr({ url: objUrl("https://api.bilibili.com/x/v2/dm/web/view", { type: 1, oid: cid, pid: aid }), credentials: true, responseType: "arraybuffer" }, true); return this.dmView[cid] = danmakuType.DmWebViewReply.decode(new Uint8Array(data)); } catch (e) { toast.error("加载弹幕元数据出错!"); throw e; } } async dmWebSeg(i, aid = API.aid, cid = API.cid) { try { const data = await xhr({ url: objUrl("https://api.bilibili.com/x/v2/dm/web/seg.so", { type: 1, oid: cid, pid: aid, segment_index: i }), credentials: true, responseType: "arraybuffer" }); loadProgress.pos++; return this.segDmDecode(data); } catch (e) { loadProgress.error++; debug.error(\`加载弹幕分包 \${i} 出错\`); return []; } } async specialDms(aid = API.aid, cid = API.cid, config) { let result = []; try { config = config || await this.dmWebView(aid, cid); if (config.specialDms.length > 0) { loadProgress.total += config.specialDms.length; const data = await Promise.all(config.specialDms.reduce((s, d) => { s.push(this.dmSpSeg(d.replace("http:", "https:"))); return s; }, [])); data.forEach((d) => result = result.concat(d)); } } catch (e) { debug.error("获取特殊弹幕出错~", e); } loadProgress.clear(); return result; } async dmSpSeg(url) { try { const data = await xhr({ url, responseType: "arraybuffer" }); loadProgress.pos++; return this.segDmDecode(data); } catch (e) { loadProgress.error++; debug("获取特殊弹幕出错~", url, e); return []; } } upHighlightDm(dms) { try { return dms.reduce((s, d) => { if (d.command == "#UP#") { d.styleClass = "danmaku-up-icon"; d.color = 16777215; d.pool = 0; d.fontsize = 25; d.ctime = new Date(d.mtime).getTime() / 1e3; d.mode = 1; d.midHash = crc32(d.mid); } return s; }, []); } catch (e) { debug.error("UP主高亮弹幕", e); return []; } } loadLocalDm(xml, append) { var _a3, _b; let doc = new DOMParser().parseFromString(xml, "application/xml"); let dm = doc.querySelectorAll("d"); if (dm.length == 0) { toast.warning("从弹幕文件中没有获取到任何弹幕!"); return; } let danmaku2 = []; let attr, v, mode; for (let i = 0; i < dm.length; i++) { v = dm[i]; attr = v.getAttribute("p").split(","); mode = parseInt(attr[1]); danmaku2[i] = { class: parseInt(attr[5]), color: parseInt(attr[3]), date: parseInt(attr[4]), dmid: attr[7], mode, size: parseInt(attr[2]), stime: parseFloat(attr[0]), text: mode != 8 && mode != 9 ? v.textContent.replace(/(\\/n|\\\\n|\\n|\\r\\n)/g, "\\n") : v.textContent, uid: attr[6] }; } this.sortDmById(danmaku2, "dmid"); if (!((_a3 = window.player) == null ? void 0 : _a3.setDanmaku)) return toast.error("刷新弹幕列表失败:播放器内部调用丢失!"); (_b = window.player) == null ? void 0 : _b.setDanmaku(danmaku2, append); } async getHistoryDanmaku(date, cid = API.cid) { if (!date || !uid) return; let dm = await xhr({ url: objUrl("https://api.bilibili.com/x/v2/dm/web/history/seg.so", { type: String(1), oid: String(cid), date }), responseType: "arraybuffer", credentials: true }); return this.segDmDecode(dm); } saveDanmaku(dm, fileName) { let data = setting.danmakuSaveType === "xml" ? this.toXml(dm) : JSON.stringify(dm, void 0, " "); saveAs(data, \`\${fileName || API.title || API.cid}\${setting.danmakuSaveType === "xml" ? ".xml" : ".json"}\`); } }; var danmaku = new Danmaku(); window.addEventListener("message", async (ev) => { var _a3; if (isUserScript) return; if (typeof ev.data === "object") { if (ev.data.\$type == "onlineDanmaku") { if (!window.player) return toast.warning("请在播放页面使用本功能 →_→"); if (!window.player.setDanmaku) return toast.warning("内部组件丢失!", "请检查【托管原生脚本】功能是否开启!"); if (!ev.data.url) return toast.warning("请输入视频链接或参数~"); toast.info(\`正在解析url:\${ev.data.url}\`); try { const d = await urlParam(ev.data.url, false); if (d.aid && d.cid) { toast.info("参数解析成功,正在获取弹幕数据~", d); debug(ev.data.url, d); let dm = await danmaku.getSegDanmaku(d.aid, d.cid); if (dm) { const dat = danmaku.danmakuFormat(dm); toast.success("获取弹幕成功~"); (_a3 = window.player) == null ? void 0 : _a3.setDanmaku(dat, setting.danmakuContact); setting.downloadOther && pushDownload({ group: "弹幕", data: dat, up: "在线", down: \`N/A\`, callback: () => danmaku.saveDanmaku(dat, ev.data.url) }); } else { toast.error("获取弹幕失败,请在控制台检查原因~"); } } else { toast.warning("提取弹幕参数失败,请检查输入~"); } } catch (e) { toast.error("在线弹幕", e); debug.error("在线弹幕", e); } } if (typeof ev.data === "object") { if (ev.data.\$type == "localMedia") { fileRead(".mp4,.json", true).then((d) => { d && new LocalMedia(d); }); } } if (ev.data.\$type == "allDanmaku") { allDanmaku(); } } }); // src/runtime/danmaku/history_danmaku.ts function historyDanmaku() { const id = xhrhookAsync("history?type=", (args) => { var _a3; const param2 = urlObj(args[1]); if (!((_a3 = window.player) == null ? void 0 : _a3.setDanmaku)) { removeXhrhook(id); return false; } else if (!param2.date) return false; xhr({ url: \`https://api.bilibili.com/x/v2/dm/web/history/seg.so?type=1&oid=\${API.cid}&date=\${param2.date}\`, responseType: "arraybuffer", credentials: true }).then((seg) => { var _a4; let dm = danmaku.danmakuFormat(danmaku.segDmDecode(seg)); (_a4 = window.player) == null ? void 0 : _a4.setDanmaku(dm); setting.downloadOther && pushDownload({ group: "弹幕", data: dm, up: "历史", down: \`N/A\`, callback: () => danmaku.saveDanmaku(dm, \`\${API.title || API.cid}\`) }); }).catch((e) => { toast.error("载入历史弹幕失败", "请尝试刷新页面"); toast.error(e); }); return true; }, void 0, false); } // src/runtime/danmaku/bilibili_broadcast.json var bilibili_broadcast_default = { nested: { bilibili: { nested: { broadcast: { nested: { v1: { nested: { AuthReq: { fields: { guid: { type: "string", id: 1 }, connId: { type: "string", id: 2 }, lastMsgId: { type: "int64", id: 3 } } }, AuthResp: { fields: {} }, HeartbeatReq: { fields: {} }, HeartbeatResp: { fields: {} }, TargetPath: { fields: { targetPaths: { rule: "repeated", type: "string", id: 1 } } }, MessageAckReq: { fields: { ackId: { type: "int64", id: 1 }, ackOrigin: { type: "string", id: 2 }, targetPath: { type: "string", id: 3 } } }, Subscribe: { fields: { type: { type: "string", id: 1 }, targetPaths: { rule: "repeated", type: "string", id: 2 } } }, Status: { fields: { code: { type: "int32", id: 1 }, message: { type: "string", id: 2 }, details: { rule: "repeated", type: "google.protobuf.Any", id: 3 } } }, FrameOption: { fields: { messageId: { type: "int64", id: 1 }, sequence: { type: "int64", id: 2 }, isAck: { type: "bool", id: 3 }, status: { type: "Status", id: 4 }, ackOrigin: { type: "string", id: 5 } } }, BroadcastFrame: { fields: { options: { type: "FrameOption", id: 1 }, targetPath: { type: "string", id: 2 }, body: { type: "google.protobuf.Any", id: 3 } } }, RoomJoinEvent: { fields: {} }, RoomLeaveEvent: { fields: {} }, RoomOnlineEvent: { fields: { online: { type: "int32", id: 1 }, allOnline: { type: "int32", id: 2 } } }, RoomMessageEvent: { fields: { targetPath: { type: "string", id: 1 }, body: { type: "google.protobuf.Any", id: 2 } } }, RoomErrorEvent: { fields: { status: { type: "Status", id: 1 } } }, RoomReq: { oneofs: { event: { oneof: [ "join", "leave", "online", "msg" ] } }, fields: { id: { type: "string", id: 1 }, join: { type: "RoomJoinEvent", id: 2 }, leave: { type: "RoomLeaveEvent", id: 3 }, online: { type: "RoomOnlineEvent", id: 4 }, msg: { type: "RoomMessageEvent", id: 5 } } }, RoomResp: { oneofs: { event: { oneof: [ "join", "leave", "online", "msg", "err" ] } }, fields: { id: { type: "string", id: 1 }, join: { type: "RoomJoinEvent", id: 2 }, leave: { type: "RoomLeaveEvent", id: 3 }, online: { type: "RoomOnlineEvent", id: 4 }, msg: { type: "RoomMessageEvent", id: 5 }, err: { type: "RoomErrorEvent", id: 6 } } } } } } } } }, google: { nested: { protobuf: { nested: { Any: { fields: { type_url: { type: "string", id: 1 }, value: { type: "bytes", id: 2 } } }, Empty: { fields: {} } } } } } } }; // src/runtime/danmaku/bilibili_broadcast_danmaku.json var bilibili_broadcast_danmaku_default = { nested: { bilibili: { nested: { broadcast: { nested: { message: { nested: { main: { nested: { DanmakuElem: { fields: { id: { type: "int64", id: 1 }, progress: { type: "int32", id: 2 }, mode: { type: "int32", id: 3 }, fontsize: { type: "int32", id: 4 }, color: { type: "uint32", id: 5 }, midHash: { type: "string", id: 6 }, content: { type: "string", id: 7 }, ctime: { type: "int64", id: 8 }, action: { type: "string", id: 9 }, pool: { type: "int32", id: 10 }, idStr: { type: "string", id: 11 } } }, DanmukuEvent: { fields: { elems: { rule: "repeated", type: "DanmakuElem", id: 1 } } } } } } } } } } } } }; // src/runtime/danmaku/live_danmaku.ts var import_light2 = __toESM(require_light()); var root2 = import_light2.default.Root.fromJSON(bilibili_broadcast_default); var danmakuElem = import_light2.default.Root.fromJSON(bilibili_broadcast_danmaku_default).lookupType("bilibili.broadcast.message.main.DanmukuEvent"); var sequence = 1; var message = { msgType: root2.lookupType("BroadcastFrame"), targetPathType: root2.lookupType("TargetPath"), beatReqType: root2.lookupType("HeartbeatReq"), ackReqType: root2.lookupType("MessageAckReq"), anyType: root2.lookupType("google.protobuf.Any"), roomRequest: root2.lookupType("RoomReq"), roomResp: root2.lookupType("RoomResp"), roomEvents: { join: root2.lookupType("RoomJoinEvent"), leave: root2.lookupType("RoomLeaveEvent"), online: root2.lookupType("RoomOnlineEvent") } }; var targetPath = { "AUTH": "/bilibili.broadcast.v1.Broadcast/Auth", "HEARTBEAT": "/bilibili.broadcast.v1.Broadcast/Heartbeat", "SUBSCRIBE": "/bilibili.broadcast.v1.Broadcast/Subscribe", "UNSUBSCRIBE": "/bilibili.broadcast.v1.Broadcast/Unsubscribe", "MSG_ACK": "/bilibili.broadcast.v1.Broadcast/MessageAck", "ENTER": "/bilibili.broadcast.v1.BroadcastRoom/Enter", "ROOMREQ": "/bilibili.broadcast.v1.RoomReq", "ROOMRES": "/bilibili.broadcast.v1.RoomResp", "AUTHREQ": "/bilibili.broadcast.v1.AuthReq", "TARGETPATH": "/bilibili.broadcast.v1.TargetPath", "HEARTBEATRES": "/bilibili.broadcast.v1.HeartbeatResp", "MSG_ACK_REQ": "/bilibili.broadcast.v1.MessageAckReq" }; var utils = { encodeAny: function(body, encoder2, url) { return url = "type.googleapis.com" + url, message.anyType.create({ type_url: url, value: encoder2.encode(body).finish() }); }, toBuffer: function(body, encoder2) { if (encoder2.verify(body)) return ""; let t = encoder2.create(body); return encoder2.encode(t).finish(); }, toMsg: function(body, decoder) { let t; try { t = decoder.toObject(decoder.decode(new Uint8Array(body))); } catch (i) { debug.error(i); } return t; } }; var encoder = new TextEncoder(); var liveChatOld; var liveChat; var wsHookRunOnce = true; var wssend = WebSocket.prototype.send; function initLiveChat() { liveChat = new WebSocket("wss://broadcast.chat.bilibili.com:7826/sub?platform=web", "proto"); liveChat.binaryType = "arraybuffer"; liveChat.beatTimer = 0; liveChat.msgFlag = {}; liveChat.socketKey = "video://" + API.aid + "/" + API.cid; API.pgc && (liveChat.socketKey += "?sid=" + API.__INITIAL_STATE__.ssId + "&epid=" + API.__INITIAL_STATE__.epId); liveChat.sendMsg = function(body, encoder2) { void 0 === encoder2 && (encoder2 = message.msgType); this.send(utils.toBuffer(body, encoder2)); }; liveChat.auth = function() { this.sendMsg({ options: { sequence: ++sequence }, targetPath: targetPath.AUTH, body: utils.encodeAny(message.anyType.create({}), message.anyType, targetPath.AUTHREQ) }); }; liveChat.onAuthed = function(t) { this.authed = true; this.subscribeBase(["bilibili.broadcast.message.main.DanmukuEvent"]); this.roomBase(liveChat.socketKey); }; liveChat.subscribeBase = function(t, e) { if (void 0 === e && (e = true), t && t.length) { var i = ++sequence; this.msgFlag[i] = t, this.sendMsg({ options: { sequence: i }, targetPath: e ? targetPath.SUBSCRIBE : targetPath.UNSUBSCRIBE, body: utils.encodeAny(message.targetPathType.create({ targetPaths: t }), message.targetPathType, targetPath.TARGETPATH) }); } }; liveChat.roomBase = function(t) { let event = { id: t, join: message.roomEvents.join.create({}) }; var i = ++sequence; this.msgFlag[i] = t, this.sendMsg({ options: { sequence: i }, targetPath: targetPath.ENTER, body: utils.encodeAny(message.roomRequest.create(event), message.roomRequest, targetPath.ROOMREQ) }); }; liveChat.onRoomMsg = function(t) { var e, i; if (null === (e = t.body) || void 0 === e ? void 0 : e.value) { var o = utils.toMsg(t.body.value, message.roomResp); if (null === (i = o.msg) || void 0 === i ? void 0 : i.targetPath) { var r = utils.toMsg(o.msg.body.value, danmakuElem); r.elems.forEach(function(v) { liveChatOld.onmessage({ data: liveChatOld.convertToArrayBuffer({ cmd: "DM", info: [[v.progress / 1e3, v.mode, v.fontsize, v.color, v.ctime, "", v.pool, v.midHash, v.idStr].join(","), v.content] }, 5) }); }); } } }; liveChat.heartBeat = function() { var i = this; this.beatTimer && clearTimeout(this.beatTimer); this.beatTimer = window.setTimeout(function() { if (i.readyState === 1) { i.sendMsg({ options: { sequence: ++sequence }, targetPath: targetPath.HEARTBEAT, body: utils.encodeAny(message.beatReqType.create({}), message.beatReqType, targetPath.HEARTBEATRES) }); i.heartBeat(); } }, 1e3 * 20); }; liveChat.onopen = function() { this.auth(); }; liveChat.onclose = function() { if (liveChatOld.readyState === 1) { initLiveChat(); } else { this.beatTimer && clearTimeout(this.beatTimer); } }; liveChat.onmessage = function(i) { var t, a = utils.toMsg(i.data, message.msgType); if (this.heartBeat(), a) { if (null == a ? void 0 : a.targetPath) switch (a.targetPath) { case targetPath.AUTH: this.onAuthed(a); break; case targetPath.SUBSCRIBE: break; case targetPath.UNSUBSCRIBE: break; case targetPath.HEARTBEAT: break; case targetPath.ENTER: this.onRoomMsg(a); break; default: } delete this.msgFlag[null === (t = a.options) || void 0 === t ? void 0 : t.sequence]; } }; } function liveDanmaku() { WebSocket.prototype.send = function(...arg) { if (wsHookRunOnce && this.url == "wss://broadcast.chat.bilibili.com:4095/sub") { liveChatOld = this; liveChatOld.convertToArrayBuffer = function(body, option) { let header2 = [{ "name": "Header Length", "key": "headerLen", "qg": 2, "offset": 4, "value": 16 }, { "name": "Protocol Version", "key": "ver", "qg": 2, "offset": 6, "value": 1 }, { "name": "Operation", "key": "op", "qg": 4, "offset": 8, "value": option }, { "name": "Sequence Id", "key": "seq", "qg": 4, "offset": 12, "value": 1 }]; let headerBuf = new ArrayBuffer(16); let viewer = new DataView(headerBuf, 0); let bodyBuf = encoder.encode(JSON.stringify(body)); viewer.setInt32(0, 16 + bodyBuf.byteLength); header2.forEach(function(b) { 4 === b.qg ? viewer.setInt32(b.offset, b.value) : 2 === b.qg && viewer.setInt16(b.offset, b.value); }); function mergeArrayBuffer(headerBuf2, bodyBuf2) { headerBuf2 = new Uint8Array(headerBuf2); bodyBuf2 = new Uint8Array(bodyBuf2); var d = new Uint8Array(headerBuf2.byteLength + bodyBuf2.byteLength); d.set(headerBuf2, 0); d.set(bodyBuf2, headerBuf2.byteLength); return d.buffer; } return mergeArrayBuffer(headerBuf, bodyBuf); }; let onclose = liveChatOld.onclose; liveChatOld.onclose = function() { wsHookRunOnce = true; clearTimeout(liveChat.beatTimer); liveChat.close(); onclose.call(this); }; wsHookRunOnce = false; initLiveChat(); } wssend.call(this, ...arg); }; } // src/runtime/danmaku/protobuf_danmaku.ts function loadDanmakuEngine() { if (setting.protobufDanmaku) { let workerPostMsg = Worker.prototype.postMessage; let list_so; Worker.prototype.postMessage = function(aMessage, transferList) { if (aMessage.url && aMessage.url.includes("list.so")) { const obj = urlObj(aMessage.url); list_so = this; let triggerOnMsg = (danmaku2, loadTime, parseTime) => list_so.onmessage({ data: { code: 0, danmakuArray: danmaku2, loadTime, parseTime, sendTip: "", state: 0, textSide: "", total: danmaku2.length.toString() } }); let loadDanmaku = (loadTime) => danmaku.getSegDanmaku(void 0, obj.oid).then((Segments) => { loadTime = new Date() - loadTime; let parseTime = new Date(); let Dm = danmaku.danmakuFormat(Segments); parseTime = new Date() - parseTime; triggerOnMsg(Dm, loadTime, parseTime); setting.downloadOther && pushDownload({ group: "弹幕", data: Dm, up: "当前", down: \`N/A\`, callback: () => danmaku.saveDanmaku(Dm, \`\${API.title || API.cid}\`) }); }); loadDanmaku(new Date()); } else { workerPostMsg.call(this, aMessage, transferList); } }; } historyDanmaku(); liveDanmaku(); } // src/runtime/hook/keymap.ts var bindMap = {}; var isTyping = () => { const { activeElement } = document; if (!activeElement) { return false; } if (activeElement.hasAttribute("contenteditable")) { return true; } return ["input", "textarea"].includes(activeElement.nodeName.toLowerCase()); }; doWhile(() => document.body, (d) => { d.addEventListener("keydown", (e) => { if (isTyping()) return; const key = e.key.toLowerCase(); e.key && bindMap[key] && bindMap[key].forEach((d2) => { let disable = d2.disable; Number(d2.altKey) ^ Number(e.altKey) && (disable = true); Number(d2.ctrlKey) ^ Number(e.ctrlKey) && (disable = true); Number(d2.metaKey) ^ Number(e.metaKey) && (disable = true); Number(d2.repeat) ^ Number(e.repeat) && (disable = true); Number(d2.shiftKey) ^ Number(e.shiftKey) && (disable = true); try { !disable && d2.callback(); } catch (e2) { debug.error("keymap.js", e2); } }); }); }); function bindKeyMap(key, callback, special = {}) { const keyl = key.toLowerCase(); const map = Object.assign(special, { callback, disable: false }); bindMap[keyl] ? bindMap[keyl].push(map) : bindMap[keyl] = [map]; return function changeKeyMap(disable) { if (arguments.length) { map.disable = disable; } else { map.disable = !map.disable; } }; } // src/runtime/player/player_key_map.ts function playerKeyMap() { bindKeyMap("F", () => { var _a3; (_a3 = document.querySelector(".icon-24fullscreen")) == null ? void 0 : _a3.click(); }); bindKeyMap("D", () => { var _a3; (_a3 = document.querySelector(".bilibili-player-video-btn-danmaku")) == null ? void 0 : _a3.click(); }); bindKeyMap("[", () => { window.player.prev(); }); bindKeyMap("]", () => { window.player.next(); }); bindKeyMap("enter", () => { var _a3; (_a3 = document.querySelector(".bilibili-player-video-danmaku-input")) == null ? void 0 : _a3.select(); }); bindKeyMap("V", () => { let video = document.querySelector("#bilibiliPlayer .bilibili-player-video video"); if (video) { let filter = video.style.filter; if (filter.includes("contrast")) { filter = filter.replace("contrast(1)", ""); setting.videoDisableAA = false; } else { filter += "contrast(1)"; setting.videoDisableAA = true; } video.style.filter = filter; } }); } // src/runtime/player/media_meta.ts var temp; function mediaSession(data) { Promise.resolve().then(() => window.GrayManager.setActionHandler()); const check2 = JSON.stringify(data); if (temp === check2) return; temp = check2; if (!navigator.mediaSession.metadata) navigator.mediaSession.metadata = new MediaMetadata({ ...data }); else { navigator.mediaSession.metadata.title = data.title; navigator.mediaSession.metadata.artist = data.artist; navigator.mediaSession.metadata.album = data.album; navigator.mediaSession.metadata.artwork = data.artwork; } } function setMediaSession() { const epid = API.epid; const aid = API.aid; xhr({ url: \`https://api.bilibili.com/x/article/cards?ids=av\${aid}\`, responseType: "json" }, true).then((d) => { if (d.data[\`av\${aid}\`]) { mediaSession({ title: d.data[\`av\${aid}\`].title, artist: d.data[\`av\${aid}\`].owner.name, album: epid ? \`ep\${epid}\` : \`av\${aid}\`, artwork: [ { src: d.data[\`av\${aid}\`].pic } ] }); API.cover = d.data[\`av\${aid}\`].pic; API.title = d.data[\`av\${aid}\`].title; } }).catch((e) => { debug.error("MediaSession", e); }); } // src/runtime/player/automate.ts function bofqiToView() { let str = [".bangumi_player", "#bofqi", "#bilibiliPlayer"]; let node4 = str.reduce((s, d) => { s = s || document.querySelector(d); return s; }, document.querySelector("#__bofqi")); node4 && node4.scrollIntoView({ behavior: "smooth", block: "center" }); } function automate() { var _a3; switchVideo(() => { setting.automate.webFullScreen && doWhile(() => document.querySelector(".bilibili-player-iconfont.bilibili-player-iconfont-web-fullscreen.icon-24webfull.player-tooltips-trigger"), () => document.querySelector(".bilibili-player-video-web-fullscreen").click()); setting.automate.noDanmaku && doWhile(() => document.querySelector(".bilibili-player-video-btn.bilibili-player-video-btn-danmaku"), (d) => { !document.querySelector(".bilibili-player-video-btn.bilibili-player-video-btn-danmaku.video-state-danmaku-off") && d.click(); }); setting.videoDisableAA && doWhile(() => document.querySelector("#bilibiliPlayer .bilibili-player-video video"), (d) => d.style.filter += "contrast(1)"); setTimeout(() => { setting.automate.showBofqi && bofqiToView(); }, 500); setMediaSession(); }); setting.automate.danmakuFirst && sessionStorage2.setItem("player_last_filter_tab_info", 4); let bilibili_player_settings = localStorage.getItem("bilibili_player_settings"); if (bilibili_player_settings) { if (((_a3 = bilibili_player_settings.video_status) == null ? void 0 : _a3.autopart) !== "") { GM.setValue("bilibili_player_settings", bilibili_player_settings); } } else { if (isUserScript) { const d = GM_getValue("bilibili_player_settings"); d && localStorage.setItem("bilibili_player_settings", d); } else { GM.getValue("bilibili_player_settings").then((d) => { d && localStorage.setItem("bilibili_player_settings", d); }); } } if (setting.automate.videospeed) { if (isUserScript) { const videospeed = GM_getValue("videospeed"); if (videospeed) { let setting2 = sessionStorage2.getItem("bilibili_player_settings"); setting2 ? setting2.video_status ? setting2.video_status.videospeed = videospeed : setting2.video_status = { videospeed } : setting2 = { video_status: { videospeed } }; sessionStorage2.setItem("bilibili_player_settings", setting2); } } else { GM.getValue("videospeed").then((videospeed) => { if (videospeed) { let setting2 = sessionStorage2.getItem("bilibili_player_settings"); setting2 ? setting2.video_status ? setting2.video_status.videospeed = videospeed : setting2.video_status = { videospeed } : setting2 = { video_status: { videospeed } }; sessionStorage2.setItem("bilibili_player_settings", setting2); } }); } switchVideo(() => { doWhile(() => { var _a4; return (_a4 = document.querySelector("#bofqi")) == null ? void 0 : _a4.querySelector("video"); }, (d) => { d.addEventListener("ratechange", (e) => { GM.setValue("videospeed", e.target.playbackRate || 1); }); }); }); } } // src/runtime/player/bgray_btn.html var bgray_btn_default = '<style type="text/css">\\r\\n .movie_play {\\r\\n overflow: visible;\\r\\n }\\r\\n\\r\\n .movie_play .bgray-btn-wrap {\\r\\n top: -10px;\\r\\n }\\r\\n\\r\\n #bofqi {\\r\\n box-shadow: 0 0 0;\\r\\n }\\r\\n\\r\\n .player-wrapper {\\r\\n position: relative;\\r\\n }\\r\\n\\r\\n .player-fullscreen-fix {\\r\\n position: fixed;\\r\\n top: 0;\\r\\n left: 0;\\r\\n margin: 0;\\r\\n padding: 0;\\r\\n width: 100%;\\r\\n height: 100%;\\r\\n }\\r\\n\\r\\n .player-fullscreen-fix #bofqi .player {\\r\\n position: fixed !important;\\r\\n border-radius: 0;\\r\\n z-index: 100000 !important;\\r\\n left: 0;\\r\\n top: 0;\\r\\n width: 100% !important;\\r\\n height: 100% !important;\\r\\n }\\r\\n\\r\\n .bgray-btn-wrap {\\r\\n position: absolute;\\r\\n top: 10px;\\r\\n left: 50%;\\r\\n margin-left: 490px;\\r\\n width: 70px;\\r\\n height: 200px;\\r\\n }\\r\\n\\r\\n .widescreen .bgray-btn-wrap {\\r\\n margin-left: 580px;\\r\\n }\\r\\n\\r\\n .bgray-btn {\\r\\n transition: all 0.3s;\\r\\n cursor: pointer;\\r\\n margin: 10px 0;\\r\\n background-color: #fff;\\r\\n text-align: center;\\r\\n padding: 7px 5px;\\r\\n display: block;\\r\\n left: 100%;\\r\\n font-size: 12px;\\r\\n line-height: 12px;\\r\\n margin-left: 10px;\\r\\n width: 20px;\\r\\n border-radius: 4px;\\r\\n border: 1px solid #e5e9ef;\\r\\n color: #99a2aa;\\r\\n }\\r\\n\\r\\n .bgray-btn-feedback {\\r\\n height: 72px;\\r\\n margin-bottom: 5px;\\r\\n }\\r\\n\\r\\n .bgray-btn-help {\\r\\n height: 24px;\\r\\n margin-top: 5px;\\r\\n }\\r\\n\\r\\n .bgray-btn:hover {\\r\\n color: #6d757a;\\r\\n border-color: #6d757a;\\r\\n }\\r\\n\\r\\n .bgray-btn.player-feedback-disable {\\r\\n color: #ccd0d7\\r\\n }\\r\\n\\r\\n .bgray-btn.player-feedback-disable:hover {\\r\\n color: #ccd0d7;\\r\\n border-color: #ccd0d7;\\r\\n }\\r\\n\\r\\n .bgray-btn.player-feedback-disable {\\r\\n color: #ccd0d7\\r\\n }\\r\\n\\r\\n .bgray-btn.player-feedback-disable:hover {\\r\\n color: #ccd0d7;\\r\\n border-color: #ccd0d7;\\r\\n }\\r\\n\\r\\n .bgray-btn.active {\\r\\n cursor: default;\\r\\n color: #00a1d6;\\r\\n border-color: #00a1d6;\\r\\n }\\r\\n\\r\\n .bgray-line {\\r\\n display: none;\\r\\n width: 42px;\\r\\n margin: 0 auto;\\r\\n border-bottom: 1px solid #e5e9ef;\\r\\n }\\r\\n\\r\\n .bgray-btn {\\r\\n display: none;\\r\\n }\\r\\n\\r\\n .bgray-btn.show {\\r\\n display: block;\\r\\n }\\r\\n\\r\\n @media screen and (min-width: 1400px) {\\r\\n .bgray-btn-wrap {\\r\\n margin-left: 580px;\\r\\n }\\r\\n }\\r\\n\\r\\n .bgray-btn.happyfoolsday {\\r\\n line-height: 13px;\\r\\n background-color: #00a1d6;\\r\\n border-color: #00a1d6;\\r\\n color: #fff;\\r\\n }\\r\\n\\r\\n .bgray-btn.happyfoolsday:hover {\\r\\n background-color: #00b5e5;\\r\\n border-color: #00b5e5;\\r\\n color: #fff;\\r\\n }\\r\\n</style>'; // src/runtime/format/cht_2_chs.ts var aTC2SC = { "以功覆過": "以功复过", "侔德覆載": "侔德复载", "傷亡枕藉": "伤亡枕借", "出醜狼藉": "出丑狼借", "反反覆覆": "反反复复", "名覆金甌": "名复金瓯", "情有獨鍾": "情有独锺", "文錦覆阱": "文锦复阱", "於呼哀哉": "於呼哀哉", "旋乾轉坤": "旋乾转坤", "朝乾夕惕": "朝乾夕惕", "狐藉虎威": "狐借虎威", "瞭若指掌": "了若指掌", "老態龍鍾": "老态龙锺", "藉箸代籌": "借箸代筹", "藉草枕塊": "借草枕块", "藉藉无名": "藉藉无名", "衹見樹木": "只见树木", "覆蕉尋鹿": "复蕉寻鹿", "覆鹿尋蕉": "复鹿寻蕉", "覆鹿遺蕉": "复鹿遗蕉", "買臣覆水": "买臣复水", "踅門瞭戶": "踅门了户", "雁杳魚沈": "雁杳鱼沉", "顛乾倒坤": "颠乾倒坤", "乾清宮": "乾清宫", "乾盛世": "乾盛世", "八濛山": "八濛山", "千鍾粟": "千锺粟", "尼乾陀": "尼乾陀", "張法乾": "张法乾", "於世成": "於世成", "於仲完": "於仲完", "於其一": "於其一", "於勇明": "於勇明", "於崇文": "於崇文", "於忠祥": "於忠祥", "於惟一": "於惟一", "於梨華": "於梨华", "於清言": "於清言", "於竹屋": "於竹屋", "於陵子": "於陵子", "李乾德": "李乾德", "李澤鉅": "李泽钜", "李鍊福": "李链福", "李鍾郁": "李锺郁", "樊於期": "樊於期", "藉寇兵": "借寇兵", "覆醬瓿": "复酱瓿", "角徵羽": "角徵羽", "貂覆額": "貂复额", "郭子乾": "郭子乾", "錢鍾書": "钱锺书", "鍾萬梅": "锺万梅", "鍾重發": "锺重发", "麼些族": "麽些族", "黄鍾公": "黄锺公", "上鍊": "上链", "么麼": "幺麽", "么麽": "幺麽", "乾元": "乾元", "乾卦": "乾卦", "乾嘉": "乾嘉", "乾圖": "乾图", "乾坤": "乾坤", "乾宅": "乾宅", "乾斷": "乾断", "乾旦": "乾旦", "乾曜": "乾曜", "乾紅": "乾红", "乾綱": "乾纲", "乾縣": "乾县", "乾象": "乾象", "乾造": "乾造", "乾道": "乾道", "乾陵": "乾陵", "乾隆": "乾隆", "家俱": "家具", "傢具": "家具", "傢俱": "家具", "凌藉": "凌借", "函覆": "函复", "反覆": "反复", "哪吒": "哪吒", "哪咤": "哪吒", "回覆": "回复", "射覆": "射复", "幺麼": "幺麽", "康乾": "康乾", "彷彿": "仿佛", "徵弦": "徵弦", "徵絃": "徵弦", "徵聲": "徵声", "徵調": "徵调", "徵音": "徵音", "憑藉": "凭借", "手鍊": "手链", "拉鍊": "拉链", "拜覆": "拜复", "於乎": "於乎", "於倫": "於伦", "於則": "於则", "於單": "於单", "於坦": "於坦", "於戲": "於戏", "於敖": "於敖", "於琳": "於琳", "於穆": "於穆", "於菟": "於菟", "於邑": "於邑", "明瞭": "明了", "明覆": "明复", "木吒": "木吒", "木咤": "木吒", "沈沒": "沉没", "沈積": "沉积", "沈船": "沉船", "沈默": "沉默", "流徵": "流徵", "滑藉": "滑借", "牴牾": "抵牾", "牴觸": "抵触", "甚鉅": "甚钜", "申覆": "申复", "畢昇": "毕昇", "發覆": "发复", "瞭如": "了如", "瞭然": "了然", "瞭解": "了解", "示覆": "示复", "禀覆": "禀复", "答覆": "答复", "篤麼": "笃麽", "籌畫": "筹划", "素藉": "素借", "茵藉": "茵借", "萬鍾": "万锺", "蒜薹": "蒜薹", "蕓薹": "芸薹", "蕩覆": "荡复", "蕭乾": "萧乾", "藉代": "借代", "藉以": "借以", "藉助": "借助", "藉卉": "借卉", "藉口": "借口", "藉喻": "借喻", "藉手": "借手", "藉據": "借据", "藉故": "借故", "藉方": "借方", "藉條": "借条", "藉槁": "借槁", "藉機": "借机", "藉此": "借此", "藉甚": "借甚", "藉由": "借由", "藉著": "借着", "藉端": "借端", "藉藉": "借借", "藉詞": "借词", "藉讀": "借读", "藉資": "借资", "衹得": "只得", "覆上": "复上", "覆住": "复住", "覆信": "复信", "覆冒": "复冒", "覆呈": "复呈", "覆命": "复命", "覆墓": "复墓", "覆宗": "复宗", "覆帳": "复帐", "覆幬": "复帱", "覆成": "复成", "覆按": "复按", "覆文": "复文", "覆杯": "复杯", "覆校": "复校", "覆瓿": "复瓿", "覆盂": "复盂", "覆育": "复育", "覆逆": "复逆", "覆醢": "复醢", "覆電": "复电", "覆露": "复露", "覆鼎": "复鼎", "見覆": "见复", "角徵": "角徵", "計畫": "计划", "變徵": "变徵", "躪藉": "躏借", "酝藉": "酝借", "重覆": "重复", "金吒": "金吒", "金咤": "金吒", "金鍊": "金链", "鈕釦": "纽扣", "鈞覆": "钧复", "鉅子": "钜子", "鉅萬": "钜万", "鉅防": "钜防", "鉸鍊": "铰链", "銀鍊": "银链", "鍊墜": "链坠", "鍊子": "链子", "鍊形": "链形", "鍊條": "链条", "鍊錘": "链锤", "鍊鎖": "链锁", "鍛鍾": "锻锺", "鍾鍛": "锺锻", "鍾馗": "锺馗", "鎖鍊": "锁链", "鐵鍊": "铁链", "電覆": "电复", "露覆": "露复", "項鍊": "项链", "頗覆": "颇复", "頸鍊": "颈链", "顧藉": "顾借", "煞車": "刹车", "著": "着", "乾": "干", "儘": "尽", "劃": "划", "徵": "征", "於": "于", "瀋": "沈", "瀰": "弥", "畫": "画", "睪": "睾", "綵": "彩", "線": "线", "薹": "苔", "蘋": "苹", "襬": "摆", "託": "托", "諮": "咨", "鈕": "钮", "鉅": "巨", "鍾": "钟", "钁": "镢", "靦": "腼", "餘": "余", "麪": "面", "麴": "曲", "麵": "面", "麼": "么", "麽": "么", "開": "开", "噹": "当", "崙": "仑", "擣": "捣", "牴": "抵", "衹": "只", "諫": "谏", "譾": "谫", "買": "买", "閒": "闲", "願": "愿", "餬": "糊", "餱": "糇", "餵": "喂", "驄": "骢", "鵰": "雕", "齧": "啮", "鍊": "炼", "㑯": "㑔", "㑳": "㑇", "㑶": "㐹", "㓨": "刾", "㘚": "㘎", "㜄": "㚯", "㜏": "㛣", "㠏": "㟆", "㥮": "㤘", "㩜": "㨫", "㩳": "㧐", "䁻": "䀥", "䊷": "䌶", "䋙": "䌺", "䋚": "䌻", "䋹": "䌿", "䋻": "䌾", "䎱": "䎬", "䙡": "䙌", "䜀": "䜧", "䝼": "䞍", "䥇": "䦂", "䥱": "䥾", "䦛": "䦶", "䦟": "䦷", "䯀": "䯅", "䰾": "鲃", "䱷": "䲣", "䱽": "䲝", "䲁": "鳚", "䲘": "鳤", "䴉": "鹮", "丟": "丢", "並": "并", "亂": "乱", "亙": "亘", "亞": "亚", "佇": "伫", "佈": "布", "佔": "占", "併": "并", "來": "来", "侖": "仑", "侶": "侣", "侷": "局", "俁": "俣", "係": "系", "俔": "伣", "俠": "侠", "俥": "伡", "俬": "私", "倀": "伥", "倆": "俩", "倈": "俫", "倉": "仓", "個": "个", "們": "们", "倖": "幸", "倫": "伦", "倲": "㑈", "偉": "伟", "偑": "㐽", "側": "侧", "偵": "侦", "偽": "伪", "傌": "㐷", "傑": "杰", "傖": "伧", "傘": "伞", "備": "备", "傢": "家", "傭": "佣", "傯": "偬", "傳": "传", "傴": "伛", "債": "债", "傷": "伤", "傾": "倾", "僂": "偻", "僅": "仅", "僉": "佥", "僑": "侨", "僕": "仆", "僞": "伪", "僥": "侥", "僨": "偾", "僱": "雇", "價": "价", "儀": "仪", "儁": "俊", "儂": "侬", "億": "亿", "儈": "侩", "儉": "俭", "儐": "傧", "儔": "俦", "儕": "侪", "償": "偿", "優": "优", "儲": "储", "儷": "俪", "儸": "㑩", "儺": "傩", "儻": "傥", "儼": "俨", "兇": "凶", "兌": "兑", "兒": "儿", "兗": "兖", "內": "内", "兩": "两", "冊": "册", "冑": "胄", "冪": "幂", "凈": "净", "凍": "冻", "凜": "凛", "凱": "凯", "別": "别", "刪": "删", "剄": "刭", "則": "则", "剋": "克", "剎": "刹", "剗": "刬", "剛": "刚", "剝": "剥", "剮": "剐", "剴": "剀", "創": "创", "剷": "铲", "劇": "剧", "劉": "刘", "劊": "刽", "劌": "刿", "劍": "剑", "劏": "㓥", "劑": "剂", "劚": "㔉", "勁": "劲", "動": "动", "務": "务", "勛": "勋", "勝": "胜", "勞": "劳", "勢": "势", "勩": "勚", "勱": "劢", "勳": "勋", "勵": "励", "勸": "劝", "勻": "匀", "匭": "匦", "匯": "汇", "匱": "匮", "區": "区", "協": "协", "卹": "恤", "卻": "却", "卽": "即", "厙": "厍", "厠": "厕", "厤": "历", "厭": "厌", "厲": "厉", "厴": "厣", "參": "参", "叄": "叁", "叢": "丛", "吒": "咤", "吳": "吴", "吶": "呐", "呂": "吕", "咼": "呙", "員": "员", "唄": "呗", "唚": "吣", "唸": "念", "問": "问", "啓": "启", "啞": "哑", "啟": "启", "啢": "唡", "喎": "㖞", "喚": "唤", "喪": "丧", "喫": "吃", "喬": "乔", "單": "单", "喲": "哟", "嗆": "呛", "嗇": "啬", "嗊": "唝", "嗎": "吗", "嗚": "呜", "嗩": "唢", "嗶": "哔", "嘆": "叹", "嘍": "喽", "嘓": "啯", "嘔": "呕", "嘖": "啧", "嘗": "尝", "嘜": "唛", "嘩": "哗", "嘮": "唠", "嘯": "啸", "嘰": "叽", "嘵": "哓", "嘸": "呒", "嘽": "啴", "噁": "恶", "噓": "嘘", "噚": "㖊", "噝": "咝", "噠": "哒", "噥": "哝", "噦": "哕", "噯": "嗳", "噲": "哙", "噴": "喷", "噸": "吨", "嚀": "咛", "嚇": "吓", "嚌": "哜", "嚐": "尝", "嚕": "噜", "嚙": "啮", "嚥": "咽", "嚦": "呖", "嚨": "咙", "嚮": "向", "嚲": "亸", "嚳": "喾", "嚴": "严", "嚶": "嘤", "囀": "啭", "囁": "嗫", "囂": "嚣", "囅": "冁", "囈": "呓", "囉": "啰", "囌": "苏", "囑": "嘱", "囪": "囱", "圇": "囵", "國": "国", "圍": "围", "園": "园", "圓": "圆", "圖": "图", "團": "团", "垵": "埯", "埡": "垭", "埰": "采", "執": "执", "堅": "坚", "堊": "垩", "堖": "垴", "堝": "埚", "堯": "尧", "報": "报", "場": "场", "塊": "块", "塋": "茔", "塏": "垲", "塒": "埘", "塗": "涂", "塚": "冢", "塢": "坞", "塤": "埙", "塵": "尘", "塹": "堑", "墊": "垫", "墜": "坠", "墮": "堕", "墰": "坛", "墳": "坟", "墶": "垯", "墻": "墙", "墾": "垦", "壇": "坛", "壋": "垱", "壎": "埙", "壓": "压", "壘": "垒", "壙": "圹", "壚": "垆", "壜": "坛", "壞": "坏", "壟": "垄", "壠": "垅", "壢": "坜", "壩": "坝", "壯": "壮", "壺": "壶", "壼": "壸", "壽": "寿", "夠": "够", "夢": "梦", "夥": "伙", "夾": "夹", "奐": "奂", "奧": "奥", "奩": "奁", "奪": "夺", "奬": "奖", "奮": "奋", "奼": "姹", "妝": "妆", "姍": "姗", "姦": "奸", "娛": "娱", "婁": "娄", "婦": "妇", "婭": "娅", "媧": "娲", "媯": "妫", "媰": "㛀", "媼": "媪", "媽": "妈", "嫋": "袅", "嫗": "妪", "嫵": "妩", "嫺": "娴", "嫻": "娴", "嫿": "婳", "嬀": "妫", "嬃": "媭", "嬈": "娆", "嬋": "婵", "嬌": "娇", "嬙": "嫱", "嬡": "嫒", "嬤": "嬷", "嬪": "嫔", "嬰": "婴", "嬸": "婶", "孃": "娘", "孋": "㛤", "孌": "娈", "孫": "孙", "學": "学", "孿": "孪", "宮": "宫", "寀": "采", "寢": "寝", "實": "实", "寧": "宁", "審": "审", "寫": "写", "寬": "宽", "寵": "宠", "寶": "宝", "將": "将", "專": "专", "尋": "寻", "對": "对", "導": "导", "尷": "尴", "屆": "届", "屍": "尸", "屓": "屃", "屜": "屉", "屢": "屡", "層": "层", "屨": "屦", "屬": "属", "岡": "冈", "峯": "峰", "峴": "岘", "島": "岛", "峽": "峡", "崍": "崃", "崑": "昆", "崗": "岗", "崢": "峥", "崬": "岽", "嵐": "岚", "嵗": "岁", "嶁": "嵝", "嶄": "崭", "嶇": "岖", "嶔": "嵚", "嶗": "崂", "嶠": "峤", "嶢": "峣", "嶧": "峄", "嶨": "峃", "嶮": "崄", "嶴": "岙", "嶸": "嵘", "嶺": "岭", "嶼": "屿", "嶽": "岳", "巋": "岿", "巒": "峦", "巔": "巅", "巖": "岩", "巰": "巯", "巹": "卺", "帥": "帅", "師": "师", "帳": "帐", "帶": "带", "幀": "帧", "幃": "帏", "幗": "帼", "幘": "帻", "幟": "帜", "幣": "币", "幫": "帮", "幬": "帱", "幹": "干", "幾": "几", "庫": "库", "廁": "厕", "廂": "厢", "廄": "厩", "廈": "厦", "廎": "庼", "廕": "荫", "廚": "厨", "廝": "厮", "廟": "庙", "廠": "厂", "廡": "庑", "廢": "废", "廣": "广", "廩": "廪", "廬": "庐", "廳": "厅", "弒": "弑", "弔": "吊", "弳": "弪", "張": "张", "強": "强", "彆": "别", "彈": "弹", "彌": "弥", "彎": "弯", "彔": "录", "彙": "汇", "彞": "彝", "彠": "彟", "彥": "彦", "彫": "雕", "彲": "彨", "彿": "佛", "後": "后", "徑": "径", "從": "从", "徠": "徕", "復": "复", "徹": "彻", "恆": "恒", "恥": "耻", "悅": "悦", "悞": "悮", "悵": "怅", "悶": "闷", "悽": "凄", "惡": "恶", "惱": "恼", "惲": "恽", "惻": "恻", "愛": "爱", "愜": "惬", "愨": "悫", "愴": "怆", "愷": "恺", "愾": "忾", "慄": "栗", "態": "态", "慍": "愠", "慘": "惨", "慚": "惭", "慟": "恸", "慣": "惯", "慤": "悫", "慪": "怄", "慫": "怂", "慮": "虑", "慳": "悭", "慶": "庆", "慼": "戚", "慾": "欲", "憂": "忧", "憊": "惫", "憐": "怜", "憑": "凭", "憒": "愦", "憚": "惮", "憤": "愤", "憫": "悯", "憮": "怃", "憲": "宪", "憶": "忆", "懇": "恳", "應": "应", "懌": "怿", "懍": "懔", "懞": "蒙", "懟": "怼", "懣": "懑", "懨": "恹", "懲": "惩", "懶": "懒", "懷": "怀", "懸": "悬", "懺": "忏", "懼": "惧", "懾": "慑", "戀": "恋", "戇": "戆", "戔": "戋", "戧": "戗", "戩": "戬", "戰": "战", "戱": "戯", "戲": "戏", "戶": "户", "拋": "抛", "挩": "捝", "挱": "挲", "挾": "挟", "捨": "舍", "捫": "扪", "捱": "挨", "捲": "卷", "掃": "扫", "掄": "抡", "掆": "㧏", "掗": "挜", "掙": "挣", "掛": "挂", "採": "采", "揀": "拣", "揚": "扬", "換": "换", "揮": "挥", "損": "损", "搖": "摇", "搗": "捣", "搵": "揾", "搶": "抢", "摑": "掴", "摜": "掼", "摟": "搂", "摯": "挚", "摳": "抠", "摶": "抟", "摺": "折", "摻": "掺", "撈": "捞", "撏": "挦", "撐": "撑", "撓": "挠", "撝": "㧑", "撟": "挢", "撣": "掸", "撥": "拨", "撫": "抚", "撲": "扑", "撳": "揿", "撻": "挞", "撾": "挝", "撿": "捡", "擁": "拥", "擄": "掳", "擇": "择", "擊": "击", "擋": "挡", "擓": "㧟", "擔": "担", "據": "据", "擠": "挤", "擡": "抬", "擬": "拟", "擯": "摈", "擰": "拧", "擱": "搁", "擲": "掷", "擴": "扩", "擷": "撷", "擺": "摆", "擻": "擞", "擼": "撸", "擽": "㧰", "擾": "扰", "攄": "摅", "攆": "撵", "攏": "拢", "攔": "拦", "攖": "撄", "攙": "搀", "攛": "撺", "攜": "携", "攝": "摄", "攢": "攒", "攣": "挛", "攤": "摊", "攪": "搅", "攬": "揽", "敎": "教", "敓": "敚", "敗": "败", "敘": "叙", "敵": "敌", "數": "数", "斂": "敛", "斃": "毙", "斆": "敩", "斕": "斓", "斬": "斩", "斷": "断", "旂": "旗", "旣": "既", "昇": "升", "時": "时", "晉": "晋", "晝": "昼", "暈": "晕", "暉": "晖", "暘": "旸", "暢": "畅", "暫": "暂", "曄": "晔", "曆": "历", "曇": "昙", "曉": "晓", "曏": "向", "曖": "暧", "曠": "旷", "曨": "昽", "曬": "晒", "書": "书", "會": "会", "朧": "胧", "朮": "术", "東": "东", "杴": "锨", "枴": "拐", "柵": "栅", "柺": "拐", "査": "查", "桿": "杆", "梔": "栀", "梘": "枧", "條": "条", "梟": "枭", "梲": "棁", "棄": "弃", "棊": "棋", "棖": "枨", "棗": "枣", "棟": "栋", "棡": "㭎", "棧": "栈", "棲": "栖", "棶": "梾", "椏": "桠", "椲": "㭏", "楊": "杨", "楓": "枫", "楨": "桢", "業": "业", "極": "极", "榘": "矩", "榦": "干", "榪": "杩", "榮": "荣", "榲": "榅", "榿": "桤", "構": "构", "槍": "枪", "槓": "杠", "槤": "梿", "槧": "椠", "槨": "椁", "槮": "椮", "槳": "桨", "槶": "椢", "槼": "椝", "樁": "桩", "樂": "乐", "樅": "枞", "樑": "梁", "樓": "楼", "標": "标", "樞": "枢", "樢": "㭤", "樣": "样", "樫": "㭴", "樳": "桪", "樸": "朴", "樹": "树", "樺": "桦", "樿": "椫", "橈": "桡", "橋": "桥", "機": "机", "橢": "椭", "橫": "横", "檁": "檩", "檉": "柽", "檔": "档", "檜": "桧", "檟": "槚", "檢": "检", "檣": "樯", "檮": "梼", "檯": "台", "檳": "槟", "檸": "柠", "檻": "槛", "櫃": "柜", "櫓": "橹", "櫚": "榈", "櫛": "栉", "櫝": "椟", "櫞": "橼", "櫟": "栎", "櫥": "橱", "櫧": "槠", "櫨": "栌", "櫪": "枥", "櫫": "橥", "櫬": "榇", "櫱": "蘖", "櫳": "栊", "櫸": "榉", "櫺": "棂", "櫻": "樱", "欄": "栏", "欅": "榉", "權": "权", "欏": "椤", "欒": "栾", "欖": "榄", "欞": "棂", "欽": "钦", "歎": "叹", "歐": "欧", "歟": "欤", "歡": "欢", "歲": "岁", "歷": "历", "歸": "归", "歿": "殁", "殘": "残", "殞": "殒", "殤": "殇", "殨": "㱮", "殫": "殚", "殭": "僵", "殮": "殓", "殯": "殡", "殰": "㱩", "殲": "歼", "殺": "杀", "殻": "壳", "殼": "壳", "毀": "毁", "毆": "殴", "毿": "毵", "氂": "牦", "氈": "毡", "氌": "氇", "氣": "气", "氫": "氢", "氬": "氩", "氳": "氲", "氾": "泛", "汎": "泛", "汙": "污", "決": "决", "沒": "没", "沖": "冲", "況": "况", "泝": "溯", "洩": "泄", "洶": "汹", "浹": "浃", "涇": "泾", "涗": "涚", "涼": "凉", "淒": "凄", "淚": "泪", "淥": "渌", "淨": "净", "淩": "凌", "淪": "沦", "淵": "渊", "淶": "涞", "淺": "浅", "渙": "涣", "減": "减", "渢": "沨", "渦": "涡", "測": "测", "渾": "浑", "湊": "凑", "湞": "浈", "湧": "涌", "湯": "汤", "溈": "沩", "準": "准", "溝": "沟", "溫": "温", "溮": "浉", "溳": "涢", "溼": "湿", "滄": "沧", "滅": "灭", "滌": "涤", "滎": "荥", "滙": "汇", "滬": "沪", "滯": "滞", "滲": "渗", "滷": "卤", "滸": "浒", "滻": "浐", "滾": "滚", "滿": "满", "漁": "渔", "漊": "溇", "漚": "沤", "漢": "汉", "漣": "涟", "漬": "渍", "漲": "涨", "漵": "溆", "漸": "渐", "漿": "浆", "潁": "颍", "潑": "泼", "潔": "洁", "潙": "沩", "潛": "潜", "潤": "润", "潯": "浔", "潰": "溃", "潷": "滗", "潿": "涠", "澀": "涩", "澆": "浇", "澇": "涝", "澐": "沄", "澗": "涧", "澠": "渑", "澤": "泽", "澦": "滪", "澩": "泶", "澮": "浍", "澱": "淀", "澾": "㳠", "濁": "浊", "濃": "浓", "濄": "㳡", "濕": "湿", "濘": "泞", "濛": "蒙", "濜": "浕", "濟": "济", "濤": "涛", "濧": "㳔", "濫": "滥", "濰": "潍", "濱": "滨", "濺": "溅", "濼": "泺", "濾": "滤", "瀂": "澛", "瀅": "滢", "瀆": "渎", "瀇": "㲿", "瀉": "泻", "瀏": "浏", "瀕": "濒", "瀘": "泸", "瀝": "沥", "瀟": "潇", "瀠": "潆", "瀦": "潴", "瀧": "泷", "瀨": "濑", "瀲": "潋", "瀾": "澜", "灃": "沣", "灄": "滠", "灑": "洒", "灕": "漓", "灘": "滩", "灝": "灏", "灠": "漤", "灡": "㳕", "灣": "湾", "灤": "滦", "灧": "滟", "灩": "滟", "災": "灾", "為": "为", "烏": "乌", "烴": "烃", "無": "无", "煉": "炼", "煒": "炜", "煙": "烟", "煢": "茕", "煥": "焕", "煩": "烦", "煬": "炀", "煱": "㶽", "熅": "煴", "熒": "荧", "熗": "炝", "熱": "热", "熲": "颎", "熾": "炽", "燁": "烨", "燈": "灯", "燉": "炖", "燒": "烧", "燙": "烫", "燜": "焖", "營": "营", "燦": "灿", "燬": "毁", "燭": "烛", "燴": "烩", "燶": "㶶", "燻": "熏", "燼": "烬", "燾": "焘", "爍": "烁", "爐": "炉", "爛": "烂", "爭": "争", "爲": "为", "爺": "爷", "爾": "尔", "牀": "床", "牆": "墙", "牘": "牍", "牽": "牵", "犖": "荦", "犛": "牦", "犢": "犊", "犧": "牺", "狀": "状", "狹": "狭", "狽": "狈", "猙": "狰", "猶": "犹", "猻": "狲", "獁": "犸", "獃": "呆", "獄": "狱", "獅": "狮", "獎": "奖", "獨": "独", "獪": "狯", "獫": "猃", "獮": "狝", "獰": "狞", "獱": "㺍", "獲": "获", "獵": "猎", "獷": "犷", "獸": "兽", "獺": "獭", "獻": "献", "獼": "猕", "玀": "猡", "現": "现", "琱": "雕", "琺": "珐", "琿": "珲", "瑋": "玮", "瑒": "玚", "瑣": "琐", "瑤": "瑶", "瑩": "莹", "瑪": "玛", "瑲": "玱", "璉": "琏", "璡": "琎", "璣": "玑", "璦": "瑷", "璫": "珰", "璯": "㻅", "環": "环", "璵": "玙", "璸": "瑸", "璽": "玺", "瓊": "琼", "瓏": "珑", "瓔": "璎", "瓚": "瓒", "甌": "瓯", "甕": "瓮", "產": "产", "産": "产", "甦": "苏", "甯": "宁", "畝": "亩", "畢": "毕", "異": "异", "畵": "画", "當": "当", "疇": "畴", "疊": "叠", "痙": "痉", "痠": "酸", "痾": "疴", "瘂": "痖", "瘋": "疯", "瘍": "疡", "瘓": "痪", "瘞": "瘗", "瘡": "疮", "瘧": "疟", "瘮": "瘆", "瘲": "疭", "瘺": "瘘", "瘻": "瘘", "療": "疗", "癆": "痨", "癇": "痫", "癉": "瘅", "癒": "愈", "癘": "疠", "癟": "瘪", "癡": "痴", "癢": "痒", "癤": "疖", "癥": "症", "癧": "疬", "癩": "癞", "癬": "癣", "癭": "瘿", "癮": "瘾", "癰": "痈", "癱": "瘫", "癲": "癫", "發": "发", "皁": "皂", "皚": "皑", "皰": "疱", "皸": "皲", "皺": "皱", "盃": "杯", "盜": "盗", "盞": "盏", "盡": "尽", "監": "监", "盤": "盘", "盧": "卢", "盪": "荡", "眞": "真", "眥": "眦", "眾": "众", "睏": "困", "睜": "睁", "睞": "睐", "瞘": "眍", "瞜": "䁖", "瞞": "瞒", "瞶": "瞆", "瞼": "睑", "矇": "蒙", "矓": "眬", "矚": "瞩", "矯": "矫", "硃": "朱", "硜": "硁", "硤": "硖", "硨": "砗", "硯": "砚", "碕": "埼", "碩": "硕", "碭": "砀", "碸": "砜", "確": "确", "碼": "码", "碽": "䂵", "磑": "硙", "磚": "砖", "磠": "硵", "磣": "碜", "磧": "碛", "磯": "矶", "磽": "硗", "礄": "硚", "礆": "硷", "礎": "础", "礙": "碍", "礦": "矿", "礪": "砺", "礫": "砾", "礬": "矾", "礱": "砻", "祕": "秘", "祿": "禄", "禍": "祸", "禎": "祯", "禕": "祎", "禡": "祃", "禦": "御", "禪": "禅", "禮": "礼", "禰": "祢", "禱": "祷", "禿": "秃", "秈": "籼", "稅": "税", "稈": "秆", "稏": "䅉", "稜": "棱", "稟": "禀", "種": "种", "稱": "称", "穀": "谷", "穇": "䅟", "穌": "稣", "積": "积", "穎": "颖", "穠": "秾", "穡": "穑", "穢": "秽", "穩": "稳", "穫": "获", "穭": "稆", "窩": "窝", "窪": "洼", "窮": "穷", "窯": "窑", "窵": "窎", "窶": "窭", "窺": "窥", "竄": "窜", "竅": "窍", "竇": "窦", "竈": "灶", "竊": "窃", "竪": "竖", "競": "竞", "筆": "笔", "筍": "笋", "筧": "笕", "筴": "䇲", "箇": "个", "箋": "笺", "箏": "筝", "節": "节", "範": "范", "築": "筑", "篋": "箧", "篔": "筼", "篤": "笃", "篩": "筛", "篳": "筚", "簀": "箦", "簍": "篓", "簑": "蓑", "簞": "箪", "簡": "简", "簣": "篑", "簫": "箫", "簹": "筜", "簽": "签", "簾": "帘", "籃": "篮", "籌": "筹", "籔": "䉤", "籙": "箓", "籛": "篯", "籜": "箨", "籟": "籁", "籠": "笼", "籤": "签", "籩": "笾", "籪": "簖", "籬": "篱", "籮": "箩", "籲": "吁", "粵": "粤", "糉": "粽", "糝": "糁", "糞": "粪", "糧": "粮", "糰": "团", "糲": "粝", "糴": "籴", "糶": "粜", "糹": "纟", "糾": "纠", "紀": "纪", "紂": "纣", "約": "约", "紅": "红", "紆": "纡", "紇": "纥", "紈": "纨", "紉": "纫", "紋": "纹", "納": "纳", "紐": "纽", "紓": "纾", "純": "纯", "紕": "纰", "紖": "纼", "紗": "纱", "紘": "纮", "紙": "纸", "級": "级", "紛": "纷", "紜": "纭", "紝": "纴", "紡": "纺", "紬": "䌷", "紮": "扎", "細": "细", "紱": "绂", "紲": "绁", "紳": "绅", "紵": "纻", "紹": "绍", "紺": "绀", "紼": "绋", "紿": "绐", "絀": "绌", "終": "终", "絃": "弦", "組": "组", "絅": "䌹", "絆": "绊", "絎": "绗", "結": "结", "絕": "绝", "絛": "绦", "絝": "绔", "絞": "绞", "絡": "络", "絢": "绚", "給": "给", "絨": "绒", "絰": "绖", "統": "统", "絲": "丝", "絳": "绛", "絶": "绝", "絹": "绢", "綁": "绑", "綃": "绡", "綆": "绠", "綈": "绨", "綉": "绣", "綌": "绤", "綏": "绥", "綐": "䌼", "綑": "捆", "經": "经", "綜": "综", "綞": "缍", "綠": "绿", "綢": "绸", "綣": "绻", "綫": "线", "綬": "绶", "維": "维", "綯": "绹", "綰": "绾", "綱": "纲", "網": "网", "綳": "绷", "綴": "缀", "綸": "纶", "綹": "绺", "綺": "绮", "綻": "绽", "綽": "绰", "綾": "绫", "綿": "绵", "緄": "绲", "緇": "缁", "緊": "紧", "緋": "绯", "緑": "绿", "緒": "绪", "緓": "绬", "緔": "绱", "緗": "缃", "緘": "缄", "緙": "缂", "緝": "缉", "緞": "缎", "締": "缔", "緡": "缗", "緣": "缘", "緦": "缌", "編": "编", "緩": "缓", "緬": "缅", "緯": "纬", "緱": "缑", "緲": "缈", "練": "练", "緶": "缏", "緹": "缇", "緻": "致", "緼": "缊", "縈": "萦", "縉": "缙", "縊": "缢", "縋": "缒", "縐": "绉", "縑": "缣", "縕": "缊", "縗": "缞", "縛": "缚", "縝": "缜", "縞": "缟", "縟": "缛", "縣": "县", "縧": "绦", "縫": "缝", "縭": "缡", "縮": "缩", "縱": "纵", "縲": "缧", "縳": "䌸", "縴": "纤", "縵": "缦", "縶": "絷", "縷": "缕", "縹": "缥", "總": "总", "績": "绩", "繃": "绷", "繅": "缫", "繆": "缪", "繐": "穗", "繒": "缯", "織": "织", "繕": "缮", "繚": "缭", "繞": "绕", "繡": "绣", "繢": "缋", "繩": "绳", "繪": "绘", "繫": "系", "繭": "茧", "繮": "缰", "繯": "缳", "繰": "缲", "繳": "缴", "繸": "䍁", "繹": "绎", "繼": "继", "繽": "缤", "繾": "缱", "繿": "䍀", "纇": "颣", "纈": "缬", "纊": "纩", "續": "续", "纍": "累", "纏": "缠", "纓": "缨", "纔": "才", "纖": "纤", "纘": "缵", "纜": "缆", "缽": "钵", "罈": "坛", "罌": "罂", "罎": "坛", "罰": "罚", "罵": "骂", "罷": "罢", "羅": "罗", "羆": "罴", "羈": "羁", "羋": "芈", "羣": "群", "羥": "羟", "羨": "羡", "義": "义", "羶": "膻", "習": "习", "翬": "翚", "翹": "翘", "翽": "翙", "耬": "耧", "耮": "耢", "聖": "圣", "聞": "闻", "聯": "联", "聰": "聪", "聲": "声", "聳": "耸", "聵": "聩", "聶": "聂", "職": "职", "聹": "聍", "聽": "听", "聾": "聋", "肅": "肃", "脅": "胁", "脈": "脉", "脛": "胫", "脣": "唇", "脩": "修", "脫": "脱", "脹": "胀", "腎": "肾", "腖": "胨", "腡": "脶", "腦": "脑", "腫": "肿", "腳": "脚", "腸": "肠", "膃": "腽", "膕": "腘", "膚": "肤", "膞": "䏝", "膠": "胶", "膩": "腻", "膽": "胆", "膾": "脍", "膿": "脓", "臉": "脸", "臍": "脐", "臏": "膑", "臘": "腊", "臚": "胪", "臟": "脏", "臠": "脔", "臢": "臜", "臥": "卧", "臨": "临", "臺": "台", "與": "与", "興": "兴", "舉": "举", "舊": "旧", "舘": "馆", "艙": "舱", "艤": "舣", "艦": "舰", "艫": "舻", "艱": "艰", "艷": "艳", "芻": "刍", "苧": "苎", "茲": "兹", "荊": "荆", "莊": "庄", "莖": "茎", "莢": "荚", "莧": "苋", "華": "华", "菴": "庵", "菸": "烟", "萇": "苌", "萊": "莱", "萬": "万", "萴": "荝", "萵": "莴", "葉": "叶", "葒": "荭", "葤": "荮", "葦": "苇", "葯": "药", "葷": "荤", "蒐": "搜", "蒓": "莼", "蒔": "莳", "蒕": "蒀", "蒞": "莅", "蒼": "苍", "蓀": "荪", "蓆": "席", "蓋": "盖", "蓮": "莲", "蓯": "苁", "蓴": "莼", "蓽": "荜", "蔔": "卜", "蔘": "参", "蔞": "蒌", "蔣": "蒋", "蔥": "葱", "蔦": "茑", "蔭": "荫", "蕁": "荨", "蕆": "蒇", "蕎": "荞", "蕒": "荬", "蕓": "芸", "蕕": "莸", "蕘": "荛", "蕢": "蒉", "蕩": "荡", "蕪": "芜", "蕭": "萧", "蕷": "蓣", "薀": "蕰", "薈": "荟", "薊": "蓟", "薌": "芗", "薑": "姜", "薔": "蔷", "薘": "荙", "薟": "莶", "薦": "荐", "薩": "萨", "薳": "䓕", "薴": "苧", "薺": "荠", "藍": "蓝", "藎": "荩", "藝": "艺", "藥": "药", "藪": "薮", "藭": "䓖", "藴": "蕴", "藶": "苈", "藹": "蔼", "藺": "蔺", "蘀": "萚", "蘄": "蕲", "蘆": "芦", "蘇": "苏", "蘊": "蕴", "蘚": "藓", "蘞": "蔹", "蘢": "茏", "蘭": "兰", "蘺": "蓠", "蘿": "萝", "虆": "蔂", "處": "处", "虛": "虚", "虜": "虏", "號": "号", "虧": "亏", "虯": "虬", "蛺": "蛱", "蛻": "蜕", "蜆": "蚬", "蝕": "蚀", "蝟": "猬", "蝦": "虾", "蝨": "虱", "蝸": "蜗", "螄": "蛳", "螞": "蚂", "螢": "萤", "螮": "䗖", "螻": "蝼", "螿": "螀", "蟄": "蛰", "蟈": "蝈", "蟎": "螨", "蟣": "虮", "蟬": "蝉", "蟯": "蛲", "蟲": "虫", "蟶": "蛏", "蟻": "蚁", "蠁": "蚃", "蠅": "蝇", "蠆": "虿", "蠍": "蝎", "蠐": "蛴", "蠑": "蝾", "蠔": "蚝", "蠟": "蜡", "蠣": "蛎", "蠨": "蟏", "蠱": "蛊", "蠶": "蚕", "蠻": "蛮", "衆": "众", "衊": "蔑", "術": "术", "衕": "同", "衚": "胡", "衛": "卫", "衝": "冲", "袞": "衮", "裊": "袅", "裏": "里", "補": "补", "裝": "装", "裡": "里", "製": "制", "複": "复", "褌": "裈", "褘": "袆", "褲": "裤", "褳": "裢", "褸": "褛", "褻": "亵", "襆": "幞", "襇": "裥", "襉": "裥", "襏": "袯", "襖": "袄", "襝": "裣", "襠": "裆", "襤": "褴", "襪": "袜", "襯": "衬", "襲": "袭", "襴": "襕", "覈": "核", "見": "见", "覎": "觃", "規": "规", "覓": "觅", "視": "视", "覘": "觇", "覡": "觋", "覥": "觍", "覦": "觎", "親": "亲", "覬": "觊", "覯": "觏", "覲": "觐", "覷": "觑", "覺": "觉", "覽": "览", "覿": "觌", "觀": "观", "觴": "觞", "觶": "觯", "觸": "触", "訁": "讠", "訂": "订", "訃": "讣", "計": "计", "訊": "讯", "訌": "讧", "討": "讨", "訐": "讦", "訒": "讱", "訓": "训", "訕": "讪", "訖": "讫", "記": "记", "訛": "讹", "訝": "讶", "訟": "讼", "訢": "䜣", "訣": "诀", "訥": "讷", "訩": "讻", "訪": "访", "設": "设", "許": "许", "訴": "诉", "訶": "诃", "診": "诊", "註": "注", "証": "证", "詁": "诂", "詆": "诋", "詎": "讵", "詐": "诈", "詒": "诒", "詔": "诏", "評": "评", "詖": "诐", "詗": "诇", "詘": "诎", "詛": "诅", "詞": "词", "詠": "咏", "詡": "诩", "詢": "询", "詣": "诣", "試": "试", "詩": "诗", "詫": "诧", "詬": "诟", "詭": "诡", "詮": "诠", "詰": "诘", "話": "话", "該": "该", "詳": "详", "詵": "诜", "詼": "诙", "詿": "诖", "誄": "诔", "誅": "诛", "誆": "诓", "誇": "夸", "誌": "志", "認": "认", "誑": "诳", "誒": "诶", "誕": "诞", "誘": "诱", "誚": "诮", "語": "语", "誠": "诚", "誡": "诫", "誣": "诬", "誤": "误", "誥": "诰", "誦": "诵", "誨": "诲", "說": "说", "説": "说", "誰": "谁", "課": "课", "誶": "谇", "誹": "诽", "誼": "谊", "誾": "訚", "調": "调", "諂": "谄", "諄": "谆", "談": "谈", "諉": "诿", "請": "请", "諍": "诤", "諏": "诹", "諑": "诼", "諒": "谅", "論": "论", "諗": "谂", "諛": "谀", "諜": "谍", "諝": "谞", "諞": "谝", "諡": "谥", "諢": "诨", "諤": "谔", "諦": "谛", "諧": "谐", "諭": "谕", "諱": "讳", "諳": "谙", "諶": "谌", "諷": "讽", "諸": "诸", "諺": "谚", "諼": "谖", "諾": "诺", "謀": "谋", "謁": "谒", "謂": "谓", "謄": "誊", "謅": "诌", "謊": "谎", "謎": "谜", "謐": "谧", "謔": "谑", "謖": "谡", "謗": "谤", "謙": "谦", "謚": "谥", "講": "讲", "謝": "谢", "謠": "谣", "謡": "谣", "謨": "谟", "謫": "谪", "謬": "谬", "謭": "谫", "謳": "讴", "謹": "谨", "謾": "谩", "譁": "哗", "譅": "䜧", "證": "证", "譎": "谲", "譏": "讥", "譖": "谮", "識": "识", "譙": "谯", "譚": "谭", "譜": "谱", "譟": "噪", "譫": "谵", "譭": "毁", "譯": "译", "議": "议", "譴": "谴", "護": "护", "譸": "诪", "譽": "誉", "讀": "读", "讅": "谉", "變": "变", "讋": "詟", "讌": "䜩", "讎": "雠", "讒": "谗", "讓": "让", "讕": "谰", "讖": "谶", "讚": "赞", "讜": "谠", "讞": "谳", "豈": "岂", "豎": "竖", "豐": "丰", "豔": "艳", "豬": "猪", "豶": "豮", "貓": "猫", "貙": "䝙", "貝": "贝", "貞": "贞", "貟": "贠", "負": "负", "財": "财", "貢": "贡", "貧": "贫", "貨": "货", "販": "贩", "貪": "贪", "貫": "贯", "責": "责", "貯": "贮", "貰": "贳", "貲": "赀", "貳": "贰", "貴": "贵", "貶": "贬", "貸": "贷", "貺": "贶", "費": "费", "貼": "贴", "貽": "贻", "貿": "贸", "賀": "贺", "賁": "贲", "賂": "赂", "賃": "赁", "賄": "贿", "賅": "赅", "資": "资", "賈": "贾", "賊": "贼", "賑": "赈", "賒": "赊", "賓": "宾", "賕": "赇", "賙": "赒", "賚": "赉", "賜": "赐", "賞": "赏", "賠": "赔", "賡": "赓", "賢": "贤", "賣": "卖", "賤": "贱", "賦": "赋", "賧": "赕", "質": "质", "賫": "赍", "賬": "账", "賭": "赌", "賰": "䞐", "賴": "赖", "賵": "赗", "賺": "赚", "賻": "赙", "購": "购", "賽": "赛", "賾": "赜", "贄": "贽", "贅": "赘", "贇": "赟", "贈": "赠", "贊": "赞", "贋": "赝", "贍": "赡", "贏": "赢", "贐": "赆", "贓": "赃", "贔": "赑", "贖": "赎", "贗": "赝", "贛": "赣", "贜": "赃", "赬": "赪", "趕": "赶", "趙": "赵", "趨": "趋", "趲": "趱", "跡": "迹", "踐": "践", "踰": "逾", "踴": "踊", "蹌": "跄", "蹕": "跸", "蹟": "迹", "蹣": "蹒", "蹤": "踪", "蹺": "跷", "躂": "跶", "躉": "趸", "躊": "踌", "躋": "跻", "躍": "跃", "躎": "䟢", "躑": "踯", "躒": "跞", "躓": "踬", "躕": "蹰", "躚": "跹", "躡": "蹑", "躥": "蹿", "躦": "躜", "躪": "躏", "軀": "躯", "車": "车", "軋": "轧", "軌": "轨", "軍": "军", "軑": "轪", "軒": "轩", "軔": "轫", "軛": "轭", "軟": "软", "軤": "轷", "軫": "轸", "軲": "轱", "軸": "轴", "軹": "轵", "軺": "轺", "軻": "轲", "軼": "轶", "軾": "轼", "較": "较", "輅": "辂", "輇": "辁", "輈": "辀", "載": "载", "輊": "轾", "輒": "辄", "輓": "挽", "輔": "辅", "輕": "轻", "輛": "辆", "輜": "辎", "輝": "辉", "輞": "辋", "輟": "辍", "輥": "辊", "輦": "辇", "輩": "辈", "輪": "轮", "輬": "辌", "輯": "辑", "輳": "辏", "輸": "输", "輻": "辐", "輼": "辒", "輾": "辗", "輿": "舆", "轀": "辒", "轂": "毂", "轄": "辖", "轅": "辕", "轆": "辘", "轉": "转", "轍": "辙", "轎": "轿", "轔": "辚", "轟": "轰", "轡": "辔", "轢": "轹", "轤": "轳", "辦": "办", "辭": "辞", "辮": "辫", "辯": "辩", "農": "农", "迴": "回", "逕": "迳", "這": "这", "連": "连", "週": "周", "進": "进", "遊": "游", "運": "运", "過": "过", "達": "达", "違": "违", "遙": "遥", "遜": "逊", "遞": "递", "遠": "远", "遡": "溯", "適": "适", "遲": "迟", "遷": "迁", "選": "选", "遺": "遗", "遼": "辽", "邁": "迈", "還": "还", "邇": "迩", "邊": "边", "邏": "逻", "邐": "逦", "郟": "郏", "郵": "邮", "鄆": "郓", "鄉": "乡", "鄒": "邹", "鄔": "邬", "鄖": "郧", "鄧": "邓", "鄭": "郑", "鄰": "邻", "鄲": "郸", "鄴": "邺", "鄶": "郐", "鄺": "邝", "酇": "酂", "酈": "郦", "醃": "腌", "醖": "酝", "醜": "丑", "醞": "酝", "醣": "糖", "醫": "医", "醬": "酱", "醱": "酦", "釀": "酿", "釁": "衅", "釃": "酾", "釅": "酽", "釋": "释", "釐": "厘", "釒": "钅", "釓": "钆", "釔": "钇", "釕": "钌", "釗": "钊", "釘": "钉", "釙": "钋", "針": "针", "釣": "钓", "釤": "钐", "釦": "扣", "釧": "钏", "釩": "钒", "釵": "钗", "釷": "钍", "釹": "钕", "釺": "钎", "釾": "䥺", "鈀": "钯", "鈁": "钫", "鈃": "钘", "鈄": "钭", "鈅": "钥", "鈈": "钚", "鈉": "钠", "鈍": "钝", "鈎": "钩", "鈐": "钤", "鈑": "钣", "鈒": "钑", "鈔": "钞", "鈞": "钧", "鈡": "钟", "鈣": "钙", "鈥": "钬", "鈦": "钛", "鈧": "钪", "鈮": "铌", "鈰": "铈", "鈳": "钶", "鈴": "铃", "鈷": "钴", "鈸": "钹", "鈹": "铍", "鈺": "钰", "鈽": "钸", "鈾": "铀", "鈿": "钿", "鉀": "钾", "鉆": "钻", "鉈": "铊", "鉉": "铉", "鉋": "铇", "鉍": "铋", "鉑": "铂", "鉕": "钷", "鉗": "钳", "鉚": "铆", "鉛": "铅", "鉞": "钺", "鉢": "钵", "鉤": "钩", "鉦": "钲", "鉬": "钼", "鉭": "钽", "鉶": "铏", "鉸": "铰", "鉺": "铒", "鉻": "铬", "鉿": "铪", "銀": "银", "銃": "铳", "銅": "铜", "銍": "铚", "銑": "铣", "銓": "铨", "銖": "铢", "銘": "铭", "銚": "铫", "銛": "铦", "銜": "衔", "銠": "铑", "銣": "铷", "銥": "铱", "銦": "铟", "銨": "铵", "銩": "铥", "銪": "铕", "銫": "铯", "銬": "铐", "銱": "铞", "銳": "锐", "銷": "销", "銹": "锈", "銻": "锑", "銼": "锉", "鋁": "铝", "鋃": "锒", "鋅": "锌", "鋇": "钡", "鋌": "铤", "鋏": "铗", "鋒": "锋", "鋙": "铻", "鋝": "锊", "鋟": "锓", "鋣": "铘", "鋤": "锄", "鋥": "锃", "鋦": "锔", "鋨": "锇", "鋩": "铓", "鋪": "铺", "鋭": "锐", "鋮": "铖", "鋯": "锆", "鋰": "锂", "鋱": "铽", "鋶": "锍", "鋸": "锯", "鋼": "钢", "錁": "锞", "錄": "录", "錆": "锖", "錇": "锫", "錈": "锩", "錏": "铔", "錐": "锥", "錒": "锕", "錕": "锟", "錘": "锤", "錙": "锱", "錚": "铮", "錛": "锛", "錟": "锬", "錠": "锭", "錡": "锜", "錢": "钱", "錦": "锦", "錨": "锚", "錩": "锠", "錫": "锡", "錮": "锢", "錯": "错", "録": "录", "錳": "锰", "錶": "表", "錸": "铼", "鍀": "锝", "鍁": "锨", "鍃": "锪", "鍆": "钔", "鍇": "锴", "鍈": "锳", "鍋": "锅", "鍍": "镀", "鍔": "锷", "鍘": "铡", "鍚": "钖", "鍛": "锻", "鍠": "锽", "鍤": "锸", "鍥": "锲", "鍩": "锘", "鍬": "锹", "鍰": "锾", "鍵": "键", "鍶": "锶", "鍺": "锗", "鍼": "针", "鎂": "镁", "鎄": "锿", "鎇": "镅", "鎊": "镑", "鎌": "镰", "鎔": "镕", "鎖": "锁", "鎘": "镉", "鎚": "锤", "鎛": "镈", "鎡": "镃", "鎢": "钨", "鎣": "蓥", "鎦": "镏", "鎧": "铠", "鎩": "铩", "鎪": "锼", "鎬": "镐", "鎭": "镇", "鎮": "镇", "鎰": "镒", "鎲": "镋", "鎳": "镍", "鎵": "镓", "鎸": "镌", "鎿": "镎", "鏃": "镞", "鏇": "镟", "鏈": "链", "鏌": "镆", "鏍": "镙", "鏐": "镠", "鏑": "镝", "鏗": "铿", "鏘": "锵", "鏚": "戚", "鏜": "镗", "鏝": "镘", "鏞": "镛", "鏟": "铲", "鏡": "镜", "鏢": "镖", "鏤": "镂", "鏨": "錾", "鏰": "镚", "鏵": "铧", "鏷": "镤", "鏹": "镪", "鏺": "䥽", "鏽": "锈", "鐃": "铙", "鐋": "铴", "鐐": "镣", "鐒": "铹", "鐓": "镦", "鐔": "镡", "鐗": "锏", "鐘": "钟", "鐙": "镫", "鐝": "镢", "鐠": "镨", "鐥": "䦅", "鐦": "锎", "鐧": "锏", "鐨": "镄", "鐫": "镌", "鐮": "镰", "鐯": "䦃", "鐲": "镯", "鐳": "镭", "鐵": "铁", "鐶": "镮", "鐸": "铎", "鐺": "铛", "鐿": "镱", "鑄": "铸", "鑊": "镬", "鑌": "镔", "鑑": "鉴", "鑒": "鉴", "鑔": "镲", "鑕": "锧", "鑞": "镴", "鑠": "铄", "鑣": "镳", "鑥": "镥", "鑭": "镧", "鑰": "钥", "鑱": "镵", "鑲": "镶", "鑷": "镊", "鑹": "镩", "鑼": "锣", "鑽": "钻", "鑾": "銮", "鑿": "凿", "钂": "镋", "镟": "旋", "長": "长", "門": "门", "閂": "闩", "閃": "闪", "閆": "闫", "閈": "闬", "閉": "闭", "閌": "闶", "閎": "闳", "閏": "闰", "閑": "闲", "間": "间", "閔": "闵", "閘": "闸", "閡": "阂", "閣": "阁", "閤": "合", "閥": "阀", "閨": "闺", "閩": "闽", "閫": "阃", "閬": "阆", "閭": "闾", "閱": "阅", "閲": "阅", "閶": "阊", "閹": "阉", "閻": "阎", "閼": "阏", "閽": "阍", "閾": "阈", "閿": "阌", "闃": "阒", "闆": "板", "闇": "暗", "闈": "闱", "闊": "阔", "闋": "阕", "闌": "阑", "闍": "阇", "闐": "阗", "闒": "阘", "闓": "闿", "闔": "阖", "闕": "阙", "闖": "闯", "關": "关", "闞": "阚", "闠": "阓", "闡": "阐", "闢": "辟", "闤": "阛", "闥": "闼", "陘": "陉", "陝": "陕", "陞": "升", "陣": "阵", "陰": "阴", "陳": "陈", "陸": "陆", "陽": "阳", "隉": "陧", "隊": "队", "階": "阶", "隕": "陨", "際": "际", "隨": "随", "險": "险", "隱": "隐", "隴": "陇", "隸": "隶", "隻": "只", "雋": "隽", "雖": "虽", "雙": "双", "雛": "雏", "雜": "杂", "雞": "鸡", "離": "离", "難": "难", "雲": "云", "電": "电", "霢": "霡", "霧": "雾", "霽": "霁", "靂": "雳", "靄": "霭", "靆": "叇", "靈": "灵", "靉": "叆", "靚": "靓", "靜": "静", "靨": "靥", "鞀": "鼗", "鞏": "巩", "鞝": "绱", "鞦": "秋", "鞽": "鞒", "韁": "缰", "韃": "鞑", "韆": "千", "韉": "鞯", "韋": "韦", "韌": "韧", "韍": "韨", "韓": "韩", "韙": "韪", "韜": "韬", "韞": "韫", "韻": "韵", "響": "响", "頁": "页", "頂": "顶", "頃": "顷", "項": "项", "順": "顺", "頇": "顸", "須": "须", "頊": "顼", "頌": "颂", "頎": "颀", "頏": "颃", "預": "预", "頑": "顽", "頒": "颁", "頓": "顿", "頗": "颇", "領": "领", "頜": "颌", "頡": "颉", "頤": "颐", "頦": "颏", "頭": "头", "頮": "颒", "頰": "颊", "頲": "颋", "頴": "颕", "頷": "颔", "頸": "颈", "頹": "颓", "頻": "频", "頽": "颓", "顆": "颗", "題": "题", "額": "额", "顎": "颚", "顏": "颜", "顒": "颙", "顓": "颛", "顔": "颜", "顙": "颡", "顛": "颠", "類": "类", "顢": "颟", "顥": "颢", "顧": "顾", "顫": "颤", "顬": "颥", "顯": "显", "顰": "颦", "顱": "颅", "顳": "颞", "顴": "颧", "風": "风", "颭": "飐", "颮": "飑", "颯": "飒", "颱": "台", "颳": "刮", "颶": "飓", "颸": "飔", "颺": "飏", "颻": "飖", "颼": "飕", "飀": "飗", "飄": "飘", "飆": "飙", "飈": "飚", "飛": "飞", "飠": "饣", "飢": "饥", "飣": "饤", "飥": "饦", "飩": "饨", "飪": "饪", "飫": "饫", "飭": "饬", "飯": "饭", "飱": "飧", "飲": "饮", "飴": "饴", "飼": "饲", "飽": "饱", "飾": "饰", "飿": "饳", "餃": "饺", "餄": "饸", "餅": "饼", "餉": "饷", "養": "养", "餌": "饵", "餎": "饹", "餏": "饻", "餑": "饽", "餒": "馁", "餓": "饿", "餕": "馂", "餖": "饾", "餚": "肴", "餛": "馄", "餜": "馃", "餞": "饯", "餡": "馅", "館": "馆", "餳": "饧", "餶": "馉", "餷": "馇", "餺": "馎", "餼": "饩", "餾": "馏", "餿": "馊", "饁": "馌", "饃": "馍", "饅": "馒", "饈": "馐", "饉": "馑", "饊": "馓", "饋": "馈", "饌": "馔", "饑": "饥", "饒": "饶", "饗": "飨", "饜": "餍", "饞": "馋", "饢": "馕", "馬": "马", "馭": "驭", "馮": "冯", "馱": "驮", "馳": "驰", "馴": "驯", "馹": "驲", "駁": "驳", "駐": "驻", "駑": "驽", "駒": "驹", "駔": "驵", "駕": "驾", "駘": "骀", "駙": "驸", "駛": "驶", "駝": "驼", "駟": "驷", "駡": "骂", "駢": "骈", "駭": "骇", "駰": "骃", "駱": "骆", "駸": "骎", "駿": "骏", "騁": "骋", "騂": "骍", "騅": "骓", "騌": "骔", "騍": "骒", "騎": "骑", "騏": "骐", "騖": "骛", "騙": "骗", "騤": "骙", "騧": "䯄", "騫": "骞", "騭": "骘", "騮": "骝", "騰": "腾", "騶": "驺", "騷": "骚", "騸": "骟", "騾": "骡", "驀": "蓦", "驁": "骜", "驂": "骖", "驃": "骠", "驅": "驱", "驊": "骅", "驌": "骕", "驍": "骁", "驏": "骣", "驕": "骄", "驗": "验", "驚": "惊", "驛": "驿", "驟": "骤", "驢": "驴", "驤": "骧", "驥": "骥", "驦": "骦", "驪": "骊", "驫": "骉", "骯": "肮", "髏": "髅", "髒": "脏", "體": "体", "髕": "髌", "髖": "髋", "髮": "发", "鬆": "松", "鬍": "胡", "鬚": "须", "鬢": "鬓", "鬥": "斗", "鬧": "闹", "鬨": "哄", "鬩": "阋", "鬮": "阄", "鬱": "郁", "鬹": "鬶", "魎": "魉", "魘": "魇", "魚": "鱼", "魛": "鱽", "魢": "鱾", "魨": "鲀", "魯": "鲁", "魴": "鲂", "魷": "鱿", "魺": "鲄", "鮁": "鲅", "鮃": "鲆", "鮊": "鲌", "鮋": "鲉", "鮍": "鲏", "鮎": "鲇", "鮐": "鲐", "鮑": "鲍", "鮒": "鲋", "鮓": "鲊", "鮚": "鲒", "鮜": "鲘", "鮝": "鲞", "鮞": "鲕", "鮣": "䲟", "鮦": "鲖", "鮪": "鲔", "鮫": "鲛", "鮭": "鲑", "鮮": "鲜", "鮳": "鲓", "鮶": "鲪", "鮺": "鲝", "鯀": "鲧", "鯁": "鲠", "鯇": "鲩", "鯉": "鲤", "鯊": "鲨", "鯒": "鲬", "鯔": "鲻", "鯕": "鲯", "鯖": "鲭", "鯗": "鲞", "鯛": "鲷", "鯝": "鲴", "鯡": "鲱", "鯢": "鲵", "鯤": "鲲", "鯧": "鲳", "鯨": "鲸", "鯪": "鲮", "鯫": "鲰", "鯰": "鲶", "鯴": "鲺", "鯷": "鳀", "鯽": "鲫", "鯿": "鳊", "鰁": "鳈", "鰂": "鲗", "鰃": "鳂", "鰆": "䲠", "鰈": "鲽", "鰉": "鳇", "鰌": "䲡", "鰍": "鳅", "鰏": "鲾", "鰐": "鳄", "鰒": "鳆", "鰓": "鳃", "鰛": "鳁", "鰜": "鳒", "鰟": "鳑", "鰠": "鳋", "鰣": "鲥", "鰥": "鳏", "鰧": "䲢", "鰨": "鳎", "鰩": "鳐", "鰭": "鳍", "鰮": "鳁", "鰱": "鲢", "鰲": "鳌", "鰳": "鳓", "鰵": "鳘", "鰷": "鲦", "鰹": "鲣", "鰺": "鲹", "鰻": "鳗", "鰼": "鳛", "鰾": "鳔", "鱂": "鳉", "鱅": "鳙", "鱈": "鳕", "鱉": "鳖", "鱒": "鳟", "鱔": "鳝", "鱖": "鳜", "鱗": "鳞", "鱘": "鲟", "鱝": "鲼", "鱟": "鲎", "鱠": "鲙", "鱣": "鳣", "鱤": "鳡", "鱧": "鳢", "鱨": "鲿", "鱭": "鲚", "鱯": "鳠", "鱷": "鳄", "鱸": "鲈", "鱺": "鲡", "鳥": "鸟", "鳧": "凫", "鳩": "鸠", "鳬": "凫", "鳲": "鸤", "鳳": "凤", "鳴": "鸣", "鳶": "鸢", "鳾": "䴓", "鴆": "鸩", "鴇": "鸨", "鴉": "鸦", "鴒": "鸰", "鴕": "鸵", "鴛": "鸳", "鴝": "鸲", "鴞": "鸮", "鴟": "鸱", "鴣": "鸪", "鴦": "鸯", "鴨": "鸭", "鴯": "鸸", "鴰": "鸹", "鴴": "鸻", "鴷": "䴕", "鴻": "鸿", "鴿": "鸽", "鵁": "䴔", "鵂": "鸺", "鵃": "鸼", "鵐": "鹀", "鵑": "鹃", "鵒": "鹆", "鵓": "鹁", "鵜": "鹈", "鵝": "鹅", "鵠": "鹄", "鵡": "鹉", "鵪": "鹌", "鵬": "鹏", "鵮": "鹐", "鵯": "鹎", "鵲": "鹊", "鵷": "鹓", "鵾": "鹍", "鶄": "䴖", "鶇": "鸫", "鶉": "鹑", "鶊": "鹒", "鶓": "鹋", "鶖": "鹙", "鶘": "鹕", "鶚": "鹗", "鶡": "鹖", "鶥": "鹛", "鶩": "鹜", "鶪": "䴗", "鶬": "鸧", "鶯": "莺", "鶲": "鹟", "鶴": "鹤", "鶹": "鹠", "鶺": "鹡", "鶻": "鹘", "鶼": "鹣", "鶿": "鹚", "鷀": "鹚", "鷁": "鹢", "鷂": "鹞", "鷄": "鸡", "鷈": "䴘", "鷉": "䴘", "鷊": "鹝", "鷓": "鹧", "鷖": "鹥", "鷗": "鸥", "鷙": "鸷", "鷚": "鹨", "鷥": "鸶", "鷦": "鹪", "鷫": "鹔", "鷯": "鹩", "鷲": "鹫", "鷳": "鹇", "鷴": "鹇", "鷸": "鹬", "鷹": "鹰", "鷺": "鹭", "鷽": "鸴", "鷿": "䴙", "鸂": "㶉", "鸇": "鹯", "鸊": "䴙", "鸌": "鹱", "鸏": "鹲", "鸕": "鸬", "鸘": "鹴", "鸚": "鹦", "鸛": "鹳", "鸝": "鹂", "鸞": "鸾", "鹵": "卤", "鹹": "咸", "鹺": "鹾", "鹼": "碱", "鹽": "盐", "麗": "丽", "麥": "麦", "麩": "麸", "麫": "面", "麯": "曲", "黃": "黄", "黌": "黉", "點": "点", "黨": "党", "黲": "黪", "黴": "霉", "黶": "黡", "黷": "黩", "黽": "黾", "黿": "鼋", "鼉": "鼍", "鼕": "冬", "鼴": "鼹", "齇": "齄", "齊": "齐", "齋": "斋", "齎": "赍", "齏": "齑", "齒": "齿", "齔": "龀", "齕": "龁", "齗": "龂", "齙": "龅", "齜": "龇", "齟": "龃", "齠": "龆", "齡": "龄", "齣": "出", "齦": "龈", "齪": "龊", "齬": "龉", "齲": "龋", "齶": "腭", "齷": "龌", "龍": "龙", "龎": "厐", "龐": "庞", "龑": "䶮", "龔": "龚", "龕": "龛", "龜": "龟", "鿁": "䜤", "妳": "你" }; var regexp = new RegExp(Object.keys(aTC2SC).join("|"), "g"); function cht2chs(text) { return text.replace(regexp, (d) => aTC2SC[d]); } // src/runtime/player/closed_caption.css var closed_caption_default = \`/* CC字幕相关样式 */\\r /*对齐,悬停按钮显示菜单*/\\r #subtitle-setting-panel>div>* {\\r margin-right: 5px;\\r }\\r \\r #bilibili-player-subtitle-btn:hover>#subtitle-setting-panel {\\r display: block !important;\\r }\\r \\r /*滑动选择样式*/\\r #subtitle-setting-panel input[type="range"] {\\r background-color: #ebeff4;\\r -webkit-appearance: none;\\r height: 4px;\\r transform: translateY(-4px);\\r }\\r \\r #subtitle-setting-panel input[type="range"]::-webkit-slider-thumb {\\r -webkit-appearance: none;\\r height: 15px;\\r width: 15px;\\r background: #fff;\\r border-radius: 15px;\\r border: 1px solid;\\r }\\r \\r /*复选框和其对应标签样式*/\\r #subtitle-setting-panel input[type="checkbox"] {\\r display: none;\\r }\\r \\r #subtitle-setting-panel input~label {\\r cursor: pointer;\\r }\\r \\r #subtitle-setting-panel input:checked~label:before {\\r content: '\\\\2714';\\r }\\r \\r #subtitle-setting-panel input~label:before {\\r width: 12px;\\r height: 12px;\\r line-height: 14px;\\r vertical-align: text-bottom;\\r border-radius: 3px;\\r border: 1px solid #d3d3d3;\\r display: inline-block;\\r text-align: center;\\r content: ' ';\\r }\\r \\r /*悬停显示下拉框样式*/\\r #subtitle-setting-panel .bpui-selectmenu:hover .bpui-selectmenu-list {\\r display: block;\\r }\\r \\r /*滚动条样式*/\\r #subtitle-setting-panel ::-webkit-scrollbar {\\r width: 7px;\\r }\\r \\r #subtitle-setting-panel ::-webkit-scrollbar-track {\\r border-radius: 4px;\\r background-color: #EEE;\\r }\\r \\r #subtitle-setting-panel ::-webkit-scrollbar-thumb {\\r border-radius: 4px;\\r background-color: #999;\\r }\`; // src/runtime/player/closed_caption.ts var ClosedCaption = class { element = {}; data = {}; resizeRate = 100; subtitle = []; ON = \`<svg width="22" height="28" viewbox="0 0 22 30" xmlns="http://www.w3.org/2000/svg"><path id="svg_1" fill-rule="evenodd" fill="#99a2aa" d="m4.07787,6.88102l14,0a2,2 0 0 1 2,2l0,10a2,2 0 0 1 -2,2l-14,0a2,2 0 0 1 -2,-2l0,-10a2,2 0 0 1 2,-2zm5,5.5a1,1 0 1 0 0,-2l-3,0a2,2 0 0 0 -2,2l0,3a2,2 0 0 0 2,2l3,0a1,1 0 0 0 0,-2l-2,0a1,1 0 0 1 -1,-1l0,-1a1,1 0 0 1 1,-1l2,0zm8,0a1,1 0 0 0 0,-2l-3,0a2,2 0 0 0 -2,2l0,3a2,2 0 0 0 2,2l3,0a1,1 0 0 0 0,-2l-2,0a1,1 0 0 1 -1,-1l0,-1a1,1 0 0 1 1,-1l2,0z"/></svg>\`; OFF = \`<svg width="22" height="28" viewBox="0 0 22 32" xmlns="http://www.w3.org/2000/svg"><path id="svg_1" fill-rule="evenodd" fill="#99a2aa" d="m15.172,21.87103l-11.172,0a2,2 0 0 1 -2,-2l0,-10c0,-0.34 0.084,-0.658 0.233,-0.938l-0.425,-0.426a1,1 0 1 1 1.414,-1.414l15.556,15.556a1,1 0 0 1 -1.414,1.414l-2.192,-2.192zm-10.21,-10.21c-0.577,0.351 -0.962,0.986 -0.962,1.71l0,3a2,2 0 0 0 2,2l3,0a1,1 0 0 0 0,-2l-2,0a1,1 0 0 1 -1,-1l0,-1a1,1 0 0 1 0.713,-0.958l-1.751,-1.752zm1.866,-3.79l11.172,0a2,2 0 0 1 2,2l0,10c0,0.34 -0.084,0.658 -0.233,0.938l-2.48,-2.48a1,1 0 0 0 -0.287,-1.958l-1.672,0l-1.328,-1.328l0,-0.672a1,1 0 0 1 1,-1l2,0a1,1 0 0 0 0,-2l-3,0a2,2 0 0 0 -1.977,1.695l-5.195,-5.195z"/></svg>\`; color = [ { value: "16777215", content: '<span style="color:#FFF;text-shadow: #000 0px 0px 1px">白色</span>' }, { value: "16007990", content: '<b style="color:#F44336;text-shadow: #000 0px 0px 1px">红色</b>' }, { value: "10233776", content: '<b style="color:#9C27B0;text-shadow: #000 0px 0px 1px">紫色</b>' }, { value: "6765239", content: '<b style="color:#673AB7;text-shadow: #000 0px 0px 1px">深紫色</b>' }, { value: "4149685", content: '<b style="color:#3F51B5;text-shadow: #000 0px 0px 1px">靛青色</b>' }, { value: "2201331", content: '<b style="color:#2196F3;text-shadow: #000 0px 0px 1px">蓝色</b>' }, { value: "240116", content: '<b style="color:#03A9F4;text-shadow: #000 0px 0px 1px">亮蓝色</b>' } ]; position = [ { value: "bl", content: "左下角" }, { value: "bc", content: "底部居中" }, { value: "br", content: "右下角" }, { value: "tl", content: "左上角" }, { value: "tc", content: "顶部居中" }, { value: "tr", content: "右上角" } ]; shadow = [ { value: "0", content: "无描边", style: "" }, { value: "1", content: "重墨", style: \`text-shadow: #000 1px 0px 1px, #000 0px 1px 1px, #000 0px -1px 1px,#000 -1px 0px 1px;\` }, { value: "2", content: "描边", style: \`text-shadow: #000 0px 0px 1px, #000 0px 0px 1px, #000 0px 0px 1px;\` }, { value: "3", content: "45°投影", style: \`text-shadow: #000 1px 1px 2px, #000 0px 0px 1px;\` } ]; setting; subtitlePrefer; isON = false; caption; contain; captions = []; text; constructor() { this.setting = { backgroundopacity: 0.5, color: 16777215, fontsize: 1, isclosed: false, scale: true, shadow: "0", position: "bc" }; if (isUserScript) { const d = GM_getValue("subtitle", this.setting); this.setting = new Proxy(d, new ProxyHandler(() => { GM_setValue("subtitle", d); })); } else { GM.getValue("subtitle", this.setting).then((d) => { this.setting = new Proxy(d, new ProxyHandler(() => { GM.setValue("subtitle", d); })); }); } if (isUserScript) { const d = GM_getValue("subtitlePrefer", void 0); this.subtitlePrefer = d; } else { GM.getValue("subtitlePrefer").then((d) => { this.subtitlePrefer = d; }); } } initUI() { this.element.node = document.createElement("div"); this.element.node.setAttribute("class", "bilibili-player-video-btn"); this.element.node.setAttribute("id", "bilibili-player-subtitle-btn"); this.element.node.setAttribute("style", "display: block;"); this.element.span = addElement("span", {}, this.element.node); this.element.span.innerHTML = this.ON; this.isON = true; this.element.span.onclick = () => { if (this.isON) this.iconSwitch(); else this.iconSwitch(this.caption); }; this.element.table = addElement("div", { id: "subtitle-setting-panel", style: "position: absolute; bottom: 28px; right: 30px; background: white; border-radius: 4px; text-align: left; padding: 13px; display: none; cursor: default;" }, this.element.node); this.language(); this.fontsize(); this.fontcolor(); this.fontshadow(); this.fontposition(); this.fontopacrity(); addCss(closed_caption_default); this.changeResize(); this.changePosition(); } changeStyle() { var _a3; (_a3 = document.querySelector("#caption-style")) == null ? void 0 : _a3.remove(); addCss(\`span.subtitle-item-background{opacity: \${this.setting.backgroundopacity};} span.subtitle-item-text {color:#\${("000000" + this.setting.color.toString(16)).slice(-6)};} span.subtitle-item {font-size: \${this.setting.fontsize * this.resizeRate}%;line-height: 110%;} span.subtitle-item {\${this.shadow[this.setting.shadow].style}}\`, "caption-style"); } changeResize() { this.resizeRate = this.setting.scale ? window.player.getWidth() / 1280 * 100 : 100; this.changeStyle(); } changePosition() { this.contain = document.querySelector(".bilibili-player-video-subtitle>div"); if (this.contain) { this.contain.className = "subtitle-position subtitle-position-" + (this.setting.position || "bc"); this.contain.style = ""; } } iconSwitch(caption) { if (caption) { this.isON = true; this.element.span.innerHTML = this.ON; this.setCaption(caption); this.text.innerHTML = caption.lan_doc; this.element.language.children[2].disabled = false; GM.setValue("subtitlePrefer", JSON.parse(JSON.stringify(this.subtitlePrefer = caption.lan))); } else { this.isON = false; this.element.span.innerHTML = this.OFF; this.setCaption(); this.text.innerHTML = "关闭"; this.element.language.children[2].disabled = true; GM.setValue("subtitlePrefer", JSON.parse(JSON.stringify(this.subtitlePrefer = "关闭"))); } } language() { this.element.language = addElement("div", {}, this.element.table); this.element.language.innerHTML = \`<div>字幕</div> <div class="bilibili-player-block-string-type bpui-component bpui-selectmenu selectmenu-mode-absolute" style="width: 100px;"> <div class="bpui-selectmenu-txt">关闭</div> <div class="bpui-selectmenu-arrow bpui-icon bpui-icon-arrow-down"></div> <ul class="bpui-selectmenu-list bpui-selectmenu-list-left" style="max-height: 180px; overflow: hidden auto; white-space: nowrap;"> <li class="bpui-selectmenu-list-row" data-value="close">关闭</li> </ul></div> <button class="bpui-button" style="padding: 0px 8px;">下载</button> <a class="bpui-button" href="https://member.bilibili.com/v2#/zimu/my-zimu/zimu-editor?cid=\${API.cid}&aid=\${API.aid}" target="_blank" title="" style="margin-right: 0px; height: 24px; padding: 0px 6px;">添加字幕</a>\`; let list = this.element.language.children[1].children[2]; this.text = this.element.language.children[1].children[0]; this.element.language.children[2].onclick = () => { this.caption.subtitle_url && fetch(this.caption.subtitle_url).then((d) => { d.blob().then((d2) => { saveAs(d2, \`\${sessionStorage.getItem("title")}-\${this.caption.lan_doc}.json\`); }); }); }; list.children[0].onclick = () => { this.text.innerHTML = "关闭"; this.iconSwitch(); }; this.text.innerHTML = this.caption ? this.caption.lan_doc : "关闭"; this.captions = this.captions.reverse(); this.captions.forEach((d) => { let temp2 = addElement("div", { class: "bpui-selectmenu-list-row", "data-value": d.lan }, list, d.lan_doc, true); temp2.onclick = () => { this.text.innerHTML = d.lan_doc; this.iconSwitch(d); }; }); } fontsize() { this.element.fontsize = addElement("div", {}, this.element.table); this.element.fontsize.innerHTML = \`<div>字体大小</div> <input type="range" step="25" style="width: 70%;"> <input id="subtitle-auto-resize" type="checkbox"> <label for="subtitle-auto-resize" style="cursor: pointer;">自动缩放</label>\`; this.element.fontsize.children[1].value = this.setting.fontsize == 0.6 ? 0 : this.setting.fontsize == 0.8 ? 25 : this.setting.fontsize == 1.3 ? 75 : this.setting.fontsize == 1.6 ? 100 : 50; this.element.fontsize.children[1].oninput = (e) => { const v = e.target.value / 25; this.setting.fontsize = v > 2 ? (v - 2) * 0.3 + 1 : v * 0.2 + 0.6; this.changeStyle(); }; this.element.fontsize.children[2].checked = this.setting.scale; this.element.fontsize.children[2].onchange = (e) => this.changeResize(this.setting.scale = e.target.checked); } fontcolor() { this.element.fontcolor = addElement("div", {}, this.element.table); this.element.fontcolor.innerHTML = \`<span>字幕颜色</span> <div class="bilibili-player-block-string-type bpui-component bpui-selectmenu selectmenu-mode-absolute" style="width: 74%;"> <div class="bpui-selectmenu-txt"><span style="color:#FFF;text-shadow: #000 0px 0px 1px">白色</span></div> <div class="bpui-selectmenu-arrow bpui-icon bpui-icon-arrow-down"></div> <ul class="bpui-selectmenu-list bpui-selectmenu-list-left" style="max-height: 120px; overflow: hidden auto; white-space: nowrap;"></ul> </div>\`; this.color.forEach((d) => { if (d.value == this.setting.color) this.element.fontcolor.children[1].children[0].innerHTML = d.content; let temp2 = addElement("li", { class: "bpui-selectmenu-list-row", "data-value": d.value }, this.element.fontcolor.children[1].children[2]); temp2.innerHTML = d.content; temp2.onclick = () => { this.element.fontcolor.children[1].children[0].innerHTML = d.content; this.changeStyle(this.setting.color = parseInt(d.value)); }; }); } fontshadow() { this.element.fontshadow = addElement("div", {}, this.element.table); this.element.fontshadow.innerHTML = \`<span>字幕描边</span> <div class="bilibili-player-block-string-type bpui-component bpui-selectmenu selectmenu-mode-absolute" style="width: 74%;"> <div class="bpui-selectmenu-txt">无描边</div> <div class="bpui-selectmenu-arrow bpui-icon bpui-icon-arrow-down"></div> <ul class="bpui-selectmenu-list bpui-selectmenu-list-left" style="max-height: 120px; overflow: hidden auto; white-space: nowrap;"></ul> </div>\`; this.shadow.forEach((d) => { if (d.value == this.setting.shadow) this.element.fontshadow.children[1].children[0].innerHTML = d.content; let temp2 = addElement("li", { class: "bpui-selectmenu-list-row", "data-value": d.value }, this.element.fontshadow.children[1].children[2]); temp2.innerHTML = d.content; temp2.onclick = () => { this.element.fontshadow.children[1].children[0].innerHTML = d.content; this.changeStyle(this.setting.shadow = d.value); }; }); } fontposition() { this.element.fontposition = addElement("div", {}, this.element.table); this.element.fontposition.innerHTML = \`<span>字幕位置</span> <div class="bilibili-player-block-string-type bpui-component bpui-selectmenu selectmenu-mode-absolute" style="width: 74%;"> <div class="bpui-selectmenu-txt">底部居中</div> <div class="bpui-selectmenu-arrow bpui-icon bpui-icon-arrow-down"></div> <ul class="bpui-selectmenu-list bpui-selectmenu-list-left" style="max-height: 100px; overflow: hidden auto; white-space: nowrap;"></ul> </div>\`; this.position.forEach((d) => { if (d.value == this.setting.position) this.element.fontposition.children[1].children[0].innerHTML = d.content; let temp2 = addElement("li", { class: "bpui-selectmenu-list-row", "data-value": d.value }, this.element.fontposition.children[1].children[2]); temp2.innerHTML = d.content; temp2.onclick = () => { this.element.fontposition.children[1].children[0].innerHTML = d.content; this.changePosition(this.setting.position = d.value); }; }); } fontopacrity() { this.element.fontopacrity = addElement("div", {}, this.element.table); this.element.fontopacrity.innerHTML = \`<div>背景不透明度</div><input type="range" style="width: 100%;">\`; this.element.fontopacrity.children[1].value = this.setting.backgroundopacity * 100; this.element.fontopacrity.children[1].oninput = (e) => { this.changeStyle(this.setting.backgroundopacity = e.target.value / 100); }; } async getCaption(data) { try { this.data = []; this.subtitle = this.captions = data || []; this.convertion(this.captions); if (this.subtitlePrefer !== "关闭") { let i = this.captions.findIndex((d) => d.lan == this.subtitlePrefer); i = i < 0 ? 0 : i; if (this.captions[i]) await this.setCaption(this.captions[i]); } if (this.captions.length) { window.player.addEventListener("video_resize", (event) => { this.changeResize(event); }); let anchor = document.querySelector(".bilibili-player-video-btn-quality"); this.initUI(); if (!document.querySelector("#bilibili-player-subtitle-btn")) anchor.insertAdjacentElement("afterend", this.element.node); } } catch (e) { debug.error("closedCaption.js", e); } } convertion(arr2) { let chs = false, base = void 0; arr2.forEach((d) => { d.lan && (d.lan === "zh-CN" && (chs = true), d.lan === "zh-Hans" && (chs = true), d.lan.includes("zh") && (base = { ...d })); setting.downloadOther && pushDownload({ group: "CC字幕", url: d.subtitle_url, up: d.lan, down: d.lan_doc, fileName: \`\${sessionStorage.getItem("title") || \`av\${API.aid}\`}-\${d.lan_doc}.json\` }); }); if (chs || !base) return; base.lan = "zh-CN"; base.lan_doc = "中文(繁=>简)"; base.convert = true; arr2.push(base); } async setCaption(caption) { let data = { body: [] }; if (caption && caption.subtitle_url) { this.data[caption.lan] = this.data[caption.lan] || await (await fetch(caption.subtitle_url.replace("http:", "https:"))).json(); if (caption.convert) { this.data[caption.lan] = JSON.parse(cht2chs(JSON.stringify(this.data[caption.lan]))); caption.convert = void 0; } data = this.data[caption.lan] || data; } window.player.updateSubtitle(data); setTimeout(() => { if (window.player.getState() == "PLAYING") { window.player.pause(); window.player.play(); } }, 1e3); if (caption && caption.subtitle_url) { this.caption = caption; videoFloat("载入字幕:", this.caption.lan_doc, () => { }); } else { videoFloat("关闭字幕"); } } }; var closedCaption = new ClosedCaption(); // src/runtime/player/seg_progress.ts var _SegProgress = class { constructor(resp) { if (!resp || resp.length == 0) return; this.init(resp); } async init(view_points) { if (!_SegProgress.cssInited) { _SegProgress.cssInited = true; addCss(\` .bilibili-progress-segmentation-logo{display:inline-block;position:absolute;top:-12px;height:30px;width:1px; transition: opacity .1s} .bilibili-progress-segmentation-logo>img{position: absolute;top:-14px;transform:translate(-50%,-50%) scale(0.7);left:50%;transition:top 0.1s} .bilibili-progress-segmentation-logo>svg{position: absolute;top: -19px;width: 32px;height: 36px;transform: translate(-50%, -50%)} .bilibili-player.mode-widescreen .bilibili-progress-segmentation-logo>img, .bilibili-player.mode-webfullscreen .bilibili-progress-segmentation-logo>img, .bilibili-player.mode-fullscreen .bilibili-progress-segmentation-logo>img{top:-18px;left:50%;transform:translate(-50%,-50%) scale(1)} .bilibili-progress-segmentation{height:29px;position:absolute;top:-12px} .bilibili-progress-segmentation:hover > div > div{border-color:#fb7299;border-style:solid;border-width:0 2px;width:100%;height:3px;top:6px;left:-2px;position:relative;background:#fb7299} .bilibili-progress-segmentation > div{box-sizing:border-box;border-style:solid;border-color:#fb7299;border-left-width:2px;position:absolute;width:100%;height:6px;top:12px} .bilibili-progress-detail-chapter{top:-96px;position:absolute;width:100%;font-size:17px;font-weight:bold;color:#fff;text-shadow:0 0 5px #000} .bilibili-progress-segmentation:last-child > div{border-right-width:2px} .bilibili-player-filter-chapter:hover{color:#00a1d6} .bilibili-player-chapterList{position:relative;height:100%;width:100%;overflow:auto} .bilibili-player-chapterList::-webkit-scrollbar{width:6px} .bilibili-player-chapterList::-webkit-scrollbar-track{border-radius:4px;background-color:#fff} .bilibili-player-chapterList::-webkit-scrollbar-thumb{border-radius:4px;background-color:#fff} .bilibili-player-chapterList:hover::-webkit-scrollbar-track{background-color:#edf2f9} .bilibili-player-chapterList:hover::-webkit-scrollbar-thumb{background-color:#a2a2a2} .bilibili-player-chapter-info{width:100%;height:72px;margin-top:5px;white-space:normal;font-size:14px;position:relative;cursor:pointer} .bilibili-player-chapter-info > img{position:absolute;left:15px;top:4px;border-radius:2px} .bilibili-player-chapter-info > p{padding-top:5px;margin:0 5px 5px 138px;overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3;height:43px} .bilibili-player-chapter-info:hover > p{color:#00a1d6} .bilibili-player-chapter-info > span{color:#99a2aa} .bilibili-player-chapter-info.active{background-color:#f3f3f3}\`); } let sliderTracker = document.querySelector(".bilibili-player-video-progress .bpui-slider-tracker"); let sliderBar = document.getElementsByClassName("bilibili-player-video-progress-bar")[0]; let handleWidth = document.getElementsByClassName("bpui-slider-handle")[0].clientWidth; let trackerWrp = document.getElementsByClassName("bpui-slider-tracker-wrp")[0]; let videoDuration = window.player.getDuration(); let chptName = document.createElement("div"); chptName.className = "bilibili-progress-detail-chapter"; document.querySelector(".bilibili-player-video-progress-detail").appendChild(chptName); let type = view_points[0].type; let segDivs = []; for (let v of view_points) { let seg = document.createElement("div"); if (type == "1") { seg.className = "bilibili-progress-segmentation-logo"; let title = document.createElement("div"); title.innerHTML = "-> " + v.content; title.className = "bilibili-progress-detail-chapter"; title.style.cssText = "width: auto; transform: translateX(-50%); display: none"; let img; if (v.logoUrl) { img = document.createElement("img"); img.id = "segmentation-logo"; img.width = 32; img.height = 36; img.src = v.logoUrl; } else { img = document.createElementNS("http://www.w3.org/2000/svg", "svg"); img.setAttribute("viewBox", "0 -3 32 36"); img.innerHTML = \` <defs> <radialGradient id="gradient"> <stop offset="10%" stop-color="#ffe78f"></stop> <stop offset="40%" stop-color="#ffe996"></stop> <stop offset="95%" stop-color="#fcecae"></stop> </radialGradient> </defs> <path style="fill: rgb(252, 236, 174); stroke: rgb(252, 236, 174);" d="M 16 32.097 C 13.312 32.106 10.608 30.145 11 25.897 C 11.265 22.744 16 17.097 16 17.097 C 16 17.097 20.822 22.697 21.022 25.897 C 21.322 30.097 18.801 32.088 16 32.097 Z" transform="matrix(-1, 0, 0, -1, 32.021761, 49.196602)"></path> <circle cx="16" cy="22" r="5" fill="url(#gradient)"/>\`; } img.addEventListener("mousemove", (e) => e.stopPropagation()); img.addEventListener("mouseenter", () => { title.style.display = ""; img.style.zIndex = "1000"; }); img.addEventListener("mouseleave", () => { title.style.display = "none"; img.style.zIndex = ""; }); img.addEventListener("click", () => window.player.seek(v.from)); seg.appendChild(title); seg.appendChild(img); } else if (type == "2") { seg.className = "bilibili-progress-segmentation"; let duration = view_points[view_points.length - 1].to; let ratio = videoDuration / duration / duration; seg.style.width = (v.to - v.from) * ratio * 100 + "%"; seg.style.left = v.from * ratio * 100 + "%"; seg.innerHTML = "<div><div></div></div>"; seg.onmouseenter = () => chptName.innerHTML = v.content; } segDivs.push(seg); sliderTracker.appendChild(seg); } if (type == "1") { let update2 = function() { for (let i = 0; i < segDivs.length; i++) { segDivs[i].style.left = view_points[i].to / videoDuration * (trackerWrp.clientWidth - handleWidth) + handleWidth / 2 + "px"; } }, hide2 = function() { if (!visibility) return; visibility = false; for (let i = 0; i < segDivs.length; i++) segDivs[i].style.opacity = "0"; setTimeout(() => { for (let i = 0; i < segDivs.length; i++) segDivs[i].style.visibility = "hidden"; }, 100); }; var update = update2, hide = hide2; addCss(\`#app #bilibiliPlayer .bilibili-player-video-progress-detail > .bilibili-player-video-progress-detail-img {top:-120px} .bilibili-player-video-progress-detail > .bilibili-player-video-progress-detail-time {top:-48px}\`); setTimeout(() => update2(), 500); chptName.style.top = "-150px"; let playerArea = document.getElementsByClassName("bilibili-player-area")[0], visibility = true; playerArea.addEventListener("mouseleave", (e) => { hide2(); }); playerArea.addEventListener("mousemove", (e) => { let clientRect = playerArea.getBoundingClientRect(); if (e.pageY < clientRect.top + window.scrollY + clientRect.height * 0.65) { hide2(); } else { visibility = true; for (let i = 0; i < segDivs.length; i++) { segDivs[i].style.visibility = ""; segDivs[i].style.opacity = "1"; } } }); trackerWrp.addEventListener("mousemove", (e) => { let closestPoint = 1e6; let box = sliderBar.getBoundingClientRect(); let pos = (e.pageX - (box.left + window.scrollX - document.body.clientLeft) - handleWidth / 2) / (trackerWrp.clientWidth - handleWidth) * videoDuration; 0 > pos && (pos = 0); pos > videoDuration && (pos = videoDuration); let thumbnailArea = 80 / (trackerWrp.clientWidth - handleWidth) * videoDuration; let hitArea = trackerWrp.clientWidth > 400 ? thumbnailArea / 10 : thumbnailArea / 20; for (let i = 0; i < view_points.length; i++) { segDivs[i].style.zIndex = ""; if (view_points[i].to >= pos - hitArea && view_points[i].to <= pos + hitArea && Math.abs(view_points[i].to - pos) < closestPoint) { chptName.innerHTML = view_points[i].content; closestPoint = Math.abs(view_points[i].to - pos); segDivs[i].style.zIndex = "1000"; } } if (closestPoint == 1e6) chptName.innerHTML = ""; }); window.player.addEventListener("video_player_resize", () => update2()); trackerWrp.addEventListener("mouseleave", () => { for (let i = 0; i < segDivs.length; i++) { segDivs[i].className = "bilibili-progress-segmentation-logo"; } }); } let wrapList = document.querySelector("div.bilibili-player-wraplist"); let panels = wrapList.children; let chptInfo = null; let chptPanel = document.createElement("div"); chptPanel.style.display = "none"; chptPanel.className = "bilibili-player-filter-wrap bilibili-player-chapterList"; wrapList.appendChild(chptPanel); let chptBtn = document.createElement("div"); chptBtn.className = "bilibili-player-filter-btn bilibili-player-filter-chapter bpui-component bpui-button bpui-button-type-small button"; chptBtn.innerHTML = '<span class="bpui-button-text"><span>视频看点</span></span>'; document.querySelector("div.bilibili-player-filter").appendChild(chptBtn); function refreshState() { if (!chptInfo) return; let progress = window.player.getCurrentTime(); for (let i = 0, v; i < view_points.length; i++) { v = view_points[i]; if (progress < v.to) { let active = document.querySelector(".bilibili-player-chapter-info.active"); active && active.classList.remove("active"); chptInfo[i].classList.add("active"); break; } } } let timeFormat2 = (t) => t < 10 ? "0" + t : t; chptBtn.onclick = () => { let activePanel = document.querySelector("div.bilibili-player-filter-btn.active"); if (activePanel == chptBtn) return; activePanel.classList.remove("active"); chptBtn.classList.add("active"); for (let i = 0; i < panels.length; i++) { const element = panels[i]; if (element.style.display == "block") { element.style.display = "none"; break; } } if (!chptInfo) { chptInfo = []; for (let i = 0, v; i < view_points.length; i++) { v = view_points[i]; let dura = v.to - v.from; let div = document.createElement("div"); div.className = "bilibili-player-chapter-info"; div.innerHTML = \`<img width="112" height="63" src="\${v.imgUrl}"/> <p class="chapter-name">\${v.content}</p> <span style="margin-left: 138px">\${timeFormat2(Math.floor(v.from / 60))}:\${timeFormat2(v.from % 60)}</span> <span style="margin-right: 5px; float: right;">\${dura >= 60 ? \`\${Math.floor(dura / 60)}分\` : ""}\${dura > 0 ? \`\${dura % 60}秒\` : ""}</span>\`; div.onclick = ((jumpto) => () => { window.player.seek(jumpto); let active = document.querySelector(".bilibili-player-chapter-info.active"); active && active.classList.remove("active"); div.classList.add("active"); })(v.from); chptInfo[i] = div; chptPanel.appendChild(div); } } ; chptPanel.style.display = "block"; refreshState(); }; window.player.addEventListener("video_media_seeked", refreshState); chptPanel.onmouseenter = refreshState; class timer2 { static handle; static start() { if (!timer2.handle) timer2.handle = setInterval(refreshState, 3e3); } static stop() { if (timer2.handle) { clearInterval(timer2.handle); timer2.handle = null; } } } window.player.addEventListener("video_media_playing", timer2.start); window.player.addEventListener("video_media_pause", timer2.stop); if (window.player.getState() == "PLAYING") timer2.start(); } }; var SegProgress = _SegProgress; __publicField(SegProgress, "cssInited", false); // src/runtime/player/playinfo.ts function dealwithPlayinfo() { xhrhook("/playurl?", (args) => { const param2 = urlObj(args[1]); args[1].includes("84956560bc028eb7") && (args[1] = urlsign(args[1], {}, 8)); args[1].includes("pgc") && (API.pgc = true); param2.aid && (API.aid = Number(param2.aid)) && (API.aid = param2.aid); param2.avid && (API.aid = Number(param2.avid)) && (API.aid = param2.avid); param2.cid && (API.cid = Number(param2.cid)) && (API.cid = param2.cid); param2.seasonId && (API.ssid = param2.seasonId); param2.episodeId && (API.epid = param2.episodeId); param2.ep_id && (API.epid = param2.ep_id); }, (obj) => { try { const data = uposReplace(obj.responseType === "json" ? JSON.stringify(obj.response) : obj.response, setting.uposReplace.nor); obj.responseType === "json" ? obj.response = JSON.parse(data) : obj.response = obj.responseText = data; API.__playinfo__ = JSON.parse(data); Promise.resolve().then(() => { try { const d = JSON.parse(data); if (d.code === 87005) toast.warning(d.message, "请到新版页面付费后继续!"); } catch (e) { } }); } catch (e) { } }, false); let timer2, tag = false; xhrhook("api.bilibili.com/x/player.so", async () => { var _a3, _b; if (!tag && API.th && ((_b = (_a3 = API.__INITIAL_STATE__) == null ? void 0 : _a3.epInfo) == null ? void 0 : _b.subtitles)) { if (API.__INITIAL_STATE__.epInfo.subtitles[0]) { setting.closedCaption && closedCaption.getCaption(API.__INITIAL_STATE__.epInfo.subtitles.reduce((s, d) => { s.push({ ai_type: 0, id: d.id, id_str: d.id, is_lock: false, lan: d.key, lan_doc: d.title, subtitle_url: d.url, type: 0 }); return s; }, [])); tag = true; clearTimeout(timer2); timer2 = setTimeout(() => { tag = false; }, 1e3); } } return true; }, async (res) => { try { if (statusCheck(res.status)) { let subtitle = "", view_points; res.response.replace(/<subtitle>.+?<\\/subtitle>/, (d) => { subtitle = d.replace("<subtitle>", "").replace("</subtitle>", ""); }); res.response.replace(/<view_points>.+?<\\/view_points>/, (d) => { view_points = d.replace("<view_points>", "").replace("</view_points>", ""); }); subtitle && setting.closedCaption && closedCaption.getCaption(JSON.parse(subtitle).subtitles); view_points && setting.segProgress && new SegProgress(JSON.parse(view_points)); } else { !tag && xhr({ url: objUrl("https://api.bilibili.com/x/v2/dm/view", { oid: API.cid, aid: API.aid, type: 1 }), responseType: "json", credentials: true }, true).then((data) => { var _a3, _b; setting.closedCaption && ((_b = (_a3 = data == null ? void 0 : data.data) == null ? void 0 : _a3.subtitle) == null ? void 0 : _b.subtitles) && closedCaption.getCaption(data.data.subtitle.subtitles); setting.segProgress && data.data.view_points && data.data.view_points[1] && new SegProgress(data.data.view_points); }); tag = true; clearTimeout(timer2); timer2 = setTimeout(() => { tag = false; }, 1e3); } } catch (e) { } }, false); xhrhookAsync("api.bilibili.com/x/player/carousel.so", void 0, async () => { let str = \`<msg><item bgcolor="#000000" catalog="news"><![CDATA[<a href="//app.bilibili.com/?from=bfq" target="_blank"><font color="#ffffff">客户端下载</font></a>]]></item><item bgcolor="#000000" catalog="news"><![CDATA[<a href="http://link.acg.tv/forum.php" target="_blank"><font color="#ffffff">bug反馈传送门</font></a>]]></item></msg>'\`; try { const arr2 = await Promise.all([ xhr.get("//api.bilibili.com/pgc/operation/api/slideshow?position_id=531", { responseType: "json" }).then((d) => { return d.result.reduce((s, d2, i) => { s += \`<item tooltip="" bgcolor="#000000" catalog="bangumi" resourceid="2319" srcid="\${2320 + i}" id="\${314825 + i}"><![CDATA[<a href="\${d2.blink}" target="_blank"><font color="#FFFFFF">\${d2.title}</font></a>]]></item>\`; return s; }, ""); }).catch((e) => { debug.error("播放器消息", "bangumi", e); return ""; }), xhr.get("https://api.bilibili.com/x/web-show/res/loc?pf=0&id=4694", { responseType: "json" }).then((d) => { return d.data.reduce((s, d2, i) => { d2.name && (s += \`<item tooltip="" bgcolor="#000000" catalog="system" resourceid="2319" srcid="\${2320 + i}" id="\${314825 + i}"><![CDATA[<a href="\${d2.url}" target="_blank"><font color="#FFFFFF">\${d2.name}</font></a>]]></item>\`); return s; }, ""); }).catch((e) => { debug.error("播放器消息", "system", e); return ""; }), xhr.get("https://api.bilibili.com/x/web-interface/search/square?limit=10", { responseType: "json" }).then((d) => { return d.data.trending.list.reduce((s, d2, i) => { s += \`<item tooltip="" bgcolor="#000000" catalog="news" resourceid="2319" srcid="\${2320 + i}" id="\${314825 + i}"><![CDATA[<a href="https://search.bilibili.com/all?keyword=\${encodeURIComponent(d2.keyword)}" target="_blank"><font color="#FFFFFF">\${d2.keyword}</font></a>]]></item>\`; return s; }, "<msg>"); }).catch((e) => { debug.error("播放器消息", "news", e); return ""; }) ]); str = arr2.sort(() => 0.5 - Math.random()).reduce((s, d) => { s += d; return s; }, "<msg>") + "</msg>"; } catch (e) { debug.error("播放器消息", e); } const dom = new DOMParser().parseFromString(str, "text/xml"); return { response: dom, responseXML: dom }; }, false); } // src/runtime/player/bstar_playurl.ts var descriptionMap = { 127: "超高清 8K", 126: "杜比视界", 125: "HDR", 121: "超清 4K", 120: "超清 4K", 116: "高清 1080P60", 112: "高清 1080P+", 80: "高清 1080P", 74: "高清 720P60", 64: "高清 720P", 48: "高清 720P", 32: "清晰 480P", 16: "流畅 360P", 15: "流畅 360P", 6: "流畅 240P", 5: "流畅 144P" }; var formatMap = { 127: "hdflv2", 126: "hdflv2", 125: "hdflv2", 121: "hdflv2", 120: "hdflv2", 116: "flv_p60", 112: "hdflv2", 80: "flv", 74: "flv720_p60", 64: "flv720", 48: "flv720", 32: "flv480", 16: "mp4", 15: "mp4", 6: "mp4", 5: "mp4" }; var qualityMap = { 127: "8K", 126: "Dolby", 125: "HDR", 121: "4K", 120: "4K", 116: "1080P60", 112: "1080P+", 80: "1080P", 74: "720P60", 64: "720P", 48: "720P", 32: "480P", 16: "360P", 15: "360P", 6: "240P", 5: "144P" }; var Playurl = class { accept_description = []; accept_format = ""; accept_quality = []; bp = 0; code = 0; dash = { audio: [], dolby: { audio: [], type: "NONE" }, duration: 0, min_buffer_time: 1.5, minBufferTime: 1.5, video: [] }; fnval = 0; fnver = 0; format = "flv480"; from = "local"; has_paid = false; is_preview = 0; message = ""; no_rexcode = 1; quality = 32; result = "suee"; seek_param = "start"; seek_type = "offset"; status = 2; support_formats = []; timelength = 0; type = "DASH"; video_codecid = 7; video_project = true; }; var codecs = { default: { 30121: "hev1.1.6.L156.90", 121: "hev1.1.6.L156.90", 30120: "avc1.64003C", 120: "avc1.64003C", 30112: "avc1.640028", 112: "avc1.640028", 30102: "hev1.1.6.L120.90", 102: "hev1.1.6.L120.90", 30080: "avc1.640028", 80: "avc1.640028", 30077: "hev1.1.6.L120.90", 77: "hev1.1.6.L120.90", 30064: "avc1.64001F", 64: "avc1.64001F", 30066: "hev1.1.6.L120.90", 66: "hev1.1.6.L120.90", 30032: "avc1.64001E", 32: "avc1.64001E", 30033: "hev1.1.6.L120.90", 33: "hev1.1.6.L120.90", 30011: "hev1.1.6.L120.90", 11: "hev1.1.6.L120.90", 30016: "avc1.64001E", 16: "avc1.64001E", 30006: "avc1.64001E", 6: "avc1.64001E", 30005: "avc1.64001E", 5: "avc1.64001E", 30280: "mp4a.40.2", 30232: "mp4a.40.2", 30216: "mp4a.40.2" }, app: { 30016: "avc1.64001E", 16: "avc1.64001E", 30032: "avc1.64001F", 32: "avc1.64001F", 30064: "avc1.640028", 64: "avc1.640028", 30080: "avc1.640032", 80: "avc1.640032", 30216: "mp4a.40.2", 30232: "mp4a.40.2", 30280: "mp4a.40.2" } }; var frameRate = { 30121: "16000/672", 121: "16000/672", 30120: "16000/672", 120: "16000/672", 30112: "16000/672", 112: "16000/672", 30102: "16000/672", 102: "16000/672", 30080: "16000/672", 80: "16000/672", 30077: "16000/656", 77: "16000/656", 30064: "16000/672", 64: "16000/672", 30066: "16000/656", 66: "16000/656", 30032: "16000/672", 32: "16000/672", 30033: "16000/656", 33: "16000/656", 30011: "16000/656", 11: "16000/656", 30016: "16000/672", 16: "16000/672", 30006: "16000/672", 6: "16000/672", 30005: "16000/672", 5: "16000/672" }; var resolution = { 30121: [3840, 2160], 121: [3840, 2160], 30120: [3840, 2160], 120: [3840, 2160], 30112: [1920, 1080], 112: [1920, 1080], 30102: [1920, 1080], 102: [1920, 1080], 30080: [1920, 1080], 80: [1920, 1080], 30077: [1920, 1080], 77: [1920, 1080], 30064: [1280, 720], 64: [1280, 720], 30066: [1280, 720], 66: [1280, 720], 30032: [852, 480], 32: [852, 480], 30033: [852, 480], 33: [852, 480], 30011: [640, 360], 11: [640, 360], 30016: [640, 360], 16: [640, 360], 30006: [426, 240], 6: [426, 240], 30005: [256, 144], 5: [256, 144] }; function getIdxs(url, duration) { let range = Math.round(duration * 3.5); range = range < 6e3 ? 6e3 : range; return xhr({ url: url.replace("http:", "https:"), responseType: "arraybuffer", headers: { "Range": \`bytes=0-\${range}\` } }); } var OBJ = {}; async function bstarPlayurl(ogv) { const playurl = new Playurl(); const set = []; playurl.quality = ogv.data.video_info.stream_list[0].stream_info.quality || ogv.data.video_info.quality; playurl.format = formatMap[playurl.quality]; playurl.timelength = ogv.data.video_info.timelength; playurl.dash.duration = Math.ceil(playurl.timelength / 1e3); playurl.dash.minBufferTime = playurl.dash.min_buffer_time = 1.5; await Promise.all(ogv.data.video_info.stream_list.reduce((s, d, i) => { if (d.dash_video && d.dash_video.base_url) { s.push((async (d2) => { OBJ[\`sidx\${API.cid}\`] || (OBJ[\`sidx\${API.cid}\`] = {}); const id = d2.stream_info.quality || d2.dash_video.base_url.match(/[0-9]+\\.m4s/)[0].split(".")[0]; playurl.accept_description.push(descriptionMap[id]); set.push(formatMap[id]); playurl.accept_quality.push(id); playurl.support_formats.push({ description: descriptionMap[id], display_desc: qualityMap[id], format: formatMap[id], new_description: descriptionMap[id], quality: id, superscript: "" }); if (!OBJ[\`sidx\${API.cid}\`][id]) { let data = new Uint8Array(await getIdxs(d2.dash_video.base_url, playurl.dash.duration)); let hex_data = Array.prototype.map.call(data, (x) => ("00" + x.toString(16)).slice(-2)).join(""); let indexRangeStart = hex_data.indexOf("73696478") / 2 - 4; let indexRagneEnd = hex_data.indexOf("6d6f6f66") / 2 - 5; OBJ[\`sidx\${API.cid}\`][id] = ["0-" + String(indexRangeStart - 1), String(indexRangeStart) + "-" + String(indexRagneEnd)]; debug("DASH-video:", id, OBJ[\`sidx\${API.cid}\`][id]); } playurl.dash.video.push({ SegmentBase: { Initialization: OBJ[\`sidx\${API.cid}\`][id][0], indexRange: OBJ[\`sidx\${API.cid}\`][id][1] }, segment_base: { initialization: OBJ[\`sidx\${API.cid}\`][id][0], index_range: OBJ[\`sidx\${API.cid}\`][id][1] }, backupUrl: [], backup_url: [], bandwidth: d2.dash_video.bandwidth, baseUrl: d2.dash_video.base_url, base_url: d2.dash_video.base_url, codecid: d2.dash_video.codecid, codecs: codecs.app[id] || codecs.default[id], frameRate: frameRate[id], frame_rate: frameRate[id], height: resolution[id] && resolution[id][1], id: d2.stream_info.quality, md5: d2.dash_video.md5, mimeType: "video/mp4", mime_type: "video/mp4", sar: "1:1", size: d2.dash_video.size, startWithSAP: 1, start_with_sap: 1, width: resolution[id] && resolution[id][0] }); })(d)); } !i && ogv.data.video_info.dash_audio.forEach((d2) => { s.push((async (d3) => { OBJ[\`sidx\${API.cid}\`] || (OBJ[\`sidx\${API.cid}\`] = {}); const id = d3.id || d3.base_url.match(/[0-9]+\\.m4s/)[0].split(".")[0]; if (!OBJ[\`sidx\${API.cid}\`][id]) { let data = new Uint8Array(await getIdxs(d3.base_url, playurl.dash.duration)); let hex_data = Array.prototype.map.call(data, (x) => ("00" + x.toString(16)).slice(-2)).join(""); let indexRangeStart = hex_data.indexOf("73696478") / 2 - 4; let indexRagneEnd = hex_data.indexOf("6d6f6f66") / 2 - 5; OBJ[\`sidx\${API.cid}\`][id] = ["0-" + String(indexRangeStart - 1), String(indexRangeStart) + "-" + String(indexRagneEnd)]; debug("DASH-video:", id, OBJ[\`sidx\${API.cid}\`][id]); } playurl.dash.audio.push({ SegmentBase: { Initialization: OBJ[\`sidx\${API.cid}\`][id][0], indexRange: OBJ[\`sidx\${API.cid}\`][id][1] }, segment_base: { initialization: OBJ[\`sidx\${API.cid}\`][id][0], index_range: OBJ[\`sidx\${API.cid}\`][id][1] }, backupUrl: [], backup_url: [], bandwidth: d3.bandwidth, baseUrl: d3.base_url, base_url: d3.base_url, codecid: d3.codecid, codecs: codecs.app[id] || codecs.default[id], frameRate: "", frame_rate: "", height: 0, id, md5: d3.md5, mimeType: "audio/mp4", mime_type: "audio/mp4", sar: "", size: d3.size, startWithSAP: 0, start_with_sap: 0, width: 0 }); })(d2)); }); return s; }, [])); const avc = [], hev = [], video = []; playurl.dash.video.forEach((d) => { if (d.codecid == 7) avc.push(d); else hev.push(d); }); let length = avc.length > hev.length ? avc.length : hev.length; for (let i = length - 1; i >= 0; i--) { if (avc[i]) video.push(avc[i]); if (hev[i]) video.push(hev[i]); } playurl.dash.video = video; playurl.accept_format = set.join(","); playurl.quality > 80 && (playurl.quality = 80); return playurl; } // src/tampermonkey/upos_gm.ts var isHooking = false; function defineRes(target, res, v) { Object.defineProperties(target, { status: { configurable: true, writable: true, value: res.status }, statusText: { configurable: true, writable: true, value: res.statusText }, response: { configurable: true, writable: true, value: res.response }, responseText: { configurable: true, writable: true, value: res.responseText }, responseXML: { configurable: true, writable: true, value: res.responseXML }, responseURL: { configurable: true, writable: true, value: res.finalUrl } }); v(); } function uposWithGM(url = ".m4s", UserAgent = setting.userAgent) { if (isHooking) return; xhrhookUltra(url, function(target, args) { const obj = { method: args[0], url: args[1], headers: { "user-agent": UserAgent }, onloadstart: (res) => { defineRes(this, res, () => { }); } }; args[2] || (obj.anonymous = true); Object.defineProperties(this, { responseType: { configurable: true, set: (v) => { obj.responseType = v; }, get: () => obj.responseType }, onload: { configurable: true, set: (v) => { obj.onload = (res) => { defineRes(this, res, v); }; }, get: () => obj.onload }, onerror: { configurable: true, set: (v) => { obj.onerror = (res) => { defineRes(this, res, v); }; }, get: () => obj.onerror }, timeout: { configurable: true, set: (v) => { obj.timeout = v; }, get: () => obj.timeout }, ontimeout: { configurable: true, set: (v) => { obj.ontimeout = (res) => { defineRes(this, res, v); }; }, get: () => obj.ontimeout }, onprogress: { configurable: true, set: (v) => { obj.onprogress = (res) => { defineRes(this, res, v.bind(this, new ProgressEvent("progress", { lengthComputable: res.lengthComputable, loaded: res.loaded, total: res.total }))); }; }, get: () => obj.onprogress }, onabort: { configurable: true, set: (v) => { obj.onabort = (res) => { defineRes(this, res, v); }; }, get: () => obj.onabort }, onreadystatechange: { configurable: true, set: (v) => { obj.onreadystatechange = (res) => { defineRes(this, res, v); }; }, get: () => obj.onreadystatechange }, setRequestHeader: { configurable: true, value: (name, value) => { obj.headers && (obj.headers[name] = value); } }, send: { configurable: true, value: (body) => { obj.method === "POST" && body && (obj.data = body); const tar = GM_xmlhttpRequest(obj); this.abort = tar.abort.bind(tar); return true; } } }); }); isHooking = true; } // src/runtime/player/video_limit.ts var Backup = {}; var HookTimeOut = class { hook; constructor() { this.hook = setTimeout; window.setTimeout = (...args) => { if (args[1] && args[1] == 1500 && args[0] && args[0].toString() == "function(){f.cz()}") { toast.warning("禁用播放器强制初始化!", ...args); return Number.MIN_VALUE; } return this.hook.call(window, ...args); }; } relese() { window.setTimeout = this.hook; } }; async function customServer(obj, area) { if (area === "tw" && !setting.videoLimit.tw) return customServer(obj, "hk"); if (area === "hk" && !setting.videoLimit.hk) return customServer(obj, "cn"); if (area === "cn" && !setting.videoLimit.cn) throw "无有效代理服务器地址"; try { Object.assign(obj, { area, build: 6720300, device: "android", force_host: 2, mobi_app: "android", platform: "android", ts: new Date().getTime() }); const result = jsonCheck(await xhr({ url: urlsign(\`https://\${setting.videoLimit[area]}/pgc/player/api/playurl\`, obj, 2) })); if (result.code !== 0) throw result; return result; } catch (e) { debug.error("代理服务器", setting.videoLimit[area], e); if (area === "tw") return customServer(obj, "hk"); if (area === "hk") return customServer(obj, "cn"); toast.error("代理服务器", setting.videoLimit[area], e); throw "所有代理服务器都已失败!"; } } function videoLimit() { xhrhookAsync("/playurl?", () => API.limit || API.th, async (args, type) => { var _a3, _b, _c, _d; let response; const obj = urlObj(args[1]); obj.seasonId && (API.ssid = obj.seasonId); obj.episodeId && (API.epid = obj.episodeId); obj.ep_id && (API.epid = obj.ep_id); obj.aid && (API.aid = Number(obj.aid)) && (API.aid = obj.aid); obj.avid && (API.aid = Number(obj.avid)) && (API.aid = obj.avid); obj.cid && (API.cid = Number(obj.cid)) && (API.cid = obj.cid); const hookTimeout = new HookTimeOut(); const epid = obj.ep_id || obj.episodeId || API.epid; const accesskey = setting.accessKey.key || void 0; obj.access_key = accesskey; Backup[epid] && (response = Backup[epid]); if (!response) { if (API.th) { isUserScript && uposWithGM(); Object.assign(obj, { area: "th", build: 1001310, device: "android", force_host: 2, download: 1, mobi_app: "bstar_a", platform: "android", ts: new Date().getTime() }); try { toast.info("尝试解除区域限制... 访问代理服务器"); response = jsonCheck(uposReplace(await xhr({ url: urlsign(\`https://\${setting.videoLimit.th || "api.global.bilibili.com"}/intl/gateway/v2/ogv/playurl\`, obj, 12) }), setting.uposReplace.th)); response = { "code": 0, "message": "success", "result": await bstarPlayurl(response) }; toast.success(\`解除区域限制!aid=\${API.aid}, cid=\${API.cid}\`); } catch (e) { toast.error("解除限制失败 ಥ_ಥ"); debug.error("解除限制失败 ಥ_ಥ", e); if (!accesskey) { toast.warning("这似乎是一个泰区限制视频,需要授权解析服务器使用您的账户才能尝试解析,请到设置里进行【账户授权】。<strong>但这意味着解析服务器会获得您账户的部分权限,请务必确认对反的可靠性然后操作!</strong>"); } response = { "code": -404, "message": e, "data": null }; } } else if (API.limit) { isUserScript && setting.uposReplace.gat !== "不替换" && uposWithGM(); obj.module = ((_b = (_a3 = window.__INITIAL_STATE__) == null ? void 0 : _a3.upInfo) == null ? void 0 : _b.mid) == 1988098633 || ((_d = (_c = window.__INITIAL_STATE__) == null ? void 0 : _c.upInfo) == null ? void 0 : _d.mid) == 2042149112 ? "movie" : "bangumi"; obj.fnval && (obj.fnval = String(fnval)); try { toast.info("尝试解除区域限制... 访问代理服务器"); setting.uposReplace.gat !== "不替换" && window.postMessage({ \$type: "th" }); response = setting.videoLimit.server === "内置" ? jsonCheck(await xhr({ url: objUrl("https://www.biliplus.com/BPplayurl.php", obj) })) : (delete obj.module, await customServer(obj, "tw")); response = JSON.parse(uposReplace(JSON.stringify(response), setting.uposReplace.gat)); response = { "code": 0, "message": "success", "result": response }; toast.success(\`解除区域限制!aid=\${API.aid}, cid=\${API.cid}\`); } catch (e) { toast.error("解除限制失败 ಥ_ಥ"); debug.error("解除限制失败 ಥ_ಥ", e); if (setting.videoLimit.server === "自定义") { toast.warning("您将代理服务器设置为【自定义】,服务器返回出错,这可能是您由于未进行【账户授权】或者授权过期,请到设置里进行【账户授权】。"); } response = { "code": -404, "message": e, "data": null }; } } } hookTimeout.relese(); if (response.code === -404) throw type === "json" ? { response } : { response: JSON.stringify(response), responseText: JSON.stringify(response) }; Backup[epid] = response; API.__playinfo__ = response; return type === "json" ? { response } : { response: JSON.stringify(response), responseText: JSON.stringify(response) }; }, false); } // src/runtime/player/load_bilibili_player.ts async function loadBilibiliPlayer() { var _a3; if (!window.jQuery) await loadScript("//static.hdslb.com/js/jquery.min.js"); if (isUserScript) { const player2 = GM_getResourceText("bilibiliPlayer.js"); (_a3 = window.player) == null ? void 0 : _a3.pause(); Reflect.deleteProperty(window, "player"); if (player2) return new Function(GM_getResourceText("bilibiliPlayer.js"))(); return loadScript("//static.hdslb.com/player/js/bilibiliPlayer.min.js").then(() => { toast.warning("bilibiliPlayer.min.js 已回滚~", "当前可能无法访问 jsdelivr !", "反查弹幕发送者等部分播放器增强功能暂时无法使用🤣"); }); } addCssEs("bilibili/bilibiliPlayer.css"); return await loadScript(\`chrome-extension://\${sessionStorage.getItem("bilibili-old")}/bilibili/bilibiliPlayer.js\`); } // src/runtime/player/flac_switch.ts var FlacSwitch = class { constructor() { if (setting.flacEnabled == void 0) { setting.flacEnabled = true; } window.flac = { enabled: setting.flacEnabled, init: () => { this.initUI(); } }; } initUI() { if (document.querySelector("#bilibili-player-flac-btn")) return; let anchor = document.querySelector(".bilibili-player-video-btn-quality"); let btn = document.createElement("div"); btn.setAttribute("class", "bilibili-player-video-btn"); btn.setAttribute("id", "bilibili-player-flac-btn"); btn.setAttribute("style", "display: block; width: 35px; position: relative"); btn.innerHTML = "<div>FLAC</div>"; addCss(\` #bilibili-player-flac-btn.on > div::after { content: ""; position: absolute; top: 20%; left: 0; width: 100%; height: 57%; background-image: linear-gradient(120deg, #dedfce, #6594a3); opacity: 0.5; border-radius: 5px; } \`, "flacBtnCss"); if (setting.flacEnabled) { btn.classList.add("on"); } btn.onclick = () => { window.flac.enabled = setting.flacEnabled = !setting.flacEnabled; btn.setAttribute("class", setting.flacEnabled ? "bilibili-player-video-btn on" : "bilibili-player-video-btn"); window.reloadMedia((succeed) => { if (succeed) videoFloat(\`已\${setting.flacEnabled ? "启用" : "关闭"}HiRes 音频\`); else videoFloat(\`\${setting.flacEnabled ? "启用" : "关闭"}HiRes 音频出错!\`); }); }; if (!document.querySelector("#bilibili-player-flac-btn")) anchor.insertAdjacentElement("beforebegin", btn); } }; // src/runtime/player/embed_player.ts var _EmbedPlayer = class { playerParam; playerType; upgrade; callbackFn; flashAddEvents = []; flashRemoveEvents = []; pageno = void 0; bofqi = document.querySelector("#bofqi"); get gray_html5() { return !setting.flash; } set gray_html5(v) { setting.flash = !v; } constructor(player2, swf, playerParams, playerType, upgrade, callbackFn, bofqi) { this.playerParam = urlObj(\`?\${playerParams}\`); this.playerParam.dashSymbol = true; this.playerType = playerType; this.upgrade = upgrade; this.callbackFn = callbackFn; const urlParam2 = urlObj(location.href); urlParam2.d && (this.playerParam.d = urlParam2.d); urlParam2.t && (this.playerParam.t = urlParam2.t); urlParam2.start_progress && (this.playerParam.start_progress = urlParam2.start_progress); urlParam2.lastplaytime && (this.playerParam.lastplaytime = urlParam2.lastplaytime); Object.entries(this.playerParam).forEach((d) => { Reflect.set(window, ...d); }); this.playerParam.seasonId && (API.ssid = this.playerParam.seasonId); this.playerParam.episodeId && (API.epid = this.playerParam.episodeId); (_EmbedPlayer.asWide || setting.automate.screenWide) && (this.playerParam.as_wide = 1); setting.automate.autoPlay && (this.playerParam.autoplay = 1); this.gray_loader(); API.playerParam = this.playerParam; } loadScript(src, onload) { const script = document.createElement("script"); script.type = "text/javascript"; script.src = src; script.addEventListener("load", () => { script.remove(); onload && onload(); }); script.addEventListener("error", (e) => { script.remove(); toast.error("加载播放器脚本失败!", e.message); }); document.body.appendChild(script); } loadHtml5Player() { if (!window.bilibiliPlayer) { loadBilibiliPlayer().then(() => { this.bofqi.innerHTML = '<div class="player"><div id="bilibiliPlayer"></div></div><div id="player_placeholder"></div>'; window.player = new window.bilibiliPlayer(this.playerParam); this.gray_html5_compatible(); }); } else { this.bofqi.innerHTML = '<div class="player"><div id="bilibiliPlayer"></div></div><div id="player_placeholder"></div>'; window.player = new window.bilibiliPlayer(this.playerParam); this.gray_html5_compatible(); } } eventMaps = { "jwplayerMediaBuffer": "video_media_buffer", "jwplayerMediaBufferFull": "video_media_buffer_full", "jwplayerMediaComplete": "video_media_ended", "jwplayerMediaError": "video_media_error", "jwplayerMediaLoaded": "video_media_loaded", "jwplayerMediaMute": "video_media_mute", "jwplayerMediaSeek": "video_media_seek", "jwplayerMediaTime": "video_media_time", "jwplayerMediaVolume": "video_media_volume" }; apiMaps = { "mukio_reloadAccess": "reloadAccess", "jwPlay": "play", "jwPause": "pause", "jwStop": "stop", "jwSeek": "seek", "jwPlaylistPrev": "prev", "jwPlaylistNext": "next", "jwGetBuffer": "getBufferRate", "jwGetDuration": "getDuration", "jwGetFullscreen": "isFullScreen", "jwGetWidth": "getWidth", "jwGetHeight": "getHeight", "jwGetMute": "isMute", "jwSetMute": "setMute", "jwGetPlaylist": "getPlaylist", "jwGetPlaylistIndex": "getPlaylistIndex", "jwGetPosition": "getCurrentTime", "jwGetState": "getState", "jwGetVersion": "getVersion", "jwGetVolume": "volume", "jwSetVolume": "volume" }; cElement = void 0; gray_html5_compatible() { this.setActionHandler(); this.cElement = this.bofqi.querySelector("#player_placeholder"); Object.entries(this.apiMaps).forEach((d) => { this.cElement[d[0]] = function() { if (window.player && "function" == typeof window.player[d[1]]) { for (var e = arguments.length, t = new Array(e), n = 0; n < e; n++) t[n] = arguments[n]; return window.player[d[1]].apply(window.player, t); } return false; }; }); Reflect.set(this.cElement, "jwAddEventListener", (type, callback) => { var callbackString = "", _callback; try { "function" != typeof callback && (callbackString = new Function(callback)); } catch (e) { callbackString = function() { }; } this.eventMaps[type] && (_callback = callbackString || callback, window.player && window.player.addEventListener && window.player.addEventListener(this.eventMaps[type], _callback)); }); Reflect.set(this.cElement, "jwRemoveEventListener", (e) => { this.eventMaps[e] && window.player && window.player.removeEventListener && window.player.removeEventListener(this.eventMaps[e]); }); "function" == typeof this.callbackFn && this.cElement.jwAddEventListener("jwplayerMediaLoaded", () => this.callbackFn()); "function" == typeof window.PlayerMediaLoaded && window.PlayerMediaLoaded(); } setActionHandler() { navigator.mediaSession.setActionHandler("play", () => window.player.play()); navigator.mediaSession.setActionHandler("pause", () => window.player.pause()); navigator.mediaSession.setActionHandler("seekbackward", () => window.player.seek(window.player.getCurrentTime() - 10)); navigator.mediaSession.setActionHandler("seekforward", () => window.player.seek(window.player.getCurrentTime() + 10)); navigator.mediaSession.setActionHandler("previoustrack", () => window.player.prev()); navigator.mediaSession.setActionHandler("nexttrack", () => window.player.next()); } flashChecker() { let e = false, t = 0; if (!!/msie [\\w.]+/.exec(navigator.userAgent.toLowerCase()) && !/Edge/i.test(navigator.userAgent) || /Trident/i.test(navigator.userAgent)) { try { var n = new window.ActiveXObject("ShockwaveFlash.ShockwaveFlash"); if (n) { e = true; var r = n.GetVariable("\$version"); t = parseInt(r.split(" ")[1].split(",")[0], 10); } } catch (e2) { console.error(e2); } } else if (navigator.plugins && 0 < navigator.plugins.length) { var i = navigator.plugins["Shockwave Flash"]; if (i) { e = true; for (var a = i.description.split(" "), o = 0; o < a.length; ++o) isNaN(parseInt(a[o], 10)) || (t = parseInt(a[o], 10)); } } return { hasFlash: e, flashVersion: t }; } gray_loader_flash() { this.playerParam.aid && (window.aid = this.playerParam.aid); this.playerParam.cid && (window.cid = this.playerParam.cid); this.flashChecker().hasFlash ? window.swfobject && window.swfobject.embedSWF ? this.loadFlashPlayer() : this.loadScript("//static.hdslb.com/js/swfobject.js", () => this.loadFlashPlayer()) : this.getNoFlashTips(); } getNoFlashTips() { window.NoFlashTips ? this.createNoFlashTipsInstance() : this.loadScript("//static.hdslb.com/player/noflashtips/no-flash-tips.min.js", () => this.createNoFlashTipsInstance()); } createNoFlashTipsInstance() { const msg = { backgroundColor: "white", msg: "主人,未安装Flash插件,暂时无法观看视频,您可以…", msgColor: "#000", msgSize: 14, btnList: [ { title: "下载Flash插件", width: 166, height: 40, type: "flash", theme: "white" }, { title: "使用HTML5播放器", width: 166, height: 40, type: "html5", theme: "blue", onClick: (e) => { this.gray_html5 = true, this.loadHtml5Player(), "function" == typeof e && e(); } } ], hasOrText: false }; new window.NoFlashTips(this.bofqi, msg); this.bofqi.style.removeProperty("position"); } loadFlashPlayer() { this.bofqi.innerHTML = '<div id="player_placeholder" class="player"></div>'; window.swfobject.embedSWF(this.upgrade ? "//static.hdslb.com/play_recommend.swf" : "//static.hdslb.com/play.swf", "player_placeholder", "950", "482", "0", "", this.playerParam, { bgcolor: "#ffffff", allowfullscreeninteractive: "true", allowfullscreen: "true", quality: "high", allowscriptaccess: "always", wmode: /Firefox/.test(navigator.userAgent) ? "opaque" : "direct" }, { class: "player" }, () => { "function" == typeof this.callbackFn && this.callbackFn(); "function" == typeof window.PlayerMediaLoaded && window.PlayerMediaLoaded(); this.gray_flash_compatible(); }); } gray_flash_compatible() { this.cElement = this.bofqi.querySelector("#player_placeholder"); window.player = {}; Object.entries(this.apiMaps).forEach((d) => { this.cElement[d[0]] = function() { if (window.player && "function" == typeof window.player[d[1]]) { for (var e = arguments.length, t = new Array(e), n = 0; n < e; n++) t[n] = arguments[n]; return window.player[d[1]].apply(window.player, t); } return false; }; window.player[d[1]] = () => { if (typeof this.cElement[d[0]] === "function") { return this.cElement[d[0]].apply(this.cElement, arguments); } }; }); Reflect.set(this.cElement, "jwAddEventListener", () => { this.cElement["jwAddEventListener"].apply(this, arguments); }); Reflect.set(this.cElement, "jwRemoveEventListener", () => { this.cElement["jwRemoveEventListener"].apply(this, arguments); }); const eventMaps = { "video_media_buffer": "jwplayerMediaBuffer", "video_media_buffer_full": "jwplayerMediaBufferFull", "video_media_ended": "jwplayerMediaComplete", "video_media_error": "jwplayerMediaError", "video_media_loaded": "jwplayerMediaLoaded", "video_media_mute": "jwplayerMediaMute", "video_media_seek": "jwplayerMediaSeek", "video_media_time": "jwplayerMediaTime", "video_media_volume": "jwplayerMediaVolume" }; window.player["addEventListener"] = (type, callback) => { try { if (typeof callback !== "function") { callback = new Function(callback); } } catch (e) { callback = function() { }; } if (eventMaps[type]) { this.flashAddEvents.push([type, callback]); } }; window.player["removeEventListener"] = (type) => { if (eventMaps[type]) { for (var i = this.flashAddEvents.length - 1; i > 0; i--) { if (this.flashAddEvents[i][0] == type) { this.flashAddEvents.splice(i, 1); } } } }; Object.entries(eventMaps).forEach((d) => { this.cElement["jwAddEventListener"](d[1], () => { this.callFunction(d[0]); }); }); } callFunction(type) { const eventMaps = { "video_media_buffer": "jwplayerMediaBuffer", "video_media_buffer_full": "jwplayerMediaBufferFull", "video_media_ended": "jwplayerMediaComplete", "video_media_error": "jwplayerMediaError", "video_media_loaded": "jwplayerMediaLoaded", "video_media_mute": "jwplayerMediaMute", "video_media_seek": "jwplayerMediaSeek", "video_media_time": "jwplayerMediaTime", "video_media_volume": "jwplayerMediaVolume" }; if (eventMaps[type]) { for (var i = 0; i < this.flashAddEvents.length; i++) { this.flashAddEvents[i] && this.flashAddEvents[i][0] == type && this.flashAddEvents[i][1](); } } } loadExtraMenuConfig(type) { let v = "20161115", exconfig = []; if (type === "flash" || type === "flash_gray") { if (this.gray_html5) { exconfig.push({ label: "HTML5播放器", id: "change_h5" }); exconfig.push({ label: "Flash播放器", id: "change_flash", active: true }); } } else { exconfig.push({ label: "HTML5播放器", id: "change_h5", active: true }); exconfig.push({ label: "Flash播放器", id: "change_flash" }); } return { "ver": v, "menuItems": exconfig }; } clickMenu(id) { setTimeout(() => { if (id === "change_h5") { this.gray_html5 = true; this.gray_loader(); } else if (id === "change_flash") { this.gray_html5 = false; window.player && window.player.destroy && window.player.destroy(); this.gray_loader(); } }); } gray_loader() { if (!this.bofqi) return debug.warn("播放器节点未初始化,请稍候~", this.playerParam); this.init_bgray_btn(); "html5" === this.playerType || this.gray_html5 ? this.loadHtml5Player() : this.gray_loader_flash(); } feedback = void 0; bgray_btn = [ { tagName: "div", props: { class: "bgray-btn show bgray-btn-feedback" }, children: [ { tagName: "text", text: "播放" }, { tagName: "br" }, { tagName: "text", text: "问题" }, { tagName: "br" }, { tagName: "text", text: "反馈" } ], event: { click: (e) => { const gray = e.target; this.feedback ? this.feedback.show() : window.FeedBackInstance ? (this.feedback = new window.FeedBackInstance(), this.feedback.show()) : (gray.classList.add("player-feedback-disable"), this.loadScript("//static.hdslb.com/player/feedback/feedback.min.js", () => { gray.classList.remove("player-feedback-disable"); this.feedback = window.FeedBackInstance && new window.FeedBackInstance(); this.feedback && this.feedback.show(); })); } } }, { tagName: "div", props: { class: "bgray-btn show bgray-btn-help" }, children: [{ tagName: "text", text: "帮助" }], event: { click: () => { window.open("//www.bilibili.com/blackboard/help.html#常见播放问题自救方法"); } } } ]; bgray_btn_title = []; append_bgray_btn(title, callback, className) { var _a3, _b, _c; if (this.bgray_btn_title.includes(title)) return; const vdom = { tagName: "div", props: { class: \`bgray-btn show bgray-btn-\${className || "any"}\` }, children: [], event: { click: () => { callback(); } } }; const arr2 = title.split(""); while (arr2.length) { let str = arr2.shift() || ""; str += arr2.shift() || ""; if (str) { ((_a3 = vdom.children) == null ? void 0 : _a3.length) && ((_b = vdom.children) == null ? void 0 : _b.push({ tagName: "br" })); (_c = vdom.children) == null ? void 0 : _c.push({ tagName: "text", text: str }); } } this.bgray_btn_title.push(title); this.bgray_btn.push(vdom); this.init_bgray_btn(); } init_bgray_btn() { const prt = this.bofqi.parentElement; prt.appendChild(createElement({ tagName: "div", props: { class: "bgray-btn-wrap" }, children: this.bgray_btn })); document.head.appendChild(createElements(htmlVnode(bgray_btn_default))); } }; var EmbedPlayer = _EmbedPlayer; __publicField(EmbedPlayer, "asWide", false); var GrayManager = class extends EmbedPlayer { codec; constructor(player2, swf, playerParams, playerType, upgrade, callbackFn) { super(player2, swf, playerParams, playerType, upgrade, callbackFn); let codecId = { "AVC": 7, "HEVC": 12, "AV1": 13 }; this.codec = { preference: codecId[setting.codecType], support: {} }; let mime = { "AVC": 'video/mp4;codecs="avc1.640028"', "HEVC": 'video/mp4;codecs="hev1.1.6.L120.90"', "AV1": 'video/mp4;codecs="av01.0.01M.08.0.110.01.01.01.0"' }; for (let i in mime) { this.codec.support[codecId[i]] = MediaSource.isTypeSupported(mime[i]); } location.href.includes("t=") && (this.playerParam.p = this.GetUrlValue("t")); location.href.includes("d=") && (this.playerParam.d = this.GetUrlValue("d")); location.href.includes("lastplaytime=") && (this.playerParam.lastplaytime = this.GetUrlValue("lastplaytime")); new FlacSwitch(); } reload(playerParams) { if (this.playerParam) { try { window.swfobject && window.swfobject.removeSWF("player_placeholder"), window.player && window.player.pause(), window.player && window.player.destroy && window.player.destroy(), (this.HashManage.get("page") || this.GetUrlValue("p")) && (window.pageno = this.HashManage.get("page") || this.GetUrlValue("p") || 1, this.pageno = window.pageno); } catch (e) { console.log(e); } this.playerParam = urlObj(\`?\${playerParams}\`) || this.playerParam; this.playerParam.dashSymbol = true; this.playerParam && (Reflect.set(window, "aid", this.playerParam.aid), Reflect.set(window, "cid", this.playerParam.cid)); this.gray_loader(); } else window.location.reload(); } HashManage = { p: function(e) { return (this.p = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(e2) { return typeof e2; } : function(e2) { return e2 && "function" == typeof Symbol && e2.constructor === Symbol && e2 !== Symbol.prototype ? "symbol" : typeof e2; })(e); }, prependHash: "!", _change: function(e, t) { var n, r = location.hash, i = [], a = "", o = 0, s = {}; r && (r = r.substring(1), this.prependHash && (r = r.replace(new RegExp("^".concat(this.prependHash.replace(/[-[\\]{}()*+?.,\\\\^\$|#\\s]/g, "\\\\\$&"))), ""))), i = r.split("&"); for (var u = 0; u < i.length; u++) { var l = i[u].split("=")[0], d = i[u].split("=")[1]; l && (s[l] = decodeURIComponent(d)); } if ("object" === this.p(e)) { n = Object.keys(e).length; for (var f = 0; f < n; f++) { var c = e[n[f]]; c ? s[n[f]] = encodeURIComponent(c) : false === c && delete s[n[f]]; } } else if (t) s[e] = encodeURIComponent(t); else { if (false !== t) return void 0 === e ? s : s[e] || null; delete s[e]; } n = Object.keys(s); for (var h = 0; h < n.length; h++) a += 0 !== o ? "&" : this.prependHash, a += "".concat(n[h], "=").concat(s[n[h]]), o += 1; return location.hash = a, s; }, get: function(e) { return this._change(e, null); }, set: function(e, t) { return this._change(e, t); }, clear: function() { location.hash = ""; } }; GetUrlValue(e) { var t = new RegExp("(^|&)".concat(e, "=([^&]*)(&|\$)"), "i"), n = window.location.search.substr(1).match(t); if (null != n) try { return decodeURIComponent(n[2]); } catch (e2) { return null; } return null; } }; function loadVideoScript(bofqi, asWide = false) { Reflect.defineProperty(window, "EmbedPlayer", { configurable: true, get: () => (player2, swf, playerParams, playerType, upgrade, callbackFn) => { try { Reflect.deleteProperty(window, "__playinfo__"); asWide && (EmbedPlayer.asWide = true); bofqi && (document.querySelector(bofqi).id = "bofqi"); window.GrayManager = new GrayManager(player2, swf, playerParams, playerType, upgrade, callbackFn); isUserScript && window.GrayManager.append_bgray_btn("下载", () => downloadDefault()); } catch (e) { toast.error("EmbedPlayer 启动播放器出错~"); debug.error("EmbedPlayer 启动播放器出错~", e); } }, set: () => true }); playerKeyMap(); } setting.danmakuHashId && danmakuHashId(); setting.heartbeat && xhrhook(["api.bilibili.com/x/report/web/heartbeat"], function(args) { args[1] = args[1].replace("api.bilibili.com/x/report/web/heartbeat", "api.bilibili.com/x/click-interface/web/heartbeat"); }, void 0, false); setting.videoLimit.switch && videoLimit(); loadDanmakuEngine(); dealwithPlayinfo(); automate(); // src/content/comment.ts var Feedback; var loading = false; var load2 = false; function loadComment() { Reflect.defineProperty(window, "bbComment", { configurable: true, set: (v) => { if (!v.prototype._createNickNameDom) { return loadScript("//s1.hdslb.com/bfs/seed/jinkela/commentpc/comment.min.js").then(() => { Array.from(document.styleSheets).forEach((d) => { d.href && d.href.includes("comment") && (d.disabled = true); }); }); } Feedback = v; bbCommentModify(); Reflect.defineProperty(window, "bbComment", { configurable: true, value: Feedback }); }, get: () => { return Feedback ? Feedback : class { constructor() { if (!loading) { loadScript("//s1.hdslb.com/bfs/seed/jinkela/commentpc/comment.min.js").then(() => { Array.from(document.styleSheets).forEach((d) => { d.href && d.href.includes("comment") && (d.disabled = true); }); }); loading = true; } setTimeout(() => new window.bbComment(...arguments)); } on() { } }; } }); Reflect.defineProperty(window, "initComment", { configurable: true, set: (v) => true, get: () => { if (load2) { let initComment2 = function(tar, init2) { new Feedback(tar, init2.oid, init2.pageType, init2.userStatus); }; var initComment = initComment2; Reflect.defineProperty(window, "initComment", { configurable: true, value: initComment2 }); return initComment2; } return function() { if (!loading) { loadScript(\`//s1.hdslb.com/bfs/seed/jinkela/commentpc/comment.min.js\`).then(() => { load2 = true; }); } loading = true; setTimeout(() => window.initComment(...arguments), 100); }; } }); jsonphook(["api.bilibili.com/x/v2/reply?", "sort=2"], void 0, (res) => { var _a3; if (0 === res.code && ((_a3 = res.data) == null ? void 0 : _a3.page)) { const page = res.page; page && jsonphook("api.bilibili.com/x/v2/reply?", void 0, (res2) => { var _a4; if (0 === res2.code && ((_a4 = res2.data) == null ? void 0 : _a4.page)) { page.count && (res2.data.page.count = page.count); page.acount && (res2.data.page.acount = page.acount); } return res2; }, false); } return res; }); } function bbCommentModify() { Feedback.prototype.initAbtest = function() { this.abtest = {}; this.abtest.optimize = false; if (this.jumpId || this.noPage) { this.abtest.optimize = false; } if (this.appMode === "comic") { this.abtest.optimize = false; } this._registerEvent(); this.init(); }; Feedback.prototype._renderBottomPagination = function(pageInfo) { if (this.noPage) { var isLastPage = pageInfo.count <= this.pageSize; var html = ""; if (isLastPage) { html = "没有更多了~"; } else { html = '<a class="more-link" href="javascript:">查看更多评论</a>'; } this.\$root.find(".bottom-page").addClass("center").html(html); return; } const count = Math.ceil(pageInfo.count / pageInfo.size); if (count > 1) { this.\$root.find(".header-interaction").addClass("paging-box").paging({ pageCount: count, current: pageInfo.num, backFn: (p) => { this.\$root.trigger("replyPageChange", { p, isBottom: true }); this.trigger("replyPageChange", { p, isBottom: true }); this.currentPage = p; } }); this.\$root.find(".bottom-page").paging({ pageCount: count, current: pageInfo.num, jump: true, smallSize: this.smallPager, backFn: (p) => { this.\$root.trigger("replyPageChange", { p, isBottom: true }); this.trigger("replyPageChange", { p, isBottom: true }); this.currentPage = p; } }); } else { this.\$root.find(".header-page").html(""); this.\$root.find(".bottom-page").html(""); } }; Feedback.prototype._createListCon = function(item, i, pos) { var _a3, _b; const blCon = this._parentBlacklistDom(item, i, pos); const con = [ '<div class="con ' + (pos == i ? "no-border" : "") + '">', '<div class="user">' + this._createNickNameDom(item), this._createLevelLink(item), this._identity(item.mid, item.assist, item.member.fans_detail), this._createNameplate(item.member.nameplate) + this._createUserSailing(item) + "</div>", this._createMsgContent(item), this._createPerfectReply(item), '<div class="info">', item.floor ? '<span class="floor">#' + item.floor + "</span>" : "", this._createPlatformDom(item.content.plat), '<span class="time-location">', '<span class="reply-time">'.concat(this._formateTime(item.ctime), "</span>"), ((_a3 = item == null ? void 0 : item.reply_control) == null ? void 0 : _a3.location) ? \`<span class="reply-location">\${((_b = item == null ? void 0 : item.reply_control) == null ? void 0 : _b.location) || ""}</span>\` : "", "</span>", item.lottery_id ? "" : '<span class="like ' + (item.action == 1 ? "liked" : "") + '"><i></i><span>' + (item.like ? item.like : "") + "</span></span>", item.lottery_id ? "" : '<span class="hate ' + (item.action == 2 ? "hated" : "") + '"><i></i></span>', item.lottery_id ? "" : this._createReplyBtn(item.rcount), item.lottery_id && item.mid !== this.userStatus.mid ? "" : '<div class="operation more-operation"><div class="spot"></div><div class="opera-list"><ul>' + (this._canSetTop(item) ? '<li class="set-top">' + (item.isUpTop ? "取消置顶" : "设为置顶") + "</li>" : "") + (this._canBlackList(item.mid) ? '<li class="blacklist">加入黑名单</li>' : "") + (this._canReport(item.mid) ? '<li class="report">举报</li>' : "") + (this._canDel(item.mid) && !item.isTop ? '<li class="del" data-mid="' + item.mid + '">删除</li>' : "") + "</ul></div></div>", this._createLotteryContent(item.content), this._createVoteContent(item.content), this._createTags(item), "</div>", '<div class="reply-box">', this._createSubReplyList(item.replies, item.rcount, false, item.rpid, item.folder && item.folder.has_folded, item.reply_control), "</div>", '<div class="paging-box">', "</div>", "</div>" ].join(""); return item.state === this.blacklistCode ? blCon : con; }; Feedback.prototype._createSubReplyItem = function(item, i) { var _a3, _b; if (item.invisible) { return ""; } return [ '<div class="reply-item reply-wrap" data-id="' + item.rpid + '" data-index="' + i + '">', this._createSubReplyUserFace(item), '<div class="reply-con">', '<div class="user">', this._createNickNameDom(item), this._createLevelLink(item), this._identity(item.mid, item.assist, item.member.fans_detail), this._createSubMsgContent(item), "</div>", "</div>", '<div class="info">', item.floor ? '<span class="floor">#' + item.floor + "</span>" : "", this._createPlatformDom(item.content.plat), '<span class="time-location">', '<span class="reply-time">'.concat(this._formateTime(item.ctime), "</span>"), ((_a3 = item == null ? void 0 : item.reply_control) == null ? void 0 : _a3.location) ? \`<span class="reply-location">\${((_b = item == null ? void 0 : item.reply_control) == null ? void 0 : _b.location) || ""}</span>\` : "", "</span>", '<span class="like ' + (item.action == 1 ? "liked" : "") + '"><i></i><span>' + (item.like ? item.like : "") + "</span></span>", '<span class="hate ' + (item.action == 2 ? "hated" : "") + '"><i></i></span>', '<span class="reply btn-hover">回复</span>', item.dialog != item.rpid ? '<span class="dialog btn-hover" dialog-id="' + item.dialog + '" data-id="' + item.rpid + '">查看对话</span>' : "", '<div class="operation btn-hover btn-hide-re"><div class="spot"></div><div class="opera-list"><ul>' + (this._canBlackList(item.mid) ? '<li class="blacklist">加入黑名单</li>' : "") + (this._canReport(item.mid) ? '<li class="report">举报</li>' : "") + (this._canDel(item.mid) ? '<li class="del" data-mid="' + item.mid + '">删除</li>' : "") + "</ul></div></div>", "</div>", "</div>" ].join(""); }; addCss(\`.bb-comment .comment-list .list-item .info .btn-hover, .comment-bilibili-fold .comment-list .list-item .info .btn-hover { line-height: 24px; }\`, "comment-btn-24pxH"); addCss(\`.operation.btn-hide-re .opera-list {visibility: visible}\`, "keep-operalist-visible"); const _registerEvent = Feedback.prototype._registerEvent; Feedback.prototype._registerEvent = function(e) { _registerEvent.call(this, e); let n = this.\$root; let \$ = window.\$; if (e) n = \$(e); let l = this; n.on("click.dialog", ".dialog", function() { let clickTarget = this; clickTarget.innerHTML = "正在载入……"; let rootid = clickTarget.parentNode.parentNode.parentNode.parentNode.parentNode.getAttribute("data-id"); let dialogid = clickTarget.getAttribute("dialog-id"); let selfRpid = clickTarget.getAttribute("data-id"); addCss(\` .comment-dialog .dialog{display:none!important} .comment-dialog > .comment-list{transform:translateY(-13px)} .comment-dialog{min-height:200px;max-height:70vh;overflow-y:auto} .comment-dialog-container{width:600px;z-index:100000;position:fixed;background:#fff;left:50%;top:50%;transform:translate(-50%,-50%);box-shadow:0 0 20px 3px #0000005c;border-radius:10px;padding:0 18px;opacity:1;transition:opacity 0.1s} .comment-dialog-container.hidden{opacity:0}\`, "comment-dialog"); let container = document.createElement("div"); container.className = "comment-dialog-container hidden"; container.innerHTML = \` <div class="comment-dialog bb-comment"> <div class="comment-list"> <div class="list-item" data-id="\${rootid}"> <div class="con" style="border:none;margin:0;padding:0;"> <div class="reply-box"> </div></div></div></div></div>\`; document.body.appendChild(container); let replyBox = container.getElementsByClassName("reply-box")[0]; setTimeout(() => { let closeWindow = (e2) => { if (!container.contains(e2.target) && e2.target != container) { container.className = "comment-dialog-container hidden"; setTimeout(() => container.remove(), 100); clickTarget.innerHTML = "查看对话"; window.removeEventListener("click", closeWindow, false); } }; window.addEventListener("click", closeWindow); }, 0); function fetchDialog(minFloor) { return \$.ajax({ url: "//api.bilibili.com/x/v2/reply/dialog/cursor", type: "GET", data: { type: l.pageType, oid: l.oid, root: rootid, dialog: dialogid, size: 20, min_floor: minFloor }, xhrFields: { withCredentials: true } }); } function fixEmojiPosition(node4) { node4 = \$(node4); node4.find(".reply-item").each(function(_2, n2) { var t = \$(n2).find(".reply-face"), r = \$(n2).find(".user"), n2 = \$(n2).find(".name"); t && r && n2 && (10 < n2.offset().top - r.offset().top ? t.css("top", "32px") : t.css("top", "0")); }); } fetchDialog(0).done((resp) => { if (resp.code == 0 && resp.data.replies && resp.data.replies.length > 0) { let nextPage2 = function(minFloor) { if (minFloor < resp.data.dialog.max_floor) { fetchDialog(minFloor + 1).done((resp2) => { if (resp2.code == 0 && resp2.data.replies && resp2.data.replies.length > 0) { replyBox.insertAdjacentHTML("beforeend", l._createSubReplyList(resp2.data.replies, resp2.data.replies.length, true, rootid, null, false)); nextPage2(resp2.data.cursor.max_floor); } }); } else { fixEmojiPosition(replyBox); replyBox.querySelector(\`div[data-id="\${selfRpid}"]\`).style.cssText = \` background: linear-gradient(45deg, rgba(115,108,231,0.13) 0%, rgba(0,161,214,0.13) 67%, rgba(0,212,255,0.13) 100%); border-radius: 15px; margin-right: 15px;\`; } }; var nextPage = nextPage2; replyBox.innerHTML = l._createSubReplyList(resp.data.replies, resp.data.replies.length, true, rootid, null, false); l._registerEvent(container); container.className = "comment-dialog-container"; fixEmojiPosition(replyBox); nextPage2(resp.data.cursor.max_floor); } }); }); n.off("click.operation", ".spot"); n.on("click.operation", ".spot", function(e2) { let operalist = this.parentNode.getElementsByClassName("opera-list")[0]; if (l.lastClickOperation != this || operalist && operalist.style.display == "none") { \$(".opera-list").hide(), \$(this).siblings(".opera-list").show(), e2.stopPropagation(), \$(this).hasClass("more-operation") && (e2 = +\$(this).parents(".reply-wrap:eq(0)").attr("data-id")); l.lastClickOperation = this; } else operalist && (operalist.style.display = "none"); }); }; } // src/content/av/av.html var av_default = '<!-- <!DOCTYPE html> -->\\r\\n<html lang="zh-CN">\\r\\n\\r\\n<head>\\r\\n <meta charset="utf-8" />\\r\\n <title>哔哩哔哩 (゜-゜)つロ 干杯~-bilibili</title>\\r\\n <meta name="description" content="bilibili是国内知名的视频弹幕网站,这里有最及时的动漫新番,最棒的ACG氛围,最有创意的Up主。大家可以在这里找到许多欢乐。" />\\r\\n <meta name="keywords"\\r\\n content="Bilibili,哔哩哔哩,哔哩哔哩动画,哔哩哔哩弹幕网,弹幕视频,B站,弹幕,字幕,AMV,MAD,MTV,ANIME,动漫,动漫音乐,游戏,游戏解说,二次元,游戏视频,ACG,galgame,动画,番组,新番,初音,洛天依,vocaloid,日本动漫,国产动漫,手机游戏,网络游戏,电子竞技,ACG燃曲,ACG神曲,追新番,新番动漫,新番吐槽,巡音,镜音双子,千本樱,初音MIKU,舞蹈MMD,MIKUMIKUDANCE,洛天依原创曲,洛天依翻唱曲,洛天依投食歌,洛天依MMD,vocaloid家族,OST,BGM,动漫歌曲,日本动漫音乐,宫崎骏动漫音乐,动漫音乐推荐,燃系mad,治愈系mad,MAD MOVIE,MAD高燃" />\\r\\n <meta name="renderer" content="webkit" />\\r\\n <meta http-equiv="X-UA-Compatible" content="IE=edge" />\\r\\n <link rel="search" type="application/opensearchdescription+xml" href="//static.hdslb.com/opensearch.xml"\\r\\n title="哔哩哔哩" />\\r\\n <link rel="stylesheet"\\r\\n href="//s1.hdslb.com/bfs/static/jinkela/videoplay/css/video.0.406cee7878545872b8dfbe73071d665dfb287c67.css" />\\r\\n <style type="text/css">\\r\\n #bofqi .player {\\r\\n width: 980px;\\r\\n height: 620px;\\r\\n display: block;\\r\\n }\\r\\n\\r\\n @media screen and (min-width:1400px) {\\r\\n\\r\\n #bofqi .player {\\r\\n width: 1160px;\\r\\n height: 720px\\r\\n }\\r\\n }\\r\\n </style>\\r\\n</head>\\r\\n\\r\\n<body>\\r\\n <div class="z-top-container has-menu"></div>\\r\\n <div id="video-page-app"></div>\\r\\n <div id="app" data-server-rendered="true"></div>\\r\\n <div class="footer bili-footer report-wrap-module"></div>\\r\\n</body>\\r\\n\\r\\n</html>'; // src/content/av/script.html var script_default = '<script type="text/javascript">\\r\\n window.getInternetExplorerVersion = function () {\\r\\n var e = -1; if ("Microsoft Internet Explorer" == navigator.appName) {\\r\\n var r = navigator.userAgent;\\r\\n null != new RegExp("MSIE ([0-9]{1,}[.0-9]{0,})").exec(r) && (e = parseFloat(RegExp.\$1))\\r\\n }\\r\\n return e\\r\\n };\\r\\n function getQueryString(e) {\\r\\n var r = new RegExp("(^|&)" + e + "=([^&]*)(&|\$)"),\\r\\n i = window.location.search.substr(1).match(r);\\r\\n return null != i ? unescape(i[2]) : null\\r\\n }\\r\\n window.commentAgent = { seek: t => window.player && window.player.seek(t) };\\r\\n<\\/script>\\r\\n<script type="text/javascript" src="//static.hdslb.com/js/jquery.min.js"><\\/script>\\r\\n<script type="text/javascript" src="//static.hdslb.com/js/jquery.qrcode.min.js"><\\/script>\\r\\n<script type="text/javascript" src="//s1.hdslb.com/bfs/seed/jinkela/header/header.js"><\\/script>\\r\\n<script type="text/javascript" src="//s1.hdslb.com/bfs/seed/jinkela/commentpc/comment.min.js"><\\/script>\\r\\n<script src="//s1.hdslb.com/bfs/static/jinkela/videoplay/manifest.b1b7706abd590dd295794f540f7669a5d8d978b3.js"\\r\\n crossorigin=""><\\/script>\\r\\n<script src="//s1.hdslb.com/bfs/static/jinkela/videoplay/vendor.b1b7706abd590dd295794f540f7669a5d8d978b3.js"\\r\\n crossorigin=""><\\/script>\\r\\n<script src="//s1.hdslb.com/bfs/static/jinkela/videoplay/video.b1b7706abd590dd295794f540f7669a5d8d978b3.js"\\r\\n crossorigin=""><\\/script>\\r\\n<script type="text/javascript" charset="utf-8" src="//static.hdslb.com/common/js/footer.js"><\\/script>'; // src/content/av/menu_config.txt var menu_config_default = '[{name:"首页",route:"/",tid:"",locid:23,sub:[]},{name:"动画",route:"douga",tid:1,locid:52,count:"",subMenuSize:162,slider:{width:620,height:220},viewTag:!1,customComponent:{name:"Energy",titleId:2507,leftId:2452,rightId:2453},sub:[{name:"MAD·AMV",route:"mad",tid:24,ps:15,rps:10,ad:{active:!0,dataLocId:151},desc:"具有一定制作程度的动画或静画的二次创作视频",url:"//www.bilibili.com/video/douga-mad-1.html"},{name:"MMD·3D",route:"mmd",tid:25,ps:15,rps:10,ad:{active:!0,dataLocId:152},desc:"使用MMD(MikuMikuDance)和其他3D建模类软件制作的视频",url:"//www.bilibili.com/video/douga-mmd-1.html"},{name:"短片·手书·配音",route:"voice",tid:47,ps:15,rps:10,desc:"追求创新并具有强烈特色的短片、手书(绘)及ACG相关配音",url:"//www.bilibili.com/video/douga-voice-1.html"},{name:"手办·模玩",route:"garage_kit",tid:210,ps:15,rps:10,desc:"手办模玩的测评、改造或其他衍生内容",url:""},{name:"特摄",route:"tokusatsu",tid:86,ps:15,rps:10,desc:"特摄相关衍生视频",url:"//www.bilibili.com/video/cinephile-tokusatsu.html"},{name:"综合",route:"other",tid:27,ps:15,rps:10,ad:{active:!0,dataLocId:153},desc:"以动画及动画相关内容为素材,包括但不仅限于音频替换、杂谈、排行榜等内容",url:"//www.bilibili.com/video/douga-else-1.html"}]},{name:"番剧",route:"anime",tid:13,url:"//www.bilibili.com/anime/",takeOvered:!0,count:"",subMenuSize:172,combination:!0,sub:[{name:"连载动画",tid:33,route:"serial",desc:"当季连载的动画番剧",url:"//www.bilibili.com/video/bangumi-two-1.html"},{name:"完结动画",tid:32,route:"finish",desc:"已完结的动画番剧合集",url:"//www.bilibili.com/video/part-twoelement-1.html"},{name:"资讯",tid:51,route:"information",desc:"动画番剧相关资讯视频",url:"//www.bilibili.com/video/douga-else-information-1.html"},{name:"官方延伸",tid:152,route:"offical",desc:"动画番剧为主题的宣传节目、采访视频,及声优相关视频",url:"//www.bilibili.com/video/bagumi_offical_1.html"},{name:"新番时间表",url:"//www.bilibili.com/anime/timeline/",desc:""},{name:"番剧索引",url:"//www.bilibili.com/anime/index/",desc:""}]},{name:"国创",tid:167,route:"guochuang",url:"//www.bilibili.com/guochuang/",takeOvered:!0,count:"",subMenuSize:214,combination:!0,sub:[{name:"国产动画",tid:153,route:"chinese",desc:"我国出品的PGC动画",url:"//www.bilibili.com/video/bangumi_chinese_1.html"},{name:"国产原创相关",tid:168,route:"original",desc:"",url:"//www.bilibili.com/video/guochuang-fanvid-1.html"},{name:"布袋戏",tid:169,route:"puppetry",desc:"",url:"//www.bilibili.com/video/glove-puppetry-1.html"},{name:"动态漫·广播剧",tid:195,route:"motioncomic",desc:"",url:""},{name:"资讯",tid:170,route:"information",desc:"",url:"//www.bilibili.com/video/guochuang-offical-1.html"},{name:"新番时间表",url:"//www.bilibili.com/guochuang/timeline/",desc:""},{name:"国产动画索引",url:"//www.bilibili.com/guochuang/index/",desc:""}]},{name:"音乐",route:"music",tid:3,locid:58,count:"",subMenuSize:268,slider:{width:620,height:220},viewTag:!0,customComponent:{name:"Energy",titleId:2511,leftId:2462,rightId:3131,rightType:"slide"},sub:[{name:"原创音乐",route:"original",tid:28,ps:15,rps:10,viewHotTag:!0,ad:{active:!0,dataLocId:243},dpConfig:[{name:"一日",value:1},{name:"三日",value:3}],desc:"原创歌曲及纯音乐,包括改编、重编曲及remix",url:"//www.bilibili.com/video/music-original-1.html"},{name:"翻唱",route:"cover",tid:31,ps:15,rps:10,ad:{active:!0,dataLocId:245},viewHotTag:!0,dpConfig:[{name:"一日",value:1},{name:"三日",value:3}],desc:"对曲目的人声再演绎视频",url:"//www.bilibili.com/video/music-Cover-1.html"},{name:"演奏",route:"perform",tid:59,ps:15,rps:10,viewHotTag:!0,dpConfig:[{name:"一日",value:1},{name:"三日",value:3}],desc:"乐器和非传统乐器器材的演奏作品",url:"//www.bilibili.com/video/music-perform-1.html"},{name:"VOCALOID·UTAU",route:"vocaloid",tid:30,ps:15,rps:10,viewHotTag:!0,ad:{active:!0,dataLocId:247},dpConfig:[{name:"一日",value:1},{name:"三日",value:3}],desc:"以VOCALOID等歌声合成引擎为基础,运用各类音源进行的创作",url:"//www.bilibili.com/video/music-vocaloid-1.html"},{name:"音乐现场",route:"live",tid:29,ps:15,rps:10,viewHotTag:!0,dpConfig:[{name:"一日",value:1},{name:"三日",value:3}],desc:"音乐表演的实况视频,包括官方/个人拍摄的综艺节目、音乐剧、音乐节、演唱会等",url:"//www.bilibili.com/video/music-oped-1.html"},{name:"MV",route:"mv",tid:193,ps:15,rps:10,viewHotTag:!0,dpConfig:[{name:"一日",value:1},{name:"三日",value:3}],desc:"为音乐作品配合拍摄或制作的音乐录影带(Music Video),以及自制拍摄、剪辑、翻拍MV",url:"//www.bilibili.com/video/music-coordinate-1.html"},{name:"乐评盘点",route:"commentary",tid:243,ps:15,rps:10,viewHotTag:!0,dpConfig:[{name:"一日",value:1},{name:"三日",value:3}],desc:"音乐类新闻、盘点、点评、reaction、榜单、采访、幕后故事、唱片开箱等",url:"//www.bilibili.com/video/music-collection-1.html"},{name:"音乐教学",route:"tutorial",tid:244,ps:15,rps:10,viewHotTag:!0,dpConfig:[{name:"一日",value:1},{name:"三日",value:3}],desc:"以音乐教学为目的的内容",url:"//www.bilibili.com/video/music-collection-1.html"},{name:"音乐综合",route:"other",tid:130,ps:15,rps:10,viewHotTag:!0,dpConfig:[{name:"一日",value:1},{name:"三日",value:3}],desc:"所有无法被收纳到其他音乐二级分区的音乐类视频",url:"//www.bilibili.com/video/music-collection-1.html"},{name:"音频",customZone:"Audio",route:"audio",url:"//www.bilibili.com/audio/home?musicType=music"},{name:"说唱",url:"//www.bilibili.com/v/rap"}]},{name:"舞蹈",route:"dance",tid:129,locid:64,count:"",subMenuSize:172,slider:{width:620,height:220},viewTag:!1,customComponent:{name:"Energy",titleId:2513,leftId:2472,rightId:2473},sub:[{name:"宅舞",route:"otaku",tid:20,ps:15,rps:10,ad:{active:!0,dataLocId:249},desc:"与ACG相关的翻跳、原创舞蹈",url:"//www.bilibili.com/video/dance-1.html"},{name:"街舞",route:"hiphop",tid:198,ps:15,rps:10,ad:{active:!0,dataLocId:251},desc:"收录街舞相关内容,包括赛事现场、舞室作品、个人翻跳、FREESTYLE等",url:""},{name:"明星舞蹈",route:"star",tid:199,ps:15,rps:10,desc:"国内外明星发布的官方舞蹈及其翻跳内容",url:""},{name:"中国舞",route:"china",tid:200,ps:15,rps:10,ad:{active:!0,dataLocId:253},desc:"传承中国艺术文化的舞蹈内容,包括古典舞、民族民间舞、汉唐舞、古风舞等",url:""},{name:"舞蹈综合",route:"three_d",tid:154,ps:15,rps:10,desc:"收录无法定义到其他舞蹈子分区的舞蹈视频",url:""},{name:"舞蹈教程",route:"demo",tid:156,ps:10,rps:6,desc:"镜面慢速,动作分解,基础教程等具有教学意义的舞蹈视频",url:"//www.bilibili.com/video/dance-demo-1.html"}]},{name:"游戏",route:"game",tid:4,locid:70,count:"",subMenuSize:240,slider:{width:470,height:216},viewTag:!0,customComponent:{name:"Energy",titleId:3761,leftId:3765,rightId:3775,rightType:"slide"},recommendCardType:"GameGroomBox",sub:[{name:"单机游戏",route:"stand_alone",tid:17,ps:10,rps:7,rankshow:1,viewHotTag:!0,ad:{active:!0,dataLocId:255},dpConfig:[{name:"三日",value:3},{name:"一日",value:1},{name:"一周",value:7}],desc:"以所有平台(PC、主机、移动端)的单机或联机游戏为主的视频内容,包括游戏预告、CG、实况解说及相关的评测、杂谈与视频剪辑等",url:"//www.bilibili.com/video/videogame-1.html"},{name:"电子竞技",route:"esports",tid:171,ps:10,rps:7,rankshow:1,viewHotTag:!0,ad:{active:!0,dataLocId:257},desc:"具有高对抗性的电子竞技游戏项目,其相关的赛事、实况、攻略、解说、短剧等视频。",url:"//www.bilibili.com/video/esports-1.html"},{name:"手机游戏",route:"mobile",tid:172,ps:10,rps:7,rankshow:1,viewHotTag:!0,desc:"以手机及平板设备为主要平台的游戏,其相关的实况、攻略、解说、短剧、演示等视频。",url:"//www.bilibili.com/video/mobilegame-1.html"},{name:"网络游戏",route:"online",tid:65,ps:10,rps:7,rankshow:1,viewHotTag:!0,ad:{active:!0,dataLocId:259},dpConfig:[{name:"三日",value:3},{name:"一日",value:1},{name:"一周",value:7}],desc:"由网络运营商运营的多人在线游戏,以及电子竞技的相关游戏内容。包括赛事、攻略、实况、解说等相关视频",url:"//www.bilibili.com/video/onlinegame-1.html"},{name:"桌游棋牌",route:"board",tid:173,ps:5,rps:3,rankshow:1,viewHotTag:!0,desc:"桌游、棋牌、卡牌对战等及其相关电子版游戏的实况、攻略、解说、演示等视频。",url:"//www.bilibili.com/video/boardgame-1.html"},{name:"GMV",route:"gmv",tid:121,ps:5,rps:3,rankshow:1,viewHotTag:!0,dpConfig:[{name:"三日",value:3},{name:"一日",value:1},{name:"一周",value:7}],desc:"由游戏素材制作的MV视频。以游戏内容或CG为主制作的,具有一定创作程度的MV类型的视频",url:"//www.bilibili.com/video/gmv-1.html"},{name:"音游",route:"music",tid:136,ps:5,rps:3,rankshow:1,viewHotTag:!0,dpConfig:[{name:"三日",value:3},{name:"一日",value:1},{name:"一周",value:7}],desc:"各个平台上,通过配合音乐与节奏而进行的音乐类游戏视频",url:"//www.bilibili.com/video/music-game-1.html"},{name:"Mugen",route:"mugen",tid:19,ps:5,rps:3,rankshow:1,viewHotTag:!0,dpConfig:[{name:"三日",value:3},{name:"一日",value:1},{name:"一周",value:7}],desc:"以Mugen引擎为平台制作、或与Mugen相关的游戏视频",url:"//www.bilibili.com/video/game-mugen-1.html"},{name:"游戏赛事",url:"//www.bilibili.com/v/game/match/",newIcon:!0}]},{name:"知识",route:"knowledge",tid:36,locid:76,count:"",subMenuSize:172,slider:{width:620,height:220},viewTag:!1,customComponent:{name:"Energy",titleId:2058,leftId:2047,rightId:2048},sub:[{name:"科学科普",route:"science",tid:201,ps:15,rps:10,ad:{active:!0,dataLocId:261},desc:"回答你的十万个为什么"},{name:"社科·法律·心理",route:"social_science",tid:124,ps:15,rps:10,ad:{active:!0,dataLocId:263},desc:"基于社会科学、法学、心理学展开或个人观点输出的知识视频"},{name:"人文历史",route:"humanity_history",tid:228,ps:15,rps:10,desc:"看看古今人物,聊聊历史过往,品品文学典籍"},{name:"财经商业",route:"business",tid:207,ps:15,rps:10,desc:"说金融市场,谈宏观经济,一起畅聊商业故事"},{name:"校园学习",route:"campus",tid:208,ps:15,rps:10,ad:{active:!0,dataLocId:265},desc:"老师很有趣,学生也有才,我们一起搞学习"},{name:"职业职场",route:"career",tid:209,ps:15,rps:10,desc:"职业分享、升级指南,一起成为最有料的职场人"},{name:"设计·创意",route:"design",tid:229,ps:15,rps:10,desc:"天马行空,创意设计,都在这里"},{name:"野生技能协会",route:"skill",tid:122,ps:15,rps:10,desc:"技能党集合,是时候展示真正的技术了"}]},{name:"科技",route:"tech",tid:188,locid:2977,count:"",subMenuSize:80,slider:{width:620,height:220},viewTag:!1,customComponent:{name:"Energy",titleId:2980,leftId:2978,rightId:2979},sub:[{name:"数码",route:"digital",tid:95,ps:15,rps:10,viewHotTag:!0,desc:"科技数码产品大全,一起来做发烧友",url:"#"},{name:"软件应用",route:"application",tid:230,ps:15,rps:10,viewHotTag:!0,desc:"超全软件应用指南",url:"#"},{name:"计算机技术",route:"computer_tech",tid:231,ps:15,rps:10,viewHotTag:!0,desc:"研究分析、教学演示、经验分享......有关计算机技术的都在这里",url:"#"},{name:"科工机械",route:"industry",tid:232,ps:15,rps:10,viewHotTag:!0,desc:"从小芯片到大工程,一起见证科工力量",url:"#"},{name:"极客DIY",route:"diy",tid:233,ps:15,rps:10,viewHotTag:!0,desc:"炫酷技能,极客文化,硬核技巧,准备好你的惊讶",url:"#"}]},{name:"运动",route:"sports",tid:234,locid:4639,isHide:!0,subMenuSize:164,slider:{width:620,height:220},viewTag:!1,customComponent:{name:"Energy",leftId:4646,rightId:4652,rightType:"slide"},sub:[{name:"篮球·足球",route:"basketballfootball",tid:235,ps:15,rps:10,ad:{active:!0,dataLocId:4656},desc:"与篮球、足球相关的视频,包括但不限于篮足球赛事、教学、评述、剪辑、剧情等相关内容",url:"#"},{name:"健身",route:"aerobics",tid:164,ps:15,rps:10,desc:"与健身相关的视频,包括但不限于瑜伽、CrossFit、健美、力量举、普拉提、街健等相关内容",url:"//www.bilibili.com/video/fashion-body-1.html"},{name:"竞技体育",route:"athletic",tid:236,ps:15,rps:10,desc:"与竞技体育相关的视频,包括但不限于乒乓、羽毛球、排球、赛车等竞技项目的赛事、评述、剪辑、剧情等相关内容",url:"#"},{name:"运动文化",route:"culture",tid:237,ps:15,rps:10,desc:"与运动文化相关的视频,包络但不限于球鞋、球衣、球星卡等运动衍生品的分享、解读,体育产业的分析、科普等相关内容",url:"#"},{name:"运动综合",route:"comprehensive",tid:238,ps:15,rps:10,desc:"与运动综合相关的视频,包括但不限于钓鱼、骑行、滑板等日常运动分享、教学、Vlog等相关内容",url:"#"}]},{name:"汽车",route:"car",tid:223,locid:4428,isHide:!0,subMenuSize:164,slider:{width:620,height:220},viewTag:!1,customComponent:{name:"Energy",leftId:4435,rightId:4441,rightType:"slide"},sub:[{name:"汽车生活",route:"life",tid:176,ps:15,rps:10,ad:{active:!0,dataLocId:4445},desc:"分享汽车及出行相关的生活体验类视频",url:"#"},{name:"汽车文化",route:"culture",tid:224,ps:15,rps:10,desc:"汽车改装、品牌历史、汽车设计、老爷车、汽车模型等",url:"#"},{name:"赛车",route:"racing",tid:245,ps:15,rps:10,desc:"F1等汽车运动相关",url:"#"},{name:"汽车极客",route:"geek",tid:225,ps:15,rps:10,desc:"汽车硬核达人聚集地,包括DIY造车、专业评测和技术知识分享",url:"#"},{name:"摩托车",route:"motorcycle",tid:240,ps:15,rps:10,desc:"骑士们集合啦",url:"#"},{name:"智能出行",route:"smart",tid:226,ps:15,rps:10,desc:"探索新能源汽车和未来智能出行的前沿阵地",url:"#"},{name:"购车攻略",route:"strategy",tid:227,ps:15,rps:10,desc:"丰富详实的购车建议和新车体验",url:"#"}]},{name:"生活",route:"life",tid:160,locid:88,count:"",subMenuSize:164,slider:{width:620,height:220},viewTag:!1,customComponent:{name:"Energy",titleId:2062,leftId:1674,rightId:1670},sub:[{name:"搞笑",route:"funny",tid:138,ps:15,rps:10,ad:{active:!0,dataLocId:273},desc:"各种沙雕有趣的搞笑剪辑,挑战,表演,配音等视频",url:"//www.bilibili.com/video/ent_funny_1.html",locid:4204,recommendId:4210,slider:{width:620,height:220},customComponent:{name:"Energy",leftId:4212,rightId:4218,rightType:"slide"}},{name:"家居房产",route:"home",tid:239,ps:15,rps:10,ad:{active:!0,dataLocId:275},desc:"与买房、装修、居家生活相关的分享",url:"#"},{name:"手工",route:"handmake",tid:161,ps:15,rps:10,desc:"手工制品的制作过程或成品展示、教程、测评类视频",url:"//www.bilibili.com/video/ent-handmake-1.html"},{name:"绘画",route:"painting",tid:162,ps:15,rps:10,desc:"绘画过程或绘画教程,以及绘画相关的所有视频",url:"//www.bilibili.com/video/ent-painting-1.html"},{name:"日常",route:"daily",tid:21,ps:15,rps:10,desc:"记录日常生活,分享生活故事",url:"//www.bilibili.com/video/ent-life-1.html"}]},{name:"美食",route:"food",tid:211,locid:4243,count:"",isHide:!0,subMenuSize:164,slider:{width:620,height:220},viewTag:!1,customComponent:{name:"Energy",leftId:4258,rightId:4264},sub:[{name:"美食制作",route:"make",tid:76,ps:15,rps:10,ad:{active:!0,dataLocId:4268},desc:"学做人间美味,展示精湛厨艺",url:"#"},{name:"美食侦探",route:"detective",tid:212,ps:15,rps:10,desc:"寻找美味餐厅,发现街头美食",url:"#"},{name:"美食测评",route:"measurement",tid:213,ps:15,rps:10,desc:"吃货世界,品尝世间美味",url:"#"},{name:"田园美食",route:"rural",tid:214,ps:15,rps:10,desc:"品味乡野美食,寻找山与海的味道",url:"#"},{name:"美食记录",route:"record",tid:215,ps:15,rps:10,desc:"记录一日三餐,给生活添一点幸福感",url:"#"}]},{name:"动物圈",route:"animal",tid:217,locid:4365,count:"",isHide:!0,subMenuSize:164,slider:{width:620,height:220},viewTag:!1,customComponent:{name:"Energy",leftId:4376,rightId:4381,rightType:"slide"},sub:[{name:"喵星人",route:"cat",tid:218,ps:15,rps:10,desc:"喵喵喵喵喵",url:"#",ad:{active:!0,dataLocId:4385}},{name:"汪星人",route:"dog",tid:219,ps:15,rps:10,desc:"汪汪汪汪汪",url:"#"},{name:"大熊猫",route:"panda",tid:220,ps:15,rps:10,desc:"芝麻汤圆营业中",url:"#"},{name:"野生动物",route:"wild_animal",tid:221,ps:15,rps:10,desc:"内有“猛兽”出没",url:"#"},{name:"爬宠",route:"reptiles",tid:222,ps:15,rps:10,desc:"鳞甲有灵",url:"#"},{name:"动物综合",route:"animal_composite",tid:75,ps:15,rps:10,desc:"收录除上述子分区外,其余动物相关视频以及非动物主体或多个动物主体的动物相关延伸内容",url:"#"}]},{name:"鬼畜",route:"kichiku",tid:119,locid:100,count:"",subMenuSize:182,slider:{width:620,height:220},viewTag:!1,customComponent:{name:"Energy",titleId:2509,leftId:2482,rightId:2483},sub:[{name:"鬼畜调教",route:"guide",tid:22,ps:15,rps:10,ad:{active:!0,dataLocId:285},desc:"使用素材在音频、画面上做一定处理,达到与BGM一定的同步感",url:"//www.bilibili.com/video/ent-Kichiku-1.html"},{name:"音MAD",route:"mad",tid:26,ps:15,rps:10,ad:{active:!0,dataLocId:287},desc:"使用素材音频进行一定的二次创作来达到还原原曲的非商业性质稿件",url:"//www.bilibili.com/video/douga-kichiku-1.html"},{name:"人力VOCALOID",route:"manual_vocaloid",tid:126,ps:15,rps:10,desc:"将人物或者角色的无伴奏素材进行人工调音,使其就像VOCALOID一样歌唱的技术",url:"//www.bilibili.com/video/kichiku-manual_vocaloid-1.html"},{name:"鬼畜剧场",route:"theatre",tid:216,ps:15,rps:10,desc:"使用素材进行人工剪辑编排的有剧情的作品"},{name:"教程演示",route:"course",tid:127,ps:10,rps:6,rightComponent:{name:"CmImgList",id:148},ad:{active:!0,dataLocId:289},hideDropdown:!1,desc:"鬼畜相关的教程演示",url:"//www.bilibili.com/video/kichiku-course-1.html"}]},{name:"时尚",route:"fashion",tid:155,locid:94,count:"",subMenuSize:124,slider:{width:620,height:220},viewTag:!1,customComponent:{name:"Energy",titleId:2515,leftId:2492,rightId:2493},sub:[{name:"美妆护肤",route:"makeup",tid:157,ps:15,rps:10,ad:{active:!0,dataLocId:279},desc:"彩妆护肤、美甲美发、仿妆、医美相关内容分享或产品测评",url:"//www.bilibili.com/video/fashion-makeup-fitness-1.html"},{name:"穿搭",route:"clothing",tid:158,ps:15,rps:10,ad:{active:!0,dataLocId:281},desc:"穿搭风格、穿搭技巧的展示分享,涵盖衣服、鞋靴、箱包配件、配饰(帽子、钟表、珠宝首饰)等",url:"//www.bilibili.com/video/fashion-clothing-1.html"},{name:"时尚潮流",route:"trend",tid:159,ps:15,rps:10,desc:"时尚街拍、时装周、时尚大片,时尚品牌、潮流等行业相关记录及知识科普",url:"#"}]},{name:"资讯",route:"information",tid:202,locid:4076,count:"",subMenuSize:60,slider:{width:620,height:220},viewTag:!1,sub:[{name:"热点",route:"hotspot",tid:203,ps:18,rps:10,desc:"全民关注的时政热门资讯"},{name:"环球",route:"global",tid:204,ps:18,rps:10,desc:"全球范围内发生的具有重大影响力的事件动态"},{name:"社会",route:"social",tid:205,ps:18,rps:10,desc:"日常生活的社会事件、社会问题、社会风貌的报道"},{name:"综合",route:"multiple",tid:206,ps:18,rps:10,desc:"除上述领域外其它垂直领域的综合资讯"}]},{name:"娱乐",route:"ent",tid:5,locid:82,count:"",subMenuSize:62,slider:{width:620,height:220},viewTag:!1,customComponent:{name:"Energy",titleId:2067,leftId:2065,rightId:2066},sub:[{name:"综艺",route:"variety",tid:71,ps:15,rps:10,ad:{active:!0,dataLocId:267},desc:"所有综艺相关,全部一手掌握!",url:"//www.bilibili.com/video/ent-variety-1.html"},{name:"娱乐杂谈",route:"talker",tid:241,ps:15,rps:10,ad:{active:!0,dataLocId:269},desc:"娱乐人物解读、娱乐热点点评、娱乐行业分析"},{name:"粉丝创作",route:"fans",tid:242,ps:15,rps:10,desc:"粉丝向创作视频"},{name:"明星综合",route:"celebrity",tid:137,ps:15,rps:10,desc:"娱乐圈动态、明星资讯相关"}]},{name:"影视",route:"cinephile",tid:181,locid:2211,count:"",subMenuSize:84,slider:{width:620,height:220},viewTag:!1,customComponent:{name:"Energy",titleId:2309,leftId:2307,rightId:2308},sub:[{name:"影视杂谈",route:"cinecism",tid:182,ps:15,rps:10,ad:{active:!0,dataLocId:2212},desc:"影视评论、解说、吐槽、科普等",url:"//www.bilibili.com/video/cinephile-cinecism.html"},{name:"影视剪辑",route:"montage",tid:183,ps:15,rps:10,ad:{active:!0,dataLocId:2213},desc:"对影视素材进行剪辑再创作的视频",url:"//www.bilibili.com/video/cinephile-montage.html"},{name:"短片",route:"shortfilm",tid:85,ps:15,rps:10,desc:"追求自我表达且具有特色的短片",url:"//www.bilibili.com/video/cinephile-shortfilm.html"},{name:"预告·资讯",route:"trailer_info",tid:184,ps:15,rps:10,ad:{active:!0,dataLocId:2214},desc:"影视类相关资讯,预告,花絮等视频",url:"//www.bilibili.com/video/cinephile-trailer-info.html"}]},{name:"纪录片",route:"documentary",tid:177,url:"//www.bilibili.com/documentary/",count:"",takeOvered:!0,hasParent:!0,combination:!0,sub:[{name:"人文·历史",tid:37,route:"history",dise:"",url:"//www.bilibili.com/video/doco-history.html"},{name:"科学·探索·自然",tid:178,route:"science",dise:"",url:"//www.bilibili.com/video/doco-science.html"},{name:"军事",tid:179,route:"military",dise:"",url:"//www.bilibili.com/video/doco-military.html"},{name:"社会·美食·旅行",tid:180,route:"travel",dise:"",url:"//www.bilibili.com/video/doco-travel.html"},{name:"纪录片索引",url:"//www.bilibili.com/documentary/index/"}]},{name:"电影",route:"movie",tid:23,url:"//www.bilibili.com/movie/",count:"",takeOvered:!0,hasParent:!0,combination:!0,sub:[{name:"华语电影",tid:147,route:"chinese",desc:"",url:"//www.bilibili.com/video/movie_chinese_1.html"},{name:"欧美电影",tid:145,route:"west",desc:"",url:"//www.bilibili.com/video/movie_west_1.html"},{name:"日本电影",tid:146,route:"japan",desc:"",url:"//www.bilibili.com/video/movie_japan_1.html"},{name:"其他国家",tid:83,route:"movie",desc:"",url:"//www.bilibili.com/video/movie-movie-1.html"},{name:"电影索引",url:"//www.bilibili.com/movie/index/"}]},{name:"电视剧",route:"tv",tid:11,url:"//www.bilibili.com/tv/",count:"",takeOvered:!0,hasParent:!0,combination:!0,sub:[{name:"国产剧",tid:185,route:"mainland",desc:"",url:"//www.bilibili.com/video/tv-mainland.html"},{name:"海外剧",tid:187,route:"overseas",desc:"",url:"//www.bilibili.com/video/tv-overseas.html"},{name:"电视剧索引",url:"//www.bilibili.com/tv/index/"}]},{name:"虚拟UP主",route:"virtual",locid:4735,count:"",isHide:!0,subMenuSize:60,slider:{width:620,height:220},viewTag:!1,customComponent:{name:"Energy",titleId:4754,leftId:4756},sub:[{name:"游戏",route:"game",tid:4,ps:18,rps:10,url:"//www.bilibili.com/v/virtual/game"},{name:"音乐",route:"music",tid:3,ps:18,rps:10,url:"//www.bilibili.com/v/virtual/music"},{name:"动画",route:"douga",tid:1,ps:18,rps:10,url:"//www.bilibili.com/v/virtual/douga"},{name:"其他",route:"other",tid:0,ps:18,rps:10,url:"//www.bilibili.com/v/virtual/other"}]}]'; // src/images/svg/dislike.svg var dislike_default = '<svg viewBox="0 0 38.89 34.47" width="22px"><defs><style>.cls-1 {fill: #f36392;}</style></defs><g><path class="cls-1" d="M10.28,32.77h2.5V13.19h-2.5ZM25,10.55H35.42a4.15,4.15,0,0,1,3.33,1.67,4.38,4.38,0,0,1,.56,3.47L34.86,30.41a6.37,6.37,0,0,1-6,4.86H5.56a4.52,4.52,0,0,1-4.31-2.36,5.61,5.61,0,0,1-.69-2.5V15.55a4.93,4.93,0,0,1,2.5-4.31,8.38,8.38,0,0,1,2.5-.69h6.25l6.8-8.49A3.83,3.83,0,0,1,25.25,5Zm10.14,2.51H22.22l.28-2.92L22.92,5a1.26,1.26,0,0,0-.18-1,1.28,1.28,0,0,0-.82-.56,1.11,1.11,0,0,0-1.25.42l-6.36,8.2-.83,1.11H5.14a2,2,0,0,0-.83.28,2.28,2.28,0,0,0-1.25,2.08V30.41a2,2,0,0,0,.42,1.25,2,2,0,0,0,2.08,1.11H28.89a2.38,2.38,0,0,0,1.39-.41,3.61,3.61,0,0,0,2.08-2.78L36.8,15l2.5.56L36.8,15a2.45,2.45,0,0,0-.14-1.39,2.89,2.89,0,0,0-1.52-.54l.28-2.5Z" transform="translate(-0.56 -0.82)" /></g></svg>'; // src/images/svg/like.svg var like_default = '<svg viewBox="0 0 38.89 34.47" width="22px"><defs><style>.cls-1 {fill: #f36392;}</style></defs><g><path class="cls-1" d="M12.06,35.27V10.43h-.15l6.7-8.37A3.83,3.83,0,0,1,25.25,5L25,10.55H35.42a4.15,4.15,0,0,1,3.33,1.67,4.38,4.38,0,0,1,.56,3.47L34.86,30.41a6.37,6.37,0,0,1-6,4.86Zm-2.5,0h-4a4.52,4.52,0,0,1-4.31-2.36,5.61,5.61,0,0,1-.69-2.5V15.55a4.93,4.93,0,0,1,2.5-4.31,8.38,8.38,0,0,1,2.5-.69h4Z" transform="translate(-0.56 -0.82)" /></g></svg>'; // src/content/av/en_like.ts var enLike = class { aid = void 0; coin = void 0; span = void 0; liked = false; number = 0; type; svgLike = dislike_default; svgEnLike = like_default; constructor(type, num = 0) { this.type = type; this.number = num; doWhile(() => { this.coin = type === "watchlater" ? document.querySelector(".u.coin") : document.querySelector("[report-id*=coin]"); return this.coin && API.aid; }, () => this.init()); } init() { this.style(); this.aid = API.aid; this.span = document.querySelector(".ulike") || document.createElement("span"); this.span.classList.add("ulike"); this.coin.parentElement.insertBefore(this.span, this.coin); this.changeLiked(); this.span.addEventListener("click", () => this.setLike()); switchVideo(() => this.switch()); try { !this.number && xhr({ url: \`https://api.bilibili.com/x/web-interface/view?aid=\${API.aid}\`, credentials: true, responseType: "json" }, true).then((d) => { this.number = jsonCheck(d).data.stat.like; this.changeLiked(); }); uid && xhr({ url: \`https://api.bilibili.com/x/web-interface/archive/has/like?aid=\${API.aid}\`, credentials: true, responseType: "json" }).then((d) => { d = jsonCheck(d).data; d === 1 && (this.liked = true, this.changeLiked()); }); } catch (e) { toast.error("点赞失败!"); debug.error("点赞失败!", e); } } style() { let style = \`.ulike {cursor: pointer;}.ulike svg{vertical-align: middle;margin-right: 10px;}\`; switch (this.type) { case "bangumi": style += \`.ulike {margin-left: 15px;position: relative;float: left;height: 100%;line-height: 18px;font-size: 12px;color: #222;}\`; break; case "watchlater": style += \`.video-info-module .number .ulike {margin-left: 15px;margin-right: 5px;}\`; break; default: style += \`.video-info-m .number .ulike {margin-left: 15px;margin-right: 5px;}\`; } addCss(style); } setLike() { if (uid) { const like = this.liked ? 2 : 1; xhr({ url: "https://api.bilibili.com/x/web-interface/archive/like", method: "POST", data: \`aid=\${API.aid}&like=\${like}&csrf=\${getCookies().bili_jct}\`, credentials: true, responseType: "json" }).then((d) => { jsonCheck(d).ttl; this.liked = !this.liked; this.number = this.liked ? this.number + 1 : this.number - 1; this.changeLiked(); }); } else { toast.warning("请先登录(不可用) щ(ʘ╻ʘ)щ"); biliQuickLogin(); } } changeLiked() { this.span.innerHTML = \`\${this.liked ? this.svgEnLike : this.svgLike}</i>点赞 \${unitFormat(this.number) || "--"}\`; } switch() { if (this.aid != API.aid) { this.aid = API.aid; xhr({ url: \`https://api.bilibili.com/x/web-interface/view?aid=\${API.aid}\`, credentials: true, responseType: "json" }).then((d) => { this.number = jsonCheck(d).data.stat.like; this.changeLiked(); }); } } }; // src/content/av/collection.ts function calcDivWidth(text) { let elem = document.createElement("div"); elem.setAttribute("style", "display: inline-block"); elem.innerText = text; document.body.append(elem); let w = elem.clientWidth; document.body.removeChild(elem); return w; } function calcOffsetPos(elem) { let result = { x: 0, y: 0 }; for (let e = elem; e != null; e = e.offsetParent) { result.x += e.offsetLeft; result.y += e.offsetTop; } return result; } function getAid() { var _a3; return (_a3 = window.history.state) == null ? void 0 : _a3.aid; } var CollectionElement = class { container; clearfix; items = []; spread = null; constructor(onSpread) { this.container = document.createElement("div"); this.clearfix = document.createElement("ul"); this.clearfix.className = "clearfix"; this.container.appendChild(this.clearfix); if (onSpread) { this.spread = document.createElement("a"); this.spread.className = "item v-part-toggle"; this.spread.addEventListener("click", (e) => { onSpread(); e.preventDefault(); }); this.clearfix.appendChild(this.spread); } } setContainerAttr(attr) { let staticClass = "multi-page bili-wrapper report-wrap-module report-scroll-module"; this.container.className = [staticClass, attr.class].join(" ").trim(); } setItemAttrs(attrs) { while (this.items.length > attrs.length) this.clearfix.removeChild(this.items.pop().node); while (this.items.length < attrs.length) { let i = { click: null, node: document.createElement("a") }; i.node.addEventListener("mouseenter", (e) => this.showFloatTxt(e)); i.node.addEventListener("mouseleave", () => this.hideFloatText()); i.node.addEventListener("click", (e) => { if (e.metaKey || e.altKey || e.ctrlKey || e.shiftKey || e.defaultPrevented || e.button != 0) return; e.preventDefault(); i.click && i.click(e); }); this.clearfix.insertBefore(i.node, this.spread); this.items.push(i); } const staticClass = "item"; for (let i = 0; i < this.items.length; i++) { this.items[i].node.className = [staticClass, attrs[i].class].join(" ").trim(); this.items[i].node.innerText = attrs[i].text; this.items[i].node.href = attrs[i].href; this.items[i].click = attrs[i].click; } } setSpreadAttr(attr) { if (this.spread) { this.spread.style.top = attr.top + "px"; attr.text && (this.spread.innerText = attr.text); } } showFloatTxt(e) { let item = e.target; let treshold = calcDivWidth(item.innerText) + 14; if (item.offsetWidth >= treshold) return; let floatTxt = document.createElement("div"); floatTxt.className = "p-float-txt"; floatTxt.innerText = item.innerText; document.body.appendChild(floatTxt); let pos = calcOffsetPos(item); floatTxt.style.left = pos.x + "px"; floatTxt.style.top = pos.y - 8 - floatTxt.clientHeight + "px"; floatTxt.style.transition = "opacity 0.4s, top 0.4s cubic-bezier(0.37, 0, 0.63, 1)"; floatTxt.style.top = pos.y - 3 - floatTxt.clientHeight + "px"; floatTxt.style.opacity = "1"; } hideFloatText() { let e = document.querySelector(".p-float-txt"); e && document.body.removeChild(e); } }; var CollectionData = class { notify = null; _viewEpisodes = []; _ep = 0; _spread = false; _spreadBtnTop = 0; _colCount = 4; episodes = []; get viewEpisodes() { return this._viewEpisodes; } get ep() { if (this.episodes[this._ep].aid != getAid()) this._ep = this.episodes.findIndex((ep) => ep.aid == getAid()); return this._ep; } get spreadBtnTop() { return this._spreadBtnTop; } set spreadBtnTop(n) { var _a3; if (this._spreadBtnTop != n) { this._spreadBtnTop = n; (_a3 = this.notify) == null ? void 0 : _a3.spreadBtnTop(this._spreadBtnTop); } } get spread() { return this._spread; } get colCount() { return this._colCount; } get pageList() { return this.episodes.reduce((s, ep, i) => { s.push({ aid: ep.aid, cid: ep.cid, page: i + 1, part: ep.title, duration: ep.page.duration, dimension: ep.page.dimension, from: ep.page.from, vid: "", weblink: "" }); return s; }, []); } constructor(season) { this.initEpisodes(season); this.calcColCount(); this._viewEpisodes = !this.needSpread() ? this.episodes : this.calcViewEpisodesOnCollapsed(this.ep); } initEpisodes(season) { season.sections.forEach((section2) => { Array.prototype.push.apply(this.episodes, section2.episodes); }); } calcColCount() { let w = calcDivWidth(this.episodes[this.ep].title); this._colCount = w >= 241 ? 3 : w >= 186 ? 4 : w >= 149 ? 5 : w >= 123 ? 6 : window.innerWidth > 1440 ? 7 : 6; } calcViewEpisodesOnCollapsed(ep) { let begin = ep == 0 ? 0 : ep - 1 + this._colCount <= this.episodes.length ? ep - 1 : Math.max(this.episodes.length - this._colCount, 0); return this.episodes.slice(begin, begin + this._colCount); } needSpread() { return this._colCount < this.episodes.length || this.spread; } toggleSpread() { var _a3; this._spread = !this._spread; this._viewEpisodes = this._spread ? this.episodes : this.calcViewEpisodesOnCollapsed(this.ep); this._spreadBtnTop = 0; this.calcColCount(); (_a3 = this.notify) == null ? void 0 : _a3.spread(this._spread); } updateEp() { var _a3; let ep = this._ep; if (ep == this.ep) return; this._viewEpisodes = this._spread ? this.episodes : this.calcViewEpisodesOnCollapsed(this.ep); (_a3 = this.notify) == null ? void 0 : _a3.ep(); } }; var CollectionComponent = class { data; elem; constructor(season, player2) { this.data = new CollectionData(season); this.elem = new CollectionElement(this.data.needSpread() ? () => this.data.toggleSpread() : null); window.callAppointPart = (_p, video) => { let state = { aid: video.aid, cid: video.cid }; window.history.pushState(state, "", "/video/av" + video.aid); this.onRouteChanged(state); }; window.addEventListener("popstate", (e) => { this.reloadPlayer(e.state); this.onRouteChanged(e.state); }); window.addEventListener("scroll", () => this.onWindowScroll()); this.render(); player2.parentNode.insertBefore(this.elem.container, player2); this.data.notify = { spread: (spread) => { this.render(); !spread && window.scroll({ top: calcOffsetPos(document.getElementById("viewbox_report")).y }); }, spreadBtnTop: (top) => { this.elem.setSpreadAttr({ top }); }, ep: () => this.render() }; xhrhook("/x/player/pagelist", void 0, (r) => { r.response = JSON.stringify({ code: 0, message: 0, ttl: 1, data: this.data.pageList }); r.responseText = r.response; }, false); } render() { this.elem.setContainerAttr({ class: "col-" + this.data.colCount }); this.elem.setItemAttrs(this.data.viewEpisodes.map((p) => { return { class: p.aid == getAid() ? "on" : "", href: "/video/av" + p.aid, text: p.title, click: (_e) => { let video = { aid: p.aid, cid: p.cid }; this.reloadPlayer(video); window.callAppointPart(1, video); } }; }, this)); this.elem.setSpreadAttr({ top: this.data.spreadBtnTop, text: this.data.spread ? "收起" : "展开" }); } reloadPlayer(v) { window.GrayManager.reload(\`aid=\${v.aid}&cid=\${v.cid}&has_next=1\`); } onWindowScroll() { if (!this.data.spread) return; let div = this.elem.container; let btn = this.elem.spread; let divY = calcOffsetPos(div).y; let maxTop = div.clientHeight - btn.clientHeight - 20; this.data.spreadBtnTop = window.scrollY <= divY - 20 ? 0 : Math.min(window.scrollY - divY + 20, maxTop); } onRouteChanged(state) { this.data.updateEp(); let avComponent = window.biliUIcomponents; avComponent.\$store.state.aid = state.aid; xhr({ url: objUrl("https://api.bilibili.com/x/web-interface/view/detail", { aid: state.aid }), responseType: "json", credentials: true }).then((d) => { var _a3; avComponent == null ? void 0 : avComponent.setVideoData((_a3 = d.data) == null ? void 0 : _a3.View); }); xhr({ url: objUrl("https://api.bilibili.com/x/web-interface/archive/related", { aid: state.aid }), responseType: "json", credentials: true }).then((d) => avComponent.related = d.data); avComponent.initPage(); } }; var Collection = class { component = void 0; constructor(videoData) { xhrhook("/x/player.so", void 0, (r) => { r.response = r.response.replace(/<has_next>\\s*0/, "<has_next>1"); r.responseText = r.response; }, false); doWhile(() => document.getElementById("__bofqi"), (player2) => { try { window.history.replaceState({ aid: videoData.aid, cid: videoData.cid }, ""); this.component = new CollectionComponent(videoData.ugc_season, player2); this.component.render(); } catch (e) { toast.error("collection.js", e); } }); toast.warning("视频合集,现以分P样式呈现!", "如需关闭,请访问设置-重构-合集选项。"); } static needDisplay(videoData) { return videoData.videos <= 1 && videoData.ugc_season && videoData.is_season_display; } static run(videoData) { this.needDisplay(videoData) && new Collection(videoData); } }; function collection(v) { Collection.run(v); } // src/content/av/up_list.css var up_list_default = ".up-info-m .up-card-box {\\r\\n white-space: nowrap;\\r\\n overflow: auto;\\r\\n}\\r\\n\\r\\n.up-info-m .up-card {\\r\\n display: inline-block;\\r\\n margin-top: 10px;\\r\\n}\\r\\n\\r\\n.up-info-m .avatar img {\\r\\n cursor: pointer;\\r\\n width: 40px;\\r\\n height: 40px;\\r\\n border-radius: 50%;\\r\\n}\\r\\n\\r\\n.up-info-m .avatar {\\r\\n position: relative;\\r\\n}\\r\\n\\r\\n.up-info-m .avatar .info-tag {\\r\\n position: absolute;\\r\\n background: #fff;\\r\\n border: 1px solid #fb7299;\\r\\n border-radius: 2px;\\r\\n display: inline-block;\\r\\n font-size: 12px;\\r\\n color: #fb7299;\\r\\n padding: 0 3px;\\r\\n top: -10px;\\r\\n right: -10px;\\r\\n white-space: nowrap;\\r\\n}\\r\\n\\r\\n.up-info-m .avatar {\\r\\n width: 60px;\\r\\n height: 30px;\\r\\n display: -ms-flexbox;\\r\\n display: flex;\\r\\n -ms-flex-pack: center;\\r\\n justify-content: center;\\r\\n -ms-flex-align: start;\\r\\n align-items: flex-start;\\r\\n}\\r\\n\\r\\n.up-info-m .avatar .name-text {\\r\\n font-family: PingFangSC-Regular, sans-serif;\\r\\n line-height: 30px;\\r\\n color: #222;\\r\\n word-break: break-all;\\r\\n overflow: hidden;\\r\\n text-overflow: ellipsis;\\r\\n display: -webkit-box;\\r\\n -webkit-line-clamp: 2;\\r\\n -webkit-box-orient: vertical;\\r\\n white-space: nowrap;\\r\\n}\\r\\n\\r\\n.up-info-m .avatar .name-text.is-vip,\\r\\n.up-info-m .avatar .name-text:hover {\\r\\n color: #fb7299;\\r\\n}\\r\\n\\r\\n.up-info-m .title {\\r\\n display: block;\\r\\n font-size: 14px;\\r\\n margin-right: 80px;\\r\\n color: #525659;\\r\\n overflow: hidden;\\r\\n height: 24px;\\r\\n font-weight: 400;\\r\\n padding: 8px 0;\\r\\n}\\r\\n\\r\\n.up-card-box::-webkit-scrollbar {\\r\\n width: 7px;\\r\\n height: 7px;\\r\\n}\\r\\n\\r\\n.up-card-box::-webkit-scrollbar-track {\\r\\n border-radius: 4px;\\r\\n background-color: #EEE;\\r\\n}\\r\\n\\r\\n.up-card-box::-webkit-scrollbar-thumb {\\r\\n border-radius: 4px;\\r\\n background-color: #999;\\r\\n}"; // src/content/av/up_list.ts function upList(staff) { doWhile(() => document.querySelector("#v_upinfo"), (node4) => { let fl = '<span class="title">UP主列表</span><div class="up-card-box">'; fl = staff.reduce((s, d) => { s = s + \`<div class="up-card"> <a href="//space.bilibili.com/\${d.mid}" data-usercard-mid="\${d.mid}" target="_blank" class="avatar"> <img src="\${d.face}@48w_48h.webp" /><!----> <span class="info-tag">\${d.title}</span><!----></a> <div class="avatar"> <a href="//space.bilibili.com/\${d.mid}" data-usercard-mid="\${d.mid}" target="_blank" class="\${d.vip && d.vip.status ? "name-text is-vip" : "name-text"}">\${d.name}</a> </div></div>\`; return s; }, fl) + \`</div>\`; node4.innerHTML = fl; addCss(up_list_default, "up-list"); }); } // src/content/bangumi/script.html var script_default2 = '<script type="text/javascript" src="//static.hdslb.com/js/jquery.min.js"><\\/script>\\r\\n<script type="text/javascript" src="//static.hdslb.com/vip/dist/js/vipPlugin.v2.js"><\\/script>\\r\\n<script type="text/javascript" src="//static.hdslb.com/js/promise.auto.min.js"><\\/script>\\r\\n<script type="text/javascript" src="//s1.hdslb.com/bfs/seed/jinkela/header/header.js"><\\/script>\\r\\n<script type="text/javascript" src="//s1.hdslb.com/bfs/seed/jinkela/commentpc/comment.min.js"><\\/script>\\r\\n<script src="//s1.hdslb.com/bfs/static/plugin/vip/BilAccountThaw.js"><\\/script>\\r\\n<script>\\r\\n window.__INITIAL_STATE__ = { activity: {}, app: false, area: 0, canReview: false, epId: -1, epInfo: {}, epList: [], epStat: { isPay: false, isVip: false, payPack: 0, status: 0, vipNeedPay: false }, isPlayerTrigger: false, loginInfo: { isLogin: false }, mdId: -1, mediaInfo: {}, mediaRating: {}, miniOn: 0, newestEp: {}, paster: {}, payMent: {}, payPack: {}, playerRecomList: [], pubInfo: {}, recomList: [], rightsInfo: {}, seasonFollowed: false, seasonList: [], seasonStat: { coins: 0, danmakus: 0, favorites: 0, views: 0 }, special: false, spending: 0, sponsorTotal: { code: 0, result: { ep_bp: 0, list: [], mine: {}, users: 0 } }, sponsorTotalCount: 0, sponsorWeek: { code: 0, result: { ep_bp: 0, list: [], mine: {}, users: 0 } }, ssId: -1, ssStat: { isPay: false, isVip: false, payPack: 0, status: 0, vipNeedPay: false }, upInfo: {}, userCoined: false, userLongReview: {}, userScore: 0, userShortReview: {}, userStat: { error: true, follow: 0, loaded: true, pay: 0, payPackPaid: 0, sponsor: 0, vipInfo: { due_date: 0, status: 0, type: 0 }, watchProgress: { lastEpId: -1, lastEpIndex: "", lastTime: 0 } }, ver: {} }; (function () { Reflect.deleteProperty(window, "webpackJsonp"); Reflect.deleteProperty(window, "_babelPolyfill"); var s; (s = document.currentScript || document.scripts[document.scripts.length - 1]).parentNode.removeChild(s); }());\\r\\n<\\/script>\\r\\n<script src="//s1.hdslb.com/bfs/static/bangumi/play/1.bangumi-play.809bd6f6d1fba866255d2e6c5dc06dabba9ce8b4.js"\\r\\n crossorigin=""><\\/script>\\r\\n<script src="//s1.hdslb.com/bfs/static/bangumi/play/bangumi-play.809bd6f6d1fba866255d2e6c5dc06dabba9ce8b4.js"\\r\\n crossorigin=""><\\/script>\\r\\n<script type="text/javascript" src="//static.hdslb.com/common/js/footer.js"><\\/script>'; // src/content/bangumi/bangumi.html var bangumi_default = '<!-- <!DOCTYPE html> -->\\r\\n<html lang="zh-CN">\\r\\n\\r\\n<head>\\r\\n <meta charset="utf-8" />\\r\\n <title>哔哩哔哩 (゜-゜)つロ 干杯~-bilibili</title>\\r\\n <meta name="description" content="bilibili是国内知名的视频弹幕网站,这里有最及时的动漫新番,最棒的ACG氛围,最有创意的Up主。大家可以在这里找到许多欢乐。" />\\r\\n <meta name="keywords"\\r\\n content="Bilibili,哔哩哔哩,哔哩哔哩动画,哔哩哔哩弹幕网,弹幕视频,B站,弹幕,字幕,AMV,MAD,MTV,ANIME,动漫,动漫音乐,游戏,游戏解说,二次元,游戏视频,ACG,galgame,动画,番组,新番,初音,洛天依,vocaloid,日本动漫,国产动漫,手机游戏,网络游戏,电子竞技,ACG燃曲,ACG神曲,追新番,新番动漫,新番吐槽,巡音,镜音双子,千本樱,初音MIKU,舞蹈MMD,MIKUMIKUDANCE,洛天依原创曲,洛天依翻唱曲,洛天依投食歌,洛天依MMD,vocaloid家族,OST,BGM,动漫歌曲,日本动漫音乐,宫崎骏动漫音乐,动漫音乐推荐,燃系mad,治愈系mad,MAD MOVIE,MAD高燃" />\\r\\n <meta name="renderer" content="webkit" />\\r\\n <meta http-equiv="X-UA-Compatible" content="IE=edge" />\\r\\n <link rel="search" type="application/opensearchdescription+xml" href="//static.hdslb.com/opensearch.xml"\\r\\n title="哔哩哔哩" />\\r\\n <link rel="stylesheet"\\r\\n href="//s1.hdslb.com/bfs/static/bangumi/play/css/bangumi-play.0.809bd6f6d1fba866255d2e6c5dc06dabba9ce8b4.css" />\\r\\n <style type="text/css">\\r\\n .new-entry {\\r\\n display: none;\\r\\n }\\r\\n </style>\\r\\n</head>\\r\\n\\r\\n<body>\\r\\n <div class="z-top-container has-menu"></div>\\r\\n <div id="app" data-server-rendered="true" class="main-container"></div>\\r\\n <div class="footer bili-footer report-wrap-module" id="home_footer"></div>\\r\\n</body>\\r\\n\\r\\n</html>'; // src/content/bangumi/bangumi_initial_state.ts function setEpStat(status, pay, payPackPaid, loginInfo) { var s = 0, o = false, a = (1 === loginInfo.vipType || 2 === loginInfo.vipType) && 1 === loginInfo.vipStatus, r = "number" == typeof payPackPaid ? payPackPaid : -1; return 1 === pay ? s = 0 : 6 === status || 7 === status ? s = loginInfo.isLogin ? a ? 0 : 1 : 2 : 8 === status || 9 === status ? (s = loginInfo.isLogin ? 1 : 2, o = true) : 12 === status ? s = loginInfo.isLogin ? 1 === r ? 0 : 1 : 2 : 13 === status && (s = loginInfo.isLogin ? a ? 0 : 1 : 2), { status: s, isPay: 6 === status || 7 === status || 8 === status || 9 === status || 12 === status || 13 === status, isVip: a, vipNeedPay: o, payPack: r }; } function V(t, e) { var i = Number(t), n = 1 === e || 4 === e || "番剧" === e || "国创" === e ? "话" : "集"; return isNaN(i) ? t : "第".concat(i).concat(n); } function Q(t, e) { var i = { 1: "番剧", 2: "电影", 3: "纪录片", 4: "国创", 5: "电视剧", 7: "综艺", music: "音乐" }; return [26484, 26481].indexOf(e) > -1 ? i.music : i[t] || "番剧"; } function setTitle(t, e, i, n) { var s = !(arguments.length > 4 && void 0 !== arguments[4]) || arguments[4], o = ""; if (i = void 0 === i ? "番剧" : i, e && i) if (s && t) { var a = V(t, i); o = "".concat(e, ":").concat(a, "_").concat(i).concat(n ? "_bilibili" : "", "_哔哩哔哩"); } else o = "".concat(e, "_").concat(i).concat(n ? "_bilibili" : "", "_哔哩哔哩"); else o = "番剧".concat(n ? "_bilibili" : "", "_哔哩哔哩"); if ("undefined" != typeof window) { var r = window.document.createElement("div"); r.innerHTML = o, o = r.innerText || r.textContent, r = null; } return o; } async function bangumiInitialState() { try { let ssid = API.ssid; let epid = API.epid; const obj = epid ? { ep_id: epid } : { season_id: ssid }; const result = await Promise.allSettled([ xhr({ url: objUrl("https://bangumi.bilibili.com/view/web_api/season", obj), responseType: "json", credentials: true }, true), xhr({ url: objUrl("https://api.bilibili.com/pgc/view/web/season/user/status", obj), responseType: "json", credentials: true }, true) ]); const data = {}; await new Promise((r) => doWhile(() => window.__INITIAL_STATE__, r)); const t = window.__INITIAL_STATE__; result[0].status === "fulfilled" && result[0].value.code === 0 && (data.bangumi = result[0].value.result); result[1].status === "fulfilled" && result[1].value.code === 0 && (data.status = result[1].value.result); if (data.status) { const i = data.status.progress ? data.status.progress.last_ep_id : -1, n = data.status.progress ? data.status.progress.last_ep_index : "", s = data.status.progress ? data.status.progress.last_time : 0, o = data.status.vip_info || {}; !epid && i > 0 && (epid = i); t.userStat = { loaded: true, error: void 0 === data.status.pay, follow: data.status.follow || 0, pay: data.status.pay || 0, payPackPaid: data.status.pay_pack_paid || 0, sponsor: data.status.sponsor || 0, watchProgress: { lastEpId: 0 === i ? -1 : i, lastEpIndex: n, lastTime: s }, vipInfo: { due_date: o.due_date || 0, status: o.status || 0, type: o.type || 0 } }; data.status.paster && (t.paster = data.status.paster || {}); API.limit = data.status.area_limit || 0; !setting.videoLimit.switch && (t.area = API.limit); t.seasonFollowed = 1 === data.status.follow; } if (data.bangumi) { let loopTitle2 = function() { doWhile(() => document.title != title, () => { document.title = title; if (document.title != title) loopTitle2(); }); }; var loopTitle = loopTitle2; const i = JSON.parse(JSON.stringify(data.bangumi)); delete i.episodes; delete i.seasons; delete i.up_info; delete i.rights; delete i.publish; delete i.newest_ep; delete i.rating; delete i.pay_pack; delete i.payment; delete i.activity; if (setting.bangumiEplist) delete i.bkg_cover; setting.videoLimit.switch && data.bangumi.rights && (data.bangumi.rights.watch_platform = 0); t.mediaInfo = i; t.mediaInfo.bkg_cover && (t.special = true, API.bkg_cover = t.mediaInfo.bkg_cover); t.ssId = data.bangumi.season_id || -1; t.mdId = data.bangumi.media_id; t.epInfo = epid && data.bangumi.episodes.find((d) => d.ep_id == epid) || data.bangumi.episodes[0] || {}; t.epList = data.bangumi.episodes || []; t.seasonList = data.bangumi.seasons || []; t.upInfo = data.bangumi.up_info || {}; t.rightsInfo = data.bangumi.rights || {}; t.app = 1 === t.rightsInfo.watch_platform; t.pubInfo = data.bangumi.publish || {}; t.newestEp = data.bangumi.newest_ep || {}; t.mediaRating = data.bangumi.rating || {}; t.payPack = data.bangumi.pay_pack || {}; t.payMent = data.bangumi.payment || {}; t.activity = data.bangumi.activity || {}; t.epStat = setEpStat(t.epInfo.episode_status || t.mediaInfo.season_status, t.userStat.pay, t.userStat.payPackPaid, t.loginInfo); t.epId = Number(epid || t.epInfo.ep_id); API.ssid = t.ssId; API.epid = t.epId; if (t.epInfo.badge === "互动") { sessionStorage2.setItem("keepNew", "旧版页面不支持互动视频!已重定向回新版页面,番剧能互动🤣"); location.reload(); } if (t.upInfo.mid == 677043260 || t.upInfo.mid == 688418886) { API.th = true; } const title = setTitle(t.epInfo.index, t.mediaInfo.title, Q(t.mediaInfo.season_type), true); loopTitle2(); } else { debug.error(result[0]); debug.error(result[1]); return globalSession(); } } catch (e) { toast.error("获取视频数据出错 ಥ_ಥ"); debug.error("视频数据", e); } } async function globalSession() { var _a3, _b, _c, _d, _e, _f; toast.info("Bangumi号可能无效~", "正在尝试泰区代理接口~"); let ssid = API.ssid; let epid = API.epid; const obj = epid ? { ep_id: epid } : { season_id: ssid }; Object.assign(obj, { access_key: setting.accessKey.key || void 0, build: 108003, mobi_app: "bstar_a", s_locale: "zh_SG" }); try { const result = await xhr({ url: objUrl(\`https://\${setting.videoLimit.th || "api.global.bilibili.com"}/intl/gateway/v2/ogv/view/app/season\`, obj), responseType: "json" }, true); if (result.code === 0) { let loopTitle2 = function() { doWhile(() => document.title != title, () => { document.title = title; if (document.title != title) loopTitle2(); }); }; var loopTitle = loopTitle2; window.postMessage({ \$type: "th" }); await new Promise((r) => doWhile(() => window.__INITIAL_STATE__, r)); const t = window.__INITIAL_STATE__; const i = JSON.parse(JSON.stringify(result.result)); const episodes = result.result.modules.reduce((s, d) => { d.data.episodes.forEach((d2) => { s.push({ aid: d2.aid, cid: d2.id, cover: d2.cover, ep_id: d2.id, episode_status: d2.status, from: d2.from, index: d2.title, index_title: d2.title_display, subtitles: d2.subtitles }); }); return s; }, []); t.mediaInfo = { actors: (_a3 = i.actor) == null ? void 0 : _a3.info, alias: i.alias, areas: i.areas, cover: i.cover, evaluate: i.evaluate, is_paster_ads: 0, jp_title: i.origin_name, link: i.link, media_id: -1, mode: i.mode, paster_text: "", season_id: i.season_id, season_status: i.status, season_title: i.season_title, season_type: i.type, series_title: i.title, square_cover: i.square_cover, staff: (_b = i.actor) == null ? void 0 : _b.info, stat: i.stat, style: (_c = i.styles) == null ? void 0 : _c.reduce((s, d) => { s.push(d.name); return s; }, []), title: i.title, total_ep: i.total }; t.mediaInfo.bkg_cover && (t.special = true, API.bkg_cover = t.mediaInfo.bkg_cover); t.ssId = result.result.season_id || -1; t.epInfo = epid && episodes.find((d) => d.ep_id == epid) || episodes[0] || {}; t.epList = episodes; t.seasonList = ((_e = (_d = result.result.series) == null ? void 0 : _d.seasons) == null ? void 0 : _e.reduce((s, d) => { s.push({ badge: "独家", badge_type: 1, cover: "", media_id: -1, new_ep: {}, season_id: d.season_id, season_title: d.quarter_title, season_type: 1, stat: {}, title: d.quarter_title }); return s; }, [])) || []; t.upInfo = result.result.up_info || {}; t.rightsInfo = result.result.rights || {}; t.app = 1 === t.rightsInfo.watch_platform; result.result.publish.is_started = 1; ((_f = result.result.publish) == null ? void 0 : _f.time_length_show) === "已完结" && (result.result.publish.is_finish = 1); t.pubInfo = result.result.publish || {}; if (result.result.new_ep) { result.result.new_ep.desc = result.result.new_ep.new_ep_display; result.result.new_ep.index = result.result.new_ep.title; } t.newestEp = result.result.new_ep || {}; t.mediaRating = result.result.rating || {}; t.payPack = result.result.pay_pack || {}; t.payMent = result.result.payment || {}; t.activity = result.result.activity_dialog || {}; t.epStat = setEpStat(t.epInfo.episode_status || t.mediaInfo.season_status, t.userStat.pay, t.userStat.payPackPaid, t.loginInfo); t.epId = Number(epid || t.epInfo.ep_id); API.ssid = t.ssId; API.epid = t.epId; API.th = true; xhrhook("api.bilibili.com/pgc/web/season/stat", void 0, (res) => { const t2 = \`{"code": 0,"message":"0","ttl":1,"result":\${JSON.stringify(result.result.stat)}}\`; res.responseType === "json" ? res.response = JSON.parse(t2) : res.response = res.responseText = t2; }, false); toast.warning("这大概是一个泰区专属Bangumi,可能没有弹幕和评论区,可以使用【在线弹幕】【播放本地文件】等功能载入弹幕~", "另外:播放泰区番剧还可能导致历史记录错乱,请多担待🤣"); const title = setTitle(t.epInfo.index, t.mediaInfo.title, Q(t.mediaInfo.season_type), true); loopTitle2(); } else throw result; } catch (e) { toast.error("访问泰区B站出错,请检查泰区代理服务器设置~", "或许这就是个无效Bangumi?", e); debug.error("BilibiliGlobal", e); } } // src/content/av/load_by_dm_id.ts function loadByDmId() { const dmid = urlObj(location.href).dmid; let progress = Number(urlObj(location.href).dm_progress); let first2 = 0; switchVideo(async () => { var _a3; if (!((_a3 = window.player) == null ? void 0 : _a3.seek)) { await new Promise((r) => { doWhile(() => { var _a4; return (_a4 = window.player) == null ? void 0 : _a4.seek; }, r); }); } if (first2) return; first2++; if (progress) return window.player.seek(progress); if (dmid) { progress = await xhr({ url: \`https://api.bilibili.com/x/v2/dm/thumbup/detail?oid=\${API.cid}&dmid=\${dmid}\`, credentials: true }, true); progress = jsonCheck(progress).data.progress; progress && window.player.seek(progress / 1e3 - 0.2); } }); } // src/runtime/lib/cubic_bezier.ts var NEWTON_ITERATIONS = 4; var NEWTON_MIN_SLOPE = 1e-3; var SUBDIVISION_PRECISION = 1e-7; var SUBDIVISION_MAX_ITERATIONS = 10; var kSplineTableSize = 11; var kSampleStepSize = 1 / (kSplineTableSize - 1); var float32ArraySupported = typeof Float32Array === "function"; function A(aA1, aA2) { return 1 - 3 * aA2 + 3 * aA1; } function B(aA1, aA2) { return 3 * aA2 - 6 * aA1; } function C(aA1) { return 3 * aA1; } function calcBezier(aT, aA1, aA2) { return ((A(aA1, aA2) * aT + B(aA1, aA2)) * aT + C(aA1)) * aT; } function getSlope(aT, aA1, aA2) { return 3 * A(aA1, aA2) * aT * aT + 2 * B(aA1, aA2) * aT + C(aA1); } function binarySubdivide(aX, aA, aB, mX1, mX2) { let currentX, currentT, i = 0; do { currentT = aA + (aB - aA) / 2; currentX = calcBezier(currentT, mX1, mX2) - aX; if (currentX > 0) { aB = currentT; } else { aA = currentT; } } while (Math.abs(currentX) > SUBDIVISION_PRECISION && ++i < SUBDIVISION_MAX_ITERATIONS); return currentT; } function newtonRaphsonIterate(aX, aGuessT, mX1, mX2) { for (let i = 0; i < NEWTON_ITERATIONS; ++i) { const currentSlope = getSlope(aGuessT, mX1, mX2); if (currentSlope === 0) { return aGuessT; } const currentX = calcBezier(aGuessT, mX1, mX2) - aX; aGuessT -= currentX / currentSlope; } return aGuessT; } function LinearEasing(x) { return x; } function bezier(mX1, mY1, mX2, mY2) { if (!(0 <= mX1 && mX1 <= 1 && 0 <= mX2 && mX2 <= 1)) { throw new Error("bezier x values must be in [0, 1] range"); } if (mX1 === mY1 && mX2 === mY2) { return LinearEasing; } const sampleValues = float32ArraySupported ? new Float32Array(kSplineTableSize) : new Array(kSplineTableSize); for (let i = 0; i < kSplineTableSize; ++i) { sampleValues[i] = calcBezier(i * kSampleStepSize, mX1, mX2); } function getTForX(aX) { let intervalStart = 0; let currentSample = 1; const lastSample = kSplineTableSize - 1; for (; currentSample !== lastSample && sampleValues[currentSample] <= aX; ++currentSample) { intervalStart += kSampleStepSize; } --currentSample; const dist = (aX - sampleValues[currentSample]) / (sampleValues[currentSample + 1] - sampleValues[currentSample]); const guessForT = intervalStart + dist * kSampleStepSize; const initialSlope = getSlope(guessForT, mX1, mX2); if (initialSlope >= NEWTON_MIN_SLOPE) { return newtonRaphsonIterate(aX, guessForT, mX1, mX2); } else if (initialSlope === 0) { return guessForT; } else { return binarySubdivide(aX, intervalStart, intervalStart + kSampleStepSize, mX1, mX2); } } return function BezierEasing(x) { if (x === 0 || x === 1) { return x; } return calcBezier(getTForX(x), mY1, mY2); }; } // src/content/animated_banner.html var animated_banner_default = '<style type="text/css">\\r\\n .animated-banner {\\r\\n position: absolute;\\r\\n top: 0;\\r\\n bottom: 0;\\r\\n left: 0;\\r\\n right: 0;\\r\\n }\\r\\n\\r\\n .animated-banner>.layer {\\r\\n position: absolute;\\r\\n left: 0;\\r\\n top: 0;\\r\\n height: 100%;\\r\\n width: 100%;\\r\\n display: flex;\\r\\n align-items: center;\\r\\n justify-content: center;\\r\\n overflow: hidden;\\r\\n }\\r\\n\\r\\n @keyframes banner-fade-in {\\r\\n 0% {\\r\\n opacity: 0;\\r\\n }\\r\\n\\r\\n 100% {\\r\\n opacity: 1;\\r\\n }\\r\\n }\\r\\n\\r\\n .animated-banner .layer {\\r\\n animation: banner-fade-in 0.7s;\\r\\n }\\r\\n</style>'; // src/content/banner.ts var primaryMenu = () => { doWhile(() => document.querySelector("#primary_menu"), () => { const vue = document.querySelector("#primary_menu").__vue__; vue.menuList.forEach((d, i, s) => { switch (d.name) { case "动画": s[i].sub = [{ "name": "MAD·AMV", "route": "mad", "tid": 24, "ps": 15, "rps": 10, "ad": { "active": true, "dataLocId": 151 }, "desc": "具有一定制作程度的动画或静画的二次创作视频", "url": "//www.bilibili.com/video/douga-mad-1.html" }, { "name": "MMD·3D", "route": "mmd", "tid": 25, "ps": 15, "rps": 10, "ad": { "active": true, "dataLocId": 152 }, "desc": "使用MMD(MikuMikuDance)和其他3D建模类软件制作的视频", "url": "//www.bilibili.com/video/douga-mmd-1.html" }, { "name": "短片·手书·配音", "route": "voice", "tid": 47, "ps": 15, "rps": 10, "desc": "追求创新并具有强烈特色的短片、手书(绘)及ACG相关配音", "url": "//www.bilibili.com/video/douga-voice-1.html" }, { "name": "手办·模玩", "route": "garage_kit", "tid": 210, "ps": 15, "rps": 10, "desc": "手办模玩的测评、改造或其他衍生内容", "url": "" }, { "name": "特摄", "route": "tokusatsu", "tid": 86, "ps": 15, "rps": 10, "desc": "特摄相关衍生视频", "url": "//www.bilibili.com/video/cinephile-tokusatsu.html" }, { "name": "综合", "route": "other", "tid": 27, "ps": 15, "rps": 10, "ad": { "active": true, "dataLocId": 153 }, "desc": "以动画及动画相关内容为素材,包括但不仅限于音频替换、杂谈、排行榜等内容", "url": "//www.bilibili.com/video/douga-else-1.html" }]; break; case "音乐": s[i].sub = [{ "name": "原创音乐", "route": "original", "tid": 28, "ps": 15, "rps": 10, "viewHotTag": true, "ad": { "active": true, "dataLocId": 243 }, "dpConfig": [{ "name": "一日", "value": 1 }, { "name": "三日", "value": 3 }], "desc": "原创歌曲及纯音乐,包括改编、重编曲及remix", "url": "//www.bilibili.com/video/music-original-1.html" }, { "name": "翻唱", "route": "cover", "tid": 31, "ps": 15, "rps": 10, "ad": { "active": true, "dataLocId": 245 }, "viewHotTag": true, "dpConfig": [{ "name": "一日", "value": 1 }, { "name": "三日", "value": 3 }], "desc": "对曲目的人声再演绎视频", "url": "//www.bilibili.com/video/music-Cover-1.html" }, { "name": "演奏", "route": "perform", "tid": 59, "ps": 15, "rps": 10, "viewHotTag": true, "dpConfig": [{ "name": "一日", "value": 1 }, { "name": "三日", "value": 3 }], "desc": "乐器和非传统乐器器材的演奏作品", "url": "//www.bilibili.com/video/music-perform-1.html" }, { "name": "VOCALOID·UTAU", "route": "vocaloid", "tid": 30, "ps": 15, "rps": 10, "viewHotTag": true, "ad": { "active": true, "dataLocId": 247 }, "dpConfig": [{ "name": "一日", "value": 1 }, { "name": "三日", "value": 3 }], "desc": "以VOCALOID等歌声合成引擎为基础,运用各类音源进行的创作", "url": "//www.bilibili.com/video/music-vocaloid-1.html" }, { "name": "音乐现场", "route": "live", "tid": 29, "ps": 15, "rps": 10, "viewHotTag": true, "dpConfig": [{ "name": "一日", "value": 1 }, { "name": "三日", "value": 3 }], "desc": "音乐表演的实况视频,包括官方/个人拍摄的综艺节目、音乐剧、音乐节、演唱会等", "url": "//www.bilibili.com/video/music-oped-1.html" }, { "name": "MV", "route": "mv", "tid": 193, "ps": 15, "rps": 10, "viewHotTag": true, "dpConfig": [{ "name": "一日", "value": 1 }, { "name": "三日", "value": 3 }], "desc": "为音乐作品配合拍摄或制作的音乐录影带(Music Video),以及自制拍摄、剪辑、翻拍MV", "url": "//www.bilibili.com/video/music-coordinate-1.html" }, { "name": "乐评盘点", "route": "commentary", "tid": 243, "ps": 15, "rps": 10, "viewHotTag": true, "dpConfig": [{ "name": "一日", "value": 1 }, { "name": "三日", "value": 3 }], "desc": "音乐类新闻、盘点、点评、reaction、榜单、采访、幕后故事、唱片开箱等", "url": "//www.bilibili.com/video/music-collection-1.html" }, { "name": "音乐教学", "route": "tutorial", "tid": 244, "ps": 15, "rps": 10, "viewHotTag": true, "dpConfig": [{ "name": "一日", "value": 1 }, { "name": "三日", "value": 3 }], "desc": "以音乐教学为目的的内容", "url": "//www.bilibili.com/video/music-collection-1.html" }, { "name": "音乐综合", "route": "other", "tid": 130, "ps": 15, "rps": 10, "viewHotTag": true, "dpConfig": [{ "name": "一日", "value": 1 }, { "name": "三日", "value": 3 }], "desc": "所有无法被收纳到其他音乐二级分区的音乐类视频", "url": "//www.bilibili.com/video/music-collection-1.html" }, { "name": "音频", "customZone": "Audio", "route": "audio", "url": "//www.bilibili.com/audio/home?musicType=music" }, { "name": "说唱", "url": "//www.bilibili.com/v/rap" }]; break; case "科技": s[i].name = "知识"; s[i].route = "knowledge"; s[i].sub = [{ "name": "科学科普", "route": "science", "tid": 201, "ps": 15, "rps": 10, "ad": { "active": true, "dataLocId": 261 }, "desc": "回答你的十万个为什么" }, { "name": "社科·法律·心理", "route": "social_science", "tid": 124, "ps": 15, "rps": 10, "ad": { "active": true, "dataLocId": 263 }, "desc": "基于社会科学、法学、心理学展开或个人观点输出的知识视频" }, { "name": "人文历史", "route": "humanity_history", "tid": 228, "ps": 15, "rps": 10, "desc": "看看古今人物,聊聊历史过往,品品文学典籍" }, { "name": "财经商业", "route": "business", "tid": 207, "ps": 15, "rps": 10, "desc": "说金融市场,谈宏观经济,一起畅聊商业故事" }, { "name": "校园学习", "route": "campus", "tid": 208, "ps": 15, "rps": 10, "ad": { "active": true, "dataLocId": 265 }, "desc": "老师很有趣,学生也有才,我们一起搞学习" }, { "name": "职业职场", "route": "career", "tid": 209, "ps": 15, "rps": 10, "desc": "职业分享、升级指南,一起成为最有料的职场人" }, { "name": "设计·创意", "route": "design", "tid": 229, "ps": 15, "rps": 10, "desc": "天马行空,创意设计,都在这里" }, { "name": "野生技能协会", "route": "skill", "tid": 122, "ps": 15, "rps": 10, "desc": "技能党集合,是时候展示真正的技术了" }]; break; case "数码": s[i].name = "科技"; s[i].route = "tech"; s[i].sub = [{ "name": "数码", "route": "digital", "tid": 95, "ps": 15, "rps": 10, "viewHotTag": true, "desc": "科技数码产品大全,一起来做发烧友", "url": "#" }, { "name": "软件应用", "route": "application", "tid": 230, "ps": 15, "rps": 10, "viewHotTag": true, "desc": "超全软件应用指南", "url": "#" }, { "name": "计算机技术", "route": "computer_tech", "tid": 231, "ps": 15, "rps": 10, "viewHotTag": true, "desc": "研究分析、教学演示、经验分享......有关计算机技术的都在这里", "url": "#" }, { "name": "科工机械", "route": "industry", "tid": 232, "ps": 15, "rps": 10, "viewHotTag": true, "desc": "从小芯片到大工程,一起见证科工力量", "url": "#" }, { "name": "极客DIY", "route": "diy", "tid": 233, "ps": 15, "rps": 10, "viewHotTag": true, "desc": "炫酷技能,极客文化,硬核技巧,准备好你的惊讶", "url": "#" }]; break; case "生活": s[i].sub = [{ "name": "搞笑", "route": "funny", "tid": 138, "ps": 15, "rps": 10, "ad": { "active": true, "dataLocId": 273 }, "desc": "各种沙雕有趣的搞笑剪辑,挑战,表演,配音等视频", "url": "//www.bilibili.com/video/ent_funny_1.html", "locid": 4204, "recommendId": 4210, "slider": { "width": 620, "height": 220 }, "customComponent": { "name": "Energy", "leftId": 4212, "rightId": 4218, "rightType": "slide" } }, { "name": "家居房产", "route": "home", "tid": 239, "ps": 15, "rps": 10, "ad": { "active": true, "dataLocId": 275 }, "desc": "与买房、装修、居家生活相关的分享", "url": "#" }, { "name": "手工", "route": "handmake", "tid": 161, "ps": 15, "rps": 10, "desc": "手工制品的制作过程或成品展示、教程、测评类视频", "url": "//www.bilibili.com/video/ent-handmake-1.html" }, { "name": "绘画", "route": "painting", "tid": 162, "ps": 15, "rps": 10, "desc": "绘画过程或绘画教程,以及绘画相关的所有视频", "url": "//www.bilibili.com/video/ent-painting-1.html" }, { "name": "日常", "route": "daily", "tid": 21, "ps": 15, "rps": 10, "desc": "记录日常生活,分享生活故事", "url": "//www.bilibili.com/video/ent-life-1.html" }]; break; case "鬼畜": s[i].sub = [{ "name": "鬼畜调教", "route": "guide", "tid": 22, "ps": 15, "rps": 10, "ad": { "active": true, "dataLocId": 285 }, "desc": "使用素材在音频、画面上做一定处理,达到与BGM一定的同步感", "url": "//www.bilibili.com/video/ent-Kichiku-1.html" }, { "name": "音MAD", "route": "mad", "tid": 26, "ps": 15, "rps": 10, "ad": { "active": true, "dataLocId": 287 }, "desc": "使用素材音频进行一定的二次创作来达到还原原曲的非商业性质稿件", "url": "//www.bilibili.com/video/douga-kichiku-1.html" }, { "name": "人力VOCALOID", "route": "manual_vocaloid", "tid": 126, "ps": 15, "rps": 10, "desc": "将人物或者角色的无伴奏素材进行人工调音,使其就像VOCALOID一样歌唱的技术", "url": "//www.bilibili.com/video/kichiku-manual_vocaloid-1.html" }, { "name": "鬼畜剧场", "route": "theatre", "tid": 216, "ps": 15, "rps": 10, "desc": "使用素材进行人工剪辑编排的有剧情的作品" }, { "name": "教程演示", "route": "course", "tid": 127, "ps": 10, "rps": 6, "rightComponent": { "name": "CmImgList", "id": 148 }, "ad": { "active": true, "dataLocId": 289 }, "hideDropdown": false, "desc": "鬼畜相关的教程演示", "url": "//www.bilibili.com/video/kichiku-course-1.html" }]; break; case "时尚": s[i].sub = [{ "name": "美妆护肤", "route": "makeup", "tid": 157, "ps": 15, "rps": 10, "ad": { "active": true, "dataLocId": 279 }, "desc": "彩妆护肤、美甲美发、仿妆、医美相关内容分享或产品测评", "url": "//www.bilibili.com/video/fashion-makeup-fitness-1.html" }, { "name": "穿搭", "route": "clothing", "tid": 158, "ps": 15, "rps": 10, "ad": { "active": true, "dataLocId": 281 }, "desc": "穿搭风格、穿搭技巧的展示分享,涵盖衣服、鞋靴、箱包配件、配饰(帽子、钟表、珠宝首饰)等", "url": "//www.bilibili.com/video/fashion-clothing-1.html" }, { "name": "时尚潮流", "route": "trend", "tid": 159, "ps": 15, "rps": 10, "desc": "时尚街拍、时装周、时尚大片,时尚品牌、潮流等行业相关记录及知识科普", "url": "#" }]; break; case "广告": s[i].name = "资讯"; s[i].route = "information"; s[i].tid = 202; s[i].sub = [{ "name": "热点", "route": "hotspot", "tid": 203, "ps": 18, "rps": 10, "desc": "全民关注的时政热门资讯" }, { "name": "环球", "route": "global", "tid": 204, "ps": 18, "rps": 10, "desc": "全球范围内发生的具有重大影响力的事件动态" }, { "name": "社会", "route": "social", "tid": 205, "ps": 18, "rps": 10, "desc": "日常生活的社会事件、社会问题、社会风貌的报道" }, { "name": "综合", "route": "multiple", "tid": 206, "ps": 18, "rps": 10, "desc": "除上述领域外其它垂直领域的综合资讯" }]; break; case "娱乐": s[i].sub = [{ "name": "综艺", "route": "variety", "tid": 71, "ps": 15, "rps": 10, "ad": { "active": true, "dataLocId": 267 }, "desc": "所有综艺相关,全部一手掌握!", "url": "//www.bilibili.com/video/ent-variety-1.html" }, { "name": "娱乐杂谈", "route": "talker", "tid": 241, "ps": 15, "rps": 10, "ad": { "active": true, "dataLocId": 269 }, "desc": "娱乐人物解读、娱乐热点点评、娱乐行业分析" }, { "name": "粉丝创作", "route": "fans", "tid": 242, "ps": 15, "rps": 10, "desc": "粉丝向创作视频" }, { "name": "明星综合", "route": "celebrity", "tid": 137, "ps": 15, "rps": 10, "desc": "娱乐圈动态、明星资讯相关" }]; break; } }); }); jsonphookasync("api.bilibili.com/plaza/banner", () => true, async () => { return { "code": 0, "result": [{ "link": "https://www.bilibili.com/blackboard/x/act_list", "end": 1640966407, "begin": 1456709887, "title": "bilibili 活动", "cover": "http://i0.hdslb.com/bfs/square/6830d0e479eee8cc9a42c3e375ca99a5147390cd.jpg", "id": 9, "created_ts": 1491386053 }, { "link": "http://www.bilibili.com/blackboard/topic_list.html", "end": 1640966418, "begin": 1544258598, "title": "话题列表", "cover": "http://i0.hdslb.com/bfs/square/b1b00a0c3ce8570b48277ae07a2e55603a4a4ddf.jpg", "id": 17, "created_ts": 1491386030 }] }; }, false); jsonphookasync("api.bilibili.com/x/web-interface/index/icon", void 0, async () => { const data = await fetch("https://www.bilibili.com/index/index-icon.json").then((d) => d.json()); return { code: 0, data: subArray(data.fix), message: "0", ttl: 1 }; }, false); }; var banner = () => { document.head.appendChild(createElements(htmlVnode(animated_banner_default))); class Animate { static once = false; static record = {}; static rid = this.resourceId(); static locs = [1576, 1612, 1580, 1920, 1584, 1588, 1592, 3129, 1600, 1608, 1604, 1596, 2210, 1634, 142]; animatedBannerSupport = typeof CSS !== "undefined" && CSS.supports && CSS.supports("filter: blur(1px)") && !/^((?!chrome|android).)*safari/i.test(navigator.userAgent); layerConfig = {}; resources = []; entered = false; extensions = []; handleMouseLeave = void 0; handleMouseMove = void 0; handleResize = void 0; constructor(v) { if (this.animatedBannerSupport) this.mounted(v); if (v.is_split_layer !== 0) { addCss(".blur-bg {display:none}"); } else addCss(".blur-bg {background:none !important;-webkit-backdrop-filter: blur(4px);backdrop-filter: blur(4px)}"); } static resourceId() { if (location.href.includes("v/douga")) return 1576; if (location.href.includes("/anime")) return 1612; if (location.href.includes("v/music")) return 1580; if (location.href.includes("/guochuang")) return 1920; if (location.href.includes("v/dance")) return 1584; if (location.href.includes("v/game")) return 1588; if (location.href.includes("v/knowledge")) return 1592; if (location.href.includes("v/tech")) return 3129; if (location.href.includes("v/life")) return 1600; if (location.href.includes("v/kichiku")) return 1608; if (location.href.includes("v/fashion")) return 1604; if (location.href.includes("v/ent")) return 1596; if (location.href.includes("v/cinephile")) return 2210; if (location.href.includes("/cinema")) return 1634; return 142; } async mounted(v) { var _a3; this.layerConfig = JSON.parse(v.split_layer); if (!this.layerConfig.layers) return; try { if ("extensions" in this.layerConfig && "time" in this.layerConfig.extensions) { let time = void 0, now = (Date.now() - new Date().setHours(0, 0, 0, 0)) / 1e3; let timeCode = Object.keys(this.layerConfig.extensions.time).sort((a, b) => parseInt(a) - parseInt(b)); for (let t of timeCode) { if (parseInt(t) < now) time = parseInt(t); else break; } let timelayers = this.layerConfig.extensions.time[time]; this.layerConfig.layers = timelayers[Math.floor(Math.random() * timelayers.length)].layers; } await Promise.all(this.layerConfig.layers.map(async (v2, index) => { return Promise.all(v2.resources.map(async (i) => { if (/\\.(webm|mp4)\$/.test(i.src)) { const res = await fetch(i.src).then((d) => d.blob()); const url = URL.createObjectURL(res); const video = document.createElement("video"); video.muted = true; video.loop = true; video.src = url; video.playsInline = true; video.style.objectFit = "cover"; this.resources[index] = video; video.width = 0; video.height = 0; document.body.appendChild(video); await new Promise((resolve) => { const onMetaLoad = () => { resolve(true); video.removeEventListener("loadedmetadata", onMetaLoad); }; video.addEventListener("loadedmetadata", onMetaLoad); }); } else { const img = document.createElement("img"); img.src = i.src; await new Promise((resolve) => img.onload = resolve); this.resources[index] = img; } })); })); } catch (e) { debug.error("load animated banner images error", e); return; } let container = document.querySelector("#banner_link"); if (!container) { container = document.querySelector(".h-center"); if (!container) return this.resources.forEach((d) => d.remove()); container.parentElement.removeAttribute("style"); container.style.width = "100%"; container.style.top = "-42px"; container.style.marginBottom = "-42px"; container.innerHTML = ""; (_a3 = document.querySelector(".b-header-mask-wrp")) == null ? void 0 : _a3.remove(); } ; container.classList.add("animated-banner"); let containerHeight = container.clientHeight; let containerWidth = container.clientWidth; let containerScale = 180 / 155; this.layerConfig.layers.forEach((v2) => { var _a4, _b, _c, _d; v2._initState = { scale: 1, rotate: ((_a4 = v2.rotate) == null ? void 0 : _a4.initial) || 0, translate: ((_b = v2.translate) == null ? void 0 : _b.initial) || [0, 0], blur: ((_c = v2.blur) == null ? void 0 : _c.initial) || 0, opacity: ((_d = v2.opacity) == null ? void 0 : _d.initial) === void 0 ? 1 : v2.opacity.initial }; v2.resources.forEach((i, index) => { var _a5, _b2; const el = this.resources[index]; if (el.tagName === "VIDEO") { if (el.parentNode) { el.parentNode.removeChild(el); } el.dataset.height = el.videoHeight; el.dataset.width = el.videoWidth; } else { el.dataset.height = el.naturalHeight; el.dataset.width = el.naturalWidth; } const initial = ((_a5 = v2.scale) == null ? void 0 : _a5.initial) === void 0 ? 1 : (_b2 = v2.scale) == null ? void 0 : _b2.initial; el.height = el.dataset.height * containerScale * initial; el.width = el.dataset.width * containerScale * initial; }); }); const layers = this.layerConfig.layers.map((v2) => { const layer = document.createElement("div"); layer.classList.add("layer"); container.appendChild(layer); return layer; }); let displace = 0; let enterX = 0; let raf = 0; const curveParameterToFunc = (param2) => { const o = bezier(...param2); return (v2) => v2 > 0 ? o(v2) : -o(-v2); }; let lastDisplace = NaN; const af = (t) => { try { if (lastDisplace === displace) { return; } lastDisplace = displace; layers.map((layer, i) => { const v2 = this.layerConfig.layers[i]; const a = layer.firstChild; if (!a) { return; } const transform = { scale: v2._initState.scale, rotate: v2._initState.rotate, translate: v2._initState.translate }; if (v2.scale) { const x = v2.scale.offset || 0; const itp = v2.scale.offsetCurve ? curveParameterToFunc(v2.scale.offsetCurve) : (x2) => x2; const offset2 = x * itp(displace); transform.scale = v2._initState.scale + offset2; } if (v2.rotate) { const x = v2.rotate.offset || 0; const itp = v2.rotate.offsetCurve ? curveParameterToFunc(v2.rotate.offsetCurve) : (x2) => x2; const offset2 = x * itp(displace); transform.rotate = v2._initState.rotate + offset2; } if (v2.translate) { const x = v2.translate.offset || [0, 0]; const itp = v2.translate.offsetCurve ? curveParameterToFunc(v2.translate.offsetCurve) : (x2) => x2; const offset2 = x.map((v3) => itp(displace) * v3); const translate = v2._initState.translate.map((x2, i2) => { var _a4; return (x2 + offset2[i2]) * containerScale * (((_a4 = v2.scale) == null ? void 0 : _a4.initial) || 1); }); transform.translate = translate; } a.style.transform = \`scale(\${transform.scale})translate(\${transform.translate[0]}px, \${transform.translate[1]}px)rotate(\${transform.rotate}deg)\`; if (v2.blur) { const x = v2.blur.offset || 0; const itp = v2.blur.offsetCurve ? curveParameterToFunc(v2.blur.offsetCurve) : (x2) => x2; const blurOffset = x * itp(displace); let res = 0; if (!v2.blur.wrap || v2.blur.wrap === "clamp") { res = Math.max(0, v2._initState.blur + blurOffset); } else if (v2.blur.wrap === "alternate") { res = Math.abs(v2._initState.blur + blurOffset); } a.style.filter = res < 1e-4 ? "" : \`blur(\${res}px)\`; } if (v2.opacity) { const x = v2.opacity.offset || 0; const itp = v2.opacity.offsetCurve ? curveParameterToFunc(v2.opacity.offsetCurve) : (x2) => x2; const opacityOffset = x * itp(displace); const initial = v2._initState.opacity; if (!v2.opacity.wrap || v2.opacity.wrap === "clamp") { a.style.opacity = Math.max(0, Math.min(1, initial + opacityOffset)); } else if (v2.opacity.wrap === "alternate") { const x2 = initial + opacityOffset; let y = Math.abs(x2 % 1); if (Math.abs(x2 % 2) >= 1) { y = 1 - y; } a.style.opacity = y; } } }); } catch (e) { debug.error(e); } }; this.layerConfig.layers.map((v2, i) => { const a = this.resources[i]; layers[i].appendChild(a); if (a.tagName === "VIDEO") { a.play(); } requestAnimationFrame(af); }); const handleLeave = () => { const now = performance.now(); const timeout = 200; const tempDisplace = displace; cancelAnimationFrame(raf); const leaveAF = (t) => { if (t - now < timeout) { displace = tempDisplace * (1 - (t - now) / 200); af(t); requestAnimationFrame(leaveAF); } else { displace = 0; af(t); } }; raf = requestAnimationFrame(leaveAF); }; this.handleMouseLeave = (e) => { this.entered = false; handleLeave(); }; this.handleMouseMove = (e) => { const offsetY = document.documentElement.scrollTop + e.clientY; if (offsetY < containerHeight) { if (!this.entered) { this.entered = true; enterX = e.clientX; } displace = (e.clientX - enterX) / containerWidth; cancelAnimationFrame(raf); raf = requestAnimationFrame(af); } else { if (this.entered) { this.entered = false; handleLeave(); } } this.extensions.map((v2) => { var _a4; return (_a4 = v2.handleMouseMove) == null ? void 0 : _a4.call(v2, { e, displace }); }); }; this.handleResize = (e) => { containerHeight = container.clientHeight; containerWidth = container.clientWidth; containerScale = 180 / 155; this.layerConfig.layers.forEach((lc) => { lc.resources.forEach((d, i) => { var _a4, _b; const el = this.resources[i]; el.height = el.dataset.height * containerScale * (((_a4 = lc.scale) == null ? void 0 : _a4.initial) || 1); el.width = el.dataset.width * containerScale * (((_b = lc.scale) == null ? void 0 : _b.initial) || 1); }); }); cancelAnimationFrame(raf); raf = requestAnimationFrame((t) => { af(t); }); this.extensions.map((v2) => { var _a4; return (_a4 = v2.handleResize) == null ? void 0 : _a4.call(v2, e); }); }; document.addEventListener("mouseleave", this.handleMouseLeave); window.addEventListener("mousemove", this.handleMouseMove); window.addEventListener("resize", this.handleResize); } } jsonphookasync("api.bilibili.com/x/web-show/res/loc", void 0, async (url) => { const obj = new URL(url); obj.searchParams.delete("callback"); let loc = Animate.record[url]; let header2 = Animate.record[Animate.rid]; let rqs; if (!loc || !header2) { rqs = await Promise.all([ fetch(obj.toJSON()).then((d) => d.json()), fetch(\`https://api.bilibili.com/x/web-show/page/header?resource_id=\${Animate.rid}\`).then((d) => d.json()) ]); loc = Animate.record[url] = rqs[0]; header2 = Animate.record[Animate.rid] = rqs[1]; } loc.data && Animate.locs.forEach((d) => { loc.data[d] && (loc.data[d][0].pic = header2 && header2.data.pic || "//i0.hdslb.com/bfs/activity-plat/static/20171220/68a052f664e8414bb594f9b00b176599/images/90w1lpp6ry.png", loc.data[d][0].litpic = header2 && header2.data.litpic, loc.data[d][0].url = header2 && header2.data.url || "", loc.data[d][0].title = header2 && header2.data.name || ""); if (url.includes("loc?") && obj.searchParams.get("id") == String(d)) { loc.data[0].pic = header2 && header2.data.pic || "//i0.hdslb.com/bfs/activity-plat/static/20171220/68a052f664e8414bb594f9b00b176599/images/90w1lpp6ry.png"; loc.data[0].litpic = header2 && header2.data.litpic || ""; loc.data[0].url = header2 && header2.data.url || ""; loc.data[0].title = header2 && header2.data.name || ""; } }); setting.animatedBanner && !Animate.once && (Animate.once = true, setTimeout(() => new Animate(header2.data))); return loc; }, false); }; // src/content/bangumi/episode_data.ts var first = 0; function episodeData() { switchVideo(async () => { try { first++; let views = document.querySelector(".view-count").querySelector("span"); let danmakus = document.querySelector(".danmu-count").querySelector("span"); if (first === 1) { const [view2, danmaku3] = [ unitFormat(API.__INITIAL_STATE__.mediaInfo.stat.views), unitFormat(API.__INITIAL_STATE__.mediaInfo.stat.danmakus) ]; views.setAttribute("title", "总播放数 " + view2); danmakus.setAttribute("title", "总弹幕数 " + danmaku3); debug.log("总播放数:", view2, "总弹幕数", danmaku3); } let data = await xhr({ url: objUrl("https://api.bilibili.com/x/web-interface/archive/stat", { "aid": API.aid }), credentials: true }); data = jsonCheck(data).data; let view = data.view; let danmaku2 = data.danmaku; view = unitFormat(view); danmaku2 = unitFormat(danmaku2); views.innerText = view; danmakus.innerText = danmaku2; debug.debug("播放", view + " 弹幕", danmaku2); } catch (e) { debug.error("episodeData.js", e); } }); } // src/content/dynamic.ts function dynamicPage() { xhrhook("api.bilibili.com/x/polymer/web-dynamic/v1/feed/all", void 0, (r) => { try { const response = jsonCheck(r.response); response.data.items = response.data.items.filter((d) => { var _a3, _b, _c, _d, _e; return ((_e = (_d = (_c = (_b = (_a3 = d.modules) == null ? void 0 : _a3.module_dynamic) == null ? void 0 : _b.major) == null ? void 0 : _c.archive) == null ? void 0 : _d.badge) == null ? void 0 : _e.text) != "直播回放"; }); r.responseType === "json" ? r.response = response : r.response = r.responseText = JSON.stringify(response); } catch (e) { } }, false); } // src/content/history.ts function historyPage() { setting.history && xhrhook(["api.bilibili.com/x/web-interface/history/cursor", "business"], function(args) { let obj = new URL(args[1]), max = obj.searchParams.get("max") || "", view_at = obj.searchParams.get("view_at") || ""; args[1] = objUrl("//api.bilibili.com/x/web-interface/history/cursor", { max, view_at, type: "archive", ps: "20" }); }, void 0, false); setting.searchHistory && doWhile(() => document.querySelector(".b-head-search"), () => { var _a3; return (_a3 = document.querySelector(".b-head-search")) == null ? void 0 : _a3.remove(); }); } // src/content/index/timeline.ts var inline = []; function getDate(ctx) { let result = ""; ctx.replace(/\\d{2}:\\d{2}/, (d) => result = d); return result; } function decodeInline(title, item) { let i = 0; switch (title) { case "周一": i = 1; break; case "周二": i = 2; break; case "周三": i = 3; break; case "周四": i = 4; break; case "周五": i = 5; break; case "周六": i = 6; break; case "周日": i = 7; break; } inline[i] || (inline[i] = {}); item.forEach((d) => { let time = getDate(d.content); if (time) { inline[i][time] || (inline[i][time] = []); inline[i][time].push({ cover: "", delay: 0, delay_id: 0, delay_index: "", delay_reason: "", ep_cover: "", episode_id: -1, follows: d.positions.position3, plays: d.positions.position2, pub_index: d.positions.position4, pub_time: time, pub_ts: -1, published: 1, season_id: d.item_id, square_cover: d.image, title: d.title }); } }); } var timeline = () => { doWhile(() => { var _a3; return ((_a3 = document.querySelector("#bili_bangumi > .bangumi-module")) == null ? void 0 : _a3.__vue__) || (window == null ? void 0 : window.__INITIAL_STATE__); }, async (d) => { try { const index = await urlPack.getJson("app.bilibili.com/x/v2/activity/index", { page_id: 167998 }); const item = index.data.cards[0].item[0].item; await Promise.all(item.reduce((s, d2) => { s.push(urlPack.getJson("app.bilibili.com/x/v2/activity/inline", { page_id: d2.item_id }).then((t) => { const item2 = t.data.cards[0].item; decodeInline(d2.title, item2); })); return s; }, [])); const source = JSON.parse(JSON.stringify(d.timeline || d.timingData)); source.forEach((d2) => { const i = d2.day_of_week; Object.entries(inline[i]).forEach((t) => { if (d2.episodes) { d2.episodes.push(...t[1]); } else { d2.seasonMap[t[0]] || (d2.seasonMap[t[0]] = []); d2.seasonMap[t[0]].push(...t[1]); } }); }); d.timeline ? d.timeline = source : d.timingData = source; } catch (e) { debug.error("获取港澳台番剧时间线出错 ಥ_ಥ"); toast.error("港澳台番剧时间线", e); } }); }; // src/content/live/sleep_check.ts function sleepCheck() { const fun = setInterval; let flag = 0; window.setInterval = (...args) => { if (args[1] && args[1] == 3e5 && args[0] && args[0].toString() == "function(){e.triggerSleepCallback()}") { if (!flag) { toast.warning("成功阻止直播间挂机检测!"); flag++; } return Number.MIN_VALUE; } return fun.call(window, ...args); }; } // src/content/live/live.ts function livePage() { setting.sleepCheck && sleepCheck(); doWhile(() => document.querySelector(".web-player-icon-roomStatus"), (d) => d.remove()); } // src/content/log_report.ts function blockReport() { Reflect.defineProperty(window, "reportObserver", { get: () => new Proxy(() => true, { get: (t, p, r) => r }), set: () => true, configurable: true }); Reflect.defineProperty(window, "rec_rp", { get: () => new Proxy(() => true, { get: (t, p, r) => r }), set: () => true, configurable: true }); Reflect.defineProperty(window, "reportMsgObj", { get: () => new Proxy(() => true, { get: (t, p, r) => r }), set: () => true, configurable: true }); } // src/content/media.ts function mediaPage() { xhrhook("user/status", void 0, (res) => { try { const result = jsonCheck(res.response); result.result.area_limit = 0; result.result.ban_area_show = 0; res.responseType === "json" ? res.response = result : res.response = res.responseText = JSON.stringify(result); } catch (e) { } }, false); } // src/content/message/message.css var message_default = "/* 修复消息页样式 */\\r\\n.container[data-v-6969394c] {\\r\\n height: calc(100vh - 42px) !important;\\r\\n}\\r\\n\\r\\n.container[data-v-1c9150a9] {\\r\\n height: calc(100vh - 42px) !important;\\r\\n}\\r\\n\\r\\n.im-root,\\r\\n.im-root .im-list-box * {\\r\\n font-size: 12px;\\r\\n line-height: 42px;\\r\\n}\\r\\n\\r\\n.im-root .im-list-box {\\r\\n width: 100%;\\r\\n overflow: visible;\\r\\n}\\r\\n\\r\\n.im-root .im-list-box .im-list {\\r\\n line-height: 42px;\\r\\n height: 42px;\\r\\n}\\r\\n\\r\\n.im-root .im-list-box .im-notify.im-number {\\r\\n height: 14px;\\r\\n line-height: 13px;\\r\\n border-radius: 10px;\\r\\n padding: 1px 3px;\\r\\n font-size: 12px;\\r\\n min-width: 20px;\\r\\n text-align: center;\\r\\n color: #fff;\\r\\n}\\r\\n\\r\\n.im-root .im-list-box .im-notify.im-number.im-center {\\r\\n top: 14px;\\r\\n left: 80px;\\r\\n}\\r\\n\\r\\n.im-root .im-list-box .im-notify.im-dot {\\r\\n top: 11px;\\r\\n right: -10px;\\r\\n width: 8px;\\r\\n height: 8px;\\r\\n border-radius: 100%;\\r\\n}\\r\\n\\r\\n.im-root .im-list-box .im-notify.im-dot.im-center {\\r\\n top: 16px;\\r\\n right: 20px;\\r\\n}"; // src/content/message/message.ts function messagePage() { addCss(message_default, "message"); } // src/content/player/bnj.css var bnj_default = ".player {\\r\\n width: 100%;\\r\\n height: 100%;\\r\\n margin: 0px;\\r\\n padding: 0px;\\r\\n}\\r\\n\\r\\n.player-box {\\r\\n width: 100%;\\r\\n height: 100%;\\r\\n overflow: visible;\\r\\n box-sizing: border-box;\\r\\n}\\r\\n\\r\\nobject {\\r\\n width: 100%;\\r\\n height: 100%;\\r\\n}\\r\\n\\r\\n.bgray-btn-wrap {\\r\\n display: none;\\r\\n}"; // src/content/player/bnj.ts function bnj() { addCss(bnj_default, "bnj"); window.bnj = false; const arr2 = []; doWhile(() => window.__INITIAL_STATE__, () => { const node4 = document.querySelector("#bilibili-player").parentElement; const root3 = node4.attachShadow({ mode: "closed" }); const iframe = document.createElement("iframe"); iframe.src = \`https://www.bilibili.com/blackboard/html5player.html?aid=\${window.__INITIAL_STATE__.videoInfo.aid}&cid=\${window.__INITIAL_STATE__.videoInfo.cid}&enable_ssl=1&crossDomain=1&as_wide=1&bnj=1\`; iframe.setAttribute("style", "width: 906px; height: 556px;border:none;"); root3.appendChild(iframe); }); Reflect.defineProperty(window, "EmbedPlayer", { configurable: true, set: (v) => { if (!window.bnj) { arr2.unshift(v); } }, get: () => { if (window.bnj) { Reflect.defineProperty(window, "EmbedPlayer", { configurable: true, value: arr2[0] }); return arr2[0]; } else { return function() { setTimeout(() => window.EmbedPlayer(...arguments), 100); }; } } }); } // src/content/avatar_animation.css var avatar_animation_default = "/* 鼠标放在顶栏上的动效 */\\r\\n.bili-header-m .profile-info .i-face .face {\\r\\n border: 0\\r\\n}\\r\\n\\r\\n.bili-header-m .profile-info .i-face .pendant {\\r\\n transform: scale(0.5);\\r\\n width: 112px;\\r\\n height: 112px;\\r\\n left: -41px;\\r\\n bottom: -46px;\\r\\n opacity: 0;\\r\\n transition: opacity .1s ease-in\\r\\n}\\r\\n\\r\\n.bili-header-m .profile-info.on .i-face {\\r\\n left: 8px !important;\\r\\n top: 0 !important;\\r\\n height: 32px !important;\\r\\n width: 32px !important;\\r\\n transform: translateY(10px) translateX(-16px) scale(2);\\r\\n transform-origin: top left\\r\\n}\\r\\n\\r\\n.bili-header-m .profile-info.on .i-face .legalize {\\r\\n transform: scale(0.5) translate(10px, 15px)\\r\\n}\\r\\n\\r\\n.bili-header-m .profile-info.on .i-face .pendant {\\r\\n opacity: 1\\r\\n}\\r\\n\\r\\n.bili-header-m .profile-info.on .i-face .face {\\r\\n border: 0;\\r\\n box-shadow: 0 0 0 2px #fff\\r\\n}\\r\\n\\r\\n.bili-header-m .profile-info.on .i-face.scale-in {\\r\\n transform: translateY(5px) translateX(-10px) scale(1.75)\\r\\n}\\r\\n\\r\\n.bili-header-m .profile-info.on .scale-in .face {\\r\\n height: 32px;\\r\\n width: 32px\\r\\n}\\r\\n\\r\\n.bili-header-m .profile-info.on .i-face.scale-in .legalize {\\r\\n transform: scale(0.5) translate(38px, 48px)\\r\\n}"; // src/content/section.ts async function header(menu2 = false) { if (menu2) { primaryMenu(); banner(); } if (window.loginInfoCallbacks && window.onLoginInfoLoaded) { let fun = window.onLoginInfoLoaded; Reflect.defineProperty(window, "onLoginInfoLoaded", { configurable: true, get: () => fun, set: (t) => { fun = t; window.loginInfoCallbacks.forEach((d) => { fun(...d); }); } }); } if (!window.jQuery) await loadScript("//static.hdslb.com/js/jquery.min.js"); loadScript("//s1.hdslb.com/bfs/seed/jinkela/header/header.js"); } async function footer() { if (!window.jQuery) await loadScript("//static.hdslb.com/js/jquery.min.js"); loadScript("//static.hdslb.com/common/js/footer.js"); } function styleClear() { var _a3, _b; const d = document.styleSheets; for (let i = 0; i < d.length; i++) { (((_a3 = d[i].href) == null ? void 0 : _a3.includes("laputa-footer")) || ((_b = d[i].href) == null ? void 0 : _b.includes("laputa-header"))) && (d[i].disabled = true); } } function replaceHeader(t) { var _a3, _b, _c; let menu2 = false; if (document.querySelector(".mini-type") || /festival/.test(location.href)) { menu2 = false; } if (location.href.includes("blackboard/topic_list") || location.href.includes("blackboard/x/act_list") || document.querySelector(".large-header") || document.querySelector(".bili-banner") || t.getAttribute("type") == "all") { menu2 = true; } if (((_a3 = t.parentElement) == null ? void 0 : _a3.id) === "app") { t.setAttribute("hidden", "hidden"); if (document.querySelector("#bili-header-m") || document.querySelector(".z-top-container") && !((_b = document.querySelector(".z-top-container")) == null ? void 0 : _b.id)) return; addElement("div", { class: \`z-top-container\${menu2 ? " has-menu" : ""}\` }, void 0, void 0, true); } else { if (document.querySelector("#bili-header-m") || document.querySelector(".z-top-container") && !((_c = document.querySelector(".z-top-container")) == null ? void 0 : _c.id)) return; t.setAttribute("class", \`z-top-container\${menu2 ? " has-menu" : ""}\`); t.removeAttribute("id"); } styleClear(); header(menu2); } function section() { addCss(".nav-item.live {width: auto;}.lt-row {display: none !important;} .bili-header-m #banner_link{background-size: cover;background-position: center !important;}"); doWhile(() => document.querySelector("#internationalHeader"), replaceHeader); doWhile(() => document.querySelector("#biliMainHeader"), replaceHeader); doWhile(() => document.querySelector(".bili-header-default"), replaceHeader); doWhile(() => document.querySelector(".z_top_container"), (t) => { var _a3; t.setAttribute("class", "z-top-container has-menu"); (_a3 = document.querySelector(".header")) == null ? void 0 : _a3.remove(); header(true); }); doWhile(() => document.querySelector(".international-footer") || document.querySelector("#biliMainFooter"), (t) => { t.replaceChildren(); t.setAttribute("class", "footer bili-footer report-wrap-module"); t.setAttribute("id", "home_footer"); footer(); styleClear(); }); doWhile(() => document.querySelector("#bili-header-m"), () => { addCss(avatar_animation_default, "avatarAnimation"); }); doWhile(() => document.body && document.body.classList.contains("header-v3") || document.querySelector("#bili-header-container"), () => { document.body.classList.remove("header-v3"); header(true); }); } // src/content/space/album.ts function album() { xhrhook("api.bilibili.com/x/dynamic/feed/draw/doc_list", void 0, (obj) => { const response = JSON.parse(obj.responseText); let data = response.data.items.reduce((s, d) => { s.push(d.doc_id); return s; }, []); setTimeout(() => { document.querySelectorAll(".album-card").forEach((d, i) => { d.firstChild.href = \`//h.bilibili.com/\${data[i]}\`; d.children[1].href = \`//h.bilibili.com/\${data[i]}\`; }); }, 1e3); }, false); xhrhook("api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/get_dynamic_detail", void 0, (res) => { var _a3, _b, _c; const result = res.responseType === "json" ? res.response : JSON.parse(res.response); if (result.code === 0) { if (((_c = (_b = (_a3 = result.data) == null ? void 0 : _a3.card) == null ? void 0 : _b.desc) == null ? void 0 : _c.type) === 2) location.replace(\`https://h.bilibili.com/\${result.data.card.desc.rid_str}\`); } }, false); } // src/content/space/jointime.ts function jointime(mid) { doWhile(() => document.querySelector(".section.user-info"), (t) => { (isUserScript ? GM.xhr({ url: \`https://account.bilibili.com/api/member/getCardByMid?mid=\${mid}\` }) : GM.xmlHttpRequest(\`https://account.bilibili.com/api/member/getCardByMid?mid=\${mid}\`)).then((d) => { const data = jsonCheck(d); const jointime2 = timeFormat(data.card.regtime * 1e3, true); const node4 = t.lastChild; node4.appendChild(createElement({ tagName: "div", props: { class: "info-regtime", style: "display: inline-block;word-break: break-all;" }, children: [ { tagName: "span", props: { class: "info-command", style: "display: inline-block;font-size: 12px;font-family: Microsoft YaHei;line-height: 16px;color: #9499a0;margin-right: 16px;" }, children: [ { tagName: "text", text: "注册(不可用)" } ] }, { tagName: "span", props: { class: "info-value", style: "color: #6d757a;font-family: Microsoft YaHei;font-size: 12px;line-height: 16px;padding-right: 15px;" }, children: [ { tagName: "text", text: jointime2 } ] } ] })); }); }); } // src/content/space/lost_video.ts async function getLostVideo(aid) { let result = []; try { let data = await (isUserScript ? GM.xhr({ url: \`https://www.biliplus.com/video/av\${aid}\` }) : GM.xmlHttpRequest(\`https://www.biliplus.com/video/av\${aid}\`)); if (data.match(/\\<title\\>.+?\\ \\-\\ AV/)) { result[0] = data.match(/\\<title\\>.+?\\ \\-\\ AV/)[0].replace(/<title>/, "").replace(/ - AV/, ""); result[1] = data.match(/\\<img style=\\"display:none\\"\\ src=\\".+?\\"\\ alt/)[0].replace(/<img style="display:none" src="/, "").replace(/" alt/, ""); } } catch (e) { debug.error("lostVideo.js", e); } if (!result[0] || !result[1]) { try { let data = await (isUserScript ? GM.xhr({ url: \`https://www.biliplus.com/all/video/av\${aid}\` }) : GM.xmlHttpRequest(\`https://www.biliplus.com/all/video/av\${aid}/\`)); if (data.match("/api/view_all?")) { data = data.match(/\\/api\\/view_all\\?.+?\\',cloudmoe/)[0].replace(/\\',cloudmoe/, ""); data = await (isUserScript ? GM.xhr({ url: \`//www.biliplus.com\${aid}\` }) : GM.xmlHttpRequest(\`//www.biliplus.com\${data}\`)); data = jsonCheck(data).data; result[0] = result[0] || data.info.title; result[1] = result[1] || data.info.pic; } } catch (e) { debug.error("lostVideo.js", e); } } if (!result[0] || !result[1]) { try { let data = await (isUserScript ? GM.xhr({ url: \`https://www.jijidown.com/video/\${aid}\` }) : GM.xmlHttpRequest(\`https://www.jijidown.com/video/\${aid}\`)); if (data.match("window._INIT")) { result[0] = result[0] || data.match(/\\<title\\>.+?\\-哔哩哔哩唧唧/)[0].replace(/<title>/, "").replace(/-哔哩哔哩唧唧/, ""); result[1] = result[1] || data.match(/\\"img\\":\\ \\".+?\\",/)[0].match(/http.+?\\",/)[0].replace(/",/, ""); } } catch (e) { debug.error("lostVideo.js", e); } } result[0] = result[0] || \`av\${aid}\`; result[1] = result[1] ? result[1].replace("http:", "") : "//i0.hdslb.com/bfs/archive/be27fd62c99036dce67efface486fb0a88ffed06.jpg"; return result; } function lostVideo() { observerAddedNodes((node4) => { if (/section channel guest/.test(node4.className)) { let items = node4.querySelectorAll(".small-item.disabled"); items.forEach((d) => { let aid = d.getAttribute("data-aid"); aid = Number(aid) || abv(aid); d.setAttribute("class", "small-item fakeDanmu-item"); d.setAttribute("data-aid", aid); d.children[0].href = \`//www.bilibili.com/video/av\${aid}\`; d.children[1].href = \`//www.bilibili.com/video/av\${aid}\`; d.children[0].setAttribute("target", "_blank"); d.children[1].setAttribute("target", "_blank"); d.children[0].setAttribute("class", "cover cover-normal"); d.children[1].setAttribute("style", "text-decoration : line-through;color : #ff0000;"); getLostVideo(aid).then((data) => { d.children[1].setAttribute("title", data[0]); d.children[1].text = data[0]; d.children[0].children[0].alt = data[0]; d.children[0].children[0].src = data[1]; }); }); } if (/small-item disabled/.test(node4.className)) { let aid = node4.getAttribute("data-aid"); aid = Number(aid) || abv(aid); node4.setAttribute("class", "small-item fakeDanmu-item"); node4.setAttribute("data-aid", aid); node4.children[0].href = \`//www.bilibili.com/video/av\${aid}\`; node4.children[1].href = \`//www.bilibili.com/video/av\${aid}\`; node4.children[0].setAttribute("target", "_blank"); node4.children[1].setAttribute("target", "_blank"); node4.children[0].setAttribute("class", "cover cover-normal"); node4.children[1].setAttribute("style", "text-decoration : line-through;color : #ff0000;"); getLostVideo(aid).then((data) => { node4.children[1].setAttribute("title", data[0]); node4.children[1].text = data[0]; node4.children[0].children[0].alt = data[0]; node4.children[0].children[0].src = data[1]; }); } }); } // src/content/space/mid.json var mid_default = { code: 0, data: { birthday: "1980-01-01", coins: 0, face: "http://i2.hdslb.com/bfs/face/9f10323503739e676857f06f5e4f5eb323e9f3f2.jpg", fans_badge: false, is_followed: true, jointime: 1436351229, level: 6, mid: 11783021, moral: 0, name: "哔哩哔哩番剧出差", official: { type: 1, desc: "哔哩哔哩番剧出差 官方账号" }, pendant: { pid: 0, name: "", image: "", expire: 0 }, rank: "10000", sex: "保密", sign: "", silence: 0, sys_notice: {}, theme: {}, user_honour_info: { colour: null, mid: 0, tags: null }, vip: { avatar_subscript: 1, avatar_subscript_url: "http://i0.hdslb.com/bfs/vip/icon_Certification_big_member_22_3x.png", due_date: 16557408e5, label: { bg_color: "#FB7299", bg_style: 1, border_color: "", label_theme: "annual_vip", path: "", text: "年度大会员", text_color: "#FFFFFF" }, nickname_color: "#FB7299", role: 3, status: 1, theme_type: 0, type: 2, vip_pay_type: 1 } }, message: "0", ttl: 1 }; // src/content/space/midInfo.ts function midInfo(mid) { mid_default.data.mid = mid; switch (Number(mid)) { case 11783021: mid_default.data.name = "哔哩哔哩番剧出差"; mid_default.data.official.desc = "哔哩哔哩番剧出差 官方帐号"; break; case 1988098633: mid_default.data.name = "b站_戲劇咖"; mid_default.data.official.desc = "b站_戲劇咖 官方帐号"; break; case 2042149112: mid_default.data.name = "b站_綜藝咖"; mid_default.data.official.desc = "b站_綜藝咖 官方帐号"; break; } xhrhook("api.bilibili.com/x/space/acc/info", void 0, (obj) => { if (obj.responseText && obj.responseText.includes("-404")) { obj.response = obj.responseText = JSON.stringify(mid_default); toast.warning("该用户被404,已使用缓存数据恢复访问!"); } }, false); } // src/content/space/space.ts function spacePage() { const path2 = location.href.split("/"); const mid = Number(path2[3] && path2[3].split("?")[0]); (mid == 11783021 || mid == 1988098633 || mid == 2042149112) && midInfo(mid); setting.album && album(); setting.jointime && jointime(mid); setting.lostVideo && lostVideo(); } // src/content/web_rtc.ts function disableWebRTC() { if (typeof navigator.getUserMedia !== "undefined") navigator.getUserMedia = void 0; if (typeof window.MediaStreamTrack !== "undefined") window.MediaStreamTrack = void 0; if (typeof window.RTCPeerConnection !== "undefined") window.RTCPeerConnection = void 0; if (typeof window.RTCSessionDescription !== "undefined") window.RTCSessionDescription = void 0; if (typeof navigator.mozGetUserMedia !== "undefined") navigator.mozGetUserMedia = void 0; if (typeof window.mozMediaStreamTrack !== "undefined") window.mozMediaStreamTrack = void 0; if (typeof window.mozRTCPeerConnection !== "undefined") window.mozRTCPeerConnection = void 0; if (typeof window.mozRTCSessionDescription !== "undefined") window.mozRTCSessionDescription = void 0; if (typeof navigator.webkitGetUserMedia !== "undefined") navigator.webkitGetUserMedia = void 0; if (typeof window.webkitMediaStreamTrack !== "undefined") window.webkitMediaStreamTrack = void 0; if (typeof window.webkitRTCPeerConnection !== "undefined") window.webkitRTCPeerConnection = void 0; if (typeof window.webkitRTCSessionDescription !== "undefined") window.webkitRTCSessionDescription = void 0; } // src/content/global.ts function globalVector() { if (window.BILIOLD_GOLBAL) return; window.BILIOLD_GOLBAL = true; setting.section && section(); setting.comment && loadComment(); setting.logReport && blockReport(); setting.player && /\\/festival\\//.test(location.href) && bnj(); path[2] == "message.bilibili.com" && messagePage(); setting.liveP2p && disableWebRTC(); /live\\.bilibili\\.com/.test(location.href) && livePage(); /space\\.bilibili\\.com/.test(location.href) && spacePage(); path[2] == "t.bilibili.com" && setting.liveRecord && dynamicPage(); location.href.includes("www.bilibili.com/account/history") && historyPage(); /bangumi\\/media\\/md/.test(location.href) && mediaPage(); setting.timeline && /anime\\/timeline/.test(location.href) && timeline(); setting.album && /t.bilibili.com\\/\\d+/.test(location.href) && album(); window.addEventListener("message", (ev) => { if (isUserScript) return; if (typeof ev.data === "object") { switch (ev.data.\$type) { case "getPageInfo": window.postMessage({ \$type: "pageInfoResponse", data: { aid: API.aid, cid: API.cid, pgc: API.pgc, cover: API.cover, title: API.title, playerParam: API.playerParam } }); break; default: } } }); } // src/runtime/url_clean.ts var paramsSet = /* @__PURE__ */ new Set([ "spm_id_from", "from_source", "msource", "bsource", "seid", "source", "session_id", "visit_id", "sourceFrom", "from_spmid", "share_source", "share_medium", "share_plat", "share_session_id", "share_tag", "unique_k", "vd_source", "csource" ]); var paramArr = Object.entries({ from: ["search"] }); function replaceUrl(url) { window.history.replaceState(window.history.state, "", url); } function urlClean(str) { const url = new URLES(str); if (url) { const params = url.params; if (params.bvid) { params.aid = abv(params.bvid); } if (params.aid && !Number(params.aid)) { params.aid = abv(params.aid); } paramsSet.forEach((d) => { delete params[d]; }); paramArr.forEach((d) => { if (params[d[0]]) { if (d[1].includes(params[d[0]])) { delete params[d[0]]; } } }); url.base = url.base.replace(/[bB][vV]1[fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF]{9}/g, (s) => "av" + abv(s)); return url.toJSON(); } else return str; } function anchorClean(list) { list.forEach((d) => { if (!d.href) return; d.href = urlClean(d.href); }); } function AnchorClick(e) { var f = e.target; for (; f && "A" !== f.tagName; ) { f = f.parentNode; } if ("A" !== (null == f ? void 0 : f.tagName)) { return; } anchorClean([f]); } var _a2; (_a2 = window.navigation) == null ? void 0 : _a2.addEventListener("navigate", (e) => { const newURL = urlClean(e.destination.url); if (e.destination.url != newURL) { e.preventDefault(); if (newURL == window.location.href) return; window.history.replaceState(window.history.state, "", newURL); } }); window.addEventListener("click", AnchorClick, false); window.addEventListener("contextmenu", AnchorClick, false); document.addEventListener("DOMContentLoaded", () => anchorClean(document.querySelectorAll("a"))); // src/content/av/keep_new.ts function keepNewCheck(jsonp2) { var _a3; const keepNew = sessionStorage.getItem("keepNew"); const redirect = sessionStorage.getItem("redirect"); if (keepNew) { toast.warning(keepNew); sessionStorage.removeItem("keepNew"); globalVector(); throw new Error("禁用旧版页面重构!"); } if (redirect) { replaceUrl(redirect); sessionStorage.removeItem("redirect"); } API.rewrite = jsonp2 || 1; Reflect.defineProperty(window, "_babelPolyfill", { get: () => void 0, set: () => true }); if (isUserScript) { setting.windowStop && window.stop(); window.nanoWidgetsJsonp = true; Reflect.defineProperty(window, "nano", { get: () => new Proxy(() => true, { get: (t, p, r) => r }), set: () => true, configurable: true }); Reflect.deleteProperty(window, "__INITIAL_STATE__"); (_a3 = window.player) == null ? void 0 : _a3.pause(); Reflect.deleteProperty(window, "__playinfo__"); } } // src/content/av/load_event.ts function loadEvent() { doWhile(() => document.readyState === "complete", () => { document.querySelector("#jvs-cert") || window.dispatchEvent(new ProgressEvent("load")); }); } // src/content/bangumi/code.ts function bangumiPage() { keepNewCheck(); const title = document.title; document.documentElement.replaceWith(createElements(htmlVnode(bangumi_default))); title && !title.includes("404") && (document.title = title); API.pgc = true; location.href.replace(/[sS][sS]\\d+/, (d) => API.ssid = Number(d.substring(2))); location.href.replace(/[eE][pP]\\d+/, (d) => API.epid = Number(d.substring(2))); loadVideoScript(); loadComment(); xhrhook("api.bilibili.com/pgc/web/recommend/related/recommend", (args) => { args[1] = args[1].replace("web/recommend", "season/web"); }, (r) => { try { const result = jsonCheck(r.response); result.result = result.data.season; r.responseType === "json" ? r.response = result : r.response = r.responseText = JSON.stringify(result); } catch (e) { } }); xhrhook("bangumi.bilibili.com/ext/web_api/season_count", (args) => { args[1] = args[1].replace("bangumi.bilibili.com/ext/web_api/season_count", "api.bilibili.com/pgc/web/season/stat"); }, (r) => { try { const result = jsonCheck(r.response); result.result.favorites = result.result.follow; r.responseType === "json" ? r.response = result : r.response = r.responseText = JSON.stringify(result); } catch (e) { } }, true); setting.videoLimit.switch && xhrhook("bangumi.bilibili.com/view/web_api/season/user/status", void 0, (res) => { try { const data = res.responseType === "json" ? res.response : JSON.parse(res.response); data.result.area_limit = 0; data.result.ban_area_show = 0; res.responseType === "json" || (res.response = res.responseText = JSON.stringify(data)); } catch (e) { } }, false); const related = {}; xhrhookAsync("x/web-interface/archive/related", () => { var _a3, _b; return (_b = (_a3 = window.__INITIAL_STATE__) == null ? void 0 : _a3.mediaInfo) == null ? void 0 : _b.title; }, async (u, t) => { var _a3, _b; let result = '{ code: 0, data: [], message: "0" }'; if (related[(_b = (_a3 = window.__INITIAL_STATE__) == null ? void 0 : _a3.mediaInfo) == null ? void 0 : _b.title]) { result = related[window.__INITIAL_STATE__.mediaInfo.title]; } else { try { const info = await xhr({ url: \`https://api.bilibili.com/x/tag/info?tag_name=\${window.__INITIAL_STATE__.mediaInfo.title}\`, responseType: "json" }, true); related[window.__INITIAL_STATE__.mediaInfo.title] = result = await xhr({ url: \`https://api.bilibili.com/x/web-interface/tag/top?tid=\${info.data.tag_id}\` }, true); } catch (e) { debug.error("相关视频推荐", e); } } return t === "json" ? { response: JSON.parse(result) } : { response: result, responseText: result }; }, false); bangumiInitialState().then(() => { var _a3, _b, _c; setting.enlike && new enLike("bangumi", (_c = (_b = (_a3 = window.__INITIAL_STATE__) == null ? void 0 : _a3.mediaInfo) == null ? void 0 : _b.stat) == null ? void 0 : _c.likes); if (window.__INITIAL_STATE__.special) { addCss("#bili-header-m > #banner_link,#bili-header-m > .bili-wrapper{ display: none; }"); } if (document.compatMode === "BackCompat") addCss(".header-info > .count-wrapper {height: 18px !important;}"); }); window.__Iris__ = true; appendScripts(script_default2).then(loadEvent); primaryMenu(); banner(); loadByDmId(); episodeData(); globalVector(); } // src/content/av/av_lost_check.ts var Detail = class { code = 0; data = { Card: { archive_count: -1, article_count: -1, card: {}, follower: -1, following: false, like_num: -1, space: {} }, Related: [], Reply: { page: {}, replies: [] }, Spec: null, Tags: [], View: {}, elec: null, hot_share: {}, recommend: null, view_addit: {} }; message = "0"; ttl = 1; }; function view2Detail(data) { var _a3; const result = new Detail(); if (data.v2_app_api) { delete data.v2_app_api.redirect_url; result.data.Card.follower = (_a3 = data.v2_app_api.owner_ext) == null ? void 0 : _a3.fans; result.data.Card.card = { ...data.v2_app_api.owner, ...data.v2_app_api.owner_ext }; result.data.Tags = data.v2_app_api.tag; result.data.View = data.v2_app_api; xhrhook(\`api.bilibili.com/x/web-interface/view?aid=\${API.aid}\`, void 0, (res) => { const t = \`{"code": 0,"message":"0","ttl":1,"data":\${JSON.stringify(result.data.View)}}\`; res.responseType === "json" ? res.response = JSON.parse(t) : res.response = res.responseText = t; }, false); xhrhook(\`api.bilibili.com/x/web-interface/archive/stat?aid=\${API.aid}\`, void 0, (res) => { const t = \`{"code": 0,"message":"0","ttl":1,"data":\${JSON.stringify({ ...result.data.View.stat, aid: API.aid })}}\`; res.responseType === "json" ? res.response = JSON.parse(t) : res.response = res.responseText = t; }, false); return JSON.parse(JSON.stringify(result)); } else return v1api(data); } function v1api(data) { const result = new Detail(); const p = Number(getUrlValue("p")); result.data.Card.card = { face: "//static.hdslb.com/images/akari.jpg", mid: data.mid, name: data.author, vip: {} }; result.data.View = { aid: data.aid || data.id || API.aid, cid: data.list[p ? p - 1 : 0].cid, copyright: 1, ctime: data.created, dimension: { width: 1920, height: 1080, rotate: 0 }, duration: -1, owner: result.data.Card.card, pages: data.list, pic: data.pic, pubdate: data.lastupdatets, rights: {}, stat: { aid: data.aid || data.id || API.aid, coin: data.coins, danmaku: data.video_review, dislike: 0, evaluation: "", favorite: data.favorites, his_rank: 0, like: -1, now_rank: 0, reply: -1, share: -1, view: data.play }, state: 0, subtitle: { allow_submit: false, list: [] }, tid: data.tid, title: data.title, tname: data.typename, videos: data.list.length }; data.bangumi && (result.data.View.season = data.bangumi); xhrhook(\`api.bilibili.com/x/web-interface/view?aid=\${API.aid}\`, void 0, (res) => { const t = \`{"code": 0,"message":"0","ttl":1,"data":\${JSON.stringify(result.data.View)}}\`; res.responseType === "json" ? res.response = JSON.parse(t) : res.response = res.responseText = t; }, false); xhrhook(\`api.bilibili.com/x/web-interface/archive/stat?aid=\${API.aid}\`, void 0, (res) => { const t = \`{"code": 0,"message":"0","ttl":1,"data":\${JSON.stringify({ ...result.data.View.stat, aid: API.aid })}}\`; res.responseType === "json" ? res.response = JSON.parse(t) : res.response = res.responseText = t; }, false); return JSON.parse(JSON.stringify(result)); } async function check(call) { try { toast.info(\`正在进一步查询 av\${API.aid} 的信息~\`); const card = await xhr({ url: \`https://api.bilibili.com/x/article/cards?ids=av\${API.aid}\`, responseType: "json" }); if (card.data[\`av\${API.aid}\`]) { if (card.data[\`av\${API.aid}\`].redirect_url) { sessionStorage2.setItem("redirect", card.data[\`av\${API.aid}\`].redirect_url); call(new Detail()); if (isUserScript) return bangumiPage(); return loadScriptEs("content/bangumi/bangumi.js"); } } const data = await xhr({ url: \`https://www.biliplus.com/api/view?id=\${API.aid}\`, responseType: "json" }, true); const res = view2Detail(data); if (res.data.View.season) { sessionStorage2.setItem("redirect", res.data.View.season.ogv_play_url); res.data.View.season = void 0; call(res); if (isUserScript) return bangumiPage(); return loadScriptEs("content/bangumi/bangumi.js"); } call(res); setTimeout(() => { toast.custom(0, "warning", "这大概是一个无效av号~", "本页面使用缓存数据生成,并无法播放!", "部分上古视频还存在评论区哦~"); }, 1e3); } catch (e) { debug.error(e); } } function avLostCheck() { jsonphook("api.bilibili.com/x/web-interface/view/detail", void 0, (res, r, call) => { if (0 !== res.code) { const obj = urlObj(r); if (obj.aid) { API.aid = obj.aid; check(call); return true; } } else { if (res.data && res.data.View) { if (res.data.View.stein_guide_cid) { sessionStorage2.setItem("keepNew", "旧版页面不支持互动视频!已重定向回新版页面🤣"); location.reload(); } Promise.resolve().then(() => { setting.upList && res.data.View.staff && upList(res.data.View.staff); setting.collection && res.data.View.is_season_display && res.data.View.ugc_season && collection(res.data.View); }); } } }, false); } // src/content/av/code.ts function avPage() { keepNewCheck(2); location.href.includes("/s/video") && replaceUrl(location.href.replace("/s/video", "/video")); const title = document.title; document.documentElement.replaceWith(createElements(htmlVnode(av_default))); title && !title.includes("404") && (document.title = title); loadVideoScript(); loadComment(); webpackhook(717, 274, (code) => code.replace("init:function(){", "init:function(){window.biliUIcomponents=this;").replace("this.getAdData()", "this.getAdData")); webpackhook(717, 251, (code) => code.replace("e[0].code", "e.code").replace("i[0].code", "i.code")); webpackhook(717, 660, (code) => code.replace('tag/"+t.info.tag_id+"/?pagetype=videopage', 'topic/"+t.info.tag_id+"/?pagetype=videopage')); webpackhook(717, 100, (code) => code.replace(/MenuConfig[\\S\\s]+?LiveMenuConfig/, \`MenuConfig=\${menu_config_default},e.LiveMenuConfig\`)); webpackhook(717, 609, () => \`()=>{}\`); webpackhook(717, 2, (code) => code.replace("av\$1</a>')", \`av\$1</a>').replace(/(?!<a[^>]*>)cv([0-9]+)(?![^<]*<\\\\/a>)/ig, '<a href="//www.bilibili.com/read/cv\$1/" target="_blank" data-view="\$1">cv\$1</a>').replace(/(?!<a[^>]*>)(bv1)(\\\\w{9})(?![^<]*<\\\\/a>)/ig, '<a href="//www.bilibili.com/video/bv1\$2/" target="_blank">\$1\$2</a>')\`).replace("http://acg.tv/sm", "https://www.nicovideo.jp/watch/sm")); webpackhook(717, 286, (code) => code.replace('e("setVideoData",t)', \`e("setVideoData",t);\$("#bofqi").attr("id","__bofqi").html('<div class="bili-wrapper" id="bofqi"><div id="player_placeholder"></div></div>');new Function(t.embedPlayer)();\`)); setting.automate.electric && jsonphookasync("api.bilibili.com/x/web-interface/elec/show", void 0, async () => { return { code: -404 }; }, false); Reflect.defineProperty(window, "__INITIAL_STATE__", { configurable: true, value: void 0 }); appendScripts(script_default).then(loadEvent); setting.enlike && new enLike(); avLostCheck(); primaryMenu(); banner(); loadByDmId(); globalVector(); } // src/content/index/ad_block.ts function adblock(prev) { return prev.filter((d) => !d.is_ad); } // src/content/index/index.html var index_default = '<!-- <!DOCTYPE html> -->\\r\\n<html lang="zh-CN">\\r\\n\\r\\n<head>\\r\\n <meta charset="utf-8" />\\r\\n <title>哔哩哔哩 (゜-゜)つロ 干杯~-bilibili</title>\\r\\n <meta name="description" content="bilibili是国内知名的视频弹幕网站,这里有最及时的动漫新番,最棒的ACG氛围,最有创意的Up主。大家可以在这里找到许多欢乐。" />\\r\\n <meta name="keywords"\\r\\n content="Bilibili,哔哩哔哩,哔哩哔哩动画,哔哩哔哩弹幕网,弹幕视频,B站,弹幕,字幕,AMV,MAD,MTV,ANIME,动漫,动漫音乐,游戏,游戏解说,二次元,游戏视频,ACG,galgame,动画,番组,新番,初音,洛天依,vocaloid,日本动漫,国产动漫,手机游戏,网络游戏,电子竞技,ACG燃曲,ACG神曲,追新番,新番动漫,新番吐槽,巡音,镜音双子,千本樱,初音MIKU,舞蹈MMD,MIKUMIKUDANCE,洛天依原创曲,洛天依翻唱曲,洛天依投食歌,洛天依MMD,vocaloid家族,OST,BGM,动漫歌曲,日本动漫音乐,宫崎骏动漫音乐,动漫音乐推荐,燃系mad,治愈系mad,MAD MOVIE,MAD高燃" />\\r\\n <meta name="renderer" content="webkit" />\\r\\n <meta http-equiv="X-UA-Compatible" content="IE=edge" />\\r\\n <link rel="search" type="application/opensearchdescription+xml" href="//static.hdslb.com/opensearch.xml"\\r\\n title="哔哩哔哩" />\\r\\n <link rel="stylesheet"\\r\\n href="//s1.hdslb.com/bfs/static/jinkela/home/css/home.0.4eadf4209b1762230047120e0a9945a9f3b56fd1.css" />\\r\\n <style type="text/css">\\r\\n /* 隐藏失效节点 */\\r\\n #fixed_app_download,\\r\\n #app>div.report-wrap-module.elevator-module>div.ver {\\r\\n display: none;\\r\\n }\\r\\n\\r\\n /* 禁用失效节点 */\\r\\n .bili-tab.rank-tab,\\r\\n .bili-dropdown.rank-dropdown {\\r\\n pointer-events: none;\\r\\n }\\r\\n\\r\\n /* 资讯区图标 */\\r\\n .icon.icon_t.icon-news {\\r\\n background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA39pVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDplMzNhZmQ3OS04ZTViLWQ2NDItOTYxZi0yNDM2MGQyN2JhM2YiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QTFEMzQ4MEJBNUM1MTFFQ0FGQTk5NEVFMjgwODg3M0UiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QTFEMzQ4MEFBNUM1MTFFQ0FGQTk5NEVFMjgwODg3M0UiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjBiNzNlZjA5LTA1ZmEtNTM0MC1iMWY3LWE4MTljMjFhYmEzMiIgc3RSZWY6ZG9jdW1lbnRJRD0iYWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOjI2MDJjOTk2LTBiNzQtZDQ0MC1hMzcxLTIxN2NkM2ZlOTgzMyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PsCIXZoAAAi+SURBVHja7Fh7TJvXFT+fwTa2MX5gXjZgg3kEJvICh6YELUujNKNb10ZpWFc17aapSxcpy1YlUjctUbt0L22VMm2NlkXLsqZJWdT0sWwlaZOmCwW1gfIMCSYYDOZhDH6ADdjGvvvOhc8YY8Bru61/9EhX97vnnnvv755z7znnfgwhBD7PxIPPOcWHNxiGWdSp0Wi2eX0+uSxJVuxyOaXIk8nkk1hj2+FwlHGyCoWiMbwfaXLCNRIEsAsFAufU9LSdLxL2jw4O21cCFGlRJpzBAUzTqnX2Qdtlti8/XFir04AqK58RieVgtxinPB6XyFBRRQf19nfDtH10Cr+Rj/XIuNvnnXQJuPFCqcznc0+YgyRoCQaD/ckq1d/HbLaLMQP0zPjmtCFN7Nq45csFzxz4IeTk6ilPJBGDLjMNJAmCmM0zMu4Ci2UEek09YBs0w+jENHR13aV9nS0fTHXe6hRpdbojPT13jy0HkDK44p72QmpKyncl8uQZEiOxY2j5JLT/0E9IfFx8EC0WDQ+WJRqUihNOVz++78nzZ14KafS/QWgJnF+eKCFypWI3Z+pIDS65xTweL7vSULLsxHE8Hj2rkRdq0Rzz/VzhLSOLIEsrtzIsCGXMbobH8DJzS8qjCuMygWAwpP7lKBhhpmAUWc46ZYZy7M+PGaAgMUkb3u7r7YWrV94Bv98PZL7d3NT0mZm6pGQdhLurFQF2dfaowt0C3anbDUODg9DR1hZq28ftnxlAbbaeWi0mgLV1danRHLZAKGQBtgPr+BbxUZM1587DG6+9Bk6nk7aNXV2078b196m2kdACttFRWr98+i+s3MeRniTf+uP90phMjOBUcskinkqlArVGAw0f1Id4uCCC1uXowOv1Qf2NOhAIBHDX2E03guAGzP1UDi3g9/lpvbGsFHL0uaF5sjQptD6Vti5rVYDD/b1aTnuRx3rt+nV0gZHhEdoetVpp7Z50g1AogPGxMdBkZdG612SiG0KQKKfLyQF1pgYK1hRCR3sHCPj80LzJiiQaYXDtVQFmZOeYlzsLKampdCEEGW56BF5RWQk7H6gCuVw+dxxYEPr8PJAmSeHjxibI0mZT+fLNm0EqlcL1a+99umxmzOmJKlxqWLhsOblzZmpraYU7nbfxJtI2mtzn9YImMxMy1GrKS2U3N2QZpGdwcnISfD7vkrndnqn1q2Yzx399lNrP7bCGeLl5emo6JLFEAl9/+KGF7288SM0pSUwEuUIx5zbWroXCoiLgs2bE71y9nsoioVbTM9JDm0NiN0PQcyRKxC2rAmx/Ypdff6IGPaiQu8cikZgWjtCMHOHCXypZHHWQJw7/ngeHNR6RSJqc8jJRjnx0E0t++iLN5UYtff+zhHTaQzM0MFRs88d0Bll1m+saO0KxcqWElgt/keyFWLy0L5IwFUOyDPQOxQQwL0/f8uGNSySWbJdzR5HshVi8tC+SME+E1VLs8HxQlZKyC3O0my13FuVuASyBIC3++TKL7SCbH9PyiVJC8s29TxPMP7lIEpkPxi9RqSD+OtavvPQ8FB0/DX0WKzVjUe1lGLm/FOKS9ayb8BE2ajAkTI+xPg7T/noOhqrKwK/eACn8IH0qZKepmtN+/ofJVW8xkulun51NWs/86W+XH12z5U0hBvPUty4A+f0JMmLez1j2PAYJXh89WbJpE1imJaAWutlavOwxQOKrsyGruR54hw5Pqxu3i7oOfh9uTCXTd4xtfPxfy20o6puELp4ovpoglVfI9v5CaPBPwQWlHWzt3dOHlEoRXoDkNDkok5SQmiRaERhH+B550GaFEkkCtHtm4HmvGhqMTeB4/1VjYpK02mG3t0SbZ5EGERSmPrOB2Xo2swZJaZXQVvxVeKf1FrQ+ooNS93HR2NlzYFLIiNXu8eFkMxNOAcbSCE8g4F5x4d/fySsW8N/4DbPjnBkc7nWgvP4q4FocuJhMLMsvLSDf/lGB3J9FknfeA/iasXS+jUGMTd5K4NK+FOAfe44Z7LopnHv7OsEx7hAqkuciCfsdmovlURlpkhy89WcFWa1+hkgVILS0Anm4wKerqBHAweonXd1N9yLQ3Fw9+pxjywJMksmewTRPf98jkC2eZHrYvIDPruv0Z8OfGzuhbE8pkOpfAsyOgKbQQGuINwC5+RGQzjvAFK8BYh0G3mM7WH76fH86ndv/8iWGbNDDW7e9MDNkhfUBEPBU2ZB7tgGCY/0FfQerC/q7m4yRABf5QVS1w3jzWt/hvdA/JaXgkGZScqCm9haAZhN0GPLh/vRiYDUYWpwxbAJIl8Hsm/+gIClx4Nj6e9u2B4/WnATeE3vhSkc3O5+Bzu1nlc0qYi6iDHd78Syu6Adp5qHJUPLj+V2p9z1O9C80BAsvuMiGdwkRP11L37F6vTaIfhJL+dbt5OBT3yL1b9cQ4h+ec2xsffujK5R39IXfEk4WC8qqD5wkca+4yKYmQgu2sQ/9bzQ/uARgWBb9KxyIE+y+PUF4R7qoQ0XHah60UnAcSORvrdpNN4BtVdE9RLn7Z7Qgf3jMSUFzfARWdtlMx+PYlR7uUQHiTyPUIg7efMJEJ0QNNgy4QxGgd8JPeRzhwqh13BD+aUDZHadM7sjIgWOY94gX50QLIWhUxnIajI92tfGPFv7g8bknoO1Zg1aUkS9k2DNy3LNHOPDQ16CYTbFOmueGbjn2Lq2dxXtg16MZ8M/f1bNuyQi1bR6oa3ZKjmaOwE4yAC5RHpjaP4REYwNk1Mv4cco0UJSpGUfzAzDx+nOHAsHAGXaaiys66mjZCqo/MOXfyG6nnHu/snnKVwRPXWKqDtwLF88PUzkEp01LBLPVTUHixcoR2on5SCVwfhJ9IveHayGxCFqSlcrzozbbqZh/v60YS1nAbpf3zj6TTZgvWBjb7Vs6FvuvnfwjvH74B0aZQv5sIBAwrfaP8FMDjIuLu6ooMGz7TxNT1hkb/bP+wtXkVgT4xT/qLwD+H+jfAgwAa4KbOGyf2aUAAAAASUVORK5CYII=);\\r\\n background-position: unset;\\r\\n }\\r\\n </style>\\r\\n</head>\\r\\n\\r\\n<body>\\r\\n <div id="home-app"></div>\\r\\n <div id="app" data-server-rendered="true"></div>\\r\\n <div class="footer bili-footer report-wrap-module"></div>\\r\\n</body>\\r\\n\\r\\n</html>'; // src/content/index/news.html var news_default = '<div class="r-con">\\r\\n <div class="r-con">\\r\\n <header style="margin-bottom: 14px">\\r\\n <h3 style="font-size: 18px;font-weight: 400;">资讯分区正式上线啦!</h3>\\r\\n </header>\\r\\n <div class="carousel-module">\\r\\n <div class="panel"><a href="https://www.bilibili.com/v/information" target="_blank"><img\\r\\n src="//i0.hdslb.com/bfs/archive/0747d26dbbc3bbf087d47cff49e598a326b0030c.jpg@320w_330h_1c.webp"\\r\\n width="260" height="280" /></a></div>\\r\\n </div>\\r\\n </div>\\r\\n</div>'; // src/content/index/initial_state.ts var __INITIAL_STATE__ = { locsData: { 23: null, 29: null, 31: null, 34: null, 40: null, 42: null, 44: null, 142: null }, recommendData: null }; // src/content/index/recommend_data.ts async function recommendData() { const d = await fetch("https://api.bilibili.com/x/web-interface/index/top/rcmd?fresh_type=3", { credentials: "include" }).then((d2) => d2.json()); d.data.item.forEach((d_1, i, s) => { s[i].author = d_1.owner.name; s[i].play = d_1.stat.view; s[i].aid = d_1.id; }); return d.data.item; } // src/content/index/code.ts function indexPage() { keepNewCheck(); document.documentElement.replaceWith(createElements(htmlVnode(index_default))); window.__INITIAL_STATE__ = __INITIAL_STATE__; appendScripts(\` <script type="text/javascript" src="//static.hdslb.com/js/jquery.min.js"><\\/script> <script type="text/javascript" src="//s1.hdslb.com/bfs/cm/st/bundle.js"><\\/script> <script src="//s1.hdslb.com/bfs/static/jinkela/home/1.home.4eadf4209b1762230047120e0a9945a9f3b56fd1.js"><\\/script> <script src="//s1.hdslb.com/bfs/static/jinkela/home/home.4eadf4209b1762230047120e0a9945a9f3b56fd1.js"><\\/script> <script src="//static.hdslb.com/common/js/footer.js"><\\/script> \`).then(loadEvent); fetch("https://api.bilibili.com/x/web-show/res/locs?pf=0&ids=4694,29,31,34,40,42,44").then((d) => d.text()).then((d) => { d = JSON.parse(d.replace(/[bB][vV]1[fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF]{9}/g, (s) => "av" + abv(s))); __INITIAL_STATE__.locsData[23] = adblock(d.data[4694]); __INITIAL_STATE__.locsData[29] = adblock(d.data[29]); __INITIAL_STATE__.locsData[31] = adblock(d.data[31]); __INITIAL_STATE__.locsData[34] = adblock(d.data[34]); __INITIAL_STATE__.locsData[40] = adblock(d.data[40]); __INITIAL_STATE__.locsData[42] = adblock(d.data[42]); __INITIAL_STATE__.locsData[44] = adblock(d.data[44]); }).catch((reason) => { debug.error("获取推荐数据失败 ಥ_ಥ", reason); toast.error("获取推荐数据失败 ಥ_ಥ"); }); recommendData().then((d) => { if (uid) { __INITIAL_STATE__.recommendData = d; doWhile(() => document.querySelector(".rec-btn.prev"), () => { addElement( "span", { class: "rec-btn prev" }, void 0, "刷新", void 0, document.querySelector(".rec-btn.prev") ).addEventListener("click", () => { recommendData().then((d2) => __INITIAL_STATE__.recommendData = d2); }); addElement( "span", { class: "rec-btn next" }, void 0, "刷新", void 0, document.querySelector(".rec-btn.next") ).addEventListener("click", () => { recommendData().then((d2) => __INITIAL_STATE__.recommendData = d2); }); }); } else { const one = d.splice(0, 10); const two = d.splice(0, 10); __INITIAL_STATE__.recommendData = [...one]; jsonphookasync("api.bilibili.com/x/web-interface/ranking/index", void 0, async (str) => { const obj = urlObj(str); if (obj) { if (obj.day == "7") { return { code: 0, data: two, message: "0", ttl: 1 }; } else if (obj.day == "1") { return { code: 0, data: d, message: "0", ttl: 1 }; } return { code: 0, data: one, message: "0", ttl: 1 }; } }, false); } }).catch((reason) => { toast.error("获取推荐数据失败 ಥ_ಥ"); debug.error("获取推荐数据失败 ಥ_ಥ", reason); }); doWhile(() => document.querySelector("#ranking_ad"), () => { const vue = document.querySelector("#app > div.report-wrap-module.elevator-module").__vue__; const ranking_ad = document.querySelector("#ranking_ad").__vue__; const ranking_technology = document.querySelector("#ranking_technology").__vue__; const ranking_digital = document.querySelector("#ranking_digital").__vue__; vue.config[13].morelink = "/v/information/"; vue.config[13].name = "资讯"; vue.config[13].tid = 202; vue.config[13].type = "news"; vue.config[8].morelink = "/v/knowledge/"; vue.config[8].name = "知识"; vue.config[9].morelink = "/v/tech/"; vue.config[9].name = "科技"; ranking_ad.config.morelink = "/v/information/"; ranking_ad.config.name = "资讯"; ranking_ad.config.tid = 202; ranking_ad.config.type = "news"; ranking_technology.config.morelink = "/v/knowledge/"; ranking_technology.config.name = "知识"; ranking_digital.config.morelink = "/v/tech/"; ranking_digital.config.name = "科技"; doWhile(() => document.querySelector("#ranking_news"), () => { document.querySelector("#ranking_news").replaceChildren(createElements(htmlVnode(news_default))); }); }); xhrhook("api.live.bilibili.com/room/v1/RoomRecommend/biliIndexRec", (args) => { args[1] = args[1].includes("List") ? args[1].replace("api.live.bilibili.com/room/v1/RoomRecommend/biliIndexRecList", "api.live.bilibili.com/xlive/web-interface/v1/webMain/getList?platform=web") : args[1].replace("api.live.bilibili.com/room/v1/RoomRecommend/biliIndexRecMore", "api.live.bilibili.com/xlive/web-interface/v1/webMain/getMoreRecList?platform=web"); }, (obj) => { var _a3; let response = (_a3 = obj.responseText) == null ? void 0 : _a3.replace(/preview_banner_list/, "preview").replace(/ranking_list/, "ranking").replace(/recommend_room_list/, "recommend"); if (response) { response = JSON.parse(response); response.data.text_link = { text: "233秒居然能做这些!", link: "//vc.bilibili.com" }; if (response.data.recommend) { for (let i = 0; i < response.data.recommend.length; i++) { response.data.recommend[i].pic = response.data.recommend[i].cover; response.data.recommend[i].link = "//live.bilibili.com" + response.data.recommend[i].link; } } if (response.data.preview) for (let i = 0; i < response.data.preview.length; i++) response.data.preview[i].url = response.data.preview[i].link; obj.response = obj.responseText = JSON.stringify(response); } }, false); jsonphook(["newlist", "rid=202"], (url) => url.replace("rid=202", "rid=203"), void 0, false); jsonphook("api.bilibili.com/x/web-interface/ranking/region", (url) => { const obj = new URL(url); let arr2 = void 0; switch (obj.searchParams.get("rid")) { case "23": arr2 = [document.querySelector("#ranking_movie"), 2, "/ranking/cinema/23/0/3"]; break; case "11": arr2 = [document.querySelector("#ranking_teleplay"), 5, "/ranking/cinema/11/0/3"]; break; case "177": arr2 = [document.querySelector("#ranking_documentary"), 3, "/ranking/cinema/177/0/3"]; break; } if (arr2) { fetch(\`https://api.bilibili.com/pgc/season/rank/web/list?season_type=\${arr2[1]}&day=3\`).then((d) => d.json()).then((d) => { var _a3; const data = jsonCheck(d).data; let html = \`<header class="rank-head"><h3>排行</h3><div class="bili-dropdown rank-dropdown"><span class="selected">三日</span><i class="icon icon-arrow-down"></i><ul class="dropdown-list"><li class="dropdown-item" style="display: none;">三日</li><li class="dropdown-item">一周</li></ul></div></header><div class="rank-list-wrap"><ul class="bangumi-rank-list rank-list">\`; for (let i = 0; i < 8; i++) { html += \`<li class="rank-item\${i < 3 ? " highlight" : ""}"><i class="ri-num">\${i + 1}</i><a href="\${data.list[i].url}" target="_blank" title="\${data.list[i].title} 播放:\${data.list[i].stat.view}" class="ri-info-wrap"><p class="ri-title">\${data.list[i].title}</p><span class="ri-total">\${data.list[i].new_ep.index_show}</span></a></li>\`; } html += \`</ul></div><a href="\${arr2[2]}" target="_blank" class="more-link">查看更多<i class="icon icon-arrow-r"></i></a>\`; const vnode = htmlVnode(html); (_a3 = vnode[1].children[0].children) == null ? void 0 : _a3.forEach((d2, i) => { let node4; d2.event = { "mouseover": (e) => { const target = e.target; const nodes = createElements(htmlVnode(\`<div class="bangumi-info-module" style="left: \${target.getBoundingClientRect().left}px; top: \${getTotalTop(target) - 150}px;"><div class="v-preview clearfix"><div class="lazy-img cover"><img alt="\${data.list[i].title}" src="\${data.list[i].cover.replace("http:", "")}" /></div><div><p class="title">\${data.list[i].title}</p><p class="desc">\${data.list[i].new_ep.index_show}</p></div></div><div class="v-data"><span class="play"><i class="icon"></i>\${unitFormat(data.list[i].stat.view)}</span><span class="danmu"><i class="icon"></i>\${unitFormat(data.list[i].stat.danmaku)}</span><span class="fav"><i class="icon"></i>\${unitFormat(data.list[i].stat.follow)}</span></div></div>\`)); node4 = nodes.children[0]; document.body.appendChild(nodes); }, "mouseout": () => node4.remove() }; }); arr2[0].replaceChildren(createElements(vnode)); }).catch((e) => { debug.error(arr2[0], e); }); } return url; }, void 0, false); xhrhook("api.bilibili.com/pgc/web/timeline?types=1", void 0, (res) => { setting.timeline && timeline(); }); primaryMenu(); banner(); globalVector(); } // src/content/player/script.html var script_default3 = '<script type="text/javascript" src="//static.hdslb.com/js/jquery.min.js"><\\/script>\\r\\n<script type="text/javascript" src="//static.hdslb.com/js/jquery.qrcode.min.js"><\\/script>\\r\\n<script type="text/javascript" src="//static.hdslb.com/player/js/whitelist.js"><\\/script>'; // src/content/player/player.html var player_default = '<!-- <!DOCTYPE html> -->\\r\\n<html lang="zh-CN">\\r\\n\\r\\n<head>\\r\\n <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">\\r\\n <meta name="viewport"\\r\\n content="target-densitydpi=device-dpi,width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,minimal-ui">\\r\\n <title>player - bilibili.com</title>\\r\\n <link rel="shortcut icon" href="//static.hdslb.com/images/favicon.ico" />\\r\\n <style type="text/css">\\r\\n html {\\r\\n background-color: #fff;\\r\\n font-family: "Microsoft YaHei", Arial, Helvetica, sans-serif;\\r\\n overflow: hidden;\\r\\n }\\r\\n\\r\\n html,\\r\\n body,\\r\\n #bofqi,\\r\\n .player {\\r\\n width: 100%;\\r\\n height: 100%;\\r\\n margin: 0px;\\r\\n padding: 0px;\\r\\n }\\r\\n\\r\\n #bofqi,\\r\\n #bofqi .player-box {\\r\\n width: 100%;\\r\\n height: 100%;\\r\\n overflow: visible;\\r\\n box-sizing: border-box;\\r\\n }\\r\\n\\r\\n #bofqi object {\\r\\n width: 100%;\\r\\n height: 100%;\\r\\n }\\r\\n\\r\\n #dm_send_bar {\\r\\n width: 100%;\\r\\n height: 60px;\\r\\n position: absolute;\\r\\n bottom: -60px;\\r\\n background-color: transparent;\\r\\n }\\r\\n\\r\\n #dm_send_input {\\r\\n margin: 10px 0 10px 2%;\\r\\n height: 40px;\\r\\n line-height: 38px;\\r\\n border: 1px solid #ddd;\\r\\n border-radius: 5px;\\r\\n font-size: 1rem;\\r\\n font-family: "Microsoft YaHei";\\r\\n padding: 0 8px;\\r\\n width: 70%;\\r\\n outline: 0;\\r\\n box-sizing: border-box;\\r\\n color: #333;\\r\\n }\\r\\n\\r\\n #dm_send_btn {\\r\\n height: 40px;\\r\\n line-height: 40px;\\r\\n font-size: 1rem;\\r\\n color: #fff;\\r\\n background: #de698c;\\r\\n border-radius: 6px;\\r\\n margin: 10px 3% 10px 0;\\r\\n width: 20%;\\r\\n box-sizing: border-box;\\r\\n outline: 0;\\r\\n border: 0;\\r\\n float: right;\\r\\n }\\r\\n\\r\\n #dm_send_btn:focus,\\r\\n #dm_send_btn.disabled {\\r\\n background-color: #b65673;\\r\\n }\\r\\n\\r\\n #player_placeholder {\\r\\n display: none !important;\\r\\n }\\r\\n </style>\\r\\n</head>\\r\\n\\r\\n<body>\\r\\n <div id="bofqi"></div>\\r\\n</body>\\r\\n\\r\\n</html>'; // src/content/player/code.ts function palyerPage() { document.documentElement.replaceWith(createElements(htmlVnode(player_default))); loadVideoScript(void 0, true); document.domain = "bilibili.com"; appendScripts(script_default3).then(() => { const playerParam = { aid: getUrlValue("aid") || getUrlValue("avid"), cid: getUrlValue("cid"), p: getUrlValue("P"), as_wide: getUrlValue("as_wide"), bnj: getUrlValue("bnj"), player_type: getUrlValue("player_type"), season_type: getUrlValue("season_type") }; if (playerParam.bnj) { try { window.parent.EmbedPlayer = window.EmbedPlayer; window.parent.bnj = true; } catch (e) { } } else { urlParam(location.href).then((d) => { if (!d.cid) throw d; playerParam.aid = d.aid; playerParam.cid = d.cid; if (d.pgc || d.ssid || d.epid) { !playerParam.season_type && (playerParam.season_type = "1"); Reflect.set(playerParam, "seasonId", d.ssid); Reflect.set(playerParam, "episodeId", d.epid); Reflect.set(playerParam, "urlparam", \`module%3Dbangumi%26season_type%3D\${playerParam.season_type}\`); } window.EmbedPlayer("player", "//static.hdslb.com/play.swf", objUrl("", playerParam)); }); } doWhile(() => window.player, () => { try { window.parent.player = window.player; } catch (e) { } }); }); globalVector(); } // src/content/playlist/toview.json var toview_default = { attr: 2, count: 100, cover: "https://i0.hdslb.com/bfs/archive/a45ef4fcde397247032cf4ce0c8f71815f9e28d0.jpg", ctime: 1529021131, description: "bilibili moe 2018 动画角色人气大赏日本动画场应援视频播单 / 每天不定时更新最新的一批", faved_count: 0, favored: 0, favorite: false, id: 1826036, is_favorite: false, like_count: 0, list: [ { aid: 24883898, attribute: 16768, cid: 41980488, copyright: 1, ctime: 1528969754, desc: "bilibili moe 2018 动画角色人气大赏日本动画场宣传PV / BGM : No.1 / Editor : @暗猫の祝福 \\n\\n活动地址 https://www.bilibili.com/moe/2018/jp/home\\n\\n了解活动最新动态请关注@哔哩哔哩萌战基", dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 191, dynamic: "#日本场应援##角色应援##bilibilimoe2018#", owner: { face: "http://i2.hdslb.com/bfs/face/1e711421fdd158a0cadc1c4351ca19a75ea712ec.jpg", mid: 26366366, name: "哔哩哔哩活动" }, pages: [ { cid: 41980488, dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 191, from: "vupload", page: 1, part: "bilibili moe 2018 动画角色人气大赏 - 日本动画场PV", vid: "", weblink: "" } ], pic: "http://i0.hdslb.com/bfs/archive/6e7ce18cca1965da52090e96c03c095ee97f43a7.jpg", pubdate: 1529121652, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 1, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 24883898, coin: 30379, danmaku: 38599, dislike: 0, favorite: 29868, his_rank: 76, like: 18109, now_rank: 0, reply: 18082, share: 12878, view: 1072577 }, state: 0, tid: 24, title: "bilibili moe 2018 动画角色人气大赏日本动画场宣传PV", tname: "MAD·AMV", videos: 1 }, { aid: 28854498, attribute: 16768, cid: 50012938, copyright: 1, ctime: 1533734369, desc: "因为是突然心血来潮的作品,所以也没有特意去找无字幕的片源,直接用了带字幕的。所以中间有一段我添加了部分马赛克。\\n之前已经做过一次关于(Fate/Stay night 宛若天堂)这一条樱线的视频了,但是上一次毕竟是战斗画面为主,所以这一次我决定给樱做一期她为主角的剪辑视频,希望大家可以喜欢。\\nBGM:River Flows in You", dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 192, dynamic: "#日本场应援2018##AMV##MAD#", mission_id: 10568, owner: { face: "http://i1.hdslb.com/bfs/face/d6c946012742c3c86839fc2caf547a99159009ad.jpg", mid: 24626247, name: "星火琉璃酱" }, pages: [ { cid: 50012938, dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 192, from: "vupload", page: 1, part: "【AMV】樱,你是我喜欢的女孩。", vid: "", weblink: "" } ], pic: "http://i1.hdslb.com/bfs/archive/dacc8024b48b7cc756b27e2945bd7d7d9cbbc387.jpg", pubdate: 1533734369, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 1, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28854498, coin: 27, danmaku: 31, dislike: 0, favorite: 22, his_rank: 0, like: 29, now_rank: 0, reply: 7, share: 4, view: 4788 }, state: 0, tid: 24, title: "【AMV】樱,你是我喜欢的女孩。", tname: "MAD·AMV", videos: 1 }, { aid: 28854218, attribute: 16768, cid: 50011454, copyright: 1, ctime: 1533733783, desc: "尼禄殿下好可爱啊,用了前十集的素材。一共30多个唔嗯,有些不能用,用了好长时间剪素材\\n动漫:Fate/EXTRA Last Encore,其实我觉得这番挺好看的,内容也是有点,可能还是和UBW有点差距吧\\nBGM:Unity", dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 121, dynamic: "#日本场应援2018##新星计划##尼禄#", mission_id: 10568, owner: { face: "http://i2.hdslb.com/bfs/face/67d4c8c9a6d9b58fd5c935047c64cdd3b5cadbef.jpg", mid: 14911961, name: "抹不去の伤痛" }, pages: [ { cid: 50011454, dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 121, from: "vupload", page: 1, part: "FateEXTRA Last Encore - 如今在古老边狱之底(Av18806005,P1)", vid: "", weblink: "" } ], pic: "http://i1.hdslb.com/bfs/archive/8a213e873515eda27d474f0c9cc31e6c47166cb3.jpg", pubdate: 1533733783, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 1, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28854218, coin: 56, danmaku: 47, dislike: 0, favorite: 96, his_rank: 0, like: 91, now_rank: 0, reply: 21, share: 28, view: 6641 }, state: 0, tid: 27, title: "尼禄殿下世界第一可爱", tname: "综合", videos: 1 }, { aid: 28851731, attribute: 24704, cid: 49951942, copyright: 1, ctime: 1533733741, desc: "米娜桑,大家好!这次趁着B萌赶紧做一波应援视频,希望大家喜欢!btw考虑一下投凛哟~\\n使用素材: Fate/Grand Order, Fate/Stay Night UBW, Fate/Zero, Fate,/Stay Night HF, Fate/Hollow Ataraxia\\n视频类型: AMV/MAD\\nBGM【音乐名】: Illuminate\\nBGM【音乐人】: Minami", dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 287, dynamic: "#金闪闪##日本场应援2018##卫宫士郎##远坂凛#", mission_id: 10568, owner: { face: "http://i1.hdslb.com/bfs/face/3c3eb61912831b33c83a5924c16d1d17f1ad893c.jpg", mid: 44371203, name: "呆毛万岁233" }, pages: [ { cid: 49951942, dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 287, from: "vupload", page: 1, part: "【Fate:全角色应援:MAD:慢燃】吾等响应汝之召唤而来,众英灵,参上!", vid: "", weblink: "" } ], pic: "http://i2.hdslb.com/bfs/archive/5cde6c0623ec8701da5ade96425c72d21448bd22.jpg", pubdate: 1533733741, rights: { autoplay: 0, bp: 0, download: 0, elec: 0, hd5: 0, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28851731, coin: 139, danmaku: 81, dislike: 0, favorite: 152, his_rank: 0, like: 141, now_rank: 0, reply: 47, share: 37, view: 5948 }, state: 0, tid: 24, title: "【Fate/全角色应援/慢燃/MAD】吾等响应汝之召唤而来,众英灵,参上!", tname: "MAD·AMV", videos: 1 }, { aid: 28847039, attribute: 16512, cid: 49996088, copyright: 1, ctime: 1533728826, desc: "萌萌的小樱~", dimension: { height: 720, rotate: 0, width: 1280 }, duration: 749, dynamic: "#日本场应援2018##魔卡少女樱##木之本樱#", mission_id: 10568, owner: { face: "http://i1.hdslb.com/bfs/face/fcafbef391efb9b59978242c27d1907de11a4270.jpg", mid: 32452880, name: "月下的纯白" }, pages: [ { cid: 49996088, dimension: { height: 720, rotate: 0, width: 1280 }, duration: 749, from: "vupload", page: 1, part: "小樱", vid: "", weblink: "" } ], pic: "http://i2.hdslb.com/bfs/archive/003c7674aad37e0fa0791e21c2b1c16935132f99.jpg", pubdate: 1533728826, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 0, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28847039, coin: 42, danmaku: 10, dislike: 0, favorite: 19, his_rank: 0, like: 45, now_rank: 0, reply: 26, share: 9, view: 2271 }, state: 0, tid: 162, title: "【绘画过程】木之本樱 封印解除~", tname: "绘画", videos: 1 }, { aid: 28845287, attribute: 16768, cid: 49992801, copyright: 1, ctime: 1533723329, desc: "救救孩子!!请给咔酱投上一票!!!\\n【别问我为什么要用这样的应援我已经彻底放弃剪燃向了_(:з」∠)_】【无cp】\\nBGM:\\nだってまだまだアバンタイトル—觉得爆豪同学特别可爱的轰君和切岛君x【梶裕贵/增田俊树】", dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 64, dynamic: "#日本场应援2018##爆豪胜己##我的英雄学院#", mission_id: 10568, owner: { face: "http://i1.hdslb.com/bfs/face/4874ce1162dce147670b610aad356272ba23ef1a.jpg", mid: 26498497, name: "是扑倒不是扑倒" }, pages: [ { cid: 49992801, dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 64, from: "vupload", page: 1, part: "【爆豪胜己】可爱的爆豪君(日常吸咔^q^)", vid: "", weblink: "" } ], pic: "http://i1.hdslb.com/bfs/archive/6bb2a44b5179fc2389b72815f20c08fc227e1a63.jpg", pubdate: 1533723329, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 1, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28845287, coin: 22, danmaku: 13, dislike: 0, favorite: 10, his_rank: 0, like: 42, now_rank: 0, reply: 13, share: 3, view: 1482 }, state: -100, tid: 24, title: "【爆豪胜己】这么可爱的咔不来吸一口吗^q^", tname: "MAD·AMV", videos: 1 }, { aid: 28841791, attribute: 16512, cid: 49986585, copyright: 1, ctime: 1533724456, desc: "封面源自网络\\r\\n前方高渣....\\r\\n使用素材: 我的英雄学院\\r\\nBGM【音乐名】: Look At Me Now", dimension: { height: 720, rotate: 0, width: 1280 }, duration: 132, dynamic: "", mission_id: 10568, owner: { face: "http://i1.hdslb.com/bfs/face/62c5c0b39cd1f9b559d0eea9083702110abde6b0.jpg", mid: 9565447, name: "祁延浅" }, pages: [ { cid: 49986585, dimension: { height: 720, rotate: 0, width: 1280 }, duration: 132, from: "vupload", page: 1, part: "秀气的我_bilibili", vid: "", weblink: "" } ], pic: "http://i2.hdslb.com/bfs/archive/2fde6388863e889fda437507379719ca47228e94.png", pubdate: 1533724456, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 0, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28841791, coin: 70, danmaku: 41, dislike: 0, favorite: 44, his_rank: 0, like: 100, now_rank: 0, reply: 29, share: 14, view: 2163 }, state: -100, tid: 24, title: "【B萌/绿谷出久应援】冲向更遥远的彼方!", tname: "MAD·AMV", videos: 1 }, { aid: 28840257, attribute: 2113664, cid: 49983925, copyright: 1, ctime: 1533719916, desc: "模型:ザビ男:なかむら\\n场景:im8225803:SNowly\\n动作:sm25937215:ゆり\\n镜头:一騎当千(1人用):うぐいす\\nBGM:一騎当千(Luz)\\nMME:AutoLuminous4、Diffusion7:そぼろ", dimension: { height: 720, rotate: 0, width: 1280 }, duration: 209, dynamic: "#岸浪白野##日本场应援2018##FATE#", mission_id: 10568, owner: { face: "http://i0.hdslb.com/bfs/face/7dc3c1da46f9d5024b27fc0c880a4c2a66327c16.jpg", mid: 16295316, name: "岸波玉藻" }, pages: [ { cid: 49983925, dimension: { height: 720, rotate: 0, width: 1280 }, duration: 209, from: "vupload", page: 1, part: "1", vid: "", weblink: "" } ], pic: "http://i2.hdslb.com/bfs/archive/d4eeaf566b61e6c3c32271cbbc51d658402af01b.jpg", pubdate: 1533719916, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 0, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28840257, coin: 4, danmaku: 0, dislike: 0, favorite: 9, his_rank: 0, like: 30, now_rank: 0, reply: 8, share: 8, view: 529 }, state: 0, tid: 25, title: "【FATE MMD】扎比君的一骑当千", tname: "MMD·3D", videos: 1 }, { aid: 28840256, attribute: 16512, cid: 49984131, copyright: 1, ctime: 1533721986, desc: "BGM:skillet--hero\\n喜欢的话点个转发,加个关注都是对我最大的支持~", dimension: { height: 720, rotate: 0, width: 1280 }, duration: 188, dynamic: "#日本场应援2018##AMV##纯剪辑#", mission_id: 10568, owner: { face: "http://i2.hdslb.com/bfs/face/45b27a346e342f9d92a71c68ec78dac5dd0893b4.jpg", mid: 237269440, name: "无sol谓" }, pages: [ { cid: 49984131, dimension: { height: 720, rotate: 0, width: 1280 }, duration: 188, from: "vupload", page: 1, part: "未命名项目", vid: "", weblink: "" } ], pic: "http://i0.hdslb.com/bfs/archive/f9b7ad36badbee092bf05c85e5b1364b2cefc000.jpg", pubdate: 1533721986, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 0, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28840256, coin: 35, danmaku: 14, dislike: 0, favorite: 7, his_rank: 0, like: 32, now_rank: 0, reply: 18, share: 7, view: 858 }, state: -100, tid: 24, title: "「我的英雄学院/AMV」三人共同的意志", tname: "MAD·AMV", videos: 1 }, { aid: 28840249, attribute: 16512, cid: 49977458, copyright: 1, ctime: 1533723558, desc: "某不知名萌新up,第一次做mad/amv。做的不好请多指教\\nBGM:THERE IS REASON。\\n因为我的天谴之力,一共做了4次,第一次没保存重做,第二次出了致命问题重做,第三次电脑死机重做,第四次电脑卡死只保存了一半......但是游戏人生是我top1,剧场版看哭了40分钟,所以还是坚持做完了·-·\\n播放量要是没超1w,可能我以后就不会做这种视频了,除非游戏人生出第二季→.→...\\n求关注求硬币求推荐求收藏求打赏求转发(๑ • . • ๑)", dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 437, dynamic: "#日本场应援2018##游戏人生ZERO##游戏人生#", mission_id: 10568, owner: { face: "http://i2.hdslb.com/bfs/face/f7a8cb6818a31566ecb686c334b79c7251385e7d.jpg", mid: 69185991, name: "邪少年丶" }, pages: [ { cid: 49977458, dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 437, from: "vupload", page: 1, part: "最终成品游戏人生zero", vid: "", weblink: "" } ], pic: "http://i1.hdslb.com/bfs/archive/ab4da65db1a29bb62187a43f4163f84642632ae9.jpg", pubdate: 1533723558, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 0, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28840249, coin: 80, danmaku: 23, dislike: 0, favorite: 52, his_rank: 0, like: 107, now_rank: 0, reply: 27, share: 29, view: 2537 }, state: 0, tid: 24, title: "【游戏人生zero/剧场版/mad】跨越种族的爱情。休比,下次我们一定会赢!", tname: "MAD·AMV", videos: 1 }, { aid: 28837429, attribute: 16512, cid: 49978954, copyright: 1, ctime: 1533719385, desc: "", dimension: { height: 720, rotate: 0, width: 1280 }, duration: 227, dynamic: "#日本场应援2018##此花亭奇谭##柚#", mission_id: 10568, owner: { face: "http://i2.hdslb.com/bfs/face/39f667b341cf21827cd7ae81f68da3081934ac82.jpg", mid: 97248224, name: "bili_97248224" }, pages: [ { cid: 49978954, dimension: { height: 720, rotate: 0, width: 1280 }, duration: 227, from: "vupload", page: 1, part: "周杰伦 - 稻香", vid: "", weblink: "" } ], pic: "http://i0.hdslb.com/bfs/archive/1e89c1ef6c8a3be7b1585599c8ca418c939d6440.jpg", pubdate: 1533719385, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 0, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28837429, coin: 19, danmaku: 3, dislike: 0, favorite: 18, his_rank: 0, like: 19, now_rank: 0, reply: 4, share: 8, view: 729 }, state: 0, tid: 24, title: "【此花亭奇谭】稻香X此花亭奇谭", tname: "MAD·AMV", videos: 1 }, { aid: 28835367, attribute: 16512, cid: 49973121, copyright: 1, ctime: 1533718379, desc: "歌曲:魔法少女小圆OPコネクト -歌手:ClariS(网易云有)\\n剪辑软件:PR\\n没找到生肉,也没找到歌词字幕,,好气啊。。。。\\n总之,2018萌战请多多支持小樱,拜托了!!!", dimension: { height: 720, rotate: 0, width: 1280 }, duration: 267, dynamic: "#魔卡少女樱##动漫##新人向#", mission_id: 10568, owner: { face: "http://i2.hdslb.com/bfs/face/04a86a7f99fb9506003c13a130134763c283536b.jpg", mid: 29543952, name: "渡鸦爱德华" }, pages: [ { cid: 49973121, dimension: { height: 720, rotate: 0, width: 1280 }, duration: 267, from: "vupload", page: 1, part: "魔卡少女樱", vid: "", weblink: "" } ], pic: "http://i0.hdslb.com/bfs/archive/60a588aae46e8ae2e172682ab98a4779b7f5ea87.jpg", pubdate: 1533718379, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 0, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28835367, coin: 48, danmaku: 28, dislike: 0, favorite: 66, his_rank: 0, like: 102, now_rank: 0, reply: 53, share: 19, view: 3232 }, state: 0, tid: 24, title: "【2018 B萌 应援/魔卡少女樱】无论前方有多么大的阻碍,也一定可以越过(用小圆的方式打开小樱)", tname: "MAD·AMV", videos: 1 }, { aid: 28833022, attribute: 16512, cid: 49966396, copyright: 1, ctime: 1533715262, desc: "《闪耀之海》\\n演唱:染音若蔡\\n作词:冰梓yuri\\n作曲:甄小熊\\nPV:EinsElric\\n封面画师:汐洛琪SHIROKI\\n\\nST声迹配音组《宝石之国》中文配音原创歌。助力宝石之国B萌大人气角色,取得好成绩!\\n网易云:https://music.163.com/#/album?id=71806628\\n5sing:http://5sing.kugou.com/yc/3652162.html\\n\\n微博:@瑷珥-染音若蔡", dimension: { height: 720, rotate: 0, width: 1280 }, duration: 133, dynamic: "B萌记得给宝石们投票哦~!支持请多多点赞收藏~!爱你们~!\\nps:配合PV看会感觉到了不一样的东西!\\n《闪耀之海》\\n演唱:@瑷珥-染音若蔡\\n作词:@冰梓yuri\\n作曲:甄小熊\\nPV:@EinsElric\\n封面画师:@汐洛琪SHIROKI\\n#宝石之国##染音若蔡##磷叶石##原创歌#", mission_id: 10568, owner: { face: "http://i1.hdslb.com/bfs/face/dc14daced5b61f985759fd931980f43f7605ace1.jpg", mid: 215210, name: "瑷珥-染音若蔡" }, pages: [ { cid: 49966396, dimension: { height: 720, rotate: 0, width: 1280 }, duration: 133, from: "vupload", page: 1, part: "118【染音若蔡】闪耀之海【宝石之国 原创歌】_1", vid: "", weblink: "" } ], pic: "http://i2.hdslb.com/bfs/archive/531a0b243f53ab33b854ecd8a5ea72d8f7f8fc2d.jpg", pubdate: 1533715262, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 0, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28833022, coin: 347, danmaku: 42, dislike: 0, favorite: 377, his_rank: 0, like: 656, now_rank: 0, reply: 63, share: 41, view: 6559 }, state: 0, tid: 28, title: "【染音若蔡】你还记得宝石之国那闪耀之海吗", tname: "原创音乐", videos: 1 }, { aid: 28831588, attribute: 16512, cid: 49967939, copyright: 1, ctime: 1533715661, desc: "智乃应援视频第二弹终于肝出来了!!由于是两天肝出来的,有一半的镜头有重复,但看点完全是两个看点!希望大家多多支持智乃!!!emmm也希望智乃能比伊莉雅的票高!!\\nbgm:光吉猛修 - 天国と地獄", dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 83, dynamic: "智乃应援视频第二弹终于肝出来了!!由于是两天肝出来的,有一半的镜头有重复,但看点完全是两个看点!希望大家多多支持智乃!!!emmm也希望智乃能比伊莉雅的票高!#日本场应援2018##bilibili moe##请问您今天要来点兔子吗??##香风智乃##新星计划#", mission_id: 10568, owner: { face: "http://i0.hdslb.com/bfs/face/7a9e7d5d792c853f6adeb262ebabf61d59e6cf0a.jpg", mid: 11354330, name: "凌云Chino" }, pages: [ { cid: 49967939, dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 83, from: "vupload", page: 1, part: "老婆!你有毒!", vid: "", weblink: "" } ], pic: "http://i0.hdslb.com/bfs/archive/bd95d3672b7030d7ad33a607ac74d15088940d1e.jpg", pubdate: 1533715661, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 0, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28831588, coin: 52, danmaku: 9, dislike: 0, favorite: 27, his_rank: 0, like: 58, now_rank: 0, reply: 67, share: 15, view: 1866 }, state: 0, tid: 24, title: "【欢乐向/智乃应援】老婆!你有毒!", tname: "MAD·AMV", videos: 1 }, { aid: 28831178, attribute: 16768, cid: 49964130, copyright: 1, ctime: 1533715825, desc: "新人渣作,素材和音乐等方面有很大不足,请大家多多见谅,欢迎大家的批评指教。\\n封面ID64099009", dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 142, dynamic: "#AMV##新人向##纯剪辑", mission_id: 10568, owner: { face: "http://i2.hdslb.com/bfs/face/021b691a4de5c69f85c97b0745481eb092695131.jpg", mid: 23033971, name: "漫雪凛冬" }, pages: [ { cid: 49964130, dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 142, from: "vupload", page: 1, part: "我的视频", vid: "", weblink: "" } ], pic: "http://i1.hdslb.com/bfs/archive/448a64ab80ab613b97a0f6661df9cd21e2154cf5.jpg", pubdate: 1533718392, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 1, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28831178, coin: 10, danmaku: 1, dislike: 0, favorite: 4, his_rank: 0, like: 14, now_rank: 0, reply: 10, share: 7, view: 689 }, state: 0, tid: 24, title: "绚烂如樱,尘世似雪", tname: "MAD·AMV", videos: 1 }, { aid: 28830153, attribute: 16768, cid: 49964529, copyright: 1, ctime: 1533714855, desc: "做完这个视频后B站暂时不会再发布新视频了,工作重心转移到自己的学业和微博上,说不出为什么就是不想再这样参加萌战了,但无论如何,智乃加油吧,大家加油吧。", dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 299, dynamic: "#日本场应援2018##香风智乃##二次元# 大家加油", mission_id: 10568, owner: { face: "http://i1.hdslb.com/bfs/face/5bcbe2e796416996929cc225b57f252ef2772fa8.jpg", mid: 31895977, name: "Andy安笛" }, pages: [ { cid: 49964529, dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 299, from: "vupload", page: 1, part: "Last", vid: "", weblink: "" } ], pic: "http://i0.hdslb.com/bfs/archive/41c200994248d6f491786fe4753bf29049f2e893.jpg", pubdate: 1533714855, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 1, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28830153, coin: 25, danmaku: 0, dislike: 0, favorite: 20, his_rank: 0, like: 32, now_rank: 0, reply: 18, share: 11, view: 3325 }, state: 0, tid: 24, title: "【Moe2018应援/退圈纪念/点兔/香风智乃】CONTINUE....?", tname: "MAD·AMV", videos: 1 }, { aid: 28829710, attribute: 16512, cid: 49965171, copyright: 1, ctime: 1533715229, desc: "主要内容为纳萨力克大坟墓目前登场的领域守护者\\nBGM:鏡音レン,mothy - 悪ノ召使\\n欢迎加入UP的粉丝群:237213911", dimension: { height: 720, rotate: 0, width: 1280 }, duration: 299, dynamic: "#不死者之王##骨傲天##Overlord##新星计划#\\n主要内容为纳萨力克大坟墓目前登场的领域守护者\\nBGM:鏡音レン,mothy - 悪ノ召使\\n欢迎加入UP的粉丝群:237213911", mission_id: 10568, owner: { face: "http://i0.hdslb.com/bfs/face/a4cbc140157251afb969023ada66e6d7b084bf6e.jpg", mid: 4021955, name: "红莲妖" }, pages: [ { cid: 49965171, dimension: { height: 720, rotate: 0, width: 1280 }, duration: 299, from: "vupload", page: 1, part: "领域守护者", vid: "", weblink: "" } ], pic: "http://i0.hdslb.com/bfs/archive/b4986d507dc65cf0222f2b1d40d35a640ac1e757.jpg", pubdate: 1533715229, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 0, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28829710, coin: 41, danmaku: 26, dislike: 0, favorite: 24, his_rank: 0, like: 82, now_rank: 0, reply: 21, share: 1, view: 4222 }, state: 0, tid: 27, title: "【瞎考剧】Overlord:领域守护者", tname: "综合", videos: 1 }, { aid: 28826330, attribute: 16512, cid: 49957386, copyright: 1, ctime: 1533710501, desc: "·自制,2018b萌日本场贞德应援作品\\n·草稿风,渣上色,轻喷……\\n·BGM:自伤无色\\n·无cp向,请勿ky,一起愉快的食用\\n·求硬币,收藏,关注( ´・◡・`)", dimension: { height: 1072, rotate: 0, width: 1520 }, duration: 105, dynamic: "#日本场应援2018##fgo##贞德应援#", mission_id: 10568, owner: { face: "http://i2.hdslb.com/bfs/face/2f787c2dcafdd2d0772b3564bd772ab17bd83633.jpg", mid: 5825627, name: "Great乱舞" }, pages: [ { cid: 49957386, dimension: { height: 1072, rotate: 0, width: 1520 }, duration: 105, from: "vupload", page: 1, part: "乐秀视频第12部_20180808133443914", vid: "", weblink: "" } ], pic: "http://i2.hdslb.com/bfs/archive/4bb5318d9c5b1654d25ecca194170fe4badeb03a.jpg", pubdate: 1533710501, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 0, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28826330, coin: 323, danmaku: 37, dislike: 0, favorite: 501, his_rank: 0, like: 363, now_rank: 0, reply: 56, share: 42, view: 6674 }, state: 0, tid: 47, title: "【FGO手书】这样的我生存于世", tname: "短片·手书·配音", videos: 1 }, { aid: 28826083, attribute: 16768, cid: 49956973, copyright: 1, ctime: 1533711389, desc: "因果流转,人总得靠其他人的帮助才能生活下去,所以总有一天,请你去帮助其他人吧。 阿万音铃羽", dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 59, dynamic: "#日本场应援2018##命运石之门##命运石之门0#", mission_id: 10568, owner: { face: "http://i1.hdslb.com/bfs/face/9d9a503bc52be6f408910ea0b8aba6653bb018d8.jpg", mid: 7583781, name: "素晴硝子" }, pages: [ { cid: 49956973, dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 59, from: "vupload", page: 1, part: "翎羽1", vid: "", weblink: "" } ], pic: "http://i1.hdslb.com/bfs/archive/2965363a0f23ab4fae38481e08032f2a91f33078.jpg", pubdate: 1533711389, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 1, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28826083, coin: 85, danmaku: 1, dislike: 0, favorite: 32, his_rank: 0, like: 101, now_rank: 0, reply: 36, share: 18, view: 1374 }, state: 0, tid: 27, title: "【应援】铃羽莫比乌斯的跃迁", tname: "综合", videos: 1 }, { aid: 28825682, attribute: 16768, cid: 49824582, copyright: 1, ctime: 1533708951, desc: "-", dimension: { height: 1440, rotate: 0, width: 2560 }, duration: 106, dynamic: "#日本场应援2018##木之本樱##魔卡少女樱#", mission_id: 10568, owner: { face: "http://i1.hdslb.com/bfs/face/bed3035d9ac8ef3a8d4428551110a1f061ffc932.jpg", mid: 3651600, name: "咕大福" }, pages: [ { cid: 49824582, dimension: { height: 1440, rotate: 0, width: 2560 }, duration: 106, from: "vupload", page: 1, part: "【木之本樱B萌应援】燃向踩点混剪,小樱今天就告诉你什么是魔法少女\\\\(✨∇✨)\\\\", vid: "", weblink: "" } ], pic: "http://i1.hdslb.com/bfs/archive/ffe6068e6cf665e2bfdbc7d88bda39312d13d196.jpg", pubdate: 1533708951, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 1, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28825682, coin: 51, danmaku: 37, dislike: 0, favorite: 73, his_rank: 0, like: 119, now_rank: 0, reply: 32, share: 25, view: 3764 }, state: 0, tid: 183, title: "【木之本樱B萌应援】燃向踩点混剪,小樱今天就告诉你什么是魔法少女(✨∇✨)", tname: "影视剪辑", videos: 1 }, { aid: 28822944, attribute: 2113920, cid: 49952983, copyright: 1, ctime: 1533709292, desc: "各位好我是冥香。这个不出意外可能是天草在参加本届B萌期间我会做的最后一个应援视频。\\r\\n这次改成适用持刀的动作费了好长时间……如果觉得效果好,也不用给我投币,请给天草投票xxxxxxxxxxx\\r\\n\\r\\n总而言之本周六天草对小太阳的32进16,希望大家支持天草!虽然我也很喜欢小太阳但内战就是这样了!!", dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 201, dynamic: "", mission_id: 10568, owner: { face: "http://i0.hdslb.com/bfs/face/40d60aa15ac21ed3f8f0a13aac77d176094e4e8f.jpg", mid: 422673, name: "冥香" }, pages: [ { cid: 49952983, dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 201, from: "vupload", page: 1, part: "moe3", vid: "", weblink: "" } ], pic: "http://i1.hdslb.com/bfs/archive/3726c6fe26cf6b0e39b45f62f3701abccb49a293.png", pubdate: 1533709292, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 1, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28822944, coin: 50, danmaku: 5, dislike: 0, favorite: 51, his_rank: 0, like: 55, now_rank: 0, reply: 13, share: 13, view: 1100 }, state: 0, tid: 25, title: "【B萌2018日本场应援】[A]ddiction【天草四郎】【动作改变】", tname: "MMD·3D", videos: 1 }, { aid: 28821884, attribute: 16512, cid: 49951385, copyright: 1, ctime: 1533707868, desc: "这次做了好长时间哦。\\r\\n素材:魔法少女伊莉雅雪下的誓言,Fate/Stay Night06版,Fate/Stay Night UBW版,Fate/Stay Night HF版\\r\\n音乐:Flower Dance", dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 254, dynamic: "", mission_id: 10568, owner: { face: "http://i0.hdslb.com/bfs/face/1d3318128de6a4d2164cd37e43f4ad45222fe98b.jpg", mid: 175795512, name: "我是笔帽" }, pages: [ { cid: 49951385, dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 254, from: "vupload", page: 1, part: "第14话 理想的尽头_高清_3", vid: "", weblink: "" } ], pic: "http://i2.hdslb.com/bfs/archive/84a5b2d3a3e098a8db0ddc0326bee4603a88be44.png", pubdate: 1533707868, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 0, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28821884, coin: 23, danmaku: 11, dislike: 0, favorite: 35, his_rank: 0, like: 39, now_rank: 0, reply: 9, share: 12, view: 2179 }, state: 0, tid: 24, title: "【Fate/卫宫士郎应援】无论发生什么,我也不会后悔!", tname: "MAD·AMV", videos: 1 }, { aid: 28820064, attribute: 2113664, cid: 49946360, copyright: 1, ctime: 1533705696, desc: "模型:衛宮士郎:ごまもりは流れゆく/遠坂凛、間桐桜、ぐだお:珠華(しゅか)/セイバー:ribbondog/ネロ・クラウディウス:あかね/玉藻の前、ザビ男:なかむら/ザビ子:1010浣/エミヤ、クーフーリン:ちょビ玉/ギルガメッシュ:ひどく泰平化されたオティー\\n场景:月面ステージ、月面低軌道ステージ:Tansoku102cm-短足沼地人\\n动作/镜头:Thriller:DJRocket\\nBGM:Thriller(Michael Jackson)\\nMME:Diffusion7:そぼろ", dimension: { height: 720, rotate: 0, width: 1280 }, duration: 128, dynamic: "#THRILLER##FATE##日本场应援2018#", mission_id: 10568, owner: { face: "http://i0.hdslb.com/bfs/face/7dc3c1da46f9d5024b27fc0c880a4c2a66327c16.jpg", mid: 16295316, name: "岸波玉藻" }, pages: [ { cid: 49946360, dimension: { height: 720, rotate: 0, width: 1280 }, duration: 128, from: "vupload", page: 1, part: "2", vid: "", weblink: "" } ], pic: "http://i2.hdslb.com/bfs/archive/3103e49ef8b92433c74cd86b58ebb8482bde0046.jpg", pubdate: 1533705696, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 0, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28820064, coin: 27, danmaku: 58, dislike: 0, favorite: 71, his_rank: 0, like: 93, now_rank: 0, reply: 45, share: 25, view: 2953 }, state: 0, tid: 25, title: "【FATE MMD】Thriller", tname: "MMD·3D", videos: 1 }, { aid: 28819794, attribute: 16512, cid: 49945412, copyright: 1, ctime: 1533705933, desc: "视频类型: 其他\\n相关题材: OVERLORD;报菜名\\n简介: 老骨头:我的那萨里克原来还有说相声的女仆!?\\n贯口:相声中常见的表现形式,\\n贯是一气呵成,一贯到底的意思。", dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 147, dynamic: "视频类型: 其他\\n相关题材: OVERLORD;报菜名\\n简介: 老骨头:我的那萨里克原来还有说相声的女仆!?\\n贯口:相声中常见的表现形式,\\n贯是一气呵成,一贯到底的意思。", mission_id: 10568, owner: { face: "http://i2.hdslb.com/bfs/face/0901945fce57e13d89b3d941330ab89a10cd9ebd.jpg", mid: 4159782, name: "养耗子防猫" }, pages: [ { cid: 49945412, dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 147, from: "vupload", page: 1, part: "goodgang", vid: "", weblink: "" } ], pic: "http://i1.hdslb.com/bfs/archive/329994b5fecf7222c05586036ff4e634d0c5c97e.jpg", pubdate: 1533705933, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 0, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28819794, coin: 84, danmaku: 45, dislike: 0, favorite: 34, his_rank: 0, like: 114, now_rank: 0, reply: 34, share: 19, view: 8210 }, state: 0, tid: 27, title: "【OVERLORD】老骨:我请您吃饭..", tname: "综合", videos: 1 }, { aid: 28819726, attribute: 16512, cid: 49943436, copyright: 1, ctime: 1533705782, desc: "大家如果观后感觉不错,有劳点个推荐赞一下吧,小透明up主在B站生存艰难,没有推荐就没有播放量,拜托各位了,十分感谢!\\n新作指路 ——→ 鬼灯不同造型帅气瞬间,av30505048 :【踩点高燃】鬼灯:无所不能,瞬间切换!白泽:笑瘫!鬼灯百变造型帅气瞬间剪辑,求推荐哇!\\n在av28147879里,白泽被鬼灯一顿狂扁,弹幕和评论中不少老中医粉纷纷表达心疼。为了活命,up主做了新的剪辑。\\n这次,换白泽来折腾鬼灯!虐啊——!从头到尾,鬼灯被安排得明明白白。题目为《欲胜鬼灯,惟可用情》。“胜”改为“虐”后,情,就是", dimension: { height: 720, rotate: 0, width: 1280 }, duration: 229, dynamic: "本视频主题:鬼灯可爱~(误......)\\n身为一只上亿岁的老神兽,白泽反虐的方式,自然与鬼灯不同。\\n鬼灯战力爆表,名贯三界,遇事属他拎得清,总能找到最适宜有效的解决方法。虽然行事和表情令人生怖,但威严下亦有对他人尊重、体恤与守护的心意。\\n这样的人物,却反常且别扭地,总和非奸非恶的白泽过不去。\\n可能鬼灯自己也没有发觉内心真实的情感吧。\\n难以察觉的情感,即本视频主题。\\n#鬼灯的冷彻# #白泽# #鬼灯# #Bilibili Moe# #日本场应援2018# #剪辑#", mission_id: 10568, owner: { face: "http://i0.hdslb.com/bfs/face/86d74a90ee6c2b729392bcb9d6d6a954f7f0ae26.jpg", mid: 2609880, name: "树狸饭堂" }, pages: [ { cid: 49943436, dimension: { height: 720, rotate: 0, width: 1280 }, duration: 229, from: "vupload", page: 1, part: "白泽鬼灯甜折腾720P", vid: "", weblink: "" } ], pic: "http://i0.hdslb.com/bfs/archive/204887868346b795c004d55cf4678fbf5dea898f.jpg", pubdate: 1533705782, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 0, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28819726, coin: 1267, danmaku: 218, dislike: 0, favorite: 1828, his_rank: 0, like: 2122, now_rank: 0, reply: 272, share: 138, view: 39315 }, state: 0, tid: 27, title: "【HE】换白泽来虐鬼灯!鬼灯:被安排得明明白白...原台词重塑甜向剧情", tname: "综合", videos: 1 }, { aid: 28819080, attribute: 16512, cid: 49943054, copyright: 1, ctime: 1533702750, desc: "字幕来源/应援文:半翅雀@半翅雀\\n票根来源:UP主自己\\n让我们迎接各位刀回家,他们在我们心里是最棒的\\n欢迎各位婶婶加入刀剑乱舞B萌应援群\\n群号:773458796", dimension: { height: 720, rotate: 0, width: 1200 }, duration: 238, dynamic: "#日本场应援2018##刀剑乱舞##鹤丸国永#", mission_id: 10568, owner: { face: "http://i1.hdslb.com/bfs/face/2e3e8bcedcbcb6abcfdf00cca6049d5345d0da58.jpg", mid: 19505617, name: "夜雨月落" }, pages: [ { cid: 49943054, dimension: { height: 720, rotate: 0, width: 1200 }, duration: 238, from: "vupload", page: 1, part: "【墨染瑶】【刀剑乱舞B萌应援】刀剑乱舞2018 Bilibili Moe 日漫场送别", vid: "", weblink: "" } ], pic: "http://i0.hdslb.com/bfs/archive/7149b35ee1df51de1d8dfbd88f7a77e4a11e3f4e.jpg", pubdate: 1533702750, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 0, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28819080, coin: 13, danmaku: 1, dislike: 0, favorite: 12, his_rank: 0, like: 18, now_rank: 0, reply: 19, share: 14, view: 559 }, state: 0, tid: 47, title: "【墨染瑶】【刀剑乱舞B萌应援】刀剑乱舞2018 Bilibili Moe 日漫场送别", tname: "短片·手书·配音", videos: 1 }, { aid: 28810607, attribute: 16768, cid: 49922234, copyright: 1, ctime: 1533696555, desc: "番名:《DARLING in the FRANXX》\\nBGM:日剧产科医生鸿鸟的主题曲《あなたがここにいて抱きしめることができるなら》 from miwa\\n第二发了,做完就感觉比上次工作量大了很多,很幸运歌不算很难,对我这个萌新比较友好\\n喜欢我的视频别忘了点赞,投币,收藏,关注,分享给你的朋友。b萌02加油!02赛高!让这个世界给这个女孩一丝温暖吧!\\n敏娜桑!!!多谢了!!! \\n最后祝02在b萌取得好成绩", dimension: { height: 1080, rotate: 0, width: 1440 }, duration: 357, dynamic: "#日本场应援2018##bilibili moe##动画#", mission_id: 10568, owner: { face: "http://i1.hdslb.com/bfs/face/96c43c12e194c5cc95e86a624099da01dd309b9f.jpg", mid: 29459594, name: "KLArkalin阿卡林" }, pages: [ { cid: 49922234, dimension: { height: 1080, rotate: 0, width: 1440 }, duration: 357, from: "vupload", page: 1, part: "二期成品字幕_2", vid: "", weblink: "" } ], pic: "http://i1.hdslb.com/bfs/archive/98f22b1956f8f68355e2b9db0c127c03c90c16c3.jpg", pubdate: 1533697364, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 1, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28810607, coin: 252, danmaku: 82, dislike: 0, favorite: 179, his_rank: 0, like: 224, now_rank: 0, reply: 141, share: 41, view: 3341 }, state: 0, tid: 24, title: "【DitF/02应援/催泪向】只要能将眼前的你拥入怀中,我别无所求", tname: "MAD·AMV", videos: 1 }, { aid: 28805234, attribute: 16512, cid: 49913077, copyright: 1, ctime: 1533691390, desc: "第一次做amv也是费了一番心血\\n从文案 剪辑 后期\\n一共花了大概一个星期吧\\n其中偷懒过 爆肝过\\n苦想过 也欣喜过\\n用自己微弱的力量给薇尔莉特应援\\n薇尔莉特 冲鸭!!!!!!!!!!!!!", dimension: { height: 720, rotate: 0, width: 1280 }, duration: 208, dynamic: "#日本场应援2018##AMV##新人向#", mission_id: 10568, owner: { face: "http://i0.hdslb.com/bfs/face/d234685696aeb25f42bf096e619e0e8fd1fa69e0.jpg", mid: 85985833, name: "安少目" }, pages: [ { cid: 49913077, dimension: { height: 720, rotate: 0, width: 1280 }, duration: 208, from: "vupload", page: 1, part: "08_3", vid: "", weblink: "" } ], pic: "http://i0.hdslb.com/bfs/archive/bfe2df5b1183b4022f355b88a7eef61d35db9478.jpg", pubdate: 1533691390, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 0, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28805234, coin: 52, danmaku: 23, dislike: 0, favorite: 15, his_rank: 0, like: 56, now_rank: 0, reply: 29, share: 8, view: 903 }, state: -100, tid: 24, title: "【AMV/紫罗兰】一个人如其名的书记人偶 一段扣人心弦的寻爱之旅", tname: "MAD·AMV", videos: 1 }, { aid: 28804750, attribute: 16512, cid: 49915214, copyright: 1, ctime: 1533690428, desc: "( ・ˍ・) (・ˍ・*)", dimension: { height: 720, rotate: 0, width: 1080 }, duration: 231, dynamic: "#日本场应援2018##我的英雄学院##绿谷出久#", mission_id: 10568, owner: { face: "http://i1.hdslb.com/bfs/face/46877cdaa4023321d113153564fd97e4b620127c.jpg", mid: 25328929, name: "SWINGNOW" }, pages: [ { cid: 49915214, dimension: { height: 720, rotate: 0, width: 1080 }, duration: 231, from: "vupload", page: 1, part: "合成 1_1_x264", vid: "", weblink: "" } ], pic: "http://i2.hdslb.com/bfs/archive/099048695bcba2fd6ba0075269fd549f1105a74b.jpg", pubdate: 1533690428, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 0, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28804750, coin: 4, danmaku: 13, dislike: 0, favorite: 5, his_rank: 0, like: 25, now_rank: 0, reply: 16, share: 1, view: 944 }, state: -100, tid: 24, title: "【我英应援】逆战", tname: "MAD·AMV", videos: 1 }, { aid: 28803085, attribute: 16512, cid: 49912292, copyright: 1, ctime: 1533687448, desc: "不要收藏,不要硬币,要脸。\\r\\n啊……太菜了……剪了半天弄了个什么出来……留个黑历史在这儿以后拿来嘲笑一下自己。", dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 159, dynamic: "", mission_id: 10568, owner: { face: "http://i1.hdslb.com/bfs/face/77a572f604a652b2b73432127f4191d8354970ef.jpg", mid: 43971264, name: "烟唐秋豪丶" }, pages: [ { cid: 49912292, dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 159, from: "vupload", page: 1, part: "磷叶石终稿", vid: "", weblink: "" } ], pic: "http://i2.hdslb.com/bfs/archive/d2747e03786090bf318f4eb6c3916fd8c332a017.png", pubdate: 1533687448, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 0, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28803085, coin: 28, danmaku: 4, dislike: 0, favorite: 39, his_rank: 0, like: 45, now_rank: 0, reply: 25, share: 9, view: 1201 }, state: 0, tid: 24, title: "【宝石之国AMV】法斯:我该如何改变?", tname: "MAD·AMV", videos: 1 }, { aid: 28802665, attribute: 16768, cid: 49911644, copyright: 1, ctime: 1533686451, desc: "8月6日,与人梭哈莓反杀,惜败\\r\\n素材:DARLING in the FRANXX\\r\\nBGM:Take me hand - DAISHI DANCE", dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 262, dynamic: "", mission_id: 10568, owner: { face: "http://i2.hdslb.com/bfs/face/28e3b7964a7a25462350583a45ecfb57883aebc5.jpg", mid: 3127528, name: "空耳狂魔" }, pages: [ { cid: 49911644, dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 262, from: "vupload", page: 1, part: "序列 01_24", vid: "", weblink: "" } ], pic: "http://i2.hdslb.com/bfs/archive/e90fd9a48797ce034fde2d885116b0c86cf6aefc.png", pubdate: 1533686451, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 1, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28802665, coin: 4015, danmaku: 468, dislike: 0, favorite: 3102, his_rank: 0, like: 3422, now_rank: 0, reply: 332, share: 756, view: 62078 }, state: 0, tid: 24, title: "【02应援】你一票我一票,02今晚就出道", tname: "MAD·AMV", videos: 1 }, { aid: 28797741, attribute: 16512, cid: 49901368, copyright: 1, ctime: 1533675012, desc: "Emmmmmmm白纸up没技术没生肉没智商,但是(我永远喜欢田所惠.jpg)", dimension: { height: 576, rotate: 0, width: 720 }, duration: 238, dynamic: "", mission_id: 10568, owner: { face: "http://i0.hdslb.com/bfs/face/59dee61bb5022c7fa331c3ffb8177b4e6910e6f2.jpg", mid: 298019774, name: "Mztty" }, pages: [ { cid: 49901368, dimension: { height: 576, rotate: 0, width: 720 }, duration: 238, from: "vupload", page: 1, part: "田所惠", vid: "", weblink: "" } ], pic: "http://i2.hdslb.com/bfs/archive/91f9a1af07a609e94fb7ac2c82816deacd4e90b7.jpg", pubdate: 1533675012, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 0, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28797741, coin: 4, danmaku: 0, dislike: 0, favorite: 0, his_rank: 0, like: 1, now_rank: 0, reply: 1, share: 2, view: 332 }, state: -100, tid: 24, title: "【食戟之灵】感谢你出现在我的身边", tname: "MAD·AMV", videos: 1 }, { aid: 28797730, attribute: 16512, cid: 49901363, copyright: 1, ctime: 1533675022, desc: "时间飞快的流逝,唯独现在,我有一种想对爱因斯坦发牢骚的心情,冈部,时间根据每个人的主观感受,既会变长,也会变短,相对论真是既浪漫又伤感的东西呢。——牧濑红莉栖", dimension: { height: 720, rotate: 0, width: 1280 }, duration: 150, dynamic: "#日本场应援2018##命运石之门##MAD#时间飞快的流逝,唯独现在,我有一种想对爱因斯坦发牢骚的心情,冈部,时间根据每个人的主观感受,既会变长,也会变短,相对论真是既浪漫又伤感的东西呢。——牧濑红莉栖", mission_id: 10568, owner: { face: "http://i2.hdslb.com/bfs/face/d7018376ff9e712c03a34f6d4e77c247b6a2ba75.jpg", mid: 22044759, name: "丶牧濑红莉牺" }, pages: [ { cid: 49901363, dimension: { height: 720, rotate: 0, width: 1280 }, duration: 150, from: "vupload", page: 1, part: "命运石之门.amv", vid: "", weblink: "" } ], pic: "http://i1.hdslb.com/bfs/archive/a9d7ad25f84f34abcdd32d200fb9b7a9e7986462.jpg", pubdate: 1533675022, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 0, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28797730, coin: 89, danmaku: 3, dislike: 0, favorite: 37, his_rank: 0, like: 73, now_rank: 0, reply: 32, share: 8, view: 1369 }, state: 0, tid: 24, title: "【牧濑红莉栖应援】穿越世界线,与你相遇,仅此而已", tname: "MAD·AMV", videos: 1 }, { aid: 28796831, attribute: 16512, cid: 49900181, copyright: 1, ctime: 1533678023, desc: "做了16天的视频,可是食戟全员已回家,但128强仍然值得骄傲。\\n素材:食戟之灵\\nBGM:Black Rail\\n参考了一个黑契的视频:av3219374,是一个良作", dimension: { height: 720, rotate: 0, width: 1280 }, duration: 137, dynamic: "#日本场应援2018##食戟之灵##MAD#欢迎食戟全员回家,招待不周", mission_id: 10568, owner: { face: "http://i0.hdslb.com/bfs/face/19c9dc8a6e28c4c570c16733599492f0503ea7c3.jpg", mid: 20443161, name: "Hope豪侠" }, pages: [ { cid: 49900181, dimension: { height: 720, rotate: 0, width: 1280 }, duration: 137, from: "vupload", page: 1, part: "食戟之灵应援视频2_1", vid: "", weblink: "" } ], pic: "http://i0.hdslb.com/bfs/archive/3048dddd60221bdfe0e6002e15dbe821e078ff50.jpg", pubdate: 1533693611, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 0, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28796831, coin: 37, danmaku: 3, dislike: 0, favorite: 16, his_rank: 0, like: 25, now_rank: 0, reply: 17, share: 4, view: 859 }, state: 0, tid: 24, title: "【接全员回家】我的食戟,不,是我们的食戟", tname: "MAD·AMV", videos: 1 }, { aid: 28795012, attribute: 2113920, cid: 49887724, copyright: 1, ctime: 1533671812, desc: "BGM:ONE OK ROCK -The beginning\\n素材:fate 进击的巨人 一击男 小英雄 \\n上一次做的很多小伙伴说不够好,BGM不搭什么的,这次就重新做了一遍,希望大家会喜欢", dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 294, dynamic: "#日本场应援2018##MAD##AMV#这次重新做了一版,希望会让大家满意", mission_id: 10568, owner: { face: "http://i1.hdslb.com/bfs/face/7c6d2f48e51eb4849fde10975b47f9fddbcb8373.jpg", mid: 113630734, name: "我就是BB机啊" }, pages: [ { cid: 49887724, dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 294, from: "vupload", page: 1, part: "爱剪辑-我的信念AMV_clip", vid: "", weblink: "" } ], pic: "http://i0.hdslb.com/bfs/archive/e70a5139253a8de2c78dce317a2f237d30fbeba5.jpg", pubdate: 1533671812, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 1, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28795012, coin: 78, danmaku: 18, dislike: 0, favorite: 101, his_rank: 0, like: 80, now_rank: 0, reply: 29, share: 27, view: 3798 }, state: 0, tid: 24, title: "【AMV】因为背负着信念才不会甘愿认输!", tname: "MAD·AMV", videos: 1 }, { aid: 28794117, attribute: 16512, cid: 49894425, copyright: 1, ctime: 1533671090, desc: "bgm--卡路里", dimension: { height: 576, rotate: 0, width: 720 }, duration: 324, dynamic: "", mission_id: 10568, owner: { face: "http://i2.hdslb.com/bfs/face/6f15a7a5df1658f1fe0bdb79c0ca729672556f5c.jpg", mid: 211720194, name: "珠珠珠珠珠珠玉" }, pages: [ { cid: 49894425, dimension: { height: 576, rotate: 0, width: 720 }, duration: 162, from: "vupload", page: 1, part: "画面有问题对不起呜呜呜", vid: "", weblink: "" }, { cid: 50379376, dimension: { height: 576, rotate: 0, width: 720 }, duration: 162, from: "vupload", page: 2, part: "画面调整啦,直接看这个就行", vid: "", weblink: "" } ], pic: "http://i2.hdslb.com/bfs/archive/733e426e0c3d5221c117fe7a4e6d2c3309389a18.jpg", pubdate: 1533671090, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 0, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28794117, coin: 778, danmaku: 273, dislike: 0, favorite: 1258, his_rank: 0, like: 1237, now_rank: 0, reply: 266, share: 438, view: 32021 }, state: 0, tid: 27, title: "爱过,再见。", tname: "综合", videos: 2 }, { aid: 28793582, attribute: 16512, cid: 49893323, copyright: 1, ctime: 1533675084, desc: "爆豪胜己,粗中有细\\n话不多说,西内为敬\\n西内!", dimension: { height: 720, rotate: 0, width: 1280 }, duration: 350, dynamic: "#日本场应援2018##我的英雄学院##爆豪胜己#西内!", mission_id: 10568, owner: { face: "http://i0.hdslb.com/bfs/face/863cbca4ad7d93581d7c2fc382da6bb66e4a74e9.jpg", mid: 22701238, name: "Hello-Newworld" }, pages: [ { cid: 49893323, dimension: { height: 720, rotate: 0, width: 1280 }, duration: 350, from: "vupload", page: 1, part: "爆豪", vid: "", weblink: "" } ], pic: "http://i2.hdslb.com/bfs/archive/60ae2e49ebfc28a60447adcd46f2bc6833336411.jpg", pubdate: 1533675083, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 0, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28793582, coin: 22, danmaku: 7, dislike: 0, favorite: 24, his_rank: 0, like: 56, now_rank: 0, reply: 0, share: 7, view: 1552 }, state: -100, tid: 24, title: "【爆豪胜己】为了成为No.1的英雄!", tname: "MAD·AMV", videos: 1 }, { aid: 28792753, attribute: 16768, cid: 49891825, copyright: 1, ctime: 1533666186, desc: "喜欢还请点个推荐,就是那个大拇指,点个关注,收藏硬币!谢谢各位支持!", dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 41, dynamic: "", mission_id: 10568, owner: { face: "http://i2.hdslb.com/bfs/face/19626abafb253b1864026aaa4a5c86d150262df1.jpg", mid: 9253594, name: "拔旗" }, pages: [ { cid: 49891825, dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 41, from: "vupload", page: 1, part: "卡酱1", vid: "", weblink: "" } ], pic: "http://i1.hdslb.com/bfs/archive/477bea426007d003a8e02e75ea82994dcef1c329.png", pubdate: 1533666186, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 1, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28792753, coin: 27, danmaku: 17, dislike: 0, favorite: 84, his_rank: 0, like: 225, now_rank: 0, reply: 54, share: 11, view: 8421 }, state: -100, tid: 22, title: "【旗子】爆豪:啊?啊啊?啊啊啊?诶啊啊啊?!", tname: "鬼畜调教", videos: 1 }, { aid: 28792602, attribute: 16512, cid: 49892800, copyright: 1, ctime: 1533670521, desc: "和伊莉雅领证的最后一关选择了打闪闪,和ubw以及魔伊的混剪,喜欢的话请关注下up哦。", dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 647, dynamic: "", mission_id: 10568, owner: { face: "http://i1.hdslb.com/bfs/face/a7cc9d0187170a0ef41dd5c77c0c1d8965df3050.jpg", mid: 44487065, name: "怪人兰斯" }, pages: [ { cid: 49892800, dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 647, from: "vupload", page: 1, part: "伊莉雅", vid: "", weblink: "" } ], pic: "http://i0.hdslb.com/bfs/archive/4c29c30c26d7094294b38eabb4f911735e03d568.png", pubdate: 1533670521, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 0, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28792602, coin: 6, danmaku: 33, dislike: 0, favorite: 21, his_rank: 0, like: 27, now_rank: 0, reply: 33, share: 11, view: 3596 }, state: 0, tid: 172, title: "震惊!某UP与伊莉雅结婚现场上,某金发男路人竟惨遭殴打,重伤不起!(b萌伊莉雅,金闪闪应援)", tname: "手机游戏", videos: 1 }, { aid: 28792328, attribute: 16768, cid: 53221024, copyright: 1, ctime: 1533666210, desc: "之前做得不太满意,这次在原版的基础上做了一点小改动,希望大家能够喜欢~~", dimension: { height: 2160, rotate: 0, width: 3840 }, duration: 77, dynamic: "#FATE# #尼禄#", mission_id: 10568, owner: { face: "http://i1.hdslb.com/bfs/face/e277274b0f6e0b587031f7415e868ec767f9c349.jpg", mid: 52367389, name: "柯哀落樱飘雪" }, pages: [ { cid: 53221024, dimension: { height: 2160, rotate: 0, width: 3840 }, duration: 77, from: "vupload", page: 1, part: "【Fate/Extra Last Encore】尼禄陛下的欢脱日常", vid: "", weblink: "" } ], pic: "http://i1.hdslb.com/bfs/archive/0c7b4d21b030b10ea1137d6822b31d9ca1078aa0.jpg", pubdate: 1533666210, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 1, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28792328, coin: 34, danmaku: 6, dislike: 0, favorite: 31, his_rank: 0, like: 51, now_rank: 0, reply: 7, share: 5, view: 2221 }, state: -100, tid: 27, title: "【Fate/Extra Last Encore】红saber:今天余不但要唱歌~还要唱rap!", tname: "综合", videos: 1 }, { aid: 28789557, attribute: 16768, cid: 49886535, copyright: 1, ctime: 1533669770, desc: "fate全员应援,外加失踪人口回归(。ò ∀ ó。)\\nBGM:Shot In The Dark", dimension: { height: 2160, rotate: 0, width: 3840 }, duration: 299, dynamic: "#日本场应援2018##fate##吾王#", mission_id: 10568, owner: { face: "http://i1.hdslb.com/bfs/face/0c1d6eb8b497ffe10e3c29817b41e84ad13ee5e9.jpg", mid: 23226251, name: "Saber琪" }, pages: [ { cid: 49886535, dimension: { height: 2160, rotate: 0, width: 3840 }, duration: 299, from: "vupload", page: 1, part: "2160_25_12.76_Aug072018", vid: "", weblink: "" } ], pic: "http://i2.hdslb.com/bfs/archive/1e3fac7c49cc612020ecc4260156b9938cc62650.jpg", pubdate: 1533669770, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 1, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28789557, coin: 67, danmaku: 8, dislike: 0, favorite: 84, his_rank: 0, like: 65, now_rank: 0, reply: 18, share: 24, view: 2351 }, state: 0, tid: 24, title: "【FGO/AMV/燃向】欢迎来到人理之光", tname: "MAD·AMV", videos: 1 }, { aid: 28788090, attribute: 16512, cid: 49883160, copyright: 1, ctime: 1533667419, desc: "第一次做mad,做的不怎么好,多多包涵。\\r\\n素材:魔法少女伊莉雅剧场版:雪下的誓言\\r\\nBGM:ひび割れた世界\\r\\n封面:https://www.pixiv.net/member_illust.php?mode=medium&illust_id=65608478", dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 329, dynamic: "", mission_id: 10568, owner: { face: "http://i0.hdslb.com/bfs/face/b7f988546726555377681f732c4bfed54c299613.jpg", mid: 8416010, name: "阡陌初雪" }, pages: [ { cid: 49883160, dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 329, from: "vupload", page: 1, part: "雪下的誓言", vid: "", weblink: "" } ], pic: "http://i2.hdslb.com/bfs/archive/ef03d707048a19e83796341b56eedb67db044440.png", pubdate: 1533667419, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 0, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28788090, coin: 1682, danmaku: 504, dislike: 0, favorite: 2383, his_rank: 0, like: 1685, now_rank: 0, reply: 441, share: 429, view: 79651 }, state: 0, tid: 24, title: "【卫宫士郎】我没能成为拯救所有人的正义的伙伴", tname: "MAD·AMV", videos: 1 }, { aid: 28787251, attribute: 16768, cid: 49900934, copyright: 1, ctime: 1533675107, desc: "第一次做AMV,估计观感欠佳_(:з」∠)_\\r\\n算是b萌朱碧和利库的应援视频吧ww\\r\\n素材:NGNL0(No Game No Life Zero)\\r\\n 鈴木このみ - There is a reason", dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 602, dynamic: "", mission_id: 10568, owner: { face: "http://i2.hdslb.com/bfs/face/f6e7b7ff85f7af44ed547c895dfe5f16a5e75d60.jpg", mid: 13902416, name: "一本畫時" }, pages: [ { cid: 49900934, dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 301, from: "vupload", page: 1, part: "字幕版", vid: "", weblink: "" }, { cid: 49881402, dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 301, from: "vupload", page: 2, part: "无字版", vid: "", weblink: "" } ], pic: "http://i0.hdslb.com/bfs/archive/9e3eeaf0b1e2983ba283da7c80063874f0ab7a15.png", pubdate: 1533675107, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 1, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28787251, coin: 20, danmaku: 1, dislike: 0, favorite: 18, his_rank: 0, like: 36, now_rank: 0, reply: 12, share: 18, view: 798 }, state: 0, tid: 24, title: "【No Game No Life · Zero】There is a reason 愛のために「AMV」", tname: "MAD·AMV", videos: 2 }, { aid: 28787096, attribute: 16512, cid: 49880064, copyright: 1, ctime: 1533666205, desc: "新人初投稿 请多指教\\n五战骑主从真好\\n\\nBGM:浅川悠-《瞬时の涡》(Fate/Stay Night Rider 角色歌)\\n素材来源:《Fate/Stay Night[Unlimited Blade Works]》、《Fate/Stay Night[Heaven's Feel I.presage flower]》", dimension: { height: 720, rotate: 0, width: 1280 }, duration: 90, dynamic: "#日本场应援2018# #AMV# #美杜莎# #间桐樱#", mission_id: 10568, owner: { face: "http://i2.hdslb.com/bfs/face/45227ce02741601a2a0098e0bfd5df11af7fb8c2.jpg", mid: 35151881, name: "-雪户鹤织-" }, pages: [ { cid: 49880064, dimension: { height: 720, rotate: 0, width: 1280 }, duration: 90, from: "vupload", page: 1, part: "瞬时の涡", vid: "", weblink: "" } ], pic: "http://i1.hdslb.com/bfs/archive/0b9a6b5da7e5e43ee0ec6f818b19e33a51bdd718.jpg", pubdate: 1533666205, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 0, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28787096, coin: 25, danmaku: 1, dislike: 0, favorite: 24, his_rank: 0, like: 33, now_rank: 0, reply: 7, share: 7, view: 1743 }, state: 0, tid: 24, title: "[Fate/AMV]Rider&间桐樱|只要澄澈的羁绊仍无言地照亮心间", tname: "MAD·AMV", videos: 1 }, { aid: 28787024, attribute: 2113664, cid: 49881578, copyright: 1, ctime: 1533666213, desc: "借用见视频尾", dimension: { height: 720, rotate: 0, width: 1280 }, duration: 55, dynamic: "", mission_id: 10568, owner: { face: "http://i2.hdslb.com/bfs/face/8ab9d8c06b1ede208b51fb7be1e0a9c06b396ac2.jpg", mid: 5033425, name: "木2森森" }, pages: [ { cid: 49881578, dimension: { height: 720, rotate: 0, width: 1280 }, duration: 55, from: "vupload", page: 1, part: "001", vid: "", weblink: "" } ], pic: "http://i2.hdslb.com/bfs/archive/917d5441b2f434f227453c5544570dd6b9434056.png", pubdate: 1533666213, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 0, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28787024, coin: 11, danmaku: 3, dislike: 0, favorite: 40, his_rank: 0, like: 30, now_rank: 0, reply: 9, share: 5, view: 1189 }, state: 0, tid: 25, title: "【我的英雄学院MMD】轰焦冻的runaway baby", tname: "MMD·3D", videos: 1 }, { aid: 28786327, attribute: 2113664, cid: 49876912, copyright: 1, ctime: 1533666200, desc: "迦勒底加班人员的b萌应援。\\n嘛,对上了大狗感觉有点恐怖,也许是在做最后的挣扎也说不定呢。。。。.。\\n说起来这是我第一次正经地尝试2d向渲染,我吹爆akon太太的模型wwwww~\\nBGM是れをる桑的no title,降了三个半调(降调狂魔就是我了)。\\n韦伯子裙子的物理出了点问题咋改也改不好我也很烦恼,稍微忍耐下吧,别刷暂停成功什么的,小心复明失败23333。\\n借物表见评论,如果没看见就是你来的太早啦我还没起床。\\n另外为了应援9号当天我会发一个小彩蛋,能记住的可以来我的动态看下哦~", dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 245, dynamic: "#日本场应援2018##君主·埃尔梅罗二世##bilibili moe#迦勒底加班势力登场~~~~b萌希望能投一票哦", mission_id: 10568, owner: { face: "http://i0.hdslb.com/bfs/face/8aeb328aec7b35b61786fb1dbdf2df7a6431154f.jpg", mid: 10986504, name: "xyz坐标" }, pages: [ { cid: 49876912, dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 245, from: "vupload", page: 1, part: "001", vid: "", weblink: "" } ], pic: "http://i2.hdslb.com/bfs/archive/a8973399567558849135be742ac6c1fcdc6f2ffe.jpg", pubdate: 1533666200, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 0, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28786327, coin: 42, danmaku: 11, dislike: 0, favorite: 27, his_rank: 0, like: 38, now_rank: 0, reply: 16, share: 15, view: 1241 }, state: 0, tid: 25, title: "【B萌应援】迦勒底加班势力登场", tname: "MMD·3D", videos: 1 }, { aid: 28785523, attribute: 2113664, cid: 49877810, copyright: 1, ctime: 1533666183, desc: "Bilibili Moe,弗兰肯斯坦应援向MMD\\nBGM:from Y to Y\\nModel:做成参谋\\nCamera+Action:Hiramori Amu", dimension: { height: 720, rotate: 0, width: 1280 }, duration: 322, dynamic: "#日本场应援2018##舞蹈MMD##新人向#", mission_id: 10568, owner: { face: "http://i1.hdslb.com/bfs/face/98545d02fcb6bd97fe21eeb784a38ec24eb0f6ed.jpg", mid: 39469126, name: "双商下线" }, pages: [ { cid: 49877810, dimension: { height: 720, rotate: 0, width: 1280 }, duration: 322, from: "vupload", page: 1, part: "from Y to Y(弗兰肯斯坦ver._BiliBili", vid: "", weblink: "" } ], pic: "http://i2.hdslb.com/bfs/archive/3fb6aa9bd61c14133d65ebf1959a16dc16d1e771.jpg", pubdate: 1533666183, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 0, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28785523, coin: 13, danmaku: 4, dislike: 0, favorite: 4, his_rank: 0, like: 6, now_rank: 0, reply: 4, share: 3, view: 394 }, state: 0, tid: 25, title: "【MMD/B萌应援】from Y to Y(弗兰肯斯坦)", tname: "MMD·3D", videos: 1 }, { aid: 28782524, attribute: 16512, cid: 49926392, copyright: 1, ctime: 1533660829, desc: "BGM:田中井彩智——黄金の辉き\\n=\\n说到做到。上星期看到B站上架了06版的fate,打鸡血剪辑的……剪到后面遇到不少困难有点摸鱼了,甚至忘了自己最初想通过视频表达什么了,有些粗制滥造,真是对不起(飞歌语气)。\\n可能赶不上士郎今天的应援了,但是我喜欢士郎的热情还是不变的(笑),也请大家多多支持士郎咯。", dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 277, dynamic: "#日本场应援2018##卫宫士郎##fate#", mission_id: 10568, owner: { face: "http://i1.hdslb.com/bfs/face/3ae164771bc5df3dc8f3083fc09154984f912a0f.jpg", mid: 8983166, name: "自我意识过剩者" }, pages: [ { cid: 49926392, dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 277, from: "vupload", page: 1, part: "黄金の辉き(士郎应援)_bilibili", vid: "", weblink: "" } ], pic: "http://i0.hdslb.com/bfs/archive/707cfd0e00eab017fa6792e5d2ee2db19a9ac508.jpg", pubdate: 1533660828, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 0, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28782524, coin: 103, danmaku: 9, dislike: 0, favorite: 135, his_rank: 0, like: 113, now_rank: 0, reply: 39, share: 19, view: 3160 }, state: 0, tid: 24, title: "【Fate/卫宫士郎】背负理想不断前行", tname: "MAD·AMV", videos: 1 }, { aid: 28779967, attribute: 16768, cid: 49868565, copyright: 1, ctime: 1533657496, desc: "bgm:Old Memory\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n希望有一个小埋那样的妹妹", dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 106, dynamic: "", mission_id: 10568, owner: { face: "http://i2.hdslb.com/bfs/face/4fd3f9c70ba89b9f87d6db91796b87233edcd670.jpg", mid: 20963025, name: "HoshikawaKanade" }, pages: [ { cid: 49868565, dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 106, from: "vupload", page: 1, part: "【小埋应援】Old Memory", vid: "", weblink: "" } ], pic: "http://i1.hdslb.com/bfs/archive/697ef3486f5bcd8514fea73d9677930bc1b5873d.jpg", pubdate: 1533657496, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 1, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28779967, coin: 36, danmaku: 27, dislike: 0, favorite: 23, his_rank: 0, like: 74, now_rank: 0, reply: 41, share: 8, view: 2025 }, state: -100, tid: 24, title: "【土间埋应援】Old Memory", tname: "MAD·AMV", videos: 1 }, { aid: 28778494, attribute: 16768, cid: 49865025, copyright: 1, ctime: 1533657293, desc: "有一对夫妻他们很强,但他们从来没赢过。 有一对兄妹他们很弱,但他们从来没输过。", dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 245, dynamic: "#日本场应援2018##里克与休比#", mission_id: 10568, owner: { face: "http://i0.hdslb.com/bfs/face/e177eb81b4d0b835cf5023f411a9a9c612cd3037.jpg", mid: 289091320, name: "牧瑟秋风" }, pages: [ { cid: 49865025, dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 245, from: "vupload", page: 1, part: "游戏人生剧场版里克与休比", vid: "", weblink: "" } ], pic: "http://i2.hdslb.com/bfs/archive/fc4f4ea539ac75cf8f2aadc4778d09e3e6a05222.jpg", pubdate: 1533657293, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 1, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28778494, coin: 7, danmaku: 0, dislike: 0, favorite: 2, his_rank: 0, like: 4, now_rank: 0, reply: 1, share: 0, view: 312 }, state: -100, tid: 27, title: "游戏人生剧场版里克与休比", tname: "综合", videos: 1 }, { aid: 28773575, attribute: 16512, cid: 49854596, copyright: 1, ctime: 1533657302, desc: "第一次剪辑这种视频\\n所以暂且把开头放出来当预告\\n不知道大家感觉怎么样\\n评论区说一下,我在正片里改改\\n争取赶在十号之前给小樱应援L('ω')┘三└('ω')」\\n\\n视频素材:魔卡少女樱clear篇\\n音乐素材:认真卖萌么么哒--洛天依(作曲:周存JUSF)", dimension: { height: 720, rotate: 0, width: 1280 }, duration: 45, dynamic: "#日本场应援2018##动漫##童年#", mission_id: 10568, owner: { face: "http://i0.hdslb.com/bfs/face/f6af35d8b410256680a4f3dec77ffc86a8677e90.jpg", mid: 10434225, name: "花子君のドーナツ" }, pages: [ { cid: 49854596, dimension: { height: 720, rotate: 0, width: 1280 }, duration: 45, from: "vupload", page: 1, part: "认真卖萌么么哒 2018.8.7", vid: "", weblink: "" } ], pic: "http://i1.hdslb.com/bfs/archive/79bebca16fcad64fb529c2973c176f3088a02ee2.jpg", pubdate: 1533657302, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 0, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28773575, coin: 10, danmaku: 1, dislike: 0, favorite: 16, his_rank: 0, like: 56, now_rank: 0, reply: 16, share: 1, view: 1468 }, state: -100, tid: 27, title: "【樱狼警告】认真卖萌给你看~=ω=【预告】", tname: "综合", videos: 1 }, { aid: 28771695, attribute: 16512, cid: 49850403, copyright: 1, ctime: 1533657307, desc: "做MAD之前:这首歌好适合士樱啊,做个MAD试试吧\\n为了做MAD去看了HF线生肉后:呜呜呜呜,老虫子你还我樱!qaq\\n【BGM:THERE IS A REASON】\\n顺便求个关注收藏推荐硬币,你们的支持是我最大的动力!", dimension: { height: 720, rotate: 0, width: 960 }, duration: 295, dynamic: "#日本场应援2018##卫宫士郎##间桐樱#我以后再也不拿pr做字幕了.....手都得断掉......", mission_id: 10568, owner: { face: "http://i1.hdslb.com/bfs/face/1f3d7848eba42e5775235e3bb9d6789133a56674.jpg", mid: 272915884, name: "藤丸嘉人" }, pages: [ { cid: 49850403, dimension: { height: 720, rotate: 0, width: 960 }, duration: 295, from: "vupload", page: 1, part: "鈴木このみ - THERE IS A REASON_1", vid: "", weblink: "" } ], pic: "http://i2.hdslb.com/bfs/archive/48874afd663622db93026f5325909b12340947e4.jpg", pubdate: 1533657307, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 0, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28771695, coin: 38, danmaku: 3, dislike: 0, favorite: 45, his_rank: 0, like: 43, now_rank: 0, reply: 16, share: 14, view: 1975 }, state: 0, tid: 24, title: "仅此一人的英雄【fate/HF MAD/AMV】", tname: "MAD·AMV", videos: 1 }, { aid: 28770849, attribute: 16768, cid: 49849896, copyright: 1, ctime: 1533657317, desc: "这个和预告系没有任何关系,没看过的被剧透别怪我~~~", dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 601, dynamic: "#日本场应援2018##AMV##游戏人生##TOS偶像总选举#", mission_id: 10568, owner: { face: "http://i2.hdslb.com/bfs/face/694658b56ad6d747497b7ffb7b2efdad5f4a4623.jpg", mid: 3001391, name: "NearLight" }, pages: [ { cid: 49849896, dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 301, from: "vupload", page: 1, part: "参赛稿", vid: "", weblink: "" }, { cid: 56785862, dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 300, from: "vupload", page: 2, part: "工程文件整理", vid: "", weblink: "" } ], pic: "http://i0.hdslb.com/bfs/archive/2b43cacdfc92b09c6f838fb4df417b688a28d154.jpg", pubdate: 1533657317, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 1, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28770849, coin: 750, danmaku: 25, dislike: 0, favorite: 1102, his_rank: 0, like: 1672, now_rank: 0, reply: 108, share: 105, view: 14257 }, state: 0, tid: 24, title: "【AMV/NGNL/游戏人生ZERO】无命而去 有命而逝", tname: "MAD·AMV", videos: 2 }, { aid: 28770700, attribute: 16512, cid: 49850685, copyright: 1, ctime: 1533651391, desc: "关于胜出上学路上的小故事\\n尝试做了手书,差点累死我这个手残\\n果然还是回去好好学画画吧", dimension: { height: 576, rotate: 0, width: 720 }, duration: 118, dynamic: "#我的英雄学院##手书##胜出#", mission_id: 10568, owner: { face: "http://i0.hdslb.com/bfs/face/d0c5030ab6cf4a7a53eac013fb8522db13033166.jpg", mid: 20359495, name: "今天惹咔酱生气了吗" }, pages: [ { cid: 49850685, dimension: { height: 576, rotate: 0, width: 720 }, duration: 118, from: "vupload", page: 1, part: "你的心拍数", vid: "", weblink: "" } ], pic: "http://i1.hdslb.com/bfs/archive/b6b74f8c4365d9e6364ae95f3b03fa58814d95a0.jpg", pubdate: 1533651391, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 0, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28770700, coin: 8, danmaku: 5, dislike: 0, favorite: 8, his_rank: 0, like: 43, now_rank: 0, reply: 4, share: 9, view: 1215 }, state: -100, tid: 47, title: "{我的英雄学院/胜出/手书} 你的心拍数", tname: "短片·手书·配音", videos: 1 }, { aid: 28769993, attribute: 1065171, cid: 49835843, copyright: 1, ctime: 1533650863, desc: "末尾有信长三连!\\n没纯踩点所以不敢用87k!\\n没错我就是那个欠债的后期!\\n\\nbgm:handclap", dimension: { height: 576, rotate: 0, width: 720 }, duration: 110, dynamic: "#日本场应援2018##FREE!#", mission_id: 10568, owner: { face: "http://i2.hdslb.com/bfs/face/2e6f63afc605959f370db3dfe91c0e5dd69a3a9b.jpg", mid: 104557039, name: "梓川木由" }, pages: [ { cid: 49835843, dimension: { height: 576, rotate: 0, width: 720 }, duration: 110, from: "vupload", page: 1, part: "Fitz & the Tantrums - HandClap_1", vid: "", weblink: "" } ], pic: "http://i2.hdslb.com/bfs/archive/301c5a13e052776f333f005f6de16479191635d6.jpg", pubdate: 1533650863, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 0, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28769993, coin: 14, danmaku: 9, dislike: 0, favorite: 9, his_rank: 0, like: 17, now_rank: 0, reply: 5, share: 8, view: 770 }, state: 0, tid: 24, title: "【混剪】不就是想看小哥哥脱衣服么!", tname: "MAD·AMV", videos: 1 }, { aid: 28768955, attribute: 16512, cid: 49838604, copyright: 1, ctime: 1533650172, desc: "■ 调教 · 混音 · 字幕:梦落遗廊P\\n■ 曲:じん\\n■ 編曲:Nhato\\n■ 映像:しづ\\n \\n● 本家 → sm21720819\\n● 时隔5个月的稿,鸽了这么久请诸位别把我抓去炖汤……\\n● 调教了这首带感曲子来应援阳炎,海选赛只有Konoha通过了,球球你们本战投稿这位小天使一票,让他好歹撑到决赛(´;ω;\`)\\n● 在niconico也有投稿 → sm33640672 \\n● 之前用 IA 翻调的车祸曲 → av20887402", dimension: { height: 720, rotate: 0, width: 1280 }, duration: 217, dynamic: "#じん##VOCALOID##阳炎计划#个\\n翻调了界外科学,快来听一听ww", mission_id: 10568, owner: { face: "http://i1.hdslb.com/bfs/face/ef2b6e770837ed88f1e02a90f289af18a0f4c42e.jpg", mid: 111651195, name: "Niscet" }, pages: [ { cid: 49838604, dimension: { height: 720, rotate: 0, width: 1280 }, duration: 217, from: "vupload", page: 1, part: "结月缘 · GUMI Ver.", vid: "", weblink: "" } ], pic: "http://i1.hdslb.com/bfs/archive/5806182a696baba6fe44fb10d36202707528d910.jpg", pubdate: 1533650172, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 0, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28768955, coin: 24, danmaku: 72, dislike: 0, favorite: 43, his_rank: 0, like: 42, now_rank: 0, reply: 13, share: 12, view: 894 }, state: 0, tid: 30, title: "【结月缘 · GUMI】界外科学 / アウターサイエンス【VOCALOID COVER】【原PV付 · 自制中文字幕】【2018B萌应援】", tname: "VOCALOID·UTAU", videos: 1 }, { aid: 28767558, attribute: 16768, cid: 49842496, copyright: 1, ctime: 1533648380, desc: "娱乐至上,大家看的开心就好", dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 62, dynamic: "求求审核老哥给个面子吧QAQ", mission_id: 10568, owner: { face: "http://i2.hdslb.com/bfs/face/0dc27beff4d096b67ece41d5213d417f076ec81e.jpg", mid: 4328994, name: "三木先森不会咕" }, pages: [ { cid: 49842496, dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 62, from: "vupload", page: 1, part: "圣经_x264", vid: "", weblink: "" } ], pic: "http://i0.hdslb.com/bfs/archive/eaa6950d0823447ebc8fea77fbda57d7d645132c.jpg", pubdate: 1533648380, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 1, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28767558, coin: 57, danmaku: 7, dislike: 0, favorite: 13, his_rank: 0, like: 40, now_rank: 0, reply: 40, share: 19, view: 1412 }, state: 0, tid: 27, title: "如果以命运石之门的方式去打开7酱圣经会怎么样", tname: "综合", videos: 1 }, { aid: 28766665, attribute: 16579, cid: 213977771, copyright: 1, ctime: 1533648458, desc: "不希望别人看这个视频啦\\n所以呢就悄悄地换了源!\\n不删掉视频的原因是会扣硬币w\\n\\n原简介:\\n万恶之源:av17699810\\n参考,音频:av20536168", dimension: { height: 1280, rotate: 0, width: 590 }, duration: 10, dynamic: "#日本场应援2018##手书##自制#", mission_id: 10568, owner: { face: "http://i0.hdslb.com/bfs/face/5deb5de649e9d0fc7c3da927e48e1eae74ec8754.jpg", mid: 13437131, name: "UID_13437131" }, pages: [ { cid: 213977771, dimension: { height: 1280, rotate: 0, width: 590 }, duration: 10, from: "vupload", page: 1, part: "SVID_20200718_222845_1", vid: "", weblink: "" } ], pic: "http://i1.hdslb.com/bfs/archive/82f16c06497ecffc29b20ee6d5d433dd11c0a799.jpg", pubdate: 1533648458, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 0, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28766665, coin: 587, danmaku: 2, dislike: 0, favorite: 2352, his_rank: 0, like: 3413, now_rank: 0, reply: 238, share: 122, view: 129535 }, state: 0, tid: 174, title: "已删除", tname: "其他", videos: 1 }, { aid: 28764554, attribute: 16768, cid: 49836795, copyright: 1, ctime: 1533648227, desc: "02加油", dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 46, dynamic: "#日本场应援2018##MAD.AMV##bilibili moe#", mission_id: 10568, owner: { face: "http://i0.hdslb.com/bfs/face/02478906b35a1ea1ef29eecf8c93548cf47d07c8.jpg", mid: 65732857, name: "零二的達令" }, pages: [ { cid: 49836795, dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 46, from: "vupload", page: 1, part: "[02应援]", vid: "", weblink: "" } ], pic: "http://i1.hdslb.com/bfs/archive/f173f5886356dc23b4966a6b0a35763db3fe50d6.jpg", pubdate: 1533648227, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 1, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28764554, coin: 26, danmaku: 2, dislike: 0, favorite: 21, his_rank: 0, like: 47, now_rank: 0, reply: 13, share: 7, view: 1048 }, state: 0, tid: 24, title: "[02应援]", tname: "MAD·AMV", videos: 1 }, { aid: 28759375, attribute: 2113664, cid: 49826852, copyright: 1, ctime: 1533646967, desc: "模型:アストルフォ:すがきれもん\\n场景:im8225803:SNowly\\n动作/镜头:av25782915:浪潮小汐\\n表情:av25782915:閃爍P\\nBGM:恋して♥ポプテピピック(牧野由依、渡部优衣)\\nMME:AutoLuminous4、Diffusion7:そぼろ", dimension: { height: 720, rotate: 0, width: 1280 }, duration: 90, dynamic: "#阿斯托尔福##日本场应援2018##FATE#", mission_id: 10568, owner: { face: "http://i0.hdslb.com/bfs/face/7dc3c1da46f9d5024b27fc0c880a4c2a66327c16.jpg", mid: 16295316, name: "岸波玉藻" }, pages: [ { cid: 49826852, dimension: { height: 720, rotate: 0, width: 1280 }, duration: 90, from: "vupload", page: 1, part: "1", vid: "", weblink: "" } ], pic: "http://i2.hdslb.com/bfs/archive/28235650899fd8313e78e62238340a99c0f4f6bf.jpg", pubdate: 1533646967, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 0, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28759375, coin: 10, danmaku: 4, dislike: 0, favorite: 13, his_rank: 0, like: 38, now_rank: 0, reply: 5, share: 10, view: 815 }, state: 0, tid: 25, title: "【FATE MMD】阿斯托尔福的恋爱吧❤POP TEAM EPIC", tname: "MMD·3D", videos: 1 }, { aid: 28757836, attribute: 16384, cid: 49820005, copyright: 1, ctime: 1533646283, desc: "话说对导演下手的“家伙”还是挺多的嘛,如:\\n库洛牌:消牌、冰牌、迷牌、声牌、地牌、无牌等\\n人物:柊泽艾力欧、女占卜师等\\n透明牌-包围、冰雹、幻影等\\n(还有个破坏知世房子的摇动没加进去)", dimension: { height: 720, rotate: 0, width: 1280 }, duration: 196, dynamic: "对导演知世动手的片段小剪。#日本场应援2018#", mission_id: 10568, owner: { face: "http://i0.hdslb.com/bfs/face/d6cb50fc26bdd24652a25e0d3571243a9cfa6c14.jpg", mid: 23218911, name: "花中童" }, pages: [ { cid: 49820005, dimension: { height: 720, rotate: 0, width: 1280 }, duration: 160, from: "vupload", page: 1, part: "正片", vid: "", weblink: "" }, { cid: 50634353, dimension: { height: 720, rotate: 0, width: 1280 }, duration: 36, from: "vupload", page: 2, part: "补续", vid: "", weblink: "" } ], pic: "http://i0.hdslb.com/bfs/archive/d14c77ad2456cacdd9d3b498eb64e17bb520743d.jpg", pubdate: 1533646283, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 0, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 0, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28757836, coin: 21, danmaku: 103, dislike: 0, favorite: 162, his_rank: 0, like: 142, now_rank: 0, reply: 53, share: 19, view: 11693 }, state: 0, tid: 27, title: "【魔卡少女樱】那些年敢对知世动手的人或牌(不全)", tname: "综合", videos: 2 }, { aid: 28757709, attribute: 16768, cid: 49821087, copyright: 1, ctime: 1533646295, desc: "一个短小的绿谷小天使应援视频...........\\n莺莺燕燕嘤嘤\\n新人UP求关注", dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 86, dynamic: "#日本场应援2018##我的英雄学院##AMV#", mission_id: 10568, owner: { face: "http://i2.hdslb.com/bfs/face/be45bacc10a0467bc798dac935dd62825dcb06b6.jpg", mid: 351853136, name: "带肥皂的小纸船" }, pages: [ { cid: 49821087, dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 86, from: "vupload", page: 1, part: "绿谷", vid: "", weblink: "" } ], pic: "http://i1.hdslb.com/bfs/archive/46bb690c9c9cace1c02e6efec8162ed1e955c35e.jpg", pubdate: 1533646295, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 1, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28757709, coin: 17, danmaku: 6, dislike: 0, favorite: 9, his_rank: 0, like: 32, now_rank: 0, reply: 20, share: 9, view: 957 }, state: 0, tid: 24, title: "【小英雄/AMV/泪燃向】承包绿谷小天使(●'◡'●)", tname: "MAD·AMV", videos: 1 }, { aid: 28756456, attribute: 16768, cid: 49814945, copyright: 1, ctime: 1533644685, desc: "迦尔纳应援视频,各位一定要去为迦尔纳投票啊,他现在的处境很不好。\\n不要三连,只要你们投票。\\n十分感谢。", dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 226, dynamic: "#日本场应援2018##fate/apocrypha##迦尔纳#", mission_id: 10568, owner: { face: "http://i1.hdslb.com/bfs/face/0057690360800f5120c82b581909725f09a94c14.jpg", mid: 76807994, name: "ZXSA-solider" }, pages: [ { cid: 49814945, dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 226, from: "vupload", page: 1, part: "迦尔纳应援是视频2_01", vid: "", weblink: "" } ], pic: "http://i2.hdslb.com/bfs/archive/960d6efdab3975e5ba6b13178d9a0a49cbe4f584.jpg", pubdate: 1533644685, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 1, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28756456, coin: 48, danmaku: 1, dislike: 0, favorite: 10, his_rank: 0, like: 40, now_rank: 0, reply: 27, share: 12, view: 904 }, state: 0, tid: 183, title: "【2018 bilbil moe】 迦尔纳应援视频 第二弹", tname: "影视剪辑", videos: 1 }, { aid: 28753982, attribute: 16512, cid: 49813835, copyright: 1, ctime: 1533643235, desc: "这是在下第一次投稿希望不会出什么问题......也许吧。\\n如果问题太多我就重做一次吧。", dimension: { height: 576, rotate: 0, width: 720 }, duration: 238, dynamic: "#日本场应援2018##FGO##FATE#", mission_id: 10568, owner: { face: "http://i0.hdslb.com/bfs/face/6273def76c5d6a9cc61b4465a23cfaaeb6f5888b.jpg", mid: 28036674, name: "言峰明" }, pages: [ { cid: 49813835, dimension: { height: 576, rotate: 0, width: 720 }, duration: 238, from: "vupload", page: 1, part: "fgo原创卡片视频系列-阿尔泰尔", vid: "", weblink: "" } ], pic: "http://i0.hdslb.com/bfs/archive/e969f49f4e218e6c18b5d39eb6d80147509a6d55.jpg", pubdate: 1533643235, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 0, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28753982, coin: 24, danmaku: 5, dislike: 0, favorite: 5, his_rank: 0, like: 23, now_rank: 0, reply: 17, share: 8, view: 857 }, state: -100, tid: 172, title: "fgo原创卡片视频系列-阿尔泰尔", tname: "手机游戏", videos: 1 }, { aid: 28750045, attribute: 16512, cid: 49858754, copyright: 1, ctime: 1533630352, desc: "视频类型: 动画\\r\\n动漫中那些毁天灭地的炫酷大招", dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 890, dynamic: "#动漫##动画##热血#", owner: { face: "http://i0.hdslb.com/bfs/face/607efa42b42d23a32433f524d452d3ab36a6cdd2.jpg", mid: 7360144, name: "十柒号" }, pages: [ { cid: 49858754, dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 890, from: "vupload", page: 1, part: "动漫中那些毁天灭地的炫酷大招", vid: "", weblink: "" } ], pic: "http://i0.hdslb.com/bfs/archive/6583dc0f9c786eb7386f808771437b236732a589.png", pubdate: 1533657312, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 0, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28750045, coin: 359, danmaku: 1784, dislike: 0, favorite: 1235, his_rank: 0, like: 1057, now_rank: 0, reply: 403, share: 88, view: 138104 }, state: 0, tid: 27, title: "动漫中那些毁天灭地的炫酷大招", tname: "综合", videos: 1 }, { aid: 28749274, attribute: 16512, cid: 49803783, copyright: 1, ctime: 1533639413, desc: "一个潦草的自制手书233333有描绘,原作Takadabear", dimension: { height: 720, rotate: 0, width: 1280 }, duration: 63, dynamic: "#日本场应援2018##卫宫切嗣##卫宫士郎#", mission_id: 10568, owner: { face: "http://i2.hdslb.com/bfs/face/57dd2529a51790824a6fb3e0fa3778b424cd7cab.jpg", mid: 524252, name: "笑揉橘猫不语" }, pages: [ { cid: 49803783, dimension: { height: 720, rotate: 0, width: 1280 }, duration: 63, from: "vupload", page: 1, part: "卫宫 搓腚舞", vid: "", weblink: "" } ], pic: "http://i1.hdslb.com/bfs/archive/1a15f0b0220690a8d0b8e09a6cdda1fbe7011123.jpg", pubdate: 1533639413, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 0, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28749274, coin: 79, danmaku: 33, dislike: 0, favorite: 89, his_rank: 0, like: 107, now_rank: 0, reply: 48, share: 31, view: 2578 }, state: 0, tid: 47, title: "【卫宫家的搓屁舞】孩子不听话怎么办", tname: "短片·手书·配音", videos: 1 }, { aid: 28748902, attribute: 2113664, cid: 49803395, copyright: 1, ctime: 1533639596, desc: "模型:天草四郎時貞:sema/カルナ:ユタカ/シェイクスピア:履物連絡用(準備中)\\n背景:sm15356644:kiyo_NoN\\n动作/镜头:sm24491916:にもゆに\\nBGM:EVERYBODY(Backstreet Boys)\\nMME:Diffusion7:そぼろ", dimension: { height: 720, rotate: 0, width: 1280 }, duration: 231, dynamic: "#日本场应援2018##FATE##EVERYBODY#", mission_id: 10568, owner: { face: "http://i0.hdslb.com/bfs/face/7dc3c1da46f9d5024b27fc0c880a4c2a66327c16.jpg", mid: 16295316, name: "岸波玉藻" }, pages: [ { cid: 49803395, dimension: { height: 720, rotate: 0, width: 1280 }, duration: 231, from: "vupload", page: 1, part: "3", vid: "", weblink: "" } ], pic: "http://i2.hdslb.com/bfs/archive/59e215ed79cc0814a36c0ed815b633e28c6ed1f7.jpg", pubdate: 1533639596, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 0, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28748902, coin: 13, danmaku: 0, dislike: 0, favorite: 7, his_rank: 0, like: 29, now_rank: 0, reply: 5, share: 7, view: 636 }, state: 0, tid: 25, title: "【FATE MMD】EVERYBODY【天草四郎&迦尔纳&莎士比亚】", tname: "MMD·3D", videos: 1 }, { aid: 28745414, attribute: 16512, cid: 49795470, copyright: 1, ctime: 1533634290, desc: "喜欢就点个赞吧 谢谢大家!\\nbgm: 菅田将晖《ロングホープ・フィリア》", dimension: { height: 720, rotate: 0, width: 1280 }, duration: 86, dynamic: "#动漫##剪辑##我的英雄学院#", mission_id: 10568, owner: { face: "http://i2.hdslb.com/bfs/face/96a64c7bbf85efa5453cbb5751b471e61265c394.jpg", mid: 12423973, name: "拉二的小太阳" }, pages: [ { cid: 49795470, dimension: { height: 720, rotate: 0, width: 1280 }, duration: 86, from: "vupload", page: 1, part: "切爆", vid: "", weblink: "" } ], pic: "http://i2.hdslb.com/bfs/archive/136403e510faead254816acfd76ba6d5f5a6ce38.jpg", pubdate: 1533634290, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 0, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28745414, coin: 831, danmaku: 225, dislike: 0, favorite: 2334, his_rank: 0, like: 2236, now_rank: 0, reply: 341, share: 263, view: 72678 }, state: 0, tid: 27, title: "【我英】(切爆)鸡窝头,你老是垂头丧气,我都不舒服了!(谢谢你切岛)", tname: "综合", videos: 1 }, { aid: 28744228, attribute: 16512, cid: 49793945, copyright: 1, ctime: 1533633433, desc: "第一次尝试着做视频,对pr还不是很了解,\\n但对于金木。(尽力了)\\n做视频不敢有任何懈怠,大家好,新人up猪\\n我来啦,希望各位大佬wu喷\\nBGM:Angel saybia\\n 透明で透き通って何でも成れそうで haku", dimension: { height: 720, rotate: 0, width: 1280 }, duration: 367, dynamic: "#剪辑##东京喰种##金木#", mission_id: 10568, owner: { face: "http://i0.hdslb.com/bfs/face/220f925eafda0466421f1395a52ddad47dfc07a7.jpg", mid: 288141009, name: "-时鸣涧-" }, pages: [ { cid: 49793945, dimension: { height: 720, rotate: 0, width: 1280 }, duration: 367, from: "vupload", page: 1, part: "金木研: 我,从未后悔", vid: "", weblink: "" } ], pic: "http://i2.hdslb.com/bfs/archive/768d50b95d27d6cab7c9be696cd3a23a640799df.jpg", pubdate: 1533633433, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 0, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28744228, coin: 46, danmaku: 90, dislike: 0, favorite: 204, his_rank: 0, like: 212, now_rank: 0, reply: 87, share: 28, view: 13225 }, state: 0, tid: 183, title: "金木研: 我,从未后悔", tname: "影视剪辑", videos: 1 }, { aid: 28743188, attribute: 2113664, cid: 49793120, copyright: 1, ctime: 1533632587, desc: "模型:ロビン・フッド:切な顔P\\n场景:im4179284:切な顔P\\n动作:sm29180863:yurie\\n镜头:sm29298856:一護牛乳\\nBGM:av5451565:云潇翼Seanwing\\nMME:Diffusion7:そぼろ", dimension: { height: 720, rotate: 0, width: 1280 }, duration: 221, dynamic: "#FATE##日本场应援2018##罗宾汉#", mission_id: 10568, owner: { face: "http://i0.hdslb.com/bfs/face/7dc3c1da46f9d5024b27fc0c880a4c2a66327c16.jpg", mid: 16295316, name: "岸波玉藻" }, pages: [ { cid: 49793120, dimension: { height: 720, rotate: 0, width: 1280 }, duration: 221, from: "vupload", page: 1, part: "2", vid: "", weblink: "" } ], pic: "http://i0.hdslb.com/bfs/archive/84dabeaa9b7d5d127c98f8121b0d46f241287767.jpg", pubdate: 1533632587, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 0, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28743188, coin: 2, danmaku: 0, dislike: 0, favorite: 7, his_rank: 0, like: 23, now_rank: 0, reply: 6, share: 2, view: 124 }, state: -100, tid: 25, title: "【FATE MMD】罗宾汉的极乐净土", tname: "MMD·3D", videos: 1 }, { aid: 28741550, attribute: 16768, cid: 49789622, copyright: 1, ctime: 1533630391, desc: "BGM:Désir——《fate/apocrypha》ED1\\n新人up摸鱼出来的第二个视频\\n前面一段偷懒了还望谅解(还有一小段用过两次\\n喜欢的话就请关注投币推荐收藏一条龙吧=v=", dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 278, dynamic: "#日本场应援2018##间桐樱##卫宫士郎##远坂凛##燃向#终于弄好了哇QAQ", mission_id: 10568, owner: { face: "http://i2.hdslb.com/bfs/face/016fb61758a8697378703853f075e5ffd96dfc80.jpg", mid: 74156490, name: "极と墨" }, pages: [ { cid: 49789622, dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 278, from: "vupload", page: 1, part: "樱应援(2)", vid: "", weblink: "" } ], pic: "http://i2.hdslb.com/bfs/archive/48b2c32d85521f0074ff8a34385811b8e0c59399.jpg", pubdate: 1533630391, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 1, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28741550, coin: 431, danmaku: 75, dislike: 0, favorite: 776, his_rank: 0, like: 466, now_rank: 0, reply: 92, share: 58, view: 17369 }, state: 0, tid: 24, title: "【FATE/fgo】正义之所在", tname: "MAD·AMV", videos: 1 }, { aid: 28740360, attribute: 16512, cid: 49786602, copyright: 1, ctime: 1533629143, desc: "首先,感谢网易云用户:saberycr他在网易云投稿的游戏人生mad非常棒!给了我很大的灵感,大家可以去看看。\\n新人渣作,喜欢的话就点个赞也是好的,谢谢!", dimension: { height: 720, rotate: 0, width: 1280 }, duration: 368, dynamic: "#日本场应援2018##AMV##MAD#", mission_id: 10568, owner: { face: "http://i2.hdslb.com/bfs/face/fd9cf396df8779b55a84f8793a668f028f37608d.jpg", mid: 107142392, name: "清居wl" }, pages: [ { cid: 49786602, dimension: { height: 720, rotate: 0, width: 1280 }, duration: 368, from: "vupload", page: 1, part: "【MAD·AMV游戏人生zero】休比,下辈子再做我的妻子好吗?", vid: "", weblink: "" } ], pic: "http://i2.hdslb.com/bfs/archive/e41e625d36b235e1fd55bbf479b550d6b93190e0.jpg", pubdate: 1533629142, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 0, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28740360, coin: 19, danmaku: 5, dislike: 0, favorite: 12, his_rank: 0, like: 26, now_rank: 0, reply: 15, share: 12, view: 575 }, state: 0, tid: 24, title: "【MAD·AMV游戏人生zero】休比,下辈子再做我的妻子好吗?", tname: "MAD·AMV", videos: 1 }, { aid: 28739521, attribute: 16512, cid: 49782315, copyright: 1, ctime: 1533629243, desc: "大家好我死回来啦.........!\\n学会了录屏和一点点简单的剪辑超开心!!!\\n炫耀一下vqv。\\n大家今天一定要给茶茶投票鸭!!!!!!!!!!!!!\\n\\nbgm:\\n無邪気な冒険心——Goose house\\n3/4——Goose house\\n18歲——Goose house", dimension: { height: 720, rotate: 0, width: 1280 }, duration: 799, dynamic: "#绘画过程##板绘##上色#", mission_id: 10568, owner: { face: "http://i1.hdslb.com/bfs/face/8901e94eb89768277f88f3e5e021b28f0202bdb5.jpg", mid: 12469873, name: "嗨呀个嘿" }, pages: [ { cid: 49782315, dimension: { height: 720, rotate: 0, width: 1280 }, duration: 799, from: "vupload", page: 1, part: "20180806_172718.mp4", vid: "", weblink: "" } ], pic: "http://i2.hdslb.com/bfs/archive/428deb75735cab3e32cfd6af4a7e15dc62564ff6.jpg", pubdate: 1533629243, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 0, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28739521, coin: 15, danmaku: 0, dislike: 0, favorite: 5, his_rank: 0, like: 13, now_rank: 0, reply: 15, share: 11, view: 417 }, state: -100, tid: 162, title: "【一个过程】简陋的画了一个茶茶", tname: "绘画", videos: 1 }, { aid: 28738449, attribute: 16512, cid: 49783840, copyright: 1, ctime: 1533628244, desc: "休息了2周 再次回来做视频了\\nBGM:一刀缭乱-六花\\n希望大家喜欢 也希望fate在萌战里获得好成绩 也希望大家鬼岛活动加油!", dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 200, dynamic: "#日本场应援2018##AMV##FATE#", mission_id: 10568, owner: { face: "http://i0.hdslb.com/bfs/face/ff34db61ca71de81684ea0ae9b708e5ee68cd342.jpg", mid: 3294538, name: "月无挽风" }, pages: [ { cid: 49783840, dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 200, from: "vupload", page: 1, part: "六花 - 一刀繚乱", vid: "", weblink: "" } ], pic: "http://i1.hdslb.com/bfs/archive/dac96f76cc81fe4205fc29fb37f3d52178c73a87.jpg", pubdate: 1533628244, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 0, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28738449, coin: 162, danmaku: 23, dislike: 0, favorite: 223, his_rank: 0, like: 174, now_rank: 0, reply: 33, share: 48, view: 5548 }, state: 0, tid: 24, title: "【FGO/AMV】为御主献上 如雷鸣般的喝彩!", tname: "MAD·AMV", videos: 1 }, { aid: 28738418, attribute: 16512, cid: 49800159, copyright: 1, ctime: 1533623268, desc: "应援视频。\\n对不起来晚了,如果这样就能让故事停留在P1就好了。\\n(虽然我觉得P2很好)\\n希望休比和助手都能拿个好名次~", dimension: { height: 720, rotate: 0, width: 1280 }, duration: 696, dynamic: "#日本场应援2018##NO GAME NO LIFE##游戏人生#", mission_id: 10568, owner: { face: "http://i0.hdslb.com/bfs/face/20fbb85c51b1cfcfc24372d5e06068addaf6f8a0.jpg", mid: 4313856, name: "年度枫" }, pages: [ { cid: 49800159, dimension: { height: 720, rotate: 0, width: 1280 }, duration: 135, from: "vupload", page: 1, part: "游戏人生zero-休比(原音频)", vid: "", weblink: "" }, { cid: 49800172, dimension: { height: 720, rotate: 0, width: 1280 }, duration: 561, from: "vupload", page: 2, part: "如果没有P2就好了(配乐版)", vid: "", weblink: "" } ], pic: "http://i0.hdslb.com/bfs/archive/ff2227531a7dcc0eaef3c22e73c34733689fec45.jpg", pubdate: 1533634230, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 0, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28738418, coin: 22, danmaku: 10, dislike: 0, favorite: 19, his_rank: 0, like: 26, now_rank: 0, reply: 13, share: 10, view: 1278 }, state: 0, tid: 27, title: "【游戏人生zero】休比应援:这场游戏是休比赢了", tname: "综合", videos: 2 }, { aid: 28736888, attribute: 2113664, cid: 49781520, copyright: 1, ctime: 1533621539, desc: "模型:エミヤ:ちょビ玉\\n场景:im8147346:鯖缶359\\n动作:sm24923974:遊風稜\\n口型:sm32918418:しわこ\\n镜头:sm26631976:足屋コーヒー\\nMME:Diffusion7:そぼろ\\nBGM:Beat It(Michael Jackson)", dimension: { height: 720, rotate: 0, width: 1280 }, duration: 218, dynamic: "#FATE##日本场应援2018##卫宫#", mission_id: 10568, owner: { face: "http://i0.hdslb.com/bfs/face/7dc3c1da46f9d5024b27fc0c880a4c2a66327c16.jpg", mid: 16295316, name: "岸波玉藻" }, pages: [ { cid: 49781520, dimension: { height: 720, rotate: 0, width: 1280 }, duration: 218, from: "vupload", page: 1, part: "1", vid: "", weblink: "" } ], pic: "http://i2.hdslb.com/bfs/archive/10338319f5125dfb9b793795a0fd02241dfc52fc.jpg", pubdate: 1533621539, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 0, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28736888, coin: 0, danmaku: 1, dislike: 0, favorite: 7, his_rank: 0, like: 27, now_rank: 0, reply: 3, share: 10, view: 475 }, state: 0, tid: 25, title: "【FATE MMD】卫宫的Beat it", tname: "MMD·3D", videos: 1 }, { aid: 28734732, attribute: 16768, cid: 49769513, copyright: 1, ctime: 1533622564, desc: "第三期预告(水视频)\\n我怀疑我们能不能继续了(失望)赞好少,感觉大家不是很喜欢我这个系列\\n真的如果收藏没有达到200我们打算做其他简单的了", dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 264, dynamic: "#日本场应援2018##魔法少女伊莉雅##阿库娅#我才不是什么智障,我是魔法女神!发起火来连自己都打!", mission_id: 10568, owner: { face: "http://i0.hdslb.com/bfs/face/a12473cd675c85d35ca62ebb16ee8788f924512e.jpg", mid: 104934805, name: "小千藤" }, pages: [ { cid: 49769513, dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 264, from: "vupload", page: 1, part: "第三期魔法少女", vid: "", weblink: "" } ], pic: "http://i1.hdslb.com/bfs/archive/6d4d6dc5044c32ba3fa8e155abb89d71438c3904.jpg", pubdate: 1533622564, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 1, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28734732, coin: 272, danmaku: 91, dislike: 0, favorite: 151, his_rank: 0, like: 588, now_rank: 0, reply: 145, share: 48, view: 9016 }, state: -100, tid: 24, title: "【AMV/误解】我才不是智障!我是魔法少女~", tname: "MAD·AMV", videos: 1 }, { aid: 28734092, attribute: 16512, cid: 49775961, copyright: 1, ctime: 1533620802, desc: "因为第一次传失误了所以删除了...对此感到抱歉...\\n明天的帮派火拼请各位务必投zero two一票\\nBGM:い〜やい〜やい〜や(算了~算了~算了~)", dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 199, dynamic: "#日本场应援2018##DARLINGINTHEFRANX##国家队#", mission_id: 10568, owner: { face: "http://i1.hdslb.com/bfs/face/b17b1cfde77da1bb362f962e639852b853679a56.jpg", mid: 33916569, name: "熊屋_" }, pages: [ { cid: 49775961, dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 199, from: "vupload", page: 1, part: "4 (2)", vid: "", weblink: "" } ], pic: "http://i2.hdslb.com/bfs/archive/ee255addecc8c1f9c61bb854b96dc2d6d45c606c.jpg", pubdate: 1533620802, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 0, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28734092, coin: 12, danmaku: 1, dislike: 0, favorite: 19, his_rank: 0, like: 32, now_rank: 0, reply: 7, share: 1, view: 874 }, state: -100, tid: 24, title: "[Darling in the Franxx]因为我们13部队是一家人啊", tname: "MAD·AMV", videos: 1 }, { aid: 28729478, attribute: 16512, cid: 49766687, copyright: 1, ctime: 1533614675, desc: "bgm:彼女は旅に出る\\n我的英雄学院实在是,太太太太太太太太好看了!!!!吹爆我英!!!真的具TM好看,我永远爱着绿谷小天使/咔酱/轰总/茶爷/欧叔/渡我/...(省略),真的,我英真的很棒,b萌轰总下一场和小天使对,自己人打自己人,咔酱对闪闪,简直死亡分组)\\nqaq手书里的绿毛是up我了,刚开始因为画风,然后一直没看,我朋友安利过我很多次了,后面是没东西看了,然后去看我英,然后 出不来了!!\\n此生无悔入我英,祝小伙伴们食用愉快【比心】", dimension: { height: 720, rotate: 0, width: 1280 }, duration: 205, dynamic: "#我的英雄学院##手书##all出#", mission_id: 10568, owner: { face: "http://i0.hdslb.com/bfs/face/a42c2ed64c15f8f782597a6a2d8dfc14064c8539.jpg", mid: 8882876, name: "七月萤兮" }, pages: [ { cid: 49766687, dimension: { height: 720, rotate: 0, width: 1280 }, duration: 205, from: "vupload", page: 1, part: "Pixgram_2018-08-06-05-51-39", vid: "", weblink: "" } ], pic: "http://i2.hdslb.com/bfs/archive/78ea20ba7fa688185ef8def45bd6b27ba142a1aa.jpg", pubdate: 1533614675, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 0, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28729478, coin: 33, danmaku: 33, dislike: 0, favorite: 30, his_rank: 0, like: 43, now_rank: 0, reply: 42, share: 12, view: 807 }, state: -100, tid: 47, title: "【七月萤兮/我的英雄学院手书】我的小英雄", tname: "短片·手书·配音", videos: 1 }, { aid: 28729392, attribute: 16512, cid: 49765760, copyright: 1, ctime: 1533614699, desc: "bgm:Re:rain", dimension: { height: 720, rotate: 0, width: 1434 }, duration: 290, dynamic: "#日本场应援2018##恋爱##我的青春恋爱物语果然有问题#", mission_id: 10568, owner: { face: "http://i1.hdslb.com/bfs/face/18ca4971240d76810158623d7c75240e675f4874.jpg", mid: 31451891, name: "骑士王SABER233" }, pages: [ { cid: 49765760, dimension: { height: 720, rotate: 0, width: 1434 }, duration: 290, from: "vupload", page: 1, part: "我的青春恋爱物语果然有问题 (1)", vid: "", weblink: "" } ], pic: "http://i1.hdslb.com/bfs/archive/7b8058ac794060dbefac6e00256185bea88dcf7a.jpg", pubdate: 1533614699, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 0, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28729392, coin: 6, danmaku: 6, dislike: 0, favorite: 14, his_rank: 0, like: 21, now_rank: 0, reply: 13, share: 7, view: 1101 }, state: 0, tid: 24, title: "【我的青春恋爱物语果然有问题】那个房间依旧演绎着永不终结的日常", tname: "MAD·AMV", videos: 1 }, { aid: 28728563, attribute: 16512, cid: 49764773, copyright: 1, ctime: 1533613174, desc: "ooc警告!!!!!!!!!!\\n开头声音不知道为什么爆炸了,小心啊(虽然我觉得没人看简介)\\n本家手书:sm7598520\\n是半成品(但是不会画完,因为懒)\\n作品是闪恩向向,伊斯塔凛厨慎入", dimension: { height: 704, rotate: 0, width: 1280 }, duration: 81, dynamic: "#日本场应援2018##bilibili moe#", mission_id: 10568, owner: { face: "http://i2.hdslb.com/bfs/face/b8c804b83b724a75dbd695114b8e94fa0fd5c8b6.jpg", mid: 5246707, name: "鸦青夙" }, pages: [ { cid: 49764773, dimension: { height: 704, rotate: 0, width: 1280 }, duration: 81, from: "vupload", page: 1, part: "bandicam 2018-08-07 10-52-36-456", vid: "", weblink: "" } ], pic: "http://i1.hdslb.com/bfs/archive/7a09ba0de0d85a3062aac90740382b6d96b24cac.jpg", pubdate: 1533646608, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 0, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28728563, coin: 88, danmaku: 38, dislike: 0, favorite: 101, his_rank: 0, like: 149, now_rank: 0, reply: 50, share: 27, view: 4009 }, state: -100, tid: 47, title: "【描绘】那什么的吉尔伽美什", tname: "短片·手书·配音", videos: 1 }, { aid: 28728539, attribute: 16768, cid: 49763239, copyright: 1, ctime: 1533613312, desc: "原图作者:@micsu3_3 \\n一时兴起录的勾线视频 \\n因为我就是被这张图拉入闪恩 就当给闪闪应援了\\nBGM发在弹幕里 \\n作者大大只在图里做了签名 但是微博p站都找不到了\\n有人知道求发我一下", dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 901, dynamic: "#日本场应援2018##手绘##板绘#", mission_id: 10568, owner: { face: "http://i1.hdslb.com/bfs/face/b0129594cbf7b0472760055e06619ff38ca5bd82.jpg", mid: 101222463, name: "-吾生-" }, pages: [ { cid: 49763239, dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 901, from: "vupload", page: 1, part: "金闪闪小恩", vid: "", weblink: "" } ], pic: "http://i2.hdslb.com/bfs/archive/71b0f51ca97edab7f09ebe06d0a6d8df68968022.jpg", pubdate: 1533613312, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 1, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28728539, coin: 65, danmaku: 32, dislike: 0, favorite: 38, his_rank: 0, like: 48, now_rank: 0, reply: 25, share: 9, view: 1705 }, state: -100, tid: 162, title: "(封面勾线)闪恩 超舒服的勾线教程 金闪闪应援 原图@micsu3_3", tname: "绘画", videos: 1 }, { aid: 28726197, attribute: 16768, cid: 49760343, copyright: 1, ctime: 1533610523, desc: "素材 DARLING in the FRANXX\\nBGM lie 三无MarBlue\\n02应援 希望大家多多支持02", dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 177, dynamic: "#日本场应援2018##02##剪辑#", mission_id: 10568, owner: { face: "http://i0.hdslb.com/bfs/face/9584df17eab3fa95f602a0f786c30fa40848aedd.jpg", mid: 180306090, name: "黑火saki" }, pages: [ { cid: 49760343, dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 177, from: "vupload", page: 1, part: "催泪 02应援 DARLING in the FRANXX BGM超燃", vid: "", weblink: "" } ], pic: "http://i2.hdslb.com/bfs/archive/28862cff8571c64f8b1c366da7cfb2214cb0e8de.jpg", pubdate: 1533610523, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 1, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28726197, coin: 45, danmaku: 1, dislike: 0, favorite: 32, his_rank: 0, like: 53, now_rank: 0, reply: 23, share: 10, view: 1279 }, state: 0, tid: 183, title: "催泪 02应援 DARLING in the FRANXX BGM超燃", tname: "影视剪辑", videos: 1 }, { aid: 28724349, attribute: 16768, cid: 49753999, copyright: 1, ctime: 1533609970, desc: "为02和广主席疯狂打call!\\n封面pixiv画师:星晓吻", dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 235, dynamic: "#AMV##MAD##新人向#国家队虽然瑕疵挺多,但这不妨它成为今年上半年给我留下印象最深的日本动画。", mission_id: 10568, owner: { face: "http://i0.hdslb.com/bfs/face/0a735c9ff4fe87d7c0f205a832e59cc59a902694.jpg", mid: 8189036, name: "幻化涅槃" }, pages: [ { cid: 49753999, dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 235, from: "vupload", page: 1, part: "比翼齐飞,终不悔", vid: "", weblink: "" } ], pic: "http://i2.hdslb.com/bfs/archive/54587be6c0441b911ffa551666efe6e2c21c7ce3.jpg", pubdate: 1533609970, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 1, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28724349, coin: 69, danmaku: 12, dislike: 0, favorite: 67, his_rank: 0, like: 87, now_rank: 0, reply: 25, share: 22, view: 1690 }, state: 0, tid: 24, title: "【02广应援/燃】比翼齐飞,终不悔", tname: "MAD·AMV", videos: 1 }, { aid: 28721456, attribute: 16768, cid: 49750661, copyright: 1, ctime: 1533607334, desc: "这次画了一个知世,我知道我画残了,完全没有知世小姐姐的那种气质TAT…………cm我也不画了,想不出来。(尾巴我居然忘了…………TAT)我也希望本战大家能多投给这善解人意,为他人着想,又是神助攻的知世几票,我不希望她就此止步于32强~以及,不喜勿喷。", dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 238, dynamic: "#日本场应援2018##我的小马驹##动画#", mission_id: 10568, owner: { face: "http://i0.hdslb.com/bfs/face/ab1bf911a50086c21707f0f558908c1adda0f8ac.jpg", mid: 71304403, name: "暮临呀" }, pages: [ { cid: 49750661, dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 238, from: "vupload", page: 1, part: "知世拟马", vid: "", weblink: "" } ], pic: "http://i0.hdslb.com/bfs/archive/7435ec40e0b513949546a93c15661df3dea27f94.jpg", pubdate: 1533607334, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 1, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28721456, coin: 4, danmaku: 0, dislike: 0, favorite: 3, his_rank: 0, like: 2, now_rank: 0, reply: 19, share: 5, view: 322 }, state: 0, tid: 27, title: "[mlp速绘]知世拟马", tname: "综合", videos: 1 }, { aid: 28719317, attribute: 2113664, cid: 49746204, copyright: 1, ctime: 1533603953, desc: "借物表:\\nmodel:Kei\\nmotion:srs\\ncamera:aokana\\nstage:hazi,溯北,怪獣対若大将P,kotami,RedialC\\nmme:角砂糖,下っ腹P,XDOF,Diffusion7,SSAO\\nmusic:無情", dimension: { height: 720, rotate: 0, width: 1280 }, duration: 212, dynamic: "#舞蹈MMD##日本场应援2018##新人#", mission_id: 10568, owner: { face: "http://i2.hdslb.com/bfs/face/6061182c896d07597978ff34862d690652f29cf4.jpg", mid: 348898917, name: "ex陌书" }, pages: [ { cid: 49746204, dimension: { height: 720, rotate: 0, width: 1280 }, duration: 212, from: "vupload", page: 1, part: "無情", vid: "", weblink: "" } ], pic: "http://i2.hdslb.com/bfs/archive/95039a13d98c56f3281791f33c7b19c6351df1fb.jpg", pubdate: 1533603953, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 0, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28719317, coin: 4, danmaku: 1, dislike: 0, favorite: 53, his_rank: 0, like: 19, now_rank: 0, reply: 9, share: 10, view: 665 }, state: 0, tid: 25, title: "【刀剑乱舞MMD】無情--来自kei咪", tname: "MMD·3D", videos: 1 }, { aid: 28718973, attribute: 16512, cid: 49751276, copyright: 1, ctime: 1533606982, desc: "主要内容为管家助理艾克雷亚·艾克雷尔·艾伊克雷亚\\nBGM:ほぼ日P - 家に帰ると妻が必ず死んだふりをしています\\n欢迎加入UP的粉丝群:237213911", dimension: { height: 720, rotate: 0, width: 1280 }, duration: 163, dynamic: "#不死者之王##骨傲天##Overlord##新星计划#\\n主要内容为管家助理艾克雷亚·艾克雷尔·艾伊克雷亚\\nBGM:ほぼ日P - 家に帰ると妻が必ず死んだふりをしています\\n欢迎加入UP的粉丝群:237213911", mission_id: 10568, owner: { face: "http://i0.hdslb.com/bfs/face/a4cbc140157251afb969023ada66e6d7b084bf6e.jpg", mid: 4021955, name: "红莲妖" }, pages: [ { cid: 49751276, dimension: { height: 720, rotate: 0, width: 1280 }, duration: 163, from: "vupload", page: 1, part: "助理_1", vid: "", weblink: "" } ], pic: "http://i2.hdslb.com/bfs/archive/dbec0f5b79c77003b9f2065ab5806b1f662d7f06.jpg", pubdate: 1533606982, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 0, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28718973, coin: 37, danmaku: 15, dislike: 0, favorite: 14, his_rank: 0, like: 85, now_rank: 0, reply: 38, share: 7, view: 6447 }, state: 0, tid: 27, title: "【瞎考剧】Overlord:艾克雷亚·艾克雷尔·艾伊克雷亚", tname: "综合", videos: 1 }, { aid: 28718963, attribute: 16512, cid: 49851722, copyright: 1, ctime: 1533607036, desc: "又一个积压了一个多月的视频,花了两天时间憋出来。\\n(才刚用pr的新人啥也不会)\\n很遗憾爱酱的B萌已经落幕了\\n但他的留下反叛精神与钢铁的意志永远不会消失\\n献给伟大的起义领袖,斯巴达克斯\\n(中间部分已3倍速快进,需要也可跳至25:35继续食用)", dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 1846, dynamic: "#Fate/Grand Order##国服##实况##斯巴达克斯#", mission_id: 10568, owner: { face: "http://i0.hdslb.com/bfs/face/584f66e6583416ef5117910c32fcb5ef26df0e5c.jpg", mid: 9366744, name: "Actinides" }, pages: [ { cid: 49851722, dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 1846, from: "vupload", page: 1, part: "序列 01", vid: "", weblink: "" } ], pic: "http://i0.hdslb.com/bfs/archive/fb8b9580a2039ca2bb56efcc0315fd911801f27e.jpg", pubdate: 1533619025, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 0, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28718963, coin: 6, danmaku: 5, dislike: 0, favorite: 6, his_rank: 0, like: 9, now_rank: 0, reply: 7, share: 8, view: 822 }, state: 0, tid: 172, title: "我的爱终将毁灭一切压迫!斯巴达克斯主手vs魔性菩萨", tname: "手机游戏", videos: 1 }, { aid: 28714933, attribute: 16768, cid: 78023888, copyright: 1, ctime: 1533603974, desc: "bgm:lemon\\n稍微小改了一下,虽然感觉还有点问题,但之后也没有大改的打算了", dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 269, dynamic: "#日本场应援2018##命运石之门##石头门#", mission_id: 10568, owner: { face: "http://i2.hdslb.com/bfs/face/b77b86be883edc9e028148d4dbbe30e25f2e8682.jpg", mid: 12787286, name: "羽室233" }, pages: [ { cid: 78023888, dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 269, from: "vupload", page: 1, part: "试下直接删旧源换源0.0", vid: "", weblink: "" } ], pic: "http://i0.hdslb.com/bfs/archive/fa7894144ea6aa79df078be2b9a427346c569237.jpg", pubdate: 1533603974, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 1, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28714933, coin: 51, danmaku: 2, dislike: 0, favorite: 24, his_rank: 0, like: 35, now_rank: 0, reply: 24, share: 14, view: 1094 }, state: 0, tid: 24, title: "【命运石之门】误入α线——你待在这里,只不过是在梦境中罢了", tname: "MAD·AMV", videos: 1 }, { aid: 28714440, attribute: 2113920, cid: 49737324, copyright: 1, ctime: 1533603986, desc: "高三那年看了游戏人生zero,过了很久才释然...\\n“我其实不想给任何人的...喜欢里克的心情,不想和他分开的心情,毕竟很害羞啊!从里克那得到的多到数不清的系统错误,这些都是只属于休比自己的东西,现在要把这些交给你们,这意味着什么?你们给我明白啊!笨蛋!别在那啰里啰唆!给我把这份思念继承下去啊!\\n给我把应援票投给休比啊!w\\n给我把关注和硬币投up主啊!(误)“\\n休比,祝你终有一天能与自己重要的人重逢.\\n\\n封面截自BD 0:55:56\\nbgm:befall(崩三女王降临印象曲)", dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 235, dynamic: "#日本场应援2018##新星计划##游戏人生zero#", mission_id: 10568, owner: { face: "http://i2.hdslb.com/bfs/face/0e0c4b99b95726bf34c62122effa08c4e1e36e11.jpg", mid: 35578381, name: "阴久晴" }, pages: [ { cid: 49737324, dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 235, from: "vupload", page: 1, part: "游戏人生", vid: "", weblink: "" } ], pic: "http://i2.hdslb.com/bfs/archive/527eb42364d323d9c171be6cce97178c7b140656.jpg", pubdate: 1533616201, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 1, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28714440, coin: 70, danmaku: 9, dislike: 0, favorite: 39, his_rank: 0, like: 72, now_rank: 0, reply: 17, share: 11, view: 967 }, state: 1, tid: 24, title: "【游戏人生/休比应援】当给休比配上崩三的bgm,悲剧是否能够改变", tname: "MAD·AMV", videos: 1 }, { aid: 28714349, attribute: 16512, cid: 49738002, copyright: 1, ctime: 1533603990, desc: "第一次剪视频,完全用爱发电爆肝赶在凛凛本战的时候做完,做得不好的地方还请大家包容啦。\\n他们俩真好嘤嘤嘤,凛凛、哈鲁冲鸭!\\n事先声明,里面混有玻璃渣,但结局绝对是甜的!绝对!!", dimension: { height: 720, rotate: 0, width: 1280 }, duration: 306, dynamic: "#日本场应援2018##凛遥##Free!#", mission_id: 10568, owner: { face: "http://i0.hdslb.com/bfs/face/7c8e6063dbcbe34411c761c1645038e49f19a5cf.jpg", mid: 4902600, name: "浮声" }, pages: [ { cid: 49738002, dimension: { height: 720, rotate: 0, width: 1280 }, duration: 306, from: "vupload", page: 1, part: "free", vid: "", weblink: "" } ], pic: "http://i0.hdslb.com/bfs/archive/df18b2ffe096c285a8b6f1953cd75a5429ee6de7.jpg", pubdate: 1533603990, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 0, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28714349, coin: 177, danmaku: 70, dislike: 0, favorite: 214, his_rank: 0, like: 173, now_rank: 0, reply: 84, share: 29, view: 2883 }, state: 0, tid: 24, title: "【Free!凛遥】【愛してるのに、愛せない】爱着你、却无法爱你", tname: "MAD·AMV", videos: 1 }, { aid: 28712030, attribute: 16768, cid: 49732205, copyright: 1, ctime: 1533604e3, desc: "永不放弃努力前行 是想抓住梦想的翅膀\\n时至今日 想要传达的心愿无法按捺 在心中迸发\\n动摇的心或有迷茫 即使如此也要向前\\n相信会有风停雨散\\n向着明天前行 得以遇见Sunshine!\\n昂首便是万里晴空", dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 282, dynamic: "#日本场应援2018##MAD.AMV##MAD##Aqours##lovelive#\\n永不放弃努力前行 是想抓住梦想的翅膀\\n时至今日 想要传达的心愿无法按捺 在心中迸发\\n动摇的心或有迷茫 即使如此也要向前\\n相信会有风停雨散\\n向着明天前行 得以遇见Sunshine!\\n昂首便是万里晴空", mission_id: 10568, owner: { face: "http://i0.hdslb.com/bfs/face/0630cf1774548a15fe62fe93de01f76f91232dbb.jpg", mid: 177444763, name: "希大0723" }, pages: [ { cid: 49732205, dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 282, from: "vupload", page: 1, part: "序列 01", vid: "", weblink: "" } ], pic: "http://i2.hdslb.com/bfs/archive/edccc6da7934da5cf39e095bedbcbffc8f1f66ba.jpg", pubdate: 1533604e3, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 1, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28712030, coin: 27, danmaku: 2, dislike: 0, favorite: 11, his_rank: 0, like: 19, now_rank: 0, reply: 5, share: 2, view: 787 }, state: -4, tid: 24, title: "【Aqours BD7纪念】キセキヒカル 奇迹闪耀", tname: "MAD·AMV", videos: 1 }, { aid: 28711339, attribute: 16768, cid: 49733160, copyright: 1, ctime: 1533584227, desc: "士郎加油,喜欢的话推荐收藏一下哦!", dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 255, dynamic: "#日本场应援2018##卫宫士郎##AMV#", mission_id: 10568, owner: { face: "http://i0.hdslb.com/bfs/face/78527264bbbb4c1370ffb1c57c999c3984323dd6.jpg", mid: 66862188, name: "伊卡伊卡w" }, pages: [ { cid: 49733160, dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 255, from: "vupload", page: 1, part: "【AMV·卫宫士郎应援】“输给谁都可以,但是,决不能输给自己!”", vid: "", weblink: "" } ], pic: "http://i2.hdslb.com/bfs/archive/ead76899d19cdbe371b1a646c13a8ec850e89040.jpg", pubdate: 1533584227, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 1, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28711339, coin: 25, danmaku: 9, dislike: 0, favorite: 46, his_rank: 0, like: 56, now_rank: 0, reply: 19, share: 16, view: 2037 }, state: 0, tid: 24, title: "【AMV·卫宫士郎应援】“输给谁都可以,但是,决不能输给自己!”", tname: "MAD·AMV", videos: 1 }, { aid: 28710374, attribute: 16512, cid: 49727323, copyright: 1, ctime: 1533604007, desc: "尝试去讲一个机器人少女拥有心的故事,于是选用了镜音的这首歌曲,同时和花たん的翻唱结合做音频处理,试图从休比的个体视角,而不是故事的全局视角,去表现少女从“无心”到拥有“心”的升华过程。\\n\\n素材:no game no life 0(游戏人生剧场版)\\nBGM:ココロ(镜音+花たん,UP主剪辑版)", dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 312, dynamic: "#日本场应援2018##休比·多拉##休比# 还是太赶了,待打磨的地方太多,完成度三成吧", mission_id: 10568, owner: { face: "http://i0.hdslb.com/bfs/face/fe4a7d538ddbcba7bf28a2bf1b29965ac1d2a6b5.jpg", mid: 16386653, name: "精神隶属机" }, pages: [ { cid: 49727323, dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 312, from: "vupload", page: 1, part: "心·机凯", vid: "", weblink: "" } ], pic: "http://i0.hdslb.com/bfs/archive/841ef5644f90f16633bb5b17201bd73932bd8e38.jpg", pubdate: 1533604007, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 0, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28710374, coin: 706, danmaku: 111, dislike: 0, favorite: 353, his_rank: 0, like: 607, now_rank: 0, reply: 109, share: 113, view: 12415 }, state: -100, tid: 24, title: "【游戏人生ZERO】心·机凯——那是名为“心”的奇迹(ココロ・エクスマキナ)", tname: "MAD·AMV", videos: 1 }, { aid: 28709514, attribute: 2113920, cid: 49728720, copyright: 1, ctime: 1533609142, desc: '青叶可真是个罪孽深重的女人,没有青叶看我要死了("▔□▔)/\\n请大家为青叶投上宝贵的一票!!\\nbgm:恋爱循环香菜版', dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 204, dynamic: "#日本场应援2018##新星计划##凉风青叶#", mission_id: 10568, owner: { face: "http://i2.hdslb.com/bfs/face/0e0c4b99b95726bf34c62122effa08c4e1e36e11.jpg", mid: 35578381, name: "阴久晴" }, pages: [ { cid: 49728720, dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 204, from: "vupload", page: 1, part: "凉风青叶", vid: "", weblink: "" } ], pic: "http://i2.hdslb.com/bfs/archive/be899252235f5fbc3f432d354fad87e59e79a8d3.jpg", pubdate: 1533634233, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 1, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28709514, coin: 29, danmaku: 25, dislike: 0, favorite: 16, his_rank: 0, like: 35, now_rank: 0, reply: 12, share: 10, view: 411 }, state: 1, tid: 24, title: '【青叶应援】没有青叶看我要死了("▔□▔)/青叶赛高', tname: "MAD·AMV", videos: 1 }, { aid: 28708306, attribute: 2113664, cid: 50233770, copyright: 1, ctime: 1533604016, desc: "自制,借物表见视频内\\n摸鱼,这次算填完一个坑,于是顺便把它当做了应援视频,虽然感觉发的时间有点微妙\\n很喜欢这首歌的动作数据,感觉和波特莫名契合,很可爱", dimension: { height: 768, rotate: 0, width: 1366 }, duration: 194, dynamic: "", mission_id: 10568, owner: { face: "http://i1.hdslb.com/bfs/face/63f3fe9708a4dfb9158d5a1d845e3f1bfa04592a.jpg", mid: 6565661, name: "Tiua" }, pages: [ { cid: 50233770, dimension: { height: 768, rotate: 0, width: 1366 }, duration: 194, from: "vupload", page: 1, part: "0", vid: "", weblink: "" } ], pic: "http://i1.hdslb.com/bfs/archive/2b3bf7256a573bfb5a1d1c2ac8308a5724ec0859.jpg", pubdate: 1533604016, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 0, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28708306, coin: 8, danmaku: 1, dislike: 0, favorite: 16, his_rank: 0, like: 15, now_rank: 0, reply: 7, share: 7, view: 397 }, state: 0, tid: 25, title: "【女神异闻录5MMD】波特的染上你的颜色", tname: "MMD·3D", videos: 1 }, { aid: 28707654, attribute: 16640, cid: 49726539, copyright: 1, ctime: 1533604019, desc: "=-=想哭了,感觉莫名对不到节奏\\n但总之是吧之前的遗憾略微弥补了一下(真的是略微)哭\\n因为里克违背了誓约,所以他注定要失去一切(哭)\\nMAD很一般,不知道是做的烂还是审美疲劳了(我觉得是做的烂)\\n请审核大佬放过~呜呜呜", dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 255, dynamic: "#日本场应援2018##里克##休比#", mission_id: 10568, owner: { face: "http://i2.hdslb.com/bfs/face/67c1f2995c2b69abef1e952eb01d6e72a3a249c1.jpg", mid: 6410318, name: "玖钥桑" }, pages: [ { cid: 49726539, dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 255, from: "vupload", page: 1, part: "无标题2", vid: "", weblink: "" } ], pic: "http://i2.hdslb.com/bfs/archive/e8f2e8e8bf2461dbabaf0352cbc28c8a7bca78cf.jpg", pubdate: 1533604019, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 1, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 0, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28707654, coin: 21, danmaku: 4, dislike: 0, favorite: 20, his_rank: 0, like: 37, now_rank: 0, reply: 17, share: 11, view: 945 }, state: 0, tid: 24, title: "【游戏人生ZERO/MAD/终极应援】违背了誓约,我注定失去这一切", tname: "MAD·AMV", videos: 1 }, { aid: 28707213, attribute: 16768, cid: 49725419, copyright: 1, ctime: 1533604022, desc: "虽然用很多时间搞,但是依然做的很烂", dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 87, dynamic: "#日本场应援2018##AMV##fate#", mission_id: 10568, owner: { face: "http://i1.hdslb.com/bfs/face/147a6f160a5cc3364828bf2ad10909d6bf2ff082.jpg", mid: 4961140, name: "凉宫杏夏" }, pages: [ { cid: 49725419, dimension: { height: 1080, rotate: 0, width: 1920 }, duration: 87, from: "vupload", page: 1, part: "序列 03", vid: "", weblink: "" } ], pic: "http://i2.hdslb.com/bfs/archive/b6969e7eb14eb1854d094c95d243e3356a88719f.jpg", pubdate: 1533604022, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 1, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28707213, coin: 7, danmaku: 5, dislike: 0, favorite: 14, his_rank: 0, like: 23, now_rank: 0, reply: 10, share: 8, view: 967 }, state: 0, tid: 24, title: "【AMV】高燃,最爱的红色Archer和红色的魔法师", tname: "MAD·AMV", videos: 1 }, { aid: 28705483, attribute: 16512, cid: 49722687, copyright: 1, ctime: 1533574047, desc: "bgm很老了,小学生估计都没听过", dimension: { height: 720, rotate: 0, width: 1280 }, duration: 112, dynamic: "#日本场应援2018##AMV##MAD#", mission_id: 10568, owner: { face: "http://i2.hdslb.com/bfs/face/39f667b341cf21827cd7ae81f68da3081934ac82.jpg", mid: 97248224, name: "bili_97248224" }, pages: [ { cid: 49722687, dimension: { height: 720, rotate: 0, width: 1280 }, duration: 112, from: "vupload", page: 1, part: "【龙王的工作】八一x空银子,只对你有感觉", vid: "", weblink: "" } ], pic: "http://i0.hdslb.com/bfs/archive/9925518d391f52287c1a11e0b1f13f87505ed3f5.jpg", pubdate: 1533574047, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 0, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28705483, coin: 15, danmaku: 3, dislike: 0, favorite: 11, his_rank: 0, like: 24, now_rank: 0, reply: 10, share: 11, view: 1389 }, state: 0, tid: 24, title: "【龙王的工作】八一x空银子,只对你有感觉", tname: "MAD·AMV", videos: 1 }, { aid: 28705200, attribute: 16512, cid: 49719266, copyright: 1, ctime: 1533604035, desc: "原作:《孤独的巡礼/孤独な巡礼》\\n出自作品:Fate/Stay Night\\n作者:川井宪次\\n演奏乐器:钢琴/小提琴\\nSTAFF:钢琴/小提琴/COS/后期:Kino\\n终于翻了自己从刚入fate坑就特别喜欢的这首歌~!\\n一人全役了整首歌,有许多不足,还请各位dalao们指正~\\n一人制作辛苦,如果喜欢希望能给点个赞啦~比心(๑•̀ㅁ•́ฅ)\\n(原声乐器的录音好蓝瘦QWQ)\\n这次试了远坂凛在Fate/Grand Order中的概念礼装元素转换的COS,凛酱赛高!我永远喜欢远坂凛.JPG \\n(虽然这是Saber的", dimension: { height: 480, rotate: 0, width: 640 }, duration: 116, dynamic: "#fate##日本场应援2018#终于翻了自己从刚入fate坑就特别喜欢的《孤独的巡礼》,试了远坂凛在Fate/Grand Order中的概念礼装元素转换的COS,凛酱赛高!我永远喜欢远坂凛.JPG。一人全役了整首歌,有许多不足,还请各位dalao们指正~", mission_id: 10568, owner: { face: "http://i0.hdslb.com/bfs/face/71f384ff3ed0a7a9b3e7cad28cedbb988ca16173.jpg", mid: 3575182, name: "LogicKino" }, pages: [ { cid: 49719266, dimension: { height: 480, rotate: 0, width: 640 }, duration: 116, from: "vupload", page: 1, part: "孤独的巡礼", vid: "", weblink: "" } ], pic: "http://i1.hdslb.com/bfs/archive/3f54e6e37135ad042b49b66e75f1d0495321fd46.jpg", pubdate: 1533604035, rights: { autoplay: 1, bp: 0, download: 0, elec: 0, hd5: 0, is_cooperation: 0, movie: 0, no_background: 0, no_reprint: 1, pay: 0, ugc_pay: 0, ugc_pay_preview: 0 }, stat: { aid: 28705200, coin: 122, danmaku: 10, dislike: 0, favorite: 30, his_rank: 0, like: 82, now_rank: 0, reply: 64, share: 16, view: 2323 }, state: 0, tid: 59, title: "【一人全役】【钢琴&小提琴】孤独的巡礼 Fate/Stay Night插入曲【B萌日本场应援】", tname: "演奏", videos: 1 } ], mid: 26468955, mlid: 182603655, mtime: 1533874759, name: "bilibili moe 2018 日本动画场应援", owner: { face: "http://i2.hdslb.com/bfs/face/57389d533621407d36981a99fed93834dd8b20e6.jpg", mid: 26468955, name: "萌战基" }, pid: 769, play_count: 0, recent_oids: [ 28705200, 28705483, 28707213 ], recent_res: [ { oid: 28705200, typ: 2 }, { oid: 28705483, typ: 2 }, { oid: 28707213, typ: 2 } ], reply_count: 0, share_count: 0, stat: { favorite: 1685, pid: 769, reply: 10, share: 0, view: 298928 }, state: 0, type: 2 }; // src/content/playlist/script.html var script_default4 = '<script type="text/javascript" src="//static.hdslb.com/js/jquery.min.js"><\\/script>\\r\\n<script type="text/javascript" src="//static.hdslb.com/js/jquery.qrcode.min.js"><\\/script>\\r\\n<script type="text/javascript" src="//s1.hdslb.com/bfs/seed/jinkela/commentpc/comment.min.js"><\\/script>\\r\\n<script type="text/javascript" charset="utf-8" src="//static.hdslb.com/common/js/footer.js"><\\/script>\\r\\n<script type="text/javascript" src="//static.hdslb.com/js/swfobject.js"><\\/script>\\r\\n<script type="text/javascript" src="//static.hdslb.com/mstation/js/upload/moxie.js"><\\/script>\\r\\n<script type="text/javascript" src="//static.hdslb.com/mstation/js/upload/plupload.js"><\\/script>\\r\\n<script type="text/javascript"\\r\\n src="//s1.hdslb.com/bfs/static/jinkela/playlist-video/1.playlist_video.87292febba67b03f65d05c15d03e325d9db4f56a.js"><\\/script>\\r\\n<script type="text/javascript"\\r\\n src="//s1.hdslb.com/bfs/static/jinkela/playlist-video/playlist_video.87292febba67b03f65d05c15d03e325d9db4f56a.js"><\\/script>'; // src/content/playlist/playlist.html var playlist_default = '<!-- <!DOCTYPE html> -->\\r\\n<html lang="zh-CN">\\r\\n\\r\\n<head>\\r\\n <title>哔哩哔哩 (゜-゜)つロ 干杯~-bilibili</title>\\r\\n <meta charset="utf-8" />\\r\\n <meta http-equiv="X-UA-Compatible" content="IE=edge" />\\r\\n <meta name="renderer" content="webkit" />\\r\\n <meta name="description" content="bilibili是国内知名的视频弹幕网站,这里有最及时的动漫新番,最棒的ACG氛围,最有创意的Up主。大家可以在这里找到许多欢乐。" />\\r\\n <meta name="keywords" content="B站,弹幕,字幕,AMV,MAD,MTV,ANIME,动漫,动漫音乐,游戏,游戏解说,ACG,galgame,动画,番组,新番,初音,洛天依,vocaloid" />\\r\\n <meta charset="utf-8" />\\r\\n <meta http-equiv="X-UA-Compatible" content="IE=edge" />\\r\\n <meta name="renderer" content="webkit" />\\r\\n <meta name="description" content="bilibili是国内知名的视频弹幕网站,这里有最及时的动漫新番,最棒的ACG氛围,最有创意的Up主。大家可以在这里找到许多欢乐。" />\\r\\n <meta name="keywords" content="B站,弹幕,字幕,AMV,MAD,MTV,ANIME,动漫,动漫音乐,游戏,游戏解说,ACG,galgame,动画,番组,新番,初音,洛天依,vocaloid" />\\r\\n <link\\r\\n href="//s1.hdslb.com/bfs/static/jinkela/playlist-video/css/playlist_video.0.87292febba67b03f65d05c15d03e325d9db4f56a.css"\\r\\n rel="stylesheet" />\\r\\n <style type="text/css">\\r\\n #bofqi .player {\\r\\n width: 980px;\\r\\n height: 620px;\\r\\n display: block;\\r\\n }\\r\\n\\r\\n @media screen and (min-width:1400px) {\\r\\n #bofqi .player {\\r\\n width: 1160px;\\r\\n height: 720px\\r\\n }\\r\\n }\\r\\n </style>\\r\\n</head>\\r\\n\\r\\n<body>\\r\\n <div id="playlist-video-app"></div>\\r\\n <div class="footer bili-footer report-wrap-module"></div>\\r\\n</body>\\r\\n\\r\\n</html>'; // src/content/playlist/code.ts function playlistPage() { keepNewCheck(); const title = document.title; document.documentElement.replaceWith(createElements(htmlVnode(playlist_default))); title && !title.includes("404") && (document.title = title); loadVideoScript(); loadComment(); const route = urlObj(location.href); let type = 3, pl = -1, isPl = Boolean(path[5].startsWith("pl")), oid = "", has_more = false, observer = new MutationObserver((d) => Observer(d)); path[5].replace(/\\d+/, (d) => pl = d); if (route.business) { switch (route.business) { case "space": type = 1; break; case "space_series": type = 5; pl = route.business_id; break; case "space_channel": type = 6; pl = 10 * route.business_id + pl % 10; break; case "space_collection": type = 8; pl = route.business_id; break; default: type = 3; } } !isPl && replaceUrl(objUrl(\`https://www.bilibili.com/playlist/video/pl\${pl}\`, route)); function info(obj) { toview_default.attr = obj.data.attr; toview_default.count = obj.data.media_count; toview_default.cover = obj.data.cover; toview_default.ctime = obj.data.ctime; toview_default.description = obj.data.intro; toview_default.favored = obj.data.fav_state; toview_default.favorite = Boolean(obj.data.fav_state); toview_default.id = obj.data.id; toview_default.is_favorite = Boolean(obj.data.fav_state); toview_default.like_count = obj.data.like_state; toview_default.mid = obj.data.mid; toview_default.mlid = obj.data.id; toview_default.mtime = obj.data.ctime; toview_default.name = obj.data.title; toview_default.owner = obj.data.upper; toview_default.pid = obj.data.id; toview_default.stat.favorite = obj.data.cnt_info.collect; toview_default.stat.pid = obj.data.id; toview_default.stat.reply = obj.data.cnt_info.reply; toview_default.stat.share = obj.data.cnt_info.share; toview_default.stat.view = obj.data.cnt_info.play; } function list(obj) { var _a3; obj.data.media_list.reduce((s, d) => { s.push({ aid: d.id, attr: d.attr, attribute: 0, cid: d.pages[0].id, copyright: d.copy_right, ctime: d.pubtime, desc: d.intro, dimension: d.pages[0].dimension, duration: d.duration, dynamic: "", owner: d.upper, pages: d.pages.reduce((s2, b) => { s2.push({ cid: b.id, dimension: b.dimension, duration: b.duration, from: b.from, page: b.page, part: b.title, vid: "", weblink: b.link }); return s2; }, []), pic: d.cover, pubdate: d.pubtime, rights: d.rights, stat: { aid: d.id, coin: d.cnt_info.coin, danmaku: d.cnt_info.danmaku, dislike: d.cnt_info.thumb_down, favorite: d.cnt_info.collect, his_rank: 0, like: d.cnt_info.thumb_up, now_rank: 0, reply: d.cnt_info.reply, share: d.cnt_info.share, view: d.cnt_info.play }, state: 0, tid: d.tid, title: d.title, tname: "", videos: d.page }); return s; }, toview_default.list); has_more = obj.data.has_more; oid = (_a3 = toview_default.list.at(-1)) == null ? void 0 : _a3.aid; } function Observer(record) { record.forEach((d) => { calcScroll(d.target); }); } function calcScroll(node4) { const maxHeight = node4.scrollHeight; const scroll = /\\d+/.exec(node4.style.top) ? Number(/\\d+/.exec(node4.style.top)) : 0; if (node4.className.includes("hidden")) return; if (maxHeight - scroll > 0 && maxHeight - scroll < 600) { observer.disconnect(); videoFloat("加载更多列表中~"); xhr.get(\`https://api.bilibili.com/x/v2/medialist/resource/list?type=\${type}&oid=\${oid}&otype=2&biz_id=\${pl}&bvid=&with_current=true&mobi_app=web&ps=20&direction=false&sort_field=1&tid=0&desc=true\`, { responseType: "json" }).then((d) => { formatMore(d); has_more && startObserver(); }).catch((e) => { toast.error("获取更多列表数据出错~"); debug.error("播单", e); }); } } function startObserver() { observer.observe(document.querySelector(".bilibili-player-playlist-item").parentElement.parentElement, { attributes: true }); } function formatMore(obj) { var _a3; const result = obj.data.media_list.reduce((s, d) => { s.push({ ao: d.rights && d.rights.pay, Sz: d.upper && d.upper.face, Te: d.pages.reduce((s2, f) => { var _a4, _b, _c; s2.push({ Da: (_a4 = d.bangumi) == null ? void 0 : _a4.ep_id, Fb: (_c = (_b = d.bangumi) == null ? void 0 : _b.season) == null ? void 0 : _c.season_id, aid: d.id, duration: f.duration, from: f.from, j: f.id, ni: f.title, page: f.page }); return s2; }, []), Tz: d.upper && d.upper.mid, aid: d.id, duration: d.duration, ko: d.upper && d.upper.name, lb: d.cover, state: 0, title: d.title }); return s; }, []); list(obj); has_more ? (_a3 = window.player) == null ? void 0 : _a3.updatePlaylist(result) : videoFloat("没有更多了!"); } jsonphookasync("toview", void 0, async (url) => { replaceUrl(path.join("/")); try { if (isPl || pl === 182603655) { toast.warning("原生playlist页面已无法访问,已重定向到备份的pl769~"); } else { toview_default.list = []; const rqs = await Promise.all([ xhr.get(\`https://api.bilibili.com/x/v1/medialist/info?type=\${type}&biz_id=\${pl}&tid=0\`, { responseType: "json" }), xhr.get(\`https://api.bilibili.com/x/v2/medialist/resource/list?type=\${type}&oid=\${oid}&otype=2&biz_id=\${pl}&bvid=&with_current=true&mobi_app=web&ps=20&direction=false&sort_field=1&tid=0&desc=true\`, { responseType: "json" }) ]); info(rqs[0]); list(rqs[1]); } return { code: 0, data: toview_default, message: "0", ttl: 1 }; } catch (e) { toast.error("获取medialist数据失败!请刷新页面或者在设置中关闭重构“medialist”选项"); throw e; } }); switchVideo(() => { if (has_more) { doWhile(() => document.querySelector(".bilibili-player-playlist-item"), () => startObserver()); } }); appendScripts(script_default4).then(loadEvent); setting.enlike && new enLike(); primaryMenu(); banner(); loadByDmId(); setting.automate.electric && jsonphookasync("api.bilibili.com/x/web-interface/elec/show", void 0, async () => { return { code: -404 }; }, false); globalVector(); } // src/content/ranking/script.html var script_default5 = '<script type="text/javascript" src="//static.hdslb.com/js/jquery.min.js"><\\/script>\\r\\n<script type="text/javascript" src="//s1.hdslb.com/bfs/seed/jinkela/header/header.js"><\\/script>\\r\\n<script type="text/javascript" src="//s1.hdslb.com/bfs/cm/st/bundle.js" crossorigin=""><\\/script>\\r\\n<script src="//s1.hdslb.com/bfs/static/jinkela/rank/1.rank.ba58f8684a87651e0e1c576df8f918bfa10c1a90.js"><\\/script>\\r\\n<script src="//s1.hdslb.com/bfs/static/jinkela/rank/rank.ba58f8684a87651e0e1c576df8f918bfa10c1a90.js"><\\/script>\\r\\n<script type="text/javascript" src="//static.hdslb.com/common/js/footer.js"><\\/script>'; // src/content/ranking/ranking.html var ranking_default = '<!-- <!DOCTYPE html> -->\\r\\n<html lang="zh-CN">\\r\\n\\r\\n<head>\\r\\n <title>热门视频排行榜 - 哔哩哔哩 (゜-゜)つロ 干杯~-bilibili</title>\\r\\n <meta charset="utf-8" />\\r\\n <meta http-equiv="X-UA-Compatible" content="IE=edge" />\\r\\n <meta name="renderer" content="webkit" />\\r\\n <meta name="description" content="bilibili是国内知名的视频弹幕网站,这里有最及时的动漫新番,最棒的ACG氛围,最有创意的Up主。大家可以在这里找到许多欢乐。" />\\r\\n <meta name="keywords" content="B站,弹幕,字幕,AMV,MAD,MTV,ANIME,动漫,动漫音乐,游戏,游戏解说,ACG,galgame,动画,番组,新番,初音,洛天依,vocaloid" />\\r\\n <link rel="stylesheet"\\r\\n href="//s1.hdslb.com/bfs/static/jinkela/rank/css/rank.0.ba58f8684a87651e0e1c576df8f918bfa10c1a90.css" />\\r\\n <style type="text/css">\\r\\n .gg-floor-module {\\r\\n display: none;\\r\\n }\\r\\n </style>\\r\\n</head>\\r\\n\\r\\n<body>\\r\\n <div class="z-top-container has-menu"></div>\\r\\n <div id="rank-app"></div>\\r\\n <div class="footer bili-footer report-wrap-module"></div>\\r\\n</body>\\r\\n\\r\\n</html>'; // src/content/ranking/code.ts function rankingPage() { keepNewCheck(); const title = document.title; document.documentElement.replaceWith(createElements(htmlVnode(ranking_default))); title && !title.includes("404") && (document.title = title); replaceUrl(/ranking/.test(document.referrer) ? document.referrer : "https://www.bilibili.com/ranking"); jsonphook(["api.bilibili.com/x/web-interface/ranking", "arc_type=0"], (d) => d.replace(/day=\\d+/, "day=3"), void 0, false); Reflect.defineProperty(window, "__INITIAL_STATE__", { configurable: true, value: void 0 }); appendScripts(script_default5).then(loadEvent); addCss("@media screen and (min-width: 1400px){.main-inner {width: 1160px !important;}}"); primaryMenu(); banner(); globalVector(); } // src/content/read/script.html var script_default6 = '<script src="//static.hdslb.com/public/intersection-observer.js"><\\/script>\\r\\n<script src="//static.hdslb.com/public/timing.min.js"><\\/script>\\r\\n<script src="//static.hdslb.com/js/jquery.min.js"><\\/script>\\r\\n<script type="text/javascript" src="//s1.hdslb.com/bfs/seed/jinkela/commentpc/comment.min.js"><\\/script>\\r\\n<script type="text/javascript" charset="utf-8" src="//s1.hdslb.com/bfs/seed/jinkela/header/header.js"><\\/script>\\r\\n<script type="text/javascript" charset="utf-8" src="//static.hdslb.com/common/js/footer.js"><\\/script>\\r\\n<script src="//s1.hdslb.com/bfs/static/biliapp/biliapp.js"><\\/script>\\r\\n<script type="text/javascript"\\r\\n src="//s1.hdslb.com/bfs/static/jinkela/article/manifest.e5d43b1ea4f5a12408d8cd222049b34cfacd107c.js"><\\/script>\\r\\n<script type="text/javascript"\\r\\n src="//s1.hdslb.com/bfs/static/jinkela/article/vendor.e5d43b1ea4f5a12408d8cd222049b34cfacd107c.js"><\\/script>\\r\\n<script type="text/javascript"\\r\\n src="//s1.hdslb.com/bfs/static/jinkela/article/pcDetail.e5d43b1ea4f5a12408d8cd222049b34cfacd107c.js"><\\/script>'; // src/content/read/read.html var read_default = '<!-- <!DOCTYPE html> -->\\r\\n<html lang="zh-CN">\\r\\n\\r\\n<head itemprop="Article" itemscope="itemscope" itemtype="http://schema.org/Article">\\r\\n <meta charset="UTF-8" />\\r\\n <meta data-n-head="true" name="viewport" content="width=device-width,initial-scale=1,user-scalable=0" />\\r\\n <meta name="theme-color" content="#de698c" />\\r\\n <meta http="Cache-Control" content="no-transform" />\\r\\n <meta name="format-detection" content="telephone=no" />\\r\\n <meta name="applicable-device" content="pc" />\\r\\n <link rel="apple-touch-icon-precomposed" href="//static.hdslb.com/mobile/img/512.png" />\\r\\n <link rel="icon" type="image/vnd.microsoft.icon" href="//www.bilibili.com/favicon.ico" />\\r\\n <link rel="apple-touch-icon" href="//www.bilibili.com/favicon.ico" />\\r\\n <meta name="renderer" content="webkit" />\\r\\n <link data-n-head="true" rel="icon" type="image/x-icon" href="//www.bilibili.com/favicon.ico" />\\r\\n <link data-n-head="true" rel="apple-touch-icon-precomposed" type="image/x-icon"\\r\\n href="//static.hdslb.com/mobile/img/512.png" />\\r\\n <title>哔哩哔哩专栏</title>\\r\\n <link href="//s1.hdslb.com/bfs/static/jinkela/article/pcDetail.e5d43b1ea4f5a12408d8cd222049b34cfacd107c.css"\\r\\n rel="stylesheet" />\\r\\n <style type="text/css">\\r\\n .nav-tab-bar .tab-item[data-tab-id="41"]:before {\\r\\n background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAMAAABF0y+mAAAA6lBMVEUAAAAiIiIkJCT///8jIyMiIiIiIiIiIiJVVVUjIyMjIyMlJSU0NDT9/f0iIiIoKCjz8/NCQkIjIyMjIyMrKysiIiJFRUWQkJAiIiIlJSUjIyMkJCQzMzNAQEDv7+/7+/tHR0ciIiIlJSUjIyNKSkp7e3tcXFxoaGgjIyMjIyMkJCT8/PxDQ0MnJyf39/fx8fHn5+cvLy/i4uLe3t7R0dHAwMA0NDQjIyOtra06Ojo+Pj4iIiJAQEBOTk5VVVVwcHBtbW1hYWEjIyMjIyMjIyMiIiIiIiIlJSUpKSkkJCT///95eXltbW1zc3PUVbhEAAAASnRSTlMAf4H+6NOdaAOnQRQF/asO/vTs5NnXxcO6NzMaCgT++fLv3s7GwMC/v6Fi+vr59PDn5ePh2dHOzMrKyMjGw8C/v7+1sZeVUikfHAMz54kAAAEUSURBVCjPldLXboMwFIDhQ7DNDBA2JGmTNLt7772d9v1fp5hSjEOkqP+lP/lIlg+sTVcaRV1gKXE/mLWBZWqYSEUMjfjsYv/4Hr0zxJYKlYxgItOsaMpmItHwA82TkQGgEMG2JrTITwGkRsXs80f6F/oU0b4el3YaQI585l1pm/6bgHZ/Ry7tcgYCaoetjcKaV1ZXwGSwvSi0efNsgoAvI0oXLYc9MXwyQcTBSXb83XOoPIw7AGlawQ8ks4FfPWc47fyec5yHmTHddZmJqEU57t16baghOqL0IArdVxvq6I3GvqvN2bU6JkRK+Odx5P0LFbIaicLWBKurTPX0/IEWV24WBpaJEWksRbBmlkstLaXosK4fYdYsW/LHMigAAAAASUVORK5CYII=);\\r\\n }\\r\\n </style>\\r\\n</head>\\r\\n\\r\\n<body>\\r\\n <div class="z-top-container report-wrap-module"></div>\\r\\n <div class="page-container"></div>\\r\\n <div class="footer bili-footer report-wrap-module" id="home_footer"></div>\\r\\n</body>\\r\\n\\r\\n</html>'; // src/runtime/rightCopy.ts function rightCopyEnable() { addCss(\`* { -webkit-user-select: text !important; -moz-user-select: text !important; -ms-user-select: text !important; user-select: text !important; }\`); [].forEach.call(["contextmenu", "copy", "cut", "paste", "mouseup", "mousedown", "keyup", "keydown", "drag", "dragstart", "select", "selectstart"], function(event) { document.addEventListener(event, function(e) { e.stopPropagation(); }, true); }); } // src/content/read/code.ts function readPage() { keepNewCheck(2); const title = document.title; document.documentElement.replaceWith(createElements(htmlVnode(read_default))); title && !title.includes("404") && (document.title = title); loadComment(); xhr.get(location.href).then((data) => { data = data.includes("__INITIAL_STATE__=") ? JSON.parse(data.match(/INITIAL_STATE__=.+?\\;\\(function/)[0].replace(/INITIAL_STATE__=/, "").replace(/;\\(function/, "")) : ""; if (!data) throw toast.error("获取专栏数据失败 ಥ_ಥ"); const bar = [ [0, "推荐", "home"], [2, "动画", "douga"], [1, "游戏", "game"], [28, "影视", "cinephile"], [3, "生活", "life"], [29, "兴趣", "interest"], [16, "轻小说", "lightnovel"], [17, "科技", "technology"], [41, "笔记", "note"] ]; let temp2 = bar.reduce((o, d) => { o = o + \`<a href="//www.bilibili.com/read/\${d[2]}?from=articleDetail" target="_self" class="tab-item\${data.readInfo.category.parent_id == d[0] ? " on" : ""}" data-tab-id="\${d[0]}"><span>\${d[1]}</span></a>\`; return o; }, \`<div class="nav-tab-bar"><a href="https://www.bilibili.com/read/home?from=articleDetail" target="_self" class="logo"></a>\`) + "</div>"; temp2 += \`<div class="up-info-holder"><div class="fixed-box"><div class="up-info-block"> <a class="up-face-holder" href="//space.bilibili.com/\${data.readInfo.author.mid}" target="_blank"><img class="up-face-image" data-face-src="\${data.readInfo.author.face.replace("http:", "")}" src="//static.hdslb.com/images/member/noface.gif" /></a><div class="up-info-right-block"><div class="row"> <a class="up-name" href="//space.bilibili.com/\${data.readInfo.author.mid}" target="_blank">\${data.readInfo.author.name}</a> <span class="level"></span><div class="nameplate-holder"><i class="nameplate"></i></div></div><div class="row-2">粉丝: <span class="fans-num"></span> <span class="view">阅读:</span> <span class="view-num"></span></div></div></div><div class="follow-btn-holder"><span class="follow-btn">关注</span></div><div class="up-article-list-block hidden"><div class="block-title">推荐文章</div><ul class="article-list"></ul></div><div class="more"><div class="top-bar"><label>更多</label></div><a class="ac-link" href="//www.bilibili.com/read/apply/" target="_blank"><div class="link"><span class="icon"></span><p class="title">成为创作者</p><p class="info">申请成为专栏UP主</p></div></a> <a href="//www.bilibili.com/blackboard/help.html#%C3%A4%C2%B8%C2%93%C3%A6%C2%A0%C2%8F%C3%A7%C2%9B%C2%B8%C3%A5%C2%85%C2%B3" target="_blank"><div class="help"><span class="icon"></span><p class="title">专栏帮助</p><p class="info">查看专栏使用说明</p></div></a></div></div> </div><div class="right-side-bar"><div class="to-comment"><div class="comment-num-holder"><span class="comment-num"></span></div></div><div class="to-top"></div></div>\`; temp2 += \`<div class="head-container"><div class="banner-img-holder"></div><div class="bangumi-rating-container"></div><div class="argue-flag hidden"></div><div class="title-container"> <h1 class="title">\${data.readInfo.title}</h1><div class="info"> <a class="category-link" href="//www.bilibili.com/read/\${bar.find((d) => { if (d[0] == data.readInfo.category.parent_id) return d; })[2]}#rid=\${data.readInfo.category.id}" target="_blank"><span>\${data.readInfo.category.name}</span></a> <span class="create-time" data-ts="\${data.readInfo.ctime}"></span><div class="article-data"></div> </div></div><div style="display:none" class="author-container"> <a class="author-face" href="//space.bilibili.com/\${data.readInfo.author.mid}" target="_blank"><img data-face-src="\${data.readInfo.author.face.replace("http:", "")}" src="\${data.readInfo.author.face.replace("http:", "")}" class="author-face-img" /></a> <a class="author-name" href="//space.bilibili.com/\${data.readInfo.author.mid}" target="_blank">\${data.readInfo.author.name}</a><div class="attention-btn slim-border">关注</div></div></div>\`; temp2 += \`<div class="article-holder">\${data.readInfo.content}</div><p class="original">本文为我原创</p>\`; temp2 += (data.readInfo.tags || []).reduce((o, d) => { o = o + \`<li data-tag-id="\${d.tid}" class="tag-item"><span class="tag-border"><span class="tag-border-inner"></span></span> <span class="tag-content">\${d.name}</span></li>\`; return o; }, \`<ul class="tag-container">\`) + \`</ul><div class="article-action"><div class="ops"><span class="like-btn"><i class="icon-video-details_like"></i> <span>--</span></span> <span class="coin-btn"><i class="icon-video-details_throw-coin"></i> <span>--</span></span> <span class="fav-btn"><i class="icon-video-details_collection"></i> <span>--</span></span> <span class="share-container share-btn">分享到:<span></span></span></div><div class="more"><!-- <i class="icon-general_more-actions"></i> --><div class="more-ops-list"><ul><li value="0">投诉或建议</li></ul></div></div></div><div class="article-list-holder-block"></div><div class="draft-holder-block"></div><div class="b-head comment-title-block"><span class="b-head-t comment-results" style="display: inline;"></span> <span class="b-head-t">评论</span></div><div class="comment-holder"></div>\`; window.original = { cvid: data.cvid, author: { name: data.readInfo.author.name, mid: data.readInfo.author.mid }, banner_url: data.readInfo.banner_url || data.readInfo && data.readInfo.image_urls[0] || null, reprint: data.readInfo.reprint, summary: data.readInfo.summary, media: "", actId: data.readInfo.act_id, dispute: { dispute: "", dispute_url: "" }, spoiler: "0" }; document.querySelector(".page-container").innerHTML = temp2; appendScripts(script_default6).then(loadEvent); rightCopyEnable(); }).catch((e) => { debug.error(e); }); globalVector(); } // src/content/search/script.html var script_default7 = '<script type="text/javascript"\\r\\n src="//www.bilibili.com/gentleman/polyfill.js?features=Promise%2CObject.assign%2CString.prototype.includes%2CNumber.isNaN"><\\/script>\\r\\n<script type="text/javascript" src="//static.hdslb.com/js/jquery.min.js"><\\/script>\\r\\n<script type="text/javascript" src="//s1.hdslb.com/bfs/static/jinkela/long/js/sentry/sentry-5.7.1.min.js"><\\/script>\\r\\n<script type="text/javascript" src="//s1.hdslb.com/bfs/static/jinkela/long/js/sentry/sentry-5.7.1.vue.min.js"><\\/script>\\r\\n<script type="text/javascript" src="//s1.hdslb.com/bfs/seed/jinkela/header/header.js"><\\/script>\\r\\n<script src="//s1.hdslb.com/bfs/static/jinkela/search/1.search.1dc4c70682c12d4daaa90c2114effa0a7cbca11a.js"><\\/script>\\r\\n<script src="//s1.hdslb.com/bfs/static/jinkela/search/search.1dc4c70682c12d4daaa90c2114effa0a7cbca11a.js"><\\/script>'; // src/content/search/search.html var search_default = '<!-- <!DOCTYPE html> -->\\r\\n<html lang="zh-CN">\\r\\n\\r\\n<head>\\r\\n <title data-vue-meta="true"> _ 搜索结果_哔哩哔哩_Bilibili</title>\\r\\n <meta data-vue-meta="true" charset="UTF-8">\\r\\n <meta data-vue-meta="true" http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">\\r\\n <meta data-vue-meta="true" name="renderer" content="webkit|ie-comp|ie-stand">\\r\\n <meta data-vue-meta="true" name="description"\\r\\n content="点击查看更多相关视频、番剧、影视、直播、专栏、话题、用户等内容;你感兴趣的视频都在B站,bilibili是国内知名的视频弹幕网站,这里有及时的动漫新番,活跃的ACG氛围,有创意的Up主。大家可以在这里找到许多欢乐。">\\r\\n <meta data-vue-meta="true" name="keywords"\\r\\n content="B站,弹幕,字幕,AMV,MAD,MTV,ANIME,动漫,动漫音乐,游戏,游戏解说,ACG,galgame,动画,番组,新番,初音,洛天依,vocaloid">\\r\\n <meta data-vue-meta="true" charset="UTF-8">\\r\\n <meta name="referrer" content="no-referrer-when-downgrade">\\r\\n <link rel="dns-prefetch" href="//s1.hdslb.com">\\r\\n <link rel="dns-prefetch" href="//i0.hdslb.com">\\r\\n <link rel="dns-prefetch" href="//i1.hdslb.com">\\r\\n <link rel="dns-prefetch" href="//i2.hdslb.com">\\r\\n <link rel="dns-prefetch" href="//static.hdslb.com">\\r\\n <link rel="shortcut icon" href="//static.hdslb.com/images/favicon.ico">\\r\\n <link rel="stylesheet"\\r\\n href="//s1.hdslb.com/bfs/static/jinkela/search/css/search.1.1dc4c70682c12d4daaa90c2114effa0a7cbca11a.css">\\r\\n <link rel="stylesheet"\\r\\n href="//s1.hdslb.com/bfs/static/jinkela/search/css/search.0.1dc4c70682c12d4daaa90c2114effa0a7cbca11a.css">\\r\\n</head>\\r\\n\\r\\n<body id="bili-search">\\r\\n <div class="z-top-container"></div>\\r\\n <div id="search-app"></div>\\r\\n <!-- built files will be auto injected -->\\r\\n <div class="footer bili-footer report-wrap-module"></div>\\r\\n</body>\\r\\n\\r\\n</html>'; // src/content/search/code.ts function searchPage() { keepNewCheck(); const title = document.title; document.documentElement.replaceWith(createElements(htmlVnode(search_default))); title && !title.includes("404") && (document.title = title); doWhile(() => location.href.endsWith("all"), () => { replaceUrl(location.origin); }, 10, 30); Reflect.defineProperty(window, "__INITIAL_STATE__", { configurable: true, value: void 0 }); appendScripts(script_default7).then(loadEvent); globalVector(); } // src/content/watchlater/script.html var script_default8 = '<script type="text/javascript" src="//static.hdslb.com/js/jquery.min.js"><\\/script>\\r\\n<script type="text/javascript" src="//static.hdslb.com/js/jquery.qrcode.min.js"><\\/script>\\r\\n<script type="text/javascript" src="//s1.hdslb.com/bfs/seed/jinkela/commentpc/comment.min.js"><\\/script>\\r\\n<script type="text/javascript" src="//s1.hdslb.com/bfs/seed/jinkela/header/header.js"><\\/script>\\r\\n<script type="text/javascript" src="//static.hdslb.com/common/js/footer.js"><\\/script>\\r\\n<script type="text/javascript" src="//static.hdslb.com/js/swfobject.js"><\\/script>\\r\\n<script type="text/javascript" src="//static.hdslb.com/account/bili_quick_login.js"><\\/script>\\r\\n<script type="text/javascript" src="//static.hdslb.com/mstation/js/upload/moxie.js"><\\/script>\\r\\n<script type="text/javascript" src="//static.hdslb.com/mstation/js/upload/plupload.js"><\\/script>\\r\\n<script type="text/javascript" src="//static.hdslb.com/elec_2/dist/js/later_elec.js"><\\/script>\\r\\n<script type="text/javascript"\\r\\n src="//s1.hdslb.com/bfs/static/phoenix/viewlater/static/js/main.2111469a1bbc20e2e885.js"><\\/script>'; // src/content/watchlater/watchlater.html var watchlater_default = '<!-- <!DOCTYPE html> -->\\r\\n<html lang="zh-CN">\\r\\n\\r\\n<head>\\r\\n <meta charset="utf-8" />\\r\\n <title>哔哩哔哩 (゜-゜)つロ 干杯~-bilibili</title>\\r\\n <meta name="description" content="bilibili是国内知名的视频弹幕网站,这里有最及时的动漫新番,最棒的ACG氛围,最有创意的Up主。大家可以在这里找到许多欢乐。" />\\r\\n <meta name="keywords" content="B站,弹幕,字幕,AMV,MAD,MTV,ANIME,动漫,动漫音乐,游戏,游戏解说,ACG,galgame,动画,番组,新番,初音,洛天依,vocaloid" />\\r\\n <meta name="renderer" content="webkit" />\\r\\n <meta http-equiv="X-UA-Compatible" content="IE=edge" />\\r\\n <link rel="shortcut icon" href="//static.hdslb.com/images/favicon.ico" />\\r\\n <link rel="search" type="application/opensearchdescription+xml" href="//static.hdslb.com/opensearch.xml"\\r\\n title="哔哩哔哩" />\\r\\n <link rel="stylesheet" href="//static.hdslb.com/elec_2/dist/css/later_elec.css" type="text/css" />\\r\\n <link rel="stylesheet" href="//static.hdslb.com/tag/css/tag-index2.0.css" type="text/css" />\\r\\n <link href="//s1.hdslb.com/bfs/static/phoenix/viewlater/static/css/main.d9641d2f4dc42228ea8c2650e1b98b0b.css"\\r\\n rel="stylesheet" />\\r\\n <style type="text/css">\\r\\n #bofqi .player {\\r\\n width: 980px;\\r\\n height: 620px;\\r\\n display: block;\\r\\n }\\r\\n\\r\\n @media screen and (min-width:1400px) {\\r\\n #bofqi .player {\\r\\n width: 1160px;\\r\\n height: 720px\\r\\n }\\r\\n }\\r\\n\\r\\n /* 修正稍后再看迷你播放器样式 */\\r\\n .bilibili-player .bilibili-player-area .bilibili-player-video-wrap.mini-player .bilibili-player-video-danmaku {\\r\\n top: 30px;\\r\\n height: 240px;\\r\\n }\\r\\n </style>\\r\\n</head>\\r\\n\\r\\n<body>\\r\\n <div class="z-top-container has-menu"></div>\\r\\n <div id="viewlater-app">\\r\\n <app></app>\\r\\n </div>\\r\\n <div class="footer bili-footer"></div>\\r\\n</body>\\r\\n\\r\\n</html>'; // src/content/watchlater/code.ts function watchlaterPage() { keepNewCheck(); const title = document.title; document.documentElement.replaceWith(createElements(htmlVnode(watchlater_default))); title && !title.includes("404") && (document.title = title); loadVideoScript(); loadComment(); xhrhook("api.live.bilibili.com/bili/living_v2/", void 0, (r) => { r.response = r.responseText = \` \${r.response}\`; }, false); appendScripts(script_default8).then(loadEvent); window.commentAgent = { seek: (t) => window.player && window.player.seek(t) }; setting.enlike && new enLike("watchlater"); primaryMenu(); banner(); loadByDmId(); globalVector(); } // src/images/svg/wrench.svg var wrench_default = '<svg viewBox="0 0 24 24"><g><path d="M22.7 19l-9.1-9.1c.9-2.3.4-5-1.5-6.9-2-2-5-2.4-7.4-1.3L9 6 6 9 1.6 4.7C.4 7.1.9 10.1 2.9 12.1c1.9 1.9 4.6 2.4 6.9 1.5l9.1 9.1c.4.4 1 .4 1.4 0l2.3-2.3c.5-.4.5-1.1.1-1.4z"></path></g></svg>'; // src/images/svg/note.svg var note_default = '<svg viewBox="0 0 24 24"><g><path d="M19 3h-4.18C14.4 1.84 13.3 1 12 1c-1.3 0-2.4.84-2.82 2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-7 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm2 14H7v-2h7v2zm3-4H7v-2h10v2zm0-4H7V7h10v2z"></path></g></svg>'; // src/images/svg/dmset.svg var dmset_default = '<svg viewBox="0 0 22 22"><path d="M16.5 8c1.289 0 2.49.375 3.5 1.022V6a2 2 0 00-2-2H4a2 2 0 00-2 2v10a2 2 0 002 2h7.022A6.5 6.5 0 0116.5 8zM7 13H5a1 1 0 010-2h2a1 1 0 010 2zm2-4H5a1 1 0 010-2h4a1 1 0 010 2z"></path><path d="M20.587 13.696l-.787-.131a3.503 3.503 0 00-.593-1.051l.301-.804a.46.46 0 00-.21-.56l-1.005-.581a.52.52 0 00-.656.113l-.499.607a3.53 3.53 0 00-1.276 0l-.499-.607a.52.52 0 00-.656-.113l-1.005.581a.46.46 0 00-.21.56l.301.804c-.254.31-.456.665-.593 1.051l-.787.131a.48.48 0 00-.413.465v1.209a.48.48 0 00.413.465l.811.135c.144.382.353.733.614 1.038l-.292.78a.46.46 0 00.21.56l1.005.581a.52.52 0 00.656-.113l.515-.626a3.549 3.549 0 001.136 0l.515.626a.52.52 0 00.656.113l1.005-.581a.46.46 0 00.21-.56l-.292-.78c.261-.305.47-.656.614-1.038l.811-.135A.48.48 0 0021 15.37v-1.209a.48.48 0 00-.413-.465zM16.5 16.057a1.29 1.29 0 11.002-2.582 1.29 1.29 0 01-.002 2.582z"></path></svg>'; // src/images/svg/stethoscope.svg var stethoscope_default = '<svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M5 3.25a.75.75 0 11-1.5 0 .75.75 0 011.5 0zm0 2.122a2.25 2.25 0 10-1.5 0v.878A2.25 2.25 0 005.75 8.5h1.5v2.128a2.251 2.251 0 101.5 0V8.5h1.5a2.25 2.25 0 002.25-2.25v-.878a2.25 2.25 0 10-1.5 0v.878a.75.75 0 01-.75.75h-4.5A.75.75 0 015 6.25v-.878zm3.75 7.378a.75.75 0 11-1.5 0 .75.75 0 011.5 0zm3-8.75a.75.75 0 100-1.5.75.75 0 000 1.5z"></path></svg>'; // src/images/svg/play.svg var play_default = '<svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M1.5 8a6.5 6.5 0 1113 0 6.5 6.5 0 01-13 0zM8 0a8 8 0 100 16A8 8 0 008 0zM6.379 5.227A.25.25 0 006 5.442v5.117a.25.25 0 00.379.214l4.264-2.559a.25.25 0 000-.428L6.379 5.227z"></path></svg>'; // src/images/svg/palette.svg var palette_default = '<svg viewBox="0 0 24 24"><g><path d="M12 3c-4.97 0-9 4.03-9 9s4.03 9 9 9c.83 0 1.5-.67 1.5-1.5 0-.39-.15-.74-.39-1.01-.23-.26-.38-.61-.38-.99 0-.83.67-1.5 1.5-1.5H16c2.76 0 5-2.24 5-5 0-4.42-4.03-8-9-8zm-5.5 9c-.83 0-1.5-.67-1.5-1.5S5.67 9 6.5 9 8 9.67 8 10.5 7.33 12 6.5 12zm3-4C8.67 8 8 7.33 8 6.5S8.67 5 9.5 5s1.5.67 1.5 1.5S10.33 8 9.5 8zm5 0c-.83 0-1.5-.67-1.5-1.5S13.67 5 14.5 5s1.5.67 1.5 1.5S15.33 8 14.5 8zm3 4c-.83 0-1.5-.67-1.5-1.5S16.67 9 17.5 9s1.5.67 1.5 1.5-.67 1.5-1.5 1.5z"></path></g></svg>'; // src/images/svg/bioscope.svg var bioscope_default = '<svg viewBox="0 0 1024 1024"><path d="M392.448 275.911111a92.416 92.416 0 1 1-184.832 0 92.416 92.416 0 0 1 184.832 0"></path><path d="M826.624 464.583111l-63.744 36.864v-48.64a72.206222 72.206222 0 0 0-71.68-71.936H190.72a72.192 72.192 0 0 0-71.936 71.936V748.231111a71.936 71.936 0 0 0 71.936 71.936H691.2a71.936 71.936 0 0 0 71.936-71.936v-23.808l63.488 37.888a51.2 51.2 0 0 0 76.8-44.544V508.871111a51.2 51.2 0 0 0-76.8-44.288M572.928 369.351111c79.459556 0.142222 143.985778-64.156444 144.128-143.616 0.142222-79.459556-64.156444-143.985778-143.616-144.128-79.260444-0.142222-143.701333 63.857778-144.128 143.104-0.426667 79.459556 63.644444 144.213333 143.104 144.64h0.512"></path><path d="M425.216 512.967111l124.16 71.936a25.6 25.6 0 0 1 0 42.496l-124.16 71.68a25.6 25.6 0 0 1-37.12-21.248V534.471111a25.6 25.6 0 0 1 37.12-21.504"></path></svg>'; // src/images/svg/download.svg var download_default = '<svg viewBox="0 0 24 24"><g><path d="M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z"></path></g></svg>'; // src/runtime/chrome/menu.ts var menu = [ { key: "common", value: "通用", svg: wrench_default }, { key: "rewrite", value: "重构", svg: note_default }, { key: "danmaku", value: "弹幕", svg: dmset_default }, { key: "restore", value: "修复", svg: stethoscope_default }, { key: "player", value: "播放", svg: play_default }, { key: "style", value: "样式", svg: palette_default }, { key: "live", value: "直播", svg: bioscope_default }, { key: "download", value: "下载", svg: download_default } ]; // src/images/svg/linechart.svg var linechart_default = '<svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M1.5 1.75a.75.75 0 00-1.5 0v12.5c0 .414.336.75.75.75h14.5a.75.75 0 000-1.5H1.5V1.75zm14.28 2.53a.75.75 0 00-1.06-1.06L10 7.94 7.53 5.47a.75.75 0 00-1.06 0L3.22 8.72a.75.75 0 001.06 1.06L7 7.06l2.47 2.47a.75.75 0 001.06 0l5.25-5.25z"></path></svg>'; // src/images/svg/blind.svg var blind_default = '<svg viewBox="0 0 24 24"><g><path d="M3 17v2h6v-2H3zM3 5v2h10V5H3zm10 16v-2h8v-2h-8v-2h-2v6h2zM7 9v2H3v2h4v2h2V9H7zm14 4v-2H11v2h10zm-6-4h2V7h4V5h-4V3h-2v6z"></path></g></svg>'; // src/images/svg/warn.svg var warn_default = '<svg viewBox="0 0 24 24"><g><path d="M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z"></path></g></svg>'; // src/runtime/chrome/manage.ts var settingMG = { restore() { if (isUserScript) { GM_deleteValue("config"); } else { chrome.storage.local.clear(); } toast.warning("已恢复默认数据,请及时刷新页面避免数据紊乱!"); showAlert(\`已恢复默认数据,请及时<strong>刷新</strong>页面避免数据紊乱!\`, "恢复默认设置", [ { name: "刷新页面", callback: () => location.reload() } ]); }, output() { if (isUserScript) { return saveAs(JSON.stringify(GM_getValue("config"), void 0, " "), \`Bilibili-Old-\${timeFormat(void 0, true)}.json\`, "application/json"); } chrome.storage.local.get((d) => { saveAs(JSON.stringify(d, void 0, " "), \`Bilibili-Old-\${timeFormat(void 0, true)}.json\`, "application/json"); }); }, input() { fileRead("application/json", true).then((d) => { d && d[0] && readAs(d[0]).then((d2) => { const data = JSON.parse(d2); if (typeof data === "object") { isUserScript ? GM_setValue("config", data) : chrome.storage.local.set(data); showAlert(\`已恢复备份数据,请及时<strong>刷新</strong>页面避免数据紊乱!\`, "恢复默认设置", [ { name: "刷新页面", callback: () => location.reload() } ]); } else { toast.warning("所选文件或许不是有效的设置数据!"); } }); }); } }; // src/runtime/chrome/cookie.ts async function chromeCookies(str = "") { return await chrome.cookies.getAll({ domain: str }); } function cookiesArr2Obj(cookies) { return cookies.reduce((s, d) => { s[d.name] = d.value; return s; }, {}); } // src/runtime/chrome/access_key.ts var AccessKey = class { setting = {}; constructor() { if (isUserScript) { if (!uid) { toast.warning("请先到B站网页端登录(不可用)!"); } else { this.setting = setting; let arr2 = []; if (this.setting.accessKey.key) { arr2 = [ { name: "刷新授权", callback: () => { this.get(); } }, { name: "撤销授权", callback: () => { this.remove(); } }, { name: "取消操作", callback: () => { } } ]; } else { arr2 = [ { name: "立即授权", callback: () => { this.get(); } }, { name: "取消操作", callback: () => { } } ]; } showAlert("【账户授权】表示您同意本扩展能以网页端以外的鉴权向B站官方服务器证明您的身份,以执行一些本来网页端无权进行的操作。如果【解除限制】中自定义了第三方解析服务器,请仔细斟酌第三方的可信度,<strong>如无必要,切莫授权!</strong>。", "账户授权", arr2); } } else { location.hash = "accessKey"; chromeCookies("bilibili.com").then((d) => { const uid2 = cookiesArr2Obj(d).DedeUserID; if (!uid2) { toast.warning("请先到B站网页端登录(不可用)!"); } else { this.setting = sessionStorage2.getItem("setting"); let arr2 = []; if (this.setting.accessKey.key) { arr2 = [ { name: "刷新授权", callback: () => { this.get(); } }, { name: "撤销授权", callback: () => { this.remove(); } }, { name: "取消操作", callback: () => { } } ]; } else { arr2 = [ { name: "立即授权", callback: () => { this.get(); } }, { name: "取消操作", callback: () => { } } ]; } showAlert("【账户授权】表示您同意本扩展能以网页端以外的鉴权向B站官方服务器证明您的身份,以执行一些本来网页端无权进行的操作。如果【解除限制】中自定义了第三方解析服务器,请仔细斟酌第三方的可信度,<strong>如无必要,切莫授权!</strong>。", "账户授权", arr2); } }); } } async get() { const msg = this.setting.accessKey.key ? toast.custom(0, "warning", "您正在更新账户授权!") : toast.custom(0, "info", "您正在进行账户授权操作!"); try { if (isUserScript) { let data = await GM.xhr({ url: urlsign("https://passport.bilibili.com/login/app/third?api=https%3A%2F%2Fwww.mcbbs.net%2Ftemplate%2Fmcbbs%2Fimage%2Fspecial_photo_bg.png", void 0, 3), responseType: "json" }); data = await new Promise((resolve, reject) => { GM_xmlhttpRequest({ method: "GET", url: data.data.confirm_uri, onload: (xhr2) => resolve(xhr2.finalUrl), onerror: (xhr2) => reject(xhr2) }); }); data = urlObj(data); setting.accessKey.key = data.access_key; setting.accessKey.date = timeFormat(new Date().getTime(), true); if (msg) { msg.type = "success"; msg.data = ["账户授权成功~"]; msg.delay = 3; } } else { let data = await fetch(urlsign("https://passport.bilibili.com/login/app/third?api=https%3A%2F%2Fwww.mcbbs.net%2Ftemplate%2Fmcbbs%2Fimage%2Fspecial_photo_bg.png", void 0, 3), { credentials: "include" }).then((d) => d.json()); const xhr2 = new XMLHttpRequest(); xhr2.open("GET", data.data.confirm_uri); xhr2.withCredentials = true; xhr2.addEventListener("load", async () => { const data2 = urlObj(xhr2.responseURL); this.setting.accessKey.key = data2.access_key; this.setting.accessKey.date = timeFormat(new Date().getTime(), true); if (msg) { msg.type = "success"; msg.data = ["账户授权成功~", "3秒后自动刷新页面!"]; msg.delay = 3; } chrome.storage.local.set({ setting: this.setting }); setTimeout(() => location.reload(), 3e3); }); xhr2.addEventListener("error", (e) => { if (msg) { msg.type = "success"; msg.data = ["账户授权出错 ಥ_ಥ", e]; msg.delay = 3; } }); xhr2.send(); } } catch (e) { if (msg) { msg.type = "error"; msg.data = ["账户授权出错 ಥ_ಥ", e]; msg.delay = 3; } debug.error("账户授权", e); isUserScript || chrome.storage.local.set({ setting: this.setting }); } } async remove() { if (!this.setting.accessKey.key) return; const msg = toast.custom(0, "info", "您正在撤销账户授权!"); this.setting.accessKey.key = ""; this.setting.accessKey.date = ""; if (msg) { msg.type = "success"; msg.data = ["撤销授权成功~", "3秒后自动刷新页面!"]; msg.delay = 3; } isUserScript || chrome.storage.local.set({ setting: this.setting }); setTimeout(() => location.reload(), 3e3); } }; // src/runtime/chrome/settings.ts var upos = Object.keys(UPOS); function showSetting(str) { window.postMessage({ \$type: "showSetting", data: str }); } var settingDefault = [ { key: "development", menu: "common", label: "开发者模式", svg: warn_default, sub: "暴露调试接口到控制台", type: "switch", value: false }, { key: "logReport", menu: "common", label: "日志拦截", svg: linechart_default, sub: "拦截B站日志上报", float: "网页端日志采集太频繁,稍微动下鼠标都要发送数条日志请求,给调试工作带来额外的困扰,所以一股脑都屏蔽了干净。<br>ps:APP端其实日志更多,只能说眼不见为净吧~", type: "switch", value: false }, { key: "toast", menu: "common", type: "list", name: "toastr", list: [ { key: "status", type: "switch", label: "开关", value: true, sub: '感谢 <a href="https://github.com/CodeSeven/toastr" target="_blank">toastr</a> 提供支持!' }, { key: "rtl", type: "switch", label: "镜像", sub: "左右翻转", value: false }, { key: "position", type: "select", label: "位置", value: "top-right", sub: "四角", candidate: ["top-right", "top-left", "bottom-right", "bottom-left"] }, { key: "delay", type: "slider", label: "时长", sub: "单位:/秒", value: 4, min: 1, max: 60, precision: 59 }, { key: "type", type: "select", label: "类型", sub: "测试限定", value: "warning", candidate: ["info", "success", "warning", "error"], styles: { info: "color: #2F96B4", success: "color: #51A351", warning: "color: #F89406", error: "color: #BD362F" } }, { key: "test", type: "input", label: "测试", sub: "请输入一句话~", candidate: ["Hello World!"], change: (v) => { setting.toast && toast[setting.toast.type](v); } } ] }, { key: "av", menu: "rewrite", label: "av/BV", type: "switch", value: true, sub: "旧版一般视频播放页面" }, { key: "videoLimit", menu: "player", type: "list", name: "解除区域/APP限制", list: [ { key: "switch", type: "switch", label: "开关", value: false }, { key: "server", type: "select", label: "服务器类型", sub: \`<a href="https://github.com/yujincheng08/BiliRoaming/wiki/%E5%85%AC%E5%85%B1%E8%A7%A3%E6%9E%90%E6%9C%8D%E5%8A%A1%E5%99%A8" target="_blank">公共反代服务器</a>\`, value: "内置", candidate: ["内置", "自定义"], float: \`如果选择自定义则需要填写下面的代理服务器,并且转到【账户授权】进行第三方服务器授权。内置服务器则支持以游客身份获取数据,但只能获取flv格式,且大会员画质还是需要授权。<br>※ 内置服务器不支持泰区。\`, callback: (v) => { if (v === "自定义") { if (!setting.accessKey.key) { showAlert("自定义服务器一般都要求您授权登录(不可用)才能使用,是否前往【账户授权】设置?", void 0, [ { name: "是", callback: () => { showSetting("accessKey"); } }, { name: "否", callback: () => { } } ]); } } } }, { key: "cn", type: "input", label: "大陆", sub: "大陆反代", props: { type: "url", placeholder: "www.example.com" }, float: "海外用户用来观看大陆限定视频的代理服务器。<br>※ <strong>启用【账户授权】意味着该服务器能获取您的部分账户权限,请自行确认服务器可靠性!</strong>" }, { key: "hk", type: "input", label: "香港", sub: "香港反代", props: { type: "url", placeholder: "www.example.com" }, float: "香港以外的用户用来观看香港澳门限定视频的代理服务器。<br>※ <strong>启用【账户授权】意味着该服务器能获取您的部分账户权限,请自行确认服务器可靠性!</strong>" }, { key: "tw", type: "input", label: "台湾", sub: "台湾反代", props: { type: "url", placeholder: "www.example.com" }, float: "台湾以外的用户用来观看台湾限定视频的代理服务器。<br>※ <strong>启用【账户授权】意味着该服务器能获取您的部分账户权限,请自行确认服务器可靠性!</strong>" }, { key: "th", type: "input", label: "泰国", sub: "泰国(东南亚)反代", props: { type: "url", placeholder: "www.example.com" }, float: "用来观看泰国(东南亚)限定视频的代理服务器。<br>※ <strong>启用【账户授权】意味着该服务器能获取您的部分账户权限,请自行确认服务器可靠性!</strong>" } ] }, { key: "uposReplace", menu: "player", type: "list", name: "替换UPOS服务器", list: [ { key: "nor", type: "select", label: "一般视频", sub: "不推荐", value: "不替换", float: \`对于一般视频应该充分相信B站分配给你的视频服务器就是最合适的,所以一般不推荐主动替换。\`, candidate: ["不替换"].concat(upos) }, { key: "gat", type: "select", label: "代理:港澳台或大陆", sub: "看情况", value: "不替换", float: \`解除港澳台限制获取到的视频服务器必定是海外的Akamai,在一些大陆网络中可能体验并不好,可以看情况指定其他服务器。港澳台(及海外)网络访问大陆服务器同理。<br>※ 替换后若出问题请禁用替换或者前往Github反馈。\`, candidate: ["不替换"].concat(upos) }, { key: "th", type: "select", label: "代理:泰区", sub: "必选", value: "ks3(金山)", float: \`泰区视频返回的服务器ban了大陆IP,所以必须进行替换!请根据自身网络情况选择。<br>※ 替换后若出问题前往Github反馈。\`, candidate: upos }, { key: "dl", type: "select", label: "下载", sub: "不推荐", value: "不替换", float: \`替换下载功能获取到的视频服务器,对于播放器已获取到的视频源,已经在上面的选项中处理过了。剩下的跟一般视频同理,不推荐替换。<br>※ 注意有【referer】【UserAgent】限制视频源,请在下载面板将【referer】置空,【UserAgent】设为有效值(默认值肯定有效!)\`, candidate: ["不替换"].concat(upos) } ] }, { key: "protobufDanmaku", menu: "danmaku", label: "启用新版弹幕", sub: "protobuf", type: "switch", value: true, float: \`为旧版播放器添加proto弹幕支持。由于旧版xml弹幕已获取不到90分钟后的弹幕,本功能不建议禁用。\` }, { key: "section", menu: "style", label: "统一换回旧版顶栏", sub: "针对未重构的页面", type: "switch", value: true, float: "非重构页面顶栏底栏也替换为旧版。" }, { key: "danmakuHashId", menu: "danmaku", label: "反查弹幕发送者", sub: "结果仅供参考!", type: "switch", value: false, float: "旧版播放器上右键弹幕将显示弹幕发送者。</br>※ 使用哈希逆向算法,存在碰撞可能性,所示信息仅供参考,或者干脆查不出来。" }, { key: "flash", menu: "player", label: "flash播放器", sub: "可用于临时不加载视频进入视频页面", float: "临时启用flash播放器以拦截播放器载入,如需下载视频可切换到“下载”标签呼出下载面板,恢复播放器请点击HTML5按钮或在设置中关闭本功能。", type: "switch", value: false }, { key: "enlike", menu: "player", label: "添加点赞功能", sub: "自制、简陋", type: "switch", value: false, float: "旧版播放器的时代点赞功能还未存在,本扩展代为设计了个丑丑的点赞功能。注意对于bangumi,点赞数据计算的是单P的。" }, { key: "upList", menu: "style", label: "UP主列表", sub: "展示合作者", type: "switch", value: false }, { key: "commandDm", menu: "danmaku", label: "添加互动弹幕", sub: "投票弹窗等", type: "switch", value: false, float: \`可以使用新版的一些弹窗互动组件。目前可用组件:评分弹窗、投屏弹窗、关联视频跳转按钮、带“UP主”标识弹幕。</br>※ <strong>需要同时开启新版proto弹幕。</strong>\` }, { key: "bangumi", menu: "rewrite", label: "bangumi", sub: "旧版Bangumi页面", type: "switch", value: true }, { type: "switch", key: "watchlater", label: "稍后再看", value: true, menu: "rewrite", sub: "旧版稍后再看页面" }, { type: "switch", key: "player", label: "嵌入", value: true, menu: "rewrite", sub: "旧版嵌入式播放器" }, { type: "switch", key: "index", label: "主页", value: true, menu: "rewrite", sub: "旧版主页" }, { type: "switch", key: "ranking", label: "排行榜", value: true, menu: "rewrite", sub: "旧版全站排行榜" }, { type: "switch", key: "read", label: "专栏", value: true, menu: "rewrite", sub: "旧版专栏页面" }, { key: "playlist", menu: "rewrite", label: "medialist", sub: "旧版播单相关页面", type: "switch", value: true, float: "使用旧版播单页面重构medialist相关页面,初始状态视频数据为20,可以滚送到播单底部以动态加载更多。另外由于播单已被官方禁用,您无法对播单进行收藏等操作,也不能访问播单详情页面。" }, { key: "automate", menu: "player", type: "list", name: "自动化操作", list: [ { key: "danmakuFirst", label: "自动展开弹幕列表", float: "自动从推荐视频切换到播放弹幕列表。", type: "switch", value: false }, { key: "showBofqi", label: "自动滚动到播放器", type: "switch", value: false }, { key: "screenWide", label: "自动宽屏", type: "switch", value: false, callback: (v) => { if (v) { setting.automate.webFullScreen = false; chrome.storage.local.set({ setting }); } } }, { key: "noDanmaku", label: "自动关弹幕", type: "switch", value: false }, { key: "autoPlay", label: "自动播放", type: "switch", value: false }, { key: "webFullScreen", label: "自动网页全屏", type: "switch", value: false, callback: (v) => { if (v) { setting.automate.screenWide = false; chrome.storage.local.set({ setting }); } } }, { key: "videospeed", label: "记忆播放速率", type: "switch", value: false }, { key: "electric", label: "跳过充电鸣谢", type: "switch", value: false } ] }, { key: "heartbeat", menu: "restore", label: "修复视频心跳", sub: "出现不记录播放历史症状时的选择", float: "尝试修复可能被广告拦截扩展误伤的视频心跳。", type: "switch", value: false }, { key: "bangumiEplist", menu: "player", label: "保留番剧回目列表", sub: "牺牲特殊背景图", type: "switch", value: false, float: "部分带特殊背景图片的番剧会隐藏播放器下方的番剧回目列表,二者不可得兼,只能选一。" }, { type: "switch", key: "history", label: "只显示视频历史", sub: "去除专栏、直播记录", value: false, menu: "style" }, { type: "switch", key: "searchHistory", label: "去除历史记录页面搜索框", sub: "其实留着也没什么", value: false, menu: "style" }, { type: "switch", key: "liveP2p", label: "禁止P2P上传", sub: "小水管禁不起别人白嫖!", value: true, menu: "live", float: "禁止直播间使用WebRTC进行P2P共享上传,以免暴露ip地址,并为小水管节约带宽。" }, { type: "switch", key: "sleepCheck", label: "禁止挂机检测", sub: "就喜欢挂后台听个响不行吗!", value: true, menu: "live", float: "禁止直播间5分钟不操作判定挂机并切断直播,可以放心挂后台听个响。" }, { type: "switch", key: "album", label: "还原个人空间相簿链接", sub: "相簿也是时泪啊", value: false, menu: "restore", float: "将个人空间的相簿链接从动态重定向回原来的相簿。" }, { type: "switch", key: "jointime", label: "显示账号注册(不可用)时间", sub: "历史不该被隐藏", value: false, menu: "restore", float: "在空间显示对应账号的注册(不可用)时间。" }, { key: "lostVideo", menu: "restore", label: "修复失效视频信息", sub: \`有些甚至评论还在!\`, type: "switch", value: false, float: "使用第三方数据修复收藏、频道等处的失效视频信息。(以红色删除线标记)</br>访问失效视频链接时将尝试重建av页面。" }, { type: "select", menu: "player", key: "codecType", label: "视频编码", sub: "AVC、HEVC或AV1", value: "AVC", candidate: ["AVC", "HEVC", "AV1"], float: "指定播放器优先加载的视频编码格式,可根据设备解码能力与实际需要调整这个设置项。<br>※ AVC:兼容性最好,文件体积较大<br>※ AV1:兼容性次之,文件体积较小<br>※ HEVC:兼容性最差,文件体积较小<br>压制效果要分视频讨论,在AVC大幅降低码率的今天,AV1或许可能是画质最好的选择,但一般都只能软解(考验硬件水平以及比硬解费电)。HEVC则除了Safari用户外不推荐考虑,令微软、谷歌都抛弃的版权流氓!", callback: (v) => { let mime = { "HEVC": 'video/mp4;codecs="hev1.1.6.L120.90"', "AV1": 'video/mp4;codecs="av01.0.01M.08.0.110.01.01.01.0"', "AVC": 'video/mp4;codecs="avc1.640028"' }; if (!MediaSource.isTypeSupported(mime[v])) { toast.warning(\`播放器不支持\${v}编码格式\`, "将继续使用AVC编码"); setting.codecType = "AVC"; chrome.storage.local.set({ setting }); } } }, { key: "collection", menu: "rewrite", label: "合集", sub: "以分P形式呈现", type: "switch", value: true }, { key: "search", menu: "rewrite", label: "搜索", sub: "旧版搜索页面", type: "switch", value: true }, { key: "liveRecord", menu: "live", label: "直播回放", sub: "过滤动态中的直播回放", type: "switch", value: false }, { key: "closedCaption", menu: "player", label: "CC字幕", sub: '移植自<a href="https://gf.qytechs.cn/scripts/378513" target="_blank">Bilibili CC字幕工具</a>', type: "switch", value: true, float: "没有简体中文时将提供一个繁体到简体的硬翻译,不考虑使用习惯等情况的那种。" }, { key: "segProgress", menu: "player", label: "分段进度条", sub: "视频看点", type: "switch", value: false }, { key: "videoDisableAA", menu: "player", label: "禁用视频渲染抗锯齿", sub: '详见<a href="https://github.com/MotooriKashin/Bilibili-Old/issues/292" target="_blank">#292</a>说明', type: "switch", value: false, float: \`听说chrome渲染视频,在视频像素跟屏幕像素不是1:1对应的情况下,使用的抗锯齿算法会导致画面模糊,而且可能还会产生色差。屏幕分辨率与视频分辨率差别越大越明显。本选项用来提供一个【锯齿】【模糊】二选一的选项,请根据自身观感决定启用与否。\` }, { key: "comment", menu: "style", label: "翻页评论区", sub: "非重写页面", type: "switch", value: false }, { key: "commentLinkDetail", menu: "style", label: "还原评论中的超链接", sub: "av、ss或ep", type: "switch", value: false }, { key: "configManage", menu: "common", type: "button", label: "设置数据", sub: "备份/还原", svg: blind_default, func: () => { showAlert("设置数据包含您个人对于设置的自定义调整,您可以选择恢复默认数据、导出为本地文件或者从本地文件中恢复。", "设置数据", [ { name: "默认", callback: settingMG.restore }, { name: "导出", callback: settingMG.output }, { name: "导入", callback: settingMG.input } ]); }, button: "管理" }, { key: "downlaodType", menu: "download", type: "checkbox", label: "类型", sub: "请求的文件类型", float: "请求的文件类型,实际显示取决于服务器是否提供了该类型的文件。而播放器已载入的文件将直接推送到下载面板,无论这里是否勾选了对应类型。换言之:这里决定的是发送请求的类型而不是实际获取到的类型。各类型简介如下:<br>※ mp4:后缀名.mp4,无需任何后续操作的最适合的下载类型,但是画质选择极少,一般最高不超过1080P,如果画质类型为【预览】则说明是付费视频的预览片段,下载意义不大。<br>※ DASH:新型浏览体解决方案,可以看成是把一个mp4文件拆开成一个只有画面的文件和一个只有声音的文件,提供的后缀名都是.m4s,为了方便可以将画面文件修改为.m4v,声音文件修改为.m4a。这种类型下载一个画面文件+一个声音文件,然后用ffmmpeg等工具混流为一个完整视频文件,在下载面板中声音文件显示为【aac】,画面文件则可能有可能存在【avc】【hev】【av1】三种,代表了画面的编码算法,任选其一即可。一般而言在乎画质选【hev】(部分画质如【杜比视界】似乎只以这种格式提供),在乎兼容性【avc】(毕竟mp4默认编码),【av1】则是新型编码标准,12代CPU或30系显卡以外的PC硬件都不支持硬解(不过还可以软解,效果看CPU算力),属于“站未来”的类型。<br>※ flv:flash时代(已落幕)的流媒体遗存,后缀名.flv,本是媲美mp4的格式,如果一个文件没有分成多个片段的话,如果下载面板只有一个片段,那么祝贺本视频没有遭遇到“分尸”,下载后无需后续操作,直接当成mp4文件即可,如果有多个片段,则需全部下载后用ffmpeg等工具拼接起来(与DASH分别代表了两种切片类型,一个是音视频分流,一个是时间轴分段),段数大于2还不如改下载DASH,DASH只要下载2个文件而且还有专属画质。", value: ["mp4"], candidate: ["mp4", "flv", "DASH"] }, { key: "TVresource", menu: "download", type: "switch", label: "获取TV源", sub: "可能无水印", float: \`B站TV端视频源一般都没有水印,因为会员和主站不互通,如非tv大会员将获取不到专属画质。<strong>获取到的下载源将不支持【默认】下载方式</strong>\`, value: false, callback: (v) => { if (v) { setting.referer = ""; toast.warning("您选择获取TV源,已经referer设置置空~", "注意:TV源无法使用默认方式下载"); } else { setting.referer = "https://www.bilibili.com"; toast.warning("您放弃获取TV源,已经referer设置为默认值"); } chrome.storage.local.set({ setting }); } }, { key: "downloadQn", menu: "download", type: "select", label: "画质参数", sub: "flv限定", float: \`以数字代表的画质参数,因为mp4不能选择画质而DASH默认提供所有画质,所以只对flv格式有效。一般无脑选最高即可,不存在或者权限不足时会主动向下降级,目前最高画质是127(8K)。\`, value: "127", candidate: ["0", "15", "16", "32", "48", "64", "74", "80", "112", "116", "120", "125", "126", "127"] }, { key: "downloadOther", menu: "download", type: "switch", label: "其他下载", sub: "提供弹幕、字幕等的下载", value: false }, { key: "danmakuSaveType", menu: "danmaku", type: "select", label: "弹幕格式", sub: "下载", value: "xml", candidate: ["xml", "json"] }, { key: "danmakuContact", menu: "danmaku", type: "switch", label: "合并已有弹幕", sub: "载入本地文件或者在线弹幕时", value: false }, { key: "allDanmaku", menu: "danmaku", type: "slider", label: "全弹幕装填冷却时间", sub: "单位:/s", value: 3, min: 1, max: 30, precision: 29 }, { key: "downloadMethod", menu: "download", type: "select", label: "下载方式", value: "默认", candidate: ["默认", "IDM+ef2", "aria2", "aria2+rpc"], callback: (v) => { switch (v) { case "IDM+ef2": showAlert( 'IDM(Internet Download Manager)是Windows端著名的的下载工具,通过作者的另一款名为<a href="https://github.com/MotooriKashin/ef2" target="_blank">ef2</a>辅助工具,本扩展支持直接从浏览器拉起IDM下载文件。<br>是否确定使用本方式?', "下载方式", [ { name: "确定", callback: () => { showSetting("IDM"); } }, { name: "取消", callback: () => { setting.downloadMethod = "默认"; chrome.storage.local.set({ setting }); } } ] ); break; case "aria2": showAlert( "aria2是全平台著名的命令行下载工具,本方式将复制下载命令到剪切板以方便使用aria2进行下载,<br>是否确定使用本方式下载?", "下载方式", [ { name: "确定", callback: () => { showSetting("aria2"); } }, { name: "取消", callback: () => { setting.downloadMethod = "默认"; chrome.storage.local.set({ setting }); } } ] ); break; case "aria2+rpc": showAlert( "aria2支持rpc模式,从浏览器端直接发送下载命令,第一次使用须要到下面配置rpc设置,是否使用本方式进行下载?", "下载方式", [ { name: "确定", callback: () => { showSetting("aria2"); } }, { name: "取消", callback: () => { setting.downloadMethod = "默认"; chrome.storage.local.set({ setting }); } } ] ); break; } }, float: "默认下载方式请不要直接左键点击,右键另存为是更正确合理的操作。" }, { key: "userAgent", menu: "download", type: "input", label: "User-Agent", sub: "高级设置", float: "B站视频一般都需要有效User-Agent,否则会403。(默认下载方式以外才有意义。)<br>※ <strong>本项会同时影响替换UPOS服务器后能否播放,默认值才是经检验的最合适的值!</strong>", value: "Bilibili Freedoooooom/MarkII", candidate: ["Bilibili Freedoooooom/MarkII"] }, { key: "referer", menu: "download", type: "input", label: "referer", sub: "高级设置", float: "B站视频一般填主站域名即可,其他会403。<strong>TV源/泰区视频必须置空!港澳台替换UPOS服务器后也可能需要置空。</strong>(默认下载方式以外才有意义。)", value: "https://www.bilibili.com", candidate: ["https://www.bilibili.com"] }, { key: "filepath", menu: "download", type: "input", label: "下载目录", sub: "Windows端注意反斜杠!", float: "(默认下载方式以外才有意义。)" }, { key: "aria2", menu: "download", type: "list", name: "aria2", list: [ { key: "token", type: "input", label: "令牌", sub: "token", props: { type: "password" }, float: "如果没有使用token可置空" }, { key: "server", type: "input", label: "主机", sub: "url", props: { type: "url", placeholder: "http://localhost" }, value: "http://localhost" }, { key: "port", type: "input", label: "端口", props: { type: "number", placeholder: "6800" }, value: "6800" }, { key: "test", type: "button", label: "测试RPC连接", button: "测试", func: () => { const msg = toast.custom(0, "info", "正在测试RPC连接可用性~"); aria2.getVersion().then((d) => { if (msg) { msg.type = "success"; msg.data = [\`RPC设置正常!aria2版本:\${d.version}\`]; msg.delay = 3; } console.log(\`RPC设置正常!\`, d); }).catch((e) => { if (msg) { msg.type = "error"; msg.data = ["RPC链接不正常 ಥ_ಥ", "请检查aria2设置等再试~"]; msg.delay = 3; } console.error("RPC链接异常!请检查aria2设置等再试~", e); }); } } ] }, { key: "animatedBanner", menu: "style", type: "switch", label: "动态banner", sub: "移植自新版顶栏", value: false }, { key: "accessKey", menu: "common", type: "list", name: "账户授权", list: [ { key: "key", type: "input", label: "Token", sub: "access_key", float: "网页端B站使用cookie来判断用户身份,但是移动端或者授权第三方登录(不可用),则使用一个名为access_key的参数。B站有一些只有APP/TV端才能获取的数据,启用本功能将赋予本扩展访问那些数据的能力。<strong>与【解除限制】功能一起使用时请自行确定代理服务器的安全性!</strong>", props: { type: "text", readonly: "readonly" } }, { key: "date", type: "input", label: "授权日期", sub: "有效期不超过30天", float: "和cookie一样,access_key这个鉴权参数一般有有效期限,经验告诉我们一般是一个月,过期作废。因为授权是敏感操作,请自行判断是否过期并慎重考虑是否重新授权。", props: { type: "text", readonly: "readonly" } }, { key: "action", type: "button", label: "账户授权", sub: "风险操作", svg: warn_default, func: () => { new AccessKey(); }, button: "操作" } ] }, { key: "timeline", menu: "style", type: "switch", label: "港澳台新番时间表", sub: '<a href="https://www.bilibili.com/anime/timeline/" target="_blank">立即前往</a>', float: \`在主页番剧分区中,可能需主动从最新切换到响应的星期才会显示当天的数据。\`, value: false }, { key: "episodeData", menu: "style", type: "switch", label: "分集数据", sub: "Bangumi", float: \`对于Bangumi,显示单集播放量和弹幕,原合计数据显示在鼠标焦点提示文本中。\`, value: false }, { key: "IDM", menu: "download", type: "list", name: "ef2", list: [ { key: "wait", type: "switch", label: "稍后下载", sub: "添加到IDM下载列表", float: "需要手动到IDM中开始下载,注意B站下载链接有时效,请及时下载!", value: false }, { key: "silence", type: "switch", label: "静默下载", sub: "无需二次确认", float: "取消IDM下载确认对话框,那里会询问是否开启下载以及文件名、保存目录等信息。", value: false } ] } ]; // src/runtime/element/button_switch/button_switch.html var button_switch_default = '<div class="switch">\\r\\n <span class="bar"></span>\\r\\n <span class="knob">\\r\\n <i class="circle"></i>\\r\\n </span>\\r\\n</div>\\r\\n<style type="text/css">\\r\\n .switch {\\r\\n cursor: pointer;\\r\\n display: block;\\r\\n min-width: 34px;\\r\\n outline: none;\\r\\n position: relative;\\r\\n width: 34px;\\r\\n }\\r\\n\\r\\n .bar {\\r\\n background-color: rgb(189, 193, 198);\\r\\n border-radius: 8px;\\r\\n height: 12px;\\r\\n left: 3px;\\r\\n position: absolute;\\r\\n top: 2px;\\r\\n transition: background-color linear 80ms;\\r\\n width: 28px;\\r\\n z-index: 0;\\r\\n }\\r\\n\\r\\n .bar[checked] {\\r\\n background-color: rgb(26, 115, 232);\\r\\n opacity: 0.5;\\r\\n }\\r\\n\\r\\n .bar:active {\\r\\n box-shadow: 0 0 1px 1px rgba(26, 115, 232, 80%);\\r\\n }\\r\\n\\r\\n .knob {\\r\\n background-color: #fff;\\r\\n border-radius: 50%;\\r\\n box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 40%);\\r\\n display: block;\\r\\n height: 16px;\\r\\n position: relative;\\r\\n transition: transform linear 80ms, background-color linear 80ms;\\r\\n width: 16px;\\r\\n z-index: 1;\\r\\n }\\r\\n\\r\\n .knob[checked] {\\r\\n background-color: rgb(26, 115, 232);\\r\\n transform: translate3d(18px, 0, 0);\\r\\n }\\r\\n\\r\\n .knob:active {\\r\\n box-shadow: 0 0 1px 1px rgba(26, 115, 232, 80%);\\r\\n }\\r\\n\\r\\n .knob i {\\r\\n color: rgba(128, 134, 139, 15%);\\r\\n height: 40px;\\r\\n left: -12px;\\r\\n pointer-events: none;\\r\\n top: -12px;\\r\\n transition: color linear 80ms;\\r\\n width: 40px;\\r\\n border-radius: 50%;\\r\\n bottom: 0;\\r\\n display: block;\\r\\n overflow: hidden;\\r\\n position: absolute;\\r\\n right: 0;\\r\\n transform: translate3d(0, 0, 0);\\r\\n }\\r\\n\\r\\n .knob i[checked] {\\r\\n color: rgb(26, 115, 232);\\r\\n }\\r\\n\\r\\n .knob i:active {\\r\\n box-shadow: 0 0 1px 1px rgba(26, 115, 232, 80%);\\r\\n }\\r\\n</style>'; // src/runtime/element/button_switch/button_switch.ts var ButtonSwitch = class extends HTMLElement { value; constructor(obj = {}) { super(); const root3 = this.attachShadow({ mode: "closed" }); root3.appendChild(createElements(htmlVnode(button_switch_default))); const [bar, knob, circle] = [ root3.children[0].children[0], root3.children[0].children[1], root3.children[0].children[1].children[0] ]; const { value, callback } = obj; let initing = true; Reflect.defineProperty(obj, "value", { set: (v) => { if (this.value === v) return; if (v) { bar.setAttribute("checked", "checked"); knob.setAttribute("checked", "checked"); circle.setAttribute("checked", "checked"); } else { bar.removeAttribute("checked"); knob.removeAttribute("checked"); circle.removeAttribute("checked"); } this.value = v; !initing && callback && callback(v); }, get: () => this.value }); this.addEventListener("click", () => { obj.value = !this.value; }); this.value = obj.value = value || false; initing = false; } }; customElements.get(\`button-switch\${mutex}\`) || customElements.define(\`button-switch\${mutex}\`, ButtonSwitch); // src/runtime/element/checkbox/checkbox.html var checkbox_default = \`<input type="checkbox" id="checkbox">\\r <label for="checkbox"></label>\\r <style>\\r input[type="checkbox"] {\\r display: none;\\r }\\r \\r input~label {\\r cursor: pointer;\\r }\\r \\r input:checked~label:before {\\r content: '\\\\2714';\\r }\\r \\r input~label:before {\\r width: 12px;\\r height: 12px;\\r line-height: 14px;\\r vertical-align: text-bottom;\\r border-radius: 3px;\\r border: 1px solid #d3d3d3;\\r display: inline-block;\\r text-align: center;\\r content: ' ';\\r }\\r </style>\`; // src/runtime/element/checkbox/checkbox.ts var Checkbox = class extends HTMLElement { value; label; constructor(obj) { super(); const root3 = this.attachShadow({ mode: "closed" }); const { label, value } = obj; root3.appendChild(createElements(htmlVnode(checkbox_default))); const [input, text] = [ root3.children[0], root3.children[1] ]; Object.defineProperties(obj, { value: { set: (v) => { if (this.value === v) return; this.value = v; }, get: () => this.value }, label: { set: (v) => { if (this.label === v) return; text.textContent = v; this.label = v; }, get: () => this.label } }); text.addEventListener("click", () => { obj.value = !this.value; }); input.checked = this.value = obj.value = value || false; this.label = obj.label = label; } }; customElements.get(\`check-box\${mutex}\`) || customElements.define(\`check-box\${mutex}\`, Checkbox); // src/runtime/element/float_quote/float_quote.html var float_quote_default = '<div class="float">\\r\\n <div class="arrow"></div>\\r\\n <div class="message"></div>\\r\\n</div>\\r\\n<style type="text/css">\\r\\n .float {\\r\\n top: 0;\\r\\n right: 0;\\r\\n position: fixed;\\r\\n z-index: 11111;\\r\\n min-width: 40px;\\r\\n min-height: 30px;\\r\\n display: block;\\r\\n padding: 8px;\\r\\n box-sizing: border-box;\\r\\n background: #fff;\\r\\n border: 1px solid #e9eaec;\\r\\n border-radius: 8px;\\r\\n box-shadow: 0 6px 12px 0 rgb(106, 115, 133, 22%);\\r\\n user-select: text;\\r\\n pointer-events: none;\\r\\n }\\r\\n\\r\\n .arrow {\\r\\n left: 16%;\\r\\n top: 100%;\\r\\n width: 0;\\r\\n height: 0;\\r\\n border-left: 4px solid transparent;\\r\\n border-right: 4px solid transparent;\\r\\n border-top: 8px solid #fff;\\r\\n position: absolute;\\r\\n user-select: text;\\r\\n }\\r\\n\\r\\n .message {\\r\\n margin-top: -4px;\\r\\n box-sizing: border-box;\\r\\n height: 100%;\\r\\n position: relative;\\r\\n user-select: text;\\r\\n word-wrap: break-word;\\r\\n word-break: break-all;\\r\\n font-size: 12px;\\r\\n line-height: 1.15;\\r\\n }\\r\\n</style>'; // src/runtime/element/float_quote/float_quote.ts var FloatQuote = class extends HTMLElement { constructor(node4, data) { super(); const root3 = this.attachShadow({ mode: "closed" }); root3.appendChild(createElements(htmlVnode(float_quote_default))); const real = root3.children[0]; real.children[1].innerHTML = data; node4.onmouseover = (ev) => { document.body.appendChild(this); let rect = real.getBoundingClientRect(); real.style.left = \`\${node4.getBoundingClientRect().x + ev.offsetX}px\`; real.style.top = \`\${node4.getBoundingClientRect().y + ev.offsetY - rect.height}px\`; real.style.width = \`\${Math.sqrt(rect.width * rect.height) * 4 / 3}px\`; }; node4.onmouseout = () => { try { this.remove(); } catch (e) { } }; real.onmouseout = () => { try { this.remove(); } catch (e) { } }; } }; customElements.get(\`float-quote\${mutex}\`) || customElements.define(\`float-quote\${mutex}\`, FloatQuote); // src/runtime/element/input_area/input_area.html var input_area_default = '<div class="input"><input>\\r\\n <ul class="input-list"></ul>\\r\\n</div>\\r\\n<style type="text/css">\\r\\n .input {\\r\\n width: 100%;\\r\\n display: inline-block;\\r\\n position: relative;\\r\\n border: 0;\\r\\n overflow: visible;\\r\\n white-space: nowrap;\\r\\n height: 24px;\\r\\n line-height: 24px;\\r\\n cursor: pointer;\\r\\n font-size: 12px;\\r\\n }\\r\\n\\r\\n .input input {\\r\\n height: 24px;\\r\\n line-height: 24px;\\r\\n display: inline;\\r\\n user-select: auto;\\r\\n text-decoration: none;\\r\\n outline: none;\\r\\n width: calc(100% - 10px);\\r\\n background: transparent;\\r\\n padding: 0 5px;\\r\\n border: 1px solid #ccd0d7;\\r\\n border-radius: 4px;\\r\\n }\\r\\n\\r\\n .input input:focus {\\r\\n border-color: #00a1d6;\\r\\n }\\r\\n\\r\\n .input-list {\\r\\n display: none;\\r\\n margin: 0;\\r\\n width: 100%;\\r\\n padding: 0;\\r\\n border-radius: 0 0 4px 4px;\\r\\n max-height: 120px;\\r\\n background-color: #fff;\\r\\n border: 1px solid #ccd0d7;\\r\\n box-shadow: 0 0 2px 0 #ccd0d7;\\r\\n position: absolute;\\r\\n left: -1px;\\r\\n right: auto;\\r\\n z-index: 2;\\r\\n overflow: hidden auto;\\r\\n white-space: nowrap;\\r\\n }\\r\\n\\r\\n .input:hover .input-list {\\r\\n display: block;\\r\\n }\\r\\n\\r\\n .input-list-row {\\r\\n padding: 0 5px;\\r\\n transition: background-color .3s;\\r\\n line-height: 30px;\\r\\n height: 30px;\\r\\n font-size: 12px;\\r\\n cursor: pointer;\\r\\n color: #222;\\r\\n position: relative;\\r\\n }\\r\\n\\r\\n .input-list-row:hover {\\r\\n background-color: #f4f5f7;\\r\\n color: #6d757a;\\r\\n }\\r\\n\\r\\n .cancel {\\r\\n position: absolute;\\r\\n right: 0;\\r\\n top: 0px;\\r\\n width: 38px;\\r\\n height: 28px;\\r\\n background: url(//static.hdslb.com/images/base/icons.png) -461px -530px no-repeat;\\r\\n }\\r\\n\\r\\n .input-list-row:hover .cancel {\\r\\n background-position: -525px -530px;\\r\\n }\\r\\n</style>'; // src/runtime/element/scrollbar.html var scrollbar_default = '<style type="text/css">\\r\\n ::-webkit-scrollbar {\\r\\n width: 7px;\\r\\n height: 7px;\\r\\n }\\r\\n\\r\\n ::-webkit-scrollbar-track {\\r\\n border-radius: 4px;\\r\\n background-color: #EEE;\\r\\n }\\r\\n\\r\\n ::-webkit-scrollbar-thumb {\\r\\n border-radius: 4px;\\r\\n background-color: #999;\\r\\n }\\r\\n</style>'; // src/runtime/element/input_area/input_area.ts var InputArea = class extends HTMLElement { value; props; candidate; constructor(obj = {}) { super(); const root3 = this.attachShadow({ mode: "closed" }); const { value, candidate, props, change } = obj; let initing = true; root3.appendChild(createElements(htmlVnode(input_area_default + scrollbar_default))); const [input, ul] = [ root3.children[0].children[0], root3.children[0].children[1] ]; let file = false; input.addEventListener("change", () => { obj.value = file ? input.files : input.value; }); Object.defineProperties(obj, { value: { set: (v) => { if (file) return; if (this.value === v) return; input.value = v; this.value = v; !initing && change && change(file ? input.files : input.value); }, get: () => file ? input.files : this.value }, props: { set: (v) => { if (this.props === v) return; this.props = v; flushProps(); }, get: () => this.props && new Proxy(this.props, new ProxyHandler(flushProps)) }, candidate: { set: (v) => { if (this.candidate === v) return; this.candidate = v; flushList(); }, get: () => this.candidate && new Proxy(this.candidate, new ProxyHandler(flushList)) } }); const flushProps = () => Object.entries(obj.props).forEach((d) => { input.setAttribute(d[0], d[1]); if (d[0] === "type") { switch (d[1]) { case "file": if (file) break; file = true; ul.setAttribute("style", "display: none;"); break; default: if (file) { file = false; ul.removeAttribute("style"); } } } }); let mutex2 = 0; const flushList = () => { clearTimeout(mutex2); mutex2 = setTimeout(() => { ul.replaceChildren(createElements(obj.candidate.reduce((s, d, i, t) => { s.push({ tagName: "li", props: { class: "input-list-row" }, event: { click: () => { obj.value = d; } }, children: [{ tagName: "span", text: d }, { tagName: "div", props: { class: "cancel" }, event: { click: (e) => { t.splice(i, 1); e.stopPropagation(); e.preventDefault(); } } }] }); return s; }, []))); }); }; this.value = obj.value = value || ""; this.props = obj.props = props || {}; this.candidate = obj.candidate = candidate || []; initing = file; } }; customElements.get(\`input-area\${mutex}\`) || customElements.define(\`input-area\${mutex}\`, InputArea); // src/runtime/element/select_list/select_menu.html var select_menu_default = '<div class="selectmenu">\\r\\n <div class="selectmenu-txt"><span></span></div>\\r\\n <div class="selectmenu-arrow arrow-down"></div>\\r\\n <ul class="selectmenu-list"></ul>\\r\\n</div>\\r\\n<style type="text/css">\\r\\n .selectmenu {\\r\\n width: 100%;\\r\\n display: inline-block;\\r\\n position: relative;\\r\\n border: 1px solid #ccd0d7;\\r\\n border-radius: 4px;\\r\\n overflow: visible;\\r\\n white-space: nowrap;\\r\\n height: 24px;\\r\\n line-height: 24px;\\r\\n cursor: pointer;\\r\\n font-size: 12px;\\r\\n }\\r\\n\\r\\n .selectmenu-txt {\\r\\n display: inline-block;\\r\\n overflow: hidden;\\r\\n vertical-align: top;\\r\\n text-overflow: ellipsis;\\r\\n padding: 0 5px;\\r\\n height: 24px;\\r\\n line-height: 24px;\\r\\n }\\r\\n\\r\\n .selectmenu-arrow {\\r\\n position: absolute;\\r\\n background-color: transparent;\\r\\n top: 0;\\r\\n right: 4px;\\r\\n z-index: 0;\\r\\n border-radius: 4px;\\r\\n width: 20px;\\r\\n height: 100%;\\r\\n cursor: pointer;\\r\\n }\\r\\n\\r\\n .arrow-down:before {\\r\\n margin: 0 auto;\\r\\n margin-top: 8px;\\r\\n width: 0;\\r\\n height: 0;\\r\\n display: block;\\r\\n border-width: 4px 4px 0;\\r\\n border-style: solid;\\r\\n border-color: #99a2aa transparent transparent;\\r\\n position: relative;\\r\\n content: "";\\r\\n }\\r\\n\\r\\n .selectmenu-list {\\r\\n display: none;\\r\\n margin: 0;\\r\\n width: 100%;\\r\\n padding: 0;\\r\\n max-height: 120px;\\r\\n background-color: #fff;\\r\\n border: 1px solid #ccd0d7;\\r\\n box-shadow: 0 0 2px 0 #ccd0d7;\\r\\n position: absolute;\\r\\n left: -1px;\\r\\n right: auto;\\r\\n z-index: 2;\\r\\n overflow: hidden auto;\\r\\n white-space: nowrap;\\r\\n }\\r\\n\\r\\n .selectmenu:hover .selectmenu-list {\\r\\n display: block;\\r\\n }\\r\\n\\r\\n .selectmenu-list-row {\\r\\n padding: 0 5px;\\r\\n transition: background-color .3s;\\r\\n line-height: 30px;\\r\\n height: 30px;\\r\\n font-size: 12px;\\r\\n cursor: pointer;\\r\\n color: #222;\\r\\n }\\r\\n\\r\\n .selectmenu-list-row:hover {\\r\\n background-color: #f4f5f7;\\r\\n color: #6d757a;\\r\\n }\\r\\n</style>'; // src/runtime/element/select_list/select_menu.ts var SelectMenu = class extends HTMLElement { value; candidate; styles; constructor(obj = {}) { super(); const root3 = this.attachShadow({ mode: "closed" }); const { value, candidate, styles, callback } = obj; let initing = true; root3.appendChild(createElements(htmlVnode(select_menu_default + scrollbar_default))); const [txt, list] = [ root3.children[0].children[0].children[0], root3.children[0].children[2] ]; Object.defineProperties(obj, { value: { set: (v) => { if (this.value === v) return; txt.textContent = v; this.value = v; this.styles && this.styles[v] ? txt.setAttribute("style", this.styles[v]) : txt.removeAttribute("style"); !initing && callback && callback(v); }, get: () => this.value }, candidate: { set: (v) => { if (this.candidate === v) return; this.candidate = v; flushList(); }, get: () => this.candidate && new Proxy(this.candidate, new ProxyHandler(flushList)) }, styles: { set: (v) => { if (this.styles === v) return; this.styles = v; flushList(); }, get: () => this.styles && new Proxy(this.styles, new ProxyHandler(flushList)) } }); let mutex2 = 0; const flushList = () => { clearTimeout(mutex2); setTimeout(() => { list.replaceChildren(createElements(obj.candidate.reduce((s, d) => { s.push({ tagName: "li", props: { class: "selectmenu-list-row" }, children: [{ tagName: "span", text: d, props: this.styles && this.styles[d] ? { style: this.styles[d] } : void 0 }], event: { click: () => { obj.value = d; } } }); return s; }, []))); }); }; this.styles = obj.styles = styles || {}; this.candidate = obj.candidate = candidate || []; this.value = obj.value = value || ""; initing = false; } }; customElements.get(\`select-menu\${mutex}\`) || customElements.define(\`select-menu\${mutex}\`, SelectMenu); // src/runtime/element/slider_block/slider_blcok.html var slider_blcok_default = '<div class="block">\\r\\n <div class="slider">\\r\\n <div class="slider-tracker-wrp">\\r\\n <div class="slider-tracker">\\r\\n <div class="slider-handle">\\r\\n <div class="slider-hint"></div>\\r\\n </div>\\r\\n <div class="slider-progress"></div>\\r\\n </div>\\r\\n </div>\\r\\n </div>\\r\\n</div>\\r\\n<style type="text/css">\\r\\n .block {\\r\\n vertical-align: top;\\r\\n display: inline-block;\\r\\n width: 100%;\\r\\n }\\r\\n\\r\\n .slider {\\r\\n width: 100%;\\r\\n height: 13px;\\r\\n clear: both;\\r\\n position: relative;\\r\\n }\\r\\n\\r\\n .slider-tracker-wrp {\\r\\n position: relative;\\r\\n width: 100%;\\r\\n height: 100%;\\r\\n cursor: pointer;\\r\\n }\\r\\n\\r\\n .slider-tracker {\\r\\n position: absolute;\\r\\n width: 100%;\\r\\n height: 6px;\\r\\n left: 0;\\r\\n border-radius: 4px;\\r\\n top: 50%;\\r\\n margin-top: -3px;\\r\\n background-color: #e5e9ef;\\r\\n }\\r\\n\\r\\n .slider-handle {\\r\\n position: absolute;\\r\\n top: -4px;\\r\\n height: 14px;\\r\\n width: 14px;\\r\\n border-radius: 7px;\\r\\n cursor: pointer;\\r\\n z-index: 1;\\r\\n margin-left: -7px;\\r\\n box-shadow: 0 0 3px #017cc3;\\r\\n background-color: #fff;\\r\\n transition: box-shadow .3s;\\r\\n }\\r\\n\\r\\n .slider-handle:hover {\\r\\n box-shadow: 0 0 5px #017cc3;\\r\\n }\\r\\n\\r\\n .slider-hint {\\r\\n display: none;\\r\\n position: absolute;\\r\\n top: -21px;\\r\\n white-space: nowrap;\\r\\n border-radius: 4px;\\r\\n background-color: hsla(0, 0%, 100%, .8);\\r\\n padding: 0 3px;\\r\\n border: 1px solid #fafafa;\\r\\n z-index: 1;\\r\\n transform: translateX(-25%);\\r\\n user-select: none;\\r\\n }\\r\\n\\r\\n .slider-progress {\\r\\n width: 0;\\r\\n height: 100%;\\r\\n border-radius: 4px;\\r\\n background-color: #00a1d6;\\r\\n position: relative;\\r\\n }\\r\\n</style>'; // src/runtime/element/slider_block/slider_block.ts function offset(node4) { const result = { top: 0, left: 0 }; const onwer = node4.ownerDocument; if (node4 === onwer.body) { result.top = node4.offsetTop; result.left = node4.offsetLeft; } else { let rect = void 0; try { rect = node4.getBoundingClientRect(); } catch { } if (!rect || !onwer.documentElement.contains(node4)) { rect && (result.top = rect.top, result.left = rect.left); return result; } result.top = rect.top + onwer.body.scrollTop - onwer.documentElement.clientTop; result.left = rect.left + onwer.body.scrollLeft - onwer.documentElement.clientLeft; } return result; } var SliderBlock = class extends HTMLElement { value; min; max; precision; hint; solid; showChange; vertical; constructor(obj = {}) { super(); const root3 = this.attachShadow({ mode: "closed" }); const { value, min, max, precision, hint, solid, vertical, callback } = obj; let initing = true; root3.appendChild(createElements(htmlVnode(slider_blcok_default))); const [handle, progress, hinter, wrp] = [ root3.children[0].children[0].children[0].children[0].children[0], root3.children[0].children[0].children[0].children[0].children[1], root3.children[0].children[0].children[0].children[0].children[0].children[0], root3.children[0].children[0].children[0] ]; const mouseLinster = (e) => { const { pageX, pageY } = e; const offsetX = this.vertical ? pageY - offset(wrp).top - 7 : pageX - offset(wrp).left - 7; const allX = wrp.offsetWidth - 14; const pv = (0 > offsetX ? 0 : offsetX > allX ? allX : offsetX) / allX; obj.value = (this.max - this.min) * Math.round(pv * this.precision) / this.precision + this.min; }; this.addEventListener("click", mouseLinster); const mouseClear = () => { window.removeEventListener("mousemove", mouseLinster); window.removeEventListener("mouseup", mouseClear); }; handle.addEventListener("mousedown", () => { window.addEventListener("mousemove", mouseLinster); window.addEventListener("mouseup", mouseClear); }); handle.addEventListener("mouseover", () => this.showChange()); let nHint = 0; this.showChange = () => { const pv = (this.value - this.min) / (this.max - this.min) * 100; handle.style.cssText = \`left: \${((wrp.offsetWidth - 14) * (this.value - this.min) / (this.max - this.min) + 7) / wrp.offsetWidth * 100}%;\`; progress.style.cssText = \`width: \${pv}%;\`; if (this.hint) { hinter.textContent = this.value; if (hinter.style.display !== "block") hinter.style.display = "block"; if (this.solid) return; clearTimeout(nHint); nHint = setTimeout(() => hinter.style.display = "", 300); } ; }; Object.defineProperties(obj, { value: { get: () => this.value, set: (v) => { if (this.vertical) v = this.max - v + this.min; v = (this.max - this.min) * Math.round((v - this.min) / (this.max - this.min) * this.precision) / this.precision + this.min; if (v === this.value) return; this.value = v; this.showChange(); !initing && callback && callback(v); } }, min: { get: () => this.min, set: (v) => { if (v === this.min || v >= this.max) return; this.min = v; if (v > this.value) obj.value = v; this.showChange(); } }, max: { get: () => this.max, set: (v) => { if (v === this.max || v <= this.min) return; this.max = v; if (v < this.value) obj.value = v; this.showChange(); } }, precision: { get: () => this.precision, set: (v) => { if (v === this.precision) return; this.precision = v; obj.value = obj.value; } }, hint: { get: () => this.hint, set: (v) => { if (v === this.hint) return; this.hint = v; } }, solid: { get: () => this.solid, set: (v) => { if (v === this.solid) return; this.solid = v; this.showChange(); } }, vertical: { get: () => this.vertical, set: (v) => { if (v === this.vertical) return; this.vertical = v; this.style.transform = v ? "rotate(-90deg)" : ""; } } }); this.value = obj.value = value || 0; this.min = obj.min = min || 0; this.max = obj.max = max || 100; this.precision = obj.precision = precision || 100; this.hint = obj.hint = hint || true; this.solid = obj.solid = solid || false; this.vertical = obj.solid = vertical || false; initing = false; } connectedCallback() { setTimeout(() => this.showChange()); } }; customElements.get(\`slider-block\${mutex}\`) || customElements.define(\`slider-block\${mutex}\`, SliderBlock); // src/tampermonkey/setting.html var setting_default2 = '<div class="box">\\r\\n <div class="tool">\\r\\n <div title="关闭" class="icon"></div>\\r\\n <header>Bilbili Old</header>\\r\\n </div>\\r\\n <div class="content">\\r\\n <div class="contain">\\r\\n <div class="menu"></div>\\r\\n <div class="item"></div>\\r\\n </div>\\r\\n </div>\\r\\n</div>\\r\\n<style type="text/css">\\r\\n .box {\\r\\n left: 50%;\\r\\n top: 50%;\\r\\n transform: translateX(-50%) translateY(-50%);\\r\\n min-width: 600px;\\r\\n min-height: 400px;\\r\\n padding: 0;\\r\\n border: 0;\\r\\n position: fixed;\\r\\n z-index: 11110;\\r\\n display: none;\\r\\n box-sizing: border-box;\\r\\n background: #fff;\\r\\n border-radius: 8px;\\r\\n box-shadow: 0 6px 12px 0 rgba(106, 115, 133, 22%);\\r\\n transition: transform 0.3s ease-in;\\r\\n line-height: 14px;\\r\\n font: 12px Helvetica Neue, Helvetica, Arial, Microsoft Yahei, Hiragino Sans GB,\\r\\n Heiti SC, WenQuanYi Micro Hei, sans-serif;\\r\\n }\\r\\n\\r\\n .tool {\\r\\n border-bottom-left-radius: 8px;\\r\\n border-bottom-right-radius: 8px;\\r\\n overflow: hidden;\\r\\n width: 100%;\\r\\n display: inline-flex;\\r\\n z-index: 1;\\r\\n align-items: center;\\r\\n justify-content: flex-end;\\r\\n pointer-events: none;\\r\\n }\\r\\n\\r\\n .tool header {\\r\\n position: absolute;\\r\\n transform: translateX(-50%);\\r\\n left: 50%;\\r\\n font-size: 14px;\\r\\n }\\r\\n\\r\\n .tool div {\\r\\n border-radius: 50%;\\r\\n padding: 10px;\\r\\n transform: scale(0.8);\\r\\n pointer-events: visible;\\r\\n transition: opacity 0.3s ease;\\r\\n }\\r\\n\\r\\n .tool div:hover {\\r\\n background-color: rgba(0, 0, 0, 10%);\\r\\n }\\r\\n\\r\\n .content {\\r\\n position: relative;\\r\\n border-bottom-left-radius: 8px;\\r\\n border-bottom-right-radius: 8px;\\r\\n overflow: hidden;\\r\\n background-color: #fff;\\r\\n }\\r\\n\\r\\n .contain {\\r\\n padding-bottom: 15px;\\r\\n background-position: top center;\\r\\n background-size: contain;\\r\\n background-repeat: no-repeat;\\r\\n display: flex;\\r\\n align-items: flex-start;\\r\\n flex: 1;\\r\\n height: 360px;\\r\\n }\\r\\n\\r\\n .menu::-webkit-scrollbar,\\r\\n .item::-webkit-scrollbar {\\r\\n width: 0 !important;\\r\\n height: 0 !important;\\r\\n }\\r\\n\\r\\n .menu {\\r\\n flex: 1 1 0;\\r\\n flex-basis: calc(480px * 0.2);\\r\\n height: 100%;\\r\\n position: sticky;\\r\\n top: 0;\\r\\n display: flex;\\r\\n flex-direction: column;\\r\\n min-width: fit-content;\\r\\n overflow: auto;\\r\\n }\\r\\n\\r\\n .item {\\r\\n flex: 4 4 0;\\r\\n flex-basis: calc(480px * 0.8);\\r\\n height: 100%;\\r\\n box-sizing: border-box;\\r\\n display: flex;\\r\\n flex-direction: column;\\r\\n margin: 0 auto;\\r\\n position: relative;\\r\\n overflow: auto;\\r\\n background-image: linear-gradient(to top, white, white),\\r\\n linear-gradient(to top, white, white),\\r\\n linear-gradient(to top, rgba(0, 0, 0, 0.1), rgba(255, 255, 255, 0)),\\r\\n linear-gradient(to bottom, rgba(0, 0, 0, 0.1), rgba(255, 255, 255, 0));\\r\\n background-position: bottom center, top center, bottom center, top center;\\r\\n background-color: white;\\r\\n background-repeat: no-repeat;\\r\\n background-size: 100% 20px, 100% 20px, 100% 10px, 100% 10px;\\r\\n background-attachment: local, local, scroll, scroll;\\r\\n }\\r\\n\\r\\n .item>div {\\r\\n display: none;\\r\\n margin-bottom: 60px;\\r\\n }\\r\\n\\r\\n .menuitem {\\r\\n align-items: center;\\r\\n display: flex;\\r\\n font-weight: 500;\\r\\n margin-inline-end: 2px;\\r\\n margin-inline-start: 1px;\\r\\n min-height: 20px;\\r\\n padding-bottom: 10px;\\r\\n padding-inline-start: 23px;\\r\\n padding-top: 10px;\\r\\n cursor: pointer;\\r\\n }\\r\\n\\r\\n .menuitem:hover {\\r\\n background-color: rgb(0, 0, 0, 6%);\\r\\n }\\r\\n\\r\\n .menuitem>div {\\r\\n padding-inline-end: 12px;\\r\\n }\\r\\n\\r\\n .selected {\\r\\n color: rgb(51, 103, 214) !important;\\r\\n }\\r\\n\\r\\n .selected>.icon {\\r\\n fill: rgb(51, 103, 214) !important;\\r\\n }\\r\\n\\r\\n .contain1 {\\r\\n margin-bottom: 3px;\\r\\n padding-inline-start: 20px;\\r\\n padding-inline-end: 20px;\\r\\n display: flex;\\r\\n flex-direction: column;\\r\\n outline: none;\\r\\n position: relative;\\r\\n }\\r\\n\\r\\n .header .title {\\r\\n color: #000;\\r\\n font-size: 108%;\\r\\n font-weight: 400;\\r\\n letter-spacing: 0.25px;\\r\\n margin-bottom: 12px;\\r\\n outline: none;\\r\\n padding-bottom: 4px;\\r\\n }\\r\\n\\r\\n .card {\\r\\n border-radius: 4px;\\r\\n box-shadow: 0px 0px 1px 1px rgb(60 64 67 / 30%);\\r\\n flex: 1;\\r\\n color: #000;\\r\\n line-height: 154%;\\r\\n user-select: text;\\r\\n margin-inline: 12px;\\r\\n margin-bottom: 12px;\\r\\n }\\r\\n\\r\\n .contain2 {\\r\\n align-items: center;\\r\\n border-top: 1px solid rgba(0, 0, 0, 6%);\\r\\n display: flex;\\r\\n min-height: 24px;\\r\\n padding: 0 20px;\\r\\n flex-wrap: wrap;\\r\\n justify-content: flex-end;\\r\\n background-color: transparent !important;\\r\\n }\\r\\n\\r\\n .value {\\r\\n flex: 1;\\r\\n flex-basis: 1e-9px;\\r\\n display: flex;\\r\\n }\\r\\n\\r\\n .value>* {\\r\\n flex: 1;\\r\\n flex-basis: 1e-9px;\\r\\n display: flex;\\r\\n flex-wrap: wrap;\\r\\n justify-content: flex-end;\\r\\n align-items: center;\\r\\n align-content: center;\\r\\n }\\r\\n\\r\\n .label {\\r\\n flex: 1;\\r\\n flex-basis: 1e-9px;\\r\\n padding-block-end: 12px;\\r\\n padding-block-start: 12px;\\r\\n padding-inline-start: 12px;\\r\\n }\\r\\n\\r\\n .switch>.label,\\r\\n .button>.label,\\r\\n .select>.label,\\r\\n .input>.label,\\r\\n .slider>.label {\\r\\n flex: 2;\\r\\n }\\r\\n\\r\\n .select>.value,\\r\\n .input>.value,\\r\\n .slider>.value {\\r\\n flex: 3;\\r\\n }\\r\\n\\r\\n .sub {\\r\\n color: rgb(95, 99, 104);\\r\\n font-weight: 400;\\r\\n }\\r\\n\\r\\n .icon {\\r\\n align-items: center;\\r\\n border-radius: 50%;\\r\\n display: flex;\\r\\n height: 20px;\\r\\n justify-content: center;\\r\\n position: relative;\\r\\n width: 20px;\\r\\n box-sizing: content-box;\\r\\n background: none;\\r\\n cursor: pointer;\\r\\n }\\r\\n</style>'; // src/tampermonkey/setting.ts var MENU = []; var SETTING = []; function registerMenu(mus) { const arr2 = isArray(mus) ? mus : [mus]; arr2.forEach((d) => MENU.push(d)); } var disableSettingCallback = false; function registerSetting(sets) { disableSettingCallback = true; const arr2 = isArray(sets) ? sets : [sets]; arr2.forEach((d) => { let tag = false; if (d.type !== "list") { Reflect.has(setting, d.key) && (d.value = Reflect.get(setting, d.key)); d = new Proxy(d, { set: (t, p, v, r) => { if (p === "value") { if (!tag) { setting[d.key] = v; return true; } tag = false; } return Reflect.set(t, p, v, r); } }); setting[d.key] = d.value; Reflect.defineProperty(setting, d.key, { set: (v) => { tag = true; d.value = v; }, get: () => d.value }); } else { const obj = Reflect.has(setting, d.key) && JSON.parse(JSON.stringify(setting[d.key])); const bak = {}; setting[d.key] = new Proxy(bak, {}); d.list.forEach((t, i, a) => { obj && obj[t.key] && (t.value = obj[t.key]); a[i] = new Proxy(t, { set: (t2, p, v, r) => { if (p === "value") { if (!tag) { setting[d.key][t2.key] = v; return true; } tag = false; } return Reflect.set(t2, p, v, r); } }); bak[t.key] = a[i].value; Reflect.defineProperty(bak, t.key, { get: () => a[i].value, set: (v) => { tag = true; a[i].value = v; } }); setting[d.key][t.key] = t.value; }); } SETTING.push(d); }); disableSettingCallback = false; } var BilibiliOld = class extends HTMLElement { _box; _tool; _close; _menu; _item; constructor() { super(); const root3 = this.attachShadow({ mode: "closed" }); root3.appendChild(createElements(htmlVnode(setting_default2))); this._box = root3.children[0]; this._tool = root3.children[0].children[0]; this._close = root3.children[0].children[0].children[0]; this._menu = root3.children[0].children[1].children[0].children[0]; this._item = root3.children[0].children[1].children[0].children[1]; this._close.appendChild(createElements(htmlVnode(fork_default))); this._close.addEventListener("click", () => this._box.removeAttribute("style")); document.body.appendChild(this); disableSettingCallback = true; this.initMenu(); disableSettingCallback = false; } MENU = {}; ITEM = {}; initMenu() { this._menu.replaceChildren(); MENU.forEach((d) => { const menuitem = this._menu.appendChild(createElement(htmlVnode( \`<div class="menuitem">\${(d.svg ? \`<div class="icon">\${d.svg}</div>\` : "") + d.value}</div>\` )[0])); this.MENU[d.key] = menuitem; menuitem.addEventListener("click", () => { this.menuSelect(d.key); }); this.ITEM[d.key] = this._item.appendChild(createElement(htmlVnode( \`<div class="item\${d.key}"> <div class="contain1"> <div class="header"> <h2 class="title">\${d.value}</h2> </div> </div> <div class="card"></div> </div>\` )[0])); }); this.initItem(); } _menuNow; _itemNow; menuSelect(key = "common") { var _a3, _b, _c; (_a3 = this._menuNow) == null ? void 0 : _a3.classList.remove("selected"); (_b = this._menuNow) == null ? void 0 : _b.removeAttribute("style"); this._menuNow = this.MENU[key]; this.MENU[key].classList.add("selected"); (_c = this._itemNow) == null ? void 0 : _c.removeAttribute("style"); this._itemNow = this.ITEM[key]; this.ITEM[key].setAttribute("style", \`display: block;\`); } show(key) { var _a3, _b; this._box.setAttribute("style", "display: block;"); this.menuSelect(this.SETTING[key]); key && ((_b = (_a3 = this._itemNow) == null ? void 0 : _a3.querySelector(\`.\${key}\`)) == null ? void 0 : _b.scrollIntoView({ behavior: "smooth", block: "start" })); } SETTING = {}; initItem() { SETTING.forEach((d) => { this.SETTING[d.key] = d.menu; if (d.type === "list") { const node4 = this.ITEM[d.menu]; node4.appendChild(createElements(htmlVnode( \`<div class="contain1 \${d.key}"> <div class="header"> <h2 class="title">\${d.name}</h2> </div> </div> <div class="card"></div>\` ))); d.list.forEach((t) => { this.SETTING[\`\${d.key}-\${t.key}\`] = d.menu; this.appendItem(node4.lastChild, t, d.key); }); } else { this.appendItem(this.ITEM[d.menu].children[1], d); } }); } appendItem(node4, set, str) { const part = node4.appendChild(createElement(htmlVnode( \`<div class="contain2 \${(str ? \`\${str}-\` : "") + set.key}">\${set.svg ? \`<div class="icon">\${set.svg}</div>\` : ""} <div class="label">\${set.label + (set.sub ? \`<div class="sub">\${set.sub}</div>\` : "")}</div> <div class="value"></div></div>\` )[0])); switch (set.type) { case "button": part.classList.add("button"); part.lastChild.appendChild(new PushButton(set)); break; case "checkbox": part.classList.add("checkbox"); const checkbox = addElement("div", void 0, part.lastChild); set.candidate.forEach((t) => { checkbox.appendChild(new Checkbox(new Proxy({ label: t, value: set.value.includes(t) }, { set: (tar, ppt, val, rcv) => { if (ppt === "value") { if (val) { set.value.includes(t) || set.value.push(t); } else { const i = set.value.indexOf(t); i >= 0 && set.value.splice(i, 1); } saveConfig(); } return Reflect.set(tar, ppt, val, rcv); } }))); }); break; case "input": part.classList.add("input"); part.lastChild.appendChild(new InputArea(set)); break; case "select": part.classList.add("select"); part.lastChild.appendChild(new SelectMenu(set)); break; case "slider": part.classList.add("slider"); part.lastChild.appendChild(new SliderBlock(set)); break; case "switch": part.classList.add("switch"); part.lastChild.appendChild(new ButtonSwitch(set)); break; } set.float && new FloatQuote(part, set.float); } }; customElements.get("bilibili-old") || customElements.define("bilibili-old", BilibiliOld); var node2; function showSetting2(key) { node2 || (node2 = new BilibiliOld()); document.body.contains(node2) || document.body.appendChild(node2); node2.show(key); } // src/tampermonkey/ui.html var ui_default = '<div class="setting">\\r\\n <i></i><span>设置</span>\\r\\n</div>\\r\\n<div class="gear"></div>\\r\\n<style type="text/css">\\r\\n .gear {\\r\\n position: fixed;\\r\\n right: 40px;\\r\\n bottom: 60px;\\r\\n height: 20px;\\r\\n width: 20px;\\r\\n border: 1px solid #e9eaec;\\r\\n border-radius: 50%;\\r\\n box-shadow: 0 0 12px 4px rgb(106, 115, 133, 22%);\\r\\n padding: 10px;\\r\\n cursor: pointer;\\r\\n animation: roll 1s ease-out;\\r\\n transition: opacity 0.3s ease-out;\\r\\n background: none;\\r\\n z-index: 11110;\\r\\n }\\r\\n\\r\\n .setting {\\r\\n box-sizing: content-box;\\r\\n color: #fff;\\r\\n background-color: #fff;\\r\\n border-radius: 5px;\\r\\n position: fixed;\\r\\n bottom: 65px;\\r\\n width: 56px;\\r\\n height: 40px;\\r\\n transition: right 0.7s;\\r\\n -moz-transition: right 0.7s;\\r\\n -webkit-transition: right 0.7s;\\r\\n -o-transition: right 0.7s;\\r\\n z-index: 11110;\\r\\n padding: 4px;\\r\\n right: -54px;\\r\\n }\\r\\n\\r\\n .setting:hover {\\r\\n right: 0px;\\r\\n box-shadow: rgba(0, 85, 255, 0.098) 0px 0px 20px 0px;\\r\\n border: 1px solid rgb(233, 234, 236);\\r\\n }\\r\\n\\r\\n .setting i {\\r\\n background-position: -471px -982px;\\r\\n display: block;\\r\\n width: 20px;\\r\\n height: 20px;\\r\\n transition: 0.2s;\\r\\n background-image: url(//static.hdslb.com/images/base/icons.png);\\r\\n margin: auto;\\r\\n }\\r\\n\\r\\n .setting span {\\r\\n font-size: 14px;\\r\\n display: block;\\r\\n width: 50%;\\r\\n transition: 0.2s;\\r\\n color: #000;\\r\\n margin: auto;\\r\\n }\\r\\n\\r\\n @keyframes roll {\\r\\n\\r\\n 30%,\\r\\n 60%,\\r\\n 90% {\\r\\n transform: scale(1) rotate(0deg);\\r\\n }\\r\\n\\r\\n 10%,\\r\\n 40%,\\r\\n 70% {\\r\\n transform: scale(1.11) rotate(-180deg);\\r\\n }\\r\\n\\r\\n 20%,\\r\\n 50%,\\r\\n 80% {\\r\\n transform: scale(0.9) rotate(-360deg);\\r\\n }\\r\\n }\\r\\n</style>'; // src/images/svg/gear.svg var gear_default = '<svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M7.429 1.525a6.593 6.593 0 011.142 0c.036.003.108.036.137.146l.289 1.105c.147.56.55.967.997 1.189.174.086.341.183.501.29.417.278.97.423 1.53.27l1.102-.303c.11-.03.175.016.195.046.219.31.41.641.573.989.014.031.022.11-.059.19l-.815.806c-.411.406-.562.957-.53 1.456a4.588 4.588 0 010 .582c-.032.499.119 1.05.53 1.456l.815.806c.08.08.073.159.059.19a6.494 6.494 0 01-.573.99c-.02.029-.086.074-.195.045l-1.103-.303c-.559-.153-1.112-.008-1.529.27-.16.107-.327.204-.5.29-.449.222-.851.628-.998 1.189l-.289 1.105c-.029.11-.101.143-.137.146a6.613 6.613 0 01-1.142 0c-.036-.003-.108-.037-.137-.146l-.289-1.105c-.147-.56-.55-.967-.997-1.189a4.502 4.502 0 01-.501-.29c-.417-.278-.97-.423-1.53-.27l-1.102.303c-.11.03-.175-.016-.195-.046a6.492 6.492 0 01-.573-.989c-.014-.031-.022-.11.059-.19l.815-.806c.411-.406.562-.957.53-1.456a4.587 4.587 0 010-.582c.032-.499-.119-1.05-.53-1.456l-.815-.806c-.08-.08-.073-.159-.059-.19a6.44 6.44 0 01.573-.99c.02-.029.086-.075.195-.045l1.103.303c.559.153 1.112.008 1.529-.27.16-.107.327-.204.5-.29.449-.222.851-.628.998-1.189l.289-1.105c.029-.11.101-.143.137-.146zM8 0c-.236 0-.47.01-.701.03-.743.065-1.29.615-1.458 1.261l-.29 1.106c-.017.066-.078.158-.211.224a5.994 5.994 0 00-.668.386c-.123.082-.233.09-.3.071L3.27 2.776c-.644-.177-1.392.02-1.82.63a7.977 7.977 0 00-.704 1.217c-.315.675-.111 1.422.363 1.891l.815.806c.05.048.098.147.088.294a6.084 6.084 0 000 .772c.01.147-.038.246-.088.294l-.815.806c-.474.469-.678 1.216-.363 1.891.2.428.436.835.704 1.218.428.609 1.176.806 1.82.63l1.103-.303c.066-.019.176-.011.299.071.213.143.436.272.668.386.133.066.194.158.212.224l.289 1.106c.169.646.715 1.196 1.458 1.26a8.094 8.094 0 001.402 0c.743-.064 1.29-.614 1.458-1.26l.29-1.106c.017-.066.078-.158.211-.224a5.98 5.98 0 00.668-.386c.123-.082.233-.09.3-.071l1.102.302c.644.177 1.392-.02 1.82-.63.268-.382.505-.789.704-1.217.315-.675.111-1.422-.364-1.891l-.814-.806c-.05-.048-.098-.147-.088-.294a6.1 6.1 0 000-.772c-.01-.147.039-.246.088-.294l.814-.806c.475-.469.679-1.216.364-1.891a7.992 7.992 0 00-.704-1.218c-.428-.609-1.176-.806-1.82-.63l-1.103.303c-.066.019-.176.011-.299-.071a5.991 5.991 0 00-.668-.386c-.133-.066-.194-.158-.212-.224L10.16 1.29C9.99.645 9.444.095 8.701.031A8.094 8.094 0 008 0zm1.5 8a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0zM11 8a3 3 0 11-6 0 3 3 0 016 0z"></svg>'; // src/tampermonkey/ui.ts settingDefault.push( { key: "windowStop", menu: "common", label: "重构加固", svg: stethoscope_default, type: "switch", value: false, sub: "中止DOM解析", float: \`重构旧版页面前使用 window.stop 方法停止原有页面解析渲染,减少重构后页面被破坏的可能性。<br>※ 此选项可能导致网站图标加载失败,其他扩展及脚本兼容不兼容等问题,<strong>请在不得不启用时才启用!</strong>\` }, { key: "settingEntryType", menu: "common", label: "贴边隐藏设置入口", svg: gear_default, type: "switch", value: false, sub: "右下角贴边隐藏", float: "原滋原味保护旧版页面,不添加、修改或删除任何元素是本脚本的终极追求。<br>开启后将贴边隐藏设置入口,页面加载完成时也不会有任何提示,需要将鼠标移动到页面右下角以上一定感应区域才会显现。<br>※ <strong>Firefox用户切莫开启!</strong>", callback: () => { showSettingEntry(); } }, { key: "downloadBtn", menu: "download", type: "switch", label: "下载按钮", sub: "播放器右上角", value: false }, { key: "downloadNow", menu: "download", type: "button", label: "下载面板", sub: "下载当前视频", func: () => { downloadDefault(); }, button: "呼出" }, { key: "onlineDanmaku", menu: "danmaku", name: "在线弹幕", type: "list", list: [ { key: "url", label: "视频链接或参数", type: "input", float: "请提供对应视频的完整url或者能提取有效信息的参数,比如:<br>av806828803<br>av806828803?p=1<br>BV1T34y1o72w<br>ss3398<br>ep84795<br>aid=806828803<br>aid=806828803&p=1<br>avid=806828803<br>bvid=1T34y1o72w<br>bvid=BV1T34y1o72w<br>ssid=3398<br>epid=84795<br>season_id=3398<br>ep_id=84795", props: { placeholder: "av806828803" } }, { key: "concat", label: "合并已有弹幕", type: "switch", value: false }, { key: "action", label: "(👉゚ヮ゚)👉", type: "button", func: async () => { var _a3; if (!window.player) return toast.warning("请在播放页面使用本功能 →_→"); if (!window.player.setDanmaku) return toast.warning("内部组件丢失!", "请检查【托管原生脚本】功能是否开启!"); if (!setting.onlineDanmaku.url) return toast.warning("请输入视频链接或参数~"); toast.info(\`正在解析url:\${setting.onlineDanmaku.url}\`); try { const d = await urlParam(setting.onlineDanmaku.url, false); if (d.aid && d.cid) { toast.info("参数解析成功,正在获取弹幕数据~", d); debug(setting.onlineDanmaku.url, d); let dm = await danmaku.getSegDanmaku(d.aid, d.cid); if (dm) { const dat = danmaku.danmakuFormat(dm); toast.success("获取弹幕成功~"); (_a3 = window.player) == null ? void 0 : _a3.setDanmaku(dat, setting.danmakuContact); setting.downloadOther && pushDownload({ group: "弹幕", data: dat, up: "在线", down: \`N/A\`, callback: () => danmaku.saveDanmaku(dat, setting.onlineDanmaku.url) }); } else { toast.error("获取弹幕失败,请在控制台检查原因~"); } } else { toast.warning("提取弹幕参数失败,请检查输入~"); } } catch (e) { toast.error("在线弹幕", e); debug.error("在线弹幕", e); } }, button: "加载" } ] }, { key: "allAction", menu: "danmaku", label: "(👉゚ヮ゚)👉", type: "button", func: () => { allDanmaku(); }, button: "开始", float: "通过获取所有历史弹幕来实现,但每天的历史弹幕池其实有上限(远低于普通弹幕池),超出的部分是获取不到的,所以最后获取到的总数其实未必达得到【全弹幕】的要求(甚至可能不如普通弹幕池)。另外高级弹幕、代码弹幕等并不在历史弹幕池内,如果普通池内没有,想通过本功能来获取只是徒劳。" }, { key: "localMedia", menu: "player", type: "list", name: "播放本地文件", list: [ { key: "concat", label: "与已有弹幕合并", type: "switch", value: false }, { key: "file", label: "选择本地文件或者弹幕", type: "input", props: { type: "file", accept: "video/mp4,application/xml,application/json", multiple: "multiple" }, change: (v) => { new LocalMedia(v); } } ] } ); registerMenu(menu); registerSetting(settingDefault); var BilibilEntry = class extends HTMLElement { root; gear; stage; constructor() { super(); this.root = this.attachShadow({ mode: "closed" }); this.root.appendChild(createElements(htmlVnode(ui_default.replace('<div class="gear"></div>', \`<div class="gear">\${gear_default}</div>\`)))); this.stage = this.root.children[0]; this.gear = this.root.children[1]; this.stage.remove(); this.gear.remove(); this.gear.addEventListener("mouseover", () => this.gear.style.opacity = "0.8"); this.gear.addEventListener("mouseout", () => this.gear.style.opacity = "0"); this.gear.addEventListener("click", () => { showSetting2(); }); this.stage.addEventListener("click", () => { showSetting2(); }); } change() { if (setting.settingEntryType) { this.root.contains(this.gear) && this.gear.remove(); this.root.contains(this.stage) || this.root.appendChild(this.stage); } else { this.root.contains(this.stage) && this.stage.remove(); if (!this.root.contains(this.gear)) { this.root.appendChild(this.gear); setTimeout(() => { this.gear.style.opacity = "0"; }, 2e3); } } } }; customElements.get("bilibili-entry") || customElements.define("bilibili-entry", BilibilEntry); var node3 = new BilibilEntry(); function showSettingEntry() { document.body.contains(node3) || document.body.appendChild(node3); node3.change(); } // src/tampermonkey/vector.ts replaceUrl(urlClean(location.href)); if (setting.index && path[2] == "www.bilibili.com" && (!path[3] || (path[3].startsWith("?") || path[3].startsWith("#") || path[3].startsWith("index.")))) { indexPage(); } if (setting.av && /(\\/s)?\\/video\\/[AaBb][Vv]/.test(location.href)) { path[3] === "s" && replaceUrl(location.href.replace("s/video", "video")); avPage(); } if (setting.bangumi && /\\/bangumi\\/play\\/(ss|ep)/.test(location.href)) { bangumiPage(); } if (setting.watchlater && /\\/watchlater/.test(location.href)) { watchlaterPage(); } if (setting.player && /player\\./.test(location.href) && !location.href.includes("ancient")) { palyerPage(); } if (setting.playlist && /\\/medialist\\/play\\//.test(location.href) && !/watchlater/.test(location.href) || /\\/playlist\\/video\\/pl/.test(location.href)) { playlistPage(); } if (setting.ranking && /\\/v\\/popular\\//.test(location.href)) { rankingPage(); } if (setting.read && /\\/read\\/[Cc][Vv]/.test(location.href)) { readPage(); } if (setting.search && path[2] == "search.bilibili.com") { searchPage(); } globalVector(); doWhile(() => document.readyState === "complete", () => { window.top === window.self && showSettingEntry(); }); })(); /** * remove-invalid-xml-characters.js * @link https://gist.github.com/john-doherty/b9195065884cdbfd2017a4756e6409cc * @license MIT * @see https://en.wikipedia.org/wiki/Valid_characters_in_XML */ // @license GFUL // @license MIT `;"use strict"; (() => { // src/tampermonkey/index.ts (function() { new Function( "GM", "GM_xmlhttpRequest", "GM_getResourceText", "GM_getResourceURL", "GM_getValue", "GM_setValue", "GM_deleteValue", "GM_listValues", modules )( GM, GM_xmlhttpRequest, GM_getResourceText, GM_getResourceURL, GM_getValue, GM_setValue, GM_deleteValue, GM_listValues ); })(); })();
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址