From 51244c58f90a3598a671ff5bd822132649d04456 Mon Sep 17 00:00:00 2001 From: orz12 Date: Thu, 4 Apr 2024 11:05:23 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E5=BC=B9=E5=B9=95?= =?UTF-8?q?=E6=8C=89=E7=AD=89=E7=BA=A7=E4=BA=91=E5=B1=8F=E8=94=BD=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/pages/danmaku/controller.dart | 19 +++++++- lib/pages/danmaku/view.dart | 6 +-- .../video/detail/widgets/header_control.dart | 44 +++++++++++++++++++ lib/plugin/pl_player/controller.dart | 6 +++ lib/utils/storage.dart | 3 +- 5 files changed, 72 insertions(+), 6 deletions(-) diff --git a/lib/pages/danmaku/controller.dart b/lib/pages/danmaku/controller.dart index 0d93c631..a998303f 100644 --- a/lib/pages/danmaku/controller.dart +++ b/lib/pages/danmaku/controller.dart @@ -1,9 +1,12 @@ import 'package:PiliPalaX/http/danmaku.dart'; import 'package:PiliPalaX/models/danmaku/dm.pb.dart'; +import 'package:flutter/cupertino.dart'; class PlDanmakuController { - PlDanmakuController(this.cid); + PlDanmakuController(this.cid, this.danmakuWeightNotifier); final int cid; + final ValueNotifier danmakuWeightNotifier; + int danmakuWeight = 0; Map> dmSegMap = {}; // 已请求的段落标记 List requestedSeg = []; @@ -16,6 +19,11 @@ class PlDanmakuController { if (videoDuration <= 0) { return; } + danmakuWeightNotifier.addListener(() { + print( + "danmakuWeight changed from $danmakuWeight to ${danmakuWeightNotifier.value}"); + danmakuWeight = danmakuWeightNotifier.value; + }); if (requestedSeg.isEmpty) { int segCount = (videoDuration / segmentLength).ceil(); requestedSeg = List.generate(segCount, (index) => false); @@ -59,6 +67,13 @@ class PlDanmakuController { if (!requestedSeg[segmentIndex]) { queryDanmaku(segmentIndex); } - return dmSegMap[progress ~/ 100]; + if (danmakuWeight == 0) { + return dmSegMap[progress ~/ 100]; + } else { + //using filter + return dmSegMap[progress ~/ 100] + ?.where((element) => element.weight >= danmakuWeight) + .toList(); + } } } diff --git a/lib/pages/danmaku/view.dart b/lib/pages/danmaku/view.dart index 33165ce9..ea7e0577 100644 --- a/lib/pages/danmaku/view.dart +++ b/lib/pages/danmaku/view.dart @@ -43,7 +43,8 @@ class _PlDanmakuState extends State { super.initState(); enableShowDanmaku = setting.get(SettingBoxKey.enableShowDanmaku, defaultValue: false); - _plDanmakuController = PlDanmakuController(widget.cid); + _plDanmakuController = PlDanmakuController( + widget.cid, widget.playerController.danmakuWeight); if (mounted) { playerController = widget.playerController; if (enableShowDanmaku || playerController.isOpenDanmu.value) { @@ -136,8 +137,7 @@ class _PlDanmakuState extends State { hideTop: blockTypes.contains(5), hideScroll: blockTypes.contains(2), hideBottom: blockTypes.contains(4), - duration: - danmakuDurationVal / playerController.playbackSpeed, + duration: danmakuDurationVal / playerController.playbackSpeed, strokeWidth: strokeWidth, // initDuration / // (danmakuSpeedVal * widget.playerController.playbackSpeed), diff --git a/lib/pages/video/detail/widgets/header_control.dart b/lib/pages/video/detail/widgets/header_control.dart index 493d26ae..ce8b41d6 100644 --- a/lib/pages/video/detail/widgets/header_control.dart +++ b/lib/pages/video/detail/widgets/header_control.dart @@ -23,6 +23,7 @@ import '../../../../models/video_detail_res.dart'; import '../../../../services/service_locator.dart'; import '../introduction/index.dart'; import 'package:marquee/marquee.dart'; +import '../../../danmaku/controller.dart'; class HeaderControl extends StatefulWidget implements PreferredSizeWidget { const HeaderControl({ @@ -714,6 +715,9 @@ class _HeaderControlState extends State { {'value': 0.75, 'label': '3/4屏'}, {'value': 1.0, 'label': '满屏'}, ]; + // 智能云屏蔽 + int danmakuWeight = widget.controller!.danmakuWeight.value; + // 显示区域 double showArea = widget.controller!.showArea; // 不透明度 double opacityVal = widget.controller!.opacityVal; @@ -752,6 +756,46 @@ class _HeaderControlState extends State { child: Center(child: Text('弹幕设置', style: titleStyle)), ), const SizedBox(height: 10), + Text('智能云屏蔽 $danmakuWeight 级'), + Padding( + padding: const EdgeInsets.only( + top: 0, + bottom: 6, + left: 10, + right: 10, + ), + child: SliderTheme( + data: SliderThemeData( + trackShape: MSliderTrackShape(), + thumbColor: Theme.of(context).colorScheme.primary, + activeTrackColor: Theme.of(context).colorScheme.primary, + trackHeight: 10, + thumbShape: const RoundSliderThumbShape( + enabledThumbRadius: 6.0), + ), + child: Slider( + min: 0, + max: 10, + value: danmakuWeight.toDouble(), + divisions: 10, + label: '$danmakuWeight', + onChanged: (double val) { + danmakuWeight = val.toInt(); + widget.controller!.danmakuWeight.value = + danmakuWeight; + widget.controller!.putDanmakuSettings(); + setState(() {}); + // try { + // final DanmakuOption currentOption = + // danmakuController.option; + // final DanmakuOption updatedOption = + // currentOption.copyWith(strokeWidth: val); + // danmakuController.updateOption(updatedOption); + // } catch (_) {} + }, + ), + ), + ), const Text('按类型屏蔽'), Padding( padding: const EdgeInsets.only(top: 12, bottom: 18), diff --git a/lib/plugin/pl_player/controller.dart b/lib/plugin/pl_player/controller.dart index c1e8f959..705e5c1c 100644 --- a/lib/plugin/pl_player/controller.dart +++ b/lib/plugin/pl_player/controller.dart @@ -228,6 +228,9 @@ class PlPlayerController { /// 弹幕开关 Rx isOpenDanmu = false.obs; + + /// 弹幕权重 + ValueNotifier danmakuWeight = ValueNotifier(0); // 关联弹幕控制器 DanmakuController? danmakuController; // 弹幕相关配置 @@ -277,6 +280,8 @@ class PlPlayerController { _videoType = videoType; isOpenDanmu.value = setting.get(SettingBoxKey.enableShowDanmaku, defaultValue: false); + danmakuWeight.value = + localCache.get(LocalCacheKey.danmakuWeight, defaultValue: 0); blockTypes = localCache.get(LocalCacheKey.danmakuBlockType, defaultValue: []); showArea = localCache.get(LocalCacheKey.danmakuShowArea, defaultValue: 0.5); @@ -1121,6 +1126,7 @@ class PlPlayerController { } void putDanmakuSettings() { + localCache.put(LocalCacheKey.danmakuWeight, danmakuWeight.value); localCache.put(LocalCacheKey.danmakuBlockType, blockTypes); localCache.put(LocalCacheKey.danmakuShowArea, showArea); localCache.put(LocalCacheKey.danmakuOpacity, opacityVal); diff --git a/lib/utils/storage.dart b/lib/utils/storage.dart index 767de0e5..0932a23c 100644 --- a/lib/utils/storage.dart +++ b/lib/utils/storage.dart @@ -164,7 +164,8 @@ class LocalCacheKey { wbiKeys = 'wbiKeys', timeStamp = 'timeStamp', - // 弹幕相关设置 屏蔽类型 显示区域 透明度 字体大小 弹幕时间 描边粗细 + // 弹幕相关设置 权重(云屏蔽) 屏蔽类型 显示区域 透明度 字体大小 弹幕时间 描边粗细 + danmakuWeight = 'danmakuWeight', danmakuBlockType = 'danmakuBlockType', danmakuShowArea = 'danmakuShowArea', danmakuOpacity = 'danmakuOpacity',