Add CI/CD workflow
This commit is contained in:
@@ -11,7 +11,7 @@
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
{% set status_colors = {'completed': 'green', 'running': 'blue', 'pending': 'yellow', 'failed': 'red'} %}
|
||||
{% set status_colors = {'completed': 'green', 'running': 'blue', 'pending': 'yellow', 'failed': 'red', 'paused': 'yellow'} %}
|
||||
{% set color = status_colors.get(run.status, 'gray') %}
|
||||
|
||||
<div class="max-w-6xl mx-auto">
|
||||
@@ -28,7 +28,42 @@
|
||||
{% if run.error %}
|
||||
<span class="text-red-400 text-sm ml-2">{{ run.error }}</span>
|
||||
{% endif %}
|
||||
{% if run.checkpoint_frame %}
|
||||
<span class="text-gray-400 text-sm ml-2">
|
||||
Checkpoint: {{ run.checkpoint_frame }}{% if run.total_frames %} / {{ run.total_frames }}{% endif %} frames
|
||||
</span>
|
||||
{% endif %}
|
||||
<div class="flex-grow"></div>
|
||||
|
||||
<!-- Pause button for running renders -->
|
||||
{% if run.status == 'running' %}
|
||||
<button hx-post="/runs/{{ run.run_id }}/pause"
|
||||
hx-target="#action-result"
|
||||
hx-swap="innerHTML"
|
||||
class="bg-yellow-600 hover:bg-yellow-700 px-3 py-1 rounded text-sm font-medium">
|
||||
Pause
|
||||
</button>
|
||||
{% endif %}
|
||||
|
||||
<!-- Resume/Restart buttons for failed/paused renders -->
|
||||
{% if run.status in ['failed', 'paused'] %}
|
||||
{% if run.checkpoint_frame %}
|
||||
<button hx-post="/runs/{{ run.run_id }}/resume"
|
||||
hx-target="#action-result"
|
||||
hx-swap="innerHTML"
|
||||
class="bg-green-600 hover:bg-green-700 px-3 py-1 rounded text-sm font-medium">
|
||||
Resume{% if run.total_frames %} ({{ ((run.checkpoint_frame / run.total_frames) * 100)|round|int }}%){% endif %}
|
||||
</button>
|
||||
{% endif %}
|
||||
<button hx-post="/runs/{{ run.run_id }}/restart"
|
||||
hx-target="#action-result"
|
||||
hx-swap="innerHTML"
|
||||
hx-confirm="Discard progress and start over?"
|
||||
class="bg-yellow-600 hover:bg-yellow-700 px-3 py-1 rounded text-sm font-medium">
|
||||
Restart
|
||||
</button>
|
||||
{% endif %}
|
||||
|
||||
{% if run.recipe %}
|
||||
<button hx-post="/runs/rerun/{{ run.recipe }}"
|
||||
hx-target="#action-result"
|
||||
@@ -88,14 +123,20 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Unified HLS Player (shown during rendering OR for completed HLS streams) -->
|
||||
{% if run.status == 'rendering' or run.ipfs_playlist_cid %}
|
||||
<!-- Unified HLS Player (shown during rendering, for paused/failed runs with checkpoint, OR for completed HLS streams) -->
|
||||
{% if run.status == 'rendering' or run.ipfs_playlist_cid or (run.status in ['paused', 'failed'] and run.checkpoint_frame) %}
|
||||
<div id="hls-player-container" class="mb-6 bg-gray-800 rounded-lg p-4">
|
||||
<div class="flex items-center justify-between mb-4">
|
||||
<h3 class="text-lg font-semibold flex items-center">
|
||||
{% if run.status == 'rendering' %}
|
||||
<span id="live-indicator" class="w-3 h-3 bg-red-500 rounded-full mr-2 animate-pulse"></span>
|
||||
<span id="player-title">Live Preview</span>
|
||||
{% elif run.status == 'paused' %}
|
||||
<span id="live-indicator" class="w-3 h-3 bg-yellow-500 rounded-full mr-2"></span>
|
||||
<span id="player-title">Partial Output (Paused)</span>
|
||||
{% elif run.status == 'failed' and run.checkpoint_frame %}
|
||||
<span id="live-indicator" class="w-3 h-3 bg-red-500 rounded-full mr-2"></span>
|
||||
<span id="player-title">Partial Output (Failed)</span>
|
||||
{% else %}
|
||||
<span id="live-indicator" class="w-3 h-3 bg-green-500 rounded-full mr-2 hidden"></span>
|
||||
<span id="player-title">Video</span>
|
||||
@@ -144,12 +185,15 @@
|
||||
|
||||
const baseUrl = '/runs/{{ run.run_id }}/playlist.m3u8';
|
||||
const isRendering = {{ 'true' if run.status == 'rendering' else 'false' }};
|
||||
const isPausedOrFailed = {{ 'true' if run.status in ['paused', 'failed'] else 'false' }};
|
||||
|
||||
let hls = null;
|
||||
let retryCount = 0;
|
||||
const maxRetries = 120;
|
||||
let segmentsLoaded = 0;
|
||||
let currentMode = isRendering ? 'live' : 'replay'; // Default based on status
|
||||
// Start in replay mode for paused/failed (shows partial output from start)
|
||||
// Start in live mode for rendering (follows the render progress)
|
||||
let currentMode = isRendering ? 'live' : 'replay';
|
||||
|
||||
function getHlsUrl() {
|
||||
return baseUrl + '?_t=' + Date.now();
|
||||
|
||||
Reference in New Issue
Block a user