From 81c88451bf1d8e5e31d4209c83a076ac55368845 Mon Sep 17 00:00:00 2001 From: bggRGjQaUbCoE Date: Tue, 12 Nov 2024 14:16:54 +0800 Subject: [PATCH] opt: sponsor block Signed-off-by: bggRGjQaUbCoE --- lib/http/init.dart | 2 +- lib/http/login.dart | 2 +- lib/pages/setting/sponsor_block_page.dart | 97 ++++++++++++++++++++--- lib/pages/video/detail/controller.dart | 8 +- lib/utils/storage.dart | 4 + 5 files changed, 99 insertions(+), 14 deletions(-) diff --git a/lib/http/init.dart b/lib/http/init.dart index bf82c3edf..1a8324d4e 100644 --- a/lib/http/init.dart +++ b/lib/http/init.dart @@ -189,7 +189,7 @@ class Request { /* * get请求 */ - Future get(url, {data, options, cancelToken, extra}) async { + Future get(url, {data, options, cancelToken, extra}) async { Response response; if (extra != null) { if (extra['ua'] != null) { diff --git a/lib/http/login.dart b/lib/http/login.dart index daeb2e7e4..ccea4d3a6 100644 --- a/lib/http/login.dart +++ b/lib/http/login.dart @@ -80,7 +80,7 @@ class LoginHttp { 'data': CaptchaDataModel.fromJson(res.data['data']), }; } else { - return {'status': false, 'data': res.message}; + return {'status': false, 'data': res.data['message']}; } } diff --git a/lib/pages/setting/sponsor_block_page.dart b/lib/pages/setting/sponsor_block_page.dart index efca8d276..2ab2d51cc 100644 --- a/lib/pages/setting/sponsor_block_page.dart +++ b/lib/pages/setting/sponsor_block_page.dart @@ -2,7 +2,7 @@ import 'dart:math'; import 'package:PiliPalaX/common/widgets/pair.dart'; import 'package:PiliPalaX/http/constants.dart'; -import 'package:PiliPalaX/pages/setting/widgets/select_item.dart'; +import 'package:PiliPalaX/http/index.dart'; import 'package:PiliPalaX/pages/video/detail/controller.dart' show SegmentType, SegmentTypeExt, SkipType, SkipTypeExt; import 'package:PiliPalaX/utils/storage.dart'; @@ -28,6 +28,8 @@ class _SponsorBlockPageState extends State { late String _userId; late bool _blockToast; late String _blockServer; + late bool _blockTrack; + bool? _serverStatus; @override void initState() { @@ -38,6 +40,8 @@ class _SponsorBlockPageState extends State { _userId = GStorage.blockUserID; _blockToast = GStorage.blockToast; _blockServer = GStorage.blockServer; + _blockTrack = GStorage.blockTrack; + _checkServerStatus(); } @override @@ -46,9 +50,21 @@ class _SponsorBlockPageState extends State { super.dispose(); } - TextStyle get _titleStyle => TextStyle(fontSize: 15); - TextStyle get _subTitleStyle => - TextStyle(color: Theme.of(context).colorScheme.outline); + TextStyle get _titleStyle => TextStyle(fontSize: 14); + TextStyle get _subTitleStyle => TextStyle( + fontSize: 12, + color: Theme.of(context).colorScheme.outline, + ); + + _checkServerStatus() { + Request().get('$_blockServer/api/status').then((res) { + if (res.data is Map) { + setState(() { + _serverStatus = res.data['uptime'] != null; + }); + } + }); + } Widget get _blockLimitItem => ListTile( dense: true, @@ -184,6 +200,12 @@ class _SponsorBlockPageState extends State { setState(() {}); } + void _updateBlockTrack() async { + _blockTrack = !_blockTrack; + await GStorage.setting.put(SettingBoxKey.blockTrack, _blockTrack); + setState(() {}); + } + Widget get _blockToastItem => ListTile( dense: true, onTap: _updateBlockToast, @@ -208,6 +230,30 @@ class _SponsorBlockPageState extends State { ), )); + Widget get _blockTrackItem => ListTile( + dense: true, + onTap: _updateBlockTrack, + title: Text( + '记录跳过片段', + style: _titleStyle, + ), + trailing: Transform.scale( + alignment: Alignment.centerRight, + scale: 0.8, + child: Switch( + thumbIcon: WidgetStateProperty.resolveWith((states) { + if (states.isNotEmpty && states.first == WidgetState.selected) { + return const Icon(Icons.done); + } + return null; + }), + value: _blockTrack, + onChanged: (val) { + _updateBlockTrack(); + }, + ), + )); + Widget get _blockServerItem => ListTile( dense: true, onTap: () { @@ -267,6 +313,30 @@ class _SponsorBlockPageState extends State { ), ); + Widget get _serverStatusItem => ListTile( + dense: true, + onTap: _checkServerStatus, + title: Text( + '服务器状态', + style: _titleStyle, + ), + trailing: Text( + _serverStatus == null + ? '-' + : _serverStatus == true + ? '正常' + : '错误', + style: TextStyle( + fontSize: 13, + color: _serverStatus == null + ? null + : _serverStatus == true + ? Theme.of(context).colorScheme.primary + : Theme.of(context).colorScheme.error, + ), + ), + ); + Widget get _divider => SliverToBoxAdapter( child: Divider( height: 1, @@ -294,10 +364,14 @@ class _SponsorBlockPageState extends State { ), body: CustomScrollView( slivers: [ + _dividerL, + SliverToBoxAdapter(child: _serverStatusItem), _dividerL, SliverToBoxAdapter(child: _blockLimitItem), _divider, SliverToBoxAdapter(child: _blockToastItem), + _divider, + SliverToBoxAdapter(child: _blockTrackItem), _dividerL, SliverList.separated( itemCount: _blockSettings.length, @@ -377,22 +451,23 @@ class _SponsorBlockPageState extends State { ), ), ), - style: TextStyle(fontSize: 15), + style: TextStyle(fontSize: 14), ), TextSpan( text: ' ${_blockSettings[index].first.title}', - style: TextStyle(fontSize: 15), + style: TextStyle(fontSize: 14), ), ], ), ), subtitle: Text( _blockSettings[index].first.description, - style: _blockSettings[index].second == SkipType.disable - ? null - : TextStyle( - color: Theme.of(context).colorScheme.outline, - ), + style: TextStyle( + fontSize: 12, + color: _blockSettings[index].second == SkipType.disable + ? null + : Theme.of(context).colorScheme.outline, + ), ), trailing: PopupMenuButton( initialValue: _blockSettings[index].second, diff --git a/lib/pages/video/detail/controller.dart b/lib/pages/video/detail/controller.dart index 43c394aee..d1438e4d3 100644 --- a/lib/pages/video/detail/controller.dart +++ b/lib/pages/video/detail/controller.dart @@ -58,7 +58,7 @@ extension SegmentTypeExt on SegmentType { '订阅提醒', //interaction '开场', //intro '片尾', //outro - '回顾', //preview + '预览', //preview '非音乐', //music_offtopic '精彩时刻', //poi_highlight '闲聊', //filler @@ -604,6 +604,12 @@ class VideoDetailController extends GetxController if (GStorage.blockToast) { _showBlockToast('已跳过${item.segmentType.shortTitle}片段'); } + if (GStorage.blockTrack) { + Request().post( + '${GStorage.blockServer}/api/viewedVideoSponsorTime', + queryParameters: {'UUID': item.UUID}, + ); + } } catch (e) { debugPrint('failed to skip: $e'); _showBlockToast('${item.segmentType.shortTitle}片段跳过失败'); diff --git a/lib/utils/storage.dart b/lib/utils/storage.dart index 2c60d0a19..fbc427be8 100644 --- a/lib/utils/storage.dart +++ b/lib/utils/storage.dart @@ -67,6 +67,9 @@ class GStorage { static String get blockServer => setting.get(SettingBoxKey.blockServer, defaultValue: HttpString.sponsorBlockBaseUrl); + static bool get blockTrack => + setting.get(SettingBoxKey.blockTrack, defaultValue: true); + static ThemeMode get themeMode { switch (setting.get(SettingBoxKey.themeMode, defaultValue: ThemeType.system.code)) { @@ -246,6 +249,7 @@ class SettingBoxKey { blockUserID = 'blockUserID', blockToast = 'blockToast', blockServer = 'blockServer', + blockTrack = 'blockTrack', // 弹幕相关设置 权重(云屏蔽) 屏蔽类型 显示区域 透明度 字体大小 弹幕时间 描边粗细 字体粗细 danmakuWeight = 'danmakuWeight',