chore: prepare av-tools 0.3.0 release

This commit is contained in:
2026-07-27 18:38:20 +02:00
parent f2c0fc12d2
commit 597ea044b6
13 changed files with 49 additions and 32 deletions

View File

@@ -3,6 +3,23 @@
All notable changes to av-tools are documented here. The project follows
semantic versioning once a first release is legally publishable.
## 0.3.0 — 2026-07-27
- Make imported media and browser-native duration/dimensions available without
loading FFmpeg, so recognized files can start playback immediately.
- Move authoritative codec, stream, chapter and tag inspection to explicit or
operation-driven demand; keep playback usable after inspection failure and
expose bounded retry controls.
- Inspect automatically when Quick Convert, preview proxies, timeline renders
or advanced tools require authoritative details, while preserving
deterministic multi-file timeline order.
- Recover Firefox probes with a fresh same-mode core, safe MT-to-ST fallback
and operation reservations that prevent concurrent mounts or preference
changes.
- Add Chromium and Firefox evidence proving the supplied 153 MB, 43-minute
lecture plays before detailed inspection and retains the same media element
afterward.
## 0.2.1 — 2026-07-27
- Move the canonical source, manifest schema links, and package registry from

View File

@@ -8,8 +8,8 @@ telemetry, runtime CDN, remote-media fetch or third-party script.
It is also a Toolbox SDK application. The same static build runs directly or
under Toolbox Portal with shared shell, theme, help and app switching.
> **Release status:** 0.2.1 is licensed GPL-3.0-or-later. Its canonical
> release consists of the exact reviewed `v0.2.1` source, production
> **Release status:** 0.3.0 is licensed GPL-3.0-or-later. Its canonical
> release consists of the exact reviewed `v0.3.0` source, production
> ZIP/checksum and Corresponding Source bundle published together. See
> [Licensing](#licensing).
@@ -23,7 +23,7 @@ Two workflows keep the product intentionally smaller than a nonlinear editor:
- **Edit:** a media bin and sequential non-overlapping clip timeline with
non-destructive settings, one export at a time.
The 0.2 release covers typed/capability-gated conversion and remux,
The 0.3 release covers typed/capability-gated conversion and remux,
fast/accurate trim, split, compatible/normalized concatenate, reorder, crop,
resize, frame-rate change, audio extraction/stream removal, waveform,
peak/two-pass loudness normalization, gain, audio/video fades, metadata,

View File

@@ -1,6 +1,6 @@
# Source and reproducibility record
This file identifies the source corresponding to av-tools 0.2.1. It is not a
This file identifies the source corresponding to av-tools 0.3.0. It is not a
substitute for satisfying a component's licence or for delivering complete
Corresponding Source with an object-code release.
@@ -9,9 +9,9 @@ Corresponding Source with an object-code release.
- Canonical repository:
`git@git.add-ideas.de:lotobo/av-tools.git`
- Browser source: `https://git.add-ideas.de/lotobo/av-tools`
- Version: `0.2.1`
- Release source identity: immutable annotated tag `v0.2.1`
(`refs/tags/v0.2.1`) in the canonical repository.
- Version: `0.3.0`
- Release source identity: immutable annotated tag `v0.3.0`
(`refs/tags/v0.3.0`) in the canonical repository.
- Application licence: `GPL-3.0-or-later`; full GPL version 3 terms in
`LICENSE`.
- Copyright: Copyright © 2026 Albrecht Degering.
@@ -22,10 +22,10 @@ the tag exists, is annotated, points to the reviewed release commit and is
available without authentication:
```sh
test "$(git cat-file -t v0.2.1)" = tag
git rev-parse v0.2.1^{commit}
test "$(git cat-file -t v0.3.0)" = tag
git rev-parse v0.3.0^{commit}
git ls-remote --tags \
https://git.add-ideas.de/lotobo/av-tools.git refs/tags/v0.2.1
https://git.add-ideas.de/lotobo/av-tools.git refs/tags/v0.3.0
```
The Toolbox manifest names the canonical repository and SPDX licence. Publish

View File

@@ -1,6 +1,6 @@
# Third-party notices
av-tools 0.2.1 is Copyright © 2026 Albrecht Degering and licensed
av-tools 0.3.0 is Copyright © 2026 Albrecht Degering and licensed
GPL-3.0-or-later; see the root `LICENSE`. This inventory describes third-party
inputs. It is informational, not legal advice, and does not replace their
terms. Files under `LICENSES/` reproduce available terms. A packaged ZIP also

View File

@@ -5,7 +5,7 @@ extensions or this document. The app queries muxers, demuxers, decoders,
encoders and filters; a preset is disabled with missing components listed.
Browser playback is a separate capability checked with MIME/media APIs.
## 0.2.1 release fixture matrix
## 0.3.0 release fixture matrix
All 15 files are generated and re-probed with native FFmpeg 7.1.3 for test
preparation and pass the checksum/probe verifier. That proves fixture

View File

@@ -1,6 +1,6 @@
# Known limitations
This is the conservative 0.2.1 release baseline. A capability appearing in
This is the conservative 0.3.0 release baseline. A capability appearing in
FFmpeg output does not remove these product/browser/resource limits.
## Functional
@@ -82,7 +82,7 @@ FFmpeg output does not remove these product/browser/resource limits.
verification against the live container.
- The application is GPL-3.0-or-later and its native legal files and pinned
source identities are included in the release record. Publish the production
ZIP/checksum, exact `v0.2.1` source and FFmpeg Corresponding Source bundle
ZIP/checksum, exact `v0.3.0` source and FFmpeg Corresponding Source bundle
together; development-only smoke artifacts must not be distributed.
- Chromium covers a broad real pinned-core ST operation matrix, a real MT
H.264/AAC conversion, MT-to-ST fallback, nested static/Toolbox-context

View File

@@ -11,7 +11,7 @@ The repository already declares the application licence and immutable
third-party source identities. Before any distribution:
1. commit the reviewed GPL-3.0-or-later source;
2. create and verify annotated tag `v0.2.1` at that exact commit;
2. create and verify annotated tag `v0.3.0` at that exact commit;
3. push the commit and tag to the canonical public repository;
4. assemble, review and publish corresponding source and exact external
notices for both reviewed core profiles and linked libraries;
@@ -57,8 +57,8 @@ npm run package:release -- --allow-unlicensed-development-smoke
Pass `--force` only to replace the exact same-version ZIP and sidecar. Output:
```text
release/av-tools-0.2.1.zip
release/av-tools-0.2.1.zip.sha256
release/av-tools-0.3.0.zip
release/av-tools-0.3.0.zip.sha256
release/ffmpeg-core-0.12.10-reviewed-stack5m.1-corresponding-source.tar.xz
release/ffmpeg-core-0.12.10-reviewed-stack5m.1-corresponding-source.tar.xz.sha256
```
@@ -68,7 +68,7 @@ Verify independently:
```sh
node scripts/checksum-release.mjs
(cd release && sha256sum -c ffmpeg-core-0.12.10-reviewed-stack5m.1-corresponding-source.tar.xz.sha256)
unzip -l release/av-tools-0.2.1.zip
unzip -l release/av-tools-0.3.0.zip
tar -tJf release/ffmpeg-core-0.12.10-reviewed-stack5m.1-corresponding-source.tar.xz
```
@@ -96,7 +96,7 @@ exact `HEAD` and clones that revision into a temporary directory:
```sh
npm run portal:smoke -- \
--artifact release/av-tools-0.2.1.zip \
--artifact release/av-tools-0.3.0.zip \
--portal-root ../toolbox-portal
```
@@ -123,7 +123,7 @@ for `v0.6.0` and must not suppress review of new gaps. See
## 5. Publish only reviewed bytes
From a clean `v0.2.1` checkout, rerun all checks, create the ZIP once, verify
From a clean `v0.3.0` checkout, rerun all checks, create the ZIP once, verify
the sidecar, assemble that exact ZIP through Portal, and publish the immutable
ZIP, `.zip.sha256`, manifest, changelog, Corresponding Source and notices. Put
its exact lowercase digest/version/id/target in a reviewed Portal lock. Never

4
package-lock.json generated
View File

@@ -1,12 +1,12 @@
{
"name": "av-tools",
"version": "0.2.1",
"version": "0.3.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "av-tools",
"version": "0.2.1",
"version": "0.3.0",
"license": "GPL-3.0-or-later",
"dependencies": {
"@add-ideas/toolbox-contract": "0.2.3",

View File

@@ -1,7 +1,7 @@
{
"name": "av-tools",
"private": true,
"version": "0.2.1",
"version": "0.3.0",
"description": "Local-first browser audio and video conversion and light editing with ffmpeg.wasm.",
"license": "GPL-3.0-or-later",
"author": "Albrecht Degering",

View File

@@ -3,7 +3,7 @@
"schemaVersion": 1,
"id": "de.add-ideas.av-tools",
"name": "Audio & Video Tools",
"version": "0.2.1",
"version": "0.3.0",
"description": "Convert and lightly edit audio and video locally in the browser.",
"entry": "./",
"icon": "./favicon.svg",

View File

@@ -3,7 +3,7 @@
"schemaVersion": 1,
"id": "de.add-ideas.av-tools",
"name": "Audio & Video Tools",
"version": "0.2.1",
"version": "0.3.0",
"description": "Convert and lightly edit audio and video locally in the browser.",
"entry": "./",
"icon": "./favicon.svg",

View File

@@ -1,4 +1,4 @@
export const APP_VERSION = '0.2.1';
export const APP_VERSION = '0.3.0';
export const FFMPEG_WRAPPER_VERSION = '0.12.15';
export const FFMPEG_UTIL_VERSION = '0.12.2';
export const FFMPEG_CORE_VERSION = '0.12.10';

View File

@@ -165,30 +165,30 @@ describe('licence release gate', () => {
describe('release checksum', () => {
it('formats and parses the portable sidecar form', () => {
const digest = 'a'.repeat(64);
const line = checksumLine(digest, 'av-tools-0.2.1.zip');
expect(line).toBe(`${digest} av-tools-0.2.1.zip\n`);
const line = checksumLine(digest, 'av-tools-0.3.0.zip');
expect(line).toBe(`${digest} av-tools-0.3.0.zip\n`);
expect(parseChecksumLine(line)).toEqual({
archiveName: 'av-tools-0.2.1.zip',
archiveName: 'av-tools-0.3.0.zip',
digest,
});
});
it('writes and verifies a checksum sidecar', async () => {
const directory = await temporaryDirectory();
const archive = path.join(directory, 'av-tools-0.2.1.zip');
const archive = path.join(directory, 'av-tools-0.3.0.zip');
await writeFile(archive, 'deterministic bytes');
const result = await writeChecksum(archive);
expect(await verifyChecksum(archive, result.sidecarPath)).toBe(
result.digest
);
expect(await readFile(result.sidecarPath, 'utf8')).toContain(
' av-tools-0.2.1.zip'
' av-tools-0.3.0.zip'
);
});
it('rejects checksum mismatches', async () => {
const directory = await temporaryDirectory();
const archive = path.join(directory, 'av-tools-0.2.1.zip');
const archive = path.join(directory, 'av-tools-0.3.0.zip');
const sidecar = `${archive}.sha256`;
await writeFile(archive, 'changed');
await mkdir(path.dirname(sidecar), { recursive: true });