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-image-saver.min.js": "4117EDC0D59C15461083B2EB56F5061DCABAA5EA9699C438DD0E221FEAAFA8B3",
"airborne.min.css": "2224FDD07845BD008E193B5E575B14243B27F3E151B46DF3D5D66270154E8278",
"airborne.min.js": "A3BD8E5118C84685482320D81EBD707AE3A6DC4A66E676414E1C1F9DB7252604",
"airborne.min.js": "B5DB1737CB278F2556A99A25D47B4D85F6E48B1D600772658C68C436FCEB50FE",
"aria2-rpc-profile-item.vue.min.js": "61DCAD1D440E036B89C22E00C51C8357DBB529612CB428D55C3804410D2AD059",
"aria2-rpc-profiles.vue.min.js": "CBF3D159566A694BC543EAB5B9E743A13B571743EBDDB8C558AE036483E3AF5A",
"aria2-rpc.min.js": "133AE00F1BD5C68E52385D170FA2983A7A82F0326D8C42C4E3CDA14ED4F3626F",
@ -244,7 +244,7 @@
"v-dropdown.vue.min.js": "BA1142E2D44CC9593DA803CAA76FA2B814CBD65D4D4210ABF00E811C361D8A37",
"video-card-info.min.js": "13B755C0EE0CA018AE65251E168BAF3395FEA2EB4FAD6949AADD752F61B8819B",
"video-card.vue.min.js": "E67A429519E70AB872B0EF8DB9B5A6992F0C474E98AAEC12468F41C982ABD9C5",
"video-danmaku.min.js": "EDCFEBA816E1F6AE0BC5719FC716F47790107F0AC7C405740154F7EB4419F90D",
"video-danmaku.min.js": "0187BB3692752434D5C9C204D74744DD08884CA3A42C564A85084A60D899C3B7",
"video-dash.min.js": "DD85855581048237B51B2BD6BFEAFB993172DA7DF8E2B0CFEBCF449FDB82F6A6",
"video-downloader-fragment.min.js": "13B755C0EE0CA018AE65251E168BAF3395FEA2EB4FAD6949AADD752F61B8819B",
"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) {
return NaN
}
const airborneMatch = text.match(/(\d+)[:.](\d+)([:](\d+))?/)
const airborneMatch = text.match(/(\d+)[ ]*[:.][ ]*(\d+)([ ]*[:][ ]*(\d+))?/)
if (!airborneMatch) {
return NaN
}

View File

@ -22,37 +22,37 @@ const startRecording = (container: HTMLElement, callback: DanmakuRecordCallback)
}
danmakuContainerObserver = Observer.observe(container, records => {
records.forEach(record => {
if (record.type === 'childList') {
record.addedNodes.forEach(node => {
if (!(node instanceof HTMLElement)) {
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
}
const danmaku = parseDanmakuRecord(node)
recordedDanmakus.push(danmaku)
danmaku.text = node.textContent || ''
danmaku.reuse = true
callback.added && callback.added(danmaku)
})
record.removedNodes.forEach(node => {
if (!(node instanceof HTMLElement)) {
return
}
const index = recordedDanmakus.findIndex(d => d.element === node)
if (index !== -1) {
const [danmaku] = recordedDanmakus.splice(index, 1)
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
if (!(node instanceof HTMLElement)) {
return
}
const danmaku = parseDanmakuRecord(node)
recordedDanmakus.push(danmaku)
callback.added && callback.added(danmaku)
}
})
record.removedNodes.forEach(node => {
if (!(node instanceof HTMLElement)) {
return
}
const index = recordedDanmakus.findIndex(d => d.element === node)
if (index !== -1) {
const [danmaku] = recordedDanmakus.splice(index, 1)
callback.removed && callback.removed(danmaku)
}
})
})
}, { childList: true, characterData: true, subtree: true })
}, { childList: true, subtree: true })
}
export const forEachVideoDanmaku = async (callback: DanmakuRecordCallback) => {
const hasVideo = await videoCondition()