Disable button when downloading danmaku

This commit is contained in:
the1812 2020-01-12 15:32:12 +08:00
parent 2128dca2d0
commit 6fb7fcf17c
8 changed files with 23 additions and 15 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -61,7 +61,7 @@
"default-video-speed.min.js": "34E3D2BC8BD5BBC2534EDE6D7B02DE6D5F4A01879641A9E128B4C24124759D77",
"double-click-fullscreen.min.js": "09C035FC7E281ABB042A4200F69757AB093079DBCC9939BE8C53C23EE2EDE41C",
"download-audio.min.js": "1F4536DE4FF302BFD026CA17E028AF8EB037FB6D0CB355692549DECAEAE0E8C9",
"download-danmaku.min.js": "E3B7DAC039E0E300EAE310AFD5C88476DA1A6228CBBDD99D290336C77EEA0AF8",
"download-danmaku.min.js": "87BC2B39D99E029BB602AB2F59A387FC960D5779791524F8C26FBC0278CD8F8E",
"download-subtitle.min.js": "C06CB467F6EA05BDEC2395EE24CF0B7963CBCAD4536985595F4A8A2EC68545D3",
"download-video.min.css": "1EFE5EAFB1ABCBD01F583439AB910801B23359E9C9405A0515CA4A025B1AD7AB",
"download-video.min.html": "D662FBB3C6899E75A52D15C59C53FD6966DA6E4CE463BCEFF0008D5BD3796C7F",

Binary file not shown.

View File

@ -1 +1 @@
(()=>{return(t,e)=>{const{getFriendlyTitle:n}=e.import("title");const{DanmakuInfo:i}=e.import("video-info");const{DanmakuConverter:a}=e.import("danmaku-converter");async function o(t){const e=n();let i={title:e};try{await loadDanmakuSettingsPanel();const t=t=>{const e=parseFloat(dq(t).style.transform.replace(/translateX\(([\d\.]+)/,"$1"));return e*4/188};const e=t=>{const e=parseFloat(dq(t).style.transform.replace(/translateX\(([\d\.]+)/,"$1"));const n={0:0,44:1,94:2,144:3,188:4}[e];return n};i.font=dq(".bilibili-player-video-danmaku-setting-right-font .bui-select-result").innerText;i.alpha=parseFloat(dq(".bilibili-player-setting-opacity .bui-bar").style.transform.replace(/scaleX\(([\d\.]+)\)/,"$1"));i.duration=(()=>{const e=18-3*t(".bilibili-player-setting-speedplus .bui-thumb");return t=>{switch(t.type){case 4:case 5:return 4;default:return e}}})();i.blockTypes=(()=>{let t=[];const e={".bilibili-player-block-filter-type[ftype=scroll]":[1,2,3],".bilibili-player-block-filter-type[ftype=top]":[5],".bilibili-player-block-filter-type[ftype=bottom]":[4],".bilibili-player-block-filter-type[ftype=color]":["color"]};for(const[n,i]of Object.entries(e)){if(dq(n).classList.contains("disabled")){t=t.concat(i)}}return t.concat(7,8)})();const n=1.4-.2*t(".bilibili-player-setting-fontsize .bui-thumb");i.resolution={x:1920*n,y:1080*n};i.bottomMarginPercent=[.75,.5,.25,0,0][e(".bilibili-player-setting-area .bui-thumb")];if(i.bottomMarginPercent===0&&dq(".bilibili-player-video-danmaku-setting-left-preventshade input").checked){i.bottomMarginPercent=.15}i.bold=dq(".bilibili-player-video-danmaku-setting-right-font-bold input").checked}catch(t){i={font:"微软雅黑",alpha:.6,duration:t=>{switch(t.type){case 4:case 5:return 4;default:return 6}},blockTypes:[7,8],resolution:{x:1920,y:1080},bottomMarginPercent:.15,bold:false}}const o=new a(i);const r=o.convertToAssDocument(t);return r.generateAss()}async function r(t,e){const a=n();const r=new i((unsafeWindow||window).cid);await r.fetchInfo();const l=await(async()=>{if(t===true){return new Blob([await o(r.rawXML)],{type:"text/plain"})}else{return new Blob([r.rawXML],{type:"text/plain"})}})();const s=URL.createObjectURL(l);const c=dq("#danmaku-link");const d=c.getAttribute("href");if(d){URL.revokeObjectURL(d)}clearTimeout(e);dq("#download-danmaku>span").innerHTML="下载弹幕";c.setAttribute("download",`${a}.${t?"ass":"xml"}`);c.setAttribute("href",s);c.click()}return{export:{downloadDanmaku:r,convertToAss:o},widget:{content:`\n<button\n class="gui-settings-flat-button"\n id="download-danmaku">\n<i class="icon-danmaku"></i>\n<span>下载弹幕</span>\n<a id="danmaku-link" style="display:none"></a>\n</button>`,condition:async()=>{let t=await SpinQuery.select(()=>(unsafeWindow||window).cid);return Boolean(t)},success:()=>{const t=document.querySelector("#danmaku-link");dq("#download-danmaku").addEventListener("click",e=>{if(e.target!==t){const t=setTimeout(()=>dq("#download-danmaku>span").innerHTML="请稍侯...",200);r(e.shiftKey,t)}})}}}}})();
(()=>{return(t,e)=>{const{getFriendlyTitle:n}=e.import("title");const{DanmakuInfo:i}=e.import("video-info");const{DanmakuConverter:a}=e.import("danmaku-converter");async function o(t){const e=n();let i={title:e};try{await loadDanmakuSettingsPanel();const t=t=>{const e=parseFloat(dq(t).style.transform.replace(/translateX\(([\d\.]+)/,"$1"));return e*4/188};const e=t=>{const e=parseFloat(dq(t).style.transform.replace(/translateX\(([\d\.]+)/,"$1"));const n={0:0,44:1,94:2,144:3,188:4}[e];return n};i.font=dq(".bilibili-player-video-danmaku-setting-right-font .bui-select-result").innerText;i.alpha=parseFloat(dq(".bilibili-player-setting-opacity .bui-bar").style.transform.replace(/scaleX\(([\d\.]+)\)/,"$1"));i.duration=(()=>{const e=18-3*t(".bilibili-player-setting-speedplus .bui-thumb");return t=>{switch(t.type){case 4:case 5:return 4;default:return e}}})();i.blockTypes=(()=>{let t=[];const e={".bilibili-player-block-filter-type[ftype=scroll]":[1,2,3],".bilibili-player-block-filter-type[ftype=top]":[5],".bilibili-player-block-filter-type[ftype=bottom]":[4],".bilibili-player-block-filter-type[ftype=color]":["color"]};for(const[n,i]of Object.entries(e)){if(dq(n).classList.contains("disabled")){t=t.concat(i)}}return t.concat(7,8)})();const n=1.4-.2*t(".bilibili-player-setting-fontsize .bui-thumb");i.resolution={x:1920*n,y:1080*n};i.bottomMarginPercent=[.75,.5,.25,0,0][e(".bilibili-player-setting-area .bui-thumb")];if(i.bottomMarginPercent===0&&dq(".bilibili-player-video-danmaku-setting-left-preventshade input").checked){i.bottomMarginPercent=.15}i.bold=dq(".bilibili-player-video-danmaku-setting-right-font-bold input").checked}catch(t){i={font:"微软雅黑",alpha:.6,duration:t=>{switch(t.type){case 4:case 5:return 4;default:return 6}},blockTypes:[7,8],resolution:{x:1920,y:1080},bottomMarginPercent:.15,bold:false}}const o=new a(i);const l=o.convertToAssDocument(t);return l.generateAss()}async function l(t){const e=n();const a=new i((unsafeWindow||window).cid);await a.fetchInfo();const l=await(async()=>{if(t===true){return new Blob([await o(a.rawXML)],{type:"text/plain"})}else{return new Blob([a.rawXML],{type:"text/plain"})}})();const r=URL.createObjectURL(l);const s=dq("#danmaku-link");const c=s.getAttribute("href");if(c){URL.revokeObjectURL(c)}s.setAttribute("download",`${e}.${t?"ass":"xml"}`);s.setAttribute("href",r);s.click()}return{export:{downloadDanmaku:l,convertToAss:o},widget:{content:`\n<button\n class="gui-settings-flat-button"\n id="download-danmaku">\n<i class="icon-danmaku"></i>\n<span>下载弹幕</span>\n<a id="danmaku-link" style="display:none"></a>\n</button>`,condition:async()=>{let t=await SpinQuery.select(()=>(unsafeWindow||window).cid);return Boolean(t)},success:()=>{const t=dq("#danmaku-link");const e=dq("#download-danmaku");e.addEventListener("click",n=>{if(n.target!==t){try{e.disabled=true;l(n.shiftKey)}catch(t){logError(t)}finally{e.disabled=false}}})}}}}})();

View File

@ -91,7 +91,7 @@ export async function convertToAss(xml: string) {
const assDocument = converter.convertToAssDocument(xml)
return assDocument.generateAss()
}
export async function downloadDanmaku(ass: boolean, timeout: number | undefined) {
export async function downloadDanmaku(ass: boolean) {
const title = getFriendlyTitle()
const danmaku = new DanmakuInfo((unsafeWindow || window).cid!)
await danmaku.fetchInfo()
@ -112,8 +112,8 @@ export async function downloadDanmaku(ass: boolean, timeout: number | undefined)
if (oldUrl) {
URL.revokeObjectURL(oldUrl)
}
clearTimeout(timeout);
(dq('#download-danmaku>span') as HTMLElement).innerHTML = '下载弹幕'
// clearTimeout(timeout);
// (dq('#download-danmaku>span') as HTMLElement).innerHTML = '下载弹幕'
link.setAttribute('download', `${title}.${(ass ? 'ass' : 'xml')}`)
link.setAttribute('href', url)
link.click()
@ -137,13 +137,21 @@ export default {
return Boolean(cid)
},
success: () => {
const link = document.querySelector('#danmaku-link')
dq('#download-danmaku')!.addEventListener('click', (e: MouseEvent) => {
const link = dq('#danmaku-link')
const button = dq('#download-danmaku') as HTMLButtonElement
button.addEventListener('click', (e: MouseEvent) => {
if (e.target !== link) {
const timeout = setTimeout(
() => (dq('#download-danmaku>span') as HTMLElement).innerHTML = '请稍侯...',
200)
downloadDanmaku(e.shiftKey, timeout)
// const timeout = setTimeout(
// () => (dq('#download-danmaku>span') as HTMLElement).innerHTML = '请稍侯...',
// 200)
try {
button.disabled = true
downloadDanmaku(e.shiftKey)
} catch (error) {
logError(error)
} finally {
button.disabled = false
}
}
})
}