Update Bluesky.ts

Added a filter to only visible elements to reduce clutter from posts in feed.
master
Nes370 2026-10-13 23:46:36 -07:00
parent 1575a7a2f1
commit fe0a543bf4
1 changed files with 22 additions and 0 deletions

View File

@ -39,6 +39,8 @@ export default class Bluesky extends ScrapeEngineBase {
els = imgEls.filter((x) => x.src.indexOf("feed") != -1); els = imgEls.filter((x) => x.src.indexOf("feed") != -1);
} }
for (const el of els) { for (const el of els) {
if(!isVisible(el)) continue;
const post = new ScrapedPost(); const post = new ScrapedPost();
post.pageUrl = document.location.href; post.pageUrl = document.location.href;
post.contentUrl = getFullSizeImg(el.src); post.contentUrl = getFullSizeImg(el.src);
@ -50,6 +52,8 @@ export default class Bluesky extends ScrapeEngineBase {
document.querySelectorAll('video[poster^="https://video.bsky.app/watch"]') document.querySelectorAll('video[poster^="https://video.bsky.app/watch"]')
); );
for (const v of videoEls) { for (const v of videoEls) {
if(!isVisible(v)) continue;
const poster = v.getAttribute("poster"); const poster = v.getAttribute("poster");
if (!poster) continue; if (!poster) continue;
@ -102,3 +106,21 @@ export default class Bluesky extends ScrapeEngineBase {
} }
} }
} }
/**
* A lightweight visibility check. We use this rather than IntersectionObserver
* because scrapeDocument is synchronous and must return immediately.
*/
function isVisible(el: Element): boolean {
const rect = el.getBoundingClientRect();
if (rect.width === 0 || rect.height === 0) return false;
if (rect.bottom <= 0 || rect.top >= window.innerHeight) return false;
if (rect.right <= 0 || rect.left >= window.innerWidth) return false;
const style = window.getComputedStyle(el);
if (style.display === "none") return false;
if (style.visibility === "hidden") return false;
if (style.opacity === "0") return false;
return true;
}