From 4a8f67965b46989813390f3fec95d7cfc9eafef3 Mon Sep 17 00:00:00 2001 From: TaYaKi71751 Date: Tue, 2 Jan 2024 00:15:28 +0900 Subject: [PATCH 1/4] Add `ignoreTimeout` for slow environment --- lib/network/wrapper.dart | 39 ++++++++++++-------- lib/pages/search/search_page.dart | 6 ++- lib/pages/search/search_page_controller.dart | 36 +++++++++++------- lib/pages/settings/settings_page.dart | 32 ++++++++++++++++ lib/settings/settings.dart | 10 +++++ 5 files changed, 93 insertions(+), 30 deletions(-) diff --git a/lib/network/wrapper.dart b/lib/network/wrapper.dart index aba2bac06..e88bb5360 100644 --- a/lib/network/wrapper.dart +++ b/lib/network/wrapper.dart @@ -7,6 +7,7 @@ import 'dart:convert'; import 'package:http/http.dart' as http; import 'package:http/http.dart'; import 'package:violet/log/log.dart'; +import 'package:violet/settings/settings.dart'; import 'package:violet/thread/semaphore.dart'; class HttpWrapper { @@ -95,13 +96,17 @@ Future _ehentaiGet(String url, StreamedResponse response; try { - response = await client.send(request).timeout( - const Duration(seconds: 3), - onTimeout: () { - timeout = true; - throw TimeoutException('Timeout error'); - }, - ); + final sent = client.send(request); + if (!Settings.ignoreTimeout) { + sent.timeout( + const Duration(seconds: 3), + onTimeout: () { + timeout = true; + throw TimeoutException('Timeout error'); + }, + ); + } + response = await sent; } catch (e, st) { Logger.error('[Http Request] GET: $url\n' 'E:$e\n' @@ -155,14 +160,18 @@ Future _scriptGet(String url, var retry = 0; do { isTimeout = false; - res = await http.get(Uri.parse(url), headers: headers).timeout( - timeout, - onTimeout: () { - isTimeout = true; - retry++; - return http.Response('', 200); - }, - ); + final sent = http.get(Uri.parse(url), headers: headers); + if(!Settings.ignoreTimeout){ + sent.timeout( + timeout, + onTimeout: () { + isTimeout = true; + retry++; + return http.Response('', 200); + }, + ); + } + res = await sent; } while (isTimeout && retry < 10); } diff --git a/lib/pages/search/search_page.dart b/lib/pages/search/search_page.dart index ade45b198..171e7e092 100644 --- a/lib/pages/search/search_page.dart +++ b/lib/pages/search/search_page.dart @@ -82,8 +82,12 @@ class _SearchPageState extends ThemeSwitchableState doInitialSearch() async { try { - final result = await HentaiManager.search(widget.searchKeyWord ?? '') + final search = HentaiManager.search(widget.searchKeyWord ?? ''); + if(!Settings.ignoreTimeout){ + search .timeout(const Duration(seconds: 5)); + } + final result = await search; c.latestQuery = Tuple2(result, widget.searchKeyWord ?? ''); c.queryResult = c.latestQuery!.item1!.results; diff --git a/lib/pages/search/search_page_controller.dart b/lib/pages/search/search_page_controller.dart index a015bec5a..b5340a3ae 100644 --- a/lib/pages/search/search_page_controller.dart +++ b/lib/pages/search/search_page_controller.dart @@ -163,14 +163,18 @@ class SearchPageController extends GetxController { } loadNextQuery() async { - await _querySem.acquire().timeout( - const Duration(seconds: 5), - onTimeout: () { - showErrorToast('Semaphore acquisition failed'); - - throw TimeoutException('Failed to acquire the query semaphore'); - }, - ); + final aquire = _querySem.acquire(); + if (!Settings.ignoreTimeout){ + aquire.timeout( + const Duration(seconds: 5), + onTimeout: () { + showErrorToast('Semaphore acquisition failed'); + + throw TimeoutException('Failed to acquire the query semaphore'); + }, + ); + } + await aquire; try { if (_queryEnd || @@ -178,13 +182,17 @@ class SearchPageController extends GetxController { return; } - var next = await HentaiManager.search(latestQuery!.item2, - latestQuery!.item1 == null ? 0 : latestQuery!.item1!.offset) - .timeout(const Duration(seconds: 10), onTimeout: () { - Logger.error('[Search_loadNextQuery] Search Timeout'); + final search = HentaiManager.search(latestQuery!.item2, + latestQuery!.item1 == null ? 0 : latestQuery!.item1!.offset); + if(!Settings.ignoreTimeout){ + search.timeout(const Duration(seconds: 10), onTimeout: () { + Logger.error('[Search_loadNextQuery] Search Timeout'); + + throw TimeoutException('Failed to search the query'); + }); + } + var next = await search; - throw TimeoutException('Failed to search the query'); - }); latestQuery = Tuple2(next, latestQuery!.item2); diff --git a/lib/pages/settings/settings_page.dart b/lib/pages/settings/settings_page.dart index 9ba716110..56f4eee11 100644 --- a/lib/pages/settings/settings_page.dart +++ b/lib/pages/settings/settings_page.dart @@ -1441,6 +1441,38 @@ class _SettingsPageState extends State }); }, ), + _buildDivider(), + InkWell( + customBorder: const RoundedRectangleBorder( + borderRadius: BorderRadius.only( + bottomLeft: Radius.circular(8.0), + bottomRight: Radius.circular(8.0))), + child: ListTile( + leading: Image.asset( + 'assets/images/logo.png', + width: 25, + height: 25, + ), + title: Text(Translations.of(context).trans('ignoretimeout')), + trailing: Switch( + value: Settings.ignoreTimeout, + onChanged: (newValue) async { + await Settings.setIgnoreTimeout(newValue); + setState(() { + _shouldReload = true; + }); + }, + activeTrackColor: Settings.majorColor, + activeColor: Settings.majorAccentColor, + ), + ), + onTap: () async { + await Settings.setIgnoreTimeout(!Settings.ignoreTimeout); + setState(() { + _shouldReload = true; + }); + }, + ), ], ), ]; diff --git a/lib/settings/settings.dart b/lib/settings/settings.dart index 7a4857864..ded814f28 100644 --- a/lib/settings/settings.dart +++ b/lib/settings/settings.dart @@ -20,6 +20,9 @@ import 'package:violet/settings/device_type.dart'; class Settings { static late final SharedPreferences prefs; + // Timeout Settings + static late bool ignoreTimeout; // default false + // Color Settings static late Color themeColor; // default light static late bool themeWhat; // default false == light @@ -300,6 +303,7 @@ class Settings { searchMessageAPI = await _getString( 'searchmessageapi', 'https://koromo.xyz/api/search/msg'); + ignoreTimeout = await _getBool('ignoretimeout'); useVioletServer = await _getBool('usevioletserver'); useDrawer = await _getBool('usedrawer'); showArticleProgress = await _getBool('showarticleprogress'); @@ -623,6 +627,12 @@ class Settings { await prefs.setBool('searchPure', nn); } + static Future setIgnoreTimeout(bool nn) async { + ignoreTimeout = nn; + + await prefs.setBool('ignoretimeout', nn); + } + static Future setUseVioletServer(bool nn) async { useVioletServer = nn; From b7e922be522e1ab368cba2bc06a6e00d003d50e3 Mon Sep 17 00:00:00 2001 From: TaYaKi71751 Date: Tue, 2 Jan 2024 00:18:59 +0900 Subject: [PATCH 2/4] Dart Format --- lib/network/wrapper.dart | 2 +- lib/pages/search/search_page.dart | 5 ++--- lib/pages/search/search_page_controller.dart | 7 +++---- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/lib/network/wrapper.dart b/lib/network/wrapper.dart index e88bb5360..bdcd1ec02 100644 --- a/lib/network/wrapper.dart +++ b/lib/network/wrapper.dart @@ -161,7 +161,7 @@ Future _scriptGet(String url, do { isTimeout = false; final sent = http.get(Uri.parse(url), headers: headers); - if(!Settings.ignoreTimeout){ + if (!Settings.ignoreTimeout) { sent.timeout( timeout, onTimeout: () { diff --git a/lib/pages/search/search_page.dart b/lib/pages/search/search_page.dart index 171e7e092..aaa98ce16 100644 --- a/lib/pages/search/search_page.dart +++ b/lib/pages/search/search_page.dart @@ -83,9 +83,8 @@ class _SearchPageState extends ThemeSwitchableState doInitialSearch() async { try { final search = HentaiManager.search(widget.searchKeyWord ?? ''); - if(!Settings.ignoreTimeout){ - search - .timeout(const Duration(seconds: 5)); + if (!Settings.ignoreTimeout) { + search.timeout(const Duration(seconds: 5)); } final result = await search; diff --git a/lib/pages/search/search_page_controller.dart b/lib/pages/search/search_page_controller.dart index b5340a3ae..02c9f45a8 100644 --- a/lib/pages/search/search_page_controller.dart +++ b/lib/pages/search/search_page_controller.dart @@ -164,7 +164,7 @@ class SearchPageController extends GetxController { loadNextQuery() async { final aquire = _querySem.acquire(); - if (!Settings.ignoreTimeout){ + if (!Settings.ignoreTimeout) { aquire.timeout( const Duration(seconds: 5), onTimeout: () { @@ -183,8 +183,8 @@ class SearchPageController extends GetxController { } final search = HentaiManager.search(latestQuery!.item2, - latestQuery!.item1 == null ? 0 : latestQuery!.item1!.offset); - if(!Settings.ignoreTimeout){ + latestQuery!.item1 == null ? 0 : latestQuery!.item1!.offset); + if (!Settings.ignoreTimeout) { search.timeout(const Duration(seconds: 10), onTimeout: () { Logger.error('[Search_loadNextQuery] Search Timeout'); @@ -193,7 +193,6 @@ class SearchPageController extends GetxController { } var next = await search; - latestQuery = Tuple2(next, latestQuery!.item2); if (next.results.isEmpty) { From d429a3814165848a13914374191d5c55d5fdbd42 Mon Sep 17 00:00:00 2001 From: TaYaKi71751 Date: Tue, 2 Jan 2024 00:29:24 +0900 Subject: [PATCH 3/4] Add ignoretimeout to locale --- assets/locale/en.json | 3 ++- assets/locale/eo.json | 3 ++- assets/locale/it.json | 3 ++- assets/locale/ja.json | 3 ++- assets/locale/ko.json | 3 ++- assets/locale/pt.json | 3 ++- assets/locale/zh.json | 3 ++- assets/locale/zh_Hans.json | 3 ++- assets/locale/zh_Hant.json | 3 ++- 9 files changed, 18 insertions(+), 9 deletions(-) diff --git a/assets/locale/en.json b/assets/locale/en.json index 6480d776f..9ff4e5fa7 100644 --- a/assets/locale/en.json +++ b/assets/locale/en.json @@ -306,5 +306,6 @@ "realtimeuserrecord": "Real Time User Record", "manualupdate": "Manual Update", "cannotuseios": "You cannot use update on iOS :(", - "exitTheApp": "Exit the app" + "exitTheApp": "Exit the app", + "ignoretimeout": "Ignore Timeout" } diff --git a/assets/locale/eo.json b/assets/locale/eo.json index c6e315c79..779c02fc7 100644 --- a/assets/locale/eo.json +++ b/assets/locale/eo.json @@ -306,5 +306,6 @@ "realtimeuserrecord": "Real Time User Record", "manualupdate": "Manual Update", "cannotuseios": "You cannot use update on iOS :(", - "exitTheApp": "Exit the app" + "exitTheApp": "Exit the app", + "ignoretimeout": "Ignore Timeout" } diff --git a/assets/locale/it.json b/assets/locale/it.json index eb271b286..7942b1e3c 100644 --- a/assets/locale/it.json +++ b/assets/locale/it.json @@ -306,5 +306,6 @@ "realtimeuserrecord": "Real Time User Record", "manualupdate": "Manual Update", "cannotuseios": "You cannot use update on iOS :(", - "exitTheApp": "Exit the app" + "exitTheApp": "Exit the app", + "ignoretimeout": "Ignore Timeout" } diff --git a/assets/locale/ja.json b/assets/locale/ja.json index cbd2907a4..2cc9bc25e 100644 --- a/assets/locale/ja.json +++ b/assets/locale/ja.json @@ -306,5 +306,6 @@ "realtimeuserrecord": "Real Time User Record", "manualupdate": "Manual Update", "cannotuseios": "You cannot use update on iOS :(", - "exitTheApp": "Exit the app" + "exitTheApp": "Exit the app", + "ignoretimeout": "Ignore Timeout" } diff --git a/assets/locale/ko.json b/assets/locale/ko.json index dfda64f38..c5f3ea7b1 100644 --- a/assets/locale/ko.json +++ b/assets/locale/ko.json @@ -306,5 +306,6 @@ "realtimeuserrecord": "실시간 유저 레코드", "manualupdate": "수동 업데이트", "cannotuseios": "iOS에선 사용할 수 없어요 :(", - "exitTheApp": "앱 종료하기" + "exitTheApp": "앱 종료하기", + "ignoretimeout": "Ignore Timeout" } diff --git a/assets/locale/pt.json b/assets/locale/pt.json index 61d8e90f6..e1650a518 100644 --- a/assets/locale/pt.json +++ b/assets/locale/pt.json @@ -306,5 +306,6 @@ "realtimeuserrecord": "Real Time User Record", "manualupdate": "Manual Update", "cannotuseios": "You cannot use update on iOS :(", - "exitTheApp": "Exit the app" + "exitTheApp": "Exit the app", + "ignoretimeout": "Ignore Timeout" } diff --git a/assets/locale/zh.json b/assets/locale/zh.json index 3a6683edc..b33041f22 100644 --- a/assets/locale/zh.json +++ b/assets/locale/zh.json @@ -306,5 +306,6 @@ "realtimeuserrecord": "Real Time User Record", "manualupdate": "Manual Update", "cannotuseios": "You cannot use update on iOS :(", - "exitTheApp": "Exit the app" + "exitTheApp": "Exit the app", + "ignoretimeout": "Ignore Timeout" } diff --git a/assets/locale/zh_Hans.json b/assets/locale/zh_Hans.json index 85029def9..e90a3731a 100644 --- a/assets/locale/zh_Hans.json +++ b/assets/locale/zh_Hans.json @@ -306,5 +306,6 @@ "realtimeuserrecord": "Real Time User Record", "manualupdate": "Manual Update", "cannotuseios": "You cannot use update on iOS :(", - "exitTheApp": "Exit the app" + "exitTheApp": "Exit the app", + "ignoretimeout": "Ignore Timeout" } diff --git a/assets/locale/zh_Hant.json b/assets/locale/zh_Hant.json index 8d0c87000..deb534e17 100644 --- a/assets/locale/zh_Hant.json +++ b/assets/locale/zh_Hant.json @@ -306,5 +306,6 @@ "realtimeuserrecord": "Real Time User Record", "manualupdate": "Manual Update", "cannotuseios": "You cannot use update on iOS :(", - "exitTheApp": "Exit the app" + "exitTheApp": "Exit the app", + "ignoretimeout": "Ignore Timeout" } From 6bf2790a72d7439bff0d33cdc362b01e80148b80 Mon Sep 17 00:00:00 2001 From: koromo <66541802+violet-dev@users.noreply.github.com> Date: Tue, 2 Jan 2024 23:50:17 +0900 Subject: [PATCH 4/4] Update ko.json --- assets/locale/ko.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/locale/ko.json b/assets/locale/ko.json index c5f3ea7b1..4363d2325 100644 --- a/assets/locale/ko.json +++ b/assets/locale/ko.json @@ -307,5 +307,5 @@ "manualupdate": "수동 업데이트", "cannotuseios": "iOS에선 사용할 수 없어요 :(", "exitTheApp": "앱 종료하기", - "ignoretimeout": "Ignore Timeout" + "ignoretimeout": "타임아웃 끄기" }