opt: view pgc from dynamic

Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
bggRGjQaUbCoE
2025-01-09 21:47:31 +08:00
parent 9ab6dcff23
commit 57043166a9
6 changed files with 42 additions and 25 deletions

View File

@@ -1,5 +1,6 @@
import 'dart:io'; import 'dart:io';
import 'package:PiliPlus/http/init.dart';
import 'package:PiliPlus/utils/download.dart'; import 'package:PiliPlus/utils/download.dart';
import 'package:PiliPlus/utils/extension.dart'; import 'package:PiliPlus/utils/extension.dart';
import 'package:PiliPlus/utils/storage.dart'; import 'package:PiliPlus/utils/storage.dart';
@@ -362,7 +363,7 @@ class _InteractiveviewerGalleryState extends State<InteractiveviewerGallery>
// 图片分享 // 图片分享
void onShareImg(String imgUrl) async { void onShareImg(String imgUrl) async {
SmartDialog.showLoading(); SmartDialog.showLoading();
var response = await Dio() var response = await Request()
.get(imgUrl, options: Options(responseType: ResponseType.bytes)); .get(imgUrl, options: Options(responseType: ResponseType.bytes));
final temp = await getTemporaryDirectory(); final temp = await getTemporaryDirectory();
SmartDialog.dismiss(); SmartDialog.dismiss();

View File

@@ -2,6 +2,7 @@ import 'package:PiliPlus/http/follow.dart';
import 'package:PiliPlus/pages/dynamics/tab/controller.dart'; import 'package:PiliPlus/pages/dynamics/tab/controller.dart';
import 'package:PiliPlus/pages/dynamics/tab/view.dart'; import 'package:PiliPlus/pages/dynamics/tab/view.dart';
import 'package:PiliPlus/utils/extension.dart'; import 'package:PiliPlus/utils/extension.dart';
import 'package:PiliPlus/utils/url_utils.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';
@@ -89,6 +90,20 @@ class DynamicsController extends GetxController
arguments: {'item': item, 'floor': floor}); arguments: {'item': item, 'floor': floor});
break; break;
case 'DYNAMIC_TYPE_AV': case 'DYNAMIC_TYPE_AV':
if (item.modules.moduleDynamic.major.archive.type == 2) {
if (item.modules.moduleDynamic.major.archive.jumpUrl
.startsWith('//')) {
item.modules.moduleDynamic.major.archive.jumpUrl =
'https:${item.modules.moduleDynamic.major.archive.jumpUrl}';
}
String? redirectUrl = await UrlUtils.parseRedirectUrl(
item.modules.moduleDynamic.major.archive.jumpUrl);
if (redirectUrl != null) {
Utils.viewPgcFromUri(redirectUrl);
return;
}
}
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;
try { try {

View File

@@ -790,7 +790,8 @@ class ReplyItem extends StatelessWidget {
}); });
} else { } else {
final String redirectUrl = final String redirectUrl =
await UrlUtils.parseRedirectUrl(matchStr); (await UrlUtils.parseRedirectUrl(matchStr)) ??
matchStr;
// if (redirectUrl == matchStr) { // if (redirectUrl == matchStr) {
// Clipboard.setData(ClipboardData(text: matchStr)); // Clipboard.setData(ClipboardData(text: matchStr));
// SmartDialog.showToast('地址可能有误'); // SmartDialog.showToast('地址可能有误');
@@ -824,7 +825,8 @@ class ReplyItem extends StatelessWidget {
parameters: {'keyword': title}); parameters: {'keyword': title});
} else if (matchStr.startsWith('https://b23.tv')) { } else if (matchStr.startsWith('https://b23.tv')) {
final String redirectUrl = final String redirectUrl =
await UrlUtils.parseRedirectUrl(matchStr); (await UrlUtils.parseRedirectUrl(matchStr)) ??
matchStr;
final String pathSegment = final String pathSegment =
Uri.parse(redirectUrl).path; Uri.parse(redirectUrl).path;
final String lastPathSegment = final String lastPathSegment =

View File

@@ -822,7 +822,8 @@ class ReplyItemGrpc extends StatelessWidget {
}); });
} else { } else {
final String redirectUrl = final String redirectUrl =
await UrlUtils.parseRedirectUrl(matchStr); (await UrlUtils.parseRedirectUrl(matchStr)) ??
matchStr;
// if (redirectUrl == matchStr) { // if (redirectUrl == matchStr) {
// Clipboard.setData(ClipboardData(text: matchStr)); // Clipboard.setData(ClipboardData(text: matchStr));
// SmartDialog.showToast('地址可能有误'); // SmartDialog.showToast('地址可能有误');
@@ -856,7 +857,8 @@ class ReplyItemGrpc extends StatelessWidget {
parameters: {'keyword': title}); parameters: {'keyword': title});
} else if (matchStr.startsWith('https://b23.tv')) { } else if (matchStr.startsWith('https://b23.tv')) {
final String redirectUrl = final String redirectUrl =
await UrlUtils.parseRedirectUrl(matchStr); (await UrlUtils.parseRedirectUrl(matchStr)) ??
matchStr;
final String pathSegment = final String pathSegment =
Uri.parse(redirectUrl).path; Uri.parse(redirectUrl).path;
final String lastPathSegment = final String lastPathSegment =

View File

@@ -318,7 +318,8 @@ class PiliScheme {
return; return;
} else if (host == 'b23.tv') { } else if (host == 'b23.tv') {
final String fullPath = 'https://$host$path'; final String fullPath = 'https://$host$path';
final String redirectUrl = await UrlUtils.parseRedirectUrl(fullPath); final String redirectUrl =
(await UrlUtils.parseRedirectUrl(fullPath)) ?? fullPath;
final String pathSegment = Uri.parse(redirectUrl).path; final String pathSegment = Uri.parse(redirectUrl).path;
final String lastPathSegment = pathSegment.split('/').last; final String lastPathSegment = pathSegment.split('/').last;
final RegExp avRegex = RegExp(r'^[aA][vV]\d+', caseSensitive: false); final RegExp avRegex = RegExp(r'^[aA][vV]\d+', caseSensitive: false);

View File

@@ -1,35 +1,31 @@
import 'package:dio/dio.dart'; import 'package:dio/dio.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import '../http/init.dart';
import '../http/search.dart'; import '../http/search.dart';
import 'id_utils.dart'; import 'id_utils.dart';
import 'utils.dart'; import 'utils.dart';
class UrlUtils { class UrlUtils {
// 302重定向路由截取 // 302重定向路由截取
static Future<String> parseRedirectUrl(String url) async { static Future<String?> parseRedirectUrl(String url) async {
late String redirectUrl;
final dio = Dio();
dio.options.followRedirects = false;
dio.options.validateStatus = (status) {
return status == 200 || status == 301 || status == 302;
};
try { try {
final response = await dio.get(url); final response = await Request().get(
if (response.statusCode == 302) { url,
redirectUrl = response.headers['location']?.first as String; options: Options(
if (redirectUrl.endsWith('/')) { followRedirects: false,
redirectUrl = redirectUrl.substring(0, redirectUrl.length - 1); validateStatus: (status) {
} return status == 200 || status == 301 || status == 302;
},
),
);
if (response.statusCode == 302 || response.statusCode == 301) {
return response.headers['location']?.first;
} else { } else {
if (url.endsWith('/')) { return null;
url = url.substring(0, url.length - 1);
}
return url;
} }
return redirectUrl;
} catch (err) { } catch (err) {
return url; return null;
} }
} }