pixivflow 2.14.0 → 2.16.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/dist/auth/PixivAuth.d.ts +18 -0
- package/dist/auth/PixivAuth.d.ts.map +1 -0
- package/dist/auth/PixivAuth.js +200 -0
- package/dist/auth/PixivAuth.js.map +1 -0
- package/dist/commands/DoctorCommand.d.ts.map +1 -1
- package/dist/commands/DoctorCommand.js +23 -0
- package/dist/commands/DoctorCommand.js.map +1 -1
- package/dist/commands/DownloadCommand.js +4 -4
- package/dist/commands/DownloadCommand.js.map +1 -1
- package/dist/commands/HealthCommand.d.ts.map +1 -1
- package/dist/commands/HealthCommand.js +14 -1
- package/dist/commands/HealthCommand.js.map +1 -1
- package/dist/commands/OutboxCommand.d.ts.map +1 -1
- package/dist/commands/OutboxCommand.js +49 -2
- package/dist/commands/OutboxCommand.js.map +1 -1
- package/dist/commands/RandomDownloadCommand.js +4 -4
- package/dist/commands/RandomDownloadCommand.js.map +1 -1
- package/dist/commands/RunsCommand.d.ts +21 -0
- package/dist/commands/RunsCommand.d.ts.map +1 -0
- package/dist/commands/RunsCommand.js +65 -0
- package/dist/commands/RunsCommand.js.map +1 -0
- package/dist/commands/TagsCommand.js +4 -4
- package/dist/commands/TagsCommand.js.map +1 -1
- package/dist/commands/TopicCommand.d.ts.map +1 -1
- package/dist/commands/TopicCommand.js +4 -4
- package/dist/commands/TopicCommand.js.map +1 -1
- package/dist/commands/VersionCommand.d.ts +2 -0
- package/dist/commands/VersionCommand.d.ts.map +1 -1
- package/dist/commands/VersionCommand.js +10 -46
- package/dist/commands/VersionCommand.js.map +1 -1
- package/dist/commands/index.d.ts +2 -1
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +4 -1
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/scheduler-runtime.d.ts +2 -2
- package/dist/commands/scheduler-runtime.d.ts.map +1 -1
- package/dist/commands/scheduler-runtime.js +6 -4
- package/dist/commands/scheduler-runtime.js.map +1 -1
- package/dist/config/types.d.ts +7 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/delivery/DeliveryDispatcher.d.ts +3 -0
- package/dist/delivery/DeliveryDispatcher.d.ts.map +1 -1
- package/dist/delivery/DeliveryDispatcher.js +6 -2
- package/dist/delivery/DeliveryDispatcher.js.map +1 -1
- package/dist/delivery/HttpMultipartDelivery.d.ts +13 -0
- package/dist/delivery/HttpMultipartDelivery.d.ts.map +1 -1
- package/dist/delivery/HttpMultipartDelivery.js +34 -19
- package/dist/delivery/HttpMultipartDelivery.js.map +1 -1
- package/dist/delivery/OutboxWorker.d.ts +14 -0
- package/dist/delivery/OutboxWorker.d.ts.map +1 -1
- package/dist/delivery/OutboxWorker.js +120 -5
- package/dist/delivery/OutboxWorker.js.map +1 -1
- package/dist/delivery/errorClass.d.ts +12 -0
- package/dist/delivery/errorClass.d.ts.map +1 -0
- package/dist/delivery/errorClass.js +34 -0
- package/dist/delivery/errorClass.js.map +1 -0
- package/dist/download/IllustrationDownloader.d.ts +1 -1
- package/dist/download/IllustrationDownloader.d.ts.map +1 -1
- package/dist/download/NovelDownloader.d.ts +1 -1
- package/dist/download/NovelDownloader.d.ts.map +1 -1
- package/dist/download/RankingService.d.ts +1 -1
- package/dist/download/RankingService.d.ts.map +1 -1
- package/dist/download/handlers/IllustrationTargetHandler.d.ts.map +1 -1
- package/dist/download/handlers/IllustrationTargetHandler.js +12 -5
- 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 +12 -5
- package/dist/download/handlers/NovelTargetHandler.js.map +1 -1
- package/dist/download/pipeline/DownloadPipeline.d.ts +1 -1
- package/dist/download/pipeline/DownloadPipeline.d.ts.map +1 -1
- package/dist/download/plan/DownloadPlanner.d.ts +1 -1
- package/dist/download/plan/DownloadPlanner.d.ts.map +1 -1
- package/dist/download/recovery/ErrorRecovery.d.ts.map +1 -1
- package/dist/download/recovery/ErrorRecovery.js +8 -2
- package/dist/download/recovery/ErrorRecovery.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/interfaces/IPixivClient.d.ts +1 -5
- package/dist/interfaces/IPixivClient.d.ts.map +1 -1
- package/dist/package.json +1 -1
- package/dist/pixiv/AuthClient.d.ts +6 -12
- package/dist/pixiv/AuthClient.d.ts.map +1 -1
- package/dist/pixiv/AuthClient.js +7 -188
- package/dist/pixiv/AuthClient.js.map +1 -1
- package/dist/pixiv/PixivClient.d.ts +14 -156
- package/dist/pixiv/PixivClient.d.ts.map +1 -1
- package/dist/pixiv/PixivClient.js +15 -292
- package/dist/pixiv/PixivClient.js.map +1 -1
- package/dist/pixiv-client/PixivAuthTokenProvider.d.ts +16 -0
- package/dist/pixiv-client/PixivAuthTokenProvider.d.ts.map +1 -0
- package/dist/pixiv-client/PixivAuthTokenProvider.js +27 -0
- package/dist/pixiv-client/PixivAuthTokenProvider.js.map +1 -0
- package/dist/pixiv-client/PixivFlowPixivClient.d.ts +77 -0
- package/dist/pixiv-client/PixivFlowPixivClient.d.ts.map +1 -0
- package/dist/pixiv-client/PixivFlowPixivClient.js +146 -0
- package/dist/pixiv-client/PixivFlowPixivClient.js.map +1 -0
- package/dist/pixiv-client/TargetSearchRunner.d.ts +29 -0
- package/dist/pixiv-client/TargetSearchRunner.d.ts.map +1 -0
- package/dist/pixiv-client/TargetSearchRunner.js +182 -0
- package/dist/pixiv-client/TargetSearchRunner.js.map +1 -0
- package/dist/pixiv-client/createPixivFlowClient.d.ts +11 -0
- package/dist/pixiv-client/createPixivFlowClient.d.ts.map +1 -0
- package/dist/pixiv-client/createPixivFlowClient.js +29 -0
- package/dist/pixiv-client/createPixivFlowClient.js.map +1 -0
- package/dist/pixiv-client/query-mapper.d.ts +14 -0
- package/dist/pixiv-client/query-mapper.d.ts.map +1 -0
- package/dist/pixiv-client/query-mapper.js +63 -0
- package/dist/pixiv-client/query-mapper.js.map +1 -0
- package/dist/random-download.js +4 -4
- package/dist/random-download.js.map +1 -1
- package/dist/scheduler/SlotCoordinator.d.ts +7 -0
- package/dist/scheduler/SlotCoordinator.d.ts.map +1 -1
- package/dist/scheduler/SlotCoordinator.js +26 -0
- package/dist/scheduler/SlotCoordinator.js.map +1 -1
- package/dist/storage/Database.d.ts +4 -0
- package/dist/storage/Database.d.ts.map +1 -1
- package/dist/storage/Database.js +7 -0
- package/dist/storage/Database.js.map +1 -1
- package/dist/storage/DatabaseMigration.d.ts.map +1 -1
- package/dist/storage/DatabaseMigration.js +30 -0
- package/dist/storage/DatabaseMigration.js.map +1 -1
- package/dist/storage/repositories/OutboxRepository.d.ts +56 -0
- package/dist/storage/repositories/OutboxRepository.d.ts.map +1 -1
- package/dist/storage/repositories/OutboxRepository.js +189 -0
- package/dist/storage/repositories/OutboxRepository.js.map +1 -1
- package/dist/storage/repositories/RateLimitStateRepository.d.ts +17 -0
- package/dist/storage/repositories/RateLimitStateRepository.d.ts.map +1 -0
- package/dist/storage/repositories/RateLimitStateRepository.js +46 -0
- package/dist/storage/repositories/RateLimitStateRepository.js.map +1 -0
- package/dist/tags/types.d.ts +1 -1
- package/dist/tags/types.d.ts.map +1 -1
- package/dist/utils/concurrency.d.ts.map +1 -1
- package/dist/utils/concurrency.js +2 -1
- package/dist/utils/concurrency.js.map +1 -1
- package/dist/utils/errors.d.ts +20 -0
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +56 -1
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/pixiv-sort.d.ts +1 -1
- package/dist/utils/pixiv-sort.d.ts.map +1 -1
- package/dist/utils/pixiv-utils.d.ts +1 -1
- package/dist/utils/pixiv-utils.d.ts.map +1 -1
- package/dist/utils/redact.d.ts +14 -0
- package/dist/utils/redact.d.ts.map +1 -0
- package/dist/utils/redact.js +47 -0
- package/dist/utils/redact.js.map +1 -0
- package/dist/utils/token-maintenance.d.ts +1 -1
- package/dist/utils/token-maintenance.d.ts.map +1 -1
- package/dist/version.d.ts +5 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +6 -0
- package/dist/version.js.map +1 -0
- package/dist/webui/package.json +1 -1
- package/dist/webui/services/DownloadTaskManager.js +4 -4
- package/dist/webui/services/DownloadTaskManager.js.map +1 -1
- package/package.json +11 -4
- package/dist/pixiv/IPixivRequestHandler.d.ts +0 -26
- package/dist/pixiv/IPixivRequestHandler.d.ts.map +0 -1
- package/dist/pixiv/IPixivRequestHandler.js +0 -3
- package/dist/pixiv/IPixivRequestHandler.js.map +0 -1
- package/dist/pixiv/RateLimitCoordinator.d.ts +0 -30
- package/dist/pixiv/RateLimitCoordinator.d.ts.map +0 -1
- package/dist/pixiv/RateLimitCoordinator.js +0 -66
- package/dist/pixiv/RateLimitCoordinator.js.map +0 -1
- package/dist/pixiv/client/IllustService.d.ts +0 -24
- package/dist/pixiv/client/IllustService.d.ts.map +0 -1
- package/dist/pixiv/client/IllustService.js +0 -70
- package/dist/pixiv/client/IllustService.js.map +0 -1
- package/dist/pixiv/client/MediaDownloadService.d.ts +0 -11
- package/dist/pixiv/client/MediaDownloadService.d.ts.map +0 -1
- package/dist/pixiv/client/MediaDownloadService.js +0 -22
- package/dist/pixiv/client/MediaDownloadService.js.map +0 -1
- package/dist/pixiv/client/NovelService.d.ts +0 -30
- package/dist/pixiv/client/NovelService.d.ts.map +0 -1
- package/dist/pixiv/client/NovelService.js +0 -203
- package/dist/pixiv/client/NovelService.js.map +0 -1
- package/dist/pixiv/client/PixivApiCore.d.ts +0 -52
- package/dist/pixiv/client/PixivApiCore.d.ts.map +0 -1
- package/dist/pixiv/client/PixivApiCore.js +0 -412
- package/dist/pixiv/client/PixivApiCore.js.map +0 -1
- package/dist/pixiv/client/SearchService.d.ts +0 -21
- package/dist/pixiv/client/SearchService.d.ts.map +0 -1
- package/dist/pixiv/client/SearchService.js +0 -207
- package/dist/pixiv/client/SearchService.js.map +0 -1
- package/dist/pixiv/client/search/SearchFilters.d.ts +0 -31
- package/dist/pixiv/client/search/SearchFilters.d.ts.map +0 -1
- package/dist/pixiv/client/search/SearchFilters.js +0 -102
- package/dist/pixiv/client/search/SearchFilters.js.map +0 -1
- package/dist/pixiv/types.d.ts +0 -72
- package/dist/pixiv/types.d.ts.map +0 -1
- package/dist/pixiv/types.js +0 -6
- package/dist/pixiv/types.js.map +0 -1
|
@@ -1,295 +1,18 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.PixivClient = void 0;
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
proxyAgent;
|
|
19
|
-
apiCore;
|
|
20
|
-
rateLimiter;
|
|
21
|
-
illustService;
|
|
22
|
-
novelService;
|
|
23
|
-
mediaService;
|
|
24
|
-
searchService;
|
|
25
|
-
constructor(auth, config) {
|
|
26
|
-
this.auth = auth;
|
|
27
|
-
this.config = config;
|
|
28
|
-
// Setup proxy agent if configured
|
|
29
|
-
// Note: This proxyAgent is currently unused as all requests go through PixivApiCore
|
|
30
|
-
// Keeping it for potential future use or backward compatibility
|
|
31
|
-
const proxy = this.config.network?.proxy;
|
|
32
|
-
if (proxy?.enabled && proxy.host && proxy.port) {
|
|
33
|
-
// Normalize protocol to lowercase for consistent comparison
|
|
34
|
-
const protocol = (proxy.protocol || 'http').toLowerCase();
|
|
35
|
-
const auth = proxy.username && proxy.password
|
|
36
|
-
? `${proxy.username}:${proxy.password}@`
|
|
37
|
-
: '';
|
|
38
|
-
const proxyUrl = `${protocol}://${auth}${proxy.host}:${proxy.port}`;
|
|
39
|
-
// Only create ProxyAgent for HTTP/HTTPS protocols (SOCKS is handled by PixivApiCore)
|
|
40
|
-
if (protocol === 'http' || protocol === 'https') {
|
|
41
|
-
this.proxyAgent = new undici_1.ProxyAgent(proxyUrl);
|
|
42
|
-
logger_1.logger.info('Proxy enabled', {
|
|
43
|
-
protocol,
|
|
44
|
-
host: proxy.host,
|
|
45
|
-
port: proxy.port
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
else if (protocol === 'socks4' || protocol === 'socks5' || protocol === 'socks') {
|
|
49
|
-
// SOCKS proxy will be handled by PixivApiCore using socks-proxy-agent
|
|
50
|
-
logger_1.logger.info('SOCKS proxy configured (will be handled by PixivApiCore)', {
|
|
51
|
-
protocol,
|
|
52
|
-
host: proxy.host,
|
|
53
|
-
port: proxy.port,
|
|
54
|
-
});
|
|
55
|
-
}
|
|
56
|
-
else {
|
|
57
|
-
logger_1.logger.warn('Unknown proxy protocol, skipping ProxyAgent creation', {
|
|
58
|
-
protocol,
|
|
59
|
-
host: proxy.host,
|
|
60
|
-
port: proxy.port,
|
|
61
|
-
});
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
// Initialize PixivApiCore for HTTP concerns (retry/timeout/rate-limit/proxy)
|
|
65
|
-
const network = this.config.network ?? {};
|
|
66
|
-
const proxyUrlStr = (() => {
|
|
67
|
-
const p = this.config.network?.proxy;
|
|
68
|
-
if (p?.enabled && p.host && p.port) {
|
|
69
|
-
// Normalize protocol to lowercase for consistent comparison
|
|
70
|
-
const protocol = (p.protocol || 'http').toLowerCase();
|
|
71
|
-
const auth = p.username && p.password ? `${p.username}:${p.password}@` : '';
|
|
72
|
-
return `${protocol}://${auth}${p.host}:${p.port}`;
|
|
73
|
-
}
|
|
74
|
-
return undefined;
|
|
75
|
-
})();
|
|
76
|
-
// ONE global gate: a 429 anywhere parks the whole Pixiv client, avoiding
|
|
77
|
-
// inner*outer request amplification. Default request retry is small (the
|
|
78
|
-
// outbox/scheduler own durable retry across runs).
|
|
79
|
-
// Default pacing is 0: the gate's job is the shared 429 cooldown, not an
|
|
80
|
-
// artificial per-request delay. Operators can opt into pacing explicitly.
|
|
81
|
-
const pace = network.requestPacingMs ?? 0;
|
|
82
|
-
this.rateLimiter = new RateLimitCoordinator_1.RateLimitCoordinator(pace);
|
|
83
|
-
this.apiCore = new PixivApiCore_1.PixivApiCore({
|
|
84
|
-
baseUrl: 'https://app-api.pixiv.net',
|
|
85
|
-
userAgent: this.config.pixiv.userAgent,
|
|
86
|
-
defaultTimeoutMs: network.timeoutMs ?? 30_000,
|
|
87
|
-
maxRetries: network.retries ?? 2,
|
|
88
|
-
proxyUrl: proxyUrlStr,
|
|
89
|
-
getAccessToken: () => this.auth.getAccessToken(),
|
|
90
|
-
rateLimiter: this.rateLimiter,
|
|
91
|
-
});
|
|
92
|
-
// Initialize domain services
|
|
93
|
-
this.illustService = new IllustService_1.IllustService(this.apiCore);
|
|
94
|
-
this.novelService = new NovelService_1.NovelService(this.apiCore);
|
|
95
|
-
this.mediaService = new MediaDownloadService_1.MediaDownloadService(this.apiCore);
|
|
96
|
-
this.searchService = new SearchService_1.SearchService(this.apiCore);
|
|
97
|
-
}
|
|
98
|
-
/** Process-wide Pixiv rate-limit gate (used by doctor/health). */
|
|
99
|
-
getRateLimiter() {
|
|
100
|
-
return this.rateLimiter;
|
|
101
|
-
}
|
|
102
|
-
/**
|
|
103
|
-
* Safely parse date string to timestamp
|
|
104
|
-
* Returns 0 for invalid dates to ensure consistent sorting
|
|
105
|
-
* @deprecated Use parsePixivDate from pixiv-utils instead
|
|
106
|
-
*/
|
|
107
|
-
parseDate(dateString) {
|
|
108
|
-
return (0, pixiv_utils_1.parsePixivDate)(dateString);
|
|
109
|
-
}
|
|
110
|
-
/**
|
|
111
|
-
* Parse date range from target config
|
|
112
|
-
* Returns { startDate, endDate } as Date objects, or null if invalid
|
|
113
|
-
* Validates that startDate <= endDate
|
|
114
|
-
*/
|
|
115
|
-
parseDateRange(target) {
|
|
116
|
-
return (0, date_utils_1.parseDateRange)(target.startDate, target.endDate);
|
|
117
|
-
}
|
|
118
|
-
/**
|
|
119
|
-
* Check if item date is within the specified range
|
|
120
|
-
* Handles invalid dates gracefully
|
|
121
|
-
*/
|
|
122
|
-
isDateInRange(itemDate, startDate, endDate) {
|
|
123
|
-
return (0, date_utils_1.isDateInRange)(itemDate, startDate, endDate);
|
|
124
|
-
}
|
|
125
|
-
/**
|
|
126
|
-
* Search illustrations using target config
|
|
127
|
-
* Implements IPixivClient interface
|
|
128
|
-
*/
|
|
129
|
-
async searchIllustrations(target) {
|
|
130
|
-
const requestDelay = this.config.download?.requestDelay ?? 3000;
|
|
131
|
-
return this.searchService.searchIllustrations(target, requestDelay);
|
|
132
|
-
}
|
|
133
|
-
async getTagAutocomplete(seed) {
|
|
134
|
-
return this.searchService.getTagAutocomplete(seed);
|
|
135
|
-
}
|
|
136
|
-
async searchIllustrationsForTags(seed, limit, options = {}) {
|
|
137
|
-
return this.searchIllustrations({
|
|
138
|
-
type: 'illustration',
|
|
139
|
-
tag: seed,
|
|
140
|
-
searchTarget: 'partial_match_for_tags',
|
|
141
|
-
sort: 'date_desc',
|
|
142
|
-
limit,
|
|
143
|
-
startDate: options.startDate,
|
|
144
|
-
endDate: options.endDate,
|
|
145
|
-
r18: options.includeR18,
|
|
146
|
-
});
|
|
147
|
-
}
|
|
148
|
-
async searchNovelsForTags(seed, limit, options = {}) {
|
|
149
|
-
return this.searchNovels({
|
|
150
|
-
type: 'novel',
|
|
151
|
-
tag: seed,
|
|
152
|
-
searchTarget: 'partial_match_for_tags',
|
|
153
|
-
sort: 'date_desc',
|
|
154
|
-
limit,
|
|
155
|
-
startDate: options.startDate,
|
|
156
|
-
endDate: options.endDate,
|
|
157
|
-
r18: options.includeR18,
|
|
158
|
-
});
|
|
159
|
-
}
|
|
160
|
-
/**
|
|
161
|
-
* Get current user information
|
|
162
|
-
* Implements IPixivClient interface
|
|
163
|
-
*/
|
|
164
|
-
async getUser() {
|
|
165
|
-
const url = this.createRequestUrl('v1/user/profile', {});
|
|
166
|
-
logger_1.logger.debug('Fetching user profile');
|
|
167
|
-
try {
|
|
168
|
-
const response = await this.request(url, { method: 'GET' });
|
|
169
|
-
return response.user_profile.user;
|
|
170
|
-
}
|
|
171
|
-
catch (error) {
|
|
172
|
-
logger_1.logger.error('Failed to get user profile', { error: error instanceof Error ? error.message : String(error) });
|
|
173
|
-
throw error;
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
/**
|
|
177
|
-
* Get illustration details by ID
|
|
178
|
-
* Implements IPixivClient interface
|
|
179
|
-
*/
|
|
180
|
-
async getIllustration(id) {
|
|
181
|
-
return this.illustService.getIllustration(id);
|
|
182
|
-
}
|
|
183
|
-
/**
|
|
184
|
-
* Get novel details by ID
|
|
185
|
-
* Implements IPixivClient interface
|
|
186
|
-
*/
|
|
187
|
-
async getNovel(id) {
|
|
188
|
-
return this.getNovelDetail(id);
|
|
189
|
-
}
|
|
190
|
-
/**
|
|
191
|
-
* Get user illustrations
|
|
192
|
-
* Implements IPixivClient interface
|
|
193
|
-
*/
|
|
194
|
-
async getUserIllustrations(userId, options) {
|
|
195
|
-
return this.illustService.getUserIllustrations(userId, options);
|
|
196
|
-
}
|
|
197
|
-
/**
|
|
198
|
-
* Get user novels
|
|
199
|
-
* Implements IPixivClient interface
|
|
200
|
-
*/
|
|
201
|
-
async getUserNovels(userId, options) {
|
|
202
|
-
return this.novelService.getUserNovels(userId, options);
|
|
203
|
-
}
|
|
204
|
-
/**
|
|
205
|
-
* Search illustrations for a single tag (internal method)
|
|
206
|
-
*/
|
|
207
|
-
// Search implementation moved to SearchService
|
|
208
|
-
/**
|
|
209
|
-
* Search novels using target config
|
|
210
|
-
* Implements IPixivClient interface
|
|
211
|
-
*/
|
|
212
|
-
async searchNovels(target) {
|
|
213
|
-
const requestDelay = this.config.download?.requestDelay ?? 3000;
|
|
214
|
-
return this.searchService.searchNovels(target, requestDelay);
|
|
215
|
-
}
|
|
216
|
-
/**
|
|
217
|
-
* Search novels for a single tag (internal method)
|
|
218
|
-
*/
|
|
219
|
-
// Search implementation moved to SearchService
|
|
220
|
-
/**
|
|
221
|
-
* Get ranking illustrations
|
|
222
|
-
* @param mode Ranking mode (day, week, month, etc.)
|
|
223
|
-
* @param date Date in YYYY-MM-DD format (optional, defaults to today)
|
|
224
|
-
* @param limit Maximum number of results
|
|
225
|
-
*/
|
|
226
|
-
async getRankingIllustrations(mode = 'day', date, limit) {
|
|
227
|
-
return this.illustService.getRankingIllustrations(mode, date, limit);
|
|
228
|
-
}
|
|
229
|
-
/**
|
|
230
|
-
* Get ranking novels
|
|
231
|
-
* @param mode Ranking mode (day, week, month, etc.)
|
|
232
|
-
* @param date Date in YYYY-MM-DD format (optional, defaults to today)
|
|
233
|
-
* @param limit Maximum number of results
|
|
234
|
-
*/
|
|
235
|
-
async getRankingNovels(mode = 'day', date, limit) {
|
|
236
|
-
return this.novelService.getRankingNovels(mode, date, limit);
|
|
237
|
-
}
|
|
238
|
-
/**
|
|
239
|
-
* Get illustration detail with tags for filtering
|
|
240
|
-
*/
|
|
241
|
-
async getIllustDetailWithTags(illustId) {
|
|
242
|
-
return this.illustService.getIllustDetailWithTags(illustId);
|
|
243
|
-
}
|
|
244
|
-
/**
|
|
245
|
-
* Get novel detail with tags for filtering
|
|
246
|
-
*/
|
|
247
|
-
async getNovelDetailWithTags(novelId) {
|
|
248
|
-
return this.novelService.getNovelDetailWithTags(novelId);
|
|
249
|
-
}
|
|
250
|
-
async getIllustDetail(illustId) {
|
|
251
|
-
return this.illustService.getIllustration(illustId);
|
|
252
|
-
}
|
|
253
|
-
async getNovelDetail(novelId) {
|
|
254
|
-
return this.novelService.getNovelDetail(novelId);
|
|
255
|
-
}
|
|
256
|
-
/**
|
|
257
|
-
* Get novel text content
|
|
258
|
-
* Implements IPixivClient interface
|
|
259
|
-
*/
|
|
260
|
-
async getNovelText(novelId) {
|
|
261
|
-
return this.novelService.getNovelText(novelId, { userAgent: this.config.pixiv.userAgent });
|
|
262
|
-
}
|
|
263
|
-
async ugoiraMetadata(illustId) {
|
|
264
|
-
const res = await this.apiCore.request(`/v1/ugoira/metadata?illust_id=${encodeURIComponent(String(illustId))}`, { method: 'GET' });
|
|
265
|
-
return res.ugoira_metadata;
|
|
266
|
-
}
|
|
267
|
-
/**
|
|
268
|
-
* Get all novels in a series
|
|
269
|
-
*/
|
|
270
|
-
async getNovelSeries(seriesId) {
|
|
271
|
-
return this.novelService.getNovelSeries(seriesId);
|
|
272
|
-
}
|
|
273
|
-
async downloadImage(originalUrl) {
|
|
274
|
-
return this.mediaService.downloadImage(originalUrl, this.config.pixiv.userAgent);
|
|
275
|
-
}
|
|
276
|
-
// fetchBinary is removed; MediaDownloadService handles binary downloads
|
|
277
|
-
createRequestUrl(path, params) {
|
|
278
|
-
const url = new URL(path, this.baseUrl);
|
|
279
|
-
Object.entries(params).forEach(([key, value]) => url.searchParams.append(key, value));
|
|
280
|
-
return url.toString();
|
|
281
|
-
}
|
|
282
|
-
async request(url, init) {
|
|
283
|
-
// Preserve existing headers (App-OS info) while delegating to ApiCore
|
|
284
|
-
const headers = {
|
|
285
|
-
'App-OS': 'ios',
|
|
286
|
-
'App-OS-Version': '14.6',
|
|
287
|
-
'App-Version': '7.13.3',
|
|
288
|
-
Referer: 'https://app-api.pixiv.net/',
|
|
289
|
-
...init.headers,
|
|
290
|
-
};
|
|
291
|
-
return this.apiCore.request(url, { ...init, headers });
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
exports.PixivClient = PixivClient;
|
|
3
|
+
exports.createPixivFlowClient = exports.PixivClient = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* @deprecated Import from `../pixiv-client/PixivFlowPixivClient` (product) or
|
|
6
|
+
* from `@redtidev/pixiv-client` (the independent kit). This module is a
|
|
7
|
+
* thin backward-compatibility shim for code that still imports the old path.
|
|
8
|
+
*
|
|
9
|
+
* The reusable Pixiv protocol/client code now lives in the
|
|
10
|
+
* `packages/pixiv-client` workspace package (@redtidev/pixiv-client). The
|
|
11
|
+
* class below is the PixivFlow-specific compatibility adapter (TargetConfig
|
|
12
|
+
* queries, product defaults) composed on top of it.
|
|
13
|
+
*/
|
|
14
|
+
var PixivFlowPixivClient_1 = require("../pixiv-client/PixivFlowPixivClient");
|
|
15
|
+
Object.defineProperty(exports, "PixivClient", { enumerable: true, get: function () { return PixivFlowPixivClient_1.PixivFlowPixivClient; } });
|
|
16
|
+
var createPixivFlowClient_1 = require("../pixiv-client/createPixivFlowClient");
|
|
17
|
+
Object.defineProperty(exports, "createPixivFlowClient", { enumerable: true, get: function () { return createPixivFlowClient_1.createPixivFlowClient; } });
|
|
295
18
|
//# sourceMappingURL=PixivClient.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PixivClient.js","sourceRoot":"","sources":["../../src/pixiv/PixivClient.ts"],"names":[],"mappings":";;;AAAA
|
|
1
|
+
{"version":3,"file":"PixivClient.js","sourceRoot":"","sources":["../../src/pixiv/PixivClient.ts"],"names":[],"mappings":";;;AAAA;;;;;;;;;GASG;AACH,6EAA2F;AAAlF,mHAAA,oBAAoB,OAAe;AAC5C,+EAA8E;AAArE,8HAAA,qBAAqB,OAAA"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { AccessTokenProvider, RefreshableAccessTokenProvider } from '@redtidev/pixiv-client';
|
|
2
|
+
import type { PixivAuth } from '../auth/PixivAuth';
|
|
3
|
+
/**
|
|
4
|
+
* Adapter that exposes PixivFlow's OAuth/refresh-token machinery to the kit
|
|
5
|
+
* through its tiny AccessTokenProvider port. The kit never learns about
|
|
6
|
+
* config files, SQLite, puppeteer or the python login helper.
|
|
7
|
+
*/
|
|
8
|
+
export declare class PixivAuthTokenProvider implements RefreshableAccessTokenProvider {
|
|
9
|
+
private readonly auth;
|
|
10
|
+
constructor(auth: PixivAuth);
|
|
11
|
+
getAccessToken(): Promise<string>;
|
|
12
|
+
refreshAccessToken(): Promise<string>;
|
|
13
|
+
}
|
|
14
|
+
/** Type guard helper for wiring sites. */
|
|
15
|
+
export declare function asTokenProvider(auth: PixivAuth): AccessTokenProvider;
|
|
16
|
+
//# sourceMappingURL=PixivAuthTokenProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PixivAuthTokenProvider.d.ts","sourceRoot":"","sources":["../../src/pixiv-client/PixivAuthTokenProvider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,8BAA8B,EAAE,MAAM,wBAAwB,CAAC;AAClG,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEnD;;;;GAIG;AACH,qBAAa,sBAAuB,YAAW,8BAA8B;IAC/D,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,SAAS;IAE5C,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC;IAIjC,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC;CAGtC;AAED,0CAA0C;AAC1C,wBAAgB,eAAe,CAAC,IAAI,EAAE,SAAS,GAAG,mBAAmB,CAEpE"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PixivAuthTokenProvider = void 0;
|
|
4
|
+
exports.asTokenProvider = asTokenProvider;
|
|
5
|
+
/**
|
|
6
|
+
* Adapter that exposes PixivFlow's OAuth/refresh-token machinery to the kit
|
|
7
|
+
* through its tiny AccessTokenProvider port. The kit never learns about
|
|
8
|
+
* config files, SQLite, puppeteer or the python login helper.
|
|
9
|
+
*/
|
|
10
|
+
class PixivAuthTokenProvider {
|
|
11
|
+
auth;
|
|
12
|
+
constructor(auth) {
|
|
13
|
+
this.auth = auth;
|
|
14
|
+
}
|
|
15
|
+
getAccessToken() {
|
|
16
|
+
return this.auth.getAccessToken();
|
|
17
|
+
}
|
|
18
|
+
refreshAccessToken() {
|
|
19
|
+
return this.auth.refreshAccessTokenForClient();
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
exports.PixivAuthTokenProvider = PixivAuthTokenProvider;
|
|
23
|
+
/** Type guard helper for wiring sites. */
|
|
24
|
+
function asTokenProvider(auth) {
|
|
25
|
+
return new PixivAuthTokenProvider(auth);
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=PixivAuthTokenProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PixivAuthTokenProvider.js","sourceRoot":"","sources":["../../src/pixiv-client/PixivAuthTokenProvider.ts"],"names":[],"mappings":";;;AAqBA,0CAEC;AApBD;;;;GAIG;AACH,MAAa,sBAAsB;IACJ;IAA7B,YAA6B,IAAe;QAAf,SAAI,GAAJ,IAAI,CAAW;IAAG,CAAC;IAEhD,cAAc;QACZ,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;IACpC,CAAC;IAED,kBAAkB;QAChB,OAAO,IAAI,CAAC,IAAI,CAAC,2BAA2B,EAAE,CAAC;IACjD,CAAC;CACF;AAVD,wDAUC;AAED,0CAA0C;AAC1C,SAAgB,eAAe,CAAC,IAAe;IAC7C,OAAO,IAAI,sBAAsB,CAAC,IAAI,CAAC,CAAC;AAC1C,CAAC"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { PixivClient as KitPixivClient, RateLimitGate, type AccessTokenProvider, type KitLogger, type PixivIllust, type PixivNovel, type PixivNovelTextResponse, type PixivTag, type RateLimitStateStore } from '@redtidev/pixiv-client';
|
|
2
|
+
import type { StandaloneConfig, TargetConfig } from '../config';
|
|
3
|
+
import type { IPixivClient } from '../interfaces/IPixivClient';
|
|
4
|
+
export interface PixivFlowPixivClientOptions {
|
|
5
|
+
auth: AccessTokenProvider;
|
|
6
|
+
config: StandaloneConfig;
|
|
7
|
+
logger?: KitLogger;
|
|
8
|
+
/**
|
|
9
|
+
* Persistent gate state (SQLite). When omitted the kit keeps state in
|
|
10
|
+
* memory (process-local). PixivFlow wires an SQLite adapter so a deploy
|
|
11
|
+
* restart does not forget an active Pixiv cooldown.
|
|
12
|
+
*/
|
|
13
|
+
rateLimitStateStore?: RateLimitStateStore;
|
|
14
|
+
/** Logical scope inside the state store (e.g. account/refresh-token id). */
|
|
15
|
+
rateLimitScope?: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Compatibility adapter: the PixivFlow-specific class that the whole product
|
|
19
|
+
* already depends on ({@link IPixivClient}), now implemented entirely by
|
|
20
|
+
* composing the independent kit.
|
|
21
|
+
*
|
|
22
|
+
* Responsibilities kept HERE (product): TargetConfig queries, tag search
|
|
23
|
+
* options, inter-page requestDelay, UA selection, ranking date.
|
|
24
|
+
* Responsibilities delegated to the kit: HTTP, auth headers, retries,
|
|
25
|
+
* pacing, 429 cooldown, circuit breaker, coalescing, proxy, typed errors.
|
|
26
|
+
*/
|
|
27
|
+
export declare class PixivFlowPixivClient implements IPixivClient {
|
|
28
|
+
private readonly kit;
|
|
29
|
+
private readonly searchRunner;
|
|
30
|
+
private readonly config;
|
|
31
|
+
constructor(options: PixivFlowPixivClientOptions);
|
|
32
|
+
/** The underlying independent kit client (advanced/embedding use). */
|
|
33
|
+
getKit(): KitPixivClient;
|
|
34
|
+
/** Shared 429 gate, exposed for doctor/health/monitor. */
|
|
35
|
+
getRateLimiter(): RateLimitGate;
|
|
36
|
+
getRateLimitStatus(): Promise<import("@redtidev/pixiv-client").RateLimitStatus>;
|
|
37
|
+
searchIllustrations(target: TargetConfig): Promise<PixivIllust[]>;
|
|
38
|
+
searchNovels(target: TargetConfig): Promise<PixivNovel[]>;
|
|
39
|
+
getTagAutocomplete(seed: string): Promise<PixivTag[]>;
|
|
40
|
+
searchIllustrationsForTags(seed: string, limit: number, options?: {
|
|
41
|
+
startDate?: string;
|
|
42
|
+
endDate?: string;
|
|
43
|
+
includeR18?: boolean;
|
|
44
|
+
}): Promise<PixivIllust[]>;
|
|
45
|
+
searchNovelsForTags(seed: string, limit: number, options?: {
|
|
46
|
+
startDate?: string;
|
|
47
|
+
endDate?: string;
|
|
48
|
+
includeR18?: boolean;
|
|
49
|
+
}): Promise<PixivNovel[]>;
|
|
50
|
+
getIllustration(id: number): Promise<PixivIllust>;
|
|
51
|
+
getNovel(id: number): Promise<PixivNovel>;
|
|
52
|
+
getUserIllustrations(userId: string, options?: {
|
|
53
|
+
limit?: number;
|
|
54
|
+
offset?: number;
|
|
55
|
+
}): Promise<PixivIllust[]>;
|
|
56
|
+
getUserNovels(userId: string, options?: {
|
|
57
|
+
limit?: number;
|
|
58
|
+
offset?: number;
|
|
59
|
+
}): Promise<PixivNovel[]>;
|
|
60
|
+
getRankingIllustrations(mode?: string, date?: string, limit?: number): Promise<PixivIllust[]>;
|
|
61
|
+
getRankingNovels(mode?: string, date?: string, limit?: number): Promise<PixivNovel[]>;
|
|
62
|
+
getIllustDetailWithTags(illustId: number): Promise<{
|
|
63
|
+
illust: PixivIllust;
|
|
64
|
+
tags: PixivTag[];
|
|
65
|
+
}>;
|
|
66
|
+
getNovelDetailWithTags(novelId: number): Promise<{
|
|
67
|
+
novel: PixivNovel;
|
|
68
|
+
tags: PixivTag[];
|
|
69
|
+
}>;
|
|
70
|
+
getIllustDetail(illustId: number): Promise<PixivIllust>;
|
|
71
|
+
getNovelDetail(novelId: number): Promise<PixivNovel>;
|
|
72
|
+
getNovelText(novelId: number): Promise<PixivNovelTextResponse>;
|
|
73
|
+
ugoiraMetadata(illustId: number): Promise<import("@redtidev/pixiv-client").UgoiraMetadata>;
|
|
74
|
+
getNovelSeries(seriesId: number): Promise<PixivNovel[]>;
|
|
75
|
+
downloadImage(originalUrl: string): Promise<ArrayBuffer>;
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=PixivFlowPixivClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PixivFlowPixivClient.d.ts","sourceRoot":"","sources":["../../src/pixiv-client/PixivFlowPixivClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PixivFlowPixivClient = void 0;
|
|
4
|
+
const pixiv_client_1 = require("@redtidev/pixiv-client");
|
|
5
|
+
const query_mapper_1 = require("./query-mapper");
|
|
6
|
+
const TargetSearchRunner_1 = require("./TargetSearchRunner");
|
|
7
|
+
/**
|
|
8
|
+
* Compatibility adapter: the PixivFlow-specific class that the whole product
|
|
9
|
+
* already depends on ({@link IPixivClient}), now implemented entirely by
|
|
10
|
+
* composing the independent kit.
|
|
11
|
+
*
|
|
12
|
+
* Responsibilities kept HERE (product): TargetConfig queries, tag search
|
|
13
|
+
* options, inter-page requestDelay, UA selection, ranking date.
|
|
14
|
+
* Responsibilities delegated to the kit: HTTP, auth headers, retries,
|
|
15
|
+
* pacing, 429 cooldown, circuit breaker, coalescing, proxy, typed errors.
|
|
16
|
+
*/
|
|
17
|
+
class PixivFlowPixivClient {
|
|
18
|
+
kit;
|
|
19
|
+
searchRunner;
|
|
20
|
+
config;
|
|
21
|
+
constructor(options) {
|
|
22
|
+
this.config = options.config;
|
|
23
|
+
const network = options.config.network ?? {};
|
|
24
|
+
const proxy = options.config.network?.proxy;
|
|
25
|
+
const proxyOptions = proxy?.enabled && proxy.host && proxy.port
|
|
26
|
+
? {
|
|
27
|
+
protocol: (proxy.protocol ?? 'http').toLowerCase(),
|
|
28
|
+
host: proxy.host,
|
|
29
|
+
port: proxy.port,
|
|
30
|
+
username: proxy.username,
|
|
31
|
+
password: proxy.password,
|
|
32
|
+
}
|
|
33
|
+
: undefined;
|
|
34
|
+
// Backward-compatible operator override. New safe DEFAULT (1000ms pacing,
|
|
35
|
+
// 60s initial cooldown) applies unless the deployment sets
|
|
36
|
+
// network.requestPacingMs explicitly (including 0 to opt out of pacing).
|
|
37
|
+
const networkExtra = network;
|
|
38
|
+
const pacingConfigured = Object.prototype.hasOwnProperty.call(network, 'requestPacingMs');
|
|
39
|
+
this.kit = new pixiv_client_1.PixivClient({
|
|
40
|
+
auth: options.auth,
|
|
41
|
+
baseUrl: 'https://app-api.pixiv.net',
|
|
42
|
+
userAgent: options.config.pixiv.userAgent,
|
|
43
|
+
timeoutMs: network.timeoutMs ?? 30_000,
|
|
44
|
+
retries: network.retries ?? 2,
|
|
45
|
+
proxy: proxyOptions,
|
|
46
|
+
rateLimit: {
|
|
47
|
+
...(pacingConfigured ? { minIntervalMs: networkExtra.requestPacingMs } : {}),
|
|
48
|
+
stateStore: options.rateLimitStateStore,
|
|
49
|
+
scope: options.rateLimitScope,
|
|
50
|
+
},
|
|
51
|
+
logger: options.logger,
|
|
52
|
+
});
|
|
53
|
+
this.searchRunner = new TargetSearchRunner_1.TargetSearchRunner(this.kit);
|
|
54
|
+
}
|
|
55
|
+
/** The underlying independent kit client (advanced/embedding use). */
|
|
56
|
+
getKit() {
|
|
57
|
+
return this.kit;
|
|
58
|
+
}
|
|
59
|
+
/** Shared 429 gate, exposed for doctor/health/monitor. */
|
|
60
|
+
getRateLimiter() {
|
|
61
|
+
return this.kit.getRateLimitGate();
|
|
62
|
+
}
|
|
63
|
+
getRateLimitStatus() {
|
|
64
|
+
return this.kit.getRateLimitStatus();
|
|
65
|
+
}
|
|
66
|
+
// -- IPixivClient surface ---------------------------------------------------
|
|
67
|
+
searchIllustrations(target) {
|
|
68
|
+
const requestDelay = this.config.download?.requestDelay ?? 500;
|
|
69
|
+
return this.searchRunner.searchIllustrations(target, requestDelay);
|
|
70
|
+
}
|
|
71
|
+
searchNovels(target) {
|
|
72
|
+
const requestDelay = this.config.download?.requestDelay ?? 500;
|
|
73
|
+
return this.searchRunner.searchNovels(target, requestDelay);
|
|
74
|
+
}
|
|
75
|
+
getTagAutocomplete(seed) {
|
|
76
|
+
return this.kit.tags.autocomplete(seed);
|
|
77
|
+
}
|
|
78
|
+
searchIllustrationsForTags(seed, limit, options = {}) {
|
|
79
|
+
return this.searchIllustrations({
|
|
80
|
+
type: 'illustration',
|
|
81
|
+
tag: seed,
|
|
82
|
+
searchTarget: 'partial_match_for_tags',
|
|
83
|
+
sort: 'date_desc',
|
|
84
|
+
limit,
|
|
85
|
+
startDate: options.startDate,
|
|
86
|
+
endDate: options.endDate,
|
|
87
|
+
r18: options.includeR18,
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
searchNovelsForTags(seed, limit, options = {}) {
|
|
91
|
+
return this.searchNovels({
|
|
92
|
+
type: 'novel',
|
|
93
|
+
tag: seed,
|
|
94
|
+
searchTarget: 'partial_match_for_tags',
|
|
95
|
+
sort: 'date_desc',
|
|
96
|
+
limit,
|
|
97
|
+
startDate: options.startDate,
|
|
98
|
+
endDate: options.endDate,
|
|
99
|
+
r18: options.includeR18,
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
getIllustration(id) {
|
|
103
|
+
return this.kit.illustrations.get(id);
|
|
104
|
+
}
|
|
105
|
+
getNovel(id) {
|
|
106
|
+
return this.kit.novels.detailCompatible(id);
|
|
107
|
+
}
|
|
108
|
+
getUserIllustrations(userId, options) {
|
|
109
|
+
return this.kit.illustrations.listByUser(userId, options);
|
|
110
|
+
}
|
|
111
|
+
getUserNovels(userId, options) {
|
|
112
|
+
return this.kit.novels.listByUser(userId, options);
|
|
113
|
+
}
|
|
114
|
+
getRankingIllustrations(mode = 'day', date, limit) {
|
|
115
|
+
return this.kit.illustrations.ranking((0, query_mapper_1.asIllustRankingMode)(mode), { date, limit });
|
|
116
|
+
}
|
|
117
|
+
getRankingNovels(mode = 'day', date, limit) {
|
|
118
|
+
return this.kit.novels.ranking((0, query_mapper_1.asNovelRankingMode)(mode), { date, limit });
|
|
119
|
+
}
|
|
120
|
+
getIllustDetailWithTags(illustId) {
|
|
121
|
+
return this.kit.illustrations.detailWithTags(illustId);
|
|
122
|
+
}
|
|
123
|
+
getNovelDetailWithTags(novelId) {
|
|
124
|
+
return this.kit.novels.detailWithTags(novelId);
|
|
125
|
+
}
|
|
126
|
+
getIllustDetail(illustId) {
|
|
127
|
+
return this.kit.illustrations.detail(illustId);
|
|
128
|
+
}
|
|
129
|
+
getNovelDetail(novelId) {
|
|
130
|
+
return this.kit.novels.detailCompatible(novelId);
|
|
131
|
+
}
|
|
132
|
+
getNovelText(novelId) {
|
|
133
|
+
return this.kit.novels.text(novelId, { browserUserAgent: this.config.pixiv.userAgent });
|
|
134
|
+
}
|
|
135
|
+
ugoiraMetadata(illustId) {
|
|
136
|
+
return this.kit.illustrations.ugoiraMetadata(illustId);
|
|
137
|
+
}
|
|
138
|
+
getNovelSeries(seriesId) {
|
|
139
|
+
return this.kit.novels.listSeries(seriesId);
|
|
140
|
+
}
|
|
141
|
+
downloadImage(originalUrl) {
|
|
142
|
+
return this.kit.media.fetch(originalUrl, { referer: 'https://app-api.pixiv.net/' });
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
exports.PixivFlowPixivClient = PixivFlowPixivClient;
|
|
146
|
+
//# sourceMappingURL=PixivFlowPixivClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PixivFlowPixivClient.js","sourceRoot":"","sources":["../../src/pixiv-client/PixivFlowPixivClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { PixivClient as KitPixivClient, PixivIllust, PixivNovel } from '@redtidev/pixiv-client';
|
|
2
|
+
import type { TargetConfig } from '../config';
|
|
3
|
+
/**
|
|
4
|
+
* Host-side replacement for the old in-kit SearchService: drives the kit's
|
|
5
|
+
* per-page API with PixivFlow-specific date-aware pagination, early stop,
|
|
6
|
+
* tag-OR merging, over-fetch and final sorting. Nothing here belongs in the
|
|
7
|
+
* reusable kit (all of it is TargetConfig/product behavior).
|
|
8
|
+
*/
|
|
9
|
+
export declare class TargetSearchRunner {
|
|
10
|
+
private readonly kit;
|
|
11
|
+
constructor(kit: KitPixivClient);
|
|
12
|
+
searchIllustrations(target: TargetConfig, requestDelayMs: number): Promise<PixivIllust[]>;
|
|
13
|
+
searchNovels(target: TargetConfig, requestDelayMs: number): Promise<PixivNovel[]>;
|
|
14
|
+
private mergeTagUnion;
|
|
15
|
+
private searchSingleIllust;
|
|
16
|
+
private searchSingleNovel;
|
|
17
|
+
/**
|
|
18
|
+
* Date-aware pagination. Mirrors the legacy SearchService semantics:
|
|
19
|
+
* - parse/validate the configured date range;
|
|
20
|
+
* - over-fetch when a limit + date filter would otherwise truncate too early;
|
|
21
|
+
* - stop paging once date_desc/date_asc walks past the range boundary;
|
|
22
|
+
* - post-filter popular_desc results by the date range;
|
|
23
|
+
* - final stable sort + target.limit slice.
|
|
24
|
+
*/
|
|
25
|
+
private searchWithPagination;
|
|
26
|
+
private filterItemByDate;
|
|
27
|
+
private calculateFetchLimit;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=TargetSearchRunner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TargetSearchRunner.d.ts","sourceRoot":"","sources":["../../src/pixiv-client/TargetSearchRunner.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,WAAW,IAAI,cAAc,EAC7B,WAAW,EACX,UAAU,EAGX,MAAM,wBAAwB,CAAC;AAMhC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAG9C;;;;;GAKG;AACH,qBAAa,kBAAkB;IACjB,OAAO,CAAC,QAAQ,CAAC,GAAG;gBAAH,GAAG,EAAE,cAAc;IAE1C,mBAAmB,CAAC,MAAM,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IASzF,YAAY,CAAC,MAAM,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;YASzE,aAAa;YA0Bb,kBAAkB;YAclB,iBAAiB;IAc/B;;;;;;;OAOG;YACW,oBAAoB;IAsFlC,OAAO,CAAC,gBAAgB;IAsCxB,OAAO,CAAC,mBAAmB;CAW5B"}
|