mirror of
https://github.com/the1812/Bilibili-Evolved.git
synced 2025-11-04 21:22:45 +08:00
1 line
2.2 KiB
JavaScript
1 line
2.2 KiB
JavaScript
(()=>{return(e,t)=>{const{getFriendlyTitle:n}=t.import("title");let i=null;let s=null;class o{constructor(e,t){this.blob=e;this.time=t;this.url=URL.createObjectURL(this.blob)}get filename(){return n()+" @"+this.time.toString()+".png"}revoke(){URL.revokeObjectURL(this.url)}}const r=e=>{if(i===null||s===null){i=document.createElement("canvas");i.width=e.videoWidth;i.height=e.videoHeight;s=i.getContext("2d")}const t=e.currentTime;return new Promise((n,r)=>{if(i===null||s===null){r("视频截图失败: canvas 未创建或创建失败.");return}s.drawImage(e,0,0);i.toBlob(e=>{if(e===null){r("视频截图失败: 创建 blob 失败.");return}n(new o(e,t))},"image/png")})};t.applyStyle("videoScreenshotStyle");document.body.insertAdjacentHTML("beforeend",`\n <div class="video-screenshot-list">\n <video-screenshot v-for="screenshot of screenshots" v-bind:filename="screenshot.filename" v-bind:object-url="screenshot.url" v-bind:key="screenshot.url"></video-screenshot>\n </div>\n`);Vue.component("video-screenshot",{props:{objectUrl:String,filename:String},template:`\n <div class="video-screenshot-thumbnail">\n <img v-bind:src="objectUrl">\n <div class="mask">\n <a v-bind:href="objectUrl" v-bind:download="filename" title="保存">\n <button class="save"><i class="mdi mdi-content-save-outline"></i></button>\n </a>\n <button title="丢弃" class="discard"><i class="mdi mdi-delete-forever-outline"></i></button>\n </div>\n </div>`});const l=new Vue({el:".video-screenshot-list",data:{screenshots:[]}});Observer.videoChange(async()=>{const e=await SpinQuery.select("#bofqi video");const t=await SpinQuery.select(".bilibili-player-video-time");if(e===null||t===null||document.querySelector(".video-take-screenshot")){return}t.insertAdjacentHTML("afterend",`\n <div class="video-take-screenshot" title="截图">\n <span><i class="mdi mdi-camera"></i></span>\n </div>`);const n=document.querySelector(".video-take-screenshot");if(n===null){return}n.addEventListener("click",async()=>{const t=await r(e);l.screenshots.push(t)})});return{export:{takeScreenshot:r,screenShotsList:l}}}})(); |