diff --git a/lib/common/widgets/video_popup_menu.dart b/lib/common/widgets/video_popup_menu.dart index 51ef73690..e1eddcea4 100644 --- a/lib/common/widgets/video_popup_menu.dart +++ b/lib/common/widgets/video_popup_menu.dart @@ -262,9 +262,7 @@ class VideoCustomActions { act: 5, reSrc: 11, ); - List blackMidsList = GStorage.blackMidsList; - blackMidsList.insert(0, videoItem.owner.mid); - GStorage.setBlackMidsList(blackMidsList); + GStorage.setBlackMid(videoItem.owner.mid); Get.back(); SmartDialog.showToast(res['msg'] ?? '成功'); }, diff --git a/lib/http/search.dart b/lib/http/search.dart index f0633065f..6ea1d9e53 100644 --- a/lib/http/search.dart +++ b/lib/http/search.dart @@ -106,11 +106,11 @@ class SearchHttp { try { switch (searchType) { case SearchType.video: - List blackMidsList = GStorage.blackMidsList; + Set 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']); diff --git a/lib/http/video.dart b/lib/http/video.dart index f07cb3ab7..38a162118 100644 --- a/lib/http/video.dart +++ b/lib/http/video.dart @@ -50,12 +50,11 @@ class VideoHttp { ); if (res.data['code'] == 0) { List list = []; - List blackMidsList = GStorage.blackMidsList; + Set 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 list = []; - List blackMidsList = GStorage.blackMidsList; + Set 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 list = []; - List blackMidsList = GStorage.blackMidsList; + Set 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 list = []; - List blackMidsList = GStorage.blackMidsList; + Set 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 list = []; - List blackMidsList = GStorage.blackMidsList; + Set 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'])) { diff --git a/lib/pages/blacklist/index.dart b/lib/pages/blacklist/index.dart index c980d1f52..b4f0cb3ef 100644 --- a/lib/pages/blacklist/index.dart +++ b/lib/pages/blacklist/index.dart @@ -26,11 +26,12 @@ class _BlackListPageState extends State { @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() : []; - GStorage.setBlackMidsList( - list.isNotEmpty ? list.map((e) => e.mid!).toList() : []); + GStorage.blackMids = list.map((e) => e.mid!).toSet(); super.dispose(); } diff --git a/lib/pages/rcmd/controller.dart b/lib/pages/rcmd/controller.dart index 6a1d8be5f..c15a888a4 100644 --- a/lib/pages/rcmd/controller.dart +++ b/lib/pages/rcmd/controller.dart @@ -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 diff --git a/lib/utils/set_int_adapter.dart b/lib/utils/set_int_adapter.dart new file mode 100644 index 000000000..2179ed85a --- /dev/null +++ b/lib/utils/set_int_adapter.dart @@ -0,0 +1,26 @@ +import 'package:hive/hive.dart'; + +class SetIntAdapter extends TypeAdapter> { + @override + final int typeId = 11; + + @override + Set read(BinaryReader reader) { + return reader.readIntList().toSet(); + } + + @override + void write(BinaryWriter writer, Set 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; +} diff --git a/lib/utils/storage.dart b/lib/utils/storage.dart index 1dcab52a7..150044f2e 100644 --- a/lib/utils/storage.dart +++ b/lib/utils/storage.dart @@ -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 get dynamicDetailRatio => List.from(setting .get(SettingBoxKey.dynamicDetailRatio, defaultValue: [60.0, 40.0])); - static List get blackMidsList => List.from(GStorage.localCache - .get(LocalCacheKey.blackMidsList, defaultValue: [])); + static Set get blackMids => + GStorage.localCache.get(LocalCacheKey.blackMids, defaultValue: {}); + + static set blackMids(Set 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) 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'],