Release Subtitle Tools 0.2.0
Verify / verify (push) Canceled after 0s

This commit is contained in:
2026-09-02 08:44:49 +02:00
parent b92793eb82
commit 88c2bcd0ff
36 changed files with 1354 additions and 182 deletions
+9
View File
@@ -1,5 +1,14 @@
# Changelog
## 0.2.0 - 2026-09-02
- Added bounded flat-profile TTML import/export, timeline cue insertion,
duplication, split/merge/delete, text transforms and frame snapping.
- Added immediate media playback plus cancellable background waveform extraction,
click/keyboard waveform navigation and stale-result suppression.
- Declared accurate subtitle/media input, export and optional browser capability
profiles for Toolbox handoff.
## 0.1.0 - 2026-09-01
- Added bounded SRT, WebVTT and ASS parsing, cue editing and explicit conversion.
+3 -3
View File
@@ -1,5 +1,5 @@
==============================================================================
@add-ideas/toolbox-contract@0.2.3
@add-ideas/toolbox-contract@0.3.0
Declared licence: Apache-2.0
==============================================================================
--- LICENSE ---
@@ -198,7 +198,7 @@ Declared licence: Apache-2.0
==============================================================================
@add-ideas/toolbox-helpers@0.1.0
@add-ideas/toolbox-helpers@0.2.0
Declared licence: GPL-3.0-or-later
==============================================================================
--- LICENSE ---
@@ -879,7 +879,7 @@ Public License instead of this License. But first, please read
==============================================================================
@add-ideas/toolbox-shell-react@0.2.3
@add-ideas/toolbox-shell-react@0.3.0
Declared licence: Apache-2.0
==============================================================================
--- LICENSE ---
+16 -11
View File
@@ -4,25 +4,30 @@ Edit, validate, synchronize, compare, and convert subtitle files locally in the
browser. Subtitle Tools is an independently versioned application in the
[add·ideas Toolbox](https://git.add-ideas.de/lotobo/toolbox-portal).
## Version 0.1 scope
## Version 0.2 scope
- Bounded SRT, WebVTT, ASS and legacy SSA-compatible dialogue parsing
- Cue timeline, direct text/timestamp editing and configurable diagnostics for
- Bounded SRT, WebVTT, ASS/SSA and flat-profile TTML/DFXP parsing
- Cue timeline, add/duplicate/split/merge/delete operations, direct
text/timestamp editing, cue text transforms and configurable diagnostics for
overlaps, order, duration, reading speed, line count and line length
- Shift and anchor-based stretch operations, negative-time protection and
explicit source/target frame-rate conversion
- SRT, WebVTT and ASS serialization with format-specific preservation where
- Shift and anchor-based stretch operations, negative-time protection,
source/target frame-rate conversion and frame-grid snapping
- SRT, WebVTT, ASS and safe flat TTML serialization with format-specific preservation where
possible and a visible cross-format loss warning
- Deterministic index-aligned revision comparison
- Immediate browser-native audio/video playback plus bounded local waveform peak
extraction and subtitle-start markers
- Immediate browser-native audio/video playback while cancellable, worker-based
waveform peak extraction continues; failed or stale jobs retain the last
valid waveform; the scrollable waveform provides zoom, cue selection,
previous/next navigation and a live playhead
- UTF-8, UTF-16 LE/BE and ISO-8859-1 file decoding
All source, media and generated output stays in the current browser. The app
makes no external request. Validation is configurable editorial guidance, not a
broadcast, accessibility, or legal compliance certificate. Version 0.1 does not
broadcast, accessibility, or legal compliance certificate. Version 0.2 does not
perform speech recognition, automatic alignment, semantic revision matching, or
pixel-perfect ASS rendering.
pixel-perfect ASS rendering. TTML regions, styling definitions and inherited
timing are not laid out; cue-level references are inspected and export is a
flat, resource-free profile.
## Development
@@ -37,7 +42,7 @@ npm run test:browser
## Release
`npm run release:artifact` creates the deterministic
`release/subtitle-tools-0.1.0.zip` and checksum sidecar.
`release/subtitle-tools-0.2.0.zip` and checksum sidecar.
## Licence
+2 -2
View File
@@ -1,7 +1,7 @@
# Corresponding source
The corresponding source for Subtitle Tools 0.1.0 is available at:
The corresponding source for Subtitle Tools 0.2.0 is available at:
https://git.add-ideas.de/lotobo/subtitle-tools/src/tag/v0.1.0
https://git.add-ideas.de/lotobo/subtitle-tools/src/tag/v0.2.0
Build with Node.js 22, npm 11, `npm ci`, and `npm run release:artifact`.
+4 -4
View File
@@ -1,12 +1,12 @@
# Third-party notices
Subtitle Tools 0.1.0 directly depends on these runtime packages:
Subtitle Tools 0.2.0 directly depends on these runtime packages:
| Package | Pinned version | Declared licence |
| -------------------------------- | -------------: | ---------------- |
| `@add-ideas/toolbox-contract` | 0.2.3 | Apache-2.0 |
| `@add-ideas/toolbox-helpers` | 0.1.0 | GPL-3.0-or-later |
| `@add-ideas/toolbox-shell-react` | 0.2.3 | Apache-2.0 |
| `@add-ideas/toolbox-contract` | 0.3.0 | Apache-2.0 |
| `@add-ideas/toolbox-helpers` | 0.2.0 | GPL-3.0-or-later |
| `@add-ideas/toolbox-shell-react` | 0.3.0 | Apache-2.0 |
| `react` | 19.2.8 | MIT |
| `react-dom` | 19.2.8 | MIT |
+1 -1
View File
@@ -1,6 +1,6 @@
# Accessibility
The application uses labelled native controls, keyboard-reachable tabs and cue
The application uses labelled native controls, keyboard-reachable pressed-state workspace buttons and cue
buttons, visible focus indicators, text alternatives for waveform content, and
light, dark and system themes. Colour is not the only carrier for issue level.
The cue and issue views cap rendered rows to keep navigation responsive while
+15 -7
View File
@@ -2,16 +2,24 @@
Subtitle Tools is a relocatable React application with a framework-independent
TypeScript subtitle model. The parser first applies byte/text and line bounds,
then produces one normalized cue model for SRT, WebVTT and ASS. Operations return
new documents instead of mutating parser state. Serializers are format-specific;
cross-format export deliberately exposes its preservation boundary.
then produces one normalized cue model for SRT, WebVTT, ASS and a bounded flat
TTML profile. XML document types/entities are rejected; TTML resources,
inherited timing and layout are never resolved. Cue structure/text/timing
operations return new documents instead of mutating parser state. Serializers
are format-specific; cross-format export deliberately exposes its preservation
boundary.
Parsing and timing transformations are synchronous in v0.1 and therefore capped
Parsing and timing transformations are synchronous in v0.2 and therefore capped
at 4,000,000 UTF-16 units, 250,000 units per physical line and 100,000 cues. The
editor renders at most 10,000 cue rows and 2,000 issue rows, while validation and
export still cover the complete bounded document. Revision comparison is
index-aligned and linear rather than an unbounded semantic diff.
The optional waveform component uses browser-native media decoding, keeps at
most 2,000 peak buckets and accepts no more than 128 MiB or four decoded hours.
It does not run a codec, speech-recognition model or network service.
The optional waveform component creates a browser-native playback URL as soon as
media is selected. Decoding continues independently and transfers one PCM
channel to a disposable module worker, which produces at most 2,000 peak
buckets. Replacement and cancellation terminate the worker, suppress stale
results and retain the last valid waveform. Zoom/navigation changes only the
bounded peak view and native playback position. Inputs remain capped at 128 MiB
and four decoded hours; no codec, speech-recognition model or network service
runs.
+6 -3
View File
@@ -6,9 +6,12 @@ other network destination exists. The production policy uses
`connect-src 'self'`; browser tests fail on non-local requests.
Subtitle text is rendered by React as text, not interpreted as HTML. ASS override
codes and WebVTT tags are preserved as inert source. Exports are downloads chosen
by the user. Browser-native media playback and Web Audio decoding inherit browser
codec support and may allocate substantial memory inside the documented bounds.
codes and WebVTT tags are preserved as inert source. TTML import rejects document
types and entity declarations and reads a deliberately flat, bounded profile; it
does not fetch referenced styles, images, fonts or other resources. Exports are
downloads chosen by the user. Browser-native media playback and Web Audio
decoding inherit browser codec support and may allocate substantial memory inside
the documented bounds.
Validation findings are editorial signals. They are not proof of accessibility,
broadcast conformance, synchronization quality or legal compliance. Cross-format
+1 -1
View File
@@ -1,5 +1,5 @@
const CACHE_PREFIX = "subtitle-tools-shell-";
const CACHE_NAME = CACHE_PREFIX + "0.1.0";
const CACHE_NAME = CACHE_PREFIX + "0.2.0";
const CORE = ["./", "./manifest.webmanifest", "./favicon.svg"];
self.addEventListener("install", (event) => {
event.waitUntil(
+24 -3
View File
@@ -3,12 +3,12 @@
"schemaVersion": 1,
"id": "de.add-ideas.subtitle-tools",
"name": "Subtitle Tools",
"version": "0.1.0",
"description": "Edit, validate, synchronize, compare, and convert subtitles locally.",
"version": "0.2.0",
"description": "Edit, navigate, synchronize and convert subtitles locally.",
"entry": "./",
"icon": "./favicon.svg",
"categories": ["media", "text", "productivity"],
"tags": ["subtitles", "captions", "srt", "webvtt", "ass", "timing"],
"tags": ["subtitles", "captions", "srt", "webvtt", "ass", "ttml", "timing"],
"integration": {
"contextVersion": 1,
"launchModes": ["navigate", "new-tab"],
@@ -21,6 +21,27 @@
"crossOriginIsolated": false,
"topLevelContext": false
},
"io": {
"accepts": [
{ "mediaType": "text/plain", "extensions": [".srt", ".ass", ".ssa"] },
{ "mediaType": "text/vtt", "extensions": [".vtt"] },
{
"mediaType": "application/ttml+xml",
"extensions": [".ttml", ".dfxp", ".xml"]
},
{ "mediaType": "audio/*", "extensions": [] },
{ "mediaType": "video/*", "extensions": [] }
],
"produces": [
{ "mediaType": "text/plain", "extensions": [".srt", ".ass"] },
{ "mediaType": "text/vtt", "extensions": [".vtt"] },
{ "mediaType": "application/ttml+xml", "extensions": [".ttml"] }
]
},
"capabilities": {
"required": [],
"optional": ["workers", "web-audio", "media-playback"]
},
"privacy": {
"processing": "local",
"fileUploads": true,