From 7c855e7eb491a4e211dce81e01c481537c44456a Mon Sep 17 00:00:00 2001 From: Soopyboo32 <49228220+Soopyboo32@users.noreply.github.com> Date: Sun, 19 Jul 2026 21:04:25 +0800 Subject: [PATCH 1/3] Add konkon --- package-lock.json | 83 ++++--- plugins/english/konkon.ts | 315 +++++++++++++++++++++++++++ public/static/src/en/konkon/icon.png | Bin 0 -> 59074 bytes 3 files changed, 353 insertions(+), 45 deletions(-) create mode 100644 plugins/english/konkon.ts create mode 100644 public/static/src/en/konkon/icon.png diff --git a/package-lock.json b/package-lock.json index 9c0b00bc8..50cc4edc1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -285,6 +285,7 @@ "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.13.5.tgz", "integrity": "sha512-6zeCUxUH+EPF1s+YF/2hPVODeV/7V07YU5x+2tfuRL8MdW6rv5vb2+CBEGTGwBdux0OIERcOS+RzxeK80k2DsQ==", "dev": true, + "peer": true, "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.13.5", @@ -328,6 +329,7 @@ "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.13.5.tgz", "integrity": "sha512-gnOQ+nGLPvDXgIx119JqGalys64lhMdnNQA9TMxhDA4K0Hq5+++OE20Zs5GxiCV9r814xQ2K5WmtofSpHVW6BQ==", "dev": true, + "peer": true, "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.13.5", @@ -1069,6 +1071,7 @@ "resolved": "https://registry.npmjs.org/@mui/material/-/material-6.1.9.tgz", "integrity": "sha512-NwqIN0bdsgzSbZd5JFcC+2ez0XW/XNs8uiV2PDHrqQ4qf/FEasFJG1z6g8JbCN0YlTrHZekVb17X0Fv0qcYJfQ==", "dev": true, + "peer": true, "dependencies": { "@babel/runtime": "^7.26.0", "@mui/core-downloads-tracker": "^6.1.9", @@ -2278,9 +2281,6 @@ "cpu": [ "arm" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -2294,9 +2294,6 @@ "cpu": [ "arm" ], - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -2310,9 +2307,6 @@ "cpu": [ "arm64" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -2326,9 +2320,6 @@ "cpu": [ "arm64" ], - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -2342,9 +2333,6 @@ "cpu": [ "loong64" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -2358,9 +2346,6 @@ "cpu": [ "loong64" ], - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -2374,9 +2359,6 @@ "cpu": [ "ppc64" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -2390,9 +2372,6 @@ "cpu": [ "ppc64" ], - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -2406,9 +2385,6 @@ "cpu": [ "riscv64" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -2422,9 +2398,6 @@ "cpu": [ "riscv64" ], - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -2438,9 +2411,6 @@ "cpu": [ "s390x" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -2454,9 +2424,6 @@ "cpu": [ "x64" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -2470,9 +2437,6 @@ "cpu": [ "x64" ], - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -3118,6 +3082,7 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.66.tgz", "integrity": "sha512-OYTmMI4UigXeFMF/j4uv0lBBEbongSgptPrHBxqME44h9+yNov+oL6Z3ocJKo0WyXR84sQUNeyIp9MRfckvZpg==", "devOptional": true, + "peer": true, "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -3129,6 +3094,7 @@ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.22.tgz", "integrity": "sha512-fHkBXPeNtfvri6gdsMYyW+dW7RXFo6Ad09nLFK0VQWR7yGLai/Cyvyj696gbwYvBnhGtevUG9cET0pmUbMtoPQ==", "devOptional": true, + "peer": true, "dependencies": { "@types/react": "*" } @@ -3201,6 +3167,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.14.1.tgz", "integrity": "sha512-8lKUOebNLcR0D7RvlcloOacTOWzOqemWEWkKSVpMZVF/XVcwjPR+3MD08QzbW9TCGJ+DwIc6zUSGZ9vd8cO1IA==", "dev": true, + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "7.14.1", "@typescript-eslint/types": "7.14.1", @@ -3404,6 +3371,7 @@ "version": "8.12.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.0.tgz", "integrity": "sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -5118,6 +5086,7 @@ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", "dev": true, + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -7870,6 +7839,7 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -7881,6 +7851,7 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -7900,6 +7871,7 @@ "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.1.2.tgz", "integrity": "sha512-0OA4dhM1W48l3uzmv6B7TXPCGmokUU4p1M44DGN2/D9a1FjVPukVjER1PcPX97jIg6aUeLq1XJo1IpfbgULn0w==", "dev": true, + "peer": true, "dependencies": { "@types/use-sync-external-store": "^0.0.3", "use-sync-external-store": "^1.0.0" @@ -8052,7 +8024,8 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", - "dev": true + "dev": true, + "peer": true }, "node_modules/redux-thunk": { "version": "3.1.0", @@ -9009,6 +8982,7 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -9117,6 +9091,7 @@ "version": "5.7.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -9305,6 +9280,7 @@ "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.3.tgz", "integrity": "sha512-NTKlcQjlAK7MlQoyb6LgaqHc8sso/pVyUJYWMws3jg21uTJw/LddqIFPcPqP6PzpgbIcZyKI85sFE4HBrQDA8A==", "license": "MIT", + "peer": true, "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", @@ -9410,6 +9386,7 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -9809,6 +9786,7 @@ "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.13.5.tgz", "integrity": "sha512-6zeCUxUH+EPF1s+YF/2hPVODeV/7V07YU5x+2tfuRL8MdW6rv5vb2+CBEGTGwBdux0OIERcOS+RzxeK80k2DsQ==", "dev": true, + "peer": true, "requires": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.13.5", @@ -9844,6 +9822,7 @@ "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.13.5.tgz", "integrity": "sha512-gnOQ+nGLPvDXgIx119JqGalys64lhMdnNQA9TMxhDA4K0Hq5+++OE20Zs5GxiCV9r814xQ2K5WmtofSpHVW6BQ==", "dev": true, + "peer": true, "requires": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.13.5", @@ -10232,6 +10211,7 @@ "resolved": "https://registry.npmjs.org/@mui/material/-/material-6.1.9.tgz", "integrity": "sha512-NwqIN0bdsgzSbZd5JFcC+2ez0XW/XNs8uiV2PDHrqQ4qf/FEasFJG1z6g8JbCN0YlTrHZekVb17X0Fv0qcYJfQ==", "dev": true, + "peer": true, "requires": { "@babel/runtime": "^7.26.0", "@mui/core-downloads-tracker": "^6.1.9", @@ -11238,6 +11218,7 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.66.tgz", "integrity": "sha512-OYTmMI4UigXeFMF/j4uv0lBBEbongSgptPrHBxqME44h9+yNov+oL6Z3ocJKo0WyXR84sQUNeyIp9MRfckvZpg==", "devOptional": true, + "peer": true, "requires": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -11249,6 +11230,7 @@ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.22.tgz", "integrity": "sha512-fHkBXPeNtfvri6gdsMYyW+dW7RXFo6Ad09nLFK0VQWR7yGLai/Cyvyj696gbwYvBnhGtevUG9cET0pmUbMtoPQ==", "devOptional": true, + "peer": true, "requires": { "@types/react": "*" } @@ -11305,6 +11287,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.14.1.tgz", "integrity": "sha512-8lKUOebNLcR0D7RvlcloOacTOWzOqemWEWkKSVpMZVF/XVcwjPR+3MD08QzbW9TCGJ+DwIc6zUSGZ9vd8cO1IA==", "dev": true, + "peer": true, "requires": { "@typescript-eslint/scope-manager": "7.14.1", "@typescript-eslint/types": "7.14.1", @@ -11423,7 +11406,8 @@ "acorn": { "version": "8.12.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.0.tgz", - "integrity": "sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==" + "integrity": "sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==", + "peer": true }, "acorn-jsx": { "version": "5.3.2", @@ -12654,6 +12638,7 @@ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", "dev": true, + "peer": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -14480,6 +14465,7 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "peer": true, "requires": { "loose-envify": "^1.1.0" } @@ -14488,6 +14474,7 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "peer": true, "requires": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -14504,6 +14491,7 @@ "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.1.2.tgz", "integrity": "sha512-0OA4dhM1W48l3uzmv6B7TXPCGmokUU4p1M44DGN2/D9a1FjVPukVjER1PcPX97jIg6aUeLq1XJo1IpfbgULn0w==", "dev": true, + "peer": true, "requires": { "@types/use-sync-external-store": "^0.0.3", "use-sync-external-store": "^1.0.0" @@ -14583,7 +14571,8 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", - "dev": true + "dev": true, + "peer": true }, "redux-thunk": { "version": "3.1.0", @@ -15250,7 +15239,8 @@ "picomatch": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==" + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "peer": true } } }, @@ -15329,7 +15319,8 @@ "typescript": { "version": "5.7.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", - "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==" + "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "peer": true }, "typescript-eslint": { "version": "7.14.1", @@ -15452,6 +15443,7 @@ "version": "6.4.3", "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.3.tgz", "integrity": "sha512-NTKlcQjlAK7MlQoyb6LgaqHc8sso/pVyUJYWMws3jg21uTJw/LddqIFPcPqP6PzpgbIcZyKI85sFE4HBrQDA8A==", + "peer": true, "requires": { "esbuild": "^0.25.0", "fdir": "^6.4.4", @@ -15471,7 +15463,8 @@ "picomatch": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==" + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "peer": true } } }, diff --git a/plugins/english/konkon.ts b/plugins/english/konkon.ts new file mode 100644 index 000000000..4a609133c --- /dev/null +++ b/plugins/english/konkon.ts @@ -0,0 +1,315 @@ +import { fetchApi } from '@libs/fetch'; +import { Filters } from '@libs/filterInputs'; +import { NovelStatus } from '@libs/novelStatus'; +import { defaultCover } from '@libs/defaultCover'; +import { storage } from '@libs/storage'; +import { Plugin } from '@/types/plugin'; +import { load as parseHTML } from 'cheerio'; + +type ImageKeys = { + featured_image?: string | null; + featured_image_key?: string | null; + featured_image_thumb_small_key?: string | null; + featured_image_thumb_medium_key?: string | null; +}; + +type NovelSummary = ImageKeys & { + id: number; + title: string; + slug: string; + novel_status?: string | null; +}; + +type Chapter = { + id: number; + title: string; + slug: string; + status: string; + sort_order?: number; + is_locked?: boolean; + user_has_access?: boolean; + scheduled_for?: string | null; + created_at?: string | null; +}; + +type Volume = { + order?: number; + chapters?: Chapter[]; +}; + +type NovelDetails = NovelSummary & { + author_name?: string | null; + description?: string | null; + genres?: { name: string }[]; + tags?: { name: string }[]; + volumes?: Volume[]; + chapters_pagination?: { + last_page?: number; + }; +}; + +type ChapterDetails = { + id: number; + title: string; + content?: string | null; + locked?: boolean; + is_locked?: boolean; + user_has_access?: boolean; +}; + +type DataResponse = { + data: T; +}; + +class KonkonPlugin implements Plugin.PluginBase { + id = 'konkon'; + name = 'Konkon'; + icon = 'src/en/konkon/icon.png'; + site = 'https://konkon.ink'; + version = '1.0.0'; + filters: Filters | undefined = undefined; + pluginSettings = { + hideLocked: { + value: '', + label: 'Hide locked chapters', + type: 'Switch', + }, + }; + hideLocked = storage.get('hideLocked'); + + private api = 'https://api-k.konkon.ink'; + private pageSize = 20; + + private async getJson(path: string): Promise { + const response = await fetchApi(this.api + path, { + headers: { + Accept: 'application/json', + Referer: this.site + '/', + }, + }); + + if (!response.ok) { + throw new Error( + `Could not reach Konkon (${response.status}). Try opening the site in webview.`, + ); + } + + const contentType = response.headers.get('content-type') || ''; + if (!contentType.includes('application/json')) { + throw new Error( + 'Konkon returned an unexpected response. Try opening the site in webview.', + ); + } + + return (await response.json()) as T; + } + + private encodeBase64(input: string): string { + const chars = + 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; + let output = ''; + + for ( + let block = 0, charCode, index = 0, map = chars; + input.charAt(index | 0) || ((map = '='), index % 1); + output += map.charAt(63 & (block >> (8 - (index % 1) * 8))) + ) { + charCode = input.charCodeAt((index += 3 / 4)); + if (charCode > 0xff) { + throw new Error('Could not encode Konkon media path.'); + } + block = (block << 8) | charCode; + } + + return output; + } + + private coverUrl(novel: ImageKeys): string { + const key = + novel.featured_image_thumb_medium_key || + novel.featured_image_key || + novel.featured_image_thumb_small_key || + novel.featured_image; + + if (!key) return defaultCover; + return `${this.api}/api/media/k/${this.encodeBase64(key)}`; + } + + private toNovelItem(novel: NovelSummary): Plugin.NovelItem { + return { + name: novel.title || 'Untitled', + path: `/read/${novel.slug}`, + cover: this.coverUrl(novel), + }; + } + + async popularNovels( + pageNo: number, + { showLatestNovels }: Plugin.PopularNovelsOptions, + ): Promise { + if (showLatestNovels) { + const response = await this.getJson>( + `/api/public/latest-updates?per_page=${this.pageSize}&page=${pageNo}`, + ); + return response.data.map(novel => this.toNovelItem(novel)); + } + + const limit = pageNo * this.pageSize; + const response = await this.getJson>( + `/api/public/novels_trending?limit=${limit}`, + ); + return response.data + .slice((pageNo - 1) * this.pageSize, limit) + .map(novel => this.toNovelItem(novel)); + } + + private status(status?: string | null): string { + switch (status?.toLowerCase()) { + case 'ongoing': + return NovelStatus.Ongoing; + case 'completed': + case 'complete': + return NovelStatus.Completed; + case 'cancelled': + case 'canceled': + return NovelStatus.Cancelled; + case 'hiatus': + case 'on hiatus': + return NovelStatus.OnHiatus; + default: + return NovelStatus.Unknown; + } + } + + private readerHtml(html: string): string { + const content = parseHTML(html, undefined, false); + content('script, style').remove(); + content('[style]').each((_, element) => { + const style = content(element).attr('style') || ''; + const readerSafeStyle = style + .replace(/(^|;)\s*color\s*:[^;]*/gi, '$1') + .replace(/;{2,}/g, ';') + .replace(/^\s*;|;\s*$/g, '') + .trim(); + + if (readerSafeStyle) content(element).attr('style', readerSafeStyle); + else content(element).removeAttr('style'); + }); + return content.root().html() || html; + } + + private summaryText(html: string): string { + const content = parseHTML(html, undefined, false); + const paragraphs = content('p') + .map((_, element) => content(element).text().trim()) + .get() + .filter(Boolean); + return ( + paragraphs.length ? paragraphs.join('\n\n') : content.text() + ).trim(); + } + + private async getNovelPage( + slug: string, + pageNo: number, + ): Promise { + const response = await this.getJson>( + `/api/public/novels/${encodeURIComponent(slug)}?page=${pageNo}&per_page=100`, + ); + return response.data; + } + + async parseNovel(novelPath: string): Promise { + const slug = novelPath.replace(/^\/?read\//, '').split(/[?#]/)[0]; + const firstPage = await this.getNovelPage(slug, 1); + const lastPage = Math.max( + 1, + Number(firstPage.chapters_pagination?.last_page) || 1, + ); + const pages = [firstPage]; + + for (let pageNo = 2; pageNo <= lastPage; pageNo += 1) { + pages.push(await this.getNovelPage(slug, pageNo)); + } + + const chapters = pages + .flatMap(page => page.volumes || []) + .sort((a, b) => (a.order || 0) - (b.order || 0)) + .flatMap(volume => + [...(volume.chapters || [])].sort( + (a, b) => (a.sort_order || 0) - (b.sort_order || 0), + ), + ) + .filter(chapter => chapter.status === 'published') + .filter( + chapter => + !this.hideLocked || !chapter.is_locked || chapter.user_has_access, + ) + .map((chapter, index): Plugin.ChapterItem => { + const locked = Boolean(chapter.is_locked && !chapter.user_has_access); + return { + name: `${locked ? '🔒 ' : ''}${chapter.title}`, + path: `/read/chapter/${chapter.id}/${chapter.slug}`, + chapterNumber: index + 1, + releaseTime: chapter.scheduled_for || chapter.created_at || null, + }; + }); + + const genres = [...(firstPage.genres || []), ...(firstPage.tags || [])] + .map(item => item.name) + .filter((name, index, all) => name && all.indexOf(name) === index) + .join(', '); + + return { + name: firstPage.title || 'Untitled', + path: `/read/${firstPage.slug}`, + cover: this.coverUrl(firstPage), + author: firstPage.author_name || undefined, + genres, + summary: firstPage.description + ? this.summaryText(firstPage.description) + : undefined, + status: this.status(firstPage.novel_status), + chapters, + }; + } + + async parseChapter(chapterPath: string): Promise { + const chapterId = chapterPath.match(/\/read\/chapter\/(\d+)/)?.[1]; + if (!chapterId) throw new Error('Invalid chapter path.'); + + const response = await this.getJson>( + `/api/public/chapters/${chapterId}`, + ); + const chapter = response.data; + + if ((chapter.locked || chapter.is_locked) && !chapter.user_has_access) { + throw new Error('This chapter is locked.'); + } + if (!chapter.content) { + throw new Error('Konkon returned no chapter content.'); + } + + return this.readerHtml(chapter.content); + } + + async searchNovels( + searchTerm: string, + pageNo: number, + ): Promise { + const response = await this.getJson>( + '/api/public/novels?limit=1000', + ); + const term = searchTerm.trim().toLowerCase(); + const start = (pageNo - 1) * this.pageSize; + + return response.data + .filter(novel => novel.title.toLowerCase().includes(term)) + .slice(start, start + this.pageSize) + .map(novel => this.toNovelItem(novel)); + } + + resolveUrl = (path: string) => this.site + path; +} + +export default new KonkonPlugin(); diff --git a/public/static/src/en/konkon/icon.png b/public/static/src/en/konkon/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..67bf8422ffa480b6042c459819cb504dfd26338c GIT binary patch literal 59074 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

=|>PT5=5Ght+WI?|D>0aDW;V2}qkN!t! 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 literal 0 HcmV?d00001 From d77f8483013fca9ed5e93853dd1f1ba2924ef393 Mon Sep 17 00:00:00 2001 From: Soopyboo32 <49228220+Soopyboo32@users.noreply.github.com> Date: Sun, 19 Jul 2026 21:11:26 +0800 Subject: [PATCH 2/3] Use search endpoint --- plugins/english/konkon.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/plugins/english/konkon.ts b/plugins/english/konkon.ts index 4a609133c..889ea6cae 100644 --- a/plugins/english/konkon.ts +++ b/plugins/english/konkon.ts @@ -61,6 +61,10 @@ type DataResponse = { data: T; }; +type SearchResponse = { + results: T[]; +}; + class KonkonPlugin implements Plugin.PluginBase { id = 'konkon'; name = 'Konkon'; @@ -297,16 +301,12 @@ class KonkonPlugin implements Plugin.PluginBase { searchTerm: string, pageNo: number, ): Promise { - const response = await this.getJson>( - '/api/public/novels?limit=1000', + if (pageNo > 1) return []; + const response = await this.getJson>( + `/api/public/search?q=${encodeURIComponent(searchTerm.trim())}`, ); - const term = searchTerm.trim().toLowerCase(); - const start = (pageNo - 1) * this.pageSize; - return response.data - .filter(novel => novel.title.toLowerCase().includes(term)) - .slice(start, start + this.pageSize) - .map(novel => this.toNovelItem(novel)); + return response.results.map(novel => this.toNovelItem(novel)); } resolveUrl = (path: string) => this.site + path; From cb3d985265c292af556b7455e8e8c4e39f38a4fb Mon Sep 17 00:00:00 2001 From: Soopyboo32 <49228220+Soopyboo32@users.noreply.github.com> Date: Sun, 19 Jul 2026 21:21:01 +0800 Subject: [PATCH 3/3] Revert package lock --- package-lock.json | 83 +++++++++++++++++++++++++---------------------- 1 file changed, 45 insertions(+), 38 deletions(-) diff --git a/package-lock.json b/package-lock.json index 50cc4edc1..9c0b00bc8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -285,7 +285,6 @@ "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.13.5.tgz", "integrity": "sha512-6zeCUxUH+EPF1s+YF/2hPVODeV/7V07YU5x+2tfuRL8MdW6rv5vb2+CBEGTGwBdux0OIERcOS+RzxeK80k2DsQ==", "dev": true, - "peer": true, "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.13.5", @@ -329,7 +328,6 @@ "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.13.5.tgz", "integrity": "sha512-gnOQ+nGLPvDXgIx119JqGalys64lhMdnNQA9TMxhDA4K0Hq5+++OE20Zs5GxiCV9r814xQ2K5WmtofSpHVW6BQ==", "dev": true, - "peer": true, "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.13.5", @@ -1071,7 +1069,6 @@ "resolved": "https://registry.npmjs.org/@mui/material/-/material-6.1.9.tgz", "integrity": "sha512-NwqIN0bdsgzSbZd5JFcC+2ez0XW/XNs8uiV2PDHrqQ4qf/FEasFJG1z6g8JbCN0YlTrHZekVb17X0Fv0qcYJfQ==", "dev": true, - "peer": true, "dependencies": { "@babel/runtime": "^7.26.0", "@mui/core-downloads-tracker": "^6.1.9", @@ -2281,6 +2278,9 @@ "cpu": [ "arm" ], + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -2294,6 +2294,9 @@ "cpu": [ "arm" ], + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -2307,6 +2310,9 @@ "cpu": [ "arm64" ], + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -2320,6 +2326,9 @@ "cpu": [ "arm64" ], + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -2333,6 +2342,9 @@ "cpu": [ "loong64" ], + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -2346,6 +2358,9 @@ "cpu": [ "loong64" ], + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -2359,6 +2374,9 @@ "cpu": [ "ppc64" ], + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -2372,6 +2390,9 @@ "cpu": [ "ppc64" ], + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -2385,6 +2406,9 @@ "cpu": [ "riscv64" ], + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -2398,6 +2422,9 @@ "cpu": [ "riscv64" ], + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -2411,6 +2438,9 @@ "cpu": [ "s390x" ], + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -2424,6 +2454,9 @@ "cpu": [ "x64" ], + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -2437,6 +2470,9 @@ "cpu": [ "x64" ], + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -3082,7 +3118,6 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.66.tgz", "integrity": "sha512-OYTmMI4UigXeFMF/j4uv0lBBEbongSgptPrHBxqME44h9+yNov+oL6Z3ocJKo0WyXR84sQUNeyIp9MRfckvZpg==", "devOptional": true, - "peer": true, "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -3094,7 +3129,6 @@ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.22.tgz", "integrity": "sha512-fHkBXPeNtfvri6gdsMYyW+dW7RXFo6Ad09nLFK0VQWR7yGLai/Cyvyj696gbwYvBnhGtevUG9cET0pmUbMtoPQ==", "devOptional": true, - "peer": true, "dependencies": { "@types/react": "*" } @@ -3167,7 +3201,6 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.14.1.tgz", "integrity": "sha512-8lKUOebNLcR0D7RvlcloOacTOWzOqemWEWkKSVpMZVF/XVcwjPR+3MD08QzbW9TCGJ+DwIc6zUSGZ9vd8cO1IA==", "dev": true, - "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "7.14.1", "@typescript-eslint/types": "7.14.1", @@ -3371,7 +3404,6 @@ "version": "8.12.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.0.tgz", "integrity": "sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -5086,7 +5118,6 @@ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", "dev": true, - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -7839,7 +7870,6 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", - "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -7851,7 +7881,6 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", - "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -7871,7 +7900,6 @@ "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.1.2.tgz", "integrity": "sha512-0OA4dhM1W48l3uzmv6B7TXPCGmokUU4p1M44DGN2/D9a1FjVPukVjER1PcPX97jIg6aUeLq1XJo1IpfbgULn0w==", "dev": true, - "peer": true, "dependencies": { "@types/use-sync-external-store": "^0.0.3", "use-sync-external-store": "^1.0.0" @@ -8024,8 +8052,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", - "dev": true, - "peer": true + "dev": true }, "node_modules/redux-thunk": { "version": "3.1.0", @@ -8982,7 +9009,6 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -9091,7 +9117,6 @@ "version": "5.7.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -9280,7 +9305,6 @@ "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.3.tgz", "integrity": "sha512-NTKlcQjlAK7MlQoyb6LgaqHc8sso/pVyUJYWMws3jg21uTJw/LddqIFPcPqP6PzpgbIcZyKI85sFE4HBrQDA8A==", "license": "MIT", - "peer": true, "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", @@ -9386,7 +9410,6 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -9786,7 +9809,6 @@ "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.13.5.tgz", "integrity": "sha512-6zeCUxUH+EPF1s+YF/2hPVODeV/7V07YU5x+2tfuRL8MdW6rv5vb2+CBEGTGwBdux0OIERcOS+RzxeK80k2DsQ==", "dev": true, - "peer": true, "requires": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.13.5", @@ -9822,7 +9844,6 @@ "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.13.5.tgz", "integrity": "sha512-gnOQ+nGLPvDXgIx119JqGalys64lhMdnNQA9TMxhDA4K0Hq5+++OE20Zs5GxiCV9r814xQ2K5WmtofSpHVW6BQ==", "dev": true, - "peer": true, "requires": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.13.5", @@ -10211,7 +10232,6 @@ "resolved": "https://registry.npmjs.org/@mui/material/-/material-6.1.9.tgz", "integrity": "sha512-NwqIN0bdsgzSbZd5JFcC+2ez0XW/XNs8uiV2PDHrqQ4qf/FEasFJG1z6g8JbCN0YlTrHZekVb17X0Fv0qcYJfQ==", "dev": true, - "peer": true, "requires": { "@babel/runtime": "^7.26.0", "@mui/core-downloads-tracker": "^6.1.9", @@ -11218,7 +11238,6 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.66.tgz", "integrity": "sha512-OYTmMI4UigXeFMF/j4uv0lBBEbongSgptPrHBxqME44h9+yNov+oL6Z3ocJKo0WyXR84sQUNeyIp9MRfckvZpg==", "devOptional": true, - "peer": true, "requires": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -11230,7 +11249,6 @@ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.22.tgz", "integrity": "sha512-fHkBXPeNtfvri6gdsMYyW+dW7RXFo6Ad09nLFK0VQWR7yGLai/Cyvyj696gbwYvBnhGtevUG9cET0pmUbMtoPQ==", "devOptional": true, - "peer": true, "requires": { "@types/react": "*" } @@ -11287,7 +11305,6 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.14.1.tgz", "integrity": "sha512-8lKUOebNLcR0D7RvlcloOacTOWzOqemWEWkKSVpMZVF/XVcwjPR+3MD08QzbW9TCGJ+DwIc6zUSGZ9vd8cO1IA==", "dev": true, - "peer": true, "requires": { "@typescript-eslint/scope-manager": "7.14.1", "@typescript-eslint/types": "7.14.1", @@ -11406,8 +11423,7 @@ "acorn": { "version": "8.12.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.0.tgz", - "integrity": "sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==", - "peer": true + "integrity": "sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==" }, "acorn-jsx": { "version": "5.3.2", @@ -12638,7 +12654,6 @@ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", "dev": true, - "peer": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -14465,7 +14480,6 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", - "peer": true, "requires": { "loose-envify": "^1.1.0" } @@ -14474,7 +14488,6 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", - "peer": true, "requires": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -14491,7 +14504,6 @@ "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.1.2.tgz", "integrity": "sha512-0OA4dhM1W48l3uzmv6B7TXPCGmokUU4p1M44DGN2/D9a1FjVPukVjER1PcPX97jIg6aUeLq1XJo1IpfbgULn0w==", "dev": true, - "peer": true, "requires": { "@types/use-sync-external-store": "^0.0.3", "use-sync-external-store": "^1.0.0" @@ -14571,8 +14583,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", - "dev": true, - "peer": true + "dev": true }, "redux-thunk": { "version": "3.1.0", @@ -15239,8 +15250,7 @@ "picomatch": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", - "peer": true + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==" } } }, @@ -15319,8 +15329,7 @@ "typescript": { "version": "5.7.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", - "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", - "peer": true + "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==" }, "typescript-eslint": { "version": "7.14.1", @@ -15443,7 +15452,6 @@ "version": "6.4.3", "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.3.tgz", "integrity": "sha512-NTKlcQjlAK7MlQoyb6LgaqHc8sso/pVyUJYWMws3jg21uTJw/LddqIFPcPqP6PzpgbIcZyKI85sFE4HBrQDA8A==", - "peer": true, "requires": { "esbuild": "^0.25.0", "fdir": "^6.4.4", @@ -15463,8 +15471,7 @@ "picomatch": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", - "peer": true + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==" } } },