pixivflow 2.9.0 → 2.10.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.
Files changed (62) hide show
  1. package/README.md +2 -0
  2. package/dist/commands/TopicCommand.d.ts +19 -0
  3. package/dist/commands/TopicCommand.d.ts.map +1 -0
  4. package/dist/commands/TopicCommand.js +113 -0
  5. package/dist/commands/TopicCommand.js.map +1 -0
  6. package/dist/commands/index.d.ts +2 -1
  7. package/dist/commands/index.d.ts.map +1 -1
  8. package/dist/commands/index.js +4 -1
  9. package/dist/commands/index.js.map +1 -1
  10. package/dist/config/types.d.ts +45 -2
  11. package/dist/config/types.d.ts.map +1 -1
  12. package/dist/config/validation.d.ts.map +1 -1
  13. package/dist/config/validation.js +40 -3
  14. package/dist/config/validation.js.map +1 -1
  15. package/dist/download/DownloadManager.d.ts.map +1 -1
  16. package/dist/download/DownloadManager.js +5 -2
  17. package/dist/download/DownloadManager.js.map +1 -1
  18. package/dist/download/handlers/IllustrationTargetHandler.d.ts +5 -1
  19. package/dist/download/handlers/IllustrationTargetHandler.d.ts.map +1 -1
  20. package/dist/download/handlers/IllustrationTargetHandler.js +26 -1
  21. package/dist/download/handlers/IllustrationTargetHandler.js.map +1 -1
  22. package/dist/download/handlers/NovelTargetHandler.d.ts +4 -1
  23. package/dist/download/handlers/NovelTargetHandler.d.ts.map +1 -1
  24. package/dist/download/handlers/NovelTargetHandler.js +23 -1
  25. package/dist/download/handlers/NovelTargetHandler.js.map +1 -1
  26. package/dist/package.json +1 -1
  27. package/dist/pixiv/PixivClient.d.ts +8 -2
  28. package/dist/pixiv/PixivClient.d.ts.map +1 -1
  29. package/dist/pixiv/PixivClient.js +6 -2
  30. package/dist/pixiv/PixivClient.js.map +1 -1
  31. package/dist/pixiv/types.d.ts +7 -0
  32. package/dist/pixiv/types.d.ts.map +1 -1
  33. package/dist/storage/Database.d.ts +2 -0
  34. package/dist/storage/Database.d.ts.map +1 -1
  35. package/dist/storage/Database.js +4 -0
  36. package/dist/storage/Database.js.map +1 -1
  37. package/dist/topic/TopicCache.d.ts +23 -0
  38. package/dist/topic/TopicCache.d.ts.map +1 -0
  39. package/dist/topic/TopicCache.js +78 -0
  40. package/dist/topic/TopicCache.js.map +1 -0
  41. package/dist/topic/TopicPipeline.d.ts +49 -0
  42. package/dist/topic/TopicPipeline.d.ts.map +1 -0
  43. package/dist/topic/TopicPipeline.js +224 -0
  44. package/dist/topic/TopicPipeline.js.map +1 -0
  45. package/dist/topic/TopicResolver.d.ts +31 -0
  46. package/dist/topic/TopicResolver.d.ts.map +1 -0
  47. package/dist/topic/TopicResolver.js +162 -0
  48. package/dist/topic/TopicResolver.js.map +1 -0
  49. package/dist/topic/TopicTagScorer.d.ts +13 -0
  50. package/dist/topic/TopicTagScorer.d.ts.map +1 -0
  51. package/dist/topic/TopicTagScorer.js +109 -0
  52. package/dist/topic/TopicTagScorer.js.map +1 -0
  53. package/dist/topic/createTopicPipeline.d.ts +12 -0
  54. package/dist/topic/createTopicPipeline.d.ts.map +1 -0
  55. package/dist/topic/createTopicPipeline.js +31 -0
  56. package/dist/topic/createTopicPipeline.js.map +1 -0
  57. package/dist/topic/types.d.ts +93 -0
  58. package/dist/topic/types.d.ts.map +1 -0
  59. package/dist/topic/types.js +8 -0
  60. package/dist/topic/types.js.map +1 -0
  61. package/dist/webui/package.json +1 -1
  62. package/package.json +1 -1
@@ -0,0 +1,31 @@
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
+ /**
10
+ * Builds the topic pipeline with a persistent cache beside the SQLite database
11
+ * (which lives on the data volume in Docker, so it survives container rebuilds).
12
+ * One instance is shared across targets within a download run.
13
+ */
14
+ function createTopicPipeline(client, databasePath, requestDelayMs = 500) {
15
+ const resolved = databasePath && (0, node_path_1.isAbsolute)(databasePath)
16
+ ? databasePath
17
+ : (0, node_path_1.resolve)(process.cwd(), databasePath ?? 'data/pixiv-downloader.db');
18
+ const cache = new TopicCache_1.TopicCache((0, node_path_1.resolve)((0, node_path_1.dirname)(resolved), 'topic-cache'));
19
+ const resolver = new TopicResolver_1.TopicResolver(client, cache, requestDelayMs);
20
+ return new TopicPipeline_1.TopicPipeline(client, resolver, requestDelayMs);
21
+ }
22
+ /** Lazily builds one shared pipeline per download run (cache + resolver). */
23
+ function createTopicPipelineFactory(client, databasePath, requestDelayMs = 500) {
24
+ let instance;
25
+ return () => {
26
+ if (!instance)
27
+ instance = createTopicPipeline(client, databasePath, requestDelayMs);
28
+ return instance;
29
+ };
30
+ }
31
+ //# sourceMappingURL=createTopicPipeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createTopicPipeline.js","sourceRoot":"","sources":["../../src/topic/createTopicPipeline.ts"],"names":[],"mappings":";;AAgBA,kDAOC;AAGD,gEAMC;AA/BD,yCAAwE;AAIxE,6CAA0C;AAC1C,mDAAgD;AAChD,mDAAgD;AAIhD;;;;GAIG;AACH,SAAgB,mBAAmB,CAAC,MAAoB,EAAE,YAAgC,EAAE,cAAc,GAAG,GAAG;IAC9G,MAAM,QAAQ,GAAG,YAAY,IAAI,IAAA,sBAAU,EAAC,YAAY,CAAC;QACvD,CAAC,CAAC,YAAY;QACd,CAAC,CAAC,IAAA,mBAAW,EAAC,OAAO,CAAC,GAAG,EAAE,EAAE,YAAY,IAAI,0BAA0B,CAAC,CAAC;IAC3E,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,YAAgC,EAAE,cAAc,GAAG,GAAG;IACrH,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":"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"}
@@ -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"}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "type": "commonjs",
3
3
  "name": "pixivflow-webui-backend",
4
- "version": "2.9.0",
4
+ "version": "2.10.0",
5
5
  "description": "PixivFlow WebUI Backend - CommonJS module"
6
6
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pixivflow",
3
- "version": "2.9.0",
3
+ "version": "2.10.0",
4
4
  "description": "🎨 智能的 Pixiv 自动化下载工具 - 支持批量下载插画和小说、定时任务、Docker部署 | Intelligent Pixiv Automation Downloader with batch download, scheduler, and Docker support",
5
5
  "repository": {
6
6
  "type": "git",