From cb103afbb033ec2a69a0727c4cfbe63a4acfc477 Mon Sep 17 00:00:00 2001 From: kodjomoustapha <107993382+kodjodevf@users.noreply.github.com> Date: Fri, 20 Dec 2024 17:02:36 +0100 Subject: [PATCH] + --- lib/models/settings.dart | 1 + lib/models/settings.g.dart | 183 +++++++++++++++++- .../update_manga_detail_providers.dart | 20 +- .../update_manga_detail_providers.g.dart | 2 +- .../download/providers/download_provider.dart | 1 + lib/services/aniskip.g.dart | 2 +- lib/services/get_chapter_pages.dart | 21 +- lib/services/http/m_client.dart | 17 +- lib/services/trackers/anilist.g.dart | 2 +- lib/utils/log/log.dart | 4 - 10 files changed, 213 insertions(+), 40 deletions(-) diff --git a/lib/models/settings.dart b/lib/models/settings.dart index 22f03e99..bcbde56d 100644 --- a/lib/models/settings.dart +++ b/lib/models/settings.dart @@ -641,6 +641,7 @@ class ChapterFilterBookmarked { @embedded class ChapterPageurls { int? chapterId; + String? chapterUrl; List? urls; List? headers; diff --git a/lib/models/settings.g.dart b/lib/models/settings.g.dart index 343f4b20..f33869b0 100644 --- a/lib/models/settings.g.dart +++ b/lib/models/settings.g.dart @@ -11674,13 +11674,18 @@ const ChapterPageurlsSchema = Schema( name: r'chapterId', type: IsarType.long, ), - r'headers': PropertySchema( + r'chapterUrl': PropertySchema( id: 1, + name: r'chapterUrl', + type: IsarType.string, + ), + r'headers': PropertySchema( + id: 2, name: r'headers', type: IsarType.stringList, ), r'urls': PropertySchema( - id: 2, + id: 3, name: r'urls', type: IsarType.stringList, ) @@ -11697,6 +11702,12 @@ int _chapterPageurlsEstimateSize( Map> allOffsets, ) { var bytesCount = offsets.last; + { + final value = object.chapterUrl; + if (value != null) { + bytesCount += 3 + value.length * 3; + } + } { final list = object.headers; if (list != null) { @@ -11731,8 +11742,9 @@ void _chapterPageurlsSerialize( Map> allOffsets, ) { writer.writeLong(offsets[0], object.chapterId); - writer.writeStringList(offsets[1], object.headers); - writer.writeStringList(offsets[2], object.urls); + writer.writeString(offsets[1], object.chapterUrl); + writer.writeStringList(offsets[2], object.headers); + writer.writeStringList(offsets[3], object.urls); } ChapterPageurls _chapterPageurlsDeserialize( @@ -11743,9 +11755,10 @@ ChapterPageurls _chapterPageurlsDeserialize( ) { final object = ChapterPageurls( chapterId: reader.readLongOrNull(offsets[0]), - urls: reader.readStringList(offsets[2]), + urls: reader.readStringList(offsets[3]), ); - object.headers = reader.readStringList(offsets[1]); + object.chapterUrl = reader.readStringOrNull(offsets[1]); + object.headers = reader.readStringList(offsets[2]); return object; } @@ -11759,9 +11772,11 @@ P _chapterPageurlsDeserializeProp

( case 0: return (reader.readLongOrNull(offset)) as P; case 1: - return (reader.readStringList(offset)) as P; + return (reader.readStringOrNull(offset)) as P; case 2: return (reader.readStringList(offset)) as P; + case 3: + return (reader.readStringList(offset)) as P; default: throw IsarError('Unknown property with id $propertyId'); } @@ -11843,6 +11858,160 @@ extension ChapterPageurlsQueryFilter }); } + QueryBuilder + chapterUrlIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'chapterUrl', + )); + }); + } + + QueryBuilder + chapterUrlIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'chapterUrl', + )); + }); + } + + QueryBuilder + chapterUrlEqualTo( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'chapterUrl', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + chapterUrlGreaterThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'chapterUrl', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + chapterUrlLessThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'chapterUrl', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + chapterUrlBetween( + String? lower, + String? upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'chapterUrl', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + chapterUrlStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'chapterUrl', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + chapterUrlEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'chapterUrl', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + chapterUrlContains(String value, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'chapterUrl', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + chapterUrlMatches(String pattern, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'chapterUrl', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + chapterUrlIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'chapterUrl', + value: '', + )); + }); + } + + QueryBuilder + chapterUrlIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'chapterUrl', + value: '', + )); + }); + } + QueryBuilder headersIsNull() { return QueryBuilder.apply(this, (query) { diff --git a/lib/modules/manga/detail/providers/update_manga_detail_providers.dart b/lib/modules/manga/detail/providers/update_manga_detail_providers.dart index 6d2267aa..fbbdfb6b 100644 --- a/lib/modules/manga/detail/providers/update_manga_detail_providers.dart +++ b/lib/modules/manga/detail/providers/update_manga_detail_providers.dart @@ -102,18 +102,14 @@ Future updateMangaDetail(Ref ref, for (var i = 0; i < oldChapers.length; i++) { final oldChap = oldChapers[i]; final newChap = chaps[i]; - if (newChap.url != null && - newChap.url!.isNotEmpty && - newChap.url != oldChap.url && - newChap.name == oldChap.name) { - oldChap.url = newChap.url; - oldChap.scanlator = newChap.scanlator; - ref - .read(changedItemsManagerProvider(managerId: 1).notifier) - .addUpdatedChapter(oldChap, false, false); - isar.chapters.putSync(oldChap); - oldChap.manga.saveSync(); - } + oldChap.name = newChap.name; + oldChap.url = newChap.url; + oldChap.scanlator = newChap.scanlator; + ref + .read(changedItemsManagerProvider(managerId: 1).notifier) + .addUpdatedChapter(oldChap, false, false); + isar.chapters.putSync(oldChap); + oldChap.manga.saveSync(); } } }); diff --git a/lib/modules/manga/detail/providers/update_manga_detail_providers.g.dart b/lib/modules/manga/detail/providers/update_manga_detail_providers.g.dart index 22fa5a68..bf391d7f 100644 --- a/lib/modules/manga/detail/providers/update_manga_detail_providers.g.dart +++ b/lib/modules/manga/detail/providers/update_manga_detail_providers.g.dart @@ -6,7 +6,7 @@ part of 'update_manga_detail_providers.dart'; // RiverpodGenerator // ************************************************************************** -String _$updateMangaDetailHash() => r'29a10d49454febb4fe88ca9c007d3512d812bf84'; +String _$updateMangaDetailHash() => r'82c52aa8760fb455e6558be925d05f5f0703af98'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/modules/manga/download/providers/download_provider.dart b/lib/modules/manga/download/providers/download_provider.dart index fd9f0553..347d6e50 100644 --- a/lib/modules/manga/download/providers/download_provider.dart +++ b/lib/modules/manga/download/providers/download_provider.dart @@ -94,6 +94,7 @@ Future> downloadChapter( chapterPageUrls.add(ChapterPageurls() ..chapterId = chapter.id ..urls = pageUrls.map((e) => e.url).toList() + ..chapterUrl = chapter.url ..headers = chapterPageHeaders.first != null ? chapterPageHeaders.map((e) => e.toString()).toList() : null); diff --git a/lib/services/aniskip.g.dart b/lib/services/aniskip.g.dart index b2e1defb..c05db920 100644 --- a/lib/services/aniskip.g.dart +++ b/lib/services/aniskip.g.dart @@ -6,7 +6,7 @@ part of 'aniskip.dart'; // RiverpodGenerator // ************************************************************************** -String _$aniSkipHash() => r'887869b54e2e151633efd46da83bde845e14f421'; +String _$aniSkipHash() => r'2e5d19b025a2207ff64da7bf7908450ea9e5ff8c'; /// See also [AniSkip]. @ProviderFor(AniSkip) diff --git a/lib/services/get_chapter_pages.dart b/lib/services/get_chapter_pages.dart index 32202ca0..e119c554 100644 --- a/lib/services/get_chapter_pages.dart +++ b/lib/services/get_chapter_pages.dart @@ -43,8 +43,9 @@ Future getChapterPages( final settings = isar.settings.getSync(227); List? chapterPageUrlsList = settings!.chapterPageUrlsList ?? []; - final isarPageUrls = - chapterPageUrlsList.where((element) => element.chapterId == chapter.id); + final isarPageUrls = chapterPageUrlsList + .where((element) => element.chapterId == chapter.id) + .firstOrNull; final incognitoMode = ref.watch(incognitoModeStateProvider); final storageProvider = StorageProvider(); path = await storageProvider.getMangaChapterDirectory(chapter); @@ -55,16 +56,15 @@ Future getChapterPages( if (!chapter.manga.value!.isLocalArchive!) { final source = getSource(chapter.manga.value!.lang!, chapter.manga.value!.source!)!; - if (isarPageUrls.isNotEmpty && - isarPageUrls.first.urls != null && - isarPageUrls.first.urls!.isNotEmpty) { - for (var i = 0; i < isarPageUrls.first.urls!.length; i++) { + if ((isarPageUrls?.urls?.isNotEmpty ?? false) && + (isarPageUrls?.chapterUrl ?? chapter.url) == chapter.url) { + for (var i = 0; i < isarPageUrls!.urls!.length; i++) { Map? headers; - if (isarPageUrls.first.headers?.isNotEmpty ?? false) { - headers = (jsonDecode(isarPageUrls.first.headers![i]) as Map?) - ?.toMapStringString; + if (isarPageUrls.headers?.isNotEmpty ?? false) { + headers = + (jsonDecode(isarPageUrls.headers![i]) as Map?)?.toMapStringString; } - pageUrls.add(PageUrl(isarPageUrls.first.urls![i], headers: headers)); + pageUrls.add(PageUrl(isarPageUrls.urls![i], headers: headers)); } } else { pageUrls = await getExtensionService(source).getPageList(chapter.url!); @@ -111,6 +111,7 @@ Future getChapterPages( chapterPageUrls.add(ChapterPageurls() ..chapterId = chapter.id ..urls = pageUrls.map((e) => e.url).toList() + ..chapterUrl = chapter.url ..headers = chapterPageHeaders.first != null ? chapterPageHeaders.map((e) => e.toString()).toList() : null); diff --git a/lib/services/http/m_client.dart b/lib/services/http/m_client.dart index bb81eebf..47d9d97f 100644 --- a/lib/services/http/m_client.dart +++ b/lib/services/http/m_client.dart @@ -1,3 +1,4 @@ +import 'package:flutter/foundation.dart'; import 'package:http_interceptor/http_interceptor.dart'; import 'package:mangayomi/eval/model/m_bridge.dart'; import 'dart:async'; @@ -173,9 +174,13 @@ class LoggerInterceptor extends InterceptorContract { Future interceptRequest({ required BaseRequest request, }) async { + final content = + "----- Request -----\n${request.toString()}\nheaders: ${request.headers.toString()}"; + if (kDebugMode) { + print(content); + } if (useLogger) { - Logger.add(LoggerLevel.info, - '----- Request -----\n${request.toString()}\nheaders: ${request.headers.toString()}'); + Logger.add(LoggerLevel.info, content); } return request; @@ -189,9 +194,13 @@ class LoggerInterceptor extends InterceptorContract { final cloudflare = [403, 503].contains(response.statusCode) && ["cloudflare-nginx", "cloudflare"] .contains(response.headers["server"]); + final content = + "----- Response -----\n${response.request?.method}: ${response.request?.url}, statusCode: ${response.statusCode} ${cloudflare ? "Failed to bypass Cloudflare" : ""}"; + if (kDebugMode) { + print(content); + } if (useLogger) { - Logger.add(LoggerLevel.info, - "----- Response -----\n${response.request?.method}: ${response.request?.url}, statusCode: ${response.statusCode} ${cloudflare ? "Failed to bypass Cloudflare" : ""}"); + Logger.add(LoggerLevel.info, content); } if (cloudflare) { botToast("${response.statusCode} Failed to bypass Cloudflare", diff --git a/lib/services/trackers/anilist.g.dart b/lib/services/trackers/anilist.g.dart index ea4d0e96..dd740dcc 100644 --- a/lib/services/trackers/anilist.g.dart +++ b/lib/services/trackers/anilist.g.dart @@ -6,7 +6,7 @@ part of 'anilist.dart'; // RiverpodGenerator // ************************************************************************** -String _$anilistHash() => r'87784b25bccf5b1c61d6c7494f0569a28494dd8b'; +String _$anilistHash() => r'd3a8852d689b13c3bde46ec05b464e7779149e58'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/utils/log/log.dart b/lib/utils/log/log.dart index 1e1dcb91..ad9cb89b 100644 --- a/lib/utils/log/log.dart +++ b/lib/utils/log/log.dart @@ -1,4 +1,3 @@ -import 'package:flutter/foundation.dart'; import 'dart:async'; bool useLogger = false; @@ -16,9 +15,6 @@ class Logger { static List<(LoggerLevel, String, DateTime)> get logs => _logs; static void add(LoggerLevel level, String content) { - if (kDebugMode) { - print(content); - } _logStreamController.add((level, content, DateTime.now())); _logs.add((level, content, DateTime.now())); }