const TMDB_API_KEY = '3fd2be6f0c70a2a598f084ddfb75487c'; const TMDB_IMAGE_BASE = 'https://image.tmdb.org/t/p/original'; let currentHeroIndex = 0; let trendingMovies = []; function updateHeroSlide() { const movie = trendingMovies[currentHeroIndex]; const heroElement = document.getElementById('trending-hero'); heroElement.style.backgroundImage = `linear-gradient(to top, #0f171e, transparent), url(${TMDB_IMAGE_BASE}${movie.backdrop_path})`; document.getElementById('hero-title').textContent = movie.title; document.getElementById('hero-overview').textContent = movie.overview; heroElement.onclick = () => openModal(movie.id, 'movie'); updateDots(); } function updateDots() { const dotsContainer = document.getElementById('trending-dots'); dotsContainer.innerHTML = trendingMovies.slice(0, 5).map((_, index) => `
`).join(''); dotsContainer.onclick = e => e.stopPropagation(); } function setHeroSlide(index) { event.stopPropagation(); currentHeroIndex = index; updateHeroSlide(); } function autoAdvanceHero() { currentHeroIndex = (currentHeroIndex + 1) % Math.min(trendingMovies.length, 5); updateHeroSlide(); } async function fetchTMDBData(endpoint) { const response = await fetch(`https://api.themoviedb.org/3${endpoint}?api_key=${TMDB_API_KEY}`); return await response.json(); } async function searchTMDB(query) { if (!query) return []; const response = await fetch(`https://api.themoviedb.org/3/search/multi?api_key=${TMDB_API_KEY}&query=${encodeURIComponent(query)}`); const data = await response.json(); return data.results.filter(item => item.media_type !== 'person' && item.poster_path && item.vote_average > 0); } let searchTimeout; const searchInput = document.getElementById('search-input'); const searchResults = document.getElementById('search-results'); searchInput.addEventListener('input', e => { clearTimeout(searchTimeout); const query = e.target.value; if (query.length < 2) { searchResults.style.display = 'none'; return; } searchTimeout = setTimeout(async () => { const results = await searchTMDB(query); displaySearchResults(results); }, 300); }); function displaySearchResults(results) { searchResults.innerHTML = ''; if (results.length === 0) { searchResults.style.display = 'none'; return; } results.slice(0, 6).forEach(item => { const div = document.createElement('div'); div.className = 'search-result-item'; div.innerHTML = ` ${item.title || item.name}
${item.title || item.name}
★ ${item.vote_average.toFixed(1)}
`; div.onclick = () => { openModal(item.id, item.media_type); searchResults.style.display = 'none'; searchInput.value = ''; }; searchResults.appendChild(div); }); searchResults.style.display = 'block'; } document.addEventListener('click', e => { if (!searchResults.contains(e.target) && e.target !== searchInput) { searchResults.style.display = 'none'; } }); async function initializeApp() { const trending = await fetchTMDBData('/trending/movie/day'); trendingMovies = trending.results.filter(movie => movie.backdrop_path && movie.vote_average); updateHeroSlide(); setInterval(autoAdvanceHero, 5000); const [newMovies, newTV] = await Promise.all([fetchTMDBData('/movie/now_playing'), fetchTMDBData('/tv/on_the_air')]); const newReleasesContainer = document.getElementById('new-releases'); const combinedNew = [...newMovies.results, ...newTV.results].sort(() => Math.random() - 0.5).slice(0, 20); combinedNew.forEach(item => { const type = item.title ? 'movie' : 'tv'; const card = createMovieCard(item, type); if (card) newReleasesContainer.appendChild(card); }); const topMovies = await fetchTMDBData('/movie/top_rated'); const topMoviesContainer = document.getElementById('top-movies'); topMovies.results.forEach(movie => { const card = createMovieCard(movie, 'movie'); if (card) topMoviesContainer.appendChild(card); }); const topTV = await fetchTMDBData('/tv/top_rated'); const topTVContainer = document.getElementById('top-tv'); topTV.results.forEach(show => { const card = createMovieCard(show, 'tv'); if (card) topTVContainer.appendChild(card); }); } function createMovieCard(item, type) { if (!item.poster_path || !item.vote_average) return null; const div = document.createElement('div'); div.className = 'movie-card'; div.innerHTML = ` ${item.title || item.name}
${item.title || item.name}
`; div.onclick = () => openModal(item.id, type); return div; } async function openModal(id, type) { const modal = document.getElementById('modal'); const iframe = document.getElementById('player-iframe'); const loader = document.getElementById('loader'); modal.style.display = 'block'; iframe.style.opacity = '0'; loader.style.display = 'block'; const [details, credits] = await Promise.all([ fetchTMDBData(`/${type}/${id}`), fetchTMDBData(`/${type}/${id}/credits`) ]); const movieDetails = document.createElement('div'); movieDetails.className = 'movie-details'; let seasonEpisodeHTML = ''; if (type === 'tv') { const seasons = details.seasons.filter(s => s.season_number > 0); seasonEpisodeHTML = `
`; } movieDetails.innerHTML = `

${details.title || details.name}

${new Date(details.release_date || details.first_air_date).getFullYear()} ${details.vote_average.toFixed(1)} ★ ${details.runtime || details.episode_run_time?.[0] || ''} min

${details.overview}

${seasonEpisodeHTML}

Cast

${credits.cast.slice(0, 6).map(actor => actor.profile_path ? `
${actor.name}
${actor.name}
${actor.character}
` : '').join('')}
`; const modalContent = document.querySelector('.modal-content'); modalContent.innerHTML = ''; const iframeContainer = document.createElement('div'); iframeContainer.className = 'iframe-container'; iframeContainer.innerHTML = ` ×
`; modalContent.appendChild(iframeContainer); modalContent.appendChild(movieDetails); const newIframe = document.getElementById('player-iframe'); if (type === 'movie') { newIframe.src = `https://picfy.xyz/embed/movie/${id}`; } else { newIframe.src = `https://picfy.xyz/embed/tv/${id}/1/1`; } newIframe.onload = () => { document.getElementById('loader').style.display = 'none'; newIframe.style.opacity = '1'; }; } async function updateEpisodes(showId) { const seasonSelect = document.getElementById('season-select'); const episodeSelect = document.getElementById('episode-select'); const seasonNum = seasonSelect.value; const seasonDetails = await fetchTMDBData(`/tv/${showId}/season/${seasonNum}`); episodeSelect.innerHTML = seasonDetails.episodes.map(episode => `` ).join(''); updatePlayer(showId); } function updatePlayer(showId) { const seasonSelect = document.getElementById('season-select'); const episodeSelect = document.getElementById('episode-select'); const iframe = document.getElementById('player-iframe'); const loader = document.getElementById('loader'); loader.style.display = 'block'; iframe.style.opacity = '0'; iframe.src = `https://picfy.xyz/embed/tv/${showId}/${seasonSelect.value}/${episodeSelect.value}`; iframe.onload = () => { loader.style.display = 'none'; iframe.style.opacity = '1'; }; } function closeModal() { const modal = document.getElementById('modal'); const iframe = document.getElementById('player-iframe'); iframe.src = ''; modal.style.display = 'none'; } document.getElementById('modal').addEventListener('click', e => { if (e.target.id === 'modal') { closeModal(); } }); document.querySelectorAll('.carousel-arrow').forEach(arrow => { arrow.addEventListener('click', () => { const carousel = arrow.parentElement.querySelector('.carousel'); const scrollAmount = 400; if (arrow.classList.contains('prev')) { carousel.scrollLeft -= scrollAmount; } else { carousel.scrollLeft += scrollAmount; } }); }); initializeApp();