neo-scraper/src/engines/Fallback.ts

49 lines
1.5 KiB
TypeScript

import { ScrapeEngine, ScrapeResult, ScrapedPost, ContentType } from "../ScrapeEngine";
class MediaElement {
constructor(
public readonly contentType: ContentType,
public readonly contentUrl: string,
public readonly size: number
) {}
}
export default class Fallback implements ScrapeEngine {
name = "fallback";
canImport(location: Location): boolean {
return false;
}
scrapeDocument(document: Document): ScrapeResult {
// Get all img elements.
const largestImgElement = Array.from(document.getElementsByTagName("img")).map(
(x) => new MediaElement("image", x.src, x.width * x.height)
);
// Get all video elements that have at least one source (child node).
const largestVideoElement = Array.from(document.getElementsByTagName("video")).flatMap((x) => {
const source = x.querySelector("source")?.src;
if (source != undefined) return new MediaElement("video", source, x.videoWidth * x.videoHeight);
return []; // Skip this item because it does not have a source.
});
// Get the largest media element.
const largestMediaElement = [...largestImgElement, ...largestVideoElement].reduce((a, b) =>
a?.size > b?.size ? a : b
);
let result = new ScrapeResult(this.name);
if (largestMediaElement) {
let post = new ScrapedPost();
post.pageUrl = document.location.href;
post.contentUrl = largestMediaElement.contentUrl;
post.contentType = largestMediaElement.contentType;
result.posts.push(post);
}
return result;
}
}