pixivflow 2.6.0 → 2.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +27 -0
- package/README_EN.md +15 -0
- package/config/fly-two-bots.example.json +240 -0
- package/dist/commands/SchedulerCommand.d.ts +1 -0
- package/dist/commands/SchedulerCommand.d.ts.map +1 -1
- package/dist/commands/SchedulerCommand.js +78 -22
- package/dist/commands/SchedulerCommand.js.map +1 -1
- package/dist/config/defaults.d.ts +5 -0
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +6 -0
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/loader.d.ts +1 -1
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +4 -2
- package/dist/config/loader.js.map +1 -1
- package/dist/config/path-resolution.d.ts.map +1 -1
- package/dist/config/path-resolution.js +4 -0
- package/dist/config/path-resolution.js.map +1 -1
- package/dist/config/types.d.ts +40 -3
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/validation.d.ts.map +1 -1
- package/dist/config/validation.js +51 -0
- package/dist/config/validation.js.map +1 -1
- package/dist/config.d.ts +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js.map +1 -1
- package/dist/download/handlers/IllustrationTargetHandler.d.ts.map +1 -1
- package/dist/download/handlers/IllustrationTargetHandler.js +15 -6
- package/dist/download/handlers/IllustrationTargetHandler.js.map +1 -1
- package/dist/download/handlers/NovelTargetHandler.d.ts.map +1 -1
- package/dist/download/handlers/NovelTargetHandler.js +13 -6
- package/dist/download/handlers/NovelTargetHandler.js.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/package.json +1 -1
- package/dist/scheduler/MultiScheduleManager.d.ts +39 -0
- package/dist/scheduler/MultiScheduleManager.d.ts.map +1 -0
- package/dist/scheduler/MultiScheduleManager.js +182 -0
- package/dist/scheduler/MultiScheduleManager.js.map +1 -0
- package/dist/scheduler/Scheduler.d.ts +13 -1
- package/dist/scheduler/Scheduler.d.ts.map +1 -1
- package/dist/scheduler/Scheduler.js +31 -7
- package/dist/scheduler/Scheduler.js.map +1 -1
- package/dist/scheduler/schedules.d.ts +8 -0
- package/dist/scheduler/schedules.d.ts.map +1 -0
- package/dist/scheduler/schedules.js +32 -0
- package/dist/scheduler/schedules.js.map +1 -0
- package/dist/storage/Database.d.ts +5 -4
- package/dist/storage/Database.d.ts.map +1 -1
- package/dist/storage/Database.js +13 -9
- package/dist/storage/Database.js.map +1 -1
- package/dist/storage/DatabaseMigration.d.ts.map +1 -1
- package/dist/storage/DatabaseMigration.js +11 -0
- package/dist/storage/DatabaseMigration.js.map +1 -1
- package/dist/storage/repositories/SchedulerRepository.d.ts +4 -4
- package/dist/storage/repositories/SchedulerRepository.d.ts.map +1 -1
- package/dist/storage/repositories/SchedulerRepository.js +18 -12
- package/dist/storage/repositories/SchedulerRepository.js.map +1 -1
- package/dist/utils/config-validator-unified.d.ts.map +1 -1
- package/dist/utils/config-validator-unified.js +61 -0
- package/dist/utils/config-validator-unified.js.map +1 -1
- package/dist/webui/package.json +1 -1
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -54,6 +54,33 @@ pixivflow download
|
|
|
54
54
|
pixivflow scheduler # 按 cron 配置长期挂机自动收集
|
|
55
55
|
```
|
|
56
56
|
|
|
57
|
+
### 单进程多计划与配置热重载
|
|
58
|
+
|
|
59
|
+
`schedules[]` 可以为不同 target 组设置各自的 Cron。所有计划由一个 Node
|
|
60
|
+
进程托管,共享 Pixiv 客户端、SQLite 与文件服务;执行阶段使用有界串行队列,
|
|
61
|
+
适合 512 MiB 小内存机器。配置文件默认被监听,SSH/同步工具替换文件后会先完整
|
|
62
|
+
校验,再一次性替换全部调度项;无效 JSON、错误 Cron 或未知 target id 不会破坏
|
|
63
|
+
当前运行中的计划。正在执行的任务继续使用旧快照,下一次任务使用新快照。
|
|
64
|
+
|
|
65
|
+
```json
|
|
66
|
+
{
|
|
67
|
+
"scheduler": { "enabled": false, "cron": "0 3 * * *" },
|
|
68
|
+
"schedules": [
|
|
69
|
+
{ "id": "bot1", "enabled": true, "cron": "10 5 * * *", "targetIds": ["bot1-art", "bot1-novel"] },
|
|
70
|
+
{ "id": "bot2", "enabled": true, "cron": "30 5 * * *", "targetIds": ["bot2-art", "bot2-novel"] }
|
|
71
|
+
],
|
|
72
|
+
"targets": [
|
|
73
|
+
{ "id": "bot1-art", "type": "illustration", "mode": "ranking", "rankingDate": "YESTERDAY" },
|
|
74
|
+
{ "id": "bot1-novel", "type": "novel", "mode": "ranking", "rankingDate": "YESTERDAY" }
|
|
75
|
+
]
|
|
76
|
+
}
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
旧的单 `scheduler` 配置继续兼容。`pixiv`、`network`、`storage` 涉及长生命周期
|
|
80
|
+
连接或路径,修改后需要重启;`schedules`、`targets`、`delivery`、`download` 可以
|
|
81
|
+
热重载。完整双 Bot 缓存投递模板见
|
|
82
|
+
[`config/fly-two-bots.example.json`](config/fly-two-bots.example.json)。
|
|
83
|
+
|
|
57
84
|
## 下载目标
|
|
58
85
|
|
|
59
86
|
在配置文件的 `targets` 中定义要收集的内容,多个条件可以组合:
|
package/README_EN.md
CHANGED
|
@@ -56,6 +56,21 @@ pixivflow download
|
|
|
56
56
|
pixivflow scheduler # long-running cron collection
|
|
57
57
|
```
|
|
58
58
|
|
|
59
|
+
### Multiple schedules and atomic hot reload
|
|
60
|
+
|
|
61
|
+
`schedules[]` hosts independently timed target groups in one Node process.
|
|
62
|
+
Plans share Pixiv authentication, SQLite, and file services, while a bounded
|
|
63
|
+
serial queue prevents overlapping downloads from producing memory spikes.
|
|
64
|
+
The active config is watched by default: replace it over SSH and PixivFlow
|
|
65
|
+
fully validates the new snapshot before swapping the entire cron table. An
|
|
66
|
+
invalid edit leaves the previous schedules running. In-flight work finishes
|
|
67
|
+
on its old snapshot; the next run sees the new one.
|
|
68
|
+
|
|
69
|
+
Legacy single-`scheduler` configs remain supported. `schedules`, `targets`,
|
|
70
|
+
`delivery`, and `download` are hot-reloadable; changes to `pixiv`, `network`,
|
|
71
|
+
or `storage` require a process restart. See the ready-to-edit
|
|
72
|
+
[`config/fly-two-bots.example.json`](config/fly-two-bots.example.json) template.
|
|
73
|
+
|
|
59
74
|
## Download targets
|
|
60
75
|
|
|
61
76
|
Define what to collect in the `targets` section of your config. Conditions
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
{
|
|
2
|
+
"logLevel": "info",
|
|
3
|
+
"pixiv": {
|
|
4
|
+
"clientId": "MOBrBDS8blbauoSck0ZfDbtuzpyT",
|
|
5
|
+
"clientSecret": "lsACyCD94FhDUtGTXi3QzcFE2uU1hqtDaKeqrdwj",
|
|
6
|
+
"deviceToken": "pixiv",
|
|
7
|
+
"refreshToken": "YOUR_REFRESH_TOKEN",
|
|
8
|
+
"userAgent": "PixivAndroidApp/5.0.234 (Android 11; Pixel 6)"
|
|
9
|
+
},
|
|
10
|
+
"network": {
|
|
11
|
+
"timeoutMs": 30000,
|
|
12
|
+
"retries": 3,
|
|
13
|
+
"retryDelay": 2000
|
|
14
|
+
},
|
|
15
|
+
"storage": {
|
|
16
|
+
"databasePath": "./pixivflow.db",
|
|
17
|
+
"downloadDirectory": "./cache",
|
|
18
|
+
"illustrationDirectory": "./cache/illustrations",
|
|
19
|
+
"novelDirectory": "./cache/novels"
|
|
20
|
+
},
|
|
21
|
+
"scheduler": {
|
|
22
|
+
"enabled": false,
|
|
23
|
+
"cron": "0 3 * * *",
|
|
24
|
+
"timezone": "Asia/Shanghai"
|
|
25
|
+
},
|
|
26
|
+
"schedules": [
|
|
27
|
+
{
|
|
28
|
+
"id": "bot1-daily",
|
|
29
|
+
"name": "Bot 1 daily ranking",
|
|
30
|
+
"enabled": false,
|
|
31
|
+
"cron": "10 5 * * *",
|
|
32
|
+
"timezone": "Asia/Shanghai",
|
|
33
|
+
"targetIds": [
|
|
34
|
+
"bot1-illust-tag-a",
|
|
35
|
+
"bot1-novel-tag-a",
|
|
36
|
+
"bot1-illust-tag-b",
|
|
37
|
+
"bot1-novel-tag-b"
|
|
38
|
+
],
|
|
39
|
+
"timeout": 1200000,
|
|
40
|
+
"maxConsecutiveFailures": 5,
|
|
41
|
+
"failureRetryDelay": 30000
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
"id": "bot2-daily",
|
|
45
|
+
"name": "Bot 2 daily ranking",
|
|
46
|
+
"enabled": false,
|
|
47
|
+
"cron": "30 5 * * *",
|
|
48
|
+
"timezone": "Asia/Shanghai",
|
|
49
|
+
"targetIds": [
|
|
50
|
+
"bot2-illust-tag-c",
|
|
51
|
+
"bot2-novel-tag-c",
|
|
52
|
+
"bot2-illust-tag-d",
|
|
53
|
+
"bot2-novel-tag-d"
|
|
54
|
+
],
|
|
55
|
+
"timeout": 1200000,
|
|
56
|
+
"maxConsecutiveFailures": 5,
|
|
57
|
+
"failureRetryDelay": 30000
|
|
58
|
+
}
|
|
59
|
+
],
|
|
60
|
+
"schedulerRuntime": {
|
|
61
|
+
"watchConfig": true,
|
|
62
|
+
"reloadDebounceMs": 500,
|
|
63
|
+
"queueLimit": 2
|
|
64
|
+
},
|
|
65
|
+
"download": {
|
|
66
|
+
"concurrency": 1,
|
|
67
|
+
"requestDelay": 1000,
|
|
68
|
+
"dynamicConcurrency": false,
|
|
69
|
+
"minConcurrency": 1,
|
|
70
|
+
"maxRetries": 3,
|
|
71
|
+
"retryDelay": 3000,
|
|
72
|
+
"timeout": 90000
|
|
73
|
+
},
|
|
74
|
+
"delivery": {
|
|
75
|
+
"targets": {
|
|
76
|
+
"telepost-bot1": {
|
|
77
|
+
"type": "httpMultipart",
|
|
78
|
+
"url": "http://127.0.0.1:8080/api/bot1/v1/submissions",
|
|
79
|
+
"headers": {
|
|
80
|
+
"Authorization": "Bearer ${TELEPOST_BOT1_SUBMIT_TOKEN}"
|
|
81
|
+
},
|
|
82
|
+
"fileField": "files",
|
|
83
|
+
"fields": {
|
|
84
|
+
"title": "{{title}}",
|
|
85
|
+
"tags": [
|
|
86
|
+
"Pixiv",
|
|
87
|
+
"{{tag}}"
|
|
88
|
+
],
|
|
89
|
+
"note": "Pixiv ID: {{pixivId}}",
|
|
90
|
+
"anonymous": true,
|
|
91
|
+
"idempotency_key": "pixiv:bot1:{{type}}:{{pixivId}}"
|
|
92
|
+
},
|
|
93
|
+
"success": {
|
|
94
|
+
"statuses": [
|
|
95
|
+
201
|
|
96
|
+
],
|
|
97
|
+
"jsonPath": "ok",
|
|
98
|
+
"equals": true
|
|
99
|
+
},
|
|
100
|
+
"maxAttempts": 3,
|
|
101
|
+
"retryDelayMs": 3000
|
|
102
|
+
},
|
|
103
|
+
"telepost-bot2": {
|
|
104
|
+
"type": "httpMultipart",
|
|
105
|
+
"url": "http://127.0.0.1:8080/api/bot2/v1/submissions",
|
|
106
|
+
"headers": {
|
|
107
|
+
"Authorization": "Bearer ${TELEPOST_BOT2_SUBMIT_TOKEN}"
|
|
108
|
+
},
|
|
109
|
+
"fileField": "files",
|
|
110
|
+
"fields": {
|
|
111
|
+
"title": "{{title}}",
|
|
112
|
+
"tags": [
|
|
113
|
+
"Pixiv",
|
|
114
|
+
"{{tag}}"
|
|
115
|
+
],
|
|
116
|
+
"note": "Pixiv ID: {{pixivId}}",
|
|
117
|
+
"anonymous": true,
|
|
118
|
+
"idempotency_key": "pixiv:bot2:{{type}}:{{pixivId}}"
|
|
119
|
+
},
|
|
120
|
+
"success": {
|
|
121
|
+
"statuses": [
|
|
122
|
+
201
|
|
123
|
+
],
|
|
124
|
+
"jsonPath": "ok",
|
|
125
|
+
"equals": true
|
|
126
|
+
},
|
|
127
|
+
"maxAttempts": 3,
|
|
128
|
+
"retryDelayMs": 3000
|
|
129
|
+
}
|
|
130
|
+
},
|
|
131
|
+
"deleteAfterDelivery": true
|
|
132
|
+
},
|
|
133
|
+
"targets": [
|
|
134
|
+
{
|
|
135
|
+
"id": "bot1-illust-tag-a",
|
|
136
|
+
"type": "illustration",
|
|
137
|
+
"mode": "ranking",
|
|
138
|
+
"rankingMode": "day",
|
|
139
|
+
"rankingDate": "YESTERDAY",
|
|
140
|
+
"filterTag": "TAG_A",
|
|
141
|
+
"limit": 1,
|
|
142
|
+
"storageMode": "cache",
|
|
143
|
+
"delivery": {
|
|
144
|
+
"target": "telepost-bot1"
|
|
145
|
+
}
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
"id": "bot1-novel-tag-a",
|
|
149
|
+
"type": "novel",
|
|
150
|
+
"mode": "ranking",
|
|
151
|
+
"rankingMode": "day",
|
|
152
|
+
"rankingDate": "YESTERDAY",
|
|
153
|
+
"filterTag": "TAG_A",
|
|
154
|
+
"limit": 1,
|
|
155
|
+
"storageMode": "cache",
|
|
156
|
+
"delivery": {
|
|
157
|
+
"target": "telepost-bot1"
|
|
158
|
+
}
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
"id": "bot1-illust-tag-b",
|
|
162
|
+
"type": "illustration",
|
|
163
|
+
"mode": "ranking",
|
|
164
|
+
"rankingMode": "day",
|
|
165
|
+
"rankingDate": "YESTERDAY",
|
|
166
|
+
"filterTag": "TAG_B",
|
|
167
|
+
"limit": 1,
|
|
168
|
+
"storageMode": "cache",
|
|
169
|
+
"delivery": {
|
|
170
|
+
"target": "telepost-bot1"
|
|
171
|
+
}
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
"id": "bot1-novel-tag-b",
|
|
175
|
+
"type": "novel",
|
|
176
|
+
"mode": "ranking",
|
|
177
|
+
"rankingMode": "day",
|
|
178
|
+
"rankingDate": "YESTERDAY",
|
|
179
|
+
"filterTag": "TAG_B",
|
|
180
|
+
"limit": 1,
|
|
181
|
+
"storageMode": "cache",
|
|
182
|
+
"delivery": {
|
|
183
|
+
"target": "telepost-bot1"
|
|
184
|
+
}
|
|
185
|
+
},
|
|
186
|
+
{
|
|
187
|
+
"id": "bot2-illust-tag-c",
|
|
188
|
+
"type": "illustration",
|
|
189
|
+
"mode": "ranking",
|
|
190
|
+
"rankingMode": "day",
|
|
191
|
+
"rankingDate": "YESTERDAY",
|
|
192
|
+
"filterTag": "TAG_C",
|
|
193
|
+
"limit": 1,
|
|
194
|
+
"storageMode": "cache",
|
|
195
|
+
"delivery": {
|
|
196
|
+
"target": "telepost-bot2"
|
|
197
|
+
}
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
"id": "bot2-novel-tag-c",
|
|
201
|
+
"type": "novel",
|
|
202
|
+
"mode": "ranking",
|
|
203
|
+
"rankingMode": "day",
|
|
204
|
+
"rankingDate": "YESTERDAY",
|
|
205
|
+
"filterTag": "TAG_C",
|
|
206
|
+
"limit": 1,
|
|
207
|
+
"storageMode": "cache",
|
|
208
|
+
"delivery": {
|
|
209
|
+
"target": "telepost-bot2"
|
|
210
|
+
}
|
|
211
|
+
},
|
|
212
|
+
{
|
|
213
|
+
"id": "bot2-illust-tag-d",
|
|
214
|
+
"type": "illustration",
|
|
215
|
+
"mode": "ranking",
|
|
216
|
+
"rankingMode": "day",
|
|
217
|
+
"rankingDate": "YESTERDAY",
|
|
218
|
+
"filterTag": "TAG_D",
|
|
219
|
+
"limit": 1,
|
|
220
|
+
"storageMode": "cache",
|
|
221
|
+
"delivery": {
|
|
222
|
+
"target": "telepost-bot2"
|
|
223
|
+
}
|
|
224
|
+
},
|
|
225
|
+
{
|
|
226
|
+
"id": "bot2-novel-tag-d",
|
|
227
|
+
"type": "novel",
|
|
228
|
+
"mode": "ranking",
|
|
229
|
+
"rankingMode": "day",
|
|
230
|
+
"rankingDate": "YESTERDAY",
|
|
231
|
+
"filterTag": "TAG_D",
|
|
232
|
+
"limit": 1,
|
|
233
|
+
"storageMode": "cache",
|
|
234
|
+
"delivery": {
|
|
235
|
+
"target": "telepost-bot2"
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
],
|
|
239
|
+
"initialDelay": 0
|
|
240
|
+
}
|
|
@@ -17,6 +17,7 @@ export declare class SchedulerCommand extends BaseCommand {
|
|
|
17
17
|
longRunning: boolean;
|
|
18
18
|
};
|
|
19
19
|
execute(context: CommandContext, args: CommandArgs): Promise<CommandResult>;
|
|
20
|
+
private getImmutableFingerprint;
|
|
20
21
|
getUsage(): string;
|
|
21
22
|
}
|
|
22
23
|
//# sourceMappingURL=SchedulerCommand.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SchedulerCommand.d.ts","sourceRoot":"","sources":["../../src/commands/SchedulerCommand.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"SchedulerCommand.d.ts","sourceRoot":"","sources":["../../src/commands/SchedulerCommand.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAYrE;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,WAAW;IAC/C,QAAQ,CAAC,IAAI,eAAe;IAC5B,QAAQ,CAAC,WAAW,oDAAoD;IACxE,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,CAAgB;IAC1C,QAAQ,CAAC,QAAQ;;;;MAIf;IAEI,OAAO,CAAC,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC;IAmIjF,OAAO,CAAC,uBAAuB;IAQ/B,QAAQ,IAAI,MAAM;CAYnB"}
|
|
@@ -12,8 +12,10 @@ const AuthClient_1 = require("../pixiv/AuthClient");
|
|
|
12
12
|
const PixivClient_1 = require("../pixiv/PixivClient");
|
|
13
13
|
const FileService_1 = require("../download/FileService");
|
|
14
14
|
const DownloadManager_1 = require("../download/DownloadManager");
|
|
15
|
-
const Scheduler_1 = require("../scheduler/Scheduler");
|
|
16
15
|
const token_maintenance_1 = require("../utils/token-maintenance");
|
|
16
|
+
const MultiScheduleManager_1 = require("../scheduler/MultiScheduleManager");
|
|
17
|
+
const schedules_1 = require("../scheduler/schedules");
|
|
18
|
+
const placeholders_1 = require("../config/placeholders");
|
|
17
19
|
/**
|
|
18
20
|
* Scheduler command - Start scheduler (default if enabled in config)
|
|
19
21
|
*/
|
|
@@ -28,45 +30,87 @@ class SchedulerCommand extends Command_1.BaseCommand {
|
|
|
28
30
|
};
|
|
29
31
|
async execute(context, args) {
|
|
30
32
|
try {
|
|
31
|
-
const configPath = (0, config_1.getConfigPath)();
|
|
32
|
-
|
|
33
|
+
const configPath = (0, config_1.getConfigPath)(args.options.config);
|
|
34
|
+
// Keep TODAY/YESTERDAY placeholders intact. They are resolved afresh for
|
|
35
|
+
// every plan execution, not frozen at daemon startup.
|
|
36
|
+
const config = (0, config_1.loadConfig)(configPath, false, false);
|
|
33
37
|
const database = new Database_1.Database(config.storage.databasePath);
|
|
34
38
|
database.migrate();
|
|
35
39
|
const auth = new AuthClient_1.PixivAuth(config.pixiv, config.network, database, configPath);
|
|
36
40
|
const pixivClient = new PixivClient_1.PixivClient(auth, config);
|
|
37
41
|
const fileService = new FileService_1.FileService(config.storage);
|
|
38
|
-
|
|
39
|
-
await downloadManager.initialise();
|
|
42
|
+
await fileService.initialise();
|
|
40
43
|
// Start token maintenance service for automatic token refresh
|
|
41
44
|
const tokenMaintenance = (0, token_maintenance_1.createTokenMaintenanceService)(auth, config.pixiv, config.network, config);
|
|
42
45
|
if (tokenMaintenance) {
|
|
43
46
|
tokenMaintenance.start();
|
|
44
47
|
}
|
|
45
|
-
|
|
48
|
+
let activeDownloadManager = null;
|
|
49
|
+
const immutableFingerprint = this.getImmutableFingerprint(config);
|
|
50
|
+
const runJob = async (snapshot, schedule) => {
|
|
51
|
+
const runtimeConfig = (0, placeholders_1.processConfigPlaceholders)(snapshot);
|
|
52
|
+
const targets = (0, schedules_1.selectScheduleTargets)(runtimeConfig.targets, schedule);
|
|
53
|
+
const scopedConfig = { ...runtimeConfig, targets };
|
|
54
|
+
if (targets.length === 0) {
|
|
55
|
+
context.logger.warn('Scheduled plan has no selected targets; skipping', {
|
|
56
|
+
scheduleId: schedule.id,
|
|
57
|
+
targetIds: schedule.targetIds,
|
|
58
|
+
});
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
const downloadManager = new DownloadManager_1.DownloadManager(scopedConfig, pixivClient, database, fileService);
|
|
62
|
+
activeDownloadManager = downloadManager;
|
|
63
|
+
await downloadManager.initialise();
|
|
46
64
|
// Apply initial delay if configured
|
|
47
|
-
if (
|
|
48
|
-
context.logger.info(`Waiting ${
|
|
49
|
-
|
|
65
|
+
if (runtimeConfig.initialDelay && runtimeConfig.initialDelay > 0) {
|
|
66
|
+
context.logger.info(`Waiting ${runtimeConfig.initialDelay}ms before starting download...`, {
|
|
67
|
+
scheduleId: schedule.id,
|
|
68
|
+
});
|
|
69
|
+
await new Promise(resolve => setTimeout(resolve, runtimeConfig.initialDelay));
|
|
50
70
|
}
|
|
51
71
|
context.logger.info('='.repeat(60));
|
|
52
|
-
context.logger.info('Starting scheduled Pixiv download
|
|
72
|
+
context.logger.info('Starting scheduled Pixiv download plan', {
|
|
73
|
+
scheduleId: schedule.id,
|
|
74
|
+
targets: targets.map(target => target.id ?? target.tag ?? target.filterTag ?? target.type),
|
|
75
|
+
});
|
|
53
76
|
context.logger.info('='.repeat(60));
|
|
54
77
|
const startTime = Date.now();
|
|
55
|
-
|
|
78
|
+
try {
|
|
79
|
+
await downloadManager.runAllTargets();
|
|
80
|
+
}
|
|
81
|
+
finally {
|
|
82
|
+
if (activeDownloadManager === downloadManager)
|
|
83
|
+
activeDownloadManager = null;
|
|
84
|
+
}
|
|
56
85
|
const duration = Math.round((Date.now() - startTime) / 1000);
|
|
57
86
|
context.logger.info('='.repeat(60));
|
|
58
|
-
context.logger.info(`Scheduled download
|
|
87
|
+
context.logger.info(`Scheduled download plan finished (took ${duration}s)`, {
|
|
88
|
+
scheduleId: schedule.id,
|
|
89
|
+
});
|
|
59
90
|
context.logger.info('='.repeat(60));
|
|
60
91
|
};
|
|
61
|
-
const
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
92
|
+
const manager = new MultiScheduleManager_1.MultiScheduleManager({
|
|
93
|
+
configPath,
|
|
94
|
+
loadConfig: () => {
|
|
95
|
+
const next = (0, config_1.loadConfig)(configPath, false, false);
|
|
96
|
+
if (this.getImmutableFingerprint(next) !== immutableFingerprint) {
|
|
97
|
+
throw new Error('pixiv/network/storage changes require a process restart; schedules, targets, delivery and download settings can be hot-reloaded');
|
|
98
|
+
}
|
|
99
|
+
return next;
|
|
100
|
+
},
|
|
101
|
+
execute: runJob,
|
|
102
|
+
database,
|
|
103
|
+
telemetry: {
|
|
104
|
+
beginRun: () => database.getOverviewStats().totalDownloads,
|
|
105
|
+
endRun: () => database.getOverviewStats().totalDownloads,
|
|
106
|
+
requestCancel: (reason) => activeDownloadManager?.cancel(reason),
|
|
107
|
+
},
|
|
65
108
|
});
|
|
66
|
-
|
|
109
|
+
const status = manager.start(config);
|
|
67
110
|
const cleanup = () => {
|
|
68
111
|
context.logger.info('Shutting down PixivFlow');
|
|
69
|
-
|
|
112
|
+
manager.stop();
|
|
113
|
+
activeDownloadManager?.cancel('process shutdown');
|
|
70
114
|
if (tokenMaintenance) {
|
|
71
115
|
tokenMaintenance.stop();
|
|
72
116
|
}
|
|
@@ -75,9 +119,14 @@ class SchedulerCommand extends Command_1.BaseCommand {
|
|
|
75
119
|
};
|
|
76
120
|
process.on('SIGINT', cleanup);
|
|
77
121
|
process.on('SIGTERM', cleanup);
|
|
122
|
+
process.on('SIGHUP', () => {
|
|
123
|
+
context.logger.info('Received SIGHUP; reloading scheduler configuration');
|
|
124
|
+
manager.reload();
|
|
125
|
+
});
|
|
78
126
|
// Keep process alive
|
|
79
127
|
return this.success('Scheduler started', {
|
|
80
|
-
message: '
|
|
128
|
+
message: 'Multi-plan scheduler is running with atomic config hot reload. Press Ctrl+C to stop.',
|
|
129
|
+
schedules: status.schedules,
|
|
81
130
|
});
|
|
82
131
|
}
|
|
83
132
|
catch (error) {
|
|
@@ -87,14 +136,21 @@ class SchedulerCommand extends Command_1.BaseCommand {
|
|
|
87
136
|
return this.failure(error instanceof Error ? error.message : String(error), { error });
|
|
88
137
|
}
|
|
89
138
|
}
|
|
139
|
+
getImmutableFingerprint(config) {
|
|
140
|
+
return JSON.stringify({
|
|
141
|
+
pixiv: config.pixiv,
|
|
142
|
+
network: config.network,
|
|
143
|
+
storage: config.storage,
|
|
144
|
+
});
|
|
145
|
+
}
|
|
90
146
|
getUsage() {
|
|
91
147
|
return `scheduler
|
|
92
148
|
|
|
93
149
|
Start the scheduler to run download jobs periodically according to config.
|
|
94
150
|
|
|
95
|
-
The scheduler
|
|
96
|
-
|
|
97
|
-
|
|
151
|
+
The scheduler hosts all enabled schedules in one process. Valid changes to
|
|
152
|
+
schedules, targets, delivery and download settings are loaded automatically.
|
|
153
|
+
Pixiv credentials, network and storage changes require a restart.
|
|
98
154
|
|
|
99
155
|
Examples:
|
|
100
156
|
pixivflow scheduler # Start scheduler`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SchedulerCommand.js","sourceRoot":"","sources":["../../src/commands/SchedulerCommand.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,uCAAwC;AACxC,yCAA6C;AAE7C,
|
|
1
|
+
{"version":3,"file":"SchedulerCommand.js","sourceRoot":"","sources":["../../src/commands/SchedulerCommand.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,6 +18,11 @@ export declare const DEFAULT_CONFIG: {
|
|
|
18
18
|
readonly cron: "0 3 * * *";
|
|
19
19
|
readonly timezone: "Asia/Shanghai";
|
|
20
20
|
};
|
|
21
|
+
readonly schedulerRuntime: {
|
|
22
|
+
readonly watchConfig: true;
|
|
23
|
+
readonly reloadDebounceMs: 500;
|
|
24
|
+
readonly queueLimit: 8;
|
|
25
|
+
};
|
|
21
26
|
readonly download: {
|
|
22
27
|
readonly concurrency: 3;
|
|
23
28
|
readonly requestDelay: 500;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/config/defaults.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAE3C,eAAO,MAAM,cAAc
|
|
1
|
+
{"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/config/defaults.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAE3C,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+BjB,CAAC;AAEX;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,gBAAgB,CAyBxD"}
|
package/dist/config/defaults.js
CHANGED
|
@@ -21,6 +21,11 @@ exports.DEFAULT_CONFIG = {
|
|
|
21
21
|
cron: '0 3 * * *',
|
|
22
22
|
timezone: 'Asia/Shanghai',
|
|
23
23
|
},
|
|
24
|
+
schedulerRuntime: {
|
|
25
|
+
watchConfig: true,
|
|
26
|
+
reloadDebounceMs: 500,
|
|
27
|
+
queueLimit: 8,
|
|
28
|
+
},
|
|
24
29
|
download: {
|
|
25
30
|
concurrency: 3,
|
|
26
31
|
requestDelay: 500,
|
|
@@ -48,6 +53,7 @@ function generateDefaultConfig() {
|
|
|
48
53
|
network: exports.DEFAULT_CONFIG.network,
|
|
49
54
|
storage: exports.DEFAULT_CONFIG.storage,
|
|
50
55
|
scheduler: exports.DEFAULT_CONFIG.scheduler,
|
|
56
|
+
schedulerRuntime: exports.DEFAULT_CONFIG.schedulerRuntime,
|
|
51
57
|
download: exports.DEFAULT_CONFIG.download,
|
|
52
58
|
targets: [
|
|
53
59
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/config/defaults.ts"],"names":[],"mappings":";AAAA;;GAEG;;;
|
|
1
|
+
{"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/config/defaults.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAwCH,sDAyBC;AA7DY,QAAA,cAAc,GAAG;IAC5B,QAAQ,EAAE,MAAe;IACzB,OAAO,EAAE;QACP,SAAS,EAAE,KAAK;QAChB,OAAO,EAAE,CAAC;QACV,UAAU,EAAE,IAAI;KACjB;IACD,OAAO,EAAE;QACP,YAAY,EAAE,4BAA4B;QAC1C,iBAAiB,EAAE,aAAa;KACjC;IACD,SAAS,EAAE;QACT,OAAO,EAAE,KAAK;QACd,IAAI,EAAE,WAAW;QACjB,QAAQ,EAAE,eAAe;KAC1B;IACD,gBAAgB,EAAE;QAChB,WAAW,EAAE,IAAI;QACjB,gBAAgB,EAAE,GAAG;QACrB,UAAU,EAAE,CAAC;KACd;IACD,QAAQ,EAAE;QACR,WAAW,EAAE,CAAC;QACd,YAAY,EAAE,GAAG;QACjB,kBAAkB,EAAE,IAAI;QACxB,cAAc,EAAE,CAAC;QACjB,UAAU,EAAE,CAAC;QACb,UAAU,EAAE,IAAI;QAChB,OAAO,EAAE,KAAK;KACf;IACD,YAAY,EAAE,CAAC;CACP,CAAC;AAEX;;GAEG;AACH,SAAgB,qBAAqB;IACnC,OAAO;QACL,QAAQ,EAAE,sBAAc,CAAC,QAAQ;QACjC,KAAK,EAAE;YACL,QAAQ,EAAE,8BAA8B;YACxC,YAAY,EAAE,0CAA0C;YACxD,WAAW,EAAE,OAAO;YACpB,YAAY,EAAE,oBAAoB;YAClC,SAAS,EAAE,+CAA+C;SAC3D;QACD,OAAO,EAAE,sBAAc,CAAC,OAAO;QAC/B,OAAO,EAAE,sBAAc,CAAC,OAAO;QAC/B,SAAS,EAAE,sBAAc,CAAC,SAAS;QACnC,gBAAgB,EAAE,sBAAc,CAAC,gBAAgB;QACjD,QAAQ,EAAE,sBAAc,CAAC,QAAQ;QACjC,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,cAAc;gBACpB,GAAG,EAAE,MAAM;gBACX,KAAK,EAAE,EAAE;gBACT,YAAY,EAAE,wBAAwB;aACvC;SACF;QACD,YAAY,EAAE,sBAAc,CAAC,YAAY;KAC1C,CAAC;AACJ,CAAC"}
|
package/dist/config/loader.d.ts
CHANGED
|
@@ -13,5 +13,5 @@ export declare function getConfigPath(configPath?: string): string;
|
|
|
13
13
|
* @param configPath - Path to config file
|
|
14
14
|
* @param skipValidation - If true, skip configuration validation (useful for login commands)
|
|
15
15
|
*/
|
|
16
|
-
export declare function loadConfig(configPath?: string, skipValidation?: boolean): StandaloneConfig;
|
|
16
|
+
export declare function loadConfig(configPath?: string, skipValidation?: boolean, resolveDynamicPlaceholders?: boolean): StandaloneConfig;
|
|
17
17
|
//# sourceMappingURL=loader.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAAA;;GAEG;AAUH,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAO3C;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAwBzD;AAED;;;;GAIG;AACH,wBAAgB,UAAU,
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAAA;;GAEG;AAUH,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAO3C;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAwBzD;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CACxB,UAAU,CAAC,EAAE,MAAM,EACnB,cAAc,GAAE,OAAe,EAC/B,0BAA0B,GAAE,OAAc,GACzC,gBAAgB,CAsLlB"}
|
package/dist/config/loader.js
CHANGED
|
@@ -50,7 +50,7 @@ function getConfigPath(configPath) {
|
|
|
50
50
|
* @param configPath - Path to config file
|
|
51
51
|
* @param skipValidation - If true, skip configuration validation (useful for login commands)
|
|
52
52
|
*/
|
|
53
|
-
function loadConfig(configPath, skipValidation = false) {
|
|
53
|
+
function loadConfig(configPath, skipValidation = false, resolveDynamicPlaceholders = true) {
|
|
54
54
|
let resolvedPath = getConfigPath(configPath);
|
|
55
55
|
// If config file doesn't exist, try to find or create one
|
|
56
56
|
if (!(0, node_fs_1.existsSync)(resolvedPath)) {
|
|
@@ -197,7 +197,9 @@ function loadConfig(configPath, skipValidation = false) {
|
|
|
197
197
|
(0, validation_1.validateConfig)(config, resolvedPath, config.storage?.databasePath);
|
|
198
198
|
}
|
|
199
199
|
// Process placeholders (e.g., YESTERDAY)
|
|
200
|
-
|
|
200
|
+
// Long-running schedulers keep placeholders in their immutable snapshots
|
|
201
|
+
// and resolve TODAY/YESTERDAY immediately before each run.
|
|
202
|
+
const finalConfig = resolveDynamicPlaceholders ? (0, placeholders_1.processConfigPlaceholders)(config) : config;
|
|
201
203
|
// Display directory information on first load (only if config was just created)
|
|
202
204
|
// This helps users know where files will be saved
|
|
203
205
|
if ((0, node_fs_1.existsSync)(resolvedPath)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAsBH,sCAwBC;AAOD,
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"path-resolution.d.ts","sourceRoot":"","sources":["../../src/config/path-resolution.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,gBAAgB,EAAiB,MAAM,SAAS,CAAC;AA4K1D;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,gBAAgB,CAAC,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,gBAAgB,
|
|
1
|
+
{"version":3,"file":"path-resolution.d.ts","sourceRoot":"","sources":["../../src/config/path-resolution.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,gBAAgB,EAAiB,MAAM,SAAS,CAAC;AA4K1D;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,gBAAgB,CAAC,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,gBAAgB,CA2CpG"}
|
|
@@ -188,6 +188,10 @@ function applyDefaults(config, basePath) {
|
|
|
188
188
|
...defaults_1.DEFAULT_CONFIG.scheduler,
|
|
189
189
|
...config.scheduler,
|
|
190
190
|
},
|
|
191
|
+
schedulerRuntime: {
|
|
192
|
+
...defaults_1.DEFAULT_CONFIG.schedulerRuntime,
|
|
193
|
+
...config.schedulerRuntime,
|
|
194
|
+
},
|
|
191
195
|
download: {
|
|
192
196
|
...defaults_1.DEFAULT_CONFIG.download,
|
|
193
197
|
...config.download,
|