| <!DOCTYPE html> |
| <html lang="fr"> |
| <head> |
| <meta charset="UTF-8"> |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| <title>MegaStream - Films et Séries en illimité</title> |
| <script src="https://cdn.tailwindcss.com"></script> |
| <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"> |
| <style> |
| :root { |
| --primary: #e50914; |
| --dark: #141414; |
| --light: #f5f5f1; |
| } |
| |
| body { |
| background-color: var(--dark); |
| color: var(--light); |
| font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; |
| } |
| |
| .hero-gradient { |
| background: linear-gradient(to top, rgba(20, 20, 20, 1) 0%, rgba(20, 20, 20, 0.6) 60%, rgba(20, 20, 20, 0.3) 100%); |
| } |
| |
| .scroll-hide::-webkit-scrollbar { |
| display: none; |
| } |
| |
| .film-card:hover .play-icon { |
| opacity: 1; |
| transform: scale(1.1); |
| } |
| |
| .loading-spinner { |
| animation: spin 1s linear infinite; |
| } |
| |
| @keyframes spin { |
| 0% { transform: rotate(0deg); } |
| 100% { transform: rotate(360deg); } |
| } |
| </style> |
| </head> |
| <body class="min-h-screen"> |
| |
| <nav class="fixed w-full z-50 bg-gradient-to-b from-black to-transparent px-4 py-3"> |
| <div class="max-w-7xl mx-auto flex items-center justify-between"> |
| <div class="flex items-center"> |
| <span class="text-red-600 font-bold text-2xl mr-10">MEGASTREAM</span> |
| <div class="hidden md:flex space-x-6"> |
| <a href="#" class="text-white hover:text-gray-300">Accueil</a> |
| <a href="#" class="text-white hover:text-gray-300">Séries</a> |
| <a href="#" class="text-white hover:text-gray-300">Films</a> |
| <a href="#" class="text-white hover:text-gray-300">Nouveautés</a> |
| <a href="#" class="text-white hover:text-gray-300">Ma liste</a> |
| </div> |
| </div> |
| <div class="flex items-center space-x-4"> |
| <div class="relative"> |
| <input type="text" placeholder="Rechercher..." class="bg-black/70 text-white px-4 py-1 rounded border border-gray-600 focus:outline-none focus:border-white w-0 opacity-0 transition-all duration-300" id="search-input"> |
| <button class="text-white" id="search-btn"> |
| <i class="fas fa-search"></i> |
| </button> |
| </div> |
| <div class="hidden md:block text-white"> |
| <i class="fas fa-bell"></i> |
| </div> |
| <div class="w-8 h-8 rounded bg-red-600 flex items-center justify-center text-white font-bold"> |
| <i class="fas fa-user"></i> |
| </div> |
| </div> |
| </div> |
| </nav> |
|
|
| |
| <section class="relative h-screen"> |
| <div class="absolute inset-0 bg-black/50 z-10 hero-gradient"></div> |
| <div id="hero-background" class="w-full h-full bg-cover bg-center"></div> |
| |
| <div class="absolute bottom-0 left-0 z-20 p-16 w-full md:w-2/3" id="hero-content"> |
| <h1 class="text-4xl md:text-6xl font-bold mb-4" id="hero-title">Chargement...</h1> |
| <div class="flex space-x-4 mb-6" id="hero-details"> |
| <span class="text-green-500 font-semibold">97% Match</span> |
| <span>2023</span> |
| <span class="border border-gray-400 px-1">HD</span> |
| </div> |
| <p class="text-lg mb-6" id="hero-description">Chargement de la description...</p> |
| <div class="flex space-x-4"> |
| <button class="bg-white text-black px-6 py-2 rounded flex items-center hover:bg-opacity-80" id="play-btn"> |
| <i class="fas fa-play mr-2"></i> Lecture |
| </button> |
| <button class="bg-gray-600/70 text-white px-6 py-2 rounded flex items-center hover:bg-opacity-50" id="info-btn"> |
| <i class="fas fa-info-circle mr-2"></i> Plus d'infos |
| </button> |
| </div> |
| </div> |
| </section> |
|
|
| |
| <main class="relative z-30 -mt-32"> |
| <div class="space-y-12 pb-20"> |
| |
| <section class="px-4"> |
| <h2 class="text-xl font-bold mb-4">Tendances actuelles</h2> |
| <div class="relative"> |
| <div class="flex overflow-x-auto scroll-hide space-x-4 pb-4" id="trending"> |
| <div class="w-48 h-72 bg-gray-800 rounded animate-pulse"></div> |
| <div class="w-48 h-72 bg-gray-800 rounded animate-pulse"></div> |
| <div class="w-48 h-72 bg-gray-800 rounded animate-pulse"></div> |
| <div class="w-48 h-72 bg-gray-800 rounded animate-pulse"></div> |
| <div class="w-48 h-72 bg-gray-800 rounded animate-pulse"></div> |
| </div> |
| </div> |
| </section> |
|
|
| |
| <section class="px-4"> |
| <h2 class="text-xl font-bold mb-4">Populaire sur MegaStream</h2> |
| <div class="relative"> |
| <div class="flex overflow-x-auto scroll-hide space-x-4 pb-4" id="popular"> |
| <div class="w-48 h-72 bg-gray-800 rounded animate-pulse"></div> |
| <div class="w-48 h-72 bg-gray-800 rounded animate-pulse"></div> |
| <div class="w-48 h-72 bg-gray-800 rounded animate-pulse"></div> |
| <div class="w-48 h-72 bg-gray-800 rounded animate-pulse"></div> |
| <div class="w-48 h-72 bg-gray-800 rounded animate-pulse"></div> |
| </div> |
| </div> |
| </section> |
|
|
| |
| <section class="px-4"> |
| <h2 class="text-xl font-bold mb-4">Continuer à regarder</h2> |
| <div class="relative"> |
| <div class="flex overflow-x-auto scroll-hide space-x-4 pb-4" id="continue"> |
| <div class="w-48 h-72 bg-gray-800 rounded animate-pulse"></div> |
| <div class="w-48 h-72 bg-gray-800 rounded animate-pulse"></div> |
| <div class="w-48 h-72 bg-gray-800 rounded animate-pulse"></div> |
| <div class="w-48 h-72 bg-gray-800 rounded animate-pulse"></div> |
| <div class="w-48 h-72 bg-gray-800 rounded animate-pulse"></div> |
| </div> |
| </div> |
| </section> |
|
|
| |
| <section class="px-4"> |
| <h2 class="text-xl font-bold mb-4">Nouveautés</h2> |
| <div class="relative"> |
| <div class="flex overflow-x-auto scroll-hide space-x-4 pb-4" id="new-releases"> |
| <div class="w-48 h-72 bg-gray-800 rounded animate-pulse"></div> |
| <div class="w-48 h-72 bg-gray-800 rounded animate-pulse"></div> |
| <div class="w-48 h-72 bg-gray-800 rounded animate-pulse"></div> |
| <div class="w-48 h-72 bg-gray-800 rounded animate-pulse"></div> |
| <div class="w-48 h-72 bg-gray-800 rounded animate-pulse"></div> |
| </div> |
| </div> |
| </section> |
| </div> |
| </main> |
|
|
| |
| <footer class="bg-black text-gray-400 py-12 px-4"> |
| <div class="max-w-7xl mx-auto"> |
| <div class="flex flex-col md:flex-row justify-between"> |
| <div class="mb-8"> |
| <h3 class="text-white text-2xl font-bold mb-4">MEGASTREAM</h3> |
| <div class="flex space-x-4 text-2xl"> |
| <a href="#"><i class="fab fa-facebook"></i></a> |
| <a href="#"><i class="fab fa-instagram"></i></a> |
| <a href="#"><i class="fab fa-twitter"></i></a> |
| <a href="#"><i class="fab fa-youtube"></i></a> |
| </div> |
| </div> |
| <div class="grid grid-cols-2 md:grid-cols-4 gap-8"> |
| <div> |
| <h4 class="text-white mb-4">Navigation</h4> |
| <ul class="space-y-2"> |
| <li><a href="#" class="hover:text-white">Accueil</a></li> |
| <li><a href="#" class="hover:text-white">Séries</a></li> |
| <li><a href="#" class="hover:text-white">Films</a></li> |
| <li><a href="#" class="hover:text-white">Nouveautés</a></li> |
| </ul> |
| </div> |
| <div> |
| <h4 class="text-white mb-4">Compte</h4> |
| <ul class="space-y-2"> |
| <li><a href="#" class="hover:text-white">Mon compte</a></li> |
| <li><a href="#" class="hover:text-white">Abonnements</a></li> |
| <li><a href="#" class="hover:text-white">Historique</a></li> |
| <li><a href="#" class="hover:text-white">Liste de souhaits</a></li> |
| </ul> |
| </div> |
| <div> |
| <h4 class="text-white mb-4">Informations</h4> |
| <ul class="space-y-2"> |
| <li><a href="#" class="hover:text-white">À propos</a></li> |
| <li><a href="#" class="hover:text-white">Contact</a></li> |
| <li><a href="#" class="hover:text-white">Presse</a></li> |
| <li><a href="#" class="hover:text-white">Carrières</a></li> |
| </ul> |
| </div> |
| <div> |
| <h4 class="text-white mb-4">Légal</h4> |
| <ul class="space-y-2"> |
| <li><a href="#" class="hover:text-white">Conditions</a></li> |
| <li><a href="#" class="hover:text-white">Confidentialité</a></li> |
| <li><a href="#" class="hover:text-white">Cookies</a></li> |
| <li><a href="#" class="hover:text-white">RGPD</a></li> |
| </ul> |
| </div> |
| </div> |
| </div> |
| <div class="border-t border-gray-800 mt-12 pt-8 text-center"> |
| <p>© 2023 MegaStream. Tous droits réservés.</p> |
| </div> |
| </div> |
| </footer> |
|
|
| <script> |
| |
| const API_KEY = '3fd2be6f0c70a2a598f084ddfb75487c'; |
| const BASE_URL = 'https://api.themoviedb.org/3'; |
| const IMG_URL = 'https://image.tmdb.org/t/p/original'; |
| |
| |
| async function fetchMovies(endpoint, params = {}) { |
| const url = new URL(`${BASE_URL}${endpoint}`); |
| url.searchParams.append('api_key', API_KEY); |
| url.searchParams.append('language', 'fr-FR'); |
| |
| |
| Object.keys(params).forEach(key => { |
| url.searchParams.append(key, params[key]); |
| }); |
| |
| try { |
| const response = await fetch(url); |
| if (!response.ok) throw new Error('Erreur réseau'); |
| return await response.json(); |
| } catch (error) { |
| console.error('Erreur:', error); |
| return null; |
| } |
| } |
| |
| |
| function createMovieCard(movie, category) { |
| const card = document.createElement('div'); |
| card.className = 'flex-none w-48 md:w-56 relative group film-card'; |
| card.dataset.id = movie.id; |
| card.dataset.category = category; |
| |
| |
| const isTvShow = category === 'tv'; |
| const title = isTvShow ? movie.name : movie.title; |
| const year = isTvShow ? |
| (movie.first_air_date ? new Date(movie.first_air_date).getFullYear() : 'N/A') : |
| (movie.release_date ? new Date(movie.release_date).getFullYear() : 'N/A'); |
| |
| card.innerHTML = ` |
| <div class="relative rounded overflow-hidden"> |
| <img src="${movie.poster_path ? IMG_URL + movie.poster_path : 'https://via.placeholder.com/500x750?text=Image+non+disponible'}" |
| alt="${title}" |
| class="w-full h-auto rounded transition-transform duration-300 group-hover:scale-105"> |
| <div class="absolute inset-0 bg-black/50 opacity-0 group-hover:opacity-100 transition-opacity duration-300 flex items-center justify-center"> |
| <div class="play-icon opacity-0 transform scale-90 transition-all duration-300 text-white text-4xl bg-red-600 rounded-full w-16 h-16 flex items-center justify-center"> |
| <i class="fas fa-play"></i> |
| </div> |
| </div> |
| </div> |
| <div class="mt-2"> |
| <h3 class="font-semibold truncate">${title}</h3> |
| <div class="flex justify-between text-sm text-gray-400"> |
| <span>${year}</span> |
| <span>${isTvShow ? 'Série' : 'Film'}</span> |
| </div> |
| </div> |
| `; |
| |
| card.addEventListener('click', () => { |
| |
| updateHeroContent(movie, isTvShow); |
| |
| |
| window.scrollTo({top: 0, behavior: 'smooth'}); |
| }); |
| |
| return card; |
| } |
| |
| |
| function updateHeroContent(movie, isTvShow = false) { |
| const heroBg = document.getElementById('hero-background'); |
| const heroTitle = document.getElementById('hero-title'); |
| const heroDetails = document.getElementById('hero-details'); |
| const heroDescription = document.getElementById('hero-description'); |
| const playBtn = document.getElementById('play-btn'); |
| const infoBtn = document.getElementById('info-btn'); |
| |
| |
| heroBg.style.backgroundImage = `url(${movie.backdrop_path ? IMG_URL + movie.backdrop_path : 'https://via.placeholder.com/1920x1080?text=Image+non+disponible'})`; |
| |
| |
| heroTitle.textContent = isTvShow ? movie.name : movie.title; |
| |
| |
| const year = isTvShow ? |
| (movie.first_air_date ? new Date(movie.first_air_date).getFullYear() : 'N/A') : |
| (movie.release_date ? new Date(movie.release_date).getFullYear() : 'N/A'); |
| |
| heroDetails.innerHTML = ` |
| <span class="text-green-500 font-semibold">${Math.round(movie.vote_average * 10)}% Match</span> |
| <span>${year}</span> |
| <span class="border border-gray-400 px-1">HD</span> |
| `; |
| |
| |
| heroDescription.textContent = movie.overview || 'Aucune description disponible.'; |
| |
| |
| playBtn.dataset.id = movie.id; |
| playBtn.dataset.type = isTvShow ? 'tv' : 'movie'; |
| infoBtn.dataset.id = movie.id; |
| infoBtn.dataset.type = isTvShow ? 'tv' : 'movie'; |
| } |
| |
| |
| document.addEventListener('DOMContentLoaded', async () => { |
| |
| const trendingData = await fetchMovies('/trending/all/week'); |
| if (trendingData) { |
| const trendingSection = document.getElementById('trending'); |
| trendingSection.innerHTML = ''; |
| |
| trendingData.results.slice(0, 10).forEach(movie => { |
| const isTvShow = movie.media_type === 'tv'; |
| trendingSection.appendChild(createMovieCard(movie, isTvShow ? 'tv' : 'movie')); |
| }); |
| |
| |
| if (trendingData.results.length > 0) { |
| const firstItem = trendingData.results[0]; |
| updateHeroContent(firstItem, firstItem.media_type === 'tv'); |
| } |
| } |
| |
| |
| const popularData = await fetchMovies('/movie/popular'); |
| if (popularData) { |
| const popularSection = document.getElementById('popular'); |
| popularSection.innerHTML = ''; |
| |
| popularData.results.slice(0, 10).forEach(movie => { |
| popularSection.appendChild(createMovieCard(movie, 'movie')); |
| }); |
| } |
| |
| |
| const tvPopularData = await fetchMovies('/tv/popular'); |
| if (tvPopularData) { |
| const continueSection = document.getElementById('continue'); |
| continueSection.innerHTML = ''; |
| |
| tvPopularData.results.slice(0, 5).forEach(show => { |
| continueSection.appendChild(createMovieCard(show, 'tv')); |
| }); |
| } |
| |
| |
| const newReleasesData = await fetchMovies('/movie/now_playing'); |
| if (newReleasesData) { |
| const newReleasesSection = document.getElementById('new-releases'); |
| newReleasesSection.innerHTML = ''; |
| |
| newReleasesData.results.slice(0, 10).forEach(movie => { |
| newReleasesSection.appendChild(createMovieCard(movie, 'movie')); |
| }); |
| } |
| |
| |
| const searchBtn = document.getElementById('search-btn'); |
| const searchInput = document.getElementById('search-input'); |
| |
| searchBtn.addEventListener('click', () => { |
| searchInput.classList.toggle('w-64'); |
| searchInput.classList.toggle('opacity-100'); |
| searchInput.classList.toggle('ml-2'); |
| searchInput.focus(); |
| }); |
| |
| searchInput.addEventListener('keypress', async (e) => { |
| if (e.key === 'Enter' && searchInput.value.trim()) { |
| |
| const searchData = await fetchMovies('/search/multi', { |
| query: searchInput.value.trim(), |
| include_adult: false |
| }); |
| |
| if (searchData && searchData.results.length > 0) { |
| |
| const modal = document.createElement('div'); |
| modal.className = 'fixed inset-0 bg-black/90 z-50 p-8 overflow-y-auto'; |
| modal.innerHTML = ` |
| <div class="max-w-6xl mx-auto"> |
| <div class="flex justify-between items-center mb-8"> |
| <h2 class="text-2xl font-bold">Résultats pour "${searchInput.value.trim()}"</h2> |
| <button class="text-white text-2xl" id="close-search">×</button> |
| </div> |
| <div class="grid grid-cols-2 md:grid-cols-4 lg:grid-cols-6 gap-4" id="search-results"> |
| <!-- Les résultats seront ajoutés ici --> |
| </div> |
| </div> |
| `; |
| |
| document.body.appendChild(modal); |
| |
| |
| const searchResults = document.getElementById('search-results'); |
| searchData.results.forEach(item => { |
| if (item.media_type === 'movie' || item.media_type === 'tv') { |
| searchResults.appendChild(createMovieCard(item, item.media_type)); |
| } |
| }); |
| |
| |
| document.getElementById('close-search').addEventListener('click', () => { |
| document.body.removeChild(modal); |
| }); |
| } else { |
| alert('Aucun résultat trouvé'); |
| } |
| } |
| }); |
| |
| |
| document.getElementById('play-btn').addEventListener('click', () => { |
| const loading = document.createElement('div'); |
| loading.className = 'fixed inset-0 bg-black/90 z-50 flex items-center justify-center'; |
| loading.innerHTML = ` |
| <div class="text-center"> |
| <div class="loading-spinner inline-block w-16 h-16 border-4 border-red-600 border-t-transparent rounded-full mb-4"></div> |
| <p class="text-white text-xl">Préparation de la lecture...</p> |
| </div> |
| `; |
| document.body.appendChild(loading); |
| |
| |
| setTimeout(() => { |
| document.body.removeChild(loading); |
| alert('Fonctionnalité de lecture en cours de développement. En production, cela ouvrirait le lecteur vidéo.'); |
| }, 2000); |
| }); |
| }); |
| </script> |
| <p style="border-radius: 8px; text-align: center; font-size: 12px; color: #fff; margin-top: 16px;position: fixed; left: 8px; bottom: 8px; z-index: 10; background: rgba(0, 0, 0, 0.8); padding: 4px 8px;">Made with <img src="https://enzostvs-deepsite.hf.space/logo.svg" alt="DeepSite Logo" style="width: 16px; height: 16px; vertical-align: middle;display:inline-block;margin-right:3px;filter:brightness(0) invert(1);"><a href="https://enzostvs-deepsite.hf.space" style="color: #fff;text-decoration: underline;" target="_blank" >DeepSite</a> - 🧬 <a href="https://enzostvs-deepsite.hf.space?remix=docto41/ia-boot" style="color: #fff;text-decoration: underline;" target="_blank" >Remix</a></p></body> |
| </html> |