Spaces:
Paused
Paused
Zhen Ye commited on
Commit ·
422c79a
1
Parent(s): f0b6460
reload input
Browse files
demo.html
CHANGED
|
@@ -264,6 +264,13 @@
|
|
| 264 |
display: block;
|
| 265 |
}
|
| 266 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 267 |
.spinner {
|
| 268 |
border: 4px solid #e5e7eb;
|
| 269 |
border-top: 4px solid #1f2933;
|
|
@@ -383,6 +390,7 @@
|
|
| 383 |
<div class="spinner"></div>
|
| 384 |
<p>Processing video... This may take a while depending on video length.</p>
|
| 385 |
</div>
|
|
|
|
| 386 |
|
| 387 |
<!-- Results -->
|
| 388 |
<div class="section hidden" id="resultsSection">
|
|
@@ -437,6 +445,7 @@
|
|
| 437 |
const firstFrameImage = document.getElementById('firstFrameImage');
|
| 438 |
const downloadBtn = document.getElementById('downloadBtn');
|
| 439 |
let statusPoller = null;
|
|
|
|
| 440 |
// Mode selection handler
|
| 441 |
modeCards.forEach(card => {
|
| 442 |
card.addEventListener('click', (e) => {
|
|
@@ -504,7 +513,10 @@
|
|
| 504 |
}
|
| 505 |
firstFrameImage.removeAttribute('src');
|
| 506 |
processedVideo.removeAttribute('src');
|
|
|
|
| 507 |
downloadBtn.removeAttribute('href');
|
|
|
|
|
|
|
| 508 |
|
| 509 |
// Prepare form data
|
| 510 |
const formData = new FormData();
|
|
@@ -529,6 +541,8 @@
|
|
| 529 |
const data = await response.json();
|
| 530 |
firstFrameImage.src = `${data.first_frame_url}?t=${Date.now()}`;
|
| 531 |
resultsSection.classList.remove('hidden');
|
|
|
|
|
|
|
| 532 |
|
| 533 |
statusPoller = setInterval(async () => {
|
| 534 |
try {
|
|
@@ -536,6 +550,7 @@
|
|
| 536 |
if (!statusResponse.ok) {
|
| 537 |
clearInterval(statusPoller);
|
| 538 |
statusPoller = null;
|
|
|
|
| 539 |
alert('Job expired. Please re-upload the video.');
|
| 540 |
return;
|
| 541 |
}
|
|
@@ -543,6 +558,7 @@
|
|
| 543 |
if (statusData.status === 'completed') {
|
| 544 |
clearInterval(statusPoller);
|
| 545 |
statusPoller = null;
|
|
|
|
| 546 |
const videoResponse = await fetch(data.video_url);
|
| 547 |
if (!videoResponse.ok) {
|
| 548 |
alert('Failed to fetch processed video.');
|
|
@@ -555,15 +571,19 @@
|
|
| 555 |
} else if (statusData.status === 'failed') {
|
| 556 |
clearInterval(statusPoller);
|
| 557 |
statusPoller = null;
|
|
|
|
| 558 |
alert(statusData.error || 'Processing failed.');
|
|
|
|
|
|
|
| 559 |
}
|
| 560 |
} catch (pollError) {
|
| 561 |
clearInterval(statusPoller);
|
| 562 |
statusPoller = null;
|
| 563 |
console.error('Polling error:', pollError);
|
|
|
|
| 564 |
alert('Polling error: ' + pollError.message);
|
| 565 |
}
|
| 566 |
-
},
|
| 567 |
} catch (error) {
|
| 568 |
console.error('Error:', error);
|
| 569 |
alert('Network error: ' + error.message);
|
|
|
|
| 264 |
display: block;
|
| 265 |
}
|
| 266 |
|
| 267 |
+
.status-line {
|
| 268 |
+
margin-top: 12px;
|
| 269 |
+
font-size: 0.95rem;
|
| 270 |
+
color: #4b5563;
|
| 271 |
+
text-align: center;
|
| 272 |
+
}
|
| 273 |
+
|
| 274 |
.spinner {
|
| 275 |
border: 4px solid #e5e7eb;
|
| 276 |
border-top: 4px solid #1f2933;
|
|
|
|
| 390 |
<div class="spinner"></div>
|
| 391 |
<p>Processing video... This may take a while depending on video length.</p>
|
| 392 |
</div>
|
| 393 |
+
<p class="status-line hidden" id="statusLine"></p>
|
| 394 |
|
| 395 |
<!-- Results -->
|
| 396 |
<div class="section hidden" id="resultsSection">
|
|
|
|
| 445 |
const firstFrameImage = document.getElementById('firstFrameImage');
|
| 446 |
const downloadBtn = document.getElementById('downloadBtn');
|
| 447 |
let statusPoller = null;
|
| 448 |
+
const statusLine = document.getElementById('statusLine');
|
| 449 |
// Mode selection handler
|
| 450 |
modeCards.forEach(card => {
|
| 451 |
card.addEventListener('click', (e) => {
|
|
|
|
| 513 |
}
|
| 514 |
firstFrameImage.removeAttribute('src');
|
| 515 |
processedVideo.removeAttribute('src');
|
| 516 |
+
processedVideo.load();
|
| 517 |
downloadBtn.removeAttribute('href');
|
| 518 |
+
statusLine.classList.add('hidden');
|
| 519 |
+
statusLine.textContent = '';
|
| 520 |
|
| 521 |
// Prepare form data
|
| 522 |
const formData = new FormData();
|
|
|
|
| 541 |
const data = await response.json();
|
| 542 |
firstFrameImage.src = `${data.first_frame_url}?t=${Date.now()}`;
|
| 543 |
resultsSection.classList.remove('hidden');
|
| 544 |
+
statusLine.textContent = 'Status: processing';
|
| 545 |
+
statusLine.classList.remove('hidden');
|
| 546 |
|
| 547 |
statusPoller = setInterval(async () => {
|
| 548 |
try {
|
|
|
|
| 550 |
if (!statusResponse.ok) {
|
| 551 |
clearInterval(statusPoller);
|
| 552 |
statusPoller = null;
|
| 553 |
+
statusLine.textContent = 'Status: expired (please re-upload)';
|
| 554 |
alert('Job expired. Please re-upload the video.');
|
| 555 |
return;
|
| 556 |
}
|
|
|
|
| 558 |
if (statusData.status === 'completed') {
|
| 559 |
clearInterval(statusPoller);
|
| 560 |
statusPoller = null;
|
| 561 |
+
statusLine.textContent = 'Status: completed';
|
| 562 |
const videoResponse = await fetch(data.video_url);
|
| 563 |
if (!videoResponse.ok) {
|
| 564 |
alert('Failed to fetch processed video.');
|
|
|
|
| 571 |
} else if (statusData.status === 'failed') {
|
| 572 |
clearInterval(statusPoller);
|
| 573 |
statusPoller = null;
|
| 574 |
+
statusLine.textContent = 'Status: failed';
|
| 575 |
alert(statusData.error || 'Processing failed.');
|
| 576 |
+
} else if (statusData.status) {
|
| 577 |
+
statusLine.textContent = `Status: ${statusData.status}`;
|
| 578 |
}
|
| 579 |
} catch (pollError) {
|
| 580 |
clearInterval(statusPoller);
|
| 581 |
statusPoller = null;
|
| 582 |
console.error('Polling error:', pollError);
|
| 583 |
+
statusLine.textContent = 'Status: polling error';
|
| 584 |
alert('Polling error: ' + pollError.message);
|
| 585 |
}
|
| 586 |
+
}, 10000);
|
| 587 |
} catch (error) {
|
| 588 |
console.error('Error:', error);
|
| 589 |
alert('Network error: ' + error.message);
|