opt: 字幕渲染逻辑
This commit is contained in:
@ -1,95 +0,0 @@
|
|||||||
enum SubtitleType {
|
|
||||||
// 中文(中国)
|
|
||||||
zhCN,
|
|
||||||
// 中文(自动翻译)
|
|
||||||
aizh,
|
|
||||||
// 英语(自动生成)
|
|
||||||
aien,
|
|
||||||
// 中文(简体)
|
|
||||||
zhHans,
|
|
||||||
// 英文(美国)
|
|
||||||
enUS,
|
|
||||||
// 中文繁体
|
|
||||||
zhTW,
|
|
||||||
//
|
|
||||||
en,
|
|
||||||
//
|
|
||||||
pt,
|
|
||||||
//
|
|
||||||
es,
|
|
||||||
}
|
|
||||||
|
|
||||||
extension SubtitleTypeExtension on SubtitleType {
|
|
||||||
String get description {
|
|
||||||
switch (this) {
|
|
||||||
case SubtitleType.zhCN:
|
|
||||||
return '中文(中国)';
|
|
||||||
case SubtitleType.aizh:
|
|
||||||
return '中文(自动翻译)';
|
|
||||||
case SubtitleType.aien:
|
|
||||||
return '英语(自动生成)';
|
|
||||||
case SubtitleType.zhHans:
|
|
||||||
return '中文(简体)';
|
|
||||||
case SubtitleType.enUS:
|
|
||||||
return '英文(美国)';
|
|
||||||
case SubtitleType.zhTW:
|
|
||||||
return '中文(繁体)';
|
|
||||||
case SubtitleType.en:
|
|
||||||
return '英文';
|
|
||||||
case SubtitleType.pt:
|
|
||||||
return '葡萄牙语';
|
|
||||||
case SubtitleType.es:
|
|
||||||
return '西班牙语';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
extension SubtitleIdExtension on SubtitleType {
|
|
||||||
String get id {
|
|
||||||
switch (this) {
|
|
||||||
case SubtitleType.zhCN:
|
|
||||||
return 'zh-CN';
|
|
||||||
case SubtitleType.aizh:
|
|
||||||
return 'ai-zh';
|
|
||||||
case SubtitleType.aien:
|
|
||||||
return 'ai-en';
|
|
||||||
case SubtitleType.zhHans:
|
|
||||||
return 'zh-Hans';
|
|
||||||
case SubtitleType.enUS:
|
|
||||||
return 'en-US';
|
|
||||||
case SubtitleType.zhTW:
|
|
||||||
return 'zh-TW';
|
|
||||||
case SubtitleType.en:
|
|
||||||
return 'en';
|
|
||||||
case SubtitleType.pt:
|
|
||||||
return 'pt';
|
|
||||||
case SubtitleType.es:
|
|
||||||
return 'es';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
extension SubtitleCodeExtension on SubtitleType {
|
|
||||||
int get code {
|
|
||||||
switch (this) {
|
|
||||||
case SubtitleType.zhCN:
|
|
||||||
return 1;
|
|
||||||
case SubtitleType.aizh:
|
|
||||||
return 2;
|
|
||||||
case SubtitleType.aien:
|
|
||||||
return 3;
|
|
||||||
case SubtitleType.zhHans:
|
|
||||||
return 4;
|
|
||||||
case SubtitleType.enUS:
|
|
||||||
return 5;
|
|
||||||
case SubtitleType.zhTW:
|
|
||||||
return 6;
|
|
||||||
case SubtitleType.en:
|
|
||||||
return 7;
|
|
||||||
case SubtitleType.pt:
|
|
||||||
return 8;
|
|
||||||
case SubtitleType.es:
|
|
||||||
return 9;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,6 +1,3 @@
|
|||||||
import 'package:get/get.dart';
|
|
||||||
import '../../common/subtitle_type.dart';
|
|
||||||
|
|
||||||
class SubTitlteModel {
|
class SubTitlteModel {
|
||||||
SubTitlteModel({
|
SubTitlteModel({
|
||||||
this.aid,
|
this.aid,
|
||||||
@ -78,11 +75,6 @@ class SubTitlteItemModel {
|
|||||||
aiType: json["ai_type"],
|
aiType: json["ai_type"],
|
||||||
aiStatus: json["ai_status"],
|
aiStatus: json["ai_status"],
|
||||||
title: json["lan_doc"],
|
title: json["lan_doc"],
|
||||||
code: SubtitleType.values
|
|
||||||
.firstWhereOrNull(
|
|
||||||
(element) => element.id.toString() == json["lan"])
|
|
||||||
?.index ??
|
|
||||||
-1,
|
|
||||||
content: '',
|
content: '',
|
||||||
body: [],
|
body: [],
|
||||||
);
|
);
|
||||||
|
@ -446,15 +446,6 @@ class VideoDetailController extends GetxController
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取字幕内容
|
|
||||||
// Future getSubtitleContent(String url) async {
|
|
||||||
// var res = await Request().get('https:$url');
|
|
||||||
// subtitleContents.value = res.data['body'].map<SubTitileContentModel>((e) {
|
|
||||||
// return SubTitileContentModel.fromJson(e);
|
|
||||||
// }).toList();
|
|
||||||
// setSubtitleContent();
|
|
||||||
// }
|
|
||||||
|
|
||||||
setSubtitleContent() {
|
setSubtitleContent() {
|
||||||
plPlayerController.subtitleContent.value = '';
|
plPlayerController.subtitleContent.value = '';
|
||||||
plPlayerController.subtitles.value = subtitles;
|
plPlayerController.subtitles.value = subtitles;
|
||||||
|
@ -435,7 +435,8 @@ class VideoIntroController extends GetxController {
|
|||||||
videoDetailCtr.danmakuCid.value = cid;
|
videoDetailCtr.danmakuCid.value = cid;
|
||||||
videoDetailCtr.cover.value = cover;
|
videoDetailCtr.cover.value = cover;
|
||||||
videoDetailCtr.queryVideoUrl();
|
videoDetailCtr.queryVideoUrl();
|
||||||
videoDetailCtr.getSubtitle();
|
videoDetailCtr.clearSubtitleContent();
|
||||||
|
await videoDetailCtr.getSubtitle();
|
||||||
videoDetailCtr.setSubtitleContent();
|
videoDetailCtr.setSubtitleContent();
|
||||||
// 重新请求评论
|
// 重新请求评论
|
||||||
try {
|
try {
|
||||||
|
@ -426,7 +426,12 @@ class _HeaderControlState extends State<HeaderControl> {
|
|||||||
/// 选择字幕
|
/// 选择字幕
|
||||||
void showSubtitleDialog() async {
|
void showSubtitleDialog() async {
|
||||||
int tempThemeValue = widget.controller!.subTitleCode.value;
|
int tempThemeValue = widget.controller!.subTitleCode.value;
|
||||||
int len = widget.videoDetailCtr!.subtitles.length;
|
final List subtitles = widget.videoDetailCtr!.subtitles;
|
||||||
|
int len = subtitles.length;
|
||||||
|
if (subtitles.firstWhereOrNull((element) => element.id == tempThemeValue) ==
|
||||||
|
null) {
|
||||||
|
tempThemeValue = -1;
|
||||||
|
}
|
||||||
showDialog(
|
showDialog(
|
||||||
context: context,
|
context: context,
|
||||||
builder: (BuildContext context) {
|
builder: (BuildContext context) {
|
||||||
@ -458,7 +463,7 @@ class _HeaderControlState extends State<HeaderControl> {
|
|||||||
),
|
),
|
||||||
...widget.videoDetailCtr!.subtitles
|
...widget.videoDetailCtr!.subtitles
|
||||||
.map((e) => RadioListTile(
|
.map((e) => RadioListTile(
|
||||||
value: e.code,
|
value: e.id,
|
||||||
title: Text(e.title),
|
title: Text(e.title),
|
||||||
groupValue: tempThemeValue,
|
groupValue: tempThemeValue,
|
||||||
onChanged: (value) {
|
onChanged: (value) {
|
||||||
|
@ -123,7 +123,7 @@ class PlPlayerController {
|
|||||||
PreferredSizeWidget? headerControl;
|
PreferredSizeWidget? headerControl;
|
||||||
PreferredSizeWidget? bottomControl;
|
PreferredSizeWidget? bottomControl;
|
||||||
Widget? danmuWidget;
|
Widget? danmuWidget;
|
||||||
late RxList subtitles;
|
RxList subtitles = [].obs;
|
||||||
String videoType = 'archive';
|
String videoType = 'archive';
|
||||||
|
|
||||||
/// 数据加载监听
|
/// 数据加载监听
|
||||||
@ -660,10 +660,6 @@ class PlPlayerController {
|
|||||||
const Duration(seconds: 1),
|
const Duration(seconds: 1),
|
||||||
() => videoPlayerServiceHandler.onPositionChange(event));
|
() => videoPlayerServiceHandler.onPositionChange(event));
|
||||||
}),
|
}),
|
||||||
|
|
||||||
// onSubTitleOpenChanged.listen((bool event) {
|
|
||||||
// toggleSubtitle(event ? subTitleCode.value : -1);
|
|
||||||
// })
|
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -1067,25 +1063,6 @@ class PlPlayerController {
|
|||||||
void toggleSubtitle(int code) {
|
void toggleSubtitle(int code) {
|
||||||
_subTitleOpen.value = code != -1;
|
_subTitleOpen.value = code != -1;
|
||||||
_subTitleCode.value = code;
|
_subTitleCode.value = code;
|
||||||
// if (code == -1) {
|
|
||||||
// // 关闭字幕
|
|
||||||
// _subTitleOpen.value = false;
|
|
||||||
// _subTitleCode.value = code;
|
|
||||||
// _videoPlayerController?.setSubtitleTrack(SubtitleTrack.no());
|
|
||||||
// return;
|
|
||||||
// }
|
|
||||||
// final SubTitlteItemModel? subtitle = subtitles?.firstWhereOrNull(
|
|
||||||
// (element) => element.code == code,
|
|
||||||
// );
|
|
||||||
// _subTitleOpen.value = true;
|
|
||||||
// _subTitleCode.value = code;
|
|
||||||
// _videoPlayerController?.setSubtitleTrack(
|
|
||||||
// SubtitleTrack.data(
|
|
||||||
// subtitle!.content!,
|
|
||||||
// title: subtitle.title,
|
|
||||||
// language: subtitle.lan,
|
|
||||||
// ),
|
|
||||||
// );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void querySubtitleContent(double progress) {
|
void querySubtitleContent(double progress) {
|
||||||
@ -1097,7 +1074,7 @@ class PlPlayerController {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
final SubTitlteItemModel? subtitle = subtitles.firstWhereOrNull(
|
final SubTitlteItemModel? subtitle = subtitles.firstWhereOrNull(
|
||||||
(element) => element.code == subTitleCode.value,
|
(element) => element.id == subTitleCode.value,
|
||||||
);
|
);
|
||||||
if (subtitle != null && subtitle.body!.isNotEmpty) {
|
if (subtitle != null && subtitle.body!.isNotEmpty) {
|
||||||
for (var content in subtitle.body!) {
|
for (var content in subtitle.body!) {
|
||||||
|
Reference in New Issue
Block a user