Add basic bluesky support (image only)

pull/17/head
neobooru 2025-02-18 23:32:28 +01:00
parent ad2d1fe585
commit ed9580ea58
4 changed files with 37 additions and 1 deletions

View File

@ -1,6 +1,6 @@
{ {
"name": "neo-scraper", "name": "neo-scraper",
"version": "0.9.3", "version": "0.10.0",
"description": "Scrape a booru-like post object from the DOM.", "description": "Scrape a booru-like post object from the DOM.",
"type": "module", "type": "module",
"main": "dist/index.js", "main": "dist/index.js",

View File

@ -9,6 +9,7 @@ export default class NeoScraper {
if (useDefaultEngines) { if (useDefaultEngines) {
this.engines.push( this.engines.push(
new engines.AnimePictures(), new engines.AnimePictures(),
new engines.Bluesky(),
new engines.Danbooru(), new engines.Danbooru(),
new engines.e621(), new engines.e621(),
new engines.Ehentai(), new engines.Ehentai(),

34
src/engines/Bluesky.ts Normal file
View File

@ -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<HTMLImageElement>(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;
}
}

View File

@ -1,4 +1,5 @@
export { default as AnimePictures } from "./AnimePictures.js"; export { default as AnimePictures } from "./AnimePictures.js";
export { default as Bluesky } from "./Bluesky.js";
export { default as Danbooru } from "./Danbooru.js"; export { default as Danbooru } from "./Danbooru.js";
export { default as e621 } from "./e621.js"; export { default as e621 } from "./e621.js";
export { default as Ehentai } from "./Ehentai.js"; export { default as Ehentai } from "./Ehentai.js";