@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.
- package/AGENTS.md +10 -19
- package/README.md +17 -11
- package/README.zh-CN.md +17 -11
- package/dist/adapters/anilist/web.d.ts +11 -0
- package/dist/adapters/anilist/web.d.ts.map +1 -0
- package/dist/adapters/anilist/web.js +284 -0
- package/dist/adapters/anilist/web.js.map +1 -0
- package/dist/adapters/bangumi/web.d.ts +14 -0
- package/dist/adapters/bangumi/web.d.ts.map +1 -0
- package/dist/adapters/bangumi/web.js +257 -0
- package/dist/adapters/bangumi/web.js.map +1 -0
- package/dist/adapters/dlsite/web.d.ts +31 -0
- package/dist/adapters/dlsite/web.d.ts.map +1 -0
- package/dist/adapters/dlsite/web.js +455 -0
- package/dist/adapters/dlsite/web.js.map +1 -0
- package/dist/adapters/ehentai/web.d.ts +66 -0
- package/dist/adapters/ehentai/web.d.ts.map +1 -0
- package/dist/adapters/ehentai/web.js +608 -0
- package/dist/adapters/ehentai/web.js.map +1 -0
- package/dist/adapters/jikan/web.d.ts +9 -0
- package/dist/adapters/jikan/web.d.ts.map +1 -0
- package/dist/adapters/jikan/web.js +154 -0
- package/dist/adapters/jikan/web.js.map +1 -0
- package/dist/adapters/kitsu/web.d.ts +9 -0
- package/dist/adapters/kitsu/web.d.ts.map +1 -0
- package/dist/adapters/kitsu/web.js +97 -0
- package/dist/adapters/kitsu/web.js.map +1 -0
- package/dist/adapters/mangadex/web.d.ts +10 -0
- package/dist/adapters/mangadex/web.d.ts.map +1 -0
- package/dist/adapters/mangadex/web.js +188 -0
- package/dist/adapters/mangadex/web.js.map +1 -0
- package/dist/adapters/moegirl/web.d.ts +23 -0
- package/dist/adapters/moegirl/web.d.ts.map +1 -0
- package/dist/adapters/moegirl/web.js +269 -0
- package/dist/adapters/moegirl/web.js.map +1 -0
- package/dist/adapters/safebooru/web.d.ts +10 -0
- package/dist/adapters/safebooru/web.d.ts.map +1 -0
- package/dist/adapters/safebooru/web.js +120 -0
- package/dist/adapters/safebooru/web.js.map +1 -0
- package/dist/adapters/vndb/web.d.ts +10 -0
- package/dist/adapters/vndb/web.d.ts.map +1 -0
- package/dist/adapters/vndb/web.js +321 -0
- package/dist/adapters/vndb/web.js.map +1 -0
- package/dist/agents/codex-pack.d.ts +62 -0
- package/dist/agents/codex-pack.d.ts.map +1 -0
- package/dist/agents/codex-pack.js +163 -0
- package/dist/agents/codex-pack.js.map +1 -0
- package/dist/commands/agents.d.ts.map +1 -1
- package/dist/commands/agents.js +6 -43
- package/dist/commands/agents.js.map +1 -1
- package/dist/commands/browser/adapter.d.ts.map +1 -1
- package/dist/commands/browser/adapter.js +17 -3
- package/dist/commands/browser/adapter.js.map +1 -1
- package/dist/commands/describe.d.ts.map +1 -1
- package/dist/commands/describe.js +6 -7
- package/dist/commands/describe.js.map +1 -1
- package/dist/commands/dispatch.d.ts +1 -1
- package/dist/commands/dispatch.d.ts.map +1 -1
- package/dist/commands/dispatch.js +4 -2
- package/dist/commands/dispatch.js.map +1 -1
- package/dist/commands/mcp.d.ts +1 -1
- package/dist/commands/mcp.d.ts.map +1 -1
- package/dist/commands/mcp.js +10 -5
- package/dist/commands/mcp.js.map +1 -1
- package/dist/core/command-contract-lint.d.ts +10 -0
- package/dist/core/command-contract-lint.d.ts.map +1 -0
- package/dist/core/command-contract-lint.js +41 -0
- package/dist/core/command-contract-lint.js.map +1 -0
- package/dist/core/command-contract.d.ts +100 -0
- package/dist/core/command-contract.d.ts.map +1 -0
- package/dist/core/command-contract.js +174 -0
- package/dist/core/command-contract.js.map +1 -0
- package/dist/core/index.d.ts +2 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +2 -0
- package/dist/core/index.js.map +1 -1
- package/dist/discovery/aliases.d.ts +2 -2
- package/dist/discovery/aliases.d.ts.map +1 -1
- package/dist/discovery/aliases.js +464 -6
- package/dist/discovery/aliases.js.map +1 -1
- package/dist/discovery/search.d.ts.map +1 -1
- package/dist/discovery/search.js +147 -2
- package/dist/discovery/search.js.map +1 -1
- package/dist/engine/args.d.ts.map +1 -1
- package/dist/engine/args.js +18 -1
- package/dist/engine/args.js.map +1 -1
- package/dist/engine/artifact-validation.d.ts +29 -0
- package/dist/engine/artifact-validation.d.ts.map +1 -0
- package/dist/engine/artifact-validation.js +211 -0
- package/dist/engine/artifact-validation.js.map +1 -0
- package/dist/engine/browser/diagnostics.d.ts +38 -0
- package/dist/engine/browser/diagnostics.d.ts.map +1 -0
- package/dist/engine/browser/diagnostics.js +40 -0
- package/dist/engine/browser/diagnostics.js.map +1 -0
- package/dist/engine/invoke.d.ts +1 -0
- package/dist/engine/invoke.d.ts.map +1 -1
- package/dist/engine/invoke.js +1 -0
- package/dist/engine/invoke.js.map +1 -1
- package/dist/engine/kernel/errors.d.ts +11 -0
- package/dist/engine/kernel/errors.d.ts.map +1 -0
- package/dist/engine/kernel/errors.js +15 -0
- package/dist/engine/kernel/errors.js.map +1 -0
- package/dist/engine/kernel/execute.d.ts +7 -18
- package/dist/engine/kernel/execute.d.ts.map +1 -1
- package/dist/engine/kernel/execute.js +25 -410
- package/dist/engine/kernel/execute.js.map +1 -1
- package/dist/engine/kernel/stages.d.ts +44 -0
- package/dist/engine/kernel/stages.d.ts.map +1 -0
- package/dist/engine/kernel/stages.js +428 -0
- package/dist/engine/kernel/stages.js.map +1 -0
- package/dist/engine/kernel/types.d.ts +21 -1
- package/dist/engine/kernel/types.d.ts.map +1 -1
- package/dist/engine/steps/download.d.ts +1 -0
- package/dist/engine/steps/download.d.ts.map +1 -1
- package/dist/engine/steps/download.js +10 -6
- package/dist/engine/steps/download.js.map +1 -1
- package/dist/fast-path/render.js +1 -1
- package/dist/fast-path/render.js.map +1 -1
- package/dist/manifest-compact.txt +3 -3
- package/dist/manifest-search.json +1 -1
- package/dist/manifest.json +3074 -3
- package/dist/mcp/handler.d.ts.map +1 -1
- package/dist/mcp/handler.js +11 -1
- package/dist/mcp/handler.js.map +1 -1
- package/dist/mcp/server.d.ts +1 -1
- package/dist/mcp/server.js +1 -1
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +18 -10
- package/dist/mcp/tools.js.map +1 -1
- package/dist/output/error-map.d.ts.map +1 -1
- package/dist/output/error-map.js +1 -1
- package/dist/output/error-map.js.map +1 -1
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +2 -1
- package/dist/registry.js.map +1 -1
- package/package.json +2 -2
- package/server.json +3 -3
- package/skills/unicli/SKILL.md +1 -1
- package/skills/unicli-claude-code/SKILL.md +1 -1
- package/skills/unicli-hermes/SKILL.md +1 -1
- package/src/adapters/anilist/web.test.ts +93 -0
- package/src/adapters/anilist/web.ts +341 -0
- package/src/adapters/arxiv/download.yaml +53 -0
- package/src/adapters/bangumi/web.test.ts +109 -0
- package/src/adapters/bangumi/web.ts +295 -0
- package/src/adapters/danbooru/artists.yaml +44 -0
- package/src/adapters/danbooru/comments.yaml +45 -0
- package/src/adapters/danbooru/detail.yaml +78 -0
- package/src/adapters/danbooru/download.yaml +51 -0
- package/src/adapters/danbooru/pools.yaml +56 -0
- package/src/adapters/danbooru/search.yaml +69 -0
- package/src/adapters/danbooru/tags.yaml +42 -0
- package/src/adapters/danbooru/wiki.yaml +44 -0
- package/src/adapters/dlsite/web.test.ts +132 -0
- package/src/adapters/dlsite/web.ts +557 -0
- package/src/adapters/ehentai/web.test.ts +157 -0
- package/src/adapters/ehentai/web.ts +750 -0
- package/src/adapters/jikan/web.test.ts +50 -0
- package/src/adapters/jikan/web.ts +177 -0
- package/src/adapters/kitsu/web.test.ts +29 -0
- package/src/adapters/kitsu/web.ts +109 -0
- package/src/adapters/konachan/detail.yaml +62 -0
- package/src/adapters/konachan/download.yaml +55 -0
- package/src/adapters/konachan/search.yaml +65 -0
- package/src/adapters/konachan/tags.yaml +40 -0
- package/src/adapters/mangadex/web.test.ts +46 -0
- package/src/adapters/mangadex/web.ts +210 -0
- package/src/adapters/moegirl/web.test.ts +87 -0
- package/src/adapters/moegirl/web.ts +343 -0
- package/src/adapters/pdf/read.yaml +49 -0
- package/src/adapters/pixiv/download.yaml +15 -2
- package/src/adapters/safebooru/detail.yaml +63 -0
- package/src/adapters/safebooru/download.yaml +58 -0
- package/src/adapters/safebooru/search.yaml +69 -0
- package/src/adapters/safebooru/web.test.ts +60 -0
- package/src/adapters/safebooru/web.ts +130 -0
- package/src/adapters/vndb/web.test.ts +86 -0
- package/src/adapters/vndb/web.ts +393 -0
- package/src/adapters/yandere/detail.yaml +61 -0
- package/src/adapters/yandere/download.yaml +56 -0
- package/src/adapters/yandere/search.yaml +67 -0
- package/src/adapters/yandere/tags.yaml +41 -0
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @owner src/adapters/moegirl/web.ts
|
|
3
|
+
* @does Register Moegirl public search, page reading, and article link extraction commands.
|
|
4
|
+
* @needs Moegirl public OpenSearch endpoint and rendered MediaWiki HTML.
|
|
5
|
+
* @feeds ACG entity discovery, character disambiguation, and wiki-backed content research.
|
|
6
|
+
* @breaks Moegirl skin/template markup drift can reduce page and link extraction quality.
|
|
7
|
+
*/
|
|
8
|
+
import { USER_AGENT } from "../../constants.js";
|
|
9
|
+
import { cli, Strategy } from "../../registry.js";
|
|
10
|
+
const ORIGIN = "https://zh.moegirl.org.cn";
|
|
11
|
+
function str(value) {
|
|
12
|
+
return value === undefined || value === null ? "" : String(value);
|
|
13
|
+
}
|
|
14
|
+
function decodeHtml(value) {
|
|
15
|
+
return decodeHtmlEntities(value).replace(/\s+/g, " ").trim();
|
|
16
|
+
}
|
|
17
|
+
function decodeHtmlText(value) {
|
|
18
|
+
return decodeHtmlEntities(value)
|
|
19
|
+
.replace(/[ \t\f\v]+/g, " ")
|
|
20
|
+
.replace(/\n[ \t]+/g, "\n")
|
|
21
|
+
.replace(/\n{3,}/g, "\n\n")
|
|
22
|
+
.trim();
|
|
23
|
+
}
|
|
24
|
+
function decodeHtmlEntities(value) {
|
|
25
|
+
return str(value)
|
|
26
|
+
.replace(/&#(\d+);/g, (_m, code) => String.fromCodePoint(Number(code)))
|
|
27
|
+
.replace(/&#x([0-9a-f]+);/gi, (_m, code) => String.fromCodePoint(Number.parseInt(code, 16)))
|
|
28
|
+
.replace(/ /g, " ")
|
|
29
|
+
.replace(/&/g, "&")
|
|
30
|
+
.replace(/</g, "<")
|
|
31
|
+
.replace(/>/g, ">")
|
|
32
|
+
.replace(/"/g, '"')
|
|
33
|
+
.replace(/'/g, "'")
|
|
34
|
+
.replace(/'/g, "'");
|
|
35
|
+
}
|
|
36
|
+
function requireText(value, label) {
|
|
37
|
+
const text = str(value).trim();
|
|
38
|
+
if (!text)
|
|
39
|
+
throw new Error(`moegirl ${label} cannot be empty.`);
|
|
40
|
+
return text;
|
|
41
|
+
}
|
|
42
|
+
function requireLimit(value, fallback = 10) {
|
|
43
|
+
if (value === undefined || value === null || value === "")
|
|
44
|
+
return fallback;
|
|
45
|
+
const n = Number(value);
|
|
46
|
+
if (!Number.isInteger(n) || n < 1 || n > 50) {
|
|
47
|
+
throw new Error("moegirl limit must be an integer in [1, 50].");
|
|
48
|
+
}
|
|
49
|
+
return n;
|
|
50
|
+
}
|
|
51
|
+
function requireParagraphCap(value) {
|
|
52
|
+
if (value === undefined || value === null || value === "")
|
|
53
|
+
return 0;
|
|
54
|
+
const n = Number(value);
|
|
55
|
+
if (!Number.isInteger(n) || n < 0 || n > 100) {
|
|
56
|
+
throw new Error("moegirl paragraphs must be an integer in [0, 100].");
|
|
57
|
+
}
|
|
58
|
+
return n;
|
|
59
|
+
}
|
|
60
|
+
function articleUrl(title) {
|
|
61
|
+
return `${ORIGIN}/${encodeURIComponent(title.replace(/ /g, "_"))}`;
|
|
62
|
+
}
|
|
63
|
+
async function fetchJson(url) {
|
|
64
|
+
const response = await fetch(url, {
|
|
65
|
+
headers: {
|
|
66
|
+
Accept: "application/json",
|
|
67
|
+
"User-Agent": USER_AGENT,
|
|
68
|
+
},
|
|
69
|
+
});
|
|
70
|
+
if (!response.ok) {
|
|
71
|
+
throw new Error(`moegirl request failed with HTTP ${response.status}.`);
|
|
72
|
+
}
|
|
73
|
+
return response.json();
|
|
74
|
+
}
|
|
75
|
+
async function fetchText(url) {
|
|
76
|
+
const response = await fetch(url, {
|
|
77
|
+
headers: {
|
|
78
|
+
Accept: "text/html,application/xhtml+xml",
|
|
79
|
+
"User-Agent": USER_AGENT,
|
|
80
|
+
},
|
|
81
|
+
});
|
|
82
|
+
if (!response.ok) {
|
|
83
|
+
throw new Error(`moegirl request failed with HTTP ${response.status}.`);
|
|
84
|
+
}
|
|
85
|
+
return response.text();
|
|
86
|
+
}
|
|
87
|
+
export function mapMoegirlOpenSearch(data, limit) {
|
|
88
|
+
if (!Array.isArray(data) ||
|
|
89
|
+
!Array.isArray(data[1]) ||
|
|
90
|
+
!Array.isArray(data[3])) {
|
|
91
|
+
throw new Error("moegirl OpenSearch response shape changed.");
|
|
92
|
+
}
|
|
93
|
+
const titles = data[1];
|
|
94
|
+
const descriptions = Array.isArray(data[2]) ? data[2] : [];
|
|
95
|
+
const urls = data[3];
|
|
96
|
+
return titles.slice(0, limit).map((title, index) => ({
|
|
97
|
+
rank: index + 1,
|
|
98
|
+
title: str(title),
|
|
99
|
+
description: str(descriptions[index]),
|
|
100
|
+
url: str(urls[index]),
|
|
101
|
+
}));
|
|
102
|
+
}
|
|
103
|
+
function firstMatch(value, re) {
|
|
104
|
+
const match = value.match(re);
|
|
105
|
+
return match ? decodeHtml(match[1]) : "";
|
|
106
|
+
}
|
|
107
|
+
function bodyHtml(html) {
|
|
108
|
+
return (firstRawMatch(html, /<template id="MOE_SKIN_TEMPLATE_BODYCONTENT">([\s\S]*?)<\/template>/) ||
|
|
109
|
+
firstRawMatch(html, /<div[^>]+class="[^"]*\bmw-parser-output\b[^"]*"[^>]*>([\s\S]*?)<\/div>\s*<\/div>/) ||
|
|
110
|
+
html);
|
|
111
|
+
}
|
|
112
|
+
function firstRawMatch(value, re) {
|
|
113
|
+
const match = value.match(re);
|
|
114
|
+
return match ? match[1] : "";
|
|
115
|
+
}
|
|
116
|
+
function cleanArticleText(html) {
|
|
117
|
+
return decodeHtmlText(bodyHtml(html)
|
|
118
|
+
.replace(/<style[\s\S]*?<\/style>/gi, " ")
|
|
119
|
+
.replace(/<script[\s\S]*?<\/script>/gi, " ")
|
|
120
|
+
.replace(/<sup[\s\S]*?<\/sup>/gi, " ")
|
|
121
|
+
.replace(/<\/(?:p|li|h[1-6]|tr)>/gi, "\n\n")
|
|
122
|
+
.replace(/<(?:br|div)\b[^>]*>/gi, "\n")
|
|
123
|
+
.replace(/<[^>]+>/g, " ")
|
|
124
|
+
.replace(/\n\s+/g, "\n")
|
|
125
|
+
.replace(/\n{3,}/g, "\n\n"));
|
|
126
|
+
}
|
|
127
|
+
export function parseMoegirlPageHtml(html, requestedTitle, paragraphCap) {
|
|
128
|
+
const pageTitle = firstMatch(html, /<title>([^<]+?)(?: - 萌娘百科[^<]*)?<\/title>/) ||
|
|
129
|
+
firstMatch(html, /<meta property="og:title" content="(?:<[^&]+>)?([^"<]+)(?:<\/[^&]+>)?"/) ||
|
|
130
|
+
requestedTitle;
|
|
131
|
+
const title = requestedTitle.includes("(") ? requestedTitle : pageTitle;
|
|
132
|
+
const description = firstMatch(html, /<meta name="description" content="([^"]*)"/) ||
|
|
133
|
+
firstMatch(html, /<meta property="og:description" content="([^"]*)"/);
|
|
134
|
+
const url = firstMatch(html, /<link rel="canonical" href="([^"]+)"/) ||
|
|
135
|
+
articleUrl(title);
|
|
136
|
+
const categories = [...html.matchAll(/"wgCategories":\[(.*?)\]/g)][0]?.[1]
|
|
137
|
+
?.split(",")
|
|
138
|
+
.map((item) => decodeHtml(item.replace(/^"|"$/g, "")))
|
|
139
|
+
.filter(Boolean);
|
|
140
|
+
const text = cleanArticleText(html);
|
|
141
|
+
if (!text) {
|
|
142
|
+
throw new Error(`Moegirl article "${requestedTitle}" has no readable text.`);
|
|
143
|
+
}
|
|
144
|
+
const paragraphs = text
|
|
145
|
+
.split(/\n+/)
|
|
146
|
+
.map((part) => part.trim())
|
|
147
|
+
.filter(Boolean);
|
|
148
|
+
const selected = paragraphCap > 0 ? paragraphs.slice(0, paragraphCap) : paragraphs;
|
|
149
|
+
return {
|
|
150
|
+
title,
|
|
151
|
+
description,
|
|
152
|
+
categories: categories ?? [],
|
|
153
|
+
paragraphs: selected.length,
|
|
154
|
+
extract: selected.join("\n\n"),
|
|
155
|
+
url,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
export function parseMoegirlLinksHtml(html, limit, contains) {
|
|
159
|
+
const rows = [];
|
|
160
|
+
const seen = new Set();
|
|
161
|
+
const needle = contains.trim();
|
|
162
|
+
for (const match of bodyHtml(html).matchAll(/<a\b(?=[^>]*\bhref="([^"]+)")(?=[^>]*\btitle="([^"]+)")[^>]*>/g)) {
|
|
163
|
+
const href = decodeHtml(match[1]);
|
|
164
|
+
const title = decodeHtml(match[2]);
|
|
165
|
+
if (!href.startsWith("/") || href.includes("redlink=1"))
|
|
166
|
+
continue;
|
|
167
|
+
if (title.includes("页面不存在"))
|
|
168
|
+
continue;
|
|
169
|
+
if (needle && !title.includes(needle))
|
|
170
|
+
continue;
|
|
171
|
+
const key = `${title}\n${href}`;
|
|
172
|
+
if (seen.has(key))
|
|
173
|
+
continue;
|
|
174
|
+
seen.add(key);
|
|
175
|
+
rows.push({
|
|
176
|
+
rank: rows.length + 1,
|
|
177
|
+
title,
|
|
178
|
+
url: `${ORIGIN}${href}`,
|
|
179
|
+
});
|
|
180
|
+
if (rows.length >= limit)
|
|
181
|
+
break;
|
|
182
|
+
}
|
|
183
|
+
return rows;
|
|
184
|
+
}
|
|
185
|
+
cli({
|
|
186
|
+
site: "moegirl",
|
|
187
|
+
name: "search",
|
|
188
|
+
description: "Search Moegirl ACG wiki articles for characters, works, songs, games, and studios",
|
|
189
|
+
domain: "zh.moegirl.org.cn",
|
|
190
|
+
strategy: Strategy.PUBLIC,
|
|
191
|
+
browser: false,
|
|
192
|
+
args: [
|
|
193
|
+
{ name: "query", type: "str", required: true, positional: true },
|
|
194
|
+
{ name: "limit", type: "int", default: 10 },
|
|
195
|
+
],
|
|
196
|
+
columns: ["rank", "title", "description", "url"],
|
|
197
|
+
func: async (_page, kwargs) => {
|
|
198
|
+
const query = requireText(kwargs.query, "query");
|
|
199
|
+
const limit = requireLimit(kwargs.limit);
|
|
200
|
+
const url = new URL(`${ORIGIN}/api.php`);
|
|
201
|
+
url.searchParams.set("action", "opensearch");
|
|
202
|
+
url.searchParams.set("search", query);
|
|
203
|
+
url.searchParams.set("limit", String(limit));
|
|
204
|
+
url.searchParams.set("namespace", "0");
|
|
205
|
+
url.searchParams.set("format", "json");
|
|
206
|
+
const rows = mapMoegirlOpenSearch(await fetchJson(url.toString()), limit);
|
|
207
|
+
if (rows.length === 0)
|
|
208
|
+
throw new Error(`No Moegirl pages found for "${query}".`);
|
|
209
|
+
return rows;
|
|
210
|
+
},
|
|
211
|
+
});
|
|
212
|
+
cli({
|
|
213
|
+
site: "moegirl",
|
|
214
|
+
name: "page",
|
|
215
|
+
description: "Read a Moegirl article as plain text with metadata",
|
|
216
|
+
domain: "zh.moegirl.org.cn",
|
|
217
|
+
strategy: Strategy.PUBLIC,
|
|
218
|
+
browser: false,
|
|
219
|
+
args: [
|
|
220
|
+
{ name: "title", type: "str", required: true, positional: true },
|
|
221
|
+
{
|
|
222
|
+
name: "paragraphs",
|
|
223
|
+
type: "int",
|
|
224
|
+
default: 0,
|
|
225
|
+
description: "Paragraph cap, 0 means full",
|
|
226
|
+
},
|
|
227
|
+
],
|
|
228
|
+
columns: [
|
|
229
|
+
"title",
|
|
230
|
+
"description",
|
|
231
|
+
"categories",
|
|
232
|
+
"paragraphs",
|
|
233
|
+
"extract",
|
|
234
|
+
"url",
|
|
235
|
+
],
|
|
236
|
+
func: async (_page, kwargs) => {
|
|
237
|
+
const title = requireText(kwargs.title, "title");
|
|
238
|
+
const paragraphCap = requireParagraphCap(kwargs.paragraphs);
|
|
239
|
+
return [
|
|
240
|
+
parseMoegirlPageHtml(await fetchText(articleUrl(title)), title, paragraphCap),
|
|
241
|
+
];
|
|
242
|
+
},
|
|
243
|
+
});
|
|
244
|
+
cli({
|
|
245
|
+
site: "moegirl",
|
|
246
|
+
name: "links",
|
|
247
|
+
description: "Extract internal Moegirl article links from a page, useful for disambiguation pages",
|
|
248
|
+
domain: "zh.moegirl.org.cn",
|
|
249
|
+
strategy: Strategy.PUBLIC,
|
|
250
|
+
browser: false,
|
|
251
|
+
args: [
|
|
252
|
+
{ name: "title", type: "str", required: true, positional: true },
|
|
253
|
+
{ name: "limit", type: "int", default: 20 },
|
|
254
|
+
{
|
|
255
|
+
name: "contains",
|
|
256
|
+
type: "str",
|
|
257
|
+
description: "Only return links whose title contains this text",
|
|
258
|
+
},
|
|
259
|
+
],
|
|
260
|
+
columns: ["rank", "title", "url"],
|
|
261
|
+
func: async (_page, kwargs) => {
|
|
262
|
+
const title = requireText(kwargs.title, "title");
|
|
263
|
+
const rows = parseMoegirlLinksHtml(await fetchText(articleUrl(title)), requireLimit(kwargs.limit), str(kwargs.contains));
|
|
264
|
+
if (rows.length === 0)
|
|
265
|
+
throw new Error(`No Moegirl links found on "${title}".`);
|
|
266
|
+
return rows;
|
|
267
|
+
},
|
|
268
|
+
});
|
|
269
|
+
//# sourceMappingURL=web.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web.js","sourceRoot":"","sources":["../../../src/adapters/moegirl/web.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @owner src/adapters/safebooru/web.ts
|
|
3
|
+
* @does Register Safebooru tag lookup for exact and prefix-style ACG tag discovery.
|
|
4
|
+
* @needs Safebooru DAPI tag XML endpoint.
|
|
5
|
+
* @feeds Booru tag discovery before image search/detail/download workflows.
|
|
6
|
+
* @breaks Safebooru DAPI XML attribute changes can block tag lookup.
|
|
7
|
+
*/
|
|
8
|
+
export declare function parseSafebooruTags(xml: string): Record<string, unknown>[];
|
|
9
|
+
export declare function mergeSafebooruTags(groups: Record<string, unknown>[][]): Record<string, unknown>[];
|
|
10
|
+
//# sourceMappingURL=web.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web.d.ts","sourceRoot":"","sources":["../../../src/adapters/safebooru/web.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAsCH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAmBzE;AAED,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,GAClC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAY3B"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @owner src/adapters/safebooru/web.ts
|
|
3
|
+
* @does Register Safebooru tag lookup for exact and prefix-style ACG tag discovery.
|
|
4
|
+
* @needs Safebooru DAPI tag XML endpoint.
|
|
5
|
+
* @feeds Booru tag discovery before image search/detail/download workflows.
|
|
6
|
+
* @breaks Safebooru DAPI XML attribute changes can block tag lookup.
|
|
7
|
+
*/
|
|
8
|
+
import { USER_AGENT } from "../../constants.js";
|
|
9
|
+
import { cli, Strategy } from "../../registry.js";
|
|
10
|
+
function str(value) {
|
|
11
|
+
return value === undefined || value === null ? "" : String(value);
|
|
12
|
+
}
|
|
13
|
+
function required(value, label) {
|
|
14
|
+
const text = str(value).trim();
|
|
15
|
+
if (!text)
|
|
16
|
+
throw new Error(`safebooru ${label} cannot be empty.`);
|
|
17
|
+
return text;
|
|
18
|
+
}
|
|
19
|
+
function requireLimit(value) {
|
|
20
|
+
if (value === undefined || value === null || value === "")
|
|
21
|
+
return 20;
|
|
22
|
+
const n = Number(value);
|
|
23
|
+
if (!Number.isInteger(n) || n < 1 || n > 100) {
|
|
24
|
+
throw new Error("safebooru limit must be an integer in [1, 100].");
|
|
25
|
+
}
|
|
26
|
+
return n;
|
|
27
|
+
}
|
|
28
|
+
function decodeXml(value) {
|
|
29
|
+
return value
|
|
30
|
+
.replace(/"/g, '"')
|
|
31
|
+
.replace(/'/g, "'")
|
|
32
|
+
.replace(/</g, "<")
|
|
33
|
+
.replace(/>/g, ">")
|
|
34
|
+
.replace(/&/g, "&");
|
|
35
|
+
}
|
|
36
|
+
function attr(source, name) {
|
|
37
|
+
const match = source.match(new RegExp(`\\b${name}="([^"]*)"`));
|
|
38
|
+
return match ? decodeXml(match[1]) : "";
|
|
39
|
+
}
|
|
40
|
+
export function parseSafebooruTags(xml) {
|
|
41
|
+
const rows = [];
|
|
42
|
+
const tagRegex = /<tag\b[^>]*\/>/g;
|
|
43
|
+
let match;
|
|
44
|
+
while ((match = tagRegex.exec(xml)) !== null) {
|
|
45
|
+
const raw = match[0];
|
|
46
|
+
const name = attr(raw, "name");
|
|
47
|
+
if (!name)
|
|
48
|
+
continue;
|
|
49
|
+
rows.push({
|
|
50
|
+
rank: rows.length + 1,
|
|
51
|
+
id: attr(raw, "id"),
|
|
52
|
+
name,
|
|
53
|
+
count: attr(raw, "count"),
|
|
54
|
+
type: attr(raw, "type"),
|
|
55
|
+
ambiguous: attr(raw, "ambiguous"),
|
|
56
|
+
url: `https://safebooru.org/index.php?page=post&s=list&tags=${encodeURIComponent(name)}`,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
return rows;
|
|
60
|
+
}
|
|
61
|
+
export function mergeSafebooruTags(groups) {
|
|
62
|
+
const rows = [];
|
|
63
|
+
const seen = new Set();
|
|
64
|
+
for (const group of groups) {
|
|
65
|
+
for (const row of group) {
|
|
66
|
+
const name = str(row.name);
|
|
67
|
+
if (!name || seen.has(name))
|
|
68
|
+
continue;
|
|
69
|
+
seen.add(name);
|
|
70
|
+
rows.push({ ...row, rank: rows.length + 1 });
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return rows;
|
|
74
|
+
}
|
|
75
|
+
async function fetchTagRows(url) {
|
|
76
|
+
const response = await fetch(url, {
|
|
77
|
+
headers: {
|
|
78
|
+
Accept: "application/xml,text/xml",
|
|
79
|
+
"User-Agent": USER_AGENT,
|
|
80
|
+
},
|
|
81
|
+
});
|
|
82
|
+
if (!response.ok)
|
|
83
|
+
throw new Error(`safebooru request failed with HTTP ${response.status}.`);
|
|
84
|
+
return parseSafebooruTags(await response.text());
|
|
85
|
+
}
|
|
86
|
+
function tagUrl(kind, query, limit) {
|
|
87
|
+
const url = new URL("https://safebooru.org/index.php");
|
|
88
|
+
url.searchParams.set("page", "dapi");
|
|
89
|
+
url.searchParams.set("s", "tag");
|
|
90
|
+
url.searchParams.set("q", "index");
|
|
91
|
+
url.searchParams.set(kind, query);
|
|
92
|
+
url.searchParams.set("limit", String(limit));
|
|
93
|
+
return url;
|
|
94
|
+
}
|
|
95
|
+
async function searchTags(kwargs) {
|
|
96
|
+
const query = required(kwargs.query, "query");
|
|
97
|
+
const limit = requireLimit(kwargs.limit);
|
|
98
|
+
const rows = mergeSafebooruTags([
|
|
99
|
+
await fetchTagRows(tagUrl("name", query, 1)),
|
|
100
|
+
await fetchTagRows(tagUrl("name_pattern", query, limit)),
|
|
101
|
+
]).slice(0, limit);
|
|
102
|
+
if (rows.length === 0)
|
|
103
|
+
throw new Error(`No Safebooru tags found for "${query}".`);
|
|
104
|
+
return rows;
|
|
105
|
+
}
|
|
106
|
+
cli({
|
|
107
|
+
site: "safebooru",
|
|
108
|
+
name: "tags",
|
|
109
|
+
description: "Search Safebooru tags by exact tag name or ASCII tag prefix such as blue_archive",
|
|
110
|
+
domain: "safebooru.org",
|
|
111
|
+
strategy: Strategy.PUBLIC,
|
|
112
|
+
browser: false,
|
|
113
|
+
args: [
|
|
114
|
+
{ name: "query", type: "str", required: true, positional: true },
|
|
115
|
+
{ name: "limit", type: "int", default: 20 },
|
|
116
|
+
],
|
|
117
|
+
columns: ["rank", "id", "name", "count", "type", "ambiguous", "url"],
|
|
118
|
+
func: async (_page, kwargs) => searchTags(kwargs),
|
|
119
|
+
});
|
|
120
|
+
//# sourceMappingURL=web.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web.js","sourceRoot":"","sources":["../../../src/adapters/safebooru/web.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @owner src/adapters/vndb/web.ts
|
|
3
|
+
* @does Register VNDB public visual novel, release, tag, staff, producer, and character lookup commands.
|
|
4
|
+
* @needs VNDB Kana API JSON contract and public unauthenticated read endpoints.
|
|
5
|
+
* @feeds ACG research workflows, visual novel discovery, game tag/type search.
|
|
6
|
+
* @breaks VNDB field names or filter semantics drifting will hide games or metadata.
|
|
7
|
+
*/
|
|
8
|
+
export declare function mapVndbVisualNovels(rows: Record<string, unknown>[]): Record<string, unknown>[];
|
|
9
|
+
export declare function mapVndbReleases(rows: Record<string, unknown>[]): Record<string, unknown>[];
|
|
10
|
+
//# sourceMappingURL=web.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web.d.ts","sourceRoot":"","sources":["../../../src/adapters/vndb/web.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA4GH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAC9B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAiB3B;AAED,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAC9B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAY3B"}
|