// ==UserScript==
// @name bilibili订阅+
// @namespace https://github.com/YanxinTang/Tampermonkey
// @version 0.7.9
// @description bilibili导航添加订阅按钮以及订阅列表
// @author tyx1703
// @license MIT
// @noframes
// @require https://cdn.jsdelivr.net/npm/vue@2/dist/vue.min.js
// @match *.bilibili.com/*
// @exclude *://live.bilibili.com/*
// @exclude *://manga.bilibili.com/*
// @exclude *://bw.bilibili.com/*
// @exclude *://show.bilibili.com/*
// @downloadURL https://update.greasyfork.icu/scripts/30283/bilibili%E8%AE%A2%E9%98%85%2B.user.js
// @updateURL https://update.greasyfork.icu/scripts/30283/bilibili%E8%AE%A2%E9%98%85%2B.meta.js
// ==/UserScript==
(async function () {
const DedeUserID = getCookie("DedeUserID");
const loginStatus = DedeUserID !== "";
if (!loginStatus) {
log("少侠请先登录~ 哔哩哔哩 (゜-゜)つロ 干杯~");
return;
}
const PER_PAGE = 15;
try {
const lastPopoverButton = await getLastPopoverButton();
const subscribeMenuEl = document.createElement("li");
subscribeMenuEl.setAttribute("id", "subscribe");
lastPopoverButton.after(subscribeMenuEl);
const getBangumis = (page) => {
return fetch(
`//api.bilibili.com/x/space/bangumi/follow/list?type=1&follow_status=0&pn=${page}&ps=${PER_PAGE}&vmid=${DedeUserID}`,
{
method: "GET",
credentials: "include",
}
)
.then((response) => response.json())
.then((response) => response.data)
.then(({ list, ...rest }) => {
return {
list: list.map((item) => ({ ...item, id: item.media_id })),
...rest,
};
});
};
const getCinemas = (page) => {
return fetch(
`//api.bilibili.com/x/space/bangumi/follow/list?type=2&follow_status=0&pn=${page}&ps=${PER_PAGE}&vmid=${DedeUserID}`,
{
method: "GET",
credentials: "include",
}
)
.then((response) => response.json())
.then((response) => response.data)
.then(({ list, ...rest }) => {
return {
list: list.map((item) => ({ ...item, id: item.media_id })),
...rest,
};
});
};
const getFloowings = (page) => {
return fetch(
`//api.bilibili.com/x/relation/followings?&pn=${page}&ps=${PER_PAGE}&vmid=${DedeUserID}&order=desc`,
{
method: "GET",
credentials: "include",
}
)
.then((response) => response.json())
.then((response) => {
return {
list: response.data.list.map((item) => ({
...item,
id: item.mid,
})),
total: response.data.total,
pn: page,
};
});
};
const VideoItem = {
props: ["item"],
computed: {
coverURL() {
return this.item.cover.replace("http:", "");
},
},
template: `