From a15b932a69cf470767b70998fd99839bfc0cc7b5 Mon Sep 17 00:00:00 2001 From: bggRGjQaUbCoE Date: Thu, 27 Mar 2025 20:03:41 +0800 Subject: [PATCH] opt: query dm Closes #544 Signed-off-by: bggRGjQaUbCoE --- lib/http/danmaku.dart | 4 +-- lib/pages/danmaku/controller.dart | 42 +++++++++++-------------------- lib/pages/danmaku/view.dart | 17 ++++--------- 3 files changed, 22 insertions(+), 41 deletions(-) diff --git a/lib/http/danmaku.dart b/lib/http/danmaku.dart index 8c15a2c1..cb25b615 100644 --- a/lib/http/danmaku.dart +++ b/lib/http/danmaku.dart @@ -16,7 +16,7 @@ class DanmakuHttp { await GrpcRepo.dmSegMobile(cid: cid, segmentIndex: segmentIndex); if (!response['status']) { if (queryCount >= 3) { - return DmSegMobileReply(); + return {'status': false}; } else { await Future.delayed(const Duration(seconds: 1)); return await queryDanmaku( @@ -43,7 +43,7 @@ class DanmakuHttp { } } } - return data; + return {'status': true, 'data': data}; } static Future shootDanmaku({ diff --git a/lib/pages/danmaku/controller.dart b/lib/pages/danmaku/controller.dart index 6ee53fda..56d8ab40 100644 --- a/lib/pages/danmaku/controller.dart +++ b/lib/pages/danmaku/controller.dart @@ -12,23 +12,10 @@ class PlDanmakuController { Map> dmSegMap = {}; // 已请求的段落标记 - List requestedSeg = []; - - bool get initiated => requestedSeg.isNotEmpty; + Map requestedSeg = {}; static int segmentLength = 60 * 6 * 1000; - void initiate(int videoDuration, int progress) { - if (videoDuration <= 0) { - return; - } - if (requestedSeg.isEmpty) { - int segCount = (videoDuration / segmentLength).ceil(); - requestedSeg = List.generate(segCount, (index) => false); - } - queryDanmaku(calcSegment(progress)); - } - void dispose() { dmSegMap.clear(); requestedSeg.clear(); @@ -39,34 +26,35 @@ class PlDanmakuController { } void queryDanmaku(int segmentIndex) async { - if (requestedSeg.length <= segmentIndex) { + if (requestedSeg[segmentIndex] == true) { return; } - assert(requestedSeg[segmentIndex] == false); requestedSeg[segmentIndex] = true; - final DmSegMobileReply result = await DanmakuHttp.queryDanmaku( + final Map result = await DanmakuHttp.queryDanmaku( cid: cid, segmentIndex: segmentIndex + 1, mergeDanmaku: plPlayerController.mergeDanmaku, ); - if (result.elems.isNotEmpty) { - for (var element in result.elems) { - int pos = element.progress ~/ 100; //每0.1秒存储一次 - if (dmSegMap[pos] == null) { - dmSegMap[pos] = []; + if (result['status']) { + if (result['data'].elems.isNotEmpty) { + for (var element in result['data'].elems) { + int pos = element.progress ~/ 100; //每0.1秒存储一次 + if (dmSegMap[pos] == null) { + dmSegMap[pos] = []; + } + dmSegMap[pos]!.add(element); } - dmSegMap[pos]!.add(element); } + } else { + requestedSeg[segmentIndex] = false; } } List? getCurrentDanmaku(int progress) { int segmentIndex = calcSegment(progress); - if (requestedSeg.length <= segmentIndex) { - return []; - } - if (!requestedSeg[segmentIndex]) { + if (requestedSeg[segmentIndex] != true) { queryDanmaku(segmentIndex); + return null; } if (plPlayerController.danmakuWeight == 0 && plPlayerController.filters.count == 0) { diff --git a/lib/pages/danmaku/view.dart b/lib/pages/danmaku/view.dart index e127ff28..0b0bba42 100644 --- a/lib/pages/danmaku/view.dart +++ b/lib/pages/danmaku/view.dart @@ -35,7 +35,6 @@ class _PlDanmakuState extends State { late bool enableShowDanmaku; int latestAddedPosition = -1; bool? _isFullScreen; - StreamSubscription? _listenerDanmaku; StreamSubscription? _listenerFS; @override @@ -48,20 +47,15 @@ class _PlDanmakuState extends State { playerController, ); if (enableShowDanmaku || playerController.isOpenDanmu.value) { - _plDanmakuController.initiate( - playerController.duration.value.inMilliseconds, - playerController.position.value.inMilliseconds); + _plDanmakuController.queryDanmaku( + _plDanmakuController.calcSegment( + playerController.position.value.inMilliseconds, + ), + ); } playerController ..addStatusLister(playerListener) ..addPositionListener(videoPositionListen); - _listenerDanmaku = playerController.isOpenDanmu.listen((p0) { - if (p0 && !_plDanmakuController.initiated) { - _plDanmakuController.initiate( - playerController.duration.value.inMilliseconds, - playerController.position.value.inMilliseconds); - } - }); _listenerFS = playerController.isFullScreen.listen((isFullScreen) { if (isFullScreen != _isFullScreen) { _isFullScreen = isFullScreen; @@ -128,7 +122,6 @@ class _PlDanmakuState extends State { @override void dispose() { - _listenerDanmaku?.cancel(); _listenerFS?.cancel(); playerController.removePositionListener(videoPositionListen); playerController.removeStatusLister(playerListener);