Recover show dead video title

This commit is contained in:
the1812 2019-07-04 11:28:05 +08:00
parent 7c39e4c901
commit f9d4c2f5e2
14 changed files with 59 additions and 25 deletions

View File

@ -227,6 +227,7 @@ declare global
allowJumpContinue: boolean,
autoPlay: boolean,
showDeadVideoTitle: boolean,
deadVideoTitleProvider: '稍后再看' | 'Biliplus',
useBiliplusRedirect: boolean,
biliplusRedirect: boolean,
framePlayback: boolean,

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -194,6 +194,7 @@ const settings = {
allowJumpContinue: false,
autoPlay: false,
showDeadVideoTitle: false,
deadVideoTitleProvider: '稍后再看',
useBiliplusRedirect: false,
biliplusRedirect: false,
framePlayback: true,
@ -1674,8 +1675,13 @@ Resource.manifest = {
path: 'show-dead-video-title.min.js',
displayNames: {
showDeadVideoTitle: '显示失效视频信息',
useBiliplusRedirect: '失效视频重定向'
}
useBiliplusRedirect: '失效视频重定向',
deadVideoTitleProvider: '信息来源',
},
dropdown: {
key: 'deadVideoTitleProvider',
items: ['稍后再看', 'Biliplus'],
},
},
autoPlay: {
path: 'auto-play.min.js',

View File

@ -194,6 +194,7 @@ const settings = {
allowJumpContinue: false,
autoPlay: false,
showDeadVideoTitle: false,
deadVideoTitleProvider: '稍后再看',
useBiliplusRedirect: false,
biliplusRedirect: false,
framePlayback: true,
@ -1674,8 +1675,13 @@ Resource.manifest = {
path: 'show-dead-video-title.min.js',
displayNames: {
showDeadVideoTitle: '显示失效视频信息',
useBiliplusRedirect: '失效视频重定向'
}
useBiliplusRedirect: '失效视频重定向',
deadVideoTitleProvider: '信息来源',
},
dropdown: {
key: 'deadVideoTitleProvider',
items: ['稍后再看', 'Biliplus'],
},
},
autoPlay: {
path: 'auto-play.min.js',

View File

@ -422,8 +422,13 @@ Resource.manifest = {
path: 'show-dead-video-title.min.js',
displayNames: {
showDeadVideoTitle: '显示失效视频信息',
useBiliplusRedirect: '失效视频重定向'
}
useBiliplusRedirect: '失效视频重定向',
deadVideoTitleProvider: '信息来源',
},
dropdown: {
key: 'deadVideoTitleProvider',
items: ['稍后再看', 'Biliplus'],
},
},
autoPlay: {
path: 'auto-play.min.js',

View File

@ -73,6 +73,7 @@ export const settings = {
allowJumpContinue: false,
autoPlay: false,
showDeadVideoTitle: false,
deadVideoTitleProvider: '稍后再看',
useBiliplusRedirect: false,
biliplusRedirect: false,
framePlayback: true,

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
(()=>{return(e,t)=>{(async()=>{if(!document.URL.startsWith("https://space.bilibili.com")){return}class t{}class i extends t{convertToDeadVideoInfo(e){return{title:e.title,cover:e.pic}}async queryInfo(e){const t=[];if(e.length<=i.MaxCountPerRequest){const s=await Ajax.getJson(`${i.BiliplusHost}/api/aidinfo?aid=${e.join(",")}`);if(s.code===0){t.push(...e.map(e=>{if(e in s.data){return this.convertToDeadVideoInfo(s.data[e])}else{return{title:"已失效视频",cover:""}}}))}else{console.error(`[显示失效视频信息] Biliplus API 未成功. message=${s.message}`)}}else{t.push(...await this.queryInfo(e.slice(0,i.MaxCountPerRequest)));t.push(...await this.queryInfo(e.slice(i.MaxCountPerRequest)))}return t}}i.BiliplusHost=`https://hd.biliplus.com`;i.MaxCountPerRequest=30;class s extends t{async queryInfo(e){const t=[];await Promise.all(e.map(e=>Ajax.postTextWithCredentials("https://api.bilibili.com/x/v2/history/toview/add",`aid=${e}&csrf=${s.csrf}`)));const i=await Ajax.getJsonWithCredentials("https://api.bilibili.com/x/v2/history/toview/web");if(i.code===0){const a=i.data.list.map(e=>{return{aid:e.aid,title:e.title,cover:e.pic}});t.push(...e.map(e=>a.find(t=>t.aid===parseInt(e))).filter(e=>e!==undefined));await Promise.all(e.map(e=>Ajax.postTextWithCredentials("https://api.bilibili.com/x/v2/history/toview/del",`aid=${e}&csrf=${s.csrf}`)))}else{console.error(`[显示失效视频信息] 稍后再看 API 未成功. message=${i.message}`)}return t}}s.csrf=document.cookie.replace(/(?:(?:^|.*;\s*)bili_jct\s*\=\s*([^;]*).*$)|^.*$/,"$1");const a=await SpinQuery.select("#app>.s-space");if(!a){return}Observer.childListSubtree(a,async()=>{const t=dqa(".disabled[data-aid]");if(t.length===0){return}const i=t.map(e=>e.getAttribute("data-aid"));const a=new s;const r=await a.queryInfo(i);t.forEach((t,i)=>{t.classList.remove("disabled");const s=t.getAttribute("data-aid");const a=(()=>{if(e.useBiliplusRedirect){return`https://hd.biliplus.com/video/av${s}`}else{return`//www.bilibili.com/video/av${s}`}})();const o=t.querySelector("a.cover");o.target="_blank";o.href=a;const n=r[i];if(n.cover!==""){o.querySelector("img").src=n.cover.replace("http:","https:")}const l=t.querySelector("a.title");l.target="_blank";l.title=n.title;l.href=a;l.innerText=n.title})})})()}})();
(()=>{return(e,t)=>{(async()=>{if(!document.URL.startsWith("https://space.bilibili.com")){return}class t{}class i extends t{convertToDeadVideoInfo(e){return{title:e.title,cover:e.pic}}async queryInfo(e){const t=[];if(e.length<=i.MaxCountPerRequest){const s=await Ajax.getJson(`${i.BiliplusHost}/api/aidinfo?aid=${e.join(",")}`);if(s.code===0){t.push(...e.map(e=>{if(e in s.data){return this.convertToDeadVideoInfo(s.data[e])}else{return{title:"已失效视频",cover:""}}}))}else{console.error(`[显示失效视频信息] Biliplus API 未成功. message=${s.message}`)}}else{t.push(...await this.queryInfo(e.slice(0,i.MaxCountPerRequest)));t.push(...await this.queryInfo(e.slice(i.MaxCountPerRequest)))}return t}}i.BiliplusHost=`https://hd.biliplus.com`;i.MaxCountPerRequest=30;class s extends t{async queryInfo(e){const t=[];await Promise.all(e.map(e=>Ajax.postTextWithCredentials("https://api.bilibili.com/x/v2/history/toview/add",`aid=${e}&csrf=${s.csrf}`)));const i=await Ajax.getJsonWithCredentials("https://api.bilibili.com/x/v2/history/toview/web");if(i.code===0){const a=i.data.list.map(e=>{return{aid:e.aid,title:e.title,cover:e.pic}});t.push(...e.map(e=>a.find(t=>t.aid===parseInt(e))).filter(e=>e!==undefined));await Promise.all(e.map(e=>Ajax.postTextWithCredentials("https://api.bilibili.com/x/v2/history/toview/del",`aid=${e}&csrf=${s.csrf}`)))}else{console.error(`[显示失效视频信息] 稍后再看 API 未成功. message=${i.message}`)}return t}}s.csrf=document.cookie.replace(/(?:(?:^|.*;\s*)bili_jct\s*\=\s*([^;]*).*$)|^.*$/,"$1");const a=await SpinQuery.select("#app>.s-space");if(!a){return}Observer.childListSubtree(a,async()=>{const t=dqa(".disabled[data-aid]");if(t.length===0){return}const a=t.map(e=>e.getAttribute("data-aid"));const r=e.deadVideoTitleProvider==="Biliplus"?new i:new s;const o=await r.queryInfo(a);t.forEach((t,i)=>{t.classList.remove("disabled");const s=t.getAttribute("data-aid");const a=(()=>{if(e.useBiliplusRedirect){return`https://hd.biliplus.com/video/av${s}`}else{return`//www.bilibili.com/video/av${s}`}})();const r=t.querySelector("a.cover");r.target="_blank";r.href=a;const l=o[i];if(l.cover!==""){r.querySelector("img").src=l.cover.replace("http:","https:")}const n=t.querySelector("a.title");n.target="_blank";n.title=l.title;n.href=a;n.innerText=l.title})})})()}})();

View File

@ -1 +1 @@
(()=>{return(e,t)=>{class a{constructor(e){this.key=e}get originalValue(){return e[this.key]}static getValidator(e){switch(e){case"customStyleColor":return new s(e);case"blurBackgroundOpacity":case"customControlBackgroundOpacity":case"customNavbarBlurOpacity":return new i(e);case"defaultPlayerMode":case"defaultVideoQuality":case"i18nLanguage":return new r(e);case"darkScheduleStart":case"darkScheduleEnd":return new n(e);case"playerFocusOffset":return new u(e);case"sideBarOffset":return new o(e,-40,40);default:return new a(e)}}isValidate(e){return e}validate(e){const t=this.isValidate(e);if(t===undefined){return this.originalValue}return t}}class s extends a{isValidate(e){if(/^#([0-9a-fA-F]{6}|[0-9a-fA-F]{3})$/.test(e)){if(e.length<7){return`#${e[1]}${e[1]}${e[2]}${e[2]}${e[3]}${e[3]}`}else{return e}}}}class i extends a{isValidate(e){if(/^([-+]?\d+)(\.\d+)?$/.test(e)){const t=parseFloat(e);if(t>=0&&t<=1){return e}}}}class r extends a{isValidate(e){const[t]=Object.values(Resource.manifest).filter(e=>e.dropdown&&e.dropdown.key===this.key).map(e=>e.dropdown);if(t.items.indexOf(e)!==-1){return e}}}class n extends a{isValidate(e){const t=e.match(/^([\d]{1,2}):([\d]{1,2})$/);if(t&&t.length>=3){const e={hour:parseInt(t[1]),minute:parseInt(t[2])};(function(){while(this.minute<0){this.minute+=60;this.hour-=1}while(this.minute>=60){this.minute-=60;this.hour+=1}while(this.hour<0){this.hour+=24}while(this.hour>=24){this.hour-=24}}).call(e);return`${e.hour}:${e.minute<10?"0"+e.minute:e.minute}`}}}class u extends a{isValidate(e){const t=parseInt(e);if(!isNaN(t)){return t}}}class o extends a{constructor(e,t,a){super(e);this.min=t;this.max=a}isValidate(e){const t=parseInt(e);if(!isNaN(t)&&t>=this.min&&t<=this.max){return t}}}return{export:{Validator:a,ColorValidator:s,DropDownValidator:r,OpacityValidator:i,TimeValidator:n,NumberValidator:u}}}})();
(()=>{return(e,t)=>{class a{constructor(e){this.key=e}get originalValue(){return e[this.key]}static getValidator(e){switch(e){case"customStyleColor":return new i(e);case"blurBackgroundOpacity":case"customControlBackgroundOpacity":case"customNavbarBlurOpacity":return new s(e);case"defaultPlayerMode":case"defaultVideoQuality":case"i18nLanguage":case"deadVideoTitleProvider":return new r(e);case"darkScheduleStart":case"darkScheduleEnd":return new n(e);case"playerFocusOffset":return new u(e);case"sideBarOffset":return new o(e,-40,40);default:return new a(e)}}isValidate(e){return e}validate(e){const t=this.isValidate(e);if(t===undefined){return this.originalValue}return t}}class i extends a{isValidate(e){if(/^#([0-9a-fA-F]{6}|[0-9a-fA-F]{3})$/.test(e)){if(e.length<7){return`#${e[1]}${e[1]}${e[2]}${e[2]}${e[3]}${e[3]}`}else{return e}}}}class s extends a{isValidate(e){if(/^([-+]?\d+)(\.\d+)?$/.test(e)){const t=parseFloat(e);if(t>=0&&t<=1){return e}}}}class r extends a{isValidate(e){const[t]=Object.values(Resource.manifest).filter(e=>e.dropdown&&e.dropdown.key===this.key).map(e=>e.dropdown);if(t.items.indexOf(e)!==-1){return e}}}class n extends a{isValidate(e){const t=e.match(/^([\d]{1,2}):([\d]{1,2})$/);if(t&&t.length>=3){const e={hour:parseInt(t[1]),minute:parseInt(t[2])};(function(){while(this.minute<0){this.minute+=60;this.hour-=1}while(this.minute>=60){this.minute-=60;this.hour+=1}while(this.hour<0){this.hour+=24}while(this.hour>=24){this.hour-=24}}).call(e);return`${e.hour}:${e.minute<10?"0"+e.minute:e.minute}`}}}class u extends a{isValidate(e){const t=parseInt(e);if(!isNaN(t)){return t}}}class o extends a{constructor(e,t,a){super(e);this.min=t;this.max=a}isValidate(e){const t=parseInt(e);if(!isNaN(t)&&t>=this.min&&t<=this.max){return t}}}return{export:{Validator:a,ColorValidator:i,DropDownValidator:r,OpacityValidator:s,TimeValidator:n,NumberValidator:u}}}})();

View File

@ -92,8 +92,9 @@
<checkbox indent="0" key="hideTopSearch" dependencies=""></checkbox>
<checkbox indent="0" key="fullTweetsTitle" dependencies=""></checkbox>
<checkbox indent="0" key="fullPageTitle" dependencies=""></checkbox>
<!-- <checkbox indent="0" key="showDeadVideoTitle" dependencies=""></checkbox> -->
<!-- <checkbox indent="1" key="useBiliplusRedirect" dependencies="showDeadVideoTitle"></checkbox> -->
<checkbox indent="0" key="showDeadVideoTitle" dependencies=""></checkbox>
<checkbox indent="1" key="useBiliplusRedirect" dependencies="showDeadVideoTitle"></checkbox>
<dropdown indent="1" key="deadVideoTitleProvider" dependencies="showDeadVideoTitle"></dropdown>
<checkbox indent="0" key="biliplusRedirect" dependencies=""></checkbox>
<checkbox indent="0" key="imageResolution" dependencies=""></checkbox>
<checkbox indent="0" key="oldTweets" dependencies=""></checkbox>

View File

@ -16,6 +16,7 @@ export class Validator {
case 'defaultPlayerMode':
case 'defaultVideoQuality':
case 'i18nLanguage':
case 'deadVideoTitleProvider':
return new DropDownValidator(key)
case 'darkScheduleStart':
case 'darkScheduleEnd':

View File

@ -76,7 +76,7 @@
return;
}
const aids = deadVideos.map(it => it.getAttribute('data-aid'));
const query = new WatchlaterProvider();
const query = settings.deadVideoTitleProvider === 'Biliplus' ? new BiliplusProvider() : new WatchlaterProvider();
const infos = await query.queryInfo(aids);
deadVideos.forEach((it, index) => {
it.classList.remove('disabled');

View File

@ -80,7 +80,8 @@
return
}
const aids = deadVideos.map(it => it.getAttribute('data-aid')!)
const query = new WatchlaterProvider()
const query: DeadVideoInfoProvider =
settings.deadVideoTitleProvider === 'Biliplus' ? new BiliplusProvider() : new WatchlaterProvider()
const infos = await query.queryInfo(aids)
deadVideos.forEach((it, index) => {
it.classList.remove('disabled')