diff --git a/package.json b/package.json index 59a246d..cfaa415 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "neo-scraper", - "version": "0.9.3", + "version": "0.10.0", "description": "Scrape a booru-like post object from the DOM.", "type": "module", "main": "dist/index.js", diff --git a/src/NeoScraper.ts b/src/NeoScraper.ts index 9271f41..e1dc61c 100644 --- a/src/NeoScraper.ts +++ b/src/NeoScraper.ts @@ -9,6 +9,7 @@ export default class NeoScraper { if (useDefaultEngines) { this.engines.push( new engines.AnimePictures(), + new engines.Bluesky(), new engines.Danbooru(), new engines.e621(), new engines.Ehentai(), diff --git a/src/engines/Bluesky.ts b/src/engines/Bluesky.ts new file mode 100644 index 0000000..ebbf881 --- /dev/null +++ b/src/engines/Bluesky.ts @@ -0,0 +1,34 @@ +import { ScrapeEngineBase, ScrapeResult, ScrapedPost, ScrapeEngineFeature } from "../ScrapeEngine.js"; + +function getFullSizeImg(link: string) { + return link.replace("/feed_thumbnail/", "/feed_fullsize/"); +} + +export default class Bluesky extends ScrapeEngineBase { + name = "bluesky"; + features: ScrapeEngineFeature[] = ["content"]; + notes = []; + supportedHosts = ["bsky.app"]; + + scrapeDocument(document: Document): ScrapeResult { + const result = new ScrapeResult(this.name); + const imgEls = Array.from(document.querySelectorAll("div > img")); + + let els = imgEls.filter((x) => x.src.indexOf("feed_fullsize") != -1); + + // Only add the 'normal' feed elements if no post is in fullscreen. + if (els.length == 0) { + this.log("Post is not fullscreen."); + els = imgEls.filter((x) => x.src.indexOf("feed") != -1); + } + + for (const el of els) { + const post = new ScrapedPost(); + post.pageUrl = document.location.href; + post.contentUrl = getFullSizeImg(el.src); + result.tryAddPost(post); + } + + return result; + } +} diff --git a/src/engines/index.ts b/src/engines/index.ts index f07d6e8..6693c94 100644 --- a/src/engines/index.ts +++ b/src/engines/index.ts @@ -1,4 +1,5 @@ export { default as AnimePictures } from "./AnimePictures.js"; +export { default as Bluesky } from "./Bluesky.js"; export { default as Danbooru } from "./Danbooru.js"; export { default as e621 } from "./e621.js"; export { default as Ehentai } from "./Ehentai.js";