漫画系列页面 处于改版中,我的账号还是旧版,等我的账号也变成新版之后,再过一个月,删除兼容旧版的代码。
- 必要。必须进行更新,因为旧的版本已经不适合继续使用。
- 一般。如果更新内容对你有用,你可以进行更新。否则无需更新。
推荐更新级别:一般。如果更新内容对你有用,你可以进行更新。否则无需更新。
使用 docsify 制作了新的 wiki,所以把之前的 wiki 网址换成了新的网址。
新的 wiki 有便于查看的目录,也便于以后翻译成其他语言。
推荐更新级别:一般。如果更新内容对你有用,你可以进行更新。否则无需更新。
在“其他”选项卡里,增加了 Language 的设置。
一般保持默认的自动检测就可以,下载器会使用和 Pixiv 页面一致的语言。
除非你想让两者不同,比如 Pixiv 使用日语,下载器使用中文,这时才需要修改。
ps:以前偶尔有用户说起过想要单独设置下载器的语言,但是这个需求其实很少。我也嫌麻烦,没有做。现在比较闲所以做了。
为什么说之前嫌麻烦呢,因为我之前预想的是可以无刷新切换语言:修改语言之后会立即生效,不需要刷新页面,也不会影响下载器的工作状态。但是这样实现起来就会很麻烦。今天虽然做了语言切换,但也要刷新才生效,算是个偷懒的办法。(Pixiv 修改语言就是强制刷新页面的,所以四舍五入我就和 Pixiv 程序员一样厉害,逃)
有俩 a 标签单纯当按钮用的,没有链接,href="javascript:void()"
。现在改成了 button。
在之前的版本,恢复任务之后的 {task_date} 的时间是恢复任务的时间,而不是抓取完成的时间。
现在下载器会把 {task_date} 保存到数据库,这样恢复任务之后的 {task_date} 仍然是抓取完成的时间。
今天发现了这个 bug,比如命名规则是 {id}-{tags}
,重置设置,之后修改命名规则,但是不管怎么修改,下载时的命名规则还是旧的 {id}-{tags}
。刷新页面可以解决。现在对这个bug进行了修复。
原因是因为页面初始化时,其他组件引用了 settings
对象。重置设置时,用等号 =
重新设置了 settings
的值,导致 settings
的内存地址变化了,然而其他组件里依然是一开始的旧 settings
,所以修改选项无效。
此问题可简化为以下模型:
// 导出对象 a
let a = {
name: 'a'
}
// 模块 b 引用 a
let b = a
// 通过等号赋值改变 a
a = {
name: 'ccc'
}
// 模块 b 里还是原来的 a,没有变
console.log(b.name)
// 'a'
// 这是因为通过等号重新给 a 赋值,a 的内存地址变成了新的。但是 b 仍然是原来的 a 的内存地址,所以 b 不会变。
解决办法有两个:
- 不改变
settings
的内存地址就不会出问题,所以不要用等号赋值。可以用Object.assign(settings, newObj)
代替用等号赋值。 settings
是类Settings
的属性。如果在其他类里面使用Settings.settings
来访问,由于类Settings
不会变,所以settings
可以随意改变,不会出问题。但这样写起来麻烦。
使用了方法 1,修改起来很简单。
如果关闭“不下载重复文件”,那么下载器应该直接返回“通过”的结果,不应该去读取数据库进行数据对比。但是之前不管怎样都会进行对比。这不会影响下载,但是会浪费额外的资源。
原因是 Promise 函数里有多个 resolve
时,没加 return
的问题。现在进行了修复。
把情况简化一下,假设有个函数,有 3 个参数作为判断条件,如果检查到某个参数为 false 就直接 resolve,不执行后续代码。那么下面的代码是错误的:
async function t(a, b, c) {
return new Promise((resolve) => {
if (!a) {
console.log(a)
resolve(false)
}
if (!b) {
console.log(b)
resolve(false)
}
if (!c) {
console.log(c)
resolve(false)
}
})
}
// 执行测试
t(false, false, false)
执行上面的代码,会发现里面 3 个判断里的 resolve
全都执行了。
以前我对 Promise 存在认知错误,以为 resolve
或者 reject
一次之后代码就不会执行了,这是错误的。 resolve
或者 reject
只是确定了 Promise 的状态,后面的代码还是会执行的。所以这种情况需要加 return
。
之前 Deduplication
类向 IndexedDB 添加下载记录时,如果这个记录已存在,就会 add 出错,产生一个错误信息。这是一个设计,而且不影响下载。
原因是之前添加记录时,没有先查询记录是否已经存在,直接尝试 add,如果 add 出错说明记录存在,那就改成用 put 来添加。这样虽然会出现一个报错信息,但因为不用先查询记录,所以比较快。
现在进行了修复,先查询记录,根据结果选择使用 add 还是 put。这样不会出现错误信息,但是对于没有记录的数据,因为要先查询一次,所以添加速度会比之前慢。
在出错的地方添加了 console.trace()
来显示堆栈跟踪,以便确定调用链。
{task_date}
记录了这次任务抓取完成时的时间。例如:2020-10-21。
这可以用在文件夹名字里,记录是什么时候进行的下载。
有些用户想修改 {date}
命名标记的结果,比如从默认的 YYYY-MM-DD
改成 YYMMDD
。
所以我在“其他”选项卡里添加了一个选项,用户可以输入想要的日期格式。这会影响命名规则里的 {date} 和 {task_date} 生成的结果。在这个选项右侧点击“提示”按钮可以看到详细说明。
例如:
- 美国的日期格式可以设置成
DD MMMM, YYYY
,输出21 October, 2020
- 中国的日期格式可以设置成
YYYY年MM月DD日
,输出2020年10月21日
以前不能输出时间,现在也可以输出时间了,如设置成 YYYY年MM月DD日hh时mm分ss秒
。
原本用弹窗显示的一些信息,现在会通过一个单独的消息框显示。
浏览器的弹窗会导致页面无法操作,自定义的消息框则没有问题。而且这也可以指定消息文本的颜色。
在 Pixiv 的夜间模式里,下载器背景色由原来的 #333 加深到了 #222 ,看起来会更黑了。
如果 Pixiv 是夜间模式,以前下载器偶尔会没能检测到,下载面板依旧是白色的。现在进行了修复。
问题在于要先获取一个元素,应该用定时器一直执行,直到找到这个元素为之。之前的代码是 setTimeout ,只检测了一次。现在修复。
新增了解析日期格式的类 DateFormat.ts
。便于用户自定义日期格式,得到想要的结果。
p 站最近 api 结果变化,导致一些页面抓取出错,现在修复。
- 抓取搜索页面
- 抓取相关作品
- 抓取漫画系列
发生变化的地方是插画、漫画通用数据(src\ts\modules\CrawlResult.d.ts
里的 ArtworkCommonData
),现在里面没有 illustId
和 illustTitle
属性了。
因为“一键添加 tag”这个功能需要获取非公开收藏的作品,但现在新版收藏页面里只会显示公开收藏的,不允许获取非公开收藏的,导致这个功能无法使用,所以去掉了这个按钮。
在旧版收藏页面里可以正常使用“一键添加 tag”。
相关作品最多有 180 个。以前如果用户设置只下载一部分(如 10 个),那么下载的文件可能和页面上显示的顺序不同。现在变得相同了。
- 拆分 Support 类;
- 拆分预览文件名的代码为单独的类;
- 拆分复制 url 的代码为单独的类;
- 消除了一些重复的声明
- 根据 pixiv 的变化进行了相应的修改
在“不下载重复文件”选项里,可以导出/导入下载记录。
例如重装浏览器、重装操作系统等情况,可以先导出数据,以后再导入。
如果在搜索页设置了时间范围选项,现在可以获得更快的搜索速度。
这是因为以前搜索页的 api 数据里没有时间数据,现在有了,所以可以尽早的过滤时间范围选项。
pixiv 的搜索 api 的结果有一点变化,导致搜索页面抓取出错,现在修复。
应一位赞助者的需要,添加了输出 lst 文件的功能。
在“下载”选项卡里新增了"图片尺寸"的设置,你可以选择要下载的图片尺寸。
在画师页面里也可以使用“收藏本页面的所有作品"功能了。
只会收藏当前页面的作品。如果想收藏多页,需要一页一页执行。
考虑到有些画师早期作品不如现在的好,所以批量收藏不会直接收藏画师的所有作品,而是一次收藏一页。这样便于用户控制收藏的范围。
在“下载”选项卡里,新增了一个按钮:导出抓取结果。
点击它可以把抓取结果导出为 json 文件。
导出 csv 时,会导出生成的文件名,以及原图的 url(original)。
这有助于用户提取这两项数据,使用其他下载软件下载。
注意:
小说的原图 url 是 blob url,所以无法用其他下载器进行下载。
以前同时下载数量最大值是 5,现在增加到 10。
但是默认值仍然是 5,除非用户手动修改到更大的值。这是因为国内一些用户的下载速度比较慢,所以不应该同时下载很多文件。
ps:以前有个说法,Chrome 对同一个 host 最多只能同时发出 6 个并发请求。我现在测试了下,pixiv 的图片请求是 http/1.1,但是可以同时进行 10 个并发请求。不清楚为什么,反正是好事。
之前最多只允许保存 10 个,现在提高到 20 个。
tab 栏指的是“抓取、下载、其他”三个控制区块的部分,它们让用户可以切换显示三个对应的区域。
以前当下载面板出现滚动条时,如果滚动到底部,tab 栏就不显示了(被顶部标题遮挡了)。这样不方便,因为用户无法直接切换到其他选项卡了,必须先滚动回顶部,然后再切换。
现在进行了优化,即使滚动到底部,tab 栏也仍然会一直显示。这样便于用户切换显示区域。
技术上是使用 css 的 sticky 定位,这个效果很容易的被实现了。如果没有 sticky 定位,将现有布局修改成这样会很麻烦。
注意: 部分安卓系统上的浏览器对 sticky 定位的支持或许不好。不知道安卓上的 Yandex 浏览器是否能良好的支持——考虑到它使用 chromium 内核,所以我觉得应该是支持的。但是要等新版本发布到商店,才能在 Yandex 上进行测试。
多了一种关闭下载面板的方法。点击下载面板以外的区域,就可以关闭下载面板。
以前可能大部分用户是点击下载面板右上角的关闭按钮(x)来关闭下载面板的。但是长时间的使用中,总是使用鼠标点击这个按钮,可能会觉得麻烦,或者觉得累。现在新增的这个方式更加方便:只要点击下载面板以外的区域,就可以关闭下载面板。
在 API 类里添加了点赞的 API。
快速收藏时会自动点赞,之前是模拟点击网页上的“like”按钮,现在则通过 API 发送点赞请求,更加可靠。
之前其他类获取 token,使用 token.getToken()
方法,现在改为使用属性 token.token
,使用起来更方便,也避免了重复的计算。
原本它自己创建绿色按钮,现在改为构建时由外部传入。
对内部数据结构做了优化。
之前的 qq 群满了,现在修改为新的群号。
如果要在下载时添加对所有作品的收藏,或者点赞,应该使用 result meta。
const type: 'illusts' | 'novels' = (workData.type === 2) ? 'novels' : 'illusts'
API.addBookmark(
type,
workData.idNum.toString(),
settings.quickBookmarks ? workData.tags : [],
false,
token.token
)
不同页面的页数设置/个数设置的默认值和范围都是不同的。所以以前没有保存这个设置,现在进行了保存。
使用数组保存所有页面类型里的页数/个数设置。
调整了其他组件里与此相关的部分代码。
之前这部分代码主要在 API 里,但是因为 API 是静态类,所以事件监听放在了 Support 类里。现在将其独立出来。
优化了代码逻辑。并且如果以后其他页面要使用这个功能,也会更加方便。
以前重置设置的功能存在一些 bug: 因为 settings 直接引用了默认设置,导致默认设置被改写,导致实际上并不能重置 localstorage 里的设置。现在修复。
提供了以下选项:
- 大于等于
- 等于
- 小于等于
以前文件体积都是显示的 KiB,现在添加了 MiB 作为单位。
- 如果这个文件的体积大于 1 MiB,就会以 MiB 作为单位显示。小数点后保留一位小数。
- 文件开始下载之前,默认显示的大小
0 KiB
改为0 MiB
。
tip:
今天调查了两个排行榜上文件的体积。
- 文件平均体积接近 2M
- 1M 以下和 1M 以上的大约分别占一半
在下载阶段对图片进行黑白检查,之前在这里不检查第一张图,现在第一张图也会被检查,更加准确。
命名规则点击问号之后会展开提示。提示底部的文字现在移动到了顶部:
一定要包含 {id} 或者 {id_num}{p_num}。
您可以使用多个标记;建议在不同标记之间添加分割用的字符。示例:{id}-{userid}
* 在某些情况下,会有一些标记不可用。
这是为了让更多人看到这些提示。主要是不加 {id}
或者 {id_num}{p_num}
导致重名的人有点多。
之前第一次筛选之后不显示下载面板,这样用户之后打开下载面板可以看到筛选按钮,便于进行二次筛选。
但是有时候不需要二次筛选,只需要下载,所以还是显示下载面板更方便一些,也减少了用户的困惑。
假设第一次筛选时没有开启“多图作品设置”,筛选之后开启了这个设置。这个设置会影响要下载的文件数量。
之前当用户修改这个设置之后,需要手动点击“在结果中筛选”按钮,才会重新计算结果。现在改成自动的了,修改设置之后会立即应用结果,不需要点击其他按钮。
统一存放设置表单相关的类的文件。
之前因为历史遗留原因,当其他组件要读取表单上的设置时,从 form 读取,如:
form.userSetName.value
form.downColorImg.checked
form 是设置表单的 view 层, Settings
类的成员 settings 是 model 层。所以可以直接从 settings 读取数据,如:
settings.userSetName
settings.downColorImg
修改以后看起来更加简洁,并且有类型提示。以前 form 的属性是 input 元素,无法获得类型提示。
之前是在一个类里的,道出了两个对象。这主要是历史遗留原因,并没有要放一起的理由。现在拆分成两个类了。
之前 Settings
类里没有保存所有设置项,现在改为保存所有设置项了。
注意:页数/个数设置是特例,虽然会保存到 settings,但是不会从 settings 里恢复。
- 自动响应设置变化。在抓取途中修改过滤器使用的设置,过滤器可以立即应用。以前需要重新开始抓取才能应用。
- 缓存一些值,避免重复计算,提高效率,减少资源占用。
- 增加了一个标记,可以指示过滤器获取设置的值时,是否输出日志。
- 改变:将动图视为单图。之前动图不参与单图、多图判断,现在改为视为单图。
排行榜页面的“只下载首次登场作品”按钮的状态,之前是在 form 里添加了一个隐藏的 input,储存它的值。现在改为使用 States
类里的 debut
属性。
以前,当抓取完成时,如果结果为空,会触发 crawlEmpty
事件;如果有结果,则触发 crawlFinish
事件。
但是这样是不合理的:抓取完成时只会触发两者之一,这使得监听变得难以处理,有时候不得不同时监听这两个事件。
现在进行了修改:不管结果是否为空,都会触发 crawlFinish
事件,只监听这个事件就可以了。如果结果为空,则会额外触发 crawlEmpty
事件,可以根据需要决定是否监听这个事件。
之前二次筛选之后触发的是 crawlFinish
事件,现在改为一个单独的 resultChange
事件。
这样使事件系统减少了一些复杂度,现在 crawlFinish
事件只有一个触发者了。而且其他组件也可以分辨这两个事件。
在此基础上,优化了代码和一些状态,消除了搜索页里的三个状态标记。
优化了代码逻辑,减少理解难度。
PageInfo
类获取页面的 tag 和 title,并在开始抓取时保存到 store
里。这导致这两个类里都有 tag 和 tiele,引用时需要分辨它们含义的不同,并且显得重复。
现在优化了获取 tag 和 title 的 API,直接在 store
里保存,删除了 PageInfo
类。
checkWantPageInputGreater0
当页数/个数设置要求大于 0 的时候使用这个方法。现在对它进行了优化,可以直接返回值,并且输出日志提示。
下载器的界面文本使用 {}
作为占位符,如 下载排行榜前 {} 个作品
。
以前因为历史遗留原因,有些地方用 -num-
做占位符,现在替换成 {}
。
keyCode 已被弃用,现在替换成 code。
对每个事件添加了注释
修改了一些事件的名字
删除了一些没有被使用的事件
第一次进入作品页面不会出现这个问题。之后无刷新切换到其他作品时,则有一定概率发现快速收藏按钮没有出现。现在进行了修复。
原因是 DOM 更新引起的。下载器会查找 pixiv 原本的收藏按钮,找到之后隐藏它,然后添加快速收藏按钮。但是在页面切换时有点麻烦:收藏按钮区域的元素是重新生成的。
当页面切换的动作已经触发之后,下载器会查找新生成的 pixiv 的收藏按钮。但有时候旧的收藏按钮没有消失,下载器找到了旧的收藏按钮,并添加了快速收藏按钮。之后页面元素更新,此时才生成了新的的 pixiv 的收藏按钮,并且因为元素更新,导致快速收藏按钮被清除了。
解决办法是,下载器会给 pixiv 原本的收藏按钮添加一个标记。当页面切换时,下载器会查找这个按钮,如果它有标记就说明它是旧的,不进行处理。直到新的按钮出现(没有这个标记),下载器才添加快速收藏按钮。这样不会出错。
搜索页面在抓取列表页时如果出错了,会进行重试,重新抓取出错的这一页。
之前存在 bug,如果某一页出错了,实际上并不是重新抓取它,而是跳过了它然后向后抓取。
例如抓取 1-10 页,第 4 页出错了,由于第 4 页的页码已经使用过了,所以重试时的页码不是第 4 页了,而是向后延续,最后的结果就是抓取了 1-11 页,其中没有第 4 页 的结果。
这个问题只在并发执行 getIdList
时才会出现。如果是单线程的执行 getIdList
,在请求成功之后才增加页码,出错时并没有增加页码。并发执行时因为要同时请求多个页面,所以在请求发出之前就增加了页码,才导致出现了这个问题。目前只有搜索页面(搜索插画、漫画和小说)是并发执行的。
现在进行修复。解决办法是重试时传递要重试的页码,直接使用这个页码,而不是继续增加页码。
效果如图:
这个 csv 文件保存了每个作品的一些信息。
一个多图作品在下载时可能产生多个文件,但是 csv 文件里只会保存一份信息。(第一张图的信息)
这个文件不能用于恢复下载。但是你可以复制 id
一列的数据,然后到首页使用“输入 id 下载”,这样可以再次下载这些文件。
以前快速下载按钮内置于 InitArtworkPage
类中,现在成为了一个独立的类,并且可以在任意页面使用。(但是目前并没有在其他页面使用的打算)(如果在其他页面使用的话,可以当做“开始抓取”按钮的快捷方式)
之前 store 里保存了 states 对象,现在把这些对象移到了单独的 States
类里,便于管理,逻辑也更清晰了。
之前如果在下载途中停止了下载,但是刷新页面之后你会发现又继续开始下载了。
这是因为停止下载时,任务尚未完成,所以刷新页面后会进行断点续传,导致又开始下载了。
现在优化了这里,停止下载时会清除这个任务的数据,不会导致断点续传。
tags_transl_only
只保存翻译后的 tag,不保存原本的日文 tag。
但是如果某个 tag 没有翻译,则会保存原本的 tag。
一般不需要开启。除非当你确定是因为文件名太长导致了问题,才需要启用这个设置。
如果文件名太长的话,Chrome 可能会自动截断,不会导致保存失败。
在一些特殊情况下,Chrome 可能不会自动截断文件名,导致保存失败。例如:你把下载位置设置到 NAS 或云端硬盘时。
文件名长度上限只影响文件名部分(含扩展名),不影响文件夹部分。请注意不要让文件夹名字超长。
最近漫画系列页面改版了,目前一部分人是新版,一部分人是旧版。
现在兼顾这两种情况,进行了适配。
之前增加这个功能的时候忘记适配夜间模式,现在适配。
修复了加载命名规则的时候,不会保存的问题。
当初加这个功能的时候,没注意到这一点,现在补上了。
设置必须包含的 tag 或者必须排除的 tag 时,以前只能使用日文 tag,现在在部分页面里可以使用翻译后的 tag 了。
所以还是推荐只使用日文 tag。
注意: 一个 tag 在不同语言里可能有不同的翻译,所以使用日文 tag 是最稳妥的。如果你不切换 pixiv 的语言,那么可以只使用翻译后的 tag。如果你切换了 pixiv 的语言,则要注意这一点。
因为打包后的代码没有做混淆,只是把模块的依赖做了兼容,所以并不需要 source-map。
而且 source-map 会增加编译时间,增加打包文件的体积,去掉了也挺好。
如果你选择 APNG 格式,下载器可以把动图保存为无损的 APNG 动画。
但是需要注意,APNG 文件的体积在下载器的几种动图格式里是最大的。
从 Chrome 85 开始,扩展程序的前台脚本不允许进行跨域请求了。
这导致下载器无法下载 pixiv 的图片,现在进行修复。
优化了转换动图的代码。之前是一起放在一个类里的,现在分离出了提取 zip 的类、转换每种格式的类、流程控制类。代码更易读易于理解和修改了,而且对一些代码也进行了优化。
在命名规则一栏里,增加了“保存”和“读取”按钮,你可以保存不同的命名规则,并随时切换。
每个文件的进度条里,有文件名和已下载这两部分。之前排列的比较乱,现在进行修改,更整齐了,而且文件名部分可以显示更多文字了。
下载器的滚动条会变成蓝色的。
美化了以下界面的滚动条:
- 下载面板
- 输出面板
- 日志区域
其他的好像也没什么面板了。
在作品页面里,你可以使用快捷键 Alt
+ Q
启动快速下载。
使用监听事件的方式,将 TitleBar
类从其他模块中解耦了。
但 TitleBar
里监听了下载流程的事件,其实也不算解耦,只是没以前那样生硬了。
当断点续传加载了未完成的任务时,之前触发的是 crawlFinish
事件。但是恢复下载并不应该使用抓取完成的名字,只是这样可以省点事,进入下载流程。这种做法使得事件系统变复杂了,现在修改。
现在恢复下载时会触发 resume
事件,并且添加了对应的事件监听。
“连锁触发事件”,指的是触发事件 A 之后会导致触发事件 B 这样的连锁情况。
如果下面的模块先执行,它监听了事件 A,执行代码,在后续代码里触发了事件 B。
listen(A,()=>{
func()
})
func(){
// ... code
fire(B)
}
另一个模块里监听了这两个事件,A 和 B:
listen(A,()=>{
console.log('A')
})
listen(B,()=>{
console.log('B')
})
触发事件 A 进行测试,会看到后面的模块先输出 B
,后输出 A
,顺序乱了。
解决办法是在“连锁触发事件”时,将后触发的事件放入异步队列,如:
func(){
// ... code
settimeOut(()=>{
fire(B)
},0)
}
下载器在抓取阶段只能获取到第一张图片的宽高,检查不到后面图片(p1 及之后)的宽高。现在,在下载阶段,当下载了后面的图片时,会对它们进行宽高检查,如果这个图片不符合条件就不保存它。
示例网址:https://www.pixiv.net/artworks/81983126
这个作品第一张图片是横图,后面的都是竖图。以前,如果宽高比例设置为“横图”,那么这里面的图片都会下载。现在可以正确处理,只下载第一张图片。
下载时可能会过滤掉一些文件,跳过下载。此时日志会提示跳过下载这个文件,但之前并没有统计总数。
现在,在下载区域的下载状态旁边,会显示“已跳过 n 个文件”。
目前跳过下载的原因有:
- 检测到重复下载
- 体积不符合设置
- 颜色不符合设置
- 宽高不符合设置
-
转换动图时会在下载区域提示“正在转换n个文件”,此功能独立到了一个类里。从该版本开始,这个提示不会出现在日志区域里。
-
网页右侧的下载按钮从 div 元素改成了 button 元素,这样它们可以被 tab 到了。
有个隐藏的问题:右侧按钮都是在 document.body
的 afterbegin
位置添加的。如果执行 js 来添加多个按钮,后添加的按钮在元素的顺序上反而会排在前面。在作品页面里有两个按钮,快速下载按钮是后添加的,但是它排在第一个。因为快速下载按钮的使用频率很高,所以这正好是我想要的效果。如果要添加更多按钮的话,就要注意顺序问题了。
- 优化了一些 dom 结构
- 优化了一些日志提示
- 其他优化
1:修复了搜索页面使用“收藏本页面的所有作品”功能的 bug。因为现在被二次筛选过滤掉的作品会被隐藏,所以批量添加收藏时,需要过滤掉隐藏的作品。之前没有过滤掉隐藏的作品,导致被过滤掉的作品会被添加收藏。现在修复。
2: 修复了搜索页面进行多次“开始筛选”时,一处日志显示错误的问题。之前,后一次抓取完成的提示“当前有 xx 个作品”的数量“xx”是前一次抓取的作品数量,这是因为日志输出的早了。现在修复。
3:修复了在首页“清空已保存的抓取结果”之后,提示文字显示错误的问题。替换成了正确的文本。
EVT.fire 取消使用 setTimeout 0。之前的版本把触发事件做了 setTimeout 0 处理,解决了某些问题。但是这样修改之后导致一些之前正常的功能出现了异常。现在进行了修复。
现在想想,本来就不该给触发事件的代码加 setTimeout 的,所以又取消掉了。
有些地方用的 setTimeout 0 是合理的,目的是“这段代码可以延后执行”,如果执行早了可能不符合预期。但是触发事件应该尽快执行,所以不宜加延迟。
优化了一些日志提示文本
优化了首页抓取 id 列表时一些处理
搜索页面“去除热门作品上面的遮挡”使用定时器循环检测,减小了检测间隔,之前的 500 ms 有点太大了。
https://www.pixiv.net/mypixiv_new_illust.php
它和“已关注用户的最新作品”页面是挨着的,但是两者的结构并不相同。它是以前的旧式页面,图片列表是 class="image-item"
,而“已关注用户的最新作品”是新的页面,内容是框架生成的。
我本来想做这个页面的抓取,但是我的好 p 友太少了,作品只有几个,难以测试翻页等情况。而且也没人提过这个需求,所以先不做。
最近发现有个不影响使用的 bug:从作品页无刷新的进入到其他页面时,快速收藏组件仍然被调用(但它只应该在作品页面生效)。然后它去获取作品信息,但是这会失败,导致产生一个错误。
现在修复了这个 bug。
这个 bug 的原因在于作品页里监听了 EVT.events.pageSwitch
事件,但是当这个事件触发时,只知道是切换了页面,并不知道页面类型是否发生了改变。可能改变了,也可能没变。快速收藏组件只应该在页面类型没有变化时才能重新调用。
之前关于页面切换有两个事件:
EVT.events.pageSwitch
页面切换EVT.events.pageSwitchedTypeChange
页面切换并且类型改变
现在增加了一个新的事件,用于解决这个问题。
EVT.events.pageSwitchedTypeNotChange
页面切换并且类型不变
修复了上个版本修改导致的 bug:搜索页面抓取时会不停输出日志,显示抓取到的作品数量。
优化了一些日志文本
优化了图片转 icon 的代码
用户可以预览搜索结果,并且可以通过多次筛选或删除作品,来进一步减少搜索的结果。
之前是这样的,抓取完成之后会生成全部的作品列表。如果之后需要删除一些结果,则先清空生成的所有作品列表,然后重新生成保留的结果。这样处理比较简单,但是如果搜索结果很多,每次生成结果都会消耗比较多的时间。近来因为 fire 自定义事件时都设置了 setTimeout 0,导致这个地方出了点问题,用户体验更糟糕了。
现在进行了修改,生成全部的作品列表之后,如果需要删除结果,则查找需要删除的作品直接删除。不会重新生成作品了。这样用户体验改善了很多。不过代码又变得复杂了一些。
有时候搜索页面没有 s_mode
参数,如
https://www.pixiv.net/tags/%E5%A4%A9%E4%BD%BF/illustrations?mode=safe&ratio=0.5
此时展示的结果为严格模式(要求 tag 完全一致)的结果。请求 api 时应该将 s_mode
参数设置为 s_tag_full
,而不是留空,因为留空的话服务器会返回宽松模式的数据。
之前这里没有处理,因为宽松模式可以获取更多搜索结果,但是结果不够精确。现在处理了这里,抓取结果会与页面显示保持一致。
log 区域设置了最大高度,超出最大高度就会出现滚动条。
之前 log 组件每次新增或刷新一条日志时,会立即滚动到底部,但是有时候日志刷新很频繁,频繁的“滚动到底部”会导致页面卡顿。现在使用定时器来定时检查是否需要滚动,减少了滚动的频率。
之前如果其他组件需要打开或关闭中间面板,需要直接操作 CenterPanel 组件。现在通过自定义事件解耦。
另外今天用 Chrome 的性能分析工具,发现下载器删除搜索结果时,Pixiv 页面上的 gtm.js
会进行大量的 DON 操作,消耗的时间比下载器重绘搜索结果还多。
在用户页面或者作品页面内,点击下载面板的“其他”选项卡,可以看到这个按钮。
点击之后下载器会把用户头像保存为 256*256 像素的 ico 文件。ico 文件可以设置成文件夹图标,这样你就可以把画师文件夹的图标设置成画师的 pixiv 头像了。
批量下载图片时不会自动保存画师头像。
保存的抓取结果用于恢复未完成的任务。
在首页,点击下载面板的“其他”选项卡,可以看到“清空已保存的抓取结果”的按钮。点击可以清理。
在其他页面没有这个按钮。
今天有人说夜间模式下,收藏按钮不显示。issues/91
其实之前我没用过夜间模式,现在对夜间模式进行了适配,下载器的界面也会跟随主题变化了。
减小了因为网络问题下载失败时重试的次数,现在为 30 次。
超过重试次数的文件是下载失败的,等到下载完成后,下载器会自动暂停然后再继续下载,重新开始下载这些失败的文件。
现在点击 p 站的收藏按钮之后,会在作品下方出现广告区域,偶尔甚至会出现两个广告区域。现在通过 css 屏蔽这些广告。
之前这个选项是默认打开的,但是因为下载气的去重并不是真的检查硬盘上的文件,所以不严谨,应当默认关闭。
如果用户把下载的文件删除或者剪切走了,但下载器保存了下载记录,以后也依然会跳过这些文件的下载。这就会造成一些用户的困扰。所以把这个选项改为默认关闭。
利用 IndexedDB 存储下载记录,实现去重功能。详细说明可以查看 /static/docs/去重.md
文件。
安装该版本之后才能储存今后的下载记录,之前版本下载是没有记录的。而且用户也可能会清除数据的时候清除掉记录。
去重功能也造成了其他一些组件的变化,比如快速下载一个文件时,如果这个文件是重复的,那么抓取完毕事件和下载完成事件会在瞬间依次发生。而断点续传在这种情况下出现了问题,因为它数据库操作需要的时间比较长,所以在一些地方加上了判断是否下载完成的代码。
今天还遇到个问题,监听事件时发现监听到的顺序不对,后来用 setTimeout 0 的方法解决了。
之前,下载失败的文件会生成一个 txt 文件下载,并把它标记为已下载。现在进行了修改,下载失败的文件不会生成一个 txt 文件,也不会被标记为已下载。
现在,如果下载途中有下载失败的,那么当所有文件都下载完之后,不会显示“下载完成”,而是自动进入暂停状态。这是因为出错的文件不算已下载。
自动暂停之后,点击开始下载,或者刷新页面(利用断点续传功能),下载器就会再次下载那些失败的文件。
这个修改是为了能让断点续传恢复这些下载失败的文件。之前下载失败的文件也算已下载,那么在所有文件下载完成后,断点续传会清空这个任务的数据,这时自然也清空了下载出错的文件的数据。这样就导致断点续传无法恢复这些出错的任务,现在修改之后则可以恢复了。
这是 6.6.0 的预发布版本。
收藏页面里,之前即使不启用快速收藏,点五角星添加收藏时还是会附带 tag。
现在改成这种情况下不带 tag 了。
IndexedDB 单次 add 或者 put 的数据不能超过 127 MB,所以如果抓取结果很多,就会导致存储失败。现在进行了优化,解决这个问题。
这个限制搞得还是挺麻烦的,存储、读取、删除都要考虑分批。
当页面切换时,本程序会自动检测这个页面有没有断点续传数据。之前忘记加页面切换的检测了。
断点续传里保存下载状态,之前是下载一个保存一次最新在状态。但是抓取结果太多(几十万)的话,put 一次数据时间长的话可能要 500 ms 左右,所以改为定时存储,每隔几秒存一次。
下载异常的话,可能最近几个下载的文件的状态没有保存上,不过因为数量少,所以问题不大。
保存和恢复数据时,在 log 区域添加提醒文字。
p 站最近的新功能,在作品页面点击收藏之后,作品下方会出现推荐作品。但是本程序开启快速收藏时,隐藏了 p 站原本的按钮,这样就不会显示推荐作品了。现在对这个问题进行了修复。也就是自动点一下原生的收藏按钮。
优化了快速收藏时获取点赞按钮的操作。也就是多了一种方式来获取,这是为了防止原本的方式失效。
一个页面只会保存最后一次抓取。抓取完成后,抓取到的数据会被存储。下载完成后这些数据会被清除。
如果页面打开后,本程序检查到这个网址下有未完成的任务数据,则会自动进行恢复。
这项功能默认开启,并且也无法关闭。
如果数据量太大的话,保存和恢复数据需要一定的时间。
使用 IndexedDB 存储每个页面抓取任务的数据。细节可以参考 Resume.ts
和 static/doc/断点续传.md
。
断点续传恢复时,需要模拟出正常下载的状态。正常情况下,在可下载之前进行了一些工作,如获取页面信息,初始化过滤器等。恢复下载时没有经过这些过程,所以要直接执行一次这些代码,然后再进入下载状态。不知道这些需要初始化的地方是否还有遗漏的。
在恢复小说的下载时,一个问题是小说的 url 是 blob url,刷新页面之后就失效了。为此只好把小说的文件整个保存在数据库里。下载时如果检测到这是小说下载失败,就用保存的数据重新生成一个 blob url。
似乎没有办法知道数据库文件有多大。我本想限制数据库体积不超过一定大小,但是看来不好做到。所以现在是定时清理超过一定时间的的数据。目前设置的过期时间是 30 天。超过这个时间的数据,应该没有保存的价值了。
优化了下载控制、过滤器的一些地方。
目前设置的数字是 5000,当抓取的文件超过这个数量时,预览文件名、复制 url 等操作不会在输出面板显示,而是保存到 txt 文件里下载。
这是因为结果太多时,输出的内容也多,当点击复制时可能会导致页面崩溃。(和电脑配置有关)
把一些应该可以点击的地方(复制按钮、常见问题按钮)从 div 改成了可以 tab 到的元素。
输出面板可以设置标题了。
在搜索页面打开下载面板,“其他”选项卡里有一个按钮“收藏本页面的所有作品”,点击就会自动抓取当前页面的所有作品,自动收藏,自动添加 tag。
注意:
- 图片和小说页面都可以支持;
- 只抓取当前页面,不会抓取后续其他页面。
- 收藏时直接收藏所有作品,不会根据抓取条件过滤某些作品。如果要过滤,请先进行筛选,然后再使用这个功能。
此功能由群友“错过”向我赞助,让我添加了这个功能。
关于 token,有个偶发问题。本程序通过加载 pixiv 的一个网页来获取用户 token,设置是 5 分钟更新一次。
假如用户之前登录的是账号 A,之后登录了账号 B。可能刚切换到账号 B 的几分钟内 token 没有更新,就会导致需要使用 token 的功能出现问题,比如收藏作品的功能。
现在针对这个问题进行了一些优化。当用户重置设置时,下载器会清空保存的 token,然后立即更新一次 token。之后再使用相关功能应该没问题了(如果还有问题,请刷新页面之后再使用相关功能)。
之前没有添加抓取出错重试的功能,现在加上了。
如果关注的用户非常多,抓取到的结果也可能非常多,一次性下载恐怕会出问题。建议分批下载。
注意:这是一个预发布版本,新增的功能可能不稳定!
在自己的关注页面可以一键抓取所有关注用户的所有作品;也可以指定页数只抓取一部分用户。
我测试了我关注的用户,共 2650 个用户,有 42W 个作品。这还没有抓取作品详情,如果抓取了的话可能最终图片数量是作品数量的 3 倍左右。
当一个作品下载出错时,本程序会自动重试一定次数。之前是 50 次,现在加大一些吧。
预览文件名时,如果抓取结果的数量很多(目前设置的数字是 5000),则不为预览结果添加不同颜色。只直接输出字符。
这是因为添加颜色会导致生成的 HTML 元素数量增多,复制时资源占用增加。有些用户电脑配置差,如果生成的结果很多,还添加了颜色,可能复制时会导致这个页面卡死。
series_title 系列标题
series_order 这个作品在系列中的序号
下图的下载结果,用 series_title 建立文件夹,在其中用 series_order 保存了作品的编号。
测试用例:
小说系列如: https://www.pixiv.net/novel/series/1035507
漫画系列如: https://www.pixiv.net/user/34367290/series/52042
漫画系列如: https://www.pixiv.net/user/3698796/series/61267
不知道插画类型的作品有没有系列页面
userid 直接把俩单词连起来而且也没区分大小写就有点不规范,现在修改成了 user_id。
不过在命名标记里 userid 依然可以使用,否则用户升级到新版本就歇菜了。
在 manifest 里添加了本扩展 github 页面的链接,右键扩展图标时,点击扩展程序名称,可以跳转到 github 页面。
https://microsoftedge.microsoft.com/addons/detail/hpcoocgpiepjcngmhhknkflhpkoklphp
版本比谷歌商店更新,因为谷歌商店最近没有上传新版本。
修正了在搜索页面首页如 FGO,预览结果显示的位置不对的问题。
因为 Edge 需要 Privacy Policy,所以自己编写了一个,看起来还行。
VHlqg 对本程序中的繁体文字进行了完善,并且提交了繁体版的 README。因此重新打包进行更新。
新版收藏页面的小说分类里,当带有 tag 的时候,之前不能正确抓取,现在发现了这个问题,进行适配。
之前 npm run less
命令里, lessc
加了 -x
压缩参数,把生成的 css 文件进行压缩。但是打包时, fmt
命令又会把 css 展开,所以这个压缩没有必要,现在去掉。
根据 issues 78,对一些标记进行了处理。
下面是一些测试时用的数据:
https://www.pixiv.net/novel/show.php?id=12336777 包含
[newpage]
[[jumpuri:こちら >https://twitter.com/kyoka_izumi1]]
https://www.pixiv.net/novel/show.php?id=12883824 包含
[[rb:莉莉丝 > Lilith]]
https://www.pixiv.net/novel/show.php?id=10083001 包含
[pixivimage:70551567]
小说保存为 txt 时,去掉里面的 html 标签。
小说没有 tag 的 tagsTranslated 数据,使用 tag 填充,避免出现空结果。
之前在搜索页面里,没有给 filter.check
前面加 await
,导致在 getIdList
方法里,过滤器等于没生效。
这会导致储存大量不符合条件的作品 id,虽然之后在请求作品详细数据时会过滤掉不符合条件的 id,但对它们发出请求也会浪费很多时间。
现在对这个 bug 进行了修复。
因为已经全面完成了小说的下载功能,所以增加了一个大版本号。
- 优化对图标的处理
之前,即使用户关闭快速收藏功能,本程序仍然会用自己的五角星 ☆
收藏图标代替 pixiv 原本的心形图标。
现在用户关闭快速收藏功能后,本程序不会取代原本的心形图标了。
- 使用了新的添加收藏的 api
- 建立了
artwork
和novel
两个文件夹,把它们各自所属的文件放进去了。 - 修改了一些文件名和类名。
- 修改了
getUserId
和addBookmark
这两个 API。 - 优化了图片查看器的一些功能和代码;修复了 esc 有时未生效的问题。
对于常用的小说页面,都支持了批量下载。
因为已经可以实用了,所以先发布一版。
不排除可能存在潜在问题。
目前只能保存为 txt,不知 epub 的需求大不大,后续可以考虑做。还有一些便利功能考虑添加。
- 小说搜索页面,没有做预览功能。一方面这样比较麻烦,另一方面,小说的二次筛选的需求也许不大。
- 生成文件名时,把不存在的标记去掉,而不是原样保存
- 检查有新版本时,提示图标的链接从 chrome 商店改成了 github。这是因为 github 才是最新版本(而且chrome商店里的可能会被下架)
- 当因为体积问题跳过下载时,可能这个下载进度还是 0 或者很少,看着怪怪的,现在这种情况直接把进度条拉满。
- 当设置了第一张图不带序号时,之前动图仍然会带着序号,现在去掉。
因为 changelog 有点太大了,接近 100KB 了,而且对普通用户来说也没用,所以不把它打包进 dist 文件夹了。
可以指定文件的体积范围,例如设置最小 1MB,最大 10MB,如果文件体积不符合要求,就会跳过这个文件的下载。
理论上应该是,先发送一个 HEAD 请求去获取文件的大小。如果符合条件,再发送下载请求。
但是这样做会很浪费时间。因为网络请求的过程基本是发送请求 - 等待 - 接收返回数据,等待 Waiting(TTFB) 通常会需要很多时间,批量下载时一个图片甚至有可能要等待 2 秒左右。如果先发一个 HEAD 请求,完成后再去发送下载请求,需要的时间就太长了。
所以现在本程序并没有发送 HEAD 请求,而是和以前一样直接下载,当接收到返回的数据时,再判断文件体积。当体积符合要求时,下载不受影响;当体积不符合要求时,中断这个请求。
目前这样唯一的负面影响是,接收图片数据之后再中断请求,终究还是会接收到一些数据。通常,当中断请求时,可能已经接收了几十 KB。不过这个问题看起来不大。
您的产品不符合我们的计划政策的以下部分: 用户数据隐私
您的产品违反了此政策的“权限使用”部分,该部分要求您:
必须请求获得为实现该产品的相关功能或服务而需具备的最基本权限。
在可以使用多项权限来实现某个功能的情况下,必须请求获得最不需要访问数据或功能的那些权限。
不得尝试通过请求可能会给尚未实现的服务或功能带来好处的权限为您产品的未来发展提供保障。
下载器就这么几个权限,没有滥用权限,也没有请求多余的权限。
最近的更新也没有添加新的权限。
我服了。
我详细的描述了一番各个权限的用途,然后重新提交了审核。
审核人员若是仍然拒绝,那就算了。
我记得我上个账号被连续拒绝两次之后,账号被封了。不知道现在会不会历史重演。
如果这次被拒绝,并且账号没被封,还可以尝试提交的话,预计会去掉以下部分:
- 去掉从 github 检查版本更新的功能
- 去掉 pixivision 的下载功能
判断黑白图片里,加载图片时可能网络请求失败,对此加以处理。
在搜索页面,p 站的筛选选项可以设置图片宽高在 xx 以下,之前下载器没有发现这个选项,现在进行了适配。
在下载器底部添加了 fanbox 下载器的链接。
过滤器的函数 filter.check
改成了异步,但是一些调用它的地方没有加上 await
,导致过滤失效,现在修复。
之前,检查“只下载已收藏”设置的代码有 bug,如果没有传递要检查的参数,那么这两个检查始终返回 false。实际上应该返回 true,现在修复。
检查黑白图片时,如果加载图片时遇到错误,会捕获错误进行处理。之前直接抛出错误导致下载器无法继续运行了。
之前,检查图片宽高、检查图片宽高比的代码有 bug,如果传递的参数里没有宽高,那么这两个检查始终返回 false。实际上应该返回 true,现在修复。
之前没有保存输入的 id 范围数字,但是却保存了开关。当用户开启 id 范围设置,然后刷新页面,这个设置还是开启的,但是后面的输入框里是空的,抓取时会报错提醒。
现在对此进行修复,保存了用户输入的 id 数字。
在 getPageType 里,对于下载器不支持的页面类型,会抛出一个错误。
扩展清单里,指定的运行范围是 pixiv.net 的所有页面,但是有些页面下载器不支持。之前,在不支持的页面上,仍然会添加下载器的面板。这是因为代码运行时先添加了面板,之后才检查页面类型。现在先检查页面类型,更加的合理。
在设置线程数字的后面加了个提示。
- 同时转换多个动图会增加资源占用。
- 转换动图时,请保持该标签页激活,否则浏览器会降低转换速度。
其实还有些没补充的,因为补充的话文字可能会太多了。
- 如果资源占用太多,可能会导致页面崩溃,或者浏览器崩溃。(后果自负哦)
- 保持该标签页激活,只需要该页面在浏览器里是直接显示的就行,不需要让这个页面一直保持显示在屏幕上(那样就做不了其他事情了)。
- 保持该标签页激活的方法:第一种方法,不要切换到其他页面。但是这样就不能浏览其他网页了;第二种方法,把这个标签页拖出来形成一个单独的窗口,这样这个标签页始终是激活的,你可以回到之前的窗口浏览其他网页,也不会影响转换。
- 动图的转换数量不会超过下载线程数。也就是说同时下载几个,最多也就只能同时转换几个,不能无中生有。
修复了一些情况下,网页语言是中文,但是赞助链接显示的是 patreon 的情况。
我下载时不想要黑白图片,但是有些黑白图片分类是“插画”,不是“漫画”。而且也没有“漫画” tag,导致无法排除。现在增加了这个设置,进行排除。
如果设置了过滤彩色或黑白图片,过滤器会检查图片的平均颜色,判断这个图片是彩色的还是黑白的。
**注意:**这个方法并不算完美。虽然程序判断颜色是没错的,但是实际使用中,掺杂了其他因素,就显得不完美了。
一个和用户主管意愿有关的问题:如果有个图片整体是黑白线稿,但是部分涂抹了一点颜色;或者背景色是略微带点彩色的。这样的图片会被程序判断为彩色图片。如果用户排除黑白图片,排除不了这种。这很遗憾。
宽容度可能会误伤(但一般来说问题不大)。灰色图片的 R G B 三色应该是相同的颜色,例如 200 200 200
。但是我加了一个数值为 1 的宽容度,这样类似于 200 200 201
的图片也会被认为是黑白图片。所以偶尔会误伤,但情况很少;而且即使误伤了,这样的图片也很接近黑白图片,关系不大。
下载器会先对每个作品判断第一张图,第一张图会影响后面图片是否保留。
如果一个多图作品第一张图的颜色和后面图片不同,可能会有误判。假如一个作品第一张是黑白图,后面是彩图,用户设置不下载黑白图,那么由于第一张图不符合要求,所以整个作品就全被排除掉了。这会造成失误,但是这样的作品很少。第一张是彩图后面是黑白图的比较多,而大部分人是喜欢保留彩图的,所以此时不会造成误判。
第一张是彩图,后面是黑白图的示例:https://www.pixiv.net/artworks/80417958
使用的缩略图是 48x48 的 mini 尺寸。
这个缩略图是方形的,原图如果不是方形,那么周围多余的部分会被裁掉。而且缩略图尺寸比原图小。这两个因素都可能导致计算结果和原图不一致。
下载器需要加载缩略图,然后判断图片颜色。如果加载缩略图失败,则把它当作是彩色图片。
如果这个图片实际上是黑白的,此时就会误判。
因为是取平均值,所以有的图明明是彩图,但如果各种颜色分布比较平均的话,会被认为是黑白图片。
例如一个图片,三分之一是纯蓝色(0,0,255),三分之一是纯绿色(0,255,0),三分之一是纯红色(255,0,0),平均值是(85,85,85),就会判断为黑白图片。
除了上面这个例子,有些图一部分是黑色,一部分是各种颜色都有的彩色,也可能被认为是黑白图片。
在程序的处理上,要注意:
- 不要再加大宽容度,因为宽容度哪怕再增加 1,引起的误伤都是很可怕的。
- 第一道检查,是在抓取阶段,获取每个作品的详细信息时进行过滤。
- 第二道检查。是在下载时进行检查。这是因为抓取时只能检测第一张的缩略图,有些作品第一张图的颜色和后面不一样,所以后面的图有必要进行一遍检查,以免有漏网之鱼。
ImageData 是 Uint8ClampedArray 类型,里面包含着所有像素的信息。
每个像素有四个数字: r 值、g 值、b 值、alpha 值。
在 ImageData 里的排列顺序是逐行扫描。
不计算加载图片、绘制图片的部分,只计算从 ImageData 获取平均颜色的时间。
示例:
https://www.pixiv.net/artworks/80358290
cpu:I3-6100
第一张图是在抓取时使用缩略图计算的,缩略图尺寸约为 48*48,计算时间一般在 5 ms 以下。
第二张图片分辨率约为 2000*4000,是对原图进行计算的,时间在 600 ms 左右,极端时候可能有接近 1 秒。
在个效率是可以接受的。
主要是命名方面的,有时候会产生错误的结果,进行修复。
- 修复了重置表单时的问题。
-
之前,如果一个子选项是打开的,重置时关闭了,但这子选项没有被隐藏,现在修复。
-
之前,如果重置时改变了一些单选、复选框的值,其对应的 label 没有根据新的值,改变自己的颜色。现在修复。
- 把 第一张图不带序号 的选项从默认开启改为默认关闭。本来就应该是默认关闭的,之前失误了。
会在主面板下方显示赞助链接。
去掉每个作品第一张图的序号。
效果是单图不带序号,多图的第一张也不带序号。第一张之后的图片要带序号,防止重名。
之前只有个多图的选项,可以选择是否下载多图。有人提过希望能够选择是否下载单图。所以这里加了这个选项。
另外,因为这个选项可以控制是否下载多图,所以对之前的多图下载设置做出了调整。
“动图保存格式”不属于抓取部分,应该属于下载部分,所以把它放进下载选项卡里面了。
例如,抓取时动图保存格式是 webm,数据里储存的后缀名就是 webm。之前,在下载途中,如果用户把格式改为 gif,下载器不会响应这个修改,依然把所有动图转换为 webm。现在,用户修改格式之后,后续下载的文件会响应用户的修改,转换为对应的格式。
之前,过滤器 Filter 会对每个作品检查所有过滤选项,最后判断结果,这是浪费效率的。
之前,假如有 10 个判断条件,某个作品第一个判断条件就不符合,但过滤器仍然会继续检查剩余的判断条件。这是不必要的,现在过滤器遇到某个条件不符合要求时,不会再进行后续的判断了。
之前每次初始化下载器都会更新 token,也就是说每打开一个 pixiv 页面就会请求一次特定页面,获取它源码里的 token。这太频繁,没有必要。现在设置成每隔 5 分钟检查更新一次,大大减少了不必要的请求。
以前只能设置一个值,也就是最小值,要求收藏数大于这个数字。
现在改成最小值和最大值,并且可以任填一个。既可以要求大于某个数字,也可以要求小于某个数字,也可以同时要求,设定一个区间。
之前在搜索页筛选时,对于 R-18G 作品,筛选后显示的是 R-18,现在可以正确显示为 R-18G 了。
有一台电脑重装系统之后,我配置好了开发环境,尝试编译本程序,但是编译后有 70 个 change,发现是代码格式的问题。
有 3 个地方的变化:
function
关键字后面应该有个空格的,之前没有,现在加了空格- 箭头函数只有一个参数时,之前没有加括号,现在加了括号
- 对象成员、数组项的最后一项之后加了逗号
我看了看 prettier 的配置文件,确实会产生现在的结果。为什么之前产生的是其他结果呢?可能之前的环境太乱了吧,现在新的代码风格挺好的,保持下去吧。
有些用户会在名字后面加 @
,后面经常写着漫展摊位,或者寻找工作。我考虑要不要加一个功能,自动阶段 @
,只保留前面的真正的用户名部分。
但是在群里调查一番,发现不太好这样做。
- 有些用户用的不是
@
做分割,而是竖线|
,也许还会有别的。 - 这样可能误伤,比如有些用户名里本来就带
@
的,程序难以分辨。
有些人想要单图的 {id} 去掉 p0 后缀,比如:
81243345_p0.png
# to
81243345.png
如果是单张图片的作品,直接去掉 p0;如果是多 p 图片,则只去掉第一张的 p0。
但是我在 QQ 群里投票调查,需要此功能的人是很少数。所以暂且不打算加上这个设置。
在搜索页面的筛选结果里,之前下载器的 class 都是和页面里保持一致,但是 p 站可能会修改页面 class,它一改,搜索结果就乱版了。
现在我把样式复制了下来,把class 修改为自订的,不用紧跟 p 站更新了。预计这样可以很大减少搜索结果乱版的问题。
之前设置项的行间距是 24px,这和当初设置项太多有关,这样更紧凑一些,节约纵向空间。现在设置项已经分到选项卡里了,把行间距加大到了 26px,整体宽松一些,视觉效果更和谐美观。
因为设置选项太多了,原本全都竖着排下来,高度比较大,时不时就会出现滚动条。尤其是出现了下载部分之后必定有滚动条,下载时经常需要上下滚动查看,很不方便。
关于这个我还做了个问卷调查,31个用户参与,有52%的用户觉得太长有些不方便。
现在按照功能区别,把这些选项放进了选项卡里面,基本不会出现滚动条。
目前选项卡分成了3个:抓取、下载、其他。
- 因为这个改变,现在把抓取部分和下载部分都放进 form 里了。
- 移除折叠按钮.原本折叠按钮会折叠选项区域,显示按钮区域。现在按钮也包含在选项区域里了,一折叠就什么都不显示了,所以去掉。
- 预览文件名 做成了一个单独的按钮
- 一些非抓取的功能按钮放到“其他”里面,比如 给未分类收藏添加 tag 就是如此。
- 之前选项名字都是6个汉字,为了整齐好看,但是有时候难免词不达意。现在分开之后没有那么多选项同时排在一起了,所以不整齐也不会显得很难看,我就把一些选项的字数增加了,使其更容易理解。
- 最近在p站看到国内有个众筹赞助平台“爱发电”,我创建了主页,它会显示在下载器的底部。
https://afdian.net/@xuejianxianzun
同时对于去除热门作品上的遮挡,修改了选择器,使其更稳定。今天发现这个地方的 class 不同 tag 的页面里可能不一样,好厉害。
现在搜索页筛选完之后不会自动显示下载面板,这是为了方便直接查看筛选结果,如果满意再下载,不满意则二次筛选。
如果筛选完之后显示了下载面板,想要查看筛选结果的话,需要先关掉下载面板才能查看。对你来说怎样更方便?
我在qq群里做了投票,最终25::10 保持现状:显示。大部分人表示保持现状继续不显示。
之前,在作品页面如果抓取数量设置为 -1,之后不论是点击“抓取新作品”还是“抓取旧作品”,出现在顶部日志里的提示都是“向下获取所有作品”。这个表达不准确,现在修改为根据“抓取新作品”还是“抓取旧作品”,显示对应的提示。
这个选项可以控制:
当你点击下载器添加的收藏按钮(☆),把作品添加到书签时,是否自动添加这个作品的 tag。
原本在搜索页面,筛选后的收藏按钮仍然是“心”,为了标识这是下载器添加的收藏按钮,把它改成了五角星。
多图建立文件夹时,可以选择使用作品 id 命名文件夹,或者遵从文件名命名规则。
标题栏上包含一些有用的按钮,最常用的就是关闭按钮,和折叠设置按钮。
之前如果下载面板内容太长,出现了滚动条,滚动到下方之后,标题栏就不显示了,要点击这些按钮还要先滚动上去。现在进行了优化,使标题栏始终显示在顶部,随时都可以点击。
当下载器面板显示的是英文时,多图设置那一行因为文字较多会产生一个换行,现在精简了文本,使其不产生换行(强迫症福音)。
大致依照常用程度、相关性,从上到下重新排列了顺序。
热门作品上面覆盖了会员购买链接,导致无法点击。现在移除遮挡的部分,使热门作品可以点击。
修改了一些元素的选择器,可能会使这个 api 稳定一些
{p_user} 当前页面的画师名字
{p_uid} 当前页面的画师id
这俩标记只能在画师页面和作品页内使用,其他页面不能使用。很多用户对此感到困惑。
这是因为这俩标记代表当前页面里的作品属于某一个画师,这时就会使用这个画师的信息。其他页面可能有多个画师的作品混杂,没有办法说“这个页面是属于哪个画师的”,所以不能用。
因为这俩标记带来很多困惑,而且使用场景受限,使用它们的时候,大部分情况下可以用 {user} 和 {uid} 替代,所以去掉了这俩。
注意:
作品页内,“抓取相关作品”功能时,这俩标记会和 {user} 和 {uid} 产生的结果不同。不过这个情景里,这俩标签也不太适用,所以问题不大。
增加了“多图建立目录”选项,可以在下载多图时,使用作品 id 自动建立文件夹存放。
(如果只下载多图的前一张图片,不会建立文件夹,下载多张时才会建立)
最近一些版本里存在一个显示上的 bug,当下载中暂停任务,之后继续开始下载时,已下载数字会变成 0,这属于初始化下载进度条里的一个 bug,现在进行了修复。
今天有人说在搜索页面筛选时,有时会出现一些作品显示两次。我自己测试,有时候有这个情况,有时候又没有,没搞清楚问题所在。其实正常来说不应该有重复的,现在在添加抓取结果时,会先检查这个数据是否已经添加过,避免重复添加。
转换动图时,下载器会先下载动图的 zip 文件,然后读取里面的内容,但有时候因为网络(梯子)的问题,下载的 zip 文件是损坏的,就会触发这个错误 ReadZIP error
。
之前,发生这个错误时,没有进行对应的处理,只是提示一条错误信息。这就导致出错任务的下载线程被“堵住”,现在增加错误处理,跳过这个下载。
今天有用户下载时,发现图片网址的主域名是 techorus-cdn.com
,这是之前没有出现过的,所以把这个网址增加到了 permissions 里。
https://tc-pximg01.techorus-cdn.com/img-original/img/2020/02/18/02/59/21/79568084_p0.png
如果以后 p 站继续增加新的域名,则考虑吧 permission 里的网址匹配规则改为 <all_urls>
。
之前的修改导致页面初始化时,没有对“折叠设置区域”的设置做出相应,现在修复。
对 DOM.ts 里的 getUserId 进行了更新,因为页面上一些 class 变了,导致某些时候会发生错误。
如 www.pixiv.net/artworks/79399027 ,作品简介里出现了另一个用户的链接,如果 getUserId 最后是从 body 里匹配,会匹配页码源码里第一个符合用户 id 的链接,就匹配成了另一个用户。要尽量避免 getUserId 从 body 里匹配。
上次改版忘记修改筛选作品按钮使用的 class 了,现在修复。
p 站搜索页面,作品得 html 变了。其实只是 class 变了,导致下载器现实的结果是乱版的,现在修复。
p 站现在的 clas有很多是分两部分的,如下:
<div class="sc-fzXfQq cFrFLf">
第一部分以 sc-
开头,这部分也可能会变,不过第二部分变化的更频繁一些。
注意适应此改版时,也应一同修改 countClass。
美化了复选框和单选框,着实费了些功夫。也把 input 从 label 里脱离出来了。
效果比较满意,不仅更美观,而且高亮了选项和对应的 label 文本,也让已选择的选项更醒目,更容易辨识。
美化之后的控件一般有三个元素:
- 原控件,隐藏了,但仍可通过 tab 选择与改变
- 美化的按钮,点击可以改变控件的值
- label 文本,当它对应的控件被选中时,label 会高亮
这三个元素都可以改变控件的值,所以都需要能触发 settingChange 事件。
SaveSettings 类在原控件的值变化时触发 settingChange 事件;
Settings 类在点击美化按钮、label 文本时触发 settingChange 事件。
<input type="checkbox" name="downType2" id="setWorkType2" class="need_beautify checkbox_common" checked="">
<span class="beautify_checkbox"></span>
<label for="setWorkType2"> 动图 </label>
- 给 input 添加增加 class
- 添加美化的按钮元素,并给它添加 class
class | 说明 |
---|---|
need_beautify | 说明这个控件需要美化,css 会隐藏掉它 |
checkbox_common | 在普通的复选框上使用 |
checkbox_switch | 在作为开关的复选框上使用 |
radio | 在单选框上使用 |
class | 说明 |
---|---|
beautify_checkbox | 美化按钮表现为复选框 |
beautify_switch | 美化按钮表现为开关 |
beautify_radio | 美化按钮表现为单选框 |
对于可选的选项(可以选择启用或不启用的设置),应该统一加个开关。
以前的交互逻辑不统一,很混乱,现在进行统一。
- 有的没有加开关
设置宽高条件 ? 0 and or 0
用默认值为 0 变相起到了不限制的作用,但是没有加开关
- 有的把开关与条件并列了
设置收藏数量 ? 不限制 大于 1000
设置宽高比例 ? 不限制 横图 竖图 宽高比 >= 1.4
设置 id 范围
用“不限制”做开关,但是不限制和其他几个条件并列的,并不是真的开关。
- 有的比较合理,是 开关 + 条件
设置投稿时间 ? 开关 时间条件
这是因为这些选项是不同时期加上去的,想法不一样,而且也没有统一的标准。现在决定都改成开关+条件。
第二种情况里的 “不限制” 按钮之前是单选框,保存的值是其 value(字符串),现在改成了开关(复选框),值是 boolean。所以把“不限制”改为开关之后,需要给开关起一个新名字,不能沿用“不限制”的 name,避免与旧版本的已保存设置冲突。
例如:
设置投稿时间 ? 开关 时间条件
以前是把开关和设置项一起显示的,现在改为选项未启用时,隐藏后面的设置项。开关打开时再显示。
- 保存宽高条件设置。以前不会保存,从此版本开始会保存。
- 保存设置宽高比例。同上
之前作品页内切换图片查看器的事件没有进行解绑,导致某些时候报错,但不影响使用。现在修复。
图片查看器全屏之后,本该按一次 esc 退出全屏,再按一次 esc 退出查看器。
但是第一次按 esc 退出全屏之后,短时间内再按 esc 无效,要过一点时间再按。在这期间按键似乎不生效。不知道为什么。
3.9.5 版本检测页面里有用户页面链接 /users/ 则视为内容已加载,开始获取 pageInfo。一般来说没问题,但是有些页面内容里确实没有 /users/ (例如搜索页面结果为0的时候),这时候就会导致一直没有开始获取 pageInfo。现在修复了这个问题。
当检测到新版本时,点击更新图标会打开 Chrome WebStore 的安装页面。
之前是打开 GitHub 页面,现在改为 Chrome WebStore 页面。
用户页面的 url 改版之后,在这些页面 {p_tag} 失效了,进行修复。
把获取 tag 的操作统一放在了 API 里。
- 之前搜索页面“顶部”一栏的 url 是特别的,包含
/tags.php
,今天看了下没有了,所以把这个从判断条件里去掉了。 - 最近页面刚加载时,执行 getPageInfo 报错,因为此时页面内容实际还没加载。应该是 p 站最近又做了一些修改,对这个问题进行修复。
当使用 {p_title} 命名标记时,一开始下载时是当前页面的标题。如果下载途中跳转了页面,{p_title} 就变成新页面的标题了,这样就会产生两个文件夹。现在修改为一次下载中始终会使用一开始的页面的标题。
其实这个问题以前就解决过,可能前些时候重构又搞得复发了,现在修复。
上版本导致快速筛选功能出现在了不该出现的页面,现在修复。
今天发现用户页面 url 变了,而且似乎是短时间内就面向所有用户启用了。新版的 url 如下:
注意:如果设置了语言为英文,则会在主域名后多出 /en
- 用户主页
https://www.pixiv.net/users/3869665
- 所有作品
https://www.pixiv.net/en/users/4493551/artworks
- 所有作品带 tag
https://www.pixiv.net/en/users/4493551/artworks/Fate%2FGrandOrder
- 插画页
https://www.pixiv.net/users/3869665/illustrations
- 插画页带 tag
https://www.pixiv.net/users/2188232/illustrations/ghostblade
- 漫画页
https://www.pixiv.net/users/544479/manga
- 漫画页带 tag
https://www.pixiv.net/users/544479/manga/%E3%82%AA%E3%83%AA%E3%82%B8%E3%83%8A%E3%83%AB
- 小说页
https://www.pixiv.net/users/46678986/novels
- 收藏页
https://www.pixiv.net/users/3869665/bookmarks/artworks
- 收藏页带 tag
https://www.pixiv.net/users/9460149/bookmarks/artworks/FGO
- 收藏页非公开,带不带 tag 都是在最后加查询参数
https://www.pixiv.net/users/9460149/bookmarks/artworks?rest=hide
页眉换成了新的,导致头部没有之前的 header
标签了。对此做了适配。
这个问题还导致搜索页面的快速收藏没有插入,现在修复。
分离出了搜索页面的快速筛选功能,独立成 FastScreen 类。
现在代码细分了,切换设置显示表单的代码需要改改了。因为切换按钮在 CenterPanel 里,给它绑定事件却在 InitSettings 里。优化了此部分代码。
优化了 InitUserPage 抓取作品 id 列表之后的逻辑。
当 TitleBar 让页面标题闪烁之后,如果用户切换了页面,标题被重置了,则闪烁效果就出不来了。之前在此情况下,闪烁代码也不会停(虽然看不到效果了,但还在不停修改标题),现在在此情况下会停止闪烁了。
之前 DownloadControl 操作总下载进度条,Download 操作自身的子下载进度条。这部分的逻辑非常混乱,现在把下载进度条独立出了 ProgressBar 类,舒服多了。
以前在抓取完成后并没有重新生成子进度条,开始下载时才重新生成。这样有个问题,如果第一次下载完之后,修改了下载线程数量,并且没有设置自动下载,那么第二次下载就绪时,子下载进度条没有重新生成,数量就对不上新的下载线程。现在可以及时对上了。
下载时状态码出错时,如果是 404 则可以明确的提醒,其他的状态码目前无法处理。
之前,遇到无法处理的情况时会终止执行这个下载线程,等于这个下载线程“卡死”了。现在为无法处理的情况也添加了提醒,不会终止下载线程、卡住了。
之前的更新导致搜索页面“手动删除”模式中,每删一个作品,都会显示下载面板,现在进行修复。
但目前还有些其他问题,比尚未开始筛选时,点击清除多图作品、手动删除等,仍然有反应,这是因为这些按钮处于另一个类中,状态没有完全互通。等以后看怎么解决吧。
之前初始化一个页面是分两部分的,InitxxxxPage
初始化按钮,CrawlxxxxPage
初始化抓取流程。由于这两个部分是强耦合,有些地方需要直接交互;这两种类也不具有通用性,所以把它们合并了,现在都放在 InitxxxxPage
类里了。
搜索页面第一次筛选之后,之前不会在预览部分显示抓取到了多少个。现在会显示了。
以前不会记住此设置,现在记住了此选项。
以前只有一个输入框,输入的值等于 0 相当于不限制,大于 0 才限制。现在为了便于使用,为其增添了“不限制”或者“大于”的选项按钮,点击按钮即可更改限制状态。
之前书签页面的抓取不是一个独立的类,而是在用户列表页之内的,现在拆分出来,并分配 pageType 为 3。
今天发现收藏页面抓取带斜杠的 tag 时抓取失败,如 Fate/GrandOrder
,原因是重复进行了 encodeURIComponent
,现在修复了这个 bug。不清楚到底是何时开始出现的这个问题。
- 3.6.0 把右侧下载图标独立出来了,但是其执行时机放在了判断页面类型之前,导致即使是不支持的页面类型,也显示了下载图标。现在修复。
- 修复了搜索页面二次筛选时,修改多图作品设置无效的问题。
预览文件名时,如果文件数量很多,可能会导致页面卡住,很长时间无法操作。现在做了以下优化:
- 生成文件名预览结果时,使用数组储存字符串并
join
,代替用加号+
直接拼接字符串。 - 使用 for 循环代替 forEach(因为 for 循环的速度最快)
卡顿的主要原因不在生成结果上,而是结果输出到页面上之后,页面重新渲染卡住了(花费了过多的时间,并且之后的操作也一直很卡)。
- 使用 class 代替行内样式 (具体效果不是很清楚)
<span style="color:#999;">76371902_p0.png</span>
改为
<span class="color999">76371902_p0.png</span>
- 减少同级元素节点的数量
优化前,假设 3000 个数据,每个产生如下结果:
<span class="color999">xxx</span>
:
<span class="color666">xxx</span>
/
<span class="color000">xxx</span>
<br>
<br>
每个结果产生 7 个节点,把所有结果拼接在一起之后产生了 21000 个同级节点。渲染极慢。
优化后,每条结果使用 p
标签包裹这些细碎的标签,这样只产生了 3000 个同级节点。虽然总节点数量增加了,但渲染效率却极大提高了。
<p class="result">
<span class="color999">xxx</span>
:
<span class="color666">xxx</span>
/
<span class="color000">xxx</span>
</p>
并且,优化之前使用两个 <br>
标签换行来做间隔,优化后去掉了 <br>
标签,改为给 p
标签设置样式来做间隔。这样减少了总的节点数量。
现在,当预览文件名,以及输出 url 时,如果没有抓取结果可用,会显示提醒。
- 之前旧的作品页网址已经不再使用了,所以从判断条件里去掉了,如:
https://www.pixiv.net/member_illust.php?mode=manga&illust_id=70558528
https://www.pixiv.net/member_illust.php?mode=medium&illust_id=65953727
- 画师作品列表页的判断也做了修改,现在的列表网址如下:
https://www.pixiv.net/member.php?id=544479
https://www.pixiv.net/member_illust.php?id=544479
https://www.pixiv.net/member_illust.php?id=544479&type=illust
https://www.pixiv.net/member_illust.php?id=544479&type=manga
https://www.pixiv.net/member_illust.php?id=544479&type=illust&tag=xxx
- 搜索页面的旧网址也不再使用了,从判断条件里去掉了。
old:
https://www.pixiv.net/search.php?s_mode=s_tag&word=saber
new:
https://www.pixiv.net/tags/saber/artworks?s_mode=s_tag
- 时间:2020-01-01
- 浏览器:Chrome 79
- CPU:i3-6100
- 测试网址: Fate/GrandOrder10000users入り
- 数据量:24000 个图片结果
说明:
- 渲染耗时:从点击预览按钮,到页面可以操作的时间
- 复制耗时:从点击复制按钮,到复制完成的时间
- 时间向下取整,即后面可能有小数
命名规则:
{p_title}/{bmk}-{id}-{user}-{tags_translate}
- 渲染耗时:6 秒
- 复制耗时:3 秒
- 渲染耗时:2 秒
- 复制耗时:6 秒
上版本导致画师作品列表页的页数默认值变成了"1",现在改为原本的“-1”。
如果抓取结果太多可能会导致页面崩溃,所以可能有的时候需要关闭预览功能。
打开预览时,始终不自动下载。关闭预览时,会依照自动下载选项处理。
之前表单部分中间插入了第一排按钮,比较怪异(也让代码里更难处理相关部分)。现在把按钮都放在表单外了,也规范了其他一些操作,插入元素使用插槽来规范。
UI 类进一步细化,拆分成了 Settings 类、RightIcon 类、CenterButtons 类、CenterPanel 类。
之前有的选项没有编号,而且编号的顺序已经乱了,现在重排编号。
切换页面时先进行一次重置,显示所有选项,然后根据传入的选项,隐藏不需要的选项。
末尾的数字是该选项以前的编号
- 设置页面数量/设置作品数量 1
- 下载作品类型 5
- 多图下载设置 3
- 动图保存格式 12
- 设置收藏数量 2
- 只下载已收藏 11
- 设置宽高条件 4
- 设置宽高比例 13
- 设置 id 范围 15
- 设置投稿时间 16
- 必须含有 tag 6
- 不能含有 tag 7
- 设置命名规则
- 添加字段名称 10
- 始终建立文件夹 14
- 设置下载线程
- 是否自动下载 8
- 预览搜索结果
- 多图建立目录
对预览文件名做了优化,突出显示文件名,加大了每一条结果之间的间隔。
之前在排行榜页面“抓取首次登场作品”时,不会遵从“设置作品数量”,一律从所有作品(最多 500 个)中筛选。
现在起,抓取首次登场作品也会遵从“设置作品数量”了。这一影响很小,一般情况下用户不会察觉到差别。
3.5.0 时,新增了一个状态 notAutoDownload,该状态优先于“自动下载”选项,让下载器不会自动开始下载。但是当时没有在切换页面时重置它的值,导致如果一开始打开的是搜索页,设置了不自动下载,之后无刷新进入其他页面也会不自动下载。现在修复此问题。
修复了没有开始筛选时,直接使用二次筛选按钮,提示“下载完成”的问题。现在会提示先进行筛选。
另外,之前在筛选完之后没有改变标题上的提示,现在加上。
- 修复 bug
在普通的搜索页如 アズールレーン ,有两个作品列表,第一个是“熱門作品“列表,第二个才是要使用的作品列表。昨天测试时的页面没有“熱門作品“列表,没发现这个情况,导致出错。现在修复。
可以在搜索页面预览抓取到的结果,并且通过各种筛选按钮进一步缩小抓取结果,只保留喜欢的图片下载。
一个页面抓取并显示 4000 个作品,内存占用增加了 500-600 MB.
当作品数量较多时,进行筛选之后要重新显示作品,会有数秒的卡顿。
在获取作品列表完毕后,显示统一的提示信息。以前这部分比较乱,现在规范了。
版本号的增加是我自己决定的,但并非一直都执行相同的标准。所以现在定一下标准。
版本号分为三位。版本号的更迭应该以开发者角度(即代码层面的变更)为主,用户角度次之。这样开发者可以通过版本号的更迭知道代码是小改还是大改;用户只要知道新的版本号比旧的大就行了。
- 比较大的代码重构
- 后面小的版本号累积,到达当前大版本号上限
- 增删功能/选项,用户感受显著的
- 优化代码、适应改版等,导致代码有较多变动
- 修复严重 bug
- 增删功能/选项,用户感受不显著的
- 优化代码、适应改版等,导致代码有少量变动
- 修复不严重的 bug
- 优化文本
之前每个版本的主要更新项都是用列表 -
展示,但这样不利于再往下细分层级,有时候感觉不便。所以从此版本开始,改为用次级标题 #
号依次往下细分。
- 修复 {date} 标记的格式问题
3.3.5 版本导致 {date} 标记的月份、天数没有补上 0,现在补上。
修复前后如 12-1-1 -> 12-01-01.
- 优化下载出错时的重试功能
以前下载出错重试时,会暂停所有下载,然后继续下载。现在只会重新下载出错的那个任务,不会暂停所有任务,不会影响其他下载。
现在有两种重试情况。
-
Download 会重试从 pixiv 下载图片失败的情况,每个任务有最大重试次数。
-
DownloadControl 会重试浏览器下载任务失败的情况,让 Download 重新下载它,不限制重试次数。
- 其他修改
这个版本还取消了向浏览器发送下载任务时,每个之间 200ms 的间隔。目前测试没有发现问题,希望真的不会有问题。
- 优化代码
下载作品类型的 3 个选项,之前在代码里是把它们的结果合并成一个字符串,并且是取反。
如 √插画 ×漫画 ×动图
分别用 0 1 2
表示,保存“排除的类型”,结果为字符串 12
。
这比较反直觉,而且设置和保存这几个选项都比较麻烦。现在拆分成 3 个单独的变量,每个选项用一个布尔值保存。
- 404 问题重试下载
最近 p 站出现了一些图片下载返回 404 的问题,但再过一小会儿访问又正常了。普通的浏览看图也会有遇这个问题。Reinford 让下载器在 404 时进行重试,解决了个这个问。
- 可以设置下载作品的时间范围了
因为目前只有在获取作品详细信息时才有“createDate”数据,所以在获取作品列表时无法预先检查它。
// 示例网址
https://www.pixiv.net/artworks/78339797
// 原始数据是 UTC 时间
createDate: "2019-12-17T09:00:09+00:00"
// 网页上显示的是用户本地时间
2019年12月17日 17:00
December 17, 2019 5:00 PM
上面那样只是显示的不同,实际上是同一个时间。
用户输入的也是本地时间,但是和 createDate 比较时,不需要额外的转换,这是因为它们 js 内部比较时间(以及 getTime 方法)都会转换为 UTC+00:00 的时间。
- 优化代码
为保存 option 的一些操作创建了公共函数,使代码更简洁。
- 其他
{date} 命名标记之前是截取 createDate 的日期部分,也就是 TC+00:00 的,这次更新改成了本地时间,和网页上一致。
- 可以设置下载的 id 范围了
增加了“设置 id 范围”选项。
- 修复 bug
修复某些极端情况下,获取未分类书签数量错误的问题。
比如实际上有很多,但第一页的 20 个都是无法访问的,返回的数据就是空的。之前把“返回的数据为空”当作抓取完了,但是面对这个极端情况就会出错。现在修复了这个问题。
- 现在可以排除多图作品了
增加了“多图作品设置”选项。
- 限制动图同时转换数量
如果同时转换多个动图,会占用较多的内存和 CPU 使用率。有些用户在下载动图时因此出现页面或浏览器崩溃的情况。Reinford 提议同时只转换一个动图,为了程序的稳健性我采纳了这个建议。
其实设置下载进程为较小的数字,如 1 或 2,同时转换动图的数量不会超过下载进程,所以也不容易崩溃。但是有些用户只想着 5 线程全开,转换动图当然容易崩溃了。
- 修复文本错误
- 快速下载单图也可以创建文件夹了
在作品页内会显示这个选项:始终建立文件夹
,启用就会始终建立文件夹。
- 代码模块化
对代码的优化进行了一段时间,现在可以拆分为模块了。
- 优化图片查看器的体验
之前有时候点 1:1 全屏查看时,图片放大到 100% 后瞬间又变回来了。现在不停循环执行放大到 100%,解决此问题。
- 优化代码
使用发布者-订阅者模式进行了一些解耦。解耦之后类的封装性更强了,也更内聚了。有一些耦合比较合理的没有强行解耦,不然到处都是事件监听了。
消除了一些元素、变量开头的 “xz” 字样。剩下少数没有修改,是为了标识这是下载器的特有元素。
将 output 相关的代码从 ui 里挪到 Output 类里,更清晰。
将设置下载进度条相关的代码从 ui 里挪到 DownloadControl 类里,更清晰。
css 里的样式分类归纳了一下,不那么乱了。
下载后把 xhr 和 file 设置为 null *,试图让内存回收和本地缓存文件回收更快捷。但目前测试来看似乎一部分人的电脑上无效,一部分有效。不知哪种情况多一些。
- Reinford 测试发现 xhr 请求在下载大于 5 MB 的文件时,chrome 会在硬盘生成缓存文件,如果一个页面里下载了很多大文件,那么硬盘上会堆积很大体积的缓存文件,直到页面被卸载才会删除。把 xhr 设置为 null 可让 chrome 及时清理无用的文件。但目前测试结果不是所有人的电脑上都有效。
其他代码优化。
-
修复一些 bug
-
优化代码
把一些 public 的属性和方法改成了 private、protected,优化了封装,减少了不必要的暴露。
在需要的地方使用存取器,使得修改状态更加方便,相关代码易于管理。
也对其他地方进行了一些优化。
- 修复 bug
之前屏蔽广告添加的一处 class,现在变了位置,导致屏蔽了正常元素。修复之。
- 尝试当下载的文件名异常时,给出提醒
有些扩展接管下载导致本扩展下载后的文件名是 UUID 格式的,很多人问这个问题,现在找到了个检测此问题的办法,出现问题时在日志里提示。
- 修复 bug
上个版本随手修改出了 bug,还好及时发现,赶紧修复下。
- 修复 bug
有时候 pixiv 的搜索页面网址会出现语言标记。如下:
// 没有标记
https://www.pixiv.net/tags/Fate%2FGrandOrder/illustrations
// 有标记
https://www.pixiv.net/en/tags/Fate%2FGrandOrder/illustrations
之前的搜索页的代码没有考虑到有标记的情况,现在进行修复。
目前似乎只有语言设置为英语时会出现 en
标记。但也不是所有页面都会出现,现在测试了会出现 en
标记的页面有:
0
1
5
- 优化代码
把删除作品功能独立成了一个类。
InitPage 时指定了各自页面里抓取器的类型,这样不用把抓取器的所有属性都一股脑写到 CrawlPageBase 里面了。但是现在指定类型的方法似乎不够优雅。
- 加快搜索页面抓取速度
搜索页面从单个抓取改为 10 线程同时抓取。
抓取作品信息也从原本的 6 个线程改为 10 线程。
- 代码优化
优化下载器。
- 优化抓取流程
之前在作品页内向前、向后下载时,是先抓取当前 id 的信息,然后从中找到下一个要抓取的 id。像一条线一样依次抓取,每次都获取下一个 id。这导致了一个问题,如果某个页面抓取出错了,整条线路就断了。
这个抓取方式其实是历史遗留问题,早几年 p 站的作品页还是需要切换加载的,而且也没什么 API。现在对这部分抓取做了调整,在下载开始前一次性获取所有要抓取的 id,使得抓取流程不再怪异,也不怕某个页面抓取出错了。
抓取作品信息时,请求的并发数从 6 加大到了 10。这会使抓取速度有一定的提升,但是
- 图标改成 svg
这样更容易控制图标大小和颜色。
- 其他优化
- 修复 bug
修复了首页输入 id 抓取失效的问题。
修复了日志输出文本里的 <br>
失效的问题。
- 其他优化
优化了 API。一些之前直接传 url 的地方,改成了传参数。
优化了标题状态变动,减少重复调用的地方。
“新人排行榜“也支持“抓取首次登场作品”了。
- 适配搜索页改版
搜索页 url 改了,进行了适配。
- 优化快速筛选
当有多个标签同时搜索时,p 站现在默认是严格匹配,导致出来的结果很少,例如“Fate/GrandOrder 10000users入り”只有 14 个结果。所以我在快速筛选上添加了宽松匹配标记 s_mode=s_tag
,像以前那样显示更多搜索结果。
- 修复 bug
如果搜索页面有 1000 页内容,之前只能抓取 999 页,这是因为一处判断写的不对。现在修复。
- 优化日志功能
当开始下载时,自动清空上一次下载的日志,避免日志堆积太长。
追加日志从 innerhtml 改为 appendchild,以优化性能。(感谢 Reinford0)
- 代码优化
优化 API 类。(未完成)
- 抽象出了过滤器
过滤作品时不需要一个一个的调用函数检查了。现在把要审查的条件汇总起来,发送给过滤器审查即可。
- 优化了获取页面信息的操作
之前当切换页面时,之前页面的标记在新页面里没有,但是这个标记没有被清除。现在每次获取信息之前都会重置,修复了这个问题。
- 优化了文件名生成逻辑
之前存在一个问题,页面切换后,page 部分的命名标记的值会替换成新页面里的,但我们应该使用的抓取开始时的信息。如果切换了页面就使用新信息,会产生错误的结果。现在对此问题进行了修复。
解决办法是开始抓取时把页面信息储存在 store 里。
- 修复了用户 id 有时获取错误的问题
当从搜索页点击某个作品,无刷新进入作品页面后,抓取作品时发现用户 id 错误。这是因为页面网址变化时,下载器要去获取用户 id,但此时页面内容还没变,过一会儿才会变,这时就会获取到错误的 id。
解决办法是开始抓取时,再获取一次页面信息。
这样修改之后,一个页面里可能有多次 getPageInfo:页面切换时一次,之后每次开始抓取时也会产生一次。第一次可能是错误的,但不重要,它的作用是让下拉框添加有值的字段。后面的请求是正确的。
- 优化了重试机制
现在抓取列表页出错时也会重试了。
不过只对那些需要抓取多次的地方做了重试(需要抓取多次才能获取所有作品的列表时)。某些只需要抓取一次的地方没有重试,因为只抓取一次就出错的概率不高,遇到了的话手动刷新一下吧。
到现在为止,抓取列表页——抓取作品详细信息——下载文件,这一整套流程都有了重试机制,稳定性有所提升。
- 优化快速筛选功能
新的搜索页面可以无刷新切换 tag,之前快速筛选只会打开第一次加载页面时的 tag,如果后面 tag 变了,快速筛选没变,就很不合理。
现在改成了实时获取 tag,并且可以保留当前页面的 mode 字段。
- 记录
今天发现 p 站搜索页,一页显示的数量从 48 个增加到了 60 个,这样我们可以抓取到更多的作品了。
- 修复更新提示中,商店网址错误的问题
- 重新上架谷歌应用商店
因为担心继续用之前的名字,会通不过审核,所以改了名字:Powerful Pixiv Downloader。
删除了清单文件的 key 字段。一方面是上架扩展需要删掉它,另外它似乎也会导致 Chrome 重启后,离线安装的这个扩展被删除,需要重新加载。
通过商店审核后,在程序内增加了一些提示,修改了 wiki 和官网里安装部分的说明。
- 修复快速筛选在其他页面显示的问题
上个版本的修改导致快速筛选选项在切换到其他页面时也显示。现在修正这个问题。
- 优化日语文本
感谢 光の軌跡 改进日文翻译。
-
适配“大家的新作”页面
-
修复 bug
修复了筛选必须的 tag 的结果错误的 bug。
修复了抓取作品时设置 ajax 请求数会出错的 bug。
修复了连续使用快速筛选时,快速筛选标签一直累加的 bug。
发现页面的 class 变了,适配之。
- 一些优化
搜索页面“设置页面数量”的默认值,从 -1 改为了 1000(意思是下载所有页面),方便用户理解。 -1 依然可以使用。
但是有些页面的页数/个数是无法预先知道的,不适合用明确的数字,仍然用“-1”作为标记比较好。
修改了快速筛选的插入位置,使它能够稳定在顶部出现。之前因为 p 站页面动态加载,有时它显示的位置是异常的。
关注的新作品,大家的新作品 页面里,都添加了跳转到 R18 版本的链接。
- 修复 bug
修复了 收藏夹的“未分类”功能下抓取不到图片 的问题。这是因为重构导致对 tag 多包装了一层 encodeURI 导致的。实际上这影响了所有非英文标签,现在修改。
- 修复 bug
修复了转换 gif 失败的 bug
修复了用户在自己作品页时,快速收藏出错的问题(因为这种情况不会有收藏按钮)
修复了 pixivision.net 初始化时恢复配置失败的 bug
修复了中间面板的 html 缺少结束标记的问题
- 优化扩展
上个版本把日志区域添加到 body 前面去了,修正
把 css 加载放在了 content_scripts 里
去掉了 background.ts 里设置 referer 的部分,经过测试发现它现在没有必要了
给清单文件添加了 key,这样如果扩展有多个拷贝,加载之后只会在扩展管理里显示最新的那个,而不是每次加载都生成一个扩展。
感谢 Reinford 的帮助!
- 重构代码
之前的代码是面向过程编程,按照业务流程编写一个个的函数来解决需求。
现在尝试改为面向对象,抽象出一些类。
目前重构尚未完成,但是 p 站最近改了很多地方,所以只好先发布。
- 适配新版搜索页
由于新版搜索页不显示收藏数了,所以之前按收藏数过滤的功能不好实现,砍掉了。很可惜,不知道以后 p 站会不会加上收藏数。
-
修复了若干 bug,引入了若干新 bug
-
指导规则
- 抽象类
- 拆分成小的类
- 函数做了多件事的,拆分
- 使用异常替代返回错误码或者 false,避免后续判断。
- 使用依赖注入解耦。
- 优化命名规则
之前把一些特殊字符(标点)替换成下划线 _
,现在会把它们替换成对应的全角的字符,使用起来更方便。
\ \
/ /
: :
? ?
" "
< <
> >
* *
| |
~ ~
. .
注意:
- 点
.
的替换只限于路径首尾,文件名中间部分是可以有点.
的。 - 命名规则里的斜线不会替换(
/
到/
),因为这是作为(路径)文件夹分隔符的。 - 斜线的前后不能有空格,因为这样前后两部分是两个路径,路径的开头结尾不允许有空格。现在本程序会自动去掉路径首尾的空格。
即使像下面一样的命名规则也不会出错:
/\ / : ? " < > * | ~///" *{id}-| /?~{user}> * | -{tags_translate} ? " /
- 优化交互体验
现在鼠标经过界面上的按钮,按钮样式会有一些改变,增加舒适度。
- 优化日志功能
修复了一些颜色不对的地方
在日志上显示下载进度
转换文件时显示提示,避免分不清是在转换还是卡了
- 修复 bug
2.7.3 版本使用的变量 taskBatch 有个问题,刷新页面后重新从 0 计算。如果下载时刷新了页面,后台储存的标记是 0,刷新后再下载又是 0 ,就会被认为是重复下载,导致下载无法继续。现在修复这个问题。
- 隐藏一些广告
隐藏 tag 搜索页的广告位
- 修复了 “给未分类作品添加 tag” 功能
之前一次获取 999999 个未分类作品,进行处理。现在 p 站改了,一次只能获取 100 个,需要多次获取。修复了因此引发的问题。
- 优化了输出日志的功能
支持颜色,使用起来更加规范,加强代码的可维护性。在此过程中优化了一些文本。
- 添加后台的错误处理
当 Chrome 后台下载失败时,向前台返回消息,输出错误信息。之后前台会尝试重新下载。
- 加强检验
在首页输入 id 下载时,用 Set 结构过滤掉重复的 id
- 优化下载流程控制
感谢 Reinford0 的帮助和测试。
因为前后台通信的延迟不稳定,有时可能超过 1 秒,所以在处理遗留任务时,不再依赖前后台通信来解决,而是在后台储存任务列表。如果前台发送的任务在后台已有记录,则不进行处理。这样就杜绝了多次下载同一个文件,以及因此引起的弹框问题。当前台重新开始下载时(多次下载,或者停止后重新开始),后台重置任务列表。
去掉了上个版本增加的延迟。
对动图转换之前,也会判断任务状态,避免不必要的转换。
- 优化界面
把中间部分的按钮从 div 改成了 button,可以 tab 到了。
- 优化文件名截断处理
在 chrome 77 版本中测试,发现 chrome 会自动把超长的文件名截断,这样能尽可能地让文件名使用更多的字符,非常不错。所以本程序不再对文件名进行截断了,而是交给 chrome 处理。
另外,如果设置了创建文件夹,那么文件夹的长度对文件名是有影响的。尽量不要让文件夹长度超长(不过本来也很少会超长就是了)。
chrome 是不会截断文件夹名的。
- 如果文件夹名字的长度没有超长,chrome 会先建立文件夹,之后把文件名截断到可用的最大长度,正常保存。
- 如果文件夹名字的长度超长,会导致 chrome 无法创建文件夹(如果有多层文件夹,chrome 先尝试正常创建文件夹,直到某一层无法创建为止)。之后 chrome 会弹出另存为对话框,定位到 chrome 的下载目录,让用户保存文件。这时候 chrome 会把文件名截断到 255 长度(如果没有超出 255 则不截断),而不是截断到实际可用的最大长度。这时候能不能保存成功就看文件名实际有多长了。
- 优化下载流程控制
这部分感谢 Reinford0 的帮助和测试。
现在,当用户点击暂停或者停止时,扩展后台会把后台进行中的下载任务取消掉。
这样,不需要在前台识别遗留任务了,流程更加简单不易出错,而且,这也很大程度上避免了弹出另存为对话框的问题。
弹框问题是 chrome 77 出现的,两次下载同一个文件时,如果完成的时间间隔很短,可能会弹出另存为对话框,而不是预期的覆盖文件。猜测是这时两个文件都没保存完,也就没法覆盖了,但它们却是同名的,所以就弹框让用户处理。以前版本怎么没有这个问题呢。
为了更加彻底的杜绝弹框,这次更新还把之前去掉了的 canStartTime 加回来了,就是在暂停、停止之后,过一段时间才允许点击下载按钮(现在是 500 ms)。这样把时间间隔加大,就不会容易出现弹框了。
- 代码优化
getQuery
函数查询 url 里的搜索字段,之前是自己编写的方法,现在使用 js 的 URL 对象查询。
- 添加一些提醒文字
提醒命名规则里一定要带 id。有的人没有使用 id,只是用序号,导致文件名重复,互相覆盖。
提醒 id_num 标记的特点,每个作品都会重新计数。
- 修复 bug
新版 url 可能含有语言标记,如
https://www.pixiv.net/en/artworks/77019145
之前没发现这个问题,会导致看图器加载失败,现在修复。
- 新增 {type} 标记
新增 {type} 标记,保存作品类型(illustration、manga、ugoira)。
- 加大了命名规则输入框的宽度
- 修改 css
修复不显示“其他作品”区域的问题
- 修改 css
前段时候加了对元素 .jkOmHE
的屏蔽,隐藏它的广告。现在这个 class 被用到头像区域了,导致头像区域被隐藏,现在去掉对它的屏蔽。
- 修复 bug
修复了上个版本没有在新版页面启用图片查看器的错误
- 优化命名规则
- 适配作品页面新的 url 格式
现在新版 url 格式如下:
https://www.pixiv.net/artworks/76898963
- 优化重试功能
之前,重试功能在有多个下载进程同时出错时(如断网),可能导致用户手动的暂停和停止不能停止重试。现在修复这个问题。
- 修改了头部注释
- 修改安全文件名的规则
- 去掉了对单引号
'
的替换。之前有段时间,chrome 不允许它用作文件名,现在测试可以了,所以不再屏蔽它。 - Reinford 测试出了不允许做文件名的字符,这次都添加进去,希望以后不会再被特殊字符所困扰。
- 修改了右侧下载按钮的样式
把背景从纯色改为了渐变。
- 支持了未登录时的下载
pixiv 最近支持了未登录也可以查看很多页面。我看到公告后支持了一下,目前支持未登录时,下载作品页内、作品列表页、排行榜、tag 搜索页。但是 tag 搜索页未登录时不显示收藏数,所以按收藏数筛选必须设置为 0。
- 添加向前下载功能
以前在作品页内,只能从本页向后抓取,这次添加了向前抓取功能。
- 修复了在手机浏览器上使时,下载出错的问题
- 上线了官网
- 优化了重试的逻辑
以前重试时,用户手动暂停、停止任务不能阻止程序继续重试。现在改为可以取消重试。
- 添加了一个特殊字符
\u0009 " " issues 25
- 获取作品信息出错时可以重试
如果因为网络原因(断开、超时),导致获取作品信息的请求失败,会进行重试。
getIllustData 出错时会通过 reTryGetIllustData 重试。间隔时间为 2 秒。
- 更改了目录结构
优化了项目结构和打包流程
- 添加检测更新功能
因为现在从应用商店下架了,所以在 GitHub 上发布,并使用 api 检查更新。
- 修复 bug
上个版本的修改导致从 pageType 1 进入 2 时出错,现在修复。
- 优化文件名截断处理
对于带文件夹的文件名,本程序会将文件夹和文件名的字符合到一起计算长度,如果长度超过 200,则截断。
但是快速下载时,有时是不需要创建文件夹的,此时应该只计算文件名的长度。之前这里仍然计算了文件夹的长度,现在我发现了这个问题,修复之。
有时候文件名长度并没有超过 200,但是加上文件夹长度超过了 200,导致文件名被截断。很可惜。
- 新增功能
排行榜页面可以设置下载前多少张,并且增加了 {rank} 命名标记保存作品的排名。
- 新增功能
可以下载自己书签页面下方推荐的作品。只下载已经加载出来的。
目前的观察,当没有选择 tag 的时候,最多会加载 100 个。如果有选择的 tag,最多会加载 500 个。目前根据用户的需求,只下载页面上已经加载出来的,而不是下载从 api 获取的全部作品。
下面是从 api 获取数据的代码。
// 从包含数据信息的元素中匹配
const element = document.querySelector(
'.layout-column-2>script'
) as HTMLScriptElement
// 取出 sample illust 列表
const text = element.innerText.match(/"(.*?)"/)!
const sampleIllusts = encodeURIComponent(text[1])
// 拼接请求的 url
const url = `https://www.pixiv.net/rpc/recommender.php?type=illust&sample_illusts=${sampleIllusts}&num_recommendations=100`
// 发起请求
const response = await fetch(url)
if (response.ok) {
const recommendations: Recommendations = await response.json()
const idList = recommendations.recommendations
}
- 修复 bug
- 修复了下载收藏的“未分类”标签时,下载的是所有书签作品的 bug。 issues 24
- 修复了重复抓取时可能把 title 错误截断的问题。
- 优化体验
之前下载停止后,如果仍然有下载到文件,已下载数量会从 1 开始算,看起来觉得诡异。现在优化此处,停止时不清空之前的下载数量。
- 修复 bug
有的图片的静态图是 gif 后缀的,会被扩展当作要转换成 gif 图片,导致出错。现在修复了这个 bug。测试 id 76764342。
2.4.0 里,加了一个功能,如果当前页面不是 p 站页面,则打开 p 站页面。但之后被 Google 人工审核,判定扩展违法,被下架。
之后我去掉了这个跳转功能,重新发布扩展,但又被下架。并且我的开发者账户也被停用。
到底是什么意思呢?我搞不懂了。
两次通知邮件的内容一模一样,都是例行公事的那种,并没有提到具体是哪部分的问题,我也没有途径和他们取得联系。
Your item did not comply with the following section of our policy: We don't allow content that contains nudity, graphic sex acts, or sexually explicit material. We also don't allow content that drives traffic to commercial pornography sites. Google has a zero-tolerance policy against child pornography.
翻译:
您的商品不符合我们政策的以下部分:我们不允许包含裸露,图片性行为或露骨色情内容的内容。我们也不允许内容为商业色情网站带来流量。谷歌对儿童色情制品采取零容忍政策。
扩展本身是没有任何色情内容的。如果说下载 pixiv 内容就是色情行为,为什么其他 pixiv 下载器都没事呢?
反正,我已经不想再和谷歌折腾了。它爱咋样就咋样吧。
修复 bug issues 21
- 屏蔽了一些广告
- 减小了重试下载的时间间隔(现为 1 秒)
- 修改了对图片 url 的权限
之前匹配的图片 url 是 i.pximg.net
,但今天发现有些人的前缀不是 i,而是 tc-i
,所以修改了此处。
- 代码优化
优化了一些代码逻辑,并修复了一个存在了很久的 bug。
这个 bug 以前的表现是:点击暂停后快速点击开始,这样下载完后可能会发现有一些图片漏下。越是多次这样操作,漏的图越多。
之后我加了延时,暂停后过一段时间才允许点击开始,其实也能杜绝这个现象,但这终究只是“治标”。
今天又想到这个地方,想通了问题在哪里:
以前,当一个文件下载完成后,downloaded + 1。然后根据 downloaded 判断是否全部下载完成。
但是用户暂停了任务时,有的任务处于【已经接收完文件,发给浏览器下载,但还没有最终下载完成】的状态中,还没有增加 downloaded。
在这个过程中,用户又点击了开始,这些未完成的任务又要下载。新一轮的下载中,刚才那些还没下载完成的任务下载完了,downloaded + 1。但新一轮里又把它们下载了一次,downloaded + 2。
也就是说,一个这样的任务就会导致 downloaded 增加 2。这样的 downloaded 是错误的,当程序判断 downloaded 等于要下载的文件数量时,认为任务下载完毕了,但其实这样的任务占用了两倍的次数,实际上文件并没有下载完,最终表现为漏下。
以前加的延时是 2.5 秒,大于【从接收完文件,到浏览器下载完】的所需时间,所以解决了问题。但最近的版本加了转换动图的功能,接收完文件之后还要转换很久,估计这个延时在这种情况下又会失效。
现在从根本上解决了问题,不是每次下载完之后 downloaded + 1,而是根据下载任务的状态列表计算 downloaded。因为多次下载同一个文件,在状态列表里计算也只是一个,不会导致 downloaded 增加多次。这也体现了状态列表的重要性。
- 代码优化
优化了一些代码逻辑,进行了一些解构。
- 修复 bug
2.5.0 版本修改标题时,一处正则是贪婪匹配,现在修正。
// mode=big 类型在 pc 端可能已经消失了,但是移动端查看大图还是big https://www.pixiv.net/member_illust.php?mode=big&illust_id=66745241
- 重新在应用商店发布
之前版本因为跳转到 p 站的功能被下架了,只能重新发布。导致安装页面的 url 也变了。
- 去掉打开 pixiv 页面的功能
2.4.0 里,加了一个功能,如果当前页面不是 p 站页面,则打开 p 站页面。但之后被 Google 人工审核,认为此行为是把流量导航到色情网站,判定扩展违法。
现在去掉这个功能。
- 修复 bug
优化了对零宽字符的替换处理。issues 20
- 新增功能
批量下载动图时转换为 gif。
- 修改文本
设置作品类型 改为 下载作品类型。
- 修复 bug
修正了设置 title 是导致的一处问题。设置 title 时尽量使用的是 og:title,但是有些页面上,og:title 的内容和实际的 title 不一致,这时候就不能用 og:title。
- 修改下载线程数限制
最大下载线程数限制从 10 下降到 5 了。这是因为最近加了动图的转换功能,如果同时转换很多文件,资源占用太大。为了防止一些人不懂得减小线程,所以做此修改。
- 修复bug
2.4.0 版本把宽高比的输入值用 parseInt 解析了,导致出现 bug,现在进行修正。
- 优化了在 title 上添加提醒的代码
优化了此部分的逻辑。但是有了新的问题。之前用了一个变量保存旧标题,切换页面后可以保持标题不变,但也会导致标题一直是旧标题。现在修改后去掉了这个变量,所以切换页面之后,标题会变成新页面的标题。下载途中切换页面就会导致标题变成没有提醒的了。
- 修复了 pageInfo 的 bug
上个版本造成了 bug,现在修复,并优化这部分的逻辑。
命名
- 使用了 typescript
- 点击扩展的图标时,如果当前页面不是 p 站页面,则打开 p 站首页
- 之前把 viewerjs 的 js 文件和 css 文件混合了,现在拆分开。
- 修改了一些代码
略微优化了文本和样式。
- 新增 {date} 命名标记
作品的创建日期,格式为 yyyy-MM-dd。如 2019-08-29
- 多图作品设置 改为 设置作品张数
相应的也把设置里的变量名改了(xzSetting.imgNumberPerWork),如果是之前版本升级上来的,没有这个属性,则设置为默认值 0.
- 改善下载逻辑
下载时,文件接收完成之后还要一段延迟时间才会让浏览器下载,浏览器下载完成又要一段时间。之前,如果在这两个时间段里停止了任务,还是会继续下载已经就绪的文件,以及显示下载进度。现在优化了这部分的逻辑。
- 代码优化
优化了一些变量名和代码结构。
有用户报告说 pixiv 有一些图片的源文件可能损毁了,图片是 404 的。例如:
以前没遇到过这个情况,这会导致下载器卡住、不停的重试。现在针对这种情况做了改进:
- 在页面顶部的输出信息里添加提示
- 创建一个 txt 后缀的文件,内容是提示这个文件不存在。
- 修改了一处文字
- 略微修改下拉框的样式
- 网络较差时自动重试下载
当网络状况较差时,下载可能会因为超时、断开而卡住、出错。现在本程序检测到出错时会自动暂停下载,并在一定时间后尝试继续下载(目前的设置是 20 秒)。如果问题依然存在,会一直进行尝试。
- 代码优化
- 修复和优化暂停、停止下载时的状态变化。
- 抽离出下载相关的方法,方便调用。
- 删除已经无用的 timeDelay 变量。
- 修复 bug
- 当一个下载进度条开始它的第二个下载任务,但还没有收到响应时,应该显示为初始状态。之前在这个阶段会停留在上一条任务的完成状态,现在修正。
- 解决漏下问题。以前用 downloaded 作为下载时的索引,但这是不可靠的。网络较好的情况下没有问题,但是网络差卡住时,频繁暂停、继续下载,就会暴露出问题,导致一些图片漏下。现在新增了 downloadedList 保存任务的下载状态,修复了这个问题。downloaded 只作为已下载数量使用。(因为下载任务的完成顺序并不是按添加顺序的,假设 downloaded 为 5,而已下载的是 1、2、3、4、6,暂停后使用 downloaded 作为索引,则应该下载 6,这样就漏下了 5,重复下载了 6。
- 更新了新版本的提示。
- 优化代码
- 之前 changeWantPage 里隐藏页数设置时,没有使用 hideNotNeedOption。现在将其改为通过 hideNotNeedOption 处理。
- 预览文件名时,之前动图的左侧不是原文件名,现在修正。这样是为了方便用第三方下载器的用户下载后,用预览文件名的结果进行重命名。不过修改后 pixivision 里预览时左侧可能会有一些后缀名与真实后缀名不符,暂且忽略。
- 之前计算文件的体积时,是把字节数除以 1000 作为 KB,现在改为 1024。并且小数部分的处理改为向下取整,因为 Windows 在显示 100 KB - 1 MB 之间的文件的体积时,就是向下取整的(如计算结果时 119.66 KB,Windows 显示为 119 KB),为了保持一致本程序也向下取整。
- 当下载暂停或停止时,使用
xhr.abort()
中断下载请求。之前没有中断,网络请求其实是在继续的。 - 两次下载任务之间需要一定的间隔,现在优化了此部分的逻辑,并且把间隔值 time_interval 调小。效果表现为略微加快了建立任务的速度。
- 抓取页面时的并发连接数从 5 增加到 6,并且取消了每个请求中间的间隔。
- 优化了给未分类作品添加 tag 时的逻辑,改为单线程依次添加(之前的方式可能造成网络堵塞)。
- 取消了一些不必要的 setTimeout 定时器。
- checkWhatIsNew 只在 pixiv 检查,避免在 pixivision 也会弹出一次。
- 优化文本
- 抓取部分的按钮里的“下载”改为“抓取”,避免用户理解上的困扰。
- 英文的“输入”从 enter 改成 type。
- 删除已经不再使用的文本。
- 疑问
Chrome 的 HTTP 并发连接数最大为 6,但是当下载线程大于 6,比如设置为 10 的时候,看 network 面板似乎也是可以同时进行的?
- 优化一些样式
优化了一些布局问题。之前一些英文、日文按钮因为文字较多会产生换行,导致按钮的高度不一致,很难看。现在使用 flex 调整布局。
- 日文的下载控制按钮文字翻译为日文
原本因为日文太长用的是英文,如“pause download”,现在改成日文。但是日文好长啊。
-
折叠面板的两个三角形对调回去了。
-
更新了 readme 里的截图。
- 修复 bug
上次的修改出了 bug,因为 getIllustPage 里的 illustType 是数字,其他 api 里的是字符串。上次修改时把这里当成了字符串判断,导致动图下载异常,现在修复。
- 调整了主面板上各个选项的顺序
按照功能分类和使用频率,重新排列了一下选项的上下顺序。
- 记忆了折叠设置
主面板右上角的三角形可以折叠/展开选项区域,因为有用户想要记住设置,现在记忆了这个选项。
顺便对调了两个三角形。
- 修改排除作品选项
以前“下载作品类型”的选项是“单图、多图、动图”,现在改为“插画、漫画、动图”。
- 新增命名字段 {tags_translate}
有一些 tag 后面跟的有翻译后的 tag。使用 {tags_translate} 命名规则,会自动在原 tag 后附加翻译后的 tag(如果有的话)
- 新增 what`s new 提示
如果版本更新时需要对用户进行一些提醒,可以在lang.js 里添加一条提醒,并把 whatIsNewTag 设置为这个键值。
- 优化抓取流程
在多种页面类型里,在抓取列表页阶段直接检查一些设置,尽量避免抓取到不需要的作品。
- 其他优化
解耦了一些函数,优化了多处代码,优化了一些逻辑,消除了一些 bug。
加大了中间面板的层级,避免被某些页面内容挡住。
- 版本号顺延到 2.0.0
最近频繁的进行了一些修改和优化,版本号也走到了 2.0.0。以前的努力,全部没有木大,所以说,不要停下来啊!
- 优化排行榜页面的抓取效率
在抓取列表页时直接检查宽高和宽高比设置,避免抓取到不需要的作品。
- 优化代码
之前一些使用中括号来引用对象属性的代码,现在改成点 .
的写法。
一些可以用 dataset 获取的 DOM 属性都改成了用 dataset 获取。(之前有的是用 getAttribute 方法获取的)
- 发现了一个小问题
当进入自己的收藏页面时,本程序隐藏了“只下载已收藏”选项,因为自己的收藏页面里都是已收藏的作品,这个选项没有意义。
但是因为没有区分自己的收藏页面和别人的收藏页面,所以如果直接进入别人的收藏页面,也会隐藏这个选项。如果之后再切换到这个人的“插画”、“漫画”页面,也不会显示这个选项。(因为这些页面的切换是无刷新的)这时就不正常了,因为在“插画”、“漫画”页面应该显示出这个选项。
但是这个问题很少发生,因为一般都是直接进入别人的主页,或者插画分类页面,不会直接进入别人的收藏页面。如果发生了这个情况,刷新一下页面即可解决。所以此问题目前并未处理。
- 在排行榜页面,增加了 “只要首次登场” 按钮
只下载首次登场的作品
- 在排行榜页面,优化抓取流程
在抓取列表页时可以获取 tag,所以在这里就检查了一遍 tag,避免抓取到不需要的作品,浪费之后第二次检查的时间。
- 考虑到转换动图会消耗较多的资源,将默认的下载线程数从 6 降低到了 5。
- 之前在 pixivision 忘记隐藏动图保存选项了,现在隐藏它。
- 隐藏了一处广告。
-
添加了将动图批量转换为 webm 视频的功能。
可以设置将动图保存为 webm 视频还是 zip 源文件。取消了之前单个转换成 gif 的方式。 添加了相应的设置项。 踩了好多坑,花了好多时间 Orz -
tag 筛选不再区分大小写了
-
tag 搜索页在筛选阶段也可以应用 tag 筛选的条件了
-
优化了扩展的文件结构,独立出了语言配置文件
-
优化代码,修复 bug
在界面上加入了 wiki 的链接。
-
pixivision 的默认命名规则加上了文件夹部分
pixivision 的规则原本只有 {id},没有文件夹部分,现在加上了默认的 {p_title} 作为文件夹名。 -
代码优化
优化了部分变量名; 取消了发现页面的 “清空作品列表” 的按钮。
-
完善了下载“相关作品”的功能
这个相关作品指的是作品页面最底下的相关作品,最多有 180 个。以前下载相关作品时,实际上走的是 pageTpye 9 的流程,这样获取的数据和作品下面的并不一致,只有一部分会是一样的。现在改成和作品下面的完全一致了。
不过有个缺点,就是之前的方法可以获取很多个相关作品(甚至 1000 个),但现在由于作品下面是固定的 180 个,所以最多也只能下载 180 个。
相关作品列表的排列大致上算是按 id 从大到小排列,新的显示在上面。不过也并不严格,比较混杂。
当用户设置了只下载一部分时,本扩展会把 id 列表页从大到小排列,截取最前面的一部分。我严格了,p 站自己不严格,没办法。
-
放弃对 Firefox 的支持
在 1.3.0 版本由 z2n 添加了对 Firefox 的支持,而在最近的 1.8.0,因为一些修改,不支持 Firefox 了。我发现这个问题之后,进行了探究,结论是,由于本工具的下载机制,与 Chrome 相比,在 Firefox 下载是低效率、高资源占用的。经过一番思索后,我没有恢复 Firefox 的支持,希望大家使用 Chrome 带来更好的使用体验。这和 Firefox 的安全策略有关,我来解释一下原因:
在前台页面下载到了图片的数据,是 Blob 对象,之后生成一个 blob url,发送给后台下载。这个 Blob URL 类似于这样:
blob:https://www.pixiv.net/3424182d-6c92-4307-a88e-ef9c302c9b90`
Chrome 可以正常下载,Firefox 却报错,因为安全原因不允许下载。Firefox 要求这个 url 是要在后台页面生成的才行。
问题来了,要在后台页面生成 url,首先要把图片数据传给后台,但给后台传递的消息是 JSON 对象,blob 对象无法直接传递,只能转换为 Base64 再传给后台,后台再换换成 Blob,生成 Blob URL 下载。
所以,为了传递这个数据到后台,在 Firefox 上要把 Blob 先转到 Base64,后台再转回 Blob。这一套左右横跳不是没有代价的,内存和 CPU 资源占用都将极大增加。下载速度稍快,用户操作电脑就会感到明显的卡顿。之前支持 Firefox 的时候就是这样的,所以现在我也不打算恢复了。别问,问就是 Chrome 体验更好。
Chrome 上:
Blob 对象 → Blob URL → 后台 → 下载
Firefox 上:
Blob 对象 → Base64 → 后台 → Blob 对象 → Blob URL → 下载
太蛋疼了。
-
修复 bug
修复了第一次点击扩展图标时,中间区域应该显示却没有显示的 bug。
-
文件的换行方式都换成 LF
我本地的代码和 GitHub 上的代码统一了换行方式。之前本地代码文件是 CRLF 换行方式,现在改成 LF。这一点在 GitHub 看不到区别,因为 Git 会自动把提交的文件的换行方式改成 LF。
- 优化代码 ?
这次更新把 css 样式从代码中抽离成了单独的文件,在代码中通过网络请求引入。这个地方就很奇怪,在画师页面、作品页面等无刷新加载的页面里,加载样式文件只需要 20 ms 左右,然而在其他页面里,可能需要高达 200 ms。加载样式时代码是停止执行的,所以我这次代码优化算不算是优化?
本来我还打算把语言配置单独保存成未见,看来加载的延迟是个问题,语言配置就先不改了。
-
修复 bug
修复了从画师主页、列表页、书签页进入作品页时,图片查看器有时不能使用的 bug。 -
优化代码
gif、zip 库的 worker 文件通过 fetch 引入了,不在硬编码到 content.js 里了。
-
代码修改成 standard 风格
变量名都变成了驼峰命名规则,所以之前用户设置过的选项需要重新设置。 -
优化了下载时的资源占用
之前下载时,会把图片数据从 blob 转换到 base64,再转换到 blob。现在没有这个转换过程了,CPU、内存资源占用将会大幅下降。 -
修复了一些 bug
修复了 puser 在某些情况下获取错误的问题。 -
完善了注释
-
下载书签作品时会倒序下载
之前也有一些对下载顺序的处理。画师的列表页里,会按 id 从大到小下载,这样可以先下载最新作品,后下载早期作品。tag 搜索页里则是按收藏数从高到低下载(都是通过 sortByProperty 对数据进行排序的) -
移除了 url 里包含 recommended.php 的情况,它是首页的“为您推荐”栏目,现在已经被“发现”页面取代了。
-
加粗提示了文件名乱码的问题
近期打算写个 wiki。
p 站代码又变了,获取画师名的代码做了相应的修改。现在其实是更简单了,挺好的。
优化了获取 token 的方式,添加 tag 的按钮可以在书签页直接出现了。之前需要先用一次快速收藏才会出现这个按钮。
优化体验。之前在一些非书签页也会显示添加 tag 按钮,现在限制在只在书签页显示。但目前有个问题,在别人的书签页里也会显示。
在书签页面,可以给“未分类”的书签批量加上 tag。这样可以节省大量的时间。
快速下载时,如果只有一个文件,则不建立文件夹。如果大于一个图片,则建立文件夹。
-
优化繁体中文文本
-
修复快速收藏功能,感谢 yuzhan1990。
- 对合法的文件名的规则进行修改
现在的 Chrome 下载扩展 API 不允许文件名里含有~
了,所以增加了对此情况的处理。
另外增加的∋\
是一个特殊字符,有时候会遇到,它没有宽度。它会导致 chrome 下载文件时报错,文件名不合法。
画师作品列表页带 tag 时的 api 发生了变化,修改之。
-
添加了 {p_num} 标记,也就是图片的 p 数。
-
因为格式化程序的改变,函数名和括号之间增加了空格。参数列表的逗号后面也加了空格。
-
css 优化
-
其实主要原因是 Firefox 扩展被下架了,补充了一些隐私政策等信息,提交新版本进行审核。
-
更新了 readme 里的捐赠信息,之前放的博客链接,但是需要翻墙才能打开。所以现在直接放图片了。
- 修复 getUserName 的 bug
之前从 dom 里获取,但是这样 p 站一改版就出问题,所以还是从 api 获取比较好。所以添加了 getIllustInfo 函数。虽然可能会多次调用它,但是有缓存,所以问题不大。
-
css 优化
-
查看多 p 图片的页面 示例 并不能进行下载,但之前显示了下载图标,现在去掉
-
增加了 id_num 命名字段
-
停止下载时添加时间间隔。
p 站最近在 tag 搜索页的 R-18 分类里,增加了广告信息,导致抓取出错,现在修复这个问题。
修复 bug
-
优化文本
-
修复 getUserName 的 bug
之前 getUserName 会使用 old_title,这是有问题的,不同语言的 title 不一样,导致严重错误,英语语言下完全无法下载。现在修复了。
-
修改了右侧按钮样式使其更加明显
-
添加了建立文件夹的提示
-
优化日文文本
fix the notation of some of the Japanese.
-
在 sortByProperty 里把参数都转换成了数字。
之前传入的参数是字符串,按首位比较的,不准确。转换成数字以保证结果准确。 -
暂停和继续下载添加定时器。
如果点了暂停,然后点开始继续,中间间隔时间很短,可能会出问题。所以加上了延时。
文件名标记里有些值是数字(如 bmk),导致 replace 报错 once.replace(safe_fileName_rule, '_')
。现在统一转换为字符串,避免错误。
修改命名规则后,快速下载也会建立文件夹了。现在修改成不建立文件夹的状态。
修复动图额外建立了文件夹的问题。
添加命名规则的示例。
原样保留空字段,放到文件名里.
-
合并文件夹和文件名输入框
-
优化文件名生成逻辑
-
接受重复字段,去掉空值字段
-
优化一些文本描述和用户体验
-
修改了扩展的 logo 和应用商店的封面图。
-
增加提示:禁用其他下载扩展。
-
互相检测使标识不同
-
ex 不判断 Firefox
合并代码之后要搜索 Firefox 删除
-
ex 不判断 allowFolder
-
ex 中间面板没有安装扩展的提示
相关 css 代码也不同
github 的 url 不同
设置文件夹哪里没有“如何使用” -
ex 转换 gif 代码不同
initViewer() 里面不同
-
ex 设置 history _wr 方式不同
-
ex 获取 tt 不同
-
ex 获取用户名时判断登陆的代码不同
-
下载时
不判断 GMinfo,不使用 GM_xmlhttpRequest
dataurl 和 bloburl 不同
要单独处理这里的改动,以及 startDownload() -
ex 多了 readBlobAsDataURL()
-
ex 多了 browser 相关代码
同步了脚本版的修改。
每次脚本版的大改,要再同步到扩展版里都很麻烦,因为两者的代码只是部分通用。
之前上架 Mozilla 扩展时,因为 jQuery 源代码过审没通过,遭到下架。我也想不明白是为什么。现在去掉了 jQuery,可以尝试再次上架了。
Firefox 的扩展要求提供第三方库的说明
Viewerjs-mix.js Javascript part
Viewerjs-mix.js CSS part
-
感谢 z2n 对本工具做出的改进,使本工具适配了 Firefox 浏览器。
-
因为 Firefox 扩展的规定,使用的 jQuery 版本必须大于 3.0,所以升级了 jQuery 库。
-
优化了获取 token 的方式,使其更加稳定。
-
Firefox 在内存占用方面的缺点:
当下载的文件数量比较多的时候,Firefox 所需的内存占用量比 Chrome 略大。
而且下载完成后,Chrome 的内存占用很快回落到一个稳定水平,Firefox 的回落速度却明显比较慢。
以上两点可能导致 Firefox 在下载大量任务时,内存占用过多导致卡死。
上个版本出现了 bug,改回上上版本的内容。
点击扩展图标可以显示/隐藏下载面板
上个版本里,把 time_interval 改小了,结果出现了问题,极少数图片会下载重复,并且重复了几个,就会有几个正常图片下载不到,就像被“挤掉了”一样。于是把 time_interval 改回去了。
time_interval 这个参数是半年前加上的,可参考脚本版 log.md 的 5.1.0 条目。简单来说,可能是连续两个下载任务间隔时间很短的话,会导致有一个保存不上。这个参数人为的增加了延迟。
但是很奇怪的是,当初脚本版出现这种情况会导致漏下,如今扩展版的异常不是漏下,而是变成重复了,其中原因不清楚。
我不能确定这个问题是否真的是由 time_interval 导致的。因为目前这个问题仍然偶尔出现。问题总是出在前几个作品里(10 个以内),里面有 1 或 2 个重复的,并且导致有其他作品漏下了。
最近的测试里,每批 400 张图片,下载了 4 次(1600 张),出现了 1 个重复的图片。
我觉得下载越快(浏览器处理不过来),越容易出现这个问题。解决的办法可能需要继续增加 time_interval 的延迟,或者(并且)减少同时下载的线程数。但是这样下载会变慢,暂不处理。
扩展版的稳定性一直不如脚本好,很奇怪。有时候脚本版的看图组件会加载失败;有时候收藏时自动点赞失效,奇哉怪也。
之前的下载方式和脚本版是一样的,点击 a 标签下载。现在为了能自动建立文件夹,改成了发送给 chrome 来下载。
早期的一些版本更新没有写日志