refa: subtitle

Closes #553

Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
bggRGjQaUbCoE
2025-03-28 15:56:45 +08:00
parent 5655e6ccdf
commit f36f8d69fc
8 changed files with 98 additions and 149 deletions

View File

@@ -111,9 +111,6 @@ class PlPlayerController {
bool _enableHeart = true;
late DataSource dataSource;
// 视频字幕
final RxList<Map<String, String>> vttSubtitles = <Map<String, String>>[].obs;
final RxInt vttSubtitlesIndex = 0.obs;
Timer? _timer;
Timer? _timerForSeek;
@@ -471,8 +468,6 @@ class PlPlayerController {
DataSource dataSource, {
List<Segment>? segmentList,
List<Segment>? viewPointList,
List<Map<String, String>>? vttSubtitles,
int? vttSubtitlesIndex,
bool? showVP,
List? dmTrend,
bool autoplay = true,
@@ -504,8 +499,6 @@ class PlPlayerController {
this.dataSource = dataSource;
this.segmentList.value = segmentList ?? <Segment>[];
this.viewPointList.value = viewPointList ?? <Segment>[];
this.vttSubtitles.value = vttSubtitles ?? <Map<String, String>>[];
this.vttSubtitlesIndex.value = vttSubtitlesIndex ?? 0;
this.showVP.value = showVP ?? true;
this.dmTrend.value = dmTrend ?? [];
_autoPlay = autoplay;
@@ -555,7 +548,6 @@ class PlPlayerController {
startListeners();
}
await _initializePlayer();
setSubtitle(this.vttSubtitlesIndex.value);
} catch (err, stackTrace) {
dataStatus.status.value = DataStatus.error;
debugPrint(stackTrace.toString());
@@ -1574,22 +1566,6 @@ class PlPlayerController {
}
}
// 设定字幕轨道
setSubtitle(int index) {
if (index == 0) {
_videoPlayerController?.setSubtitleTrack(SubtitleTrack.no());
vttSubtitlesIndex.value = 0;
return;
}
Map<String, String> s = vttSubtitles[index];
_videoPlayerController?.setSubtitleTrack(SubtitleTrack.data(
s['text']!,
title: s['title']!,
language: s['language']!,
));
vttSubtitlesIndex.value = index;
}
static void updatePlayCount() {
if (_instance?._playerCount.value == 1) {
_instance?.dispose();

View File

@@ -550,40 +550,52 @@ class _PLVideoPlayerState extends State<PLVideoPlayer>
/// 字幕
BottomControlType.subtitle: Obx(
() => plPlayerController.vttSubtitles.isEmpty
() => widget.videoDetailController?.subtitles.isEmpty == true
? const SizedBox.shrink()
: SizedBox(
width: widgetWidth,
height: 30,
child: PopupMenuButton<int>(
initialValue: plPlayerController.vttSubtitles.length <
plPlayerController.vttSubtitlesIndex.value
? 0
: plPlayerController.vttSubtitlesIndex.value,
initialValue: widget
.videoDetailController!.vttSubtitlesIndex.value
.clamp(0, widget.videoDetailController!.subtitles.length),
color: Colors.black.withOpacity(0.8),
itemBuilder: (BuildContext context) {
return plPlayerController.vttSubtitles
.asMap()
.entries
.map((entry) {
return PopupMenuItem<int>(
value: entry.key,
return [
PopupMenuItem<int>(
value: 0,
onTap: () {
plPlayerController.setSubtitle(entry.key);
widget.videoDetailController!.setSubtitle(0);
},
child: Text(
"${entry.value['title']}",
"关闭字幕",
style: const TextStyle(color: Colors.white),
),
);
}).toList();
),
...widget.videoDetailController!.subtitles
.asMap()
.entries
.map((entry) {
return PopupMenuItem<int>(
value: entry.key + 1,
onTap: () {
widget.videoDetailController!
.setSubtitle(entry.key + 1);
},
child: Text(
"${entry.value['lan_doc']}",
style: const TextStyle(color: Colors.white),
),
);
})
];
},
child: Container(
width: 35,
height: 30,
alignment: Alignment.center,
child: Icon(
plPlayerController.vttSubtitlesIndex.value == 0
widget.videoDetailController!.vttSubtitlesIndex.value == 0
? Icons.closed_caption_off_outlined
: Icons.closed_caption_off_rounded,
size: 22,