opt: blacklist (#501)

This commit is contained in:
My-Responsitories
2025-03-23 19:13:07 +08:00
committed by GitHub
parent a8428e52d2
commit edf84fcc8f
7 changed files with 58 additions and 29 deletions

View File

@@ -262,9 +262,7 @@ class VideoCustomActions {
act: 5, act: 5,
reSrc: 11, reSrc: 11,
); );
List<int> blackMidsList = GStorage.blackMidsList; GStorage.setBlackMid(videoItem.owner.mid);
blackMidsList.insert(0, videoItem.owner.mid);
GStorage.setBlackMidsList(blackMidsList);
Get.back(); Get.back();
SmartDialog.showToast(res['msg'] ?? '成功'); SmartDialog.showToast(res['msg'] ?? '成功');
}, },

View File

@@ -106,11 +106,11 @@ class SearchHttp {
try { try {
switch (searchType) { switch (searchType) {
case SearchType.video: case SearchType.video:
List<int> blackMidsList = GStorage.blackMidsList; Set<int> blackMids = GStorage.blackMids;
if (res.data['data']['result'] != null) { if (res.data['data']['result'] != null) {
for (var i in res.data['data']['result']) { for (var i in res.data['data']['result']) {
// 屏蔽推广和拉黑用户 // 屏蔽推广和拉黑用户
i['available'] = !blackMidsList.contains(i['mid']); i['available'] = !blackMids.contains(i['mid']);
} }
} }
data = SearchVideoModel.fromJson(res.data['data']); data = SearchVideoModel.fromJson(res.data['data']);

View File

@@ -50,12 +50,11 @@ class VideoHttp {
); );
if (res.data['code'] == 0) { if (res.data['code'] == 0) {
List<RecVideoItemModel> list = []; List<RecVideoItemModel> list = [];
List<int> blackMidsList = GStorage.blackMidsList; Set<int> blackMids = GStorage.blackMids;
for (var i in res.data['data']['item']) { for (var i in res.data['data']['item']) {
//过滤掉live与ad以及拉黑用户 //过滤掉live与ad以及拉黑用户
if (i['goto'] == 'av' && if (i['goto'] == 'av' &&
(i['owner'] != null && (i['owner'] != null && !blackMids.contains(i['owner']['mid']))) {
!blackMidsList.contains(i['owner']['mid']))) {
RecVideoItemModel videoItem = RecVideoItemModel.fromJson(i); RecVideoItemModel videoItem = RecVideoItemModel.fromJson(i);
if (!RecommendFilter.filter(videoItem)) { if (!RecommendFilter.filter(videoItem)) {
list.add(videoItem); list.add(videoItem);
@@ -120,15 +119,14 @@ class VideoHttp {
); );
if (res.data['code'] == 0) { if (res.data['code'] == 0) {
List<RecVideoItemAppModel> list = []; List<RecVideoItemAppModel> list = [];
List<int> blackMidsList = GStorage.blackMidsList; Set<int> blackMids = GStorage.blackMids;
for (var i in res.data['data']['items']) { for (var i in res.data['data']['items']) {
// 屏蔽推广和拉黑用户 // 屏蔽推广和拉黑用户
if (i['card_goto'] != 'ad_av' && if (i['card_goto'] != 'ad_av' &&
i['card_goto'] != 'ad_web_s' && i['card_goto'] != 'ad_web_s' &&
i['ad_info'] == null && i['ad_info'] == null &&
(!enableRcmdDynamic ? i['card_goto'] != 'picture' : true) && (!enableRcmdDynamic ? i['card_goto'] != 'picture' : true) &&
(i['args'] != null && (i['args'] != null && !blackMids.contains(i['args']['up_id']))) {
!blackMidsList.contains(i['args']['up_id']))) {
// if (zoneRegExp.pattern.isNotEmpty && // if (zoneRegExp.pattern.isNotEmpty &&
// i['args']?['rname'] != null && // i['args']?['rname'] != null &&
// zoneRegExp.hasMatch(i['args']['rname'])) { // zoneRegExp.hasMatch(i['args']['rname'])) {
@@ -155,9 +153,9 @@ class VideoHttp {
); );
if (res.data['code'] == 0) { if (res.data['code'] == 0) {
List<HotVideoItemModel> list = []; List<HotVideoItemModel> list = [];
List<int> blackMidsList = GStorage.blackMidsList; Set<int> blackMids = GStorage.blackMids;
for (var i in res.data['data']['list']) { for (var i in res.data['data']['list']) {
if (!blackMidsList.contains(i['owner']['mid']) && if (!blackMids.contains(i['owner']['mid']) &&
!RecommendFilter.filterTitle(i['title']) && !RecommendFilter.filterTitle(i['title']) &&
!RecommendFilter.filterLikeRatio( !RecommendFilter.filterLikeRatio(
i['stat']['like'], i['stat']['view'])) { i['stat']['like'], i['stat']['view'])) {
@@ -179,9 +177,9 @@ class VideoHttp {
dynamic res = await GrpcRepo.popular(idx); dynamic res = await GrpcRepo.popular(idx);
if (res['status']) { if (res['status']) {
List<card.Card> list = []; List<card.Card> list = [];
List<int> blackMidsList = GStorage.blackMidsList; Set<int> blackMids = GStorage.blackMids;
for (card.Card item in res['data']) { for (card.Card item in res['data']) {
if (!blackMidsList.contains(item.smallCoverV5.up.id.toInt())) { if (!blackMids.contains(item.smallCoverV5.up.id.toInt())) {
list.add(item); list.add(item);
} }
} }
@@ -1085,9 +1083,9 @@ class VideoHttp {
var res = await Request().get(rankApi); var res = await Request().get(rankApi);
if (res.data['code'] == 0) { if (res.data['code'] == 0) {
List<HotVideoItemModel> list = []; List<HotVideoItemModel> list = [];
List<int> blackMidsList = GStorage.blackMidsList; Set<int> blackMids = GStorage.blackMids;
for (var i in res.data['data']['list']) { for (var i in res.data['data']['list']) {
if (!blackMidsList.contains(i['owner']['mid']) && if (!blackMids.contains(i['owner']['mid']) &&
!RecommendFilter.filterTitle(i['title']) && !RecommendFilter.filterTitle(i['title']) &&
!RecommendFilter.filterLikeRatio( !RecommendFilter.filterLikeRatio(
i['stat']['like'], i['stat']['view'])) { i['stat']['like'], i['stat']['view'])) {

View File

@@ -26,11 +26,12 @@ class _BlackListPageState extends State<BlackListPage> {
@override @override
void dispose() { void dispose() {
List list = _blackListController.loadingState.value is Success final list = _blackListController.loadingState.value is Success
? (_blackListController.loadingState.value as Success).response ? ((_blackListController.loadingState.value as Success).response
as List)
.cast<BlackListItem>()
: <BlackListItem>[]; : <BlackListItem>[];
GStorage.setBlackMidsList( GStorage.blackMids = list.map((e) => e.mid!).toSet();
list.isNotEmpty ? list.map((e) => e.mid!).toList() : <int>[]);
super.dispose(); super.dispose();
} }

View File

@@ -32,10 +32,10 @@ class RcmdController extends CommonController {
bool shouldSaveLast = bool shouldSaveLast =
enableSaveLastData && currentPage == 0 && currentList.isNotEmpty; enableSaveLastData && currentPage == 0 && currentList.isNotEmpty;
if (shouldSaveLast && currentList.length > 500) { if (shouldSaveLast && currentList.length > 500) {
currentList = currentList.sublist(0, 50); currentList.removeRange(50, currentList.length);
} }
lastRefreshAt = shouldSaveLast && savedRcmdTip ? dataList.length : null; lastRefreshAt = shouldSaveLast && savedRcmdTip ? dataList.length : null;
return shouldSaveLast ? dataList + currentList : null; return shouldSaveLast ? (dataList..addAll(currentList)) : null;
} }
@override @override

View File

@@ -0,0 +1,26 @@
import 'package:hive/hive.dart';
class SetIntAdapter extends TypeAdapter<Set<int>> {
@override
final int typeId = 11;
@override
Set<int> read(BinaryReader reader) {
return reader.readIntList().toSet();
}
@override
void write(BinaryWriter writer, Set<int> obj) {
writer.writeIntList(obj.toList());
}
@override
int get hashCode => typeId.hashCode;
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is SetIntAdapter &&
runtimeType == other.runtimeType &&
typeId == other.typeId;
}

View File

@@ -26,6 +26,7 @@ import 'package:PiliPlus/utils/accounts/account_adapter.dart';
import 'package:PiliPlus/utils/accounts/cookie_jar_adapter.dart'; import 'package:PiliPlus/utils/accounts/cookie_jar_adapter.dart';
import 'package:PiliPlus/utils/accounts/account_type_adapter.dart'; import 'package:PiliPlus/utils/accounts/account_type_adapter.dart';
import 'package:PiliPlus/utils/login.dart'; import 'package:PiliPlus/utils/login.dart';
import 'package:PiliPlus/utils/set_int_adapter.dart';
import 'package:cookie_jar/cookie_jar.dart'; import 'package:cookie_jar/cookie_jar.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:hive_flutter/hive_flutter.dart'; import 'package:hive_flutter/hive_flutter.dart';
@@ -434,15 +435,18 @@ class GStorage {
static List<double> get dynamicDetailRatio => List<double>.from(setting static List<double> get dynamicDetailRatio => List<double>.from(setting
.get(SettingBoxKey.dynamicDetailRatio, defaultValue: [60.0, 40.0])); .get(SettingBoxKey.dynamicDetailRatio, defaultValue: [60.0, 40.0]));
static List<int> get blackMidsList => List<int>.from(GStorage.localCache static Set<int> get blackMids =>
.get(LocalCacheKey.blackMidsList, defaultValue: <int>[])); GStorage.localCache.get(LocalCacheKey.blackMids, defaultValue: <int>{});
static set blackMids(Set<int> blackMidsSet) {
GStorage.localCache.put(LocalCacheKey.blackMids, blackMidsSet);
}
static RuleFilter get danmakuFilterRule => GStorage.localCache static RuleFilter get danmakuFilterRule => GStorage.localCache
.get(LocalCacheKey.danmakuFilterRules, defaultValue: RuleFilter.empty()); .get(LocalCacheKey.danmakuFilterRules, defaultValue: RuleFilter.empty());
static void setBlackMidsList(blackMidsList) { static void setBlackMid(int mid) {
if (blackMidsList is! List<int>) return; GStorage.localCache.put(LocalCacheKey.blackMids, blackMids..add(mid));
GStorage.localCache.put(LocalCacheKey.blackMidsList, blackMidsList);
} }
static MemberTabType get memberTab => MemberTabType static MemberTabType get memberTab => MemberTabType
@@ -546,6 +550,7 @@ class GStorage {
Hive.registerAdapter(BiliCookieJarAdapter()); Hive.registerAdapter(BiliCookieJarAdapter());
Hive.registerAdapter(LoginAccountAdapter()); Hive.registerAdapter(LoginAccountAdapter());
Hive.registerAdapter(AccountTypeAdapter()); Hive.registerAdapter(AccountTypeAdapter());
Hive.registerAdapter(SetIntAdapter());
Hive.registerAdapter(RuleFilterAdapter()); Hive.registerAdapter(RuleFilterAdapter());
} }
@@ -769,7 +774,7 @@ class LocalCacheKey {
static const String historyPause = 'historyPause', static const String historyPause = 'historyPause',
// 隐私设置-黑名单管理 // 隐私设置-黑名单管理
blackMidsList = 'blackMidsList', blackMids = 'blackMids',
// 弹幕屏蔽规则 // 弹幕屏蔽规则
danmakuFilterRules = 'danmakuFilterRules', danmakuFilterRules = 'danmakuFilterRules',
// // access_key // // access_key
@@ -833,6 +838,7 @@ class Accounts {
await Future.wait([ await Future.wait([
GStorage.localCache.delete('accessKey'), GStorage.localCache.delete('accessKey'),
GStorage.localCache.delete('danmakuFilterRule'), GStorage.localCache.delete('danmakuFilterRule'),
GStorage.localCache.delete('blackMidsList'),
dir.delete(recursive: true), dir.delete(recursive: true),
if (isLogin) if (isLogin)
LoginAccount(cookies, localAccessKey['value'], LoginAccount(cookies, localAccessKey['value'],