mirror of
https://github.com/venera-app/venera.git
synced 2025-09-27 15:57:25 +00:00
cbz import & export
This commit is contained in:
@@ -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) {
|
||||
|
@@ -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();
|
||||
}),
|
||||
];
|
||||
},
|
||||
),
|
||||
|
Reference in New Issue
Block a user