{% 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 %}

Run details (restart, archive, technical info)

{% 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 source_metadata %}
Source{% if source_metadata.title %}: {{ source_metadata.title }}{% endif %}
{% if source_metadata.title %}
Title
{{ source_metadata.title }}
{% endif %} {% if source_metadata.uploader or source_metadata.channel %}
Uploader
{{ source_metadata.uploader or source_metadata.channel }} {% if source_metadata.channel and source_metadata.uploader and source_metadata.channel != source_metadata.uploader %} · {{ source_metadata.channel }} {% endif %} {% if source_metadata.channel_url %} · channel {% endif %}
{% endif %} {% if source_metadata.upload_date %}
Uploaded
{{ source_metadata.upload_date.isoformat() }}
{% endif %} {% if source_metadata.tags %}
Tags
{{ source_metadata.tags | join(", ") }}
{% endif %} {% if source_metadata.canonical_url %}
Page
{{ source_metadata.canonical_url }}
{% endif %}
{% if source_metadata.description %}
Description

{{ source_metadata.description }}

{% endif %}
{% endif %} {% if selected_run %}

Notes for this run

{% if shell.can_write %}
{% elif operator_notes %}

{{ operator_notes }}

{% else %}

No notes.

{% 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[:200] %} {% endfor %} {% if island_props.segments|length > 200 %} {% endif %}
Transcript
Time Speaker Text
{{ "%.1f"|format(seg.start) }}s {{ seg.speaker or "—" }} {{ seg.text }}
{{ island_props.segments|length - 200 }} more segments. Enable JavaScript for the full transcript.
{{ export_menu(selected_run) }} {% if speaker_timeline is not none %}
Speaker timeline
    {% for lane in speaker_timeline.lanes %} {% set total_seconds = lane.total_seconds|int %}
  • {{ lane.speaker_name or lane.label }} ({{ total_seconds // 60 }}m {{ total_seconds % 60 }}s)
  • {% endfor %}
{% endif %} {% 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 %}