mirror of
https://github.com/the1812/Bilibili-Evolved.git
synced 2025-11-04 21:22:45 +08:00
Fix reused danmakus
This commit is contained in:
parent
ecb48c5b4d
commit
c863713a77
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
2
min/airborne.min.js
vendored
@ -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)})})()}})();
|
||||
@ -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",
|
||||
|
||||
BIN
min/bundle.zip
BIN
min/bundle.zip
Binary file not shown.
2
min/video-danmaku.min.js
vendored
2
min/video-danmaku.min.js
vendored
@ -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}}}})();
|
||||
@ -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
|
||||
}
|
||||
|
||||
@ -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()
|
||||
|
||||
Loading…
Reference in New Issue
Block a user