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.
- package/.claude/settings.json +30 -1
- package/.claude/settings.local.json +26 -1
- package/.playwright-cli/console-2026-05-15T13-42-50-460Z.log +1 -0
- package/.playwright-cli/console-2026-05-15T13-43-40-832Z.log +10 -0
- package/.playwright-cli/console-2026-05-18T12-47-04-141Z.log +14 -0
- package/.playwright-cli/page-2026-05-07T11-53-37-538Z.yml +836 -0
- package/.playwright-cli/page-2026-05-07T11-54-02-314Z.yml +658 -0
- package/.playwright-cli/page-2026-05-07T12-03-12-317Z.yml +310 -0
- package/.playwright-cli/page-2026-05-08T13-54-43-061Z.yml +276 -0
- package/.playwright-cli/page-2026-05-08T13-54-45-094Z.yml +276 -0
- package/.playwright-cli/page-2026-05-08T13-54-53-014Z.yml +201 -0
- package/.playwright-cli/page-2026-05-08T13-56-02-097Z.yml +726 -0
- package/.playwright-cli/page-2026-05-08T13-56-33-697Z.yml +226 -0
- package/.playwright-cli/page-2026-05-15T13-42-51-601Z.yml +47 -0
- package/.playwright-cli/page-2026-05-15T13-43-40-955Z.yml +47 -0
- package/.playwright-cli/page-2026-05-15T13-43-43-563Z.yml +47 -0
- package/.playwright-cli/page-2026-05-18T12-47-05-318Z.yml +135 -0
- package/README.md +59 -2
- package/dist/dongnelibrary.d.ts.map +1 -1
- package/dist/dongnelibrary.js +36 -0
- package/dist/dongnelibrary.js.map +1 -1
- package/dist/localLibraryModule/ansan.d.ts +6 -0
- package/dist/localLibraryModule/ansan.d.ts.map +1 -0
- package/dist/localLibraryModule/ansan.js +76 -0
- package/dist/localLibraryModule/ansan.js.map +1 -0
- package/dist/localLibraryModule/bcl.d.ts +6 -0
- package/dist/localLibraryModule/bcl.d.ts.map +1 -0
- package/dist/localLibraryModule/bcl.js +75 -0
- package/dist/localLibraryModule/bcl.js.map +1 -0
- package/dist/localLibraryModule/gangnam.d.ts +6 -0
- package/dist/localLibraryModule/gangnam.d.ts.map +1 -0
- package/dist/localLibraryModule/gangnam.js +100 -0
- package/dist/localLibraryModule/gangnam.js.map +1 -0
- package/dist/localLibraryModule/gangseo.d.ts +6 -0
- package/dist/localLibraryModule/gangseo.d.ts.map +1 -0
- package/dist/localLibraryModule/gangseo.js +90 -0
- package/dist/localLibraryModule/gangseo.js.map +1 -0
- package/dist/localLibraryModule/gbelib.d.ts +6 -0
- package/dist/localLibraryModule/gbelib.d.ts.map +1 -0
- package/dist/localLibraryModule/gbelib.js +122 -0
- package/dist/localLibraryModule/gbelib.js.map +1 -0
- package/dist/localLibraryModule/geoje.d.ts +6 -0
- package/dist/localLibraryModule/geoje.d.ts.map +1 -0
- package/dist/localLibraryModule/geoje.js +75 -0
- package/dist/localLibraryModule/geoje.js.map +1 -0
- package/dist/localLibraryModule/gimhae.d.ts +6 -0
- package/dist/localLibraryModule/gimhae.d.ts.map +1 -0
- package/dist/localLibraryModule/gimhae.js +81 -0
- package/dist/localLibraryModule/gimhae.js.map +1 -0
- package/dist/localLibraryModule/gunsan.d.ts +6 -0
- package/dist/localLibraryModule/gunsan.d.ts.map +1 -0
- package/dist/localLibraryModule/gunsan.js +89 -0
- package/dist/localLibraryModule/gunsan.js.map +1 -0
- package/dist/localLibraryModule/gwanak.d.ts +6 -0
- package/dist/localLibraryModule/gwanak.d.ts.map +1 -0
- package/dist/localLibraryModule/gwanak.js +103 -0
- package/dist/localLibraryModule/gwanak.js.map +1 -0
- package/dist/localLibraryModule/gwe.d.ts +6 -0
- package/dist/localLibraryModule/gwe.d.ts.map +1 -0
- package/dist/localLibraryModule/gwe.js +84 -0
- package/dist/localLibraryModule/gwe.js.map +1 -0
- package/dist/localLibraryModule/junggulib.d.ts +6 -0
- package/dist/localLibraryModule/junggulib.d.ts.map +1 -0
- package/dist/localLibraryModule/junggulib.js +96 -0
- package/dist/localLibraryModule/junggulib.js.map +1 -0
- package/dist/localLibraryModule/mokpolib.d.ts +6 -0
- package/dist/localLibraryModule/mokpolib.d.ts.map +1 -0
- package/dist/localLibraryModule/mokpolib.js +104 -0
- package/dist/localLibraryModule/mokpolib.js.map +1 -0
- package/dist/localLibraryModule/nowon.d.ts +6 -0
- package/dist/localLibraryModule/nowon.d.ts.map +1 -0
- package/dist/localLibraryModule/nowon.js +95 -0
- package/dist/localLibraryModule/nowon.js.map +1 -0
- package/dist/localLibraryModule/paju.d.ts +6 -0
- package/dist/localLibraryModule/paju.d.ts.map +1 -0
- package/dist/localLibraryModule/paju.js +94 -0
- package/dist/localLibraryModule/paju.js.map +1 -0
- package/dist/localLibraryModule/pohang.d.ts +6 -0
- package/dist/localLibraryModule/pohang.d.ts.map +1 -0
- package/dist/localLibraryModule/pohang.js +83 -0
- package/dist/localLibraryModule/pohang.js.map +1 -0
- package/dist/localLibraryModule/siheung.d.ts +6 -0
- package/dist/localLibraryModule/siheung.d.ts.map +1 -0
- package/dist/localLibraryModule/siheung.js +65 -0
- package/dist/localLibraryModule/siheung.js.map +1 -0
- package/dist/localLibraryModule/yangcheon.d.ts +6 -0
- package/dist/localLibraryModule/yangcheon.d.ts.map +1 -0
- package/dist/localLibraryModule/yangcheon.js +90 -0
- package/dist/localLibraryModule/yangcheon.js.map +1 -0
- package/dist/localLibraryModule/ydplib.d.ts +6 -0
- package/dist/localLibraryModule/ydplib.d.ts.map +1 -0
- package/dist/localLibraryModule/ydplib.js +101 -0
- package/dist/localLibraryModule/ydplib.js.map +1 -0
- package/docs/library-module-python-scripts.md +381 -0
- 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
- 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
- package/package.json +44 -6
- package/scripts/analyze-html-library.sh +300 -0
- 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":";;;AA+GA,0CAEC;AAjHD,kCAMiB;AACjB,kCAA8B;AAC9B,iCAA8B;AASjB,QAAA,UAAU,GAAG,SAAS,CAAC;AACvB,QAAA,OAAO,GAAG,4BAA4B,CAAC;AAEpD,MAAM,UAAU,GACd,wDAAwD,CAAC;AAC3D,MAAM,WAAW,GACf,yDAAyD,CAAC;AAE5D,MAAM,WAAW,GAAkB;IACjC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE;IAC/B,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE;IAC7B,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE;IAChC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE;IAC7B,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE;IAC/B,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE;IAC/B,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE;IAC7B,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE;IAC9B,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE;IAC/B,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE;CACjC,CAAC;AAEF,MAAM,cAAc,GAAG,IAAA,8BAAuB,EAAC,WAAW,CAAC,CAAC;AAE5D,KAAK,UAAU,UAAU,CAAC,GAAkB;IAC1C,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC;IAE3C,IAAA,4BAAqB,EAAC,GAAG,CAAC,CAAC;IAE3B,MAAM,KAAK,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;IAE1C,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,MAAM,IAAA,UAAG,EAAC,UAAU,EAAE;QACjD,EAAE,EAAE;YACF,QAAQ,EAAE,GAAG;YACb,YAAY,EAAE,OAAO;YACrB,YAAY,EAAE,KAAK;YACnB,QAAQ,EAAE,MAAM;YAChB,WAAW,EAAE,KAAK;YAClB,QAAQ,EAAE,GAAG;SACd;QACD,MAAM;KACP,CAAC,CAAC;IAEH,IAAI,UAAU,KAAK,GAAG,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,QAAQ,UAAU,EAAE,CAAC,CAAC;IACxC,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,aAAK,CAAC,IAAI,CAAC,CAAC;IAC5B,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC;IAErC,MAAM,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC,iBAAiB,CAAC,CAAC;IAC/D,MAAM,QAAQ,GAAG,YAAY,EAAE,WAAW,IAAI,EAAE,CAAC;IACjD,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;IACtD,MAAM,cAAc,GAAG,UAAU,CAAC,CAAC,CAAC,IAAA,oBAAa,EAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAErE,MAAM,QAAQ,GAAW,EAAE,CAAC;IAC5B,MAAM,IAAI,GAAG,QAAQ,CAAC,gBAAgB,CACpC,0CAA0C,CAC3C,CAAC;IAEF,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;QACnB,MAAM,GAAG,GAAG,GAAG,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QACzC,IAAI,CAAC,GAAG;YAAE,OAAO;QAEjB,MAAM,SAAS,GAAG,GAAG,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;QAClD,MAAM,SAAS,GAAG,SAAS,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACvD,IAAI,CAAC,SAAS;YAAE,OAAO;QAEvB,MAAM,IAAI,GAAG,SAAS,EAAE,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACnD,MAAM,KAAK,GAAG,SAAS,EAAE,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QACrD,MAAM,UAAU,GAAG,SAAS,EAAE,YAAY,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;QAC/D,MAAM,OAAO,GACX,IAAI,IAAI,KAAK;YACX,CAAC,CAAC,GAAG,WAAW,UAAU,KAAK,SAAS,IAAI,eAAe,UAAU,6BAA6B;YAClG,CAAC,CAAC,EAAE,CAAC;QAET,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAEvD,MAAM,GAAG,GAAG,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;QACnC,MAAM,KAAK,GAAG,GAAG,EAAE,WAAW,IAAI,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;QACxD,MAAM,OAAO,GAAG,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,WAAW,CAAC;QAErD,QAAQ,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,cAAc;QACd,QAAQ;KACT,CAAC;AACJ,CAAC;AAEY,QAAA,MAAM,GAAG,IAAA,uBAAgB,EAAC,UAAU,CAAC,CAAC;AAEnD,SAAgB,eAAe;IAC7B,OAAO,IAAA,sBAAW,EAAC,WAAW,CAAC,CAAC;AAClC,CAAC;AAED,CAAC,EAAE,UAAU,EAAV,kBAAU,EAAE,OAAO,EAAP,eAAO,EAAE,MAAM,EAAN,cAAM,EAAE,eAAe,EAAE,CAAyB,CAAC"}
|
|
@@ -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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"}
|