mirror of
https://github.com/bggRGjQaUbCoE/PiliPlus.git
synced 2026-04-20 11:08:03 +08:00
refa: download video (#1737)
* opt: save pb danmaku * refa: download video * opt: replaceAll * fix: wait delete * opt: remove completer * fix: index.json * tweaks Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me> --------- Co-authored-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
committed by
GitHub
parent
37b1228552
commit
407b31c5c1
@@ -1,14 +1,12 @@
|
||||
import 'dart:convert';
|
||||
import 'dart:io' show File;
|
||||
|
||||
import 'package:PiliPlus/grpc/bilibili/community/service/dm/v1.pb.dart';
|
||||
import 'package:PiliPlus/grpc/dm.dart';
|
||||
import 'package:PiliPlus/plugin/pl_player/controller.dart';
|
||||
import 'package:PiliPlus/utils/accounts.dart';
|
||||
import 'package:fixnum/fixnum.dart' show Int64;
|
||||
import 'package:PiliPlus/utils/path_utils.dart';
|
||||
import 'package:flutter/foundation.dart' show kDebugMode;
|
||||
import 'package:path/path.dart' as path;
|
||||
import 'package:xml/xml.dart';
|
||||
|
||||
class PlDanmakuController {
|
||||
PlDanmakuController(
|
||||
@@ -36,7 +34,7 @@ class PlDanmakuController {
|
||||
requestedSeg.clear();
|
||||
}
|
||||
|
||||
int calcSegment(int progress) {
|
||||
static int calcSegment(int progress) {
|
||||
return progress ~/ segmentLength;
|
||||
}
|
||||
|
||||
@@ -102,7 +100,7 @@ class PlDanmakuController {
|
||||
|
||||
List<DanmakuElem>? getCurrentDanmaku(int progress) {
|
||||
if (isFileSource) {
|
||||
initXmlDmIfNeeded();
|
||||
initFileDmIfNeeded();
|
||||
} else {
|
||||
final int segmentIndex = calcSegment(progress);
|
||||
if (!requestedSeg.contains(segmentIndex)) {
|
||||
@@ -115,68 +113,24 @@ class PlDanmakuController {
|
||||
|
||||
bool closed = false;
|
||||
|
||||
late bool _xmlDmLoaded = false;
|
||||
bool _fileDmLoaded = false;
|
||||
|
||||
void initXmlDmIfNeeded() {
|
||||
if (_xmlDmLoaded) return;
|
||||
_xmlDmLoaded = true;
|
||||
_initXmlDm();
|
||||
void initFileDmIfNeeded() {
|
||||
if (_fileDmLoaded) return;
|
||||
_fileDmLoaded = true;
|
||||
_initFileDm();
|
||||
}
|
||||
|
||||
Future<void> _initXmlDm() async {
|
||||
Future<void> _initFileDm() async {
|
||||
try {
|
||||
final file = File(path.join(plPlayerController.dirPath!, 'danmaku.xml'));
|
||||
final stream = file.openRead().transform(utf8.decoder);
|
||||
final buffer = StringBuffer();
|
||||
await for (final chunk in stream) {
|
||||
if (closed) {
|
||||
return;
|
||||
}
|
||||
buffer.write(chunk);
|
||||
}
|
||||
if (closed) {
|
||||
return;
|
||||
}
|
||||
final xmlString = buffer.toString();
|
||||
final document = XmlDocument.parse(xmlString);
|
||||
final danmakus = document.findAllElements('d').toList();
|
||||
final elems = <DanmakuElem>[];
|
||||
for (final dm in danmakus) {
|
||||
if (closed) {
|
||||
return;
|
||||
}
|
||||
try {
|
||||
final pAttr = dm.getAttribute('p');
|
||||
if (pAttr != null) {
|
||||
final parts = pAttr.split(',');
|
||||
final progress = double.parse(parts[0]); // sec
|
||||
final mode = int.parse(parts[1]);
|
||||
final fontsize = int.parse(parts[2]);
|
||||
final color = int.parse(parts[3]);
|
||||
// final ctime = int.parse(parts[4]);
|
||||
// final pool = int.parse(parts[5]);
|
||||
final midHash = parts[6];
|
||||
final id = int.parse(parts[7]);
|
||||
final weight = int.parse(parts[8]);
|
||||
final content = dm.innerText;
|
||||
elems.add(
|
||||
DanmakuElem(
|
||||
progress: (progress * 1000).toInt(),
|
||||
mode: mode,
|
||||
fontsize: fontsize,
|
||||
color: color,
|
||||
midHash: midHash,
|
||||
id: Int64(id),
|
||||
weight: weight,
|
||||
content: content,
|
||||
),
|
||||
);
|
||||
}
|
||||
} catch (_) {
|
||||
if (kDebugMode) rethrow;
|
||||
}
|
||||
}
|
||||
handleDanmaku(elems);
|
||||
final file = File(
|
||||
path.join(plPlayerController.dirPath!, PathUtils.danmakuName),
|
||||
);
|
||||
if (!file.existsSync()) return;
|
||||
final bytes = await file.readAsBytes();
|
||||
if (bytes.isEmpty) return;
|
||||
final elem = DmSegMobileReply.fromBuffer(bytes).elems;
|
||||
handleDanmaku(elem);
|
||||
} catch (_) {
|
||||
if (kDebugMode) rethrow;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user