@@ -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.
|
||||
|
||||
@@ -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
@@ -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
@@ -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`.
|
||||
|
||||
@@ -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,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
|
||||
|
||||
@@ -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,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
@@ -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
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user