feat: add a custom request headers for getPageList #235
This commit is contained in:
parent
2ff3c0ebcc
commit
7d5640e2b0
17 changed files with 453 additions and 103 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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
15
lib/models/page.dart
Normal 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};
|
||||
}
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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});
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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>;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
71
pubspec.lock
71
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"
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in a new issue