Bilibili-Evolved/min/quick-favorite.min.js
2021-10-26 13:22:15 +08:00

1 line
3.9 KiB
JavaScript

(()=>(i,t)=>{(async()=>{if(!document.URL.match(/^https:\/\/www\.bilibili\.com\/(video|medialist)\//)||!getUID()){return}const{playerReady:e,aidReady:s}=await t.importAsync("player-ready");await e();await s();const a=dq(".video-toolbar .ops .collect");if(!a){return}t.applyStyle("quickFavoriteStyle");const o=`\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(i.outerWatchlater&&!document.URL.includes("medialist")){const i=await SpinQuery.select(".ops .watchlater");if(i!==null){i.insertAdjacentHTML("beforebegin",o)}else{a.insertAdjacentHTML("afterend",o)}}else{a.insertAdjacentHTML("afterend",o)}const l=dq(".ops .quick-favorite");if(!l){return}const n=new Vue({el:l,store:store,components:{VDropdown:()=>t.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(t){if(this.lists.length===0){return}const e=this.lists;const s=e.find((i=>i.title===t));if(s){i.quickFavoriteID=s.id;this.syncFavoriteState()}else{console.error("list not found in selectedFavorite(value)")}},async listShowing(i){if(i){document.addEventListener("click",(i=>{const t=this.$el;const e=i.target;if(e!==t&&!t.contains(e)){this.listShowing=false}}));if(this.lists.length===0){try{const i=await Ajax.getJsonWithCredentials(`https://api.bilibili.com/medialist/gateway/base/created?pn=1&ps=100&up_mid=${getUID()}&is_space=0`);if(i.code!==0){throw new Error(`获取收藏夹列表失败: ${i.message}`)}this.lists=_.get(i,"data.list",[])}catch(i){logError(i)}}}}},methods:{async syncFavoriteState(){if(i.quickFavoriteID===0){return}try{const t=await Ajax.getJsonWithCredentials(`https://api.bilibili.com/x/v3/fav/folder/created/list-all?type=2&rid=${this.aid}&up_mid=${getUID()}`);if(t.code!==0){throw new Error(`获取收藏状态失败: ${t.message}`)}const e=_.get(t,"data.list",[]);const s=e.find((t=>t.id===i.quickFavoriteID));if(s===undefined){i.quickFavoriteID=0;return}this.isFavorite=Boolean(s.fav_state);this.selectedFavorite=this.favoriteTitle=s.title}catch(i){logError(i)}},showTip(i){this.tipText=i;this.tipShowing=true;if(this.tipHandle){clearTimeout(this.tipHandle)}this.tipHandle=setTimeout((()=>{this.tipShowing=false}),2e3)},async toggle(){if(i.quickFavoriteID===0){this.listShowing=true;return}const t={rid:this.aid,type:2,add_media_ids:"",del_media_ids:"",csrf:getCsrf()};t[this.isFavorite?"del_media_ids":"add_media_ids"]=i.quickFavoriteID.toString();try{await Ajax.postTextWithCredentials(`https://api.bilibili.com/x/v3/fav/resource/deal`,Object.entries(t).map((([i,t])=>`${i}=${t}`)).join("&"));this.isFavorite=!this.isFavorite;this.showTip(this.isFavorite?`已添加至收藏夹: ${this.favoriteTitle}`:`已移出收藏夹: ${this.favoriteTitle}`)}catch(i){Toast.error(`快速收藏失败: ${i.message}`,"快速收藏");console.error(i)}}}});Observer.videoChange((()=>{n.aid=unsafeWindow.aid;n.syncFavoriteState()}))})();return{unload:()=>{dqa(".ops .quick-favorite").forEach((i=>i.style.display="none"))},reload:()=>{dqa(".ops .quick-favorite").forEach((i=>i.style.display="inline-block"))}}})();