Spaces:
Running
Running
Add 2 files
Browse files- index.html +495 -48
- prompts.txt +4 -1
index.html
CHANGED
@@ -3,7 +3,7 @@
|
|
3 |
<head>
|
4 |
<meta charset="UTF-8">
|
5 |
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
6 |
-
<title>CineStream - Streaming Automatique</title>
|
7 |
<script src="https://cdn.tailwindcss.com"></script>
|
8 |
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
|
9 |
<script>
|
@@ -15,6 +15,7 @@
|
|
15 |
secondary: '#8b5cf6',
|
16 |
dark: '#1e1b4b',
|
17 |
light: '#f5f3ff',
|
|
|
18 |
},
|
19 |
fontFamily: {
|
20 |
sans: ['Inter', 'sans-serif'],
|
@@ -203,6 +204,173 @@
|
|
203 |
margin-left: 5px;
|
204 |
opacity: 0.8;
|
205 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
206 |
</style>
|
207 |
</head>
|
208 |
<body class="min-h-screen">
|
@@ -212,7 +380,7 @@
|
|
212 |
<div class="flex items-center justify-between h-16">
|
213 |
<div class="flex items-center">
|
214 |
<div class="flex-shrink-0">
|
215 |
-
<span class="text-2xl font-bold gradient-text">CineStream</span>
|
216 |
</div>
|
217 |
<div class="hidden md:block ml-10">
|
218 |
<div class="flex space-x-4">
|
@@ -232,7 +400,11 @@
|
|
232 |
<i class="fas fa-search"></i>
|
233 |
</button>
|
234 |
</div>
|
235 |
-
<
|
|
|
|
|
|
|
|
|
236 |
<i class="fas fa-user-circle text-xl"></i>
|
237 |
</button>
|
238 |
</div>
|
@@ -249,6 +421,42 @@
|
|
249 |
<!-- Main Content -->
|
250 |
<main class="pt-24 pb-12">
|
251 |
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
252 |
<!-- Featured Section -->
|
253 |
<section class="mb-12">
|
254 |
<div class="flex justify-between items-center mb-6">
|
@@ -295,8 +503,8 @@
|
|
295 |
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
296 |
<div class="grid grid-cols-1 md:grid-cols-4 gap-8">
|
297 |
<div>
|
298 |
-
<h3 class="text-white text-lg font-semibold mb-4">CineStream</h3>
|
299 |
-
<p class="text-sm">La
|
300 |
</div>
|
301 |
<div>
|
302 |
<h3 class="text-white text-lg font-semibold mb-4">Navigation</h3>
|
@@ -326,7 +534,7 @@
|
|
326 |
</div>
|
327 |
</div>
|
328 |
<div class="border-t border-gray-800 mt-8 pt-8 text-sm text-center">
|
329 |
-
<p>© 2023 CineStream. Tous droits réservés.</p>
|
330 |
</div>
|
331 |
</div>
|
332 |
</footer>
|
@@ -354,6 +562,15 @@
|
|
354 |
<p id="modal-overview" class="text-gray-300 mb-4"></p>
|
355 |
<div id="modal-genres" class="flex flex-wrap gap-2 mb-4"></div>
|
356 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
357 |
<!-- Serveurs de streaming -->
|
358 |
<div class="mb-4">
|
359 |
<h4 class="text-sm font-semibold text-gray-400 mb-2">CHOISIR UN SERVEUR :</h4>
|
@@ -376,6 +593,12 @@
|
|
376 |
<button onclick="selectServer('autoembed')" class="server-btn inactive" data-server="autoembed">
|
377 |
<i class="fas fa-robot mr-1"></i> AutoEmbed <span class="server-quality">Auto</span>
|
378 |
</button>
|
|
|
|
|
|
|
|
|
|
|
|
|
379 |
</div>
|
380 |
</div>
|
381 |
|
@@ -384,7 +607,7 @@
|
|
384 |
Fermer
|
385 |
</button>
|
386 |
<button id="watch-now-btn" onclick="startStreaming()" class="w-full inline-flex justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-green-600 text-base font-medium text-white hover:bg-green-700 focus:outline-none sm:ml-3 sm:w-auto sm:text-sm">
|
387 |
-
<i class="fas fa-play mr-2"></i> Lecture auto
|
388 |
</button>
|
389 |
</div>
|
390 |
</div>
|
@@ -397,7 +620,13 @@
|
|
397 |
<!-- Streaming Window (hidden by default) -->
|
398 |
<div id="streaming-window" class="streaming-window hidden">
|
399 |
<div class="streaming-header">
|
400 |
-
<
|
|
|
|
|
|
|
|
|
|
|
|
|
401 |
<button onclick="closeStreamingWindow()" class="text-gray-400 hover:text-white">
|
402 |
<i class="fas fa-times text-xl"></i>
|
403 |
</button>
|
@@ -407,15 +636,21 @@
|
|
407 |
<!-- Contenu du lecteur sera chargé ici -->
|
408 |
<div id="stream-loading" class="stream-loading w-full h-full">
|
409 |
<div class="stream-loading-spinner"></div>
|
410 |
-
<p class="text-gray-300">
|
411 |
</div>
|
412 |
</div>
|
413 |
</div>
|
414 |
<div class="streaming-controls">
|
415 |
-
<div class="flex
|
416 |
-
<
|
417 |
-
|
418 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
419 |
</div>
|
420 |
<div>
|
421 |
<button onclick="toggleFullscreen()" class="stream-btn px-3 py-1 bg-gray-700 hover:bg-gray-600 text-white rounded-full text-sm">
|
@@ -430,7 +665,7 @@
|
|
430 |
const API_KEY = 'c45a857c193f6302f2b5061c3b85e743'; // Clé API TMDB valide
|
431 |
const BASE_URL = 'https://api.themoviedb.org/3';
|
432 |
|
433 |
-
//
|
434 |
const STREAMING_SERVERS = {
|
435 |
superembed: {
|
436 |
name: 'SuperEmbed',
|
@@ -438,7 +673,13 @@
|
|
438 |
autoPlay: true,
|
439 |
requiresTMDB: true,
|
440 |
requiresIMDB: false,
|
441 |
-
quality: 'HD'
|
|
|
|
|
|
|
|
|
|
|
|
|
442 |
},
|
443 |
vidsrc: {
|
444 |
name: 'VidSrc',
|
@@ -446,7 +687,11 @@
|
|
446 |
autoPlay: true,
|
447 |
requiresTMDB: true,
|
448 |
requiresIMDB: false,
|
449 |
-
quality: 'Multi-Q'
|
|
|
|
|
|
|
|
|
450 |
},
|
451 |
'2embed': {
|
452 |
name: '2Embed',
|
@@ -454,7 +699,11 @@
|
|
454 |
autoPlay: true,
|
455 |
requiresTMDB: false,
|
456 |
requiresIMDB: true,
|
457 |
-
quality: '1080p'
|
|
|
|
|
|
|
|
|
458 |
},
|
459 |
databasegdrive: {
|
460 |
name: 'GDrive Player',
|
@@ -462,7 +711,11 @@
|
|
462 |
autoPlay: true,
|
463 |
requiresTMDB: true,
|
464 |
requiresIMDB: false,
|
465 |
-
quality: '4K'
|
|
|
|
|
|
|
|
|
466 |
},
|
467 |
multiembed: {
|
468 |
name: 'MultiEmbed',
|
@@ -470,7 +723,11 @@
|
|
470 |
autoPlay: true,
|
471 |
requiresTMDB: true,
|
472 |
requiresIMDB: false,
|
473 |
-
quality: 'HD'
|
|
|
|
|
|
|
|
|
474 |
},
|
475 |
autoembed: {
|
476 |
name: 'AutoEmbed',
|
@@ -478,7 +735,35 @@
|
|
478 |
autoPlay: true,
|
479 |
requiresTMDB: true,
|
480 |
requiresIMDB: false,
|
481 |
-
quality: 'Auto'
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
482 |
}
|
483 |
};
|
484 |
|
@@ -491,6 +776,8 @@
|
|
491 |
let currentMovieId = null;
|
492 |
let currentIMDBId = null;
|
493 |
let selectedServer = 'superembed';
|
|
|
|
|
494 |
|
495 |
// Fonction utilitaire pour faire les requêtes API
|
496 |
async function fetchAPI(endpoint, params = {}) {
|
@@ -499,7 +786,6 @@
|
|
499 |
// Ajouter les paramètres par défaut
|
500 |
const defaultParams = {
|
501 |
language: 'fr-FR',
|
502 |
-
page: currentPage,
|
503 |
api_key: API_KEY
|
504 |
};
|
505 |
|
@@ -537,8 +823,144 @@
|
|
537 |
searchMovies();
|
538 |
}
|
539 |
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
540 |
});
|
541 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
542 |
// Charger les films
|
543 |
async function loadMovies() {
|
544 |
if (isLoading) return;
|
@@ -548,25 +970,24 @@
|
|
548 |
|
549 |
try {
|
550 |
let data;
|
|
|
|
|
|
|
|
|
551 |
|
552 |
if (currentSearch) {
|
553 |
data = await fetchAPI('/search/movie', {
|
554 |
-
|
555 |
-
|
556 |
-
page: currentPage
|
557 |
});
|
558 |
} else if (currentGenre) {
|
559 |
data = await fetchAPI('/discover/movie', {
|
560 |
-
|
561 |
-
include_video: false,
|
562 |
-
sort_by: 'popularity.desc',
|
563 |
with_genres: currentGenre,
|
564 |
-
|
565 |
});
|
566 |
} else {
|
567 |
-
data = await fetchAPI(`/movie/${currentFilter}`,
|
568 |
-
page: currentPage
|
569 |
-
});
|
570 |
}
|
571 |
|
572 |
totalPages = data.total_pages || 1;
|
@@ -629,8 +1050,8 @@
|
|
629 |
<span class="text-gray-400 text-sm ml-auto">${movie.release_date ? movie.release_date.substring(0, 4) : 'N/A'}</span>
|
630 |
</div>
|
631 |
<div class="mt-3">
|
632 |
-
<button onclick="startAutoStreaming(${movie.id}, '${movie.title
|
633 |
-
<i class="fas fa-
|
634 |
</button>
|
635 |
<button onclick="showMovieDetails(${movie.id})" class="w-full mt-2 px-3 py-2 bg-gray-700 hover:bg-gray-600 text-white rounded text-sm">
|
636 |
<i class="fas fa-info-circle mr-1"></i> Détails
|
@@ -640,6 +1061,9 @@
|
|
640 |
<div class="auto-server-badge">
|
641 |
<i class="fas fa-bolt mr-1"></i> AutoPlay
|
642 |
</div>
|
|
|
|
|
|
|
643 |
</div>
|
644 |
`;
|
645 |
|
@@ -803,6 +1227,16 @@
|
|
803 |
genresContainer.innerHTML = '<span class="text-gray-400 text-sm">Aucun genre spécifié</span>';
|
804 |
}
|
805 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
806 |
// Afficher la modal
|
807 |
document.getElementById('movie-modal').classList.remove('hidden');
|
808 |
} catch (error) {
|
@@ -819,17 +1253,18 @@
|
|
819 |
// Sélectionner un serveur de streaming
|
820 |
function selectServer(serverId) {
|
821 |
selectedServer = serverId;
|
|
|
822 |
|
823 |
-
//
|
824 |
-
|
825 |
-
|
826 |
-
|
827 |
-
|
828 |
-
|
829 |
-
|
830 |
-
|
831 |
-
|
832 |
-
}
|
833 |
}
|
834 |
|
835 |
// Démarrer le streaming depuis la modal
|
@@ -854,7 +1289,7 @@
|
|
854 |
playerContainer.innerHTML = `
|
855 |
<div id="stream-loading" class="stream-loading w-full h-full">
|
856 |
<div class="stream-loading-spinner"></div>
|
857 |
-
<p class="text-gray-300"
|
858 |
</div>
|
859 |
`;
|
860 |
|
@@ -877,6 +1312,9 @@
|
|
877 |
<i class="fas fa-exclamation-triangle text-4xl mb-4"></i>
|
878 |
<p class="text-lg">Impossible de trouver l'ID IMDB pour ce film</p>
|
879 |
<p class="text-sm text-gray-400 mt-2">Essayez avec un autre serveur</p>
|
|
|
|
|
|
|
880 |
</div>
|
881 |
`;
|
882 |
return;
|
@@ -896,9 +1334,15 @@
|
|
896 |
streamingUrl = serverConfig.url + movieId;
|
897 |
}
|
898 |
|
899 |
-
// Ajouter
|
900 |
-
if (serverConfig.autoPlay) {
|
901 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
902 |
}
|
903 |
|
904 |
// Créer l'iframe pour le lecteur vidéo
|
@@ -952,7 +1396,10 @@
|
|
952 |
const nextIndex = (currentIndex + 1) % servers.length;
|
953 |
|
954 |
selectedServer = servers[nextIndex];
|
|
|
955 |
startAutoStreaming(currentMovieId, document.getElementById('streaming-title').textContent);
|
|
|
|
|
956 |
}
|
957 |
|
958 |
// Fermer la fenêtre de streaming
|
@@ -964,7 +1411,7 @@
|
|
964 |
|
965 |
// Changer la qualité de streaming (simulé)
|
966 |
function changeQuality(quality) {
|
967 |
-
|
968 |
// En réalité, vous devriez mettre à jour la source du lecteur vidéo
|
969 |
}
|
970 |
|
|
|
3 |
<head>
|
4 |
<meta charset="UTF-8">
|
5 |
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
6 |
+
<title>CineStream AI - Streaming Automatique Intelligent</title>
|
7 |
<script src="https://cdn.tailwindcss.com"></script>
|
8 |
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
|
9 |
<script>
|
|
|
15 |
secondary: '#8b5cf6',
|
16 |
dark: '#1e1b4b',
|
17 |
light: '#f5f3ff',
|
18 |
+
ai: '#10b981'
|
19 |
},
|
20 |
fontFamily: {
|
21 |
sans: ['Inter', 'sans-serif'],
|
|
|
204 |
margin-left: 5px;
|
205 |
opacity: 0.8;
|
206 |
}
|
207 |
+
|
208 |
+
/* Styles pour l'IA */
|
209 |
+
.ai-badge {
|
210 |
+
position: absolute;
|
211 |
+
top: 10px;
|
212 |
+
left: 10px;
|
213 |
+
background-color: rgba(16, 185, 129, 0.9);
|
214 |
+
color: white;
|
215 |
+
padding: 4px 8px;
|
216 |
+
border-radius: 4px;
|
217 |
+
font-size: 12px;
|
218 |
+
font-weight: bold;
|
219 |
+
z-index: 10;
|
220 |
+
}
|
221 |
+
|
222 |
+
.ai-message {
|
223 |
+
background-color: rgba(16, 185, 129, 0.2);
|
224 |
+
border-left: 4px solid #10b981;
|
225 |
+
padding: 12px;
|
226 |
+
border-radius: 4px;
|
227 |
+
margin-bottom: 15px;
|
228 |
+
display: flex;
|
229 |
+
align-items: center;
|
230 |
+
gap: 10px;
|
231 |
+
}
|
232 |
+
|
233 |
+
.ai-thinking {
|
234 |
+
display: inline-block;
|
235 |
+
width: 12px;
|
236 |
+
height: 12px;
|
237 |
+
border-radius: 50%;
|
238 |
+
background-color: #10b981;
|
239 |
+
animation: pulse 1.5s infinite;
|
240 |
+
}
|
241 |
+
|
242 |
+
@keyframes pulse {
|
243 |
+
0% { transform: scale(0.95); opacity: 0.7; }
|
244 |
+
50% { transform: scale(1.1); opacity: 1; }
|
245 |
+
100% { transform: scale(0.95); opacity: 0.7; }
|
246 |
+
}
|
247 |
+
|
248 |
+
.ai-optimizing {
|
249 |
+
display: flex;
|
250 |
+
align-items: center;
|
251 |
+
gap: 8px;
|
252 |
+
font-size: 14px;
|
253 |
+
color: #10b981;
|
254 |
+
}
|
255 |
+
|
256 |
+
.ai-control-panel {
|
257 |
+
background-color: rgba(16, 185, 129, 0.1);
|
258 |
+
border: 1px solid rgba(16, 185, 129, 0.3);
|
259 |
+
border-radius: 8px;
|
260 |
+
padding: 15px;
|
261 |
+
margin-top: 15px;
|
262 |
+
}
|
263 |
+
|
264 |
+
.ai-toggle {
|
265 |
+
position: relative;
|
266 |
+
display: inline-block;
|
267 |
+
width: 50px;
|
268 |
+
height: 24px;
|
269 |
+
}
|
270 |
+
|
271 |
+
.ai-toggle input {
|
272 |
+
opacity: 0;
|
273 |
+
width: 0;
|
274 |
+
height: 0;
|
275 |
+
}
|
276 |
+
|
277 |
+
.ai-slider {
|
278 |
+
position: absolute;
|
279 |
+
cursor: pointer;
|
280 |
+
top: 0;
|
281 |
+
left: 0;
|
282 |
+
right: 0;
|
283 |
+
bottom: 0;
|
284 |
+
background-color: #334155;
|
285 |
+
transition: .4s;
|
286 |
+
border-radius: 24px;
|
287 |
+
}
|
288 |
+
|
289 |
+
.ai-slider:before {
|
290 |
+
position: absolute;
|
291 |
+
content: "";
|
292 |
+
height: 16px;
|
293 |
+
width: 16px;
|
294 |
+
left: 4px;
|
295 |
+
bottom: 4px;
|
296 |
+
background-color: white;
|
297 |
+
transition: .4s;
|
298 |
+
border-radius: 50%;
|
299 |
+
}
|
300 |
+
|
301 |
+
input:checked + .ai-slider {
|
302 |
+
background-color: #10b981;
|
303 |
+
}
|
304 |
+
|
305 |
+
input:checked + .ai-slider:before {
|
306 |
+
transform: translateX(26px);
|
307 |
+
}
|
308 |
+
|
309 |
+
.ai-status {
|
310 |
+
display: inline-flex;
|
311 |
+
align-items: center;
|
312 |
+
gap: 6px;
|
313 |
+
font-size: 14px;
|
314 |
+
}
|
315 |
+
|
316 |
+
.ai-status-dot {
|
317 |
+
width: 8px;
|
318 |
+
height: 8px;
|
319 |
+
border-radius: 50%;
|
320 |
+
background-color: #10b981;
|
321 |
+
animation: pulse 1.5s infinite;
|
322 |
+
}
|
323 |
+
|
324 |
+
.ai-status.offline .ai-status-dot {
|
325 |
+
background-color: #ef4444;
|
326 |
+
animation: none;
|
327 |
+
}
|
328 |
+
|
329 |
+
.ai-server-analyzer {
|
330 |
+
display: flex;
|
331 |
+
flex-direction: column;
|
332 |
+
gap: 10px;
|
333 |
+
margin-top: 15px;
|
334 |
+
}
|
335 |
+
|
336 |
+
.ai-server-progress {
|
337 |
+
width: 100%;
|
338 |
+
background-color: #334155;
|
339 |
+
border-radius: 4px;
|
340 |
+
height: 6px;
|
341 |
+
overflow: hidden;
|
342 |
+
}
|
343 |
+
|
344 |
+
.ai-server-progress-bar {
|
345 |
+
height: 100%;
|
346 |
+
background-color: #10b981;
|
347 |
+
border-radius: 4px;
|
348 |
+
transition: width 0.3s ease;
|
349 |
+
}
|
350 |
+
|
351 |
+
.ai-server-info {
|
352 |
+
display: flex;
|
353 |
+
justify-content: space-between;
|
354 |
+
font-size: 12px;
|
355 |
+
color: #94a3b8;
|
356 |
+
}
|
357 |
+
|
358 |
+
.ai-server-name {
|
359 |
+
font-weight: 500;
|
360 |
+
color: white;
|
361 |
+
}
|
362 |
+
|
363 |
+
.ai-server-speed {
|
364 |
+
color: #10b981;
|
365 |
+
}
|
366 |
+
|
367 |
+
.ai-server-latency {
|
368 |
+
color: #f59e0b;
|
369 |
+
}
|
370 |
+
|
371 |
+
.ai-server-stability {
|
372 |
+
color: #8b5cf6;
|
373 |
+
}
|
374 |
</style>
|
375 |
</head>
|
376 |
<body class="min-h-screen">
|
|
|
380 |
<div class="flex items-center justify-between h-16">
|
381 |
<div class="flex items-center">
|
382 |
<div class="flex-shrink-0">
|
383 |
+
<span class="text-2xl font-bold gradient-text">CineStream <span class="text-ai">AI</span></span>
|
384 |
</div>
|
385 |
<div class="hidden md:block ml-10">
|
386 |
<div class="flex space-x-4">
|
|
|
400 |
<i class="fas fa-search"></i>
|
401 |
</button>
|
402 |
</div>
|
403 |
+
<div class="ai-status">
|
404 |
+
<span class="ai-status-dot"></span>
|
405 |
+
<span>IA Active</span>
|
406 |
+
</div>
|
407 |
+
<button class="p-1 rounded-full text-gray-400 hover:text-white focus:outline-none ml-4">
|
408 |
<i class="fas fa-user-circle text-xl"></i>
|
409 |
</button>
|
410 |
</div>
|
|
|
421 |
<!-- Main Content -->
|
422 |
<main class="pt-24 pb-12">
|
423 |
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
424 |
+
<!-- AI Control Panel -->
|
425 |
+
<div class="ai-control-panel mb-8">
|
426 |
+
<div class="flex justify-between items-center">
|
427 |
+
<div>
|
428 |
+
<h3 class="text-lg font-semibold text-white flex items-center gap-2">
|
429 |
+
<i class="fas fa-robot text-ai"></i>
|
430 |
+
<span>Contrôle de l'IA AutoPilot</span>
|
431 |
+
</h3>
|
432 |
+
<p class="text-sm text-gray-400 mt-1">L'IA optimise automatiquement votre expérience de streaming</p>
|
433 |
+
</div>
|
434 |
+
<label class="flex items-center gap-2 cursor-pointer">
|
435 |
+
<span class="text-sm text-gray-300">Mode AutoPilot</span>
|
436 |
+
<div class="ai-toggle">
|
437 |
+
<input type="checkbox" id="ai-toggle" checked>
|
438 |
+
<span class="ai-slider"></span>
|
439 |
+
</div>
|
440 |
+
</label>
|
441 |
+
</div>
|
442 |
+
|
443 |
+
<div class="ai-server-analyzer">
|
444 |
+
<div class="ai-optimizing">
|
445 |
+
<div class="ai-thinking"></div>
|
446 |
+
<span>Analyse des serveurs en temps réel...</span>
|
447 |
+
</div>
|
448 |
+
<div class="ai-server-info">
|
449 |
+
<span class="ai-server-name">SuperEmbed</span>
|
450 |
+
<span class="ai-server-speed">Vitesse: 24 Mbps</span>
|
451 |
+
<span class="ai-server-latency">Latence: 78ms</span>
|
452 |
+
<span class="ai-server-stability">Stabilité: 98%</span>
|
453 |
+
</div>
|
454 |
+
<div class="ai-server-progress">
|
455 |
+
<div class="ai-server-progress-bar" style="width: 92%"></div>
|
456 |
+
</div>
|
457 |
+
</div>
|
458 |
+
</div>
|
459 |
+
|
460 |
<!-- Featured Section -->
|
461 |
<section class="mb-12">
|
462 |
<div class="flex justify-between items-center mb-6">
|
|
|
503 |
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
504 |
<div class="grid grid-cols-1 md:grid-cols-4 gap-8">
|
505 |
<div>
|
506 |
+
<h3 class="text-white text-lg font-semibold mb-4">CineStream AI</h3>
|
507 |
+
<p class="text-sm">La plateforme de streaming intelligente qui optimise automatiquement votre expérience.</p>
|
508 |
</div>
|
509 |
<div>
|
510 |
<h3 class="text-white text-lg font-semibold mb-4">Navigation</h3>
|
|
|
534 |
</div>
|
535 |
</div>
|
536 |
<div class="border-t border-gray-800 mt-8 pt-8 text-sm text-center">
|
537 |
+
<p>© 2023 CineStream AI. Tous droits réservés.</p>
|
538 |
</div>
|
539 |
</div>
|
540 |
</footer>
|
|
|
562 |
<p id="modal-overview" class="text-gray-300 mb-4"></p>
|
563 |
<div id="modal-genres" class="flex flex-wrap gap-2 mb-4"></div>
|
564 |
|
565 |
+
<!-- AI Recommendation -->
|
566 |
+
<div class="ai-message">
|
567 |
+
<i class="fas fa-robot text-ai"></i>
|
568 |
+
<div>
|
569 |
+
<p class="font-medium">Recommandation de l'IA</p>
|
570 |
+
<p id="ai-recommendation" class="text-sm">Analyse en cours pour optimiser votre streaming...</p>
|
571 |
+
</div>
|
572 |
+
</div>
|
573 |
+
|
574 |
<!-- Serveurs de streaming -->
|
575 |
<div class="mb-4">
|
576 |
<h4 class="text-sm font-semibold text-gray-400 mb-2">CHOISIR UN SERVEUR :</h4>
|
|
|
593 |
<button onclick="selectServer('autoembed')" class="server-btn inactive" data-server="autoembed">
|
594 |
<i class="fas fa-robot mr-1"></i> AutoEmbed <span class="server-quality">Auto</span>
|
595 |
</button>
|
596 |
+
<button onclick="selectServer('vidsrcme')" class="server-btn inactive" data-server="vidsrcme">
|
597 |
+
<i class="fas fa-play mr-1"></i> VidSrc.me <span class="server-quality">HD</span>
|
598 |
+
</button>
|
599 |
+
<button onclick="selectServer('movapi')" class="server-btn inactive" data-server="movapi">
|
600 |
+
<i class="fas fa-film mr-1"></i> MovAPI <span class="server-quality">Multi-Q</span>
|
601 |
+
</button>
|
602 |
</div>
|
603 |
</div>
|
604 |
|
|
|
607 |
Fermer
|
608 |
</button>
|
609 |
<button id="watch-now-btn" onclick="startStreaming()" class="w-full inline-flex justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-green-600 text-base font-medium text-white hover:bg-green-700 focus:outline-none sm:ml-3 sm:w-auto sm:text-sm">
|
610 |
+
<i class="fas fa-play mr-2"></i> Lecture auto (IA)
|
611 |
</button>
|
612 |
</div>
|
613 |
</div>
|
|
|
620 |
<!-- Streaming Window (hidden by default) -->
|
621 |
<div id="streaming-window" class="streaming-window hidden">
|
622 |
<div class="streaming-header">
|
623 |
+
<div class="flex items-center gap-4">
|
624 |
+
<h3 id="streaming-title" class="text-xl font-bold text-white"></h3>
|
625 |
+
<div class="ai-status">
|
626 |
+
<span class="ai-status-dot"></span>
|
627 |
+
<span class="text-sm">IA Optimisation</span>
|
628 |
+
</div>
|
629 |
+
</div>
|
630 |
<button onclick="closeStreamingWindow()" class="text-gray-400 hover:text-white">
|
631 |
<i class="fas fa-times text-xl"></i>
|
632 |
</button>
|
|
|
636 |
<!-- Contenu du lecteur sera chargé ici -->
|
637 |
<div id="stream-loading" class="stream-loading w-full h-full">
|
638 |
<div class="stream-loading-spinner"></div>
|
639 |
+
<p class="text-gray-300">L'IA optimise votre streaming...</p>
|
640 |
</div>
|
641 |
</div>
|
642 |
</div>
|
643 |
<div class="streaming-controls">
|
644 |
+
<div class="flex items-center gap-4">
|
645 |
+
<div class="ai-optimizing">
|
646 |
+
<div class="ai-thinking"></div>
|
647 |
+
<span class="text-sm">Analyse des performances en temps réel</span>
|
648 |
+
</div>
|
649 |
+
<div class="flex space-x-2">
|
650 |
+
<button onclick="changeQuality('720p')" class="stream-btn px-3 py-1 bg-gray-700 hover:bg-gray-600 text-white rounded-full text-sm">720p</button>
|
651 |
+
<button onclick="changeQuality('1080p')" class="stream-btn px-3 py-1 bg-gray-700 hover:bg-gray-600 text-white rounded-full text-sm">1080p</button>
|
652 |
+
<button onclick="changeQuality('4k')" class="stream-btn px-3 py-1 bg-gray-700 hover:bg-gray-600 text-white rounded-full text-sm">4K</button>
|
653 |
+
</div>
|
654 |
</div>
|
655 |
<div>
|
656 |
<button onclick="toggleFullscreen()" class="stream-btn px-3 py-1 bg-gray-700 hover:bg-gray-600 text-white rounded-full text-sm">
|
|
|
665 |
const API_KEY = 'c45a857c193f6302f2b5061c3b85e743'; // Clé API TMDB valide
|
666 |
const BASE_URL = 'https://api.themoviedb.org/3';
|
667 |
|
668 |
+
// Serveurs de streaming avec URLs de base fonctionnelles et paramètres de lecture
|
669 |
const STREAMING_SERVERS = {
|
670 |
superembed: {
|
671 |
name: 'SuperEmbed',
|
|
|
673 |
autoPlay: true,
|
674 |
requiresTMDB: true,
|
675 |
requiresIMDB: false,
|
676 |
+
quality: 'HD',
|
677 |
+
params: {
|
678 |
+
tmdb: 'tmdb=',
|
679 |
+
imdb: 'imdb=',
|
680 |
+
auto: '&autoplay=1'
|
681 |
+
},
|
682 |
+
aiScore: 0 // Score initialisé par l'IA
|
683 |
},
|
684 |
vidsrc: {
|
685 |
name: 'VidSrc',
|
|
|
687 |
autoPlay: true,
|
688 |
requiresTMDB: true,
|
689 |
requiresIMDB: false,
|
690 |
+
quality: 'Multi-Q',
|
691 |
+
params: {
|
692 |
+
auto: '?autoplay=1'
|
693 |
+
},
|
694 |
+
aiScore: 0
|
695 |
},
|
696 |
'2embed': {
|
697 |
name: '2Embed',
|
|
|
699 |
autoPlay: true,
|
700 |
requiresTMDB: false,
|
701 |
requiresIMDB: true,
|
702 |
+
quality: '1080p',
|
703 |
+
params: {
|
704 |
+
auto: '?autoplay=true'
|
705 |
+
},
|
706 |
+
aiScore: 0
|
707 |
},
|
708 |
databasegdrive: {
|
709 |
name: 'GDrive Player',
|
|
|
711 |
autoPlay: true,
|
712 |
requiresTMDB: true,
|
713 |
requiresIMDB: false,
|
714 |
+
quality: '4K',
|
715 |
+
params: {
|
716 |
+
auto: '&autoplay=1'
|
717 |
+
},
|
718 |
+
aiScore: 0
|
719 |
},
|
720 |
multiembed: {
|
721 |
name: 'MultiEmbed',
|
|
|
723 |
autoPlay: true,
|
724 |
requiresTMDB: true,
|
725 |
requiresIMDB: false,
|
726 |
+
quality: 'HD',
|
727 |
+
params: {
|
728 |
+
auto: '&autoplay=1'
|
729 |
+
},
|
730 |
+
aiScore: 0
|
731 |
},
|
732 |
autoembed: {
|
733 |
name: 'AutoEmbed',
|
|
|
735 |
autoPlay: true,
|
736 |
requiresTMDB: true,
|
737 |
requiresIMDB: false,
|
738 |
+
quality: 'Auto',
|
739 |
+
params: {
|
740 |
+
auto: '?autoplay=1'
|
741 |
+
},
|
742 |
+
aiScore: 0
|
743 |
+
},
|
744 |
+
vidsrcme: {
|
745 |
+
name: 'VidSrc.me',
|
746 |
+
url: 'https://vidsrc.me/embed/',
|
747 |
+
autoPlay: true,
|
748 |
+
requiresTMDB: true,
|
749 |
+
requiresIMDB: false,
|
750 |
+
quality: 'HD',
|
751 |
+
params: {
|
752 |
+
auto: '?autoplay=1'
|
753 |
+
},
|
754 |
+
aiScore: 0
|
755 |
+
},
|
756 |
+
movapi: {
|
757 |
+
name: 'MovAPI',
|
758 |
+
url: 'https://movapi.vercel.app/movie/',
|
759 |
+
autoPlay: true,
|
760 |
+
requiresTMDB: true,
|
761 |
+
requiresIMDB: false,
|
762 |
+
quality: 'Multi-Q',
|
763 |
+
params: {
|
764 |
+
auto: '?autoplay=1'
|
765 |
+
},
|
766 |
+
aiScore: 0
|
767 |
}
|
768 |
};
|
769 |
|
|
|
776 |
let currentMovieId = null;
|
777 |
let currentIMDBId = null;
|
778 |
let selectedServer = 'superembed';
|
779 |
+
let isAutoPilotEnabled = true;
|
780 |
+
let aiInterval = null;
|
781 |
|
782 |
// Fonction utilitaire pour faire les requêtes API
|
783 |
async function fetchAPI(endpoint, params = {}) {
|
|
|
786 |
// Ajouter les paramètres par défaut
|
787 |
const defaultParams = {
|
788 |
language: 'fr-FR',
|
|
|
789 |
api_key: API_KEY
|
790 |
};
|
791 |
|
|
|
823 |
searchMovies();
|
824 |
}
|
825 |
});
|
826 |
+
|
827 |
+
// Gérer le toggle de l'IA
|
828 |
+
document.getElementById('ai-toggle').addEventListener('change', function(e) {
|
829 |
+
isAutoPilotEnabled = e.target.checked;
|
830 |
+
if (isAutoPilotEnabled) {
|
831 |
+
document.querySelector('.ai-status').classList.remove('offline');
|
832 |
+
document.querySelector('.ai-status-dot').style.backgroundColor = '#10b981';
|
833 |
+
document.querySelector('.ai-status-dot').style.animation = 'pulse 1.5s infinite';
|
834 |
+
showAIMessage("Mode AutoPilot activé - L'IA optimise votre streaming");
|
835 |
+
} else {
|
836 |
+
document.querySelector('.ai-status').classList.add('offline');
|
837 |
+
document.querySelector('.ai-status-dot').style.backgroundColor = '#ef4444';
|
838 |
+
document.querySelector('.ai-status-dot').style.animation = 'none';
|
839 |
+
showAIMessage("Mode AutoPilot désactivé - Contrôle manuel");
|
840 |
+
}
|
841 |
+
});
|
842 |
+
|
843 |
+
// Simuler l'analyse des serveurs par l'IA
|
844 |
+
simulateAIAnalysis();
|
845 |
});
|
846 |
|
847 |
+
// Simuler l'analyse des serveurs par l'IA
|
848 |
+
function simulateAIAnalysis() {
|
849 |
+
if (aiInterval) clearInterval(aiInterval);
|
850 |
+
|
851 |
+
aiInterval = setInterval(() => {
|
852 |
+
// Mettre à jour les scores des serveurs de manière aléatoire (simulation)
|
853 |
+
Object.keys(STREAMING_SERVERS).forEach(serverId => {
|
854 |
+
// Score basé sur la vitesse, la latence et la stabilité simulées
|
855 |
+
const speed = Math.floor(Math.random() * 30) + 5; // 5-35 Mbps
|
856 |
+
const latency = Math.floor(Math.random() * 150) + 50; // 50-200ms
|
857 |
+
const stability = Math.floor(Math.random() * 20) + 80; // 80-100%
|
858 |
+
|
859 |
+
// Calcul du score (plus le score est élevé, meilleur est le serveur)
|
860 |
+
STREAMING_SERVERS[serverId].aiScore = Math.round(
|
861 |
+
(speed / 5) + // Poids pour la vitesse
|
862 |
+
((200 - latency) / 2) + // Poids pour la latence (plus c'est bas, mieux c'est)
|
863 |
+
(stability / 1) // Poids pour la stabilité
|
864 |
+
);
|
865 |
+
|
866 |
+
// Mettre à jour l'affichage si le serveur est sélectionné
|
867 |
+
if (selectedServer === serverId) {
|
868 |
+
updateServerPerformanceUI(speed, latency, stability);
|
869 |
+
}
|
870 |
+
});
|
871 |
+
|
872 |
+
// Si AutoPilot est activé, sélectionner automatiquement le meilleur serveur
|
873 |
+
if (isAutoPilotEnabled && currentMovieId) {
|
874 |
+
selectBestServer();
|
875 |
+
}
|
876 |
+
|
877 |
+
}, 3000); // Mettre à jour toutes les 3 secondes
|
878 |
+
}
|
879 |
+
|
880 |
+
// Mettre à jour l'UI des performances du serveur
|
881 |
+
function updateServerPerformanceUI(speed, latency, stability) {
|
882 |
+
const serverInfo = document.querySelector('.ai-server-info');
|
883 |
+
if (serverInfo) {
|
884 |
+
serverInfo.innerHTML = `
|
885 |
+
<span class="ai-server-name">${STREAMING_SERVERS[selectedServer].name}</span>
|
886 |
+
<span class="ai-server-speed">Vitesse: ${speed} Mbps</span>
|
887 |
+
<span class="ai-server-latency">Latence: ${latency}ms</span>
|
888 |
+
<span class="ai-server-stability">Stabilité: ${stability}%</span>
|
889 |
+
`;
|
890 |
+
|
891 |
+
const progressBar = document.querySelector('.ai-server-progress-bar');
|
892 |
+
if (progressBar) {
|
893 |
+
const progress = Math.min(100, (speed / 35) * 100); // Normalisé sur 35 Mbps max
|
894 |
+
progressBar.style.width = `${progress}%`;
|
895 |
+
}
|
896 |
+
}
|
897 |
+
}
|
898 |
+
|
899 |
+
// Sélectionner le meilleur serveur selon l'IA
|
900 |
+
function selectBestServer() {
|
901 |
+
let bestServer = null;
|
902 |
+
let highestScore = -1;
|
903 |
+
|
904 |
+
// Trouver le serveur avec le score le plus élevé
|
905 |
+
Object.keys(STREAMING_SERVERS).forEach(serverId => {
|
906 |
+
if (STREAMING_SERVERS[serverId].aiScore > highestScore) {
|
907 |
+
highestScore = STREAMING_SERVERS[serverId].aiScore;
|
908 |
+
bestServer = serverId;
|
909 |
+
}
|
910 |
+
});
|
911 |
+
|
912 |
+
// Si un meilleur serveur est trouvé et différent du serveur actuel
|
913 |
+
if (bestServer && bestServer !== selectedServer) {
|
914 |
+
selectedServer = bestServer;
|
915 |
+
updateSelectedServerUI();
|
916 |
+
|
917 |
+
// Si en train de streamer, redémarrer avec le nouveau serveur
|
918 |
+
if (document.getElementById('streaming-window').classList.contains('hidden') === false) {
|
919 |
+
startAutoStreaming(currentMovieId, document.getElementById('streaming-title').textContent);
|
920 |
+
showAIMessage(`L'IA a optimisé votre streaming - Serveur basculé vers ${STREAMING_SERVERS[bestServer].name}`);
|
921 |
+
}
|
922 |
+
}
|
923 |
+
}
|
924 |
+
|
925 |
+
// Mettre à jour l'UI du serveur sélectionné
|
926 |
+
function updateSelectedServerUI() {
|
927 |
+
document.querySelectorAll('.server-btn').forEach(btn => {
|
928 |
+
if (btn.dataset.server === selectedServer) {
|
929 |
+
btn.classList.remove('inactive');
|
930 |
+
btn.classList.add('active');
|
931 |
+
} else {
|
932 |
+
btn.classList.remove('active');
|
933 |
+
btn.classList.add('inactive');
|
934 |
+
}
|
935 |
+
});
|
936 |
+
|
937 |
+
// Mettre à jour la recommandation dans la modal
|
938 |
+
if (document.getElementById('ai-recommendation')) {
|
939 |
+
document.getElementById('ai-recommendation').textContent =
|
940 |
+
`Serveur recommandé: ${STREAMING_SERVERS[selectedServer].name} (Score IA: ${STREAMING_SERVERS[selectedServer].aiScore})`;
|
941 |
+
}
|
942 |
+
}
|
943 |
+
|
944 |
+
// Afficher un message de l'IA
|
945 |
+
function showAIMessage(message) {
|
946 |
+
// Dans la fenêtre de streaming
|
947 |
+
const streamingWindow = document.getElementById('streaming-window');
|
948 |
+
if (!streamingWindow.classList.contains('hidden')) {
|
949 |
+
const aiMessage = document.createElement('div');
|
950 |
+
aiMessage.className = 'ai-message absolute top-4 left-1/2 transform -translate-x-1/2 z-50';
|
951 |
+
aiMessage.innerHTML = `
|
952 |
+
<i class="fas fa-robot text-ai"></i>
|
953 |
+
<span>${message}</span>
|
954 |
+
`;
|
955 |
+
streamingWindow.querySelector('.streaming-content').appendChild(aiMessage);
|
956 |
+
|
957 |
+
// Supprimer après 3 secondes
|
958 |
+
setTimeout(() => {
|
959 |
+
aiMessage.remove();
|
960 |
+
}, 3000);
|
961 |
+
}
|
962 |
+
}
|
963 |
+
|
964 |
// Charger les films
|
965 |
async function loadMovies() {
|
966 |
if (isLoading) return;
|
|
|
970 |
|
971 |
try {
|
972 |
let data;
|
973 |
+
const params = {
|
974 |
+
page: currentPage,
|
975 |
+
include_adult: false
|
976 |
+
};
|
977 |
|
978 |
if (currentSearch) {
|
979 |
data = await fetchAPI('/search/movie', {
|
980 |
+
...params,
|
981 |
+
query: encodeURIComponent(currentSearch)
|
|
|
982 |
});
|
983 |
} else if (currentGenre) {
|
984 |
data = await fetchAPI('/discover/movie', {
|
985 |
+
...params,
|
|
|
|
|
986 |
with_genres: currentGenre,
|
987 |
+
sort_by: 'popularity.desc'
|
988 |
});
|
989 |
} else {
|
990 |
+
data = await fetchAPI(`/movie/${currentFilter}`, params);
|
|
|
|
|
991 |
}
|
992 |
|
993 |
totalPages = data.total_pages || 1;
|
|
|
1050 |
<span class="text-gray-400 text-sm ml-auto">${movie.release_date ? movie.release_date.substring(0, 4) : 'N/A'}</span>
|
1051 |
</div>
|
1052 |
<div class="mt-3">
|
1053 |
+
<button onclick="startAutoStreaming(${movie.id}, '${movie.title ? movie.title.replace(/'/g, "\\'") : 'Film'}')" class="w-full stream-btn px-3 py-2 bg-green-600 hover:bg-green-700 text-white rounded text-sm">
|
1054 |
+
<i class="fas fa-robot mr-1"></i> Lecture IA
|
1055 |
</button>
|
1056 |
<button onclick="showMovieDetails(${movie.id})" class="w-full mt-2 px-3 py-2 bg-gray-700 hover:bg-gray-600 text-white rounded text-sm">
|
1057 |
<i class="fas fa-info-circle mr-1"></i> Détails
|
|
|
1061 |
<div class="auto-server-badge">
|
1062 |
<i class="fas fa-bolt mr-1"></i> AutoPlay
|
1063 |
</div>
|
1064 |
+
<div class="ai-badge">
|
1065 |
+
<i class="fas fa-brain mr-1"></i> IA Optimisé
|
1066 |
+
</div>
|
1067 |
</div>
|
1068 |
`;
|
1069 |
|
|
|
1227 |
genresContainer.innerHTML = '<span class="text-gray-400 text-sm">Aucun genre spécifié</span>';
|
1228 |
}
|
1229 |
|
1230 |
+
// Mettre à jour la recommandation de l'IA
|
1231 |
+
if (isAutoPilotEnabled) {
|
1232 |
+
selectBestServer();
|
1233 |
+
document.getElementById('ai-recommendation').textContent =
|
1234 |
+
`Serveur recommandé: ${STREAMING_SERVERS[selectedServer].name} (Score IA: ${STREAMING_SERVERS[selectedServer].aiScore})`;
|
1235 |
+
} else {
|
1236 |
+
document.getElementById('ai-recommendation').textContent =
|
1237 |
+
"Mode AutoPilot désactivé - Sélectionnez manuellement un serveur";
|
1238 |
+
}
|
1239 |
+
|
1240 |
// Afficher la modal
|
1241 |
document.getElementById('movie-modal').classList.remove('hidden');
|
1242 |
} catch (error) {
|
|
|
1253 |
// Sélectionner un serveur de streaming
|
1254 |
function selectServer(serverId) {
|
1255 |
selectedServer = serverId;
|
1256 |
+
updateSelectedServerUI();
|
1257 |
|
1258 |
+
// Si AutoPilot est activé, le désactiver temporairement pour la sélection manuelle
|
1259 |
+
if (isAutoPilotEnabled) {
|
1260 |
+
document.getElementById('ai-toggle').checked = false;
|
1261 |
+
isAutoPilotEnabled = false;
|
1262 |
+
document.querySelector('.ai-status').classList.add('offline');
|
1263 |
+
document.querySelector('.ai-status-dot').style.backgroundColor = '#ef4444';
|
1264 |
+
document.querySelector('.ai-status-dot').style.animation = 'none';
|
1265 |
+
document.getElementById('ai-recommendation').textContent =
|
1266 |
+
"Mode AutoPilot désactivé - Contrôle manuel activé";
|
1267 |
+
}
|
1268 |
}
|
1269 |
|
1270 |
// Démarrer le streaming depuis la modal
|
|
|
1289 |
playerContainer.innerHTML = `
|
1290 |
<div id="stream-loading" class="stream-loading w-full h-full">
|
1291 |
<div class="stream-loading-spinner"></div>
|
1292 |
+
<p class="text-gray-300">${isAutoPilotEnabled ? "L'IA optimise votre streaming..." : "Chargement du flux vidéo..."}</p>
|
1293 |
</div>
|
1294 |
`;
|
1295 |
|
|
|
1312 |
<i class="fas fa-exclamation-triangle text-4xl mb-4"></i>
|
1313 |
<p class="text-lg">Impossible de trouver l'ID IMDB pour ce film</p>
|
1314 |
<p class="text-sm text-gray-400 mt-2">Essayez avec un autre serveur</p>
|
1315 |
+
<button onclick="tryAlternativeServer()" class="mt-4 px-4 py-2 bg-primary text-white rounded hover:bg-secondary transition">
|
1316 |
+
<i class="fas fa-sync-alt mr-2"></i> Essayer un autre serveur
|
1317 |
+
</button>
|
1318 |
</div>
|
1319 |
`;
|
1320 |
return;
|
|
|
1334 |
streamingUrl = serverConfig.url + movieId;
|
1335 |
}
|
1336 |
|
1337 |
+
// Ajouter les paramètres de lecture automatique si configuré
|
1338 |
+
if (serverConfig.autoPlay && serverConfig.params) {
|
1339 |
+
if (serverConfig.params.auto) {
|
1340 |
+
if (streamingUrl.includes('?')) {
|
1341 |
+
streamingUrl += serverConfig.params.auto.replace('?', '&');
|
1342 |
+
} else {
|
1343 |
+
streamingUrl += serverConfig.params.auto;
|
1344 |
+
}
|
1345 |
+
}
|
1346 |
}
|
1347 |
|
1348 |
// Créer l'iframe pour le lecteur vidéo
|
|
|
1396 |
const nextIndex = (currentIndex + 1) % servers.length;
|
1397 |
|
1398 |
selectedServer = servers[nextIndex];
|
1399 |
+
updateSelectedServerUI();
|
1400 |
startAutoStreaming(currentMovieId, document.getElementById('streaming-title').textContent);
|
1401 |
+
|
1402 |
+
showAIMessage(`Serveur basculé vers ${STREAMING_SERVERS[selectedServer].name} (Automatique)`);
|
1403 |
}
|
1404 |
|
1405 |
// Fermer la fenêtre de streaming
|
|
|
1411 |
|
1412 |
// Changer la qualité de streaming (simulé)
|
1413 |
function changeQuality(quality) {
|
1414 |
+
showAIMessage(`Qualité changée en ${quality} - Optimisation en cours...`);
|
1415 |
// En réalité, vous devriez mettre à jour la source du lecteur vidéo
|
1416 |
}
|
1417 |
|
prompts.txt
CHANGED
@@ -1,2 +1,5 @@
|
|
1 |
activer la lecture des films dans une nouvelle page en mode pilotage automatique
|
2 |
-
AJOUTER DES SEVEURS AUTOMATIQUE POUR RAGARDER LES FILMS
|
|
|
|
|
|
|
|
1 |
activer la lecture des films dans une nouvelle page en mode pilotage automatique
|
2 |
+
AJOUTER DES SEVEURS AUTOMATIQUE POUR RAGARDER LES FILMS
|
3 |
+
corriger les erreurs : Error: one of parameters is in wrong format
|
4 |
+
corriger le probleme de parametre de lecture et ajouter plussieur serveur de lecture
|
5 |
+
INTEGRER UN SYSTEME IA INTEGRE AUTOPILOTE POUR GERE TOUTE EN MODE AUTOMATIQUE
|