mirror of
https://github.com/the1812/Bilibili-Evolved.git
synced 2025-11-04 21:22:45 +08:00
1 line
2.4 KiB
JavaScript
1 line
2.4 KiB
JavaScript
(()=>{return(e,t)=>{const{getFriendlyTitle:n}=t.import("title");let s=null;let i=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(s===null||i===null){s=document.createElement("canvas");s.width=e.videoWidth;s.height=e.videoHeight;i=s.getContext("2d")}const t=e.currentTime;return new Promise((n,r)=>{if(s===null||i===null){r("视频截图失败: canvas 未创建或创建失败.");return}i.drawImage(e,0,0);s.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-on:discard="discard(screenshot)" 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 v-on:click="discard" title="丢弃" class="discard"><i class="mdi mdi-delete-forever-outline"></i></button>\n </div>\n </div>`,methods:{discard(){this.$emit("discard")}}});const c=new Vue({el:".video-screenshot-list",data:{screenshots:[]},methods:{discard(e){this.screenshots.splice(this.screenshots.indexOf(e),1);e.revoke()}}});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);c.screenshots.push(t)})});return{export:{takeScreenshot:r,screenShotsList:c}}}})(); |