docto41 commited on
Commit
cb32e74
·
verified ·
1 Parent(s): 1db0f0a

Add 2 files

Browse files
Files changed (2) hide show
  1. index.html +519 -1220
  2. prompts.txt +8 -1
index.html CHANGED
@@ -3,27 +3,10 @@
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>
10
- tailwind.config = {
11
- theme: {
12
- extend: {
13
- colors: {
14
- primary: '#6d28d9',
15
- secondary: '#8b5cf6',
16
- dark: '#1e1b4b',
17
- light: '#f5f3ff',
18
- ai: '#10b981'
19
- },
20
- fontFamily: {
21
- sans: ['Inter', 'sans-serif'],
22
- },
23
- }
24
- }
25
- }
26
- </script>
27
  <style>
28
  @import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap');
29
 
@@ -35,16 +18,16 @@
35
 
36
  .movie-card {
37
  transition: all 0.3s ease;
 
38
  }
39
 
40
  .movie-card:hover {
41
- transform: translateY(-10px);
42
- box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
43
  }
44
 
45
- .movie-poster {
46
- height: 450px;
47
- object-fit: cover;
48
  }
49
 
50
  .loading-spinner {
@@ -56,320 +39,44 @@
56
  100% { transform: rotate(360deg); }
57
  }
58
 
59
- .gradient-text {
60
- background: linear-gradient(90deg, #8b5cf6, #ec4899);
61
- -webkit-background-clip: text;
62
- background-clip: text;
63
- color: transparent;
64
- }
65
-
66
- .search-input:focus {
67
- box-shadow: 0 0 0 3px rgba(139, 92, 246, 0.5);
68
- }
69
-
70
- .error-message {
71
- background-color: rgba(239, 68, 68, 0.2);
72
- border-left: 4px solid #ef4444;
73
- }
74
-
75
- .placeholder-poster {
76
- background: linear-gradient(135deg, #1e293b 0%, #0f172a 100%);
77
- display: flex;
78
- align-items: center;
79
- justify-content: center;
80
- }
81
-
82
- /* Style pour le lecteur vidéo */
83
- .video-container {
84
- position: relative;
85
- padding-bottom: 56.25%; /* 16:9 */
86
- height: 0;
87
- overflow: hidden;
88
- }
89
-
90
- .video-container iframe {
91
- position: absolute;
92
- top: 0;
93
- left: 0;
94
  width: 100%;
95
- height: 100%;
96
- border: none;
97
- }
98
-
99
- /* Style pour les boutons de streaming */
100
- .stream-btn {
101
- transition: all 0.2s ease;
102
  }
103
 
104
- .stream-btn:hover {
105
- transform: scale(1.05);
 
106
  }
107
 
108
- /* Style pour la fenêtre de streaming */
109
- .streaming-window {
110
- position: fixed;
111
- top: 0;
112
- left: 0;
113
- width: 100%;
114
  height: 100%;
115
- background-color: rgba(0, 0, 0, 0.9);
116
- z-index: 1000;
117
- display: flex;
118
- flex-direction: column;
119
  }
120
 
121
- .streaming-header {
122
- padding: 15px;
123
- background-color: rgba(0, 0, 0, 0.7);
124
- display: flex;
125
- justify-content: space-between;
126
- align-items: center;
127
  }
128
 
129
- .streaming-content {
130
- flex: 1;
131
- display: flex;
132
- justify-content: center;
133
- align-items: center;
134
  }
135
 
136
- .streaming-controls {
137
- padding: 15px;
138
- background-color: rgba(0, 0, 0, 0.7);
139
- display: flex;
140
- justify-content: space-between;
141
- align-items: center;
142
- }
143
-
144
- /* Style pour la sélection de serveur */
145
- .server-list {
146
- display: flex;
147
- gap: 10px;
148
- flex-wrap: wrap;
149
- margin-top: 10px;
150
- }
151
-
152
- .server-btn {
153
- padding: 8px 12px;
154
- border-radius: 20px;
155
- font-size: 14px;
156
- cursor: pointer;
157
- transition: all 0.2s;
158
- }
159
-
160
- .server-btn.active {
161
- background-color: #6d28d9;
162
- color: white;
163
- }
164
-
165
- .server-btn.inactive {
166
- background-color: #334155;
167
- color: #94a3b8;
168
  }
169
 
170
- /* Animation de chargement du streaming */
171
- .stream-loading {
172
- display: flex;
173
- flex-direction: column;
174
- align-items: center;
175
- justify-content: center;
176
- gap: 20px;
177
  }
178
 
179
- .stream-loading-spinner {
180
- width: 50px;
181
- height: 50px;
182
- border: 5px solid rgba(255, 255, 255, 0.1);
183
- border-radius: 50%;
184
- border-top-color: #6d28d9;
185
- animation: spin 1s linear infinite;
186
- }
187
-
188
- /* Nouveaux styles pour les serveurs automatiques */
189
- .auto-server-badge {
190
- position: absolute;
191
- top: 10px;
192
- right: 10px;
193
- background-color: rgba(109, 40, 217, 0.9);
194
- color: white;
195
- padding: 4px 8px;
196
- border-radius: 4px;
197
- font-size: 12px;
198
- font-weight: bold;
199
- z-index: 10;
200
- }
201
-
202
- .server-quality {
203
- font-size: 12px;
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>
@@ -380,14 +87,14 @@
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">
387
- <a href="#" class="text-white px-3 py-2 rounded-md text-sm font-medium bg-primary">Accueil</a>
388
- <a href="#" class="text-gray-300 hover:text-white px-3 py-2 rounded-md text-sm font-medium">Films</a>
389
- <a href="#" class="text-gray-300 hover:text-white px-3 py-2 rounded-md text-sm font-medium">Séries</a>
390
- <a href="#" class="text-gray-300 hover:text-white px-3 py-2 rounded-md text-sm font-medium">Tendances</a>
391
  </div>
392
  </div>
393
  </div>
@@ -395,16 +102,12 @@
395
  <div class="ml-4 flex items-center md:ml-6">
396
  <div class="relative mx-4">
397
  <input type="text" id="search-input" placeholder="Rechercher un film..."
398
- class="search-input bg-gray-800 text-white px-4 py-2 rounded-full w-64 focus:outline-none focus:ring-2 focus:ring-purple-500 transition duration-200">
399
- <button onclick="searchMovies()" class="absolute right-3 top-2 text-gray-400 hover:text-white">
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,78 +124,191 @@
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">
463
- <h2 class="text-2xl font-bold text-white">Films populaires</h2>
464
- <div class="flex space-x-2">
465
- <button onclick="filterMovies('popular')" class="px-4 py-1 rounded-full text-sm bg-primary text-white">Populaires</button>
466
- <button onclick="filterMovies('top_rated')" class="px-4 py-1 rounded-full text-sm bg-gray-700 text-white">Mieux notés</button>
467
- <button onclick="filterMovies('upcoming')" class="px-4 py-1 rounded-full text-sm bg-gray-700 text-white">Prochainement</button>
 
 
 
 
 
 
468
  </div>
469
  </div>
470
 
471
- <div id="movies-container" class="grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-6">
472
- <!-- Movies will be loaded here -->
473
- <div class="flex justify-center items-center py-12 col-span-full">
474
- <div class="animate-spin rounded-full h-12 w-12 border-t-2 border-b-2 border-primary loading-spinner"></div>
475
- </div>
476
  </div>
477
 
478
- <div id="load-more-container" class="mt-8 flex justify-center">
479
- <button onclick="loadMoreMovies()" class="px-6 py-2 bg-primary text-white rounded-full hover:bg-secondary transition flex items-center">
480
- <span>Voir plus</span>
481
- <i class="fas fa-chevron-down ml-2"></i>
482
- </button>
483
  </div>
484
- </section>
485
-
486
- <!-- Genres Section -->
487
- <section class="mb-12">
488
- <h2 class="text-2xl font-bold text-white mb-6">Par genres</h2>
489
- <div class="grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-6 gap-4">
490
- <button onclick="filterByGenre(28)" class="genre-btn px-4 py-2 bg-red-600 hover:bg-red-700 text-white rounded-full text-sm">Action</button>
491
- <button onclick="filterByGenre(12)" class="genre-btn px-4 py-2 bg-blue-600 hover:bg-blue-700 text-white rounded-full text-sm">Aventure</button>
492
- <button onclick="filterByGenre(16)" class="genre-btn px-4 py-2 bg-green-600 hover:bg-green-700 text-white rounded-full text-sm">Animation</button>
493
- <button onclick="filterByGenre(35)" class="genre-btn px-4 py-2 bg-yellow-600 hover:bg-yellow-700 text-white rounded-full text-sm">Comédie</button>
494
- <button onclick="filterByGenre(80)" class="genre-btn px-4 py-2 bg-gray-600 hover:bg-gray-700 text-white rounded-full text-sm">Crime</button>
495
- <button onclick="filterByGenre(18)" class="genre-btn px-4 py-2 bg-purple-600 hover:bg-purple-700 text-white rounded-full text-sm">Drame</button>
496
  </div>
497
  </section>
498
  </div>
@@ -503,929 +319,412 @@
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>
511
  <ul class="space-y-2 text-sm">
512
- <li><a href="#" class="hover:text-white">Accueil</a></li>
513
- <li><a href="#" class="hover:text-white">Films</a></li>
514
- <li><a href="#" class="hover:text-white">Séries</a></li>
515
- <li><a href="#" class="hover:text-white">Nouveautés</a></li>
516
  </ul>
517
  </div>
518
  <div>
519
- <h3 class="text-white text-lg font-semibold mb-4">Légal</h3>
520
  <ul class="space-y-2 text-sm">
521
- <li><a href="#" class="hover:text-white">Conditions d'utilisation</a></li>
522
- <li><a href="#" class="hover:text-white">Politique de confidentialité</a></li>
523
- <li><a href="#" class="hover:text-white">DMCA</a></li>
524
  </ul>
525
  </div>
526
  <div>
527
- <h3 class="text-white text-lg font-semibold mb-4">Contact</h3>
528
  <div class="flex space-x-4">
529
- <a href="#" class="text-gray-400 hover:text-white"><i class="fab fa-facebook-f"></i></a>
530
- <a href="#" class="text-gray-400 hover:text-white"><i class="fab fa-twitter"></i></a>
531
- <a href="#" class="text-gray-400 hover:text-white"><i class="fab fa-instagram"></i></a>
532
  <a href="#" class="text-gray-400 hover:text-white"><i class="fab fa-discord"></i></a>
 
 
533
  </div>
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>
541
 
542
- <!-- Movie Details Modal -->
543
- <div id="movie-modal" class="fixed inset-0 z-50 hidden overflow-y-auto">
544
- <div class="flex items-center justify-center min-h-screen pt-4 px-4 pb-20 text-center sm:block sm:p-0">
545
- <div class="fixed inset-0 transition-opacity" aria-hidden="true">
546
- <div class="absolute inset-0 bg-gray-900 opacity-75"></div>
547
- </div>
548
- <span class="hidden sm:inline-block sm:align-middle sm:h-screen" aria-hidden="true">&#8203;</span>
549
- <div class="inline-block align-bottom bg-gray-800 rounded-lg text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:max-w-4xl sm:w-full">
550
- <div class="px-4 pt-5 pb-4 sm:p-6 sm:pb-4">
551
- <div class="sm:flex sm:items-start">
552
- <div id="modal-poster" class="flex-shrink-0 w-full sm:w-1/3 mb-4 sm:mb-0 sm:mr-6">
553
- <img class="w-full rounded-lg shadow-lg" src="" alt="Movie Poster">
554
- </div>
555
- <div class="mt-3 text-center sm:mt-0 sm:text-left w-full sm:w-2/3">
556
- <h3 id="modal-title" class="text-2xl leading-6 font-bold text-white mb-2"></h3>
557
- <div class="flex items-center mb-4">
558
- <span id="modal-rating" class="bg-yellow-500 text-white text-xs font-semibold px-2 py-1 rounded mr-3"></span>
559
- <span id="modal-year" class="text-gray-300 text-sm"></span>
560
- <span id="modal-runtime" class="ml-3 text-gray-300 text-sm"></span>
561
- </div>
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>
577
- <div class="server-list">
578
- <button onclick="selectServer('superembed')" class="server-btn active" data-server="superembed">
579
- <i class="fas fa-bolt mr-1"></i> SuperEmbed <span class="server-quality">HD</span>
580
- </button>
581
- <button onclick="selectServer('vidsrc')" class="server-btn inactive" data-server="vidsrc">
582
- <i class="fas fa-server mr-1"></i> VidSrc <span class="server-quality">Multi-Q</span>
583
- </button>
584
- <button onclick="selectServer('2embed')" class="server-btn inactive" data-server="2embed">
585
- <i class="fas fa-play-circle mr-1"></i> 2Embed <span class="server-quality">1080p</span>
586
- </button>
587
- <button onclick="selectServer('databasegdrive')" class="server-btn inactive" data-server="databasegdrive">
588
- <i class="fas fa-database mr-1"></i> GDrive <span class="server-quality">4K</span>
589
- </button>
590
- <button onclick="selectServer('multiembed')" class="server-btn inactive" data-server="multiembed">
591
- <i class="fas fa-layer-group mr-1"></i> MultiEmbed <span class="server-quality">HD</span>
592
- </button>
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
-
605
- <div class="mt-4">
606
- <button type="button" onclick="closeModal()" class="w-full inline-flex justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-primary text-base font-medium text-white hover:bg-secondary focus:outline-none sm:ml-3 sm:w-auto sm:text-sm">
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>
614
- </div>
615
- </div>
616
- </div>
617
- </div>
618
- </div>
619
-
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>
633
- </div>
634
- <div class="streaming-content">
635
- <div id="streaming-player-container" class="w-full h-full" style="max-width: 1200px;">
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">
657
- <i class="fas fa-expand mr-1"></i> Plein écran
658
- </button>
659
- </div>
660
- </div>
661
- </div>
662
-
663
  <script>
664
  // Configuration
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',
672
- url: 'https://multiembed.mov/?video_id=',
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',
686
- url: 'https://vidsrc.to/embed/movie/',
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',
698
- url: 'https://www.2embed.cc/embed/',
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',
710
- url: 'https://database.gdriveplayer.us/player.php?tmdb=',
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',
722
- url: 'https://embed.smashystream.com/playere.php?tmdb=',
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',
734
- url: 'https://autoembed.to/movie/tmdb/',
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
-
770
  let currentPage = 1;
771
- let currentFilter = 'popular';
772
- let currentGenre = null;
773
- let currentSearch = '';
774
  let totalPages = 1;
775
- let isLoading = false;
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 = {}) {
784
- const url = new URL(`${BASE_URL}${endpoint}`);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
785
 
786
- // Ajouter les paramètres par défaut
787
- const defaultParams = {
788
- language: 'fr-FR',
789
- api_key: API_KEY
790
- };
791
 
792
- // Fusionner les paramètres
793
- const queryParams = {...defaultParams, ...params};
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
794
 
795
- // Ajouter les paramètres à l'URL
796
- Object.keys(queryParams).forEach(key => {
797
- if (queryParams[key] !== undefined && queryParams[key] !== null) {
798
- url.searchParams.append(key, queryParams[key]);
799
- }
800
- });
801
 
 
 
 
 
 
802
  try {
803
- const response = await fetch(url);
804
-
805
- if (!response.ok) {
806
- throw new Error(`Erreur HTTP: ${response.status}`);
807
- }
808
 
809
- return await response.json();
 
 
 
 
 
 
 
 
810
  } catch (error) {
811
- console.error('Erreur API:', error);
812
- throw error;
813
  }
814
  }
815
 
816
- // Charger les films au démarrage
817
- document.addEventListener('DOMContentLoaded', function() {
818
- loadMovies();
819
-
820
- // Écouter la touche Entrée dans la recherche
821
- document.getElementById('search-input').addEventListener('keypress', function(e) {
822
- if (e.key === 'Enter') {
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;
967
 
968
- isLoading = true;
969
- showLoadingState();
 
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;
 
 
994
 
995
- if (currentPage === 1) {
996
- document.getElementById('movies-container').innerHTML = '';
997
- }
998
 
999
- if (data.results && data.results.length > 0) {
1000
- displayMovies(data.results);
1001
- updateLoadMoreButton();
 
 
 
1002
  } else {
1003
- showNoResults();
 
 
 
 
 
 
1004
  }
1005
  } catch (error) {
1006
- console.error('Error fetching movies:', error);
1007
- showErrorState(error.message);
 
 
 
 
 
 
1008
  } finally {
1009
- isLoading = false;
1010
  }
1011
  }
1012
 
1013
- // Afficher l'état de chargement
1014
- function showLoadingState() {
1015
- const container = document.getElementById('movies-container');
1016
- container.innerHTML = `
1017
- <div class="flex justify-center items-center py-12 col-span-full">
1018
- <div class="animate-spin rounded-full h-12 w-12 border-t-2 border-b-2 border-primary loading-spinner"></div>
1019
- </div>
1020
- `;
1021
- }
1022
-
1023
- // Afficher les films avec boutons de streaming
1024
- function displayMovies(movies) {
1025
- const container = document.getElementById('movies-container');
1026
-
1027
- movies.forEach(movie => {
1028
  const movieCard = document.createElement('div');
1029
- movieCard.className = 'movie-card bg-gray-800 rounded-lg overflow-hidden shadow-lg hover:shadow-xl transition-all duration-300 relative';
1030
-
1031
- // Utiliser l'image originale en haute qualité si disponible
1032
- const posterPath = movie.poster_path
1033
- ? `https://image.tmdb.org/t/p/w500${movie.poster_path}`
1034
- : 'https://via.placeholder.com/500x750?text=Affiche+non+disponible';
1035
-
1036
  movieCard.innerHTML = `
1037
- <div>
1038
- <div class="movie-poster w-full rounded-t-lg overflow-hidden ${!movie.poster_path ? 'placeholder-poster' : ''}">
1039
- <img src="${posterPath}"
1040
- alt="${movie.title || 'Titre inconnu'}"
1041
- class="w-full h-full object-cover"
1042
- onerror="this.src='https://via.placeholder.com/500x750?text=Image+non+chargée'; this.classList.add('placeholder-poster')">
 
 
 
 
 
1043
  </div>
1044
- <div class="p-4">
1045
- <h3 class="text-lg font-semibold text-white truncate">${movie.title || 'Titre inconnu'}</h3>
1046
- <div class="flex items-center mt-2">
1047
- <span class="text-yellow-400 text-sm">
1048
- <i class="fas fa-star"></i> ${movie.vote_average ? movie.vote_average.toFixed(1) : 'N/A'}
1049
- </span>
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
1058
- </button>
1059
  </div>
1060
- </div>
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
 
1070
- container.appendChild(movieCard);
 
 
 
 
 
1071
  });
1072
  }
1073
 
1074
- // Afficher un message d'erreur
1075
- function showErrorState(errorMessage) {
1076
- const container = document.getElementById('movies-container');
1077
- container.innerHTML = `
1078
- <div class="col-span-full py-6 px-4 error-message rounded-lg">
1079
- <div class="flex items-center">
1080
- <i class="fas fa-exclamation-triangle text-red-500 text-xl mr-3"></i>
1081
- <div>
1082
- <h3 class="text-lg font-medium text-white">Erreur lors du chargement des films</h3>
1083
- <p class="text-gray-300 mt-1">${errorMessage || 'Veuillez réessayer plus tard'}</p>
1084
- <button onclick="retryLoading()" class="mt-3 px-4 py-2 bg-primary text-white rounded-full hover:bg-secondary transition text-sm">
1085
- <i class="fas fa-sync-alt mr-2"></i> Réessayer
1086
- </button>
1087
- </div>
1088
- </div>
1089
- </div>
1090
- `;
1091
 
1092
- document.getElementById('load-more-container').classList.add('hidden');
1093
- }
1094
-
1095
- // Afficher un message quand aucun résultat n'est trouvé
1096
- function showNoResults() {
1097
- const container = document.getElementById('movies-container');
1098
- container.innerHTML = `
1099
- <div class="col-span-full text-center py-12">
1100
- <i class="fas fa-film text-4xl text-gray-500 mb-4"></i>
1101
- <h3 class="text-xl text-white">Aucun film trouvé</h3>
1102
- <p class="text-gray-400 mt-2">Essayez avec d'autres critères de recherche</p>
1103
- </div>
1104
- `;
1105
 
1106
- document.getElementById('load-more-container').classList.add('hidden');
1107
- }
1108
-
1109
- // Réessayer le chargement
1110
- function retryLoading() {
1111
- currentPage = 1;
1112
  loadMovies();
1113
  }
1114
 
1115
- // Mettre à jour le bouton "Voir plus"
1116
- function updateLoadMoreButton() {
1117
- const loadMoreContainer = document.getElementById('load-more-container');
 
1118
 
1119
- if (currentPage >= totalPages) {
1120
- loadMoreContainer.innerHTML = `
1121
- <p class="text-gray-400">Vous avez atteint la fin des résultats</p>
1122
- `;
1123
- } else {
1124
- loadMoreContainer.classList.remove('hidden');
1125
  }
1126
- }
1127
 
1128
- // Filtrer les films
1129
- function filterMovies(filter) {
1130
- currentFilter = filter;
1131
- currentGenre = null;
1132
- currentSearch = '';
1133
- currentPage = 1;
1134
- document.getElementById('search-input').value = '';
1135
- loadMovies();
1136
-
1137
- // Mettre à jour les boutons actifs
1138
- document.querySelectorAll('button').forEach(btn => {
1139
- if (btn.textContent.toLowerCase().includes(filter.replace('_', ' '))) {
1140
- btn.classList.remove('bg-gray-700');
1141
- btn.classList.add('bg-primary');
1142
- } else {
1143
- btn.classList.remove('bg-primary');
1144
- btn.classList.add('bg-gray-700');
1145
- }
1146
- });
1147
- }
1148
 
1149
- // Filtrer par genre
1150
- function filterByGenre(genreId) {
1151
- currentGenre = genreId;
1152
- currentSearch = '';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1153
  currentPage = 1;
1154
- document.getElementById('search-input').value = '';
1155
  loadMovies();
1156
-
1157
- // Mettre à jour les boutons actifs
1158
- document.querySelectorAll('.genre-btn').forEach(btn => {
1159
- btn.classList.remove('bg-primary');
1160
- if (btn.onclick.toString().includes(genreId.toString())) {
1161
- btn.classList.add('bg-primary');
1162
- }
1163
- });
1164
- }
1165
-
1166
- // Rechercher des films
1167
- function searchMovies() {
1168
- const query = document.getElementById('search-input').value.trim();
1169
- if (query) {
1170
- currentSearch = query;
1171
- currentGenre = null;
1172
- currentPage = 1;
1173
- loadMovies();
1174
- }
1175
- }
1176
 
1177
- // Charger plus de films
1178
- function loadMoreMovies() {
1179
- if (currentPage < totalPages) {
1180
- currentPage++;
1181
- loadMovies();
1182
- }
1183
- }
1184
 
1185
- // Afficher les détails du film
1186
- async function showMovieDetails(movieId) {
1187
- try {
1188
- const movie = await fetchAPI(`/movie/${movieId}`);
1189
- currentMovieId = movieId;
1190
-
1191
- // Récupérer l'ID IMDB si disponible
1192
- if (movie.imdb_id) {
1193
- currentIMDBId = movie.imdb_id;
1194
- } else {
1195
- // Si l'ID IMDB n'est pas disponible, essayer de le récupérer via l'API
1196
- const externalIds = await fetchAPI(`/movie/${movieId}/external_ids`);
1197
- currentIMDBId = externalIds.imdb_id || null;
1198
- }
1199
-
1200
- // Remplir la modal
1201
- const modalPoster = document.querySelector('#modal-poster img');
1202
- modalPoster.src = movie.poster_path
1203
- ? `https://image.tmdb.org/t/p/w500${movie.poster_path}`
1204
- : 'https://via.placeholder.com/500x750?text=Affiche+non+disponible';
1205
-
1206
- modalPoster.onerror = function() {
1207
- this.src = 'https://via.placeholder.com/500x750?text=Image+non+chargée';
1208
- };
1209
-
1210
- document.getElementById('modal-title').textContent = movie.title || 'Titre inconnu';
1211
- document.getElementById('modal-rating').textContent = `${movie.vote_average ? movie.vote_average.toFixed(1) : 'N/A'}/10`;
1212
- document.getElementById('modal-year').textContent = movie.release_date ? movie.release_date.substring(0, 4) : 'N/A';
1213
- document.getElementById('modal-runtime').textContent = movie.runtime ? `${movie.runtime} min` : '';
1214
- document.getElementById('modal-overview').textContent = movie.overview || 'Aucun synopsis disponible.';
1215
-
1216
- // Afficher les genres
1217
- const genresContainer = document.getElementById('modal-genres');
1218
- genresContainer.innerHTML = '';
1219
- if (movie.genres && movie.genres.length > 0) {
1220
- movie.genres.forEach(genre => {
1221
- const genreBadge = document.createElement('span');
1222
- genreBadge.className = 'bg-gray-700 text-white text-xs px-2 py-1 rounded';
1223
- genreBadge.textContent = genre.name;
1224
- genresContainer.appendChild(genreBadge);
1225
- });
1226
- } else {
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) {
1243
- console.error('Error fetching movie details:', error);
1244
- alert('Erreur lors du chargement des détails du film: ' + (error.message || 'Veuillez réessayer'));
1245
- }
1246
- }
1247
 
1248
- // Fermer la modal de détails
1249
- function closeModal() {
1250
- document.getElementById('movie-modal').classList.add('hidden');
1251
- }
1252
 
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
1271
- function startStreaming() {
1272
- if (currentMovieId) {
1273
- const movieTitle = document.getElementById('modal-title').textContent;
1274
- startAutoStreaming(currentMovieId, movieTitle);
1275
- closeModal();
1276
- }
1277
- }
1278
 
1279
- // Démarrer le streaming automatique dans une nouvelle fenêtre
1280
- async function startAutoStreaming(movieId, movieTitle) {
1281
- currentMovieId = movieId;
1282
-
1283
- // Afficher la fenêtre de streaming
1284
- const streamingWindow = document.getElementById('streaming-window');
1285
- document.getElementById('streaming-title').textContent = movieTitle;
1286
-
1287
- // Afficher l'état de chargement
1288
- const playerContainer = document.getElementById('streaming-player-container');
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
-
1296
- // Afficher la fenêtre de streaming
1297
- streamingWindow.classList.remove('hidden');
1298
-
1299
- // Récupérer les informations du film pour l'ID IMDB si nécessaire
1300
- let imdbId = currentIMDBId;
1301
- if (!imdbId && STREAMING_SERVERS[selectedServer].requiresIMDB) {
1302
- try {
1303
- const externalIds = await fetchAPI(`/movie/${movieId}/external_ids`);
1304
- imdbId = externalIds.imdb_id;
1305
- if (!imdbId) {
1306
- throw new Error("ID IMDB non disponible");
1307
- }
1308
- } catch (error) {
1309
- console.error("Erreur lors de la récupération de l'ID IMDB:", error);
1310
- playerContainer.innerHTML = `
1311
- <div class="flex flex-col items-center justify-center h-full text-red-400">
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;
1321
- }
1322
- }
1323
-
1324
- // Construire l'URL de streaming en fonction du serveur sélectionné
1325
- let streamingUrl;
1326
- const serverConfig = STREAMING_SERVERS[selectedServer];
1327
-
1328
- if (serverConfig.requiresTMDB) {
1329
- streamingUrl = serverConfig.url + movieId;
1330
- } else if (serverConfig.requiresIMDB && imdbId) {
1331
- streamingUrl = serverConfig.url + imdbId;
1332
- } else {
1333
- // Si aucun ID n'est disponible, utiliser TMDB par défaut
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
1349
- const iframe = document.createElement('iframe');
1350
- iframe.id = 'streaming-player';
1351
- iframe.src = streamingUrl;
1352
- iframe.setAttribute('allowfullscreen', '');
1353
- iframe.setAttribute('scrolling', 'no');
1354
- iframe.setAttribute('frameborder', '0');
1355
- iframe.setAttribute('marginwidth', '0');
1356
- iframe.setAttribute('marginheight', '0');
1357
- iframe.style.width = '100%';
1358
- iframe.style.height = '100%';
1359
- iframe.style.border = 'none';
1360
-
1361
- // Gestion des erreurs de chargement
1362
- iframe.onerror = function() {
1363
- playerContainer.innerHTML = `
1364
- <div class="flex flex-col items-center justify-center h-full text-red-400">
1365
- <i class="fas fa-exclamation-triangle text-4xl mb-4"></i>
1366
- <p class="text-lg">Erreur lors du chargement du flux vidéo</p>
1367
- <p class="text-sm text-gray-400 mt-2">Le serveur peut être temporairement indisponible</p>
1368
- <button onclick="tryAlternativeServer()" class="mt-4 px-4 py-2 bg-primary text-white rounded hover:bg-secondary transition">
1369
- <i class="fas fa-sync-alt mr-2"></i> Essayer un autre serveur
1370
- </button>
1371
- </div>
1372
- `;
1373
- };
1374
-
1375
- // Remplacer le chargement par le lecteur
1376
- playerContainer.innerHTML = '';
1377
- playerContainer.appendChild(iframe);
1378
-
1379
- // Mettre le focus sur la fenêtre de streaming
1380
- streamingWindow.focus();
1381
-
1382
- // Tentative de lecture automatique (peut être bloquée par le navigateur)
1383
- setTimeout(() => {
1384
- try {
1385
- iframe.contentWindow.postMessage('{"event":"command","func":"playVideo","args":""}', '*');
1386
- } catch (e) {
1387
- console.log("Auto-play blocked by browser");
1388
- }
1389
- }, 2000);
1390
- }
1391
 
1392
- // Essayer un autre serveur en cas d'erreur
1393
- function tryAlternativeServer() {
1394
- const servers = Object.keys(STREAMING_SERVERS);
1395
- const currentIndex = servers.indexOf(selectedServer);
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
1406
- function closeStreamingWindow() {
1407
- const playerContainer = document.getElementById('streaming-player-container');
1408
- playerContainer.innerHTML = '';
1409
- document.getElementById('streaming-window').classList.add('hidden');
1410
- }
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
-
1418
- // Basculer en plein écran
1419
- function toggleFullscreen() {
1420
- const playerContainer = document.getElementById('streaming-player-container');
1421
- if (playerContainer.requestFullscreen) {
1422
- playerContainer.requestFullscreen();
1423
- } else if (playerContainer.webkitRequestFullscreen) {
1424
- playerContainer.webkitRequestFullscreen();
1425
- } else if (playerContainer.msRequestFullscreen) {
1426
- playerContainer.msRequestFullscreen();
1427
- }
1428
- }
1429
  </script>
1430
  <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/cinestream-ia" style="color: #fff;text-decoration: underline;" target="_blank" >Remix</a></p></body>
1431
  </html>
 
3
  <head>
4
  <meta charset="UTF-8">
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>CinéAuto - Plateforme de Streaming Automatisé</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 src="https://cdn.jsdelivr.net/npm/hls.js@latest"></script>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10
  <style>
11
  @import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap');
12
 
 
18
 
19
  .movie-card {
20
  transition: all 0.3s ease;
21
+ position: relative;
22
  }
23
 
24
  .movie-card:hover {
25
+ transform: translateY(-5px);
26
+ box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.3);
27
  }
28
 
29
+ .poster-placeholder {
30
+ background: linear-gradient(135deg, #1e293b 0%, #0f172a 100%);
 
31
  }
32
 
33
  .loading-spinner {
 
39
  100% { transform: rotate(360deg); }
40
  }
41
 
42
+ #video-player {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
43
  width: 100%;
44
+ height: 70vh;
45
+ background-color: black;
 
 
 
 
 
46
  }
47
 
48
+ .progress-container {
49
+ height: 5px;
50
+ background-color: #334155;
51
  }
52
 
53
+ .progress-bar {
 
 
 
 
 
54
  height: 100%;
55
+ background-color: #8b5cf6;
56
+ width: 0%;
 
 
57
  }
58
 
59
+ .automation-panel {
60
+ background: rgba(15, 23, 42, 0.9);
61
+ backdrop-filter: blur(10px);
 
 
 
62
  }
63
 
64
+ .genre-filter {
65
+ scrollbar-width: thin;
66
+ scrollbar-color: #8b5cf6 #1e293b;
 
 
67
  }
68
 
69
+ .genre-filter::-webkit-scrollbar {
70
+ height: 6px;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
71
  }
72
 
73
+ .genre-filter::-webkit-scrollbar-track {
74
+ background: #1e293b;
 
 
 
 
 
75
  }
76
 
77
+ .genre-filter::-webkit-scrollbar-thumb {
78
+ background-color: #8b5cf6;
79
+ border-radius: 6px;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
80
  }
81
  </style>
82
  </head>
 
87
  <div class="flex items-center justify-between h-16">
88
  <div class="flex items-center">
89
  <div class="flex-shrink-0">
90
+ <span class="text-2xl font-bold text-purple-400">CinéAuto</span>
91
  </div>
92
  <div class="hidden md:block ml-10">
93
  <div class="flex space-x-4">
94
+ <a href="#" class="text-white px-3 py-2 rounded-md text-sm font-medium bg-purple-600">Accueil</a>
95
+ <a href="#" class="text-gray-300 hover:text-white px-3 py-2 rounded-md text-sm font-medium">Bibliothèque</a>
96
+ <a href="#" class="text-gray-300 hover:text-white px-3 py-2 rounded-md text-sm font-medium">Automatisation</a>
97
+ <a href="#" class="text-gray-300 hover:text-white px-3 py-2 rounded-md text-sm font-medium">Serveurs</a>
98
  </div>
99
  </div>
100
  </div>
 
102
  <div class="ml-4 flex items-center md:ml-6">
103
  <div class="relative mx-4">
104
  <input type="text" id="search-input" placeholder="Rechercher un film..."
105
+ class="bg-gray-800 text-white px-4 py-2 rounded-full w-64 focus:outline-none focus:ring-2 focus:ring-purple-500">
106
+ <button id="search-btn" class="absolute right-3 top-2 text-gray-400 hover:text-white">
107
  <i class="fas fa-search"></i>
108
  </button>
109
  </div>
110
+ <button class="p-1 rounded-full text-gray-400 hover:text-white focus:outline-none">
 
 
 
 
111
  <i class="fas fa-user-circle text-xl"></i>
112
  </button>
113
  </div>
 
124
  <!-- Main Content -->
125
  <main class="pt-24 pb-12">
126
  <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
127
+ <!-- Player Section -->
128
+ <section class="mb-12 rounded-xl overflow-hidden shadow-2xl">
129
+ <div id="video-player">
130
+ <video id="video" class="w-full h-full" controls></video>
131
+ <div id="player-overlay" class="hidden absolute inset-0 bg-black bg-opacity-70 flex flex-col items-center justify-center">
132
+ <div class="text-center p-6">
133
+ <h2 class="text-2xl font-bold text-white mb-4">CinéAuto Player</h2>
134
+ <p class="text-gray-300 mb-6">Lecteur haute performance avec streaming adaptatif et automatisation intelligente</p>
135
+ <button id="start-demo" class="bg-purple-600 hover:bg-purple-700 text-white px-6 py-3 rounded-lg font-medium">
136
+ <i class="fas fa-play mr-2"></i> Démarrer la démo
137
+ </button>
138
+ </div>
139
  </div>
140
+ </div>
141
+ <div class="bg-gray-800 p-4">
142
+ <div class="flex justify-between items-center mb-2">
143
+ <h2 id="current-movie-title" class="text-xl font-bold text-white">Aucun film sélectionné</h2>
144
+ <div class="flex items-center space-x-4">
145
+ <button id="auto-next" class="text-purple-400 hover:text-purple-300">
146
+ <i class="fas fa-robot"></i> Auto
147
+ </button>
148
+ <button id="quality-btn" class="text-gray-300 hover:text-white">
149
+ <i class="fas fa-tachometer-alt"></i> 1080p
150
+ </button>
151
  </div>
152
+ </div>
153
+ <div class="progress-container mb-2">
154
+ <div id="progress-bar" class="progress-bar"></div>
155
+ </div>
156
+ <div class="flex justify-between text-sm text-gray-400">
157
+ <span id="current-time">00:00:00</span>
158
+ <span id="duration">00:00:00</span>
159
+ </div>
160
  </div>
161
+ </section>
162
 
163
+ <!-- Automation Panel -->
164
+ <section class="mb-12 automation-panel rounded-xl p-6 shadow-lg">
165
+ <h2 class="text-2xl font-bold text-white mb-6">Panneau d'Automatisation</h2>
166
+ <div class="grid grid-cols-1 md:grid-cols-3 gap-6">
167
+ <div class="bg-gray-800 p-4 rounded-lg">
168
+ <h3 class="text-lg font-semibold text-white mb-3"><i class="fas fa-cog mr-2"></i>Paramètres</h3>
169
+ <div class="space-y-4">
170
+ <div>
171
+ <label class="block text-sm text-gray-300 mb-1">Mode de lecture</label>
172
+ <select id="playback-mode" class="w-full bg-gray-700 text-white rounded px-3 py-2">
173
+ <option value="sequential">Séquentiel</option>
174
+ <option value="random">Aléatoire</option>
175
+ <option value="by_genre">Par genre</option>
176
+ <option value="by_year">Par année</option>
177
+ </select>
178
+ </div>
179
+ <div>
180
+ <label class="block text-sm text-gray-300 mb-1">Qualité automatique</label>
181
+ <label class="inline-flex items-center">
182
+ <input type="checkbox" id="adaptive-quality" class="form-checkbox h-5 w-5 text-purple-600" checked>
183
+ <span class="ml-2 text-gray-300">Adaptative</span>
184
+ </label>
185
+ </div>
186
+ </div>
187
+ </div>
188
+
189
+ <div class="bg-gray-800 p-4 rounded-lg">
190
+ <h3 class="text-lg font-semibold text-white mb-3"><i class="fas fa-server mr-2"></i>Serveurs</h3>
191
+ <div class="space-y-3">
192
+ <div class="flex justify-between items-center">
193
+ <span class="text-gray-300">Serveur Principal</span>
194
+ <span class="text-green-400 text-sm font-mono">En ligne</span>
195
+ </div>
196
+ <div class="flex justify-between items-center">
197
+ <span class="text-gray-300">Serveur Secondaire</span>
198
+ <span class="text-green-400 text-sm font-mono">En ligne</span>
199
+ </div>
200
+ <div class="flex justify-between items-center">
201
+ <span class="text-gray-300">Serveur Cloud</span>
202
+ <span class="text-green-400 text-sm font-mono">En ligne</span>
203
+ </div>
204
+ <div class="mt-4">
205
+ <button id="optimize-servers" class="w-full bg-purple-600 hover:bg-purple-700 text-white py-2 rounded">
206
+ <i class="fas fa-sync-alt mr-2"></i> Optimiser les serveurs
207
+ </button>
208
+ </div>
209
+ </div>
210
+ </div>
211
+
212
+ <div class="bg-gray-800 p-4 rounded-lg">
213
+ <h3 class="text-lg font-semibold text-white mb-3"><i class="fas fa-bolt mr-2"></i>Actions Rapides</h3>
214
+ <div class="grid grid-cols-2 gap-3">
215
+ <button id="play-btn" class="bg-blue-600 hover:bg-blue-700 text-white py-2 px-3 rounded text-sm">
216
+ <i class="fas fa-play mr-1"></i> Démarrer
217
+ </button>
218
+ <button id="pause-btn" class="bg-gray-700 hover:bg-gray-600 text-white py-2 px-3 rounded text-sm">
219
+ <i class="fas fa-pause mr-1"></i> Pause
220
+ </button>
221
+ <button id="random-btn" class="bg-purple-600 hover:bg-purple-700 text-white py-2 px-3 rounded text-sm">
222
+ <i class="fas fa-random mr-1"></i> Aléatoire
223
+ </button>
224
+ <button id="add-to-list" class="bg-green-600 hover:bg-green-700 text-white py-2 px-3 rounded text-sm">
225
+ <i class="fas fa-plus mr-1"></i> Liste
226
+ </button>
227
+ <button id="favorite-btn" class="bg-yellow-600 hover:bg-yellow-700 text-white py-2 px-3 rounded text-sm">
228
+ <i class="fas fa-star mr-1"></i> Favoris
229
+ </button>
230
+ <button id="stop-btn" class="bg-red-600 hover:bg-red-700 text-white py-2 px-3 rounded text-sm">
231
+ <i class="fas fa-times mr-1"></i> Stop
232
+ </button>
233
+ </div>
234
  </div>
235
+ </div>
236
+ </section>
237
+
238
+ <!-- Filters -->
239
+ <section class="mb-6 bg-gray-800 rounded-lg p-4">
240
+ <div class="flex flex-wrap items-center justify-between gap-4">
241
+ <div class="flex items-center space-x-4">
242
+ <h3 class="text-lg font-semibold text-white">Filtres :</h3>
243
+
244
+ <select id="year-filter" class="bg-gray-700 text-white rounded px-3 py-2 text-sm">
245
+ <option value="">Toutes les années</option>
246
+ <option value="2023">2023</option>
247
+ <option value="2022">2022</option>
248
+ <option value="2021">2021</option>
249
+ <option value="2020">2020</option>
250
+ <option value="2010-2019">2010-2019</option>
251
+ <option value="2000-2009">2000-2009</option>
252
+ <option value="1990-1999">1990-1999</option>
253
+ <option value="1980-1989">1980-1989</option>
254
+ <option value="1970-1979">1970-1979</option>
255
+ </select>
256
+
257
+ <select id="rating-filter" class="bg-gray-700 text-white rounded px-3 py-2 text-sm">
258
+ <option value="0">Toutes les notes</option>
259
+ <option value="9">9+</option>
260
+ <option value="8">8+</option>
261
+ <option value="7">7+</option>
262
+ <option value="6">6+</option>
263
+ </select>
264
  </div>
265
+
266
+ <div class="flex items-center space-x-2">
267
+ <span class="text-sm text-gray-300">Trier par :</span>
268
+ <select id="sort-by" class="bg-gray-700 text-white rounded px-3 py-2 text-sm">
269
+ <option value="popularity.desc">Popularité</option>
270
+ <option value="vote_average.desc">Note</option>
271
+ <option value="release_date.desc">Date de sortie</option>
272
+ <option value="revenue.desc">Box-office</option>
273
+ </select>
274
  </div>
275
  </div>
276
+
277
+ <div class="mt-4 genre-filter flex space-x-3 overflow-x-auto py-2">
278
+ <button class="genre-tag px-3 py-1 bg-gray-700 hover:bg-purple-600 text-white rounded-full text-sm whitespace-nowrap" data-id="">Tous</button>
279
+ <!-- Genres will be loaded here -->
280
+ </div>
281
+ </section>
282
 
283
+ <!-- Movie Library -->
284
  <section class="mb-12">
285
  <div class="flex justify-between items-center mb-6">
286
+ <h2 class="text-2xl font-bold text-white">
287
+ <span id="library-title">Bibliothèque de Films</span>
288
+ <span id="movie-count" class="text-gray-400 text-lg ml-2">(Chargement...)</span>
289
+ </h2>
290
+ <div class="flex space-x-3">
291
+ <button id="refresh-btn" class="px-4 py-2 bg-gray-800 hover:bg-gray-700 text-white rounded-lg">
292
+ <i class="fas fa-sync-alt mr-2"></i>Actualiser
293
+ </button>
294
+ <button id="random-movie-btn" class="px-4 py-2 bg-purple-600 hover:bg-purple-700 text-white rounded-lg">
295
+ <i class="fas fa-random mr-2"></i>Aléatoire
296
+ </button>
297
  </div>
298
  </div>
299
 
300
+ <div id="loading-indicator" class="flex justify-center items-center py-12">
301
+ <div class="animate-spin rounded-full h-12 w-12 border-t-2 border-b-2 border-purple-500"></div>
 
 
 
302
  </div>
303
 
304
+ <div class="grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 gap-6" id="movie-library">
305
+ <!-- Movie cards will be loaded here -->
 
 
 
306
  </div>
307
+
308
+ <div id="load-more-container" class="mt-8 text-center hidden">
309
+ <button id="load-more-btn" class="px-6 py-3 bg-gray-800 hover:bg-gray-700 text-white rounded-lg font-medium">
310
+ <i class="fas fa-arrow-down mr-2"></i> Charger plus de films
311
+ </button>
 
 
 
 
 
 
 
312
  </div>
313
  </section>
314
  </div>
 
319
  <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
320
  <div class="grid grid-cols-1 md:grid-cols-4 gap-8">
321
  <div>
322
+ <h3 class="text-white text-lg font-semibold mb-4">CinéAuto</h3>
323
+ <p class="text-sm">Plateforme de streaming automatisé avec lecteur haute performance et gestion intelligente des serveurs.</p>
324
  </div>
325
  <div>
326
+ <h3 class="text-white text-lg font-semibold mb-4">Technologies</h3>
327
  <ul class="space-y-2 text-sm">
328
+ <li><span class="text-purple-400">HLS.js</span> - Streaming adaptatif</li>
329
+ <li><span class="text-purple-400">WebRTC</span> - P2P optimisé</li>
330
+ <li><span class="text-purple-400">AI</span> - Recommandations</li>
 
331
  </ul>
332
  </div>
333
  <div>
334
+ <h3 class="text-white text-lg font-semibold mb-4">Performances</h3>
335
  <ul class="space-y-2 text-sm">
336
+ <li><i class="fas fa-bolt text-yellow-400 mr-2"></i>Latence minimale</li>
337
+ <li><i class="fas fa-tachometer-alt text-green-400 mr-2"></i>4K Ultra HD</li>
338
+ <li><i class="fas fa-server text-blue-400 mr-2"></i>15 serveurs mondiaux</li>
339
  </ul>
340
  </div>
341
  <div>
342
+ <h3 class="text-white text-lg font-semibold mb-4">Support</h3>
343
  <div class="flex space-x-4">
 
 
 
344
  <a href="#" class="text-gray-400 hover:text-white"><i class="fab fa-discord"></i></a>
345
+ <a href="#" class="text-gray-400 hover:text-white"><i class="fas fa-envelope"></i></a>
346
+ <a href="#" class="text-gray-400 hover:text-white"><i class="fas fa-question-circle"></i></a>
347
  </div>
348
  </div>
349
  </div>
350
  <div class="border-t border-gray-800 mt-8 pt-8 text-sm text-center">
351
+ <p>© 2023 CinéAuto. Système automatisé de streaming haute performance.</p>
352
+ <p class="mt-2 text-xs text-gray-600">Cette application utilise l'API TMDb mais n'est pas approuvée ou certifiée par TMDb.</p>
353
  </div>
354
  </div>
355
  </footer>
356
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
357
  <script>
358
  // Configuration
359
+ const TMDB_API_KEY = 'fb437b10727a5a4eb8d9134e29c82ae0';
360
+ const TMDB_ACCESS_TOKEN = 'eyJhbGciOiJIUzI1NiJ9.eyJhdWQiOiJmYjQzN2IxMDcyN2E1YTRlYjhkOTEzNGUyOWM4MmFlMCIsIm5iZiI6MTY4MDYzNzkxMC44NjUsInN1YiI6IjY0MmM3ZmQ2OGI5NTllMDBmNDRkNzNhMCIsInNjb3BlcyI6WyJhcGlfcmVhZCJdLCJ2ZXJzaW9uIjoxfQ.Nhl261Ha3z0Ujg5vM1PpFoZBiTGjlXQ1g9VFPh6dVvs';
361
  const BASE_URL = 'https://api.themoviedb.org/3';
362
+ const IMAGE_BASE_URL = 'https://image.tmdb.org/t/p/w500';
363
+ const BACKDROP_BASE_URL = 'https://image.tmdb.org/t/p/original';
364
+
365
+ // Elements
366
+ const video = document.getElementById('video');
367
+ const videoPlayer = document.getElementById('video-player');
368
+ const playerOverlay = document.getElementById('player-overlay');
369
+ const progressBar = document.getElementById('progress-bar');
370
+ const currentTime = document.getElementById('current-time');
371
+ const duration = document.getElementById('duration');
372
+ const autoNextBtn = document.getElementById('auto-next');
373
+ const movieLibrary = document.getElementById('movie-library');
374
+ const currentMovieTitle = document.getElementById('current-movie-title');
375
+ const loadingIndicator = document.getElementById('loading-indicator');
376
+ const loadMoreContainer = document.getElementById('load-more-container');
377
+ const loadMoreBtn = document.getElementById('load-more-btn');
378
+ const movieCount = document.getElementById('movie-count');
379
+ const libraryTitle = document.getElementById('library-title');
380
+ const searchInput = document.getElementById('search-input');
381
+ const searchBtn = document.getElementById('search-btn');
382
+ const refreshBtn = document.getElementById('refresh-btn');
383
+ const randomMovieBtn = document.getElementById('random-movie-btn');
384
+ const genreFilterContainer = document.querySelector('.genre-filter');
385
+ const yearFilter = document.getElementById('year-filter');
386
+ const ratingFilter = document.getElementById('rating-filter');
387
+ const sortBy = document.getElementById('sort-by');
388
+ const startDemoBtn = document.getElementById('start-demo');
389
+
390
+ // Player controls
391
+ const playBtn = document.getElementById('play-btn');
392
+ const pauseBtn = document.getElementById('pause-btn');
393
+ const randomBtn = document.getElementById('random-btn');
394
+ const addToListBtn = document.getElementById('add-to-list');
395
+ const favoriteBtn = document.getElementById('favorite-btn');
396
+ const stopBtn = document.getElementById('stop-btn');
397
+
398
+ // State
399
+ let hls = new Hls();
400
+ let autoPlayEnabled = true;
401
+ let currentMovieIndex = 0;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
402
  let currentPage = 1;
 
 
 
403
  let totalPages = 1;
404
+ let totalResults = 0;
405
+ let currentMovies = [];
406
+ let genres = [];
407
+ let currentGenre = '';
408
+ let currentSearchQuery = '';
409
+ let isSearching = false;
410
+
411
+ // Initialize player
412
+ function initPlayer(movie) {
413
+ // In a real app, you would use actual video sources
414
+ // For demo purposes, we'll use a placeholder
415
+ const demoVideoUrl = 'https://test-streams.mux.dev/x36xhzz/x36xhzz.m3u8';
416
+
417
+ if (Hls.isSupported()) {
418
+ hls.loadSource(demoVideoUrl);
419
+ hls.attachMedia(video);
420
+ hls.on(Hls.Events.MANIFEST_PARSED, function() {
421
+ video.play();
422
+ playerOverlay.classList.add('hidden');
423
+ });
424
+ } else if (video.canPlayType('application/vnd.apple.mpegurl')) {
425
+ video.src = demoVideoUrl;
426
+ video.addEventListener('loadedmetadata', function() {
427
+ video.play();
428
+ playerOverlay.classList.add('hidden');
429
+ });
430
+ }
431
 
432
+ currentMovieTitle.textContent = `${movie.title} (${movie.release_date ? movie.release_date.substring(0, 4) : 'N/A'})`;
 
 
 
 
433
 
434
+ // Update video player background with movie backdrop
435
+ if (movie.backdrop_path) {
436
+ videoPlayer.style.backgroundImage = `url(${BACKDROP_BASE_URL}${movie.backdrop_path})`;
437
+ videoPlayer.style.backgroundSize = 'cover';
438
+ videoPlayer.style.backgroundPosition = 'center';
439
+ }
440
+ }
441
+
442
+ // Format time
443
+ function formatTime(seconds) {
444
+ const h = Math.floor(seconds / 3600);
445
+ const m = Math.floor((seconds % 3600) / 60);
446
+ const s = Math.floor(seconds % 60);
447
+ return `${h.toString().padStart(2, '0')}:${m.toString().padStart(2, '0')}:${s.toString().padStart(2, '0')}`;
448
+ }
449
+
450
+ // Play next movie
451
+ function playNextMovie() {
452
+ const playbackMode = document.getElementById('playback-mode').value;
453
 
454
+ if (playbackMode === 'random') {
455
+ currentMovieIndex = Math.floor(Math.random() * currentMovies.length);
456
+ } else {
457
+ currentMovieIndex = (currentMovieIndex + 1) % currentMovies.length;
458
+ }
 
459
 
460
+ initPlayer(currentMovies[currentMovieIndex]);
461
+ }
462
+
463
+ // Load genres from TMDB
464
+ async function loadGenres() {
465
  try {
466
+ const response = await fetch(`${BASE_URL}/genre/movie/list?api_key=${TMDB_API_KEY}&language=fr-FR`);
467
+ const data = await response.json();
468
+ genres = data.genres;
 
 
469
 
470
+ // Add genre tags to filter
471
+ genres.forEach(genre => {
472
+ const genreTag = document.createElement('button');
473
+ genreTag.className = 'genre-tag px-3 py-1 bg-gray-700 hover:bg-purple-600 text-white rounded-full text-sm whitespace-nowrap';
474
+ genreTag.textContent = genre.name;
475
+ genreTag.dataset.id = genre.id;
476
+ genreTag.addEventListener('click', () => filterByGenre(genre.id, genre.name));
477
+ genreFilterContainer.appendChild(genreTag);
478
+ });
479
  } catch (error) {
480
+ console.error('Error loading genres:', error);
 
481
  }
482
  }
483
 
484
+ // Filter by genre
485
+ function filterByGenre(genreId, genreName) {
486
+ currentGenre = genreId;
487
+ currentPage = 1;
488
+ isSearching = false;
489
+ currentSearchQuery = '';
490
+
491
+ // Update UI
492
+ document.querySelectorAll('.genre-tag').forEach(tag => {
493
+ if (tag.dataset.id === genreId.toString()) {
494
+ tag.classList.add('bg-purple-600');
495
+ tag.classList.remove('bg-gray-700');
 
 
 
 
 
 
 
496
  } else {
497
+ tag.classList.remove('bg-purple-600');
498
+ tag.classList.add('bg-gray-700');
 
 
499
  }
500
  });
501
 
502
+ libraryTitle.textContent = genreName ? `Films ${genreName}` : 'Bibliothèque de Films';
503
+ loadMovies();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
504
  }
505
 
506
+ // Load movies from TMDB
507
+ async function loadMovies() {
508
+ loadingIndicator.classList.remove('hidden');
509
+ movieLibrary.innerHTML = '';
510
+ loadMoreContainer.classList.add('hidden');
511
+
512
+ let url;
513
+ if (isSearching) {
514
+ url = `${BASE_URL}/search/movie?api_key=${TMDB_API_KEY}&language=fr-FR&query=${encodeURIComponent(currentSearchQuery)}&page=${currentPage}`;
515
+ } else if (currentGenre) {
516
+ url = `${BASE_URL}/discover/movie?api_key=${TMDB_API_KEY}&language=fr-FR&with_genres=${currentGenre}&page=${currentPage}`;
517
+ } else {
518
+ url = `${BASE_URL}/movie/popular?api_key=${TMDB_API_KEY}&language=fr-FR&page=${currentPage}`;
 
 
 
519
  }
 
 
 
 
 
 
520
 
521
+ // Add filters
522
+ const yearValue = yearFilter.value;
523
+ const ratingValue = ratingFilter.value;
524
+ const sortValue = sortBy.value;
 
 
 
525
 
526
+ if (yearValue) {
527
+ if (yearValue.includes('-')) {
528
+ const [start, end] = yearValue.split('-');
529
+ url += `&primary_release_date.gte=${start}-01-01&primary_release_date.lte=${end}-12-31`;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
530
  } else {
531
+ url += `&primary_release_year=${yearValue}`;
 
532
  }
 
 
 
 
 
 
533
  }
534
+
535
+ if (ratingValue > 0) {
536
+ url += `&vote_average.gte=${ratingValue}`;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
537
  }
 
 
 
 
 
538
 
539
+ if (sortValue) {
540
+ url += `&sort_by=${sortValue}`;
541
+ }
542
 
543
  try {
544
+ const response = await fetch(url);
545
+ const data = await response.json();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
546
 
547
+ currentMovies = data.results;
548
+ totalPages = data.total_pages;
549
+ totalResults = data.total_results;
550
 
551
+ movieCount.textContent = `(${totalResults.toLocaleString()} disponibles)`;
 
 
552
 
553
+ if (currentMovies.length > 0) {
554
+ renderMovies(currentMovies);
555
+
556
+ if (currentPage < totalPages) {
557
+ loadMoreContainer.classList.remove('hidden');
558
+ }
559
  } else {
560
+ movieLibrary.innerHTML = `
561
+ <div class="col-span-full text-center py-12">
562
+ <i class="fas fa-film text-4xl text-gray-600 mb-4"></i>
563
+ <h3 class="text-xl text-white">Aucun film trouvé</h3>
564
+ <p class="text-gray-400 mt-2">Essayez de modifier vos filtres de recherche</p>
565
+ </div>
566
+ `;
567
  }
568
  } catch (error) {
569
+ console.error('Error loading movies:', error);
570
+ movieLibrary.innerHTML = `
571
+ <div class="col-span-full text-center py-12">
572
+ <i class="fas fa-exclamation-triangle text-4xl text-red-500 mb-4"></i>
573
+ <h3 class="text-xl text-white">Erreur de chargement</h3>
574
+ <p class="text-gray-400 mt-2">Impossible de charger les films. Veuillez réessayer.</p>
575
+ </div>
576
+ `;
577
  } finally {
578
+ loadingIndicator.classList.add('hidden');
579
  }
580
  }
581
 
582
+ // Render movies
583
+ function renderMovies(movies) {
584
+ movies.forEach((movie, index) => {
 
 
 
 
 
 
 
 
 
 
 
 
585
  const movieCard = document.createElement('div');
586
+ movieCard.className = 'movie-card bg-gray-800 rounded-lg overflow-hidden shadow-lg cursor-pointer';
 
 
 
 
 
 
587
  movieCard.innerHTML = `
588
+ <div class="relative h-64">
589
+ ${movie.poster_path ?
590
+ `<img src="${IMAGE_BASE_URL}${movie.poster_path}" alt="${movie.title}" class="w-full h-full object-cover">` :
591
+ `<div class="poster-placeholder w-full h-full flex items-center justify-center">
592
+ <i class="fas fa-film text-4xl text-gray-600"></i>
593
+ </div>`
594
+ }
595
+ <div class="absolute inset-0 bg-black bg-opacity-30 opacity-0 hover:opacity-100 transition flex items-center justify-center">
596
+ <button class="play-btn bg-purple-600 hover:bg-purple-700 text-white rounded-full w-12 h-12 flex items-center justify-center">
597
+ <i class="fas fa-play"></i>
598
+ </button>
599
  </div>
600
+ ${movie.vote_average ? `
601
+ <div class="absolute top-2 left-2 bg-gray-900 bg-opacity-80 text-yellow-400 px-2 py-1 rounded text-xs font-bold">
602
+ ${movie.vote_average.toFixed(1)} <i class="fas fa-star"></i>
 
 
 
 
 
 
 
 
 
 
 
 
603
  </div>
604
+ ` : ''}
605
+ </div>
606
+ <div class="p-4">
607
+ <h3 class="text-white font-medium truncate">${movie.title}</h3>
608
+ <div class="flex items-center mt-2">
609
+ <span class="text-gray-400 text-sm">
610
+ ${movie.release_date ? movie.release_date.substring(0, 4) : 'N/A'}
611
+ </span>
612
+ <span class="text-gray-400 text-sm ml-auto">
613
+ ${movie.genre_ids && genres.length ?
614
+ genres.find(g => g.id === movie.genre_ids[0])?.name || '' : ''}
615
+ </span>
616
  </div>
617
  </div>
618
  `;
619
 
620
+ movieCard.addEventListener('click', () => {
621
+ currentMovieIndex = index;
622
+ initPlayer(movie);
623
+ });
624
+
625
+ movieLibrary.appendChild(movieCard);
626
  });
627
  }
628
 
629
+ // Search movies
630
+ function searchMovies(query) {
631
+ currentSearchQuery = query.trim();
632
+ isSearching = currentSearchQuery.length > 0;
633
+ currentPage = 1;
634
+ currentGenre = '';
 
 
 
 
 
 
 
 
 
 
 
635
 
636
+ // Update UI
637
+ document.querySelectorAll('.genre-tag').forEach(tag => {
638
+ tag.classList.remove('bg-purple-600');
639
+ tag.classList.add('bg-gray-700');
640
+ });
 
 
 
 
 
 
 
 
641
 
642
+ libraryTitle.textContent = isSearching ? `Résultats pour "${currentSearchQuery}"` : 'Bibliothèque de Films';
 
 
 
 
 
643
  loadMovies();
644
  }
645
 
646
+ // Event listeners
647
+ video.addEventListener('timeupdate', function() {
648
+ const progress = (video.currentTime / video.duration) * 100;
649
+ progressBar.style.width = progress + '%';
650
 
651
+ currentTime.textContent = formatTime(video.currentTime);
652
+ duration.textContent = formatTime(video.duration);
653
+
654
+ if (autoPlayEnabled && video.currentTime > 0 && video.duration > 0 &&
655
+ (video.duration - video.currentTime) < 1) {
656
+ playNextMovie();
657
  }
658
+ });
659
 
660
+ autoNextBtn.addEventListener('click', function() {
661
+ autoPlayEnabled = !autoPlayEnabled;
662
+ this.classList.toggle('text-purple-400');
663
+ this.classList.toggle('text-green-400');
664
+ this.innerHTML = autoPlayEnabled ? '<i class="fas fa-robot"></i> Auto ON' : '<i class="fas fa-robot"></i> Auto OFF';
665
+ });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
666
 
667
+ playBtn.addEventListener('click', () => video.play());
668
+ pauseBtn.addEventListener('click', () => video.pause());
669
+ stopBtn.addEventListener('click', () => {
670
+ video.pause();
671
+ video.currentTime = 0;
672
+ });
673
+
674
+ randomBtn.addEventListener('click', () => {
675
+ currentMovieIndex = Math.floor(Math.random() * currentMovies.length);
676
+ initPlayer(currentMovies[currentMovieIndex]);
677
+ });
678
+
679
+ searchBtn.addEventListener('click', () => searchMovies(searchInput.value));
680
+ searchInput.addEventListener('keypress', (e) => {
681
+ if (e.key === 'Enter') searchMovies(searchInput.value);
682
+ });
683
+
684
+ refreshBtn.addEventListener('click', () => {
685
  currentPage = 1;
 
686
  loadMovies();
687
+ });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
688
 
689
+ randomMovieBtn.addEventListener('click', () => {
690
+ currentMovieIndex = Math.floor(Math.random() * currentMovies.length);
691
+ initPlayer(currentMovies[currentMovieIndex]);
692
+ });
 
 
 
693
 
694
+ loadMoreBtn.addEventListener('click', () => {
695
+ currentPage++;
696
+ loadMovies();
697
+ });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
698
 
699
+ yearFilter.addEventListener('change', () => {
700
+ currentPage = 1;
701
+ loadMovies();
702
+ });
703
 
704
+ ratingFilter.addEventListener('change', () => {
705
+ currentPage = 1;
706
+ loadMovies();
707
+ });
 
 
 
 
 
 
 
 
 
 
 
 
708
 
709
+ sortBy.addEventListener('change', () => {
710
+ currentPage = 1;
711
+ loadMovies();
712
+ });
 
 
 
 
713
 
714
+ startDemoBtn.addEventListener('click', () => {
715
+ if (currentMovies.length > 0) {
716
+ initPlayer(currentMovies[0]);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
717
  }
718
+ });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
719
 
720
+ // Initialize
721
+ document.addEventListener('DOMContentLoaded', function() {
722
+ loadGenres();
723
+ loadMovies();
 
 
 
 
 
724
 
725
+ // Show player overlay initially
726
+ playerOverlay.classList.remove('hidden');
727
+ });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
728
  </script>
729
  <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/cinestream-ia" style="color: #fff;text-decoration: underline;" target="_blank" >Remix</a></p></body>
730
  </html>
prompts.txt CHANGED
@@ -2,4 +2,11 @@ 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
 
 
 
 
 
 
 
 
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
6
+ je veux des vrais serveurs reel je veux pas des serveurs d'exemple
7
+ AJOUTER PLUS IA DE SERVEUR
8
+ charger les 978988 films directement en auto , GO Lien 1 :netuAdd: 9-04-2025, 13:01HDTV Lien 2 :doodstreamAdd: 9-04-2025, 13:01HDTV Lien 3 :uqloadAdd: 9-04-2025, 13:01HDTV Lien 4 :uptostreamAdd: 9-04-2025, 13:01HDTV Lien 5 :vidozaAdd: 9-04-2025, 13:01HDTV Lien 6 :upvidAdd: 9-04-2025, 13:01HDTV Lien 7 :netuAdd: 9-04-2025, 13:01HDTV Lien 8 :doodstreamAdd: 9-04-2025, 13:01HDTV Lien 9 :uqloadAdd: 9-04-2025, 13:01HDTV Lien 10 :uptostreamAdd: 9-04-2025, 13:01HDTV Lien 11 :vidozaAdd: 9-04-2025, 13:01HDTV Lien 12 :upvid
9
+ ajouter Load Space Load an existing to continue working on it. Space URL https://huggingface.co/spaces/username/space-name Load Space Deploy to Space Deploy your project to a space on the Hub. Spaces are a way to share your project with the world. Space Title My Awesome Space Create Space Connected as docto41 Disconnect LIENS DE STREAMING Lien 1 : netu Add: 9-04-2025 13:01 HDTV Lien 2 : doodstream Add: 9-04-2025, 13:01 HDTV Lien 3 : uqload Add: 9-04-2025, 13:01 HDTV Lien 4 : uptostream Add: 9-04-2025, 13:01 HDTV Lien 5 : vidoza Add: 9-04-2025, 13:01 HDTV Lien 6 : upvid Add: 9-04-2025, 13:01 HDTV SERVEURS ALTERNATIFS Lien 7 : netu Add: 9-04-2025, 13:01 HDTV Lien 8 : doodstream Add: 9-04-2025, 13:01 HDTV Lien 9 : uqload Add: 9-04-2025, 13:01 HDTV Lien 10 : uptostream Add: 9-04-2025, 13:01 HDTV Lien 11 : vidoza Add: 9-04-2025, 13:01 HDTV Lien 12 : upvid Add: 9-04-2025, 13:01 ;: <!DOCTYPE html> <html lang="fr"> <head><script>window.huggingface={variables:{"SPACE_CREATOR_USER_ID":"681375e3264f6a6cf6562c83"}};</script> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>CineStream - Films avec streaming automatique</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"> <script> tailwind.config = { theme: { extend: { colors: { primary: '#6d28d9', secondary: '#8b5cf6', dark: '#1e1b4b', light: '#f5f3ff', }, fontFamily: { sans: ['Inter', 'sans-serif'], }, } } } </script> <style> @import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap'); body { font-family: 'Inter', sans-serif; background-color: #0f172a; color: white; } .movie-card { transition: all 0.3s ease; } .movie-card:hover { transform: translateY(-10px); box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04); } .movie-poster { height: 450px; object-fit: cover; } .loading-spinner { animation: spin 1s linear infinite; } @keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } .gradient-text { background: linear-gradient(90deg, #8b5cf6, #ec4899); -webkit-background-clip: text; background-clip: text; color: transparent; } .search-input:focus { box-shadow: 0 0 0 3px rgba(139, 92, 246, 0.5); } .error-message { background-color: rgba(239, 68, 68, 0.2); border-left: 4px solid #ef4444; } .placeholder-poster { background: linear-gradient(135deg, #1e293b 0%, #0f172a 100%); display: flex; align-items: center; justify-content: center; } /* Style pour le lecteur vidéo */ .video-container { position: relative; padding-bottom: 56.25%; /* 16:9 */ height: 0; overflow: hidden; } .video-container iframe { position: absolute; top: 0; left: 0; width: 100%; height: 100%; border: none; } /* Style pour les boutons de streaming */ .stream-btn { transition: all 0.2s ease; } .stream-btn:hover { transform: scale(1.05); } /* Style pour la fenêtre de streaming */ .streaming-window { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(0, 0, 0, 0.9); z-index: 1000; display: flex; flex-direction: column; } .streaming-header { padding: 15px; background-color: rgba(0, 0, 0, 0.7); display: flex; justify-content: space-between; align-items: center; } .streaming-content { flex: 1; display: flex; justify-content: center; align-items: center; } .streaming-controls { padding: 15px; background-color: rgba(0, 0, 0, 0.7); display: flex; justify-content: space-between; align-items: center; } /* Style pour la sélection de serveur */ .server-list { display: flex; gap: 10px; flex-wrap: wrap; margin-top: 10px; } .server-btn { padding: 8px 12px; border-radius: 20px; font-size: 14px; cursor: pointer; transition: all 0.2s; } .server-btn.active { background-color: #6d28d9; color: white; } .server-btn.inactive { background-color: #334155; color: #94a3b8; } /* Animation de chargement du streaming */ .stream-loading { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 20px; } .stream-loading-spinner { width: 50px; height: 50px; border: 5px solid rgba(255, 255, 255, 0.1); border-radius: 50%; border-top-color: #6d28d9; animation: spin 1s linear infinite; } </style> </head> <body class="min-h-screen"> <!-- Navigation --> <nav class="bg-gray-900 bg-opacity-90 backdrop-blur-md fixed w-full z-50 shadow-lg"> <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8"> <div class="flex items-center justify-between h-16"> <div class="flex items-center"> <div class="flex-shrink-0"> <span class="text-2xl font-bold gradient-text">CineStream</span> </div> <div class="hidden md:block ml-10"> <div class="flex space-x-4"> <a href="#" class="text-white px-3 py-2 rounded-md text-sm font-medium bg-primary">Accueil</a> <a href="#" class="text-gray-300 hover:text-white px-3 py-2 rounded-md text-sm font-medium">Films</a> <a href="#" class="text-gray-300 hover:text-white px-3 py-2 rounded-md text-sm font-medium">Séries</a> <a href="#" class="text-gray-300 hover:text-white px-3 py-2 rounded-md text-sm font-medium">Tendances</a> </div> </div> </div> <div class="hidden md:block"> <div class="ml-4 flex items-center md:ml-6"> <div class="relative mx-4"> <input type="text" id="search-input" placeholder="Rechercher un film..." class="search-input bg-gray-800 text-white px-4 py-2 rounded-full w-64 focus:outline-none focus:ring-2 focus:ring-purple-500 transition duration-200"> <button onclick="searchMovies()" class="absolute right-3 top-2 text-gray-400 hover:text-white"> <i class="fas fa-search"></i> </button> </div> <button class="p-1 rounded-full text-gray-400 hover:text-white focus:outline-none"> <i class="fas fa-user-circle text-xl"></i> </button> </div> </div> <div class="-mr-2 flex md:hidden"> <button class="inline-flex items-center justify-center p-2 rounded-md text-gray-400 hover:text-white hover:bg-gray-700 focus:outline-none"> <i class="fas fa-bars"></i> </button> </div> </div> </div> </nav> <!-- Main Content --> <main class="pt-24 pb-12"> <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8"> <!-- Featured Section --> <section class="mb-12"> <div class="flex justify-between items-center mb-6"> <h2 class="text-2xl font-bold text-white">Films populaires</h2> <div class="flex space-x-2"> <button onclick="filterMovies('popular')" class="px-4 py-1 rounded-full text-sm bg-primary text-white">Populaires</button> <button onclick="filterMovies('top_rated')" class="px-4 py-1 rounded-full text-sm bg-gray-700 text-white">Mieux notés</button> <button onclick="filterMovies('upcoming')" class="px-4 py-1 rounded-full text-sm bg-gray-700 text-white">Prochainement</button> </div> </div> <div id="movies-container" class="grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-6"> <!-- Movies will be loaded here --> <div class="flex justify-center items-center py-12 col-span-full"> <div class="animate-spin rounded-full h-12 w-12 border-t-2 border-b-2 border-primary loading-spinner"></div> </div> </div> <div id="load-more-container" class="mt-8 flex justify-center"> <button onclick="loadMoreMovies()" class="px-6 py-2 bg-primary text-white rounded-full hover:bg-secondary transition flex items-center"> <span>Voir plus</span> <i class="fas fa-chevron-down ml-2"></i> </button> </div> </section> <!-- Genres Section --> <section class="mb-12"> <h2 class="text-2xl font-bold text-white mb-6">Par genres</h2> <div class="grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-6 gap-4"> <button onclick="filterByGenre(28)" class="genre-btn px-4 py-2 bg-red-600 hover:bg-red-700 text-white rounded-full text-sm">Action</button> <button onclick="filterByGenre(12)" class="genre-btn px-4 py-2 bg-blue-600 hover:bg-blue-700 text-white rounded-full text-sm">Aventure</button> <button onclick="filterByGenre(16)" class="genre-btn px-4 py-2 bg-green-600 hover:bg-green-700 text-white rounded-full text-sm">Animation</button> <button onclick="filterByGenre(35)" class="genre-btn px-4 py-2 bg-yellow-600 hover:bg-yellow-700 text-white rounded-full text-sm">Comédie</button> <button onclick="filterByGenre(80)" class="genre-btn px-4 py-2 bg-gray-600 hover:bg-gray-700 text-white rounded-full text-sm">Crime</button> <button onclick="filterByGenre(18)" class="genre-btn px-4 py-2 bg-purple-600 hover:bg-purple-700 text-white rounded-full text-sm">Drame</button> </div> </section> </div> </main> <!-- Footer --> <footer class="bg-gray-900 text-gray-400 py-8"> <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8"> <div class="grid grid-cols-1 md:grid-cols-4 gap-8"> <div> <h3 class="text-white text-lg font-semibold mb-4">CineStream</h3> <p class="text-sm">La meilleure plateforme pour regarder des films avec streaming automatique.</p> </div> <div> <h3 class="text-white text-lg font-semibold mb-4">Navigation</h3> <ul class="space-y-2 text-sm"> <li><a href="#" class="hover:text-white">Accueil</a></li> <li><a href="#" class="hover:text-white">Films</a></li> <li><a href="#" class="hover:text-white">Séries</a></li> <li><a href="#" class="hover:text-white">Nouveautés</a></li> </ul> </div> <div> <h3 class="text-white text-lg font-semibold mb-4">Légal</h3> <ul class="space-y-2 text-sm"> <li><a href="#" class="hover:text-white">Conditions d'utilisation</a></li> <li><a href="#" class="hover:text-white">Politique de confidentialité</a></li> <li><a href="#" class="hover:text-white">DMCA</a></li> </ul> </div> <div> <h3 class="text-white text-lg font-semibold mb-4">Contact</h3> <div class="flex space-x-4"> <a href="#" class="text-gray-400 hover:text-white"><i class="fab fa-facebook-f"></i></a> <a href="#" class="text-gray-400 hover:text-white"><i class="fab fa-twitter"></i></a> <a href="#" class="text-gray-400 hover:text-white"><i class="fab fa-instagram"></i></a> <a href="#" class="text-gray-400 hover:text-white"><i class="fab fa-discord"></i></a> </div> </div> </div> <div class="border-t border-gray-800 mt-8 pt-8 text-sm text-center"> <p>© 2023 CineStream. Tous droits réservés.</p> </div> </div> </footer> <!-- Movie Details Modal --> <div id="movie-modal" class="fixed inset-0 z-50 hidden overflow-y-auto"> <div class="flex items-center justify-center min-h-screen pt-4 px-4 pb-20 text-center sm:block sm:p-0"> <div class="fixed inset-0 transition-opacity" aria-hidden="true"> <div class="absolute inset-0 bg-gray-900 opacity-75"></div> </div> <span class="hidden sm:inline-block sm:align-middle sm:h-screen" aria-hidden="true">&#8203;</span> <div class="inline-block align-bottom bg-gray-800 rounded-lg text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:max-w-4xl sm:w-full"> <div class="px-4 pt-5 pb-4 sm:p-6 sm:pb-4"> <div class="sm:flex sm:items-start"> <div id="modal-poster" class="flex-shrink-0 w-full sm:w-1/3 mb-4 sm:mb-0 sm:mr-6"> <img class="w-full rounded-lg shadow-lg" src="" alt="Movie Poster"> </div> <div class="mt-3 text-center sm:mt-0 sm:text-left w-full sm:w-2/3"> <h3 id="modal-title" class="text-2xl leading-6 font-bold text-white mb-2"></h3> <div class="flex items-center mb-4"> <span id="modal-rating" class="bg-yellow-500 text-white text-xs font-semibold px-2 py-1 rounded mr-3"></span> <span id="modal-year" class="text-gray-300 text-sm"></span> <span id="modal-runtime" class="ml-3 text-gray-300 text-sm"></span> </div> <p id="modal-overview" class="text-gray-300 mb-4"></p> <div id="modal-genres" class="flex flex-wrap gap-2 mb-4"></div> <!-- Serveurs de streaming --> <div class="mb-4"> <h4 class="text-sm font-semibold text-gray-400 mb-2">CHOISIR UN SERVEUR :</h4> <div class="server-list"> <button onclick="selectServer('hdvip')" class="server-btn active" data-server="hdvip"> <i class="fas fa-crown mr-1"></i> HD VIP </button> <button onclick="selectServer('streamlare')" class="server-btn inactive" data-server="streamlare"> <i class="fas fa-play-circle mr-1"></i> Streamlare </button> <button onclick="selectServer('streamtape')" class="server-btn inactive" data-server="streamtape"> <i class="fas fa-tape mr-1"></i> Streamtape </button> <button onclick="selectServer('younetu')" class="server-btn inactive" data-server="younetu"> <i class="fas fa-film mr-1"></i> Younetu </button> <button onclick="selectServer('uptostream')" class="server-btn inactive" data-server="uptostream"> <i class="fas fa-cloud mr-1"></i> Uptostream </button> <button onclick="selectServer('vidsrc')" class="server-btn inactive" data-server="vidsrc"> <i class="fas fa-server mr-1"></i> VidSrc </button> </div> </div> <div class="mt-4"> <button type="button" onclick="closeModal()" class="w-full inline-flex justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-primary text-base font-medium text-white hover:bg-secondary focus:outline-none sm:ml-3 sm:w-auto sm:text-sm"> Fermer </button> <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"> <i class="fas fa-play mr-2"></i> Lecture auto </button> </div> </div> </div> </div> </div> </div> </div> <!-- Streaming Window (hidden by default) --> <div id="streaming-window" class="streaming-window hidden"> <div class="streaming-header"> <h3 id="streaming-title" class="text-xl font-bold text-white"></h3> <button onclick="closeStreamingWindow()" class="text-gray-400 hover:text-white"> <i class="fas fa-times text-xl"></i> </button> </div> <div class="streaming-content"> <div id="streaming-player-container" class="w-full h-full" style="max-width: 1200px;"> <!-- Contenu du lecteur sera chargé ici --> <div id="stream-loading" class="stream-loading w-full h-full"> <div class="stream-loading-spinner"></div> <p class="text-gray-300">Chargement du flux vidéo...</p> </div> </div> </div> <div class="streaming-controls"> <div class="flex space-x-2"> <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> <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> <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> </div> <div> <button onclick="toggleFullscreen()" class="stream-btn px-3 py-1 bg-gray-700 hover:bg-gray-600 text-white rounded-full text-sm"> <i class="fas fa-expand mr-1"></i> Plein écran </button> </div> </div> </div> <script> // Configuration const API_KEY = 'c45a857c193f6302f2b5061c3b85e743'; // Clé API TMDB valide const BASE_URL = 'https://api.themoviedb.org/3'; // Serveurs de streaming avec URLs de base fonctionnelles const STREAMING_SERVERS = { hdvip: { name: 'Lecteur HD VIP', url: 'https://database.gdriveplayer.us/player.php?tmdb=', autoPlay: true, requiresTMDB: true, requiresIMDB: false }, streamlare: { name: 'Streamlare', url: 'https://streamlare.com/e/', autoPlay: true, requiresTMDB: false, requiresIMDB: true }, streamtape: { name: 'Streamtape', url: 'https://streamtape.com/e/', autoPlay: true, requiresTMDB: false, requiresIMDB: true }, younetu: { name: 'Younetu', url: 'https://younetu.com/embed/', autoPlay: true, requiresTMDB: false, requiresIMDB: true }, uptostream: { name: 'Uptostream', url: 'https://uptostream.com/iframe/', autoPlay: true, requiresTMDB: false, requiresIMDB: true }, vidsrc: { name: 'VidSrc', url: 'https://vidsrc.to/embed/movie/', autoPlay: true, requiresTMDB: true, requiresIMDB: false } }; let currentPage = 1; let currentFilter = 'popular'; let currentGenre = null; let currentSearch = ''; let totalPages = 1; let isLoading = false; let currentMovieId = null; let currentIMDBId = null; let selectedServer = 'hdvip'; // Fonction utilitaire pour faire les requêtes API async function fetchAPI(endpoint, params = {}) { const url = new URL(`${BASE_URL}${endpoint}`); // Ajouter les paramètres par défaut const defaultParams = { language: 'fr-FR', page: currentPage, api_key: API_KEY }; // Fusionner les paramètres const queryParams = {...defaultParams, ...params}; // Ajouter les paramètres à l'URL Object.keys(queryParams).forEach(key => { if (queryParams[key] !== undefined && queryParams[key] !== null) { url.searchParams.append(key, queryParams[key]); } }); try { const response = await fetch(url); if (!response.ok) { throw new Error(`Erreur HTTP: ${response.status}`); } return await response.json(); } catch (error) { console.error('Erreur API:', error); throw error; } } // Charger les films au démarrage document.addEventListener('DOMContentLoaded', function() { loadMovies(); // Écouter la touche Entrée dans la recherche document.getElementById('search-input').addEventListener('keypress', function(e) { if (e.key === 'Enter') { searchMovies(); } }); }); // Charger les films async function loadMovies() { if (isLoading) return; isLoading = true; showLoadingState(); try { let data; if (currentSearch) { data = await fetchAPI('/search/movie', { query: currentSearch, include_adult: false, page: currentPage }); } else if (currentGenre) { data = await fetchAPI('/discover/movie', { include_adult: false, include_video: false, sort_by: 'popularity.desc', with_genres: currentGenre, page: currentPage }); } else { data = await fetchAPI(`/movie/${currentFilter}`, { page: currentPage }); } totalPages = data.total_pages || 1; if (currentPage === 1) { document.getElementById('movies-container').innerHTML = ''; } if (data.results && data.results.length > 0) { displayMovies(data.results); updateLoadMoreButton(); } else { showNoResults(); } } catch (error) { console.error('Error fetching movies:', error); showErrorState(error.message); } finally { isLoading = false; } } // Afficher l'état de chargement function showLoadingState() { const container = document.getElementById('movies-container'); container.innerHTML = ` <div class="flex justify-center items-center py-12 col-span-full"> <div class="animate-spin rounded-full h-12 w-12 border-t-2 border-b-2 border-primary loading-spinner"></div> </div> `; } // Afficher les films avec boutons de streaming function displayMovies(movies) { const container = document.getElementById('movies-container'); movies.forEach(movie => { const movieCard = document.createElement('div'); movieCard.className = 'movie-card bg-gray-800 rounded-lg overflow-hidden shadow-lg hover:shadow-xl transition-all duration-300'; // Utiliser l'image originale en haute qualité si disponible const posterPath = movie.poster_path ? `https://image.tmdb.org/t/p/w500${movie.poster_path}` : 'https://via.placeholder.com/500x750?text=Affiche+non+disponible'; movieCard.innerHTML = ` <div> <div class="movie-poster w-full rounded-t-lg overflow-hidden ${!movie.poster_path ? 'placeholder-poster' : ''}"> <img src="${posterPath}" alt="${movie.title || 'Titre inconnu'}" class="w-full h-full object-cover" onerror="this.src='https://via.placeholder.com/500x750?text=Image+non+chargée'; this.classList.add('placeholder-poster')"> </div> <div class="p-4"> <h3 class="text-lg font-semibold text-white truncate">${movie.title || 'Titre inconnu'}</h3> <div class="flex items-center mt-2"> <span class="text-yellow-400 text-sm"> <i class="fas fa-star"></i> ${movie.vote_average ? movie.vote_average.toFixed(1) : 'N/A'} </span> <span class="text-gray-400 text-sm ml-auto">${movie.release_date ? movie.release_date.substring(0, 4) : 'N/A'}</span> </div> <div class="mt-3"> <button onclick="startAutoStreaming(${movie.id}, '${movie.title || 'Film'}')" class="w-full stream-btn px-3 py-2 bg-green-600 hover:bg-green-700 text-white rounded text-sm"> <i class="fas fa-play-circle mr-1"></i> Lecture auto </button> <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"> <i class="fas fa-info-circle mr-1"></i> Détails </button> </div> </div> </div> `; container.appendChild(movieCard); }); } // Afficher un message d'erreur function showErrorState(errorMessage) { const container = document.getElementById('movies-container'); container.innerHTML = ` <div class="col-span-full py-6 px-4 error-message rounded-lg"> <div class="flex items-center"> <i class="fas fa-exclamation-triangle text-red-500 text-xl mr-3"></i> <div> <h3 class="text-lg font-medium text-white">Erreur lors du chargement des films</h3> <p class="text-gray-300 mt-1">${errorMessage || 'Veuillez réessayer plus tard'}</p> <button onclick="retryLoading()" class="mt-3 px-4 py-2 bg-primary text-white rounded-full hover:bg-secondary transition text-sm"> <i class="fas fa-sync-alt mr-2"></i> Réessayer </button> </div> </div> </div> `; document.getElementById('load-more-container').classList.add('hidden'); } // Afficher un message quand aucun résultat n'est trouvé function showNoResults() { const container = document.getElementById('movies-container'); container.innerHTML = ` <div class="col-span-full text-center py-12"> <i class="fas fa-film text-4xl text-gray-500 mb-4"></i> <h3 class="text-xl text-white">Aucun film trouvé</h3> <p class="text-gray-400 mt-2">Essayez avec d'autres critères de recherche</p> </div> `; document.getElementById('load-more-container').classList.add('hidden'); } // Réessayer le chargement function retryLoading() { currentPage = 1; loadMovies(); } // Mettre à jour le bouton "Voir plus" function updateLoadMoreButton() { const loadMoreContainer = document.getElementById('load-more-container'); if (currentPage >= totalPages) { loadMoreContainer.innerHTML = ` <p class="text-gray-400">Vous avez atteint la fin des résultats</p> `; } else { loadMoreContainer.classList.remove('hidden'); } } // Filtrer les films function filterMovies(filter) { currentFilter = filter; currentGenre = null; currentSearch = ''; currentPage = 1; document.getElementById('search-input').value = ''; loadMovies(); // Mettre à jour les boutons actifs document.querySelectorAll('button').forEach(btn => { if (btn.textContent.toLowerCase().includes(filter.replace('_', ' '))) { btn.classList.remove('bg-gray-700'); btn.classList.add('bg-primary'); } else { btn.classList.remove('bg-primary'); btn.classList.add('bg-gray-700'); } }); } // Filtrer par genre function filterByGenre(genreId) { currentGenre = genreId; currentSearch = ''; currentPage = 1; document.getElementById('search-input').value = ''; loadMovies(); // Mettre à jour les boutons actifs document.querySelectorAll('.genre-btn').forEach(btn => { btn.classList.remove('bg-primary'); if (btn.onclick.toString().includes(genreId.toString())) { btn.classList.add('bg-primary'); } }); } // Rechercher des films function searchMovies() { const query = document.getElementById('search-input').value.trim(); if (query) { currentSearch = query; currentGenre = null; currentPage = 1; loadMovies(); } } // Charger plus de films function loadMoreMovies() { if (currentPage < totalPages) { currentPage++; loadMovies(); } } // Afficher les détails du film async function showMovieDetails(movieId) { try { const movie = await fetchAPI(`/movie/${movieId}`); currentMovieId = movieId; // Récupérer l'ID IMDB si disponible if (movie.imdb_id) { currentIMDBId = movie.imdb_id; } else { // Si l'ID IMDB n'est pas disponible, essayer de le récupérer via l'API const externalIds = await fetchAPI(`/movie/${movieId}/external_ids`); currentIMDBId = externalIds.imdb_id || null; } // Remplir la modal const modalPoster = document.querySelector('#modal-poster img'); modalPoster.src = movie.poster_path ? `https://image.tmdb.org/t/p/w500${movie.poster_path}` : 'https://via.placeholder.com/500x750?text=Affiche+non+disponible'; modalPoster.onerror = function() { this.src = 'https://via.placeholder.com/500x750?text=Image+non+chargée'; }; document.getElementById('modal-title').textContent = movie.title || 'Titre inconnu'; document.getElementById('modal-rating').textContent = `${movie.vote_average ? movie.vote_average.toFixed(1) : 'N/A'}/10`; document.getElementById('modal-year').textContent = movie.release_date ? movie.release_date.substring(0, 4) : 'N/A'; document.getElementById('modal-runtime').textContent = movie.runtime ? `${movie.runtime} min` : ''; document.getElementById('modal-overview').textContent = movie.overview || 'Aucun synopsis disponible.'; // Afficher les genres const genresContainer = document.getElementById('modal-genres'); genresContainer.innerHTML = ''; if (movie.genres && movie.genres.length > 0) { movie.genres.forEach(genre => { const genreBadge = document.createElement('span'); genreBadge.className = 'bg-gray-700 text-white text-xs px-2 py-1 rounded'; genreBadge.textContent = genre.name; genresContainer.appendChild(genreBadge); }); } else { genresContainer.innerHTML = '<span class="text-gray-400 text-sm">Aucun genre spécifié</span>'; } // Afficher la modal document.getElementById('movie-modal').classList.remove('hidden'); } catch (error) { console.error('Error fetching movie details:', error); alert('Erreur lors du chargement des détails du film: ' + (error.message || 'Veuillez réessayer')); } } // Fermer la modal de détails function closeModal() { document.getElementById('movie-modal').classList.add('hidden'); } // Sélectionner un serveur de streaming function selectServer(serverId) { selectedServer = serverId; // Mettre à jour l'état des boutons document.querySelectorAll('.server-btn').forEach(btn => { if (btn.dataset.server === serverId) { btn.classList.remove('inactive'); btn.classList.add('active'); } else { btn.classList.remove('active'); btn.classList.add('inactive'); } }); } // Démarrer le streaming depuis la modal function startStreaming() { if (currentMovieId) { const movieTitle = document.getElementById('modal-title').textContent; startAutoStreaming(currentMovieId, movieTitle); closeModal(); } } // Démarrer le streaming automatique dans une nouvelle fenêtre async function startAutoStreaming(movieId, movieTitle) { currentMovieId = movieId; // Afficher la fenêtre de streaming const streamingWindow = document.getElementById('streaming-window'); document.getElementById('streaming-title').textContent = movieTitle; // Afficher l'état de chargement const playerContainer = document.getElementById('streaming-player-container'); playerContainer.innerHTML = ` <div id="stream-loading" class="stream-loading w-full h-full"> <div class="stream-loading-spinner"></div> <p class="text-gray-300">Chargement du flux vidéo...</p> </div> `; // Afficher la fenêtre de streaming streamingWindow.classList.remove('hidden'); // Récupérer les informations du film pour l'ID IMDB si nécessaire let imdbId = currentIMDBId; if (!imdbId && STREAMING_SERVERS[selectedServer].requiresIMDB) { try { const externalIds = await fetchAPI(`/movie/${movieId}/external_ids`); imdbId = externalIds.imdb_id; if (!imdbId) { throw new Error("ID IMDB non disponible"); } } catch (error) { console.error("Erreur lors de la récupération de l'ID IMDB:", error); playerContainer.innerHTML = ` <div class="flex flex-col items-center justify-center h-full text-red-400"> <i class="fas fa-exclamation-triangle text-4xl mb-4"></i> <p class="text-lg">Impossible de trouver l'ID IMDB pour ce film</p> <p class="text-sm text-gray-400 mt-2">Essayez avec un autre serveur</p> </div> `; return; } } // Construire l'URL de streaming en fonction du serveur sélectionné let streamingUrl; const serverConfig = STREAMING_SERVERS[selectedServer]; if (serverConfig.requiresTMDB) { streamingUrl = serverConfig.url + movieId; } else if (serverConfig.requiresIMDB && imdbId) { streamingUrl = serverConfig.url + imdbId; } else { // Si aucun ID n'est disponible, utiliser TMDB par défaut streamingUrl = serverConfig.url + movieId; } // Ajouter le paramètre de lecture automatique si pris en charge if (serverConfig.autoPlay) { streamingUrl += '/auto'; } // Créer l'iframe pour le lecteur vidéo const iframe = document.createElement('iframe'); iframe.id = 'streaming-player'; iframe.src = streamingUrl; iframe.setAttribute('allowfullscreen', ''); iframe.setAttribute('scrolling', 'no'); iframe.setAttribute('frameborder', '0'); iframe.setAttribute('marginwidth', '0'); iframe.setAttribute('marginheight', '0'); iframe.style.width = '100%'; iframe.style.height = '100%'; iframe.style.border = 'none'; // Gestion des erreurs de chargement iframe.onerror = function() { playerContainer.innerHTML = ` <div class="flex flex-col items-center justify-center h-full text-red-400"> <i class="fas fa-exclamation-triangle text-4xl mb-4"></i> <p class="text-lg">Erreur lors du chargement du flux vidéo</p> <p class="text-sm text-gray-400 mt-2">Le serveur peut être temporairement indisponible</p> <button onclick="tryAlternativeServer()" class="mt-4 px-4 py-2 bg-primary text-white rounded hover:bg-secondary transition"> <i class="fas fa-sync-alt mr-2"></i> Essayer un autre serveur </button> </div> `; }; // Remplacer le chargement par le lecteur playerContainer.innerHTML = ''; playerContainer.appendChild(iframe); // Mettre le focus sur la fenêtre de streaming streamingWindow.focus(); // Tentative de lecture automatique (peut être bloquée par le navigateur) setTimeout(() => { try { iframe.contentWindow.postMessage('{"event":"command","func":"playVideo","args":""}', '*'); } catch (e) { console.log("Auto-play blocked by browser"); } }, 2000); } // Essayer un autre serveur en cas d'erreur function tryAlternativeServer() { const servers = Object.keys(STREAMING_SERVERS); const currentIndex = servers.indexOf(selectedServer); const nextIndex = (currentIndex + 1) % servers.length; selectedServer = servers[nextIndex]; startAutoStreaming(currentMovieId, document.getElementById('streaming-title').textContent); } // Fermer la fenêtre de streaming function closeStreamingWindow() { const playerContainer = document.getElementById('streaming-player-container'); playerContainer.innerHTML = ''; document.getElementById('streaming-window').classList.add('hidden'); } // Changer la qualité de streaming (simulé) function changeQuality(quality) { alert(`Qualité changée en ${quality}. Note: Ceci est une démonstration.`); // En réalité, vous devriez mettre à jour la source du lecteur vidéo } // Basculer en plein écran function toggleFullscreen() { const playerContainer = document.getElementById('streaming-player-container'); if (playerContainer.requestFullscreen) { playerContainer.requestFullscreen(); } else if (playerContainer.webkitRequestFullscreen) { playerContainer.webkitRequestFullscreen(); } else if (playerContainer.msRequestFullscreen) { playerContainer.msRequestFullscreen(); } } </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/cinestream" style="color: #fff;text-decoration: underline;" target="_blank" >Remix</a></p></body> </html>
10
+ je veux pas des site d'exemple je veux un vrais site avec plus de 975623123 films version Français en auto Play robotisé
11
+ je veux les plus puissant serveur et lecteur de film afin de piloté en systeme automatique les films a regarder
12
+ voici les cléé api tmdb ::: Jeton d'accès en lecture à l'API eyJhbGciOiJIUzI1NiJ9.eyJhdWQiOiJmYjQzN2IxMDcyN2E1YTRlYjhkOTEzNGUyOWM4MmFlMCIsIm5iZiI6MTY4MDYzNzkxMC44NjUsInN1YiI6IjY0MmM3ZmQ2OGI5NTllMDBmNDRkNzNhMCIsInNjb3BlcyI6WyJhcGlfcmVhZCJdLCJ2ZXJzaW9uIjoxfQ.Nhl261Ha3z0Ujg5vM1PpFoZBiTGjlXQ1g9VFPh6dVvs Clé d'API fb437b10727a5a4eb8d9134e29c82ae0