{% if not acquisitions %}

Aucune acquisition. Ingeste un dossier via scripts/ingest.py.

{% else %}
{% for acq in acquisitions %}

{{ acq.name }} {{ acq.total_duration }}

{% for j in acq.jobs %} {% endfor %}
preview # AUV · GP plongée durée frames hors-eau progression temps
{% if j.status == 'done' %} {% elif j.status in ('running','extracting') %} {% elif j.status == 'error' %} {% elif j.status == 'skipped' %} {% else %}{% endif %} {% if j.has_thumbnail %}{% else %}{% endif %} #{{ j.id }} {{ j.auv }} · {{ j.gp_label }}
{{ j.gopro_serial[-6:] }}
{% if '–' in j.segment_label %}↓{{ j.segment_label.split('–')[0] }} ↑{{ j.segment_label.split('–')[1] }}{% else %}{{ j.segment_label }}{% endif %} {{ j.video_duration_fmt }} {% if j.frame_count %}{{ j.frame_count }}{% else %}—{% endif %} {% if j.trimmed_total %}−{{ j.trimmed_total }}{% else %}—{% endif %} {% if j.status in ('extracting','running') %}
{{ j.progress }}%
{% if j.step %}
{{ j.step }}
{% endif %} {% elif j.status == 'done' %} {% if j.viser_url %} viser ↗ {% else %} {% endif %} {% if j.ply_url %} PLY ↓ {% endif %} {% if j.glb_url %} GLB ↓ {% endif %} {% elif j.status == 'skipped' %} skipped {% elif j.status == 'error' %} failed {% else %} {% endif %}
{{ j._duration }} {% if j.status in ('queued','extracting','running') %} {% elif j.status == 'error' %} {% endif %}
stitch
{% if acq.stitches %}
    {% for s in acq.stitches %}
  • {% if s.status == 'done' %}✓{% elif s.status == 'running' %}↻{% elif s.status == 'error' %}✕{% else %}■{% endif %} {% if s.level == 'per_auv' %}pair GP1↔GP2 {{ s.auv }} {% else %}merge final{% endif %} {% if s._duration %} · {{ s._duration }}{% endif %} {% if s.status == 'done' and s.output_ply %} {% endif %} {% if s.status in ('queued','running') %} {% elif s.status == 'error' %} {% endif %} {% if s.error %}
    {{ s.error[:140] }}
    {% endif %}
  • {% endfor %}
{% else %}
  • pair GP1↔GP2 per AUV
  • cross-AUV merge
  • final PLY
{% endif %}
{% endfor %}
{% endif %}