32 lines
920 B
TypeScript
32 lines
920 B
TypeScript
import type { RichContent } from "../../model/interfaces.ts";
|
|
import type { RichContentProvider } from "../rich-content-service.ts";
|
|
import { extractOgTag, fetchWithTimeout } from "../rich-content-service.ts";
|
|
|
|
export const genericProvider: RichContentProvider = {
|
|
name: "generic",
|
|
|
|
matches(_url: string): boolean {
|
|
return true; // fallback — always matches
|
|
},
|
|
|
|
async fetch(url: string): Promise<RichContent> {
|
|
const res = await fetchWithTimeout(url);
|
|
const contentType = res.headers.get("content-type") ?? "";
|
|
|
|
if (!contentType.startsWith("text/html")) {
|
|
return { type: "generic", url };
|
|
}
|
|
|
|
const html = await res.text();
|
|
|
|
return {
|
|
type: "generic",
|
|
url,
|
|
title: extractOgTag(html, "title"),
|
|
description: extractOgTag(html, "description"),
|
|
thumbnailUrl: extractOgTag(html, "image"),
|
|
siteName: extractOgTag(html, "site_name"),
|
|
};
|
|
},
|
|
};
|