From 09cebd70ae496e3faa98bcefed4dea91ab230dd1 Mon Sep 17 00:00:00 2001 From: bggRGjQaUbCoE Date: Sun, 23 Feb 2025 10:42:21 +0800 Subject: [PATCH] mod: seek from dm Closes #208 Signed-off-by: bggRGjQaUbCoE --- lib/pages/video/detail/controller.dart | 15 +++++++++++-- lib/utils/app_scheme.dart | 29 +++++++++++++++++++++----- 2 files changed, 37 insertions(+), 7 deletions(-) diff --git a/lib/pages/video/detail/controller.dart b/lib/pages/video/detail/controller.dart index 957e6d30..012fe45b 100644 --- a/lib/pages/video/detail/controller.dart +++ b/lib/pages/video/detail/controller.dart @@ -1070,7 +1070,12 @@ class VideoDetailController extends GetxController if (data.dash == null && data.durl != null) { videoUrl = data.durl!.first.url!; audioUrl = ''; - this.defaultST = defaultST ?? Duration.zero; + if (Get.arguments['progress'] != null) { + this.defaultST = Duration(milliseconds: Get.arguments['progress']); + Get.arguments['progress'] = null; + } else { + this.defaultST = defaultST ?? Duration.zero; + } // 实际为FLV/MP4格式,但已被淘汰,这里仅做兜底处理 firstVideo = VideoItem( id: data.quality!, @@ -1188,7 +1193,13 @@ class VideoDetailController extends GetxController audioUrl = ''; } // - this.defaultST = defaultST ?? Duration(milliseconds: data.lastPlayTime!); + if (Get.arguments['progress'] != null) { + this.defaultST = Duration(milliseconds: Get.arguments['progress']); + Get.arguments['progress'] = null; + } else { + this.defaultST = + defaultST ?? Duration(milliseconds: data.lastPlayTime!); + } if (autoPlay.value) { isShowCover.value = false; await playerInit(); diff --git a/lib/utils/app_scheme.dart b/lib/utils/app_scheme.dart index b71d823a..59d74a6b 100644 --- a/lib/utils/app_scheme.dart +++ b/lib/utils/app_scheme.dart @@ -86,6 +86,7 @@ class PiliScheme { } return false; case 'video': + // bilibili://video/12345678?dm_progress=123000&cid=12345678&dmid=12345678 if (uri.queryParameters['comment_root_id'] != null) { // to check // to video reply @@ -130,11 +131,27 @@ class PiliScheme { .firstMatch(path) ?.group(1); if (aid != null || bvid != null) { - videoPush( - aid != null ? int.parse(aid) : null, - bvid, - off: off, - ); + if (uri.queryParameters['cid'] != null) { + bvid ??= IdUtils.av2bv(int.parse(aid!)); + Utils.toDupNamed( + '/video?bvid=$bvid&cid=${uri.queryParameters['cid']}', + arguments: { + 'pic': null, + 'heroTag': Utils.makeHeroTag(aid), + if (uri.queryParameters['dm_progress'] != null) + 'progress': + int.tryParse(uri.queryParameters['dm_progress']!), + }, + off: off, + ); + } else { + videoPush( + aid != null ? int.parse(aid) : null, + bvid, + off: off, + progress: uri.queryParameters['dm_progress'], + ); + } return true; } return false; @@ -529,6 +546,7 @@ class PiliScheme { String? bvid, { bool showDialog = true, bool off = false, + String? progress, }) async { try { aid ??= IdUtils.bv2av(bvid!); @@ -545,6 +563,7 @@ class PiliScheme { arguments: { 'pic': null, 'heroTag': Utils.makeHeroTag(aid), + if (progress != null) 'progress': int.tryParse(progress), }, off: off, );