oscarviedma

JavaScript OV Galería Videos - OV

Oct 2nd, 2025
711
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
HTML 10.37 KB | None | 0 0
  1. <script>
  2. // ========================================
  3. // CONFIGURACIÓN DEL REPRODUCTOR
  4. // ========================================
  5.  
  6. const galleryConfig = {
  7.     autoplay: true  // Reproducir siguiente video automáticamente
  8. };
  9.  
  10. // ========================================
  11. // CONFIGURA TUS VIDEOS AQUÍ
  12. // ========================================
  13.  
  14. const videos = [
  15.     {
  16.         url: 'youtube:mt6d1LlMX24',
  17.         title: 'Cómo crear un Slider Interactivo con selector de colores en Divi Builder sin plugins',
  18.         description: 'En este tutorial gratuito aprenderás a crear un slider interactivo con un selector de colores en Divi Builder. Y lo mejor es que lo haremos sin plugins. Este slider te puede servir para mostrar productos que tengan diferentes variantes de color en una sección principal. El ejemplo que hacemos está enfocado en autos, pero realmente puede ser aplicado a cualquier otro producto, siguiendo la misma lógica que te enseñaré en el tutorial. ¡Qué lo disfrutes!',
  19.         thumbnail: '', // Opcional: URL de imagen personalizada
  20.         duration: '34:52'
  21.     },
  22.     {
  23.         url: 'youtube:_5B0Mrg0vws',
  24.         title: 'Cómo crear una línea de tiempo (timeline) vertical con Divi Builder sin usar plugins',
  25.         description: 'Construir una línea de tiempo en Divi puede parecer un poco tedioso al principio debido a su estructura modular, pero en este tutorial te guiaré paso a paso, mostrándote trucos, buenas prácticas y soluciones creativas para lograr resultados sorprendentes.',
  26.         duration: '1:01:12'
  27.     },
  28.     {
  29.         url: 'youtube:U6wbOStq5mY',
  30.         title: 'Cómo crear un botón Call-to-Action Dropdown (botón desplegable) en Divi sin plugins',
  31.         description: 'En el diseño web moderno, optimizar el espacio y mejorar la experiencia de usuario son aspectos fundamentales. Una técnica efectiva para conseguirlo es implementar botones call-to-action (CTA) que, al interactuar con ellos, desplieguen un menú con opciones adicionales.',
  32.         duration: '23:51'
  33.     },
  34.   {
  35.         url: 'youtube:yAXnzTn7hQc',
  36.         title: 'Divi CPT Modules: Crea grids, grids con filtros y carruseles dinámicos en WordPress y Divi',
  37.         description: 'Si alguna vez has querido mostrar publicaciones personalizadas en Divi de una manera atractiva y dinámica, Divi CPT Modules es el plugin que necesitas. Con él, puedes diseñar grids, grids con filtros y carruseles dinámicos para cualquier tipo de contenido en WordPress y Divi, ya sea para una inmobiliaria, un blog, recetas, proyectos, portafolios y más.',
  38.         thumbnail: '',
  39.         duration: '2:20:45'
  40.     },
  41.     {
  42.         url: 'youtube:KWJwIWS63y8',
  43.         title: 'Cómo Animar tu Web Divi con ScrollReveal | Sin Plugins',
  44.         description: '📱 Aprende a crear animaciones elegantes en Divi sin necesidad de plugins. En este tutorial te muestro paso a paso cómo implementar ScrollReveal para dar vida a tus páginas web.',
  45.         duration: '35:40'
  46.     },
  47.     {
  48.         url: 'youtube:IHOUjruXOfA',
  49.         title: 'Descarga más de 30 Layouts GRATIS para Divi Builder con este Plugin 🔥',
  50.         description: 'Si eres usuario de Divi Builder, probablemente siempre estés en busca de formas de optimizar tus diseños y crear sitios web más rápidamente. Aquí es donde entra en juego el plugin Layouts for Divi, una herramienta gratuita que te permite acceder a más de 30 diseños profesionales de landing pages listos para usar en tus proyectos web.',
  51.         duration: '17:09'
  52.     },
  53.   {
  54.         url: 'youtube:QQtb6qXHFU4',
  55.         title: 'Crea un popup modal de video en Divi que se active al cargar la página sin plugins',
  56.         description: 'En este nuevo tutorial gratuito para mi canal de YouTube, te enseñaré cómo crear un popup modal de video en Divi que se active automáticamente al cargar la página, sin necesidad de usar plugins.',
  57.         thumbnail: '',
  58.         duration: '22:11'
  59.     },
  60.     {
  61.         url: 'youtube:m8WAGDboiFU',
  62.         title: 'Cómo mostrar un menú secundario al desplazarse por la página en Divi y WordPress sin plugins',
  63.         description: 'En este tutorial gratuito te mostraré cómo implementar un menú secundario que aparece al desplazarse por la página en Divi Theme Builder y WordPress, sin necesidad de recurrir a plugins adicionales.',
  64.         duration: '30:49'
  65.     },
  66.     {
  67.         url: 'youtube:4XmZPgIWt1Q',
  68.         title: 'Reproducir un video al desplazarse con GSAP, ScrollTrigger y Lottie en Divi sin plugins',
  69.         description: 'En este nuevo y emocionante tutorial gratuito, aprenderás a crear una sección principal con un video de fondo que responde al movimiento del scroll. Este impresionante efecto, conocido como "play video on scroll", permite que el video se reproduzca a medida que el usuario se desplaza por la página, captando la atención de manera única y eficaz.',
  70.         duration: '22:49'
  71.     },
  72.     {
  73.         url: 'youtube:sTEhXnydEr4',
  74.         title: 'Cómo animar Elementos Flotantes y crear un efecto "Stacking Sections Scroll" en Divi sin plugins',
  75.         description: '¿Has visto elementos animados flotando y «rebotando» en algunos diseños de sitios web? Esta es una tendencia que se ha utilizado durante un tiempo, pero aún no ha pasado de moda. Por tal motivo, en esta ocasión te mostraré cómo animar Elementos Flotantes en Divi. Además, como efecto extra, te enseñaré cómo implementar un efecto de desplazamiento con secciones apiladas, más conocido como «Stacking Sections Scroll». ¿Lo mejor? No necesitaremos plugins para lograr estos increíbles efectos.',
  76.         duration: '40:49'
  77.     }
  78. ];
  79.  
  80. // ========================================
  81. // CÓDIGO DE LA GALERÍA (NO MODIFICAR)
  82. // ========================================
  83.  
  84. let currentVideoIndex = 0;
  85.  
  86. function parseVideoUrl(url) {
  87.     if (url.includes(':') && !url.includes('http')) {
  88.        const [platform, id] = url.split(':');
  89.         return { platform, id };
  90.     }
  91.  
  92.     if (url.includes('youtube.com') || url.includes('youtu.be')) {
  93.         let id;
  94.         if (url.includes('youtu.be/')) {
  95.             id = url.split('youtu.be/')[1].split('?')[0];
  96.         } else {
  97.             id = url.split('v=')[1]?.split('&')[0];
  98.         }
  99.         return { platform: 'youtube', id };
  100.     }
  101.  
  102.     if (url.includes('vimeo.com')) {
  103.         const id = url.split('vimeo.com/')[1].split('?')[0];
  104.         return { platform: 'vimeo', id };
  105.     }
  106.  
  107.     return null;
  108. }
  109.  
  110. function getEmbedUrl(url, autoplay = false) {
  111.     const parsed = parseVideoUrl(url);
  112.     if (!parsed) return '';
  113.  
  114.     if (parsed.platform === 'youtube') {
  115.         if (galleryConfig.autoplay) {
  116.             return `https://www.youtube.com/embed/${parsed.id}?enablejsapi=1&autoplay=${autoplay ? 1 : 0}`;
  117.         }
  118.         return `https://www.youtube.com/embed/${parsed.id}?autoplay=${autoplay ? 1 : 0}`;
  119.     } else if (parsed.platform === 'vimeo') {
  120.         return `https://player.vimeo.com/video/${parsed.id}?autoplay=${autoplay ? 1 : 0}`;
  121.     }
  122.  
  123.     return '';
  124. }
  125.  
  126. function getThumbnail(url, customThumbnail) {
  127.     if (customThumbnail) return customThumbnail;
  128.  
  129.     const parsed = parseVideoUrl(url);
  130.     if (!parsed) return '';
  131.  
  132.     if (parsed.platform === 'youtube') {
  133.         return `https://img.youtube.com/vi/${parsed.id}/mqdefault.jpg`;
  134.     } else if (parsed.platform === 'vimeo') {
  135.         return `https://vumbnail.com/${parsed.id}.jpg`;
  136.     }
  137.  
  138.     return '';
  139. }
  140.  
  141. function loadVideo(index, autoplay = false) {
  142.     currentVideoIndex = index;
  143.     const video = videos[index];
  144.    
  145.     const iframe = document.getElementById('ovGvMainVideo');
  146.     iframe.src = getEmbedUrl(video.url, autoplay);
  147.    
  148.     document.getElementById('ovGvCurrentTitle').textContent = video.title;
  149.     document.getElementById('ovGvCurrentDescription').textContent = video.description || '';
  150.    
  151.     document.querySelectorAll('.ov-gv-video-item').forEach((item, i) => {
  152.         if (i === index) {
  153.             item.classList.add('ov-gv-active');
  154.             item.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
  155.         } else {
  156.             item.classList.remove('ov-gv-active');
  157.         }
  158.     });
  159. }
  160.  
  161. function createVideoList() {
  162.     const videoList = document.getElementById('ovGvVideoList');
  163.    
  164.     videos.forEach((video, index) => {
  165.         const item = document.createElement('div');
  166.         item.className = 'ov-gv-video-item';
  167.         if (index === 0) item.classList.add('ov-gv-active');
  168.        
  169.         const thumbnailUrl = getThumbnail(video.url, video.thumbnail);
  170.        
  171.         item.innerHTML = `
  172.             <div class="ov-gv-thumbnail-wrapper">
  173.                 <img src="${thumbnailUrl}" alt="${video.title}" class="ov-gv-thumbnail" loading="lazy">
  174.                 <span class="ov-gv-video-number">${index + 1}</span>
  175.                 ${video.duration ? `<span class="ov-gv-duration">${video.duration}</span>` : ''}
  176.             </div>
  177.             <div class="ov-gv-video-details">
  178.                 <div class="ov-gv-title">${video.title}</div>
  179.                 ${video.description ? `<div class="ov-gv-subtitle">${video.description}</div>` : ''}
  180.             </div>
  181.         `;
  182.        
  183.         item.addEventListener('click', () => loadVideo(index, true));
  184.         videoList.appendChild(item);
  185.     });
  186.  
  187.     document.getElementById('ovGvVideoCount').textContent = `${videos.length} videos`;
  188. }
  189.  
  190. function playNextVideo() {
  191.     if (currentVideoIndex < videos.length - 1) {
  192.        loadVideo(currentVideoIndex + 1, true);
  193.    } else if (galleryConfig.autoplay) {
  194.        loadVideo(0, true);
  195.    }
  196. }
  197.  
  198. window.addEventListener('message', function(event) {
  199.    if (event.origin === 'https://www.youtube.com' || event.origin === 'https://player.vimeo.com') {
  200.        try {
  201.            const data = typeof event.data === 'string' ? JSON.parse(event.data) : event.data;
  202.            
  203.            if (data.event === 'onStateChange' && data.info === 0) {
  204.                if (galleryConfig.autoplay) playNextVideo();
  205.            }
  206.            
  207.            if (data.event === 'ended') {
  208.                if (galleryConfig.autoplay) playNextVideo();
  209.            }
  210.        } catch (e) {}
  211.    }
  212. });
  213.  
  214. // Inicializar la galería cuando el DOM esté listo
  215. function initGallery() {
  216.    createVideoList();
  217.    loadVideo(0, false);
  218. }
  219.  
  220. if (document.readyState === 'loading') {
  221.    document.addEventListener('DOMContentLoaded', initGallery);
  222. } else {
  223.    initGallery();
  224. }
  225. </script>
Advertisement
Add Comment
Please, Sign In to add comment