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) {
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;

View File

@@ -36,21 +36,34 @@ class _DanmakuBlockPageState extends State<DanmakuBlockPage> {
}
@override
void dispose() async {
void dispose() {
final regExp = RegExp(r'^/(.*)/$');
List<Map<String, dynamic>> simpleRuleList = _danmakuBlockController
.ruleTypes.values
.expand((element) => element)
.map<Map<String, dynamic>>((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();
}

View File

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

View File

@@ -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);
// 不透明度