Update app.py
Browse files
app.py
CHANGED
|
@@ -1790,17 +1790,22 @@ function addThumb(idx, place='append'){
|
|
| 1790 |
if(maskedSet.has(idx)) wrap.classList.add('hasmask');
|
| 1791 |
const img=new Image(); img.title='frame '+(idx+1);
|
| 1792 |
img.src=timelineUrls[idx];
|
| 1793 |
-
|
|
|
|
|
|
|
| 1794 |
const fallback = `/frame_idx?vid=${encodeURIComponent(vidName)}&idx=${idx}`;
|
| 1795 |
-
img.onerror = null;
|
| 1796 |
-
img.src = fallback;
|
| 1797 |
-
|
|
|
|
| 1798 |
const nu = `/thumbs/f_${vidStem}_${idx}.jpg?b=${Date.now()}`;
|
| 1799 |
-
|
| 1800 |
-
img.src = nu;
|
| 1801 |
-
|
|
|
|
| 1802 |
};
|
| 1803 |
-
|
|
|
|
| 1804 |
if(idx===currentIdx){ img.classList.add('sel'); if(isPaused) img.classList.add('sel-strong'); }
|
| 1805 |
img.onclick=async ()=>{
|
| 1806 |
currentIdx=idx; player.currentTime=idxToSec(currentIdx);
|
|
@@ -1911,7 +1916,7 @@ async function loadVideoAndMeta() {
|
|
| 1911 |
fitCanvas();
|
| 1912 |
statusEl.textContent = 'Chargement vidéo…';
|
| 1913 |
try{
|
| 1914 |
-
|
| 1915 |
const r = await metaPromise;
|
| 1916 |
if(r.ok){
|
| 1917 |
const m=await r.json();
|
|
|
|
| 1790 |
if(maskedSet.has(idx)) wrap.classList.add('hasmask');
|
| 1791 |
const img=new Image(); img.title='frame '+(idx+1);
|
| 1792 |
img.src=timelineUrls[idx];
|
| 1793 |
+
// Fallback solide : on affiche /frame_idx tout de suite,
|
| 1794 |
+
// puis on ne bascule vers /thumbs que si elle existe (sonde en tâche de fond).
|
| 1795 |
+
img.addEventListener('error', ()=>{
|
| 1796 |
const fallback = `/frame_idx?vid=${encodeURIComponent(vidName)}&idx=${idx}`;
|
| 1797 |
+
img.onerror = null; // éviter les boucles d'erreur
|
| 1798 |
+
img.src = fallback; // montrer la frame générée à la volée
|
| 1799 |
+
|
| 1800 |
+
const trySwap = () => {
|
| 1801 |
const nu = `/thumbs/f_${vidStem}_${idx}.jpg?b=${Date.now()}`;
|
| 1802 |
+
const probe = new Image();
|
| 1803 |
+
probe.onload = () => { timelineUrls[idx] = nu; img.src = nu; };
|
| 1804 |
+
probe.onerror = () => { setTimeout(trySwap, 1500); }; // réessaie plus tard
|
| 1805 |
+
probe.src = nu;
|
| 1806 |
};
|
| 1807 |
+
setTimeout(trySwap, 1500);
|
| 1808 |
+
}, { once:true });
|
| 1809 |
if(idx===currentIdx){ img.classList.add('sel'); if(isPaused) img.classList.add('sel-strong'); }
|
| 1810 |
img.onclick=async ()=>{
|
| 1811 |
currentIdx=idx; player.currentTime=idxToSec(currentIdx);
|
|
|
|
| 1916 |
fitCanvas();
|
| 1917 |
statusEl.textContent = 'Chargement vidéo…';
|
| 1918 |
try{
|
| 1919 |
+
metaPromise = fetch('/meta/'+encodeURIComponent(vidName));
|
| 1920 |
const r = await metaPromise;
|
| 1921 |
if(r.ok){
|
| 1922 |
const m=await r.json();
|