1
0
silverbullet/plugs/editor/embed.ts
2023-08-28 17:12:15 +02:00

48 lines
1.0 KiB
TypeScript

import { YAML } from "$sb/syscalls.ts";
import type { WidgetContent } from "$sb/app_event.ts";
type EmbedConfig = {
url: string;
height?: number;
width?: number;
};
function extractYoutubeVideoId(url: string) {
let match = url.match(/youtube\.com\/watch\?v=([^&]+)/);
if (match) {
return match[1];
}
match = url.match(/youtu.be\/([^&]+)/);
if (match) {
return match[1];
}
return null;
}
export async function embedWidget(
bodyText: string,
): Promise<WidgetContent> {
try {
const data: EmbedConfig = await YAML.parse(bodyText) as any;
let url = data.url;
const youtubeVideoId = extractYoutubeVideoId(url);
if (youtubeVideoId) {
url = `https://www.youtube.com/embed/${youtubeVideoId}`;
// Sensible video defaults
data.width = data.width || 560;
data.height = data.height || 315;
}
return {
url,
height: data.height,
width: data.width,
};
} catch (e: any) {
return {
html: `ERROR: Could not parse body as YAML: ${e.message}`,
script: "",
};
}
}