Skip to content

Commit c2f53a3

Browse files
authored
Fix zoom gestures, enhance download UX, add DNS-over-HTTPS, and improve logging
Fix zoom gestures, enhance download UX, add DNS-over-HTTPS, and improve logging
2 parents 06e038f + e27573b commit c2f53a3

13 files changed

Lines changed: 775 additions & 130 deletions

lib/main.dart

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import 'package:sqflite_common_ffi/sqflite_ffi.dart';
1313

1414
// Project imports:
1515
import 'package:openlib/services/database.dart' show MyLibraryDb;
16+
import 'package:openlib/services/dns_resolver.dart';
1617
import 'package:openlib/ui/mylibrary_page.dart';
1718
import 'package:openlib/ui/search_page.dart';
1819
import 'package:openlib/ui/settings_page.dart';
@@ -28,6 +29,8 @@ import 'package:openlib/state/state.dart'
2829
themeModeProvider,
2930
openPdfWithExternalAppProvider,
3031
openEpubWithExternalAppProvider,
32+
showManualDownloadButtonProvider,
33+
selectedDnsProviderIndexProvider,
3134
userAgentProvider,
3235
cookieProvider;
3336

@@ -59,6 +62,24 @@ void main() async {
5962
? false
6063
: true;
6164

65+
bool showManualDownloadButton = await dataBase
66+
.getPreference('showManualDownloadButton')
67+
.catchError((e) => null) ==
68+
0
69+
? false
70+
: true;
71+
72+
int selectedDnsProviderIndex = await dataBase
73+
.getPreference('selectedDnsProviderIndex')
74+
.catchError((e) => 0);
75+
76+
// Initialize DNS resolver with saved preference
77+
final dnsResolver = DnsResolverService();
78+
if (selectedDnsProviderIndex >= 0 &&
79+
selectedDnsProviderIndex < DnsProviders.builtIn.length) {
80+
dnsResolver.setProvider(DnsProviders.builtIn[selectedDnsProviderIndex]);
81+
}
82+
6283
String browserUserAgent = await dataBase.getBrowserOptions('userAgent');
6384
String browserCookie = await dataBase.getBrowserOptions('cookie');
6485

@@ -79,6 +100,10 @@ void main() async {
79100
.overrideWith((ref) => openPdfwithExternalapp),
80101
openEpubWithExternalAppProvider
81102
.overrideWith((ref) => openEpubwithExternalapp),
103+
showManualDownloadButtonProvider
104+
.overrideWith((ref) => showManualDownloadButton),
105+
selectedDnsProviderIndexProvider
106+
.overrideWith((ref) => selectedDnsProviderIndex),
82107
userAgentProvider.overrideWith((ref) => browserUserAgent),
83108
cookieProvider.overrideWith((ref) => browserCookie),
84109
],

lib/services/annas_archieve.dart

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import 'package:html/dom.dart' as dom;
55

66
// Project imports:
77
import 'package:openlib/services/instance_manager.dart';
8+
import 'package:openlib/services/logger.dart';
9+
import 'package:openlib/services/dns_resolver.dart';
810

911
// ====================================================================
1012
// DATA MODELS
@@ -56,9 +58,16 @@ class AnnasArchieve {
5658

5759
final Dio dio = Dio();
5860
final InstanceManager _instanceManager = InstanceManager();
61+
final AppLogger _logger = AppLogger();
62+
final DnsResolverService _dnsResolver = DnsResolverService();
5963
static const int maxRetries = 2; // Check each server 2x as per requirements
6064
static const int retryDelayMs = 500; // Delay between retries in milliseconds
6165

66+
AnnasArchieve() {
67+
// Configure Dio to use DNS-over-HTTPS
68+
_dnsResolver.configureDio(dio);
69+
}
70+
6271
Map<String, dynamic> defaultDioHeaders = {
6372
"user-agent":
6473
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36",
@@ -284,8 +293,16 @@ class AnnasArchieve {
284293
String sort = "",
285294
String fileType = "",
286295
bool enableFilters = true}) async {
296+
_logger.info('Searching books', tag: 'AnnasArchive', metadata: {
297+
'query': searchQuery,
298+
'content': content,
299+
'sort': sort,
300+
'fileType': fileType,
301+
'filtersEnabled': enableFilters,
302+
});
303+
287304
try {
288-
return await _requestWithRetry<List<BookData>>((currentBaseUrl) async {
305+
final books = await _requestWithRetry<List<BookData>>((currentBaseUrl) async {
289306
final String encodedURL = urlEncoder(
290307
searchQuery: searchQuery,
291308
content: content,
@@ -294,11 +311,16 @@ class AnnasArchieve {
294311
enableFilters: enableFilters,
295312
currentBaseUrl: currentBaseUrl);
296313

314+
_logger.debug('Fetching search results', tag: 'AnnasArchive', metadata: {'url': encodedURL});
297315
final response = await dio.get(encodedURL,
298316
options: Options(headers: defaultDioHeaders));
299317
return _parser(response.data, fileType, currentBaseUrl);
300318
});
319+
320+
_logger.info('Search completed', tag: 'AnnasArchive', metadata: {'results': books.length});
321+
return books;
301322
} on DioException catch (e) {
323+
_logger.error('Search failed', tag: 'AnnasArchive', error: e.message ?? e.error);
302324
if (e.type == DioExceptionType.unknown) {
303325
throw "socketException";
304326
}
@@ -307,8 +329,10 @@ class AnnasArchieve {
307329
}
308330

309331
Future<BookInfoData> bookInfo({required String url}) async {
332+
_logger.info('Fetching book info', tag: 'AnnasArchive', metadata: {'url': url});
333+
310334
try {
311-
return await _requestWithRetry<BookInfoData>((currentBaseUrl) async {
335+
final data = await _requestWithRetry<BookInfoData>((currentBaseUrl) async {
312336
// Replace the base URL in the url parameter if it contains a different one
313337
String adjustedUrl = url;
314338
final urlParsed = Uri.parse(url);
@@ -319,6 +343,7 @@ class AnnasArchieve {
319343
adjustedUrl = '$currentBaseUrl${urlParsed.path}${urlParsed.query.isNotEmpty ? "?${urlParsed.query}" : ""}';
320344
}
321345

346+
_logger.debug('Fetching book details', tag: 'AnnasArchive', metadata: {'url': adjustedUrl});
322347
final response = await dio.get(adjustedUrl,
323348
options: Options(headers: defaultDioHeaders));
324349
BookInfoData? data = await _bookInfoParser(response.data, adjustedUrl, currentBaseUrl);
@@ -328,7 +353,15 @@ class AnnasArchieve {
328353
throw 'unable to get data';
329354
}
330355
});
356+
357+
_logger.info('Book info retrieved successfully', tag: 'AnnasArchive', metadata: {
358+
'title': data.title,
359+
'format': data.format,
360+
'hasMirror': data.mirror != null,
361+
});
362+
return data;
331363
} on DioException catch (e) {
364+
_logger.error('Failed to fetch book info', tag: 'AnnasArchive', error: e.message ?? e.error);
332365
if (e.type == DioExceptionType.unknown) {
333366
throw "socketException";
334367
}

lib/services/database.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,10 @@ class MyLibraryDb {
114114
"INSERT OR IGNORE INTO preferences (name, value) VALUES ('openEpubwithExternalApp', 0)");
115115
await db.execute(
116116
"INSERT OR IGNORE INTO preferences (name, value) VALUES ('bookStorageDirectory', '$bookStorageDefaultDirectory')");
117+
await db.execute(
118+
"INSERT OR IGNORE INTO preferences (name, value) VALUES ('showManualDownloadButton', 0)");
119+
await db.execute(
120+
"INSERT OR IGNORE INTO preferences (name, value) VALUES ('selectedDnsProviderIndex', 0)");
117121
},
118122
);
119123
}

0 commit comments

Comments
 (0)