Video custom : shoot des la fin de la video
La video se joue integralement (peu importe la duree) et la capture se declenche a l'instant exact ou elle se termine. Plus de timeout arbitraire. Pour les GIF, duree detectee depuis le nom du fichier (ex: countdown_5s.gif) sinon 3s par defaut. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -99,8 +99,9 @@ async function compteARebours() {
|
|||||||
const anim = choisirAnimationAleatoire();
|
const anim = choisirAnimationAleatoire();
|
||||||
|
|
||||||
if (anim.type === 'custom') {
|
if (anim.type === 'custom') {
|
||||||
// Jouer une video/gif en plein ecran
|
// Jouer la video/gif en plein ecran, shoot des qu'elle finit
|
||||||
await jouerAnimationCustom(anim.nom, duree);
|
await jouerAnimationCustom(anim.nom);
|
||||||
|
return; // pas de compte a rebours CSS
|
||||||
} else {
|
} else {
|
||||||
// Animation CSS classique
|
// Animation CSS classique
|
||||||
conteneur.classList.remove('cache');
|
conteneur.classList.remove('cache');
|
||||||
@@ -123,7 +124,7 @@ async function compteARebours() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async function jouerAnimationCustom(nom, duree) {
|
async function jouerAnimationCustom(nom) {
|
||||||
// Creer un overlay plein ecran pour la video/gif
|
// Creer un overlay plein ecran pour la video/gif
|
||||||
const overlay = document.createElement('div');
|
const overlay = document.createElement('div');
|
||||||
overlay.className = 'video-countdown-overlay';
|
overlay.className = 'video-countdown-overlay';
|
||||||
@@ -132,24 +133,31 @@ async function jouerAnimationCustom(nom, duree) {
|
|||||||
|
|
||||||
if (ext === 'gif') {
|
if (ext === 'gif') {
|
||||||
const img = document.createElement('img');
|
const img = document.createElement('img');
|
||||||
img.src = `/assets/animations/${nom}`;
|
// Ajouter un timestamp pour forcer le rechargement (relancer le GIF depuis le debut)
|
||||||
|
img.src = `/assets/animations/${nom}?t=${Date.now()}`;
|
||||||
overlay.appendChild(img);
|
overlay.appendChild(img);
|
||||||
document.body.appendChild(overlay);
|
document.body.appendChild(overlay);
|
||||||
await pause(duree * 1000);
|
|
||||||
|
// Pour un GIF, on attend sa duree naturelle
|
||||||
|
// Comme on ne peut pas detecter la fin d'un GIF, on utilise un fallback de 3s
|
||||||
|
// L'utilisateur peut configurer la duree dans le nom du fichier (ex: countdown_5s.gif)
|
||||||
|
const match = nom.match(/(\d+)s/);
|
||||||
|
const dureeGif = match ? parseInt(match[1]) * 1000 : 3000;
|
||||||
|
await pause(dureeGif);
|
||||||
} else {
|
} else {
|
||||||
|
// Video MP4/WebM : on attend la fin exacte de la video
|
||||||
const video = document.createElement('video');
|
const video = document.createElement('video');
|
||||||
video.src = `/assets/animations/${nom}`;
|
video.src = `/assets/animations/${nom}`;
|
||||||
video.muted = true;
|
video.muted = true;
|
||||||
video.playsInline = true;
|
video.playsInline = true;
|
||||||
video.autoplay = true;
|
|
||||||
overlay.appendChild(video);
|
overlay.appendChild(video);
|
||||||
document.body.appendChild(overlay);
|
document.body.appendChild(overlay);
|
||||||
|
|
||||||
// Attendre la fin de la video ou le timeout
|
await new Promise(resolve => {
|
||||||
await Promise.race([
|
video.onended = resolve;
|
||||||
new Promise(resolve => { video.onended = resolve; }),
|
video.onerror = resolve;
|
||||||
pause(duree * 1000 + 2000),
|
video.play().catch(resolve);
|
||||||
]);
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
overlay.remove();
|
overlay.remove();
|
||||||
|
|||||||
Reference in New Issue
Block a user