diff --git a/lib/eval/dart/bridge/m_provider.dart b/lib/eval/dart/bridge/m_provider.dart index edaeec3..8bb59ec 100644 --- a/lib/eval/dart/bridge/m_provider.dart +++ b/lib/eval/dart/bridge/m_provider.dart @@ -84,7 +84,7 @@ class $MProvider extends MProvider with $Bridge { ])), 'getPageList': BridgeMethodDef(BridgeFunctionDef( returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.future, [ - BridgeTypeRef(CoreTypes.list, [BridgeTypeRef(CoreTypes.string)]) + BridgeTypeRef(CoreTypes.list, [BridgeTypeRef(CoreTypes.dynamic)]) ])), params: [ BridgeParameter('url', @@ -999,7 +999,7 @@ class $MProvider extends MProvider with $Bridge { ]); @override - Future> getPageList(String url) async { + Future> getPageList(String url) async { final res = await $_invoke('getPageList', [$String(url)]); List list = []; if (res is $List) { @@ -1008,7 +1008,7 @@ class $MProvider extends MProvider with $Bridge { list = res; } - return list.map((e) => (e is $Value ? e.$reified : e) as String).toList(); + return list.map((e) => (e is $Value ? e.$reified : e)).toList(); } @override diff --git a/lib/eval/dart/model/m_provider.dart b/lib/eval/dart/model/m_provider.dart index 2d52ead..24d216c 100644 --- a/lib/eval/dart/model/m_provider.dart +++ b/lib/eval/dart/model/m_provider.dart @@ -20,7 +20,7 @@ abstract class MProvider { Future getDetail(String url); - Future> getPageList(String url); + Future> getPageList(String url); Future> getVideoList(String url); diff --git a/lib/eval/dart/service.dart b/lib/eval/dart/service.dart index 7cd0884..f180992 100644 --- a/lib/eval/dart/service.dart +++ b/lib/eval/dart/service.dart @@ -9,6 +9,7 @@ import 'package:mangayomi/eval/dart/model/filter.dart'; import 'package:mangayomi/eval/dart/model/m_manga.dart'; import 'package:mangayomi/eval/dart/model/m_pages.dart'; import 'package:mangayomi/eval/dart/model/source_preference.dart'; +import 'package:mangayomi/models/page.dart'; import 'package:mangayomi/models/source.dart'; import 'package:mangayomi/models/video.dart'; @@ -89,8 +90,12 @@ class DartExtensionService { return await _executeLib().getDetail(url); } - Future> getPageList(String url) async { - return await _executeLib().getPageList(url); + Future> getPageList(String url) async { + return (await _executeLib().getPageList(url)) + .map((e) => e is String + ? PageUrl(e.toString()) + : PageUrl.fromJson((e as Map).toMapStringDynamic!)) + .toList(); } Future> getVideoList(String url) async { diff --git a/lib/eval/javascript/service.dart b/lib/eval/javascript/service.dart index 830fcdc..0fdea26 100644 --- a/lib/eval/javascript/service.dart +++ b/lib/eval/javascript/service.dart @@ -9,6 +9,7 @@ import 'package:mangayomi/eval/dart/model/filter.dart'; import 'package:mangayomi/eval/dart/model/m_manga.dart'; import 'package:mangayomi/eval/dart/model/m_pages.dart'; import 'package:mangayomi/eval/dart/model/source_preference.dart'; +import 'package:mangayomi/models/page.dart'; import 'package:mangayomi/models/source.dart'; import 'package:mangayomi/models/video.dart'; @@ -115,13 +116,16 @@ var extention = new DefaultExtension(); return MManga.fromJson(jsonDecode(res)); } - Future> getPageList(String url) async { + Future> getPageList(String url) async { _init(); final res = (await runtime.handlePromise(await runtime.evaluateAsync( 'jsonStringify(() => extention.getPageList(`$url`))'))) .stringResult; - - return (jsonDecode(res) as List).map((e) => e.toString()).toList(); + return (jsonDecode(res) as List) + .map((e) => e is String + ? PageUrl(e.toString()) + : PageUrl.fromJson((e as Map).toMapStringDynamic!)) + .toList(); } Future> getVideoList(String url) async { diff --git a/lib/models/page.dart b/lib/models/page.dart new file mode 100644 index 0000000..b86f381 --- /dev/null +++ b/lib/models/page.dart @@ -0,0 +1,15 @@ +import 'package:mangayomi/eval/javascript/http.dart'; + +class PageUrl { + String url; + Map? headers; + + PageUrl(this.url, {this.headers}); + factory PageUrl.fromJson(Map json) { + return PageUrl( + json['url'], + headers: (json['headers'] as Map?)?.toMapStringString, + ); + } + Map toJson() => {'url': url, 'headers': headers}; +} diff --git a/lib/models/settings.dart b/lib/models/settings.dart index e1ca508..19e6cca 100644 --- a/lib/models/settings.dart +++ b/lib/models/settings.dart @@ -638,14 +638,17 @@ class ChapterFilterBookmarked { class ChapterPageurls { int? chapterId; List? urls; + List? headers; ChapterPageurls({this.chapterId, this.urls}); ChapterPageurls.fromJson(Map json) { chapterId = json['chapterId']; - urls = json['urls']?.cast(); + urls = json['headers']?.cast(); + urls = json['headers']?.cast(); } - Map toJson() => {'chapterId': chapterId, 'urls': urls}; + Map toJson() => + {'chapterId': chapterId, 'urls': urls, 'headers': headers}; } @embedded diff --git a/lib/models/settings.g.dart b/lib/models/settings.g.dart index a69a03d..d1305e6 100644 --- a/lib/models/settings.g.dart +++ b/lib/models/settings.g.dart @@ -11526,8 +11526,13 @@ const ChapterPageurlsSchema = Schema( name: r'chapterId', type: IsarType.long, ), - r'urls': PropertySchema( + r'headers': PropertySchema( id: 1, + name: r'headers', + type: IsarType.stringList, + ), + r'urls': PropertySchema( + id: 2, name: r'urls', type: IsarType.stringList, ) @@ -11544,6 +11549,18 @@ int _chapterPageurlsEstimateSize( Map> allOffsets, ) { var bytesCount = offsets.last; + { + final list = object.headers; + if (list != null) { + bytesCount += 3 + list.length * 3; + { + for (var i = 0; i < list.length; i++) { + final value = list[i]; + bytesCount += value.length * 3; + } + } + } + } { final list = object.urls; if (list != null) { @@ -11566,7 +11583,8 @@ void _chapterPageurlsSerialize( Map> allOffsets, ) { writer.writeLong(offsets[0], object.chapterId); - writer.writeStringList(offsets[1], object.urls); + writer.writeStringList(offsets[1], object.headers); + writer.writeStringList(offsets[2], object.urls); } ChapterPageurls _chapterPageurlsDeserialize( @@ -11577,8 +11595,9 @@ ChapterPageurls _chapterPageurlsDeserialize( ) { final object = ChapterPageurls( chapterId: reader.readLongOrNull(offsets[0]), - urls: reader.readStringList(offsets[1]), + urls: reader.readStringList(offsets[2]), ); + object.headers = reader.readStringList(offsets[1]); return object; } @@ -11593,6 +11612,8 @@ P _chapterPageurlsDeserializeProp

( return (reader.readLongOrNull(offset)) as P; case 1: return (reader.readStringList(offset)) as P; + case 2: + return (reader.readStringList(offset)) as P; default: throw IsarError('Unknown property with id $propertyId'); } @@ -11674,6 +11695,249 @@ extension ChapterPageurlsQueryFilter }); } + QueryBuilder + headersIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'headers', + )); + }); + } + + QueryBuilder + headersIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'headers', + )); + }); + } + + QueryBuilder + headersElementEqualTo( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'headers', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + headersElementGreaterThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'headers', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + headersElementLessThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'headers', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + headersElementBetween( + 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'headers', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + headersElementStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'headers', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + headersElementEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'headers', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + headersElementContains(String value, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'headers', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + headersElementMatches(String pattern, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'headers', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + headersElementIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'headers', + value: '', + )); + }); + } + + QueryBuilder + headersElementIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'headers', + value: '', + )); + }); + } + + QueryBuilder + headersLengthEqualTo(int length) { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'headers', + length, + true, + length, + true, + ); + }); + } + + QueryBuilder + headersIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'headers', + 0, + true, + 0, + true, + ); + }); + } + + QueryBuilder + headersIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'headers', + 0, + false, + 999999, + true, + ); + }); + } + + QueryBuilder + headersLengthLessThan( + int length, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'headers', + 0, + true, + length, + include, + ); + }); + } + + QueryBuilder + headersLengthGreaterThan( + int length, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'headers', + length, + include, + 999999, + true, + ); + }); + } + + QueryBuilder + headersLengthBetween( + int lower, + int upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'headers', + lower, + includeLower, + upper, + includeUpper, + ); + }); + } + QueryBuilder urlsIsNull() { return QueryBuilder.apply(this, (query) { diff --git a/lib/modules/browse/extension/edit_code.dart b/lib/modules/browse/extension/edit_code.dart index 629fdc8..79be0ad 100644 --- a/lib/modules/browse/extension/edit_code.dart +++ b/lib/modules/browse/extension/edit_code.dart @@ -257,13 +257,18 @@ class _CodeEditorState extends ConsumerState { } else if (_serviceIndex == 4) { if (source!.sourceCodeLanguage == SourceCodeLanguage.dart) { - result = await DartExtensionService( - source) - .getPageList(_url); - } else { result = - await JsExtensionService(source) - .getPageList(_url); + (await DartExtensionService( + source) + .getPageList(_url)) + .map((e) => e.toJson()) + .toList(); + } else { + result = (await JsExtensionService( + source) + .getPageList(_url)) + .map((e) => e.toJson()) + .toList(); } result = {"pages": result}; } else { diff --git a/lib/modules/manga/download/providers/download_provider.dart b/lib/modules/manga/download/providers/download_provider.dart index d26ec0d..c50eeb6 100644 --- a/lib/modules/manga/download/providers/download_provider.dart +++ b/lib/modules/manga/download/providers/download_provider.dart @@ -1,4 +1,6 @@ +import 'dart:convert'; import 'dart:io'; +import 'package:mangayomi/models/page.dart'; import 'package:mangayomi/services/background_downloader/background_downloader.dart'; import 'package:isar/isar.dart'; import 'package:mangayomi/main.dart'; @@ -21,12 +23,12 @@ part 'download_provider.g.dart'; FileDownloader _mangaFileDownloader = FileDownloader(isAnime: false); FileDownloader _animeFileDownloader = FileDownloader(isAnime: true); @riverpod -Future> downloadChapter( +Future> downloadChapter( DownloadChapterRef ref, { required Chapter chapter, bool? useWifi, }) async { - List pageUrls = []; + List pageUrls = []; List tasks = []; final StorageProvider storageProvider = StorageProvider(); await storageProvider.requestPermission(); @@ -56,9 +58,15 @@ Future> downloadChapter( chapterPageUrls.add(chapterPageUrl); } } + final chapterPageHeaders = pageUrls + .map((e) => e.headers == null ? null : jsonEncode(e.headers)) + .toList(); chapterPageUrls.add(ChapterPageurls() ..chapterId = chapter.id - ..urls = pageUrls); + ..urls = pageUrls.map((e) => e.url).toList() + ..headers = chapterPageHeaders.first != null + ? chapterPageHeaders.map((e) => e.toString()).toList() + : null); isar.writeTxnSync(() => isar.settings.putSync(settings..chapterPageUrlsList = chapterPageUrls)); } @@ -84,7 +92,7 @@ Future> downloadChapter( .where((element) => element.originalUrl.isMediaVideo()) .toList(); if (videosUrls.isNotEmpty) { - pageUrls = [videosUrls.first.url]; + pageUrls = [PageUrl(videosUrls.first.url)]; videoHeader.addAll(videosUrls.first.headers ?? {}); isOk = true; } @@ -135,8 +143,8 @@ Future> downloadChapter( if (!(await path3.exists())) { await path3.create(); } - - final cookie = MClient.getCookiesPref(pageUrls[index]); + final page = pageUrls[index]; + final cookie = MClient.getCookiesPref(page.url); final headers = isManga ? ref.watch( headersProvider(source: manga.source!, lang: manga.lang!)) @@ -151,10 +159,12 @@ Future> downloadChapter( if (await File("${path.path}" "${padIndex(index + 1)}.jpg") .exists()) { } else { + Map pageHeaders = headers; + pageHeaders.addAll(page.headers ?? {}); tasks.add(DownloadTask( - taskId: pageUrls[index], - headers: headers, - url: pageUrls[index].trim().trimLeft().trimRight(), + taskId: page.url, + headers: pageHeaders, + url: page.url.trim().trimLeft().trimRight(), filename: "${padIndex(index + 1)}.jpg", baseDirectory: BaseDirectory.temporary, directory: 'Mangayomi/$finalPath', @@ -168,10 +178,12 @@ Future> downloadChapter( if (await File("${path.path}" "${padIndex(index + 1)}.jpg") .exists()) { } else { + Map pageHeaders = headers; + pageHeaders.addAll(page.headers ?? {}); tasks.add(DownloadTask( - taskId: pageUrls[index], - headers: headers, - url: pageUrls[index].trim().trimLeft().trimRight(), + taskId: page.url, + headers: pageHeaders, + url: page.url.trim().trimLeft().trimRight(), filename: "${padIndex(index + 1)}.jpg", baseDirectory: BaseDirectory.temporary, directory: 'Mangayomi/$finalPath', @@ -185,10 +197,12 @@ Future> downloadChapter( if ((await path.exists())) { if (await File("${path.path}${chapter.name}.mp4").exists()) { } else { + Map pageHeaders = headers; + pageHeaders.addAll(page.headers ?? {}); tasks.add(DownloadTask( - taskId: pageUrls[index], - headers: headers, - url: pageUrls[index].trim().trimLeft().trimRight(), + taskId: page.url, + headers: pageHeaders, + url: page.url.trim().trimLeft().trimRight(), filename: "${chapter.name}.mp4", baseDirectory: BaseDirectory.temporary, directory: 'Mangayomi/$finalPath', @@ -201,10 +215,12 @@ Future> downloadChapter( await path.create(); if (await File("${path.path}${chapter.name}.mp4").exists()) { } else { + Map pageHeaders = headers; + pageHeaders.addAll(page.headers ?? {}); tasks.add(DownloadTask( - taskId: pageUrls[index], - headers: headers, - url: pageUrls[index].trim().trimLeft().trimRight(), + taskId: page.url, + headers: pageHeaders, + url: page.url.trim().trimLeft().trimRight(), filename: "${chapter.name}.mp4", baseDirectory: BaseDirectory.temporary, directory: 'Mangayomi/$finalPath', @@ -225,7 +241,7 @@ Future> downloadChapter( failed: 0, total: 0, isDownload: true, - taskIds: pageUrls, + taskIds: pageUrls.map((e) => e.url).toList(), isStartDownload: false, chapterId: chapter.id, mangaId: manga.id); @@ -243,7 +259,10 @@ Future> downloadChapter( savePageUrls(); if (ref.watch(saveAsCBZArchiveStateProvider)) { await ref.watch(convertToCBZProvider( - path!.path, mangaDir.path, chapter.name!, pageUrls) + path!.path, + mangaDir.path, + chapter.name!, + pageUrls.map((e) => e.url).toList()) .future); } } @@ -258,7 +277,7 @@ Future> downloadChapter( failed: failed, total: tasks.length, isDownload: (succeeded == tasks.length), - taskIds: pageUrls, + taskIds: pageUrls.map((e) => e.url).toList(), isStartDownload: true, chapterId: chapter.id, mangaId: manga.id); @@ -301,7 +320,7 @@ Future> downloadChapter( failed: 0, total: 100, isDownload: (progress == 1.0), - taskIds: pageUrls, + taskIds: pageUrls.map((e) => e.url).toList(), isStartDownload: true, chapterId: chapter.id, mangaId: manga.id); diff --git a/lib/modules/manga/download/providers/download_provider.g.dart b/lib/modules/manga/download/providers/download_provider.g.dart index 27a5477..38f603c 100644 --- a/lib/modules/manga/download/providers/download_provider.g.dart +++ b/lib/modules/manga/download/providers/download_provider.g.dart @@ -6,7 +6,7 @@ part of 'download_provider.dart'; // RiverpodGenerator // ************************************************************************** -String _$downloadChapterHash() => r'55ee5ac033e4616be7fbf040a7396a2f9d36599d'; +String _$downloadChapterHash() => r'a2ba0ce07800518f35f47fa2272049357141a854'; /// Copied from Dart SDK class _SystemHash { @@ -34,7 +34,7 @@ class _SystemHash { const downloadChapterProvider = DownloadChapterFamily(); /// See also [downloadChapter]. -class DownloadChapterFamily extends Family>> { +class DownloadChapterFamily extends Family>> { /// See also [downloadChapter]. const DownloadChapterFamily(); @@ -75,7 +75,7 @@ class DownloadChapterFamily extends Family>> { } /// See also [downloadChapter]. -class DownloadChapterProvider extends AutoDisposeFutureProvider> { +class DownloadChapterProvider extends AutoDisposeFutureProvider> { /// See also [downloadChapter]. DownloadChapterProvider({ required Chapter chapter, @@ -115,7 +115,7 @@ class DownloadChapterProvider extends AutoDisposeFutureProvider> { @override Override overrideWith( - FutureOr> Function(DownloadChapterRef provider) create, + FutureOr> Function(DownloadChapterRef provider) create, ) { return ProviderOverride( origin: this, @@ -133,7 +133,7 @@ class DownloadChapterProvider extends AutoDisposeFutureProvider> { } @override - AutoDisposeFutureProviderElement> createElement() { + AutoDisposeFutureProviderElement> createElement() { return _DownloadChapterProviderElement(this); } @@ -154,7 +154,7 @@ class DownloadChapterProvider extends AutoDisposeFutureProvider> { } } -mixin DownloadChapterRef on AutoDisposeFutureProviderRef> { +mixin DownloadChapterRef on AutoDisposeFutureProviderRef> { /// The parameter `chapter` of this provider. Chapter get chapter; @@ -163,7 +163,7 @@ mixin DownloadChapterRef on AutoDisposeFutureProviderRef> { } class _DownloadChapterProviderElement - extends AutoDisposeFutureProviderElement> + extends AutoDisposeFutureProviderElement> with DownloadChapterRef { _DownloadChapterProviderElement(super.provider); diff --git a/lib/modules/manga/reader/providers/crop_borders_provider.g.dart b/lib/modules/manga/reader/providers/crop_borders_provider.g.dart index 3ffe8d7..b68c793 100644 --- a/lib/modules/manga/reader/providers/crop_borders_provider.g.dart +++ b/lib/modules/manga/reader/providers/crop_borders_provider.g.dart @@ -6,7 +6,7 @@ part of 'crop_borders_provider.dart'; // RiverpodGenerator // ************************************************************************** -String _$cropBordersHash() => r'857ae4319c11ee55cbaa2ae15b57bda240329c0d'; +String _$cropBordersHash() => r'b275a01ce80a3322b70a6c1e87abe1df0d35dc64'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/modules/manga/reader/reader_view.dart b/lib/modules/manga/reader/reader_view.dart index e2596ca..633b452 100644 --- a/lib/modules/manga/reader/reader_view.dart +++ b/lib/modules/manga/reader/reader_view.dart @@ -12,6 +12,7 @@ import 'package:mangayomi/eval/dart/model/m_bridge.dart'; import 'package:mangayomi/main.dart'; import 'package:mangayomi/models/chapter.dart'; import 'package:mangayomi/models/manga.dart'; +import 'package:mangayomi/models/page.dart'; import 'package:mangayomi/models/settings.dart'; import 'package:mangayomi/modules/anime/widgets/desktop.dart'; import 'package:mangayomi/modules/manga/reader/providers/crop_borders_provider.dart'; @@ -868,12 +869,15 @@ class _MangaChapterPageGalleryState if (!_uChapDataPreload[index].isLocale!) { precacheImage( ExtendedNetworkImageProvider( - _uChapDataPreload[index].url!, + _uChapDataPreload[index].pageUrl!.url, cache: true, cacheMaxAge: const Duration(days: 7), - headers: ref.watch(headersProvider( - source: chapter.manga.value!.source!, - lang: chapter.manga.value!.lang!)), + headers: { + ..._uChapDataPreload[index].pageUrl!.headers ?? {}, + ...ref.watch(headersProvider( + source: chapter.manga.value!.source!, + lang: chapter.manga.value!.lang!)) + }, ), context); } else { @@ -2329,14 +2333,14 @@ class _MangaChapterPageGalleryState class UChapDataPreload { Chapter? chapter; Directory? directory; - String? url; + PageUrl? pageUrl; bool? isLocale; Uint8List? archiveImage; int? index; GetChapterPagesModel? chapterUrlModel; int? pageIndex; Uint8List? cropImage; - UChapDataPreload(this.chapter, this.directory, this.url, this.isLocale, + UChapDataPreload(this.chapter, this.directory, this.pageUrl, this.isLocale, this.archiveImage, this.index, this.chapterUrlModel, this.pageIndex, {this.cropImage}); } diff --git a/lib/services/get_chapter_pages.dart b/lib/services/get_chapter_pages.dart index 1a02fdd..bb3368d 100644 --- a/lib/services/get_chapter_pages.dart +++ b/lib/services/get_chapter_pages.dart @@ -1,9 +1,12 @@ +import 'dart:convert'; import 'dart:io'; import 'dart:typed_data'; import 'package:mangayomi/eval/dart/service.dart'; +import 'package:mangayomi/eval/javascript/http.dart'; import 'package:mangayomi/eval/javascript/service.dart'; import 'package:mangayomi/main.dart'; import 'package:mangayomi/models/chapter.dart'; +import 'package:mangayomi/models/page.dart'; import 'package:mangayomi/models/settings.dart'; import 'package:mangayomi/models/source.dart'; import 'package:mangayomi/modules/manga/archive_reader/providers/archive_reader_providers.dart'; @@ -17,7 +20,7 @@ part 'get_chapter_pages.g.dart'; class GetChapterPagesModel { Directory? path; - List pageUrls = []; + List pageUrls = []; List isLocaleList = []; List archiveImages = []; List uChapDataPreload; @@ -36,7 +39,7 @@ Future getChapterPages( }) async { List uChapDataPreloadp = []; Directory? path; - List pageUrls = []; + List pageUrls = []; List isLocaleList = []; final settings = isar.settings.getSync(227); List? chapterPageUrlsList = @@ -56,7 +59,14 @@ Future getChapterPages( if (isarPageUrls.isNotEmpty && isarPageUrls.first.urls != null && isarPageUrls.first.urls!.isNotEmpty) { - pageUrls = isarPageUrls.first.urls!; + for (var i = 0; i < isarPageUrls.first.urls!.length; i++) { + Map? headers; + if (isarPageUrls.first.headers?.isNotEmpty ?? false) { + headers = (jsonDecode(isarPageUrls.first.headers![i]) as Map?) + ?.toMapStringString; + } + pageUrls.add(PageUrl(isarPageUrls.first.urls![i], headers: headers)); + } } else { if (source.sourceCodeLanguage == SourceCodeLanguage.dart) { pageUrls = await DartExtensionService(source).getPageList(chapter.url!); @@ -90,7 +100,7 @@ Future getChapterPages( } if (isLocalArchive) { for (var i = 0; i < archiveImages.length; i++) { - pageUrls.add(""); + pageUrls.add(PageUrl("")); } } if (!incognitoMode) { @@ -100,9 +110,15 @@ Future getChapterPages( chapterPageUrls.add(chapterPageUrl); } } + final chapterPageHeaders = pageUrls + .map((e) => e.headers == null ? null : jsonEncode(e.headers)) + .toList(); chapterPageUrls.add(ChapterPageurls() ..chapterId = chapter.id - ..urls = pageUrls); + ..urls = pageUrls.map((e) => e.url).toList() + ..headers = chapterPageHeaders.first != null + ? chapterPageHeaders.map((e) => e.toString()).toList() + : null); isar.writeTxnSync(() => isar.settings .putSync(settings..chapterPageUrlsList = chapterPageUrls)); } diff --git a/lib/services/get_chapter_pages.g.dart b/lib/services/get_chapter_pages.g.dart index 1218335..631154e 100644 --- a/lib/services/get_chapter_pages.g.dart +++ b/lib/services/get_chapter_pages.g.dart @@ -6,7 +6,7 @@ part of 'get_chapter_pages.dart'; // RiverpodGenerator // ************************************************************************** -String _$getChapterPagesHash() => r'3b1b2e7c3b22c28d402ced32ac2eb44294c39644'; +String _$getChapterPagesHash() => r'8c7b5e87ced01c6b1c4c54115b44cf3ea3ae72c7'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/utils/extensions/others.dart b/lib/utils/extensions/others.dart index 157813b..1142d53 100644 --- a/lib/utils/extensions/others.dart +++ b/lib/utils/extensions/others.dart @@ -47,12 +47,12 @@ extension UChapDataPreloadExtensions on UChapDataPreload { .readAsBytesSync(); } else { File? cachedImage; - if (url != null) { - cachedImage = await getCachedImageFile(url!); + if (pageUrl != null) { + cachedImage = await getCachedImageFile(pageUrl!.url); } if (cachedImage == null) { await Future.delayed(const Duration(seconds: 3)); - cachedImage = await getCachedImageFile(url!); + cachedImage = await getCachedImageFile(pageUrl!.url); } imageBytes = cachedImage?.readAsBytesSync(); } @@ -72,12 +72,14 @@ extension UChapDataPreloadExtensions on UChapDataPreload { : ExtendedFileImageProvider(File( '${data.directory!.path}${padIndex(data.index! + 1)}.jpg')) : CustomExtendedNetworkImageProvider( - data.url!.trim().trimLeft().trimRight(), + data.pageUrl!.url.trim().trimLeft().trimRight(), cache: true, cacheMaxAge: const Duration(days: 7), - headers: ref.watch(headersProvider( - source: data.chapter!.manga.value!.source!, - lang: data.chapter!.manga.value! - .lang!)))) as ImageProvider; + headers: { + ...data.pageUrl!.headers ?? {}, + ...ref.watch(headersProvider( + source: data.chapter!.manga.value!.source!, + lang: data.chapter!.manga.value!.lang!)) + })) as ImageProvider; } } diff --git a/pubspec.lock b/pubspec.lock index 4731ff9..1e5e211 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,18 +5,23 @@ packages: dependency: transitive description: name: _fe_analyzer_shared - sha256: "0b2f2bd91ba804e53a61d757b986f89f1f9eaed5b11e4b2f5a2468d86d6c9fc7" + sha256: "5aaf60d96c4cd00fe7f21594b5ad6a1b699c80a27420f8a837f4d68473ef09e3" url: "https://pub.dev" source: hosted - version: "67.0.0" + version: "68.0.0" + _macros: + dependency: transitive + description: dart + source: sdk + version: "0.1.0" analyzer: - dependency: "direct overridden" + dependency: transitive description: name: analyzer - sha256: "37577842a27e4338429a1cbc32679d508836510b056f1eedf0c8d20e39c1383d" + sha256: "21f1d3720fd1c70316399d5e2bccaebb415c434592d778cce8acb967b8578808" url: "https://pub.dev" source: hosted - version: "6.4.1" + version: "6.5.0" analyzer_plugin: dependency: transitive description: @@ -237,10 +242,10 @@ packages: dependency: transitive description: name: cross_file - sha256: "55d7b444feb71301ef6b8838dbc1ae02e63dd48c8773f3810ff53bb1e2945b32" + sha256: "7caf6a750a0c04effbb52a676dce9a4a592e10ad35c34d6d2d0e4811160d5670" url: "https://pub.dev" source: hosted - version: "0.3.4+1" + version: "0.3.4+2" crypto: dependency: "direct main" description: @@ -612,10 +617,10 @@ packages: dependency: "direct main" description: name: go_router - sha256: "39dd52168d6c59984454183148dc3a5776960c61083adfc708cc79a7b3ce1ba8" + sha256: d380de0355788c5c784fe9f81b43fc833b903991c25ecc4e2a416a67faefa722 url: "https://pub.dev" source: hosted - version: "14.2.1" + version: "14.2.2" google_fonts: dependency: "direct main" description: @@ -812,10 +817,10 @@ packages: dependency: "direct main" description: name: json_path - sha256: dc25b4e2297a6bd39fb52b7d122a7787b7dab751fb278d315b54706b98bb76db + sha256: "0e2a47581a9c95b3eedcd7f2ad1b8d7e93c5dee98e194b8ceef7b398405b7ff4" url: "https://pub.dev" source: hosted - version: "0.7.2" + version: "0.7.3" json_view: dependency: "direct main" description: @@ -880,6 +885,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.2.0" + macros: + dependency: transitive + description: + name: macros + sha256: "12e8a9842b5a7390de7a781ec63d793527582398d16ea26c60fed58833c9ae79" + url: "https://pub.dev" + source: hosted + version: "0.1.0-main.0" matcher: dependency: transitive description: @@ -980,13 +993,13 @@ packages: source: git version: "1.2.4" meta: - dependency: transitive + dependency: "direct overridden" description: name: meta - sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136" + sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 url: "https://pub.dev" source: hosted - version: "1.12.0" + version: "1.15.0" mime: dependency: transitive description: @@ -1023,18 +1036,18 @@ packages: dependency: "direct main" description: name: package_info_plus - sha256: b93d8b4d624b4ea19b0a5a208b2d6eff06004bc3ce74c06040b120eeadd00ce0 + sha256: "4de6c36df77ffbcef0a5aefe04669d33f2d18397fea228277b852a2d4e58e860" url: "https://pub.dev" source: hosted - version: "8.0.0" + version: "8.0.1" package_info_plus_platform_interface: dependency: transitive description: name: package_info_plus_platform_interface - sha256: f49918f3433a3146047372f9d4f1f847511f2acd5cd030e1f44fe5a50036b70e + sha256: ac1f4a4847f1ade8e6a87d1f39f5d7c67490738642e2542f559ec38c37489a66 url: "https://pub.dev" source: hosted - version: "3.0.0" + version: "3.0.1" path: dependency: transitive description: @@ -1047,18 +1060,18 @@ packages: dependency: "direct main" description: name: path_provider - sha256: c9e7d3a4cd1410877472158bee69963a4579f78b68c65a2b7d40d1a7a88bb161 + sha256: fec0d61223fba3154d87759e3cc27fe2c8dc498f6386c6d6fc80d1afdd1bf378 url: "https://pub.dev" source: hosted - version: "2.1.3" + version: "2.1.4" path_provider_android: dependency: transitive description: name: path_provider_android - sha256: e84c8a53fe1510ef4582f118c7b4bdf15b03002b51d7c2b66983c65843d61193 + sha256: "490539678396d4c3c0b06efdaab75ae60675c3e0c66f72bc04c2e2c1e0e2abeb" url: "https://pub.dev" source: hosted - version: "2.2.8" + version: "2.2.9" path_provider_foundation: dependency: transitive description: @@ -1547,10 +1560,10 @@ packages: dependency: transitive description: name: url_launcher_android - sha256: c24484594a8dea685610569ab0f2547de9c7a1907500a9bc5e37e4c9a3cbfb23 + sha256: "94d8ad05f44c6d4e2ffe5567ab4d741b82d62e3c8e288cc1fcea45965edf47c9" url: "https://pub.dev" source: hosted - version: "6.3.6" + version: "6.3.8" url_launcher_ios: dependency: transitive description: @@ -1587,10 +1600,10 @@ packages: dependency: transitive description: name: url_launcher_web - sha256: "8d9e750d8c9338601e709cd0885f95825086bd8b642547f26bda435aade95d8a" + sha256: a36e2d7981122fa185006b216eb6b5b97ede3f9a54b7a511bc966971ab98d049 url: "https://pub.dev" source: hosted - version: "2.3.1" + version: "2.3.2" url_launcher_windows: dependency: transitive description: @@ -1683,10 +1696,10 @@ packages: dependency: transitive description: name: win32 - sha256: a79dbe579cb51ecd6d30b17e0cae4e0ea15e2c0e66f69ad4198f22a6789e94f4 + sha256: "015002c060f1ae9f41a818f2d5640389cc05283e368be19dc8d77cecb43c40c9" url: "https://pub.dev" source: hosted - version: "5.5.1" + version: "5.5.3" window_manager: dependency: "direct main" description: @@ -1760,5 +1773,5 @@ packages: source: hosted version: "2.2.1" sdks: - dart: ">=3.4.0 <4.0.0" + dart: ">=3.4.4 <4.0.0" flutter: ">=3.22.0" diff --git a/pubspec.yaml b/pubspec.yaml index 451f7b0..c78306d 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: "none" version: 0.2.75+62 environment: - sdk: ">=3.4.0 <4.0.0" + sdk: ">=3.4.4 <4.0.0" dependencies: flutter: @@ -81,7 +81,7 @@ dependency_overrides: http: ^1.2.1 ffi: ^2.1.2 flex_seed_scheme: ^2.0.0 - analyzer: ">=5.2.0 <7.0.0" + meta: ^1.15.0 html: ^0.15.4 media_kit_native_event_loop: git: @@ -102,8 +102,8 @@ dependency_overrides: dev_dependencies: flutter_test: sdk: flutter - build_runner: ^2.4.6 - riverpod_generator: ^2.3.2 + build_runner: ^2.4.11 + riverpod_generator: ^2.4.2 flutter_launcher_icons: ^0.13.1 isar_generator: ^3.1.0+1 flutter_lints: ^4.0.0