diff --git a/package.json b/package.json index c59fc7c..c520c54 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "neo-scraper", - "version": "0.2.4", + "version": "0.2.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 45893a4..2daff1d 100644 --- a/src/NeoScraper.ts +++ b/src/NeoScraper.ts @@ -9,6 +9,7 @@ export default class NeoScraper { if (useDefaultEngines) { this.engines.push( new engines.Danbooru(), + new engines.e621(), new engines.Gelbooru(), new engines.Moebooru(), new engines.Pixiv(), diff --git a/src/engines/e621.ts b/src/engines/e621.ts new file mode 100644 index 0000000..c56bf49 --- /dev/null +++ b/src/engines/e621.ts @@ -0,0 +1,68 @@ +import { ScrapeEngine, ScrapeResult, ScrapedPost, ScrapedTag } from "../ScrapeEngine"; +import { TagCategory } from "../BooruTypes"; + +export default class e621 implements ScrapeEngine { + name = "e621"; + + canImport(url: Location): boolean { + return url.host == "e621.net"; + } + + scrapeDocument(document: Document): ScrapeResult { + let result = new ScrapeResult(this.name); + + let post = new ScrapedPost(); + post.source = document.location.href; + + // Set image url + const downloadEl = document.querySelector("#image-download-link > a") as HTMLAnchorElement; + post.imageUrl = downloadEl?.href; + + // Set rating + const ratingEl = document.getElementById("post-rating-text") as HTMLSpanElement; + switch (ratingEl?.innerText) { + case "Safe": + post.rating = "safe"; + break; + case "Questionable": + post.rating = "sketchy"; + break; + case "Explicit": + post.rating = "unsafe"; + break; + } + + // Set tags + const tagEls = Array.from(document.querySelectorAll("#tag-list > ul > li")) + .map(x => x as HTMLLIElement); + + for (const el of tagEls) { + const tagName = (el.querySelector(".search-tag") as HTMLAnchorElement)?.innerText; + let category: TagCategory | undefined; + + switch (el.className) { + case "category-3": + category = "copyright"; + break; + case "category-4": + category = "character"; + break; + case "category-1": + category = "artist"; + break; + case "category-7": + category = "meta"; + break; + } + + if (tagName) { + let tag = new ScrapedTag(tagName, category); + post.tags.push(tag); + } + } + + result.tryAddPost(post); + + return result; + } +} diff --git a/src/engines/index.ts b/src/engines/index.ts index 747c786..f3ed304 100644 --- a/src/engines/index.ts +++ b/src/engines/index.ts @@ -1,4 +1,5 @@ export { default as Danbooru } from "./Danbooru"; +export { default as e621 } from "./e621"; export { default as Fallback } from "./Fallback"; export { default as Gelbooru } from "./Gelbooru"; export { default as Moebooru } from "./Moebooru";