From 36881487328cb3cdad2fedccbf5217d70cd0151c Mon Sep 17 00:00:00 2001 From: Kiradien <68683574+Kiradien@users.noreply.github.com> Date: Mon, 28 Jul 2025 07:38:48 -0400 Subject: [PATCH 1/2] Update Kemono rule registration Updated Kemono rule registration to look at site content instead of url. --- plugin/js/parsers/KemonopartyParser.js | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/plugin/js/parsers/KemonopartyParser.js b/plugin/js/parsers/KemonopartyParser.js index ad69de5e2..90a879e8c 100644 --- a/plugin/js/parsers/KemonopartyParser.js +++ b/plugin/js/parsers/KemonopartyParser.js @@ -1,11 +1,19 @@ "use strict"; -parserFactory.register("kemono.su", () => new KemonopartyParser()); +parserFactory.registerRule( + (url, dom) => KemonopartyParser.isKemono(dom), + () => new KemonopartyParser() +); class KemonopartyParser extends Parser{ constructor() { super(); } + + static isKemono(dom) { + return dom.querySelector('meta[name="og:title"]').content == "Kemono" + && dom.querySelector("section.site-section div.card-list") != null; + } async getChapterUrls(dom, chapterUrlsUI) { let chapters = []; @@ -13,6 +21,7 @@ class KemonopartyParser extends Parser{ for(let url of urlsOfTocPages) { await this.rateLimitDelay(); let json = (await HttpClient.fetchJson(url)).json; + json.url = url; let partialList = this.extractPartialChapterList(json); chapterUrlsUI.showTocProgress(partialList); chapters = chapters.concat(partialList); @@ -50,7 +59,7 @@ class KemonopartyParser extends Parser{ urlbuilder.searchParams.delete(key); } let regex = new RegExp("/?$"); - urlbuilder.href = urlbuilder.href.replace("https://kemono.su", "https://kemono.su/api/v1").replace(regex, "/posts-legacy"); + urlbuilder.href = urlbuilder.href.replace(`https://${baseurl.hostname}`, `https://${baseurl.hostname}/api/v1`).replace(regex, "/posts-legacy"); for (const [key, value] of baseurl.searchParams.entries()) { urlbuilder.searchParams.set(key, value); @@ -70,10 +79,11 @@ class KemonopartyParser extends Parser{ extractPartialChapterList(data) { // get href from the dom, not the url of the page try { + let url = new URL(data.url); let authorid = data.props.id; let ids = data.results.map(result => result.id); let titles = data.results.map(result => result.title); - let urls = ids.map(id => `https://kemono.su/api/v1/patreon/user/${authorid}/post/${id}`); + let urls = ids.map(id => `https://${url.hostname}/api/v1/patreon/user/${authorid}/post/${id}`); return urls.map((url, i) => ({ sourceUrl: url, title: titles[i] From 121dd8e6a69b9c97926c3aceff89b7f32b35d3eb Mon Sep 17 00:00:00 2001 From: Kiradien <68683574+Kiradien@users.noreply.github.com> Date: Mon, 28 Jul 2025 07:41:31 -0400 Subject: [PATCH 2/2] Update KemonopartyParser.js Cleanup to prevent build warnings --- plugin/js/parsers/KemonopartyParser.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugin/js/parsers/KemonopartyParser.js b/plugin/js/parsers/KemonopartyParser.js index 90a879e8c..b0d4a6945 100644 --- a/plugin/js/parsers/KemonopartyParser.js +++ b/plugin/js/parsers/KemonopartyParser.js @@ -11,7 +11,7 @@ class KemonopartyParser extends Parser{ } static isKemono(dom) { - return dom.querySelector('meta[name="og:title"]').content == "Kemono" + return dom.querySelector("meta[name='og:title']").content == "Kemono" && dom.querySelector("section.site-section div.card-list") != null; }