dongnelibrary 0.3.6 → 0.3.9
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/API.md +8 -8
- package/README.md +14 -1
- package/dist/cli.js +16 -6
- package/dist/cli.js.map +1 -1
- package/dist/dongnelibrary.d.ts +3 -10
- package/dist/dongnelibrary.d.ts.map +1 -1
- package/dist/dongnelibrary.js +41 -63
- package/dist/dongnelibrary.js.map +1 -1
- package/dist/localLibraryModule/gg.d.ts +6 -0
- package/dist/localLibraryModule/gg.d.ts.map +1 -0
- package/dist/localLibraryModule/gg.js +96 -0
- package/dist/localLibraryModule/gg.js.map +1 -0
- package/dist/localLibraryModule/gunpo.d.ts +6 -0
- package/dist/localLibraryModule/gunpo.d.ts.map +1 -0
- package/dist/localLibraryModule/gunpo.js +81 -0
- package/dist/localLibraryModule/gunpo.js.map +1 -0
- package/dist/localLibraryModule/hscity.d.ts +6 -0
- package/dist/localLibraryModule/hscity.d.ts.map +1 -0
- package/dist/localLibraryModule/hscity.js +100 -0
- package/dist/localLibraryModule/hscity.js.map +1 -0
- package/dist/localLibraryModule/osan.d.ts +6 -0
- package/dist/localLibraryModule/osan.d.ts.map +1 -0
- package/dist/localLibraryModule/osan.js +102 -0
- package/dist/localLibraryModule/osan.js.map +1 -0
- package/dist/localLibraryModule/snlib.d.ts +6 -0
- package/dist/localLibraryModule/snlib.d.ts.map +1 -0
- package/dist/localLibraryModule/snlib.js +102 -0
- package/dist/localLibraryModule/snlib.js.map +1 -0
- package/dist/localLibraryModule/suwon.d.ts +6 -0
- package/dist/localLibraryModule/suwon.d.ts.map +1 -0
- package/dist/localLibraryModule/suwon.js +117 -0
- package/dist/localLibraryModule/suwon.js.map +1 -0
- package/dist/localLibraryModule/yjlib.d.ts +6 -0
- package/dist/localLibraryModule/yjlib.d.ts.map +1 -0
- package/dist/localLibraryModule/yjlib.js +109 -0
- package/dist/localLibraryModule/yjlib.js.map +1 -0
- package/dist/localLibraryModule/yongin.d.ts +6 -0
- package/dist/localLibraryModule/yongin.d.ts.map +1 -0
- package/dist/localLibraryModule/yongin.js +141 -0
- package/dist/localLibraryModule/yongin.js.map +1 -0
- package/dist/types.d.ts +23 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +2 -1
- package/Dockerfile +0 -22
|
@@ -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 = "\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"}
|
|
@@ -0,0 +1,117 @@
|
|
|
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.suwonlib.go.kr";
|
|
9
|
+
const libraryList = [
|
|
10
|
+
{ code: "141025", name: "선경도서관" },
|
|
11
|
+
{ code: "141024", name: "수원중앙도서관" },
|
|
12
|
+
{ code: "141549", name: "창룡도서관" },
|
|
13
|
+
{ code: "141572", name: "화서다산도서관" },
|
|
14
|
+
{ code: "141552", name: "호매실도서관" },
|
|
15
|
+
{ code: "141093", name: "서수원도서관" },
|
|
16
|
+
{ code: "141542", name: "한림도서관" },
|
|
17
|
+
{ code: "141550", name: "버드내도서관" },
|
|
18
|
+
{ code: "141092", name: "북수원도서관" },
|
|
19
|
+
{ code: "141537", name: "대추골도서관" },
|
|
20
|
+
{ code: "141557", name: "일월도서관" },
|
|
21
|
+
{ code: "141551", name: "광교홍재도서관" },
|
|
22
|
+
{ code: "141301", name: "태장마루도서관" },
|
|
23
|
+
{ code: "141595", name: "광교푸른숲도서관" },
|
|
24
|
+
{ code: "141596", name: "매여울도서관" },
|
|
25
|
+
{ code: "141612", name: "망포글빛도서관" },
|
|
26
|
+
{ code: "141085", name: "슬기샘도서관" },
|
|
27
|
+
{ code: "141086", name: "지혜샘어린이도서관" },
|
|
28
|
+
{ code: "141087", name: "바른샘어린이도서관" },
|
|
29
|
+
{ code: "141064", name: "한아름도서관" },
|
|
30
|
+
{ code: "141138", name: "반달어린이도서관" },
|
|
31
|
+
{ code: "341147", name: "사랑샘도서관" },
|
|
32
|
+
{ code: "141107", name: "희망샘도서관" },
|
|
33
|
+
];
|
|
34
|
+
const getLibraryCode = (0, util_1.createLibraryCodeLookup)(libraryList);
|
|
35
|
+
function stripHtml(str) {
|
|
36
|
+
return str ? str.replace(/<[^>]*>/g, "") : "";
|
|
37
|
+
}
|
|
38
|
+
function getBookList(data) {
|
|
39
|
+
if (!data.SEARCH_RESULT || !data.SEARCH_RESULT.SEARCH_LIST) {
|
|
40
|
+
return [];
|
|
41
|
+
}
|
|
42
|
+
return data.SEARCH_RESULT.SEARCH_LIST.map(function (book) {
|
|
43
|
+
let bookUrl = "";
|
|
44
|
+
if (book.MANAGE_CODE && book.ISBN && book.BOOK_KEY) {
|
|
45
|
+
bookUrl = `https://search.suwonlib.go.kr/detail/${book.MANAGE_CODE}/${book.ISBN}/${book.BOOK_KEY}`;
|
|
46
|
+
}
|
|
47
|
+
return {
|
|
48
|
+
title: stripHtml(book.TITLE_INFO || ""),
|
|
49
|
+
exist: book.LOAN_CODE === "OK",
|
|
50
|
+
libraryName: book.LIB_NAME || "",
|
|
51
|
+
bookUrl,
|
|
52
|
+
};
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Search for books in Suwon City Libraries.
|
|
57
|
+
*/
|
|
58
|
+
async function searchImpl(opt) {
|
|
59
|
+
const { title, libraryName, signal } = opt;
|
|
60
|
+
(0, util_1.validateSearchOptions)(opt);
|
|
61
|
+
const lcode = getLibraryCode(libraryName);
|
|
62
|
+
// Create a session to maintain cookies
|
|
63
|
+
const session = (0, http_1.createSession)();
|
|
64
|
+
// First, visit the search page to initialize session
|
|
65
|
+
await session.get("https://search.suwonlib.go.kr/search", { signal });
|
|
66
|
+
// Now make the API call with the session cookies
|
|
67
|
+
const { statusCode, body } = await session.post("https://search.suwonlib.go.kr/getSearchResult/normal", {
|
|
68
|
+
form: {
|
|
69
|
+
searchTxt: title,
|
|
70
|
+
kCid: "",
|
|
71
|
+
kdcValue: "",
|
|
72
|
+
searchKind: "book",
|
|
73
|
+
manageCode: lcode,
|
|
74
|
+
isInnerSearch: "F",
|
|
75
|
+
innerSearchTxt: "",
|
|
76
|
+
keywordSearch: false,
|
|
77
|
+
displayNo: "1000",
|
|
78
|
+
orderbyItem: "ACCURACY_SORT",
|
|
79
|
+
orderby: "DESC",
|
|
80
|
+
pageNo: "1",
|
|
81
|
+
facetLib: "",
|
|
82
|
+
facetLibName: "",
|
|
83
|
+
facetAuthor: "",
|
|
84
|
+
facetPublisher: "",
|
|
85
|
+
facetPubYear: "",
|
|
86
|
+
facetSubject: "",
|
|
87
|
+
facetSubjectName: "",
|
|
88
|
+
facetMedia: "",
|
|
89
|
+
facetMediaName: "",
|
|
90
|
+
},
|
|
91
|
+
headers: {
|
|
92
|
+
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
|
|
93
|
+
Referer: "https://search.suwonlib.go.kr/search",
|
|
94
|
+
"X-Requested-With": "XMLHttpRequest",
|
|
95
|
+
ajax: "true",
|
|
96
|
+
},
|
|
97
|
+
signal,
|
|
98
|
+
});
|
|
99
|
+
if (statusCode !== 200) {
|
|
100
|
+
throw new Error(`HTTP ${statusCode}`);
|
|
101
|
+
}
|
|
102
|
+
const data = JSON.parse(body);
|
|
103
|
+
const booklist = getBookList(data);
|
|
104
|
+
const totalCount = data.SEARCH_RESULT && data.SEARCH_RESULT.SEARCH_COUNT
|
|
105
|
+
? data.SEARCH_RESULT.SEARCH_COUNT
|
|
106
|
+
: booklist.length;
|
|
107
|
+
return {
|
|
108
|
+
totalBookCount: totalCount,
|
|
109
|
+
booklist,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
exports.search = (0, util_1.wrapWithCallback)(searchImpl);
|
|
113
|
+
function getLibraryNames() {
|
|
114
|
+
return (0, util_1.getLibraryNames)(libraryList);
|
|
115
|
+
}
|
|
116
|
+
({ moduleName: exports.moduleName, homeUrl: exports.homeUrl, search: exports.search, getLibraryNames });
|
|
117
|
+
//# sourceMappingURL=suwon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"suwon.js","sourceRoot":"","sources":["../../src/localLibraryModule/suwon.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { SearchOptions, SearchResult } from "../types";
|
|
2
|
+
export declare const moduleName = "\uC5EC\uC8FC\uC2DC\uB9BD\uB3C4\uC11C\uAD00";
|
|
3
|
+
export declare const homeUrl = "https://www.yjlib.go.kr";
|
|
4
|
+
export declare const search: (opt: SearchOptions, callback?: import("../types").SearchCallback) => Promise<SearchResult | void>;
|
|
5
|
+
export declare function getLibraryNames(): string[];
|
|
6
|
+
//# sourceMappingURL=yjlib.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yjlib.d.ts","sourceRoot":"","sources":["../../src/localLibraryModule/yjlib.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;AAsHjD,eAAO,MAAM,MAAM,oGAA+B,CAAC;AAEnD,wBAAgB,eAAe,IAAI,MAAM,EAAE,CAE1C"}
|
|
@@ -0,0 +1,109 @@
|
|
|
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.yjlib.go.kr";
|
|
10
|
+
const libraryList = [
|
|
11
|
+
// Public libraries (시립도서관)
|
|
12
|
+
{ code: "MA", name: "여주도서관" },
|
|
13
|
+
{ code: "MB", name: "세종도서관" },
|
|
14
|
+
{ code: "ME", name: "점동도서관" },
|
|
15
|
+
{ code: "MH", name: "여주기적의도서관" },
|
|
16
|
+
{ code: "MI", name: "흥천도서관" },
|
|
17
|
+
{ code: "MG", name: "금사도서관" },
|
|
18
|
+
{ code: "MF", name: "대신도서관" },
|
|
19
|
+
// Small libraries (작은도서관)
|
|
20
|
+
{ code: "MC", name: "산북작은도서관" },
|
|
21
|
+
{ code: "MD", name: "북내작은도서관" },
|
|
22
|
+
// Smart libraries (스마트도서관)
|
|
23
|
+
{ code: "SA", name: "여주역스마트도서관" },
|
|
24
|
+
{ code: "SB", name: "이마트스마트도서관" },
|
|
25
|
+
];
|
|
26
|
+
const getLibraryCode = (0, util_1.createLibraryCodeLookup)(libraryList);
|
|
27
|
+
/**
|
|
28
|
+
* Search for books in Yeoju City Libraries.
|
|
29
|
+
*/
|
|
30
|
+
async function searchImpl(opt) {
|
|
31
|
+
const { title, libraryName, signal } = opt;
|
|
32
|
+
(0, util_1.validateSearchOptions)(opt);
|
|
33
|
+
const lcode = getLibraryCode(libraryName);
|
|
34
|
+
const { statusCode, body } = await (0, http_1.get)("https://www.yjlib.go.kr/web/menu/10036/program/30001/searchResultList.do", {
|
|
35
|
+
qs: {
|
|
36
|
+
searchType: "SIMPLE",
|
|
37
|
+
searchCategory: "ALL",
|
|
38
|
+
searchLibraryArr: lcode,
|
|
39
|
+
searchField: "ALL",
|
|
40
|
+
searchWord: title,
|
|
41
|
+
searchRecordCount: 1000,
|
|
42
|
+
},
|
|
43
|
+
signal,
|
|
44
|
+
});
|
|
45
|
+
if (statusCode !== 200) {
|
|
46
|
+
throw new Error(`HTTP ${statusCode}`);
|
|
47
|
+
}
|
|
48
|
+
const dom = new jsdom_1.JSDOM(body);
|
|
49
|
+
const document = dom.window.document;
|
|
50
|
+
// Extract total count from "총 <strong class="highlight">15</strong> 건"
|
|
51
|
+
const resultText = document.querySelector(".result_box .result_screen")?.textContent ?? "";
|
|
52
|
+
const countMatch = resultText.match(/총\s*(\d+)\s*건/);
|
|
53
|
+
const count = countMatch ? countMatch[1] : "0";
|
|
54
|
+
const booklist = [];
|
|
55
|
+
const bookItems = document.querySelectorAll(".bookList .bookArea");
|
|
56
|
+
bookItems.forEach((item) => {
|
|
57
|
+
// Get title from .book_name span (remove highlight spans)
|
|
58
|
+
const titleElement = item.querySelector(".book_name a span");
|
|
59
|
+
let bookTitle = "";
|
|
60
|
+
if (titleElement) {
|
|
61
|
+
// Clone and get text content (this preserves the text without highlight spans)
|
|
62
|
+
bookTitle = titleElement.textContent?.trim() ?? "";
|
|
63
|
+
}
|
|
64
|
+
// Extract book URL from onclick handler
|
|
65
|
+
// fnSearchResultDetail(speciesKey, bookKey, publishFormCode) submits a form via POST,
|
|
66
|
+
// but the same endpoint accepts GET requests with speciesKey parameter
|
|
67
|
+
let bookUrl = "";
|
|
68
|
+
const titleLink = item.querySelector(".book_name a");
|
|
69
|
+
const onclick = titleLink?.getAttribute("onclick") ?? "";
|
|
70
|
+
const urlMatch = onclick.match(/fnSearchResultDetail\(['"]?(\d+)['"]?,\s*['"]?(\d+)['"]?,\s*['"]?(\w+)['"]?\)/);
|
|
71
|
+
if (urlMatch) {
|
|
72
|
+
const [, speciesKey, bookKey, publishFormCode] = urlMatch;
|
|
73
|
+
bookUrl = `https://www.yjlib.go.kr/web/menu/10036/program/30001/searchResultDetail.do?speciesKey=${speciesKey}&bookKey=${bookKey}&publishFormCode=${publishFormCode}`;
|
|
74
|
+
}
|
|
75
|
+
// Get library name from .book_info.info03 first strong element
|
|
76
|
+
let libName = "";
|
|
77
|
+
const info03 = item.querySelector(".book_info.info03");
|
|
78
|
+
if (info03) {
|
|
79
|
+
const firstStrong = info03.querySelector("p strong");
|
|
80
|
+
if (firstStrong) {
|
|
81
|
+
libName = firstStrong.textContent?.trim() ?? "";
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
// Get availability status from .bookBtnWrap
|
|
85
|
+
const statusEl = item.querySelector(".bookBtnWrap");
|
|
86
|
+
const statusText = statusEl?.textContent ?? "";
|
|
87
|
+
const exist = statusText.includes("대출가능");
|
|
88
|
+
if (bookTitle) {
|
|
89
|
+
booklist.push({
|
|
90
|
+
libraryName: libName,
|
|
91
|
+
title: bookTitle,
|
|
92
|
+
bookUrl,
|
|
93
|
+
maxoffset: count,
|
|
94
|
+
exist,
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
return {
|
|
99
|
+
startPage: opt.startPage,
|
|
100
|
+
totalBookCount: (0, util_1.extractNumber)(count),
|
|
101
|
+
booklist,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
exports.search = (0, util_1.wrapWithCallback)(searchImpl);
|
|
105
|
+
function getLibraryNames() {
|
|
106
|
+
return (0, util_1.getLibraryNames)(libraryList);
|
|
107
|
+
}
|
|
108
|
+
({ moduleName: exports.moduleName, homeUrl: exports.homeUrl, search: exports.search, getLibraryNames });
|
|
109
|
+
//# sourceMappingURL=yjlib.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yjlib.js","sourceRoot":"","sources":["../../src/localLibraryModule/yjlib.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { SearchOptions, SearchResult } from "../types";
|
|
2
|
+
export declare const moduleName = "\uC6A9\uC778\uC2DC\uB3C4\uC11C\uAD00";
|
|
3
|
+
export declare const homeUrl = "https://lib.yongin.go.kr";
|
|
4
|
+
export declare const search: (opt: SearchOptions, callback?: import("../types").SearchCallback) => Promise<SearchResult | void>;
|
|
5
|
+
export declare function getLibraryNames(): string[];
|
|
6
|
+
//# sourceMappingURL=yongin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yongin.d.ts","sourceRoot":"","sources":["../../src/localLibraryModule/yongin.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAIV,aAAa,EACb,YAAY,EACb,MAAM,UAAU,CAAC;AAElB,eAAO,MAAM,UAAU,yCAAW,CAAC;AACnC,eAAO,MAAM,OAAO,6BAA6B,CAAC;AAmJlD,eAAO,MAAM,MAAM,oGAA+B,CAAC;AAEnD,wBAAgB,eAAe,IAAI,MAAM,EAAE,CAE1C"}
|