mirror of
https://github.com/the1812/Bilibili-Evolved.git
synced 2025-11-04 21:22:45 +08:00
1 line
4.3 KiB
JavaScript
1 line
4.3 KiB
JavaScript
(()=>(e,o)=>{const r=`<div class=live-danmaku-recorder :class={opened}><div class=header><div class=title v-if="!(collapsed && isRecording)">记录弹幕</div><template v-if="collapsed && isRecording"><icon type=mdi icon=record-rec></icon><div class=collapse-danmaku-count>{{danmakus.length}}</div></template><icon class=collapse type=mdi :icon="collapsed ? 'chevron-up' : 'chevron-down'"@click.native="collapsed = !collapsed"></icon><div class=close @click="opened = false"><icon type=mdi icon=close></icon></div></div><template v-if=!collapsed><div class=record-stats>已记录{{danmakus.length}}条弹幕</div><div class=loading-tip v-if=loading>正在连接...</div><div class=toggle-record v-else @click="isRecording = !isRecording"><template v-if=isRecording><icon type=mdi icon=square></icon>记录中</template><template v-else><icon type=mdi icon=circle></icon>开始记录</template></div><div class=exports><div class=export-xml @click=exportXML()>导出XML</div></div></template></div>`;o.applyStyleFromText(`.live-danmaku-recorder{position:fixed;top:100%;left:0;transform:translateX(8px) translateY(calc(-100% + 8px));opacity:0;pointer-events:none;display:flex;flex-direction:column;align-items:center;padding:12px;z-index:1000;color:#000;background-color:#fff;box-shadow:rgba(0,0,0,.2) 0 4px 8px 0;border-radius:8px 8px 0 0;min-width:200px}.live-danmaku-recorder.opened{transform:translateX(8px) translateY(calc(-100%));opacity:1;pointer-events:initial}body.dark .live-danmaku-recorder{color:#fff;background-color:#282828}.live-danmaku-recorder,.live-danmaku-recorder *{transition:.2s ease-out}.live-danmaku-recorder .header{display:flex;align-items:center;align-self:stretch}.live-danmaku-recorder .header .collapse{cursor:pointer}.live-danmaku-recorder .header .collapse-danmaku-count{flex-grow:1;padding-right:24px}.live-danmaku-recorder .header .title{flex-grow:1;font-weight:700;font-size:15px;padding-right:16px}.live-danmaku-recorder .header .close{cursor:pointer}.live-danmaku-recorder .header .close .be-icon{font-size:20px}.live-danmaku-recorder .record-stats{margin-top:16px;margin-bottom:8px}.live-danmaku-recorder .loading-tip{margin-bottom:16px}.live-danmaku-recorder .toggle-record{display:flex;align-items:center;padding:8px;margin-bottom:16px;background-color:var(--theme-color);color:var(--foreground-color);cursor:pointer;border-radius:8px}.live-danmaku-recorder .toggle-record .be-icon{font-size:14px;margin-right:8px}.live-danmaku-recorder .exports{align-self:stretch;display:flex;align-items:center}.live-danmaku-recorder .exports>*{border-radius:8px;cursor:pointer;padding:8px;text-align:center;white-space:nowrap;background-color:#8882}.live-danmaku-recorder .exports>:hover{background-color:#8884}.live-danmaku-recorder .exports .export-xml{flex:2 0 0}.live-danmaku-recorder .exports .export-ass{flex:1 0 0;margin-left:8px}`,"record-live-danmaku-style");return{export:Object.assign({template:r},{components:{Icon:()=>o.importAsync("icon.vue")},data(){return{isRecording:true,danmakus:[],opened:false,collapsed:false,loading:true}},async mounted(){try{const{LiveSocket:e}=await o.importAsync("live-socket");const r=await SpinQuery.select(".header-info-ctnr .room-cover");let a;if(r!==null){const e=r.href.match(/space\.bilibili\.com\/(\d+)/)[1];const o=await Ajax.getJson(`https://api.live.bilibili.com/room/v1/Room/getRoomInfoOld?mid=${e}`);a=_.get(o,"data.roomid",document.URL.match(/live\.bilibili\.com\/(blanc\/)?(\d+)/)[1])}else{a=document.URL.match(/live\.bilibili\.com\/(blanc\/)?(\d+)/)[1]}const i=new e(parseInt(a));i.addEventListener("danmaku",(e=>{if(this.isRecording){console.log(e.detail.content);this.danmakus.push(e.detail)}}));await i.start()}catch(e){logError(e)}finally{this.loading=false}},methods:{getXML(){const e=this.danmakus.map((e=>{const o=e.content.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'");return`<d p="${fixed(e.time/1e3,3)},${e.type},${e.fontSize},${e.color},${e.sendTime},0,${e.userHash},0">${o}</d>`}));const o=`\n<?xml version="1.0" encoding="UTF-8"?>\n<i>\n ${e.join("\n ")}\n</i>\n`.trim();return o},async exportXML(){const{getFriendlyTitle:e}=await o.importAsync("title");const{DownloadPackage:r}=await o.importAsync("download-package");const a=new r;a.add(e()+".xml",this.getXML());await a.emit()},async exportASS(){const e=this.getXML();console.log(e)}}})}})(); |