mirror of
https://github.com/venera-app/venera.git
synced 2025-09-27 15:57:25 +00:00
import pica data
This commit is contained in:
@@ -1,11 +1,14 @@
|
||||
import 'dart:convert';
|
||||
import 'dart:isolate';
|
||||
|
||||
import 'package:sqlite3/sqlite3.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/favorites.dart';
|
||||
import 'package:venera/foundation/history.dart';
|
||||
import 'package:venera/foundation/log.dart';
|
||||
import 'package:venera/network/cookie_jar.dart';
|
||||
import 'package:zip_flutter/zip_flutter.dart';
|
||||
|
||||
@@ -43,61 +46,165 @@ Future<File> exportAppData() async {
|
||||
Future<void> importAppData(File file, [bool checkVersion = false]) async {
|
||||
var cacheDirPath = FilePath.join(App.cachePath, 'temp_data');
|
||||
var cacheDir = Directory(cacheDirPath);
|
||||
await Isolate.run(() {
|
||||
ZipFile.openAndExtract(file.path, cacheDirPath);
|
||||
});
|
||||
var historyFile = cacheDir.joinFile("history.db");
|
||||
var localFavoriteFile = cacheDir.joinFile("local_favorite.db");
|
||||
var appdataFile = cacheDir.joinFile("appdata.json");
|
||||
var cookieFile = cacheDir.joinFile("cookie.db");
|
||||
if (checkVersion && appdataFile.existsSync()) {
|
||||
var data = jsonDecode(await appdataFile.readAsString());
|
||||
var version = data["settings"]["dataVersion"];
|
||||
if (version is int && version <= appdata.settings["dataVersion"]) {
|
||||
return;
|
||||
}
|
||||
if (cacheDir.existsSync()) {
|
||||
cacheDir.deleteSync(recursive: true);
|
||||
}
|
||||
if (await historyFile.exists()) {
|
||||
HistoryManager().close();
|
||||
File(FilePath.join(App.dataPath, "history.db")).deleteIfExistsSync();
|
||||
historyFile.renameSync(FilePath.join(App.dataPath, "history.db"));
|
||||
HistoryManager().init();
|
||||
}
|
||||
if (await localFavoriteFile.exists()) {
|
||||
LocalFavoritesManager().close();
|
||||
File(FilePath.join(App.dataPath, "local_favorite.db")).deleteIfExistsSync();
|
||||
localFavoriteFile
|
||||
.renameSync(FilePath.join(App.dataPath, "local_favorite.db"));
|
||||
LocalFavoritesManager().init();
|
||||
}
|
||||
if (await appdataFile.exists()) {
|
||||
// proxy settings & authorization setting should be kept
|
||||
var proxySettings = appdata.settings["proxy"];
|
||||
var authSettings = appdata.settings["authorizationRequired"];
|
||||
File(FilePath.join(App.dataPath, "appdata.json")).deleteIfExistsSync();
|
||||
appdataFile.renameSync(FilePath.join(App.dataPath, "appdata.json"));
|
||||
await appdata.init();
|
||||
appdata.settings["proxy"] = proxySettings;
|
||||
appdata.settings["authorizationRequired"] = authSettings;
|
||||
appdata.saveData();
|
||||
}
|
||||
if (await cookieFile.exists()) {
|
||||
SingleInstanceCookieJar.instance?.dispose();
|
||||
File(FilePath.join(App.dataPath, "cookie.db")).deleteIfExistsSync();
|
||||
cookieFile.renameSync(FilePath.join(App.dataPath, "cookie.db"));
|
||||
SingleInstanceCookieJar.instance =
|
||||
SingleInstanceCookieJar(FilePath.join(App.dataPath, "cookie.db"))
|
||||
..init();
|
||||
}
|
||||
var comicSourceDir = FilePath.join(cacheDirPath, "comic_source");
|
||||
if (Directory(comicSourceDir).existsSync()) {
|
||||
for (var file in Directory(comicSourceDir).listSync()) {
|
||||
if (file is File) {
|
||||
var targetFile = FilePath.join(App.dataPath, "comic_source", file.name);
|
||||
File(targetFile).deleteIfExistsSync();
|
||||
await file.copy(targetFile);
|
||||
cacheDir.createSync();
|
||||
try {
|
||||
await Isolate.run(() {
|
||||
ZipFile.openAndExtract(file.path, cacheDirPath);
|
||||
});
|
||||
var historyFile = cacheDir.joinFile("history.db");
|
||||
var localFavoriteFile = cacheDir.joinFile("local_favorite.db");
|
||||
var appdataFile = cacheDir.joinFile("appdata.json");
|
||||
var cookieFile = cacheDir.joinFile("cookie.db");
|
||||
if (checkVersion && appdataFile.existsSync()) {
|
||||
var data = jsonDecode(await appdataFile.readAsString());
|
||||
var version = data["settings"]["dataVersion"];
|
||||
if (version is int && version <= appdata.settings["dataVersion"]) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
await ComicSource.reload();
|
||||
if (await historyFile.exists()) {
|
||||
HistoryManager().close();
|
||||
File(FilePath.join(App.dataPath, "history.db")).deleteIfExistsSync();
|
||||
historyFile.renameSync(FilePath.join(App.dataPath, "history.db"));
|
||||
HistoryManager().init();
|
||||
}
|
||||
if (await localFavoriteFile.exists()) {
|
||||
LocalFavoritesManager().close();
|
||||
File(FilePath.join(App.dataPath, "local_favorite.db"))
|
||||
.deleteIfExistsSync();
|
||||
localFavoriteFile
|
||||
.renameSync(FilePath.join(App.dataPath, "local_favorite.db"));
|
||||
LocalFavoritesManager().init();
|
||||
}
|
||||
if (await appdataFile.exists()) {
|
||||
// proxy settings & authorization setting should be kept
|
||||
var proxySettings = appdata.settings["proxy"];
|
||||
var authSettings = appdata.settings["authorizationRequired"];
|
||||
File(FilePath.join(App.dataPath, "appdata.json")).deleteIfExistsSync();
|
||||
appdataFile.renameSync(FilePath.join(App.dataPath, "appdata.json"));
|
||||
await appdata.init();
|
||||
appdata.settings["proxy"] = proxySettings;
|
||||
appdata.settings["authorizationRequired"] = authSettings;
|
||||
appdata.saveData();
|
||||
}
|
||||
if (await cookieFile.exists()) {
|
||||
SingleInstanceCookieJar.instance?.dispose();
|
||||
File(FilePath.join(App.dataPath, "cookie.db")).deleteIfExistsSync();
|
||||
cookieFile.renameSync(FilePath.join(App.dataPath, "cookie.db"));
|
||||
SingleInstanceCookieJar.instance =
|
||||
SingleInstanceCookieJar(FilePath.join(App.dataPath, "cookie.db"))
|
||||
..init();
|
||||
}
|
||||
var comicSourceDir = FilePath.join(cacheDirPath, "comic_source");
|
||||
if (Directory(comicSourceDir).existsSync()) {
|
||||
for (var file in Directory(comicSourceDir).listSync()) {
|
||||
if (file is File) {
|
||||
var targetFile =
|
||||
FilePath.join(App.dataPath, "comic_source", file.name);
|
||||
File(targetFile).deleteIfExistsSync();
|
||||
await file.copy(targetFile);
|
||||
}
|
||||
}
|
||||
await ComicSource.reload();
|
||||
}
|
||||
} finally {
|
||||
cacheDir.deleteIgnoreError(recursive: true);
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> importPicaData(File file) async {
|
||||
var cacheDirPath = FilePath.join(App.cachePath, 'temp_data');
|
||||
var cacheDir = Directory(cacheDirPath);
|
||||
if (cacheDir.existsSync()) {
|
||||
cacheDir.deleteSync(recursive: true);
|
||||
}
|
||||
cacheDir.createSync();
|
||||
try {
|
||||
await Isolate.run(() {
|
||||
ZipFile.openAndExtract(file.path, cacheDirPath);
|
||||
});
|
||||
var localFavoriteFile = cacheDir.joinFile("local_favorite.db");
|
||||
if (localFavoriteFile.existsSync()) {
|
||||
var db = sqlite3.open(localFavoriteFile.path);
|
||||
try {
|
||||
var folderNames = db
|
||||
.select("SELECT name FROM sqlite_master WHERE type='table';")
|
||||
.map((e) => e["name"] as String)
|
||||
.toList();
|
||||
folderNames.removeWhere((e) => e == "folder_order" || e == "folder_sync");
|
||||
for (var folderName in folderNames) {
|
||||
if (!LocalFavoritesManager().existsFolder(folderName)) {
|
||||
LocalFavoritesManager().createFolder(folderName);
|
||||
}
|
||||
for (var comic in db.select("SELECT * FROM \"$folderName\";")) {
|
||||
LocalFavoritesManager().addComic(
|
||||
folderName,
|
||||
FavoriteItem(
|
||||
id: comic['target'],
|
||||
name: comic['name'],
|
||||
coverPath: comic['cover_path'],
|
||||
author: comic['author'],
|
||||
type: ComicType(switch(comic['type']) {
|
||||
0 => 'picacg'.hashCode,
|
||||
1 => 'ehentai'.hashCode,
|
||||
2 => 'jm'.hashCode,
|
||||
3 => 'hitomi'.hashCode,
|
||||
4 => 'wnacg'.hashCode,
|
||||
6 => 'nhentai'.hashCode,
|
||||
_ => comic['type']
|
||||
}),
|
||||
tags: comic['tags'].split(','),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch(e) {
|
||||
Log.error("Import Data", "Failed to import local favorite: $e");
|
||||
}
|
||||
finally {
|
||||
db.dispose();
|
||||
}
|
||||
}
|
||||
var historyFile = cacheDir.joinFile("history.db");
|
||||
if (historyFile.existsSync()) {
|
||||
var db = sqlite3.open(historyFile.path);
|
||||
try {
|
||||
for (var comic in db.select("SELECT * FROM history;")) {
|
||||
HistoryManager().addHistory(
|
||||
History.fromMap({
|
||||
"type": switch(comic['type']) {
|
||||
0 => 'picacg'.hashCode,
|
||||
1 => 'ehentai'.hashCode,
|
||||
2 => 'jm'.hashCode,
|
||||
3 => 'hitomi'.hashCode,
|
||||
4 => 'wnacg'.hashCode,
|
||||
6 => 'nhentai'.hashCode,
|
||||
_ => comic['type']
|
||||
},
|
||||
"id": comic['target'],
|
||||
"maxPage": comic["max_page"],
|
||||
"ep": comic["ep"],
|
||||
"page": comic["page"],
|
||||
"time": comic["time"],
|
||||
"title": comic["title"],
|
||||
"subtitle": comic["subtitle"],
|
||||
"cover": comic["cover"],
|
||||
}),
|
||||
);
|
||||
}
|
||||
}
|
||||
catch(e) {
|
||||
Log.error("Import Data", "Failed to import history: $e");
|
||||
}
|
||||
finally {
|
||||
db.dispose();
|
||||
}
|
||||
}
|
||||
} finally {
|
||||
cacheDir.deleteIgnoreError(recursive: true);
|
||||
}
|
||||
}
|
||||
|
@@ -265,7 +265,9 @@ Future<FileSelectResult?> selectFile({required List<String> ext}) async {
|
||||
file = FileSelectResult(xFile.path);
|
||||
}
|
||||
if (!ext.contains(file.path.split(".").last)) {
|
||||
App.rootContext.showMessage(message: "Invalid file type");
|
||||
App.rootContext.showMessage(
|
||||
message: "Invalid file type: ${file.path.split(".").last}",
|
||||
);
|
||||
return null;
|
||||
}
|
||||
return file;
|
||||
|
Reference in New Issue
Block a user