pixivflow 2.9.0 → 2.10.1
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 +2 -0
- package/dist/commands/TopicCommand.d.ts +19 -0
- package/dist/commands/TopicCommand.d.ts.map +1 -0
- package/dist/commands/TopicCommand.js +114 -0
- package/dist/commands/TopicCommand.js.map +1 -0
- 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/config/types.d.ts +45 -2
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/validation.d.ts.map +1 -1
- package/dist/config/validation.js +40 -3
- package/dist/config/validation.js.map +1 -1
- package/dist/download/DownloadManager.d.ts.map +1 -1
- package/dist/download/DownloadManager.js +7 -2
- package/dist/download/DownloadManager.js.map +1 -1
- package/dist/download/handlers/IllustrationTargetHandler.d.ts +5 -1
- package/dist/download/handlers/IllustrationTargetHandler.d.ts.map +1 -1
- package/dist/download/handlers/IllustrationTargetHandler.js +26 -1
- package/dist/download/handlers/IllustrationTargetHandler.js.map +1 -1
- package/dist/download/handlers/NovelTargetHandler.d.ts +4 -1
- package/dist/download/handlers/NovelTargetHandler.d.ts.map +1 -1
- package/dist/download/handlers/NovelTargetHandler.js +23 -1
- package/dist/download/handlers/NovelTargetHandler.js.map +1 -1
- package/dist/package.json +1 -1
- package/dist/pixiv/PixivClient.d.ts +8 -2
- package/dist/pixiv/PixivClient.d.ts.map +1 -1
- package/dist/pixiv/PixivClient.js +6 -2
- package/dist/pixiv/PixivClient.js.map +1 -1
- package/dist/pixiv/types.d.ts +7 -0
- package/dist/pixiv/types.d.ts.map +1 -1
- package/dist/storage/Database.d.ts +2 -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/topic/TopicCache.d.ts +23 -0
- package/dist/topic/TopicCache.d.ts.map +1 -0
- package/dist/topic/TopicCache.js +78 -0
- package/dist/topic/TopicCache.js.map +1 -0
- package/dist/topic/TopicPipeline.d.ts +49 -0
- package/dist/topic/TopicPipeline.d.ts.map +1 -0
- package/dist/topic/TopicPipeline.js +224 -0
- package/dist/topic/TopicPipeline.js.map +1 -0
- package/dist/topic/TopicResolver.d.ts +31 -0
- package/dist/topic/TopicResolver.d.ts.map +1 -0
- package/dist/topic/TopicResolver.js +162 -0
- package/dist/topic/TopicResolver.js.map +1 -0
- package/dist/topic/TopicTagScorer.d.ts +13 -0
- package/dist/topic/TopicTagScorer.d.ts.map +1 -0
- package/dist/topic/TopicTagScorer.js +109 -0
- package/dist/topic/TopicTagScorer.js.map +1 -0
- package/dist/topic/createTopicPipeline.d.ts +16 -0
- package/dist/topic/createTopicPipeline.d.ts.map +1 -0
- package/dist/topic/createTopicPipeline.js +33 -0
- package/dist/topic/createTopicPipeline.js.map +1 -0
- package/dist/topic/types.d.ts +93 -0
- package/dist/topic/types.d.ts.map +1 -0
- package/dist/topic/types.js +8 -0
- package/dist/topic/types.js.map +1 -0
- package/dist/webui/package.json +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { IPixivClient } from '../interfaces/IPixivClient';
|
|
2
|
+
import { TopicPipeline } from './TopicPipeline';
|
|
3
|
+
export type TopicPipelineFactory = () => TopicPipeline;
|
|
4
|
+
/**
|
|
5
|
+
* Builds the topic pipeline with a persistent cache beside the SQLite database
|
|
6
|
+
* (which lives on the data volume in Docker, so it survives container rebuilds).
|
|
7
|
+
* One instance is shared across targets within a download run.
|
|
8
|
+
*/
|
|
9
|
+
type DbPathSource = string | {
|
|
10
|
+
getDatabasePath(): string;
|
|
11
|
+
} | undefined;
|
|
12
|
+
export declare function createTopicPipeline(client: IPixivClient, databasePath: DbPathSource, requestDelayMs?: number): TopicPipeline;
|
|
13
|
+
/** Lazily builds one shared pipeline per download run (cache + resolver). */
|
|
14
|
+
export declare function createTopicPipelineFactory(client: IPixivClient, databasePath: DbPathSource, requestDelayMs?: number): TopicPipelineFactory;
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=createTopicPipeline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createTopicPipeline.d.ts","sourceRoot":"","sources":["../../src/topic/createTopicPipeline.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE/D,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAGhD,MAAM,MAAM,oBAAoB,GAAG,MAAM,aAAa,CAAC;AAEvD;;;;GAIG;AACH,KAAK,YAAY,GAAG,MAAM,GAAG;IAAE,eAAe,IAAI,MAAM,CAAA;CAAE,GAAG,SAAS,CAAC;AAYvE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,cAAc,SAAM,GAAG,aAAa,CAKzH;AAED,6EAA6E;AAC7E,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,cAAc,SAAM,GAAG,oBAAoB,CAMvI"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createTopicPipeline = createTopicPipeline;
|
|
4
|
+
exports.createTopicPipelineFactory = createTopicPipelineFactory;
|
|
5
|
+
const node_path_1 = require("node:path");
|
|
6
|
+
const TopicCache_1 = require("./TopicCache");
|
|
7
|
+
const TopicPipeline_1 = require("./TopicPipeline");
|
|
8
|
+
const TopicResolver_1 = require("./TopicResolver");
|
|
9
|
+
function resolveDbPath(source) {
|
|
10
|
+
const raw = typeof source === 'function'
|
|
11
|
+
? undefined
|
|
12
|
+
: source && typeof source === 'object'
|
|
13
|
+
? source.getDatabasePath()
|
|
14
|
+
: source;
|
|
15
|
+
const absolute = raw && (0, node_path_1.isAbsolute)(raw) ? raw : (0, node_path_1.resolve)(process.cwd(), raw ?? 'data/pixiv-downloader.db');
|
|
16
|
+
return absolute;
|
|
17
|
+
}
|
|
18
|
+
function createTopicPipeline(client, databasePath, requestDelayMs = 500) {
|
|
19
|
+
const resolved = resolveDbPath(databasePath);
|
|
20
|
+
const cache = new TopicCache_1.TopicCache((0, node_path_1.resolve)((0, node_path_1.dirname)(resolved), 'topic-cache'));
|
|
21
|
+
const resolver = new TopicResolver_1.TopicResolver(client, cache, requestDelayMs);
|
|
22
|
+
return new TopicPipeline_1.TopicPipeline(client, resolver, requestDelayMs);
|
|
23
|
+
}
|
|
24
|
+
/** Lazily builds one shared pipeline per download run (cache + resolver). */
|
|
25
|
+
function createTopicPipelineFactory(client, databasePath, requestDelayMs = 500) {
|
|
26
|
+
let instance;
|
|
27
|
+
return () => {
|
|
28
|
+
if (!instance)
|
|
29
|
+
instance = createTopicPipeline(client, databasePath, requestDelayMs);
|
|
30
|
+
return instance;
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=createTopicPipeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createTopicPipeline.js","sourceRoot":"","sources":["../../src/topic/createTopicPipeline.ts"],"names":[],"mappings":";;AA4BA,kDAKC;AAGD,gEAMC;AAzCD,yCAAwE;AAIxE,6CAA0C;AAC1C,mDAAgD;AAChD,mDAAgD;AAWhD,SAAS,aAAa,CAAC,MAAoB;IACzC,MAAM,GAAG,GAAG,OAAO,MAAM,KAAK,UAAU;QACtC,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;YACpC,CAAC,CAAC,MAAM,CAAC,eAAe,EAAE;YAC1B,CAAC,CAAC,MAAM,CAAC;IACb,MAAM,QAAQ,GAAG,GAAG,IAAI,IAAA,sBAAU,EAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAA,mBAAW,EAAC,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,IAAI,0BAA0B,CAAC,CAAC;IAC9G,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAgB,mBAAmB,CAAC,MAAoB,EAAE,YAA0B,EAAE,cAAc,GAAG,GAAG;IACxG,MAAM,QAAQ,GAAG,aAAa,CAAC,YAAY,CAAC,CAAC;IAC7C,MAAM,KAAK,GAAG,IAAI,uBAAU,CAAC,IAAA,mBAAW,EAAC,IAAA,mBAAO,EAAC,QAAQ,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC;IAC5E,MAAM,QAAQ,GAAG,IAAI,6BAAa,CAAC,MAAe,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC;IAC3E,OAAO,IAAI,6BAAa,CAAC,MAAe,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC;AACtE,CAAC;AAED,6EAA6E;AAC7E,SAAgB,0BAA0B,CAAC,MAAoB,EAAE,YAA0B,EAAE,cAAc,GAAG,GAAG;IAC/G,IAAI,QAAmC,CAAC;IACxC,OAAO,GAAG,EAAE;QACV,IAAI,CAAC,QAAQ;YAAE,QAAQ,GAAG,mBAAmB,CAAC,MAAM,EAAE,YAAY,EAAE,cAAc,CAAC,CAAC;QACpF,OAAO,QAAQ,CAAC;IAClB,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Semantic-topic download: resolve a user topic into a dynamic, Pixiv-derived
|
|
3
|
+
* search space. Pure metadata/tag signals only — no LLM, VLM, embeddings or
|
|
4
|
+
* local models are used anywhere in this module.
|
|
5
|
+
*/
|
|
6
|
+
export type TopicContentType = 'illustration' | 'novel';
|
|
7
|
+
/** A single related tag with a 0..1 relatedness score and provenance. */
|
|
8
|
+
export interface ResolvedTag {
|
|
9
|
+
name: string;
|
|
10
|
+
translatedName?: string;
|
|
11
|
+
/** Combined relatedness score (co-occurrence * specificity * suggestion). */
|
|
12
|
+
score: number;
|
|
13
|
+
/** How many sampled works (of the seed search) carried this tag. */
|
|
14
|
+
occurrences: number;
|
|
15
|
+
/** Coverage of the sampled seed works (occurrences / sample size). */
|
|
16
|
+
coverage: number;
|
|
17
|
+
/** Specificity: high when common with the topic but rare in the background. */
|
|
18
|
+
specificity: number;
|
|
19
|
+
/** Present in Pixiv autocomplete for the seed. */
|
|
20
|
+
suggested: boolean;
|
|
21
|
+
/** The seed tag always scores 1.0 and is always included. */
|
|
22
|
+
seed: boolean;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* The resolved search space for one topic + content type. Cached on the data
|
|
26
|
+
* volume so daily runs reuse it and a failed refresh can fall back to it.
|
|
27
|
+
*/
|
|
28
|
+
export interface TopicSpace {
|
|
29
|
+
version: 1;
|
|
30
|
+
topic: string;
|
|
31
|
+
contentType: TopicContentType;
|
|
32
|
+
createdAt: string;
|
|
33
|
+
expiresAt: string;
|
|
34
|
+
sampleSize: number;
|
|
35
|
+
sampledWorks: number;
|
|
36
|
+
tags: ResolvedTag[];
|
|
37
|
+
}
|
|
38
|
+
export interface TopicDiscoveryOptions {
|
|
39
|
+
maxTags?: number;
|
|
40
|
+
sampleWorks?: number;
|
|
41
|
+
cacheDays?: number;
|
|
42
|
+
minScore?: number;
|
|
43
|
+
refresh?: boolean;
|
|
44
|
+
}
|
|
45
|
+
export interface TopicCollectOptions {
|
|
46
|
+
maxPerTag?: number;
|
|
47
|
+
maxCandidates?: number;
|
|
48
|
+
minMetadataScore?: number;
|
|
49
|
+
}
|
|
50
|
+
/** A trimmed candidate: only fields needed for filtering/ranking. */
|
|
51
|
+
export interface TopicCandidate {
|
|
52
|
+
id: number;
|
|
53
|
+
type: TopicContentType;
|
|
54
|
+
title: string;
|
|
55
|
+
caption: string;
|
|
56
|
+
tags: string[];
|
|
57
|
+
bookmarks: number;
|
|
58
|
+
views: number;
|
|
59
|
+
/** Local popularity score (bookmarks + views/1000). */
|
|
60
|
+
popularity: number;
|
|
61
|
+
/** Metadata topic-relevance score computed by the filter stage. */
|
|
62
|
+
metadataScore: number;
|
|
63
|
+
}
|
|
64
|
+
/** Minimal surface the resolver/collector need from the Pixiv client. */
|
|
65
|
+
export interface TopicClient {
|
|
66
|
+
getTagAutocomplete(seed: string): Promise<Array<{
|
|
67
|
+
name: string;
|
|
68
|
+
translated_name?: string;
|
|
69
|
+
}>>;
|
|
70
|
+
searchIllustrationsForTags(seed: string, limit: number, options?: {
|
|
71
|
+
startDate?: string;
|
|
72
|
+
endDate?: string;
|
|
73
|
+
}): Promise<Array<WorkLike>>;
|
|
74
|
+
searchNovelsForTags(seed: string, limit: number, options?: {
|
|
75
|
+
startDate?: string;
|
|
76
|
+
endDate?: string;
|
|
77
|
+
}): Promise<Array<WorkLike>>;
|
|
78
|
+
}
|
|
79
|
+
export interface WorkLike {
|
|
80
|
+
id: number;
|
|
81
|
+
title?: string;
|
|
82
|
+
caption?: string;
|
|
83
|
+
create_date?: string;
|
|
84
|
+
tags?: Array<{
|
|
85
|
+
name: string;
|
|
86
|
+
translated_name?: string;
|
|
87
|
+
}>;
|
|
88
|
+
total_bookmarks?: number;
|
|
89
|
+
bookmark_count?: number;
|
|
90
|
+
total_view?: number;
|
|
91
|
+
view_count?: number;
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/topic/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,MAAM,gBAAgB,GAAG,cAAc,GAAG,OAAO,CAAC;AAExD,yEAAyE;AACzE,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,6EAA6E;IAC7E,KAAK,EAAE,MAAM,CAAC;IACd,oEAAoE;IACpE,WAAW,EAAE,MAAM,CAAC;IACpB,sEAAsE;IACtE,QAAQ,EAAE,MAAM,CAAC;IACjB,+EAA+E;IAC/E,WAAW,EAAE,MAAM,CAAC;IACpB,kDAAkD;IAClD,SAAS,EAAE,OAAO,CAAC;IACnB,6DAA6D;IAC7D,IAAI,EAAE,OAAO,CAAC;CACf;AAED;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,CAAC,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,gBAAgB,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,WAAW,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,qEAAqE;AACrE,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,gBAAgB,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,uDAAuD;IACvD,UAAU,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,yEAAyE;AACzE,MAAM,WAAW,WAAW;IAC1B,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,eAAe,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC;IAC7F,0BAA0B,CACxB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GACjD,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC5B,mBAAmB,CACjB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GACjD,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;CAC7B;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,eAAe,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACzD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Semantic-topic download: resolve a user topic into a dynamic, Pixiv-derived
|
|
4
|
+
* search space. Pure metadata/tag signals only — no LLM, VLM, embeddings or
|
|
5
|
+
* local models are used anywhere in this module.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/topic/types.ts"],"names":[],"mappings":";AAAA;;;;GAIG"}
|
package/dist/webui/package.json
CHANGED
package/package.json
CHANGED