Greasy Fork is available in English.
解決有時打開B站番劇投稿頁不會跳轉去番劇頁的問題
当前为
// ==UserScript==
// @name 我就是要跳轉(B站番劇投稿頁跳轉去番劇頁)
// @version 0.4.1
// @description 解決有時打開B站番劇投稿頁不會跳轉去番劇頁的問題
// @author i9602097
// @include *://www.bilibili.com/video/av*
// @run-at document-start
// @grant GM_registerMenuCommand
// @grant GM_listValues
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_deleteValue
// @grant unsafeWindow
// @namespace http://tampermonkey.net/
// ==/UserScript==
//
function getJSON(url) {
var request = new XMLHttpRequest();
request.open("GET", url, false);
// request.setRequestHeader("If-Modified-Since","0");
try {
request.send();
} catch (e) {
console.log(e);
console.log("跨域失敗");
}
// console.log(request.readyState);
// console.log(request.responseText);
console.log(request.getAllResponseHeaders());
if (request.readyState == 4 && request.responseText) {
try {
return JSON.parse(request.responseText);
} catch (e) {
console.log("JSON file error:" + url);
return {
"code": -2
};
}
} else {
console.log("Get JSON error:" + url);
return {
"code": -1
};
}
}
function getDataWithZone(text, zone) {
return new Date(Date.parse(text) - (3600000 * zone) - (new Date().getTimezoneOffset() * 60000));
}
function getEpisodeID(aid, pid) {
var avjson = getJSON("https://www.biliplus.com/api/view?id=" + aid);
console.log("avjson.code:" + avjson.code);
if (!avjson.code) {
var updateDate = new Date();
updateDate.setDate(updateDate.getDate() - 1);
console.log("緩存時間是" + getDataWithZone(avjson.lastupdate.replace(/-/g, "/"), 8).toString() + ",如果比" + updateDate.toString() + "早則會更新緩存並重新加載");
if (getDataWithZone(avjson.lastupdate.replace(/-/g, "/"), 8) < updateDate) {
console.log("緩存過早,更新緩存並重新加載");
getJSON("https://www.biliplus.com/api/view?id=" + aid + "&update=true");
avjson = getJSON("https://www.biliplus.com/api/view?id=" + aid);
console.log("avjson.code:" + avjson.code);
if (!avjson.code) {
console.log("新的緩存時間是" + getDataWithZone(avjson.lastupdate.replace(/-/g, "/"), 8).toString());
}
}
} else {
console.log("緩存錯誤,更新緩存並重新加載");
getJSON("https://www.biliplus.com/api/view?id=" + aid + "&update=true");
avjson = getJSON("https://www.biliplus.com/api/view?id=" + aid);
console.log("avjson.code:" + avjson.code);
if (!avjson.code) {
console.log("新的緩存時間是" + getDataWithZone(avjson.lastupdate.replace(/-/g, "/"), 8).toString());
}
}
if (avjson.code) {
console.log("av json error");
return;
}
console.log("標題:" + avjson.title);
if (!avjson.bangumi) {
console.log("no bangumi");
return;
}
console.log("投稿API番劇標題:" + avjson.bangumi.title);
var cid;
for (var i = 0; i < avjson.list.length; i++) {
if (avjson.list[i].page == pid) {
cid = avjson.list[i].cid;
}
}
console.log("cid:" + cid);
var bangumijson = getJSON("https://www.biliplus.com/api/bangumi?season=" + avjson.bangumi.season_id);
console.log("bangumijson.code:" + bangumijson.code);
if (bangumijson.code) {
console.log("bangumi json error");
return avjson.bangumi.newest_ep_id;
}
console.log("番劇API番劇標題:" + bangumijson.result.bangumi_title);
var episode_id;
if (cid) {
for (var i = 0; i < bangumijson.result.episodes.length; i++) {
if (bangumijson.result.episodes[i].danmaku == cid) {
episode_id = bangumijson.result.episodes[i].episode_id;
}
}
}
if (!episode_id) {
console.log("cid反查失敗,使用AV號和分P反查");
for (var i = 0; i < bangumijson.result.episodes.length; i++) {
if (bangumijson.result.episodes[i].av_id == aid && bangumijson.result.episodes[i].page == pid) {
episode_id = bangumijson.result.episodes[i].episode_id;
}
}
}
if (!episode_id) {
console.log("分P反查失敗,只用AV號反查,結果可能有出入");
for (var i = 0; i < bangumijson.result.episodes.length; i++) {
if (bangumijson.result.episodes[i].av_id == aid) {
episode_id = bangumijson.result.episodes[i].episode_id;
}
}
}
if (episode_id) {
console.log("episode_id:" + episode_id);
return episode_id;
} else {
console.log("episode_id查詢失敗");
return;
}
}
function getURL(episode_id) {
return location.protocol + '//www.bilibili.com/bangumi/play/ep' + episode_id;
}
function redirectURL() {
console.log("call redirectURL");
if (!episode_id) {
episode_id = getEpisodeID(aid, pid);
}
if (episode_id) {
location.replace(getURL(episode_id));
}
}
function changePopup() {
if (GM_getValue('enablePopup') === false) {
if (confirm("沒有打開彈窗提示\n是否打開彈窗提示")) {
GM_setValue('enablePopup', true);
console.log("enablePopup:" + GM_getValue('enablePopup'));
if ((GM_getValue('enablePopup') !== false)) {
alert("操作成功\n彈窗提示已打開\n將重新加載頁面");
unsafeWindow.location.reload(true);
} else {
alert("操作失敗\n將重新加載頁面");
unsafeWindow.location.reload(true);
}
} else {
alert("已取消操作");
}
} else {
if (confirm("已打開彈窗提示\n是否關閉彈窗提示")) {
GM_setValue('enablePopup', false);
console.log("enablePopup:" + GM_getValue('enablePopup'));
if ((GM_getValue('enablePopup') === false)) {
alert("操作成功\n彈窗提示已關閉\n將重新加載頁面");
unsafeWindow.location.reload(true);
} else {
alert("操作失敗\n將重新加載頁面");
unsafeWindow.location.reload(true);
}
} else {
alert("已取消操作");
}
}
}
// console.log(GM_listValues());
// GM_deleteValue('enablePopup');
if (GM_getValue('enablePopup') === undefined)
GM_setValue('enablePopup', true);
console.log("enablePopup:" + GM_getValue('enablePopup'));
GM_registerMenuCommand('開關彈窗提示', changePopup);
document.addEventListener('DOMContentLoaded', function() {
console.log("網址:" + location.href);
console.log("window.aid:" + unsafeWindow.aid);
var aid = unsafeWindow.aid;
if (!aid) aid = location.href.match(/\/video\/av(\d+)\//)[1];
aid = Number(aid);
console.log("aid:" + aid);
console.log("window.pageno:" + unsafeWindow.pageno);
var pid = unsafeWindow.pageno;
if (!pid) {
if (location.href.match(/\/index_(\d+).html/)) {
pid = location.href.match(/\/index_(\d+).html/)[1];
} else if (location.href.match(/\/\?p\=(\d+)/)) {
pid = location.href.match(/\/\?p\=(\d+)/)[1];
} else {
pid = "1";
}
}
pid = Number(pid);
console.log("pid:" + pid);
episode_id = getEpisodeID(aid, pid);
if (episode_id) {
GM_registerMenuCommand('跳轉到' + getURL(episode_id), redirectURL);
let msg = document.querySelector('.b-page-body > .error-container > .error-panel');
if (msg && GM_getValue('enablePopup') === false || confirm("是否跳轉到" + getURL(episode_id) + "\n注意:可在腳本命令中關閉這彈窗自動跳轉")) {
location.replace(getURL(episode_id));
}
}
}, false);