对应设置页:设置 → 下载路径 / 文件名
Shaft 把"下载文件要叫什么名、放在哪"这件事做成了可以自定义的模板。 看完这篇你就会用了,不需要懂编程。
打开设置页顶部可以看到 4 个预设卡片。每张卡会直接显示"用这个预设, 一张插画会存成什么样":
| 预设 | 落点示例 |
|---|---|
| Shaft 经典 | Pictures/Shaft/Illusts/某作者 (12345)/作品标题 123456789 p1.jpg |
| 扁平 | Pictures/Shaft/作品标题 123456789 p1.jpg |
| 按日期分组 | Pictures/Shaft/2024/2024-08/作品标题 123456789 p1.jpg |
| 按作者分组 | Pictures/Shaft/某作者 (12345)/作品标题 123456789 p1.jpg |
点卡片上的紫色"套用"按钮就生效,之后下载的所有作品都按这个落。 选错了想换随时点另一个。
如果只想偷懒,这一步就够了,后面不用看。
翻到 插画 / 漫画 那张卡片,会看到"文件名模板"输入框,默认是:
Shaft/Illusts/[?R18:R18/][?AI:AI/]{author} ({author_id})/{title} {id}[?p>1: p{page}].{ext}
看起来吓人,但规则只有 4 条:
- 普通文字照原样出现(比如
Shaft/Illusts/) {变量名}会被换成真实内容(比如{title}→ 作品标题)[?条件:内容]只在条件成立时才出现(比如[?R18:R18/]只有 R18 作品才多一层R18/目录)/表示子目录
上面那条模板翻译过来就是:
在
Pictures/Shaft/Illusts/下面,如果是 R18 多加一层R18/, 如果是 AI 多加一层AI/,然后一层作者目录, 文件名是作品标题 作品ID,如果多页再加p页码,后缀跟源文件。
每个变量代表作品的一项信息。设置页"变量(点击插入)"一栏里点任一个, 会直接插到你正在编辑的模板里(先点一下模板输入框再点变量)。
| 变量 | 举例 | 说明 |
|---|---|---|
{id} |
123456789 |
作品 ID。强烈建议加,避免同名覆盖 |
{title} |
夏日祭り |
作品标题 |
{page} |
0 / 1 / 2… |
当前第几张(从 0 开始) |
{pages} |
4 |
本作品一共几张 |
{ext} |
jpg / png / gif |
扩展名,跟随源文件(Pixiv 给 png 就存 png,给 jpg 就存 jpg) |
{author} |
藍染 |
作者昵称 |
{author_id} |
55555 |
作者 ID |
{w} |
1920 |
图片宽度(像素) |
{h} |
1080 |
图片高度 |
{created:yyyyMMdd_HHmmss} |
20240815_093210 |
投稿时间,冒号后自己写格式(见下) |
{created:…} 格式:冒号后面写你想要的日期格式,常用的几种:
| 想要 | 写法 |
|---|---|
| 2024 | {created:yyyy} |
| 2024-08 | {created:yyyy-MM} |
| 2024-08-15 | {created:yyyy-MM-dd} |
| 20240815_093210 | {created:yyyyMMdd_HHmmss} |
条件块形式 [?条件:内容]——条件成立时 内容 才出现,否则整个块消失。
| 条件 | 作用 |
|---|---|
[?R18:R18/] |
只有 R18 作品才多加 R18/ 子目录 |
[?AI:AI/] |
只有 AI 生成作品才多加 AI/ 子目录 |
[?!R18:safe/] |
前面加 ! 表示取反——只有非 R18 才加 safe/ |
[?p>1: p{page}] |
只有多页(总页数 > 1)时才加 p页码;单页作品不加 |
{author}/{title}.{ext}
结果:Pictures/藍染/夏日祭り.jpg
{id} 会遇到同标题的作品相互覆盖,下载到一半才发现文件消失了。建议至少加一个 {id}:
{author}/{title} {id}.{ext}
Shaft/[?R18:R18/]{author}/{title} {id}.{ext}
普通作品:Shaft/藍染/夏日祭り 123.jpg
R18 作品:Shaft/R18/藍染/夏日祭り 456.jpg
Shaft/{created:yyyy-MM}/{title} {id}.{ext}
结果:Shaft/2024-08/夏日祭り 123.jpg
Shaft/{author}/{title} {id}/p{page}.{ext}
结果(4 页作品):
Shaft/藍染/夏日祭り 123/p0.jpg
Shaft/藍染/夏日祭り 123/p1.jpg
Shaft/藍染/夏日祭り 123/p2.jpg
Shaft/藍染/夏日祭り 123/p3.jpg
{title} {id} {w}x{h}.{ext}
结果:夏日祭り 123 1920x1080.jpg
每张 bucket 卡片下方都有"实时预览"框——你在模板里每敲一个字, 预览会立刻显示这样改完一个样本作品会存成什么路径。不用保存就能看。
改好满意了点左下角紫色"保存"按钮。如果写错了语法(比如 { 没配对的 }),
保存会被拒绝并提示哪里错了,不会破坏现有设置。
要把这个桶恢复到系统默认?点"恢复默认"。 要把所有桶全部恢复?滑到页面底部点"全部恢复默认"。
每张 bucket 卡片上方有一个 chip 标签显示当前策略,目前默认是"已存在则重命名":
| 策略 | 行为 |
|---|---|
| 已存在则跳过 | 检测到同路径文件已存在就不下载——省流量,但也可能是你想覆盖旧的却不行 |
| 已存在则覆盖 | 删掉旧的、写新的——旧版本永久丢失 |
| 已存在则重命名 | 自动在后面加 (1)、(2)……直到找到空位——最安全,默认就是它 |
设置页按桶分了 5 张卡片,每张独立可改:
| 桶 | 作用 |
|---|---|
| 插画 / 漫画 | 下载的静态图作品 |
| 动图(GIF 最终结果) | 合成好的 .gif 文件(中间的 zip 存在应用缓存,不占用户目录) |
| 小说 | 小说正文 .txt / 导出文件 |
| 备份文件 | 设置导出 / 书签备份 |
| 日志文件 | 调试日志 |
可以给插画走一套规则,小说走另一套——互不干扰。
每张卡片顶部还有一个 chip 显示存储方式:
- MediaStore / Pictures:存到系统的"图片"库,相册 App 能直接看到
- MediaStore / Downloads:存到系统的"下载"库
- SAF 自选目录:之前在 Android 系统弹窗里选过的自定义目录(比如 SD 卡某路径)
- 应用缓存:只给中间产物用,用户配置不到
目前这一版还不支持在设置页直接改存储后端,只能通过一键预设调整。 手动切换 SAF 自选目录的入口会在后续版本加入。
A: 模板只影响之后的新下载。已经下载好的文件不会被移动或重命名——那是你文件管理器的事。
A: 不会。模板里的 / 是目录分隔;作品标题里如果本来就有 / \ 这类字符,会自动被替换成 _,不会意外多出一层目录。
A: 看覆盖策略:
- 默认 重命名:出现
作品 123.jpg和作品 123 (1).jpg - 跳过:第二次直接不下载
- 覆盖:第二次覆盖第一次
A: 每个路径段上限 200 字节(UTF-8 编码)。超出会自动截断,扩展名优先保留(.jpg 不会被切掉)。
A: 光写 {created} 会用默认格式 yyyyMMdd_HHmmss(紧凑时间戳);加 :格式 自定义,比如 {created:yyyy-MM} 只拿到年月。
A: 不会。保存前会校验语法,失败会弹 toast 拒绝保存,原配置不动。即使保存成功,下载时还会做一次字符清洗兜底——不会生成真的非法路径。
A: 目前还没做导入导出 UI。配置存在 MMKV 里,下一版本会加。
{变量} 换成真实内容
{变量:格式} 带格式(只有 {created} 支持)
[?标签:内容] 标签为真才出现
[?!标签:内容] 标签为假才出现
[?p>1:内容] 总页数大于 1 才出现
/ 子目录分隔
变量:id title page pages ext author author_id w h created
标签:R18 AI Original Animated
就这些。 如果看完还是晕,回到设置页点一下 "Shaft 经典" 预设,什么都不用改 。