/** * Metadata Extractor Content Script * Extracts page metadata from Open Graph tags, meta tags, and document properties */ /** * Extract metadata from the current page * @returns {object} Metadata object */ function extractMetadata() { // Helper function to get meta tag content const getMeta = (selector) => { const element = document.querySelector(selector); return element ? element.getAttribute('content') || '' : ''; }; // Extract title const title = getMeta('meta[property="og:title"]') || getMeta('meta[name="twitter:title"]') || document.querySelector('title')?.textContent || document.URL; // Extract description const description = getMeta('meta[property="og:description"]') || getMeta('meta[name="twitter:description"]') || getMeta('meta[name="description"]') || ''; // Extract image const imageUrl = getMeta('meta[property="og:image"]') || getMeta('meta[name="twitter:image"]') || ''; // Extract site name const hostname = new URL(document.URL).hostname; const siteName = getMeta('meta[property="og:site_name"]') || hostname; // Extract author const author = getMeta('meta[name="author"]') || getMeta('meta[property="article:author"]') || ''; // Extract type const type = getMeta('meta[property="og:type"]') || 'website'; return { url: document.URL, title: title.trim(), description: description.trim(), imageUrl: imageUrl.trim(), siteName: siteName.trim(), author: author.trim(), type: type.trim(), }; } // Listen for messages from popup chrome.runtime.onMessage.addListener((request, sender, sendResponse) => { if (request.action === 'extractMetadata') { const metadata = extractMetadata(); sendResponse(metadata); } }); // Also send metadata automatically if requested if (window === window.top) { // Only run in top frame, not iframes console.log('Metadata extractor loaded'); }