Bilibili-Evolved/min/custom-navbar-history-list.min.js
2020-02-03 16:36:33 +08:00

1 line
5.1 KiB
JavaScript

(()=>{return(t,i)=>{const{NavbarComponent:e}=i.import("custom-navbar-component");const n=t=>{const i=new Date;const e=Number(new Date(i.getFullYear(),i.getMonth(),i.getDate()));const n=24*36e5;const s=e-n;const a=e-7*n;const r=_.groupBy(t,t=>{if(t.timestamp>=e){return"今天"}if(t.timestamp>=s){return"昨天"}if(t.timestamp>=a){return"本周"}return"更早"});return Object.entries(r).map(([t,i])=>{return{name:t,items:i}})};const s=t=>{return`${t.getHours().toString().padStart(2,"0")}:${t.getMinutes().toString().padStart(2,"0")}`};const a=[{name:"视频",type:"video",api:"https://api.bilibili.com/x/web-interface/history/cursor?type=archive&ps=30",moreLink:"https://www.bilibili.com/account/history",getTimeline:t=>{const i=t.data.list;const e=i.map(t=>{const i=t.view_at*1e3;const e=Boolean(t.uri);const n=t.progress>0?`t=${t.progress}`:"t=0";const a=t.progress===-1?1:t.progress/t.duration;const r={isBangumi:e,id:t.kid,title:t.title,coverUrl:t.cover,upName:t.author_name||t.show_title,upID:t.author_mid||t.kid,href:e?t.uri+`?${n}`:`https://www.bilibili.com/video/av${t.kid}?p=${t.history.page}&${n}`,duration:t.duration,durationText:formatDuration(t.duration),progress:a,progressText:fixed(a*100,1)+"%",timestamp:i,time:new Date(i)};r.timeText=s(r.time);return r});return n(e)}},{name:"专栏",type:"article",api:"https://api.bilibili.com/x/web-interface/history/cursor?type=article&ps=30",moreLink:"",getTimeline:t=>{const i=t.data.list;const e=i.map(t=>{const i=t.view_at*1e3;const e={id:t.kid,title:t.title,coverUrl:t.covers[0],upName:t.author_name,upID:t.author_mid,href:`https://www.bilibili.com/read/cv${t.kid}`,timestamp:i,time:new Date(i)};e.timeText=s(e.time);return e});return n(e)}},{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",getTimeline:t=>{const i=t.data.list;const e=i.map(t=>{return{id:t.roomid,href:`https://live.bilibili.com/${t.roomid}`,upID:t.uid,upName:t.uname,coverUrl:t.user_cover,title:t.title}});return[{name:"最近观看",items:e}]}}];class r extends e{constructor(){super();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<button class="more-info" :disabled="!selectedTab.moreLink || null" @click="viewMore()" title="查看更多">\n 查看更多\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 && timeline.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 timeline" :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">\n {{h.title}}\n</a>\n<a class="up" target="_blank" :href="h.isBangumi ? h.href : 'https://space.bilibili.com/' + h.upID">\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">\n {{h.timeText}}\n</div>\n</div>\n</transition-group>\n</div>\n</transition-group>\n</div>\n</div>\n`;this.initialPopup=(()=>this.init())}get name(){return"historyList"}async init(){new Vue({el:await SpinQuery.select(`.custom-navbar [data-name="${this.name}"] .history-list`),store:store,components:{DpiImg:()=>i.importAsync("dpi-img.vue"),Icon:()=>i.importAsync("icon.vue")},data:{tabs:a,selectedTab:a[0],timeline:[],timelineLoading:true},methods:{async updateTimeline(){try{this.timelineLoading=true;this.timeline=[];const t=this.selectedTab;const i=await Ajax.getJsonWithCredentials(t.api);if(i.code!==0){throw new Error(`加载历史记录失败: ${i.message}`)}this.timeline=t.getTimeline(i)}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:r}}}})();