Skip to content

Export modal: elapsed time, ETA, and a notification when the export completes #399

Description

@maboa

Summary

During a media export, show elapsed time and an estimated time remaining (ETA), and when the export finishes, notify the user — useful when a long export is running and they've switched tabs or looked away.

What exists

js/media-export.js already drives a progress fraction (0–1) through onProgresssetProgress, rendering #export-progress (bar) and #export-status (aria-live="polite" text). So ETA is a display addition, no pipeline change. The download itself already triggers on completion (downloadBlob).

Proposed change

Elapsed + ETA (in-progress)

  • On start, record startedAt.
  • On each setProgress(fraction) tick, update the status line:
    • Elapsednow − startedAt, m:ss.
    • ETAelapsed × (1 − fraction) / fraction, shown as ~m:ss left once fraction > ~0.02.
    • e.g. Exporting… 0:12 elapsed · ~0:35 left.
  • Progress isn't perfectly linear (rate-stretch weights audio to 0.6 then jumps to 0.9 — media-export.js:445/451; video is per-frame), so smooth the estimate (moving average of recent rate, or refresh ETA ~once/second) and prefix ~. Reserve width so the text doesn't thrash layout.

Completion notification

When the export finishes (and on failure):

  • In-app: a clear success state in the modal — "Done — saved <filename> (took m:ss)" — and/or a small toast, so it's obvious even if the progress bar was ignored.
  • Background / tab-away: a Web Notification (Notification API) when the tab isn't focused (document.hidden), e.g. "Export complete — <filename>". Request permission lazily (only when an export actually starts, not on page load), and degrade gracefully if denied/unsupported — never block the export on it.
  • Optional niceties (pick as desired): a brief document-title flash ("✓ Export done") while the tab is unfocused, and/or a short completion sound (off by default).
  • On error, surface it the same way (in-app error is already shown; add the notification when tab-away).

Acceptance

  • During any export (entire / edited / video / burn-in / rate): elapsed counts up, a stabilised ~ETA shows, both cleared on finish/error.
  • On completion: an unmistakable in-app "done" state with filename + duration, and a Web Notification when the tab is backgrounded (permission handled gracefully; no-op if denied).
  • No regression to the progress bar, existing status messages, or the download trigger.

Notes

  • Keep updates in the existing aria-live #export-status so screen readers are covered.
  • Web Notifications need a user gesture / permission and only make sense over https / localhost — fall back silently otherwise.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or requestuxImproves the user experience

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions