Skip to content

Commit

Permalink
feat: interactive video
Browse files Browse the repository at this point in the history
Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
  • Loading branch information
bggRGjQaUbCoE committed Feb 7, 2025
1 parent 331fd0d commit a581945
Show file tree
Hide file tree
Showing 5 changed files with 125 additions and 5 deletions.
3 changes: 3 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,9 @@

## feat

- [x] 互动视频
- [x] 发评反诈
- [x] 高能进度条
- [x] 滑动跳转预览视频缩略图
- [x] Live Photo
- [x] 复制/移动收藏夹/稍后再看视频
Expand Down
4 changes: 2 additions & 2 deletions lib/http/video.dart
Original file line number Diff line number Diff line change
Expand Up @@ -977,7 +977,6 @@ class VideoHttp {
);
if (res.data['code'] == 0) {
dynamic data = res.data['data'];
List subtitlesJson = data['subtitle']['subtitles'];
/*
[
{
Expand All @@ -995,10 +994,11 @@ class VideoHttp {
*/
return {
'status': true,
'data': subtitlesJson,
'data': data['subtitle']['subtitles'],
'view_points': data['view_points'],
// 'last_play_time': data['last_play_time'],
'last_play_cid': data['last_play_cid'],
'interaction': data['interaction'],
};
} else {
return {'status': false, 'data': [], 'msg': res.data['message']};
Expand Down
47 changes: 46 additions & 1 deletion lib/pages/video/detail/controller.dart
Original file line number Diff line number Diff line change
Expand Up @@ -1846,6 +1846,31 @@ class VideoDetailController extends GetxController
});
}

// interactive video
dynamic graphVersion;
Map? steinEdgeInfo;
late final RxBool showSteinEdgeInfo = false.obs;
void getSteinEdgeInfo([edgeId]) async {
steinEdgeInfo = null;
try {
dynamic res = await Request().get(
'https://api.bilibili.com/x/stein/edgeinfo_v2',
queryParameters: {
'bvid': bvid,
'graph_version': graphVersion,
if (edgeId != null) 'edge_id': edgeId,
},
);
if (res.data['code'] == 0) {
steinEdgeInfo = res.data['data'];
} else {
debugPrint('getSteinEdgeInfo error: ${res.data['message']}');
}
} catch (e) {
debugPrint('getSteinEdgeInfo: $e');
}
}

late bool continuePlayingPart = GStorage.continuePlayingPart;

Future _querySubtitles() async {
Expand All @@ -1854,6 +1879,19 @@ class VideoDetailController extends GetxController
// SmartDialog.showToast('查询字幕错误,${res["msg"]}');
// }
if (res['status']) {
// interactive video
if (graphVersion == null) {
try {
final introCtr = Get.find<VideoIntroController>(tag: heroTag);
if (introCtr.videoDetail.value.rights?['is_stein_gate'] == 1) {
graphVersion = res['interaction']?['graph_version'];
getSteinEdgeInfo();
}
} catch (e) {
debugPrint('handle stein: $e');
}
}

if (continuePlayingPart) {
continuePlayingPart = false;
try {
Expand Down Expand Up @@ -1945,7 +1983,7 @@ class VideoDetailController extends GetxController
super.onClose();
}

onReset() {
onReset([isStein]) {
playedTime = null;
videoUrl = null;
audioUrl = null;
Expand All @@ -1968,6 +2006,13 @@ class VideoDetailController extends GetxController
segmentList.clear();
_segmentProgressList = null;
}

// interactive video
if (isStein != true) {
graphVersion = null;
}
steinEdgeInfo = null;
showSteinEdgeInfo.value = false;
}

late final showDmChart = GStorage.showDmChart;
Expand Down
4 changes: 2 additions & 2 deletions lib/pages/video/detail/introduction/controller.dart
Original file line number Diff line number Diff line change
Expand Up @@ -578,13 +578,13 @@ class VideoIntroController extends GetxController
}

// 修改分P或番剧分集
Future changeSeasonOrbangu(epid, bvid, cid, aid, cover) async {
Future changeSeasonOrbangu(epid, bvid, cid, aid, cover, [isStein]) async {
// 重新获取视频资源
final videoDetailCtr = Get.find<VideoDetailController>(tag: heroTag)
..plPlayerController.pause()
..makeHeartBeat()
..updateMediaListHistory(aid)
..onReset()
..onReset(isStein)
..bvid = bvid
..oid.value = aid ?? IdUtils.bv2av(bvid)
..cid.value = cid
Expand Down
72 changes: 72 additions & 0 deletions lib/pages/video/detail/view.dart
Original file line number Diff line number Diff line change
Expand Up @@ -240,6 +240,15 @@ class _VideoDetailPageState extends State<VideoDetailPage>
// 播放器状态监听
void playerListener(PlayerStatus? status) async {
if (status == PlayerStatus.completed) {
try {
if ((videoDetailController.steinEdgeInfo?['edges']['questions'][0]
['choices'] as List?)
?.isNotEmpty ==
true) {
videoDetailController.showSteinEdgeInfo.value = true;
return;
}
} catch (_) {}
shutdownTimerService.handleWaitingFinished();
bool notExitFlag = false;

Expand Down Expand Up @@ -1421,6 +1430,69 @@ class _VideoDetailPageState extends State<VideoDetailPage>
// child: Text('index'),
// ),
// ),

Obx(
() {
if (videoDetailController.showSteinEdgeInfo.value) {
try {
return Align(
alignment: Alignment.bottomCenter,
child: Padding(
padding: EdgeInsets.symmetric(
horizontal: 16,
vertical: plPlayerController?.showControls.value == true
? 75
: 16,
),
child: Wrap(
spacing: 25,
runSpacing: 10,
children: (videoDetailController.steinEdgeInfo!['edges']
['questions'][0]['choices'] as List)
.map((item) {
return FilledButton.tonal(
style: FilledButton.styleFrom(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(6),
),
backgroundColor: Theme.of(context)
.colorScheme
.secondaryContainer
.withOpacity(0.8),
padding: const EdgeInsets.symmetric(
horizontal: 15,
vertical: 10,
),
visualDensity:
VisualDensity(horizontal: -2, vertical: -2),
tapTargetSize: MaterialTapTargetSize.shrinkWrap,
),
onPressed: () {
videoIntroController.changeSeasonOrbangu(
null,
videoDetailController.bvid,
item['cid'],
IdUtils.bv2av(videoDetailController.bvid),
null,
true,
);
videoDetailController
.getSteinEdgeInfo(item['id']);
},
child: Text(item['option']),
);
}).toList(),
),
),
);
} catch (e) {
debugPrint('build stein edges: $e');
return const SizedBox.shrink();
}
}
return const SizedBox.shrink();
},
),
],
);

Expand Down

0 comments on commit a581945

Please sign in to comment.