cbz import & export

This commit is contained in:
nyne
2024-10-28 22:59:35 +08:00
parent 78c527aa2b
commit 0308e68a44
10 changed files with 319 additions and 17 deletions

View File

@@ -15,6 +15,7 @@ import 'package:venera/pages/comic_source_page.dart';
import 'package:venera/pages/downloading_page.dart';
import 'package:venera/pages/history_page.dart';
import 'package:venera/pages/search_page.dart';
import 'package:venera/utils/cbz.dart';
import 'package:venera/utils/ext.dart';
import 'package:venera/utils/io.dart';
import 'package:venera/utils/translations.dart';
@@ -391,9 +392,11 @@ class _ImportComicsWidgetState extends State<_ImportComicsWidget> {
@override
Widget build(BuildContext context) {
String info = type == 0
? "Select a directory which contains the comic files.".tl
: "Select a directory which contains the comic directories.".tl;
String info = [
"Select a directory which contains the comic files.".tl,
"Select a directory which contains the comic directories.".tl,
"Select a cbz file.".tl,
][type];
return ContentDialog(
dismissible: !loading,
@@ -431,6 +434,16 @@ class _ImportComicsWidgetState extends State<_ImportComicsWidget> {
});
},
),
RadioListTile(
title: Text("A cbz file".tl),
value: 2,
groupValue: type,
onChanged: (value) {
setState(() {
type = value as int;
});
},
),
const SizedBox(height: 8),
Text(info).paddingHorizontal(24),
],
@@ -490,6 +503,21 @@ class _ImportComicsWidgetState extends State<_ImportComicsWidget> {
}
void selectAndImport() async {
if (type == 2) {
var xFile = await selectFile(ext: ['cbz']);
var controller = showLoadingDialog(context, allowCancel: false);
try {
var cache = FilePath.join(App.cachePath, xFile?.name ?? 'temp.cbz');
await xFile!.saveTo(cache);
await CBZ.import(File(cache));
await File(cache).delete();
} catch (e, s) {
Log.error("Import Comic", e.toString(), s);
context.showMessage(message: e.toString());
}
controller.close();
return;
}
height = key.currentContext!.size!.height;
setState(() {
loading = true;
@@ -583,16 +611,16 @@ class _ImportComicsWidgetState extends State<_ImportComicsWidget> {
Future<LocalComic?> checkSingleComic(Directory directory) async {
if (!(await directory.exists())) return null;
var name = directory.name;
if (LocalManager().findByName(name) != null) {
Log.info("Import Comic", "Comic already exists: $name");
return null;
}
bool hasChapters = false;
var chapters = <String>[];
var coverPath = ''; // relative path to the cover image
await for (var entry in directory.list()) {
if (entry is Directory) {
hasChapters = true;
if (LocalManager().findByName(entry.name) != null) {
Log.info("Import Comic", "Comic already exists: $name");
return null;
}
chapters.add(entry.name);
await for (var file in entry.list()) {
if (file is Directory) {

View File

@@ -1,7 +1,10 @@
import 'package:flutter/material.dart';
import 'package:venera/components/components.dart';
import 'package:venera/foundation/app.dart';
import 'package:venera/foundation/local.dart';
import 'package:venera/pages/downloading_page.dart';
import 'package:venera/utils/cbz.dart';
import 'package:venera/utils/io.dart';
import 'package:venera/utils/translations.dart';
class LocalComicsPage extends StatefulWidget {
@@ -60,12 +63,29 @@ class _LocalComicsPageState extends State<LocalComicsPage> {
menuBuilder: (c) {
return [
MenuEntry(
icon: Icons.delete,
text: "Delete".tl,
onClick: () {
LocalManager().deleteComic(c as LocalComic);
}
),
icon: Icons.delete,
text: "Delete".tl,
onClick: () {
LocalManager().deleteComic(c as LocalComic);
}),
MenuEntry(
icon: Icons.delete,
text: "Export as cbz".tl,
onClick: () async {
var controller = showLoadingDialog(
context,
allowCancel: false,
);
try {
var file = await CBZ.export(c as LocalComic);
await saveFile(filename: file.name, file: file);
await file.delete();
}
catch (e) {
context.showMessage(message: e.toString());
}
controller.close();
}),
];
},
),