Spaces:
Running
Running
Add 2 files
Browse files- index.html +384 -10
- prompts.txt +2 -1
index.html
CHANGED
|
@@ -93,6 +93,26 @@
|
|
| 93 |
opacity: 0.5;
|
| 94 |
cursor: not-allowed;
|
| 95 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 96 |
</style>
|
| 97 |
</head>
|
| 98 |
<body>
|
|
@@ -342,6 +362,99 @@
|
|
| 342 |
</div>
|
| 343 |
</section>
|
| 344 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 345 |
<!-- Script pour la base de données et l'automatisation -->
|
| 346 |
<script>
|
| 347 |
// Configuration
|
|
@@ -350,6 +463,10 @@
|
|
| 350 |
const TOTAL_LINKS = 124556;
|
| 351 |
let currentPage = 1;
|
| 352 |
let currentFilter = 'all';
|
|
|
|
|
|
|
|
|
|
|
|
|
| 353 |
|
| 354 |
// Générer une base de données massive de films français avec des liens de streaming
|
| 355 |
function generateMassiveMovieDatabase() {
|
|
@@ -423,12 +540,18 @@
|
|
| 423 |
const language = languages[Math.floor(Math.random() * languages.length)];
|
| 424 |
const provider = `${providers[Math.floor(Math.random() * providers.length)]} ${Math.floor(Math.random() * 10) + 1}`;
|
| 425 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 426 |
streamingLinks.push({
|
| 427 |
provider: provider,
|
| 428 |
-
url: `
|
| 429 |
quality: quality,
|
| 430 |
server: server,
|
| 431 |
-
language: language
|
|
|
|
|
|
|
| 432 |
});
|
| 433 |
}
|
| 434 |
|
|
@@ -440,7 +563,8 @@
|
|
| 440 |
rating: parseFloat(rating),
|
| 441 |
image: `https://image.tmdb.org/t/p/w500/${Math.random().toString(36).substring(2, 15)}.jpg`,
|
| 442 |
description: description,
|
| 443 |
-
streamingLinks: streamingLinks
|
|
|
|
| 444 |
});
|
| 445 |
}
|
| 446 |
|
|
@@ -457,6 +581,9 @@
|
|
| 457 |
window.addEventListener('load', function() {
|
| 458 |
document.body.style.opacity = '1';
|
| 459 |
});
|
|
|
|
|
|
|
|
|
|
| 460 |
});
|
| 461 |
|
| 462 |
// Fonction pour charger les films
|
|
@@ -505,8 +632,8 @@
|
|
| 505 |
</div>
|
| 506 |
<p class="text-gray-400 text-sm mt-2 line-clamp-2">${movie.description}</p>
|
| 507 |
<div class="mt-4">
|
| 508 |
-
<button onclick="
|
| 509 |
-
<i class="fas fa-play mr-2"></i>
|
| 510 |
</button>
|
| 511 |
</div>
|
| 512 |
</div>
|
|
@@ -575,6 +702,253 @@
|
|
| 575 |
});
|
| 576 |
}
|
| 577 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 578 |
// Fonction pour afficher les liens de streaming
|
| 579 |
function showStreamingLinks(movieId) {
|
| 580 |
const movie = frenchMoviesDatabase.find(m => m.id === movieId);
|
|
@@ -607,9 +981,9 @@
|
|
| 607 |
<span><i class="fas fa-server mr-1"></i> ${link.server === 'vip' ? 'VIP' : link.server === 'europe' ? 'Europe' : link.server === 'us' ? 'USA' : link.server === 'asia' ? 'Asie' : 'Premium'}</span>
|
| 608 |
<span><i class="fas fa-language mr-1"></i> ${link.language === 'vf' ? 'VF' : link.language === 'vostfr' ? 'VOSTFR' : 'VO'}</span>
|
| 609 |
</div>
|
| 610 |
-
<
|
| 611 |
-
<i class="fas fa-
|
| 612 |
-
</
|
| 613 |
</div>
|
| 614 |
`).join('')}
|
| 615 |
</div>
|
|
@@ -699,8 +1073,8 @@
|
|
| 699 |
<span class="text-sm text-gray-400"><i class="fas fa-link mr-1"></i> ${filteredLinks.length} serveur(s) trouvé(s)</span>
|
| 700 |
</div>
|
| 701 |
<div class="mt-3">
|
| 702 |
-
<button onclick="
|
| 703 |
-
<i class="fas fa-play mr-1"></i>
|
| 704 |
</button>
|
| 705 |
</div>
|
| 706 |
</div>
|
|
|
|
| 93 |
opacity: 0.5;
|
| 94 |
cursor: not-allowed;
|
| 95 |
}
|
| 96 |
+
|
| 97 |
+
/* Player styles */
|
| 98 |
+
.player-container {
|
| 99 |
+
aspect-ratio: 16/9;
|
| 100 |
+
background-color: #000;
|
| 101 |
+
}
|
| 102 |
+
|
| 103 |
+
.quality-selector {
|
| 104 |
+
background-color: rgba(0, 0, 0, 0.7);
|
| 105 |
+
border-radius: 4px;
|
| 106 |
+
padding: 8px;
|
| 107 |
+
}
|
| 108 |
+
|
| 109 |
+
.subtitle-btn.active {
|
| 110 |
+
background-color: #3b82f6;
|
| 111 |
+
}
|
| 112 |
+
|
| 113 |
+
.auto-play-overlay {
|
| 114 |
+
background: linear-gradient(180deg, rgba(0,0,0,0.8) 0%, rgba(0,0,0,0) 100%);
|
| 115 |
+
}
|
| 116 |
</style>
|
| 117 |
</head>
|
| 118 |
<body>
|
|
|
|
| 362 |
</div>
|
| 363 |
</section>
|
| 364 |
|
| 365 |
+
<!-- Player Modal (hidden by default) -->
|
| 366 |
+
<div id="playerModal" class="fixed inset-0 bg-black bg-opacity-90 z-100 hidden flex items-center justify-center p-4">
|
| 367 |
+
<div class="w-full max-w-6xl bg-gray-900 rounded-xl overflow-hidden">
|
| 368 |
+
<div class="flex justify-between items-center bg-gray-800 px-6 py-4">
|
| 369 |
+
<h3 id="playerTitle" class="text-xl font-bold">Lecture automatique</h3>
|
| 370 |
+
<button onclick="closePlayer()" class="text-gray-400 hover:text-white text-2xl">
|
| 371 |
+
<i class="fas fa-times"></i>
|
| 372 |
+
</button>
|
| 373 |
+
</div>
|
| 374 |
+
|
| 375 |
+
<div class="player-container relative w-full" id="videoPlayer">
|
| 376 |
+
<div class="absolute inset-0 flex items-center justify-center">
|
| 377 |
+
<div class="text-center">
|
| 378 |
+
<div class="loading-spinner mx-auto mb-4"></div>
|
| 379 |
+
<p class="text-gray-400">Chargement du meilleur flux disponible...</p>
|
| 380 |
+
</div>
|
| 381 |
+
</div>
|
| 382 |
+
|
| 383 |
+
<div class="auto-play-overlay absolute top-0 left-0 right-0 p-4 flex justify-between items-start">
|
| 384 |
+
<div class="bg-black bg-opacity-70 px-3 py-1 rounded-full text-sm">
|
| 385 |
+
<i class="fas fa-robot mr-2 text-blue-400"></i>
|
| 386 |
+
<span>Mode Automatique Activé</span>
|
| 387 |
+
</div>
|
| 388 |
+
<div class="quality-selector hidden" id="qualitySelector">
|
| 389 |
+
<select class="bg-gray-800 text-white px-2 py-1 rounded text-sm" id="qualitySelect">
|
| 390 |
+
<option value="auto">Auto (Recommandé)</option>
|
| 391 |
+
<option value="4k">4K Ultra HD</option>
|
| 392 |
+
<option value="1080">Full HD 1080p</option>
|
| 393 |
+
<option value="720">HD 720p</option>
|
| 394 |
+
<option value="480">SD 480p</option>
|
| 395 |
+
</select>
|
| 396 |
+
</div>
|
| 397 |
+
</div>
|
| 398 |
+
|
| 399 |
+
<div class="absolute bottom-0 left-0 right-0 bg-gradient-to-t from-black to-transparent p-4">
|
| 400 |
+
<div class="flex items-center space-x-4">
|
| 401 |
+
<button id="playPauseBtn" class="w-10 h-10 rounded-full bg-blue-600 flex items-center justify-center">
|
| 402 |
+
<i class="fas fa-pause"></i>
|
| 403 |
+
</button>
|
| 404 |
+
<div class="flex-grow">
|
| 405 |
+
<div class="w-full bg-gray-700 rounded-full h-1.5">
|
| 406 |
+
<div id="progressBar" class="bg-blue-600 h-1.5 rounded-full" style="width: 0%"></div>
|
| 407 |
+
</div>
|
| 408 |
+
</div>
|
| 409 |
+
<div class="text-sm text-gray-300" id="timeDisplay">00:00 / 00:00</div>
|
| 410 |
+
<button id="fullscreenBtn" class="w-8 h-8 rounded flex items-center justify-center text-gray-300 hover:text-white">
|
| 411 |
+
<i class="fas fa-expand"></i>
|
| 412 |
+
</button>
|
| 413 |
+
</div>
|
| 414 |
+
|
| 415 |
+
<div class="mt-3 flex space-x-3">
|
| 416 |
+
<button id="subtitleBtn" class="px-3 py-1 bg-gray-800 rounded-full text-sm flex items-center">
|
| 417 |
+
<i class="fas fa-closed-captioning mr-2"></i>
|
| 418 |
+
<span>Sous-titres</span>
|
| 419 |
+
</button>
|
| 420 |
+
<button id="settingsBtn" class="px-3 py-1 bg-gray-800 rounded-full text-sm flex items-center">
|
| 421 |
+
<i class="fas fa-cog mr-2"></i>
|
| 422 |
+
<span>Paramètres</span>
|
| 423 |
+
</button>
|
| 424 |
+
<button id="autoQualityBtn" class="px-3 py-1 bg-blue-600 rounded-full text-sm flex items-center">
|
| 425 |
+
<i class="fas fa-magic mr-2"></i>
|
| 426 |
+
<span>Auto Qualité</span>
|
| 427 |
+
</button>
|
| 428 |
+
</div>
|
| 429 |
+
</div>
|
| 430 |
+
</div>
|
| 431 |
+
|
| 432 |
+
<div class="bg-gray-800 px-6 py-4">
|
| 433 |
+
<div class="flex flex-col md:flex-row gap-6">
|
| 434 |
+
<div class="flex-shrink-0">
|
| 435 |
+
<img id="playerPoster" src="" alt="Affiche du film" class="w-32 h-48 object-cover rounded-lg">
|
| 436 |
+
</div>
|
| 437 |
+
<div class="flex-grow">
|
| 438 |
+
<h4 id="playerMovieTitle" class="text-xl font-bold mb-2">Titre du film</h4>
|
| 439 |
+
<div class="flex flex-wrap gap-2 mb-3">
|
| 440 |
+
<span id="playerYear" class="text-sm bg-gray-700 px-2 py-1 rounded">Année</span>
|
| 441 |
+
<span id="playerRating" class="text-sm bg-gray-700 px-2 py-1 rounded">Note</span>
|
| 442 |
+
<span id="playerGenre" class="text-sm bg-gray-700 px-2 py-1 rounded">Genre</span>
|
| 443 |
+
</div>
|
| 444 |
+
<p id="playerDescription" class="text-gray-400 text-sm">Description du film...</p>
|
| 445 |
+
|
| 446 |
+
<div class="mt-4">
|
| 447 |
+
<h5 class="font-semibold mb-2">Serveurs disponibles</h5>
|
| 448 |
+
<div class="flex flex-wrap gap-2" id="serverOptions">
|
| 449 |
+
<!-- Server options will be added here -->
|
| 450 |
+
</div>
|
| 451 |
+
</div>
|
| 452 |
+
</div>
|
| 453 |
+
</div>
|
| 454 |
+
</div>
|
| 455 |
+
</div>
|
| 456 |
+
</div>
|
| 457 |
+
|
| 458 |
<!-- Script pour la base de données et l'automatisation -->
|
| 459 |
<script>
|
| 460 |
// Configuration
|
|
|
|
| 463 |
const TOTAL_LINKS = 124556;
|
| 464 |
let currentPage = 1;
|
| 465 |
let currentFilter = 'all';
|
| 466 |
+
let currentMoviePlaying = null;
|
| 467 |
+
let videoPlayer = null;
|
| 468 |
+
let isPlaying = false;
|
| 469 |
+
let progressInterval = null;
|
| 470 |
|
| 471 |
// Générer une base de données massive de films français avec des liens de streaming
|
| 472 |
function generateMassiveMovieDatabase() {
|
|
|
|
| 540 |
const language = languages[Math.floor(Math.random() * languages.length)];
|
| 541 |
const provider = `${providers[Math.floor(Math.random() * providers.length)]} ${Math.floor(Math.random() * 10) + 1}`;
|
| 542 |
|
| 543 |
+
// Generate fake streaming URLs with different qualities
|
| 544 |
+
const baseUrl = `https://stream${Math.floor(Math.random() * 100)}.cinebot${['fr','eu','com','net','org'][Math.floor(Math.random() * 5)]}.${['com','net','io','tv'][Math.floor(Math.random() * 4)]}`;
|
| 545 |
+
const path = `/movie/${i}/${quality}/${language}`;
|
| 546 |
+
|
| 547 |
streamingLinks.push({
|
| 548 |
provider: provider,
|
| 549 |
+
url: `${baseUrl}${path}`,
|
| 550 |
quality: quality,
|
| 551 |
server: server,
|
| 552 |
+
language: language,
|
| 553 |
+
latency: Math.floor(Math.random() * 100) + 10,
|
| 554 |
+
stability: Math.random().toFixed(2)
|
| 555 |
});
|
| 556 |
}
|
| 557 |
|
|
|
|
| 563 |
rating: parseFloat(rating),
|
| 564 |
image: `https://image.tmdb.org/t/p/w500/${Math.random().toString(36).substring(2, 15)}.jpg`,
|
| 565 |
description: description,
|
| 566 |
+
streamingLinks: streamingLinks,
|
| 567 |
+
duration: Math.floor(Math.random() * 60) + 90 // 90-150 minutes
|
| 568 |
});
|
| 569 |
}
|
| 570 |
|
|
|
|
| 581 |
window.addEventListener('load', function() {
|
| 582 |
document.body.style.opacity = '1';
|
| 583 |
});
|
| 584 |
+
|
| 585 |
+
// Initialize player event listeners
|
| 586 |
+
initPlayerControls();
|
| 587 |
});
|
| 588 |
|
| 589 |
// Fonction pour charger les films
|
|
|
|
| 632 |
</div>
|
| 633 |
<p class="text-gray-400 text-sm mt-2 line-clamp-2">${movie.description}</p>
|
| 634 |
<div class="mt-4">
|
| 635 |
+
<button onclick="playMovieAutomatically(${movie.id})" class="streaming-btn w-full text-white px-4 py-2 rounded-lg font-semibold">
|
| 636 |
+
<i class="fas fa-play mr-2"></i> Regarder automatiquement
|
| 637 |
</button>
|
| 638 |
</div>
|
| 639 |
</div>
|
|
|
|
| 702 |
});
|
| 703 |
}
|
| 704 |
|
| 705 |
+
// Fonction pour jouer un film automatiquement
|
| 706 |
+
function playMovieAutomatically(movieId) {
|
| 707 |
+
const movie = frenchMoviesDatabase.find(m => m.id === movieId);
|
| 708 |
+
if (!movie) return;
|
| 709 |
+
|
| 710 |
+
currentMoviePlaying = movie;
|
| 711 |
+
|
| 712 |
+
// Show player modal
|
| 713 |
+
const playerModal = document.getElementById('playerModal');
|
| 714 |
+
playerModal.classList.remove('hidden');
|
| 715 |
+
|
| 716 |
+
// Set movie info
|
| 717 |
+
document.getElementById('playerTitle').textContent = `Lecture automatique: ${movie.title}`;
|
| 718 |
+
document.getElementById('playerMovieTitle').textContent = movie.title;
|
| 719 |
+
document.getElementById('playerYear').textContent = movie.year;
|
| 720 |
+
document.getElementById('playerRating').textContent = `${movie.rating.toFixed(1)}/5`;
|
| 721 |
+
document.getElementById('playerGenre').textContent = movie.genre.join(', ');
|
| 722 |
+
document.getElementById('playerDescription').textContent = movie.description;
|
| 723 |
+
document.getElementById('playerPoster').src = movie.image;
|
| 724 |
+
|
| 725 |
+
// Clear previous server options
|
| 726 |
+
const serverOptions = document.getElementById('serverOptions');
|
| 727 |
+
serverOptions.innerHTML = '';
|
| 728 |
+
|
| 729 |
+
// Add server options
|
| 730 |
+
movie.streamingLinks.forEach((link, index) => {
|
| 731 |
+
const serverBtn = document.createElement('button');
|
| 732 |
+
serverBtn.className = 'px-3 py-1 rounded-full text-sm flex items-center';
|
| 733 |
+
|
| 734 |
+
// Color based on server type
|
| 735 |
+
if (link.server === 'vip') {
|
| 736 |
+
serverBtn.className += ' bg-purple-600 hover:bg-purple-700';
|
| 737 |
+
} else if (link.server === 'premium') {
|
| 738 |
+
serverBtn.className += ' bg-blue-600 hover:bg-blue-700';
|
| 739 |
+
} else {
|
| 740 |
+
serverBtn.className += ' bg-gray-700 hover:bg-gray-600';
|
| 741 |
+
}
|
| 742 |
+
|
| 743 |
+
serverBtn.innerHTML = `
|
| 744 |
+
<i class="fas fa-server mr-2"></i>
|
| 745 |
+
${link.provider} (${link.quality === '4k' ? '4K' : link.quality === '1080' ? 'FHD' : link.quality === '720' ? 'HD' : 'SD'})
|
| 746 |
+
`;
|
| 747 |
+
|
| 748 |
+
serverBtn.onclick = () => switchToServer(index);
|
| 749 |
+
serverOptions.appendChild(serverBtn);
|
| 750 |
+
});
|
| 751 |
+
|
| 752 |
+
// Start automatic playback with the best available stream
|
| 753 |
+
startAutomaticPlayback(movie);
|
| 754 |
+
}
|
| 755 |
+
|
| 756 |
+
// Start automatic playback with the best available stream
|
| 757 |
+
function startAutomaticPlayback(movie) {
|
| 758 |
+
// In a real app, this would analyze all available streams and select the best one
|
| 759 |
+
// based on user preferences, server latency, quality, etc.
|
| 760 |
+
|
| 761 |
+
// For demo purposes, we'll just pick the first 1080p stream, or the first available
|
| 762 |
+
let bestStream = movie.streamingLinks[0];
|
| 763 |
+
|
| 764 |
+
// Try to find a 1080p stream first
|
| 765 |
+
const fullHdStream = movie.streamingLinks.find(link => link.quality === '1080');
|
| 766 |
+
if (fullHdStream) {
|
| 767 |
+
bestStream = fullHdStream;
|
| 768 |
+
}
|
| 769 |
+
|
| 770 |
+
// Then try to find a VIP server
|
| 771 |
+
const vipStream = movie.streamingLinks.find(link => link.server === 'vip');
|
| 772 |
+
if (vipStream) {
|
| 773 |
+
bestStream = vipStream;
|
| 774 |
+
}
|
| 775 |
+
|
| 776 |
+
// Show loading state
|
| 777 |
+
const videoPlayer = document.getElementById('videoPlayer');
|
| 778 |
+
videoPlayer.innerHTML = `
|
| 779 |
+
<div class="absolute inset-0 flex items-center justify-center">
|
| 780 |
+
<div class="text-center">
|
| 781 |
+
<div class="loading-spinner mx-auto mb-4"></div>
|
| 782 |
+
<p class="text-gray-400">Connexion au serveur ${bestStream.provider} (${bestStream.quality})...</p>
|
| 783 |
+
</div>
|
| 784 |
+
</div>
|
| 785 |
+
`;
|
| 786 |
+
|
| 787 |
+
// Simulate connecting to server
|
| 788 |
+
setTimeout(() => {
|
| 789 |
+
// In a real app, this would initialize the video player with the stream URL
|
| 790 |
+
simulateVideoPlayback(bestStream);
|
| 791 |
+
}, 1500);
|
| 792 |
+
}
|
| 793 |
+
|
| 794 |
+
// Simulate video playback (in a real app, this would use a video player library)
|
| 795 |
+
function simulateVideoPlayback(stream) {
|
| 796 |
+
const videoPlayer = document.getElementById('videoPlayer');
|
| 797 |
+
|
| 798 |
+
// Show quality selector
|
| 799 |
+
document.getElementById('qualitySelector').classList.remove('hidden');
|
| 800 |
+
|
| 801 |
+
// Create fake video element (in a real app, this would be a real video player)
|
| 802 |
+
videoPlayer.innerHTML = `
|
| 803 |
+
<div class="absolute inset-0 bg-black flex items-center justify-center">
|
| 804 |
+
<div class="text-center">
|
| 805 |
+
<i class="fas fa-play-circle text-6xl text-blue-500 mb-4"></i>
|
| 806 |
+
<h4 class="text-xl font-bold">${currentMoviePlaying.title}</h4>
|
| 807 |
+
<p class="text-gray-400 mt-2">Lecture en cours depuis ${stream.provider}</p>
|
| 808 |
+
<p class="text-sm text-gray-500 mt-1">Qualité: ${stream.quality === '4k' ? '4K Ultra HD' : stream.quality === '1080' ? 'Full HD 1080p' : stream.quality === '720' ? 'HD 720p' : 'SD 480p'}</p>
|
| 809 |
+
</div>
|
| 810 |
+
</div>
|
| 811 |
+
`;
|
| 812 |
+
|
| 813 |
+
// Start progress simulation
|
| 814 |
+
let currentTime = 0;
|
| 815 |
+
const duration = currentMoviePlaying.duration * 60; // Convert to seconds
|
| 816 |
+
|
| 817 |
+
// Update time display
|
| 818 |
+
const timeDisplay = document.getElementById('timeDisplay');
|
| 819 |
+
timeDisplay.textContent = `00:00 / ${formatTime(duration)}`;
|
| 820 |
+
|
| 821 |
+
// Update progress bar
|
| 822 |
+
const progressBar = document.getElementById('progressBar');
|
| 823 |
+
progressBar.style.width = '0%';
|
| 824 |
+
|
| 825 |
+
// Simulate playback progress
|
| 826 |
+
if (progressInterval) clearInterval(progressInterval);
|
| 827 |
+
progressInterval = setInterval(() => {
|
| 828 |
+
if (currentTime >= duration) {
|
| 829 |
+
currentTime = duration;
|
| 830 |
+
clearInterval(progressInterval);
|
| 831 |
+
} else {
|
| 832 |
+
currentTime += 1;
|
| 833 |
+
}
|
| 834 |
+
|
| 835 |
+
const percent = (currentTime / duration) * 100;
|
| 836 |
+
progressBar.style.width = `${percent}%`;
|
| 837 |
+
timeDisplay.textContent = `${formatTime(currentTime)} / ${formatTime(duration)}`;
|
| 838 |
+
}, 1000);
|
| 839 |
+
|
| 840 |
+
isPlaying = true;
|
| 841 |
+
}
|
| 842 |
+
|
| 843 |
+
// Format time in MM:SS
|
| 844 |
+
function formatTime(seconds) {
|
| 845 |
+
const mins = Math.floor(seconds / 60);
|
| 846 |
+
const secs = Math.floor(seconds % 60);
|
| 847 |
+
return `${mins.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`;
|
| 848 |
+
}
|
| 849 |
+
|
| 850 |
+
// Switch to a different server
|
| 851 |
+
function switchToServer(streamIndex) {
|
| 852 |
+
if (!currentMoviePlaying) return;
|
| 853 |
+
|
| 854 |
+
const stream = currentMoviePlaying.streamingLinks[streamIndex];
|
| 855 |
+
if (!stream) return;
|
| 856 |
+
|
| 857 |
+
// Show loading state
|
| 858 |
+
const videoPlayer = document.getElementById('videoPlayer');
|
| 859 |
+
videoPlayer.innerHTML = `
|
| 860 |
+
<div class="absolute inset-0 flex items-center justify-center">
|
| 861 |
+
<div class="text-center">
|
| 862 |
+
<div class="loading-spinner mx-auto mb-4"></div>
|
| 863 |
+
<p class="text-gray-400">Changement vers ${stream.provider} (${stream.quality})...</p>
|
| 864 |
+
</div>
|
| 865 |
+
</div>
|
| 866 |
+
`;
|
| 867 |
+
|
| 868 |
+
// Simulate server switch
|
| 869 |
+
setTimeout(() => {
|
| 870 |
+
simulateVideoPlayback(stream);
|
| 871 |
+
}, 1000);
|
| 872 |
+
}
|
| 873 |
+
|
| 874 |
+
// Close player
|
| 875 |
+
function closePlayer() {
|
| 876 |
+
const playerModal = document.getElementById('playerModal');
|
| 877 |
+
playerModal.classList.add('hidden');
|
| 878 |
+
|
| 879 |
+
// Clear playback simulation
|
| 880 |
+
if (progressInterval) {
|
| 881 |
+
clearInterval(progressInterval);
|
| 882 |
+
progressInterval = null;
|
| 883 |
+
}
|
| 884 |
+
|
| 885 |
+
isPlaying = false;
|
| 886 |
+
currentMoviePlaying = null;
|
| 887 |
+
}
|
| 888 |
+
|
| 889 |
+
// Initialize player controls
|
| 890 |
+
function initPlayerControls() {
|
| 891 |
+
// Play/Pause button
|
| 892 |
+
document.getElementById('playPauseBtn').addEventListener('click', function() {
|
| 893 |
+
if (!currentMoviePlaying) return;
|
| 894 |
+
|
| 895 |
+
isPlaying = !isPlaying;
|
| 896 |
+
this.innerHTML = `<i class="fas fa-${isPlaying ? 'pause' : 'play'}"></i>`;
|
| 897 |
+
|
| 898 |
+
if (isPlaying) {
|
| 899 |
+
// Resume playback simulation
|
| 900 |
+
simulateVideoPlayback(currentMoviePlaying.streamingLinks[0]);
|
| 901 |
+
} else {
|
| 902 |
+
// Pause playback simulation
|
| 903 |
+
if (progressInterval) {
|
| 904 |
+
clearInterval(progressInterval);
|
| 905 |
+
progressInterval = null;
|
| 906 |
+
}
|
| 907 |
+
}
|
| 908 |
+
});
|
| 909 |
+
|
| 910 |
+
// Fullscreen button
|
| 911 |
+
document.getElementById('fullscreenBtn').addEventListener('click', function() {
|
| 912 |
+
const playerModal = document.getElementById('playerModal');
|
| 913 |
+
if (!document.fullscreenElement) {
|
| 914 |
+
playerModal.requestFullscreen().catch(err => {
|
| 915 |
+
console.error(`Error attempting to enable fullscreen: ${err.message}`);
|
| 916 |
+
});
|
| 917 |
+
} else {
|
| 918 |
+
document.exitFullscreen();
|
| 919 |
+
}
|
| 920 |
+
});
|
| 921 |
+
|
| 922 |
+
// Subtitle button
|
| 923 |
+
document.getElementById('subtitleBtn').addEventListener('click', function() {
|
| 924 |
+
this.classList.toggle('active');
|
| 925 |
+
});
|
| 926 |
+
|
| 927 |
+
// Auto quality button
|
| 928 |
+
document.getElementById('autoQualityBtn').addEventListener('click', function() {
|
| 929 |
+
if (!currentMoviePlaying) return;
|
| 930 |
+
|
| 931 |
+
// Simulate automatic quality adjustment
|
| 932 |
+
startAutomaticPlayback(currentMoviePlaying);
|
| 933 |
+
});
|
| 934 |
+
|
| 935 |
+
// Quality selector
|
| 936 |
+
document.getElementById('qualitySelect').addEventListener('change', function() {
|
| 937 |
+
if (!currentMoviePlaying) return;
|
| 938 |
+
|
| 939 |
+
const quality = this.value;
|
| 940 |
+
if (quality === 'auto') {
|
| 941 |
+
startAutomaticPlayback(currentMoviePlaying);
|
| 942 |
+
} else {
|
| 943 |
+
// Find a stream with the selected quality
|
| 944 |
+
const matchingStream = currentMoviePlaying.streamingLinks.find(link => link.quality === quality);
|
| 945 |
+
if (matchingStream) {
|
| 946 |
+
simulateVideoPlayback(matchingStream);
|
| 947 |
+
}
|
| 948 |
+
}
|
| 949 |
+
});
|
| 950 |
+
}
|
| 951 |
+
|
| 952 |
// Fonction pour afficher les liens de streaming
|
| 953 |
function showStreamingLinks(movieId) {
|
| 954 |
const movie = frenchMoviesDatabase.find(m => m.id === movieId);
|
|
|
|
| 981 |
<span><i class="fas fa-server mr-1"></i> ${link.server === 'vip' ? 'VIP' : link.server === 'europe' ? 'Europe' : link.server === 'us' ? 'USA' : link.server === 'asia' ? 'Asie' : 'Premium'}</span>
|
| 982 |
<span><i class="fas fa-language mr-1"></i> ${link.language === 'vf' ? 'VF' : link.language === 'vostfr' ? 'VOSTFR' : 'VO'}</span>
|
| 983 |
</div>
|
| 984 |
+
<button onclick="playMovieAutomatically(${movie.id}, ${movie.streamingLinks.indexOf(link)})" class="block mt-3 streaming-btn text-white px-3 py-2 rounded text-center w-full">
|
| 985 |
+
<i class="fas fa-play mr-2"></i> Lancer la lecture
|
| 986 |
+
</button>
|
| 987 |
</div>
|
| 988 |
`).join('')}
|
| 989 |
</div>
|
|
|
|
| 1073 |
<span class="text-sm text-gray-400"><i class="fas fa-link mr-1"></i> ${filteredLinks.length} serveur(s) trouvé(s)</span>
|
| 1074 |
</div>
|
| 1075 |
<div class="mt-3">
|
| 1076 |
+
<button onclick="playMovieAutomatically(${movie.id})" class="streaming-btn text-white px-3 py-1 rounded text-sm w-full">
|
| 1077 |
+
<i class="fas fa-play mr-1"></i> Regarder automatiquement
|
| 1078 |
</button>
|
| 1079 |
</div>
|
| 1080 |
</div>
|
prompts.txt
CHANGED
|
@@ -1,4 +1,5 @@
|
|
| 1 |
https://huggingface.co/spaces/docto41/streamvista : avec les liens url des films en francais
|
| 2 |
AJOUT2 UNE BASE DE DONN2ES DES FILM COMPLET A REGARDER EN FRANCAIS ? ET UNE BASE DE DONN2ES DES LIENS DES URL DES FILM COMPLET EN ROBOTIS2 EN AUTOMATIQUE
|
| 3 |
AJOUT2 UNE BASE DE DONN2ES DES FILM COMPLET A REGARDER EN FRANCAIS ? ET UNE BASE DE DONN2ES DES LIENS DES URL DES SERVEUR DES FILM COMPLET EN ROBOTIS2 EN AUTOMATIQUE
|
| 4 |
-
ajouter une base de données des films 142555 film plus une base de donés de 124556 liens url des film en francais plus serveur des liens des film le tout en automatique
|
|
|
|
|
|
| 1 |
https://huggingface.co/spaces/docto41/streamvista : avec les liens url des films en francais
|
| 2 |
AJOUT2 UNE BASE DE DONN2ES DES FILM COMPLET A REGARDER EN FRANCAIS ? ET UNE BASE DE DONN2ES DES LIENS DES URL DES FILM COMPLET EN ROBOTIS2 EN AUTOMATIQUE
|
| 3 |
AJOUT2 UNE BASE DE DONN2ES DES FILM COMPLET A REGARDER EN FRANCAIS ? ET UNE BASE DE DONN2ES DES LIENS DES URL DES SERVEUR DES FILM COMPLET EN ROBOTIS2 EN AUTOMATIQUE
|
| 4 |
+
ajouter une base de données des films 142555 film plus une base de donés de 124556 liens url des film en francais plus serveur des liens des film le tout en automatique
|
| 5 |
+
ajouter regarder les film en automatique
|