opt: filter danmaku

related #283

Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
bggRGjQaUbCoE
2025-02-20 17:30:11 +08:00
parent fb6f92a70b
commit f759dba7da
4 changed files with 41 additions and 13 deletions

View File

@@ -81,6 +81,9 @@ class PlDanmakuController {
} }
bool filterDanmaku(DanmakuElem elem) { bool filterDanmaku(DanmakuElem elem) {
if (plPlayerController.dmRegExp?.hasMatch(elem.content) == true) {
return false;
}
for (var filter in plPlayerController.danmakuFilterRule) { for (var filter in plPlayerController.danmakuFilterRule) {
switch (filter['type']) { switch (filter['type']) {
case 0: case 0:
@@ -88,12 +91,12 @@ class PlDanmakuController {
return false; return false;
} }
break; break;
case 1: // case 1:
if (RegExp(filter['filter'], caseSensitive: false) // if (RegExp(filter['filter'], caseSensitive: false)
.hasMatch(elem.content)) { // .hasMatch(elem.content)) {
return false; // return false;
} // }
break; // break;
case 2: case 2:
if (elem.idStr == filter['filter']) { if (elem.idStr == filter['filter']) {
return false; return false;

View File

@@ -36,21 +36,34 @@ class _DanmakuBlockPageState extends State<DanmakuBlockPage> {
} }
@override @override
void dispose() async { void dispose() {
final regExp = RegExp(r'^/(.*)/$');
List<Map<String, dynamic>> simpleRuleList = _danmakuBlockController List<Map<String, dynamic>> simpleRuleList = _danmakuBlockController
.ruleTypes.values .ruleTypes.values
.expand((element) => element) .expand((element) => element)
.map<Map<String, dynamic>>((e) { .map<Map<String, dynamic>>((e) {
//当正则表达式前后都有"/"时去掉避免RegExp解析错误 //当正则表达式前后都有"/"时去掉避免RegExp解析错误
if (e.type == 1 && e.filter.startsWith('/') && e.filter.endsWith('/')) { if (e.type == 1) {
e.filter = e.filter.substring(1, e.filter.length - 1); String? filter = regExp.firstMatch(e.filter)?.group(1);
if (filter != null) {
e.filter = filter;
}
} }
return e.toMap(); return e.toMap();
}).toList(); }).toList();
// debugPrint("simpleRuleList:$simpleRuleList"); // debugPrint("simpleRuleList:$simpleRuleList");
plPlayerController.danmakuFilterRule = simpleRuleList; List regex = [];
plPlayerController.danmakuFilterRule = simpleRuleList.where((item) {
if (item['type'] != 1) {
return true;
} else {
regex.add(item['filter']);
return false;
}
}).toList();
plPlayerController.dmRegExp =
regex.isNotEmpty ? RegExp(regex.join('|'), caseSensitive: false) : null;
scrollController.dispose(); scrollController.dispose();
await GStorage.localCache.delete(LocalCacheKey.danmakuFilterRule);
GStorage.localCache.put(LocalCacheKey.danmakuFilterRule, simpleRuleList); GStorage.localCache.put(LocalCacheKey.danmakuFilterRule, simpleRuleList);
super.dispose(); super.dispose();
} }

View File

@@ -1144,7 +1144,7 @@ class _HeaderControlState extends State<HeaderControl> {
arguments: widget.controller) arguments: widget.controller)
}, },
child: Text( child: Text(
"屏蔽管理(${widget.controller.danmakuFilterRule.length})")), "屏蔽管理(${widget.controller.danmakuFilterRule.length + (widget.controller.dmRegExp?.pattern.split('|').length ?? 0)})")),
], ],
), ),
Padding( Padding(

View File

@@ -257,6 +257,7 @@ class PlPlayerController {
/// 弹幕权重 /// 弹幕权重
int danmakuWeight = 0; int danmakuWeight = 0;
List danmakuFilterRule = []; List danmakuFilterRule = [];
RegExp? dmRegExp;
// 关联弹幕控制器 // 关联弹幕控制器
DanmakuController? danmakuController; DanmakuController? danmakuController;
bool showDanmaku = true; bool showDanmaku = true;
@@ -392,8 +393,19 @@ class PlPlayerController {
isOpenDanmu.value = isOpenDanmu.value =
setting.get(SettingBoxKey.enableShowDanmaku, defaultValue: true); setting.get(SettingBoxKey.enableShowDanmaku, defaultValue: true);
danmakuWeight = setting.get(SettingBoxKey.danmakuWeight, defaultValue: 0); danmakuWeight = setting.get(SettingBoxKey.danmakuWeight, defaultValue: 0);
danmakuFilterRule = GStorage.localCache List regex = [];
List rules = GStorage.localCache
.get(LocalCacheKey.danmakuFilterRule, defaultValue: []); .get(LocalCacheKey.danmakuFilterRule, defaultValue: []);
danmakuFilterRule = rules.where((item) {
if (item['type'] != 1) {
return true;
} else {
regex.add(item['filter']);
return false;
}
}).toList();
dmRegExp =
regex.isNotEmpty ? RegExp(regex.join('|'), caseSensitive: false) : null;
blockTypes = setting.get(SettingBoxKey.danmakuBlockType, defaultValue: []); blockTypes = setting.get(SettingBoxKey.danmakuBlockType, defaultValue: []);
showArea = setting.get(SettingBoxKey.danmakuShowArea, defaultValue: 0.5); showArea = setting.get(SettingBoxKey.danmakuShowArea, defaultValue: 0.5);
// 不透明度 // 不透明度