50 lines
1.4 KiB
TypeScript
50 lines
1.4 KiB
TypeScript
"use server";
|
|
|
|
import * as cheerio from "cheerio";
|
|
|
|
export async function extractMetaData(url: string) {
|
|
if (!url) {
|
|
return { error: "URL is required." };
|
|
}
|
|
|
|
let formattedUrl = url;
|
|
if (!/^https?:\/\//i.test(url)) {
|
|
formattedUrl = `https://${url}`;
|
|
}
|
|
|
|
try {
|
|
const response = await fetch(formattedUrl, {
|
|
headers: {
|
|
"User-Agent":
|
|
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
|
|
},
|
|
});
|
|
|
|
if (!response.ok) {
|
|
return { error: `Failed to fetch URL. Status: ${response.status}` };
|
|
}
|
|
|
|
const html = await response.text();
|
|
const $ = cheerio.load(html);
|
|
|
|
const title =
|
|
$('meta[property="og:title"]').attr("content") ||
|
|
$("title").text() ||
|
|
"No title found";
|
|
const description =
|
|
$('meta[property="og:description"]').attr("content") ||
|
|
$('meta[name="description"]').attr("content") ||
|
|
"No description found";
|
|
const image = $('meta[property="og:image"]').attr("content") || null;
|
|
|
|
return { data: { title, description, image } };
|
|
} catch (error) {
|
|
console.error(error);
|
|
if (error instanceof Error && error.message.includes("Invalid URL")) {
|
|
return {
|
|
error: "The provided URL is not valid. Please check and try again.",
|
|
};
|
|
}
|
|
return { error: "An unexpected error occurred while fetching the URL." };
|
|
}
|
|
} |