mirror of
https://github.com/Pixeval/Pixeval.git
synced 2025-01-07 03:06:53 +08:00
新的下载宏 (#557)
This commit is contained in:
parent
99349c482d
commit
28c6617512
@ -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;
|
||||
|
||||
|
@ -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
|
||||
|
@ -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.
|
||||
```
|
@ -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;
|
||||
}
|
@ -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)
|
||||
{
|
39
src/Pixeval/Download/Macros/IsPicOneMacro.cs
Normal file
39
src/Pixeval/Download/Macros/IsPicOneMacro.cs
Normal 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 };
|
||||
}
|
||||
}
|
@ -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;
|
||||
|
@ -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}>";
|
||||
|
@ -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]
|
||||
};
|
||||
|
@ -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()
|
||||
|
@ -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.
|
||||
|
@ -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"
|
||||
}
|
||||
|
@ -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.
|
||||
|
@ -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"
|
||||
}
|
||||
|
@ -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}` должны использоваться в имени файла.
|
||||
|
||||
Чтобы увидеть назначение каждого макроса, наведите курсор на соответствующую кнопку макроса.
|
||||
|
@ -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=}, и должен быть в имени файла"
|
||||
}
|
||||
|
@ -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}` 必须在文件名中使用。
|
||||
|
||||
要查看每个宏的作用,请将鼠标指针移动到对应宏的按钮上。
|
||||
|
@ -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超分辨率模型,详见此处",
|
||||
|
Loading…
Reference in New Issue
Block a user