@@ -14,6 +14,7 @@ import {
1414 DynUploaderFilter ,
1515 DynVideoTitleFilter ,
1616} from '../subFilters/black'
17+ import { DynContentWhiteFilter , DynVideoTitleWhiteFilter } from '../subFilters/white'
1718
1819const GM_KEYS = {
1920 black : {
@@ -42,6 +43,16 @@ const GM_KEYS = {
4243 statusKey : 'dyn-playback-filter-status' ,
4344 } ,
4445 } ,
46+ white : {
47+ title : {
48+ statusKey : 'dyn-video-title-white-filter-status' ,
49+ valueKey : 'global-title-keyword-whitelist-filter-value' ,
50+ } ,
51+ content : {
52+ statusKey : 'dyn-content-white-filter-status' ,
53+ valueKey : 'global-content-keyword-whitelist-filter-value' ,
54+ } ,
55+ } ,
4556}
4657
4758// 动态信息提取
@@ -92,13 +103,19 @@ class DynamicFilterDynamic implements IMainFilter {
92103 dynContentFilter = new DynContentFilter ( )
93104 dynDynVideoFilter = new DynDynVideoFilter ( )
94105 dynPlaybackFilter = new DynPlaybackFilter ( )
106+ // 白名单
107+ dynVideoTitleWhiteFilter = new DynVideoTitleWhiteFilter ( )
108+ dynContentWhiteFilter = new DynContentWhiteFilter ( )
95109
96110 init ( ) {
97111 // 黑名单
98112 this . dynUploaderFilter . setParam ( BiliCleanerStorage . get ( GM_KEYS . black . uploader . valueKey , [ ] ) )
99113 this . dynDurationFilter . setParam ( BiliCleanerStorage . get ( GM_KEYS . black . duration . valueKey , 0 ) )
100114 this . dynVideoTitleFilter . setParam ( BiliCleanerStorage . get ( GM_KEYS . black . title . valueKey , [ ] ) )
101115 this . dynContentFilter . setParam ( BiliCleanerStorage . get ( GM_KEYS . black . content . valueKey , [ ] ) )
116+ // 白名单
117+ this . dynVideoTitleWhiteFilter . setParam ( BiliCleanerStorage . get ( GM_KEYS . white . title . valueKey , [ ] ) )
118+ this . dynContentWhiteFilter . setParam ( BiliCleanerStorage . get ( GM_KEYS . white . content . valueKey , [ ] ) )
102119 }
103120
104121 async check ( mode ?: 'full' | 'incr' ) {
@@ -161,9 +178,12 @@ class DynamicFilterDynamic implements IMainFilter {
161178 this . dynContentFilter . isEnable && blackPairs . push ( [ this . dynContentFilter , selectorFns . content ] )
162179 this . dynDynVideoFilter . isEnable && blackPairs . push ( [ this . dynDynVideoFilter , selectorFns . dynVideo ] )
163180 this . dynPlaybackFilter . isEnable && blackPairs . push ( [ this . dynPlaybackFilter , selectorFns . playback ] )
181+ const whitePairs : SubFilterPair [ ] = [ ]
182+ this . dynVideoTitleWhiteFilter . isEnable && whitePairs . push ( [ this . dynVideoTitleWhiteFilter , selectorFns . title ] )
183+ this . dynContentWhiteFilter . isEnable && whitePairs . push ( [ this . dynContentWhiteFilter , selectorFns . content ] )
164184
165185 // 检测
166- const blackCnt = await coreCheck ( dyns , true , 'style' , blackPairs , [ ] )
186+ const blackCnt = await coreCheck ( dyns , true , 'style' , blackPairs , whitePairs )
167187 const time = ( performance . now ( ) - timer ) . toFixed ( 1 )
168188 debug ( `DynamicFilterDynamic hide ${ blackCnt } in ${ dyns . length } dyns, mode=${ mode } , time=${ time } ` )
169189 }
@@ -283,7 +303,7 @@ export const dynamicFilterDynamicGroups: Group[] = [
283303 {
284304 type : 'switch' ,
285305 id : GM_KEYS . black . title . statusKey ,
286- name : '启用 标题关键词过滤 ' ,
306+ name : '启用 视频标题关键词过滤 ' ,
287307 noStyle : true ,
288308 enableFn : ( ) => {
289309 mainFilter . dynVideoTitleFilter . enable ( )
@@ -297,8 +317,8 @@ export const dynamicFilterDynamicGroups: Group[] = [
297317 {
298318 type : 'editor' ,
299319 id : GM_KEYS . black . title . valueKey ,
300- name : '编辑 标题关键词黑名单 ' ,
301- editorTitle : '标题关键词 黑名单' ,
320+ name : '编辑 视频标题关键词黑名单 ' ,
321+ editorTitle : '视频标题关键词 黑名单' ,
302322 editorDescription : [
303323 '每行一个关键词或正则,不区分大小写、全半角' ,
304324 '请勿使用过于激进的关键词或正则' ,
@@ -318,7 +338,7 @@ export const dynamicFilterDynamicGroups: Group[] = [
318338 type : 'switch' ,
319339 id : GM_KEYS . black . content . statusKey ,
320340 name : '启用 动态内容关键词过滤' ,
321- description : [ '包含被转发动态内容' , '不含动态内视频信息 '] ,
341+ description : [ '不覆盖动态内视频标题 ' ] ,
322342 noStyle : true ,
323343 enableFn : ( ) => {
324344 mainFilter . dynContentFilter . enable ( )
@@ -379,6 +399,74 @@ export const dynamicFilterDynamicGroups: Group[] = [
379399 } ,
380400 ] ,
381401 } ,
402+ {
403+ name : '白名单 免过滤' ,
404+ items : [
405+ {
406+ type : 'switch' ,
407+ id : GM_KEYS . white . title . statusKey ,
408+ name : '启用 标题关键词白名单' ,
409+ noStyle : true ,
410+ enableFn : ( ) => {
411+ mainFilter . dynVideoTitleWhiteFilter . enable ( )
412+ mainFilter . checkFull ( )
413+ } ,
414+ disableFn : ( ) => {
415+ mainFilter . dynVideoTitleWhiteFilter . disable ( )
416+ mainFilter . checkFull ( )
417+ } ,
418+ } ,
419+ {
420+ type : 'editor' ,
421+ id : GM_KEYS . white . title . valueKey ,
422+ name : '编辑 标题关键词白名单' ,
423+ editorTitle : '标题关键词 白名单' ,
424+ editorDescription : [
425+ '每行一个关键词或正则,不区分大小写、全半角' ,
426+ '请勿使用过于激进的关键词或正则' ,
427+ '正则默认 ius 模式,无需 flag,语法:/abc|\\d+/' ,
428+ ] ,
429+ saveFn : async ( ) => {
430+ mainFilter . dynVideoTitleWhiteFilter . setParam (
431+ BiliCleanerStorage . get ( GM_KEYS . white . title . valueKey , [ ] ) ,
432+ )
433+ mainFilter . checkFull ( )
434+ } ,
435+ } ,
436+ {
437+ type : 'switch' ,
438+ id : GM_KEYS . white . content . statusKey ,
439+ name : '启用 动态内容关键词白名单' ,
440+ description : [ '不覆盖动态内视频标题' ] ,
441+ noStyle : true ,
442+ enableFn : ( ) => {
443+ mainFilter . dynContentWhiteFilter . enable ( )
444+ mainFilter . checkFull ( )
445+ } ,
446+ disableFn : ( ) => {
447+ mainFilter . dynContentWhiteFilter . disable ( )
448+ mainFilter . checkFull ( )
449+ } ,
450+ } ,
451+ {
452+ type : 'editor' ,
453+ id : GM_KEYS . white . content . valueKey ,
454+ name : '编辑 动态内容关键词白名单' ,
455+ editorTitle : '动态内容关键词 白名单' ,
456+ editorDescription : [
457+ '每行一个关键词或正则,不区分大小写、全半角' ,
458+ '请勿使用过于激进的关键词或正则' ,
459+ '正则默认 ius 模式,无需 flag,语法:/abc|\\d+/' ,
460+ ] ,
461+ saveFn : async ( ) => {
462+ mainFilter . dynContentWhiteFilter . setParam (
463+ BiliCleanerStorage . get ( GM_KEYS . white . content . valueKey , [ ] ) ,
464+ )
465+ mainFilter . checkFull ( )
466+ } ,
467+ } ,
468+ ] ,
469+ } ,
382470]
383471
384472// 右键菜单handler
0 commit comments