import type { RichContent } from "../../model/interfaces.ts"; import type { RichContentProvider } from "../rich-content-service.ts"; import { extractOgTag, fetchWithTimeout } from "../rich-content-service.ts"; const BANDCAMP_REGEX = /(?:^|\.)bandcamp\.com/; export const bandcampProvider: RichContentProvider = { name: "bandcamp", matches(url: string): boolean { try { return BANDCAMP_REGEX.test(new URL(url).hostname); } catch { return false; } }, async fetch(url: string): Promise { const res = await fetchWithTimeout(url); const contentType = res.headers.get("content-type") ?? ""; if (!contentType.startsWith("text/html")) { return { type: "bandcamp", siteName: "Bandcamp", url }; } const html = await res.text(); return { type: "bandcamp", siteName: "Bandcamp", url, title: extractOgTag(html, "title"), description: extractOgTag(html, "description"), thumbnailUrl: extractOgTag(html, "image"), }; }, };