Compare commits

..

4 Commits

Author SHA1 Message Date
f598c81b53 v1.0.22 更新日志 2024-04-30 23:07:36 +08:00
ec7762644b mod: findClosestNumber 2024-04-05 00:02:31 +08:00
5500a58c32 mod: 优化selectDialog选择逻辑 2024-04-05 00:02:31 +08:00
2ba72e3792 Update README.md 2024-04-03 23:59:24 +08:00
7 changed files with 85 additions and 52 deletions

View File

@ -26,13 +26,13 @@
Xcode 13.4 不支持**auto_orientation**,请注释相关代码 Xcode 13.4 不支持**auto_orientation**,请注释相关代码
```bash ```bash
[] Flutter (Channel stable, 3.16.4, on macOS 14.1.2 23B92 darwin-arm64, locale [] Flutter (Channel stable, 3.16.5, on macOS 14.1.2 23B92 darwin-arm64, locale
zh-Hans-CN) zh-Hans-CN)
[] Android toolchain - develop for Android devices (Android SDK version 34.0.0) [] Android toolchain - develop for Android devices (Android SDK version 34.0.0)
[] Xcode - develop for iOS and macOS (Xcode 15.1) [] Xcode - develop for iOS and macOS (Xcode 15.1)
[] Chrome - develop for the web [] Chrome - develop for the web
[] Android Studio (version 2022.3) [] Android Studio (version 2022.3)
[] VS Code (version 1.85.1) [] VS Code (version 1.87.2)
[] Connected device (3 available) [] Connected device (3 available)
[] Network resources [] Network resources
@ -44,6 +44,9 @@ Xcode 13.4 不支持**auto_orientation**,请注释相关代码
## 技术交流 ## 技术交流
Telegram: https://t.me/+lm_oOVmF0RJiODk1 Telegram: https://t.me/+lm_oOVmF0RJiODk1
Tg Beta版本@PiliPala_Beta
QQ频道: https://pd.qq.com/s/365esodk3 QQ频道: https://pd.qq.com/s/365esodk3

29
change_log/1.0.22.0430.md Normal file
View File

@ -0,0 +1,29 @@
## 1.0.22
明天晚上或者后天晚上应该会更新
### 功能
+ 字幕
+ 全屏时选集
+ 动态转发
+ 评论视频并转发
+ 收藏夹删除
+ 合集显示封面
+ 底部导航栏编辑、排序功能
+ 历史记录进度条展示
+ 直播画质切换
+ 排行榜功能
+ 视频详情页推荐视频开关
+ 显示联合投稿up
### 修复
+ 收藏夹个数错误
+ 封面保存权限问题
+ 合集最后1p未展示
+ up主页关注按钮触发灰屏
### 优化
+ 视频简介查看逻辑
更多更新日志可在Github上查看
问题反馈、功能建议请查看「关于」页面。

View File

@ -55,7 +55,13 @@ class _PlDanmakuState extends State<PlDanmaku> {
..addStatusLister(playerListener) ..addStatusLister(playerListener)
..addPositionListener(videoPositionListen); ..addPositionListener(videoPositionListen);
} }
danmakuStatusListen(); playerController.isOpenDanmu.listen((p0) {
if (p0 && !_plDanmakuController.initiated) {
_plDanmakuController.initiate(
playerController.duration.value.inMilliseconds,
playerController.position.value.inMilliseconds);
}
});
blockTypes = playerController.blockTypes; blockTypes = playerController.blockTypes;
showArea = playerController.showArea; showArea = playerController.showArea;
opacityVal = playerController.opacityVal; opacityVal = playerController.opacityVal;
@ -105,20 +111,6 @@ class _PlDanmakuState extends State<PlDanmaku> {
} }
} }
// 弹幕开关状态监听
void danmakuStatusListen() {
playerController.isOpenDanmu.listen((p0) {
if (p0 && !_plDanmakuController.initiated) {
_plDanmakuController.initiate(
playerController.duration.value.inMilliseconds,
playerController.position.value.inMilliseconds);
} else {
playerController.danmakuController!.pause();
playerController.danmakuController!.clear();
}
});
}
@override @override
void dispose() { void dispose() {
playerController.removePositionListener(videoPositionListen); playerController.removePositionListener(videoPositionListen);
@ -130,23 +122,28 @@ class _PlDanmakuState extends State<PlDanmaku> {
return LayoutBuilder(builder: (context, box) { return LayoutBuilder(builder: (context, box) {
// double initDuration = box.maxWidth / 12; // double initDuration = box.maxWidth / 12;
return Obx( return Obx(
() => DanmakuView( () => AnimatedOpacity(
createdController: (DanmakuController e) async { opacity: playerController.isOpenDanmu.value ? 1 : 0,
playerController.danmakuController = _controller = e; duration: const Duration(milliseconds: 100),
}, child: DanmakuView(
option: DanmakuOption( createdController: (DanmakuController e) async {
fontSize: 15 * fontSizeVal, playerController.danmakuController = _controller = e;
area: showArea, },
opacity: opacityVal, option: DanmakuOption(
hideTop: blockTypes.contains(5), fontSize: 15 * fontSizeVal,
hideScroll: blockTypes.contains(2), area: showArea,
hideBottom: blockTypes.contains(4), opacity: opacityVal,
duration: danmakuDurationVal / playerController.playbackSpeed, hideTop: blockTypes.contains(5),
strokeWidth: strokeWidth, hideScroll: blockTypes.contains(2),
// initDuration / hideBottom: blockTypes.contains(4),
// (danmakuSpeedVal * widget.playerController.playbackSpeed), duration:
danmakuDurationVal / playerController.playbackSpeed,
strokeWidth: strokeWidth,
// initDuration /
// (danmakuSpeedVal * widget.playerController.playbackSpeed),
),
statusChanged: (isPlaying) {},
), ),
statusChanged: (isPlaying) {},
), ),
); );
}); });

View File

@ -44,6 +44,7 @@ class _SelectDialogState<T> extends State<SelectDialog<T>> {
setState(() { setState(() {
_tempValue = value as T; _tempValue = value as T;
}); });
Navigator.pop(context, _tempValue);
}, },
), ),
] ]
@ -51,19 +52,6 @@ class _SelectDialogState<T> extends State<SelectDialog<T>> {
), ),
); );
}), }),
actions: [
TextButton(
onPressed: () => Navigator.pop(context),
child: Text(
'取消',
style: TextStyle(color: Theme.of(context).colorScheme.outline),
),
),
TextButton(
onPressed: () => Navigator.pop(context, _tempValue),
child: const Text('确定'),
)
],
); );
} }
} }

View File

@ -91,7 +91,7 @@ class VideoDetailController extends GetxController
late bool enableCDN; late bool enableCDN;
late int? cacheVideoQa; late int? cacheVideoQa;
late String cacheDecode; late String cacheDecode;
late int cacheAudioQa; late int defaultAudioQa;
PersistentBottomSheetController? replyReplyBottomSheetCtr; PersistentBottomSheetController? replyReplyBottomSheetCtr;
RxList<SubTitileContentModel> subtitleContents = RxList<SubTitileContentModel> subtitleContents =
@ -146,7 +146,7 @@ class VideoDetailController extends GetxController
// 预设的解码格式 // 预设的解码格式
cacheDecode = setting.get(SettingBoxKey.defaultDecode, cacheDecode = setting.get(SettingBoxKey.defaultDecode,
defaultValue: VideoDecodeFormats.values.last.code); defaultValue: VideoDecodeFormats.values.last.code);
cacheAudioQa = setting.get(SettingBoxKey.defaultAudioQa, defaultAudioQa = setting.get(SettingBoxKey.defaultAudioQa,
defaultValue: AudioQuality.hiRes.code); defaultValue: AudioQuality.hiRes.code);
oid.value = IdUtils.bv2av(Get.parameters['bvid']!); oid.value = IdUtils.bv2av(Get.parameters['bvid']!);
getSubtitle(); getSubtitle();
@ -353,9 +353,9 @@ class VideoDetailController extends GetxController
if (audiosList.isNotEmpty) { if (audiosList.isNotEmpty) {
final List<int> numbers = audiosList.map((map) => map.id!).toList(); final List<int> numbers = audiosList.map((map) => map.id!).toList();
int closestNumber = Utils.findClosestNumber(cacheAudioQa, numbers); int closestNumber = Utils.findClosestNumber(defaultAudioQa, numbers);
if (!numbers.contains(cacheAudioQa) && if (!numbers.contains(defaultAudioQa) &&
numbers.any((e) => e > cacheAudioQa)) { numbers.any((e) => e > defaultAudioQa)) {
closestNumber = 30280; closestNumber = 30280;
} }
firstAudio = audiosList.firstWhere((e) => e.id == closestNumber); firstAudio = audiosList.firstWhere((e) => e.id == closestNumber);

View File

@ -209,6 +209,8 @@ class Utils {
static int findClosestNumber(int target, List<int> numbers) { static int findClosestNumber(int target, List<int> numbers) {
int minDiff = 127; int minDiff = 127;
int closestNumber = 0; // 初始化为0表示没有找到比目标值小的整数 int closestNumber = 0; // 初始化为0表示没有找到比目标值小的整数
// 向下查找
try { try {
for (int number in numbers) { for (int number in numbers) {
if (number < target) { if (number < target) {
@ -221,6 +223,20 @@ class Utils {
} }
} }
} catch (_) {} } catch (_) {}
// 向上查找
if (closestNumber == 0) {
try {
for (int number in numbers) {
int diff = (number - target).abs();
if (diff < minDiff) {
minDiff = diff;
closestNumber = number;
}
}
} catch (_) {}
}
return closestNumber; return closestNumber;
} }

View File

@ -16,7 +16,7 @@ publish_to: "none" # Remove this line if you wish to publish to pub.dev
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
# In Windows, build-name is used as the major, minor, and patch parts # In Windows, build-name is used as the major, minor, and patch parts
# of the product and file versions while build-number is used as the build suffix. # of the product and file versions while build-number is used as the build suffix.
version: 1.0.21+1021 version: 1.0.22+1022
environment: environment:
sdk: ">=3.0.0 <4.0.0" sdk: ">=3.0.0 <4.0.0"