@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.
Files changed (151) hide show
  1. package/CHANGELOG.md +28 -1
  2. package/README.md +39 -20
  3. package/dist/adapters/calil.d.ts +10 -0
  4. package/dist/adapters/calil.d.ts.map +1 -0
  5. package/dist/adapters/calil.js +45 -0
  6. package/dist/adapters/calil.js.map +1 -0
  7. package/dist/adapters/openbd.d.ts +57 -0
  8. package/dist/adapters/openbd.d.ts.map +1 -0
  9. package/dist/adapters/openbd.js +87 -0
  10. package/dist/adapters/openbd.js.map +1 -0
  11. package/dist/adapters/publishers/google-books.d.ts +4 -0
  12. package/dist/adapters/publishers/google-books.d.ts.map +1 -0
  13. package/dist/adapters/publishers/google-books.js +75 -0
  14. package/dist/adapters/publishers/google-books.js.map +1 -0
  15. package/dist/adapters/publishers/isbn-publisher-codes.d.ts +21 -0
  16. package/dist/adapters/publishers/isbn-publisher-codes.d.ts.map +1 -0
  17. package/dist/adapters/publishers/isbn-publisher-codes.js +49 -0
  18. package/dist/adapters/publishers/isbn-publisher-codes.js.map +1 -0
  19. package/dist/adapters/publishers/juse-p.d.ts +3 -0
  20. package/dist/adapters/publishers/juse-p.d.ts.map +1 -0
  21. package/dist/adapters/publishers/juse-p.js +110 -0
  22. package/dist/adapters/publishers/juse-p.js.map +1 -0
  23. package/dist/adapters/publishers/registry.d.ts.map +1 -1
  24. package/dist/adapters/publishers/registry.js +4 -0
  25. package/dist/adapters/publishers/registry.js.map +1 -1
  26. package/dist/adapters/publishers/tatsu-zine.d.ts.map +1 -1
  27. package/dist/adapters/publishers/tatsu-zine.js +6 -18
  28. package/dist/adapters/publishers/tatsu-zine.js.map +1 -1
  29. package/dist/application/get-book-by-isbn.d.ts +13 -0
  30. package/dist/application/get-book-by-isbn.d.ts.map +1 -0
  31. package/dist/application/get-book-by-isbn.js +61 -0
  32. package/dist/application/get-book-by-isbn.js.map +1 -0
  33. package/dist/application/get-book-detail.d.ts.map +1 -1
  34. package/dist/application/get-book-detail.js +16 -1
  35. package/dist/application/get-book-detail.js.map +1 -1
  36. package/dist/application/search-books.d.ts.map +1 -1
  37. package/dist/application/search-books.js +20 -0
  38. package/dist/application/search-books.js.map +1 -1
  39. package/dist/config/credentials.d.ts +8 -0
  40. package/dist/config/credentials.d.ts.map +1 -0
  41. package/dist/config/credentials.js +32 -0
  42. package/dist/config/credentials.js.map +1 -0
  43. package/dist/main.js +15 -1
  44. package/dist/main.js.map +1 -1
  45. package/dist/mcp/server.d.ts.map +1 -1
  46. package/dist/mcp/server.js +10 -0
  47. package/dist/mcp/server.js.map +1 -1
  48. package/dist/mcp/tools.d.ts +13 -0
  49. package/dist/mcp/tools.d.ts.map +1 -1
  50. package/dist/mcp/tools.js +16 -0
  51. package/dist/mcp/tools.js.map +1 -1
  52. package/dist/setup.d.ts +2 -0
  53. package/dist/setup.d.ts.map +1 -0
  54. package/dist/setup.js +43 -0
  55. package/dist/setup.js.map +1 -0
  56. package/flake.lock +61 -0
  57. package/package.json +1 -1
  58. package/.claude/settings.local.json +0 -36
  59. package/.codex/skills/techbook-mcp-release-prep/SKILL.md +0 -105
  60. package/.github/workflows/test.yml +0 -72
  61. package/.oxlintrc.json +0 -12
  62. package/AGENTS.md +0 -100
  63. package/deno.json +0 -3
  64. package/src/adapters/cache/memory-cache.ts +0 -31
  65. package/src/adapters/cache/null-cache.ts +0 -8
  66. package/src/adapters/html/cheerio-parser.ts +0 -50
  67. package/src/adapters/http/fetch-client.ts +0 -47
  68. package/src/adapters/http/mock-client.ts +0 -77
  69. package/src/adapters/publishers/base.ts +0 -279
  70. package/src/adapters/publishers/book-tech.ts +0 -117
  71. package/src/adapters/publishers/born-digital.ts +0 -143
  72. package/src/adapters/publishers/coronasha.ts +0 -139
  73. package/src/adapters/publishers/gihyo.ts +0 -120
  74. package/src/adapters/publishers/impress.ts +0 -103
  75. package/src/adapters/publishers/lambdanote.ts +0 -146
  76. package/src/adapters/publishers/manatee.ts +0 -113
  77. package/src/adapters/publishers/maruzen-publishing.ts +0 -129
  78. package/src/adapters/publishers/optronics.ts +0 -113
  79. package/src/adapters/publishers/oreilly-japan.ts +0 -133
  80. package/src/adapters/publishers/peaks.ts +0 -98
  81. package/src/adapters/publishers/personal-media.ts +0 -168
  82. package/src/adapters/publishers/registry.ts +0 -38
  83. package/src/adapters/publishers/rutles.ts +0 -149
  84. package/src/adapters/publishers/saiensu.ts +0 -136
  85. package/src/adapters/publishers/seshop.ts +0 -121
  86. package/src/adapters/publishers/tatsu-zine.ts +0 -154
  87. package/src/adapters/publishers/techbookfest.ts +0 -179
  88. package/src/application/get-book-detail.ts +0 -24
  89. package/src/application/search-books.ts +0 -44
  90. package/src/domain/book.ts +0 -35
  91. package/src/domain/publisher.ts +0 -18
  92. package/src/main.ts +0 -14
  93. package/src/mcp/server.ts +0 -103
  94. package/src/mcp/tools.ts +0 -54
  95. package/src/ports/cache.ts +0 -5
  96. package/src/ports/html-parser.ts +0 -15
  97. package/src/ports/http.ts +0 -17
  98. package/tests/fixtures/book-tech-detail.html +0 -51
  99. package/tests/fixtures/book-tech-search.html +0 -91
  100. package/tests/fixtures/born-digital-detail.html +0 -62
  101. package/tests/fixtures/born-digital-search.html +0 -51
  102. package/tests/fixtures/coronasha-detail.html +0 -41
  103. package/tests/fixtures/coronasha-search.html +0 -61
  104. package/tests/fixtures/gihyo-detail.html +0 -42
  105. package/tests/fixtures/gihyo-search.json +0 -54
  106. package/tests/fixtures/impress-detail-epub.html +0 -746
  107. package/tests/fixtures/impress-detail-social.html +0 -689
  108. package/tests/fixtures/lambdanote-search.html +0 -66
  109. package/tests/fixtures/manatee-detail.html +0 -53
  110. package/tests/fixtures/manatee-search.html +0 -59
  111. package/tests/fixtures/maruzen-detail.html +0 -51
  112. package/tests/fixtures/maruzen-search.html +0 -60
  113. package/tests/fixtures/optronics-detail.html +0 -30
  114. package/tests/fixtures/optronics-search.html +0 -75
  115. package/tests/fixtures/oreilly-detail.html +0 -52
  116. package/tests/fixtures/oreilly-ebook-list.html +0 -53
  117. package/tests/fixtures/peaks-detail.html +0 -39
  118. package/tests/fixtures/peaks-top.html +0 -50
  119. package/tests/fixtures/personal-media-detail.html +0 -32
  120. package/tests/fixtures/personal-media-search.html +0 -39
  121. package/tests/fixtures/rutles-detail.html +0 -32
  122. package/tests/fixtures/rutles-search.html +0 -62
  123. package/tests/fixtures/saiensu-detail.html +0 -41
  124. package/tests/fixtures/saiensu-search.html +0 -65
  125. package/tests/fixtures/seshop-detail.html +0 -45
  126. package/tests/fixtures/seshop-search.html +0 -58
  127. package/tests/fixtures/tatsu-zine-detail-free.html +0 -22
  128. package/tests/fixtures/tatsu-zine-search.html +0 -40
  129. package/tests/fixtures/techbookfest-search.json +0 -73
  130. package/tests/unit/adapters/base.test.ts +0 -441
  131. package/tests/unit/adapters/publishers/book-tech.test.ts +0 -186
  132. package/tests/unit/adapters/publishers/born-digital.test.ts +0 -194
  133. package/tests/unit/adapters/publishers/coronasha.test.ts +0 -207
  134. package/tests/unit/adapters/publishers/gihyo.test.ts +0 -137
  135. package/tests/unit/adapters/publishers/impress.test.ts +0 -129
  136. package/tests/unit/adapters/publishers/lambdanote.test.ts +0 -85
  137. package/tests/unit/adapters/publishers/manatee.test.ts +0 -165
  138. package/tests/unit/adapters/publishers/maruzen-publishing.test.ts +0 -179
  139. package/tests/unit/adapters/publishers/optronics.test.ts +0 -208
  140. package/tests/unit/adapters/publishers/oreilly-japan.test.ts +0 -194
  141. package/tests/unit/adapters/publishers/peaks.test.ts +0 -177
  142. package/tests/unit/adapters/publishers/personal-media.test.ts +0 -199
  143. package/tests/unit/adapters/publishers/rutles.test.ts +0 -173
  144. package/tests/unit/adapters/publishers/saiensu.test.ts +0 -169
  145. package/tests/unit/adapters/publishers/seshop.test.ts +0 -174
  146. package/tests/unit/adapters/publishers/tatsu-zine.test.ts +0 -172
  147. package/tests/unit/adapters/publishers/techbookfest.test.ts +0 -94
  148. package/tests/unit/adapters/registry.test.ts +0 -37
  149. package/tests/unit/application/get-book-detail.test.ts +0 -102
  150. package/tests/unit/application/search-books.test.ts +0 -137
  151. 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.2...HEAD
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
- | 出版社 | ID |
66
- |--------|-----|
67
- | BOOK TECH | `book-tech` |
68
- | ボーンデジタル | `born-digital` |
69
- | コロナ社 | `coronasha` |
70
- | 技術評論社 | `gihyo` |
71
- | ラムダノート | `lambdanote` |
72
- | マナティ(マイナビ出版直販) | `manatee` |
73
- | 丸善出版 | `maruzen-publishing` |
74
- | オプトロニクス社 | `optronics` |
75
- | オライリー・ジャパン | `oreilly-japan` |
76
- | PEAKS | `peaks` |
77
- | パーソナルメディア | `personal-media` |
78
- | ラトルズ | `rutles` |
79
- | サイエンス社 | `saiensu` |
80
- | SEshop(翔泳社) | `seshop` |
81
- | 達人出版会 | `tatsu-zine` |
82
- | 技術書典オンラインマーケット | `techbookfest` |
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,4 @@
1
+ import type { PublisherAdapter } from "../../domain/publisher.js";
2
+ export declare function makeGoogleBooksAdapter(apiKey?: string): PublisherAdapter;
3
+ export declare const googleBooksAdapter: PublisherAdapter;
4
+ //# sourceMappingURL=google-books.d.ts.map
@@ -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,3 @@
1
+ import type { PublisherAdapter } from "../../domain/publisher.js";
2
+ export declare const jusePAdapter: PublisherAdapter;
3
+ //# sourceMappingURL=juse-p.d.ts.map
@@ -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;AAmBlE,eAAO,MAAM,kBAAkB,EAAE,SAAS,gBAAgB,EAkBzD,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"}