50 lines
1.4 KiB
TypeScript
50 lines
1.4 KiB
TypeScript
import { ScrapeEngineBase, ScrapeResult, ScrapedPost, ScrapedTag, ScrapeEngineFeature } from "../ScrapeEngine.js";
|
|
import { TagCategory } from "../BooruTypes.js";
|
|
|
|
export default class e621 extends ScrapeEngineBase {
|
|
name = "nozomi";
|
|
features: ScrapeEngineFeature[] = ["content", "tags", "tag_category"];
|
|
notes = ["Image preview might not work due to hotlink protection."];
|
|
supportedHosts = ["nozomi.la"];
|
|
|
|
scrapeDocument(document: Document): ScrapeResult {
|
|
const result = new ScrapeResult(this.name);
|
|
const post = new ScrapedPost();
|
|
post.pageUrl = document.location.href;
|
|
|
|
// Set image url
|
|
const downloadEl = document.querySelector(".post a") as HTMLAnchorElement;
|
|
post.contentUrl = downloadEl?.href;
|
|
|
|
// Set tags
|
|
const tagEls = Array.from(document.querySelectorAll(".sidebar li")).map((x) => x as HTMLLIElement);
|
|
|
|
for (const el of tagEls) {
|
|
const tagName = el.innerText;
|
|
let category: TagCategory | undefined;
|
|
|
|
switch (el.querySelector("a")?.className) {
|
|
// https://e621.net/help/api#tags_listing
|
|
case "copyright":
|
|
category = "copyright";
|
|
break;
|
|
case "character":
|
|
category = "character";
|
|
break;
|
|
case "artist":
|
|
category = "artist";
|
|
break;
|
|
}
|
|
|
|
if (tagName) {
|
|
const tag = new ScrapedTag(tagName, category);
|
|
post.tags.push(tag);
|
|
}
|
|
}
|
|
|
|
result.tryAddPost(post);
|
|
|
|
return result;
|
|
}
|
|
}
|