diff --git a/lib/pages/setting/recommend_setting.dart b/lib/pages/setting/recommend_setting.dart index e987be95..5bdebfc9 100644 --- a/lib/pages/setting/recommend_setting.dart +++ b/lib/pages/setting/recommend_setting.dart @@ -28,6 +28,7 @@ class _RecommendSettingState extends State { // late int filterUnfollowedRatio; late int minDurationForRcmd; late int minLikeRatioForRecommend; + late String banWordForRecommend; @override void initState() { @@ -44,6 +45,8 @@ class _RecommendSettingState extends State { setting.get(SettingBoxKey.minDurationForRcmd, defaultValue: 0); minLikeRatioForRecommend = setting.get(SettingBoxKey.minLikeRatioForRecommend, defaultValue: 0); + banWordForRecommend = + setting.get(SettingBoxKey.banWordForRecommend, defaultValue: ''); } @override @@ -144,6 +147,66 @@ class _RecommendSettingState extends State { } }, ), + ListTile( + dense: false, + leading: const Icon(Icons.title_outlined), + title: Text('标题关键词过滤', style: titleStyle), + subtitle: Text( + banWordForRecommend.isEmpty ? "点击添加" : banWordForRecommend, + style: subTitleStyle, + ), + onTap: () async { + final TextEditingController textController = + TextEditingController(text: banWordForRecommend); + await showDialog( + context: context, + builder: (context) { + return AlertDialog( + title: const Text('标题关键词过滤'), + content: Column(mainAxisSize: MainAxisSize.min, children: [ + const Text('使用空格隔开,如:尝试 测试'), + TextField( + controller: textController, + //decoration: InputDecoration(hintText: hintText), + ) + ]), + actions: [ + TextButton( + child: const Text('清空'), + onPressed: () { + textController.text = ''; + }, + ), + TextButton( + child: const Text('取消'), + onPressed: () { + Navigator.of(context).pop(); + SmartDialog.showToast('关键词未被修改'); + }, + ), + TextButton( + child: const Text('保存'), + onPressed: () async { + Navigator.of(context).pop(); + String filter = textController.text.trim(); + banWordForRecommend = filter; + setting.put(SettingBoxKey.banWordForRecommend, + banWordForRecommend); + setState(() {}); + RecommendFilter.update(); + if (filter.isNotEmpty) { + SmartDialog.showToast('已保存:$banWordForRecommend'); + } else { + SmartDialog.showToast('已清除全部关键词'); + } + }, + ), + ], + ); + }, + ); + }, + ), ListTile( dense: false, title: Text('视频时长过滤', style: titleStyle), diff --git a/lib/utils/recommend_filter.dart b/lib/utils/recommend_filter.dart index e6cc58de..1e2ee416 100644 --- a/lib/utils/recommend_filter.dart +++ b/lib/utils/recommend_filter.dart @@ -8,6 +8,7 @@ class RecommendFilter { static late int minLikeRatioForRecommend; static late bool exemptFilterForFollowed; static late bool applyFilterToRelatedVideos; + static late List banWordList; RecommendFilter() { update(); } @@ -20,6 +21,9 @@ class RecommendFilter { setting.get(SettingBoxKey.minDurationForRcmd, defaultValue: 0); minLikeRatioForRecommend = setting.get(SettingBoxKey.minLikeRatioForRecommend, defaultValue: 0); + banWordList = (setting.get(SettingBoxKey.banWordForRecommend, + defaultValue: '') as String) + .split(' '); exemptFilterForFollowed = setting.get(SettingBoxKey.exemptFilterForFollowed, defaultValue: true); applyFilterToRelatedVideos = setting @@ -47,6 +51,9 @@ class RecommendFilter { minLikeRatioForRecommend * videoItem.stat.view) { return true; } + for (var word in banWordList) { + if (word.isNotEmpty && videoItem.title.contains(word)) return true; + } return false; } } diff --git a/lib/utils/storage.dart b/lib/utils/storage.dart index 3808d238..ba1aa973 100644 --- a/lib/utils/storage.dart +++ b/lib/utils/storage.dart @@ -170,6 +170,7 @@ class SettingBoxKey { minDurationForRcmd = 'minDurationForRcmd', minLikeRatioForRecommend = 'minLikeRatioForRecommend', exemptFilterForFollowed = 'exemptFilterForFollowed', + banWordForRecommend = 'banWordForRecommend', //filterUnfollowedRatio = 'filterUnfollowedRatio', applyFilterToRelatedVideos = 'applyFilterToRelatedVideos',