From 97bef560063ae10ae85a9acd46b652838c68d7b2 Mon Sep 17 00:00:00 2001 From: bggRGjQaUbCoE Date: Sun, 23 Mar 2025 20:34:52 +0800 Subject: [PATCH] mod: live qa Closes #464 Signed-off-by: bggRGjQaUbCoE --- lib/models/live/quality.dart | 2 +- lib/pages/live_room/controller.dart | 10 +++++- lib/pages/setting/widgets/model.dart | 52 ++++++++++++++++++++++++++++ lib/utils/storage.dart | 10 ++++++ 4 files changed, 72 insertions(+), 2 deletions(-) diff --git a/lib/models/live/quality.dart b/lib/models/live/quality.dart index 47938416..677d615b 100644 --- a/lib/models/live/quality.dart +++ b/lib/models/live/quality.dart @@ -2,7 +2,6 @@ enum LiveQuality { dolby, super4K, origin, - veryHigh, bluRay, superHD, smooth, @@ -37,6 +36,7 @@ extension VideoQualityDesc on LiveQuality { '原画', '蓝光', '超清', + '高清', '流畅', ]; get description => _descList[index]; diff --git a/lib/pages/live_room/controller.dart b/lib/pages/live_room/controller.dart index 1d537284..3f7060d8 100644 --- a/lib/pages/live_room/controller.dart +++ b/lib/pages/live_room/controller.dart @@ -6,6 +6,7 @@ import 'package:PiliPlus/tcp/live.dart'; import 'package:PiliPlus/utils/danmaku.dart'; import 'package:PiliPlus/utils/storage.dart'; import 'package:canvas_danmaku/canvas_danmaku.dart'; +import 'package:connectivity_plus/connectivity_plus.dart'; import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; import 'package:get/get.dart'; @@ -32,7 +33,7 @@ class LiveRoomController extends GetxController { DanmakuController? controller; bool showDanmaku = true; - late int currentQn = 10000; + int? currentQn; late List acceptQnList = []; RxString currentQnDesc = ''.obs; @@ -64,6 +65,13 @@ class LiveRoomController extends GetxController { final RxBool isPortrait = false.obs; Future queryLiveInfo() async { + if (currentQn == null) { + await Connectivity().checkConnectivity().then((res) { + currentQn = res.contains(ConnectivityResult.wifi) + ? GStorage.liveQuality + : GStorage.liveQualityCellular; + }); + } var res = await LiveHttp.liveRoomInfo(roomId: roomId, qn: currentQn); if (res['status']) { isPortrait.value = res['data'].isPortrait ?? false; diff --git a/lib/pages/setting/widgets/model.dart b/lib/pages/setting/widgets/model.dart index 8c063d5e..986e352e 100644 --- a/lib/pages/setting/widgets/model.dart +++ b/lib/pages/setting/widgets/model.dart @@ -15,6 +15,7 @@ import 'package:PiliPlus/models/common/super_resolution_type.dart'; import 'package:PiliPlus/models/common/theme_type.dart'; import 'package:PiliPlus/models/common/up_panel_position.dart'; import 'package:PiliPlus/models/dynamics/result.dart'; +import 'package:PiliPlus/models/live/quality.dart'; import 'package:PiliPlus/models/video/play/CDN.dart'; import 'package:PiliPlus/models/video/play/quality.dart'; import 'package:PiliPlus/models/video/play/subtitle.dart'; @@ -1098,6 +1099,57 @@ List get videoSettings => [ } }, ), + SettingsModel( + settingsType: SettingsType.normal, + title: '直播默认画质', + leading: const Icon(Icons.video_settings_outlined), + getSubtitle: () => + '当前画质:${LiveQualityCode.fromCode(GStorage.liveQuality)!.description!}', + onTap: (setState) async { + int? result = await showDialog( + context: Get.context!, + builder: (context) { + return SelectDialog( + title: '直播默认画质', + value: GStorage.liveQuality, + values: LiveQuality.values.map((e) { + return {'title': e.description, 'value': e.code}; + }).toList(), + ); + }, + ); + if (result != null) { + await GStorage.setting.put(SettingBoxKey.liveQuality, result); + setState(); + } + }, + ), + SettingsModel( + settingsType: SettingsType.normal, + title: '蜂窝网络直播默认画质', + leading: const Icon(Icons.video_settings_outlined), + getSubtitle: () => + '当前画质:${LiveQualityCode.fromCode(GStorage.liveQualityCellular)!.description!}', + onTap: (setState) async { + int? result = await showDialog( + context: Get.context!, + builder: (context) { + return SelectDialog( + title: '直播默认画质', + value: GStorage.liveQualityCellular, + values: LiveQuality.values.map((e) { + return {'title': e.description, 'value': e.code}; + }).toList(), + ); + }, + ); + if (result != null) { + await GStorage.setting + .put(SettingBoxKey.liveQualityCellular, result); + setState(); + } + }, + ), SettingsModel( settingsType: SettingsType.normal, title: '首选解码格式', diff --git a/lib/utils/storage.dart b/lib/utils/storage.dart index 150044f2..4ac2d942 100644 --- a/lib/utils/storage.dart +++ b/lib/utils/storage.dart @@ -12,6 +12,7 @@ import 'package:PiliPlus/models/common/sponsor_block/skip_type.dart'; import 'package:PiliPlus/models/common/tab_type.dart'; import 'package:PiliPlus/models/common/theme_type.dart'; import 'package:PiliPlus/models/common/up_panel_position.dart'; +import 'package:PiliPlus/models/live/quality.dart'; import 'package:PiliPlus/models/user/danmaku_rule.dart'; import 'package:PiliPlus/models/user/danmaku_rule_adapter.dart'; import 'package:PiliPlus/models/video/play/CDN.dart'; @@ -432,6 +433,13 @@ class GStorage { static int get retryDelay => GStorage.setting.get(SettingBoxKey.retryDelay, defaultValue: 500); + static int get liveQuality => GStorage.setting + .get(SettingBoxKey.liveQuality, defaultValue: LiveQuality.origin.code); + + static int get liveQualityCellular => + GStorage.setting.get(SettingBoxKey.liveQualityCellular, + defaultValue: LiveQuality.superHD.code); + static List get dynamicDetailRatio => List.from(setting .get(SettingBoxKey.dynamicDetailRatio, defaultValue: [60.0, 40.0])); @@ -710,6 +718,8 @@ class SettingBoxKey { enableSlideVolumeBrightness = 'enableSlideVolumeBrightness', retryCount = 'retryCount', retryDelay = 'retryDelay', + liveQuality = 'liveQuality', + liveQualityCellular = 'liveQualityCellular', // Sponsor Block enableSponsorBlock = 'enableSponsorBlock',