{% extends "base.html" %} {% from "fragments/export_menu.html" import export_menu %} {% block title %}Voxint — {{ media_label }}{% endblock %} {% block cb_breadcrumb %}media / {{ media_label|lower|replace(" ", "-") }}{% endblock %} {% block cb_summary %} {%- if selected_run -%} {{ selected_run.status }} {%- else -%} no runs {%- endif -%} {% endblock %} {% block body %} {# Media detail page with the editor island (Console 2.0 P3a/P3b, issues #156/#157). Renders run metadata, a run chooser, and (when a completed run is selected) the media-editor island with a server-rendered transcript table as JS-off fallback. Layout: the media/runs metadata sits in an inline bar above the editor. The island's own .me-layout grid handles the transcript + speaker-rail split; it is NOT nested inside .lib-two-col (that double-nesting caused the rail to collapse at desktop widths, see #370). #}

Media

File
{{ media_label }}
{% if detail.media.duration_seconds is not none %}
Duration
{{ format_duration(detail.media.duration_seconds) }}
{% endif %} {% if detail.media.size_bytes is not none %}
Size
{{ format_size(detail.media.size_bytes) }}
{% endif %}
{% if detail.chooser %}

{% if selected_run %}Run{% else %}Runs{% endif %}

{% if selected_run %}
Status
{{ selected_run.status }} {% if selected_run.current_stage %} {{ selected_run.current_stage }} {% endif %}
{% if selected_run.error %} {% set nerr = normalize_error(selected_run.error) %}
Error
{{ nerr.label if nerr else selected_run.error|truncate(120) }} {% if nerr and nerr.hint %}
{{ nerr.hint }}{% endif %} {% if nerr and nerr.raw != nerr.label %}
Details
{{ nerr.raw }}
{% endif %}
{% endif %}
{% set restartable = selected_run.status in ('completed', 'failed', 'cancelled') and not selected_run.archived_at %} {% if restartable and csrf_restart %} {% if restart_impact and restart_impact.has_blockers %}
Blocked: {{ restart_impact.segment_scope_decisions }} segment-scope ruling(s) and {{ restart_impact.enrichment_evidence }} enrichment evidence row(s) prevent restart. Submit as a new run instead.
{% elif restart_impact and restart_impact.label_scope_decisions > 0 %}
{% else %}
{% endif %} {% endif %}

Run details

{% endif %} {% set other_runs = detail.chooser|length - (1 if selected_run else 0) %} {% if other_runs > 0 %} {% if selected_run %}
Other runs ({{ other_runs }}) {% endif %} {% if selected_run %}
{% endif %} {% endif %}
{% endif %}
{% if selected_run and island_props %} {# Media editor island (#157). The server-rendered table inside is the JS-off / hydration-failure fallback. #}
{% if not token %}

Read-only view. Claim this run to edit.

{% endif %} {% for seg in island_props.segments %} {% endfor %}
Time Speaker Text
{{ "%.1f"|format(seg.start) }}s {{ seg.speaker or "—" }} {{ seg.text }}
{{ export_menu(selected_run) }} {% elif selected_run %}

Run {{ selected_run.id.hex[:8] }} is {{ selected_run.status }}. The transcript will be available once the run completes.

View run details

{% else %}
{% if detail.chooser %}

No completed runs yet. Select a run above to view its status.

{% else %}

No runs for this media file yet.

{% endif %}

Back to the library

{% endif %} {% endblock %}