Subtitle files are now valid. Every transcript exported for a Zoom Clip ended
each cue at 00:00:00,000, because the clip transcript names its end time
differently from a cloud recording's and only one of the two names was
recognised. Media players reject a cue that ends before it starts, so every
Clips SRT and VTT the actor produced was unusable as a subtitle file. Transcript
timing is now read from any of the shapes Zoom returns, normalised, and — where a
source genuinely provides no end time — estimated from the segment and clamped so
cues never overlap.
Government recordings (zoomgov.com) are supported. Recordings hosted on
government tenants — agencies, courts, city councils, public hearings — were
rejected before anything was requested, and would have failed anyway because the
recording lookup was always sent to the commercial domain. Both are fixed:
government and vanity subdomains are recognised, and each recording is looked up
on its own host.
The recording you linked is the one you get. On a replay page holding several
recordings ("Total 2 Recordings"), selecting the second one still returned the
first one's video and transcript. The recording is now identified from the link
you paste, falling back to the page only when the link does not carry one.
Meeting join links are no longer treated as recordings. zoom.us/j/…,
/w/…, /my/… and similar were accepted as recordings and fetched pointlessly
before failing with a confusing message. They are now reported immediately as not
being recording links. Lookalike hostnames (notzoom.us.evil.com) are rejected
outright.
Speaker names are kept on clips. Clips label speakers differently from cloud
recordings; those labels were being dropped.
Newer Zoom Events links work. Event links that carry the session in a query
parameter are now read, alongside the older path-based form.
Recorded-at timestamps no longer shift by timezone. Clip timestamps were
converted to a local-format string and parsed back, which moved the value
depending on where the run executed. The original timestamp is preserved.
Clip length is reported correctly (it was being divided by 1000 and reported
as zero).
An interrupted run resumes for real. Progress was written to storage that the
platform clears on every restart, so a resumed run always began again from the
first link. It is now written somewhere that survives.
A single unexpected error no longer kills the run. An unhandled rejection
terminated the process immediately, discarding results already extracted and
marking the run failed.