'use client'; import { Tv, PlayCircle, RadioTower, WifiOff, PauseCircle, Volume2 } from 'lucide-react'; import { useState, useEffect, useRef } from 'react'; import { usePlayerStore } from '@/store/usePlayerStore'; import videojs from 'video.js'; import 'video.js/dist/video-js.css'; interface LivePlayerProps { url?: string; type: 'tv' | 'radio'; title?: string; } export function LivePlayer({ url, type, title }: LivePlayerProps) { const { isAudioPlaying, toggleAudio, setAudioUrl, audioVolume, setAudioVolume, isVideoActive, setVideoActive, setVideoUrl, setVideoType } = usePlayerStore(); const [processedUrl, setProcessedUrl] = useState(null); const [isYouTube, setIsYouTube] = useState(false); useEffect(() => { if (!url) { setProcessedUrl(null); return; } // YT Detection & Conversion if (url.includes('youtube.com/watch?v=') || url.includes('youtu.be/')) { const videoId = url.includes('watch?v=') ? url.split('v=')[1]?.split('&')[0] : url.split('/').pop(); if (videoId) { const ytUrl = `https://www.youtube.com/embed/${videoId}?autoplay=1&rel=0`; setProcessedUrl(ytUrl); setIsYouTube(true); if (type === 'tv') { setVideoUrl(ytUrl); setVideoType('youtube'); } } } else { setProcessedUrl(url); setIsYouTube(false); if (type === 'tv') { setVideoUrl(url); setVideoType('m3u8'); } else { setAudioUrl(url); } } }, [url, type, setAudioUrl, setVideoUrl, setVideoType]); // Handle inner Video Player Initialization const innerVideoRef = useRef(null); const innerPlayerRef = useRef(null); useEffect(() => { if (type === 'tv' && !isYouTube && processedUrl && innerVideoRef.current) { if (innerPlayerRef.current) { innerPlayerRef.current.dispose(); innerPlayerRef.current = null; } const videoElement = document.createElement('video-js'); videoElement.classList.add('vjs-fill', 'vjs-almeira'); innerVideoRef.current.innerHTML = ''; innerVideoRef.current.appendChild(videoElement); innerPlayerRef.current = videojs(videoElement, { autoplay: 'muted', controls: false, fluid: true, responsive: true, sources: [{ src: processedUrl, type: 'application/x-mpegURL' }] }); } return () => { if (innerPlayerRef.current) { innerPlayerRef.current.dispose(); innerPlayerRef.current = null; } }; }, [type, isYouTube, processedUrl]); if (!processedUrl) { return (
{/* Static Background Effect */}

SEÑAL PERDIDA

La transmisión de {type.toUpperCase()} no está disponible en este momento. Por favor, intenta más tarde.

{/* Decorative scanning line */}
); } return (
{type === 'tv' ? (
{isYouTube ? (