mirror of
https://github.com/HChaZZY/PiliPlus.git
synced 2025-12-06 09:13:48 +08:00
opt: query dm
Closes #544 Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
@@ -16,7 +16,7 @@ class DanmakuHttp {
|
|||||||
await GrpcRepo.dmSegMobile(cid: cid, segmentIndex: segmentIndex);
|
await GrpcRepo.dmSegMobile(cid: cid, segmentIndex: segmentIndex);
|
||||||
if (!response['status']) {
|
if (!response['status']) {
|
||||||
if (queryCount >= 3) {
|
if (queryCount >= 3) {
|
||||||
return DmSegMobileReply();
|
return {'status': false};
|
||||||
} else {
|
} else {
|
||||||
await Future.delayed(const Duration(seconds: 1));
|
await Future.delayed(const Duration(seconds: 1));
|
||||||
return await queryDanmaku(
|
return await queryDanmaku(
|
||||||
@@ -43,7 +43,7 @@ class DanmakuHttp {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return data;
|
return {'status': true, 'data': data};
|
||||||
}
|
}
|
||||||
|
|
||||||
static Future shootDanmaku({
|
static Future shootDanmaku({
|
||||||
|
|||||||
@@ -12,23 +12,10 @@ class PlDanmakuController {
|
|||||||
|
|
||||||
Map<int, List<DanmakuElem>> dmSegMap = {};
|
Map<int, List<DanmakuElem>> dmSegMap = {};
|
||||||
// 已请求的段落标记
|
// 已请求的段落标记
|
||||||
List<bool> requestedSeg = [];
|
Map requestedSeg = {};
|
||||||
|
|
||||||
bool get initiated => requestedSeg.isNotEmpty;
|
|
||||||
|
|
||||||
static int segmentLength = 60 * 6 * 1000;
|
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() {
|
void dispose() {
|
||||||
dmSegMap.clear();
|
dmSegMap.clear();
|
||||||
requestedSeg.clear();
|
requestedSeg.clear();
|
||||||
@@ -39,34 +26,35 @@ class PlDanmakuController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void queryDanmaku(int segmentIndex) async {
|
void queryDanmaku(int segmentIndex) async {
|
||||||
if (requestedSeg.length <= segmentIndex) {
|
if (requestedSeg[segmentIndex] == true) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
assert(requestedSeg[segmentIndex] == false);
|
|
||||||
requestedSeg[segmentIndex] = true;
|
requestedSeg[segmentIndex] = true;
|
||||||
final DmSegMobileReply result = await DanmakuHttp.queryDanmaku(
|
final Map result = await DanmakuHttp.queryDanmaku(
|
||||||
cid: cid,
|
cid: cid,
|
||||||
segmentIndex: segmentIndex + 1,
|
segmentIndex: segmentIndex + 1,
|
||||||
mergeDanmaku: plPlayerController.mergeDanmaku,
|
mergeDanmaku: plPlayerController.mergeDanmaku,
|
||||||
);
|
);
|
||||||
if (result.elems.isNotEmpty) {
|
if (result['status']) {
|
||||||
for (var element in result.elems) {
|
if (result['data'].elems.isNotEmpty) {
|
||||||
int pos = element.progress ~/ 100; //每0.1秒存储一次
|
for (var element in result['data'].elems) {
|
||||||
if (dmSegMap[pos] == null) {
|
int pos = element.progress ~/ 100; //每0.1秒存储一次
|
||||||
dmSegMap[pos] = [];
|
if (dmSegMap[pos] == null) {
|
||||||
|
dmSegMap[pos] = [];
|
||||||
|
}
|
||||||
|
dmSegMap[pos]!.add(element);
|
||||||
}
|
}
|
||||||
dmSegMap[pos]!.add(element);
|
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
requestedSeg[segmentIndex] = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
List<DanmakuElem>? getCurrentDanmaku(int progress) {
|
List<DanmakuElem>? getCurrentDanmaku(int progress) {
|
||||||
int segmentIndex = calcSegment(progress);
|
int segmentIndex = calcSegment(progress);
|
||||||
if (requestedSeg.length <= segmentIndex) {
|
if (requestedSeg[segmentIndex] != true) {
|
||||||
return <DanmakuElem>[];
|
|
||||||
}
|
|
||||||
if (!requestedSeg[segmentIndex]) {
|
|
||||||
queryDanmaku(segmentIndex);
|
queryDanmaku(segmentIndex);
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
if (plPlayerController.danmakuWeight == 0 &&
|
if (plPlayerController.danmakuWeight == 0 &&
|
||||||
plPlayerController.filters.count == 0) {
|
plPlayerController.filters.count == 0) {
|
||||||
|
|||||||
@@ -35,7 +35,6 @@ class _PlDanmakuState extends State<PlDanmaku> {
|
|||||||
late bool enableShowDanmaku;
|
late bool enableShowDanmaku;
|
||||||
int latestAddedPosition = -1;
|
int latestAddedPosition = -1;
|
||||||
bool? _isFullScreen;
|
bool? _isFullScreen;
|
||||||
StreamSubscription? _listenerDanmaku;
|
|
||||||
StreamSubscription? _listenerFS;
|
StreamSubscription? _listenerFS;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@@ -48,20 +47,15 @@ class _PlDanmakuState extends State<PlDanmaku> {
|
|||||||
playerController,
|
playerController,
|
||||||
);
|
);
|
||||||
if (enableShowDanmaku || playerController.isOpenDanmu.value) {
|
if (enableShowDanmaku || playerController.isOpenDanmu.value) {
|
||||||
_plDanmakuController.initiate(
|
_plDanmakuController.queryDanmaku(
|
||||||
playerController.duration.value.inMilliseconds,
|
_plDanmakuController.calcSegment(
|
||||||
playerController.position.value.inMilliseconds);
|
playerController.position.value.inMilliseconds,
|
||||||
|
),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
playerController
|
playerController
|
||||||
..addStatusLister(playerListener)
|
..addStatusLister(playerListener)
|
||||||
..addPositionListener(videoPositionListen);
|
..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) {
|
_listenerFS = playerController.isFullScreen.listen((isFullScreen) {
|
||||||
if (isFullScreen != _isFullScreen) {
|
if (isFullScreen != _isFullScreen) {
|
||||||
_isFullScreen = isFullScreen;
|
_isFullScreen = isFullScreen;
|
||||||
@@ -128,7 +122,6 @@ class _PlDanmakuState extends State<PlDanmaku> {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
void dispose() {
|
void dispose() {
|
||||||
_listenerDanmaku?.cancel();
|
|
||||||
_listenerFS?.cancel();
|
_listenerFS?.cancel();
|
||||||
playerController.removePositionListener(videoPositionListen);
|
playerController.removePositionListener(videoPositionListen);
|
||||||
playerController.removeStatusLister(playerListener);
|
playerController.removeStatusLister(playerListener);
|
||||||
|
|||||||
Reference in New Issue
Block a user