opt view fav

Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
bggRGjQaUbCoE
2025-05-31 14:47:36 +08:00
parent 3364b52e33
commit 1462e6ecf1
18 changed files with 219 additions and 202 deletions

View File

@@ -97,8 +97,9 @@ class VideoCardH extends StatelessWidget {
} }
} }
try { try {
final int cid = videoItem.cid ?? final int? cid = videoItem.cid ??
await SearchHttp.ab2c(aid: aid, bvid: bvid); await SearchHttp.ab2c(aid: aid, bvid: bvid);
if (cid != null) {
if (source == 'later') { if (source == 'later') {
onViewLater!(cid); onViewLater!(cid);
} else { } else {
@@ -110,6 +111,7 @@ class VideoCardH extends StatelessWidget {
}, },
); );
} }
}
} catch (err) { } catch (err) {
SmartDialog.showToast(err.toString()); SmartDialog.showToast(err.toString());
} }

View File

@@ -159,22 +159,25 @@ class SearchHttp {
} }
} }
static Future<int> ab2c({dynamic aid, dynamic bvid, int? part}) async { static Future<int?> ab2c({dynamic aid, dynamic bvid, int? part}) async {
Map<String, dynamic> data = {}; var res = await Request().get(
if (aid != null) { Api.ab2c,
data['aid'] = aid; queryParameters: {
} else if (bvid != null) { if (aid != null) 'aid': aid,
data['bvid'] = bvid; if (bvid != null) 'bvid': bvid,
} },
var res = await Request().get(Api.ab2c, queryParameters: data); );
if (res.data['code'] == 0) { if (res.data['code'] == 0) {
if (res.data['data'] case List list) {
return part != null return part != null
? ((res.data['data'] as List).getOrNull(part - 1)?['cid'] ?? ? (list.getOrNull(part - 1)?['cid'] ?? list.firstOrNull?['cid'])
res.data['data'].first['cid']) : list.firstOrNull?['cid'];
: res.data['data'].first['cid']; } else {
return null;
}
} else { } else {
SmartDialog.showToast("ab2c error: ${res.data['message']}"); SmartDialog.showToast("ab2c error: ${res.data['message']}");
return -1; return null;
} }
} }

View File

@@ -59,8 +59,8 @@ class FavDetailItemData extends BaseVideoItemModel with MultiSelectData {
} }
} }
static final _digitRegExp = RegExp(r'\d+'); static final _digitRegExp = RegExp(r'ep(\d+)');
String resolveEpId(String url) => _digitRegExp.firstMatch(url)!.group(0)!; String? resolveEpId(String url) => _digitRegExp.firstMatch(url)?.group(1);
} }
class Ogv { class Ogv {

View File

@@ -218,13 +218,15 @@ TextSpan? richNode(
recognizer: TapGestureRecognizer() recognizer: TapGestureRecognizer()
..onTap = () async { ..onTap = () async {
try { try {
int cid = await SearchHttp.ab2c(bvid: i.rid); int? cid = await SearchHttp.ab2c(bvid: i.rid);
if (cid != null) {
PageUtils.toVideoPage( PageUtils.toVideoPage(
'bvid=${i.rid}&cid=$cid', 'bvid=${i.rid}&cid=$cid',
arguments: { arguments: {
'heroTag': Utils.makeHeroTag(i.rid), 'heroTag': Utils.makeHeroTag(i.rid),
}, },
); );
}
} catch (err) { } catch (err) {
SmartDialog.showToast(err.toString()); SmartDialog.showToast(err.toString());
} }

View File

@@ -546,7 +546,7 @@ class _EpisodePanelState extends CommonSlidePageState<EpisodePanel> {
? Icons.notifications_off_outlined ? Icons.notifications_off_outlined
: Icons.notifications_active_outlined, : Icons.notifications_active_outlined,
onPressed: () async { onPressed: () async {
dynamic result = await VideoHttp.seasonFav( var result = await VideoHttp.seasonFav(
isFav: response, isFav: response,
seasonId: widget.seasonId, seasonId: widget.seasonId,
); );

View File

@@ -4,15 +4,11 @@ import 'package:PiliPlus/common/widgets/button/icon_button.dart';
import 'package:PiliPlus/common/widgets/image/image_save.dart'; import 'package:PiliPlus/common/widgets/image/image_save.dart';
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
import 'package:PiliPlus/common/widgets/stat/stat.dart'; import 'package:PiliPlus/common/widgets/stat/stat.dart';
import 'package:PiliPlus/http/search.dart';
import 'package:PiliPlus/http/video.dart';
import 'package:PiliPlus/models/common/badge_type.dart'; import 'package:PiliPlus/models/common/badge_type.dart';
import 'package:PiliPlus/models/user/fav_detail.dart'; import 'package:PiliPlus/models/user/fav_detail.dart';
import 'package:PiliPlus/utils/id_utils.dart';
import 'package:PiliPlus/utils/page_utils.dart'; import 'package:PiliPlus/utils/page_utils.dart';
import 'package:PiliPlus/utils/utils.dart'; import 'package:PiliPlus/utils/utils.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
// 收藏视频卡片 - 水平布局 // 收藏视频卡片 - 水平布局
@@ -36,8 +32,6 @@ class FavVideoCardH extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
int id = videoItem.id!;
String bvid = videoItem.bvid ?? IdUtils.av2bv(id);
return InkWell( return InkWell(
onTap: isSort == true onTap: isSort == true
? null ? null
@@ -46,26 +40,21 @@ class FavVideoCardH extends StatelessWidget {
onTap!(); onTap!();
return; return;
} }
String? epId;
if (videoItem.type == 24) {
videoItem.cid = await SearchHttp.ab2c(bvid: bvid);
dynamic seasonId = videoItem.ogv!.seasonId;
epId = videoItem.epId;
PageUtils.viewBangumi(seasonId: seasonId, epId: epId);
return;
} else if (videoItem.page == 0 || videoItem.page! > 1) {
var result = await VideoHttp.videoIntro(bvid: bvid);
if (result['status']) {
epId = result['data'].epId;
} else {
SmartDialog.showToast(result['msg']);
}
}
if (!const [0, 16].contains(videoItem.attr)) { if (!const [0, 16].contains(videoItem.attr)) {
Get.toNamed('/member?mid=${videoItem.owner.mid}'); Get.toNamed('/member?mid=${videoItem.owner.mid}');
return; return;
} }
// pgc
if (videoItem.type == 24) {
PageUtils.viewBangumi(
seasonId: videoItem.ogv!.seasonId,
epId: videoItem.epId,
);
return;
}
onViewFav?.call(); onViewFav?.call();
}, },
onLongPress: isSort == true onLongPress: isSort == true

View File

@@ -76,8 +76,9 @@ class HistoryItem extends StatelessWidget {
if (epid != null) { if (epid != null) {
PageUtils.viewBangumi(epId: epid); PageUtils.viewBangumi(epId: epid);
} else { } else {
int cid = videoItem.history.cid ?? int? cid = videoItem.history.cid ??
await SearchHttp.ab2c(aid: aid, bvid: bvid); await SearchHttp.ab2c(aid: aid, bvid: bvid);
if (cid != null) {
PageUtils.toVideoPage( PageUtils.toVideoPage(
'bvid=$bvid&cid=$cid', 'bvid=$bvid&cid=$cid',
arguments: { arguments: {
@@ -86,6 +87,7 @@ class HistoryItem extends StatelessWidget {
}, },
); );
} }
}
} else { } else {
SmartDialog.showToast(result['msg']); SmartDialog.showToast(result['msg']);
} }
@@ -95,8 +97,9 @@ class HistoryItem extends StatelessWidget {
} }
} }
} else { } else {
int cid = videoItem.history.cid ?? int? cid = videoItem.history.cid ??
await SearchHttp.ab2c(aid: aid, bvid: bvid); await SearchHttp.ab2c(aid: aid, bvid: bvid);
if (cid != null) {
PageUtils.toVideoPage( PageUtils.toVideoPage(
'bvid=$bvid&cid=$cid', 'bvid=$bvid&cid=$cid',
arguments: { arguments: {
@@ -105,6 +108,7 @@ class HistoryItem extends StatelessWidget {
}, },
); );
} }
}
}, },
onLongPress: () { onLongPress: () {
if (ctr is MultiSelectController || ctr is HistoryBaseController) { if (ctr is MultiSelectController || ctr is HistoryBaseController) {

View File

@@ -30,7 +30,7 @@ class HistorySearchController
loadingState loadingState
..value.data!.removeAt(index) ..value.data!.removeAt(index)
..refresh(); ..refresh();
}
SmartDialog.showToast(res['msg']); SmartDialog.showToast(res['msg']);
} }
} }
}

View File

@@ -346,15 +346,8 @@ class _LiveRoomPageState extends State<LiveRoomPage>
: Row( : Row(
children: [ children: [
GestureDetector( GestureDetector(
onTap: () { onTap: () => Get.toNamed(
dynamic uid = roomInfoH5.roomInfo?.uid; '/member?mid=${roomInfoH5.roomInfo?.uid}'),
Get.toNamed(
'/member?mid=$uid',
arguments: {
'heroTag': Utils.makeHeroTag(uid),
},
);
},
child: NetworkImgLayer( child: NetworkImgLayer(
width: 34, width: 34,
height: 34, height: 34,

View File

@@ -34,8 +34,9 @@ class MemberCoinsItem extends StatelessWidget {
} }
} }
} }
int cid = int? cid =
await SearchHttp.ab2c(aid: coinItem.aid, bvid: coinItem.bvid); await SearchHttp.ab2c(aid: coinItem.aid, bvid: coinItem.bvid);
if (cid != null) {
PageUtils.toVideoPage( PageUtils.toVideoPage(
'bvid=${coinItem.bvid}&cid=$cid', 'bvid=${coinItem.bvid}&cid=$cid',
arguments: { arguments: {
@@ -43,6 +44,7 @@ class MemberCoinsItem extends StatelessWidget {
'heroTag': Utils.makeHeroTag(coinItem.aid) 'heroTag': Utils.makeHeroTag(coinItem.aid)
}, },
); );
}
}, },
onLongPress: () => imageSaveDialog( onLongPress: () => imageSaveDialog(
title: coinItem.title, title: coinItem.title,

View File

@@ -147,11 +147,12 @@ class MemberVideoCtr
if (list.isNullOrEmpty) return; if (list.isNullOrEmpty) return;
if (episodicButton.value.text == '继续播放') { if (episodicButton.value.text == '继续播放') {
dynamic oid = RegExp(r'oid=([\d]+)') String? oid = RegExp(r'oid=(\d+)')
.firstMatch('${episodicButton.value.uri}') .firstMatch('${episodicButton.value.uri}')
?.group(1); ?.group(1);
dynamic bvid = IdUtils.av2bv(int.tryParse(oid) ?? 0); if (oid != null) {
dynamic cid = await SearchHttp.ab2c(aid: oid, bvid: bvid); var bvid = IdUtils.av2bv(int.parse(oid));
var cid = await SearchHttp.ab2c(aid: oid, bvid: bvid);
PageUtils.toVideoPage( PageUtils.toVideoPage(
'bvid=$bvid&cid=$cid', 'bvid=$bvid&cid=$cid',
arguments: { arguments: {
@@ -176,6 +177,7 @@ class MemberVideoCtr
'isContinuePlaying': true, 'isContinuePlaying': true,
}, },
); );
}
return; return;
} }

View File

@@ -28,7 +28,8 @@ class SubVideoCardH extends StatelessWidget {
String bvid = videoItem.bvid!; String bvid = videoItem.bvid!;
return InkWell( return InkWell(
onTap: () async { onTap: () async {
int cid = await SearchHttp.ab2c(bvid: bvid); int? cid = await SearchHttp.ab2c(bvid: bvid);
if (cid != null) {
PageUtils.toVideoPage( PageUtils.toVideoPage(
'bvid=$bvid&cid=$cid', 'bvid=$bvid&cid=$cid',
arguments: { arguments: {
@@ -37,6 +38,7 @@ class SubVideoCardH extends StatelessWidget {
'videoType': SearchType.video, 'videoType': SearchType.video,
}, },
); );
}
}, },
onLongPress: () => imageSaveDialog( onLongPress: () => imageSaveDialog(
title: videoItem.title, title: videoItem.title,

View File

@@ -164,9 +164,11 @@ class _MediaListPanelState
String bvid = item.bvid!; String bvid = item.bvid!;
int? aid = item.aid; int? aid = item.aid;
String cover = item.cover ?? ''; String cover = item.cover ?? '';
final int cid = final int? cid =
item.cid ?? await SearchHttp.ab2c(aid: aid, bvid: bvid); item.cid ?? await SearchHttp.ab2c(aid: aid, bvid: bvid);
if (cid != null) {
widget.changeMediaList?.call(bvid, cid, aid, cover); widget.changeMediaList?.call(bvid, cid, aid, cover);
}
}, },
onLongPress: () => imageSaveDialog( onLongPress: () => imageSaveDialog(
title: item.title, title: item.title,

View File

@@ -2160,7 +2160,7 @@ class _VideoDetailPageVState extends State<VideoDetailPageV>
..cid.refresh(); ..cid.refresh();
} else { } else {
// switch to first episode // switch to first episode
dynamic episode = videoIntroController.videoDetail.value.ugcSeason! var episode = videoIntroController.videoDetail.value.ugcSeason!
.sections![videoDetailController.seasonIndex.value].episodes!.first; .sections![videoDetailController.seasonIndex.value].episodes!.first;
if (episode.cid != videoDetailController.cid.value) { if (episode.cid != videoDetailController.cid.value) {
changeEpisode(episode); changeEpisode(episode);
@@ -2182,7 +2182,7 @@ class _VideoDetailPageVState extends State<VideoDetailPageV>
videoDetailController.cid.refresh(); videoDetailController.cid.refresh();
} else { } else {
// switch to first episode // switch to first episode
dynamic episode = videoIntroController.videoDetail.value.pages!.first; var episode = videoIntroController.videoDetail.value.pages!.first;
if (episode.cid != videoDetailController.cid.value) { if (episode.cid != videoDetailController.cid.value) {
changeEpisode(episode); changeEpisode(episode);
} else { } else {

View File

@@ -291,8 +291,9 @@ class ChatItem extends StatelessWidget {
String bvid = match.group(0)!; String bvid = match.group(0)!;
try { try {
SmartDialog.showLoading(); SmartDialog.showLoading();
final int cid = await SearchHttp.ab2c(bvid: bvid); final int? cid = await SearchHttp.ab2c(bvid: bvid);
SmartDialog.dismiss(); SmartDialog.dismiss();
if (cid != null) {
PageUtils.toVideoPage( PageUtils.toVideoPage(
'bvid=$bvid&cid=$cid', 'bvid=$bvid&cid=$cid',
arguments: <String, String?>{ arguments: <String, String?>{
@@ -300,6 +301,7 @@ class ChatItem extends StatelessWidget {
'heroTag': Utils.makeHeroTag(bvid), 'heroTag': Utils.makeHeroTag(bvid),
}, },
); );
}
} catch (err) { } catch (err) {
SmartDialog.dismiss(); SmartDialog.dismiss();
SmartDialog.showToast(err.toString()); SmartDialog.showToast(err.toString());
@@ -378,8 +380,9 @@ class ChatItem extends StatelessWidget {
try { try {
SmartDialog.showLoading(); SmartDialog.showLoading();
var bvid = content["bvid"]; var bvid = content["bvid"];
final int cid = await SearchHttp.ab2c(bvid: bvid); final int? cid = await SearchHttp.ab2c(bvid: bvid);
SmartDialog.dismiss(); SmartDialog.dismiss();
if (cid != null) {
PageUtils.toVideoPage( PageUtils.toVideoPage(
'bvid=$bvid&cid=$cid', 'bvid=$bvid&cid=$cid',
arguments: { arguments: {
@@ -387,6 +390,7 @@ class ChatItem extends StatelessWidget {
'heroTag': Utils.makeHeroTag(bvid), 'heroTag': Utils.makeHeroTag(bvid),
}, },
); );
}
} catch (err) { } catch (err) {
SmartDialog.dismiss(); SmartDialog.dismiss();
SmartDialog.showToast(err.toString()); SmartDialog.showToast(err.toString());
@@ -460,8 +464,9 @@ class ChatItem extends StatelessWidget {
} }
bvid ??= IdUtils.av2bv(aid); bvid ??= IdUtils.av2bv(aid);
SmartDialog.showLoading(); SmartDialog.showLoading();
final int cid = await SearchHttp.ab2c(bvid: bvid); final int? cid = await SearchHttp.ab2c(bvid: bvid);
SmartDialog.dismiss(); SmartDialog.dismiss();
if (cid != null) {
PageUtils.toVideoPage( PageUtils.toVideoPage(
'bvid=$bvid&cid=$cid', 'bvid=$bvid&cid=$cid',
arguments: <String, String?>{ arguments: <String, String?>{
@@ -469,6 +474,7 @@ class ChatItem extends StatelessWidget {
'heroTag': Utils.makeHeroTag(bvid), 'heroTag': Utils.makeHeroTag(bvid),
}, },
); );
}
}; };
break; break;

View File

@@ -624,7 +624,8 @@ class PiliScheme {
?.group(1); ?.group(1);
if (bvid != null) { if (bvid != null) {
if (mediaId != null) { if (mediaId != null) {
final int cid = await SearchHttp.ab2c(bvid: bvid); final int? cid = await SearchHttp.ab2c(bvid: bvid);
if (cid != null) {
PageUtils.toVideoPage( PageUtils.toVideoPage(
'bvid=$bvid&cid=$cid', 'bvid=$bvid&cid=$cid',
arguments: { arguments: {
@@ -637,6 +638,7 @@ class PiliScheme {
'isContinuePlaying': true, 'isContinuePlaying': true,
}, },
); );
}
} else { } else {
videoPush(null, bvid, off: off); videoPush(null, bvid, off: off);
} }
@@ -852,7 +854,7 @@ class PiliScheme {
if (showDialog) { if (showDialog) {
SmartDialog.showLoading<dynamic>(msg: '获取中...'); SmartDialog.showLoading<dynamic>(msg: '获取中...');
} }
final int cid = await SearchHttp.ab2c( final int? cid = await SearchHttp.ab2c(
bvid: bvid, bvid: bvid,
aid: aid, aid: aid,
part: part != null ? int.tryParse(part) : null, part: part != null ? int.tryParse(part) : null,
@@ -860,6 +862,7 @@ class PiliScheme {
if (showDialog) { if (showDialog) {
SmartDialog.dismiss(); SmartDialog.dismiss();
} }
if (cid != null) {
PageUtils.toVideoPage( PageUtils.toVideoPage(
'bvid=$bvid&cid=$cid', 'bvid=$bvid&cid=$cid',
arguments: { arguments: {
@@ -870,6 +873,7 @@ class PiliScheme {
off: off, off: off,
preventDuplicates: false, preventDuplicates: false,
); );
}
} catch (e) { } catch (e) {
SmartDialog.dismiss(); SmartDialog.dismiss();
SmartDialog.showToast('video获取失败: $e'); SmartDialog.showToast('video获取失败: $e');

View File

@@ -393,7 +393,8 @@ class PageUtils {
try { try {
String bvid = item.modules.moduleDynamic!.major!.archive!.bvid!; String bvid = item.modules.moduleDynamic!.major!.archive!.bvid!;
String cover = item.modules.moduleDynamic!.major!.archive!.cover!; String cover = item.modules.moduleDynamic!.major!.archive!.cover!;
int cid = await SearchHttp.ab2c(bvid: bvid); int? cid = await SearchHttp.ab2c(bvid: bvid);
if (cid != null) {
toVideoPage( toVideoPage(
'bvid=$bvid&cid=$cid', 'bvid=$bvid&cid=$cid',
arguments: { arguments: {
@@ -402,6 +403,7 @@ class PageUtils {
}, },
preventDuplicates: false, preventDuplicates: false,
); );
}
} catch (err) { } catch (err) {
SmartDialog.showToast(err.toString()); SmartDialog.showToast(err.toString());
} }
@@ -456,7 +458,8 @@ class PageUtils {
int aid = ugcSeason.aid!; int aid = ugcSeason.aid!;
String bvid = IdUtils.av2bv(aid); String bvid = IdUtils.av2bv(aid);
String cover = ugcSeason.cover!; String cover = ugcSeason.cover!;
int cid = await SearchHttp.ab2c(bvid: bvid); int? cid = await SearchHttp.ab2c(bvid: bvid);
if (cid != null) {
toVideoPage( toVideoPage(
'bvid=$bvid&cid=$cid', 'bvid=$bvid&cid=$cid',
arguments: { arguments: {
@@ -465,6 +468,7 @@ class PageUtils {
}, },
preventDuplicates: false, preventDuplicates: false,
); );
}
break; break;
/// 番剧查看 /// 番剧查看

View File

@@ -49,7 +49,8 @@ class UrlUtils {
int? aid = matchRes['AV']; int? aid = matchRes['AV'];
String? bvid = matchRes['BV']; String? bvid = matchRes['BV'];
bvid ??= IdUtils.av2bv(aid!); bvid ??= IdUtils.av2bv(aid!);
final int cid = await SearchHttp.ab2c(aid: aid, bvid: bvid); final int? cid = await SearchHttp.ab2c(aid: aid, bvid: bvid);
if (cid != null) {
PageUtils.toVideoPage( PageUtils.toVideoPage(
'bvid=$bvid&cid=$cid', 'bvid=$bvid&cid=$cid',
arguments: <String, String?>{ arguments: <String, String?>{
@@ -58,6 +59,7 @@ class UrlUtils {
}, },
preventDuplicates: false, preventDuplicates: false,
); );
}
} else { } else {
if (redirectUrl.isNotEmpty) { if (redirectUrl.isNotEmpty) {
PageUtils.handleWebview(redirectUrl); PageUtils.handleWebview(redirectUrl);