Skip to content

Commit 56ffc7c

Browse files
chore(release): prep 4.4.0 — first-frame subtitle by language preference (#73)
New LoadOptions.preferredSubtitleLanguages lets the engine activate the first subtitle track whose language matches an ordered preference at the end of a successful load, mirroring the audio twin (preferredAudioLanguages, #72). No match leaves subtitles off; the host-overlay path is used, the resolved track is published via the new activeSubtitleTrackIndex, and the side demuxer is anchored at the resume position. Additive and default-empty: a behavioral no-op until a host opts in. The audio half of #73 already shipped in 4.3.0. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01B4hBXf5yHPUNxQsDavBKGk
1 parent 92a3bc6 commit 56ffc7c

2 files changed

Lines changed: 11 additions & 3 deletions

File tree

CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,14 @@ the public-API contract.
1010

1111
## [Unreleased]
1212

13+
## [4.4.0] — 2026-06-26
14+
15+
### Added
16+
17+
- **First-frame subtitle selection by language preference (#73).** A host with a saved subtitle-language preference had to read the post-load `subtitleTracks` and language-match `selectSubtitleTrack` itself. New `LoadOptions.preferredSubtitleLanguages` (ordered; ISO 639-1 / 639-2 codes or English names, e.g. `["en", "de"]`; default empty) lets the engine activate the first subtitle track whose language matches a preference (preferences scanned in order, case-insensitive, ISO 639-1/2 B+T and English-name synonyms) at the end of a successful load, mirroring the audio twin (`preferredAudioLanguages`, #72). No match leaves subtitles off (the default). The host-overlay path is used (equivalent to a `selectSubtitleTrack` call), the resolved track is published via the new `activeSubtitleTrackIndex` (parity with `activeAudioTrackIndex` so a picker reflects it), and the side demuxer is anchored at the resume position (clamped to the probe duration) instead of byte 0. Unlike `preferredAudioLanguages` (whose track is muxed into the loopback HLS at the first frame, so a late pick forces a pre-probe or reload), this is pure convenience: subtitles are activated post-load by a side demuxer at no reload or pre-probe cost, so it only spares a host from language-matching `subtitleTracks` itself. Independent of `prepareNativeSubtitles`, whose default selection stays host-driven via `setNativeSubtitleSelected`. Empty preferences is a behavioral no-op, so nothing changes until a host opts in. The audio half of #73 already shipped in 4.3.0. Thanks to reckloon for the request.
18+
19+
([release notes](https://github.com/superuser404notfound/AetherEngine/releases/tag/4.4.0))
20+
1321
## [4.3.0] — 2026-06-26
1422

1523
### Added

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ Subtitle cues land in raw source PTS; render the overlay against `player.sourceT
152152
Install via Swift Package Manager:
153153

154154
```swift
155-
.package(url: "https://github.com/superuser404notfound/AetherEngine", from: "4.3.0")
155+
.package(url: "https://github.com/superuser404notfound/AetherEngine", from: "4.4.0")
156156
```
157157

158158
Two complementary samples ship in `Examples/`:
@@ -275,10 +275,10 @@ Browse all of this as a searchable site at **[aetherengine.superuser404.de](http
275275
AetherEngine uses [Semantic Versioning](https://semver.org). The public API surface — every `public` declaration in `Sources/AetherEngine/` — is the stability contract. **Major** removes / renames public symbols or breaks adopters; **Minor** adds public API or codec / format support; **Patch** fixes bugs with no public API change. `internal` types are not part of the contract.
276276

277277
```swift
278-
.package(url: "https://github.com/superuser404notfound/AetherEngine", from: "4.3.0")
278+
.package(url: "https://github.com/superuser404notfound/AetherEngine", from: "4.4.0")
279279
```
280280

281-
Pin to `.upToNextMinor(from: "4.3.0")` for stricter teams that prefer to opt into minor bumps explicitly.
281+
Pin to `.upToNextMinor(from: "4.4.0")` for stricter teams that prefer to opt into minor bumps explicitly.
282282

283283
## Requirements
284284

0 commit comments

Comments
 (0)