local comic reading

This commit is contained in:
nyne
2024-10-08 08:30:08 +08:00
parent 601a7cd796
commit b44998663a
4 changed files with 101 additions and 35 deletions

View File

@@ -462,7 +462,7 @@ abstract mixin class _ComicPageActions {
void read([int? ep, int? page]) {
App.rootContext.to(
() => Reader(
source: comicSource,
type: comic.comicType,
cid: comic.id,
name: comic.title,
chapters: comic.chapters,

View File

@@ -21,23 +21,43 @@ class _ReaderImagesState extends State<_ReaderImages> {
void load() async {
if (inProgress) return;
inProgress = true;
var res = await context.reader.widget.source.loadComicPages!(
context.reader.widget.cid,
context.reader.widget.chapters?.keys
.elementAt(context.reader.chapter - 1),
);
if (res.error) {
setState(() {
error = res.errorMessage;
context.reader.isLoading = false;
inProgress = false;
});
if (context.reader.type == ComicType.local ||
(await LocalManager().isDownloaded(
context.reader.cid, context.reader.type, context.reader.chapter))) {
try {
var images = await LocalManager().getImages(
context.reader.cid, context.reader.type, context.reader.chapter);
setState(() {
context.reader.images = images;
context.reader.isLoading = false;
inProgress = false;
});
} catch (e) {
setState(() {
error = e.toString();
context.reader.isLoading = false;
inProgress = false;
});
}
} else {
setState(() {
context.reader.images = res.data;
context.reader.isLoading = false;
inProgress = false;
});
var res = await context.reader.type.comicSource!.loadComicPages!(
context.reader.widget.cid,
context.reader.widget.chapters?.keys
.elementAt(context.reader.chapter - 1),
);
if (res.error) {
setState(() {
error = res.errorMessage;
context.reader.isLoading = false;
inProgress = false;
});
} else {
setState(() {
context.reader.images = res.data;
context.reader.isLoading = false;
inProgress = false;
});
}
}
context.readerScaffold.update();
}
@@ -196,12 +216,17 @@ class _GalleryModeState extends State<_GalleryMode>
}
ImageProvider _createImageProvider(int page, BuildContext context) {
return ReaderImageProvider(
context.reader.images![page - 1],
context.reader.widget.source.key,
context.reader.cid,
context.reader.eid,
);
var imageKey = context.reader.images![page-1];
if(imageKey.startsWith('file://')) {
return FileImage(File(imageKey.replaceFirst("file://", '')));
} else {
return ReaderImageProvider(
imageKey,
context.reader.type.comicSource!.key,
context.reader.cid,
context.reader.eid,
);
}
}
void _precacheImage(int page, BuildContext context) {

View File

@@ -10,9 +10,11 @@ import 'package:photo_view/photo_view_gallery.dart';
import 'package:venera/components/components.dart';
import 'package:venera/foundation/app.dart';
import 'package:venera/foundation/appdata.dart';
import 'package:venera/foundation/comic_source/comic_source.dart';
import 'package:venera/foundation/comic_type.dart';
import 'package:venera/foundation/history.dart';
import 'package:venera/foundation/image_provider/reader_image.dart';
import 'package:venera/foundation/local.dart';
import 'package:venera/utils/io.dart';
import 'package:venera/utils/translations.dart';
import 'package:window_manager/window_manager.dart';
@@ -32,7 +34,7 @@ extension _ReaderContext on BuildContext {
class Reader extends StatefulWidget {
const Reader({
super.key,
required this.source,
required this.type,
required this.cid,
required this.name,
required this.chapters,
@@ -41,7 +43,7 @@ class Reader extends StatefulWidget {
this.initialChapter,
});
final ComicSource source;
final ComicType type;
final String cid;
@@ -72,6 +74,8 @@ class _ReaderState extends State<Reader> with _ReaderLocation, _ReaderWindow {
@override
int get maxPage => images?.length ?? 1;
ComicType get type => widget.type;
String get cid => widget.cid;
String get eid => widget.chapters?.keys.elementAt(chapter - 1) ?? '0';