本次更新内容概述:
- 优化了下载小说的功能,并新增了一些相关设置
- 可以在两个之前不支持的小说页面里下载
- 优化了一些过滤器的选项和工作方式
- 修改了一些设置的名字,功能无变化
- 修复多个 BUG
- 优化了一些帮助和提示内容
🏷️新增命名标记:{human}
{human}:当作品不是 AI 生成的作品时,输出 Human,否则忽略这个标记。它与 {AI} 相反,用来把人类创作的作品和 AI 生成的作品分开保存。
它可以用于作品的文件名命名规则、系列小说的命名规则,以及复制作品信息时的格式。
📚新增设置:只下载这些语言的小说
该设置位于“筛选”-“作品数据”分类里。
你可以要求小说的语言必须是特定的语言,这样下载器才会抓取它。
下载器会检查每篇小说的语言,包括系列里的小说。
你可以设置一种或多种语言代码。多个语言代码之间使用英语逗号 , 分割。例如:zh-cn,ja,en。
📚新增设置:EPUB 文件的语言标签
该设置位于“下载”-“小说”分类里。
现在下载器默认会使用小说的语言作为 EPUB 文件的语言标签。
📚新增设置:EPUB 文件的排版方向
你可以设置小说内容使用横排还是竖排,也可以只为特定语言的小说(如日语、繁体中文)使用竖排。
相关文档:notes/一些小说阅读器对竖排 EPUB 的支持情况.md
📚新增设置:简繁转换
下载器在下载小说时,会根据这个设置决定是否转换简体中文和繁体中文小说。默认不转换。
备注:
- 使用 opencc-js 进行简繁转换。
- 在转换时,繁体一方用的是
twp,也就是会转换台湾常用词。
相关文档:notes/小说的简体中文和繁体中文转换.md
✨支持在小说书签列表页面里抓取
小说书签列表页面:
https://www.pixiv.net/novel/marker_all.php
现在下载器可以在这个页面里批量抓取了。
✨支持在小说分类页面里抓取
小说分类页面:
https://www.pixiv.net/genre/novel
这次适配之后,用户可以使用快速下载功能、手动选择作品、全选功能来下载里面的作品。
PS:因为该页面的每个分类里只有 20 - 50 个左右的作品,滚动也不会加载新作品,所以我没有添加该页面专用的“开始抓取”按钮。
🛸优化检查标签的过滤器:在检查小说标签时,会同时检查分类标记
原创小说通常有分类,在标签列表前面会显示该分类的名称,例如:
注意:“异世界奇幻”不是小说自己的标签,而是根据这篇小说的原创分类(genre)显示的分类名字。
PS:这里的分类就是前面“小说分类页面”里的分类。现在一共有 17 种分类。
用户可能会以为这是作品标签,并在过滤器里(如“标签不能含有”、“标签必须含有”)使用它们。
之前,由于分类名不在标签列表里,所以下载器无法过滤它们。
现在下载器会把分类名字添加到标签列表里,可以检查和保存它们。
✨优化了检测图片色彩的流程和设置项
抓取条件里的“图片色彩”可以让用户只抓取“彩色图片”或“黑白图片”。如果用户只选择了其中一种,下载器就会检查图片的颜色。
优化内容:
- 我添加了“彩色占比阈值”的设置,用户可以调节对图片进行颜色检查时的宽松程度。
- 之前下载器在抓取多图作品时,不会检查它的颜色(而是留到下载时检查);现在在抓取时就会检查每张图片的颜色。
- 在抓取完成后,下载器还会在保存抓取结果时同时保存每个作品的检查结果,记录每个作品里排除了哪些图片,以便在重复检查时节省时间。不过这份数据会与保存的抓取结果一起被清除(通常是在下载完成、放弃下载时被清除)。
测试记录文档:notes/检查图片色彩的测试记录.md
🧠优化了判断图片色彩的算法
之前的判断方式是计算所有像素的 RGB 的平均值,如果相差在 1 左右就认为是黑白图片。这个方法不太准确,有时彩色像素被非彩色像素平均之后可能会把图片视为黑白图片。
现在改为使用彩度来判断。彩度是 R G B 三者中最大值减去最小值得到的数字,反映了颜色是否偏向彩色,偏向有多大。
判断方式是:
排除白色和透明色的像素,只统计彩色、灰色、黑色像素。然后下载器计算彩色像素的占比,和“彩色占比阈值”进行比较。
如果一张图片的彩色像素占比大于阈值,就把它视为彩色图片;否则视为黑白图片。
另外还添加了彩色像素占比的阈值,让用户可以调节判断的严格程度。阈值越小,对彩色图片的判断就越松(即彩色较少的图片也会被视为彩色)。但是和之前一样,无法完全避免误判。毕竟有些图片里就是灰色和彩色一起出现的,下载器只能按照占比判断,做不到完全符合人眼的判断。
✨在“不能含有标签”里,你可以同时使用“全字匹配”和“部分匹配”了
之前你只能在“全字匹配”和“部分匹配”里选择一种匹配模式,现在可以同时使用两种了。
两种匹配模式有各自的开关和输入框,你可以根据自己的需要使用它们。
提示:你的旧设置会被继承,所以你不需要重新设置此项。。
✨新增设置:在“ID 范围”设置里新增了“书签 ID”分类
在你的收藏页面里,你可以使用书签 ID 来筛选新增的收藏。具体用法可以查看该设置的帮助信息。
⚙️调整“预览搜索页面的抓取结果”设置
🔧把它移动到“筛选”-“执行策略”里
⚡预览抓取结果时,作品会分页显示,以降低性能压力
之前抓取到的作品是全部显示在页面上的,当作品数量很多时,页面会非常卡顿。现在改为分页显示。
✨新增设置:每页显示的作品数量
🔥移除了“预览搜索页面的抓取结果”的“上限”设置
因为“预览搜索页面的抓取结果”已经改为了分页显示,所以没有必要设置上限了。
✏️把导航里的“抓取”分类改名为“筛选”,使其更准确
抓取分类里保存了许多筛选/过滤设置。
之前叫“抓取”是因为:它里面的设置大多会在抓取阶段使用。
现在我修改这个名字,是因为使用“抓取”作为分类名存在缺点:
- 不够准确,它里面的设置其实是过滤器,不是“抓取”这个动作或流程本身。
- 首页(仪表盘)里有“开始抓取”区域。导航里的“抓取”分类名字与“开始抓取区域”重复,并且可能会误导新手用户(以为需要在“抓取”分类里开始抓取)。
那么把它改为“筛选”还是“过滤”呢?
在中文语境里,“筛选”更倾向于“保留特定结果”,而“过滤”更倾向于“排除特定结果”。结合该分类里设置的使用方式、目的(保留符合自己需求的作品)、以及 QQ 群里的调查,我决定使用“筛选”。
PS:在 QQ 群的简单调查里,5 人支持使用“筛选”,0 人支持“过滤”,另有 2 人感觉可以保持“抓取”。
🔧把“收藏状态”移动到了“筛选”-“作品类型”分类里
之前它在“作品数据”分类里,把它移动到“作品类型”里更符合直觉。
✏️修改了一些设置的名字,功能无变化
| 旧名字 | 新名字 |
|---|---|
| 必须含有tag | 标签必须含有 |
| 不能含有tag | 标签不能含有 |
| 保存作品的元数据 | 把作品的元数据保存到单独的文件里 |
| 保存作品简介 | 保存作品简介到 TXT 文件里 |
| 预览搜索页面的筛选结果 | 预览搜索页面的抓取结果 |
| 高亮显示关键字 | 高亮显示设置名称里的关键字 |
| 过滤不活跃用户 | 筛选不活跃用户 |
| 过滤搜索页面的作品 | 筛选搜索页面的作品 |
| 在合并系列小说时,只要有一篇小说符合过滤条件,就保存该系列里的所有小说 | 在合并系列小说时,只要有一篇小说符合筛选条件,就保存该系列里的所有小说 |
✏️“停止下载”按钮改名为“放弃下载”
有些用户不清楚停止下载按钮和暂停下载按钮的区别,所以我把“停止下载”按钮改名为“放弃下载”,并添加了二次确认,在确认时会显示对该按钮的说明。
该按钮的功能没有变化。
🎨优化了 Input 组件
- 把 Input 组件的取消、确认按钮移动到输入框下方。之前输入框和按钮是左右并排的,现在改为由输入框占满宽度,按钮显示在下方,看起来更美观、自然。
- 添加了快捷键:在输入框里按 Enter 或 Ctrl + Enter 可以提交。
🛡️在抓取阶段也会检查账号是否被警告,以便及时停止任务,避免事态加重
之前下载器只在下载阶段会检查账号是否被警告(通过检查站内信),现在覆盖了抓取阶段。
现在不只是抓取、下载任务,还有其他一些任务如批量添加收藏、关注用户,都会在用户被警告之后停止任务。
🐞修复问题:特定情况下,保存汇总的简介文件之后,会导致图片下载失败
触发这个 bug 的条件如下:
- 生成文件名时,只有一层文件夹,例如
{user_id}_{user}/{id}_{title}。默认的命名规则有两层文件夹,所以不会触发这个 bug。 - 启用“保存作品简介”并选择“汇总到一个文件”。
表现:
- 下载器错误的用整个文件名作为简介文件的目录,也就是
文件夹/文件名(含扩展名)/简介.txt。注意:图片的文件名如149205565_p0_大道寺知世.jpg会被创建为文件夹 - 之后保存图片时,图片名字和文件夹的名字是同名的,并且无法覆盖文件夹失败,导致浏览器一直无法成功保存文件,文件无法完成下载。
现在修复。
🐞修复问题:快速屏蔽用户的按钮可能会遮挡住作者名字
当用户名元素位于可视区域顶部或底部时,屏蔽按钮会遮挡住用户名。现在修复。
🐞修复问题:在移动端的一些页面里,下载器会导致缩略图不显示,或者收藏按钮不显示
这是因为在移动端,下载器会始终在缩略图右上角显示下载按钮。但是缩略图元素本身有时没有定位,于是下载器用 CSS 给缩略图添加了相对定位。但是这又导致在一些页面里出现显示问题,现在修复。
修复方法是用 JS 判断缩略图元素原本是否有定位,有的话就不再修改定位,没有的话才设置为相对定位。
🐞修复问题:置换小说里的单词时,不会置换以 [] 包裹的单词
现在修复。
相关模块:src/ts/download/ReplaceNovelWords.ts 的 replace 方法
🐞修复问题:下载器在小说元数据里添加的一些语句,使用的是下载器的语言,而非小说的语言
例如这种情况:下载器的界面语言是简体中文,小说是日语。
之前下载器在系列小说元数据里添加的“_系列简介”、“_本次合并包含的章节”等语句是下载器的界面语言,与小说的语言不一致,现在修复。
🐞修复问题:下载途中手动排除作品无效
之前如果在下载途中排除了一个尚未下载的作品,没有实际效果,下载器还是会下载它。现在修复。
但由于下载机制,用于在下载中排除作品的话,下载器不会把它从抓取结果里删除,只是跳过下载它的文件。只有不在下载中(如未开始下载、已暂停下载)排除作品时,才会真的把它从抓取结果里删除。
另外这次修改也完善和加固了对手动排除作品的许多处理。
🐞修复问题:刷新页面后,恢复抓取结果时没有恢复 resultMeta,导致在搜索页面里出现问题
之前在刷新页面后恢复抓取结果时,只恢复了 result,没有恢复 resultMeta,会导致在图像照片的搜索页面里,恢复的抓取结果无法筛选,也不会显示预览卡片。
现在会从 result 里反向还原出 resultMeta,这样在刷新之后,可以显示之前的预览列表,也可以使用筛选功能。
🐞修复问题:改变抓取结果后,下载状态和下载进度可能没有同步
在结果中筛选、手动删除、手动排除作品之后,如果修改了抓取结果,可能会导致已下载的文件被重新下载,进度条上的数字也可能不对。
现在会按文件 id 迁移下载状态,并立即刷新进度条上的数字。
🐞修复问题:特定情况下,预览作品的详细信息面板不显示
如果用户的操作是:
- 鼠标进入作品缩略图元素。此时下载器会在缩略图上显示一些按钮
- 鼠标短暂经过按钮
- 鼠标从按钮上移出并落入缩略图元素。此时不会触发预览作品的详细信息功能,也就是不会显示详情面板。
PS:在这个情况里,预览作品(的图片)的功能是正常触发的。
根因是 PreviewWorkDetailInfo 在再次进入同一作品缩略图时,会因 id === this.workId 直接返回。在上面的操作里:
- 鼠标进入缩略图是,会保存此时的 workId
- 鼠标经过按钮时,会触发缩略图的离开事件,进而取消详情面板的延迟显示;
- 从按钮回到缩略图后,再次触发了进入缩略图的事件。此时 workId 相同,所以不会显示详情面板
现在 src/ts/PreviewWorkDetailInfo.ts 会识别鼠标是否从 .btnOnThumb 返回同一缩略图:若是,则重新启动详情面板的延迟显示。
🐞修复问题:下载后收藏作品时,没有为每批下载任务分别保存待收藏列表,导致之后启动的下载会覆盖当前待收藏列表
相关模块:src/ts/download/BookmarkAfterDL.ts
🐞修复问题:下载后收藏作品时,如果途中断网了,收藏进度会卡住
现在断网期间失败的收藏请求会显示错误提示,并重新回到等待队列里,可以重试多次;如果一个作品的收藏任务在重试 1 小时还未成功,就放弃添加这个收藏。
同时也对其他添加收藏的模块进行了加固,当一个收藏请求因为网络问题失败时,会重试最多 3 次(src/ts/Bookmark.ts 里的 retryMaxForNetworkError),并且在任务结束后会显示有多少个收藏任务失败了。用户可以重新执行对应的功能以再次重试。
🐞修复问题:刷新 token 的流程不够严谨,会导致一些问题
相关模块:src/ts/Token.ts
🐞修复问题:SW 里 downloads.download() 建立下载失败时,前台下载进度可能会卡住
相关模块:src/ts/serviceWorker/background.ts
现在如果因为文件名异常等原因导致浏览器建立下载失败,前台会在日志里显示错误信息,并立刻暂停下载。
示例:在 Firefox 浏览器里,前台会显示原始的错误信息(英文部分),例如:
无法开始保存:filename must not contain illegal characters。
下载器会对这条错误信息显示针对性提示。
🐞修复问题:处理了一些 Firefox 里无法用作文件名的特殊字符
作品标题里有一个不可见的特殊字符,导致 Firefox 无法保存该文件。现在修复。
🛠️当前台的 fetch 请求因失败而重试时,会绕过缓存,这在某些边缘场景里可能能解决错误
在 src/ts/download/Download.ts 模块里,一个文件下载失败时:
- 会先重试 10 次
- 如果 10 次之后还无法成功,就先跳过它,等到其他文件下载完毕后再重试下载它
这次加固后,在这两种情况里都会为 fetch 请求添加 cache: 'reload' 参数,绕过 HTTP 缓存并更新缓存。
这个措施可能很少有能发挥作用的时候,emmm 聊胜于无吧。
♻️拆分了“预览搜索页面的筛选结果”功能的代码
之前 InitSearchArtworkPage.ts 模块同时负责抓取和预览抓取结果,但是后者是个重量级功能,两者的逻辑混在一起增加了维护难度。现在把后者拆分成单独的 SearchResultPreview.ts 模块,并优化了很多逻辑。
♻️简化搜索页面里删除作品模块的逻辑
在上一个重构之后,DeleteWorks.ts 的代码显得更绕了,而且有些啰嗦。现在优化了它的代码逻辑。
✨优化了批量关注用户的功能
- 修复问题:当要关注的用户不存在时,Pixiv 会返回错误代码。之前下载器可能会误判为用户当前账号存在问题,并中止任务。现在修复此问题,并跳过不存在的用户。
- 新增了一种可以导入的数据格式。
- 新增关注的数量只统计实际新增数量。
- 每天新增关注的数量限制从 1000 降低到 500,以降低封号风险。
🔧导出收藏列表时,会保存更多数据
之前每个作品只有 5 条数据(属性),现在我添加了更多数据,以备不时之需。
💡当命名规则里缺少必须的标记时,会显示更详细的提示
之前的提示不够准确和明显,会让用户产生误解。
现在当命名规则里缺少必须的标记时:
- 输入框下方会显示一个提示区域进行说明
- 输入框失去焦点时,会使用轻提示显示“缺少必须的标记,本次修改未保存”