// ==UserScript==
// @name B站收藏夹分区筛选功能
// @namespace https://github.com/Jayvin-Leung
// @version 1.0.0
// @author Jayvin Leung
// @description 恢复B站收藏夹分区筛选功能
// @license MIT
// @icon https://i0.hdslb.com/bfs/static/jinkela/long/images/favicon.ico
// @homepageURL https://github.com/Jayvin-Leung/Bilibili-Fav-Filter
// @supportURL https://github.com/Jayvin-Leung/Bilibili-Fav-Filter/issues
// @match https://space.bilibili.com/*/favlist*
// @require https://registry.npmmirror.com/vue/3.5.13/files/dist/vue.global.prod.js
// @grant GM_addStyle
// @run-at document-end
// @downloadURL https://update.greasyfork.icu/scripts/534996/B%E7%AB%99%E6%94%B6%E8%97%8F%E5%A4%B9%E5%88%86%E5%8C%BA%E7%AD%9B%E9%80%89%E5%8A%9F%E8%83%BD.user.js
// @updateURL https://update.greasyfork.icu/scripts/534996/B%E7%AB%99%E6%94%B6%E8%97%8F%E5%A4%B9%E5%88%86%E5%8C%BA%E7%AD%9B%E9%80%89%E5%8A%9F%E8%83%BD.meta.js
// ==/UserScript==
(t=>{if(typeof GM_addStyle=="function"){GM_addStyle(t);return}const e=document.createElement("style");e.textContent=t,document.head.append(e)})(" .vui_popover-content[data-v-12251a92]{display:flex}.menu-popover__panel-item[data-v-12251a92],.vui_button[data-v-c84debb6],.vui_button span[data-v-c84debb6]{display:flex;align-items:center;justify-content:space-evenly}.vui_button span[data-v-c84debb6]{padding:0 4px}.items__item[data-v-a3628dd0]{position:relative} ");
(function (vue) {
'use strict';
const XOR_CODE = 23442827791579n;
const MASK_CODE = 2251799813685247n;
const MAX_AID = 1n << 51n;
const BASE = 58n;
const data = "FcwAPNKTMug3GV5Lj7EJnHpWsx4tb8haYeviqBz6rkCy12mUSDQX9RdoZf";
const getCookieValue = (key) => {
const cookies = document.cookie.split(";");
for (let i = 0; i < cookies.length; i++) {
let cookie = cookies[i].trim().split("=");
if (cookie[0] === key) {
return cookie.length > 1 ? cookie[1] : "";
}
}
return null;
};
const getUid = () => {
return getCookieValue("DedeUserID");
};
const getCsrf = () => {
return getCookieValue("bili_jct");
};
const getCurrLocation = () => {
const currLocation = location.origin + location.pathname;
return currLocation.endsWith("/") ? currLocation : currLocation + "/";
};
const getCurrBvid = () => {
if (location.origin != "https://www.bilibili.com") return "";
const arr = location.pathname.split("/");
if (arr[1] !== "video") return "";
if (!new RegExp(/(BV|av)[a-zA-Z0-9]+/).test(arr[2])) return "";
return arr[2];
};
const av2bv = (aid) => {
const bytes = ["B", "V", "1", "0", "0", "0", "0", "0", "0", "0", "0", "0"];
let bvIndex = bytes.length - 1;
let tmp = (MAX_AID | BigInt(aid)) ^ XOR_CODE;
while (tmp > 0) {
bytes[bvIndex] = data[Number(tmp % BigInt(BASE))];
tmp = tmp / BASE;
bvIndex -= 1;
}
[bytes[3], bytes[9]] = [bytes[9], bytes[3]];
[bytes[4], bytes[7]] = [bytes[7], bytes[4]];
return bytes.join("");
};
const bv2av = (bvid) => {
const bvidArr = Array.from(bvid);
[bvidArr[3], bvidArr[9]] = [bvidArr[9], bvidArr[3]];
[bvidArr[4], bvidArr[7]] = [bvidArr[7], bvidArr[4]];
bvidArr.splice(0, 3);
const tmp = bvidArr.reduce(
(pre, bvidChar) => pre * BASE + BigInt(data.indexOf(bvidChar)),
0n
);
return Number(tmp & MASK_CODE ^ XOR_CODE);
};
const biliUtil = {
getCookieValue,
getUid,
getCsrf,
getCurrLocation,
getCurrBvid,
av2bv,
bv2av
};
const request = async (url, option, success, failure) => {
if (!url || !option) {
throw new Error("invaild url or option");
}
return fetch(url, option).then((response) => response.json()).then((result) => {
if (result.code === 0) {
success && success(result.data);
return result.data;
} else {
failure && failure(result.message);
return result.message;
}
}).catch((e) => {
failure && failure("请求发生错误:" + e);
return e;
});
};
class Request {
get(url, params = {}, success, failure) {
params.platform = "web";
const keys = Object.keys(params).sort();
const query = keys.map((k) => `${k}=${params[k]}`).join("&");
return request(
query ? `${url}?${query}` : url,
{
method: "GET",
credentials: "include",
mode: "cors"
},
success,
failure
);
}
post(url, params = {}, success, failure) {
params.platform = "web";
params.csrf = biliUtil.getCsrf();
const keys = Object.keys(params).sort();
const query = new URLSearchParams();
keys.forEach((k) => query.append(k, params[k]));
return request(
url,
{
method: "POST",
headers: {
"Content-Type": "application/x-www-form-urlencoded"
},
body: query.toString(),
credentials: "include",
mode: "cors"
},
success,
failure
);
}
}
const request$1 = new Request();
const all = ({ upMid }, success, failure) => {
if (!upMid) return;
let url = "https://api.bilibili.com/x/v3/fav/folder/created/list-all";
let params = {
up_mid: upMid
};
return request$1.get(url, params, success, failure);
};
const list = ({ mediaId: mediaId2, pn = 1, ps = 36, tid = 0, type = 0, keyword = "", order = "mtime" }, success, failure) => {
if (!mediaId2) return;
let url = "https://api.bilibili.com/x/v3/fav/resource/list";
let params = {
media_id: mediaId2,
pn,
ps,
tid,
type,
keyword,
order
};
return request$1.get(url, params, success, failure);
};
const del$1 = ({ mediaId: mediaId2, resources }, success, failure) => {
if (!mediaId2 || !resources) return;
let url = "https://api.bilibili.com/x/v3/fav/resource/batch-del";
let params = {
media_id: mediaId2,
resources
};
return request$1.post(url, params, success, failure);
};
const copy = ({ mid: mid2, srcMediaId, tarMediaId, resources }, success, failure) => {
if (!mid2 || !srcMediaId || !tarMediaId || !resources) return;
let url = "https://api.bilibili.com/x/v3/fav/resource/copy";
let params = {
mid: mid2,
src_media_id: srcMediaId,
tar_media_id: tarMediaId,
resources
};
return request$1.post(url, params, success, failure);
};
const move = ({ mid: mid2, srcMediaId, tarMediaId, resources }, success, failure) => {
if (!mid2 || !srcMediaId || !tarMediaId || !resources) return;
let url = "https://api.bilibili.com/x/v3/fav/resource/move";
let params = {
mid: mid2,
src_media_id: srcMediaId,
tar_media_id: tarMediaId,
resources
};
return request$1.post(url, params, success, failure);
};
const clean = ({ mediaId: mediaId2 }, success, failure) => {
if (!mediaId2) return;
let url = "https://api.bilibili.com/x/v3/fav/resource/clean";
let params = {
media_id: mediaId2
};
return request$1.post(url, params, success, failure);
};
const _hoisted_1$8 = {
key: 0,
class: "vui_toast--wrapper"
};
const _hoisted_2$8 = { class: "vui_toast" };
const _sfc_main$c = {
__name: "Message",
props: /* @__PURE__ */ vue.mergeModels({
text: {
required: false,
default: ""
}
}, {
"open": {},
"openModifiers": {}
}),
emits: ["update:open"],
setup(__props) {
const open = vue.useModel(__props, "open");
return (_ctx, _cache) => {
return open.value ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_1$8, [
vue.createElementVNode("div", _hoisted_2$8, vue.toDisplayString(__props.text), 1)
])) : vue.createCommentVNode("", true);
};
}
};
let app$2 = null;
let timerId = null;
const openRef$2 = vue.ref(false);
const textRef = vue.ref("");
const render$3 = () => {
if (app$2) return;
app$2 = vue.createApp({
render: () => {
return vue.h(_sfc_main$c, {
open: openRef$2.value,
text: textRef.value
});
}
});
app$2.mount(
(() => {
const div = document.createElement("div");
document.body.append(div);
return div;
})()
);
};
const message = {
info: ({ text }) => {
render$3();
openRef$2.value = true;
textRef.value = text;
timerId && clearTimeout(timerId);
timerId = setTimeout(() => {
openRef$2.value = false;
}, 3e3);
}
};
const _hoisted_1$7 = { class: "vui_dialog--root" };
const _hoisted_2$7 = { class: "vui_dialog--wrapper" };
const _hoisted_3$5 = { class: "vui_dialog--header" };
const _hoisted_4$3 = { class: "vui_dialog--title" };
const _hoisted_5$3 = { class: "vui_dialog--body" };
const _hoisted_6$3 = { class: "vui_dialog--footer" };
const _sfc_main$b = {
__name: "Modal",
props: /* @__PURE__ */ vue.mergeModels({
wrapClassName: {
type: String,
required: false,
default: ""
},
title: {
required: false,
default: ""
},
okText: {
required: false,
default: ""
},
cancelText: {
required: false,
default: ""
}
}, {
"open": {},
"openModifiers": {}
}),
emits: /* @__PURE__ */ vue.mergeModels(["ok", "cancel", "close"], ["update:open"]),
setup(__props, { emit: __emit }) {
const open = vue.useModel(__props, "open");
const emits = __emit;
const modalRef = vue.ref(null);
const ok = () => {
emits("ok");
};
const cancel = () => {
open.value = false;
emits("cancel");
};
const close = () => {
open.value = false;
emits("close");
};
const globalClose = (event) => {
if (!modalRef.value) return;
if (!modalRef.value.contains(event.target)) {
close();
}
};
vue.watch(
() => open.value,
() => {
if (open.value) {
document.addEventListener("click", globalClose);
} else {
document.removeEventListener("click", globalClose);
}
}
);
return (_ctx, _cache) => {
return vue.withDirectives((vue.openBlock(), vue.createElementBlock("div", _hoisted_1$7, [
_cache[1] || (_cache[1] = vue.createElementVNode("div", { class: "vui_dialog--mask" }, null, -1)),
vue.createElementVNode("div", _hoisted_2$7, [
vue.createElementVNode("div", {
class: vue.normalizeClass(`vui_dialog--content ${__props.wrapClassName}`),
ref_key: "modalRef",
ref: modalRef
}, [
vue.createElementVNode("div", {
class: "vui_dialog--close",
onClick: close
}, _cache[0] || (_cache[0] = [
vue.createElementVNode("svg", {
class: "vui_icon",
xmlns: "http://www.w3.org/2000/svg",
viewBox: "0 0 20 20",
width: "20",
height: "20",
"xmlns:xlink": "http://www.w3.org/1999/xlink"
}, [
vue.createElementVNode("path", {
d: "M4.106275 4.108583333333334C4.350341666666667 3.8645000000000005 4.746083333333333 3.8645000000000005 4.9901583333333335 4.108583333333334L9.998666666666667 9.117125L15.008583333333334 4.107216666666667C15.252625 3.8631333333333338 15.648375000000001 3.8631333333333338 15.892458333333334 4.107216666666667C16.136541666666666 4.351291666666667 16.136541666666666 4.747025000000001 15.892458333333334 4.9911L10.882541666666667 10.001000000000001L15.891375 15.009791666666667C16.135458333333332 15.253874999999999 16.135458333333332 15.649625 15.891375 15.893708333333334C15.647291666666668 16.13775 15.251541666666668 16.13775 15.0075 15.893708333333334L9.998666666666667 10.884875000000001L4.991233333333334 15.892333333333333C4.747158333333333 16.13641666666667 4.351425 16.13641666666667 4.10735 15.892333333333333C3.8632750000000002 15.648249999999999 3.8632750000000002 15.252541666666666 4.10735 15.008458333333333L9.114791666666667 10.001000000000001L4.106275 4.992466666666667C3.8621916666666665 4.7483916666666675 3.8621916666666665 4.352658333333333 4.106275 4.108583333333334z",
fill: "currentColor"
})
], -1)
])),
vue.createElementVNode("div", _hoisted_3$5, [
vue.createElementVNode("div", _hoisted_4$3, vue.toDisplayString(__props.title), 1)
]),
vue.createElementVNode("div", _hoisted_5$3, [
vue.renderSlot(_ctx.$slots, "default")
]),
vue.createElementVNode("div", _hoisted_6$3, [
__props.cancelText ? (vue.openBlock(), vue.createElementBlock("button", {
key: 0,
class: "vui_button vui_dialog--btn vui_dialog--btn-cancel",
onClick: cancel
}, vue.toDisplayString(__props.cancelText || "取消"), 1)) : vue.createCommentVNode("", true),
__props.okText ? (vue.openBlock(), vue.createElementBlock("button", {
key: 1,
class: "vui_button vui_button--blue vui_dialog--btn vui_dialog--btn-confirm",
onClick: ok
}, vue.toDisplayString(__props.okText || "确定"), 1)) : vue.createCommentVNode("", true)
])
], 2)
])
], 512)), [
[vue.vShow, open.value]
]);
};
}
};
let app$1 = null;
const openRef$1 = vue.ref(false);
const wrapClassNameRef = vue.ref("");
const titleRef = vue.ref("");
const templateRef = vue.shallowRef(null);
const templatePropsRef = vue.ref(null);
const $okRef = vue.ref(null);
const $cancelRef$1 = vue.ref(null);
const $closeRef = vue.ref(null);
const render$2 = () => {
if (app$1) return;
app$1 = vue.createApp({
render: () => {
return vue.h(
_sfc_main$b,
{
open: openRef$1.value,
"onUpdate:open": (newValue) => openRef$1.value = newValue,
wrapClassName: wrapClassNameRef.value,
title: titleRef.value,
okText: $okRef.value && "确定",
onOk: () => {
$okRef.value && $okRef.value();
},
cancelText: $cancelRef$1.value && "取消",
onCancel: () => {
$cancelRef$1.value && $cancelRef$1.value();
},
onClose: () => {
$closeRef.value && $closeRef.value();
}
},
() => templateRef.value && vue.h(templateRef.value, { ...templatePropsRef.value })
);
}
});
app$1.mount(
(() => {
const div = document.createElement("div");
document.body.append(div);
return div;
})()
);
};
const modal = {
open: ({ wrapClassName, title, template, templateProps, $ok, $cancel, $close }) => {
render$2();
openRef$1.value = true;
wrapClassNameRef.value = wrapClassName;
titleRef.value = title;
templateRef.value = template;
templatePropsRef.value = templateProps;
$okRef.value = $ok;
$cancelRef$1.value = $cancel;
$closeRef.value = $close;
return () => {
openRef$1.value = false;
$closeRef.value && $closeRef.value();
};
}
};
const _hoisted_1$6 = { class: "modify-fav-wrapper" };
const _hoisted_2$6 = { class: "modify-fav-list" };
const _hoisted_3$4 = { class: "vui_radio-group" };
const _hoisted_4$2 = ["onClick"];
const _hoisted_5$2 = { class: "vui_radio--input" };
const _hoisted_6$2 = ["value"];
const _hoisted_7$1 = { class: "vui_radio--label" };
const _hoisted_8$1 = { class: "modify-fav-item__content" };
const _hoisted_9$1 = { class: "modify-fav-item__info" };
const _hoisted_10$1 = { class: "modify-fav-item__title" };
const _hoisted_11$1 = { class: "modify-fav-item__count" };
const _sfc_main$a = {
__name: "Modify",
props: /* @__PURE__ */ vue.mergeModels({
favs: {
type: Array,
required: true,
default: []
}
}, {
"selected": {},
"selectedModifiers": {}
}),
emits: ["update:selected"],
setup(__props) {
const selected = vue.useModel(__props, "selected");
const handleSelect = (id, event) => {
event.preventDefault();
event.stopPropagation();
selected.value = id;
};
return (_ctx, _cache) => {
return vue.openBlock(), vue.createElementBlock("div", _hoisted_1$6, [
vue.createElementVNode("div", _hoisted_2$6, [
vue.createElementVNode("div", _hoisted_3$4, [
(vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(__props.favs, (fav) => {
return vue.openBlock(), vue.createElementBlock("label", {
role: "radio",
class: vue.normalizeClass({
vui_radio: true,
"modify-fav-item": true,
"vui_radio--checked": selected.value === fav.id
}),
onClick: (event) => handleSelect(fav.id, event)
}, [
vue.createElementVNode("span", _hoisted_5$2, [
vue.createElementVNode("input", {
type: "radio",
class: "vui_radio--input-original",
value: fav.id
}, null, 8, _hoisted_6$2),
_cache[0] || (_cache[0] = vue.createElementVNode("span", { class: "vui_radio--input-box" }, null, -1))
]),
vue.createElementVNode("span", _hoisted_7$1, [
vue.createElementVNode("div", _hoisted_8$1, [
vue.createElementVNode("div", _hoisted_9$1, [
_cache[1] || (_cache[1] = vue.createElementVNode("i", {
class: "vui_icon sic-fsp-folder_locked_line",
style: { "font-variation-settings": "'strk' 1.5", "font-size": "20px" }
}, null, -1)),
vue.createElementVNode("div", _hoisted_10$1, vue.toDisplayString(fav.title), 1)
]),
vue.createElementVNode("div", _hoisted_11$1, vue.toDisplayString(fav.media_count), 1)
])
])
], 10, _hoisted_4$2);
}), 256))
])
])
]);
};
}
};
const _sfc_main$9 = {
__name: "Order",
emits: ["change"],
setup(__props, { expose: __expose, emit: __emit }) {
const emits = __emit;
const selected = vue.ref("mtime");
const handleSelect = (order) => {
selected.value = order;
emits("change", order);
};
__expose({
reset: () => {
selected.value = "mtime";
}
});
return (_ctx, _cache) => {
return vue.openBlock(), vue.createElementBlock("div", vue.mergeProps(_ctx.$attrs, { class: "radio-filter" }), [
vue.createElementVNode("div", {
class: vue.normalizeClass({
"radio-filter__item": true,
"radio-filter__item--active": selected.value === "mtime"
}),
onClick: _cache[0] || (_cache[0] = ($event) => handleSelect("mtime"))
}, " 最近收藏 ", 2),
vue.createElementVNode("div", {
class: vue.normalizeClass({
"radio-filter__item": true,
"radio-filter__item--active": selected.value === "view"
}),
onClick: _cache[1] || (_cache[1] = ($event) => handleSelect("view"))
}, " 最多播放 ", 2),
vue.createElementVNode("div", {
class: vue.normalizeClass({
"radio-filter__item": true,
"radio-filter__item--active": selected.value === "pubtime"
}),
onClick: _cache[2] || (_cache[2] = ($event) => handleSelect("pubtime"))
}, " 最近投稿 ", 2)
], 16);
};
}
};
const _export_sfc = (sfc, props) => {
const target = sfc.__vccOpts || sfc;
for (const [key, val] of props) {
target[key] = val;
}
return target;
};
const _hoisted_1$5 = { class: "vui_popover-content" };
const _hoisted_2$5 = {
"data-v-831e1505": "",
class: "menu-popover__panel"
};
const _hoisted_3$3 = ["innerHTML", "onClick"];
const _sfc_main$8 = {
__name: "Popover",
props: /* @__PURE__ */ vue.mergeModels({
target: {
required: true
},
items: {
type: Array,
required: true,
default: []
}
}, {
"open": {},
"openModifiers": {}
}),
emits: /* @__PURE__ */ vue.mergeModels(["cancel"], ["update:open"]),
setup(__props, { emit: __emit }) {
const open = vue.useModel(__props, "open");
const props = __props;
const emits = __emit;
const popoverRef = vue.ref(null);
const offsetTop = vue.ref(0);
const offsetLeft = vue.ref(0);
const globalClose = (event) => {
if (!popoverRef.value) return;
if (!popoverRef.value.contains(event.target)) {
open.value = false;
emits("cancel");
}
};
const globalResize = () => {
const targetRect = props.target.getBoundingClientRect();
const popoverRect = popoverRef.value.getBoundingClientRect();
offsetTop.value = targetRect.bottom + 10;
if (window.scrollY) offsetTop.value += window.scrollY;
offsetLeft.value = targetRect.left + (targetRect.width - popoverRect.width) / 2;
if (window.scrollX) offsetLeft.value += window.scrollX;
};
vue.watch(
() => open.value,
() => {
if (open.value) {
document.addEventListener("click", globalClose);
window.addEventListener("resize", globalResize);
vue.nextTick(() => globalResize());
} else {
document.removeEventListener("click", globalClose);
window.removeEventListener("resize", globalResize);
}
}
);
vue.watch(
() => props.target,
() => {
if (open.value) {
vue.nextTick(() => globalResize());
}
}
);
return (_ctx, _cache) => {
return vue.withDirectives((vue.openBlock(), vue.createElementBlock("div", {
class: "vui_popover vui_popover-is-bottom-end",
"data-popper-placement": "bottom-end",
style: vue.normalizeStyle({
"z-index": 1e4,
position: "absolute",
// inset: '0px 0px auto auto',
top: "0px",
left: "0px",
margin: "0px",
transform: `translate(${offsetLeft.value}px, ${offsetTop.value}px)`
}),
ref_key: "popoverRef",
ref: popoverRef
}, [
vue.createElementVNode("div", _hoisted_1$5, [
(vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(__props.items, (col) => {
return vue.openBlock(), vue.createElementBlock("div", _hoisted_2$5, [
(vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(col, (row) => {
return vue.openBlock(), vue.createElementBlock("div", {
"data-v-831e1505": "",
class: "menu-popover__panel-item",
innerHTML: row.$html,
onClick: row.$click
}, null, 8, _hoisted_3$3);
}), 256))
]);
}), 256))
])
], 4)), [
[vue.vShow, open.value]
]);
};
}
};
const Popover = /* @__PURE__ */ _export_sfc(_sfc_main$8, [["__scopeId", "data-v-12251a92"]]);
let app = null;
const openRef = vue.ref(false);
const targetRef = vue.ref(null);
const itemsRef = vue.ref([]);
const $cancelRef = vue.ref(null);
const render$1 = () => {
if (app) return;
app = vue.createApp({
render: () => {
return vue.h(Popover, {
open: openRef.value,
"onUpdate:open": (newValue) => openRef.value = newValue,
target: targetRef.value,
items: itemsRef.value,
onCancel: () => {
$cancelRef.value && $cancelRef.value();
}
});
}
});
app.mount(
(() => {
const div = document.createElement("div");
document.body.append(div);
return div;
})()
);
};
const popover = {
open: ({ target, items, $cancel }) => {
render$1();
if (targetRef.value && targetRef.value !== target) {
$cancelRef.value && $cancelRef.value();
}
openRef.value = true;
targetRef.value = target;
itemsRef.value = items;
$cancelRef.value = $cancel;
}
};
const _hoisted_1$4 = { key: 0 };
const _hoisted_2$4 = ["innerHTML"];
const _sfc_main$7 = {
__name: "Channel",
emits: ["change"],
setup(__props, { expose: __expose, emit: __emit }) {
const channels = [
[
{
icon: '',
title: '动画',
tid: 1
},
{
icon: '',
title: '游戏',
tid: 4
},
{
icon: '',
title: '鬼畜',
tid: 119
},
{
icon: '',
title: '音乐',
tid: 3
},
{
icon: '',
title: '舞蹈',
tid: 129
},
{
icon: '',
title: '影视',
tid: 181
}
],
[
{
icon: '',
title: '生活',
tid: 160
},
{
icon: '',
title: '娱乐',
tid: 5
},
{
icon: '',
title: '知识',
tid: 36
},
{
icon: '',
title: '科技数码',
tid: 188
},
{
icon: '',
title: '资讯',
tid: 202
}
],
[
{
icon: '',
title: '美食',
tid: 211
},
{
icon: '',
title: '汽车',
tid: 223
},
{
icon: '',
title: '时尚美妆',
tid: 155
},
{
icon: '',
title: '体育运动',
tid: 234
},
{
icon: '',
title: '动物',
tid: 217
}
]
];
const emits = __emit;
const textOfSelected = vue.ref(null);
const handleShow = (event) => {
event.stopPropagation();
let button = null;
let arrow = null;
if (event.target.classList.contains("vui_button")) {
button = event.target;
} else {
button = event.target.closest(".vui_button");
}
arrow = button.querySelector(".sic-BDC-arrow_expand_line");
arrow.classList.add("revert");
popover.open({
target: button,
items: channels.map((col) => {
return col.map((row) => {
return {
$html: row.icon + row.title,
$click: () => {
textOfSelected.value = row.icon + row.title;
emits("change", row.tid);
}
};
});
}),
$cancel: () => {
arrow.classList.remove("revert");
}
});
};
const handleDeselect = (event) => {
event.stopPropagation();
textOfSelected.value = null;
emits("change", 0);
};
__expose({
reset: () => {
textOfSelected.value = null;
}
});
return (_ctx, _cache) => {
return vue.openBlock(), vue.createElementBlock("div", null, [
vue.createElementVNode("div", vue.mergeProps({ "data-v-831e1505": "" }, _ctx.$attrs, { class: "menu-popover" }), [
vue.createElementVNode("button", vue.mergeProps(_ctx.$attrs, {
class: "vui_button",
onClick: handleShow
}), [
textOfSelected.value === null ? (vue.openBlock(), vue.createElementBlock("span", _hoisted_1$4, "全部分区")) : (vue.openBlock(), vue.createElementBlock(vue.Fragment, { key: 1 }, [
vue.createElementVNode("div", {
class: "vui_input-clear",
onClick: handleDeselect
}, _cache[0] || (_cache[0] = [
vue.createElementVNode("svg", {
class: "vui_icon vui_input-clear-base__icon",
xmlns: "http://www.w3.org/2000/svg",
viewBox: "0 0 16 16",
width: "16",
height: "16",
"xmlns:xlink": "http://www.w3.org/1999/xlink"
}, [
vue.createElementVNode("path", {
d: "M8 1.3333333333333333C4.318099999999999 1.3333333333333333 1.3333333333333333 4.318099999999999 1.3333333333333333 8C1.3333333333333333 11.681899999999999 4.318099999999999 14.666666666666666 8 14.666666666666666C11.681899999999999 14.666666666666666 14.666666666666666 11.681899999999999 14.666666666666666 8C14.666666666666666 4.318099999999999 11.681899999999999 1.3333333333333333 8 1.3333333333333333zM5.64258 6.3496C5.4473199999999995 6.1543399999999995 5.4473199999999995 5.837753333333333 5.64258 5.6424933333333325C5.837846666666666 5.447233333333333 6.154426666666667 5.447233333333333 6.349693333333333 5.6424933333333325L8 7.2928L9.650333333333332 5.6424933333333325C9.845566666666667 5.447233333333333 10.162166666666666 5.447233333333333 10.357433333333333 5.6424933333333325C10.552666666666667 5.837753333333333 10.552666666666667 6.1543399999999995 10.357433333333333 6.3496L8.7071 7.9999L10.357433333333333 9.650233333333333C10.552666666666667 9.845466666666667 10.552666666666667 10.162066666666666 10.357433333333333 10.357333333333333C10.162166666666666 10.5526 9.845566666666667 10.5526 9.650333333333332 10.357333333333333L8 8.706999999999999L6.349693333333333 10.357333333333333C6.154426666666667 10.5526 5.837846666666666 10.5526 5.64258 10.357333333333333C5.4473199999999995 10.162066666666666 5.4473199999999995 9.845466666666667 5.64258 9.650233333333333L7.2928999999999995 7.9999L5.64258 6.3496z",
fill: "currentColor"
})
], -1)
])),
vue.createElementVNode("span", { innerHTML: textOfSelected.value }, null, 8, _hoisted_2$4)
], 64)),
vue.createElementVNode("i", vue.mergeProps(_ctx.$attrs, {
class: "vui_icon sic-BDC-arrow_expand_line",
style: { "font-size": "12px" }
}), null, 16)
], 16)
], 16)
]);
};
}
};
const Channel = /* @__PURE__ */ _export_sfc(_sfc_main$7, [["__scopeId", "data-v-c84debb6"]]);
const _hoisted_1$3 = { class: "vui_input__prepend" };
const _hoisted_2$3 = { class: "vui_input-wrapper vui_input-wrapper--prepped" };
const _hoisted_3$2 = { class: "vui_input__suffix" };
const _sfc_main$6 = {
__name: "Search",
emits: ["change"],
setup(__props, { expose: __expose, emit: __emit }) {
const emits = __emit;
const selected = vue.ref(0);
const textOfSelected = vue.computed(() => {
switch (selected.value) {
case 0:
return "当前";
case 1:
return "全部";
default:
return "";
}
});
const keyword = vue.ref("");
const handleShow = (event) => {
event.stopPropagation();
let button = null;
let arrow = null;
if (event.target.classList.contains("vui_button")) {
button = event.target;
} else {
button = event.target.closest(".vui_button");
}
arrow = button.querySelector(".sic-BDC-arrow_expand_line");
arrow.classList.add("revert");
popover.open({
target: button,
items: [
[
{
$html: "当前收藏夹",
$click: () => {
selected.value = 0;
}
},
{
$html: "全部收藏夹",
$click: () => {
selected.value = 1;
}
}
]
],
$cancel: () => {
arrow.classList.remove("revert");
}
});
};
const handleSearch = () => {
if (!keyword.value) {
message.info({ text: "请输入关键词" });
return;
}
emits("change", selected.value, keyword.value);
};
const handleEnter = () => {
handleSearch();
};
const handleClear = () => {
keyword.value = "";
};
vue.watch(
() => keyword.value,
(value, oldValue) => {
if (!value && oldValue) {
emits("change", 0, keyword.value);
}
}
);
__expose({
reset: () => {
selected.value = 0;
keyword.value = "";
}
});
return (_ctx, _cache) => {
return vue.openBlock(), vue.createElementBlock("div", vue.mergeProps(_ctx.$attrs, { class: "vui_input fav-list-header-filter__search" }), [
vue.createElementVNode("div", _hoisted_1$3, [
vue.createElementVNode("div", vue.mergeProps({ "data-v-831e1505": "" }, _ctx.$attrs, { class: "menu-popover" }), [
vue.createElementVNode("button", vue.mergeProps(_ctx.$attrs, {
class: "vui_button",
onClick: handleShow
}), [
vue.createTextVNode(vue.toDisplayString(textOfSelected.value) + " ", 1),
vue.createElementVNode("i", vue.mergeProps(_ctx.$attrs, {
class: "vui_icon sic-BDC-arrow_expand_line",
style: { "font-size": "12px" }
}), null, 16)
], 16)
], 16)
]),
vue.createElementVNode("div", _hoisted_2$3, [
vue.withDirectives(vue.createElementVNode("input", {
type: "text",
class: "vui_input__input vui_input__input-resizable fav-list-header-filter__search",
placeholder: "请输入关键词",
"onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => keyword.value = $event),
onKeyup: vue.withKeys(handleEnter, ["enter"])
}, null, 544), [
[vue.vModelText, keyword.value]
]),
vue.createElementVNode("div", _hoisted_3$2, [
keyword.value ? (vue.openBlock(), vue.createElementBlock("div", {
key: 0,
class: "vui_input-clear",
onClick: handleClear
}, _cache[1] || (_cache[1] = [
vue.createElementVNode("svg", {
class: "vui_icon vui_input-clear-base__icon",
xmlns: "http://www.w3.org/2000/svg",
viewBox: "0 0 16 16",
width: "16",
height: "16",
"xmlns:xlink": "http://www.w3.org/1999/xlink"
}, [
vue.createElementVNode("path", {
d: "M8 1.3333333333333333C4.318099999999999 1.3333333333333333 1.3333333333333333 4.318099999999999 1.3333333333333333 8C1.3333333333333333 11.681899999999999 4.318099999999999 14.666666666666666 8 14.666666666666666C11.681899999999999 14.666666666666666 14.666666666666666 11.681899999999999 14.666666666666666 8C14.666666666666666 4.318099999999999 11.681899999999999 1.3333333333333333 8 1.3333333333333333zM5.64258 6.3496C5.4473199999999995 6.1543399999999995 5.4473199999999995 5.837753333333333 5.64258 5.6424933333333325C5.837846666666666 5.447233333333333 6.154426666666667 5.447233333333333 6.349693333333333 5.6424933333333325L8 7.2928L9.650333333333332 5.6424933333333325C9.845566666666667 5.447233333333333 10.162166666666666 5.447233333333333 10.357433333333333 5.6424933333333325C10.552666666666667 5.837753333333333 10.552666666666667 6.1543399999999995 10.357433333333333 6.3496L8.7071 7.9999L10.357433333333333 9.650233333333333C10.552666666666667 9.845466666666667 10.552666666666667 10.162066666666666 10.357433333333333 10.357333333333333C10.162166666666666 10.5526 9.845566666666667 10.5526 9.650333333333332 10.357333333333333L8 8.706999999999999L6.349693333333333 10.357333333333333C6.154426666666667 10.5526 5.837846666666666 10.5526 5.64258 10.357333333333333C5.4473199999999995 10.162066666666666 5.4473199999999995 9.845466666666667 5.64258 9.650233333333333L7.2928999999999995 7.9999L5.64258 6.3496z",
fill: "currentColor"
})
], -1)
]))) : vue.createCommentVNode("", true),
vue.createElementVNode("i", vue.mergeProps(_ctx.$attrs, {
class: "vui_icon sic-BDC-magnifier_search_line",
style: { "font-size": "20px" },
onClick: handleSearch
}), null, 16)
])
])
], 16);
};
}
};
const _sfc_main$5 = {
__name: "Filter",
emits: ["change"],
setup(__props, { expose: __expose, emit: __emit }) {
const emits = __emit;
const orderRef = vue.ref(null);
const channelRef = vue.ref(null);
const searchRef = vue.ref(null);
const handleChangeOrder = (order) => {
emits("change", [{ key: "order", value: order }]);
};
const handleChangeChannel = (tid) => {
emits("change", [{ key: "tid", value: tid }]);
};
const handleChangeSearch = (type, keyword) => {
emits("change", [
{ key: "type", value: type },
{ key: "keyword", value: keyword }
]);
};
__expose({
reset: () => {
var _a, _b, _c, _d, _e, _f;
((_a = orderRef.value) == null ? void 0 : _a.reset) && ((_b = orderRef.value) == null ? void 0 : _b.reset());
((_c = channelRef.value) == null ? void 0 : _c.reset) && ((_d = channelRef.value) == null ? void 0 : _d.reset());
((_e = searchRef.value) == null ? void 0 : _e.reset) && ((_f = searchRef.value) == null ? void 0 : _f.reset());
}
});
return (_ctx, _cache) => {
return vue.openBlock(), vue.createElementBlock("div", vue.mergeProps(_ctx.$attrs, { class: "fav-list-header-filter" }), [
vue.createElementVNode("div", vue.mergeProps(_ctx.$attrs, { class: "fav-list-header-filter__left" }), [
vue.createVNode(_sfc_main$9, vue.mergeProps(_ctx.$attrs, {
ref_key: "orderRef",
ref: orderRef,
onChange: handleChangeOrder
}), null, 16)
], 16),
vue.createElementVNode("div", vue.mergeProps(_ctx.$attrs, { class: "fav-list-header-filter__center" }), [
vue.createVNode(Channel, vue.mergeProps(_ctx.$attrs, {
ref_key: "channelRef",
ref: channelRef,
onChange: handleChangeChannel
}), null, 16)
], 16),
vue.createElementVNode("div", vue.mergeProps(_ctx.$attrs, { class: "fav-list-header-filter__right" }), [
vue.createVNode(_sfc_main$6, vue.mergeProps(_ctx.$attrs, {
ref_key: "searchRef",
ref: searchRef,
onChange: handleChangeSearch
}), null, 16)
], 16)
], 16);
};
}
};
const _hoisted_1$2 = { class: "vui_checkbox--input" };
const _hoisted_2$2 = ["value"];
const _sfc_main$4 = {
__name: "Batch",
props: /* @__PURE__ */ vue.mergeModels({
list: {
type: Array,
required: true,
default: []
},
isSelf: {
type: Boolean,
required: true,
default: false
}
}, {
"selected": {},
"selectedModifiers": {}
}),
emits: /* @__PURE__ */ vue.mergeModels(["batchAction"], ["update:selected"]),
setup(__props, { emit: __emit }) {
const selected = vue.useModel(__props, "selected");
const props = __props;
const emits = __emit;
const isClickSelectAllBtn = vue.ref(false);
const checked = vue.computed(() => {
if (props.list.length > 0) {
return selected.value.length === props.list.length;
} else {
return isClickSelectAllBtn.value;
}
});
const handleSelect = (event) => {
event.preventDefault();
event.stopPropagation();
if (checked.value) {
if (props.list.length > 0) {
selected.value = [];
} else {
isClickSelectAllBtn.value = false;
}
} else {
if (props.list.length > 0) {
selected.value = [];
selected.value = props.list.map((media) => {
return `${media.id}:${media.type}`;
});
} else {
isClickSelectAllBtn.value = true;
}
}
};
const handleClean = (event) => {
event.stopPropagation();
emits("batchAction", { type: "clean" });
};
const handleDel = (event) => {
event.stopPropagation();
emits("batchAction", { type: "del" });
};
const handleCopy = (event) => {
event.stopPropagation();
emits("batchAction", { type: "copy" });
};
const handleMove = (event) => {
event.stopPropagation();
emits("batchAction", { type: "move" });
};
vue.watch(
() => props.list,
() => {
isClickSelectAllBtn.value = false;
}
);
return (_ctx, _cache) => {
return vue.openBlock(), vue.createElementBlock("div", vue.mergeProps(_ctx.$attrs, { class: "fav-list-header-filter" }), [
vue.createElementVNode("div", vue.mergeProps(_ctx.$attrs, { class: "fav-list-header-filter__left" }), [
vue.createElementVNode("label", vue.mergeProps(_ctx.$attrs, {
role: "checkbox",
class: { vui_checkbox: true, "vui_checkbox--checked": checked.value },
onClick: handleSelect
}), [
vue.createElementVNode("span", _hoisted_1$2, [
vue.createElementVNode("input", {
type: "checkbox",
class: "vui_checkbox--input-original",
value: checked.value
}, null, 8, _hoisted_2$2),
_cache[0] || (_cache[0] = vue.createElementVNode("span", { class: "vui_checkbox--input-box" }, null, -1))
]),
_cache[1] || (_cache[1] = vue.createElementVNode("span", { class: "vui_checkbox--label" }, "全选", -1))
], 16),
vue.createElementVNode("div", vue.mergeProps(_ctx.$attrs, { class: "selected" }), "已选择 " + vue.toDisplayString(selected.value.length) + " 个视频", 17)
], 16),
vue.createElementVNode("div", vue.mergeProps(_ctx.$attrs, { class: "fav-list-header-filter__right" }), [
__props.isSelf ? (vue.openBlock(), vue.createElementBlock("button", vue.mergeProps({ key: 0 }, _ctx.$attrs, {
class: "vui_button action-btn",
onClick: handleClean
}), [
vue.createElementVNode("i", vue.mergeProps(_ctx.$attrs, {
class: "vui_icon sic-BDC-brush_clear_line",
style: { "font-size": "16px" }
}), null, 16),
_cache[2] || (_cache[2] = vue.createTextVNode(" 清除失效内容 "))
], 16)) : vue.createCommentVNode("", true),
__props.isSelf ? (vue.openBlock(), vue.createElementBlock("button", vue.mergeProps({ key: 1 }, _ctx.$attrs, {
class: "vui_button action-btn",
onClick: handleDel
}), [
vue.createElementVNode("i", vue.mergeProps(_ctx.$attrs, {
class: "vui_icon sic-BDC-star_favorite_off_line",
style: { "font-size": "16px" }
}), null, 16),
_cache[3] || (_cache[3] = vue.createTextVNode(" 取消收藏 "))
], 16)) : vue.createCommentVNode("", true),
vue.createElementVNode("button", vue.mergeProps(_ctx.$attrs, {
class: "vui_button action-btn",
onClick: handleCopy
}), [
vue.createElementVNode("i", vue.mergeProps(_ctx.$attrs, {
class: "vui_icon sic-BDC-copy_line",
style: { "font-size": "16px" }
}), null, 16),
_cache[4] || (_cache[4] = vue.createTextVNode(" 复制至 "))
], 16),
__props.isSelf ? (vue.openBlock(), vue.createElementBlock("button", vue.mergeProps({ key: 2 }, _ctx.$attrs, {
class: "vui_button action-btn",
onClick: handleMove
}), [
vue.createElementVNode("i", vue.mergeProps(_ctx.$attrs, {
class: "vui_icon sic-fsp-folder_add_line",
style: { "font-size": "16px" }
}), null, 16),
_cache[5] || (_cache[5] = vue.createTextVNode(" 移动至 "))
], 16)) : vue.createCommentVNode("", true)
], 16)
], 16);
};
}
};
const _sfc_main$3 = {
__name: "Empty",
props: {
keyword: {
type: String,
required: false
}
},
setup(__props) {
return (_ctx, _cache) => {
return vue.openBlock(), vue.createElementBlock("div", vue.mergeProps(_ctx.$attrs, { class: "fav-list-main-empty" }), [
vue.createElementVNode("div", vue.mergeProps(_ctx.$attrs, { class: "b-img fav-list-main-empty__img" }), _cache[0] || (_cache[0] = [
vue.createElementVNode("img", {
src: "//i1.hdslb.com/bfs/static/jinkela/long/images/load-data-nothing.svg",
class: "b-img__inner",
alt: "什么都没有",
onload: "bmgCmptOnload(this)",
onerror: "bmgCmptOnerror(this)"
}, null, -1)
]), 16),
__props.keyword ? (vue.openBlock(), vue.createElementBlock("p", vue.normalizeProps(vue.mergeProps({ key: 0 }, _ctx.$attrs)), [
_cache[1] || (_cache[1] = vue.createTextVNode(" 所有收藏夹都没有相关视频_(:зゝ∠)_")),
vue.createElementVNode("br", vue.normalizeProps(vue.guardReactiveProps(_ctx.$attrs)), null, 16),
_cache[2] || (_cache[2] = vue.createTextVNode("换个关键词试试吧 "))
], 16)) : (vue.openBlock(), vue.createElementBlock("p", vue.normalizeProps(vue.mergeProps({ key: 1 }, _ctx.$attrs)), "这里还什么都没有呢~", 16))
], 16);
};
}
};
const timestampToDate = [
(timestamp) => {
const date = new Date(timestamp);
const year = date.getFullYear();
const month = date.getMonth() + 1;
const day = date.getDate();
const hours = date.getHours();
const minutes = date.getMinutes();
const seconds = date.getSeconds();
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
},
(timestamp) => {
const date = new Date(timestamp);
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, "0");
const day = String(date.getDate()).padStart(2, "0");
const hours = String(date.getHours()).padStart(2, "0");
const minutes = String(date.getMinutes()).padStart(2, "0");
const seconds = String(date.getSeconds()).padStart(2, "0");
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
},
(timestamp) => {
const date = new Date(timestamp);
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, "0");
const day = String(date.getDate()).padStart(2, "0");
return `${year}-${month}-${day}`;
}
];
const formatSeconds = [
(seconds) => {
const date = new Date(seconds * 1e3);
const hh = date.getUTCHours().toString().padStart(2, "0");
const mm = date.getUTCMinutes().toString().padStart(2, "0");
const ss = date.getSeconds().toString().padStart(2, "0");
return `${hh}:${mm}:${ss}`;
},
(seconds) => {
const date = new Date(seconds * 1e3);
const mm = date.getUTCMinutes().toString().padStart(2, "0");
const ss = date.getSeconds().toString().padStart(2, "0");
return `${mm}:${ss}`;
}
];
const dateUtil = { timestampToDate, formatSeconds };
const add = ({ bvid }, success, failure) => {
if (!bvid) return;
let url = "https://api.bilibili.com/x/v2/history/toview/add";
let params = {
aid: biliUtil.bv2av(bvid)
};
return request$1.post(url, params, success, failure);
};
const del = ({ bvid }, success, failure) => {
if (!bvid) return;
let url = "https://api.bilibili.com/x/v2/history/toview/del";
let params = {
aid: biliUtil.bv2av(bvid)
};
return request$1.post(url, params, success, failure);
};
const _hoisted_1$1 = { class: "bili-video-card__wrap" };
const _hoisted_2$1 = ["href"];
const _hoisted_3$1 = { class: "bili-cover-card__thumbnail" };
const _hoisted_4$1 = ["src", "alt"];
const _hoisted_5$1 = {
key: 0,
class: "bili-cover-card__tags"
};
const _hoisted_6$1 = { class: "bili-cover-card__tag" };
const _hoisted_7 = { class: "bili-cover-card__stats" };
const _hoisted_8 = {
key: 0,
class: "bili-cover-card__stat"
};
const _hoisted_9 = {
key: 1,
class: "bili-cover-card__stat"
};
const _hoisted_10 = { class: "bili-cover-card__stat" };
const _hoisted_11 = { class: "bili-card-watch-later" };
const _hoisted_12 = ["onClick"];
const _hoisted_13 = { class: "bili-card-watch-later__tip" };
const _hoisted_14 = { class: "bili-video-card__details" };
const _hoisted_15 = ["title"];
const _hoisted_16 = ["href"];
const _hoisted_17 = { class: "bili-video-card__subtitle" };
const _hoisted_18 = ["title"];
const _hoisted_19 = ["href"];
const _hoisted_20 = { class: "bili-video-card__text" };
const _hoisted_21 = ["title"];
const _hoisted_22 = ["onClick"];
const _hoisted_23 = ["onClick"];
const _hoisted_24 = ["onClick"];
const _hoisted_25 = ["onClick"];
const _sfc_main$2 = {
__name: "List",
props: /* @__PURE__ */ vue.mergeModels({
list: {
type: Array,
required: true,
default: []
},
isSelf: {
type: Boolean,
required: true,
default: false
},
isShowBatch: {
type: Boolean,
required: true,
default: false
}
}, {
"selected": {},
"selectedModifiers": {}
}),
emits: /* @__PURE__ */ vue.mergeModels(["action"], ["update:selected"]),
setup(__props, { emit: __emit }) {
const selected = vue.useModel(__props, "selected");
const emits = __emit;
let timerId2 = null;
let dropdown = null;
const mouseenterCard = (event) => {
var _a;
(_a = event.target.querySelector(".bili-card-dropdown")) == null ? void 0 : _a.classList.add("bili-card-dropdown--visible");
};
const mouseleaveCard = (event) => {
var _a;
(_a = event.target.querySelector(".bili-card-dropdown")) == null ? void 0 : _a.classList.remove("bili-card-dropdown--visible");
};
const mouseenterCover = (event) => {
var _a;
(_a = event.target.querySelector(".bili-card-watch-later")) == null ? void 0 : _a.classList.add("bili-card-watch-later--visible");
};
const mouseleaveCover = (event) => {
var _a;
(_a = event.target.querySelector(".bili-card-watch-later")) == null ? void 0 : _a.classList.remove("bili-card-watch-later--visible");
};
const mouseenterDropdown = (event) => {
var _a, _b, _c, _d;
timerId2 && clearTimeout(timerId2);
if (dropdown && dropdown !== event.target) {
(_b = (_a = dropdown.closest(".items__item")) == null ? void 0 : _a.querySelector(".bili-card-dropdown-popper")) == null ? void 0 : _b.classList.remove("visible");
}
(_d = (_c = event.target.closest(".items__item")) == null ? void 0 : _c.querySelector(".bili-card-dropdown-popper")) == null ? void 0 : _d.classList.add("visible");
};
const mouseleaveDropdown = (event) => {
timerId2 = setTimeout(() => {
var _a, _b;
(_b = (_a = event.target.closest(".items__item")) == null ? void 0 : _a.querySelector(".bili-card-dropdown-popper")) == null ? void 0 : _b.classList.remove("visible");
}, 200);
dropdown = event.target;
};
const mouseenterPopper = (event) => {
event.target.classList.add("visible");
timerId2 && clearTimeout(timerId2);
};
const mouseleavePopper = (event) => {
event.target.classList.remove("visible");
};
const handleSelect = (media, event) => {
event.stopPropagation();
const value = `${media.id}:${media.type}`;
if (selected.value.includes(value)) {
selected.value.splice(selected.value.indexOf(value), 1);
} else {
selected.value.push(value);
}
};
const handleWatchLater = (media, event) => {
event.stopPropagation();
const bvid = media.bvid;
if (media.toview) {
del({ bvid }, () => {
media.toview = false;
});
} else {
add({ bvid }, () => {
media.toview = true;
});
}
};
const handleDel = (media, event) => {
event.stopPropagation();
emits("action", { type: "del", resources: `${media.id}:${media.type}` });
};
const handleCopy = (media, event) => {
event.stopPropagation();
emits("action", { type: "copy", resources: `${media.id}:${media.type}` });
};
const handleMove = (media, event) => {
event.stopPropagation();
emits("action", { type: "move", resources: `${media.id}:${media.type}` });
};
return (_ctx, _cache) => {
return vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(__props.list, (item) => {
var _a;
return vue.openBlock(), vue.createElementBlock("div", vue.mergeProps({ ref_for: true }, _ctx.$attrs, { class: "items__item" }), [
vue.createElementVNode("div", vue.mergeProps({ ref_for: true }, _ctx.$attrs, {
class: "bili-video-card",
onMouseenter: mouseenterCard,
onMouseleave: mouseleaveCard
}), [
vue.createElementVNode("div", _hoisted_1$1, [
vue.createElementVNode("div", {
class: "bili-video-card__cover",
onMouseenter: mouseenterCover,
onMouseleave: mouseleaveCover
}, [
vue.createElementVNode("a", {
class: "bili-cover-card",
href: `https://www.bilibili.com/video/${item.bvid}?spm_id_from=333.1387.favlist.content.click`,
target: "_blank"
}, [
vue.createElementVNode("div", _hoisted_3$1, [
vue.createElementVNode("img", {
src: item.cover.slice(item.cover.indexOf("//")) + "@672w_378h_1c.avif",
class: "",
alt: item.title,
onload: "typeof window.bmgCmptOnload === 'function' && window.bmgCmptOnload(this)",
onerror: "typeof window.bmgCmptOnerror === 'function' && window.bmgCmptOnerror(this)"
}, null, 8, _hoisted_4$1)
]),
item.type === 24 ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_5$1, [
vue.createElementVNode("div", _hoisted_6$1, [
vue.createElementVNode("span", null, vue.toDisplayString((_a = item.ogv) == null ? void 0 : _a.type_name), 1)
])
])) : vue.createCommentVNode("", true),
vue.createElementVNode("div", _hoisted_7, [
item.type !== 24 ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_8, [
_cache[0] || (_cache[0] = vue.createElementVNode("i", { class: "sic-BDC-playdata_square_line" }, null, -1)),
vue.createElementVNode("span", null, vue.toDisplayString(item.cnt_info.view_text_1), 1)
])) : vue.createCommentVNode("", true),
item.type !== 24 ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_9, [
_cache[1] || (_cache[1] = vue.createElementVNode("i", { class: "sic-BDC-danmu_square_line" }, null, -1)),
vue.createElementVNode("span", null, vue.toDisplayString(item.cnt_info.danmaku < 1e4 ? item.cnt_info.danmaku : (item.cnt_info.danmaku / 1e4).toFixed(1) + "万"), 1)
])) : vue.createCommentVNode("", true),
vue.createElementVNode("div", _hoisted_10, [
vue.createElementVNode("span", null, vue.toDisplayString(item.duration < 3600 ? vue.unref(dateUtil).formatSeconds[1](item.duration) : vue.unref(dateUtil).formatSeconds[0](item.duration)), 1)
])
])
], 8, _hoisted_2$1),
vue.createElementVNode("div", _hoisted_11, [
vue.createElementVNode("div", {
class: "bili-card-watch-later__btn",
onClick: (event) => handleWatchLater(item, event)
}, [
vue.createElementVNode("i", {
class: vue.normalizeClass(
item.toview ? "sic-BDC-checkmark_line" : "sic-BDC-arrow_play_next_line"
),
style: { "font-variation-settings": "'strk' 1.5" }
}, null, 2)
], 8, _hoisted_12),
vue.createElementVNode("span", _hoisted_13, vue.toDisplayString(item.toview ? "移除" : "稍后再看"), 1)
]),
vue.createElementVNode("div", {
class: vue.normalizeClass({
"bili-card-checkbox": true,
"bili-card-checkbox--visible": __props.isShowBatch,
"bili-card-checkbox--checked": selected.value.includes(`${item.id}:${item.type}`)
})
}, _cache[2] || (_cache[2] = [
vue.createElementVNode("div", { class: "bili-card-checkbox__inner" }, [
vue.createElementVNode("svg", {
width: "16",
height: "16",
viewBox: "0 0 16 16",
fill: "none",
xmlns: "http://www.w3.org/2000/svg"
}, [
vue.createElementVNode("path", {
"fill-rule": "evenodd",
"clip-rule": "evenodd",
d: "M14.3378 3.00678C14.0492 2.74694 13.6046 2.77024 13.3447 3.05882L5.46602 11.809L2.66657 8.69993C2.40673 8.41135 1.96215 8.38805 1.67357 8.64789C1.38498 8.90773 1.36168 9.35232 1.62153 9.6409L4.93385 13.3196C5.11955 13.5259 5.39962 13.5966 5.64967 13.5253C5.78192 13.4929 5.90618 13.4218 6.00416 13.313L14.3898 3.99979C14.6496 3.7112 14.6263 3.26662 14.3378 3.00678Z",
fill: "white"
}),
vue.createElementVNode("path", {
d: "M13.3447 3.05882L13.9021 3.56067L13.9021 3.56067L13.3447 3.05882ZM14.3378 3.00678L13.8359 3.56414L14.3378 3.00678ZM5.46602 11.809L4.90866 12.3109L5.46602 12.9299L6.02338 12.3109L5.46602 11.809ZM2.66657 8.69993L3.22393 8.19809L3.22393 8.19809L2.66657 8.69993ZM1.67357 8.64789L1.17172 8.09053L1.17172 8.09053L1.67357 8.64789ZM1.62153 9.6409L2.17888 9.13905L2.17888 9.13905L1.62153 9.6409ZM4.93385 13.3196L5.4912 12.8178L5.4912 12.8178L4.93385 13.3196ZM5.64967 13.5253L5.47111 12.7969L5.45752 12.8002L5.44406 12.8041L5.64967 13.5253ZM6.00416 13.313L6.56152 13.8148L6.56152 13.8148L6.00416 13.313ZM14.3898 3.99979L14.9472 4.50163L14.9472 4.50163L14.3898 3.99979ZM13.9021 3.56067C13.8848 3.57991 13.8551 3.58146 13.8359 3.56414L14.8396 2.44942C14.2432 1.91242 13.3244 1.96057 12.7874 2.55697L13.9021 3.56067ZM6.02338 12.3109L13.9021 3.56067L12.7874 2.55697L4.90866 11.3072L6.02338 12.3109ZM6.02338 11.3072L3.22393 8.19809L2.10921 9.20178L4.90866 12.3109L6.02338 11.3072ZM3.22393 8.19809C2.68693 7.60168 1.76812 7.55353 1.17172 8.09053L2.17541 9.20525C2.15618 9.22257 2.12654 9.22102 2.10921 9.20178L3.22393 8.19809ZM1.17172 8.09053C0.575316 8.62754 0.527163 9.54634 1.06417 10.1427L2.17888 9.13905C2.19621 9.15829 2.19465 9.18793 2.17541 9.20525L1.17172 8.09053ZM1.06417 10.1427L4.37649 13.8215L5.4912 12.8178L2.17888 9.13905L1.06417 10.1427ZM4.37649 13.8215C4.76102 14.2485 5.34044 14.3933 5.85527 14.2466L5.44406 12.8041C5.45258 12.8016 5.46061 12.8017 5.46824 12.8039C5.47717 12.8063 5.48577 12.8117 5.4912 12.8178L4.37649 13.8215ZM5.4468 12.8111C5.44921 12.8085 5.45292 12.8052 5.45767 12.8024C5.46225 12.7997 5.46684 12.7979 5.47111 12.7969L5.82823 14.2538C6.10199 14.1866 6.35971 14.039 6.56152 13.8148L5.4468 12.8111ZM13.8324 3.49794L5.4468 12.8111L6.56152 13.8148L14.9472 4.50163L13.8324 3.49794ZM13.8359 3.56414C13.8167 3.54681 13.8151 3.51718 13.8324 3.49794L14.9472 4.50163C15.4842 3.90523 15.436 2.98642 14.8396 2.44942L13.8359 3.56414Z",
fill: "white"
})
])
], -1)
]), 2)
], 32),
vue.createElementVNode("div", _hoisted_14, [
vue.createElementVNode("div", {
class: "bili-video-card__title bili-video-card__title--pr",
title: item.type === 24 ? item.intro : item.title
}, [
vue.createElementVNode("a", {
href: `https://www.bilibili.com/video/${item.bvid}?spm_id_from=333.1387.favlist.content.click`,
target: "_blank"
}, vue.toDisplayString(item.type === 24 ? item.intro : item.title), 9, _hoisted_16),
__props.isSelf ? (vue.openBlock(), vue.createElementBlock("div", {
key: 0,
class: "bili-card-dropdown",
onMouseenter: mouseenterDropdown,
onMouseleave: mouseleaveDropdown
}, _cache[3] || (_cache[3] = [
vue.createElementVNode("i", {
class: "sic-BDC-more_vertical_fill",
style: { "font-variation-settings": "'strk' 1.5" }
}, null, -1)
]), 32)) : vue.createCommentVNode("", true)
], 8, _hoisted_15),
vue.createElementVNode("div", _hoisted_17, [
item.type === 24 ? (vue.openBlock(), vue.createElementBlock("span", {
key: 0,
title: `${item.title} · 收藏于${vue.unref(dateUtil).timestampToDate[2](
item.fav_time * 1e3
)}`
}, vue.toDisplayString(item.title) + " · 收藏于" + vue.toDisplayString(vue.unref(dateUtil).timestampToDate[2](item.fav_time * 1e3)), 9, _hoisted_18)) : (vue.openBlock(), vue.createElementBlock("a", {
key: 1,
class: "bili-video-card__author",
href: `https://space.bilibili.com/${item.upper.mid}?spm_id_from=333.1387.favlist.content.click`,
target: "_blank"
}, [
_cache[4] || (_cache[4] = vue.createElementVNode("div", { class: "bili-video-card__text" }, [
vue.createElementVNode("i", { class: "sic-BDC-uploader_name_square_line" }),
vue.createElementVNode("span")
], -1)),
vue.createElementVNode("div", _hoisted_20, [
vue.createElementVNode("span", {
title: `${item.upper.name} · 收藏于${vue.unref(dateUtil).timestampToDate[2](
item.fav_time * 1e3
)}`
}, vue.toDisplayString(item.upper.name) + " · 收藏于" + vue.toDisplayString(vue.unref(dateUtil).timestampToDate[2](item.fav_time * 1e3)), 9, _hoisted_21)
])
], 8, _hoisted_19))
])
])
]),
__props.isShowBatch ? (vue.openBlock(), vue.createElementBlock("div", {
key: 0,
class: "bili-card-checkbox-overlay",
style: { "z-index": "1036" },
onClick: (event) => handleSelect(item, event)
}, null, 8, _hoisted_22)) : vue.createCommentVNode("", true)
], 16),
__props.isSelf ? (vue.openBlock(), vue.createElementBlock("div", {
key: 0,
class: "bili-card-dropdown-popper",
style: { "position": "absolute", "inset": "0px 0px auto auto", "margin": "0px", "z-index": "1005", "transform": "translate(0px, 151px)" },
"data-popper-placement": "bottom-end",
onMouseenter: mouseenterPopper,
onMouseleave: mouseleavePopper
}, [
vue.createElementVNode("div", {
class: "bili-card-dropdown-popper__item",
"data-key": "CANCEL",
onClick: (event) => handleDel(item, event)
}, " 取消收藏 ", 8, _hoisted_23),
vue.createElementVNode("div", {
class: "bili-card-dropdown-popper__item",
"data-key": "COPY",
onClick: (event) => handleCopy(item, event)
}, " 复制至 ", 8, _hoisted_24),
vue.createElementVNode("div", {
class: "bili-card-dropdown-popper__item",
"data-key": "MOVE",
onClick: (event) => handleMove(item, event)
}, " 移动至 ", 8, _hoisted_25)
], 32)) : vue.createCommentVNode("", true)
], 16);
}), 256);
};
}
};
const List = /* @__PURE__ */ _export_sfc(_sfc_main$2, [["__scopeId", "data-v-a3628dd0"]]);
const _hoisted_1 = { class: "vui_pagenation--btns" };
const _hoisted_2 = ["onClick"];
const _hoisted_3 = { class: "vui_pagenation-go" };
const _hoisted_4 = { class: "vui_pagenation-go__count" };
const _hoisted_5 = { class: "vui_input" };
const _hoisted_6 = { class: "vui_input-wrapper" };
const _sfc_main$1 = {
__name: "Pagination",
props: {
total: {
type: Number,
required: true
},
currPage: {
type: Number,
required: true
},
pageSize: {
type: Number,
required: true
}
},
emits: ["change"],
setup(__props, { emit: __emit }) {
const props = __props;
const emits = __emit;
const totalPage = vue.computed(() => Math.ceil(props.total / props.pageSize));
const hasPrev = vue.computed(() => totalPage.value > 1 && props.currPage !== 1);
const hasNext = vue.computed(() => totalPage.value > 1 && props.currPage !== totalPage.value);
const pages = vue.computed(() => {
const maxVisiblePages = 9;
const _pages = [];
if (totalPage.value <= maxVisiblePages) {
for (let i = 1; i <= totalPage.value; i++) {
_pages.push(i);
}
} else {
const halfVisiblePages = Math.floor(maxVisiblePages / 2);
_pages.push(1);
let startPage, endPage;
if (props.currPage <= halfVisiblePages + 1) {
startPage = 2;
endPage = maxVisiblePages - 2;
for (let i = startPage; i <= endPage; i++) {
_pages.push(i);
}
_pages.push({ text: "...", to: props.currPage + 5 });
_pages.push(totalPage.value);
} else if (props.currPage >= totalPage.value - halfVisiblePages) {
_pages.push({ text: "...", to: props.currPage - 5 });
startPage = totalPage.value - (maxVisiblePages - 3);
endPage = totalPage.value - 1;
for (let i = startPage; i <= endPage; i++) {
_pages.push(i);
}
_pages.push(totalPage.value);
} else {
_pages.push({ text: "...", to: props.currPage - 5 });
startPage = props.currPage - Math.floor((maxVisiblePages - 4) / 2);
endPage = props.currPage + Math.floor((maxVisiblePages - 4) / 2);
for (let i = startPage; i <= endPage; i++) {
_pages.push(i);
}
_pages.push({ text: "...", to: props.currPage + 5 });
_pages.push(totalPage.value);
}
}
return _pages;
});
const jump = (to) => {
emits("change", to);
};
const handleEnter = (event) => {
const to = Number(event.target.value);
if (Number.isInteger(to) && to >= 1 && to <= totalPage.value) {
jump(to);
}
event.target.value = "";
};
return (_ctx, _cache) => {
return totalPage.value > 1 ? (vue.openBlock(), vue.createElementBlock("div", vue.mergeProps({ key: 0 }, _ctx.$attrs, { class: "vui_pagenation vui_pagenation--jump card-pagenation" }), [
vue.createElementVNode("div", _hoisted_1, [
vue.createElementVNode("button", {
class: vue.normalizeClass({
vui_button: true,
"vui_pagenation--btn": true,
"vui_pagenation--btn-side": true,
"vui_button--disabled": !hasPrev.value
}),
onClick: _cache[0] || (_cache[0] = ($event) => jump(__props.currPage - 1))
}, " 上一页 ", 2),
(vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(pages.value, (page) => {
return vue.openBlock(), vue.createElementBlock("button", {
class: vue.normalizeClass({
vui_button: true,
"vui_button--no-transition": true,
"vui_pagenation--btn": true,
"vui_pagenation--btn-num": true,
"vui_button--active": __props.currPage === page,
"vui_button--active-blue": __props.currPage === page
}),
onClick: ($event) => jump(typeof page === "object" ? page.to : page)
}, vue.toDisplayString(typeof page === "object" ? page.text : page), 11, _hoisted_2);
}), 256)),
vue.createElementVNode("button", {
class: vue.normalizeClass({
vui_button: true,
"vui_pagenation--btn": true,
"vui_pagenation--btn-side": true,
"vui_button--disabled": !hasNext.value
}),
onClick: _cache[1] || (_cache[1] = ($event) => jump(__props.currPage + 1))
}, " 下一页 ", 2)
]),
vue.createElementVNode("div", _hoisted_3, [
vue.createElementVNode("span", _hoisted_4, " 共 " + vue.toDisplayString(totalPage.value) + " 页 / " + vue.toDisplayString(__props.total) + " 个,跳至 ", 1),
vue.createElementVNode("div", _hoisted_5, [
vue.createElementVNode("div", _hoisted_6, [
vue.createElementVNode("input", {
type: "number",
class: "vui_input__input vui_input__input-resizable",
onKeyup: vue.withKeys(handleEnter, ["enter"])
}, null, 32)
])
]),
_cache[2] || (_cache[2] = vue.createElementVNode("span", { class: "vui_pagenation-go__page" }, "页", -1))
])
], 16)) : vue.createCommentVNode("", true);
};
}
};
const _sfc_main = {
__name: "Main",
props: /* @__PURE__ */ vue.mergeModels({
mid: {
type: String,
required: true,
default: ""
},
mediaId: {
type: Number,
required: true,
default: 0
}
}, {
"mode": {},
"modeModifiers": {}
}),
emits: ["update:mode"],
setup(__props) {
const mode2 = vue.useModel(__props, "mode");
const props = __props;
let uid = biliUtil.getUid();
const filterRef = vue.ref(null);
const params = vue.ref({
pn: 1,
ps: 36,
type: 0,
tid: 0,
keyword: "",
order: "mtime"
});
const total = vue.ref(0);
const list$1 = vue.ref([]);
const selected = vue.ref([]);
const search = () => {
list({ mediaId: props.mediaId, ...params.value }, (result) => {
total.value = result.info.media_count;
list$1.value = result.medias;
});
};
const del2 = (resources) => {
del$1({ mediaId: props.mediaId, resources }, () => {
message.info({ text: "操作成功" });
setTimeout(() => {
mode2.value = "list";
selected.value = [];
search();
}, 200);
});
};
const copy$1 = (count, resources) => {
all({ upMid: uid }, (result) => {
const tarMediaId = vue.ref(0);
const close = modal.open({
wrapClassName: "fav-modify-modal-content",
title: `将${count}个视频复制至`,
template: _sfc_main$a,
templateProps: {
selected: tarMediaId,
"onUpdate:selected": (newValue) => {
tarMediaId.value = newValue;
},
favs: (result == null ? void 0 : result.list) || []
},
$ok: () => {
if (!tarMediaId.value) {
message.info({ text: "请选择目标收藏夹" });
return;
}
copy(
{
mid: props.mid,
srcMediaId: props.mediaId,
tarMediaId: tarMediaId.value,
resources
},
() => {
close && close();
message.info({ text: "操作成功" });
setTimeout(() => {
mode2.value = "list";
selected.value = [];
}, 200);
}
);
},
$close: () => {
tarMediaId.value = 0;
}
});
});
};
const move$1 = (count, resources) => {
all({ upMid: uid }, (result) => {
const tarMediaId = vue.ref(0);
const close = modal.open({
wrapClassName: "fav-modify-modal-content",
title: `将${count}个视频移动至`,
template: _sfc_main$a,
templateProps: {
selected: tarMediaId,
"onUpdate:selected": (newValue) => {
tarMediaId.value = newValue;
},
favs: (result == null ? void 0 : result.list) || []
},
$ok: () => {
if (!tarMediaId.value) {
message.info({ text: "请选择目标收藏夹" });
return;
}
move(
{
mid: props.mid,
srcMediaId: props.mediaId,
tarMediaId: tarMediaId.value,
resources
},
() => {
close && close();
message.info({ text: "操作成功" });
setTimeout(() => {
mode2.value = "list";
selected.value = [];
search();
}, 200);
}
);
},
$close: () => {
tarMediaId.value = 0;
}
});
});
};
const clean$1 = () => {
const close = modal.open({
title: "清除失效内容",
template: "span",
templateProps: {
innerHTML: "是否一键清除当前文件夹所有失效内容?"
},
$ok: () => {
clean(
{
mediaId: props.mediaId
},
() => {
close && close();
message.info({ text: "操作成功" });
setTimeout(() => {
mode2.value = "list";
selected.value = [];
search();
}, 200);
}
);
},
$cancel: () => {
}
});
};
const handleFilter = (items) => {
items.forEach((item) => {
params.value[item.key] = item.value;
});
params.value.pn = 1;
search();
};
const handleBatchAction = ({ type }) => {
if (!type) return;
if (type === "clean") {
clean$1();
} else {
if (!selected.value || selected.value.length === 0) {
message.info({ text: "请先选择视频" });
return;
}
const conut = selected.value.length;
const resources = selected.value.join(",");
if (type === "del") {
if (conut > 1) {
const close = modal.open({
title: "取消收藏",
template: "span",
templateProps: {
innerHTML: `是否确认取消 ${conut} 个视频?`
},
$ok: () => {
close && close();
del2(resources);
},
$cancel: () => {
}
});
} else {
del2(resources);
}
}
if (type === "copy") copy$1(conut, resources);
if (type === "move") move$1(conut, resources);
}
};
const handleAction = ({ type, resources }) => {
if (!type || !resources) return;
if (type === "del") del2(resources);
if (type === "copy") copy$1(1, resources);
if (type === "move") move$1(1, resources);
};
const handleJump = (to) => {
params.value.pn = to;
search();
};
vue.watch(
() => props.mediaId,
() => {
var _a;
params.value = {
pn: 1,
ps: 36,
type: 0,
tid: 0,
keyword: "",
order: "mtime"
};
((_a = filterRef.value) == null ? void 0 : _a.reset) && filterRef.value.reset();
mode2.value = "list";
selected.value = [];
search();
}
);
vue.watch(
() => mode2.value,
() => {
if (mode2.value === "list") selected.value = [];
}
);
return (_ctx, _cache) => {
return vue.openBlock(), vue.createElementBlock(vue.Fragment, null, [
vue.createElementVNode("div", vue.mergeProps(_ctx.$attrs, { class: "fav-list-header" }), [
vue.withDirectives(vue.createVNode(_sfc_main$5, vue.mergeProps(_ctx.$attrs, {
ref_key: "filterRef",
ref: filterRef,
onChange: handleFilter
}), null, 16), [
[vue.vShow, mode2.value === "list"]
]),
vue.withDirectives(vue.createVNode(_sfc_main$4, vue.mergeProps(_ctx.$attrs, {
list: list$1.value || [],
isSelf: __props.mid === vue.unref(uid),
selected: selected.value,
"onUpdate:selected": _cache[0] || (_cache[0] = ($event) => selected.value = $event),
onBatchAction: handleBatchAction
}), null, 16, ["list", "isSelf", "selected"]), [
[vue.vShow, mode2.value === "batch"]
])
], 16),
vue.createElementVNode("div", vue.mergeProps(_ctx.$attrs, { class: "items" }), [
list$1.value && list$1.value.length > 0 ? (vue.openBlock(), vue.createBlock(List, vue.mergeProps({ key: 0 }, _ctx.$attrs, {
list: list$1.value || [],
isSelf: __props.mid === vue.unref(uid),
isShowBatch: mode2.value === "batch",
selected: selected.value,
"onUpdate:selected": _cache[1] || (_cache[1] = ($event) => selected.value = $event),
onAction: handleAction
}), null, 16, ["list", "isSelf", "isShowBatch", "selected"])) : vue.createCommentVNode("", true)
], 16),
list$1.value && list$1.value.length > 0 ? (vue.openBlock(), vue.createBlock(_sfc_main$1, vue.mergeProps({ key: 0 }, _ctx.$attrs, {
total: total.value,
currPage: params.value.pn,
pageSize: params.value.ps,
onChange: handleJump
}), null, 16, ["total", "currPage", "pageSize"])) : vue.createCommentVNode("", true),
!list$1.value || list$1.value.length === 0 ? (vue.openBlock(), vue.createBlock(_sfc_main$3, vue.mergeProps({ key: 1 }, _ctx.$attrs, {
keyword: params.value.keyword
}), null, 16, ["keyword"])) : vue.createCommentVNode("", true)
], 64);
};
}
};
let attr = null;
let mid = location.pathname.split("/")[1];
let originInfoBatch = null;
let customInfoBatch = null;
let originListMain = null;
let customListMain = null;
const mediaId = vue.ref(0);
const mode = vue.ref("list");
const render = () => {
originInfoBatch = document.querySelector(".favlist-main .favlist-info-batch");
if (customInfoBatch) customInfoBatch.parentNode.removeChild(customInfoBatch);
customInfoBatch = originInfoBatch.cloneNode(true);
customInfoBatch.id = "custom-batch-btn";
customInfoBatch.addEventListener("click", () => {
if (mode.value === "list") {
mode.value = "batch";
customInfoBatch.innerHTML = "返回";
} else {
mode.value = "list";
customInfoBatch.innerHTML = "批量操作";
}
});
originInfoBatch.parentNode.append(customInfoBatch);
vue.createApp({
render: () => {
return vue.h(_sfc_main, {
[attr.name]: attr.value,
mid,
mediaId: mediaId.value,
mode: mode.value,
"onUpdate:mode": (newValue) => {
mode.value = newValue;
if (newValue === "list") {
customInfoBatch.innerHTML = "批量操作";
} else {
customInfoBatch.innerHTML = "返回";
}
}
});
}
}).mount(
(() => {
originListMain = document.querySelector(".favlist-main .fav-list-main");
attr = Object.values(originListMain.attributes).find((item) => {
return item.name.startsWith("data-v-");
});
if (customListMain) customListMain.parentNode.removeChild(customListMain);
customListMain = originListMain.cloneNode();
customListMain.id = "custom-list-main";
originListMain.parentNode.append(customListMain);
return customListMain;
})()
);
};
const replace = () => {
if (originInfoBatch) originInfoBatch.style.display = "none";
if (originListMain) originListMain.style.display = "none";
if (customInfoBatch) customInfoBatch.style.display = "";
if (customListMain) customListMain.style.display = "";
};
const restore = () => {
if (originInfoBatch) originInfoBatch.style.display = "";
if (originListMain) originListMain.style.display = "";
if (customInfoBatch) customInfoBatch.style.display = "none";
if (customListMain) customListMain.style.display = "none";
};
(async () => {
const result = await all({ upMid: mid });
const favs = result == null ? void 0 : result.list;
const load_observer = new MutationObserver(() => {
let items = null;
const sidebar = document.querySelector(".favlist-aside .vui_sidebar");
if (!sidebar || !sidebar.querySelector(".vui_sidebar-item--active")) return;
load_observer.disconnect();
render();
const _ = () => {
var _a;
if (!items) items = Array.from(sidebar.querySelectorAll(".fav-sidebar-item"));
const actived = sidebar.querySelector(".vui_sidebar-item--active");
if (actived) {
replace();
const fid = (_a = favs[items.indexOf(actived.parentNode)]) == null ? void 0 : _a.id;
if (mediaId.value !== fid) mediaId.value = fid;
} else {
restore();
}
};
_();
new MutationObserver(_).observe(sidebar, {
childList: true,
subtree: true,
attributes: true,
attributeFilter: ["class"],
attributeOldValue: true
});
});
load_observer.observe(document.body, { childList: true, subtree: true });
})();
})(Vue);