diff --git a/lib/http/init.dart b/lib/http/init.dart index 6eb072eb2..f8342bc48 100644 --- a/lib/http/init.dart +++ b/lib/http/init.dart @@ -102,7 +102,7 @@ class Request { headers: { 'user-agent': 'Dart/3.6 (dart:io)', // Http2Adapter不会自动添加标头 }, - responseDecoder: responseDecoder, // Http2Adapter没有自动解压 + responseDecoder: _responseDecoder, // Http2Adapter没有自动解压 persistentConnection: true, ); @@ -269,24 +269,21 @@ class Request { } } - static String responseDecoder( + static List responseBytesDecoder( + List responseBytes, + Map> headers, + ) => switch (headers['content-encoding']?.firstOrNull) { + 'gzip' => _gzipDecoder.decodeBytes(responseBytes), + 'br' => _brotilDecoder.convert(responseBytes), + _ => responseBytes, + }; + + static String _responseDecoder( List responseBytes, RequestOptions options, ResponseBody responseBody, - ) { - switch (responseBody.headers['content-encoding']?.firstOrNull) { - case 'gzip': - return utf8.decode( - _gzipDecoder.decodeBytes(responseBytes), - allowMalformed: true, - ); - case 'br': - return utf8.decode( - _brotilDecoder.convert(responseBytes), - allowMalformed: true, - ); - default: - return utf8.decode(responseBytes, allowMalformed: true); - } - } + ) => utf8.decode( + responseBytesDecoder(responseBytes, responseBody.headers), + allowMalformed: true, + ); } diff --git a/lib/pages/video/widgets/header_control.dart b/lib/pages/video/widgets/header_control.dart index fa6a56b91..c8cf54d51 100644 --- a/lib/pages/video/widgets/header_control.dart +++ b/lib/pages/video/widgets/header_control.dart @@ -1,8 +1,8 @@ import 'dart:async'; import 'dart:io'; import 'dart:math'; -import 'dart:typed_data'; +import 'package:PiliPlus/common/constants.dart'; import 'package:PiliPlus/common/widgets/button/icon_button.dart'; import 'package:PiliPlus/common/widgets/custom_icon.dart'; import 'package:PiliPlus/common/widgets/custom_sliver_persistent_header_delegate.dart'; @@ -43,6 +43,7 @@ import 'package:canvas_danmaku/canvas_danmaku.dart'; import 'package:dio/dio.dart'; import 'package:file_picker/file_picker.dart'; import 'package:floating/floating.dart'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; @@ -993,11 +994,17 @@ class HeaderControlState extends State { item.subtitleUrl!.http2https, options: Options( responseType: ResponseType.bytes, + headers: Constants.baseHeaders, extra: {'account': const NoAccount()}, ), ); if (res.statusCode == 200) { - final bytes = res.data!; + final bytes = Uint8List.fromList( + Request.responseBytesDecoder( + res.data!, + res.headers.map, + ), + ); final name = '${introController.videoDetail.value.title}-${videoDetailCtr.bvid}-${videoDetailCtr.cid.value}-${item.lanDoc}.json'; final path = await FilePicker.platform.saveFile( @@ -1016,6 +1023,7 @@ class HeaderControlState extends State { SmartDialog.showToast("已保存"); } } catch (e) { + if (kDebugMode) rethrow; SmartDialog.showToast(e.toString()); } },