49 lines
1.5 KiB
TypeScript
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;
|
|
}
|
|
}
|