diff --git a/min/custom-navbar-activities.min.js b/min/custom-navbar-activities.min.js index 3ced774e2..d92fdc85c 100644 --- a/min/custom-navbar-activities.min.js +++ b/min/custom-navbar-activities.min.js @@ -1 +1 @@ -(()=>(t,i)=>{const{NavbarComponent:e}=i.import("custom-navbar-component");let a=async()=>{};let n=async()=>{};let s;const c=({dataObject:t,apiUrl:e,name:n,handleJson:s,nextPage:c,template:r})=>{const d={template:r,components:{"dpi-img":()=>i.importAsync("dpi-img.vue")},methods:{handleJson:s,async fetchData(t=false){try{const t=await Ajax.getJsonWithCredentials(e);if(t.code!==0){throw new Error(t.message)}await this.handleJson(t)}catch(i){if(t===true){return}logError(`加载${n}动态失败, error = ${i}`)}finally{this.loading=false}}},data(){return Object.assign({loading:true,hasMoreContent:true,scrollObserver:null},t)},async mounted(){a=async()=>await this.fetchData(true);await this.fetchData();if(this.$refs.trigger&&typeof this.nextPage==="function"){console.log("infinite scroll");const t=this.$refs.trigger;const i=new IntersectionObserver((async t=>{console.log(t);if(t.some((t=>t.intersectionRatio>0))){const t=await this.nextPage();if(!t){console.log("disconnect");i.disconnect();this.hasMoreContent=false}}}));this.scrollObserver=i;i.observe(t)}},beforeDestroy(){a=async()=>{};if(this.scrollObserver){console.log("destroy");this.scrollObserver.disconnect();this.scrollObserver=null}}};if(c){d.methods.nextPage=c}return d};class r extends e{constructor(){super();this.boundingWidth=380;this.noPadding=true;this.href=t.oldTweets?"https://www.bilibili.com/account/dynamic":"https://t.bilibili.com/";this.html="动态";this.popupHtml=`\n
\n\n
\n\n\n\n \x3c!-- 查看更多 --\x3e\n
\n
\n`;this.active=document.URL.replace(/\?.*$/,"")===this.href;this.initialPopup=()=>{this.init()};this.onPopup=()=>{this.setNotifyCount(0)};this.getNotifyCount();setInterval((async()=>{if(!navigator.onLine){return}await this.getNotifyCount();await n();await a()}),r.updateInterval)}static get updateInterval(){return 5*60*1e3}static getLatestID(){return document.cookie.replace(new RegExp(`(?:(?:^|.*;\\s*)bp_t_offset_${getUID()}\\s*\\=\\s*([^;]*).*$)|^.*$`),"$1")}static setLatestID(t){if(t===null||t===undefined){return}const i=r.getLatestID();if(r.compareID(t,i)<0){return}document.cookie=`bp_t_offset_${getUID()}=${t};path=/;domain=.bilibili.com;max-age=${60*60*24*30}`}static compareID(t,i){if(t===i){return 0}if(t.length>i.length){return 1}if(i.length>t.length){return-1}return t>i===true?1:-1}static isNewID(t){return r.compareID(t,s)>0}static updateLatestID(t){const[i]=[...t.map((t=>t.id))].sort(r.compareID).reverse();r.setLatestID(i)}async getNotifyCount(){const t=`https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/dynamic_num?rsp_type=1&uid=${getUID()}&update_num_dy_id=${r.getLatestID()}&type_list=8,64,512`;const i=await Ajax.getJsonWithCredentials(t);if(i.code!==0){return}this.setNotifyCount(i.data.update_num)}async init(){Vue.component("activity-loading",{template:`\n
\n加载中...\n
`,props:["loading"]});Vue.component("activity-empty",{template:`\n
空空如也哦 = ̄ω ̄=
`});new Vue({el:await SpinQuery.select(".activity-popup"),data:{tabs:[{name:"视频",component:"video-activity",moreUrl:"https://t.bilibili.com/?tab=8",get notifyApi(){return`https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/dynamic_num?rsp_type=1&uid=${getUID()}&update_num_dy_id=${r.getLatestID()}&type_list=8`},notifyCount:null},{name:"番剧",component:"bangumi-activity",moreUrl:"https://t.bilibili.com/?tab=512,4097,4098,4099,4100,4101",get notifyApi(){return`https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/dynamic_num?rsp_type=1&uid=${getUID()}&update_num_dy_id=${r.getLatestID()}&type_list=512`},notifyCount:null},{name:"专栏",component:"column-activity",moreUrl:"https://t.bilibili.com/?tab=64",get notifyApi(){return`https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/dynamic_num?rsp_type=1&uid=${getUID()}&update_num_dy_id=${r.getLatestID()}&type_list=64`},notifyCount:null},{name:"直播",component:"live-activity",moreUrl:"https://link.bilibili.com/p/center/index#/user-center/follow/1",notifyCount:null}],selectedTab:"视频"},components:{"activity-tabs":{props:["items","tab"],template:`\n\n`,methods:{changeTab(t){if(this.tab===t.name){window.open(t.moreUrl,"_blank")}this.$emit("update:tab",t.name)}}},"video-activity":Object.assign(c({dataObject:{leftCards:[],rightCards:[]},apiUrl:`https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/dynamic_new?uid=${getUID()}&type_list=8`,name:"视频",template:`\n
\n\n\n
\n\n
\n
\n\n
\n
加载中...
\n
\n`,async handleJson(t){const i=Number(new Date);const e=i-1e3*3600*24;const a=t=>{const e=new Date(t);const a=[e.getHours(),e.getMinutes(),e.getSeconds()].map((t=>t.toString().padStart(2,"0"))).join(":");let n;if(new Date(i).getFullYear()!==e.getFullYear()){n=[e.getFullYear(),e.getMonth()+1,e.getDate()]}else{n=[e.getMonth()+1,e.getDate()]}return`${n.map((t=>t.toString().padStart(2,"0"))).join("-")} ${a}`};const n=t=>{if(et.toString().padStart(2,"0"))).join("-")}`};const s=_.get(t,"data.cards",[]).map((t=>{const i=JSON.parse(t.card);return{coverUrl:i.pic,title:i.title,timeNumber:i.duration,time:formatDuration(i.duration),description:i.desc,aid:i.aid,bvid:t.desc.bvid,videoUrl:`https://www.bilibili.com/${t.desc.bvid}`,faceUrl:t.desc.user_profile.info.face,upName:t.desc.user_profile.info.uname,upUrl:`https://space.bilibili.com/${t.desc.user_profile.info.uid}`,id:t.desc.dynamic_id_str,pubTime:a(i.pubdate*1e3),pubTimeText:n(i.pubdate*1e3),watchlater:true,get new(){return r.isNewID(this.id)}}}));const c=_.uniqBy(s.concat(this.leftCards,this.rightCards),(t=>t.aid)).sort(((t,i)=>i.id>t.id?1:-1));if(c.length===0){this.hasMoreContent=false}this.leftCards=c.filter(((t,i)=>i%2===0));this.rightCards=c.filter(((t,i)=>i%2===1));r.updateLatestID(c)},async nextPage(){const t=[...this.leftCards,...this.rightCards].sort(((t,i)=>i.id>t.id?1:-1));if(t.length===0){return false}let i=t.pop().id;const e=`https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/dynamic_history?uid=${getUID()}&offset_dynamic_id=${i}&type=8`;const a=await Ajax.getJsonWithCredentials(e);console.log("lastCardID",i,a);if(a.code!==0){return false}await this.handleJson(a);return Boolean(_.get(a,"data.has_more",true))}}),{components:{"video-card":{props:["card","watchlaterInit"],store:store,data(){return{}},computed:{...Vuex.mapState(["watchlaterList"]),watchlater(){if(this.watchlaterInit!==null){return this.watchlaterList.includes(this.card.aid)}else{return null}}},components:{"dpi-img":()=>i.importAsync("dpi-img.vue")},methods:{...Vuex.mapActions(["toggleWatchlater"])},async mounted(){},template:`\n\n
\n\n
{{card.time}}
\n
{{card.pubTimeText}}
\n
{{card.pubTime}}
\n
{{watchlater ? '已添加' : '稍后再看'}}
\n
\n

{{card.title}}

\n
\n\n{{card.upName}}\n\n\n`}}}),"bangumi-activity":c({dataObject:{cards:[]},apiUrl:`https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/dynamic_new?uid=${getUID()}&type_list=512`,name:"番剧",template:`\n
\n\n\n\n\n

{{card.epTitle}}

\n
\n\n
{{card.title}}
\n
\n
\n
加载中...
\n
\n`,handleJson:async function(t){const i=_.get(t,"data.cards",[]).map((t=>{const i=JSON.parse(t.card);return{title:i.apiSeasonInfo.title,coverUrl:i.apiSeasonInfo.cover,epCoverUrl:i.cover,epTitle:i.new_desc,url:i.url,id:t.desc.dynamic_id_str,get new(){return r.isNewID(this.id)}}}));this.cards=_.uniqBy(i.concat(this.cards),(t=>t.id)).sort(((t,i)=>i.id>t.id?1:-1));if(i.length===0){this.hasMoreContent=false}r.updateLatestID(i)},async nextPage(){const t=[...this.cards];if(t.length===0){return false}let i=t.pop().id;const e=`https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/dynamic_history?uid=${getUID()}&offset_dynamic_id=${i}&type=512`;const a=await Ajax.getJsonWithCredentials(e);console.log("lastCardID",i,a);if(a.code!==0){return false}await this.handleJson(a);return Boolean(_.get(a,"data.has_more",true))}}),"column-activity":c({dataObject:{cards:[]},apiUrl:`https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/dynamic_new?uid=${getUID()}&type_list=64`,name:"专栏",template:`\n
\n\n\n\n\n

{{card.title}}

\n
{{card.description}}
\n\n
加载中...
\n
\n`,handleJson:async function(t){const i=_.get(t,"data.cards",[]).map((t=>{const i=JSON.parse(t.card);return{covers:i.image_urls,originalCovers:i.origin_image_urls,upName:i.author.name,faceUrl:i.author.face,upUrl:`https://space.bilibili.com/${i.author.mid}`,title:i.title,description:i.summary,url:`https://www.bilibili.com/read/cv${i.id}`,id:t.desc.dynamic_id_str,get new(){return r.isNewID(this.id)}}}));this.cards=_.uniqBy(i.concat(this.cards),(t=>t.id)).sort(((t,i)=>i.id>t.id?1:-1));if(i.length===0){this.hasMoreContent=false}r.updateLatestID(this.cards)},async nextPage(){const t=[...this.cards];if(t.length===0){return false}let i=t.pop().id;const e=`https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/dynamic_history?uid=${getUID()}&offset_dynamic_id=${i}&type=64`;const a=await Ajax.getJsonWithCredentials(e);console.log("lastCardID",i,a);if(a.code!==0){return false}await this.handleJson(a);return Boolean(_.get(a,"data.has_more",true))}}),"live-activity":c({dataObject:{cards:[]},apiUrl:`https://api.live.bilibili.com/relation/v1/feed/feed_list?page=1&pagesize=24`,name:"直播",template:`\n
\n\n\n\n\n

{{card.title}}

\n
{{card.name}}
\n
\n
\n`,handleJson:async function(t){const i=t=>({faceUrl:t.face,title:t.title,name:t.uname,id:t.roomid,url:t.link});this.cards=_.get(t,"data.list",[]).map(i);const e=await Ajax.getPages({api:t=>Ajax.getJsonWithCredentials(`https://api.live.bilibili.com/relation/v1/feed/feed_list?page=${t}&pagesize=24`),getList:t=>_.get(t,"data.list",[]),getTotal:t=>_.get(t,"data.results",0)});this.cards=e.map(i)}})},computed:{content(){return this.tabs.find((t=>t.name===this.selectedTab)).component},viewMoreUrl(){return this.tabs.find((t=>t.name===this.selectedTab)).moreUrl}},mounted(){n=async()=>{for(const t of this.tabs){if(t.notifyApi){const i=await Ajax.getJsonWithCredentials(t.notifyApi);if(i.code!==0||!i.data.update_num||this.selectedTab===t.name){continue}t.notifyCount=i.data.update_num}}};n()},destroyed(){n=async()=>{}},watch:{selectedTab(t){this.tabs.find((i=>i.name===t)).notifyCount=null}}})}get name(){return"activities"}}s=r.getLatestID();return{export:{Activities:r}}})(); \ No newline at end of file +(()=>(t,i)=>{const{NavbarComponent:e}=i.import("custom-navbar-component");let a=async()=>{};let n=async()=>{};let s;const c=({dataObject:t,apiUrl:e,name:n,handleJson:s,nextPage:c,template:r})=>{const d={template:r,components:{"dpi-img":()=>i.importAsync("dpi-img.vue")},methods:{handleJson:s,async fetchData(t=false){try{const t=await Ajax.getJsonWithCredentials(e);if(t.code!==0){throw new Error(t.message)}await this.handleJson(t)}catch(i){if(t===true){return}logError(`加载${n}动态失败, error = ${i}`)}finally{this.loading=false}}},data(){return Object.assign({loading:true,hasMoreContent:true,scrollObserver:null},t)},async mounted(){a=async()=>await this.fetchData(true);await this.fetchData();if(this.$refs.trigger&&typeof this.nextPage==="function"){console.log("infinite scroll");const t=this.$refs.trigger;const i=new IntersectionObserver((async t=>{console.log(t);if(t.some((t=>t.intersectionRatio>0))){const t=await this.nextPage();if(!t){console.log("disconnect");i.disconnect();this.hasMoreContent=false}}}));this.scrollObserver=i;i.observe(t)}},beforeDestroy(){a=async()=>{};if(this.scrollObserver){console.log("destroy");this.scrollObserver.disconnect();this.scrollObserver=null}}};if(c){d.methods.nextPage=c}return d};class r extends e{constructor(){super();this.boundingWidth=380;this.noPadding=true;this.href=t.oldTweets?"https://www.bilibili.com/account/dynamic":"https://t.bilibili.com/";this.html="动态";this.popupHtml=`\n
\n\n
\n\n\n\n \x3c!-- 查看更多 --\x3e\n
\n
\n`;this.active=document.URL.replace(/\?.*$/,"")===this.href;this.initialPopup=()=>{this.init()};this.onPopup=()=>{this.setNotifyCount(0)};this.getNotifyCount();setInterval((async()=>{if(!navigator.onLine){return}await this.getNotifyCount();await n();await a()}),r.updateInterval)}static get updateInterval(){return 5*60*1e3}static getLatestID(){return document.cookie.replace(new RegExp(`(?:(?:^|.*;\\s*)bp_t_offset_${getUID()}\\s*\\=\\s*([^;]*).*$)|^.*$`),"$1")}static setLatestID(t){if(t===null||t===undefined){return}const i=r.getLatestID();if(r.compareID(t,i)<0){return}document.cookie=`bp_t_offset_${getUID()}=${t};path=/;domain=.bilibili.com;max-age=${60*60*24*30}`}static compareID(t,i){if(t===i){return 0}if(t.length>i.length){return 1}if(i.length>t.length){return-1}return t>i===true?1:-1}static isNewID(t){return r.compareID(t,s)>0}static updateLatestID(t){const[i]=[...t.map((t=>t.id))].sort(r.compareID).reverse();r.setLatestID(i)}async getNotifyCount(){const t=`https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/dynamic_num?rsp_type=1&uid=${getUID()}&update_num_dy_id=${r.getLatestID()}&type_list=8,64,512`;const i=await Ajax.getJsonWithCredentials(t);if(i.code!==0){return}this.setNotifyCount(i.data.update_num)}async init(){const{isVideoCardBlocked:e,isCardBlocked:a}=await i.importAsync("feeds-apis");Vue.component("activity-loading",{template:`\n
\n加载中...\n
`,props:["loading"]});Vue.component("activity-empty",{template:`\n
空空如也哦 = ̄ω ̄=
`});new Vue({el:await SpinQuery.select(".activity-popup"),data:{tabs:[{name:"视频",component:"video-activity",moreUrl:"https://t.bilibili.com/?tab=8",get notifyApi(){return`https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/dynamic_num?rsp_type=1&uid=${getUID()}&update_num_dy_id=${r.getLatestID()}&type_list=8`},notifyCount:null},{name:"番剧",component:"bangumi-activity",moreUrl:"https://t.bilibili.com/?tab=512,4097,4098,4099,4100,4101",get notifyApi(){return`https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/dynamic_num?rsp_type=1&uid=${getUID()}&update_num_dy_id=${r.getLatestID()}&type_list=512`},notifyCount:null},{name:"专栏",component:"column-activity",moreUrl:"https://t.bilibili.com/?tab=64",get notifyApi(){return`https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/dynamic_num?rsp_type=1&uid=${getUID()}&update_num_dy_id=${r.getLatestID()}&type_list=64`},notifyCount:null},{name:"直播",component:"live-activity",moreUrl:"https://link.bilibili.com/p/center/index#/user-center/follow/1",notifyCount:null}],selectedTab:"视频"},components:{"activity-tabs":{props:["items","tab"],template:`\n\n`,methods:{changeTab(t){if(this.tab===t.name){window.open(t.moreUrl,"_blank")}this.$emit("update:tab",t.name)}}},"video-activity":Object.assign(c({dataObject:{leftCards:[],rightCards:[]},apiUrl:`https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/dynamic_new?uid=${getUID()}&type_list=8`,name:"视频",template:`\n
\n\n\n
\n\n
\n
\n\n
\n
加载中...
\n
\n`,async handleJson(t){const i=Number(new Date);const a=i-1e3*3600*24;const n=t=>{const e=new Date(t);const a=[e.getHours(),e.getMinutes(),e.getSeconds()].map((t=>t.toString().padStart(2,"0"))).join(":");let n;if(new Date(i).getFullYear()!==e.getFullYear()){n=[e.getFullYear(),e.getMonth()+1,e.getDate()]}else{n=[e.getMonth()+1,e.getDate()]}return`${n.map((t=>t.toString().padStart(2,"0"))).join("-")} ${a}`};const s=t=>{if(at.toString().padStart(2,"0"))).join("-")}`};const c=_.get(t,"data.cards",[]).map((t=>{const i=JSON.parse(t.card);return{coverUrl:i.pic,title:i.title,timeNumber:i.duration,time:formatDuration(i.duration),description:i.desc,aid:i.aid,bvid:t.desc.bvid,videoUrl:`https://www.bilibili.com/${t.desc.bvid}`,faceUrl:t.desc.user_profile.info.face,upName:t.desc.user_profile.info.uname,upUrl:`https://space.bilibili.com/${t.desc.user_profile.info.uid}`,id:t.desc.dynamic_id_str,pubTime:n(i.pubdate*1e3),pubTimeText:s(i.pubdate*1e3),watchlater:true,get new(){return r.isNewID(this.id)}}}));const d=_.uniqBy(c.concat(this.leftCards,this.rightCards),(t=>t.aid)).sort(((t,i)=>i.id>t.id?1:-1)).filter((t=>!e(t)));if(d.length===0){this.hasMoreContent=false}this.leftCards=d.filter(((t,i)=>i%2===0));this.rightCards=d.filter(((t,i)=>i%2===1));r.updateLatestID(d)},async nextPage(){const t=[...this.leftCards,...this.rightCards].sort(((t,i)=>i.id>t.id?1:-1));if(t.length===0){return false}let i=t.pop().id;const e=`https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/dynamic_history?uid=${getUID()}&offset_dynamic_id=${i}&type=8`;const a=await Ajax.getJsonWithCredentials(e);console.log("lastCardID",i,a);if(a.code!==0){return false}await this.handleJson(a);return Boolean(_.get(a,"data.has_more",true))}}),{components:{"video-card":{props:["card","watchlaterInit"],store:store,data(){return{}},computed:{...Vuex.mapState(["watchlaterList"]),watchlater(){if(this.watchlaterInit!==null){return this.watchlaterList.includes(this.card.aid)}else{return null}}},components:{"dpi-img":()=>i.importAsync("dpi-img.vue")},methods:{...Vuex.mapActions(["toggleWatchlater"])},async mounted(){},template:`\n\n
\n\n
{{card.time}}
\n
{{card.pubTimeText}}
\n
{{card.pubTime}}
\n
{{watchlater ? '已添加' : '稍后再看'}}
\n
\n

{{card.title}}

\n
\n\n{{card.upName}}\n\n\n`}}}),"bangumi-activity":c({dataObject:{cards:[]},apiUrl:`https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/dynamic_new?uid=${getUID()}&type_list=512`,name:"番剧",template:`\n\n`,handleJson:async function(t){const i=_.get(t,"data.cards",[]).map((t=>{const i=JSON.parse(t.card);return{title:i.apiSeasonInfo.title,coverUrl:i.apiSeasonInfo.cover,epCoverUrl:i.cover,epTitle:i.new_desc,url:i.url,id:t.desc.dynamic_id_str,get new(){return r.isNewID(this.id)}}}));this.cards=_.uniqBy(i.concat(this.cards),(t=>t.id)).sort(((t,i)=>i.id>t.id?1:-1)).filter((t=>!a({text:t.epTitle,username:t.title})));if(i.length===0){this.hasMoreContent=false}r.updateLatestID(i)},async nextPage(){const t=[...this.cards];if(t.length===0){return false}let i=t.pop().id;const e=`https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/dynamic_history?uid=${getUID()}&offset_dynamic_id=${i}&type=512`;const a=await Ajax.getJsonWithCredentials(e);console.log("lastCardID",i,a);if(a.code!==0){return false}await this.handleJson(a);return Boolean(_.get(a,"data.has_more",true))}}),"column-activity":c({dataObject:{cards:[]},apiUrl:`https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/dynamic_new?uid=${getUID()}&type_list=64`,name:"专栏",template:`\n
\n\n\n\n\n

{{card.title}}

\n
{{card.description}}
\n\n
加载中...
\n
\n`,handleJson:async function(t){const i=_.get(t,"data.cards",[]).map((t=>{const i=JSON.parse(t.card);return{covers:i.image_urls,originalCovers:i.origin_image_urls,upName:i.author.name,faceUrl:i.author.face,upUrl:`https://space.bilibili.com/${i.author.mid}`,title:i.title,description:i.summary,url:`https://www.bilibili.com/read/cv${i.id}`,id:t.desc.dynamic_id_str,get new(){return r.isNewID(this.id)}}}));this.cards=_.uniqBy(i.concat(this.cards),(t=>t.id)).sort(((t,i)=>i.id>t.id?1:-1)).filter((t=>!e(t)));if(i.length===0){this.hasMoreContent=false}r.updateLatestID(this.cards)},async nextPage(){const t=[...this.cards];if(t.length===0){return false}let i=t.pop().id;const e=`https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/dynamic_history?uid=${getUID()}&offset_dynamic_id=${i}&type=64`;const a=await Ajax.getJsonWithCredentials(e);console.log("lastCardID",i,a);if(a.code!==0){return false}await this.handleJson(a);return Boolean(_.get(a,"data.has_more",true))}}),"live-activity":c({dataObject:{cards:[]},apiUrl:`https://api.live.bilibili.com/relation/v1/feed/feed_list?page=1&pagesize=24`,name:"直播",template:`\n\n`,handleJson:async function(t){const i=t=>({faceUrl:t.face,title:t.title,name:t.uname,id:t.roomid,url:t.link});this.cards=_.get(t,"data.list",[]).map(i);const e=await Ajax.getPages({api:t=>Ajax.getJsonWithCredentials(`https://api.live.bilibili.com/relation/v1/feed/feed_list?page=${t}&pagesize=24`),getList:t=>_.get(t,"data.list",[]),getTotal:t=>_.get(t,"data.results",0)});this.cards=e.map(i)}})},computed:{content(){return this.tabs.find((t=>t.name===this.selectedTab)).component},viewMoreUrl(){return this.tabs.find((t=>t.name===this.selectedTab)).moreUrl}},mounted(){n=async()=>{for(const t of this.tabs){if(t.notifyApi){const i=await Ajax.getJsonWithCredentials(t.notifyApi);if(i.code!==0||!i.data.update_num||this.selectedTab===t.name){continue}t.notifyCount=i.data.update_num}}};n()},destroyed(){n=async()=>{}},watch:{selectedTab(t){this.tabs.find((i=>i.name===t)).notifyCount=null}}})}get name(){return"activities"}}s=r.getLatestID();return{export:{Activities:r}}})(); \ No newline at end of file diff --git a/min/feeds-apis.min.js b/min/feeds-apis.min.js index 8f605c664..484ba4741 100644 --- a/min/feeds-apis.min.js +++ b/min/feeds-apis.min.js @@ -1 +1 @@ -(()=>(e,t)=>{function i(e,t,i){if(t in e){Object.defineProperty(e,t,{value:i,enumerable:true,configurable:true,writable:true})}else{e[t]=i}return e}const n={repost:{id:1,name:"转发"},textWithImages:{id:2,name:"图文"},text:{id:4,name:"文字"},video:{id:8,name:"视频"},miniVideo:{id:16,name:"小视频"},column:{id:64,name:"专栏"},audio:{id:256,name:"音频"},bangumi:{id:512,name:"番剧"},share:{id:2048,name:"分享"},manga:{id:2049,name:"漫画"},film:{id:4098,name:"电影"},tv:{id:4099,name:"TV剧"},chinese:{id:4100,name:"国创"},documentary:{id:4101,name:"纪录片"},mediaList:{id:4300,name:"收藏夹"},liveRecord:{id:2047,name:"开播记录"}};const r=e=>{if(e.querySelector(".repost")){return n.repost}if(e.querySelector(".imagesbox")){return n.textWithImages}if(e.querySelector(".video-container")){return n.video}if(e.querySelector(".bangumi-container")){return n.bangumi}if(e.querySelector(".article-container")){return n.column}if(e.querySelector(".music-container")){return n.audio}if(e.querySelector(".h5share-container")){return n.share}if(e.querySelector(".vc-ctnr")){return n.miniVideo}if(e.querySelector(".live-container")){return n.liveRecord}return n.text};const a=["//t.bilibili.com","//space.bilibili.com","//live.bilibili.com"];const s=[];class o extends EventTarget{constructor(...e){super(...e);i(this,"watching",false);i(this,"cards",[])}addEventListener(e,t,i){super.addEventListener(e,t,i)}removeEventListener(e,t,i){super.removeEventListener(e,t,i)}async addCard(e){if(e instanceof HTMLElement&&e.classList.contains("card")){if(e.querySelector(".skeleton")!==null){const t=Observer.childList(e,(()=>{if(e.querySelector(".skeleton")===null){t.stop();this.addCard(e)}}))}else{if(e.parentNode===null){return}const t=await this.parseCard(e);if(!t.presented){return}if(this.cards.find((e=>e.id===t.id))){return}this.cards.push(t);this.cards.sort(((e,t)=>{if(e.id===t.id){return 0}return e.id>t.id?-1:1}));const i=new CustomEvent("addCard",{detail:t});this.dispatchEvent(i);s.forEach((e=>e.added(t)))}}}async removeCard(e){if(e instanceof HTMLElement&&e.classList.contains("card")){const t=e.getAttribute("data-did");const i=this.cards.findIndex((e=>e.id===t));if(i===-1){return}const n=this.cards[i];this.cards.splice(i,1);const r=new CustomEvent("removeCard",{detail:n});this.dispatchEvent(r);s.forEach((e=>e.removed(n)))}}async parseCard(e){const t=async t=>{const i=await SpinQuery.condition((()=>e.querySelector(t)),(t=>t!==null||e.parentNode===null));if(e.parentNode===null){return""}if(i===null){console.warn(e,t,e.parentNode);return""}const n=i.innerText.trim();return n};const i=async t=>{if(t===n.bangumi){return""}const i=await SpinQuery.condition((()=>e),(t=>Boolean(t.__vue__||!e.parentNode)));if(e.parentNode===null){return""}if(i===null){console.warn(i);return""}if(t===n.repost){const e=JSON.parse(i.__vue__.card.origin);const t=i.__vue__.originCardData.pureText;const n=_.get(e,"item.description","");const r=e.title;const a=i.__vue__.card.item.content;return[a,t,n,r].filter((e=>Boolean(e))).join("\n")}const r=i.__vue__.originCardData.pureText;const a=i.__vue__.originCardData.title;return[r,a].filter((e=>Boolean(e))).join("\n")};const a=async e=>{const i=parseInt(await t(e));if(isNaN(i)){return 0}return i};const s={id:e.getAttribute("data-did"),username:await t(".main-content .user-name"),text:"",reposts:await a(".button-bar .single-button:nth-child(1) .text-offset"),comments:await a(".button-bar .single-button:nth-child(2) .text-offset"),likes:await a(".button-bar .single-button:nth-child(3) .text-offset"),element:e,type:r(e),presented:true,async getText(){const e=await i(this.type);this.text=e;return e}};await s.getText();s.presented=e.parentNode!==null;e.setAttribute("data-type",s.type.id.toString());if(s.type===n.repost){const t=s.username;const i=_.get(s,"element.__vue__.card.origin_user.info.uname","");if(t===i){e.setAttribute("data-self-repost","true")}}return s}async startWatching(){const e=e=>{const t=[...e.querySelectorAll(".card[data-did]")];t.forEach((e=>this.addCard(e)));console.log(t);return Observer.childList(e,(e=>{e.forEach((e=>{e.addedNodes.forEach((e=>this.addCard(e)));e.removedNodes.forEach((e=>this.removeCard(e)))}))}))};if(this.watching){return true}this.watching=true;if(document.URL.includes("//space.bilibili.com")){console.log("space watch");const t=await SpinQuery.select(".s-space");if(!t){return false}let i=null;Observer.childList(t,(async()=>{if(dq("#page-dynamic")){const t=await SpinQuery.select(".feed-card .content");console.log("enter feeds tab");if(i){i.stop()}i=e(t)}else{console.log("leave feeds tab");if(i){i.stop();i=null}await Promise.all(this.cards.map((e=>e.element)).map((e=>this.removeCard(e))))}}));this.watching=true;return true}if(document.URL.includes("//live.bilibili.com")){console.log("live watch");const t=await SpinQuery.select(".room-feed");if(!t){return false}let i=null;Observer.childList(t,(async()=>{if(dq(".room-feed-content")){const t=await SpinQuery.select(".room-feed-content .content");console.log("enter feeds tab");if(i){i.stop()}i=e(t)}else{console.log("leave feeds tab");if(i){i.stop();i=null}await Promise.all(this.cards.map((e=>e.element)).map((e=>this.removeCard(e))))}}));return true}if(document.URL.startsWith("https://t.bilibili.com/topic")){console.log("topic watch");const t=await SpinQuery.select(".page-container");if(!t){return false}let i=null;Observer.childList(t,(async()=>{if(dq(".page-container .feed")){const t=await SpinQuery.select(".feed .feed-topic");console.log("enter feeds tab");if(i){i.stop()}i=e(t)}else{console.log("leave feeds tab");if(i){i.stop();i=null}await Promise.all(this.cards.map((e=>e.element)).map((e=>this.removeCard(e))))}}));return true}const t=await SpinQuery.select(".feed-card .content, .detail-content .detail-card");if(!t){return false}e(t);return true}}const c=new o;const d=async(e="video")=>{if(!getUID()){return[]}const t=await Ajax.getJsonWithCredentials(`https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/dynamic_new?uid=${getUID()}&type_list=${e==="video"?8:512}`);if(t.code!==0){throw new Error(t.message)}if(e==="video"){return _.uniqBy(t.data.cards.map((e=>{const t=JSON.parse(e.card);const i=_.get(e,"display.topic_info.topic_details",[]).map((e=>({id:e.topic_id,name:e.topic_name})));return{id:e.desc.dynamic_id_str,aid:t.aid,bvid:e.desc.bvid||t.bvid,title:t.title,upID:e.desc.user_profile.info.uid,upName:e.desc.user_profile.info.uname,upFaceUrl:e.desc.user_profile.info.face,coverUrl:t.pic,description:t.desc,timestamp:e.timestamp,time:new Date(e.timestamp*1e3),topics:i,dynamic:t.dynamic,like:formatCount(e.desc.like),duration:t.duration,durationText:formatDuration(t.duration,0),playCount:formatCount(t.stat.view),danmakuCount:formatCount(t.stat.danmaku),watchlater:store.state.watchlaterList.includes(t.aid)}})),(e=>e.aid))}else if(e==="bangumi"){return t.data.cards.map((e=>{const t=JSON.parse(e.card);return{id:e.desc.dynamic_id_str,aid:t.aid,bvid:e.desc.bvid||t.bvid,epID:t.episode_id,title:t.new_desc,upName:t.apiSeasonInfo.title,upFaceUrl:t.apiSeasonInfo.cover,coverUrl:t.cover,description:"",timestamp:e.timestamp,time:new Date(e.timestamp*1e3),like:formatCount(e.desc.like),durationText:"",playCount:formatCount(t.play_count),danmakuCount:formatCount(t.bullet_count),watchlater:false}}))}else{return[]}};const l=e=>{const t=[/^https:\/\/t\.bilibili\.com\/$/,/^https:\/\/space\.bilibili\.com\//,/^https:\/\/live\.bilibili\.com\/(blanc\/)?[\d]+/,/^https:\/\/t\.bilibili\.com\//];if(t.every((e=>!e.test(document.URL)))){return}(async()=>{const t=await c.startWatching();if(!t){console.error("feedsCardsManager.startWatching() failed");return}const{added:i}=e;if(i){c.cards.forEach((e=>i(e)))}const n=()=>{};s.push({added:n,removed:n,...e})})()};const u=(e,t)=>{const i=dq(e.element,".more-panel");const{className:n,text:r,action:a}=t;if(!i||dq(i,`.${n}`)){return}const s=document.createElement("p");s.classList.add("child-button","c-pointer",n);s.textContent=r;const o=[...new Set([...i.children].map((e=>e.getAttributeNames().filter((e=>e.startsWith("data-v-"))))).flat())];o.forEach((e=>s.setAttribute(e,"")));s.addEventListener("click",(t=>{a(t);e.element.click()}));i.appendChild(s)};return{export:{feedsCardsManager:c,feedsCardTypes:n,supportedUrls:a,getVideoFeeds:d,forEachFeedsCard:l,addMenuItem:u}}})(); \ No newline at end of file +(()=>(e,t)=>{function i(e,t,i){if(t in e){Object.defineProperty(e,t,{value:i,enumerable:true,configurable:true,writable:true})}else{e[t]=i}return e}const n={repost:{id:1,name:"转发"},textWithImages:{id:2,name:"图文"},text:{id:4,name:"文字"},video:{id:8,name:"视频"},miniVideo:{id:16,name:"小视频"},column:{id:64,name:"专栏"},audio:{id:256,name:"音频"},bangumi:{id:512,name:"番剧"},share:{id:2048,name:"分享"},manga:{id:2049,name:"漫画"},film:{id:4098,name:"电影"},tv:{id:4099,name:"TV剧"},chinese:{id:4100,name:"国创"},documentary:{id:4101,name:"纪录片"},mediaList:{id:4300,name:"收藏夹"},liveRecord:{id:2047,name:"开播记录"}};const r=e=>{if(e.querySelector(".repost")){return n.repost}if(e.querySelector(".imagesbox")){return n.textWithImages}if(e.querySelector(".video-container")){return n.video}if(e.querySelector(".bangumi-container")){return n.bangumi}if(e.querySelector(".article-container")){return n.column}if(e.querySelector(".music-container")){return n.audio}if(e.querySelector(".h5share-container")){return n.share}if(e.querySelector(".vc-ctnr")){return n.miniVideo}if(e.querySelector(".live-container")){return n.liveRecord}return n.text};const a=["//t.bilibili.com","//space.bilibili.com","//live.bilibili.com"];const s=[];class o extends EventTarget{constructor(...e){super(...e);i(this,"watching",false);i(this,"cards",[])}addEventListener(e,t,i){super.addEventListener(e,t,i)}removeEventListener(e,t,i){super.removeEventListener(e,t,i)}async addCard(e){if(e instanceof HTMLElement&&e.classList.contains("card")){if(e.querySelector(".skeleton")!==null){const t=Observer.childList(e,(()=>{if(e.querySelector(".skeleton")===null){t.stop();this.addCard(e)}}))}else{if(e.parentNode===null){return}const t=await this.parseCard(e);if(!t.presented){return}if(this.cards.find((e=>e.id===t.id))){return}this.cards.push(t);this.cards.sort(((e,t)=>{if(e.id===t.id){return 0}return e.id>t.id?-1:1}));const i=new CustomEvent("addCard",{detail:t});this.dispatchEvent(i);s.forEach((e=>e.added(t)))}}}async removeCard(e){if(e instanceof HTMLElement&&e.classList.contains("card")){const t=e.getAttribute("data-did");const i=this.cards.findIndex((e=>e.id===t));if(i===-1){return}const n=this.cards[i];this.cards.splice(i,1);const r=new CustomEvent("removeCard",{detail:n});this.dispatchEvent(r);s.forEach((e=>e.removed(n)))}}async parseCard(e){const t=async t=>{const i=await SpinQuery.condition((()=>e.querySelector(t)),(t=>t!==null||e.parentNode===null));if(e.parentNode===null){return""}if(i===null){console.warn(e,t,e.parentNode);return""}const n=i.innerText.trim();return n};const i=async t=>{if(t===n.bangumi){return""}const i=await SpinQuery.condition((()=>e),(t=>Boolean(t.__vue__||!e.parentNode)));if(e.parentNode===null){return""}if(i===null){console.warn(i);return""}if(t===n.repost){const e=JSON.parse(i.__vue__.card.origin);const t=i.__vue__.originCardData.pureText;const n=_.get(e,"item.description","");const r=e.title;const a=i.__vue__.card.item.content;return[a,t,n,r].filter((e=>Boolean(e))).join("\n")}const r=i.__vue__.originCardData.pureText;const a=i.__vue__.originCardData.title;return[r,a].filter((e=>Boolean(e))).join("\n")};const a=async e=>{const i=parseInt(await t(e));if(isNaN(i)){return 0}return i};const s={id:e.getAttribute("data-did"),username:await t(".main-content .user-name"),text:"",reposts:await a(".button-bar .single-button:nth-child(1) .text-offset"),comments:await a(".button-bar .single-button:nth-child(2) .text-offset"),likes:await a(".button-bar .single-button:nth-child(3) .text-offset"),element:e,type:r(e),presented:true,async getText(){const e=await i(this.type);this.text=e;return e}};await s.getText();s.presented=e.parentNode!==null;e.setAttribute("data-type",s.type.id.toString());if(s.type===n.repost){const t=s.username;const i=_.get(s,"element.__vue__.card.origin_user.info.uname","");if(t===i){e.setAttribute("data-self-repost","true")}}return s}async startWatching(){const e=e=>{const t=[...e.querySelectorAll(".card[data-did]")];t.forEach((e=>this.addCard(e)));console.log(t);return Observer.childList(e,(e=>{e.forEach((e=>{e.addedNodes.forEach((e=>this.addCard(e)));e.removedNodes.forEach((e=>this.removeCard(e)))}))}))};if(this.watching){return true}this.watching=true;if(document.URL.includes("//space.bilibili.com")){console.log("space watch");const t=await SpinQuery.select(".s-space");if(!t){return false}let i=null;Observer.childList(t,(async()=>{if(dq("#page-dynamic")){const t=await SpinQuery.select(".feed-card .content");console.log("enter feeds tab");if(i){i.stop()}i=e(t)}else{console.log("leave feeds tab");if(i){i.stop();i=null}await Promise.all(this.cards.map((e=>e.element)).map((e=>this.removeCard(e))))}}));this.watching=true;return true}if(document.URL.includes("//live.bilibili.com")){console.log("live watch");const t=await SpinQuery.select(".room-feed");if(!t){return false}let i=null;Observer.childList(t,(async()=>{if(dq(".room-feed-content")){const t=await SpinQuery.select(".room-feed-content .content");console.log("enter feeds tab");if(i){i.stop()}i=e(t)}else{console.log("leave feeds tab");if(i){i.stop();i=null}await Promise.all(this.cards.map((e=>e.element)).map((e=>this.removeCard(e))))}}));return true}if(document.URL.startsWith("https://t.bilibili.com/topic")){console.log("topic watch");const t=await SpinQuery.select(".page-container");if(!t){return false}let i=null;Observer.childList(t,(async()=>{if(dq(".page-container .feed")){const t=await SpinQuery.select(".feed .feed-topic");console.log("enter feeds tab");if(i){i.stop()}i=e(t)}else{console.log("leave feeds tab");if(i){i.stop();i=null}await Promise.all(this.cards.map((e=>e.element)).map((e=>this.removeCard(e))))}}));return true}const t=await SpinQuery.select(".feed-card .content, .detail-content .detail-card");if(!t){return false}e(t);return true}}const c=new o;const d=t=>{if(!e.feedsFilter){return false}const i=(e,t)=>{if(e.startsWith("/")&&e.endsWith("/")){return new RegExp(e.slice(1,e.length-1)).test(t)}return t.includes(e)};return e.feedsFilterPatterns.some((e=>{const n=e.match(/(.+) up:([^ ]+)/);if(n){return i(n[1],t.text)&&i(n[2],t.username)}return i(e,t.text)}))};const l=e=>{var t;return d({text:e.title+((t=e.dynamic)!==null&&t!==void 0?t:""),username:e.upName})};const u=async(e="video")=>{if(!getUID()){return[]}const t=await Ajax.getJsonWithCredentials(`https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/dynamic_new?uid=${getUID()}&type_list=${e==="video"?8:512}`);if(t.code!==0){throw new Error(t.message)}const i=(()=>{const i=t.data.cards;if(e==="video"){return _.uniqBy(i.map((e=>{const t=JSON.parse(e.card);const i=_.get(e,"display.topic_info.topic_details",[]).map((e=>({id:e.topic_id,name:e.topic_name})));return{id:e.desc.dynamic_id_str,aid:t.aid,bvid:e.desc.bvid||t.bvid,title:t.title,upID:e.desc.user_profile.info.uid,upName:e.desc.user_profile.info.uname,upFaceUrl:e.desc.user_profile.info.face,coverUrl:t.pic,description:t.desc,timestamp:e.timestamp,time:new Date(e.timestamp*1e3),topics:i,dynamic:t.dynamic,like:formatCount(e.desc.like),duration:t.duration,durationText:formatDuration(t.duration,0),playCount:formatCount(t.stat.view),danmakuCount:formatCount(t.stat.danmaku),watchlater:store.state.watchlaterList.includes(t.aid)}})),(e=>e.aid))}else if(e==="bangumi"){return i.map((e=>{const t=JSON.parse(e.card);return{id:e.desc.dynamic_id_str,aid:t.aid,bvid:e.desc.bvid||t.bvid,epID:t.episode_id,title:t.new_desc,upName:t.apiSeasonInfo.title,upFaceUrl:t.apiSeasonInfo.cover,coverUrl:t.cover,description:"",timestamp:e.timestamp,time:new Date(e.timestamp*1e3),like:formatCount(e.desc.like),durationText:"",playCount:formatCount(t.play_count),danmakuCount:formatCount(t.bullet_count),watchlater:false}}))}else{return[]}})();return i.filter((e=>!l(e)))};const m=e=>{const t=[/^https:\/\/t\.bilibili\.com\/$/,/^https:\/\/space\.bilibili\.com\//,/^https:\/\/live\.bilibili\.com\/(blanc\/)?[\d]+/,/^https:\/\/t\.bilibili\.com\//];if(t.every((e=>!e.test(document.URL)))){return}(async()=>{const t=await c.startWatching();if(!t){console.error("feedsCardsManager.startWatching() failed");return}const{added:i}=e;if(i){c.cards.forEach((e=>i(e)))}const n=()=>{};s.push({added:n,removed:n,...e})})()};const f=(e,t)=>{const i=dq(e.element,".more-panel");const{className:n,text:r,action:a}=t;if(!i||dq(i,`.${n}`)){return}const s=document.createElement("p");s.classList.add("child-button","c-pointer",n);s.textContent=r;const o=[...new Set([...i.children].map((e=>e.getAttributeNames().filter((e=>e.startsWith("data-v-"))))).flat())];o.forEach((e=>s.setAttribute(e,"")));s.addEventListener("click",(t=>{a(t);e.element.click()}));i.appendChild(s)};return{export:{feedsCardsManager:c,feedsCardTypes:n,supportedUrls:a,getVideoFeeds:u,forEachFeedsCard:m,addMenuItem:f,isCardBlocked:d,isVideoCardBlocked:l}}})(); \ No newline at end of file diff --git a/min/feeds-filter-card.vue.min.js b/min/feeds-filter-card.vue.min.js index c2082cc98..d0cc4440f 100644 --- a/min/feeds-filter-card.vue.min.js +++ b/min/feeds-filter-card.vue.min.js @@ -1 +1 @@ -(()=>(e,t)=>{const i=`

动态过滤

类型

关键词

{{p}}

侧边栏

`;t.applyStyleFromText(`body.enable-feeds-filter:not(.disable-feeds-filter):not(.by-type).feeds-filter-block-audio .feed-card .card[data-type="256"],body.enable-feeds-filter:not(.disable-feeds-filter):not(.by-type).feeds-filter-block-bangumi .feed-card .card[data-type="512"],body.enable-feeds-filter:not(.disable-feeds-filter):not(.by-type).feeds-filter-block-column .feed-card .card[data-type="64"],body.enable-feeds-filter:not(.disable-feeds-filter):not(.by-type).feeds-filter-block-liveRecord .feed-card .card[data-type="2047"],body.enable-feeds-filter:not(.disable-feeds-filter):not(.by-type).feeds-filter-block-miniVideo .feed-card .card[data-type="16"],body.enable-feeds-filter:not(.disable-feeds-filter):not(.by-type).feeds-filter-block-repost .feed-card .card[data-type="1"],body.enable-feeds-filter:not(.disable-feeds-filter):not(.by-type).feeds-filter-block-self-repost .feed-card .card[data-self-repost],body.enable-feeds-filter:not(.disable-feeds-filter):not(.by-type).feeds-filter-block-share .feed-card .card[data-type="2048"],body.enable-feeds-filter:not(.disable-feeds-filter):not(.by-type).feeds-filter-block-text .feed-card .card[data-type="4"],body.enable-feeds-filter:not(.disable-feeds-filter):not(.by-type).feeds-filter-block-textWithImages .feed-card .card[data-type="2"],body.enable-feeds-filter:not(.disable-feeds-filter):not(.by-type).feeds-filter-block-video .feed-card .card[data-type="8"]{display:none!important}body.enable-feeds-filter:not(.disable-feeds-filter) .left-panel .scroll-content>*,body.enable-feeds-filter:not(.disable-feeds-filter) .left-panel>:not(:last-child),body.enable-feeds-filter:not(.disable-feeds-filter) .right-panel .scroll-content>*{margin:0 0 8px!important}body.enable-feeds-filter:not(.disable-feeds-filter) .left-panel .user-panel.f-left{float:none!important}.adaptive-scroll>div:first-child:empty,body.enable-feeds-filter:not(.disable-feeds-filter) .feed-card .card.pattern-block,body.enable-feeds-filter:not(.disable-feeds-filter).feeds-filter-side-block-following-tags .left-panel .tag-panel,body.enable-feeds-filter:not(.disable-feeds-filter).feeds-filter-side-block-following-tags .right-panel .new-topic-panel,body.enable-feeds-filter:not(.disable-feeds-filter).feeds-filter-side-block-live .left-panel .live-panel,body.enable-feeds-filter:not(.disable-feeds-filter).feeds-filter-side-block-most-viewed .card-list .most-viewed-panel,body.enable-feeds-filter:not(.disable-feeds-filter).feeds-filter-side-block-notice .right-panel .notice-panel,body.enable-feeds-filter:not(.disable-feeds-filter).feeds-filter-side-block-profile .left-panel .user-wrapper,body.enable-feeds-filter:not(.disable-feeds-filter).feeds-filter-side-block-trending-tags .right-panel .tag-panel{display:none!important}.adaptive-scroll .scroll-content{position:static!important;top:unset!important;bottom:unset!important}.feeds-filter{background-color:#fff;width:100%;padding:12px 16px;border-radius:4px;box-sizing:border-box;display:none;flex-direction:column;overflow:auto;max-height:80vh;scrollbar-width:none!important}.feeds-filter::-webkit-scrollbar{height:0!important;width:0!important}body.enable-feeds-filter:not(.disable-feeds-filter) .feeds-filter{display:flex}.feeds-filter,.feeds-filter *{transition:.2s ease-out;transition-property:border-color,color,background-color}body.dark .feeds-filter{color:#eee;background-color:#444}.feeds-filter .feeds-filter-header{cursor:pointer;margin-bottom:14px;display:flex;align-items:center;justify-content:space-between}.feeds-filter .feeds-filter-header h1{font-weight:400;font-size:14px;margin:0}.feeds-filter.collapse .feeds-filter-header{margin-bottom:0}.feeds-filter.collapse .feeds-filter-header .be-icon{transform:rotate(180deg)}.feeds-filter.collapse>:not(.feeds-filter-header){display:none}.feeds-filter h2{font-weight:700;font-size:13px;margin:0 0 8px}.feeds-filter .feeds-filter-swtich:not(:last-child){margin-bottom:4px}.feeds-filter .feeds-filter-swtich label{cursor:pointer;margin:0;padding:4px 8px;border-radius:4px;background-color:transparent;display:flex;align-items:center;justify-content:space-between;border:1px solid #8884}.feeds-filter .feeds-filter-swtich label .name{font-size:12px}.feeds-filter .feeds-filter-swtich label .disabled{color:var(--theme-color)!important}.feeds-filter .feeds-filter-swtich label:hover{background-color:#8882}.feeds-filter .feeds-filter-swtich label input{display:none}.feeds-filter .feeds-filter-swtich label .be-icon{font-size:16px}.feeds-filter .feeds-filter-swtich label .be-icon.disabled,.feeds-filter .feeds-filter-swtich label.disabled .be-icon{display:none}.feeds-filter .feeds-filter-swtich label.disabled .be-icon.disabled{display:block}.feeds-filter .filter-type-switch{flex:0 0 49%}.feeds-filter .filter-side-card-switch{flex:0 0 100%}.feeds-filter .filter-types{display:flex;flex-wrap:wrap;justify-content:space-between;margin-bottom:18px}body.by-type .feeds-filter .filter-types,body.by-type .feeds-filter h2:nth-of-type(1){display:none}.feeds-filter .filter-patterns:not(:empty){margin-bottom:8px}.feeds-filter .filter-patterns .pattern{display:flex;align-items:center;justify-content:space-between;padding:4px 8px;border-radius:4px;background-color:transparent;font-size:12px;border:1px solid #8884}.feeds-filter .filter-patterns .pattern:not(:last-child){margin-bottom:4px}.feeds-filter .filter-patterns .pattern .be-icon{font-size:16px;cursor:pointer}.feeds-filter .add-pattern{display:flex;align-items:center;margin-bottom:18px}.feeds-filter .add-pattern input{color:inherit;background-color:transparent;font-size:12px;border:1px solid #8884;border-radius:4px;outline:0!important;padding:4px;flex:1 0 0;width:0}.feeds-filter .add-pattern input:focus{border-color:var(--theme-color)}.feeds-filter .add-pattern .be-icon{font-size:18px;cursor:pointer;margin-left:8px}`,"feeds-filter-card-style");const s={0:{className:"profile",displayName:"个人资料"},1:{className:"following-tags",displayName:"话题"},2:{className:"notice",displayName:"公告栏"},3:{className:"live",displayName:"正在直播"},5:{className:"most-viewed",displayName:"关注栏"}};let d;const l="feeds-filter-side-block-";return{export:Object.assign({template:i},{components:{FilterTypeSwitch:()=>t.importAsync("filter-type-switch.vue"),Icon:()=>t.importAsync("icon.vue")},data(){return{allTypes:[],patterns:[...e.feedsFilterPatterns],newPattern:"",allSideCards:s,blockSideCards:[...e.feedsFilterSideCards],collapse:true}},methods:{updateCard(t){const i=(e,t)=>{if(e.startsWith("/")&&e.endsWith("/")){return new RegExp(e.slice(1,e.length-1)).test(t)}return t.includes(e)};const s=(()=>e.feedsFilterPatterns.some((e=>{const s=e.match(/(.+) up:([^ ]+)/);if(s){return i(s[1],t.text)&&i(s[2],t.username)}return i(e,t.text)})))();if(s){t.element.classList.add("pattern-block")}else{t.element.classList.remove("pattern-block")}},deletePattern(t){const i=e.feedsFilterPatterns.indexOf(t);if(i!==-1){this.patterns.splice(i,1)}},addPattern(e){if(e&&!this.patterns.includes(e)){this.patterns.push(e)}this.newPattern=""},updateBlockSide(){Object.entries(s).forEach((([e,t])=>{const i=l+t.className;document.body.classList[this.blockSideCards.includes(e)?"add":"remove"](i)}))},toggleBlockSide(t){const i=this.blockSideCards.indexOf(t);const d=s[t];if(i!==-1){this.blockSideCards.splice(i,1);document.body.classList.remove(l+d.className)}else{this.blockSideCards.push(t);document.body.classList.add(l+d.className)}e.feedsFilterSideCards=this.blockSideCards},sideDisabled(e){return this.blockSideCards.includes(e)}},watch:{patterns(){e.feedsFilterPatterns=this.patterns;if(d){d.cards.forEach((e=>this.updateCard(_.clone(e))))}}},async mounted(){this.updateBlockSide();const e=await SpinQuery.select(".feed-card .tab-bar");if(!e){console.error("tabBar not found");return}const i=e.querySelector(".tab:nth-child(1) .tab-text");Observer.attributes(i,(()=>{document.body.classList.toggle("by-type",!i.classList.contains("selected"))}));document.body.classList.add("enable-feeds-filter");const{feedsCardsManager:s,feedsCardTypes:l}=await t.importAsync("feeds-apis");const a=await s.startWatching();if(!a){console.error("feedsCardsManager.startWatching() failed");return}const r={"self-repost":{id:-1,name:"自转发"}};this.allTypes=Object.entries(l).concat(Object.entries(r)).filter((([e,t])=>t.id<=2048)).map((([e,t])=>[e,_.clone(t)]));s.cards.forEach((e=>this.updateCard(_.clone(e))));s.addEventListener("addCard",(e=>{const t=e.detail;this.updateCard(t)}));d=s}})}})(); \ No newline at end of file +(()=>(e,t)=>{const i=`

动态过滤

类型

关键词

{{p}}

侧边栏

`;t.applyStyleFromText(`body.enable-feeds-filter:not(.disable-feeds-filter):not(.by-type).feeds-filter-block-audio .feed-card .card[data-type="256"],body.enable-feeds-filter:not(.disable-feeds-filter):not(.by-type).feeds-filter-block-bangumi .feed-card .card[data-type="512"],body.enable-feeds-filter:not(.disable-feeds-filter):not(.by-type).feeds-filter-block-column .feed-card .card[data-type="64"],body.enable-feeds-filter:not(.disable-feeds-filter):not(.by-type).feeds-filter-block-liveRecord .feed-card .card[data-type="2047"],body.enable-feeds-filter:not(.disable-feeds-filter):not(.by-type).feeds-filter-block-miniVideo .feed-card .card[data-type="16"],body.enable-feeds-filter:not(.disable-feeds-filter):not(.by-type).feeds-filter-block-repost .feed-card .card[data-type="1"],body.enable-feeds-filter:not(.disable-feeds-filter):not(.by-type).feeds-filter-block-self-repost .feed-card .card[data-self-repost],body.enable-feeds-filter:not(.disable-feeds-filter):not(.by-type).feeds-filter-block-share .feed-card .card[data-type="2048"],body.enable-feeds-filter:not(.disable-feeds-filter):not(.by-type).feeds-filter-block-text .feed-card .card[data-type="4"],body.enable-feeds-filter:not(.disable-feeds-filter):not(.by-type).feeds-filter-block-textWithImages .feed-card .card[data-type="2"],body.enable-feeds-filter:not(.disable-feeds-filter):not(.by-type).feeds-filter-block-video .feed-card .card[data-type="8"]{display:none!important}body.enable-feeds-filter:not(.disable-feeds-filter) .left-panel .scroll-content>*,body.enable-feeds-filter:not(.disable-feeds-filter) .left-panel>:not(:last-child),body.enable-feeds-filter:not(.disable-feeds-filter) .right-panel .scroll-content>*{margin:0 0 8px!important}body.enable-feeds-filter:not(.disable-feeds-filter) .left-panel .user-panel.f-left{float:none!important}.adaptive-scroll>div:first-child:empty,body.enable-feeds-filter:not(.disable-feeds-filter) .feed-card .card.pattern-block,body.enable-feeds-filter:not(.disable-feeds-filter).feeds-filter-side-block-following-tags .left-panel .tag-panel,body.enable-feeds-filter:not(.disable-feeds-filter).feeds-filter-side-block-following-tags .right-panel .new-topic-panel,body.enable-feeds-filter:not(.disable-feeds-filter).feeds-filter-side-block-live .left-panel .live-panel,body.enable-feeds-filter:not(.disable-feeds-filter).feeds-filter-side-block-most-viewed .card-list .most-viewed-panel,body.enable-feeds-filter:not(.disable-feeds-filter).feeds-filter-side-block-notice .right-panel .notice-panel,body.enable-feeds-filter:not(.disable-feeds-filter).feeds-filter-side-block-profile .left-panel .user-wrapper,body.enable-feeds-filter:not(.disable-feeds-filter).feeds-filter-side-block-trending-tags .right-panel .tag-panel{display:none!important}.adaptive-scroll .scroll-content{position:static!important;top:unset!important;bottom:unset!important}.feeds-filter{background-color:#fff;width:100%;padding:12px 16px;border-radius:4px;box-sizing:border-box;display:none;flex-direction:column;overflow:auto;max-height:80vh;scrollbar-width:none!important}.feeds-filter::-webkit-scrollbar{height:0!important;width:0!important}body.enable-feeds-filter:not(.disable-feeds-filter) .feeds-filter{display:flex}.feeds-filter,.feeds-filter *{transition:.2s ease-out;transition-property:border-color,color,background-color}body.dark .feeds-filter{color:#eee;background-color:#444}.feeds-filter .feeds-filter-header{cursor:pointer;margin-bottom:14px;display:flex;align-items:center;justify-content:space-between}.feeds-filter .feeds-filter-header h1{font-weight:400;font-size:14px;margin:0}.feeds-filter.collapse .feeds-filter-header{margin-bottom:0}.feeds-filter.collapse .feeds-filter-header .be-icon{transform:rotate(180deg)}.feeds-filter.collapse>:not(.feeds-filter-header){display:none}.feeds-filter h2{font-weight:700;font-size:13px;margin:0 0 8px}.feeds-filter .feeds-filter-swtich:not(:last-child){margin-bottom:4px}.feeds-filter .feeds-filter-swtich label{cursor:pointer;margin:0;padding:4px 8px;border-radius:4px;background-color:transparent;display:flex;align-items:center;justify-content:space-between;border:1px solid #8884}.feeds-filter .feeds-filter-swtich label .name{font-size:12px}.feeds-filter .feeds-filter-swtich label .disabled{color:var(--theme-color)!important}.feeds-filter .feeds-filter-swtich label:hover{background-color:#8882}.feeds-filter .feeds-filter-swtich label input{display:none}.feeds-filter .feeds-filter-swtich label .be-icon{font-size:16px}.feeds-filter .feeds-filter-swtich label .be-icon.disabled,.feeds-filter .feeds-filter-swtich label.disabled .be-icon{display:none}.feeds-filter .feeds-filter-swtich label.disabled .be-icon.disabled{display:block}.feeds-filter .filter-type-switch{flex:0 0 49%}.feeds-filter .filter-side-card-switch{flex:0 0 100%}.feeds-filter .filter-types{display:flex;flex-wrap:wrap;justify-content:space-between;margin-bottom:18px}body.by-type .feeds-filter .filter-types,body.by-type .feeds-filter h2:nth-of-type(1){display:none}.feeds-filter .filter-patterns:not(:empty){margin-bottom:8px}.feeds-filter .filter-patterns .pattern{display:flex;align-items:center;justify-content:space-between;padding:4px 8px;border-radius:4px;background-color:transparent;font-size:12px;border:1px solid #8884}.feeds-filter .filter-patterns .pattern:not(:last-child){margin-bottom:4px}.feeds-filter .filter-patterns .pattern .be-icon{font-size:16px;cursor:pointer}.feeds-filter .add-pattern{display:flex;align-items:center;margin-bottom:18px}.feeds-filter .add-pattern input{color:inherit;background-color:transparent;font-size:12px;border:1px solid #8884;border-radius:4px;outline:0!important;padding:4px;flex:1 0 0;width:0}.feeds-filter .add-pattern input:focus{border-color:var(--theme-color)}.feeds-filter .add-pattern .be-icon{font-size:18px;cursor:pointer;margin-left:8px}`,"feeds-filter-card-style");const d={0:{className:"profile",displayName:"个人资料"},1:{className:"following-tags",displayName:"话题"},2:{className:"notice",displayName:"公告栏"},3:{className:"live",displayName:"正在直播"},5:{className:"most-viewed",displayName:"关注栏"}};let l;const s="feeds-filter-side-block-";return{export:Object.assign({template:i},{components:{FilterTypeSwitch:()=>t.importAsync("filter-type-switch.vue"),Icon:()=>t.importAsync("icon.vue")},data(){return{allTypes:[],patterns:[...e.feedsFilterPatterns],newPattern:"",allSideCards:d,blockSideCards:[...e.feedsFilterSideCards],collapse:true}},methods:{async updateCard(e){const{isCardBlocked:i}=await t.importAsync("feeds-apis");if(i(e)){e.element.classList.add("pattern-block")}else{e.element.classList.remove("pattern-block")}},deletePattern(t){const i=e.feedsFilterPatterns.indexOf(t);if(i!==-1){this.patterns.splice(i,1)}},addPattern(e){if(e&&!this.patterns.includes(e)){this.patterns.push(e)}this.newPattern=""},updateBlockSide(){Object.entries(d).forEach((([e,t])=>{const i=s+t.className;document.body.classList[this.blockSideCards.includes(e)?"add":"remove"](i)}))},toggleBlockSide(t){const i=this.blockSideCards.indexOf(t);const l=d[t];if(i!==-1){this.blockSideCards.splice(i,1);document.body.classList.remove(s+l.className)}else{this.blockSideCards.push(t);document.body.classList.add(s+l.className)}e.feedsFilterSideCards=this.blockSideCards},sideDisabled(e){return this.blockSideCards.includes(e)}},watch:{patterns(){e.feedsFilterPatterns=this.patterns;if(l){l.cards.forEach((e=>this.updateCard(_.clone(e))))}}},async mounted(){this.updateBlockSide();const e=await SpinQuery.select(".feed-card .tab-bar");if(!e){console.error("tabBar not found");return}const i=e.querySelector(".tab:nth-child(1) .tab-text");Observer.attributes(i,(()=>{document.body.classList.toggle("by-type",!i.classList.contains("selected"))}));document.body.classList.add("enable-feeds-filter");const{feedsCardsManager:d,feedsCardTypes:s}=await t.importAsync("feeds-apis");const a=await d.startWatching();if(!a){console.error("feedsCardsManager.startWatching() failed");return}const r={"self-repost":{id:-1,name:"自转发"}};this.allTypes=Object.entries(s).concat(Object.entries(r)).filter((([e,t])=>t.id<=2048)).map((([e,t])=>[e,_.clone(t)]));d.cards.forEach((e=>this.updateCard(_.clone(e))));d.addEventListener("addCard",(e=>{const t=e.detail;this.updateCard(t)}));l=d}})}})(); \ No newline at end of file diff --git a/src/activity/feeds-apis.ts b/src/activity/feeds-apis.ts index d60c647e9..b8d9c04dc 100644 --- a/src/activity/feeds-apis.ts +++ b/src/activity/feeds-apis.ts @@ -387,6 +387,34 @@ class FeedsCardsManager extends EventTarget { } export const feedsCardsManager = new FeedsCardsManager() +export const isCardBlocked = (card: Pick) => { + if (!settings.feedsFilter) { + return false + } + const testPattern = (pattern: Pattern, text: string) => { + if (pattern.startsWith('/') && pattern.endsWith('/')) { + return new RegExp(pattern.slice(1, pattern.length - 1)).test(text) + } + return text.includes(pattern) + } + return settings.feedsFilterPatterns.some(pattern => { + const upNameMatch = pattern.match(/(.+) up:([^ ]+)/) + if (upNameMatch) { + return ( + testPattern(upNameMatch[1], card.text) && + testPattern(upNameMatch[2], card.username) + ) + } + return testPattern(pattern, card.text) + }) +} +export const isVideoCardBlocked = (card: Pick) => { + return isCardBlocked({ + text: card.title + (card.dynamic ?? ''), + username: card.upName, + }) +} + export const getVideoFeeds = async (type: 'video' | 'bangumi' = 'video'): Promise => { if (!getUID()) { return [] @@ -397,69 +425,72 @@ export const getVideoFeeds = async (type: 'video' | 'bangumi' = 'video'): Promis if (json.code !== 0) { throw new Error(json.message) } - if (type === 'video') { - return _.uniqBy(json.data.cards.map( - (c: any): VideoCardInfo => { - const card = JSON.parse(c.card) - const topics = _.get(c, 'display.topic_info.topic_details', []).map( - (it: any) => { - return { - id: it.topic_id, - name: it.topic_name + const cards = (() => { + const jsonCards = json.data.cards as any[] + if (type === 'video') { + return _.uniqBy(jsonCards.map( + (c: any): VideoCardInfo => { + const card = JSON.parse(c.card) + const topics = _.get(c, 'display.topic_info.topic_details', []).map( + (it: any) => { + return { + id: it.topic_id, + name: it.topic_name + } } - } - ) - return { - id: c.desc.dynamic_id_str, - aid: card.aid, - bvid: c.desc.bvid || card.bvid, - title: card.title, - upID: c.desc.user_profile.info.uid, - upName: c.desc.user_profile.info.uname, - upFaceUrl: c.desc.user_profile.info.face, - coverUrl: card.pic, - description: card.desc, - timestamp: c.timestamp, - time: new Date(c.timestamp * 1000), - topics, - dynamic: card.dynamic, - like: formatCount(c.desc.like), - duration: card.duration, - durationText: formatDuration(card.duration, 0), - playCount: formatCount(card.stat.view), - danmakuCount: formatCount(card.stat.danmaku), - watchlater: store.state.watchlaterList.includes(card.aid) + ) + return { + id: c.desc.dynamic_id_str, + aid: card.aid, + bvid: c.desc.bvid || card.bvid, + title: card.title, + upID: c.desc.user_profile.info.uid, + upName: c.desc.user_profile.info.uname, + upFaceUrl: c.desc.user_profile.info.face, + coverUrl: card.pic, + description: card.desc, + timestamp: c.timestamp, + time: new Date(c.timestamp * 1000), + topics, + dynamic: card.dynamic, + like: formatCount(c.desc.like), + duration: card.duration, + durationText: formatDuration(card.duration, 0), + playCount: formatCount(card.stat.view), + danmakuCount: formatCount(card.stat.danmaku), + watchlater: store.state.watchlaterList.includes(card.aid) + } as VideoCardInfo } - } - ), it => it.aid) - } else if (type === 'bangumi') { - return json.data.cards.map( - (c: any): VideoCardInfo => { - const card = JSON.parse(c.card) - return { - id: c.desc.dynamic_id_str, - aid: card.aid, - bvid: c.desc.bvid || card.bvid, - epID: card.episode_id, - title: card.new_desc, - upName: card.apiSeasonInfo.title, - upFaceUrl: card.apiSeasonInfo.cover, - coverUrl: card.cover, - description: '', - timestamp: c.timestamp, - time: new Date(c.timestamp * 1000), - like: formatCount(c.desc.like), - durationText: '', - playCount: formatCount(card.play_count), - danmakuCount: formatCount(card.bullet_count), - watchlater: false, + ), it => it.aid) + } else if (type === 'bangumi') { + return jsonCards.map( + (c: any): VideoCardInfo => { + const card = JSON.parse(c.card) + return { + id: c.desc.dynamic_id_str, + aid: card.aid, + bvid: c.desc.bvid || card.bvid, + epID: card.episode_id, + title: card.new_desc, + upName: card.apiSeasonInfo.title, + upFaceUrl: card.apiSeasonInfo.cover, + coverUrl: card.cover, + description: '', + timestamp: c.timestamp, + time: new Date(c.timestamp * 1000), + like: formatCount(c.desc.like), + durationText: '', + playCount: formatCount(card.play_count), + danmakuCount: formatCount(card.bullet_count), + watchlater: false, + } as VideoCardInfo } - } - ) - - } else { - return [] - } + ) + } else { + return [] + } + })() + return cards.filter(c => !isVideoCardBlocked(c)) } export const forEachFeedsCard = (callback: FeedsCardCallback) => { @@ -524,5 +555,7 @@ export default { getVideoFeeds, forEachFeedsCard, addMenuItem, + isCardBlocked, + isVideoCardBlocked, }, } diff --git a/src/activity/feeds-filter/feeds-filter-card.vue b/src/activity/feeds-filter/feeds-filter-card.vue index 99159a4a2..2a4d9edf9 100644 --- a/src/activity/feeds-filter/feeds-filter-card.vue +++ b/src/activity/feeds-filter/feeds-filter-card.vue @@ -110,26 +110,9 @@ export default { } }, methods: { - updateCard(card: FeedsCard) { - const testPattern = (pattern: Pattern, text: string) => { - if (pattern.startsWith('/') && pattern.endsWith('/')) { - return new RegExp(pattern.slice(1, pattern.length - 1)).test(text) - } - return text.includes(pattern) - } - const block: boolean = (() => { - return settings.feedsFilterPatterns.some(pattern => { - const upNameMatch = pattern.match(/(.+) up:([^ ]+)/) - if (upNameMatch) { - return ( - testPattern(upNameMatch[1], card.text) && - testPattern(upNameMatch[2], card.username) - ) - } - return testPattern(pattern, card.text) - }) - })() - if (block) { + async updateCard(card: FeedsCard) { + const { isCardBlocked } = await import('../feeds-apis') + if (isCardBlocked(card)) { card.element.classList.add('pattern-block') } else { card.element.classList.remove('pattern-block') diff --git a/src/style/custom-navbar/activities/custom-navbar-activities.ts b/src/style/custom-navbar/activities/custom-navbar-activities.ts index b3ff35088..cb1530921 100644 --- a/src/style/custom-navbar/activities/custom-navbar-activities.ts +++ b/src/style/custom-navbar/activities/custom-navbar-activities.ts @@ -163,6 +163,7 @@ export class Activities extends NavbarComponent { this.setNotifyCount(json.data.update_num) } async init() { + const { isVideoCardBlocked, isCardBlocked } = await import('../../../activity/feeds-apis') Vue.component('activity-loading', { template: /*html*/`
@@ -321,6 +322,7 @@ export class Activities extends NavbarComponent { .sort((a, b) => { return b.id > a.id ? 1 : -1 }) + .filter(c => !isVideoCardBlocked(c)) if (cards.length === 0) { this.hasMoreContent = false } @@ -417,7 +419,7 @@ export class Activities extends NavbarComponent {
`, handleJson: async function (json) { - const cards = _.get(json, 'data.cards', []).map((card: any) => { + const cards = _.get(json, 'data.cards', []).map((card: any) => { const cardJson = JSON.parse(card.card) return { title: cardJson.apiSeasonInfo.title, @@ -428,11 +430,12 @@ export class Activities extends NavbarComponent { id: card.desc.dynamic_id_str, get new() { return Activities.isNewID(this.id) }, } - }) as { id: string }[] + }) this.cards = _.uniqBy(cards.concat(this.cards), it => it.id) .sort((a, b) => { return b.id > a.id ? 1 : -1 }) + .filter(c => !isCardBlocked({ text: c.epTitle, username: c.title })) if (cards.length === 0) { this.hasMoreContent = false } @@ -479,7 +482,7 @@ export class Activities extends NavbarComponent { `, handleJson: async function (json) { - const cards = _.get(json, 'data.cards', []).map((card: any) => { + const cards = _.get(json, 'data.cards', []).map((card: any) => { const cardJson = JSON.parse(card.card) return { covers: cardJson.image_urls, @@ -493,11 +496,12 @@ export class Activities extends NavbarComponent { id: card.desc.dynamic_id_str, get new() { return Activities.isNewID(this.id) }, } - }) as { id: string }[] + }) this.cards = _.uniqBy(cards.concat(this.cards), it => it.id) .sort((a, b) => { return b.id > a.id ? 1 : -1 }) + .filter(c => !isVideoCardBlocked(c)) if (cards.length === 0) { this.hasMoreContent = false }