opt: RoutePush bangumi

This commit is contained in:
guozhigq
2024-05-02 22:19:20 +08:00
parent d7c85d17c4
commit 61505c6127
8 changed files with 111 additions and 157 deletions

View File

@ -3,14 +3,13 @@ import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:pilipala/utils/feed_back.dart'; import 'package:pilipala/utils/feed_back.dart';
import 'package:pilipala/utils/image_save.dart'; import 'package:pilipala/utils/image_save.dart';
import 'package:pilipala/utils/route_push.dart';
import '../../models/model_rec_video_item.dart'; import '../../models/model_rec_video_item.dart';
import 'stat/danmu.dart'; import 'stat/danmu.dart';
import 'stat/view.dart'; import 'stat/view.dart';
import '../../http/dynamics.dart'; import '../../http/dynamics.dart';
import '../../http/search.dart';
import '../../http/user.dart'; import '../../http/user.dart';
import '../../http/video.dart'; import '../../http/video.dart';
import '../../models/common/search_type.dart';
import '../../utils/id_utils.dart'; import '../../utils/id_utils.dart';
import '../../utils/utils.dart'; import '../../utils/utils.dart';
import '../constants.dart'; import '../constants.dart';
@ -42,23 +41,11 @@ class VideoCardV extends StatelessWidget {
return; return;
} }
int epId = videoItem.param; int epId = videoItem.param;
SmartDialog.showLoading(msg: '资源获取中'); RoutePush.bangumiPush(
var result = await SearchHttp.bangumiInfo(seasonId: null, epId: epId); null,
if (result['status']) { epId,
var bangumiDetail = result['data']; heroTag: heroTag,
int cid = bangumiDetail.episodes!.first.cid; );
String bvid = IdUtils.av2bv(bangumiDetail.episodes!.first.aid);
SmartDialog.dismiss().then(
(value) => Get.toNamed(
'/video?bvid=$bvid&cid=$cid&epId=$epId',
arguments: {
'pic': videoItem.pic,
'heroTag': heroTag,
'videoType': SearchType.media_bangumi,
},
),
);
}
break; break;
case 'av': case 'av':
String bvid = videoItem.bvid ?? IdUtils.av2bv(videoItem.aid); String bvid = videoItem.bvid ?? IdUtils.av2bv(videoItem.aid);

View File

@ -1,13 +1,10 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:get/get.dart';
import 'package:pilipala/common/constants.dart'; import 'package:pilipala/common/constants.dart';
import 'package:pilipala/common/widgets/badge.dart'; import 'package:pilipala/common/widgets/badge.dart';
import 'package:pilipala/http/search.dart';
import 'package:pilipala/models/bangumi/info.dart';
import 'package:pilipala/models/bangumi/list.dart'; import 'package:pilipala/models/bangumi/list.dart';
import 'package:pilipala/models/common/search_type.dart';
import 'package:pilipala/utils/image_save.dart'; import 'package:pilipala/utils/image_save.dart';
import 'package:pilipala/utils/route_push.dart';
import 'package:pilipala/utils/utils.dart'; import 'package:pilipala/utils/utils.dart';
import 'package:pilipala/common/widgets/network_img_layer.dart'; import 'package:pilipala/common/widgets/network_img_layer.dart';
@ -24,32 +21,12 @@ class BangumiCardV extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
String heroTag = Utils.makeHeroTag(bangumiItem.mediaId); String heroTag = Utils.makeHeroTag(bangumiItem.mediaId);
return InkWell( return InkWell(
onTap: () async { onTap: () {
final int seasonId = bangumiItem.seasonId!; RoutePush.bangumiPush(
SmartDialog.showLoading(msg: '获取中...'); bangumiItem.seasonId,
final res = await SearchHttp.bangumiInfo(seasonId: seasonId); null,
SmartDialog.dismiss().then((value) { heroTag: heroTag,
if (res['status']) { );
if (res['data'].episodes.isEmpty) {
SmartDialog.showToast('资源加载失败');
return;
}
EpisodeItem episode = res['data'].episodes.first;
String bvid = episode.bvid!;
int cid = episode.cid!;
String pic = episode.cover!;
String heroTag = Utils.makeHeroTag(cid);
Get.toNamed(
'/video?bvid=$bvid&cid=$cid&seasonId=$seasonId',
arguments: {
'pic': pic,
'heroTag': heroTag,
'videoType': SearchType.media_bangumi,
'bangumiItem': res['data'],
},
);
}
});
}, },
onLongPress: () => onLongPress: () =>
imageSaveDialog(context, bangumiItem, SmartDialog.dismiss), imageSaveDialog(context, bangumiItem, SmartDialog.dismiss),

View File

@ -14,6 +14,7 @@ import 'package:pilipala/models/dynamics/up.dart';
import 'package:pilipala/models/live/item.dart'; import 'package:pilipala/models/live/item.dart';
import 'package:pilipala/utils/feed_back.dart'; import 'package:pilipala/utils/feed_back.dart';
import 'package:pilipala/utils/id_utils.dart'; import 'package:pilipala/utils/id_utils.dart';
import 'package:pilipala/utils/route_push.dart';
import 'package:pilipala/utils/storage.dart'; import 'package:pilipala/utils/storage.dart';
import 'package:pilipala/utils/utils.dart'; import 'package:pilipala/utils/utils.dart';
@ -220,25 +221,7 @@ class DynamicsController extends GetxController {
print('DYNAMIC_TYPE_PGC_UNION 番剧'); print('DYNAMIC_TYPE_PGC_UNION 番剧');
DynamicArchiveModel pgc = item.modules.moduleDynamic.major.pgc; DynamicArchiveModel pgc = item.modules.moduleDynamic.major.pgc;
if (pgc.epid != null) { if (pgc.epid != null) {
SmartDialog.showLoading(msg: '获取中...'); RoutePush.bangumiPush(null, pgc.epid);
var res = await SearchHttp.bangumiInfo(epId: pgc.epid);
SmartDialog.dismiss();
if (res['status']) {
EpisodeItem episode = res['data'].episodes.first;
String bvid = episode.bvid!;
int cid = episode.cid!;
String pic = episode.cover!;
String heroTag = Utils.makeHeroTag(cid);
Get.toNamed(
'/video?bvid=$bvid&cid=$cid&seasonId=${res['data'].seasonId}',
arguments: {
'pic': pic,
'heroTag': heroTag,
'videoType': SearchType.media_bangumi,
'bangumiItem': res['data'],
},
);
}
} }
break; break;
} }

View File

@ -7,13 +7,13 @@ import 'package:pilipala/common/widgets/network_img_layer.dart';
import 'package:pilipala/http/search.dart'; import 'package:pilipala/http/search.dart';
import 'package:pilipala/http/user.dart'; import 'package:pilipala/http/user.dart';
import 'package:pilipala/http/video.dart'; import 'package:pilipala/http/video.dart';
import 'package:pilipala/models/bangumi/info.dart';
import 'package:pilipala/models/common/business_type.dart'; import 'package:pilipala/models/common/business_type.dart';
import 'package:pilipala/models/common/search_type.dart'; import 'package:pilipala/models/common/search_type.dart';
import 'package:pilipala/models/live/item.dart'; import 'package:pilipala/models/live/item.dart';
import 'package:pilipala/pages/history_search/index.dart'; import 'package:pilipala/pages/history_search/index.dart';
import 'package:pilipala/utils/feed_back.dart'; import 'package:pilipala/utils/feed_back.dart';
import 'package:pilipala/utils/id_utils.dart'; import 'package:pilipala/utils/id_utils.dart';
import 'package:pilipala/utils/route_push.dart';
import 'package:pilipala/utils/utils.dart'; import 'package:pilipala/utils/utils.dart';
class HistoryItem extends StatelessWidget { class HistoryItem extends StatelessWidget {
@ -101,26 +101,11 @@ class HistoryItem extends StatelessWidget {
} }
} else { } else {
if (videoItem.history.epid != '') { if (videoItem.history.epid != '') {
SmartDialog.showLoading(msg: '获取中...'); RoutePush.bangumiPush(
var res = null,
await SearchHttp.bangumiInfo(epId: videoItem.history.epid); videoItem.history.epid,
SmartDialog.dismiss(); heroTag: heroTag,
if (res['status']) { );
EpisodeItem episode = res['data'].episodes.first;
String bvid = episode.bvid!;
int cid = episode.cid!;
String pic = episode.cover!;
String heroTag = Utils.makeHeroTag(cid);
Get.toNamed(
'/video?bvid=$bvid&cid=$cid&seasonId=${res['data'].seasonId}',
arguments: {
'pic': pic,
'heroTag': heroTag,
'videoType': SearchType.media_bangumi,
'bangumiItem': res['data'],
},
);
}
} }
} }
} else { } else {

View File

@ -7,6 +7,7 @@ import 'package:pilipala/common/widgets/network_img_layer.dart';
import 'package:pilipala/http/search.dart'; import 'package:pilipala/http/search.dart';
import 'package:pilipala/models/bangumi/info.dart'; import 'package:pilipala/models/bangumi/info.dart';
import 'package:pilipala/models/common/search_type.dart'; import 'package:pilipala/models/common/search_type.dart';
import 'package:pilipala/utils/route_push.dart';
import 'package:pilipala/utils/utils.dart'; import 'package:pilipala/utils/utils.dart';
Widget searchMbangumiPanel(BuildContext context, ctr, list) { Widget searchMbangumiPanel(BuildContext context, ctr, list) {
@ -108,28 +109,8 @@ Widget searchMbangumiPanel(BuildContext context, ctr, list) {
SizedBox( SizedBox(
height: 32, height: 32,
child: ElevatedButton( child: ElevatedButton(
onPressed: () async { onPressed: () {
SmartDialog.showLoading(msg: '获取中...'); RoutePush.bangumiPush(i.seasonId, null);
var res = await SearchHttp.bangumiInfo(
seasonId: i.seasonId);
SmartDialog.dismiss().then((value) {
if (res['status']) {
EpisodeItem episode = res['data'].episodes.first;
String bvid = episode.bvid!;
int cid = episode.cid!;
String pic = episode.cover!;
String heroTag = Utils.makeHeroTag(cid);
Get.toNamed(
'/video?bvid=$bvid&cid=$cid&seasonId=${i.seasonId}',
arguments: {
'pic': pic,
'heroTag': heroTag,
'videoType': SearchType.media_bangumi,
'bangumiItem': res['data'],
},
);
}
});
}, },
child: const Text('观看'), child: const Text('观看'),
), ),

View File

@ -6,6 +6,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:pilipala/common/widgets/network_img_layer.dart'; import 'package:pilipala/common/widgets/network_img_layer.dart';
import 'package:pilipala/utils/route_push.dart';
import 'package:pilipala/utils/utils.dart'; import 'package:pilipala/utils/utils.dart';
import 'package:pilipala/utils/storage.dart'; import 'package:pilipala/utils/storage.dart';
@ -49,6 +50,13 @@ class ChatItem extends StatelessWidget {
this.e_infos, this.e_infos,
}); });
static List<int> matchNum(String str) {
final RegExp regExp = RegExp(r'\d+');
final Iterable<Match> matches = regExp.allMatches(str);
return matches.map((Match match) => int.parse(match.group(0)!)).toList();
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
bool isOwner = bool isOwner =
@ -154,16 +162,33 @@ class ChatItem extends StatelessWidget {
GestureDetector( GestureDetector(
onTap: () async { onTap: () async {
SmartDialog.showLoading(); SmartDialog.showLoading();
var bvid = content["bvid"]; final String bvid = content["bvid"];
// 16番剧 5投稿
final int source = content["source"];
final String? url = content["url"];
final int cid = await SearchHttp.ab2c(bvid: bvid); final int cid = await SearchHttp.ab2c(bvid: bvid);
final String heroTag = Utils.makeHeroTag(bvid); final String heroTag = Utils.makeHeroTag(bvid);
SmartDialog.dismiss<dynamic>().then( await SmartDialog.dismiss();
(e) => Get.toNamed<dynamic>('/video?bvid=$bvid&cid=$cid', if (source == 5) {
arguments: <String, String?>{ Get.toNamed<dynamic>(
'pic': content['thumb'], '/video?bvid=$bvid&cid=$cid',
'heroTag': heroTag, arguments: <String, String?>{
}), 'pic': content['thumb'],
); 'heroTag': heroTag,
},
);
}
if (source == 16) {
if (url != null) {
final String area = url.split('/').last;
if (area.startsWith('ep')) {
RoutePush.bangumiPush(null, matchNum(area).first);
} else if (area.startsWith('ss')) {
RoutePush.bangumiPush(matchNum(area).first, null);
}
}
}
}, },
child: NetworkImgLayer( child: NetworkImgLayer(
width: 220, width: 220,
@ -183,7 +208,7 @@ class ChatItem extends StatelessWidget {
), ),
const SizedBox(height: 1), const SizedBox(height: 1),
Text( Text(
content['author'], content['author'] ?? '',
style: TextStyle( style: TextStyle(
letterSpacing: 0.6, letterSpacing: 0.6,
height: 1.5, height: 1.5,
@ -206,7 +231,7 @@ class ChatItem extends StatelessWidget {
SmartDialog.dismiss<dynamic>().then( SmartDialog.dismiss<dynamic>().then(
(e) => Get.toNamed<dynamic>('/video?bvid=$bvid&cid=$cid', (e) => Get.toNamed<dynamic>('/video?bvid=$bvid&cid=$cid',
arguments: <String, String?>{ arguments: <String, String?>{
'pic': content['thumb'], 'pic': content['thumb'] ?? '',
'heroTag': heroTag, 'heroTag': heroTag,
}), }),
); );

View File

@ -2,6 +2,7 @@ import 'package:appscheme/appscheme.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:pilipala/utils/route_push.dart';
import '../http/search.dart'; import '../http/search.dart';
import '../models/common/search_type.dart'; import '../models/common/search_type.dart';
import 'id_utils.dart'; import 'id_utils.dart';
@ -68,7 +69,7 @@ class PiliSchame {
} else if (host == 'bangumi') { } else if (host == 'bangumi') {
if (path.startsWith('/season')) { if (path.startsWith('/season')) {
final String seasonId = path.split('/').last; final String seasonId = path.split('/').last;
_bangumiPush(int.parse(seasonId), null); RoutePush.bangumiPush(int.parse(seasonId), null);
} }
} else if (host == 'opus') { } else if (host == 'opus') {
if (path.startsWith('/detail')) { if (path.startsWith('/detail')) {
@ -126,35 +127,6 @@ class PiliSchame {
} }
} }
// 番剧跳转
static Future<void> _bangumiPush(int? seasonId, int? epId) async {
SmartDialog.showLoading<dynamic>(msg: '获取中...');
try {
var result = await SearchHttp.bangumiInfo(seasonId: seasonId, epId: epId);
if (result['status']) {
var bangumiDetail = result['data'];
final int cid = bangumiDetail.episodes!.first.cid;
final String bvid = IdUtils.av2bv(bangumiDetail.episodes!.first.aid);
final String heroTag = Utils.makeHeroTag(cid);
var epId = bangumiDetail.episodes!.first.id;
SmartDialog.dismiss().then(
(e) => Get.toNamed(
'/video?bvid=$bvid&cid=$cid&epId=$epId',
arguments: <String, dynamic>{
'pic': bangumiDetail.cover,
'heroTag': heroTag,
'videoType': SearchType.media_bangumi,
},
),
);
} else {
SmartDialog.showToast(result['msg']);
}
} catch (e) {
SmartDialog.showToast('番剧获取失败:$e');
}
}
static Future<void> _fullPathPush(SchemeEntity value) async { static Future<void> _fullPathPush(SchemeEntity value) async {
// https://m.bilibili.com/bangumi/play/ss39708 // https://m.bilibili.com/bangumi/play/ss39708
// https | m.bilibili.com | /bangumi/play/ss39708 // https | m.bilibili.com | /bangumi/play/ss39708
@ -177,10 +149,10 @@ class PiliSchame {
} }
if (path.startsWith('/bangumi')) { if (path.startsWith('/bangumi')) {
if (lastPathSegment.contains('ss')) { if (lastPathSegment.contains('ss')) {
_bangumiPush(matchNum(lastPathSegment).first, null); RoutePush.bangumiPush(matchNum(lastPathSegment).first, null);
} }
if (lastPathSegment.contains('ep')) { if (lastPathSegment.contains('ep')) {
_bangumiPush(null, matchNum(lastPathSegment).first); RoutePush.bangumiPush(null, matchNum(lastPathSegment).first);
} }
} }
} else if (host.contains('live')) { } else if (host.contains('live')) {
@ -233,9 +205,9 @@ class PiliSchame {
case 'bangumi': case 'bangumi':
print('番剧'); print('番剧');
if (area.startsWith('ep')) { if (area.startsWith('ep')) {
_bangumiPush(null, matchNum(area).first); RoutePush.bangumiPush(null, matchNum(area).first);
} else if (area.startsWith('ss')) { } else if (area.startsWith('ss')) {
_bangumiPush(matchNum(area).first, null); RoutePush.bangumiPush(matchNum(area).first, null);
} }
break; break;
case 'video': case 'video':
@ -276,12 +248,12 @@ class PiliSchame {
static void _handleEpisodePath(String lastPathSegment, String redirectUrl) { static void _handleEpisodePath(String lastPathSegment, String redirectUrl) {
final String seasonId = _extractIdFromPath(lastPathSegment); final String seasonId = _extractIdFromPath(lastPathSegment);
_bangumiPush(null, matchNum(seasonId).first); RoutePush.bangumiPush(null, matchNum(seasonId).first);
} }
static void _handleSeasonPath(String lastPathSegment, String redirectUrl) { static void _handleSeasonPath(String lastPathSegment, String redirectUrl) {
final String seasonId = _extractIdFromPath(lastPathSegment); final String seasonId = _extractIdFromPath(lastPathSegment);
_bangumiPush(matchNum(seasonId).first, null); RoutePush.bangumiPush(matchNum(seasonId).first, null);
} }
static String _extractIdFromPath(String lastPathSegment) { static String _extractIdFromPath(String lastPathSegment) {

44
lib/utils/route_push.dart Normal file
View File

@ -0,0 +1,44 @@
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:get/get.dart';
import 'package:pilipala/http/search.dart';
import 'package:pilipala/models/bangumi/info.dart';
import 'package:pilipala/models/common/search_type.dart';
import 'package:pilipala/utils/utils.dart';
class RoutePush {
// 番剧跳转
static Future<void> bangumiPush(int? seasonId, int? epId,
{String? heroTag}) async {
SmartDialog.showLoading<dynamic>(msg: '获取中...');
try {
var result = await SearchHttp.bangumiInfo(seasonId: seasonId, epId: epId);
await SmartDialog.dismiss();
if (result['status']) {
if (result['data'].episodes.isEmpty) {
SmartDialog.showToast('资源获取失败');
return;
}
final BangumiInfoModel bangumiDetail = result['data'];
final EpisodeItem episode = bangumiDetail.episodes!.first;
final int epId = episode.id!;
final int cid = episode.cid!;
final String bvid = episode.bvid!;
final String cover = episode.cover!;
final Map arguments = <String, dynamic>{
'pic': cover,
'videoType': SearchType.media_bangumi,
// 'bangumiItem': bangumiDetail,
};
arguments['heroTag'] = heroTag ?? Utils.makeHeroTag(cid);
Get.toNamed(
'/video?bvid=$bvid&cid=$cid&epId=$epId',
arguments: arguments,
);
} else {
SmartDialog.showToast(result['msg']);
}
} catch (e) {
SmartDialog.showToast('番剧获取失败:$e');
}
}
}