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 All notable changes to av-tools are documented here. The project follows
semantic versioning once a first release is legally publishable. 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 ## 0.2.1 — 2026-07-27
- Move the canonical source, manifest schema links, and package registry from - 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 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. 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 status:** 0.3.0 is licensed GPL-3.0-or-later. Its canonical
> release consists of the exact reviewed `v0.2.1` source, production > release consists of the exact reviewed `v0.3.0` source, production
> ZIP/checksum and Corresponding Source bundle published together. See > ZIP/checksum and Corresponding Source bundle published together. See
> [Licensing](#licensing). > [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 - **Edit:** a media bin and sequential non-overlapping clip timeline with
non-destructive settings, one export at a time. 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, fast/accurate trim, split, compatible/normalized concatenate, reorder, crop,
resize, frame-rate change, audio extraction/stream removal, waveform, resize, frame-rate change, audio extraction/stream removal, waveform,
peak/two-pass loudness normalization, gain, audio/video fades, metadata, peak/two-pass loudness normalization, gain, audio/video fades, metadata,

View File

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

View File

@@ -1,6 +1,6 @@
# Third-party notices # 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 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 inputs. It is informational, not legal advice, and does not replace their
terms. Files under `LICENSES/` reproduce available terms. A packaged ZIP also 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. encoders and filters; a preset is disabled with missing components listed.
Browser playback is a separate capability checked with MIME/media APIs. 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 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 preparation and pass the checksum/probe verifier. That proves fixture

View File

@@ -1,6 +1,6 @@
# Known limitations # 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. FFmpeg output does not remove these product/browser/resource limits.
## Functional ## Functional
@@ -82,7 +82,7 @@ FFmpeg output does not remove these product/browser/resource limits.
verification against the live container. verification against the live container.
- The application is GPL-3.0-or-later and its native legal files and pinned - 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 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. together; development-only smoke artifacts must not be distributed.
- Chromium covers a broad real pinned-core ST operation matrix, a real MT - 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 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: third-party source identities. Before any distribution:
1. commit the reviewed GPL-3.0-or-later source; 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; 3. push the commit and tag to the canonical public repository;
4. assemble, review and publish corresponding source and exact external 4. assemble, review and publish corresponding source and exact external
notices for both reviewed core profiles and linked libraries; 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: Pass `--force` only to replace the exact same-version ZIP and sidecar. Output:
```text ```text
release/av-tools-0.2.1.zip release/av-tools-0.3.0.zip
release/av-tools-0.2.1.zip.sha256 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
release/ffmpeg-core-0.12.10-reviewed-stack5m.1-corresponding-source.tar.xz.sha256 release/ffmpeg-core-0.12.10-reviewed-stack5m.1-corresponding-source.tar.xz.sha256
``` ```
@@ -68,7 +68,7 @@ Verify independently:
```sh ```sh
node scripts/checksum-release.mjs node scripts/checksum-release.mjs
(cd release && sha256sum -c ffmpeg-core-0.12.10-reviewed-stack5m.1-corresponding-source.tar.xz.sha256) (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 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 ```sh
npm run portal:smoke -- \ npm run portal:smoke -- \
--artifact release/av-tools-0.2.1.zip \ --artifact release/av-tools-0.3.0.zip \
--portal-root ../toolbox-portal --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 ## 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 the sidecar, assemble that exact ZIP through Portal, and publish the immutable
ZIP, `.zip.sha256`, manifest, changelog, Corresponding Source and notices. Put ZIP, `.zip.sha256`, manifest, changelog, Corresponding Source and notices. Put
its exact lowercase digest/version/id/target in a reviewed Portal lock. Never 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", "name": "av-tools",
"version": "0.2.1", "version": "0.3.0",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "av-tools", "name": "av-tools",
"version": "0.2.1", "version": "0.3.0",
"license": "GPL-3.0-or-later", "license": "GPL-3.0-or-later",
"dependencies": { "dependencies": {
"@add-ideas/toolbox-contract": "0.2.3", "@add-ideas/toolbox-contract": "0.2.3",

View File

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

View File

@@ -3,7 +3,7 @@
"schemaVersion": 1, "schemaVersion": 1,
"id": "de.add-ideas.av-tools", "id": "de.add-ideas.av-tools",
"name": "Audio & Video 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.", "description": "Convert and lightly edit audio and video locally in the browser.",
"entry": "./", "entry": "./",
"icon": "./favicon.svg", "icon": "./favicon.svg",

View File

@@ -3,7 +3,7 @@
"schemaVersion": 1, "schemaVersion": 1,
"id": "de.add-ideas.av-tools", "id": "de.add-ideas.av-tools",
"name": "Audio & Video 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.", "description": "Convert and lightly edit audio and video locally in the browser.",
"entry": "./", "entry": "./",
"icon": "./favicon.svg", "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_WRAPPER_VERSION = '0.12.15';
export const FFMPEG_UTIL_VERSION = '0.12.2'; export const FFMPEG_UTIL_VERSION = '0.12.2';
export const FFMPEG_CORE_VERSION = '0.12.10'; export const FFMPEG_CORE_VERSION = '0.12.10';

View File

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