From 57043166a952b6f0659b21dfa279b0122587332f Mon Sep 17 00:00:00 2001 From: bggRGjQaUbCoE Date: Thu, 9 Jan 2025 21:47:31 +0800 Subject: [PATCH] opt: view pgc from dynamic Signed-off-by: bggRGjQaUbCoE --- .../interactiveviewer_gallery.dart | 3 +- lib/pages/dynamics/controller.dart | 15 ++++++++ .../detail/reply/widgets/reply_item.dart | 6 ++-- .../detail/reply/widgets/reply_item_grpc.dart | 6 ++-- lib/utils/app_scheme.dart | 3 +- lib/utils/url_utils.dart | 34 ++++++++----------- 6 files changed, 42 insertions(+), 25 deletions(-) diff --git a/lib/common/widgets/interactiveviewer_gallery/interactiveviewer_gallery.dart b/lib/common/widgets/interactiveviewer_gallery/interactiveviewer_gallery.dart index 6cf69816..e8a477de 100644 --- a/lib/common/widgets/interactiveviewer_gallery/interactiveviewer_gallery.dart +++ b/lib/common/widgets/interactiveviewer_gallery/interactiveviewer_gallery.dart @@ -1,5 +1,6 @@ import 'dart:io'; +import 'package:PiliPlus/http/init.dart'; import 'package:PiliPlus/utils/download.dart'; import 'package:PiliPlus/utils/extension.dart'; import 'package:PiliPlus/utils/storage.dart'; @@ -362,7 +363,7 @@ class _InteractiveviewerGalleryState extends State // 图片分享 void onShareImg(String imgUrl) async { SmartDialog.showLoading(); - var response = await Dio() + var response = await Request() .get(imgUrl, options: Options(responseType: ResponseType.bytes)); final temp = await getTemporaryDirectory(); SmartDialog.dismiss(); diff --git a/lib/pages/dynamics/controller.dart b/lib/pages/dynamics/controller.dart index e1b2c0a0..6bc5c8b7 100644 --- a/lib/pages/dynamics/controller.dart +++ b/lib/pages/dynamics/controller.dart @@ -2,6 +2,7 @@ import 'package:PiliPlus/http/follow.dart'; import 'package:PiliPlus/pages/dynamics/tab/controller.dart'; import 'package:PiliPlus/pages/dynamics/tab/view.dart'; import 'package:PiliPlus/utils/extension.dart'; +import 'package:PiliPlus/utils/url_utils.dart'; import 'package:flutter/material.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; @@ -89,6 +90,20 @@ class DynamicsController extends GetxController arguments: {'item': item, 'floor': floor}); break; 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 cover = item.modules.moduleDynamic.major.archive.cover; try { diff --git a/lib/pages/video/detail/reply/widgets/reply_item.dart b/lib/pages/video/detail/reply/widgets/reply_item.dart index 19a1de1f..8339a85a 100644 --- a/lib/pages/video/detail/reply/widgets/reply_item.dart +++ b/lib/pages/video/detail/reply/widgets/reply_item.dart @@ -790,7 +790,8 @@ class ReplyItem extends StatelessWidget { }); } else { final String redirectUrl = - await UrlUtils.parseRedirectUrl(matchStr); + (await UrlUtils.parseRedirectUrl(matchStr)) ?? + matchStr; // if (redirectUrl == matchStr) { // Clipboard.setData(ClipboardData(text: matchStr)); // SmartDialog.showToast('地址可能有误'); @@ -824,7 +825,8 @@ class ReplyItem extends StatelessWidget { parameters: {'keyword': title}); } else if (matchStr.startsWith('https://b23.tv')) { final String redirectUrl = - await UrlUtils.parseRedirectUrl(matchStr); + (await UrlUtils.parseRedirectUrl(matchStr)) ?? + matchStr; final String pathSegment = Uri.parse(redirectUrl).path; final String lastPathSegment = diff --git a/lib/pages/video/detail/reply/widgets/reply_item_grpc.dart b/lib/pages/video/detail/reply/widgets/reply_item_grpc.dart index 882f94ae..02b9b836 100644 --- a/lib/pages/video/detail/reply/widgets/reply_item_grpc.dart +++ b/lib/pages/video/detail/reply/widgets/reply_item_grpc.dart @@ -822,7 +822,8 @@ class ReplyItemGrpc extends StatelessWidget { }); } else { final String redirectUrl = - await UrlUtils.parseRedirectUrl(matchStr); + (await UrlUtils.parseRedirectUrl(matchStr)) ?? + matchStr; // if (redirectUrl == matchStr) { // Clipboard.setData(ClipboardData(text: matchStr)); // SmartDialog.showToast('地址可能有误'); @@ -856,7 +857,8 @@ class ReplyItemGrpc extends StatelessWidget { parameters: {'keyword': title}); } else if (matchStr.startsWith('https://b23.tv')) { final String redirectUrl = - await UrlUtils.parseRedirectUrl(matchStr); + (await UrlUtils.parseRedirectUrl(matchStr)) ?? + matchStr; final String pathSegment = Uri.parse(redirectUrl).path; final String lastPathSegment = diff --git a/lib/utils/app_scheme.dart b/lib/utils/app_scheme.dart index 014a17d3..697d50e3 100644 --- a/lib/utils/app_scheme.dart +++ b/lib/utils/app_scheme.dart @@ -318,7 +318,8 @@ class PiliScheme { return; } else if (host == 'b23.tv') { 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 lastPathSegment = pathSegment.split('/').last; final RegExp avRegex = RegExp(r'^[aA][vV]\d+', caseSensitive: false); diff --git a/lib/utils/url_utils.dart b/lib/utils/url_utils.dart index 9e3f115b..9638e4f1 100644 --- a/lib/utils/url_utils.dart +++ b/lib/utils/url_utils.dart @@ -1,35 +1,31 @@ import 'package:dio/dio.dart'; import 'package:get/get.dart'; +import '../http/init.dart'; import '../http/search.dart'; import 'id_utils.dart'; import 'utils.dart'; class UrlUtils { // 302重定向路由截取 - static Future 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; - }; + static Future parseRedirectUrl(String url) async { try { - final response = await dio.get(url); - if (response.statusCode == 302) { - redirectUrl = response.headers['location']?.first as String; - if (redirectUrl.endsWith('/')) { - redirectUrl = redirectUrl.substring(0, redirectUrl.length - 1); - } + final response = await Request().get( + url, + options: Options( + followRedirects: false, + validateStatus: (status) { + return status == 200 || status == 301 || status == 302; + }, + ), + ); + if (response.statusCode == 302 || response.statusCode == 301) { + return response.headers['location']?.first; } else { - if (url.endsWith('/')) { - url = url.substring(0, url.length - 1); - } - return url; + return null; } - return redirectUrl; } catch (err) { - return url; + return null; } }