feat: add a custom request headers for getPageList #235

This commit is contained in:
kodjomoustapha 2024-08-02 14:51:39 +01:00
parent 2ff3c0ebcc
commit 7d5640e2b0
17 changed files with 453 additions and 103 deletions

View file

@ -84,7 +84,7 @@ class $MProvider extends MProvider with $Bridge<MProvider> {
])),
'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<MProvider> {
]);
@override
Future<List<String>> getPageList(String url) async {
Future<List<dynamic>> getPageList(String url) async {
final res = await $_invoke('getPageList', [$String(url)]);
List<dynamic> list = [];
if (res is $List) {
@ -1008,7 +1008,7 @@ class $MProvider extends MProvider with $Bridge<MProvider> {
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

View file

@ -20,7 +20,7 @@ abstract class MProvider {
Future<MManga> getDetail(String url);
Future<List<String>> getPageList(String url);
Future<List<dynamic>> getPageList(String url);
Future<List<Video>> getVideoList(String url);

View file

@ -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<List<String>> getPageList(String url) async {
return await _executeLib().getPageList(url);
Future<List<PageUrl>> 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<List<Video>> getVideoList(String url) async {

View file

@ -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<List<String>> getPageList(String url) async {
Future<List<PageUrl>> 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<List<Video>> getVideoList(String url) async {

15
lib/models/page.dart Normal file
View file

@ -0,0 +1,15 @@
import 'package:mangayomi/eval/javascript/http.dart';
class PageUrl {
String url;
Map<String, String>? headers;
PageUrl(this.url, {this.headers});
factory PageUrl.fromJson(Map<String, dynamic> json) {
return PageUrl(
json['url'],
headers: (json['headers'] as Map?)?.toMapStringString,
);
}
Map<String, dynamic> toJson() => {'url': url, 'headers': headers};
}

View file

@ -638,14 +638,17 @@ class ChapterFilterBookmarked {
class ChapterPageurls {
int? chapterId;
List<String>? urls;
List<String>? headers;
ChapterPageurls({this.chapterId, this.urls});
ChapterPageurls.fromJson(Map<String, dynamic> json) {
chapterId = json['chapterId'];
urls = json['urls']?.cast<String>();
urls = json['headers']?.cast<String>();
urls = json['headers']?.cast<String>();
}
Map<String, dynamic> toJson() => {'chapterId': chapterId, 'urls': urls};
Map<String, dynamic> toJson() =>
{'chapterId': chapterId, 'urls': urls, 'headers': headers};
}
@embedded

View file

@ -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<Type, List<int>> 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<Type, List<int>> 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<P>(
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<ChapterPageurls, ChapterPageurls, QAfterFilterCondition>
headersIsNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNull(
property: r'headers',
));
});
}
QueryBuilder<ChapterPageurls, ChapterPageurls, QAfterFilterCondition>
headersIsNotNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNotNull(
property: r'headers',
));
});
}
QueryBuilder<ChapterPageurls, ChapterPageurls, QAfterFilterCondition>
headersElementEqualTo(
String value, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'headers',
value: value,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<ChapterPageurls, ChapterPageurls, QAfterFilterCondition>
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<ChapterPageurls, ChapterPageurls, QAfterFilterCondition>
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<ChapterPageurls, ChapterPageurls, QAfterFilterCondition>
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<ChapterPageurls, ChapterPageurls, QAfterFilterCondition>
headersElementStartsWith(
String value, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.startsWith(
property: r'headers',
value: value,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<ChapterPageurls, ChapterPageurls, QAfterFilterCondition>
headersElementEndsWith(
String value, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.endsWith(
property: r'headers',
value: value,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<ChapterPageurls, ChapterPageurls, QAfterFilterCondition>
headersElementContains(String value, {bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.contains(
property: r'headers',
value: value,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<ChapterPageurls, ChapterPageurls, QAfterFilterCondition>
headersElementMatches(String pattern, {bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.matches(
property: r'headers',
wildcard: pattern,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<ChapterPageurls, ChapterPageurls, QAfterFilterCondition>
headersElementIsEmpty() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'headers',
value: '',
));
});
}
QueryBuilder<ChapterPageurls, ChapterPageurls, QAfterFilterCondition>
headersElementIsNotEmpty() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.greaterThan(
property: r'headers',
value: '',
));
});
}
QueryBuilder<ChapterPageurls, ChapterPageurls, QAfterFilterCondition>
headersLengthEqualTo(int length) {
return QueryBuilder.apply(this, (query) {
return query.listLength(
r'headers',
length,
true,
length,
true,
);
});
}
QueryBuilder<ChapterPageurls, ChapterPageurls, QAfterFilterCondition>
headersIsEmpty() {
return QueryBuilder.apply(this, (query) {
return query.listLength(
r'headers',
0,
true,
0,
true,
);
});
}
QueryBuilder<ChapterPageurls, ChapterPageurls, QAfterFilterCondition>
headersIsNotEmpty() {
return QueryBuilder.apply(this, (query) {
return query.listLength(
r'headers',
0,
false,
999999,
true,
);
});
}
QueryBuilder<ChapterPageurls, ChapterPageurls, QAfterFilterCondition>
headersLengthLessThan(
int length, {
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
return query.listLength(
r'headers',
0,
true,
length,
include,
);
});
}
QueryBuilder<ChapterPageurls, ChapterPageurls, QAfterFilterCondition>
headersLengthGreaterThan(
int length, {
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
return query.listLength(
r'headers',
length,
include,
999999,
true,
);
});
}
QueryBuilder<ChapterPageurls, ChapterPageurls, QAfterFilterCondition>
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<ChapterPageurls, ChapterPageurls, QAfterFilterCondition>
urlsIsNull() {
return QueryBuilder.apply(this, (query) {

View file

@ -257,13 +257,18 @@ class _CodeEditorState extends ConsumerState<CodeEditor> {
} 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 {

View file

@ -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<List<String>> downloadChapter(
Future<List<PageUrl>> downloadChapter(
DownloadChapterRef ref, {
required Chapter chapter,
bool? useWifi,
}) async {
List<String> pageUrls = [];
List<PageUrl> pageUrls = [];
List<DownloadTask> tasks = [];
final StorageProvider storageProvider = StorageProvider();
await storageProvider.requestPermission();
@ -56,9 +58,15 @@ Future<List<String>> 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<List<String>> 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<List<String>> 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<List<String>> downloadChapter(
if (await File("${path.path}" "${padIndex(index + 1)}.jpg")
.exists()) {
} else {
Map<String, String> 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<List<String>> downloadChapter(
if (await File("${path.path}" "${padIndex(index + 1)}.jpg")
.exists()) {
} else {
Map<String, String> 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<List<String>> downloadChapter(
if ((await path.exists())) {
if (await File("${path.path}${chapter.name}.mp4").exists()) {
} else {
Map<String, String> 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<List<String>> downloadChapter(
await path.create();
if (await File("${path.path}${chapter.name}.mp4").exists()) {
} else {
Map<String, String> 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<List<String>> 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<List<String>> 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<List<String>> 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<List<String>> 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);

View file

@ -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<AsyncValue<List<String>>> {
class DownloadChapterFamily extends Family<AsyncValue<List<PageUrl>>> {
/// See also [downloadChapter].
const DownloadChapterFamily();
@ -75,7 +75,7 @@ class DownloadChapterFamily extends Family<AsyncValue<List<String>>> {
}
/// See also [downloadChapter].
class DownloadChapterProvider extends AutoDisposeFutureProvider<List<String>> {
class DownloadChapterProvider extends AutoDisposeFutureProvider<List<PageUrl>> {
/// See also [downloadChapter].
DownloadChapterProvider({
required Chapter chapter,
@ -115,7 +115,7 @@ class DownloadChapterProvider extends AutoDisposeFutureProvider<List<String>> {
@override
Override overrideWith(
FutureOr<List<String>> Function(DownloadChapterRef provider) create,
FutureOr<List<PageUrl>> Function(DownloadChapterRef provider) create,
) {
return ProviderOverride(
origin: this,
@ -133,7 +133,7 @@ class DownloadChapterProvider extends AutoDisposeFutureProvider<List<String>> {
}
@override
AutoDisposeFutureProviderElement<List<String>> createElement() {
AutoDisposeFutureProviderElement<List<PageUrl>> createElement() {
return _DownloadChapterProviderElement(this);
}
@ -154,7 +154,7 @@ class DownloadChapterProvider extends AutoDisposeFutureProvider<List<String>> {
}
}
mixin DownloadChapterRef on AutoDisposeFutureProviderRef<List<String>> {
mixin DownloadChapterRef on AutoDisposeFutureProviderRef<List<PageUrl>> {
/// The parameter `chapter` of this provider.
Chapter get chapter;
@ -163,7 +163,7 @@ mixin DownloadChapterRef on AutoDisposeFutureProviderRef<List<String>> {
}
class _DownloadChapterProviderElement
extends AutoDisposeFutureProviderElement<List<String>>
extends AutoDisposeFutureProviderElement<List<PageUrl>>
with DownloadChapterRef {
_DownloadChapterProviderElement(super.provider);

View file

@ -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 {

View file

@ -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});
}

View file

@ -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<String> pageUrls = [];
List<PageUrl> pageUrls = [];
List<bool> isLocaleList = [];
List<Uint8List?> archiveImages = [];
List<UChapDataPreload> uChapDataPreload;
@ -36,7 +39,7 @@ Future<GetChapterPagesModel> getChapterPages(
}) async {
List<UChapDataPreload> uChapDataPreloadp = [];
Directory? path;
List<String> pageUrls = [];
List<PageUrl> pageUrls = [];
List<bool> isLocaleList = [];
final settings = isar.settings.getSync(227);
List<ChapterPageurls>? chapterPageUrlsList =
@ -56,7 +59,14 @@ Future<GetChapterPagesModel> 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<String, String>? 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<GetChapterPagesModel> getChapterPages(
}
if (isLocalArchive) {
for (var i = 0; i < archiveImages.length; i++) {
pageUrls.add("");
pageUrls.add(PageUrl(""));
}
}
if (!incognitoMode) {
@ -100,9 +110,15 @@ Future<GetChapterPagesModel> 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));
}

View file

@ -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 {

View file

@ -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<Object>;
headers: {
...data.pageUrl!.headers ?? {},
...ref.watch(headersProvider(
source: data.chapter!.manga.value!.source!,
lang: data.chapter!.manga.value!.lang!))
})) as ImageProvider<Object>;
}
}

View file

@ -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"

View file

@ -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