chore: prepare av-tools 0.3.0 release
This commit is contained in:
17
CHANGELOG.md
17
CHANGELOG.md
@@ -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
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
14
SOURCE.md
14
SOURCE.md
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
4
package-lock.json
generated
@@ -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",
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
@@ -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';
|
||||||
|
|||||||
@@ -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 });
|
||||||
|
|||||||
Reference in New Issue
Block a user