From 5bb418dae6047654c5b835eb1c90124fa685965d Mon Sep 17 00:00:00 2001 From: neobooru <50623835+neobooru@users.noreply.github.com> Date: Sun, 30 Jan 2022 19:11:04 +0100 Subject: [PATCH] Add resolution scraping feature to various sites --- src/engines/FurAffinity.test.ts | 15 +++++++++++++++ src/engines/FurAffinity.ts | 12 ++++++++++-- src/engines/Inkbunny.test.ts | 1 + src/engines/Inkbunny.ts | 7 +++++++ src/engines/e621.test.ts | 14 ++++++++++++++ src/engines/e621.ts | 7 +++++++ 6 files changed, 54 insertions(+), 2 deletions(-) create mode 100644 src/engines/FurAffinity.test.ts create mode 100644 src/engines/e621.test.ts diff --git a/src/engines/FurAffinity.test.ts b/src/engines/FurAffinity.test.ts new file mode 100644 index 0000000..26513ff --- /dev/null +++ b/src/engines/FurAffinity.test.ts @@ -0,0 +1,15 @@ +import { scrapeUrl } from "../test/engine"; + +test("get furaffinity.net post 23281942", async () => { + const pageUrl = "https://www.furaffinity.net/view/23281942/"; + const res = await scrapeUrl(pageUrl); + expect(res.posts.length).toBe(1); + expect(res.posts[0]).toHaveTag("zac"); + expect(res.posts[0]).toHaveTag("riven"); + expect(res.posts[0]).toHaveTag("pool"); + expect(res.posts[0]).toHaveResolution([1280, 1279]); + expect(res.posts[0].pageUrl).toBe(pageUrl); + expect(res.posts[0].contentUrl).toBe( + "https://d.furaffinity.net/art/nielsdejong/1492781239/1492781239.nielsdejong_pool_party_fun_with_riven_and_zac_by_polkinart.jpg" + ); +}); diff --git a/src/engines/FurAffinity.ts b/src/engines/FurAffinity.ts index 6b8493d..a820d85 100644 --- a/src/engines/FurAffinity.ts +++ b/src/engines/FurAffinity.ts @@ -1,7 +1,7 @@ import { ScrapeEngine, ScrapeResult, ScrapedPost, ScrapedTag } from "../ScrapeEngine"; -import { guessContentType } from "../Utility"; +import { guessContentType, parseResolutionString } from "../Utility"; -export default class e621 implements ScrapeEngine { +export default class FurAffinity implements ScrapeEngine { name = "furaffinity"; canImport(url: Location): boolean { @@ -22,6 +22,14 @@ export default class e621 implements ScrapeEngine { // Set content type post.contentType = guessContentType(post.contentUrl); + // Set resolution + const infoTexts = Array.from(document.querySelector("section.info.text")?.children ?? []); + const sizeDiv = infoTexts.find((x) => x.querySelector("strong")?.innerText == "Size"); + if (sizeDiv) { + const resolution = parseResolutionString(sizeDiv.querySelector("span")?.innerText); + post.resolution = resolution; + } + // Set rating const ratingEls = Array.from(document.querySelectorAll("div.rating > span.rating-box")).map( (x) => x as HTMLSpanElement diff --git a/src/engines/Inkbunny.test.ts b/src/engines/Inkbunny.test.ts index 529a1c1..003aa59 100644 --- a/src/engines/Inkbunny.test.ts +++ b/src/engines/Inkbunny.test.ts @@ -7,6 +7,7 @@ test("get inkbunny.net post 2430530", async () => { expect(res.posts[0]).toHaveTag("comic"); expect(res.posts[0]).toHaveTag("flower"); expect(res.posts[0]).toHaveTag("medusa"); + expect(res.posts[0]).toHaveResolution([1062, 1521]); expect(res.posts[0].pageUrl).toBe(pageUrl); expect(res.posts[0].contentUrl).toBe("https://nl.ib.metapix.net/files/full/3562/3562592_vavacung_medusa.png"); }); diff --git a/src/engines/Inkbunny.ts b/src/engines/Inkbunny.ts index 0e10de8..25a4203 100644 --- a/src/engines/Inkbunny.ts +++ b/src/engines/Inkbunny.ts @@ -33,6 +33,13 @@ export default class Inkbunny implements ScrapeEngine { return result; } + // Set post resolution + const width = parseInt((document.getElementById("submission-origwidth"))?.value); + const height = parseInt((document.getElementById("submission-origheight"))?.value); + if (width != NaN && height != NaN) { + post.resolution = [width, height]; + } + // Set rating const ratingExp = new RegExp("Rating: (.*)"); const spanEls = Array.from(document.querySelectorAll("div > span")); diff --git a/src/engines/e621.test.ts b/src/engines/e621.test.ts new file mode 100644 index 0000000..f87ffa1 --- /dev/null +++ b/src/engines/e621.test.ts @@ -0,0 +1,14 @@ +import { scrapeUrl } from "../test/engine"; + +test("get e621.net post 380315", async () => { + const pageUrl = "https://e621.net/posts/380315?q=league_of_legends+rating%3Asafe+order%3Ascore"; + const res = await scrapeUrl(pageUrl); + expect(res.posts.length).toBe(1); + expect(res.posts[0]).toHaveTag("inkinesss", "artist"); + expect(res.posts[0]).toHaveTag("nasus_(lol)", "character"); + expect(res.posts[0]).toHaveTag("ambiguous_gender"); + expect(res.posts[0]).toHaveTag("low_res", "meta"); + expect(res.posts[0]).toHaveResolution([500, 500]); + expect(res.posts[0].pageUrl).toBe(pageUrl); + expect(res.posts[0].contentUrl).toBe("https://static1.e621.net/data/92/e7/92e71bd73ab219d80516c4d9adad3db5.jpg"); +}); diff --git a/src/engines/e621.ts b/src/engines/e621.ts index 0adc957..fc41150 100644 --- a/src/engines/e621.ts +++ b/src/engines/e621.ts @@ -37,6 +37,13 @@ export default class e621 implements ScrapeEngine { break; } + // Set resolution + const width = parseInt((document.querySelector("span[itemprop='width']"))?.innerText); + const height = parseInt((document.querySelector("span[itemprop='height']"))?.innerText); + if (width != NaN && height != NaN) { + post.resolution = [width, height]; + } + // Set tags const tagEls = Array.from(document.querySelectorAll("#tag-list > ul > li")).map((x) => x as HTMLLIElement);