From 51653d7d72983b5e893ee758be0af1c90af0038c Mon Sep 17 00:00:00 2001 From: neobooru <50623835+neobooru@users.noreply.github.com> Date: Thu, 12 Aug 2021 23:41:39 +0200 Subject: [PATCH] Add FurAffinity --- package.json | 2 +- src/NeoScraper.ts | 1 + src/engines/FurAffinity.ts | 59 ++++++++++++++++++++++++++++++++++++++ src/engines/index.ts | 1 + 4 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 src/engines/FurAffinity.ts diff --git a/package.json b/package.json index 07a67bc..bc8f122 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "neo-scraper", - "version": "0.4.4", + "version": "0.4.5", "description": "Scrape a booru-like post object from the DOM.", "main": "dist/index.js", "types": "dist/index.d.js", diff --git a/src/NeoScraper.ts b/src/NeoScraper.ts index 16035e9..ccf471e 100644 --- a/src/NeoScraper.ts +++ b/src/NeoScraper.ts @@ -11,6 +11,7 @@ export default class NeoScraper { new engines.AnimePictures(), new engines.Danbooru(), new engines.e621(), + new engines.FurAffinity(), new engines.Gelbooru(), new engines.Inkbunny(), new engines.Moebooru(), diff --git a/src/engines/FurAffinity.ts b/src/engines/FurAffinity.ts new file mode 100644 index 0000000..c883de7 --- /dev/null +++ b/src/engines/FurAffinity.ts @@ -0,0 +1,59 @@ +import { ScrapeEngine, ScrapeResult, ScrapedPost, ScrapedTag } from "../ScrapeEngine"; +import { guessContentType } from "../Utility"; + +export default class e621 implements ScrapeEngine { + name = "furaffinity"; + + canImport(url: Location): boolean { + return url.host == "www.furaffinity.net"; + } + + scrapeDocument(document: Document): ScrapeResult { + let result = new ScrapeResult(this.name); + + let post = new ScrapedPost(); + post.pageUrl = document.location.href; + + // Set image url + // Could use the download button here, but as far as I can tell it doesn't matter. + const downloadEl = document.querySelector("#submissionImg") as HTMLImageElement; + post.contentUrl = downloadEl?.src; + + if (post.contentUrl == undefined) { + return result; + } + + // Set content type + post.contentType = guessContentType(post.contentUrl); + + // Set rating + const ratingEls = Array.from(document.querySelectorAll("div.rating > span.rating-box")).map( + (x) => x as HTMLSpanElement + ); + + if (ratingEls.length > 0) + switch (ratingEls[0].innerText) { + case "General": + post.rating = "safe"; + break; + case "Mature": + post.rating = "sketchy"; + break; + case "Adult": + post.rating = "unsafe"; + break; + } + + // Set tags + post.tags = Array.from(document.querySelectorAll("section.tags-row > span.tags")) + .map((x) => (x as HTMLSpanElement).innerText) + .map((x) => new ScrapedTag(x)); + + // Set source + post.source = document.location.href; + + result.tryAddPost(post); + + return result; + } +} diff --git a/src/engines/index.ts b/src/engines/index.ts index a67f569..bc7285a 100644 --- a/src/engines/index.ts +++ b/src/engines/index.ts @@ -2,6 +2,7 @@ export { default as AnimePictures } from "./AnimePictures"; export { default as Danbooru } from "./Danbooru"; export { default as e621 } from "./e621"; export { default as Fallback } from "./Fallback"; +export { default as FurAffinity } from "./FurAffinity"; export { default as Gelbooru } from "./Gelbooru"; export { default as Inkbunny } from "./Inkbunny"; export { default as Moebooru } from "./Moebooru";