refa player (#1848)

* tweak

* Reapply "opt: audio uri" (#1833)

This reverts commit 8e726f49b2.

* opt: player

* opt: player

* refa: create player

* refa: player

* opt: UaType

* fix: sb seek preview

* opt: setSub

* fix: screenshot

* opt: unnecessary final player state

* opt: player track

* opt FileSource constructor [skip ci]

* fixes

* fix: dispose player

* fix: quote

* update

* fix: multi ua & remove unused loop

* remove unneeded check [skip ci]

---------

Co-authored-by: dom <githubaccount56556@proton.me>
This commit is contained in:
My-Responsitories
2026-02-27 15:51:55 +08:00
committed by GitHub
parent 6782bee11a
commit 7276cde48a
39 changed files with 1063 additions and 1112 deletions

View File

@@ -1,4 +1,5 @@
import 'dart:async';
import 'dart:io';
import 'dart:math' show min;
import 'dart:ui';
@@ -7,11 +8,9 @@ import 'package:PiliPlus/common/widgets/pair.dart';
import 'package:PiliPlus/common/widgets/progress_bar/segment_progress_bar.dart';
import 'package:PiliPlus/grpc/bilibili/app/listener/v1.pbenum.dart'
show PlaylistSource;
import 'package:PiliPlus/http/constants.dart';
import 'package:PiliPlus/http/fav.dart';
import 'package:PiliPlus/http/init.dart';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/http/ua_type.dart';
import 'package:PiliPlus/http/user.dart';
import 'package:PiliPlus/http/video.dart';
import 'package:PiliPlus/main.dart';
@@ -55,10 +54,12 @@ import 'package:PiliPlus/plugin/pl_player/models/play_status.dart';
import 'package:PiliPlus/services/download/download_service.dart';
import 'package:PiliPlus/utils/accounts.dart';
import 'package:PiliPlus/utils/extension/context_ext.dart';
import 'package:PiliPlus/utils/extension/file_ext.dart';
import 'package:PiliPlus/utils/extension/iterable_ext.dart';
import 'package:PiliPlus/utils/extension/num_ext.dart';
import 'package:PiliPlus/utils/extension/size_ext.dart';
import 'package:PiliPlus/utils/page_utils.dart';
import 'package:PiliPlus/utils/path_utils.dart';
import 'package:PiliPlus/utils/platform_utils.dart';
import 'package:PiliPlus/utils/storage.dart';
import 'package:PiliPlus/utils/storage_pref.dart';
@@ -71,7 +72,8 @@ import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:flutter_volume_controller/flutter_volume_controller.dart';
import 'package:get/get.dart';
import 'package:hive/hive.dart';
import 'package:media_kit/media_kit.dart';
import 'package:media_kit/media_kit.dart' hide Subtitle;
import 'package:path/path.dart' as path;
class VideoDetailController extends GetxController
with GetTickerProviderStateMixin, BlockMixin {
@@ -675,27 +677,21 @@ class VideoDetailController extends GetxController
bool? autoplay,
Volume? volume,
}) async {
final onlyPlayAudio = plPlayerController.onlyPlayAudio.value;
Duration? seek = seekToTime ?? defaultST ?? playedTime;
if (seek == null || seek == Duration.zero) {
seek = getFirstSegment();
}
await plPlayerController.setDataSource(
DataSource(
videoSource: isFileSource
? null
: onlyPlayAudio
? audio ?? audioUrl
: video ?? videoUrl,
audioSource: isFileSource || onlyPlayAudio ? null : audio ?? audioUrl,
type: isFileSource ? DataSourceType.file : DataSourceType.network,
httpHeaders: isFileSource
? null
: {
'user-agent': UaType.pc.ua,
'referer': HttpString.baseUrl,
},
),
isFileSource
? FileSource(
dir: args['dirPath'],
typeTag: entry.typeTag!,
isMp4: entry.mediaType == 1,
)
: NetworkSource(
videoSource: video ?? videoUrl!,
audioSource: audio ?? audioUrl,
),
seekTo: seek,
duration:
duration ??
@@ -720,9 +716,6 @@ class VideoDetailController extends GetxController
width: firstVideo.width,
height: firstVideo.height,
volume: volume ?? this.volume,
dirPath: isFileSource ? args['dirPath'] : null,
typeTag: isFileSource ? entry.typeTag : null,
mediaType: isFileSource ? entry.mediaType : null,
);
if (isClosed) return;
@@ -1013,14 +1006,24 @@ class VideoDetailController extends GetxController
Future<void> setSub(({bool isData, String id}) subtitle) async {
final sub = subtitles[index - 1];
String subUri = subtitle.id;
File? file;
if (subtitle.isData) {
subUri = path.join(tmpDirPath, '${cid.value}-${sub.lan}.vtt');
file = File(subUri);
if (!file.existsSync()) {
await file.writeAsString(subtitle.id);
if (plPlayerController.videoPlayerController?.disposed == false) {
plPlayerController.videoPlayerController!.release.add(file.tryDel);
} else {
file.tryDel();
return;
}
}
}
await plPlayerController.videoPlayerController?.setSubtitleTrack(
SubtitleTrack(
subtitle.id,
sub.lanDoc,
sub.lan,
uri: !subtitle.isData,
data: subtitle.isData,
),
SubtitleTrack(subUri, sub.lanDoc, sub.lan, uri: true),
);
vttSubtitlesIndex.value = index;
}