opt: query dm

Closes #544

Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
bggRGjQaUbCoE
2025-03-27 20:03:41 +08:00
parent 3a6b6614a4
commit a15b932a69
3 changed files with 22 additions and 41 deletions

View File

@@ -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({

View File

@@ -12,23 +12,10 @@ class PlDanmakuController {
Map<int, List<DanmakuElem>> dmSegMap = {};
// 已请求的段落标记
List<bool> 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<bool>.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<DanmakuElem>? getCurrentDanmaku(int progress) {
int segmentIndex = calcSegment(progress);
if (requestedSeg.length <= segmentIndex) {
return <DanmakuElem>[];
}
if (!requestedSeg[segmentIndex]) {
if (requestedSeg[segmentIndex] != true) {
queryDanmaku(segmentIndex);
return null;
}
if (plPlayerController.danmakuWeight == 0 &&
plPlayerController.filters.count == 0) {

View File

@@ -35,7 +35,6 @@ class _PlDanmakuState extends State<PlDanmaku> {
late bool enableShowDanmaku;
int latestAddedPosition = -1;
bool? _isFullScreen;
StreamSubscription? _listenerDanmaku;
StreamSubscription? _listenerFS;
@override
@@ -48,20 +47,15 @@ class _PlDanmakuState extends State<PlDanmaku> {
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<PlDanmaku> {
@override
void dispose() {
_listenerDanmaku?.cancel();
_listenerFS?.cancel();
playerController.removePositionListener(videoPositionListen);
playerController.removeStatusLister(playerListener);