fix: danmaku block

Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
bggRGjQaUbCoE
2024-12-26 18:10:30 +08:00
parent d3c7b3830f
commit 79da08b285
59 changed files with 207 additions and 303 deletions

View File

@@ -1,15 +1,15 @@
import 'package:PiliPalaX/http/danmaku.dart';
import 'package:PiliPalaX/models/danmaku/dm.pb.dart';
import 'package:flutter/cupertino.dart';
import 'package:PiliPalaX/plugin/pl_player/controller.dart';
class PlDanmakuController {
PlDanmakuController(
this.cid, this.danmakuWeightNotifier, this.danmakuFilterNotifier);
this.cid,
this.plPlayerController,
);
final int cid;
final ValueNotifier<int> danmakuWeightNotifier;
final ValueNotifier<List<Map<String, dynamic>>> danmakuFilterNotifier;
int danmakuWeight = 0;
List<Map<String, dynamic>> danmakuFilter = [];
final PlPlayerController plPlayerController;
Map<int, List<DanmakuElem>> dmSegMap = {};
// 已请求的段落标记
List<bool> requestedSeg = [];
@@ -22,16 +22,6 @@ class PlDanmakuController {
if (videoDuration <= 0) {
return;
}
danmakuWeightNotifier.addListener(() {
debugPrint(
"danmakuWeight changed from $danmakuWeight to ${danmakuWeightNotifier.value}");
danmakuWeight = danmakuWeightNotifier.value;
});
danmakuFilterNotifier.addListener(() {
debugPrint(
"danmakuFilter changed from $danmakuFilter to ${danmakuFilterNotifier.value}");
danmakuFilter = danmakuFilterNotifier.value;
});
if (requestedSeg.isEmpty) {
int segCount = (videoDuration / segmentLength).ceil();
requestedSeg = List<bool>.generate(segCount, (index) => false);
@@ -40,9 +30,6 @@ class PlDanmakuController {
}
void dispose() {
danmakuWeightNotifier.removeListener(() {});
danmakuFilterNotifier.removeListener(() {});
danmakuFilter.clear();
dmSegMap.clear();
requestedSeg.clear();
}
@@ -78,18 +65,20 @@ class PlDanmakuController {
if (!requestedSeg[segmentIndex]) {
queryDanmaku(segmentIndex);
}
if (danmakuWeight == 0 && danmakuFilter.isEmpty) {
if (plPlayerController.danmakuWeight == 0 &&
plPlayerController.danmakuFilterRule.isEmpty) {
return dmSegMap[progress ~/ 100];
} else {
return dmSegMap[progress ~/ 100]
?.where((element) => element.weight >= danmakuWeight)
?.where(
(element) => element.weight >= plPlayerController.danmakuWeight)
.where(filterDanmaku)
.toList();
}
}
bool filterDanmaku(DanmakuElem elem) {
for (var filter in danmakuFilter) {
for (var filter in plPlayerController.danmakuFilterRule) {
switch (filter['type']) {
case 0:
if (elem.content.contains(filter['filter'])) {

View File

@@ -3,7 +3,6 @@ import 'dart:async';
import 'package:canvas_danmaku/canvas_danmaku.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:hive/hive.dart';
import 'package:PiliPalaX/models/danmaku/dm.pb.dart';
import 'package:PiliPalaX/pages/danmaku/index.dart';
import 'package:PiliPalaX/plugin/pl_player/index.dart';
@@ -28,10 +27,10 @@ class PlDanmaku extends StatefulWidget {
}
class _PlDanmakuState extends State<PlDanmaku> {
late PlPlayerController playerController;
PlPlayerController get playerController => widget.playerController;
late PlDanmakuController _plDanmakuController;
DanmakuController? _controller;
Box setting = GStorage.setting;
late bool enableShowDanmaku;
int latestAddedPosition = -1;
bool? _isFullScreen;
@@ -41,24 +40,20 @@ class _PlDanmakuState extends State<PlDanmaku> {
@override
void initState() {
super.initState();
enableShowDanmaku =
setting.get(SettingBoxKey.enableShowDanmaku, defaultValue: true);
enableShowDanmaku = GStorage.setting
.get(SettingBoxKey.enableShowDanmaku, defaultValue: true);
_plDanmakuController = PlDanmakuController(
widget.cid,
widget.playerController.danmakuWeight,
widget.playerController.danmakuFilterRule);
if (mounted) {
playerController = widget.playerController;
if (enableShowDanmaku || playerController.isOpenDanmu.value) {
_plDanmakuController.initiate(
playerController.duration.value.inMilliseconds,
playerController.position.value.inMilliseconds);
}
playerController
..addStatusLister(playerListener)
..addPositionListener(videoPositionListen);
widget.cid,
playerController,
);
if (enableShowDanmaku || playerController.isOpenDanmu.value) {
_plDanmakuController.initiate(
playerController.duration.value.inMilliseconds,
playerController.position.value.inMilliseconds);
}
playerController
..addStatusLister(playerListener)
..addPositionListener(videoPositionListen);
_listenerDanmaku = playerController.isOpenDanmu.listen((p0) {
if (p0 && !_plDanmakuController.initiated) {
_plDanmakuController.initiate(