dongnelibrary 0.3.8 → 0.3.10

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 (49) hide show
  1. package/.playwright-mcp/console-2026-03-07T15-37-14-935Z.log +3 -0
  2. package/.playwright-mcp/console-2026-03-07T16-05-56-891Z.log +1 -0
  3. package/.playwright-mcp/console-2026-03-07T16-21-56-709Z.log +1 -0
  4. package/.playwright-mcp/console-2026-03-07T16-24-32-498Z.log +1 -0
  5. package/API.md +61 -9
  6. package/README.md +9 -1
  7. package/dist/dongnelibrary.d.ts +31 -9
  8. package/dist/dongnelibrary.d.ts.map +1 -1
  9. package/dist/dongnelibrary.js +136 -21
  10. package/dist/dongnelibrary.js.map +1 -1
  11. package/dist/localLibraryModule/gg.d.ts +6 -0
  12. package/dist/localLibraryModule/gg.d.ts.map +1 -0
  13. package/dist/localLibraryModule/gg.js +96 -0
  14. package/dist/localLibraryModule/gg.js.map +1 -0
  15. package/dist/localLibraryModule/gunpo.d.ts +6 -0
  16. package/dist/localLibraryModule/gunpo.d.ts.map +1 -0
  17. package/dist/localLibraryModule/gunpo.js +81 -0
  18. package/dist/localLibraryModule/gunpo.js.map +1 -0
  19. package/dist/localLibraryModule/hscity.d.ts +6 -0
  20. package/dist/localLibraryModule/hscity.d.ts.map +1 -0
  21. package/dist/localLibraryModule/hscity.js +100 -0
  22. package/dist/localLibraryModule/hscity.js.map +1 -0
  23. package/dist/localLibraryModule/jeju.d.ts +6 -0
  24. package/dist/localLibraryModule/jeju.d.ts.map +1 -0
  25. package/dist/localLibraryModule/jeju.js +77 -0
  26. package/dist/localLibraryModule/jeju.js.map +1 -0
  27. package/dist/localLibraryModule/osan.d.ts +6 -0
  28. package/dist/localLibraryModule/osan.d.ts.map +1 -0
  29. package/dist/localLibraryModule/osan.js +102 -0
  30. package/dist/localLibraryModule/osan.js.map +1 -0
  31. package/dist/localLibraryModule/snlib.d.ts +6 -0
  32. package/dist/localLibraryModule/snlib.d.ts.map +1 -0
  33. package/dist/localLibraryModule/snlib.js +102 -0
  34. package/dist/localLibraryModule/snlib.js.map +1 -0
  35. package/dist/localLibraryModule/suwon.d.ts +6 -0
  36. package/dist/localLibraryModule/suwon.d.ts.map +1 -0
  37. package/dist/localLibraryModule/suwon.js +117 -0
  38. package/dist/localLibraryModule/suwon.js.map +1 -0
  39. package/dist/localLibraryModule/yjlib.d.ts +6 -0
  40. package/dist/localLibraryModule/yjlib.d.ts.map +1 -0
  41. package/dist/localLibraryModule/yjlib.js +109 -0
  42. package/dist/localLibraryModule/yjlib.js.map +1 -0
  43. package/dist/localLibraryModule/yongin.d.ts +6 -0
  44. package/dist/localLibraryModule/yongin.d.ts.map +1 -0
  45. package/dist/localLibraryModule/yongin.js +141 -0
  46. package/dist/localLibraryModule/yongin.js.map +1 -0
  47. package/dist/types.d.ts +23 -0
  48. package/dist/types.d.ts.map +1 -1
  49. package/package.json +1 -1
@@ -0,0 +1,6 @@
1
+ import type { SearchOptions, SearchResult } from "../types";
2
+ export declare const moduleName = "\uAD70\uD3EC\uC2DC\uB3C4\uC11C\uAD00";
3
+ export declare const homeUrl = "https://www.gunpolib.go.kr";
4
+ export declare const search: (opt: SearchOptions, callback?: import("../types").SearchCallback) => Promise<SearchResult | void>;
5
+ export declare function getLibraryNames(): string[];
6
+ //# sourceMappingURL=gunpo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gunpo.d.ts","sourceRoot":"","sources":["../../src/localLibraryModule/gunpo.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAIV,aAAa,EACb,YAAY,EACb,MAAM,UAAU,CAAC;AAElB,eAAO,MAAM,UAAU,yCAAW,CAAC;AACnC,eAAO,MAAM,OAAO,+BAA+B,CAAC;AAmGpD,eAAO,MAAM,MAAM,oGAA+B,CAAC;AAEnD,wBAAgB,eAAe,IAAI,MAAM,EAAE,CAE1C"}
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.search = exports.homeUrl = exports.moduleName = void 0;
7
+ exports.getLibraryNames = getLibraryNames;
8
+ const http_1 = require("../http");
9
+ const lodash_1 = __importDefault(require("lodash"));
10
+ const util_1 = require("../util");
11
+ exports.moduleName = "군포시도서관";
12
+ exports.homeUrl = "https://www.gunpolib.go.kr";
13
+ const libraryList = [
14
+ { code: "1", name: "산본도서관" },
15
+ { code: "2", name: "당동도서관" },
16
+ { code: "3", name: "대야도서관" },
17
+ { code: "4", name: "어린이도서관" },
18
+ { code: "5", name: "이동도서관" },
19
+ { code: "6", name: "군포중앙도서관" },
20
+ { code: "7", name: "누리천문대" },
21
+ { code: "8", name: "시청북카페밥상머리" },
22
+ { code: "9", name: "부곡도서관" },
23
+ { code: "10", name: "당정문화도서관" },
24
+ { code: "11", name: "동화나무어린이도서관" },
25
+ { code: "12", name: "금정작은도서관" },
26
+ { code: "13", name: "재궁꿈나무도서관" },
27
+ { code: "14", name: "궁내동작은도서관" },
28
+ { code: "15", name: "노루목작은도서관" },
29
+ { code: "16", name: "버드나무에부는바람작은도서관" },
30
+ { code: "17", name: "꿈쟁이도서관" },
31
+ { code: "18", name: "우리마을도서관" },
32
+ { code: "19", name: "북카페사랑아이엔지" },
33
+ { code: "20", name: "산본역도서관" },
34
+ { code: "21", name: "하늘정원작은도서관" },
35
+ { code: "22", name: "꿈이지" },
36
+ { code: "23", name: "꿈드림작은도서관" },
37
+ { code: "24", name: "여담작은도서관" },
38
+ ];
39
+ const getLibraryCode = (0, util_1.createLibraryCodeLookup)(libraryList);
40
+ function getBookList(json) {
41
+ return lodash_1.default.map(json.data ? json.data.list : [], function (book) {
42
+ return {
43
+ title: book.titleStatement,
44
+ exist: book.branchVolumes.some((vol) => vol.cState.includes("대출가능")),
45
+ libraryName: book.branchVolumes.map((vol) => vol.name).join(","),
46
+ bookUrl: book.id
47
+ ? `https://www.gunpolib.go.kr/#/search/detail/${book.id}`
48
+ : "",
49
+ };
50
+ });
51
+ }
52
+ /**
53
+ * Search for books in Gunpo City Libraries.
54
+ */
55
+ async function searchImpl(opt) {
56
+ const { title, libraryName, signal } = opt;
57
+ (0, util_1.validateSearchOptions)(opt);
58
+ const branch = getLibraryCode(libraryName);
59
+ const { statusCode, body } = await (0, http_1.get)("https://www.gunpolib.go.kr/pyxis-api/1/collections/1/search", {
60
+ qs: {
61
+ all: `k|a|${title}`,
62
+ branch,
63
+ max: 1000,
64
+ },
65
+ signal,
66
+ });
67
+ if (statusCode !== 200) {
68
+ throw new Error(`HTTP ${statusCode}`);
69
+ }
70
+ const booklist = getBookList(JSON.parse(body));
71
+ return {
72
+ totalBookCount: booklist.length,
73
+ booklist,
74
+ };
75
+ }
76
+ exports.search = (0, util_1.wrapWithCallback)(searchImpl);
77
+ function getLibraryNames() {
78
+ return (0, util_1.getLibraryNames)(libraryList);
79
+ }
80
+ ({ moduleName: exports.moduleName, homeUrl: exports.homeUrl, search: exports.search, getLibraryNames });
81
+ //# sourceMappingURL=gunpo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gunpo.js","sourceRoot":"","sources":["../../src/localLibraryModule/gunpo.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { SearchOptions, SearchResult } from "../types";
2
+ export declare const moduleName = "\uD654\uC131\uC2DC\uB9BD\uB3C4\uC11C\uAD00";
3
+ export declare const homeUrl = "https://hscitylib.or.kr";
4
+ export declare const search: (opt: SearchOptions, callback?: import("../types").SearchCallback) => Promise<SearchResult | void>;
5
+ export declare function getLibraryNames(): string[];
6
+ //# sourceMappingURL=hscity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hscity.d.ts","sourceRoot":"","sources":["../../src/localLibraryModule/hscity.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAIV,aAAa,EACb,YAAY,EACb,MAAM,UAAU,CAAC;AAElB,eAAO,MAAM,UAAU,+CAAY,CAAC;AACpC,eAAO,MAAM,OAAO,4BAA4B,CAAC;AAqGjD,eAAO,MAAM,MAAM,oGAA+B,CAAC;AAEnD,wBAAgB,eAAe,IAAI,MAAM,EAAE,CAE1C"}
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.search = exports.homeUrl = exports.moduleName = void 0;
4
+ exports.getLibraryNames = getLibraryNames;
5
+ const util_1 = require("../util");
6
+ const http_1 = require("../http");
7
+ const jsdom_1 = require("jsdom");
8
+ exports.moduleName = "화성시립도서관";
9
+ exports.homeUrl = "https://hscitylib.or.kr";
10
+ const libraryList = [
11
+ { code: "MA", name: "남양도서관" },
12
+ { code: "MB", name: "태안도서관" },
13
+ { code: "MC", name: "삼괴도서관" },
14
+ { code: "MD", name: "병점도서관" },
15
+ { code: "ME", name: "샘내도서관" },
16
+ { code: "MF", name: "두빛나래어린이도서관" },
17
+ { code: "MG", name: "봉담도서관" },
18
+ { code: "MH", name: "둥지나래어린이도서관" },
19
+ { code: "MI", name: "목동이음터도서관" },
20
+ { code: "MJ", name: "기아행복마루도서관" },
21
+ { code: "MK", name: "화성동탄중앙도서관" },
22
+ { code: "ML", name: "송산도서관" },
23
+ { code: "MM", name: "정남도서관" },
24
+ { code: "MN", name: "비봉도서관" },
25
+ { code: "MO", name: "진안도서관" },
26
+ { code: "MP", name: "중앙이음터도서관" },
27
+ { code: "MQ", name: "양감도서관" },
28
+ { code: "MR", name: "다원이음터도서관" },
29
+ { code: "MS", name: "송린이음터도서관" },
30
+ { code: "MT", name: "팔탄도서관" },
31
+ { code: "MU", name: "마도도서관" },
32
+ { code: "MV", name: "봉담커피앤북도서관" },
33
+ { code: "MW", name: "왕배푸른숲도서관" },
34
+ { code: "MX", name: "노을빛도서관" },
35
+ { code: "MY", name: "서연이음터도서관" },
36
+ { code: "MZ", name: "호연이음터도서관" },
37
+ { code: "NA", name: "향남복합문화센터도서관" },
38
+ { code: "NB", name: "봉담와우도서관" },
39
+ { code: "TA", name: "늘봄이음터도서관" },
40
+ { code: "TB", name: "달빛나래어린이도서관" },
41
+ ];
42
+ const getLibraryCode = (0, util_1.createLibraryCodeLookup)(libraryList);
43
+ /**
44
+ * Search for books in Hwaseong City Libraries.
45
+ */
46
+ async function searchImpl(opt) {
47
+ const { title, libraryName, signal } = opt;
48
+ (0, util_1.validateSearchOptions)(opt);
49
+ const lcode = getLibraryCode(libraryName);
50
+ const url = `https://hscitylib.or.kr/intro/menu/10008/program/30001/searchResultList.do`;
51
+ const { statusCode, body } = await (0, http_1.post)(url, {
52
+ form: {
53
+ searchType: "SIMPLE",
54
+ searchKeyword: title,
55
+ searchManageCodeArr: lcode,
56
+ searchDisplay: 1000,
57
+ },
58
+ signal,
59
+ });
60
+ if (statusCode !== 200) {
61
+ throw new Error(`HTTP ${statusCode}`);
62
+ }
63
+ const dom = new jsdom_1.JSDOM(body);
64
+ const document = dom.window.document;
65
+ const countText = document.querySelector("#totalCnt")?.textContent ?? "";
66
+ const count = (0, util_1.extractNumber)(countText);
67
+ const booklist = [];
68
+ const bookItems = document.querySelectorAll(".bookArea");
69
+ bookItems.forEach((item) => {
70
+ const titleElement = item.querySelector("p.book_name.kor.on > a");
71
+ const bookTitle = titleElement?.getAttribute("title") ?? "";
72
+ const onclick = titleElement?.getAttribute("onclick") ?? "";
73
+ const match = onclick.match(/fnDetail\('(\d+)',\s*'(\d+)',\s*'([^']*)',\s*'(\w+)'\)/);
74
+ let bookUrl = "";
75
+ if (match) {
76
+ const [, bookKey, speciesKey, isbn, pubFormCode] = match;
77
+ bookUrl = `https://hscitylib.or.kr/intro/menu/10008/program/30001/searchResultDetail.do?bookKey=${bookKey}&speciesKey=${speciesKey}&isbn=${isbn}&pubFormCode=${pubFormCode}`;
78
+ }
79
+ const availability = item.querySelector("span.emp8")?.textContent?.trim() ?? "";
80
+ const libName = item.querySelector("b.themeFC")?.textContent?.trim() ?? "";
81
+ booklist.push({
82
+ libraryName: libName.replace(/[\[\]]/g, ""),
83
+ title: bookTitle,
84
+ bookUrl,
85
+ maxoffset: count,
86
+ exist: availability.includes("대출가능"),
87
+ });
88
+ });
89
+ return {
90
+ startPage: opt.startPage,
91
+ totalBookCount: count,
92
+ booklist,
93
+ };
94
+ }
95
+ exports.search = (0, util_1.wrapWithCallback)(searchImpl);
96
+ function getLibraryNames() {
97
+ return (0, util_1.getLibraryNames)(libraryList);
98
+ }
99
+ ({ moduleName: exports.moduleName, homeUrl: exports.homeUrl, search: exports.search, getLibraryNames });
100
+ //# sourceMappingURL=hscity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hscity.js","sourceRoot":"","sources":["../../src/localLibraryModule/hscity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { SearchOptions, SearchResult } from "../types";
2
+ export declare const moduleName = "\uC81C\uC8FC\uC2DC\uB3C4\uC11C\uAD00";
3
+ export declare const homeUrl = "https://www.jeju.go.kr/";
4
+ export declare const search: (opt: SearchOptions, callback?: import("../types").SearchCallback) => Promise<SearchResult | void>;
5
+ export declare function getLibraryNames(): string[];
6
+ //# sourceMappingURL=jeju.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jeju.d.ts","sourceRoot":"","sources":["../../src/localLibraryModule/jeju.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAIV,aAAa,EACb,YAAY,EACb,MAAM,UAAU,CAAC;AAElB,eAAO,MAAM,UAAU,yCAAW,CAAC;AACnC,eAAO,MAAM,OAAO,4BAA4B,CAAC;AA8GjD,eAAO,MAAM,MAAM,oGAA+B,CAAC;AAEnD,wBAAgB,eAAe,IAAI,MAAM,EAAE,CAE1C"}
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.search = exports.homeUrl = exports.moduleName = void 0;
4
+ exports.getLibraryNames = getLibraryNames;
5
+ const util_1 = require("../util");
6
+ const http_1 = require("../http");
7
+ exports.moduleName = "제주시도서관";
8
+ exports.homeUrl = "https://www.jeju.go.kr/";
9
+ const libraryList = [
10
+ { code: "MJ", name: "한라도서관" },
11
+ { code: "MK", name: "우당도서관" },
12
+ { code: "ML", name: "탐라도서관" },
13
+ { code: "MM", name: "제주시기적의도서관" },
14
+ { code: "MP", name: "애월도서관" },
15
+ { code: "MN", name: "조천읍도서관" },
16
+ { code: "MQ", name: "한경도서관" },
17
+ { code: "MA", name: "삼매봉도서관" },
18
+ { code: "MB", name: "중앙도서관" },
19
+ { code: "MC", name: "동부도서관" },
20
+ { code: "MD", name: "서부도서관" },
21
+ { code: "ME", name: "서귀포기적의도서관" },
22
+ { code: "MH", name: "성산일출도서관" },
23
+ { code: "MF", name: "안덕산방도서관" },
24
+ { code: "MG", name: "표선도서관" },
25
+ { code: "XY", name: "꿈바당어린이도서관" },
26
+ ];
27
+ const getLibraryCode = (0, util_1.createLibraryCodeLookup)(libraryList);
28
+ async function fetchRentStat(recKey, signal) {
29
+ try {
30
+ const { statusCode, body } = await (0, http_1.get)("https://www.jeju.go.kr/tool/lib/rent-stat.jsp", { qs: { key: recKey }, signal });
31
+ if (statusCode !== 200)
32
+ return false;
33
+ const stat = JSON.parse(body);
34
+ return stat.total - stat.rent > 0;
35
+ }
36
+ catch {
37
+ return false;
38
+ }
39
+ }
40
+ async function searchImpl(opt) {
41
+ const { title, libraryName, signal } = opt;
42
+ (0, util_1.validateSearchOptions)(opt);
43
+ const lcode = getLibraryCode(libraryName);
44
+ const qs = { q: title };
45
+ if (lcode) {
46
+ qs.lib = lcode;
47
+ }
48
+ const { statusCode, body } = await (0, http_1.get)("https://www.jeju.go.kr/tool/lib/search.jsp", { qs, signal });
49
+ if (statusCode !== 200) {
50
+ throw new Error(`HTTP ${statusCode}`);
51
+ }
52
+ const json = JSON.parse(body);
53
+ if (json.error) {
54
+ throw new Error("Search API returned an error");
55
+ }
56
+ const books = json.books ?? [];
57
+ const booklist = await Promise.all(books.map(async (book) => {
58
+ const exist = await fetchRentStat(book.recKey, signal);
59
+ return {
60
+ title: book.title,
61
+ exist,
62
+ libraryName: libraryList.find((l) => l.code === book.manageCode)?.name ?? libraryName,
63
+ bookUrl: `https://www.jeju.go.kr/lib/service/search/simple.htm?q=${encodeURIComponent(title)}`,
64
+ };
65
+ }));
66
+ return {
67
+ startPage: opt.startPage,
68
+ totalBookCount: books.length,
69
+ booklist,
70
+ };
71
+ }
72
+ exports.search = (0, util_1.wrapWithCallback)(searchImpl);
73
+ function getLibraryNames() {
74
+ return (0, util_1.getLibraryNames)(libraryList);
75
+ }
76
+ ({ moduleName: exports.moduleName, homeUrl: exports.homeUrl, search: exports.search, getLibraryNames });
77
+ //# sourceMappingURL=jeju.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jeju.js","sourceRoot":"","sources":["../../src/localLibraryModule/jeju.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { SearchOptions, SearchResult } from "../types";
2
+ export declare const moduleName = "\uC624\uC0B0\uC2DC\uB3C4\uC11C\uAD00";
3
+ export declare const homeUrl = "https://www.osanlibrary.go.kr";
4
+ export declare const search: (opt: SearchOptions, callback?: import("../types").SearchCallback) => Promise<SearchResult | void>;
5
+ export declare function getLibraryNames(): string[];
6
+ //# sourceMappingURL=osan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"osan.d.ts","sourceRoot":"","sources":["../../src/localLibraryModule/osan.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAIV,aAAa,EACb,YAAY,EACb,MAAM,UAAU,CAAC;AAElB,eAAO,MAAM,UAAU,yCAAW,CAAC;AACnC,eAAO,MAAM,OAAO,kCAAkC,CAAC;AA6GvD,eAAO,MAAM,MAAM,oGAA+B,CAAC;AAEnD,wBAAgB,eAAe,IAAI,MAAM,EAAE,CAE1C"}
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.search = exports.homeUrl = exports.moduleName = void 0;
4
+ exports.getLibraryNames = getLibraryNames;
5
+ const util_1 = require("../util");
6
+ const http_1 = require("../http");
7
+ const jsdom_1 = require("jsdom");
8
+ exports.moduleName = "오산시도서관";
9
+ exports.homeUrl = "https://www.osanlibrary.go.kr";
10
+ const libraryList = [
11
+ { code: "MA", name: "오산중앙도서관" },
12
+ { code: "MG", name: "꿈두레도서관" },
13
+ { code: "ME", name: "초평도서관" },
14
+ { code: "MC", name: "햇살마루도서관" },
15
+ { code: "MB", name: "청학도서관" },
16
+ { code: "MD", name: "양산도서관" },
17
+ { code: "MI", name: "소리울도서관" },
18
+ { code: "MY", name: "무지개도서관" },
19
+ { code: "MH", name: "고현초꿈키움도서관" },
20
+ { code: "MJ", name: "쌍용예가시민개방도서관" },
21
+ ];
22
+ const getLibraryCode = (0, util_1.createLibraryCodeLookup)(libraryList);
23
+ /**
24
+ * Search for books in Osan City Libraries.
25
+ */
26
+ async function searchImpl(opt) {
27
+ const { title, libraryName, signal } = opt;
28
+ (0, util_1.validateSearchOptions)(opt);
29
+ const lcode = getLibraryCode(libraryName);
30
+ const { statusCode, body } = await (0, http_1.get)(`https://www.osanlibrary.go.kr/intro/program/plusSearchResultList.do`, {
31
+ qs: {
32
+ searchType: "SIMPLE",
33
+ searchCategory: "ALL",
34
+ searchLibraryArr: lcode,
35
+ searchKey: "ALL",
36
+ searchKeyword: title,
37
+ searchRecordCount: 1000,
38
+ },
39
+ signal,
40
+ });
41
+ if (statusCode !== 200) {
42
+ throw new Error(`HTTP ${statusCode}`);
43
+ }
44
+ const dom = new jsdom_1.JSDOM(body);
45
+ const document = dom.window.document;
46
+ // Extract total count from "총 <span class="highlight">44</span>건"
47
+ const highlightSpan = document.querySelector("span.highlight");
48
+ const count = (0, util_1.extractNumber)(highlightSpan?.textContent);
49
+ const booklist = [];
50
+ const bookItems = document.querySelectorAll(".bookList .listWrap > li");
51
+ bookItems.forEach((li) => {
52
+ // Get title and book URL from .book_name link
53
+ const titleLink = li.querySelector(".book_name");
54
+ const titleEl = titleLink ? titleLink.querySelector("span") : null;
55
+ const bookTitle = titleEl ? (titleEl.textContent?.trim() ?? "") : "";
56
+ // Extract book URL from onclick handler
57
+ let bookUrl = "";
58
+ const onclick = titleLink ? titleLink.getAttribute("onclick") || "" : "";
59
+ const urlMatch = onclick.match(/fnSearchResultDetail\((\d+),(\d+),'(\w+)'\)/);
60
+ if (urlMatch) {
61
+ const [, recKey, bookKey, publishFormCode] = urlMatch;
62
+ bookUrl = `https://www.osanlibrary.go.kr/intro/menu/10003/program/30004/plusSearchResultDetail.do?recKey=${recKey}&bookKey=${bookKey}&publishFormCode=${publishFormCode}`;
63
+ }
64
+ // Get availability status from .status p
65
+ const statusEl = li.querySelector(".status p");
66
+ const statusText = statusEl ? (statusEl.textContent?.trim() ?? "") : "";
67
+ const exist = statusText.includes("대출가능");
68
+ // Get library name from ".book_info .fb p" containing "소장도서관"
69
+ let libName = "";
70
+ const fbParagraphs = li.querySelectorAll(".book_info .fb p");
71
+ fbParagraphs.forEach((p) => {
72
+ const text = p.textContent;
73
+ if (text?.includes("소장도서관")) {
74
+ // Format: "[공공]오산시중앙도서관" - extract library name after "]"
75
+ const match = text.match(/\](.+)$/);
76
+ if (match) {
77
+ libName = match[1].trim();
78
+ }
79
+ }
80
+ });
81
+ if (bookTitle) {
82
+ booklist.push({
83
+ libraryName: libName,
84
+ title: bookTitle,
85
+ bookUrl,
86
+ maxoffset: count,
87
+ exist: exist,
88
+ });
89
+ }
90
+ });
91
+ return {
92
+ startPage: opt.startPage,
93
+ totalBookCount: count,
94
+ booklist,
95
+ };
96
+ }
97
+ exports.search = (0, util_1.wrapWithCallback)(searchImpl);
98
+ function getLibraryNames() {
99
+ return (0, util_1.getLibraryNames)(libraryList);
100
+ }
101
+ ({ moduleName: exports.moduleName, homeUrl: exports.homeUrl, search: exports.search, getLibraryNames });
102
+ //# sourceMappingURL=osan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"osan.js","sourceRoot":"","sources":["../../src/localLibraryModule/osan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { SearchOptions, SearchResult } from "../types";
2
+ export declare const moduleName = "\uC131\uB0A8\uC2DC\uB3C4\uC11C\uAD00";
3
+ export declare const homeUrl = "https://www.snlib.go.kr";
4
+ export declare const search: (opt: SearchOptions, callback?: import("../types").SearchCallback) => Promise<SearchResult | void>;
5
+ export declare function getLibraryNames(): string[];
6
+ //# sourceMappingURL=snlib.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snlib.d.ts","sourceRoot":"","sources":["../../src/localLibraryModule/snlib.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAIV,aAAa,EACb,YAAY,EACb,MAAM,UAAU,CAAC;AAElB,eAAO,MAAM,UAAU,yCAAW,CAAC;AACnC,eAAO,MAAM,OAAO,4BAA4B,CAAC;AA4GjD,eAAO,MAAM,MAAM,oGAA+B,CAAC;AAEnD,wBAAgB,eAAe,IAAI,MAAM,EAAE,CAE1C"}
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.search = exports.homeUrl = exports.moduleName = void 0;
4
+ exports.getLibraryNames = getLibraryNames;
5
+ const util_1 = require("../util");
6
+ const http_1 = require("../http");
7
+ const jsdom_1 = require("jsdom");
8
+ exports.moduleName = "성남시도서관";
9
+ exports.homeUrl = "https://www.snlib.go.kr";
10
+ const libraryList = [
11
+ { code: "BF", name: "논골도서관" },
12
+ { code: "CK", name: "중원어린이도서관" },
13
+ { code: "MA", name: "성남중앙도서관" },
14
+ { code: "MB", name: "분당도서관" },
15
+ { code: "MD", name: "고등도서관" },
16
+ { code: "MG", name: "구미도서관" },
17
+ { code: "MH", name: "해오름도서관" },
18
+ { code: "MJ", name: "중원도서관" },
19
+ { code: "MM", name: "무지개도서관" },
20
+ { code: "MO", name: "수내도서관" },
21
+ { code: "MP", name: "판교도서관" },
22
+ { code: "MR", name: "위례도서관" },
23
+ { code: "MS", name: "수정도서관" },
24
+ { code: "MT", name: "책테마파크도서관" },
25
+ { code: "MU", name: "운중도서관" },
26
+ { code: "MV", name: "서현도서관" },
27
+ { code: "MW", name: "복정도서관" },
28
+ { code: "PK", name: "판교어린이도서관" },
29
+ ];
30
+ const getLibraryCode = (0, util_1.createLibraryCodeLookup)(libraryList);
31
+ /**
32
+ * Search for books in Seongnam City Libraries.
33
+ */
34
+ async function searchImpl(opt) {
35
+ const { title, libraryName, signal } = opt;
36
+ (0, util_1.validateSearchOptions)(opt);
37
+ const lcode = getLibraryCode(libraryName);
38
+ const { statusCode, body } = await (0, http_1.get)("https://www.snlib.go.kr/intro/menu/10041/program/30009/plusSearchResultList.do", {
39
+ qs: {
40
+ currentPageNo: 1,
41
+ searchBookClass: "ALL",
42
+ searchCategory: "BOOK",
43
+ searchKey: "ALL",
44
+ searchKeyword: title,
45
+ searchLibraryArr: lcode,
46
+ searchOrder: "DESC",
47
+ searchRecordCount: 1000,
48
+ searchSort: "SIMILAR",
49
+ searchType: "SIMPLE",
50
+ },
51
+ signal,
52
+ });
53
+ if (statusCode !== 200) {
54
+ throw new Error(`HTTP ${statusCode}`);
55
+ }
56
+ const dom = new jsdom_1.JSDOM(body);
57
+ const document = dom.window.document;
58
+ const countText = document.querySelector("strong.themeFC")?.textContent ?? "";
59
+ const count = (0, util_1.extractNumber)(countText);
60
+ const booklist = [];
61
+ if (count) {
62
+ const bookItems = document.querySelectorAll(".resultList > li");
63
+ bookItems.forEach((item) => {
64
+ const titleElement = item.querySelector(".tit a");
65
+ const bookTitle = titleElement?.textContent?.trim() ?? "";
66
+ const onclick = titleElement?.getAttribute("onclick") ?? "";
67
+ const match = onclick.match(/fnSearchResultDetail\((\d+),(\d+),'(\w+)'\)/);
68
+ let bookUrl = "";
69
+ if (match) {
70
+ const [, recKey, bookKey, publishFormCode] = match;
71
+ bookUrl = `https://www.snlib.go.kr/intro/menu/10041/program/30009/plusSearchResultDetail.do?recKey=${recKey}&bookKey=${bookKey}&publishFormCode=${publishFormCode}`;
72
+ }
73
+ const availability = item.querySelector(".bookStateBar .txt b")?.textContent ?? "";
74
+ // Format: "소장처:도서관이름" - split by colon to extract library name
75
+ const siteText = item.querySelector(".site > span:first-child")?.textContent ?? "";
76
+ const libraryNameParts = siteText.split(":");
77
+ const libName = libraryNameParts && libraryNameParts[1]
78
+ ? libraryNameParts[1].trim()
79
+ : "";
80
+ if (bookTitle) {
81
+ booklist.push({
82
+ libraryName: libName,
83
+ title: bookTitle,
84
+ bookUrl,
85
+ maxoffset: count,
86
+ exist: availability.includes("대출가능"),
87
+ });
88
+ }
89
+ });
90
+ }
91
+ return {
92
+ startPage: opt.startPage,
93
+ totalBookCount: count,
94
+ booklist,
95
+ };
96
+ }
97
+ exports.search = (0, util_1.wrapWithCallback)(searchImpl);
98
+ function getLibraryNames() {
99
+ return (0, util_1.getLibraryNames)(libraryList);
100
+ }
101
+ ({ moduleName: exports.moduleName, homeUrl: exports.homeUrl, search: exports.search, getLibraryNames });
102
+ //# sourceMappingURL=snlib.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snlib.js","sourceRoot":"","sources":["../../src/localLibraryModule/snlib.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { SearchOptions, SearchResult } from "../types";
2
+ export declare const moduleName = "\uC218\uC6D0\uC2DC\uB3C4\uC11C\uAD00";
3
+ export declare const homeUrl = "https://www.suwonlib.go.kr";
4
+ export declare const search: (opt: SearchOptions, callback?: import("../types").SearchCallback) => Promise<SearchResult | void>;
5
+ export declare function getLibraryNames(): string[];
6
+ //# sourceMappingURL=suwon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suwon.d.ts","sourceRoot":"","sources":["../../src/localLibraryModule/suwon.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAIV,aAAa,EACb,YAAY,EACb,MAAM,UAAU,CAAC;AAElB,eAAO,MAAM,UAAU,yCAAW,CAAC;AACnC,eAAO,MAAM,OAAO,+BAA+B,CAAC;AA0IpD,eAAO,MAAM,MAAM,oGAA+B,CAAC;AAEnD,wBAAgB,eAAe,IAAI,MAAM,EAAE,CAE1C"}