Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 12 additions & 40 deletions RELEASE_NOTES.md
Original file line number Diff line number Diff line change
@@ -1,47 +1,19 @@
# TypeType 1.2.1
# TypeType 1.2.2

TypeType 1.2.1 improves SABR playback stability, especially after seeks and browser lifecycle transitions. This release also includes additional recovery logic for livestreams and several mobile interface improvements.

## Playback

- fix Safari and iOS playback failures after SponsorBlock skips
- prevent delayed lifecycle events from restarting an obsolete MSE playback loop after a seek
- improve repeated, buffered and SponsorBlock seeks without unnecessarily replacing the active playback session
- recover expired SABR sessions automatically
- preserve media and playback state across fullscreen, Picture-in-Picture, orientation and background transitions
- keep the same player instance while complete video metadata finishes loading
- preserve the selected playback speed during temporary player transitions
- update the MSE runtime to [`@typetype/mse@0.1.42`](https://www.npmjs.com/package/@typetype/mse/v/0.1.42)
TypeType 1.2.2 is a hotpatch for YouTube livestreams that could start correctly but then buffer again every few seconds.

## Livestreams

- recover bounded gaps between live SABR sequences
- prevent repeated protected responses without media from buffering indefinitely
- reset the recovery budget when media, playback position or generation progresses
- improve recovery when the live playback window advances
- preserve the active playback session during recoverable live interruptions

## Mobile And PWA

- stabilize the watch layout in mobile landscape mode
- improve recovery after backgrounding, screen-off and orientation changes
- preserve playback through fullscreen and Picture-in-Picture transitions
- make history removal easier to use on touch devices

## Validation

Playback was validated on beta with:
- keep the server-side SABR pump active while a livestream is playing
- maintain a bounded media buffer instead of waiting for a missing segment before requesting more data
- wake the SABR pump immediately when the player needs another segment
- keep audio and video windows aligned when their timestamps differ slightly
- resolve missing live segment durations from the next available segment
- prevent playback from incorrectly jumping over cached live media
- preserve bounded cache eviction during long playback sessions

- Safari and an installed WebKit PWA
- a Chromium-based mobile PWA
- automatic SponsorBlock skips
- repeated forward and backward seeks
- fullscreen and orientation changes
- background, screen-off and foreground recovery
- Picture-in-Picture transitions
- VOD and livestream SABR playback
- multiple fresh videos and playback sessions
## Updating

## Thanks
Follow the [update guide](https://typetype-video.github.io/Docs-TypeType/self-hosting/maintenance).

Thx to @Toastienergy, @BuggyPasta, @jerkiz and @coral-hungus for the Safari, iOS and SponsorBlock reports and testing, and to @hugoghx for the detailed livestream traces.
If necessary, follow the [rollback guide](https://typetype-video.github.io/Docs-TypeType/self-hosting/rollback).
2 changes: 1 addition & 1 deletion TypeType-Server
Submodule TypeType-Server updated 28 files
+1 −1 gradle.properties
+14 −15 src/main/kotlin/dev/typetype/server/routes/SabrPlaybackWindowBuilder.kt
+22 −0 src/main/kotlin/dev/typetype/server/routes/SabrPlaybackWindowSegmentTiming.kt
+13 −1 src/main/kotlin/dev/typetype/server/routes/SabrPlaybackWindowTiming.kt
+46 −0 src/main/kotlin/dev/typetype/server/services/SabrLiveContinuationRequest.kt
+17 −14 src/main/kotlin/dev/typetype/server/services/SabrLivePlayback.kt
+56 −0 src/main/kotlin/dev/typetype/server/services/SabrLivePumpStep.kt
+32 −2 src/main/kotlin/dev/typetype/server/services/SabrLiveWarmupRequest.kt
+14 −2 src/main/kotlin/dev/typetype/server/services/SabrPlaybackCachedSegmentLocator.kt
+42 −0 src/main/kotlin/dev/typetype/server/services/SabrPumpCoordinator.kt
+5 −1 src/main/kotlin/dev/typetype/server/services/SabrPumpLauncher.kt
+18 −0 src/main/kotlin/dev/typetype/server/services/SabrPumpLoopPolicy.kt
+1 −0 src/main/kotlin/dev/typetype/server/services/SabrSegmentCache.kt
+4 −5 src/main/kotlin/dev/typetype/server/services/SabrSessionHolder.kt
+14 −7 src/main/kotlin/dev/typetype/server/services/SabrSessionPump.kt
+12 −19 src/main/kotlin/dev/typetype/server/services/SabrSessionPumpLoop.kt
+42 −0 src/test/kotlin/dev/typetype/server/routes/SabrLiveGapWindowTest.kt
+233 −0 src/test/kotlin/dev/typetype/server/routes/SabrLivePlaybackContinuityProbeTest.kt
+93 −0 src/test/kotlin/dev/typetype/server/routes/SabrLivePlaybackOverlapTest.kt
+67 −4 src/test/kotlin/dev/typetype/server/routes/SabrLivePlaybackWindowBuilderTest.kt
+103 −0 src/test/kotlin/dev/typetype/server/services/SabrLiveContinuationRequestTest.kt
+27 −16 src/test/kotlin/dev/typetype/server/services/SabrLivePlaybackTest.kt
+84 −0 src/test/kotlin/dev/typetype/server/services/SabrLivePumpStepTest.kt
+22 −6 src/test/kotlin/dev/typetype/server/services/SabrLiveSessionWarmupTest.kt
+32 −0 src/test/kotlin/dev/typetype/server/services/SabrPlaybackCachedSegmentLocatorTest.kt
+51 −0 src/test/kotlin/dev/typetype/server/services/SabrPumpCoordinatorTest.kt
+1 −0 src/test/kotlin/dev/typetype/server/services/SabrSegmentCacheTest.kt
+2 −2 src/test/kotlin/dev/typetype/server/services/SabrSessionPumpLoopTest.kt