From 5c921a7c064c6b1f8188f3866da38771c2780180 Mon Sep 17 00:00:00 2001 From: Phil Date: Sat, 9 May 2026 18:10:39 +0200 Subject: [PATCH 1/2] fix: post parsing --- src/Parser.ts | 44 +++++++++++++++++++++++--------------------- 1 file changed, 23 insertions(+), 21 deletions(-) diff --git a/src/Parser.ts b/src/Parser.ts index df18dd7..2ab9aa9 100644 --- a/src/Parser.ts +++ b/src/Parser.ts @@ -278,45 +278,47 @@ export function ParseSubmission(body: string, id: string): ISubmission { checkSystemMessage($); // Get main nodes - const main = $("#columnpage"); - const sidebar = main.find(".submission-sidebar"); - const content = main.find(".submission-content"); + const main = $("#main-window"); + const sidebar = main.find(".submission-controls-upper"); + const content = main.find(".submission-details"); - const stats = sidebar.find(".stats-container"); - const info = sidebar.find(".info"); - const tags = sidebar.find(".tags-row .tags a"); + const stats = main.find(".submission-page-stats"); + const info = main.find(".submission-content-stats"); + const tags = main.find(".submission-tags .tags a"); // buttons - let downloadUrl: string = `http:${sidebar.find(".buttons .download a")[0].attribs.href}`; - const favLinkNode = sidebar.find(".buttons .fav a")[0]; + let downloadUrl: string = `http:${sidebar.find("a.button")[2].attribs.href}`; + const favLinkNode = sidebar.find("a.button")[0]; const favLink = favLinkNode ? `http://furaffinity.net${favLinkNode.attribs.href}` : undefined; // header - const title: string = content.find(".submission-id-sub-container .submission-title p")[0].childNodes[0].data?.trim() ?? ""; - const authorName: string = content.find(".submission-id-sub-container .c-usernameBlockSimple__displayName")[0].childNodes[0].data?.trim() ?? ""; - const authorId: string = content.find(".submission-id-sub-container .c-usernameBlockSimple__displayName")[0].attribs.title.trim(); - const posted: string = content.find(".submission-id-sub-container strong span")[0].attribs.title; - const authorAvatar: string = `http:${content.find(".submission-id-avatar img")[0].attribs.src}`; + const title: string = content.find(".submission-title h2")[0].childNodes[0].data?.trim() ?? ""; + const authorName: string = content.find(".c-usernameBlockSimple .c-usernameBlockSimple__displayName")[0].childNodes[0].data?.trim() ?? ""; + const authorId: string = content.find(".c-usernameBlockSimple .c-usernameBlockSimple__displayName")[0].attribs.title.trim(); + const posted: string = content.find("span.popup_date")[0].attribs.title; + const authorAvatar: string = `http:${content.find("img.submission-user-icon")[0].attribs.src}`; const authorShinies: boolean = !!$(".shinies-promo"); const description: string = content.find(".submission-description").html()?.trim() ?? ""; // stats - const rating: Rating = Rating[stats.find(".rating span")[0].childNodes[0].data?.trim() as keyof typeof Rating]; - const favorites: number = Number.parseInt(stats.find(".favorites span")[0].childNodes[0].data?.trim() ?? ""); - const comments: number = Number.parseInt(stats.find(".comments span")[0].childNodes[0].data?.trim() ?? ""); - const views: number = Number.parseInt(stats.find(".views span")[0].childNodes[0].data?.trim() ?? ""); + const rating: Rating = Rating[stats.find("div .font-large.inline")[0].childNodes[0].data?.trim() as keyof typeof Rating]; + const favorites: number = Number.parseInt(stats.find("div")[6].childNodes[1].childNodes[0].data?.trim() ?? ""); + const comments: number = Number.parseInt(stats.find("div")[3].childNodes[1].childNodes[0].data?.trim() ?? ""); + const views: number = Number.parseInt(stats.find("div")[0].childNodes[1].childNodes[0].data?.trim() ?? ""); // info - const category: Category = Category[info.find(".category-name")[0].childNodes[0].data?.trim() as keyof typeof Category]; - const species: Species = Species[info[0].childNodes[3].childNodes[2].childNodes[0].data?.trim() as keyof typeof Species]; - const gender: Gender = Gender[info[0].childNodes[5].childNodes[2].childNodes[0].data?.trim() as keyof typeof Gender]; + const category: Category = Category[info.find("span")[7].childNodes[0].data?.trim() as keyof typeof Category]; + const species: Species = Species[info.find("span")[9].childNodes[0].data?.trim() as keyof typeof Species]; + // FIXME: couldn't find "gender" anymore on the frontend, might have gotten sunset. + // const gender: Gender = Gender[info[0].childNodes[5].childNodes[2].childNodes[0].data?.trim() as keyof typeof Gender]; + const gender: Gender = Gender['Other / Not Specified']; // fix url when category is story or poetry if (category === Category.Story || category === Category.Poetry) { downloadUrl = downloadUrl.replace("d.facdn.net/download/", "d.facdn.net/"); } - const previewUrl: string | undefined = content.find(".submission-area img").length > 0 ? `http:${content.find(".submission-area img")[0].attribs["data-preview-src"]}` : undefined; + const previewUrl: string | undefined = main.find("#submissionImg").length > 0 ? `http:${main.find("#submissionImg")[0].attribs["data-preview-src"]}` : undefined; return { id, From 07b2e7bcf5b610c332ac6914323e94babe6420ae Mon Sep 17 00:00:00 2001 From: Phil Date: Sat, 9 May 2026 18:11:02 +0200 Subject: [PATCH 2/2] feat: add invalid taqs --- src/Parser.ts | 6 ++++++ src/interfaces.ts | 1 + 2 files changed, 7 insertions(+) diff --git a/src/Parser.ts b/src/Parser.ts index 2ab9aa9..81d71a3 100644 --- a/src/Parser.ts +++ b/src/Parser.ts @@ -285,6 +285,7 @@ export function ParseSubmission(body: string, id: string): ISubmission { const stats = main.find(".submission-page-stats"); const info = main.find(".submission-content-stats"); const tags = main.find(".submission-tags .tags a"); + const invalidTags = main.find(".submission-tags .tags .tag-invalid"); // buttons let downloadUrl: string = `http:${sidebar.find("a.button")[2].attribs.href}`; @@ -353,6 +354,11 @@ export function ParseSubmission(body: string, id: string): ISubmission { return tag.childNodes[0].data?.trim() ?? ""; }) .get(), + keywordsInvalid: invalidTags + .map((index, tag) => { + return tag.childNodes[0].data?.trim() ?? ""; + }) + .get(), fave: favLink ? async () => { await FaveSubmission(favLink); diff --git a/src/interfaces.ts b/src/interfaces.ts index 6faf870..07cdee0 100644 --- a/src/interfaces.ts +++ b/src/interfaces.ts @@ -68,6 +68,7 @@ export interface ISubmission { downloadUrl: string; previewUrl?: string; keywords: string[]; + keywordsInvalid: string[]; fave?(): Promise; }