新的下载宏 (#557)

This commit is contained in:
Poker 2024-12-23 13:11:49 +08:00
parent 99349c482d
commit 28c6617512
No known key found for this signature in database
GPG Key ID: C65A6AD457D5C8F8
18 changed files with 83 additions and 66 deletions

View File

@ -71,7 +71,7 @@ public partial record AppSettings() : IWindowSettings
public MainPageTabItem DefaultSelectedTabItem { get; set; }
[SettingsEntry(Symbol.Rename, nameof(DownloadPathMacroEntryHeader), nameof(DownloadPathMacroEntryDescription))]
public string DownloadPathMacro { get; set; } = GetSpecialFolder() + @"\@{if_manga=[@{artist_name}] @{title}}\[@{artist_name}] @{id}@{if_manga=p@{manga_index}}@{ext}";
public string DownloadPathMacro { get; set; } = GetSpecialFolder() + @"\@{if_pic_set=[@{artist_name}] @{title}}\[@{artist_name}] @{id}@{if_pic_set=p@{pic_set_index}}@{ext}";
public UgoiraDownloadFormat UgoiraDownloadFormat { get; set; } = UgoiraDownloadFormat.WebPLossless;

View File

@ -166,7 +166,7 @@ public sealed partial class DownloadMacroSettingsExpander
// ITransducer
ITransducer when isNot => MacroParserResources.NegationNotAllowedFormatted.Format(name),
ITransducer when optionalParams is not null => MacroParserResources.NonParameterizedMacroBearingParameterFormatted.Format(name),
MangaIndexMacro m when !(context.TryGetValue(IsMangaMacro.NameConst, out var v) && v) => MacroParserResources.MacroShouldBeContainedFormatted.Format(m.Name, IsMangaMacro.NameConst),
PicSetIndexMacro m when !(context.TryGetValue(IsPicSetMacro.NameConst, out var v) && v) => MacroParserResources.MacroShouldBeContainedFormatted.Format(m.Name, IsPicSetMacro.NameConst),
ILastSegment l => (null as string).Apply(_ => lastSegmentContexts.Add((l.Name, context))),
ITransducer => null,
// IPredicate

View File

@ -1,15 +0,0 @@
```
Available Macros:
Illustration:
illust_ext: file extension
illust_title: illustration title
illust_id: illustration id
artist_name: illustrator name
artist_id: illustrator id
if_spot: is spotlight
if_manga: is manga
if_gif: is ugoira
manga_index: the index of the current illustration in its manga set
spot_id: spotlight id, if is_spot yields true; MacroParserResources.UnknownSpotlightId, if false.
spot_title: spotlight title, if is_spot yields true; MacroParserResources.UnknownSpotlightTitle, if false.
```

View File

@ -26,11 +26,11 @@ using Pixeval.Download.MacroParser;
namespace Pixeval.Download.Macros;
[MetaPathMacro<IWorkViewModel>]
public class IsIllustrationMacro : IPredicate<IWorkViewModel>
public class IsPicAllMacro : IPredicate<IWorkViewModel>
{
public bool IsNot { get; set; }
public string Name => "if_illust";
public string Name => "if_pic_all";
public bool Match(IWorkViewModel context) => context is IllustrationItemViewModel;
}

View File

@ -24,11 +24,11 @@ using Pixeval.Download.MacroParser;
namespace Pixeval.Download.Macros;
[MetaPathMacro<IWorkViewModel>]
public class IsUgoiraMacro : IPredicate<IWorkViewModel>
public class IsPicGifMacro : IPredicate<IWorkViewModel>
{
public bool IsNot { get; set; }
public string Name => "if_gif";
public string Name => "if_pic_gif";
public bool Match(IWorkViewModel context)
{

View File

@ -0,0 +1,39 @@
#region Copyright (c) Pixeval/Pixeval
// GPL v3 License
//
// Pixeval/Pixeval
// Copyright (c) 2023 Pixeval/IsMangaMacro.cs
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#endregion
using Pixeval.Controls;
using Pixeval.Download.MacroParser;
namespace Pixeval.Download.Macros;
[MetaPathMacro<IWorkViewModel>]
public class IsPicOneMacro : IPredicate<IWorkViewModel>
{
public bool IsNot { get; set; }
public const string NameConst = "if_pic_one";
public string Name => NameConst;
public bool Match(IWorkViewModel context)
{
return context is IllustrationItemViewModel { IsManga: false, IsUgoira: false };
}
}

View File

@ -24,11 +24,11 @@ using Pixeval.Download.MacroParser;
namespace Pixeval.Download.Macros;
[MetaPathMacro<IWorkViewModel>]
public class IsMangaMacro : IPredicate<IWorkViewModel>
public class IsPicSetMacro : IPredicate<IWorkViewModel>
{
public bool IsNot { get; set; }
public const string NameConst = "if_manga";
public const string NameConst = "if_pic_set";
public string Name => NameConst;

View File

@ -24,9 +24,9 @@ using Pixeval.Download.MacroParser;
namespace Pixeval.Download.Macros;
[MetaPathMacro<IWorkViewModel>]
public class MangaIndexMacro : ITransducer<IWorkViewModel>, ILastSegment
public class PicSetIndexMacro : ITransducer<IWorkViewModel>, ILastSegment
{
public const string NameConst = "manga_index";
public const string NameConst = "pic_set_index";
public const string NameConstToken = $"<{NameConst}>";

View File

@ -62,7 +62,7 @@ public partial class MangaDownloadTaskGroup : DownloadTaskGroup, IImageDownloadT
var mangaOriginalUrls = Entry.MangaOriginalUrls;
for (var i = 0; i < mangaOriginalUrls.Count; ++i)
{
var imageDownloadTask = new ImageDownloadTask(new(mangaOriginalUrls[i]), IoHelper.ReplaceTokenExtensionFromUrl(TokenizedDestination, mangaOriginalUrls[i]).Replace(MangaIndexMacro.NameConstToken, i.ToString()), DatabaseEntry.State)
var imageDownloadTask = new ImageDownloadTask(new(mangaOriginalUrls[i]), IoHelper.ReplaceTokenExtensionFromUrl(TokenizedDestination, mangaOriginalUrls[i]).Replace(PicSetIndexMacro.NameConstToken, i.ToString()), DatabaseEntry.State)
{
Stream = streams?[i]
};

View File

@ -28,11 +28,12 @@ public partial class DownloadMacroAppSettingsEntry(
["if_r18"] = SettingsPageResources.IfR18MacroTooltip,
["if_r18g"] = SettingsPageResources.IfR18GMacroTooltip,
["if_ai"] = SettingsPageResources.IfAiMacroTooltip,
["if_illust"] = SettingsPageResources.IfIllustMacroTooltip,
["if_novel"] = SettingsPageResources.IfNovelMacroTooltip,
["if_manga"] = SettingsPageResources.IfMangaMacroTooltip,
["if_gif"] = SettingsPageResources.IfGifMacroTooltip,
["manga_index"] = SettingsPageResources.MangaIndexMacroTooltip
["if_pic_one"] = SettingsPageResources.IfPicOneMacroTooltip,
["if_pic_set"] = SettingsPageResources.IfPicSetMacroTooltip,
["if_pic_gif"] = SettingsPageResources.IfPicGifMacroTooltip,
["if_pic_all"] = SettingsPageResources.IfPicAllMacroTooltip,
["pic_set_index"] = SettingsPageResources.PicSetIndexMacroTooltip
}.ToImmutableDictionary();
public static ICollection<StringRepresentableItem> AvailableMacros { get; } = MetaPathMacroAttributeHelper.GetIWorkViewModelInstances()

View File

@ -4,13 +4,13 @@ Each Path Macro is in form of `@{name}`. In case of providing parameters, it sho
While downloading illustrations, these macros will be substituted by corresponding texts, e.g., `@{id}` will be replaced by the id of artwork.
If a macro provides a parameter, then it is a conditional macro, which will be substituted if a certain condition holds.
For example, while downloading a manga, `@{if_manga=\MANGA\}` will be substituted by `\MANGA\`.
For example, while downloading a manga, `@{if_pic_set=\MANGA\}` will be substituted by `\MANGA\`.
By the way, conditional macros can be nested, like `@{if_manga=...@{if_r18=...}...}`.
Negations could also be used, like `@{!if_manga=...}` which filters out mangas.
By the way, conditional macros can be nested, like `@{if_pic_set=...@{if_r18=...}...}`.
Negations could also be used, like `@{!if_pic_set=...}` which filters out mangas.
Some macros should satisfy special constraints:
- `@{manga_index}` must be used in conditional macro `@{if_manga=...}`.
- `@{manga_index}` and `@{ext}` must be used in file names.
- `@{pic_set_index}` must be used in conditional macro `@{if_pic_set=...}`.
- `@{pic_set_index}` and `@{ext}` must be used in file names.
You can move your cursor on a button to see how the corresponding macro works.

View File

@ -191,12 +191,9 @@
"PublishYearMacroTooltip": "Year of publication",
"PublishMonthMacroTooltip": "Month of publication",
"PublishDayMacroTooltip": "Day of publication",
"IfMangaMacroTooltip": "This marco will be replaced by its argument if it\u0027s a manga",
"IfR18MacroTooltip": "This marco will be replaced by its argument in the case of restricted work (R18 or R18G)",
"IfR18GMacroTooltip": "This marco will be replaced by its argument if it is a R18G work",
"IfAiMacroTooltip": "This marco will be replaced by its argument in the case of AI-generated work",
"IfIllustMacroTooltip": "This marco will be replaced by its argument if it\u0027s an illustration",
"IfNovelMacroTooltip": "This marco will be replaced by its argument if it\u0027s a novel",
"IfGifMacroTooltip": "This marco will be replaced by its argument if it\u0027s an animated image",
"MangaIndexMacroTooltip": "This marco will be replaced by the index of the current image in the manga. This macro MUST be used with the @{if_manga=} macro, and MUST be used on the file name"
"PicSetIndexMacroTooltip": "This marco will be replaced by the index of the current image in the manga. This macro MUST be used with the @{if_pic_set=} macro, and MUST be used on the file name"
}

View File

@ -4,13 +4,13 @@ Chaque Path Macro est sous forme de `@{name}`. S'il est avec des paramètres, il
Lors qu'un téléchargement démarre, ces macros vont être remplacés par des texts correspondants. Par exemple, `@{id}` sera remplacé par l'ID d'illustration à télécharger.
Si un macro est avec un paramètre, alors ce macro est un macro conditionnnel. Ce macro sera remplacé par son argument si sa condition s'évalue à vraie.
Par exemple, lors d'un téléchargement de manga, `@{if_manga=\MANGA\}` sera remplacé par `\MANGA\`.
Par exemple, lors d'un téléchargement de manga, `@{if_pic_set=\MANGA\}` sera remplacé par `\MANGA\`.
Par ailleurs, les macros conditionnels peuvent être imbriqués, comme par exemple: `@{if_manga=...@{if_r18=...}...}` .
Des négations peuvent également être utilisées comme `@{!if_manga=...}` pour enlever les mangas.
Par ailleurs, les macros conditionnels peuvent être imbriqués, comme par exemple: `@{if_pic_set=...@{if_r18=...}...}` .
Des négations peuvent également être utilisées comme `@{!if_pic_set=...}` pour enlever les mangas.
Certains macros ont pourtant des contraints à respecter:
- `@{manga_index}` doit uniquement être utilsé dans les macros de type `@{if_manga=...}`.
- `@{manga_index}` et `@{ext}` doivent être utilisés dans les noms des fichiers.
- `@{pic_set_index}` doit uniquement être utilsé dans les macros de type `@{if_pic_set=...}`.
- `@{pic_set_index}` et `@{ext}` doivent être utilisés dans les noms des fichiers.
Placer votre souris sur un bouton pour voir l'usage de macro correspondant.

View File

@ -191,12 +191,9 @@
"PublishYearMacroTooltip": "L\u0027année de publication",
"PublishMonthMacroTooltip": "Le mois de publication",
"PublishDayMacroTooltip": "Le jour de publication",
"IfMangaMacroTooltip": "Ce marco sera remplacé par son argument s\u0027il s\u0027agit d\u0027un manga",
"IfR18MacroTooltip": "Ce marco sera remplacé par son argument s\u0027il s\u0027agit d\u0027un art restreint (R18 ou R18G)",
"IfR18GMacroTooltip": "Ce marco sera remplacé par son argument s\u0027il s\u0027agit d\u0027un art R18G",
"IfAiMacroTooltip": "Ce marco sera remplacé par son argument s\u0027il s\u0027agit d\u0027un art généré par l\u0027IA",
"IfIllustMacroTooltip": "Ce marco sera remplacé par son argument s\u0027il s\u0027agit d\u0027une illustration",
"IfNovelMacroTooltip": "Ce marco sera remplacé par son argument s\u0027il s\u0027agit d\u0027un roman",
"IfGifMacroTooltip": "Ce marco sera remplacé par son argument s\u0027il s\u0027agit d\u0027une image animée",
"MangaIndexMacroTooltip": "Ce macro sera remplacé par l\u0027indice de l\u0027illustration courante dans la collection (n-ième illust.). Il faut l\u0027utiliser avec le macro \u0027@{if_manga=} et sur les noms de fichier"
"PicSetIndexMacroTooltip": "Ce macro sera remplacé par l\u0027indice de l\u0027illustration courante dans la collection (n-ième illust.). Il faut l\u0027utiliser avec le macro \u0027@{if_pic_set=} et sur les noms de fichier"
}

View File

@ -4,13 +4,13 @@ Pixeval предлагает макросы путей для более точ
При загрузке изображений эти макросы будут заменены соответствующим текстом. Например, макрос `@{id}` будет автоматически заменен на ID произведения при загрузке.
Если макрос имеет параметры, это означает, что это условный макрос, который будет заменен на содержимое его параметров, когда условия выполняются.
Например, при загрузке манги макрос `@{if_manga=\манга\}` будет заменен на `\манга\`.
Например, при загрузке манги макрос `@{if_pic_set=\манга\}` будет заменен на `\манга\`.
Кроме того, условные макросы могут быть вложенными, например `@{if_manga=...@{if_r18=...}...}`.
Условные макросы также могут использоваться в отрицательной форме, например `@{!if_manga=...}` означает "не манга".
Кроме того, условные макросы могут быть вложенными, например `@{if_pic_set=...@{if_r18=...}...}`.
Условные макросы также могут использоваться в отрицательной форме, например `@{!if_pic_set=...}` означает "не манга".
Некоторые макросы имеют особые ограничения:
- `@{manga_index}` должен использоваться внутри условного макроса `@{if_manga=...}`.
- `@{manga_index}` и `@{ext}` должны использоваться в имени файла.
- `@{pic_set_index}` должен использоваться внутри условного макроса `@{if_pic_set=...}`.
- `@{pic_set_index}` и `@{ext}` должны использоваться в имени файла.
Чтобы увидеть назначение каждого макроса, наведите курсор на соответствующую кнопку макроса.

View File

@ -191,12 +191,9 @@
"PublishYearMacroTooltip": "Год публикации произведения",
"PublishMonthMacroTooltip": "Месяц публикации произведения",
"PublishDayMacroTooltip": "День публикации произведения",
"IfMangaMacroTooltip": "Если это манга, этот макрос будет заменен на его параметры",
"IfR18MacroTooltip": "Если это произведение с рейтингом R18, макрос будет заменен на его параметры",
"IfR18GMacroTooltip": "Если это произведение с рейтингом R18G, макрос будет заменен на его параметры",
"IfAiMacroTooltip": "Если это произведение сгенерировано AI, макрос будет заменен на его параметры",
"IfIllustMacroTooltip": "Если это изображение, макрос будет заменен на его параметры",
"IfNovelMacroTooltip": "Если это новелла, макрос будет заменен на его параметры",
"IfGifMacroTooltip": "Если это GIF, макрос будет заменен на его параметры",
"MangaIndexMacroTooltip": "Если это манга, этот макрос будет заменен на индекс текущего изображения в серии; должен использоваться с макросом @{if_manga=}, и должен быть в имени файла"
"PicSetIndexMacroTooltip": "Если это манга, этот макрос будет заменен на индекс текущего изображения в серии; должен использоваться с макросом @{if_pic_set=}, и должен быть в имени файла"
}

View File

@ -4,13 +4,13 @@ Pixeval 提供路径宏用于更精细的设定下载路径。
在下载图片时,这些宏会被替换为对应的文本,例如,`@{id}` 宏会在下载时被自动替换为作品ID。
如果一个宏带有参数,则说明是一个条件宏,该宏会在条件满足时被替换为其参数内容。
例如如果正在下载一副漫画作品,则 `@{if_manga=\漫画\}` 会被替换为 `\漫画\`
例如如果正在下载一副漫画作品,则 `@{if_pic_set=\漫画\}` 会被替换为 `\漫画\`
此外,条件宏可以嵌套使用,例如 `@{if_manga=...@{if_r18=...}...}`。
条件宏也可以使用反模式,例如 `@{!if_manga=...}` 表示不是漫画。
此外,条件宏可以嵌套使用,例如 `@{if_pic_set=...@{if_r18=...}...}`。
条件宏也可以使用反模式,例如 `@{!if_pic_set=...}` 表示不是漫画。
有些宏有些特殊约束:
- `@{manga_index}` 必须在条件宏 `@{if_manga=...}` 中使用。
- `@{manga_index}` 和 `@{ext}` 必须在文件名中使用。
- `@{pic_set_index}` 必须在条件宏 `@{if_pic_set=...}` 中使用。
- `@{pic_set_index}` 和 `@{ext}` 必须在文件名中使用。
要查看每个宏的作用,请将鼠标指针移动到对应宏的按钮上。

View File

@ -194,14 +194,15 @@
"PublishYearMacroTooltip": "作品发布年份",
"PublishMonthMacroTooltip": "作品发布月份",
"PublishDayMacroTooltip": "作品发布日期",
"IfMangaMacroTooltip": "如果是漫画,该宏会被替换为其参数",
"IfPicSetMacroTooltip": "如果是多图,该宏会被替换为其参数",
"IfPicAllMacroTooltip": "如果是图片(包括静态单图、多图、动图),该宏会被替换为其参数",
"IfR18MacroTooltip": "如果是限制级的包括R18及R18G该宏会被替换为其参数",
"IfR18GMacroTooltip": "如果是R18G的该宏会被替换为其参数",
"IfAiMacroTooltip": "如果是AI生成的该宏会被替换为其参数",
"IfIllustMacroTooltip": "如果是图片,该宏会被替换为其参数",
"IfPicOneMacroTooltip": "如果是静态单图,该宏会被替换为其参数",
"IfNovelMacroTooltip": "如果是小说,该宏会被替换为其参数",
"IfGifMacroTooltip": "如果是动图,该宏会被替换为其参数",
"MangaIndexMacroTooltip": "如果是漫画,该宏会被替换为当前图片在多图中的索引(第几张);必须与 @{if_manga=} 宏配合使用,必须在文件名上使用",
"IfPicGifMacroTooltip": "如果是动图,该宏会被替换为其参数",
"PicSetIndexMacroTooltip": "如果是多图,该宏会被替换为当前图片在多图中的索引(第几张);必须与 @{if_pic_one=} 宏配合使用,必须在文件名上使用",
"AiUpscalerSettingsGroup/Text": "AI超分辨率",
"UpscalerModelEntry/Header": " AI超分辨率模型",
"UpscalerModelEntry/Description": "选择AI超分辨率模型详见此处",