dongnelibrary 0.3.17 → 0.3.21

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 (99) hide show
  1. package/.claude/settings.json +30 -1
  2. package/.claude/settings.local.json +26 -1
  3. package/.playwright-cli/console-2026-05-15T13-42-50-460Z.log +1 -0
  4. package/.playwright-cli/console-2026-05-15T13-43-40-832Z.log +10 -0
  5. package/.playwright-cli/console-2026-05-18T12-47-04-141Z.log +14 -0
  6. package/.playwright-cli/page-2026-05-07T11-53-37-538Z.yml +836 -0
  7. package/.playwright-cli/page-2026-05-07T11-54-02-314Z.yml +658 -0
  8. package/.playwright-cli/page-2026-05-07T12-03-12-317Z.yml +310 -0
  9. package/.playwright-cli/page-2026-05-08T13-54-43-061Z.yml +276 -0
  10. package/.playwright-cli/page-2026-05-08T13-54-45-094Z.yml +276 -0
  11. package/.playwright-cli/page-2026-05-08T13-54-53-014Z.yml +201 -0
  12. package/.playwright-cli/page-2026-05-08T13-56-02-097Z.yml +726 -0
  13. package/.playwright-cli/page-2026-05-08T13-56-33-697Z.yml +226 -0
  14. package/.playwright-cli/page-2026-05-15T13-42-51-601Z.yml +47 -0
  15. package/.playwright-cli/page-2026-05-15T13-43-40-955Z.yml +47 -0
  16. package/.playwright-cli/page-2026-05-15T13-43-43-563Z.yml +47 -0
  17. package/.playwright-cli/page-2026-05-18T12-47-05-318Z.yml +135 -0
  18. package/README.md +59 -2
  19. package/dist/dongnelibrary.d.ts.map +1 -1
  20. package/dist/dongnelibrary.js +36 -0
  21. package/dist/dongnelibrary.js.map +1 -1
  22. package/dist/localLibraryModule/ansan.d.ts +6 -0
  23. package/dist/localLibraryModule/ansan.d.ts.map +1 -0
  24. package/dist/localLibraryModule/ansan.js +76 -0
  25. package/dist/localLibraryModule/ansan.js.map +1 -0
  26. package/dist/localLibraryModule/bcl.d.ts +6 -0
  27. package/dist/localLibraryModule/bcl.d.ts.map +1 -0
  28. package/dist/localLibraryModule/bcl.js +75 -0
  29. package/dist/localLibraryModule/bcl.js.map +1 -0
  30. package/dist/localLibraryModule/gangnam.d.ts +6 -0
  31. package/dist/localLibraryModule/gangnam.d.ts.map +1 -0
  32. package/dist/localLibraryModule/gangnam.js +100 -0
  33. package/dist/localLibraryModule/gangnam.js.map +1 -0
  34. package/dist/localLibraryModule/gangseo.d.ts +6 -0
  35. package/dist/localLibraryModule/gangseo.d.ts.map +1 -0
  36. package/dist/localLibraryModule/gangseo.js +90 -0
  37. package/dist/localLibraryModule/gangseo.js.map +1 -0
  38. package/dist/localLibraryModule/gbelib.d.ts +6 -0
  39. package/dist/localLibraryModule/gbelib.d.ts.map +1 -0
  40. package/dist/localLibraryModule/gbelib.js +122 -0
  41. package/dist/localLibraryModule/gbelib.js.map +1 -0
  42. package/dist/localLibraryModule/geoje.d.ts +6 -0
  43. package/dist/localLibraryModule/geoje.d.ts.map +1 -0
  44. package/dist/localLibraryModule/geoje.js +75 -0
  45. package/dist/localLibraryModule/geoje.js.map +1 -0
  46. package/dist/localLibraryModule/gimhae.d.ts +6 -0
  47. package/dist/localLibraryModule/gimhae.d.ts.map +1 -0
  48. package/dist/localLibraryModule/gimhae.js +81 -0
  49. package/dist/localLibraryModule/gimhae.js.map +1 -0
  50. package/dist/localLibraryModule/gunsan.d.ts +6 -0
  51. package/dist/localLibraryModule/gunsan.d.ts.map +1 -0
  52. package/dist/localLibraryModule/gunsan.js +89 -0
  53. package/dist/localLibraryModule/gunsan.js.map +1 -0
  54. package/dist/localLibraryModule/gwanak.d.ts +6 -0
  55. package/dist/localLibraryModule/gwanak.d.ts.map +1 -0
  56. package/dist/localLibraryModule/gwanak.js +103 -0
  57. package/dist/localLibraryModule/gwanak.js.map +1 -0
  58. package/dist/localLibraryModule/gwe.d.ts +6 -0
  59. package/dist/localLibraryModule/gwe.d.ts.map +1 -0
  60. package/dist/localLibraryModule/gwe.js +84 -0
  61. package/dist/localLibraryModule/gwe.js.map +1 -0
  62. package/dist/localLibraryModule/junggulib.d.ts +6 -0
  63. package/dist/localLibraryModule/junggulib.d.ts.map +1 -0
  64. package/dist/localLibraryModule/junggulib.js +96 -0
  65. package/dist/localLibraryModule/junggulib.js.map +1 -0
  66. package/dist/localLibraryModule/mokpolib.d.ts +6 -0
  67. package/dist/localLibraryModule/mokpolib.d.ts.map +1 -0
  68. package/dist/localLibraryModule/mokpolib.js +104 -0
  69. package/dist/localLibraryModule/mokpolib.js.map +1 -0
  70. package/dist/localLibraryModule/nowon.d.ts +6 -0
  71. package/dist/localLibraryModule/nowon.d.ts.map +1 -0
  72. package/dist/localLibraryModule/nowon.js +95 -0
  73. package/dist/localLibraryModule/nowon.js.map +1 -0
  74. package/dist/localLibraryModule/paju.d.ts +6 -0
  75. package/dist/localLibraryModule/paju.d.ts.map +1 -0
  76. package/dist/localLibraryModule/paju.js +94 -0
  77. package/dist/localLibraryModule/paju.js.map +1 -0
  78. package/dist/localLibraryModule/pohang.d.ts +6 -0
  79. package/dist/localLibraryModule/pohang.d.ts.map +1 -0
  80. package/dist/localLibraryModule/pohang.js +83 -0
  81. package/dist/localLibraryModule/pohang.js.map +1 -0
  82. package/dist/localLibraryModule/siheung.d.ts +6 -0
  83. package/dist/localLibraryModule/siheung.d.ts.map +1 -0
  84. package/dist/localLibraryModule/siheung.js +65 -0
  85. package/dist/localLibraryModule/siheung.js.map +1 -0
  86. package/dist/localLibraryModule/yangcheon.d.ts +6 -0
  87. package/dist/localLibraryModule/yangcheon.d.ts.map +1 -0
  88. package/dist/localLibraryModule/yangcheon.js +90 -0
  89. package/dist/localLibraryModule/yangcheon.js.map +1 -0
  90. package/dist/localLibraryModule/ydplib.d.ts +6 -0
  91. package/dist/localLibraryModule/ydplib.d.ts.map +1 -0
  92. package/dist/localLibraryModule/ydplib.js +101 -0
  93. package/dist/localLibraryModule/ydplib.js.map +1 -0
  94. package/docs/library-module-python-scripts.md +381 -0
  95. package/docs//355/206/265/355/225/251/353/217/204/354/204/234/302/240/353/204/244/355/212/270/354/233/214/355/201/254-/353/252/251/353/241/235.md +184 -0
  96. package/docs//355/206/265/355/225/251/353/217/204/354/204/234/352/264/200-/353/204/244/355/212/270/354/233/214/355/201/254-/353/252/251/353/241/235.md +19 -19
  97. package/package.json +44 -6
  98. package/scripts/analyze-html-library.sh +300 -0
  99. package/scripts/analyze-library.sh +261 -0
@@ -0,0 +1,83 @@
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://phlib.pohang.go.kr";
10
+ const SEARCH_URL = "https://phlib.pohang.go.kr/phlib/intro/search/index.do";
11
+ const DETAIL_BASE = "https://phlib.pohang.go.kr/phlib/intro/search/detail.do";
12
+ const libraryList = [
13
+ { code: "MD", name: "포은중앙도서관" },
14
+ { code: "MA", name: "대잠도서관" },
15
+ { code: "MB", name: "대잠어린이도서관" },
16
+ { code: "MC", name: "영암도서관" },
17
+ { code: "ME", name: "포은오천도서관" },
18
+ { code: "MF", name: "동해석곡도서관" },
19
+ { code: "MH", name: "연일도서관" },
20
+ { code: "MI", name: "구룡포도서관" },
21
+ { code: "MJ", name: "포은흥해도서관" },
22
+ { code: "PM", name: "어린이영어도서관" },
23
+ ];
24
+ const getLibraryCode = (0, util_1.createLibraryCodeLookup)(libraryList);
25
+ async function searchImpl(opt) {
26
+ const { title, libraryName, signal } = opt;
27
+ (0, util_1.validateSearchOptions)(opt);
28
+ const lcode = getLibraryCode(libraryName);
29
+ const { statusCode, body } = await (0, http_1.get)(SEARCH_URL, {
30
+ qs: {
31
+ menu_idx: 297,
32
+ search_type2: "TITLE",
33
+ LibraryCodes: lcode,
34
+ booktype: "BOOK",
35
+ search_text: title,
36
+ rowCount: 100,
37
+ },
38
+ signal,
39
+ });
40
+ if (statusCode !== 200) {
41
+ throw new Error(`HTTP ${statusCode}`);
42
+ }
43
+ const dom = new jsdom_1.JSDOM(body);
44
+ const document = dom.window.document;
45
+ const searchInfoEl = document.querySelector("div.search-info");
46
+ const infoText = searchInfoEl?.textContent ?? "";
47
+ const totalMatch = infoText.match(/총\s*([\d,]+)\s*건/);
48
+ const totalBookCount = totalMatch ? (0, util_1.extractNumber)(totalMatch[1]) : 0;
49
+ const booklist = [];
50
+ const rows = document.querySelectorAll("div#search-results div.imageType div.row");
51
+ rows.forEach((row) => {
52
+ const bif = row.querySelector("div.bif");
53
+ if (!bif)
54
+ return;
55
+ const titleLink = bif.querySelector("a.goDetail");
56
+ const bookTitle = titleLink?.textContent?.trim() ?? "";
57
+ if (!bookTitle)
58
+ return;
59
+ const isbn = titleLink?.getAttribute("isbn") ?? "";
60
+ const regNo = titleLink?.getAttribute("regNo") ?? "";
61
+ const manageCode = titleLink?.getAttribute("manageCode") ?? "";
62
+ const bookUrl = isbn && regNo
63
+ ? `${DETAIL_BASE}?regNo=${regNo}&isbn=${isbn}&manageCode=${manageCode}&booktype=BOOK&menu_idx=297`
64
+ : "";
65
+ const exist = (row.textContent ?? "").includes("대출가능");
66
+ const pEl = bif.querySelector("p");
67
+ const pText = pEl?.textContent ?? "";
68
+ const libMatch = pText.match(/소장도서관\s*:\s*([^\n\r|]+)/);
69
+ const libName = libMatch?.[1]?.trim() ?? libraryName;
70
+ booklist.push({ libraryName: libName, title: bookTitle, bookUrl, exist });
71
+ });
72
+ return {
73
+ startPage: opt.startPage,
74
+ totalBookCount,
75
+ booklist,
76
+ };
77
+ }
78
+ exports.search = (0, util_1.wrapWithCallback)(searchImpl);
79
+ function getLibraryNames() {
80
+ return (0, util_1.getLibraryNames)(libraryList);
81
+ }
82
+ ({ moduleName: exports.moduleName, homeUrl: exports.homeUrl, search: exports.search, getLibraryNames });
83
+ //# sourceMappingURL=pohang.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pohang.js","sourceRoot":"","sources":["../../src/localLibraryModule/pohang.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { SearchOptions, SearchResult } from "../types";
2
+ export declare const moduleName = "\uC2DC\uD765\uC2DC\uB3C4\uC11C\uAD00";
3
+ export declare const homeUrl = "https://lib.siheung.go.kr";
4
+ export declare const search: (opt: SearchOptions, callback?: import("../types").SearchCallback) => Promise<SearchResult | void>;
5
+ export declare function getLibraryNames(): string[];
6
+ //# sourceMappingURL=siheung.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"siheung.d.ts","sourceRoot":"","sources":["../../src/localLibraryModule/siheung.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAIV,aAAa,EACb,YAAY,EACb,MAAM,UAAU,CAAC;AAElB,eAAO,MAAM,UAAU,yCAAW,CAAC;AACnC,eAAO,MAAM,OAAO,8BAA8B,CAAC;AAqFnD,eAAO,MAAM,MAAM,oGAA+B,CAAC;AAEnD,wBAAgB,eAAe,IAAI,MAAM,EAAE,CAE1C"}
@@ -0,0 +1,65 @@
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 undici_1 = require("undici");
6
+ const util_1 = require("../util");
7
+ // lib.siheung.go.kr 서버 인증서 체인에 중간 CA가 누락되어 있음
8
+ const dispatcher = new undici_1.Agent({ connect: { rejectUnauthorized: false } });
9
+ exports.moduleName = "시흥시도서관";
10
+ exports.homeUrl = "https://lib.siheung.go.kr";
11
+ const libraryList = [
12
+ { code: "1", name: "중앙도서관" },
13
+ { code: "2", name: "대야도서관" },
14
+ { code: "3", name: "소래빛도서관" },
15
+ { code: "4", name: "월곶도서관" },
16
+ { code: "10", name: "정왕어린이도서관" },
17
+ { code: "11", name: "군자도서관" },
18
+ { code: "12", name: "능곡도서관" },
19
+ { code: "13", name: "신천도서관" },
20
+ { code: "14", name: "매화도서관" },
21
+ { code: "16", name: "장곡도서관" },
22
+ { code: "73", name: "목감도서관" },
23
+ { code: "75", name: "배곧도서관" },
24
+ { code: "81", name: "은계도서관" },
25
+ ];
26
+ const getLibraryCode = (0, util_1.createLibraryCodeLookup)(libraryList);
27
+ async function searchImpl(opt) {
28
+ const { title, libraryName, signal } = opt;
29
+ (0, util_1.validateSearchOptions)(opt);
30
+ const branch = getLibraryCode(libraryName);
31
+ const qs = new URLSearchParams({
32
+ all: `k|a|${title}`,
33
+ branch: String(branch),
34
+ max: "200",
35
+ });
36
+ const { statusCode, body: bodyStream } = await (0, undici_1.request)(`https://lib.siheung.go.kr/pyxis-api/1/collections/1/search?${qs}`, { dispatcher, signal: signal });
37
+ const body = await bodyStream.text();
38
+ if (statusCode !== 200) {
39
+ throw new Error(`HTTP ${statusCode}`);
40
+ }
41
+ const json = JSON.parse(body);
42
+ const data = json.data;
43
+ if (!data) {
44
+ return { startPage: opt.startPage, totalBookCount: 0, booklist: [] };
45
+ }
46
+ const booklist = data.list.map((book) => ({
47
+ title: book.titleStatement,
48
+ exist: book.branchVolumes.some((vol) => vol.cState.includes("대출가능")),
49
+ libraryName: book.branchVolumes.map((vol) => vol.name).join(","),
50
+ bookUrl: book.id
51
+ ? `https://lib.siheung.go.kr/#/search/detail/${book.id}`
52
+ : "",
53
+ }));
54
+ return {
55
+ startPage: opt.startPage,
56
+ totalBookCount: data.totalCount,
57
+ booklist,
58
+ };
59
+ }
60
+ exports.search = (0, util_1.wrapWithCallback)(searchImpl);
61
+ function getLibraryNames() {
62
+ return (0, util_1.getLibraryNames)(libraryList);
63
+ }
64
+ ({ moduleName: exports.moduleName, homeUrl: exports.homeUrl, search: exports.search, getLibraryNames });
65
+ //# sourceMappingURL=siheung.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"siheung.js","sourceRoot":"","sources":["../../src/localLibraryModule/siheung.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { SearchOptions, SearchResult } from "../types";
2
+ export declare const moduleName = "\uC591\uCC9C\uAD6C\uB3C4\uC11C\uAD00";
3
+ export declare const homeUrl = "https://lib.yangcheon.or.kr";
4
+ export declare const search: (opt: SearchOptions, callback?: import("../types").SearchCallback) => Promise<SearchResult | void>;
5
+ export declare function getLibraryNames(): string[];
6
+ //# sourceMappingURL=yangcheon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yangcheon.d.ts","sourceRoot":"","sources":["../../src/localLibraryModule/yangcheon.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAIV,aAAa,EACb,YAAY,EACb,MAAM,UAAU,CAAC;AAElB,eAAO,MAAM,UAAU,yCAAW,CAAC;AACnC,eAAO,MAAM,OAAO,gCAAgC,CAAC;AAiGrD,eAAO,MAAM,MAAM,oGAA+B,CAAC;AAEnD,wBAAgB,eAAe,IAAI,MAAM,EAAE,CAE1C"}
@@ -0,0 +1,90 @@
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://lib.yangcheon.or.kr";
10
+ const SEARCH_URL = `${exports.homeUrl}/main/site/search/bookSearch.do`;
11
+ // 페이지 크기 고정 (rows 파라미터와 무관하게 서버가 항상 10건 반환)
12
+ const PAGE_SIZE = 10;
13
+ const libraryList = [
14
+ { code: "MA", name: "갈산도서관" },
15
+ { code: "MB", name: "목마교육도서관" },
16
+ { code: "MC", name: "방아다리문학도서관" },
17
+ { code: "MD", name: "신월음악도서관" },
18
+ { code: "ME", name: "영어특성화도서관" },
19
+ { code: "MF", name: "해맞이역사도서관" },
20
+ { code: "MG", name: "개울건강도서관" },
21
+ { code: "SG", name: "미감도서관" },
22
+ { code: "MH", name: "양천중앙도서관" },
23
+ { code: "SA", name: "고운달작은도서관" },
24
+ { code: "SB", name: "고운맘작은도서관" },
25
+ { code: "SC", name: "신월3북카페(달빛마을책쉼터)" },
26
+ { code: "SD", name: "목3북카페" },
27
+ { code: "SF", name: "목2북카페" },
28
+ { code: "SH", name: "신정3북카페" },
29
+ { code: "SK", name: "그린나래미술도서관" },
30
+ { code: "SM", name: "모새미작은도서관" },
31
+ { code: "UA", name: "목1동 도서방" },
32
+ { code: "UB", name: "새아름 작은도서관" },
33
+ { code: "UD", name: "신정6동 도서방" },
34
+ { code: "UE", name: "신정7동 도서방" },
35
+ { code: "FA", name: "스마트도서관" },
36
+ ];
37
+ const getLibraryCode = (0, util_1.createLibraryCodeLookup)(libraryList);
38
+ async function searchImpl(opt) {
39
+ const { title, libraryName, startPage = 1, signal } = opt;
40
+ (0, util_1.validateSearchOptions)(opt);
41
+ const lcode = getLibraryCode(libraryName);
42
+ const { body } = await (0, http_1.get)(SEARCH_URL, {
43
+ qs: {
44
+ cmd_name: "bookandnonbooksearch",
45
+ manage_code: lcode,
46
+ search_key: "ALL",
47
+ search_txt: title,
48
+ rows: String(PAGE_SIZE),
49
+ page: String(startPage),
50
+ },
51
+ signal,
52
+ });
53
+ const totalMatch = body.match(/전체 ([\d,]+)<\/span>개가 검색되었습니다/);
54
+ const totalBookCount = totalMatch ? (0, util_1.extractNumber)(totalMatch[1]) : 0;
55
+ const { window: { document }, } = new jsdom_1.JSDOM(body);
56
+ const booklist = [];
57
+ const bookDivs = document.querySelectorAll("div.book_info");
58
+ for (const div of bookDivs) {
59
+ const bookTitle = div.dataset.ti?.trim() ?? "";
60
+ if (!bookTitle)
61
+ continue;
62
+ const mgc = div.dataset.mgc ?? lcode;
63
+ const speciesKey = div.dataset.rk ?? "";
64
+ // reckey는 species_key와 다르므로 첫 번째 anchor href에서 추출
65
+ const anchor = div.querySelector("p.tit > a");
66
+ const href = anchor?.getAttribute("href") ?? "";
67
+ let reckey = "";
68
+ if (href.includes("reckey=")) {
69
+ const qs = href.includes("?") ? href.split("?")[1] : href;
70
+ reckey = new URLSearchParams(qs).get("reckey") ?? "";
71
+ }
72
+ const bookUrl = speciesKey && reckey
73
+ ? `${SEARCH_URL}?manage_code=${mgc}&book_type=BOOK&book_type_org=&publish_form_code=MO&species_key=${speciesKey}&reckey=${reckey}`
74
+ : "";
75
+ const statusSpan = div.querySelector("p.book_status span");
76
+ const exist = statusSpan?.classList.contains("activity") ?? false;
77
+ booklist.push({ libraryName, title: bookTitle, bookUrl, exist });
78
+ }
79
+ return {
80
+ startPage,
81
+ totalBookCount,
82
+ booklist,
83
+ };
84
+ }
85
+ exports.search = (0, util_1.wrapWithCallback)(searchImpl);
86
+ function getLibraryNames() {
87
+ return (0, util_1.getLibraryNames)(libraryList);
88
+ }
89
+ ({ moduleName: exports.moduleName, homeUrl: exports.homeUrl, search: exports.search, getLibraryNames });
90
+ //# sourceMappingURL=yangcheon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yangcheon.js","sourceRoot":"","sources":["../../src/localLibraryModule/yangcheon.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { SearchOptions, SearchResult } from "../types";
2
+ export declare const moduleName = "\uC601\uB4F1\uD3EC\uAD6C\uB9BD\uB3C4\uC11C\uAD00";
3
+ export declare const homeUrl = "https://ydplib.or.kr";
4
+ export declare const search: (opt: SearchOptions, callback?: import("../types").SearchCallback) => Promise<SearchResult | void>;
5
+ export declare function getLibraryNames(): string[];
6
+ //# sourceMappingURL=ydplib.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ydplib.d.ts","sourceRoot":"","sources":["../../src/localLibraryModule/ydplib.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAIV,aAAa,EACb,YAAY,EACb,MAAM,UAAU,CAAC;AAElB,eAAO,MAAM,UAAU,qDAAa,CAAC;AACrC,eAAO,MAAM,OAAO,yBAAyB,CAAC;AA8G9C,eAAO,MAAM,MAAM,oGAA+B,CAAC;AAEnD,wBAAgB,eAAe,IAAI,MAAM,EAAE,CAE1C"}
@@ -0,0 +1,101 @@
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://ydplib.or.kr";
10
+ const SEARCH_URL = "https://ydplib.or.kr/intro/plusSearchResultList.do";
11
+ const DETAIL_URL = "https://ydplib.or.kr/intro/menu/10003/program/30001/plusSearchResultDetail.do";
12
+ const libraryList = [
13
+ { code: "CE", name: "신길도서관" },
14
+ { code: "CG", name: "여의도브라이튼도서관" },
15
+ { code: "CA", name: "대림도서관" },
16
+ { code: "CB", name: "문래도서관" },
17
+ { code: "CC", name: "선유도서관" },
18
+ { code: "MA", name: "여의샛강도서관" },
19
+ { code: "LX", name: "영등포생각공장도서관" },
20
+ { code: "LY", name: "원지공원도서관" },
21
+ { code: "LW", name: "밤동산작은도서관" },
22
+ { code: "CF", name: "조롱박작은도서관" },
23
+ { code: "LF", name: "당산1동 작은도서관" },
24
+ { code: "LG", name: "당산2동 작은도서관" },
25
+ { code: "LR", name: "대림1동 작은도서관" },
26
+ { code: "LS", name: "대림2동 작은도서관" },
27
+ { code: "LU", name: "목화마을 작은도서관" },
28
+ { code: "LL", name: "신길1동 작은도서관" },
29
+ { code: "LC", name: "청소년문화의집 작은도서관" },
30
+ { code: "LN", name: "신길4동 작은도서관" },
31
+ { code: "LO", name: "신길5동 작은도서관" },
32
+ { code: "LP", name: "신길6동 작은도서관" },
33
+ { code: "LQ", name: "신길7동 작은도서관" },
34
+ { code: "LJ", name: "양평1동 작은도서관" },
35
+ { code: "LK", name: "양평2동 작은도서관" },
36
+ { code: "LE", name: "여의동 작은도서관" },
37
+ { code: "LD", name: "영등포동 작은도서관" },
38
+ { code: "LB", name: "영등포본동 작은도서관" },
39
+ { code: "LV", name: "늘샘드리 작은도서관" },
40
+ { code: "CD", name: "영등포스마트도서관" },
41
+ ];
42
+ const getLibraryCode = (0, util_1.createLibraryCodeLookup)(libraryList);
43
+ async function searchImpl(opt) {
44
+ const { title, libraryName, signal } = opt;
45
+ (0, util_1.validateSearchOptions)(opt);
46
+ const lcode = getLibraryCode(libraryName);
47
+ const { statusCode, body } = await (0, http_1.get)(SEARCH_URL, {
48
+ qs: {
49
+ searchType: "SIMPLE",
50
+ searchCategory: "BOOK",
51
+ searchKey: "TITLE",
52
+ searchKeyword: title,
53
+ searchLibraryArr: lcode,
54
+ searchRecordCount: 50,
55
+ },
56
+ signal,
57
+ });
58
+ if (statusCode !== 200) {
59
+ throw new Error(`HTTP ${statusCode}`);
60
+ }
61
+ const dom = new jsdom_1.JSDOM(body);
62
+ const document = dom.window.document;
63
+ // Count is in p.rtitle > span.themeFC, e.g. "205건"
64
+ const countEl = document.querySelector("p.rtitle span.themeFC");
65
+ const count = (0, util_1.extractNumber)(countEl?.textContent);
66
+ const booklist = [];
67
+ const bookItems = document.querySelectorAll("ul.resultList > li");
68
+ bookItems.forEach((li) => {
69
+ const titleLink = li.querySelector("dl.bookDataWrap dt.tit a");
70
+ const bookTitle = (titleLink?.textContent?.trim() ?? "").replace(/^\d+\.\s*/, "");
71
+ let bookUrl = "";
72
+ const onclick = titleLink?.getAttribute("onclick") ?? "";
73
+ const urlMatch = onclick.match(/fnSearchResultDetail\((\d+),(\d+),'(\w+)'\)/);
74
+ if (urlMatch) {
75
+ const [, recKey, bookKey, publishFormCode] = urlMatch;
76
+ bookUrl = `${DETAIL_URL}?recKey=${recKey}&bookKey=${bookKey}&publishFormCode=${publishFormCode}`;
77
+ }
78
+ const stateEl = li.querySelector("div.bookStateBar p.txt b");
79
+ const exist = stateEl?.textContent?.includes("대출가능") ?? false;
80
+ let libName = "";
81
+ const siteSpan = li.querySelector("dd.site span");
82
+ const siteText = siteSpan?.textContent?.trim() ?? "";
83
+ if (siteText.startsWith("도서관:")) {
84
+ libName = siteText.replace("도서관:", "").trim();
85
+ }
86
+ if (bookTitle) {
87
+ booklist.push({ libraryName: libName, title: bookTitle, bookUrl, exist });
88
+ }
89
+ });
90
+ return {
91
+ startPage: opt.startPage,
92
+ totalBookCount: count,
93
+ booklist,
94
+ };
95
+ }
96
+ exports.search = (0, util_1.wrapWithCallback)(searchImpl);
97
+ function getLibraryNames() {
98
+ return (0, util_1.getLibraryNames)(libraryList);
99
+ }
100
+ ({ moduleName: exports.moduleName, homeUrl: exports.homeUrl, search: exports.search, getLibraryNames });
101
+ //# sourceMappingURL=ydplib.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ydplib.js","sourceRoot":"","sources":["../../src/localLibraryModule/ydplib.ts"],"names":[],"mappings":"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"}