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,
reSrc: 11,
);
List<int> blackMidsList = GStorage.blackMidsList;
blackMidsList.insert(0, videoItem.owner.mid);
GStorage.setBlackMidsList(blackMidsList);
GStorage.setBlackMid(videoItem.owner.mid);
Get.back();
SmartDialog.showToast(res['msg'] ?? '成功');
},

View File

@@ -106,11 +106,11 @@ class SearchHttp {
try {
switch (searchType) {
case SearchType.video:
List<int> blackMidsList = GStorage.blackMidsList;
Set<int> blackMids = GStorage.blackMids;
if (res.data['data']['result'] != null) {
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']);

View File

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

View File

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

View File

@@ -32,10 +32,10 @@ class RcmdController extends CommonController {
bool shouldSaveLast =
enableSaveLastData && currentPage == 0 && currentList.isNotEmpty;
if (shouldSaveLast && currentList.length > 500) {
currentList = currentList.sublist(0, 50);
currentList.removeRange(50, currentList.length);
}
lastRefreshAt = shouldSaveLast && savedRcmdTip ? dataList.length : null;
return shouldSaveLast ? dataList + currentList : null;
return shouldSaveLast ? (dataList..addAll(currentList)) : null;
}
@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/account_type_adapter.dart';
import 'package:PiliPlus/utils/login.dart';
import 'package:PiliPlus/utils/set_int_adapter.dart';
import 'package:cookie_jar/cookie_jar.dart';
import 'package:flutter/material.dart';
import 'package:hive_flutter/hive_flutter.dart';
@@ -434,15 +435,18 @@ class GStorage {
static List<double> get dynamicDetailRatio => List<double>.from(setting
.get(SettingBoxKey.dynamicDetailRatio, defaultValue: [60.0, 40.0]));
static List<int> get blackMidsList => List<int>.from(GStorage.localCache
.get(LocalCacheKey.blackMidsList, defaultValue: <int>[]));
static Set<int> get blackMids =>
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
.get(LocalCacheKey.danmakuFilterRules, defaultValue: RuleFilter.empty());
static void setBlackMidsList(blackMidsList) {
if (blackMidsList is! List<int>) return;
GStorage.localCache.put(LocalCacheKey.blackMidsList, blackMidsList);
static void setBlackMid(int mid) {
GStorage.localCache.put(LocalCacheKey.blackMids, blackMids..add(mid));
}
static MemberTabType get memberTab => MemberTabType
@@ -546,6 +550,7 @@ class GStorage {
Hive.registerAdapter(BiliCookieJarAdapter());
Hive.registerAdapter(LoginAccountAdapter());
Hive.registerAdapter(AccountTypeAdapter());
Hive.registerAdapter(SetIntAdapter());
Hive.registerAdapter(RuleFilterAdapter());
}
@@ -769,7 +774,7 @@ class LocalCacheKey {
static const String historyPause = 'historyPause',
// 隐私设置-黑名单管理
blackMidsList = 'blackMidsList',
blackMids = 'blackMids',
// 弹幕屏蔽规则
danmakuFilterRules = 'danmakuFilterRules',
// // access_key
@@ -833,6 +838,7 @@ class Accounts {
await Future.wait([
GStorage.localCache.delete('accessKey'),
GStorage.localCache.delete('danmakuFilterRule'),
GStorage.localCache.delete('blackMidsList'),
dir.delete(recursive: true),
if (isLogin)
LoginAccount(cookies, localAccessKey['value'],