Fix reused danmakus

This commit is contained in:
the1812 2020-10-02 19:48:47 +08:00
parent ecb48c5b4d
commit c863713a77
10 changed files with 39 additions and 39 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

2
min/airborne.min.js vendored
View File

@ -1 +1 @@
(()=>{return(e,t)=>{(async()=>{if(!document.URL.match(/\/\/www\.bilibili\.com\/video\//)){return}const{forEachVideoDanmaku:e}=await t.importAsync("video-danmaku");t.applyStyle("airborneStyle");const n=e=>{if(!e){return NaN}const t=e.match(/(\d+)[:.](\d+)([:](\d+))?/);if(!t){return NaN}if(t[3]){const[,e,n,,a]=t.map(e=>parseInt(e));if([e,n,a].some(e=>Number.isNaN(e))){return NaN}return e*3600+n*60+a}const[,n,a]=t.map(e=>parseInt(e));if([n,a].some(e=>Number.isNaN(e))){return NaN}return n*60+a};const a=e=>{const t=e.target;if(!t.classList.contains("b-danmaku")){return}const a=n(t.textContent);if(!Number.isNaN(a)){const e=dq("video");e.currentTime=a;e.play()}};const r=e=>{const t=!Number.isNaN(n(e.text));e.element.classList.toggle("airborne",t)};e({added:r});Observer.videoChange(()=>{const e=dq(".bilibili-player-video-wrap");if(e.classList.contains("airborne-enabled")){return}e.classList.add("airborne-enabled");e.addEventListener("click",a)})})()}})(); (()=>{return(e,t)=>{(async()=>{if(!document.URL.match(/\/\/www\.bilibili\.com\/video\//)){return}const{forEachVideoDanmaku:e}=await t.importAsync("video-danmaku");t.applyStyle("airborneStyle");const n=e=>{if(!e){return NaN}const t=e.match(/(\d+)[ ]*[:.][ ]*(\d+)([ ]*[:][ ]*(\d+))?/);if(!t){return NaN}if(t[3]){const[,e,n,,a]=t.map(e=>parseInt(e));if([e,n,a].some(e=>Number.isNaN(e))){return NaN}return e*3600+n*60+a}const[,n,a]=t.map(e=>parseInt(e));if([n,a].some(e=>Number.isNaN(e))){return NaN}return n*60+a};const a=e=>{const t=e.target;if(!t.classList.contains("b-danmaku")){return}const a=n(t.textContent);if(!Number.isNaN(a)){const e=dq("video");e.currentTime=a;e.play()}};const r=e=>{const t=!Number.isNaN(n(e.text));e.element.classList.toggle("airborne",t)};e({added:r});Observer.videoChange(()=>{const e=dq(".bilibili-player-video-wrap");if(e.classList.contains("airborne-enabled")){return}e.classList.add("airborne-enabled");e.addEventListener("click",a)})})()}})();

View File

@ -5,7 +5,7 @@
"activity-apis.min.js": "459D26DB0BB447FEFE6F1842541A119E67C63573A800E56AD7FEC71D20087CEF", "activity-apis.min.js": "459D26DB0BB447FEFE6F1842541A119E67C63573A800E56AD7FEC71D20087CEF",
"activity-image-saver.min.js": "4117EDC0D59C15461083B2EB56F5061DCABAA5EA9699C438DD0E221FEAAFA8B3", "activity-image-saver.min.js": "4117EDC0D59C15461083B2EB56F5061DCABAA5EA9699C438DD0E221FEAAFA8B3",
"airborne.min.css": "2224FDD07845BD008E193B5E575B14243B27F3E151B46DF3D5D66270154E8278", "airborne.min.css": "2224FDD07845BD008E193B5E575B14243B27F3E151B46DF3D5D66270154E8278",
"airborne.min.js": "A3BD8E5118C84685482320D81EBD707AE3A6DC4A66E676414E1C1F9DB7252604", "airborne.min.js": "B5DB1737CB278F2556A99A25D47B4D85F6E48B1D600772658C68C436FCEB50FE",
"aria2-rpc-profile-item.vue.min.js": "61DCAD1D440E036B89C22E00C51C8357DBB529612CB428D55C3804410D2AD059", "aria2-rpc-profile-item.vue.min.js": "61DCAD1D440E036B89C22E00C51C8357DBB529612CB428D55C3804410D2AD059",
"aria2-rpc-profiles.vue.min.js": "CBF3D159566A694BC543EAB5B9E743A13B571743EBDDB8C558AE036483E3AF5A", "aria2-rpc-profiles.vue.min.js": "CBF3D159566A694BC543EAB5B9E743A13B571743EBDDB8C558AE036483E3AF5A",
"aria2-rpc.min.js": "133AE00F1BD5C68E52385D170FA2983A7A82F0326D8C42C4E3CDA14ED4F3626F", "aria2-rpc.min.js": "133AE00F1BD5C68E52385D170FA2983A7A82F0326D8C42C4E3CDA14ED4F3626F",
@ -244,7 +244,7 @@
"v-dropdown.vue.min.js": "BA1142E2D44CC9593DA803CAA76FA2B814CBD65D4D4210ABF00E811C361D8A37", "v-dropdown.vue.min.js": "BA1142E2D44CC9593DA803CAA76FA2B814CBD65D4D4210ABF00E811C361D8A37",
"video-card-info.min.js": "13B755C0EE0CA018AE65251E168BAF3395FEA2EB4FAD6949AADD752F61B8819B", "video-card-info.min.js": "13B755C0EE0CA018AE65251E168BAF3395FEA2EB4FAD6949AADD752F61B8819B",
"video-card.vue.min.js": "E67A429519E70AB872B0EF8DB9B5A6992F0C474E98AAEC12468F41C982ABD9C5", "video-card.vue.min.js": "E67A429519E70AB872B0EF8DB9B5A6992F0C474E98AAEC12468F41C982ABD9C5",
"video-danmaku.min.js": "EDCFEBA816E1F6AE0BC5719FC716F47790107F0AC7C405740154F7EB4419F90D", "video-danmaku.min.js": "0187BB3692752434D5C9C204D74744DD08884CA3A42C564A85084A60D899C3B7",
"video-dash.min.js": "DD85855581048237B51B2BD6BFEAFB993172DA7DF8E2B0CFEBCF449FDB82F6A6", "video-dash.min.js": "DD85855581048237B51B2BD6BFEAFB993172DA7DF8E2B0CFEBCF449FDB82F6A6",
"video-downloader-fragment.min.js": "13B755C0EE0CA018AE65251E168BAF3395FEA2EB4FAD6949AADD752F61B8819B", "video-downloader-fragment.min.js": "13B755C0EE0CA018AE65251E168BAF3395FEA2EB4FAD6949AADD752F61B8819B",
"video-info.min.js": "99E06DD08BE4B3BA649B8E5C4F81078F83F852E1F43A16199CE67F65BC769AEE", "video-info.min.js": "99E06DD08BE4B3BA649B8E5C4F81078F83F852E1F43A16199CE67F65BC769AEE",

Binary file not shown.

View File

@ -1 +1 @@
(()=>{return(e,t)=>{let n;const r=[];const a=e=>{return{element:e,reuse:false,text:e.textContent||""}};const o=(e,t)=>{if(n){n.stop()}n=Observer.observe(e,e=>{e.forEach(e=>{if(e.type==="childList"){e.addedNodes.forEach(e=>{if(!(e instanceof HTMLElement)){return}const n=a(e);r.push(n);t.added&&t.added(n)});e.removedNodes.forEach(e=>{if(!(e instanceof HTMLElement)){return}const n=r.findIndex(t=>t.element===e);if(n!==-1){const[e]=r.splice(n,1);t.removed&&t.removed(e)}})}else if(e.type==="characterData"){const n=e.target;const a=r.find(e=>e.element===n);if(!a){return}a.text=n.textContent||"";a.reuse=true;t.added&&t.added(a)}})},{childList:true,characterData:true,subtree:true})};const d=async e=>{const t=await videoCondition();if(!t){return}Observer.videoChange(async()=>{const t=await SpinQuery.select(".bilibili-player-video-danmaku");if(!t){return}o(t,e)})};return{export:{forEachVideoDanmaku:d}}}})(); (()=>{return(e,t)=>{let n;const r=[];const o=e=>{return{element:e,reuse:false,text:e.textContent||""}};const d=(e,t)=>{if(n){n.stop()}n=Observer.observe(e,e=>{e.forEach(e=>{e.addedNodes.forEach(e=>{if(e.nodeType===Node.TEXT_NODE){const n=e.parentElement;const o=r.find(e=>e.element===n);if(!o){return}o.text=e.textContent||"";o.reuse=true;t.added&&t.added(o);return}if(!(e instanceof HTMLElement)){return}const n=o(e);r.push(n);t.added&&t.added(n)});e.removedNodes.forEach(e=>{if(!(e instanceof HTMLElement)){return}const n=r.findIndex(t=>t.element===e);if(n!==-1){const[e]=r.splice(n,1);t.removed&&t.removed(e)}})})},{childList:true,subtree:true})};const s=async e=>{const t=await videoCondition();if(!t){return}Observer.videoChange(async()=>{const t=await SpinQuery.select(".bilibili-player-video-danmaku");if(!t){return}d(t,e)})};return{export:{forEachVideoDanmaku:s}}}})();

View File

@ -10,7 +10,7 @@ import { DanmakuRecord } from '../video-danmaku'
if (!text) { if (!text) {
return NaN return NaN
} }
const airborneMatch = text.match(/(\d+)[:.](\d+)([:](\d+))?/) const airborneMatch = text.match(/(\d+)[ ]*[:.][ ]*(\d+)([ ]*[:][ ]*(\d+))?/)
if (!airborneMatch) { if (!airborneMatch) {
return NaN return NaN
} }

View File

@ -22,8 +22,18 @@ const startRecording = (container: HTMLElement, callback: DanmakuRecordCallback)
} }
danmakuContainerObserver = Observer.observe(container, records => { danmakuContainerObserver = Observer.observe(container, records => {
records.forEach(record => { records.forEach(record => {
if (record.type === 'childList') {
record.addedNodes.forEach(node => { record.addedNodes.forEach(node => {
if (node.nodeType === Node.TEXT_NODE) {
const element = node.parentElement as HTMLElement
const danmaku = recordedDanmakus.find(d => d.element === element)
if (!danmaku) {
return
}
danmaku.text = node.textContent || ''
danmaku.reuse = true
callback.added && callback.added(danmaku)
return
}
if (!(node instanceof HTMLElement)) { if (!(node instanceof HTMLElement)) {
return return
} }
@ -41,18 +51,8 @@ const startRecording = (container: HTMLElement, callback: DanmakuRecordCallback)
callback.removed && callback.removed(danmaku) callback.removed && callback.removed(danmaku)
} }
}) })
} else if (record.type === 'characterData') {
const element = record.target as HTMLElement
const danmaku = recordedDanmakus.find(d => d.element === element)
if (!danmaku) {
return
}
danmaku.text = element.textContent || ''
danmaku.reuse = true
callback.added && callback.added(danmaku)
}
}) })
}, { childList: true, characterData: true, subtree: true }) }, { childList: true, subtree: true })
} }
export const forEachVideoDanmaku = async (callback: DanmakuRecordCallback) => { export const forEachVideoDanmaku = async (callback: DanmakuRecordCallback) => {
const hasVideo = await videoCondition() const hasVideo = await videoCondition()