mirror of
https://github.com/the1812/Bilibili-Evolved.git
synced 2025-11-04 21:22:45 +08:00
1 line
3.8 KiB
JavaScript
1 line
3.8 KiB
JavaScript
(()=>(t,i)=>{(async()=>{if(!document.URL.startsWith("https://www.bilibili.com/video/")||!getUID()){return}const{playerReady:e}=await i.importAsync("player-ready");await e();const s=dq(".video-toolbar .ops .collect");if(!s){return}i.applyStyle("quickFavoriteStyle");const a=`\n<span title="快速收藏" @click.left.self="toggle()" @click.right.prevent.self="listShowing = !listShowing" class="quick-favorite" :class="{ on: isFavorite }">\n<i @click.left="toggle()" @click.right.prevent="listShowing = !listShowing"></i>\n<div class="text" @click.left="toggle()" @click.right.prevent="listShowing = !listShowing">快速收藏</div>\n</template>\n<div class="select-list" ref="selectList" :class="{ show: listShowing }">\n 选择快速收藏夹:\n<div v-if="lists.length > 0" class="lists">\n<v-dropdown :items="lists.map(it => it.title)" :value.sync="selectedFavorite"></v-dropdown>\n</div>\n<div class="lists-loading" v-else>加载中...</div>\n</div>\n<div class="lists-tip" :class="{ show: listShowing }">右键点击快速收藏可再次打开</div>\n<div class="tip" :class="{ show: tipShowing }">{{tipText}}</div>\n</span>\n`.trim();if(t.outerWatchlater){const t=await SpinQuery.select(".ops .watchlater");if(t!==null){t.insertAdjacentHTML("beforebegin",a)}else{s.insertAdjacentHTML("afterend",a)}}else{s.insertAdjacentHTML("afterend",a)}const o=dq(".ops .quick-favorite");if(!o){return}const l=new Vue({el:o,store:store,components:{VDropdown:()=>i.importAsync("v-dropdown.vue")},data:{aid:unsafeWindow.aid,favoriteTitle:"",isFavorite:false,tipText:"",tipShowing:false,tipHandle:0,lists:[],selectedFavorite:"",listShowing:false},async created(){this.syncFavoriteState()},watch:{selectedFavorite(i){if(this.lists.length===0){return}const e=this.lists;const s=e.find((t=>t.title===i));if(s){t.quickFavoriteID=s.id;this.syncFavoriteState()}else{console.error("list not found in selectedFavorite(value)")}},async listShowing(t){if(t){document.addEventListener("click",(t=>{const i=this.$el;const e=t.target;if(e!==i&&!i.contains(e)){this.listShowing=false}}));if(this.lists.length===0){try{const t=await Ajax.getJsonWithCredentials(`https://api.bilibili.com/medialist/gateway/base/created?pn=1&ps=100&up_mid=${getUID()}&is_space=0`);if(t.code!==0){throw new Error(`获取收藏夹列表失败: ${t.message}`)}this.lists=_.get(t,"data.list",[])}catch(t){logError(t)}}}}},methods:{async syncFavoriteState(){if(t.quickFavoriteID===0){return}try{const i=await Ajax.getJsonWithCredentials(`https://api.bilibili.com/x/v3/fav/folder/created/list-all?type=2&rid=${this.aid}&up_mid=${getUID()}`);if(i.code!==0){throw new Error(`获取收藏状态失败: ${i.message}`)}const e=_.get(i,"data.list",[]);const s=e.find((i=>i.id===t.quickFavoriteID));if(s===undefined){t.quickFavoriteID=0;return}this.isFavorite=Boolean(s.fav_state);this.selectedFavorite=this.favoriteTitle=s.title}catch(t){logError(t)}},showTip(t){this.tipText=t;this.tipShowing=true;if(this.tipHandle){clearTimeout(this.tipHandle)}this.tipHandle=setTimeout((()=>{this.tipShowing=false}),2e3)},async toggle(){if(t.quickFavoriteID===0){this.listShowing=true;return}const i={rid:this.aid,type:2,add_media_ids:"",del_media_ids:"",csrf:getCsrf()};i[this.isFavorite?"del_media_ids":"add_media_ids"]=t.quickFavoriteID.toString();try{await Ajax.postTextWithCredentials(`https://api.bilibili.com/x/v3/fav/resource/deal`,Object.entries(i).map((([t,i])=>`${t}=${i}`)).join("&"));this.isFavorite=!this.isFavorite;this.showTip(this.isFavorite?`已添加至收藏夹: ${this.favoriteTitle}`:`已移出收藏夹: ${this.favoriteTitle}`)}catch(t){Toast.error(`快速收藏失败: ${t.message}`,"快速收藏");console.error(t)}}}});Observer.videoChange((()=>{l.aid=unsafeWindow.aid;l.syncFavoriteState()}))})();return{unload:()=>{dqa(".ops .quick-favorite").forEach((t=>t.style.display="none"))},reload:()=>{dqa(".ops .quick-favorite").forEach((t=>t.style.display="inline-block"))}}})(); |