@@ -4,6 +4,7 @@ import { IMainFilter, SelectorResult, SubFilterPair } from '@/types/filter'
44import { debugFilter as debug , error } from '@/utils/logger'
55import { BiliCleanerStorage } from '@/utils/storage'
66import { DynContentFilter , DynUploaderFilter , DynVideoTitleFilter } from '../subFilters/black'
7+ import { DynContentWhiteFilter , DynVideoTitleWhiteFilter } from '../subFilters/white'
78
89const GM_KEYS = {
910 black : {
@@ -20,6 +21,16 @@ const GM_KEYS = {
2021 valueKey : 'global-content-keyword-filter-value' ,
2122 } ,
2223 } ,
24+ white : {
25+ title : {
26+ statusKey : 'dyn-video-title-white-filter-status' ,
27+ valueKey : 'global-title-keyword-whitelist-filter-value' ,
28+ } ,
29+ content : {
30+ statusKey : 'dyn-content-white-filter-status' ,
31+ valueKey : 'global-content-keyword-whitelist-filter-value' ,
32+ } ,
33+ } ,
2334}
2435
2536// 动态信息提取
@@ -42,12 +53,18 @@ class DynamicFilterHeader implements IMainFilter {
4253 dynUploaderFilter = new DynUploaderFilter ( )
4354 dynVideoTitleFilter = new DynVideoTitleFilter ( )
4455 dynContentFilter = new DynContentFilter ( )
56+ // 白名单
57+ dynVideoTitleWhiteFilter = new DynVideoTitleWhiteFilter ( )
58+ dynContentWhiteFilter = new DynContentWhiteFilter ( )
4559
4660 init ( ) {
4761 // 黑名单
4862 this . dynUploaderFilter . setParam ( BiliCleanerStorage . get ( GM_KEYS . black . uploader . valueKey , [ ] ) )
4963 this . dynVideoTitleFilter . setParam ( BiliCleanerStorage . get ( GM_KEYS . black . title . valueKey , [ ] ) )
5064 this . dynContentFilter . setParam ( BiliCleanerStorage . get ( GM_KEYS . black . content . valueKey , [ ] ) )
65+ // 白名单
66+ this . dynVideoTitleWhiteFilter . setParam ( BiliCleanerStorage . get ( GM_KEYS . white . title . valueKey , [ ] ) )
67+ this . dynContentWhiteFilter . setParam ( BiliCleanerStorage . get ( GM_KEYS . white . content . valueKey , [ ] ) )
5168 }
5269
5370 async check ( mode ?: 'full' | 'incr' ) {
@@ -84,9 +101,13 @@ class DynamicFilterHeader implements IMainFilter {
84101 this . dynUploaderFilter . isEnable && blackPairs . push ( [ this . dynUploaderFilter , selectorFns . uploader ] )
85102 this . dynVideoTitleFilter . isEnable && blackPairs . push ( [ this . dynVideoTitleFilter , selectorFns . title ] )
86103 this . dynContentFilter . isEnable && blackPairs . push ( [ this . dynContentFilter , selectorFns . content ] )
104+ // 构建白名单任务
105+ const whitePairs : SubFilterPair [ ] = [ ]
106+ this . dynVideoTitleWhiteFilter . isEnable && whitePairs . push ( [ this . dynVideoTitleWhiteFilter , selectorFns . title ] )
107+ this . dynContentWhiteFilter . isEnable && whitePairs . push ( [ this . dynContentWhiteFilter , selectorFns . content ] )
87108
88109 // 检测
89- const blackCnt = await coreCheck ( dyns , true , 'style' , blackPairs , [ ] )
110+ const blackCnt = await coreCheck ( dyns , true , 'style' , blackPairs , whitePairs )
90111 const time = ( performance . now ( ) - timer ) . toFixed ( 1 )
91112 debug ( `DynamicFilterHeader hide ${ blackCnt } in ${ dyns . length } dyns, mode=${ mode } , time=${ time } ` )
92113 }
@@ -104,23 +125,21 @@ class DynamicFilterHeader implements IMainFilter {
104125 // }
105126
106127 observe ( ) {
107- document . addEventListener ( 'DOMContentLoaded' , ( ) => {
108- let cnt = 0
109- const id = setInterval ( ( ) => {
110- const ele = document . querySelector ( '.right-entry .v-popover-wrap:nth-of-type(3)' ) as HTMLElement
111- if ( ele ) {
112- clearInterval ( id )
113-
114- debug ( 'DynamicFilterHeader target appear' )
115- this . target = ele
128+ let cnt = 0
129+ const id = setInterval ( ( ) => {
130+ const ele = document . querySelector ( '.right-entry' ) as HTMLElement
131+ if ( ele ) {
132+ clearInterval ( id )
133+
134+ debug ( 'DynamicFilterHeader target appear' )
135+ this . target = ele
136+ this . checkFull ( )
137+ new MutationObserver ( ( ) => {
116138 this . checkFull ( )
117- new MutationObserver ( ( ) => {
118- this . checkFull ( )
119- } ) . observe ( this . target , { childList : true , subtree : true } )
120- }
121- ++ cnt > 10 && clearInterval ( id )
122- } , 1000 )
123- } )
139+ } ) . observe ( this . target , { childList : true , subtree : true } )
140+ }
141+ ++ cnt > 10 && clearInterval ( id )
142+ } , 1000 )
124143 }
125144}
126145
@@ -140,4 +159,10 @@ export const dynamicFilterHeaderEntry = async () => {
140159 if ( BiliCleanerStorage . get ( GM_KEYS . black . content . statusKey ) ) {
141160 mainFilter . dynContentFilter . enable ( )
142161 }
162+ if ( BiliCleanerStorage . get ( GM_KEYS . white . title . statusKey ) ) {
163+ mainFilter . dynVideoTitleWhiteFilter . enable ( )
164+ }
165+ if ( BiliCleanerStorage . get ( GM_KEYS . white . content . statusKey ) ) {
166+ mainFilter . dynContentWhiteFilter . enable ( )
167+ }
143168}
0 commit comments