diff --git a/lib/pages/danmaku/controller.dart b/lib/pages/danmaku/controller.dart index d01aa870..c286efdd 100644 --- a/lib/pages/danmaku/controller.dart +++ b/lib/pages/danmaku/controller.dart @@ -81,6 +81,9 @@ class PlDanmakuController { } bool filterDanmaku(DanmakuElem elem) { + if (plPlayerController.dmRegExp?.hasMatch(elem.content) == true) { + return false; + } for (var filter in plPlayerController.danmakuFilterRule) { switch (filter['type']) { case 0: @@ -88,12 +91,12 @@ class PlDanmakuController { return false; } break; - case 1: - if (RegExp(filter['filter'], caseSensitive: false) - .hasMatch(elem.content)) { - return false; - } - break; + // case 1: + // if (RegExp(filter['filter'], caseSensitive: false) + // .hasMatch(elem.content)) { + // return false; + // } + // break; case 2: if (elem.idStr == filter['filter']) { return false; diff --git a/lib/pages/danmaku_block/index.dart b/lib/pages/danmaku_block/index.dart index 4d867ae0..15fb3627 100644 --- a/lib/pages/danmaku_block/index.dart +++ b/lib/pages/danmaku_block/index.dart @@ -36,21 +36,34 @@ class _DanmakuBlockPageState extends State { } @override - void dispose() async { + void dispose() { + final regExp = RegExp(r'^/(.*)/$'); List> simpleRuleList = _danmakuBlockController .ruleTypes.values .expand((element) => element) .map>((e) { //当正则表达式前后都有"/"时,去掉,避免RegExp解析错误 - if (e.type == 1 && e.filter.startsWith('/') && e.filter.endsWith('/')) { - e.filter = e.filter.substring(1, e.filter.length - 1); + if (e.type == 1) { + String? filter = regExp.firstMatch(e.filter)?.group(1); + if (filter != null) { + e.filter = filter; + } } return e.toMap(); }).toList(); // 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(); - await GStorage.localCache.delete(LocalCacheKey.danmakuFilterRule); GStorage.localCache.put(LocalCacheKey.danmakuFilterRule, simpleRuleList); super.dispose(); } diff --git a/lib/pages/video/detail/widgets/header_control.dart b/lib/pages/video/detail/widgets/header_control.dart index a8a32357..3d14e010 100644 --- a/lib/pages/video/detail/widgets/header_control.dart +++ b/lib/pages/video/detail/widgets/header_control.dart @@ -1144,7 +1144,7 @@ class _HeaderControlState extends State { arguments: widget.controller) }, child: Text( - "屏蔽管理(${widget.controller.danmakuFilterRule.length})")), + "屏蔽管理(${widget.controller.danmakuFilterRule.length + (widget.controller.dmRegExp?.pattern.split('|').length ?? 0)})")), ], ), Padding( diff --git a/lib/plugin/pl_player/controller.dart b/lib/plugin/pl_player/controller.dart index 59b24547..fb35e965 100644 --- a/lib/plugin/pl_player/controller.dart +++ b/lib/plugin/pl_player/controller.dart @@ -257,6 +257,7 @@ class PlPlayerController { /// 弹幕权重 int danmakuWeight = 0; List danmakuFilterRule = []; + RegExp? dmRegExp; // 关联弹幕控制器 DanmakuController? danmakuController; bool showDanmaku = true; @@ -392,8 +393,19 @@ class PlPlayerController { isOpenDanmu.value = setting.get(SettingBoxKey.enableShowDanmaku, defaultValue: true); danmakuWeight = setting.get(SettingBoxKey.danmakuWeight, defaultValue: 0); - danmakuFilterRule = GStorage.localCache + List regex = []; + List rules = GStorage.localCache .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: []); showArea = setting.get(SettingBoxKey.danmakuShowArea, defaultValue: 0.5); // 不透明度