@zonuexe/techbook-mcp 0.2.2 → 0.2.4
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/CHANGELOG.md +28 -1
- package/README.md +39 -20
- package/dist/adapters/calil.d.ts +10 -0
- package/dist/adapters/calil.d.ts.map +1 -0
- package/dist/adapters/calil.js +45 -0
- package/dist/adapters/calil.js.map +1 -0
- package/dist/adapters/openbd.d.ts +57 -0
- package/dist/adapters/openbd.d.ts.map +1 -0
- package/dist/adapters/openbd.js +87 -0
- package/dist/adapters/openbd.js.map +1 -0
- package/dist/adapters/publishers/google-books.d.ts +4 -0
- package/dist/adapters/publishers/google-books.d.ts.map +1 -0
- package/dist/adapters/publishers/google-books.js +75 -0
- package/dist/adapters/publishers/google-books.js.map +1 -0
- package/dist/adapters/publishers/isbn-publisher-codes.d.ts +21 -0
- package/dist/adapters/publishers/isbn-publisher-codes.d.ts.map +1 -0
- package/dist/adapters/publishers/isbn-publisher-codes.js +49 -0
- package/dist/adapters/publishers/isbn-publisher-codes.js.map +1 -0
- package/dist/adapters/publishers/juse-p.d.ts +3 -0
- package/dist/adapters/publishers/juse-p.d.ts.map +1 -0
- package/dist/adapters/publishers/juse-p.js +110 -0
- package/dist/adapters/publishers/juse-p.js.map +1 -0
- package/dist/adapters/publishers/registry.d.ts.map +1 -1
- package/dist/adapters/publishers/registry.js +4 -0
- package/dist/adapters/publishers/registry.js.map +1 -1
- package/dist/adapters/publishers/tatsu-zine.d.ts.map +1 -1
- package/dist/adapters/publishers/tatsu-zine.js +6 -18
- package/dist/adapters/publishers/tatsu-zine.js.map +1 -1
- package/dist/application/get-book-by-isbn.d.ts +13 -0
- package/dist/application/get-book-by-isbn.d.ts.map +1 -0
- package/dist/application/get-book-by-isbn.js +61 -0
- package/dist/application/get-book-by-isbn.js.map +1 -0
- package/dist/application/get-book-detail.d.ts.map +1 -1
- package/dist/application/get-book-detail.js +16 -1
- package/dist/application/get-book-detail.js.map +1 -1
- package/dist/application/search-books.d.ts.map +1 -1
- package/dist/application/search-books.js +20 -0
- package/dist/application/search-books.js.map +1 -1
- package/dist/config/credentials.d.ts +8 -0
- package/dist/config/credentials.d.ts.map +1 -0
- package/dist/config/credentials.js +32 -0
- package/dist/config/credentials.js.map +1 -0
- package/dist/main.js +15 -1
- package/dist/main.js.map +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +10 -0
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools.d.ts +13 -0
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +16 -0
- package/dist/mcp/tools.js.map +1 -1
- package/dist/setup.d.ts +2 -0
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +43 -0
- package/dist/setup.js.map +1 -0
- package/flake.lock +61 -0
- package/package.json +1 -1
- package/.claude/settings.local.json +0 -36
- package/.codex/skills/techbook-mcp-release-prep/SKILL.md +0 -105
- package/.github/workflows/test.yml +0 -72
- package/.oxlintrc.json +0 -12
- package/AGENTS.md +0 -100
- package/deno.json +0 -3
- package/src/adapters/cache/memory-cache.ts +0 -31
- package/src/adapters/cache/null-cache.ts +0 -8
- package/src/adapters/html/cheerio-parser.ts +0 -50
- package/src/adapters/http/fetch-client.ts +0 -47
- package/src/adapters/http/mock-client.ts +0 -77
- package/src/adapters/publishers/base.ts +0 -279
- package/src/adapters/publishers/book-tech.ts +0 -117
- package/src/adapters/publishers/born-digital.ts +0 -143
- package/src/adapters/publishers/coronasha.ts +0 -139
- package/src/adapters/publishers/gihyo.ts +0 -120
- package/src/adapters/publishers/impress.ts +0 -103
- package/src/adapters/publishers/lambdanote.ts +0 -146
- package/src/adapters/publishers/manatee.ts +0 -113
- package/src/adapters/publishers/maruzen-publishing.ts +0 -129
- package/src/adapters/publishers/optronics.ts +0 -113
- package/src/adapters/publishers/oreilly-japan.ts +0 -133
- package/src/adapters/publishers/peaks.ts +0 -98
- package/src/adapters/publishers/personal-media.ts +0 -168
- package/src/adapters/publishers/registry.ts +0 -38
- package/src/adapters/publishers/rutles.ts +0 -149
- package/src/adapters/publishers/saiensu.ts +0 -136
- package/src/adapters/publishers/seshop.ts +0 -121
- package/src/adapters/publishers/tatsu-zine.ts +0 -154
- package/src/adapters/publishers/techbookfest.ts +0 -179
- package/src/application/get-book-detail.ts +0 -24
- package/src/application/search-books.ts +0 -44
- package/src/domain/book.ts +0 -35
- package/src/domain/publisher.ts +0 -18
- package/src/main.ts +0 -14
- package/src/mcp/server.ts +0 -103
- package/src/mcp/tools.ts +0 -54
- package/src/ports/cache.ts +0 -5
- package/src/ports/html-parser.ts +0 -15
- package/src/ports/http.ts +0 -17
- package/tests/fixtures/book-tech-detail.html +0 -51
- package/tests/fixtures/book-tech-search.html +0 -91
- package/tests/fixtures/born-digital-detail.html +0 -62
- package/tests/fixtures/born-digital-search.html +0 -51
- package/tests/fixtures/coronasha-detail.html +0 -41
- package/tests/fixtures/coronasha-search.html +0 -61
- package/tests/fixtures/gihyo-detail.html +0 -42
- package/tests/fixtures/gihyo-search.json +0 -54
- package/tests/fixtures/impress-detail-epub.html +0 -746
- package/tests/fixtures/impress-detail-social.html +0 -689
- package/tests/fixtures/lambdanote-search.html +0 -66
- package/tests/fixtures/manatee-detail.html +0 -53
- package/tests/fixtures/manatee-search.html +0 -59
- package/tests/fixtures/maruzen-detail.html +0 -51
- package/tests/fixtures/maruzen-search.html +0 -60
- package/tests/fixtures/optronics-detail.html +0 -30
- package/tests/fixtures/optronics-search.html +0 -75
- package/tests/fixtures/oreilly-detail.html +0 -52
- package/tests/fixtures/oreilly-ebook-list.html +0 -53
- package/tests/fixtures/peaks-detail.html +0 -39
- package/tests/fixtures/peaks-top.html +0 -50
- package/tests/fixtures/personal-media-detail.html +0 -32
- package/tests/fixtures/personal-media-search.html +0 -39
- package/tests/fixtures/rutles-detail.html +0 -32
- package/tests/fixtures/rutles-search.html +0 -62
- package/tests/fixtures/saiensu-detail.html +0 -41
- package/tests/fixtures/saiensu-search.html +0 -65
- package/tests/fixtures/seshop-detail.html +0 -45
- package/tests/fixtures/seshop-search.html +0 -58
- package/tests/fixtures/tatsu-zine-detail-free.html +0 -22
- package/tests/fixtures/tatsu-zine-search.html +0 -40
- package/tests/fixtures/techbookfest-search.json +0 -73
- package/tests/unit/adapters/base.test.ts +0 -441
- package/tests/unit/adapters/publishers/book-tech.test.ts +0 -186
- package/tests/unit/adapters/publishers/born-digital.test.ts +0 -194
- package/tests/unit/adapters/publishers/coronasha.test.ts +0 -207
- package/tests/unit/adapters/publishers/gihyo.test.ts +0 -137
- package/tests/unit/adapters/publishers/impress.test.ts +0 -129
- package/tests/unit/adapters/publishers/lambdanote.test.ts +0 -85
- package/tests/unit/adapters/publishers/manatee.test.ts +0 -165
- package/tests/unit/adapters/publishers/maruzen-publishing.test.ts +0 -179
- package/tests/unit/adapters/publishers/optronics.test.ts +0 -208
- package/tests/unit/adapters/publishers/oreilly-japan.test.ts +0 -194
- package/tests/unit/adapters/publishers/peaks.test.ts +0 -177
- package/tests/unit/adapters/publishers/personal-media.test.ts +0 -199
- package/tests/unit/adapters/publishers/rutles.test.ts +0 -173
- package/tests/unit/adapters/publishers/saiensu.test.ts +0 -169
- package/tests/unit/adapters/publishers/seshop.test.ts +0 -174
- package/tests/unit/adapters/publishers/tatsu-zine.test.ts +0 -172
- package/tests/unit/adapters/publishers/techbookfest.test.ts +0 -94
- package/tests/unit/adapters/registry.test.ts +0 -37
- package/tests/unit/application/get-book-detail.test.ts +0 -102
- package/tests/unit/application/search-books.test.ts +0 -137
- package/tsconfig.json +0 -17
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,31 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.2.4] - 2026-04-19
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- 日科技連出版社 (`juse-p`) アダプターを追加
|
|
15
|
+
- Google Books アダプター (`google-books`) を追加(APIキー未設定時は無効化)
|
|
16
|
+
- `techbook-mcp setup` コマンドを追加: Google Books API キーを対話入力し OS 固有の設定ディレクトリに保存
|
|
17
|
+
- Linux: `$XDG_CONFIG_HOME/techbook-mcp/credentials.json`
|
|
18
|
+
- macOS: `~/Library/Application Support/techbook-mcp/credentials.json`
|
|
19
|
+
- Windows: `%APPDATA%\techbook-mcp\credentials.json`
|
|
20
|
+
- ISBN出版者記号から出版社アダプターを特定するマッピング (`PUBLISHER_ISBN_CODES`) を追加(13出版社)
|
|
21
|
+
- `get_book_by_isbn` が openBD の storelink に加え、ISBN出版者記号からも対応アダプターを特定して出版社サイトから直接取得を試みるよう改善
|
|
22
|
+
|
|
23
|
+
## [0.2.3] - 2026-04-13
|
|
24
|
+
|
|
25
|
+
### Added
|
|
26
|
+
|
|
27
|
+
- `get_book_by_isbn` ツールを追加(ISBNから書誌情報を取得)
|
|
28
|
+
- openBD にない書籍のフォールバックとしてカーリル API を追加
|
|
29
|
+
|
|
30
|
+
### Fixed
|
|
31
|
+
|
|
32
|
+
- `getDetail()` の著者取得を自己紹介文ではなく `itemprop="author"` から取得するよう修正
|
|
33
|
+
- `bin` エントリの `./` プレフィックスを修正
|
|
34
|
+
|
|
10
35
|
## [0.2.2] - 2026-04-12
|
|
11
36
|
|
|
12
37
|
### Fixed
|
|
@@ -35,7 +60,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
35
60
|
|
|
36
61
|
- テストを vitest から `node:test` + `node:assert` に移行(Node.js・Bun・Deno で共通実行可能に)
|
|
37
62
|
|
|
38
|
-
[Unreleased]: https://github.com/zonuexe/techbook-mcp/compare/v0.2.
|
|
63
|
+
[Unreleased]: https://github.com/zonuexe/techbook-mcp/compare/v0.2.4...HEAD
|
|
64
|
+
[0.2.4]: https://github.com/zonuexe/techbook-mcp/compare/v0.2.3...v0.2.4
|
|
65
|
+
[0.2.3]: https://github.com/zonuexe/techbook-mcp/compare/v0.2.2...v0.2.3
|
|
39
66
|
[0.2.2]: https://github.com/zonuexe/techbook-mcp/compare/v0.2.1...v0.2.2
|
|
40
67
|
[0.2.1]: https://github.com/zonuexe/techbook-mcp/compare/v0.2.0...v0.2.1
|
|
41
68
|
[0.2.0]: https://github.com/zonuexe/techbook-mcp/releases/tag/v0.2.0
|
package/README.md
CHANGED
|
@@ -60,26 +60,45 @@ Claude が `get_book_detail` ツールで著者・価格・ISBN・購入可能
|
|
|
60
60
|
|
|
61
61
|
Claude が `list_publishers` ツールを呼び出し、出版社名と ID の一覧を返します。
|
|
62
62
|
|
|
63
|
-
##
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
|
70
|
-
|
|
71
|
-
|
|
|
72
|
-
|
|
|
73
|
-
|
|
|
74
|
-
|
|
|
75
|
-
|
|
|
76
|
-
|
|
|
77
|
-
|
|
|
78
|
-
|
|
|
79
|
-
|
|
|
80
|
-
|
|
|
81
|
-
|
|
|
82
|
-
|
|
|
63
|
+
## 対応ソース
|
|
64
|
+
|
|
65
|
+
### 出版社・書店
|
|
66
|
+
|
|
67
|
+
`publisher` パラメータに ID を指定すると、その出版社のみを検索できます。
|
|
68
|
+
|
|
69
|
+
| 出版社・書店 | ID | ISBN出版者記号 | 取得方式 |
|
|
70
|
+
|---|---|---|---|
|
|
71
|
+
| BOOK TECH | `book-tech` | — | HTML scraping |
|
|
72
|
+
| ボーンデジタル | `born-digital` | `86246` | HTML scraping (EUC-JP) |
|
|
73
|
+
| コロナ社 | `coronasha` | `339` | HTML scraping |
|
|
74
|
+
| 技術評論社 | `gihyo` | `297` | JSON API |
|
|
75
|
+
| インプレスブックス | `impress-books` | `8443` | HTML scraping |
|
|
76
|
+
| 日科技連出版社 | `juse-p` | `8171` | HTML scraping |
|
|
77
|
+
| ラムダノート | `lambdanote` | `908686` | HTML scraping (Shopify) |
|
|
78
|
+
| マナティ(マイナビ出版直販) | `manatee` | `8399` | HTML scraping |
|
|
79
|
+
| 丸善出版 | `maruzen-publishing` | `621` | HTML scraping |
|
|
80
|
+
| オプトロニクス社 | `optronics` | `902312` | HTML scraping |
|
|
81
|
+
| オライリー・ジャパン | `oreilly-japan` | `8144` | HTML scraping (ローカルフィルタ) |
|
|
82
|
+
| PEAKS | `peaks` | — | HTML scraping (ローカルフィルタ) |
|
|
83
|
+
| パーソナルメディア | `personal-media` | `89362` | HTML scraping (ローカルフィルタ) |
|
|
84
|
+
| ラトルズ | `rutles` | `89977` | HTML scraping (EUC-JP) |
|
|
85
|
+
| サイエンス社 | `saiensu` | `7819` | HTML scraping |
|
|
86
|
+
| SEshop(翔泳社) | `seshop` | `7981` | HTML scraping |
|
|
87
|
+
| 達人出版会 | `tatsu-zine` | — | HTML scraping |
|
|
88
|
+
| 技術書典オンラインマーケット | `techbookfest` | — | GraphQL API |
|
|
89
|
+
|
|
90
|
+
ISBN出版者記号(`978-4-XXXXX-...` の `XXXXX` 部分)が登録されている出版社は、ISBNだけで直接検索できます。
|
|
91
|
+
「—」は電子書籍専業・同人誌マーケット等でISBN出版者記号を持たないソースです。
|
|
92
|
+
|
|
93
|
+
### 外部 API・データソース
|
|
94
|
+
|
|
95
|
+
| サービス | ID | 用途 | 備考 |
|
|
96
|
+
|---|---|---|---|
|
|
97
|
+
| Google Books | `google-books` | 横断検索 | APIキー必須(`techbook-mcp setup` で設定) |
|
|
98
|
+
| [openBD](https://openbd.jp/) | — | ISBN検索のバックボーン | 自動使用・設定不要 |
|
|
99
|
+
| [カーリル](https://calil.jp/) | — | openBDにない書籍のフォールバック | 自動使用・設定不要 |
|
|
100
|
+
|
|
101
|
+
**openBD** は `get_book_by_isbn` ツールで常に参照される書誌情報データベースです。ISBN で書籍を検索すると、まず openBD から書誌情報・出版社ストアリンクを取得し、対応する出版社アダプターがあればそのサイトから詳細情報を補完します。openBD にない書籍(絶版・廃業出版社など)はカーリルにフォールバックします。
|
|
83
102
|
|
|
84
103
|
## MCPツール
|
|
85
104
|
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { PublisherDeps } from "../domain/publisher.js";
|
|
2
|
+
import type { BookRecord } from "../domain/book.js";
|
|
3
|
+
export declare const CALIL_BASE_URL = "https://calil.jp";
|
|
4
|
+
/**
|
|
5
|
+
* カーリルの書籍詳細ページ (/book/{isbn}) から書誌情報を取得する。
|
|
6
|
+
* openBD に存在しない書籍(廃業出版社など)のフォールバックとして使用する。
|
|
7
|
+
* @returns 書誌情報が見つかれば BookRecord、ページが存在しなければ null。
|
|
8
|
+
*/
|
|
9
|
+
export declare function fetchCalilBook(isbn: string, deps: PublisherDeps): Promise<BookRecord | null>;
|
|
10
|
+
//# sourceMappingURL=calil.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"calil.d.ts","sourceRoot":"","sources":["../../src/adapters/calil.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAGpD,eAAO,MAAM,cAAc,qBAAqB,CAAC;AAEjD;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CA0C5B"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { fetchText } from "./publishers/base.js";
|
|
2
|
+
export const CALIL_BASE_URL = "https://calil.jp";
|
|
3
|
+
/**
|
|
4
|
+
* カーリルの書籍詳細ページ (/book/{isbn}) から書誌情報を取得する。
|
|
5
|
+
* openBD に存在しない書籍(廃業出版社など)のフォールバックとして使用する。
|
|
6
|
+
* @returns 書誌情報が見つかれば BookRecord、ページが存在しなければ null。
|
|
7
|
+
*/
|
|
8
|
+
export async function fetchCalilBook(isbn, deps) {
|
|
9
|
+
const url = `${CALIL_BASE_URL}/book/${isbn}`;
|
|
10
|
+
let html;
|
|
11
|
+
try {
|
|
12
|
+
html = await fetchText(url, deps);
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
const doc = deps.parser.parse(html);
|
|
18
|
+
const title = doc.selectOne("h1.title[itemprop='name']")?.text().trim();
|
|
19
|
+
if (!title)
|
|
20
|
+
return null;
|
|
21
|
+
// 著者: div.author 内の <a> テキストを収集する
|
|
22
|
+
// <div class="author" itemprop="author">
|
|
23
|
+
// <a href="/search?q=author:...">WebビジネスPHP研究部会</a><span>(著)</span>
|
|
24
|
+
// </div>
|
|
25
|
+
const authorLinks = doc.select("div[itemprop='author'] a");
|
|
26
|
+
const authors = authorLinks.map(el => el.text().trim()).filter(Boolean);
|
|
27
|
+
const publisher = doc.selectOne("span[itemprop='publisher']")?.text().trim() || undefined;
|
|
28
|
+
// "(2002-02-01)" → "2002-02-01"
|
|
29
|
+
const rawDate = doc.selectOne("span[itemprop='datePublished']")?.text().trim();
|
|
30
|
+
const publishedAt = rawDate ? rawDate.replace(/^\(|\)$/g, "").trim() || undefined : undefined;
|
|
31
|
+
// ISBN-13: <span itemprop="isbn">ISBN-13:</span> 9784901676038 の形式
|
|
32
|
+
const isbn13Match = html.match(/ISBN-13:[^<]*<\/span>[^<\d]*(97[89]\d{10})/);
|
|
33
|
+
const isbn13 = isbn13Match?.[1] ?? isbn;
|
|
34
|
+
const coverImageUrl = doc.selectOne("img[itemprop='image']")?.attr("src") || undefined;
|
|
35
|
+
return {
|
|
36
|
+
title,
|
|
37
|
+
authors,
|
|
38
|
+
publisher: publisher ?? "",
|
|
39
|
+
isbn: isbn13,
|
|
40
|
+
publishedAt,
|
|
41
|
+
url,
|
|
42
|
+
coverImageUrl,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=calil.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"calil.js","sourceRoot":"","sources":["../../src/adapters/calil.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,MAAM,CAAC,MAAM,cAAc,GAAG,kBAAkB,CAAC;AAEjD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,IAAY,EACZ,IAAmB;IAEnB,MAAM,GAAG,GAAG,GAAG,cAAc,SAAS,IAAI,EAAE,CAAC;IAC7C,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAEpC,MAAM,KAAK,GAAG,GAAG,CAAC,SAAS,CAAC,2BAA2B,CAAC,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;IACxE,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAExB,kCAAkC;IAClC,yCAAyC;IACzC,sEAAsE;IACtE,SAAS;IACT,MAAM,WAAW,GAAG,GAAG,CAAC,MAAM,CAAC,0BAA0B,CAAC,CAAC;IAC3D,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAExE,MAAM,SAAS,GAAG,GAAG,CAAC,SAAS,CAAC,4BAA4B,CAAC,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,SAAS,CAAC;IAE1F,gCAAgC;IAChC,MAAM,OAAO,GAAG,GAAG,CAAC,SAAS,CAAC,gCAAgC,CAAC,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;IAC/E,MAAM,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IAE9F,mEAAmE;IACnE,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAC7E,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;IAExC,MAAM,aAAa,GAAG,GAAG,CAAC,SAAS,CAAC,uBAAuB,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,SAAS,CAAC;IAEvF,OAAO;QACL,KAAK;QACL,OAAO;QACP,SAAS,EAAE,SAAS,IAAI,EAAE;QAC1B,IAAI,EAAE,MAAM;QACZ,WAAW;QACX,GAAG;QACH,aAAa;KACd,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type { PublisherDeps } from "../domain/publisher.js";
|
|
2
|
+
import type { BookRecord } from "../domain/book.js";
|
|
3
|
+
interface OpenBDSummary {
|
|
4
|
+
isbn: string;
|
|
5
|
+
title: string;
|
|
6
|
+
publisher: string;
|
|
7
|
+
pubdate: string;
|
|
8
|
+
cover: string;
|
|
9
|
+
author: string;
|
|
10
|
+
}
|
|
11
|
+
interface OpenBDTextContent {
|
|
12
|
+
TextType: string;
|
|
13
|
+
ContentAudience: string;
|
|
14
|
+
Text: string;
|
|
15
|
+
}
|
|
16
|
+
interface OpenBDPrice {
|
|
17
|
+
PriceType: string;
|
|
18
|
+
PriceAmount: string;
|
|
19
|
+
CurrencyCode: string;
|
|
20
|
+
}
|
|
21
|
+
interface OpenBDHanmoto {
|
|
22
|
+
isbn: string;
|
|
23
|
+
storelink?: string;
|
|
24
|
+
[key: string]: unknown;
|
|
25
|
+
}
|
|
26
|
+
export interface OpenBDEntry {
|
|
27
|
+
summary: OpenBDSummary;
|
|
28
|
+
hanmoto?: OpenBDHanmoto;
|
|
29
|
+
onix: {
|
|
30
|
+
CollateralDetail?: {
|
|
31
|
+
TextContent?: OpenBDTextContent[];
|
|
32
|
+
};
|
|
33
|
+
ProductSupply?: {
|
|
34
|
+
SupplyDetail?: {
|
|
35
|
+
Price?: OpenBDPrice[];
|
|
36
|
+
};
|
|
37
|
+
};
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* openBD API から複数ISBNの書誌情報を一括取得する。
|
|
42
|
+
* @returns ISBNをキーとするMapを返す。該当なし・取得失敗のISBNは含まれない。
|
|
43
|
+
*/
|
|
44
|
+
export declare function fetchOpenBDBooks(isbns: string[], deps: PublisherDeps): Promise<Map<string, OpenBDEntry>>;
|
|
45
|
+
/**
|
|
46
|
+
* openBD エントリを BookRecord に変換する。
|
|
47
|
+
* 出版社サイトから取得できない場合のフォールバック用。
|
|
48
|
+
* url には hanmoto.storelink を使用し、なければ openBD API URL を使用する。
|
|
49
|
+
*/
|
|
50
|
+
export declare function openBDEntryToBookRecord(entry: OpenBDEntry): BookRecord;
|
|
51
|
+
/**
|
|
52
|
+
* openBD の書誌情報で BookRecord の欠損フィールドを補完する。
|
|
53
|
+
* 既存のフィールドは上書きしない。
|
|
54
|
+
*/
|
|
55
|
+
export declare function enrichWithOpenBD(book: BookRecord, entry: OpenBDEntry): BookRecord;
|
|
56
|
+
export {};
|
|
57
|
+
//# sourceMappingURL=openbd.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openbd.d.ts","sourceRoot":"","sources":["../../src/adapters/openbd.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAOpD,UAAU,aAAa;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,iBAAiB;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,UAAU,WAAW;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,UAAU,aAAa;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,aAAa,CAAC;IACvB,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,IAAI,EAAE;QACJ,gBAAgB,CAAC,EAAE;YACjB,WAAW,CAAC,EAAE,iBAAiB,EAAE,CAAC;SACnC,CAAC;QACF,aAAa,CAAC,EAAE;YACd,YAAY,CAAC,EAAE;gBACb,KAAK,CAAC,EAAE,WAAW,EAAE,CAAC;aACvB,CAAC;SACH,CAAC;KACH,CAAC;CACH;AA+BD;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,MAAM,EAAE,EACf,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAenC;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,WAAW,GAAG,UAAU,CAmBtE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,GAAG,UAAU,CAQjF"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { fetchText } from "./publishers/base.js";
|
|
2
|
+
const OPENBD_API_URL = "https://api.openbd.jp/v1/get";
|
|
3
|
+
// --- ユーティリティ ---
|
|
4
|
+
function parsePubDate(pubdate) {
|
|
5
|
+
if (!pubdate || pubdate.length < 8)
|
|
6
|
+
return undefined;
|
|
7
|
+
return `${pubdate.slice(0, 4)}-${pubdate.slice(4, 6)}-${pubdate.slice(6, 8)}`;
|
|
8
|
+
}
|
|
9
|
+
function findTextByType(entry, ...types) {
|
|
10
|
+
const texts = entry.onix.CollateralDetail?.TextContent;
|
|
11
|
+
if (!texts)
|
|
12
|
+
return undefined;
|
|
13
|
+
for (const type of types) {
|
|
14
|
+
const found = texts.find(t => t.TextType === type);
|
|
15
|
+
if (found?.Text)
|
|
16
|
+
return found.Text;
|
|
17
|
+
}
|
|
18
|
+
return undefined;
|
|
19
|
+
}
|
|
20
|
+
function getTaxIncludedPrice(entry) {
|
|
21
|
+
const prices = entry.onix.ProductSupply?.SupplyDetail?.Price;
|
|
22
|
+
if (!prices)
|
|
23
|
+
return undefined;
|
|
24
|
+
// PriceType "03" = 税込定価
|
|
25
|
+
const price = prices.find(p => p.PriceType === "03");
|
|
26
|
+
if (!price)
|
|
27
|
+
return undefined;
|
|
28
|
+
const amount = parseInt(price.PriceAmount, 10);
|
|
29
|
+
return isNaN(amount) ? undefined : amount;
|
|
30
|
+
}
|
|
31
|
+
// --- 公開API ---
|
|
32
|
+
/**
|
|
33
|
+
* openBD API から複数ISBNの書誌情報を一括取得する。
|
|
34
|
+
* @returns ISBNをキーとするMapを返す。該当なし・取得失敗のISBNは含まれない。
|
|
35
|
+
*/
|
|
36
|
+
export async function fetchOpenBDBooks(isbns, deps) {
|
|
37
|
+
if (isbns.length === 0)
|
|
38
|
+
return new Map();
|
|
39
|
+
const url = `${OPENBD_API_URL}?isbn=${isbns.join(",")}`;
|
|
40
|
+
const text = await fetchText(url, deps);
|
|
41
|
+
const data = JSON.parse(text);
|
|
42
|
+
const result = new Map();
|
|
43
|
+
for (let i = 0; i < isbns.length; i++) {
|
|
44
|
+
const entry = data[i];
|
|
45
|
+
if (entry !== null && entry !== undefined) {
|
|
46
|
+
result.set(isbns[i], entry);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return result;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* openBD エントリを BookRecord に変換する。
|
|
53
|
+
* 出版社サイトから取得できない場合のフォールバック用。
|
|
54
|
+
* url には hanmoto.storelink を使用し、なければ openBD API URL を使用する。
|
|
55
|
+
*/
|
|
56
|
+
export function openBDEntryToBookRecord(entry) {
|
|
57
|
+
const { summary } = entry;
|
|
58
|
+
const storelink = entry.hanmoto?.storelink;
|
|
59
|
+
const authors = summary.author
|
|
60
|
+
? summary.author.split(/[\//、,,]/).map(a => a.trim()).filter(Boolean)
|
|
61
|
+
: [];
|
|
62
|
+
return {
|
|
63
|
+
title: summary.title,
|
|
64
|
+
authors,
|
|
65
|
+
publisher: summary.publisher,
|
|
66
|
+
isbn: summary.isbn,
|
|
67
|
+
publishedAt: parsePubDate(summary.pubdate),
|
|
68
|
+
url: storelink ?? `https://api.openbd.jp/v1/get?isbn=${summary.isbn}`,
|
|
69
|
+
price: getTaxIncludedPrice(entry),
|
|
70
|
+
coverImageUrl: summary.cover || undefined,
|
|
71
|
+
description: findTextByType(entry, "03", "02"),
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* openBD の書誌情報で BookRecord の欠損フィールドを補完する。
|
|
76
|
+
* 既存のフィールドは上書きしない。
|
|
77
|
+
*/
|
|
78
|
+
export function enrichWithOpenBD(book, entry) {
|
|
79
|
+
return {
|
|
80
|
+
...book,
|
|
81
|
+
publishedAt: book.publishedAt ?? parsePubDate(entry.summary.pubdate),
|
|
82
|
+
price: book.price ?? getTaxIncludedPrice(entry),
|
|
83
|
+
coverImageUrl: book.coverImageUrl ?? (entry.summary.cover || undefined),
|
|
84
|
+
description: book.description ?? findTextByType(entry, "03", "02"),
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=openbd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openbd.js","sourceRoot":"","sources":["../../src/adapters/openbd.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"google-books.d.ts","sourceRoot":"","sources":["../../../src/adapters/publishers/google-books.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAiB,MAAM,2BAA2B,CAAC;AA8DjF,wBAAgB,sBAAsB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,gBAAgB,CA4CxE;AAED,eAAO,MAAM,kBAAkB,EAAE,gBAA2C,CAAC"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { fetchText } from "./base.js";
|
|
2
|
+
const API_BASE = "https://www.googleapis.com/books/v1";
|
|
3
|
+
const INFO_BASE = "https://books.google.com";
|
|
4
|
+
function toHttps(url) {
|
|
5
|
+
return url.replace(/^http:\/\//, "https://");
|
|
6
|
+
}
|
|
7
|
+
function parsePublishedDate(raw) {
|
|
8
|
+
const parts = raw.split("-");
|
|
9
|
+
if (parts.length >= 3)
|
|
10
|
+
return raw.slice(0, 10);
|
|
11
|
+
if (parts.length === 2)
|
|
12
|
+
return `${parts[0]}-${parts[1]}-01`;
|
|
13
|
+
return `${parts[0]}-01-01`;
|
|
14
|
+
}
|
|
15
|
+
function volumeToBookRecord(vol) {
|
|
16
|
+
const info = vol.volumeInfo;
|
|
17
|
+
const isbn13 = info.industryIdentifiers?.find(id => id.type === "ISBN_13")?.identifier;
|
|
18
|
+
const price = vol.saleInfo?.listPrice?.currencyCode === "JPY"
|
|
19
|
+
? Math.round(vol.saleInfo.listPrice.amount)
|
|
20
|
+
: undefined;
|
|
21
|
+
const url = toHttps(info.infoLink ?? `${INFO_BASE}/books?id=${vol.id}`);
|
|
22
|
+
return {
|
|
23
|
+
title: info.title,
|
|
24
|
+
authors: info.authors ?? [],
|
|
25
|
+
publisher: info.publisher ?? "",
|
|
26
|
+
publishedAt: info.publishedDate ? parsePublishedDate(info.publishedDate) : undefined,
|
|
27
|
+
isbn: isbn13,
|
|
28
|
+
url,
|
|
29
|
+
price,
|
|
30
|
+
coverImageUrl: info.imageLinks?.thumbnail ? toHttps(info.imageLinks.thumbnail) : undefined,
|
|
31
|
+
description: info.description,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
export function makeGoogleBooksAdapter(apiKey) {
|
|
35
|
+
// env アクセスはメソッド呼び出し時に遅延評価する。
|
|
36
|
+
// モジュールロード時に読むと Deno が --allow-env なしで権限エラーになる。
|
|
37
|
+
const resolveKey = () => apiKey ?? process.env.GOOGLE_BOOKS_API_KEY ?? "";
|
|
38
|
+
return {
|
|
39
|
+
id: "google-books",
|
|
40
|
+
name: "Google Books",
|
|
41
|
+
baseUrl: INFO_BASE,
|
|
42
|
+
async search(query, deps) {
|
|
43
|
+
const key = resolveKey();
|
|
44
|
+
if (!key)
|
|
45
|
+
return [];
|
|
46
|
+
const word = [query.title, query.author].filter(Boolean).join(" ");
|
|
47
|
+
if (!word)
|
|
48
|
+
return [];
|
|
49
|
+
const limit = Math.min(query.limit ?? 10, 40);
|
|
50
|
+
const params = new URLSearchParams({
|
|
51
|
+
q: word,
|
|
52
|
+
langRestrict: "ja",
|
|
53
|
+
maxResults: String(limit),
|
|
54
|
+
key,
|
|
55
|
+
});
|
|
56
|
+
const text = await fetchText(`${API_BASE}/volumes?${params}`, deps);
|
|
57
|
+
const data = JSON.parse(text);
|
|
58
|
+
return (data.items ?? []).map(volumeToBookRecord);
|
|
59
|
+
},
|
|
60
|
+
async getDetail(url, deps) {
|
|
61
|
+
const key = resolveKey();
|
|
62
|
+
if (!key)
|
|
63
|
+
throw new Error("GOOGLE_BOOKS_API_KEY が設定されていません");
|
|
64
|
+
const idMatch = url.match(/[?&]id=([^&]+)/);
|
|
65
|
+
if (!idMatch)
|
|
66
|
+
throw new Error(`URLからボリュームIDを取得できません: ${url}`);
|
|
67
|
+
const volumeId = idMatch[1];
|
|
68
|
+
const text = await fetchText(`${API_BASE}/volumes/${volumeId}?key=${key}`, deps);
|
|
69
|
+
const vol = JSON.parse(text);
|
|
70
|
+
return volumeToBookRecord(vol);
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
export const googleBooksAdapter = makeGoogleBooksAdapter();
|
|
75
|
+
//# sourceMappingURL=google-books.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"google-books.js","sourceRoot":"","sources":["../../../src/adapters/publishers/google-books.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 日本のISBN出版者記号 (978-4-XXXXX-...) とアダプターIDの対応表。
|
|
3
|
+
*
|
|
4
|
+
* ISBN出版者記号は978-4-(グループ識別子)に続くXXXXXの部分。
|
|
5
|
+
* 桁数はJPOの範囲規定(3桁: 200-699、4桁: 7000-8499、
|
|
6
|
+
* 5桁: 85000-89999、6桁: 900000-949999)による。
|
|
7
|
+
*
|
|
8
|
+
* 出典: JPO登録出版者照会 https://isbn.jpo.or.jp/index.php/fix__ref_pub/
|
|
9
|
+
* および各出版社公式サイト・版元ドットコムにて確認済み(2026-04-19)。
|
|
10
|
+
*
|
|
11
|
+
* 電子書籍専業(達人出版会・PEAKS)や
|
|
12
|
+
* 書店プラットフォーム(BOOK TECH・技術書典)はISBN出版者記号なし。
|
|
13
|
+
*/
|
|
14
|
+
/** アダプターIDとISBN出版者記号の対応。複数記号を持つ出版社は配列で列挙。 */
|
|
15
|
+
export declare const PUBLISHER_ISBN_CODES: ReadonlyMap<string, readonly string[]>;
|
|
16
|
+
/**
|
|
17
|
+
* ISBN-13に対応するアダプターIDを返す。
|
|
18
|
+
* 例: "9784297128152" → "gihyo"
|
|
19
|
+
*/
|
|
20
|
+
export declare function findAdapterIdByIsbn(isbn13: string): string | undefined;
|
|
21
|
+
//# sourceMappingURL=isbn-publisher-codes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"isbn-publisher-codes.d.ts","sourceRoot":"","sources":["../../../src/adapters/publishers/isbn-publisher-codes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,6CAA6C;AAC7C,eAAO,MAAM,oBAAoB,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAetE,CAAC;AAEH;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAYtE"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 日本のISBN出版者記号 (978-4-XXXXX-...) とアダプターIDの対応表。
|
|
3
|
+
*
|
|
4
|
+
* ISBN出版者記号は978-4-(グループ識別子)に続くXXXXXの部分。
|
|
5
|
+
* 桁数はJPOの範囲規定(3桁: 200-699、4桁: 7000-8499、
|
|
6
|
+
* 5桁: 85000-89999、6桁: 900000-949999)による。
|
|
7
|
+
*
|
|
8
|
+
* 出典: JPO登録出版者照会 https://isbn.jpo.or.jp/index.php/fix__ref_pub/
|
|
9
|
+
* および各出版社公式サイト・版元ドットコムにて確認済み(2026-04-19)。
|
|
10
|
+
*
|
|
11
|
+
* 電子書籍専業(達人出版会・PEAKS)や
|
|
12
|
+
* 書店プラットフォーム(BOOK TECH・技術書典)はISBN出版者記号なし。
|
|
13
|
+
*/
|
|
14
|
+
/** アダプターIDとISBN出版者記号の対応。複数記号を持つ出版社は配列で列挙。 */
|
|
15
|
+
export const PUBLISHER_ISBN_CODES = new Map([
|
|
16
|
+
["coronasha", ["339"]],
|
|
17
|
+
["maruzen-publishing", ["621"]],
|
|
18
|
+
["gihyo", ["297"]],
|
|
19
|
+
["saiensu", ["7819"]],
|
|
20
|
+
["seshop", ["7981"]],
|
|
21
|
+
["oreilly-japan", ["8144"]],
|
|
22
|
+
["juse-p", ["8171"]],
|
|
23
|
+
["impress-books", ["8443"]],
|
|
24
|
+
["born-digital", ["86246"]],
|
|
25
|
+
["personal-media", ["89362"]],
|
|
26
|
+
["rutles", ["89977"]],
|
|
27
|
+
["manatee", ["8399"]],
|
|
28
|
+
["lambdanote", ["908686"]],
|
|
29
|
+
["optronics", ["902312"]],
|
|
30
|
+
]);
|
|
31
|
+
/**
|
|
32
|
+
* ISBN-13に対応するアダプターIDを返す。
|
|
33
|
+
* 例: "9784297128152" → "gihyo"
|
|
34
|
+
*/
|
|
35
|
+
export function findAdapterIdByIsbn(isbn13) {
|
|
36
|
+
const raw = isbn13.replace(/-/g, "");
|
|
37
|
+
if (!raw.startsWith("9784"))
|
|
38
|
+
return undefined;
|
|
39
|
+
// 9784 の次から始まる出版者記号候補を長さ順(長い方優先)でチェック
|
|
40
|
+
for (const [adapterId, codes] of PUBLISHER_ISBN_CODES) {
|
|
41
|
+
for (const code of codes) {
|
|
42
|
+
if (raw.startsWith(`9784${code}`)) {
|
|
43
|
+
return adapterId;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return undefined;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=isbn-publisher-codes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"isbn-publisher-codes.js","sourceRoot":"","sources":["../../../src/adapters/publishers/isbn-publisher-codes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,6CAA6C;AAC7C,MAAM,CAAC,MAAM,oBAAoB,GAA2C,IAAI,GAAG,CAAC;IAClF,CAAC,WAAW,EAAU,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC,oBAAoB,EAAC,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC,OAAO,EAAc,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC,SAAS,EAAY,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC,QAAQ,EAAa,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC,eAAe,EAAM,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC,QAAQ,EAAa,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC,eAAe,EAAM,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC,cAAc,EAAO,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC,gBAAgB,EAAK,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC,QAAQ,EAAa,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC,SAAS,EAAY,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC,YAAY,EAAS,CAAC,QAAQ,CAAC,CAAC;IACjC,CAAC,WAAW,EAAU,CAAC,QAAQ,CAAC,CAAC;CAClC,CAAC,CAAC;AAEH;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAc;IAChD,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACrC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,SAAS,CAAC;IAC9C,sCAAsC;IACtC,KAAK,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,oBAAoB,EAAE,CAAC;QACtD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,GAAG,CAAC,UAAU,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,CAAC;gBAClC,OAAO,SAAS,CAAC;YACnB,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"juse-p.d.ts","sourceRoot":"","sources":["../../../src/adapters/publishers/juse-p.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAiB,MAAM,2BAA2B,CAAC;AAmCjF,eAAO,MAAM,YAAY,EAAE,gBAyF1B,CAAC"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { fetchText, parseJapanesePrice, resolveUrl } from "./base.js";
|
|
2
|
+
const BASE_URL = "https://www.juse-p.co.jp";
|
|
3
|
+
const SEARCH_URL = `${BASE_URL}/products`;
|
|
4
|
+
/**
|
|
5
|
+
* "武藤佳恭[監修]、和田尚之[著]" → ["武藤佳恭", "和田尚之"]
|
|
6
|
+
* 著者テキストから役割語([著][監修]等)を除去して名前リストを返す。
|
|
7
|
+
*/
|
|
8
|
+
function parseAuthors(text) {
|
|
9
|
+
return text.split(/[、,]/)
|
|
10
|
+
.map(s => s.replace(/\[.*?\]/g, "").trim())
|
|
11
|
+
.filter(Boolean);
|
|
12
|
+
}
|
|
13
|
+
/** "ISBN978-4-8171-9818-1" → "9784817198181" */
|
|
14
|
+
function parseIsbn(text) {
|
|
15
|
+
const m = text.match(/[\d-]{13,}/);
|
|
16
|
+
return m ? m[0].replace(/-/g, "") : undefined;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* h2.c-ttl-02 のテキストから書籍名とサブタイトルを取り出す。
|
|
20
|
+
* 【カテゴリラベル】は除外する。
|
|
21
|
+
* 例: "【コレクション】\n\tPython入門\n\t機械学習の基礎" → ["Python入門", "機械学習の基礎"]
|
|
22
|
+
*/
|
|
23
|
+
function parseTitleParts(text) {
|
|
24
|
+
return text
|
|
25
|
+
.split(/\n/)
|
|
26
|
+
.map(s => s.trim())
|
|
27
|
+
.filter(s => s && !/^【.*】$/.test(s));
|
|
28
|
+
}
|
|
29
|
+
export const jusePAdapter = {
|
|
30
|
+
id: "juse-p",
|
|
31
|
+
name: "日科技連出版社",
|
|
32
|
+
baseUrl: BASE_URL,
|
|
33
|
+
async search(query, deps) {
|
|
34
|
+
const keyword = [query.title, query.author].filter(Boolean).join(" ");
|
|
35
|
+
if (!keyword)
|
|
36
|
+
return [];
|
|
37
|
+
const url = `${SEARCH_URL}?k=${encodeURIComponent(keyword)}`;
|
|
38
|
+
const html = await fetchText(url, deps);
|
|
39
|
+
const doc = deps.parser.parse(html);
|
|
40
|
+
const results = [];
|
|
41
|
+
const limit = query.limit ?? 10;
|
|
42
|
+
for (const item of doc.select(".product-col")) {
|
|
43
|
+
const linkEl = item.find("div.title h4 a")[0];
|
|
44
|
+
const href = linkEl?.attr("href");
|
|
45
|
+
if (!href)
|
|
46
|
+
continue;
|
|
47
|
+
const title = linkEl.text().trim();
|
|
48
|
+
if (!title)
|
|
49
|
+
continue;
|
|
50
|
+
const bookUrl = resolveUrl(BASE_URL, href);
|
|
51
|
+
const imgEl = item.find("div.image img")[0];
|
|
52
|
+
const coverSrc = imgEl?.attr("src");
|
|
53
|
+
const coverImageUrl = coverSrc ? resolveUrl(BASE_URL, coverSrc) : undefined;
|
|
54
|
+
results.push({
|
|
55
|
+
title,
|
|
56
|
+
authors: [],
|
|
57
|
+
publisher: "日科技連出版社",
|
|
58
|
+
url: bookUrl,
|
|
59
|
+
coverImageUrl,
|
|
60
|
+
ebookStores: [],
|
|
61
|
+
});
|
|
62
|
+
if (results.length >= limit)
|
|
63
|
+
break;
|
|
64
|
+
}
|
|
65
|
+
return results;
|
|
66
|
+
},
|
|
67
|
+
async getDetail(url, deps) {
|
|
68
|
+
const html = await fetchText(url, deps);
|
|
69
|
+
const doc = deps.parser.parse(html);
|
|
70
|
+
// h2.c-ttl-02 に【カテゴリ】・書籍名・サブタイトルが <br> 区切りで入る
|
|
71
|
+
const h2 = doc.selectOne("h2.c-ttl-02");
|
|
72
|
+
const titleParts = parseTitleParts(h2?.text() ?? "");
|
|
73
|
+
const title = titleParts.join(" ");
|
|
74
|
+
// .product-details ul li をパターンで分類
|
|
75
|
+
const lis = doc.select(".product-details ul li");
|
|
76
|
+
let authors = [];
|
|
77
|
+
let price;
|
|
78
|
+
let isbn;
|
|
79
|
+
for (const li of lis) {
|
|
80
|
+
const text = li.text();
|
|
81
|
+
if (/^定価/.test(text)) {
|
|
82
|
+
price = parseJapanesePrice(text);
|
|
83
|
+
}
|
|
84
|
+
else if (/^ISBN/.test(text)) {
|
|
85
|
+
isbn = parseIsbn(text);
|
|
86
|
+
}
|
|
87
|
+
else if (/^[A-Z][0-9]//.test(text) || /在庫|品切/.test(text)) {
|
|
88
|
+
// 判型・ページ数 または 在庫状況 → スキップ
|
|
89
|
+
}
|
|
90
|
+
else if (authors.length === 0) {
|
|
91
|
+
authors = parseAuthors(text);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
const imgEl = doc.selectOne(".images-block img");
|
|
95
|
+
const coverSrc = imgEl?.attr("src");
|
|
96
|
+
const coverImageUrl = coverSrc ? resolveUrl(BASE_URL, coverSrc) : undefined;
|
|
97
|
+
return {
|
|
98
|
+
title,
|
|
99
|
+
authors,
|
|
100
|
+
publisher: "日科技連出版社",
|
|
101
|
+
url,
|
|
102
|
+
isbn,
|
|
103
|
+
price,
|
|
104
|
+
coverImageUrl,
|
|
105
|
+
// Amazon・楽天等のリンクは紙書籍向けのため電子書籍ストアとして扱わない
|
|
106
|
+
ebookStores: [],
|
|
107
|
+
};
|
|
108
|
+
},
|
|
109
|
+
};
|
|
110
|
+
//# sourceMappingURL=juse-p.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"juse-p.js","sourceRoot":"","sources":["../../../src/adapters/publishers/juse-p.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/adapters/publishers/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/adapters/publishers/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAqBlE,eAAO,MAAM,kBAAkB,EAAE,SAAS,gBAAgB,EAoBzD,CAAC"}
|