@zenalexa/unicli 0.220.0 → 0.220.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.
Files changed (182) hide show
  1. package/AGENTS.md +10 -19
  2. package/README.md +17 -11
  3. package/README.zh-CN.md +17 -11
  4. package/dist/adapters/anilist/web.d.ts +11 -0
  5. package/dist/adapters/anilist/web.d.ts.map +1 -0
  6. package/dist/adapters/anilist/web.js +284 -0
  7. package/dist/adapters/anilist/web.js.map +1 -0
  8. package/dist/adapters/bangumi/web.d.ts +14 -0
  9. package/dist/adapters/bangumi/web.d.ts.map +1 -0
  10. package/dist/adapters/bangumi/web.js +257 -0
  11. package/dist/adapters/bangumi/web.js.map +1 -0
  12. package/dist/adapters/dlsite/web.d.ts +31 -0
  13. package/dist/adapters/dlsite/web.d.ts.map +1 -0
  14. package/dist/adapters/dlsite/web.js +455 -0
  15. package/dist/adapters/dlsite/web.js.map +1 -0
  16. package/dist/adapters/ehentai/web.d.ts +66 -0
  17. package/dist/adapters/ehentai/web.d.ts.map +1 -0
  18. package/dist/adapters/ehentai/web.js +608 -0
  19. package/dist/adapters/ehentai/web.js.map +1 -0
  20. package/dist/adapters/jikan/web.d.ts +9 -0
  21. package/dist/adapters/jikan/web.d.ts.map +1 -0
  22. package/dist/adapters/jikan/web.js +154 -0
  23. package/dist/adapters/jikan/web.js.map +1 -0
  24. package/dist/adapters/kitsu/web.d.ts +9 -0
  25. package/dist/adapters/kitsu/web.d.ts.map +1 -0
  26. package/dist/adapters/kitsu/web.js +97 -0
  27. package/dist/adapters/kitsu/web.js.map +1 -0
  28. package/dist/adapters/mangadex/web.d.ts +10 -0
  29. package/dist/adapters/mangadex/web.d.ts.map +1 -0
  30. package/dist/adapters/mangadex/web.js +188 -0
  31. package/dist/adapters/mangadex/web.js.map +1 -0
  32. package/dist/adapters/moegirl/web.d.ts +23 -0
  33. package/dist/adapters/moegirl/web.d.ts.map +1 -0
  34. package/dist/adapters/moegirl/web.js +269 -0
  35. package/dist/adapters/moegirl/web.js.map +1 -0
  36. package/dist/adapters/safebooru/web.d.ts +10 -0
  37. package/dist/adapters/safebooru/web.d.ts.map +1 -0
  38. package/dist/adapters/safebooru/web.js +120 -0
  39. package/dist/adapters/safebooru/web.js.map +1 -0
  40. package/dist/adapters/vndb/web.d.ts +10 -0
  41. package/dist/adapters/vndb/web.d.ts.map +1 -0
  42. package/dist/adapters/vndb/web.js +321 -0
  43. package/dist/adapters/vndb/web.js.map +1 -0
  44. package/dist/agents/codex-pack.d.ts +62 -0
  45. package/dist/agents/codex-pack.d.ts.map +1 -0
  46. package/dist/agents/codex-pack.js +163 -0
  47. package/dist/agents/codex-pack.js.map +1 -0
  48. package/dist/commands/agents.d.ts.map +1 -1
  49. package/dist/commands/agents.js +6 -43
  50. package/dist/commands/agents.js.map +1 -1
  51. package/dist/commands/browser/adapter.d.ts.map +1 -1
  52. package/dist/commands/browser/adapter.js +17 -3
  53. package/dist/commands/browser/adapter.js.map +1 -1
  54. package/dist/commands/describe.d.ts.map +1 -1
  55. package/dist/commands/describe.js +6 -7
  56. package/dist/commands/describe.js.map +1 -1
  57. package/dist/commands/dispatch.d.ts +1 -1
  58. package/dist/commands/dispatch.d.ts.map +1 -1
  59. package/dist/commands/dispatch.js +4 -2
  60. package/dist/commands/dispatch.js.map +1 -1
  61. package/dist/commands/mcp.d.ts +1 -1
  62. package/dist/commands/mcp.d.ts.map +1 -1
  63. package/dist/commands/mcp.js +10 -5
  64. package/dist/commands/mcp.js.map +1 -1
  65. package/dist/core/command-contract-lint.d.ts +10 -0
  66. package/dist/core/command-contract-lint.d.ts.map +1 -0
  67. package/dist/core/command-contract-lint.js +41 -0
  68. package/dist/core/command-contract-lint.js.map +1 -0
  69. package/dist/core/command-contract.d.ts +100 -0
  70. package/dist/core/command-contract.d.ts.map +1 -0
  71. package/dist/core/command-contract.js +174 -0
  72. package/dist/core/command-contract.js.map +1 -0
  73. package/dist/core/index.d.ts +2 -0
  74. package/dist/core/index.d.ts.map +1 -1
  75. package/dist/core/index.js +2 -0
  76. package/dist/core/index.js.map +1 -1
  77. package/dist/discovery/aliases.d.ts +2 -2
  78. package/dist/discovery/aliases.d.ts.map +1 -1
  79. package/dist/discovery/aliases.js +464 -6
  80. package/dist/discovery/aliases.js.map +1 -1
  81. package/dist/discovery/search.d.ts.map +1 -1
  82. package/dist/discovery/search.js +147 -2
  83. package/dist/discovery/search.js.map +1 -1
  84. package/dist/engine/args.d.ts.map +1 -1
  85. package/dist/engine/args.js +18 -1
  86. package/dist/engine/args.js.map +1 -1
  87. package/dist/engine/artifact-validation.d.ts +29 -0
  88. package/dist/engine/artifact-validation.d.ts.map +1 -0
  89. package/dist/engine/artifact-validation.js +211 -0
  90. package/dist/engine/artifact-validation.js.map +1 -0
  91. package/dist/engine/browser/diagnostics.d.ts +38 -0
  92. package/dist/engine/browser/diagnostics.d.ts.map +1 -0
  93. package/dist/engine/browser/diagnostics.js +40 -0
  94. package/dist/engine/browser/diagnostics.js.map +1 -0
  95. package/dist/engine/invoke.d.ts +1 -0
  96. package/dist/engine/invoke.d.ts.map +1 -1
  97. package/dist/engine/invoke.js +1 -0
  98. package/dist/engine/invoke.js.map +1 -1
  99. package/dist/engine/kernel/errors.d.ts +11 -0
  100. package/dist/engine/kernel/errors.d.ts.map +1 -0
  101. package/dist/engine/kernel/errors.js +15 -0
  102. package/dist/engine/kernel/errors.js.map +1 -0
  103. package/dist/engine/kernel/execute.d.ts +7 -18
  104. package/dist/engine/kernel/execute.d.ts.map +1 -1
  105. package/dist/engine/kernel/execute.js +25 -410
  106. package/dist/engine/kernel/execute.js.map +1 -1
  107. package/dist/engine/kernel/stages.d.ts +44 -0
  108. package/dist/engine/kernel/stages.d.ts.map +1 -0
  109. package/dist/engine/kernel/stages.js +428 -0
  110. package/dist/engine/kernel/stages.js.map +1 -0
  111. package/dist/engine/kernel/types.d.ts +21 -1
  112. package/dist/engine/kernel/types.d.ts.map +1 -1
  113. package/dist/engine/steps/download.d.ts +1 -0
  114. package/dist/engine/steps/download.d.ts.map +1 -1
  115. package/dist/engine/steps/download.js +10 -6
  116. package/dist/engine/steps/download.js.map +1 -1
  117. package/dist/fast-path/render.js +1 -1
  118. package/dist/fast-path/render.js.map +1 -1
  119. package/dist/manifest-compact.txt +3 -3
  120. package/dist/manifest-search.json +1 -1
  121. package/dist/manifest.json +3074 -3
  122. package/dist/mcp/handler.d.ts.map +1 -1
  123. package/dist/mcp/handler.js +11 -1
  124. package/dist/mcp/handler.js.map +1 -1
  125. package/dist/mcp/server.d.ts +1 -1
  126. package/dist/mcp/server.js +1 -1
  127. package/dist/mcp/tools.d.ts.map +1 -1
  128. package/dist/mcp/tools.js +18 -10
  129. package/dist/mcp/tools.js.map +1 -1
  130. package/dist/output/error-map.d.ts.map +1 -1
  131. package/dist/output/error-map.js +1 -1
  132. package/dist/output/error-map.js.map +1 -1
  133. package/dist/registry.d.ts.map +1 -1
  134. package/dist/registry.js +2 -1
  135. package/dist/registry.js.map +1 -1
  136. package/package.json +2 -2
  137. package/server.json +3 -3
  138. package/skills/unicli/SKILL.md +1 -1
  139. package/skills/unicli-claude-code/SKILL.md +1 -1
  140. package/skills/unicli-hermes/SKILL.md +1 -1
  141. package/src/adapters/anilist/web.test.ts +93 -0
  142. package/src/adapters/anilist/web.ts +341 -0
  143. package/src/adapters/arxiv/download.yaml +53 -0
  144. package/src/adapters/bangumi/web.test.ts +109 -0
  145. package/src/adapters/bangumi/web.ts +295 -0
  146. package/src/adapters/danbooru/artists.yaml +44 -0
  147. package/src/adapters/danbooru/comments.yaml +45 -0
  148. package/src/adapters/danbooru/detail.yaml +78 -0
  149. package/src/adapters/danbooru/download.yaml +51 -0
  150. package/src/adapters/danbooru/pools.yaml +56 -0
  151. package/src/adapters/danbooru/search.yaml +69 -0
  152. package/src/adapters/danbooru/tags.yaml +42 -0
  153. package/src/adapters/danbooru/wiki.yaml +44 -0
  154. package/src/adapters/dlsite/web.test.ts +132 -0
  155. package/src/adapters/dlsite/web.ts +557 -0
  156. package/src/adapters/ehentai/web.test.ts +157 -0
  157. package/src/adapters/ehentai/web.ts +750 -0
  158. package/src/adapters/jikan/web.test.ts +50 -0
  159. package/src/adapters/jikan/web.ts +177 -0
  160. package/src/adapters/kitsu/web.test.ts +29 -0
  161. package/src/adapters/kitsu/web.ts +109 -0
  162. package/src/adapters/konachan/detail.yaml +62 -0
  163. package/src/adapters/konachan/download.yaml +55 -0
  164. package/src/adapters/konachan/search.yaml +65 -0
  165. package/src/adapters/konachan/tags.yaml +40 -0
  166. package/src/adapters/mangadex/web.test.ts +46 -0
  167. package/src/adapters/mangadex/web.ts +210 -0
  168. package/src/adapters/moegirl/web.test.ts +87 -0
  169. package/src/adapters/moegirl/web.ts +343 -0
  170. package/src/adapters/pdf/read.yaml +49 -0
  171. package/src/adapters/pixiv/download.yaml +15 -2
  172. package/src/adapters/safebooru/detail.yaml +63 -0
  173. package/src/adapters/safebooru/download.yaml +58 -0
  174. package/src/adapters/safebooru/search.yaml +69 -0
  175. package/src/adapters/safebooru/web.test.ts +60 -0
  176. package/src/adapters/safebooru/web.ts +130 -0
  177. package/src/adapters/vndb/web.test.ts +86 -0
  178. package/src/adapters/vndb/web.ts +393 -0
  179. package/src/adapters/yandere/detail.yaml +61 -0
  180. package/src/adapters/yandere/download.yaml +56 -0
  181. package/src/adapters/yandere/search.yaml +67 -0
  182. package/src/adapters/yandere/tags.yaml +41 -0
@@ -0,0 +1,455 @@
1
+ /**
2
+ * @owner src/adapters/dlsite/web.ts
3
+ * @does Register DLsite public search and work detail commands for doujin games, manga, CG, voice, and video.
4
+ * @needs DLsite public search/detail HTML structure and stable product_id URLs.
5
+ * @feeds ACG market research, tag/type search, time/hot/rating sorted discovery.
6
+ * @breaks DLsite search-result card markup drift can hide works.
7
+ */
8
+ import { USER_AGENT } from "../../constants.js";
9
+ import { cli, Strategy } from "../../registry.js";
10
+ const DLSITE_ORIGIN = "https://www.dlsite.com";
11
+ const DLSITE_SERVICE = "maniax";
12
+ function str(value) {
13
+ return value === undefined || value === null ? "" : String(value);
14
+ }
15
+ export function decodeDlsiteHtml(value) {
16
+ return str(value)
17
+ .replace(/&/g, "&")
18
+ .replace(/&lt;/g, "<")
19
+ .replace(/&gt;/g, ">")
20
+ .replace(/&quot;/g, '"')
21
+ .replace(/&#039;/g, "'")
22
+ .replace(/&#39;/g, "'")
23
+ .replace(/<[^>]+>/g, " ")
24
+ .replace(/\s+/g, " ")
25
+ .trim();
26
+ }
27
+ function requireLimit(value, fallback = 20) {
28
+ if (value === undefined || value === null || value === "")
29
+ return fallback;
30
+ const n = Number(value);
31
+ if (!Number.isInteger(n) || n < 1 || n > 100) {
32
+ throw new Error("DLsite limit must be an integer in [1, 100].");
33
+ }
34
+ return n;
35
+ }
36
+ function requireQuery(value) {
37
+ const query = str(value).trim();
38
+ if (!query)
39
+ throw new Error("DLsite query cannot be empty.");
40
+ return query;
41
+ }
42
+ function normalizeProductId(value) {
43
+ const raw = str(value).trim().toUpperCase();
44
+ const match = raw.match(/[A-Z]{2}\d+/);
45
+ if (!match)
46
+ throw new Error("DLsite product id must look like RJ005751.");
47
+ return match[0];
48
+ }
49
+ function normalizeService(value) {
50
+ const service = str(value || DLSITE_SERVICE)
51
+ .trim()
52
+ .toLowerCase();
53
+ if (!/^[a-z0-9_-]+$/.test(service)) {
54
+ throw new Error("DLsite service must be a simple path segment.");
55
+ }
56
+ return service;
57
+ }
58
+ function normalizeMakerId(value) {
59
+ const raw = str(value).trim().toUpperCase();
60
+ const match = raw.match(/[A-Z]{2}\d+/);
61
+ if (!match)
62
+ throw new Error("DLsite maker id must look like RG01012594.");
63
+ return match[0];
64
+ }
65
+ function normalizeGenreId(value) {
66
+ const raw = str(value).trim();
67
+ if (!/^\d{3}$/.test(raw)) {
68
+ throw new Error("DLsite genre id must be a three-digit code like 001.");
69
+ }
70
+ return raw;
71
+ }
72
+ function normalizeSort(value) {
73
+ const key = str(value || "release")
74
+ .toLowerCase()
75
+ .replace(/[\s_-]+/g, "");
76
+ const map = {
77
+ release: "release",
78
+ time: "release",
79
+ newest: "release",
80
+ hot: "dl_d",
81
+ popular: "dl_d",
82
+ sales: "dl_d",
83
+ rating: "rate",
84
+ rate: "rate",
85
+ reviews: "review",
86
+ review: "review",
87
+ price: "price",
88
+ title: "title_d",
89
+ };
90
+ const sort = map[key];
91
+ if (!sort) {
92
+ throw new Error(`Unsupported DLsite sort: ${value}. Supported: release, hot, rating, reviews, price, title.`);
93
+ }
94
+ return sort;
95
+ }
96
+ function normalizeType(value) {
97
+ const key = str(value)
98
+ .trim()
99
+ .toLowerCase()
100
+ .replace(/[\s_-]+/g, "");
101
+ if (!key || key === "all")
102
+ return "";
103
+ const map = {
104
+ manga: "MNG",
105
+ comic: "MNG",
106
+ cg: "ICG",
107
+ illustration: "ICG",
108
+ game: "ADV",
109
+ adv: "ADV",
110
+ novel: "DNV",
111
+ digitalnovel: "DNV",
112
+ voice: "SOU",
113
+ audio: "SOU",
114
+ video: "MOV",
115
+ movie: "MOV",
116
+ };
117
+ const type = map[key];
118
+ if (!type) {
119
+ throw new Error(`Unsupported DLsite work type: ${value}.`);
120
+ }
121
+ return type;
122
+ }
123
+ export function dlsiteSearchUrl(kwargs) {
124
+ const query = encodeURIComponent(requireQuery(kwargs.query));
125
+ const sort = normalizeSort(kwargs.sort);
126
+ const page = Number(kwargs.page ?? 1);
127
+ if (!Number.isInteger(page) || page < 1) {
128
+ throw new Error("DLsite page must be a positive integer.");
129
+ }
130
+ const type = normalizeType(kwargs.type);
131
+ const typePath = type ? `work_type/${type}/` : "";
132
+ return `${DLSITE_ORIGIN}/${DLSITE_SERVICE}/fsr/=/${typePath}keyword/${query}/order/${sort}/page/${page}`;
133
+ }
134
+ function dlsiteListingUrl(path, kwargs) {
135
+ const sort = normalizeSort(kwargs.sort);
136
+ const page = Number(kwargs.page ?? 1);
137
+ if (!Number.isInteger(page) || page < 1) {
138
+ throw new Error("DLsite page must be a positive integer.");
139
+ }
140
+ return `${DLSITE_ORIGIN}/${DLSITE_SERVICE}/fsr/=/${path}/order/${sort}/page/${page}`;
141
+ }
142
+ export function dlsiteMakerUrl(kwargs) {
143
+ const sort = normalizeSort(kwargs.sort);
144
+ const page = Number(kwargs.page ?? 1);
145
+ if (!Number.isInteger(page) || page < 1) {
146
+ throw new Error("DLsite page must be a positive integer.");
147
+ }
148
+ return `${DLSITE_ORIGIN}/${DLSITE_SERVICE}/circle/profile/=/page/${page}/maker_id/${normalizeMakerId(kwargs.maker_id)}.html/order/${sort}`;
149
+ }
150
+ export function dlsiteCreatorUrl(kwargs) {
151
+ const creator = requireQuery(kwargs.creator);
152
+ return dlsiteListingUrl(`keyword_creater/${encodeURIComponent(`"${creator}"`)}/ana_flg/all`, kwargs);
153
+ }
154
+ export function dlsiteGenreUrl(kwargs) {
155
+ return dlsiteListingUrl(`genre/${normalizeGenreId(kwargs.genre)}`, kwargs);
156
+ }
157
+ async function fetchText(url) {
158
+ const response = await fetch(url, {
159
+ headers: {
160
+ Accept: "text/html,application/xhtml+xml",
161
+ "User-Agent": USER_AGENT,
162
+ },
163
+ });
164
+ if (!response.ok) {
165
+ throw new Error(`DLsite request failed with HTTP ${response.status}.`);
166
+ }
167
+ return response.text();
168
+ }
169
+ function firstMatch(value, re) {
170
+ const match = value.match(re);
171
+ return match ? decodeDlsiteHtml(match[1]) : "";
172
+ }
173
+ function rawMatch(value, re) {
174
+ const match = value.match(re);
175
+ return match ? match[1].replace(/&amp;/g, "&") : "";
176
+ }
177
+ function normalizeUrl(value) {
178
+ if (!value)
179
+ return "";
180
+ if (value.startsWith("//"))
181
+ return `https:${value}`;
182
+ if (value.startsWith("/"))
183
+ return `${DLSITE_ORIGIN}${value}`;
184
+ return value;
185
+ }
186
+ export function parseDlsiteSearchHtml(html, limit) {
187
+ const rows = [];
188
+ const starts = [
189
+ ...html.matchAll(/<([a-z][a-z0-9-]*)\b(?=[^>]*\bdata-list_item_product_id="([^"]+)")[^>]*>/gi),
190
+ ];
191
+ for (let i = 0; i < starts.length; i += 1) {
192
+ const start = starts[i];
193
+ const productId = decodeDlsiteHtml(start[2]);
194
+ const begin = start.index ?? 0;
195
+ const end = starts[i + 1]?.index ?? html.length;
196
+ const chunk = html.slice(begin, end);
197
+ const title = firstMatch(chunk, /<dd class="work_name"[\s\S]*?<a[^>]+title="([^"]+)"/);
198
+ if (!productId || !title)
199
+ continue;
200
+ const maker = firstMatch(chunk, /<dd class="maker_name"[\s\S]*?<a[^>]*>([\s\S]*?)<\/a>/);
201
+ const makerId = rawMatch(chunk, /maker_id\/([A-Z]{2}\d+)\.html/i);
202
+ const workType = firstMatch(chunk, /<div class="work_category[^"]*"[\s\S]*?<a[^>]*>([\s\S]*?)<\/a>/);
203
+ const age = firstMatch(chunk, /<span class="icon_[^"]+" title="([^"]+)"/);
204
+ const price = firstMatch(chunk, /<span class="work_price_base">([^<]+)<\/span>/);
205
+ const sales = firstMatch(chunk, /<dd class="work_dl">[\s\S]*?<span[^>]*>([^<]+)<\/span>/);
206
+ const rating = firstMatch(chunk, /<div class="star_rating\s+([^"\s]+)/);
207
+ const reviews = firstMatch(chunk, /<div class="star_rating[^"]*"[^>]*>\(([^)]+)\)/);
208
+ const thumb = normalizeUrl(rawMatch(chunk, /thumb-candidates="\['([^']+)'/) ||
209
+ rawMatch(chunk, /\bdata-src="([^"]+)"/));
210
+ const url = normalizeUrl(rawMatch(chunk, /\blink="([^"]+)"/));
211
+ rows.push({
212
+ rank: rows.length + 1,
213
+ product_id: productId,
214
+ title,
215
+ maker,
216
+ maker_id: makerId.toUpperCase(),
217
+ work_type: workType,
218
+ age,
219
+ price_jpy: price,
220
+ sales,
221
+ rating,
222
+ reviews,
223
+ thumb,
224
+ url: url ||
225
+ `${DLSITE_ORIGIN}/${DLSITE_SERVICE}/work/=/product_id/${productId}.html`,
226
+ });
227
+ if (rows.length >= limit)
228
+ break;
229
+ }
230
+ return rows;
231
+ }
232
+ function outlineValue(html, label) {
233
+ const re = new RegExp(`<th>${label}</th>\\s*<td>([\\s\\S]*?)</td>`, "i");
234
+ return firstMatch(html, re);
235
+ }
236
+ export function parseDlsiteDetailHtml(html, productId, service = DLSITE_SERVICE) {
237
+ const event = rawMatch(html, new RegExp(`<div hidden class="ga4_event_item_${productId}"([^>]*)>`, "i"));
238
+ const eventField = (name) => firstMatch(event, new RegExp(`data-${name}="([^"]*)"`));
239
+ return {
240
+ product_id: productId,
241
+ title: firstMatch(html, /<h1[^>]+id="work_name"[^>]*>([\s\S]*?)<\/h1>/) ||
242
+ firstMatch(html, /<meta property="og:title" content="([^"]+)"/),
243
+ maker: firstMatch(html, /class="maker_name"[\s\S]*?<a[^>]*>([\s\S]*?)<\/a>/) ||
244
+ eventField("maker_id"),
245
+ maker_id: eventField("maker_id"),
246
+ work_type: eventField("work_type") || outlineValue(html, "作品形式"),
247
+ release_date: outlineValue(html, "販売日"),
248
+ age: outlineValue(html, "年齢指定"),
249
+ file_format: outlineValue(html, "ファイル形式"),
250
+ pages: outlineValue(html, "ページ数"),
251
+ file_size: outlineValue(html, "ファイル容量"),
252
+ price_jpy: eventField("price"),
253
+ image: normalizeUrl(rawMatch(html, /<meta property="og:image" content="([^"]+)"/)),
254
+ description: firstMatch(html, /<div itemprop="description" class="work_parts_container">([\s\S]*?)<\/div>\s*<\/div>/).slice(0, 1000),
255
+ url: `${DLSITE_ORIGIN}/${service}/work/=/product_id/${productId}.html`,
256
+ };
257
+ }
258
+ async function runSearch(kwargs) {
259
+ const rows = parseDlsiteSearchHtml(await fetchText(dlsiteSearchUrl(kwargs)), requireLimit(kwargs.limit));
260
+ if (rows.length === 0)
261
+ throw new Error("No DLsite works found.");
262
+ return rows;
263
+ }
264
+ async function runListing(url, kwargs) {
265
+ const rows = parseDlsiteSearchHtml(await fetchText(url), requireLimit(kwargs.limit));
266
+ if (rows.length === 0)
267
+ throw new Error("No DLsite works found.");
268
+ return rows;
269
+ }
270
+ const SEARCH_ARGS = [
271
+ { name: "query", type: "str", required: true, positional: true },
272
+ { name: "limit", type: "int", default: 20 },
273
+ { name: "page", type: "int", default: 1 },
274
+ {
275
+ name: "sort",
276
+ type: "str",
277
+ default: "release",
278
+ choices: ["release", "hot", "rating", "reviews", "price", "title"],
279
+ description: "release, hot, rating, reviews, price, title",
280
+ },
281
+ {
282
+ name: "type",
283
+ type: "str",
284
+ choices: ["all", "manga", "cg", "game", "novel", "voice", "video"],
285
+ description: "all, manga, cg, game, novel, voice, video",
286
+ },
287
+ ];
288
+ const SEARCH_COLUMNS = [
289
+ "rank",
290
+ "product_id",
291
+ "title",
292
+ "maker",
293
+ "maker_id",
294
+ "work_type",
295
+ "age",
296
+ "price_jpy",
297
+ "sales",
298
+ "rating",
299
+ "reviews",
300
+ "url",
301
+ ];
302
+ cli({
303
+ site: "dlsite",
304
+ name: "search",
305
+ description: "Search DLsite doujin works by keyword, type, and sort order",
306
+ domain: "www.dlsite.com",
307
+ strategy: Strategy.PUBLIC,
308
+ browser: false,
309
+ args: SEARCH_ARGS,
310
+ columns: SEARCH_COLUMNS,
311
+ func: async (_page, kwargs) => runSearch(kwargs),
312
+ });
313
+ cli({
314
+ site: "dlsite",
315
+ name: "manga",
316
+ description: "Search DLsite manga works",
317
+ domain: "www.dlsite.com",
318
+ strategy: Strategy.PUBLIC,
319
+ browser: false,
320
+ args: SEARCH_ARGS.filter((arg) => arg.name !== "type"),
321
+ columns: SEARCH_COLUMNS,
322
+ func: async (_page, kwargs) => runSearch({ ...kwargs, type: "manga" }),
323
+ });
324
+ cli({
325
+ site: "dlsite",
326
+ name: "cg",
327
+ description: "Search DLsite CG and illustration works",
328
+ domain: "www.dlsite.com",
329
+ strategy: Strategy.PUBLIC,
330
+ browser: false,
331
+ args: SEARCH_ARGS.filter((arg) => arg.name !== "type"),
332
+ columns: SEARCH_COLUMNS,
333
+ func: async (_page, kwargs) => runSearch({ ...kwargs, type: "cg" }),
334
+ });
335
+ cli({
336
+ site: "dlsite",
337
+ name: "game",
338
+ description: "Search DLsite game and ADV works",
339
+ domain: "www.dlsite.com",
340
+ strategy: Strategy.PUBLIC,
341
+ browser: false,
342
+ args: SEARCH_ARGS.filter((arg) => arg.name !== "type"),
343
+ columns: SEARCH_COLUMNS,
344
+ func: async (_page, kwargs) => runSearch({ ...kwargs, type: "game" }),
345
+ });
346
+ cli({
347
+ site: "dlsite",
348
+ name: "maker",
349
+ description: "Search DLsite works from a circle or maker id such as RG01012594 or VG02994",
350
+ domain: "www.dlsite.com",
351
+ strategy: Strategy.PUBLIC,
352
+ browser: false,
353
+ args: [
354
+ {
355
+ name: "maker_id",
356
+ type: "str",
357
+ required: true,
358
+ positional: true,
359
+ },
360
+ { name: "limit", type: "int", default: 20 },
361
+ { name: "page", type: "int", default: 1 },
362
+ {
363
+ name: "sort",
364
+ type: "str",
365
+ default: "release",
366
+ choices: ["release", "hot", "rating", "reviews", "price", "title"],
367
+ description: "release, hot, rating, reviews, price, title",
368
+ },
369
+ ],
370
+ columns: SEARCH_COLUMNS,
371
+ func: async (_page, kwargs) => runListing(dlsiteMakerUrl(kwargs), kwargs),
372
+ });
373
+ cli({
374
+ site: "dlsite",
375
+ name: "creator",
376
+ description: "Search DLsite works by creator, author, illustrator, or voice actor name",
377
+ domain: "www.dlsite.com",
378
+ strategy: Strategy.PUBLIC,
379
+ browser: false,
380
+ args: [
381
+ { name: "creator", type: "str", required: true, positional: true },
382
+ { name: "limit", type: "int", default: 20 },
383
+ { name: "page", type: "int", default: 1 },
384
+ {
385
+ name: "sort",
386
+ type: "str",
387
+ default: "release",
388
+ choices: ["release", "hot", "rating", "reviews", "price", "title"],
389
+ description: "release, hot, rating, reviews, price, title",
390
+ },
391
+ ],
392
+ columns: SEARCH_COLUMNS,
393
+ func: async (_page, kwargs) => runListing(dlsiteCreatorUrl(kwargs), kwargs),
394
+ });
395
+ cli({
396
+ site: "dlsite",
397
+ name: "genre",
398
+ description: "Search DLsite works by DLsite genre tag id",
399
+ domain: "www.dlsite.com",
400
+ strategy: Strategy.PUBLIC,
401
+ browser: false,
402
+ args: [
403
+ { name: "genre", type: "str", required: true, positional: true },
404
+ { name: "limit", type: "int", default: 20 },
405
+ { name: "page", type: "int", default: 1 },
406
+ {
407
+ name: "sort",
408
+ type: "str",
409
+ default: "release",
410
+ choices: ["release", "hot", "rating", "reviews", "price", "title"],
411
+ description: "release, hot, rating, reviews, price, title",
412
+ },
413
+ ],
414
+ columns: SEARCH_COLUMNS,
415
+ func: async (_page, kwargs) => runListing(dlsiteGenreUrl(kwargs), kwargs),
416
+ });
417
+ cli({
418
+ site: "dlsite",
419
+ name: "work",
420
+ description: "Get DLsite public work detail by product id",
421
+ domain: "www.dlsite.com",
422
+ strategy: Strategy.PUBLIC,
423
+ browser: false,
424
+ args: [
425
+ { name: "id", type: "str", required: true, positional: true },
426
+ {
427
+ name: "service",
428
+ type: "str",
429
+ default: DLSITE_SERVICE,
430
+ description: "DLsite service path, for example maniax or books",
431
+ },
432
+ ],
433
+ columns: [
434
+ "product_id",
435
+ "title",
436
+ "maker",
437
+ "maker_id",
438
+ "work_type",
439
+ "release_date",
440
+ "age",
441
+ "file_format",
442
+ "pages",
443
+ "file_size",
444
+ "price_jpy",
445
+ "url",
446
+ ],
447
+ func: async (_page, kwargs) => {
448
+ const productId = normalizeProductId(kwargs.id);
449
+ const service = normalizeService(kwargs.service);
450
+ return [
451
+ parseDlsiteDetailHtml(await fetchText(`${DLSITE_ORIGIN}/${service}/work/=/product_id/${productId}.html`), productId, service),
452
+ ];
453
+ },
454
+ });
455
+ //# sourceMappingURL=web.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web.js","sourceRoot":"","sources":["../../../src/adapters/dlsite/web.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * @owner src/adapters/ehentai/web.ts
3
+ * @does Register E-Hentai public search, gallery metadata, page listing, and torrent metadata commands.
4
+ * @needs E-Hentai search HTML, official api.e-hentai.org gdata endpoint, conservative gallery URL parsing.
5
+ * @feeds surface coverage ledger, gallery research workflows, torrent metadata discovery.
6
+ * @breaks Search table markup drift, gdata envelope drift, or gallery token parsing errors hide gallery results.
7
+ */
8
+ interface EhentaiGalleryIdentity {
9
+ gid: number;
10
+ token: string;
11
+ url: string;
12
+ }
13
+ interface EhentaiMetadata {
14
+ gid?: unknown;
15
+ token?: unknown;
16
+ title?: unknown;
17
+ title_jpn?: unknown;
18
+ category?: unknown;
19
+ thumb?: unknown;
20
+ uploader?: unknown;
21
+ posted?: unknown;
22
+ filecount?: unknown;
23
+ filesize?: unknown;
24
+ expunged?: unknown;
25
+ rating?: unknown;
26
+ torrentcount?: unknown;
27
+ torrents?: unknown;
28
+ tags?: unknown;
29
+ }
30
+ interface EhentaiSearchRow {
31
+ rank: number;
32
+ gid: number;
33
+ token: string;
34
+ title: string;
35
+ category: string;
36
+ published: string;
37
+ pages: string;
38
+ uploader: string;
39
+ thumb: string;
40
+ torrent_available: boolean;
41
+ tags: string;
42
+ url: string;
43
+ }
44
+ interface EhentaiSearchOptions {
45
+ query: string;
46
+ page: number;
47
+ cursor: string;
48
+ categoryMask?: number;
49
+ requireTorrent: boolean;
50
+ includeExpunged: boolean;
51
+ minPages: string;
52
+ maxPages: string;
53
+ minRating: string;
54
+ }
55
+ export declare function decodeEhentaiHtml(value: unknown): string;
56
+ export declare function requireEhentaiLimit(value: unknown, fallback?: number): number;
57
+ export declare function requireEhentaiQuery(value: unknown): string;
58
+ export declare function ehentaiCategoryMask(value: unknown): number | undefined;
59
+ export declare function buildEhentaiSearchQuery(kwargs: Record<string, unknown>): string;
60
+ export declare function parseEhentaiGallery(value: unknown): EhentaiGalleryIdentity;
61
+ export declare function ehentaiSearchUrl(options: EhentaiSearchOptions): string;
62
+ export declare function parseEhentaiSearchHtml(html: string, limit: number): EhentaiSearchRow[];
63
+ export declare function mapEhentaiTorrents(metadata: EhentaiMetadata): Record<string, unknown>[];
64
+ export declare function parseEhentaiGalleryPages(html: string, gallery: EhentaiGalleryIdentity, limit: number): Record<string, unknown>[];
65
+ export {};
66
+ //# sourceMappingURL=web.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web.d.ts","sourceRoot":"","sources":["../../../src/adapters/ehentai/web.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAkCH,UAAU,sBAAsB;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAUD,UAAU,eAAe;IACvB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAMD,UAAU,gBAAgB;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,iBAAiB,EAAE,OAAO,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACb;AAED,UAAU,oBAAoB;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,OAAO,CAAC;IACxB,eAAe,EAAE,OAAO,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAMD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAYxD;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,SAAK,GAAG,MAAM,CAOzE;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAI1D;AAyCD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAgBtE;AAuBD,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,MAAM,CAWR;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,sBAAsB,CAmC1E;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,oBAAoB,GAAG,MAAM,CA0BtE;AAwKD,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,GACZ,gBAAgB,EAAE,CAwCpB;AAyBD,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,eAAe,GACxB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAc3B;AAED,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,sBAAsB,EAC/B,KAAK,EAAE,MAAM,GACZ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAmB3B"}