mirror of
https://github.com/wgh136/pixes.git
synced 2025-09-27 12:57:24 +00:00
improve download subpath
This commit is contained in:
@@ -106,7 +106,10 @@
|
|||||||
"Popular(Female)": "热门(女性向)",
|
"Popular(Female)": "热门(女性向)",
|
||||||
"Start Time": "开始时间",
|
"Start Time": "开始时间",
|
||||||
"End Time": "结束时间",
|
"End Time": "结束时间",
|
||||||
"Max parallels": "最大并行数"
|
"Max parallels": "最大并行数",
|
||||||
|
"Replace with 'AI' if the work was generated by AI, otherwise replace with blank": "替换为'AI'如果作品是由AI生成的, 否则替换为空白",
|
||||||
|
"Replace with * if the work have tag *, otherwise replace with blank.": "替换为*如果作品包含标签*, 否则替换为空白",
|
||||||
|
"Multiple path separators will be automatically replaced with a single": "多个路径分隔符将被自动替换为单个"
|
||||||
},
|
},
|
||||||
"zh_TW": {
|
"zh_TW": {
|
||||||
"Search": "搜索",
|
"Search": "搜索",
|
||||||
@@ -215,6 +218,9 @@
|
|||||||
"Popular(Female)": "熱門(女性)",
|
"Popular(Female)": "熱門(女性)",
|
||||||
"Start Time": "開始時間",
|
"Start Time": "開始時間",
|
||||||
"End Time": "結束時間",
|
"End Time": "結束時間",
|
||||||
"Max parallels": "最大並行數"
|
"Max parallels": "最大並行數",
|
||||||
|
"Replace with 'AI' if the work was generated by AI, otherwise replace with blank": "替換為'AI'如果作品是由AI生成的, 否則替換為空白",
|
||||||
|
"Replace with * if the work have tag *, otherwise replace with blank.": "替換為*如果作品包含標籤*, 否則替換為空白",
|
||||||
|
"Multiple path separators will be automatically replaced with a single": "多個路徑分隔符號將自動替換為單一"
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -16,8 +16,6 @@ class _Appdata {
|
|||||||
Map<String, dynamic> settings = {
|
Map<String, dynamic> settings = {
|
||||||
"downloadPath": null,
|
"downloadPath": null,
|
||||||
"downloadSubPath": r"/${id}-p${index}.${ext}",
|
"downloadSubPath": r"/${id}-p${index}.${ext}",
|
||||||
"tagsWeight": "風景 ロリ 巨乳 女の子",
|
|
||||||
"useTranslatedNameForDownload": true,
|
|
||||||
"maxParallels": 3,
|
"maxParallels": 3,
|
||||||
"proxy": "",
|
"proxy": "",
|
||||||
};
|
};
|
||||||
|
@@ -127,28 +127,37 @@ class DownloadingTask {
|
|||||||
static String _generateFilePath(Illust illust, int index, String ext) {
|
static String _generateFilePath(Illust illust, int index, String ext) {
|
||||||
final String downloadPath = appdata.settings["downloadPath"];
|
final String downloadPath = appdata.settings["downloadPath"];
|
||||||
String subPathPatten = appdata.settings["downloadSubPath"];
|
String subPathPatten = appdata.settings["downloadSubPath"];
|
||||||
final tagsWeight = (appdata.settings["tagsWeight"] as String).split(' ');
|
|
||||||
final originalTags = List<Tag>.from(illust.tags);
|
|
||||||
originalTags.sort((a, b){
|
|
||||||
var aWeight = tagsWeight.indexOf(a.name);
|
|
||||||
if(aWeight == -1) aWeight = tagsWeight.length;
|
|
||||||
var bWeight = tagsWeight.indexOf(b.name);
|
|
||||||
if(bWeight == -1) bWeight = tagsWeight.length;
|
|
||||||
return aWeight - bWeight;
|
|
||||||
});
|
|
||||||
final tags = appdata.settings["useTranslatedNameForDownload"] == false
|
|
||||||
? originalTags.map((e) => e.name).toList()
|
|
||||||
: originalTags.map((e) => e.translatedName ?? e.name).toList();
|
|
||||||
|
|
||||||
subPathPatten = subPathPatten.replaceAll(r"${id}", illust.id.toString());
|
subPathPatten = subPathPatten.replaceAll(r"${id}", illust.id.toString());
|
||||||
subPathPatten = subPathPatten.replaceAll(r"${title}", illust.title);
|
subPathPatten = subPathPatten.replaceAll(r"${title}", illust.title);
|
||||||
subPathPatten = subPathPatten.replaceAll(r"${author}", illust.author.name);
|
subPathPatten = subPathPatten.replaceAll(r"${author}", illust.author.name);
|
||||||
subPathPatten = subPathPatten.replaceAll(r"${index}", index.toString());
|
subPathPatten = subPathPatten.replaceAll(r"${index}", index.toString());
|
||||||
subPathPatten = subPathPatten.replaceAll(r"${ext}", ext);
|
subPathPatten = subPathPatten.replaceAll(r"${ext}", ext);
|
||||||
for(int i=0; i<tags.length; i++) {
|
subPathPatten = subPathPatten.replaceAll(r"${AI}", illust.isAi ? "AI" : "");
|
||||||
subPathPatten = subPathPatten.replaceAll("\${tag$i}", tags[i]);
|
List<String> extractTags(String input) {
|
||||||
|
final regex = RegExp(r'\$\{tag\((.*?)\)\}');
|
||||||
|
final matches = regex.allMatches(input);
|
||||||
|
return matches.map((match) => match.group(1)!).toList();
|
||||||
}
|
}
|
||||||
return "$downloadPath$subPathPatten";
|
var tags = extractTags(subPathPatten);
|
||||||
|
print(illust.tags);
|
||||||
|
for(var tag in tags) {
|
||||||
|
print(tag);
|
||||||
|
if (illust.tags.where((e) => e.name == tag || e.translatedName == tag).isNotEmpty) {
|
||||||
|
subPathPatten = subPathPatten.replaceAll("\${tag($tag)}", tag);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return _cleanFilePath("$downloadPath$subPathPatten");
|
||||||
|
}
|
||||||
|
|
||||||
|
static String _cleanFilePath(String filePath) {
|
||||||
|
const invalidChars = ['*', '?', '"', '<', '>', '|'];
|
||||||
|
|
||||||
|
String cleanedPath =
|
||||||
|
filePath.replaceAll(RegExp('[${invalidChars.join(' ')}]'), '');
|
||||||
|
|
||||||
|
cleanedPath = cleanedPath.replaceAll(RegExp(r'[/\\]+'), '/');
|
||||||
|
|
||||||
|
return cleanedPath;
|
||||||
}
|
}
|
||||||
|
|
||||||
void retry() {
|
void retry() {
|
||||||
|
@@ -282,8 +282,6 @@ class _SetDownloadSubPathPage extends StatefulWidget {
|
|||||||
class __SetDownloadSubPathPageState extends State<_SetDownloadSubPathPage> {
|
class __SetDownloadSubPathPageState extends State<_SetDownloadSubPathPage> {
|
||||||
final controller =
|
final controller =
|
||||||
TextEditingController(text: appdata.settings["downloadSubPath"]);
|
TextEditingController(text: appdata.settings["downloadSubPath"]);
|
||||||
final controller2 =
|
|
||||||
TextEditingController(text: appdata.settings["tagsWeight"]);
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
@@ -297,26 +295,6 @@ class __SetDownloadSubPathPageState extends State<_SetDownloadSubPathPage> {
|
|||||||
TextBox(
|
TextBox(
|
||||||
controller: controller,
|
controller: controller,
|
||||||
).paddingHorizontal(16),
|
).paddingHorizontal(16),
|
||||||
Text("Weights of the tags".tl)
|
|
||||||
.padding(const EdgeInsets.symmetric(vertical: 8, horizontal: 16)),
|
|
||||||
TextBox(
|
|
||||||
controller: controller2,
|
|
||||||
).paddingHorizontal(16),
|
|
||||||
const SizedBox(
|
|
||||||
height: 8,
|
|
||||||
),
|
|
||||||
ListTile(
|
|
||||||
title: Text("Use translated tag name".tl),
|
|
||||||
trailing: ToggleSwitch(
|
|
||||||
checked: appdata.settings["useTranslatedNameForDownload"],
|
|
||||||
onChanged: (value) {
|
|
||||||
setState(() {
|
|
||||||
appdata.settings["useTranslatedNameForDownload"] = value;
|
|
||||||
});
|
|
||||||
appdata.writeSettings();
|
|
||||||
},
|
|
||||||
),
|
|
||||||
),
|
|
||||||
const SizedBox(
|
const SizedBox(
|
||||||
height: 8,
|
height: 8,
|
||||||
),
|
),
|
||||||
@@ -326,7 +304,6 @@ class __SetDownloadSubPathPageState extends State<_SetDownloadSubPathPage> {
|
|||||||
var text = controller.text;
|
var text = controller.text;
|
||||||
if (check(text)) {
|
if (check(text)) {
|
||||||
appdata.settings["downloadSubPath"] = text;
|
appdata.settings["downloadSubPath"] = text;
|
||||||
appdata.settings["tagsWeight"] = controller2.text;
|
|
||||||
appdata.writeData();
|
appdata.writeData();
|
||||||
context.pop();
|
context.pop();
|
||||||
} else {
|
} else {
|
||||||
@@ -360,15 +337,9 @@ ${"Some keywords will be replaced by the following rule:".tl}
|
|||||||
\${id} -> ${"Artwork ID".tl}
|
\${id} -> ${"Artwork ID".tl}
|
||||||
\${index} -> ${"Index of the image in the artwork".tl}
|
\${index} -> ${"Index of the image in the artwork".tl}
|
||||||
\${ext} -> ${"File extension".tl}
|
\${ext} -> ${"File extension".tl}
|
||||||
|
\${AI} -> ${"Replace with 'AI' if the work was generated by AI, otherwise replace with blank".tl}
|
||||||
|
\${tag{*}} -> ${"Replace with * if the work have tag *, otherwise replace with blank.".tl}
|
||||||
|
|
||||||
${"Tags: Tags will be sorted by the \"Weights of tags\" setting and replaced by the following rule:".tl}
|
${"Multiple path separators will be automatically replaced with a single".tl}
|
||||||
${"The final text will be affected by the \"Use translated tag name\" setting.".tl}
|
|
||||||
\${tag0} -> ${"The first tag of the artwork".tl}
|
|
||||||
\${tag1} -> ${"The second tag of the artwork".tl}
|
|
||||||
...
|
|
||||||
|
|
||||||
${"Weights of the tags".tl}:
|
|
||||||
${"Filled with tags. The tags should be separated by a space. The tag in front has higher weight.".tl}
|
|
||||||
${"It is required to use the original name instead of the translated name.".tl}
|
|
||||||
""";
|
""";
|
||||||
}
|
}
|
||||||
|
@@ -29,6 +29,9 @@ extension FSExt on FileSystemEntity {
|
|||||||
extension DirectoryExt on Directory {
|
extension DirectoryExt on Directory {
|
||||||
bool havePermission() {
|
bool havePermission() {
|
||||||
if(!existsSync()) return false;
|
if(!existsSync()) return false;
|
||||||
|
if(App.isMacOS) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
try {
|
try {
|
||||||
listSync();
|
listSync();
|
||||||
return true;
|
return true;
|
||||||
|
Reference in New Issue
Block a user