From 4803d2333bcc3aaf1b898647651b22ac62fcdc0d Mon Sep 17 00:00:00 2001 From: Phil Date: Mon, 31 May 2021 15:33:20 +0200 Subject: [PATCH] added FurAffinity scraper --- src/NeoScraper.ts | 3 +- src/engines/FurAffinity.ts | 59 ++++++++++++++++++++++++++++++++++++++ src/engines/index.ts | 1 + 3 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 src/engines/FurAffinity.ts diff --git a/src/NeoScraper.ts b/src/NeoScraper.ts index 16035e9..8e6dedb 100644 --- a/src/NeoScraper.ts +++ b/src/NeoScraper.ts @@ -20,7 +20,8 @@ export default class NeoScraper { new engines.Shimmie2(), new engines.Shuushuu(), new engines.Twitter(), - new engines.Zerochan() + new engines.Zerochan(), + new engines.FurAffinity() ); this.fallbackEngine = new engines.Fallback(); } diff --git a/src/engines/FurAffinity.ts b/src/engines/FurAffinity.ts new file mode 100644 index 0000000..1815aae --- /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 + 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 + // TODO: not so sure about this? maybe there is a more elegant solution + const ratingEl = document.querySelectorAll("div.rating > span.font-large.rating-box.inline")[0] as HTMLSpanElement; + switch (ratingEl?.innerText) { + case "General": + post.rating = "safe"; + break; + case "Mature": + post.rating = "sketchy"; + break; + case "Adult": + post.rating = "unsafe"; + break; + } + + // Set tags + // Shimmie2 doesn't support categories so we don't need to worry about those. + // They also use uppercase tags, so we toLowerCase() those. + // Tags might not match with other booru-likes, but that is for the user to figure out. + // For example by deleting 'wrong' tags or setting up some aliases in szurubooru. + 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..2e12a05 100644 --- a/src/engines/index.ts +++ b/src/engines/index.ts @@ -12,3 +12,4 @@ export { default as Shimmie2 } from "./Shimmie2"; export { default as Shuushuu } from "./Shuushuu"; export { default as Twitter } from "./Twitter"; export { default as Zerochan } from "./Zerochan"; +export { default as FurAffinity } from "./FurAffinity";