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.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}
`;
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.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();