mirror of
https://github.com/HChaZZY/PiliPlus.git
synced 2025-12-06 09:13:48 +08:00
opt: filter danmaku
related #283 Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
@@ -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);
|
||||||
// 不透明度
|
// 不透明度
|
||||||
|
|||||||
Reference in New Issue
Block a user