Bilibili-Evolved/min/custom-navbar-history-list.min.js
2021-10-26 13:22:15 +08:00

1 line
6.6 KiB
JavaScript

(()=>(t,e)=>{function i(t,e,i){if(e in t){Object.defineProperty(t,e,{value:i,enumerable:true,configurable:true,writable:true})}else{t[e]=i}return t}const{NavbarComponent:s}=e.import("custom-navbar-component");const n=()=>{const t=new Date;const e=Number(new Date(t.getFullYear(),t.getMonth(),t.getDate()));const i=24*36e5;const s=e-i;const n=e-7*i;return{now:t,today:e,oneDay:i,yesterday:s,lastWeek:n}};const r=t=>{if(t.length===0){return[]}if("timestamp"in t[0]){const{today:e,yesterday:i,lastWeek:s}=n();const r=_.groupBy(t,(t=>{if(t.timestamp>=e){return"今天"}if(t.timestamp>=i){return"昨天"}if(t.timestamp>=s){return"本周"}return"更早"}));return Object.entries(r).map((([t,e])=>({name:t,items:e})))}else{return[{name:"最近观看",items:t}]}};const a=t=>{const{yesterday:e,today:i}=n();const s=Number(t);if(s>=i){return`${t.getHours().toString().padStart(2,"0")}:${t.getMinutes().toString().padStart(2,"0")}`}if(s>=e){return`昨天 ${t.getHours().toString().padStart(2,"0")}:${t.getMinutes().toString().padStart(2,"0")}`}return`${(t.getMonth()+1).toString().padStart(2,"0")}-${t.getDate().toString().padStart(2,"0")} ${t.getHours().toString().padStart(2,"0")}:${t.getMinutes().toString().padStart(2,"0")}`};const o=[{name:"视频",type:"video",api:"https://api.bilibili.com/x/web-interface/history/cursor?type=archive&ps=30",moreLink:"https://www.bilibili.com/account/history",getItems:t=>{const e=t.data.list;const i=e.map((t=>{const e=t.view_at*1e3;const i=Boolean(t.uri);const s=t.progress>0?`t=${t.progress}`:"t=0";const n=t.progress===-1?1:t.progress/t.duration;const r={isBangumi:i,id:t.history.bvid,title:t.title,coverUrl:t.cover,upName:t.author_name||t.show_title,upID:t.author_mid||t.kid,href:i?t.uri+`?${s}`:`https://www.bilibili.com/video/${t.history.bvid}?p=${t.history.page}&${s}`,duration:t.duration,durationText:formatDuration(t.duration),progress:n,progressText:fixed(n*100,1)+"%",timestamp:e,time:new Date(e)};r.timeText=a(r.time);return r}));return i}},{name:"专栏",type:"article",api:"https://api.bilibili.com/x/web-interface/history/cursor?type=article&ps=30",moreLink:"",getItems:t=>{const e=t.data.list;const i=e.map((t=>{const e=t.view_at*1e3;const i=t.history.cid||t.kid;const s={id:i,title:t.title,coverUrl:t.covers[0],upName:t.author_name,upID:t.author_mid,href:`https://www.bilibili.com/read/cv${i}`,timestamp:e,time:new Date(e)};s.timeText=a(s.time);return s}));return i}},{name:"直播",type:"live",api:"https://api.live.bilibili.com/xlive/web-ucenter/v1/history/get_history_by_uid",moreLink:"https://link.bilibili.com/p/center/index#/user-center/view-history/live",getItems:t=>{const e=t.data.list;const i=e.map((t=>({id:t.roomid,href:`https://live.bilibili.com/${t.roomid}`,upID:t.uid,upName:t.uname,coverUrl:t.user_cover,title:t.title,liveStatus:t.live_status,liveStatusText:{0:"未开播",1:"直播中",2:"轮播中"}[t.live_status]})));return i}}];class l extends s{constructor(){super();i(this,"vm",void 0);this.boundingWidth=350;this.noPadding=true;this.href=`https://www.bilibili.com/account/history`;this.html=`历史`;this.active=document.URL.replace(/\?.*$/,"")===this.href;this.popupHtml=`\n<div class="history-list loading">\n<div class="loading-tip">\n 加载中...\n</div>\n<div class="content">\n<div class="header">\n<div class="tabs">\n<div class="tab" v-for="tab of tabs" :class="{active: selectedTab === tab}" @click="selectedTab = tab">\n<div class="tab-name">{{tab.name}}</div>\n</div>\n</div>\n<div class="search">\n<input type="text" placeholder="搜索" v-model="search">\n</div>\n<button class="more-info" :disabled="!selectedTab.moreLink || null" @click="viewMore()" title="查看更多">\n<i class="mdi mdi-dots-horizontal"></i>\n</button>\n</div>\n<transition-group name="history-content" tag="div" class="history-content">\n<div class="empty-tip" v-if="!timelineLoading && filteredTimeline.length === 0" key="empty-tip">\n 空空如也哦 = ̄ω ̄=\n</div>\n<div class="loading-tip" v-if="timelineLoading" key="loading-tip">\n 加载中...\n</div>\n<div class="time-group" v-for="t of filteredTimeline" :key="t.name">\n<div class="time-group-name">{{t.name}}</div>\n<transition-group name="time-group" tag="div" class="time-group-items">\n<div class="time-group-item" v-for="h of t.items" :key="h.id">\n<a class="cover-container" target="_blank" :href="h.href">\n<dpi-img class="cover" :src="h.coverUrl" :size="{width: 160, height: 110}" placeholder-image></dpi-img>\n<div v-if="h.progress" class="progress" :style="{width: h.progress * 100 + '%'}"></div>\n<div v-if="h.progressText" class="floating progress-number">{{h.progress >= 1 ? '已看完' : h.progressText}}</div>\n<div v-if="h.durationText" class="floating duration">{{h.durationText}}</div>\n</a>\n<a class="title" target="_blank" :href="h.href" :title="h.title">\n {{h.title || h.upName + '的直播间'}}\n</a>\n<a class="up" target="_blank" :href="h.isBangumi ? h.href : 'https://space.bilibili.com/' + h.upID" :title="h.upName">\n \x3c!--<icon type="extended" icon="up"></icon>--\x3e\n<div class="up-name">{{h.upName}}</div>\n</a>\n<div v-if="h.timeText" class="time" :title="h.time.toLocaleString()">\n {{h.timeText}}\n</div>\n<div v-if="h.liveStatus !== undefined" class="live-status" :class="{ live: h.liveStatus === 1 }">\n {{h.liveStatusText}}\n</div>\n</div>\n</transition-group>\n</div>\n</transition-group>\n</div>\n</div>\n`;this.initialPopup=()=>this.init();this.onPopup=()=>{var t;return(t=this.vm)===null||t===void 0?void 0:t.updateTimeline(false)}}get name(){return"historyList"}async init(){this.vm=new Vue({el:await SpinQuery.select(`.custom-navbar [data-name="${this.name}"] .history-list`),store:store,components:{DpiImg:()=>e.importAsync("dpi-img.vue"),Icon:()=>e.importAsync("icon.vue")},data:{tabs:o,selectedTab:o[0],items:[],timeline:[],timelineLoading:true,search:""},computed:{filteredTimeline(){if(!this.search){return this.timeline}const t=this.search.toLowerCase();return r(this.items.filter((e=>e.title.toLowerCase().includes(t)||e.upName.toLowerCase().includes(t))))}},methods:{async updateTimeline(t=true){try{if(t){this.timelineLoading=true;this.timeline=[]}const e=this.selectedTab;const i=await Ajax.getJsonWithCredentials(e.api);if(i.code!==0){throw new Error(`加载历史记录失败: ${i.message}`)}this.items=e.getItems(i);this.timeline=r(this.items)}catch(t){logError(t)}finally{this.timelineLoading=false}},viewMore(){const t=this.selectedTab;if(t.moreLink){open(t.moreLink,"_blank")}}},watch:{selectedTab(){this.updateTimeline()}},async created(){this.updateTimeline()},async mounted(){this.$el.classList.remove("loading")}})}}return{export:{HistoryList:l}}})();