opt: get bangumiInfo

This commit is contained in:
bggRGjQaUbCoE
2024-10-05 08:45:39 +08:00
parent 6c84b0c6cb
commit 052e8f905e
8 changed files with 269 additions and 180 deletions

View File

@@ -1,3 +1,4 @@
import 'package:PiliPalaX/models/bangumi/info.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart'; import 'package:flutter/rendering.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
@@ -43,25 +44,40 @@ class VideoCardV extends StatelessWidget {
return; return;
} }
int epId = videoItem.param; int epId = videoItem.param;
SmartDialog.showLoading(msg: '资源获取中'); Utils.viewBangumi(epId: epId);
var result = await SearchHttp.bangumiInfo(seasonId: null, epId: epId); // SmartDialog.showLoading(msg: '资源获取中');
SmartDialog.dismiss(); // var result = await SearchHttp.bangumiInfo(seasonId: null, epId: epId);
if (result['status']) { // SmartDialog.dismiss();
var bangumiDetail = result['data']; // if (result['status']) {
int cid = bangumiDetail.episodes!.first.cid; // var bangumiDetail = result['data'];
String bvid = IdUtils.av2bv(bangumiDetail.episodes!.first.aid); // EpisodeItem episode = result['data'].episodes.first;
String seasonId = bangumiDetail.seasonId; // int? epId = result['data'].userStatus?.progress?.lastEpId;
Get.toNamed( // if (epId == null) {
'/video?bvid=$bvid&cid=$cid&seasonId=$seasonId&epId=$epId', // epId = episode.epId;
arguments: { // } else {
'pic': videoItem.pic, // for (var item in result['data'].episodes) {
'heroTag': heroTag, // if (item.epId == epId) {
'videoType': SearchType.media_bangumi, // episode = item;
}, // break;
); // }
} else { // }
SmartDialog.showToast(result['msg']); // }
} // String bvid = episode.bvid!;
// int cid = episode.cid!;
// String pic = episode.cover!;
// String seasonId = bangumiDetail.seasonId;
// dynamic heroTag = Utils.makeHeroTag(cid);
// Get.toNamed(
// '/video?bvid=$bvid&cid=$cid&seasonId=$seasonId&epId=$epId',
// arguments: {
// 'pic': pic,
// 'heroTag': heroTag,
// 'videoType': SearchType.media_bangumi,
// },
// );
// } else {
// SmartDialog.showToast(result['msg']);
// }
break; break;
case 'av': case 'av':
String bvid = videoItem.bvid ?? IdUtils.av2bv(videoItem.aid); String bvid = videoItem.bvid ?? IdUtils.av2bv(videoItem.aid);

View File

@@ -31,7 +31,7 @@ class BangumiIntroController extends CommonController {
// 视频bvid // 视频bvid
String bvid = Get.parameters['bvid'] ?? ''; String bvid = Get.parameters['bvid'] ?? '';
var seasonId = Get.parameters['seasonId'] != null var seasonId = Get.parameters['seasonId'] != null
? int.parse(Get.parameters['seasonId']!) ? int.tryParse(Get.parameters['seasonId']!)
: null; : null;
var epId = Get.parameters['epId'] != null var epId = Get.parameters['epId'] != null
? int.tryParse(Get.parameters['epId']!) ? int.tryParse(Get.parameters['epId']!)

View File

@@ -42,45 +42,46 @@ class BangumiCardV extends StatelessWidget {
child: InkWell( child: InkWell(
onTap: () async { onTap: () async {
final int seasonId = bangumiItem.seasonId; final int seasonId = bangumiItem.seasonId;
SmartDialog.showLoading(msg: '获取中...'); Utils.viewBangumi(seasonId: seasonId);
final res = await SearchHttp.bangumiInfo(seasonId: seasonId); // SmartDialog.showLoading(msg: '获取中...');
SmartDialog.dismiss().then((value) { // final res = await SearchHttp.bangumiInfo(seasonId: seasonId);
if (res['status']) { // SmartDialog.dismiss().then((value) {
if (res['data'].episodes.isEmpty) { // if (res['status']) {
SmartDialog.showToast('资源加载失败'); // if (res['data'].episodes.isEmpty) {
return; // SmartDialog.showToast('资源加载失败');
} // return;
EpisodeItem episode = res['data'].episodes.first; // }
int? epId = res['data'].userStatus?.progress?.lastEpId; // EpisodeItem episode = res['data'].episodes.first;
if (epId == null) { // int? epId = res['data'].userStatus?.progress?.lastEpId;
epId = episode.epId; // if (epId == null) {
} else { // epId = episode.epId;
for (var item in res['data'].episodes) { // } else {
if (item.epId == epId) { // for (var item in res['data'].episodes) {
episode = item; // if (item.epId == epId) {
break; // episode = item;
} // break;
} // }
} // }
String bvid = episode.bvid!; // }
int cid = episode.cid!; // String bvid = episode.bvid!;
String pic = episode.cover!; // int cid = episode.cid!;
print('epId'); // String pic = episode.cover!;
print(epId); // // print('epId');
String heroTag = Utils.makeHeroTag(cid); // // print(epId);
Get.toNamed( // String heroTag = Utils.makeHeroTag(cid);
'/video?bvid=$bvid&cid=$cid&seasonId=$seasonId&epId=$epId', // Get.toNamed(
arguments: { // '/video?bvid=$bvid&cid=$cid&seasonId=$seasonId&epId=$epId',
'pic': pic, // arguments: {
'heroTag': heroTag, // 'pic': pic,
'videoType': SearchType.media_bangumi, // 'heroTag': heroTag,
'bangumiItem': res['data'], // 'videoType': SearchType.media_bangumi,
}, // 'bangumiItem': res['data'],
); // },
} else { // );
SmartDialog.showToast(res['msg']); // } else {
} // SmartDialog.showToast(res['msg']);
}); // }
// });
}, },
child: Column( child: Column(
children: [ children: [

View File

@@ -178,37 +178,38 @@ 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: '获取中...'); Utils.viewBangumi(epId: pgc.epid);
var res = await SearchHttp.bangumiInfo(epId: pgc.epid); // SmartDialog.showLoading(msg: '获取中...');
SmartDialog.dismiss(); // var res = await SearchHttp.bangumiInfo(epId: pgc.epid);
if (res['status']) { // SmartDialog.dismiss();
// dynamic episode -> progress episode -> first episode // if (res['status']) {
EpisodeItem episode = (res['data'].episodes as List) // // dynamic episode -> progress episode -> first episode
.firstWhereOrNull( // EpisodeItem episode = (res['data'].episodes as List)
(item) => item.epId == pgc.epid, // .firstWhereOrNull(
) ?? // (item) => item.epId == pgc.epid,
(res['data'].episodes as List).firstWhereOrNull( // ) ??
(item) => // (res['data'].episodes as List).firstWhereOrNull(
item.epId == res['data'].userStatus?.progress?.lastEpId, // (item) =>
) ?? // item.epId == res['data'].userStatus?.progress?.lastEpId,
res['data'].episodes.first; // ) ??
dynamic epId = episode.epId; // res['data'].episodes.first;
dynamic bvid = episode.bvid; // dynamic epId = episode.epId;
dynamic cid = episode.cid; // dynamic bvid = episode.bvid;
dynamic pic = episode.cover; // dynamic cid = episode.cid;
dynamic heroTag = Utils.makeHeroTag(cid); // dynamic pic = episode.cover;
Utils.toDupNamed( // dynamic heroTag = Utils.makeHeroTag(cid);
'/video?bvid=$bvid&cid=$cid&seasonId=${res['data'].seasonId}&epId=$epId', // Utils.toDupNamed(
arguments: { // '/video?bvid=$bvid&cid=$cid&seasonId=${res['data'].seasonId}&epId=$epId',
'pic': pic, // arguments: {
'heroTag': heroTag, // 'pic': pic,
'videoType': SearchType.media_bangumi, // 'heroTag': heroTag,
'bangumiItem': res['data'], // 'videoType': SearchType.media_bangumi,
}, // 'bangumiItem': res['data'],
); // },
} else { // );
SmartDialog.showToast(res['msg']); // } else {
} // SmartDialog.showToast(res['msg']);
// }
} }
break; break;
} }

View File

@@ -106,34 +106,42 @@ class HistoryItem extends StatelessWidget {
} }
} else { } else {
if (videoItem.history.epid != '') { if (videoItem.history.epid != '') {
SmartDialog.showLoading(msg: '获取中...'); Utils.viewBangumi(epId: videoItem.history.epid);
var res = // SmartDialog.showLoading(msg: '获取中...');
await SearchHttp.bangumiInfo(epId: videoItem.history.epid); // var res =
SmartDialog.dismiss(); // await SearchHttp.bangumiInfo(epId: videoItem.history.epid);
if (res['status']) { // SmartDialog.dismiss();
EpisodeItem episode = res['data'].episodes.first; // if (res['status']) {
for (EpisodeItem i in res['data'].episodes) { // var bangumiDetail = res['data'];
if (i.epId == videoItem.history.epid) { // EpisodeItem episode = res['data'].episodes.first;
episode = i; // int? epId = res['data'].userStatus?.progress?.lastEpId;
break; // if (epId == null) {
} // epId = episode.epId;
} // } else {
String bvid = episode.bvid!; // for (var item in res['data'].episodes) {
int cid = episode.cid!; // if (item.epId == epId) {
String pic = episode.cover!; // episode = item;
String heroTag = Utils.makeHeroTag(cid); // break;
Get.toNamed( // }
'/video?bvid=$bvid&cid=$cid&seasonId=${res['data'].seasonId}&epId=${episode.epId}', // }
arguments: { // }
'pic': pic, // String bvid = episode.bvid!;
'heroTag': heroTag, // int cid = episode.cid!;
'videoType': SearchType.media_bangumi, // String pic = episode.cover!;
'bangumiItem': res['data'], // String seasonId = bangumiDetail.seasonId;
}, // dynamic heroTag = Utils.makeHeroTag(cid);
); // Get.toNamed(
} else { // '/video?bvid=$bvid&cid=$cid&seasonId=$seasonId&epId=$epId',
SmartDialog.showToast(res['msg']); // arguments: {
} // 'pic': pic,
// 'heroTag': heroTag,
// 'videoType': SearchType.media_bangumi,
// 'bangumiItem': res['data'],
// },
// );
// } else {
// SmartDialog.showToast(res['msg']);
// }
} }
} }
} else { } else {

View File

@@ -137,47 +137,48 @@ Widget searchBangumiPanel(BuildContext context, ctr, loadingState) {
height: 32, height: 32,
child: ElevatedButton( child: ElevatedButton(
onPressed: () async { onPressed: () async {
SmartDialog.showLoading(msg: '获取中...'); Utils.viewBangumi(seasonId: i.seasonId);
var res = await SearchHttp.bangumiInfo( // SmartDialog.showLoading(msg: '获取中...');
seasonId: i.seasonId); // var res = await SearchHttp.bangumiInfo(
SmartDialog.dismiss().then((value) { // seasonId: i.seasonId);
if (res['status']) { // SmartDialog.dismiss().then((value) {
EpisodeItem episode = // if (res['status']) {
res['data'].episodes.first; // EpisodeItem episode =
int? epId = res['data'] // res['data'].episodes.first;
.userStatus // int? epId = res['data']
?.progress // .userStatus
?.lastEpId; // ?.progress
if (epId == null) { // ?.lastEpId;
epId = episode.epId; // if (epId == null) {
} else { // epId = episode.epId;
for (var item // } else {
in res['data'].episodes) { // for (var item
if (item.epId == epId) { // in res['data'].episodes) {
episode = item; // if (item.epId == epId) {
break; // episode = item;
} // break;
} // }
} // }
String bvid = episode.bvid!; // }
int cid = episode.cid!; // String bvid = episode.bvid!;
String pic = episode.cover!; // int cid = episode.cid!;
String heroTag = // String pic = episode.cover!;
Utils.makeHeroTag(cid); // String heroTag =
Get.toNamed( // Utils.makeHeroTag(cid);
'/video?bvid=$bvid&cid=$cid&seasonId=${i.seasonId}&epId=$epId', // Get.toNamed(
arguments: { // '/video?bvid=$bvid&cid=$cid&seasonId=${i.seasonId}&epId=$epId',
'pic': pic, // arguments: {
'heroTag': heroTag, // 'pic': pic,
'videoType': // 'heroTag': heroTag,
SearchType.media_bangumi, // 'videoType':
'bangumiItem': res['data'], // SearchType.media_bangumi,
}, // 'bangumiItem': res['data'],
); // },
} else { // );
SmartDialog.showToast(res['msg']); // } else {
} // SmartDialog.showToast(res['msg']);
}); // }
// });
}, },
child: const Text('观看'), child: const Text('观看'),
), ),

View File

@@ -1,5 +1,6 @@
import 'dart:async'; import 'dart:async';
import 'package:PiliPalaX/models/bangumi/info.dart';
import 'package:PiliPalaX/models/common/reply_type.dart'; import 'package:PiliPalaX/models/common/reply_type.dart';
import 'package:PiliPalaX/pages/video/detail/reply/widgets/reply_item.dart'; import 'package:PiliPalaX/pages/video/detail/reply/widgets/reply_item.dart';
import 'package:app_links/app_links.dart'; import 'package:app_links/app_links.dart';
@@ -270,28 +271,41 @@ class PiliScheme {
// 番剧跳转 // 番剧跳转
static Future<void> bangumiPush(int? seasonId, int? epId) async { static Future<void> bangumiPush(int? seasonId, int? epId) async {
print('seasonId: $seasonId, epId: $epId'); print('seasonId: $seasonId, epId: $epId');
SmartDialog.showLoading<dynamic>(msg: '获取中...'); // SmartDialog.showLoading<dynamic>(msg: '获取中...');
try { try {
var result = await SearchHttp.bangumiInfo(seasonId: seasonId, epId: epId); Utils.viewBangumi(seasonId: seasonId, epId: epId);
if (result['status']) { // var result = await SearchHttp.bangumiInfo(seasonId: seasonId, epId: epId);
var bangumiDetail = result['data']; // if (result['status']) {
final int cid = bangumiDetail.episodes!.first.cid; // var bangumiDetail = result['data'];
final String bvid = IdUtils.av2bv(bangumiDetail.episodes!.first.aid); // EpisodeItem episode = result['data'].episodes.first;
final String heroTag = Utils.makeHeroTag(cid); // int? epId = result['data'].userStatus?.progress?.lastEpId;
var epId = bangumiDetail.episodes!.first.id; // if (epId == null) {
SmartDialog.dismiss().then( // epId = episode.epId;
(e) => Utils.toDupNamed( // } else {
'/video?bvid=$bvid&cid=$cid&seasonId=$seasonId&epId=$epId', // for (var item in result['data'].episodes) {
arguments: <String, dynamic>{ // if (item.epId == epId) {
'pic': bangumiDetail.cover, // episode = item;
'heroTag': heroTag, // break;
'videoType': SearchType.media_bangumi, // }
}, // }
), // }
); // String bvid = episode.bvid!;
} else { // int cid = episode.cid!;
SmartDialog.showToast(result['msg']); // dynamic pic = episode.cover;
} // final String heroTag = Utils.makeHeroTag(cid);
// SmartDialog.dismiss().then(
// (e) => Utils.toDupNamed(
// '/video?bvid=$bvid&cid=$cid&seasonId=${bangumiDetail.seasonId}&epId=$epId',
// arguments: <String, dynamic>{
// 'pic': pic,
// 'heroTag': heroTag,
// 'videoType': SearchType.media_bangumi,
// },
// ),
// );
// } else {
// SmartDialog.showToast(result['msg']);
// }
} catch (e) { } catch (e) {
SmartDialog.showToast('番剧获取失败:$e'); SmartDialog.showToast('番剧获取失败:$e');
} }

View File

@@ -5,6 +5,9 @@ import 'dart:async';
import 'dart:convert'; import 'dart:convert';
import 'dart:io'; import 'dart:io';
import 'dart:math'; import 'dart:math';
import 'package:PiliPalaX/http/search.dart';
import 'package:PiliPalaX/models/bangumi/info.dart';
import 'package:PiliPalaX/models/common/search_type.dart';
import 'package:PiliPalaX/utils/storage.dart'; import 'package:PiliPalaX/utils/storage.dart';
import 'package:crypto/crypto.dart'; import 'package:crypto/crypto.dart';
import 'package:device_info_plus/device_info_plus.dart'; import 'package:device_info_plus/device_info_plus.dart';
@@ -22,6 +25,51 @@ import '../models/github/latest.dart';
class Utils { class Utils {
static final Random random = Random(); static final Random random = Random();
static void viewBangumi({
dynamic seasonId,
dynamic epId,
}) async {
SmartDialog.showLoading(msg: '资源获取中');
var result = await SearchHttp.bangumiInfo(seasonId: seasonId, epId: epId);
SmartDialog.dismiss();
if (result['status']) {
if (result['data'].episodes.isEmpty) {
SmartDialog.showToast('资源加载失败');
return;
}
// epId episode -> progress episode -> first episode
EpisodeItem? episode;
if (epId != null) {
EpisodeItem? e = (result['data'].episodes as List).firstWhereOrNull(
(item) => item.epId == epId,
);
if (e != null) {
episode = e;
}
}
episode ??= (result['data'].episodes as List).firstWhereOrNull(
(item) =>
item.epId == result['data'].userStatus?.progress?.lastEpId,
) ??
result['data'].episodes.first;
dynamic bvid = episode?.bvid;
dynamic cid = episode?.cid;
dynamic pic = episode?.cover;
dynamic heroTag = Utils.makeHeroTag(cid);
Utils.toDupNamed(
'/video?bvid=$bvid&cid=$cid&seasonId=${result['data'].seasonId}&epId=${episode?.epId}',
arguments: {
'pic': pic,
'heroTag': heroTag,
'videoType': SearchType.media_bangumi,
'bangumiItem': result['data'],
},
);
} else {
SmartDialog.showToast(result['msg']);
}
}
static void toDupNamed( static void toDupNamed(
String page, { String page, {
dynamic arguments, dynamic arguments,