From b1a9a726cecbbbd1119b4f07dad8ecac6ebe8aa1 Mon Sep 17 00:00:00 2001 From: niuhuan Date: Fri, 25 Feb 2022 18:46:11 +0800 Subject: [PATCH] rename exports --- go/go.mod | 3 +- go/go.sum | 16 +------- go/pikapika/export.go | 40 +++++++++++++++++--- go/pikapika/utils/file.go | 12 ++++++ lib/basic/Cross.dart | 3 +- lib/basic/Method.dart | 10 ++++- lib/basic/config/ExportRename.dart | 41 +++++++++++++++++++++ lib/screens/DownloadExportToFileScreen.dart | 29 +++++++++++++++ lib/screens/InitScreen.dart | 2 + lib/screens/SettingsScreen.dart | 2 + 10 files changed, 135 insertions(+), 23 deletions(-) create mode 100644 lib/basic/config/ExportRename.dart diff --git a/go/go.mod b/go/go.mod index 6cd5adb..4853147 100644 --- a/go/go.mod +++ b/go/go.mod @@ -13,8 +13,9 @@ require ( github.com/pkg/errors v0.9.1 golang.org/x/image v0.0.0-20190802002840-cff245a6509b golang.org/x/mobile v0.0.0-20220224134551-8a0a1e50732f // indirect + golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f // indirect golang.org/x/sys v0.0.0-20220224120231-95c6836cb0e7 // indirect - golang.org/x/tools v0.1.9 // indirect + golang.org/x/text v0.3.7 // indirect gorm.io/driver/sqlite v1.1.4 gorm.io/gorm v1.21.12 ) diff --git a/go/go.sum b/go/go.sum index 241ad60..c196d0b 100644 --- a/go/go.sum +++ b/go/go.sum @@ -38,14 +38,11 @@ github.com/mattn/go-sqlite3 v1.14.5 h1:1IdxlwTNazvbKJQSxoJ5/9ECbEeaTTyeU7sEAZ5KK github.com/mattn/go-sqlite3 v1.14.5/go.mod h1:WVKg1VTActs4Qso6iwGbiFih2UIHo0ENGwNd0Lj+XmI= github.com/miguelpruivo/flutter_file_picker/go v0.0.0-20210622152105-9f0a811028a0 h1:hXl9AMW20Php3xWlWZr2Acw50tqeblLgtLfLoRCACmA= github.com/miguelpruivo/flutter_file_picker/go v0.0.0-20210622152105-9f0a811028a0/go.mod h1:csuW+TFyYKtiUwNvcvhcpyX4quPI7Pvv0SUogdqCW4I= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/niuhuan/pica-go v0.0.0-20220223122613-0d7d95a9c728 h1:zcO9WFgYbQ3g9U1nbJ6PCelzGB/BaPsCW9jwNry2JXM= -github.com/niuhuan/pica-go v0.0.0-20220223122613-0d7d95a9c728/go.mod h1:r76zBgH9AYkv0ptyEVoPUIdt33sT0Ts7xgcg742OZtw= github.com/niuhuan/pica-go v0.0.0-20220224154849-76bf750f8c4d h1:f3V6V1Y+5j/AvhsIGA6aQ/K2Ez1AeYbuCG9uI4fGC6M= github.com/niuhuan/pica-go v0.0.0-20220224154849-76bf750f8c4d/go.mod h1:r76zBgH9AYkv0ptyEVoPUIdt33sT0Ts7xgcg742OZtw= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -63,7 +60,6 @@ github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81P github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -77,15 +73,13 @@ golang.org/x/mobile v0.0.0-20220224134551-8a0a1e50732f/go.mod h1:pe2sM7Uk+2Su1y7 golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.5.1 h1:OJxoQ/rynoF0dcCdI7cLPktw/hR2cueqYfjm43oqK38= -golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20210614182718-04defd469f4e h1:XpT3nA5TvE525Ne3hInMh6+GETgn27Zfm9dxsThnX2Q= golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f h1:OfiFi4JbukWwe3lzw+xunroH1mnC1e2Gy5cxNJApiSY= golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -94,19 +88,15 @@ golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200802091954-4b90ce9b60b3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007 h1:gG67DSER+11cZvqIMb8S8bt0vZtiN6xWYARwirrOSfE= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e h1:WUoyKPm6nCo1BnNUvPGnFG3T5DUVem42yDJZZ4CNxMA= golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220224120231-95c6836cb0e7 h1:BXxu8t6QN0G1uff4bzZzSkpsax8+ALqTGUtz08QrV00= golang.org/x/sys v0.0.0-20220224120231-95c6836cb0e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= @@ -114,8 +104,6 @@ golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3 golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.8-0.20211022200916-316ba0b74098 h1:YuekqPskqwCCPM79F1X5Dhv4ezTCj+Ki1oNwiafxkA0= golang.org/x/tools v0.1.8-0.20211022200916-316ba0b74098/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= -golang.org/x/tools v0.1.9 h1:j9KsMiaP1c3B0OTQGth0/k+miLGTgLsAFUCrF2vLcF8= -golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= diff --git a/go/pikapika/export.go b/go/pikapika/export.go index 157cd2a..231d632 100644 --- a/go/pikapika/export.go +++ b/go/pikapika/export.go @@ -13,7 +13,8 @@ import ( "os" "path" "pikapika/pikapika/database/comic_center" - utils2 "pikapika/pikapika/utils" + "pikapika/pikapika/utils" + "strings" "time" ) @@ -73,6 +74,7 @@ func exportComicDownload(params string) (filePath string, err error) { var paramsStruct struct { ComicId string `json:"comicId"` Dir string `json:"dir"` + Name string `json:"name"` } json.Unmarshal([]byte(params), ¶msStruct) comicId := paramsStruct.ComicId @@ -90,7 +92,21 @@ func exportComicDownload(params string) (filePath string, err error) { err = errors.New("not download finish") return } - filePath = path.Join(dir, fmt.Sprintf("%s-%s.zip", utils2.ReasonableFileName(comic.Title), time.Now().Format("2006_01_02_15_04_05.999"))) + name := strings.TrimSpace(paramsStruct.Name) + if len(name) > 0 { + name = utils.ReasonableFileName(name) + ".zip" + } else { + name = fmt.Sprintf("%s-%s.zip", utils.ReasonableFileName(comic.Title), time.Now().Format("2006_01_02_15_04_05.999")) + } + filePath = path.Join(dir, name) + ex, err := utils.Exists(filePath) + if err != nil { + return "", err + } + if ex { + err = errors.New("exists") + return + } println(fmt.Sprintf("ZIP : %s", filePath)) fileStream, err := os.Create(filePath) if err != nil { @@ -357,6 +373,7 @@ func exportComicDownloadToJPG(params string) error { var paramsStruct struct { ComicId string `json:"comicId"` Dir string `json:"dir"` + Name string `json:"name"` } json.Unmarshal([]byte(params), ¶msStruct) comicId := paramsStruct.ComicId @@ -372,13 +389,26 @@ func exportComicDownloadToJPG(params string) error { if !comic.DownloadFinished { return errors.New("not download finish") } - dirPath := path.Join(dir, fmt.Sprintf("%s-%s", utils2.ReasonableFileName(comic.Title), time.Now().Format("2006_01_02_15_04_05.999"))) + name := strings.TrimSpace(paramsStruct.Name) + if len(name) > 0 { + name = utils.ReasonableFileName(name) + } else { + name = fmt.Sprintf("%s-%s", utils.ReasonableFileName(comic.Title), time.Now().Format("2006_01_02_15_04_05.999")) + } + dirPath := path.Join(dir, name) println(fmt.Sprintf("DIR : %s", dirPath)) - err = os.Mkdir(dirPath, utils2.CreateDirMode) + ex, err := utils.Exists(dirPath) if err != nil { return err } - err = os.Mkdir(path.Join(dirPath, "pictures"), utils2.CreateDirMode) + if ex { + return errors.New("exists") + } + err = os.Mkdir(dirPath, utils.CreateDirMode) + if err != nil { + return err + } + err = os.Mkdir(path.Join(dirPath, "pictures"), utils.CreateDirMode) if err != nil { return err } diff --git a/go/pikapika/utils/file.go b/go/pikapika/utils/file.go index cb6a4e3..0ba204c 100644 --- a/go/pikapika/utils/file.go +++ b/go/pikapika/utils/file.go @@ -1,6 +1,7 @@ package utils import ( + "errors" "os" "strings" ) @@ -28,3 +29,14 @@ func ReasonableFileName(title string) string { title = strings.ReplaceAll(title, "|", "_") return title } + +func Exists(name string) (bool, error) { + _, err := os.Stat(name) + if err == nil { + return true, nil + } + if errors.Is(err, os.ErrNotExist) { + return false, nil + } + return false, err +} \ No newline at end of file diff --git a/lib/basic/Cross.dart b/lib/basic/Cross.dart index ca955bf..47b0183 100644 --- a/lib/basic/Cross.dart +++ b/lib/basic/Cross.dart @@ -1,12 +1,13 @@ /// 与平台交互的操作 - import 'dart:io'; + import 'package:clipboard/clipboard.dart'; import 'package:filesystem_picker/filesystem_picker.dart'; import 'package:flutter/material.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:pikapika/basic/Common.dart'; import 'package:url_launcher/url_launcher.dart'; + import 'Method.dart'; import 'config/ChooserRoot.dart'; diff --git a/lib/basic/Method.dart b/lib/basic/Method.dart index a79e542..9b2b872 100644 --- a/lib/basic/Method.dart +++ b/lib/basic/Method.dart @@ -539,18 +539,24 @@ class Method { } /// 导出下载的漫画到zip - Future exportComicDownload(String comicId, String dir) { + Future exportComicDownload(String comicId, String dir, String name) { return _flatInvoke("exportComicDownload", { "comicId": comicId, "dir": dir, + "name": name, }); } /// 导出下载的图片到HTML+JPG - Future exportComicDownloadToJPG(String comicId, String dir) { + Future exportComicDownloadToJPG( + String comicId, + String dir, + String name, + ) { return _flatInvoke("exportComicDownloadToJPG", { "comicId": comicId, "dir": dir, + "name": name, }); } diff --git a/lib/basic/config/ExportRename.dart b/lib/basic/config/ExportRename.dart new file mode 100644 index 0000000..c025f76 --- /dev/null +++ b/lib/basic/config/ExportRename.dart @@ -0,0 +1,41 @@ +/// 自动全屏 +import 'package:flutter/material.dart'; + +import '../Common.dart'; +import '../Method.dart'; + +const _propertyName = "exportRename"; +late bool _exportRename; + +Future initExportRename() async { + _exportRename = (await method.loadProperty(_propertyName, "false")) == "true"; +} + +bool currentExportRename() { + return _exportRename; +} + +Future _chooseExportRename(BuildContext context) async { + String? result = + await chooseListDialog(context, "导出时进行重命名", ["是", "否"]); + if (result != null) { + var target = result == "是"; + await method.saveProperty(_propertyName, "$target"); + _exportRename = target; + } +} + +Widget exportRenameSetting() { + return StatefulBuilder( + builder: (BuildContext context, void Function(void Function()) setState) { + return ListTile( + title: Text("导出时进行重命名"), + subtitle: Text(_exportRename ? "是" : "否"), + onTap: () async { + await _chooseExportRename(context); + setState(() {}); + }, + ); + }, + ); +} diff --git a/lib/screens/DownloadExportToFileScreen.dart b/lib/screens/DownloadExportToFileScreen.dart index e33be83..1e624db 100644 --- a/lib/screens/DownloadExportToFileScreen.dart +++ b/lib/screens/DownloadExportToFileScreen.dart @@ -8,6 +8,7 @@ import 'package:pikapika/basic/Common.dart'; import 'package:pikapika/basic/Cross.dart'; import 'package:pikapika/basic/Entities.dart'; import 'package:pikapika/basic/Method.dart'; +import 'package:pikapika/basic/config/ExportRename.dart'; import 'package:pikapika/screens/DownloadExportToSocketScreen.dart'; import 'components/ContentError.dart'; @@ -133,6 +134,19 @@ class _DownloadExportToFileScreenState defaultToast(context, "$e"); return; } + var name = ""; + if (currentExportRename()) { + var rename = await inputString( + context, + "请输入保存后的名称", + defaultValue: _task.title, + ); + if (rename != null && rename.isNotEmpty) { + name = rename; + } else { + return; + } + } print("path $path"); if (path != null) { try { @@ -142,6 +156,7 @@ class _DownloadExportToFileScreenState await method.exportComicDownloadToJPG( widget.comicId, path, + name, ); setState(() { exportResult = "导出成功"; @@ -169,6 +184,19 @@ class _DownloadExportToFileScreenState defaultToast(context, "$e"); return; } + var name = ""; + if (currentExportRename()) { + var rename = await inputString( + context, + "请输入保存后的名称", + defaultValue: _task.title, + ); + if (rename != null && rename.isNotEmpty) { + name = rename; + } else { + return; + } + } print("path $path"); if (path != null) { try { @@ -178,6 +206,7 @@ class _DownloadExportToFileScreenState await method.exportComicDownload( widget.comicId, path, + name, ); setState(() { exportResult = "导出成功"; diff --git a/lib/screens/InitScreen.dart b/lib/screens/InitScreen.dart index 1f125e1..830d160 100644 --- a/lib/screens/InitScreen.dart +++ b/lib/screens/InitScreen.dart @@ -30,6 +30,7 @@ import 'package:pikapika/basic/config/Version.dart'; import 'package:pikapika/basic/config/VolumeController.dart'; import 'package:pikapika/basic/config/shadowCategoriesMode.dart'; +import '../basic/config/ExportRename.dart'; import 'AccountScreen.dart'; import 'AppScreen.dart'; @@ -78,6 +79,7 @@ class _InitScreenState extends State { await initDownloadThreadCount(); await initConvertToPNG(); await initNoAnimation(); + await initExportRename(); await initVersion(); autoCheckNewVersion(); // 登录, 如果token失效重新登录, 网络不好的时候可能需要1分钟 diff --git a/lib/screens/SettingsScreen.dart b/lib/screens/SettingsScreen.dart index e8d05db..79edd73 100644 --- a/lib/screens/SettingsScreen.dart +++ b/lib/screens/SettingsScreen.dart @@ -11,6 +11,7 @@ import 'package:pikapika/basic/config/ContentFailedReloadAction.dart'; import 'package:pikapika/basic/config/ConvertToPNG.dart'; import 'package:pikapika/basic/config/DownloadAndExportPath.dart'; import 'package:pikapika/basic/config/DownloadThreadCount.dart'; +import 'package:pikapika/basic/config/ExportRename.dart'; import 'package:pikapika/basic/config/FullScreenAction.dart'; import 'package:pikapika/basic/config/FullScreenUI.dart'; import 'package:pikapika/basic/config/KeyboardController.dart'; @@ -87,6 +88,7 @@ class SettingsScreen extends StatelessWidget { chooserRootSetting(), downloadThreadCountSetting(), downloadAndExportPathSetting(), + exportRenameSetting(), fontSetting(), Divider(), migrate(context),