#!/usr/bin/env node /** * Script to move video attributes from excerptHtml to contentHtml * This fixes the issue where video background attributes are in excerptHtml * but ContentRenderer never sees them because it processes contentHtml */ const fs = require('fs'); const path = require('path'); const PROCESSED_DIR = path.join(__dirname, '..', 'data', 'processed'); // Function to extract video attributes from excerptHtml function extractVideoAttributes(excerptHtml) { if (!excerptHtml) return null; // Look for video attributes in vc_row elements const videoMp4Match = excerptHtml.match(/video_mp4="([^"]*)"/i); const videoWebmMatch = excerptHtml.match(/video_webm="([^"]*)"/i); const videoBgMatch = excerptHtml.match(/video_bg="([^"]*)"/i); // Also check for data attributes const dataVideoMp4Match = excerptHtml.match(/data-video-mp4="([^"]*)"/i); const dataVideoWebmMatch = excerptHtml.match(/data-video-webm="([^"]*)"/i); const dataVideoBgMatch = excerptHtml.match(/data-video-bg="([^"]*)"/i); const videoMp4 = videoMp4Match?.[1] || dataVideoMp4Match?.[1] || ''; const videoWebm = videoWebmMatch?.[1] || dataVideoWebmMatch?.[1] || ''; const videoBg = videoBgMatch?.[1] || dataVideoBgMatch?.[1] || ''; if (videoMp4 || videoWebm || videoBg) { return { videoMp4, videoWebm, videoBg }; } return null; } // Function to merge video attributes into contentHtml function mergeVideoAttributes(contentHtml, videoAttrs) { if (!contentHtml || !videoAttrs) return contentHtml; let merged = contentHtml; // Find the first vc-row element in contentHtml const vcRowRegex = /
]*>/i; const match = merged.match(vcRowRegex); if (match) { const existingDiv = match[0]; let newDiv = existingDiv; // Add video attributes if they don't already exist if (videoAttrs.videoMp4 && !existingDiv.includes('video_mp4=') && !existingDiv.includes('data-video-mp4=')) { newDiv = newDiv.replace('>', ` video_mp4="${videoAttrs.videoMp4}">`); } if (videoAttrs.videoWebm && !existingDiv.includes('video_webm=') && !existingDiv.includes('data-video-webm=')) { newDiv = newDiv.replace('>', ` video_webm="${videoAttrs.videoWebm}">`); } if (videoAttrs.videoBg && !existingDiv.includes('video_bg=') && !existingDiv.includes('data-video-bg=')) { newDiv = newDiv.replace('>', ` video_bg="${videoAttrs.videoBg}">`); } // Also add data attributes for better compatibility if (videoAttrs.videoMp4 && !existingDiv.includes('data-video-mp4=')) { newDiv = newDiv.replace('>', ` data-video-mp4="${videoAttrs.videoMp4}">`); } if (videoAttrs.videoWebm && !existingDiv.includes('data-video-webm=')) { newDiv = newDiv.replace('>', ` data-video-webm="${videoAttrs.videoWebm}">`); } if (videoAttrs.videoBg && !existingDiv.includes('data-video-bg=')) { newDiv = newDiv.replace('>', ` data-video-bg="${videoAttrs.videoBg}">`); } merged = merged.replace(existingDiv, newDiv); } return merged; } // Main function function main() { console.log('🎬 Fixing video attributes in processed data...\n'); // Load pages.json const pagesPath = path.join(PROCESSED_DIR, 'pages.json'); if (!fs.existsSync(pagesPath)) { console.error('❌ pages.json not found'); process.exit(1); } const pages = JSON.parse(fs.readFileSync(pagesPath, 'utf8')); let fixedCount = 0; // Process each page const updatedPages = pages.map(page => { const videoAttrs = extractVideoAttributes(page.excerptHtml); if (videoAttrs) { console.log(`📄 Page: ${page.slug} (${page.locale})`); console.log(` Found video attrs in excerpt: mp4="${videoAttrs.videoMp4}" webm="${videoAttrs.videoWebm}"`); // Merge into contentHtml const originalContent = page.contentHtml; page.contentHtml = mergeVideoAttributes(page.contentHtml, videoAttrs); if (page.contentHtml !== originalContent) { console.log(` ✅ Merged into contentHtml`); fixedCount++; } else { console.log(` ⚠️ Already present or no vc-row found`); } console.log(''); } return page; }); // Save updated pages fs.writeFileSync(pagesPath, JSON.stringify(updatedPages, null, 2)); // Also update the main wordpress-data.json if it exists const wordpressDataPath = path.join(PROCESSED_DIR, 'wordpress-data.json'); if (fs.existsSync(wordpressDataPath)) { const wordpressData = JSON.parse(fs.readFileSync(wordpressDataPath, 'utf8')); if (wordpressData.content && wordpressData.content.pages) { wordpressData.content.pages = updatedPages; fs.writeFileSync(wordpressDataPath, JSON.stringify(wordpressData, null, 2)); } } console.log(`✅ Fixed ${fixedCount} pages with video attributes`); console.log('📁 Files updated:'); console.log(` ${pagesPath}`); console.log(` ${wordpressDataPath}`); } if (require.main === module) { main(); }