diff --git a/lib/http/api.dart b/lib/http/api.dart index 75a121ac..ccbb3bb3 100644 --- a/lib/http/api.dart +++ b/lib/http/api.dart @@ -1,8 +1,10 @@ +import 'constants.dart'; + class Api { // 推荐视频 static const String recommendListApp = - 'https://app.bilibili.com/x/v2/feed/index'; - static const String recommendList = '/x/web-interface/index/top/feed/rcmd'; + '${HttpString.appBaseUrl}/x/v2/feed/index'; + static const String recommendListWeb = '/x/web-interface/index/top/feed/rcmd'; // 热门视频 static const String hotList = '/x/web-interface/popular'; @@ -152,7 +154,7 @@ class Api { // 动态点赞 static const String likeDynamic = - 'https://api.vc.bilibili.com/dynamic_like/v1/dynamic_like/thumb'; + '${HttpString.tUrl}/dynamic_like/v1/dynamic_like/thumb'; // 获取稍后再看 static const String seeYouLater = '/x/v2/history/toview'; @@ -220,13 +222,13 @@ class Api { // 直播 // ?page=1&page_size=30&platform=web static const String liveList = - 'https://api.live.bilibili.com/xlive/web-interface/v1/second/getUserRecommend'; + '${HttpString.liveBaseUrl}/xlive/web-interface/v1/second/getUserRecommend'; // 直播间详情 // cid roomId // qn 80:流畅,150:高清,400:蓝光,10000:原画,20000:4K, 30000:杜比 static const String liveRoomInfo = - 'https://api.live.bilibili.com/xlive/web-room/v2/index/getRoomPlayInfo'; + '${HttpString.liveBaseUrl}/xlive/web-room/v2/index/getRoomPlayInfo'; // 用户信息 需要Wbi签名 // https://api.bilibili.com/x/space/wbi/acc/info?mid=503427686&token=&platform=web&web_location=1550101&w_rid=d709892496ce93e3d94d6d37c95bde91&wts=1689301482 @@ -338,13 +340,13 @@ class Api { /// wts=1697305010 static const String sessionList = - 'https://api.vc.bilibili.com/session_svr/v1/session_svr/get_sessions'; + '${HttpString.tUrl}/session_svr/v1/session_svr/get_sessions'; /// 私聊用户信息 /// uids /// build=0&mobi_app=web static const String sessionAccountList = - 'https://api.vc.bilibili.com/account/v1/user/cards'; + '${HttpString.tUrl}/account/v1/user/cards'; /// https://api.vc.bilibili.com/svr_sync/v1/svr_sync/fetch_session_msgs? /// talker_id=400787461& @@ -358,7 +360,7 @@ class Api { /// wts=1697350697 static const String sessionMsg = - 'https://api.vc.bilibili.com/svr_sync/v1/svr_sync/fetch_session_msgs'; + '${HttpString.tUrl}/svr_sync/v1/svr_sync/fetch_session_msgs'; /// 标记已读 POST /// talker_id: @@ -369,7 +371,7 @@ class Api { /// csrf_token: /// csrf: static const String updateAck = - 'https://api.vc.bilibili.com/session_svr/v1/session_svr/update_ack'; + '${HttpString.tUrl}/session_svr/v1/session_svr/update_ack'; // 获取某个动态详情 // timezone_offset=-480 @@ -388,11 +390,11 @@ class Api { // captcha验证码 static const String getCaptcha = - 'https://passport.bilibili.com/x/passport-login/captcha?source=main_web'; + '${HttpString.passBaseUrl}/x/passport-login/captcha?source=main_web'; // web端短信验证码 static const String smsCode = - 'https://passport.bilibili.com/x/passport-login/web/sms/send'; + '${HttpString.passBaseUrl}/x/passport-login/web/sms/send'; // web端验证码登录 @@ -400,7 +402,7 @@ class Api { // app端短信验证码 static const String appSmsCode = - 'https://passport.bilibili.com/x/passport-login/sms/send'; + '${HttpString.passBaseUrl}/x/passport-login/sms/send'; // app端验证码登录 @@ -414,17 +416,16 @@ class Api { /// key /// rhash static const String loginInByPwdApi = - 'https://passport.bilibili.com/x/passport-login/oauth2/login'; + '${HttpString.passBaseUrl}/x/passport-login/oauth2/login'; /// 密码加密密钥 /// disable_rcmd /// local_id - static const getWebKey = - 'https://passport.bilibili.com/x/passport-login/web/key'; + static const getWebKey = '${HttpString.passBaseUrl}/x/passport-login/web/key'; /// cookie转access_key static const cookieToKey = - 'https://passport.bilibili.com/x/passport-tv-login/h5/qrcode/confirm'; + '${HttpString.passBaseUrl}/x/passport-tv-login/h5/qrcode/confirm'; /// 申请二维码(TV端) static const getTVCode = @@ -432,7 +433,7 @@ class Api { ///扫码登录(TV端) static const qrcodePoll = - 'https://passport.bilibili.com/x/passport-tv-login/qrcode/poll'; + '${HttpString.passBaseUrl}/x/passport-tv-login/qrcode/poll'; /// 置顶视频 static const getTopVideoApi = '/x/space/top/arc'; diff --git a/lib/http/constants.dart b/lib/http/constants.dart index cf10a606..3d749ee8 100644 --- a/lib/http/constants.dart +++ b/lib/http/constants.dart @@ -1,7 +1,10 @@ class HttpString { static const String baseUrl = 'https://www.bilibili.com'; - static const String baseApiUrl = 'https://api.bilibili.com'; + static const String apiBaseUrl = 'https://api.bilibili.com'; static const String tUrl = 'https://api.vc.bilibili.com'; + static const String appBaseUrl = 'https://app.bilibili.com'; + static const String liveBaseUrl = 'https://api.live.bilibili.com'; + static const String passBaseUrl = 'https://passport.bilibili.com'; static const List validateStatusCodes = [ 302, 304, diff --git a/lib/http/init.dart b/lib/http/init.dart index 1e55be38..69a1d0b3 100644 --- a/lib/http/init.dart +++ b/lib/http/init.dart @@ -65,7 +65,7 @@ class Request { // 从cookie中获取 csrf token static Future getCsrf() async { var cookies = await cookieManager.cookieJar - .loadForRequest(Uri.parse(HttpString.baseApiUrl)); + .loadForRequest(Uri.parse(HttpString.apiBaseUrl)); String token = ''; if (cookies.where((e) => e.name == 'bili_jct').isNotEmpty) { token = cookies.firstWhere((e) => e.name == 'bili_jct').value; @@ -91,7 +91,7 @@ class Request { //BaseOptions、Options、RequestOptions 都可以配置参数,优先级别依次递增,且可以根据优先级别覆盖参数 BaseOptions options = BaseOptions( //请求基地址,可以包含子路径 - baseUrl: HttpString.baseApiUrl, + baseUrl: HttpString.apiBaseUrl, //连接服务器超时时间,单位是毫秒. connectTimeout: const Duration(milliseconds: 12000), //响应流上前后两次接受到数据的间隔,单位为毫秒。 diff --git a/lib/http/video.dart b/lib/http/video.dart index 9429a04b..b4622f02 100644 --- a/lib/http/video.dart +++ b/lib/http/video.dart @@ -30,7 +30,7 @@ class VideoHttp { static Future rcmdVideoList({required int ps, required int freshIdx}) async { try { var res = await Request().get( - Api.recommendList, + Api.recommendListWeb, data: { 'version': 1, 'feed_version': 'V3', diff --git a/lib/models/common/rcmd_type.dart b/lib/models/common/rcmd_type.dart new file mode 100644 index 00000000..dbb64b15 --- /dev/null +++ b/lib/models/common/rcmd_type.dart @@ -0,0 +1,7 @@ +// 首页推荐类型 +enum RcmdType { web, app } + +extension RcmdTypeExtension on RcmdType { + String get values => ['web', 'app'][index]; + String get labels => ['web端', 'app端'][index]; +} diff --git a/lib/models/model_rec_video_item.dart b/lib/models/model_rec_video_item.dart index f8c1731b..f857c70f 100644 --- a/lib/models/model_rec_video_item.dart +++ b/lib/models/model_rec_video_item.dart @@ -1,3 +1,5 @@ +import 'package:pilipala/utils/utils.dart'; + import './model_owner.dart'; import 'package:hive/hive.dart'; @@ -56,7 +58,7 @@ class RecVideoItemModel { uri = json["uri"]; pic = json["pic"]; title = json["title"]; - duration = json["duration"].toString(); + duration = Utils.tampToSeektime(json["duration"]); pubdate = json["pubdate"]; owner = Owner.fromJson(json["owner"]); stat = Stat.fromJson(json["stat"]); diff --git a/lib/pages/rcmd/controller.dart b/lib/pages/rcmd/controller.dart index ef5da13b..4ed1ade1 100644 --- a/lib/pages/rcmd/controller.dart +++ b/lib/pages/rcmd/controller.dart @@ -3,20 +3,21 @@ import 'package:get/get.dart'; import 'package:hive/hive.dart'; import 'package:pilipala/http/video.dart'; import 'package:pilipala/models/home/rcmd/result.dart'; -// import 'package:pilipala/models/model_rec_video_item.dart'; +import 'package:pilipala/models/model_rec_video_item.dart'; import 'package:pilipala/utils/storage.dart'; class RcmdController extends GetxController { final ScrollController scrollController = ScrollController(); int _currentPage = 0; - RxList videoList = [].obs; - // RxList videoList = [].obs; + RxList appVideoList = [].obs; + RxList webVideoList = [].obs; bool isLoadingMore = true; OverlayEntry? popupDialog; Box recVideo = GStrorage.recVideo; Box setting = GStrorage.setting; RxInt crossAxisCount = 2.obs; late bool enableSaveLastData; + late String defaultRcmdType = 'web'; @override void onInit() { @@ -24,21 +25,29 @@ class RcmdController extends GetxController { crossAxisCount.value = setting.get(SettingBoxKey.customRows, defaultValue: 2); // 读取app端缓存内容 - if (recVideo.get('cacheList') != null && - recVideo.get('cacheList').isNotEmpty) { - List list = []; - for (var i in recVideo.get('cacheList')) { - list.add(i); - } - videoList.value = list; - } + // if (recVideo.get('cacheList') != null && + // recVideo.get('cacheList').isNotEmpty) { + // List list = []; + // for (var i in recVideo.get('cacheList')) { + // list.add(i); + // } + // videoList.value = list; + // } enableSaveLastData = setting.get(SettingBoxKey.enableSaveLastData, defaultValue: false); + defaultRcmdType = + setting.get(SettingBoxKey.defaultRcmdType, defaultValue: 'web'); } // 获取推荐 Future queryRcmdFeed(type) async { - return await queryRcmdFeedApp(type); + print(defaultRcmdType); + if (defaultRcmdType == 'app') { + return await queryRcmdFeedApp(type); + } + if (defaultRcmdType == 'web') { + return await queryRcmdFeedWeb(type); + } } // 获取app端推荐 @@ -54,19 +63,19 @@ class RcmdController extends GetxController { ); if (res['status']) { if (type == 'init') { - if (videoList.isNotEmpty) { - videoList.addAll(res['data']); + if (appVideoList.isNotEmpty) { + appVideoList.addAll(res['data']); } else { - videoList.value = res['data']; + appVideoList.value = res['data']; } } else if (type == 'onRefresh') { if (enableSaveLastData) { - videoList.insertAll(0, res['data']); + appVideoList.insertAll(0, res['data']); } else { - videoList.value = res['data']; + appVideoList.value = res['data']; } } else if (type == 'onLoad') { - videoList.addAll(res['data']); + appVideoList.addAll(res['data']); } recVideo.put('cacheList', res['data']); _currentPage += 1; @@ -89,19 +98,19 @@ class RcmdController extends GetxController { ); if (res['status']) { if (type == 'init') { - if (videoList.isNotEmpty) { - videoList.addAll(res['data']); + if (webVideoList.isNotEmpty) { + webVideoList.addAll(res['data']); } else { - videoList.value = res['data']; + webVideoList.value = res['data']; } } else if (type == 'onRefresh') { if (enableSaveLastData) { - videoList.insertAll(0, res['data']); + webVideoList.insertAll(0, res['data']); } else { - videoList.value = res['data']; + webVideoList.value = res['data']; } } else if (type == 'onLoad') { - videoList.addAll(res['data']); + webVideoList.addAll(res['data']); } _currentPage += 1; } diff --git a/lib/pages/rcmd/view.dart b/lib/pages/rcmd/view.dart index 717ea9f7..bc3c4a00 100644 --- a/lib/pages/rcmd/view.dart +++ b/lib/pages/rcmd/view.dart @@ -98,12 +98,22 @@ class _RcmdPageState extends State Map data = snapshot.data as Map; if (data['status']) { return Platform.isAndroid || Platform.isIOS - ? Obx(() => contentGrid( - _rcmdController, _rcmdController.videoList)) + ? Obx( + () => contentGrid( + _rcmdController, + _rcmdController.defaultRcmdType == 'web' + ? _rcmdController.webVideoList + : _rcmdController.appVideoList), + ) : SliverLayoutBuilder( builder: (context, boxConstraints) { - return Obx(() => contentGrid( - _rcmdController, _rcmdController.videoList)); + return Obx( + () => contentGrid( + _rcmdController, + _rcmdController.defaultRcmdType == 'web' + ? _rcmdController.webVideoList + : _rcmdController.appVideoList), + ); }); } else { return HttpError( @@ -118,14 +128,14 @@ class _RcmdPageState extends State } } else { // 缓存数据 - if (_rcmdController.videoList.isNotEmpty) { - return contentGrid( - _rcmdController, _rcmdController.videoList); - } - // 骨架屏 - else { - return contentGrid(_rcmdController, []); - } + // if (_rcmdController.videoList.isNotEmpty) { + // return contentGrid( + // _rcmdController, _rcmdController.videoList); + // } + // // 骨架屏 + // else { + return contentGrid(_rcmdController, []); + // } } }, ), diff --git a/lib/pages/setting/extra_setting.dart b/lib/pages/setting/extra_setting.dart index 57c33ff4..b4275815 100644 --- a/lib/pages/setting/extra_setting.dart +++ b/lib/pages/setting/extra_setting.dart @@ -1,7 +1,9 @@ import 'package:flutter/material.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:hive/hive.dart'; +import 'package:pilipala/http/member.dart'; import 'package:pilipala/models/common/dynamics_type.dart'; +import 'package:pilipala/models/common/rcmd_type.dart'; import 'package:pilipala/models/common/reply_sort_type.dart'; import 'package:pilipala/pages/setting/widgets/select_dialog.dart'; import 'package:pilipala/utils/storage.dart'; @@ -18,15 +20,23 @@ class ExtraSetting extends StatefulWidget { class _ExtraSettingState extends State { Box setting = GStrorage.setting; static Box localCache = GStrorage.localCache; + late dynamic defaultRcmdType; late dynamic defaultReplySort; late dynamic defaultDynamicType; late dynamic enableSystemProxy; late String defaultSystemProxyHost; late String defaultSystemProxyPort; + Box userInfoCache = GStrorage.userInfo; + var userInfo; + bool userLogin = false; + var accessKeyInfo; @override void initState() { super.initState(); + // 首页默认推荐类型 + defaultRcmdType = + setting.get(SettingBoxKey.defaultRcmdType, defaultValue: 'web'); // 默认优先显示最新评论 defaultReplySort = setting.get(SettingBoxKey.replySortType, defaultValue: 0); @@ -39,6 +49,9 @@ class _ExtraSettingState extends State { localCache.get(LocalCacheKey.systemProxyHost, defaultValue: ''); defaultSystemProxyPort = localCache.get(LocalCacheKey.systemProxyPort, defaultValue: ''); + userInfo = userInfoCache.get('userInfoCache'); + userLogin = userInfo != null; + accessKeyInfo = localCache.get(LocalCacheKey.accessKey, defaultValue: null); } // 设置代理 @@ -170,6 +183,44 @@ class _ExtraSettingState extends State { setKey: SettingBoxKey.enableSaveLastData, defaultVal: false, ), + ListTile( + dense: false, + title: Text('首页推荐类型', style: titleStyle), + subtitle: Text( + '当前使用「$defaultRcmdType端」推荐', + style: subTitleStyle, + ), + onTap: () async { + String? result = await showDialog( + context: context, + builder: (context) { + return SelectDialog( + title: '推荐类型', + value: defaultRcmdType, + values: RcmdType.values.map((e) { + return {'title': e.labels, 'value': e.values}; + }).toList(), + ); + }, + ); + if (result != null) { + if (result == 'app') { + // app端推荐需要access_key + if (accessKeyInfo == null) { + if (!userLogin) { + SmartDialog.showToast('请先登录'); + return; + } + await MemberHttp.cookieToKey(); + } + } + defaultRcmdType = result; + setting.put(SettingBoxKey.defaultRcmdType, result); + SmartDialog.showToast('下次启动时生效'); + setState(() {}); + } + }, + ), const SetSwitchItem( title: '启用ai总结', subTitle: '视频详情页开启ai总结', @@ -187,9 +238,12 @@ class _ExtraSettingState extends State { int? result = await showDialog( context: context, builder: (context) { - return SelectDialog(title: '评论展示', value: defaultReplySort, values: ReplySortType.values.map((e) { - return {'title': e.titles, 'value': e.index}; - }).toList()); + return SelectDialog( + title: '评论展示', + value: defaultReplySort, + values: ReplySortType.values.map((e) { + return {'title': e.titles, 'value': e.index}; + }).toList()); }, ); if (result != null) { @@ -210,9 +264,12 @@ class _ExtraSettingState extends State { int? result = await showDialog( context: context, builder: (context) { - return SelectDialog(title: '动态展示', value: defaultDynamicType, values: DynamicsType.values.map((e) { - return {'title': e.labels, 'value': e.index}; - }).toList()); + return SelectDialog( + title: '动态展示', + value: defaultDynamicType, + values: DynamicsType.values.map((e) { + return {'title': e.labels, 'value': e.index}; + }).toList()); }, ); if (result != null) { diff --git a/lib/pages/setting/widgets/select_dialog.dart b/lib/pages/setting/widgets/select_dialog.dart index dffa4571..72119755 100644 --- a/lib/pages/setting/widgets/select_dialog.dart +++ b/lib/pages/setting/widgets/select_dialog.dart @@ -1,18 +1,20 @@ import 'package:flutter/material.dart'; -import 'package:pilipala/models/common/theme_type.dart'; class SelectDialog extends StatefulWidget { final T value; final String title; final List values; - const SelectDialog({super.key, required this.value, required this.values, required this.title}); + const SelectDialog( + {super.key, + required this.value, + required this.values, + required this.title}); @override _SelectDialogState createState() => _SelectDialogState(); } class _SelectDialogState extends State> { - late T _tempValue; @override @@ -28,40 +30,39 @@ class _SelectDialogState extends State> { return AlertDialog( title: Text(widget.title), contentPadding: const EdgeInsets.fromLTRB(0, 12, 0, 12), - content: StatefulBuilder( - builder: (context, StateSetter setState) { - return SingleChildScrollView( - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - for (var i in widget.values) ...[ - RadioListTile( - value: i['value'], - title: Text(i['title'], style: titleStyle), - groupValue: _tempValue, - onChanged: (value) { - print(value); - setState(() { - _tempValue = value as T; - }); - }, - ), - ] - ], - ), - ); - }), + content: StatefulBuilder(builder: (context, StateSetter setState) { + return SingleChildScrollView( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + for (var i in widget.values) ...[ + RadioListTile( + value: i['value'], + title: Text(i['title'], style: titleStyle), + groupValue: _tempValue, + onChanged: (value) { + setState(() { + _tempValue = value as T; + }); + }, + ), + ] + ], + ), + ); + }), actions: [ TextButton( - onPressed: () => Navigator.pop(context), - child: Text( - '取消', - style: TextStyle( - color: Theme.of(context).colorScheme.outline), - )), + onPressed: () => Navigator.pop(context), + child: Text( + '取消', + style: TextStyle(color: Theme.of(context).colorScheme.outline), + ), + ), TextButton( - onPressed: () => Navigator.pop(context, _tempValue), - child: const Text('确定')) + onPressed: () => Navigator.pop(context, _tempValue), + child: const Text('确定'), + ) ], ); } diff --git a/lib/pages/webview/controller.dart b/lib/pages/webview/controller.dart index 2dfa9582..447693e2 100644 --- a/lib/pages/webview/controller.dart +++ b/lib/pages/webview/controller.dart @@ -115,7 +115,6 @@ class WebviewController extends GetxController { MediaController mediaCtr = Get.find(); mediaCtr.mid = result['data'].mid; await LoginUtils.refreshLoginStatus(true); - MemberHttp.cookieToKey(); } catch (err) { SmartDialog.show(builder: (context) { return AlertDialog( diff --git a/lib/utils/cookie.dart b/lib/utils/cookie.dart index 5d4d9cbd..31284c03 100644 --- a/lib/utils/cookie.dart +++ b/lib/utils/cookie.dart @@ -11,9 +11,9 @@ class SetCookie { cookies.map((cookie) => '${cookie.name}=${cookie.value}').join('; '); Request.dio.options.headers['cookie'] = cookieString; - cookies = await WebviewCookieManager().getCookies(HttpString.baseApiUrl); + cookies = await WebviewCookieManager().getCookies(HttpString.apiBaseUrl); await Request.cookieManager.cookieJar - .saveFromResponse(Uri.parse(HttpString.baseApiUrl), cookies); + .saveFromResponse(Uri.parse(HttpString.apiBaseUrl), cookies); cookies = await WebviewCookieManager().getCookies(HttpString.tUrl); await Request.cookieManager.cookieJar diff --git a/lib/utils/storage.dart b/lib/utils/storage.dart index 9d9192ee..7aec10d5 100644 --- a/lib/utils/storage.dart +++ b/lib/utils/storage.dart @@ -88,98 +88,99 @@ class GStrorage { class SettingBoxKey { /// 播放器 - static const String btmProgressBehavior = 'btmProgressBehavior'; - static const String defaultVideoSpeed = 'defaultVideoSpeed'; - static const String autoUpgradeEnable = 'autoUpgradeEnable'; - static const String feedBackEnable = 'feedBackEnable'; - static const String defaultVideoQa = 'defaultVideoQa'; - static const String defaultAudioQa = 'defaultAudioQa'; - static const String autoPlayEnable = 'autoPlayEnable'; - static const String fullScreenMode = 'fullScreenMode'; - static const String defaultDecode = 'defaultDecode'; - static const String danmakuEnable = 'danmakuEnable'; - static const String defaultPicQa = 'defaultPicQa'; - static const String enableHA = 'enableHA'; - static const String enableOnlineTotal = 'enableOnlineTotal'; - static const String enableAutoBrightness = 'enableAutoBrightness'; - static const String enableAutoEnter = 'enableAutoEnter'; - static const String enableAutoExit = 'enableAutoExit'; - static const String p1080 = 'p1080'; - static const String enableCDN = 'enableCDN'; - static const String autoPiP = 'autoPiP'; - static const String enableAutoLongPressSpeed = 'enableAutoLongPressSpeed'; + static const btmProgressBehavior = 'btmProgressBehavior', + defaultVideoSpeed = 'defaultVideoSpeed', + autoUpgradeEnable = 'autoUpgradeEnable', + feedBackEnable = 'feedBackEnable', + defaultVideoQa = 'defaultVideoQa', + defaultAudioQa = 'defaultAudioQa', + autoPlayEnable = 'autoPlayEnable', + fullScreenMode = 'fullScreenMode', + defaultDecode = 'defaultDecode', + danmakuEnable = 'danmakuEnable', + defaultPicQa = 'defaultPicQa', + enableHA = 'enableHA', + enableOnlineTotal = 'enableOnlineTotal', + enableAutoBrightness = 'enableAutoBrightness', + enableAutoEnter = 'enableAutoEnter', + enableAutoExit = 'enableAutoExit', + p1080 = 'p1080', + enableCDN = 'enableCDN', + autoPiP = 'autoPiP', + enableAutoLongPressSpeed = 'enableAutoLongPressSpeed', - // youtube 双击快进快退 - static const String enableQuickDouble = 'enableQuickDouble'; - static const String enableShowDanmaku = 'enableShowDanmaku'; - static const String enableBackgroundPlay = 'enableBackgroundPlay'; + // youtube 双击快进快退 + enableQuickDouble = 'enableQuickDouble', + enableShowDanmaku = 'enableShowDanmaku', + enableBackgroundPlay = 'enableBackgroundPlay', - /// 隐私 - static const String blackMidsList = 'blackMidsList'; + /// 隐私 + blackMidsList = 'blackMidsList', - /// 其他 - static const String autoUpdate = 'autoUpdate'; - static const String replySortType = 'replySortType'; - static const String defaultDynamicType = 'defaultDynamicType'; - static const String enableHotKey = 'enableHotKey'; - static const String enableQuickFav = 'enableQuickFav'; - static const String enableWordRe = 'enableWordRe'; - static const String enableSearchWord = 'enableSearchWord'; - static const String enableRcmdDynamic = 'enableRcmdDynamic'; - static const String enableSaveLastData = 'enableSaveLastData'; - static const String enableSystemProxy = 'enableSystemProxy'; - static const String enableAi = 'enableAi'; + /// 其他 + autoUpdate = 'autoUpdate', + defaultRcmdType = 'defaultRcmdType', + replySortType = 'replySortType', + defaultDynamicType = 'defaultDynamicType', + enableHotKey = 'enableHotKey', + enableQuickFav = 'enableQuickFav', + enableWordRe = 'enableWordRe', + enableSearchWord = 'enableSearchWord', + enableRcmdDynamic = 'enableRcmdDynamic', + enableSaveLastData = 'enableSaveLastData', + enableSystemProxy = 'enableSystemProxy', + enableAi = 'enableAi'; /// 外观 - static const String themeMode = 'themeMode'; - static const String defaultTextScale = 'textScale'; - static const String dynamicColor = 'dynamicColor'; // bool - static const String customColor = 'customColor'; // 自定义主题色 - static const String enableSingleRow = 'enableSingleRow'; // 首页单列 - static const String displayMode = 'displayMode'; - static const String customRows = 'customRows'; // 自定义列 - static const String enableMYBar = 'enableMYBar'; - static const String hideSearchBar = 'hideSearchBar'; // 收起顶栏 - static const String hideTabBar = 'hideTabBar'; // 收起底栏 + static const String themeMode = 'themeMode', + defaultTextScale = 'textScale', + dynamicColor = 'dynamicColor', // bool + customColor = 'customColor', // 自定义主题色 + enableSingleRow = 'enableSingleRow', // 首页单列 + displayMode = 'displayMode', + customRows = 'customRows', // 自定义列 + enableMYBar = 'enableMYBar', + hideSearchBar = 'hideSearchBar', // 收起顶栏 + hideTabBar = 'hideTabBar'; // 收起底栏 } class LocalCacheKey { // 历史记录暂停状态 默认false 记录 - static const String historyPause = 'historyPause'; - // access_key - static const String accessKey = 'accessKey'; + static const String historyPause = 'historyPause', + // access_key + accessKey = 'accessKey', - // - static const String wbiKeys = 'wbiKeys'; - static const String timeStamp = 'timeStamp'; + // + wbiKeys = 'wbiKeys', + timeStamp = 'timeStamp', - // 弹幕相关设置 屏蔽类型 显示区域 透明度 字体大小 弹幕时间 - static const String danmakuBlockType = 'danmakuBlockType'; - static const String danmakuShowArea = 'danmakuShowArea'; - static const String danmakuOpacity = 'danmakuOpacity'; - static const String danmakuFontScale = 'danmakuFontScale'; - static const String danmakuDuration = 'danmakuDuration'; + // 弹幕相关设置 屏蔽类型 显示区域 透明度 字体大小 弹幕时间 + danmakuBlockType = 'danmakuBlockType', + danmakuShowArea = 'danmakuShowArea', + danmakuOpacity = 'danmakuOpacity', + danmakuFontScale = 'danmakuFontScale', + danmakuDuration = 'danmakuDuration', - // 代理host port - static const String systemProxyHost = 'systemProxyHost'; - static const String systemProxyPort = 'systemProxyPort'; + // 代理host port + systemProxyHost = 'systemProxyHost', + systemProxyPort = 'systemProxyPort'; } class VideoBoxKey { // 视频比例 - static const String videoFit = 'videoFit'; - // 亮度 - static const String videoBrightness = 'videoBrightness'; - // 倍速 - static const String videoSpeed = 'videoSpeed'; - // 播放顺序 - static const String playRepeat = 'playRepeat'; - // 默认倍速 - static const String playSpeedDefault = 'playSpeedDefault'; - // 默认长按倍速 - static const String longPressSpeedDefault = 'longPressSpeedDefault'; - // 自定义倍速集合 - static const String customSpeedsList = 'customSpeedsList'; - // 画面填充比例 - static const String cacheVideoFit = 'cacheVideoFit'; + static const String videoFit = 'videoFit', + // 亮度 + videoBrightness = 'videoBrightness', + // 倍速 + videoSpeed = 'videoSpeed', + // 播放顺序 + playRepeat = 'playRepeat', + // 默认倍速 + playSpeedDefault = 'playSpeedDefault', + // 默认长按倍速 + longPressSpeedDefault = 'longPressSpeedDefault', + // 自定义倍速集合 + customSpeedsList = 'customSpeedsList', + // 画面填充比例 + cacheVideoFit = 'cacheVideoFit'; }