From cc1951c72106c6ee4e694ab8a7c1d73e2ede0a91 Mon Sep 17 00:00:00 2001 From: My-Responsitories <107370289+My-Responsitories@users.noreply.github.com> Date: Fri, 21 Feb 2025 02:42:28 +0000 Subject: [PATCH] fix regex & use set in uid (#296) * fix regex count & use set in uid * fix regex --- lib/pages/danmaku/controller.dart | 29 +++---------------- lib/pages/danmaku_block/index.dart | 23 ++++++++------- .../video/detail/widgets/header_control.dart | 2 +- lib/plugin/pl_player/controller.dart | 28 +++++++++++------- 4 files changed, 35 insertions(+), 47 deletions(-) diff --git a/lib/pages/danmaku/controller.dart b/lib/pages/danmaku/controller.dart index c286efdd..5fedd856 100644 --- a/lib/pages/danmaku/controller.dart +++ b/lib/pages/danmaku/controller.dart @@ -69,7 +69,7 @@ class PlDanmakuController { queryDanmaku(segmentIndex); } if (plPlayerController.danmakuWeight == 0 && - plPlayerController.danmakuFilterRule.isEmpty) { + plPlayerController.filterCount == 0) { return dmSegMap[progress ~/ 100]; } else { return dmSegMap[progress ~/ 100] @@ -81,29 +81,8 @@ 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: - if (elem.content.contains(filter['filter'])) { - 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; - } - break; - } - } - return true; + return !(plPlayerController.dmUid.contains(elem.content) || + plPlayerController.dmFilterString.any((i) => elem.content.contains(i)) || + plPlayerController.dmRegExp.any((i) => i.hasMatch(elem.content))); } } diff --git a/lib/pages/danmaku_block/index.dart b/lib/pages/danmaku_block/index.dart index 15fb3627..bc2b7d4e 100644 --- a/lib/pages/danmaku_block/index.dart +++ b/lib/pages/danmaku_block/index.dart @@ -52,17 +52,20 @@ class _DanmakuBlockPageState extends State { return e.toMap(); }).toList(); // debugPrint("simpleRuleList:$simpleRuleList"); - List regex = []; - plPlayerController.danmakuFilterRule = simpleRuleList.where((item) { - if (item['type'] != 1) { - return true; - } else { - regex.add(item['filter']); - return false; + plPlayerController.filterCount = simpleRuleList.length; + simpleRuleList.forEach((item) { + switch (item['type']) { + case 0: + plPlayerController.dmFilterString.add(item['filter']); + break; + case 1: + plPlayerController.dmRegExp.add(RegExp(item['filter'], caseSensitive: false)); + break; + case 2: + plPlayerController.dmUid.add(item['filter']); + break; } - }).toList(); - plPlayerController.dmRegExp = - regex.isNotEmpty ? RegExp(regex.join('|'), caseSensitive: false) : null; + }); scrollController.dispose(); 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 ba8eb741..4a9b689b 100644 --- a/lib/pages/video/detail/widgets/header_control.dart +++ b/lib/pages/video/detail/widgets/header_control.dart @@ -1150,7 +1150,7 @@ class _HeaderControlState extends State { arguments: widget.controller) }, child: Text( - "屏蔽管理(${widget.controller.danmakuFilterRule.length + (widget.controller.dmRegExp?.pattern.split('|').length ?? 0)})")), + "屏蔽管理(${widget.controller.filterCount})")), ], ), Padding( diff --git a/lib/plugin/pl_player/controller.dart b/lib/plugin/pl_player/controller.dart index fb35e965..9cc28c38 100644 --- a/lib/plugin/pl_player/controller.dart +++ b/lib/plugin/pl_player/controller.dart @@ -256,8 +256,10 @@ class PlPlayerController { /// 弹幕权重 int danmakuWeight = 0; - List danmakuFilterRule = []; - RegExp? dmRegExp; + int filterCount = 0; + List dmFilterString = []; + List dmRegExp = []; + Set dmUid = {}; // 关联弹幕控制器 DanmakuController? danmakuController; bool showDanmaku = true; @@ -396,16 +398,20 @@ class PlPlayerController { 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; + filterCount = rules.length; + rules.forEach((item) { + switch (item['type']) { + case 0: + dmFilterString.add(item['filter']); + break; + case 1: + dmRegExp.add(RegExp(item['filter'], caseSensitive: false)); + break; + case 2: + dmUid.add(item['filter']); + break; } - }).toList(); - dmRegExp = - regex.isNotEmpty ? RegExp(regex.join('|'), caseSensitive: false) : null; + }); blockTypes = setting.get(SettingBoxKey.danmakuBlockType, defaultValue: []); showArea = setting.get(SettingBoxKey.danmakuShowArea, defaultValue: 0.5); // 不透明度