Skip to content

Commit 2f1dd25

Browse files
committed
fix: refresh SABR demand idle timestamp
1 parent 91d0197 commit 2f1dd25

2 files changed

Lines changed: 18 additions & 0 deletions

File tree

‎server-playback/src/main/kotlin/dev/typetype/server/services/SabrSegmentDemandTracker.kt‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ fun SabrSessionHolder.requestSegmentDemand(
105105
generation: Long = activeGeneration(),
106106
registeredAtMs: Long = System.currentTimeMillis(),
107107
): Unit = synchronized(this) {
108+
touch()
108109
val state = playbackState()
109110
if (generation == activeGeneration() && state != SabrPlaybackState.TERMINAL && state != SabrPlaybackState.NETWORK_FAILED) {
110111
SabrSegmentDemandTracker.request(this, request, registeredAtMs)

‎server-playback/src/test/kotlin/dev/typetype/server/services/SabrSegmentDemandResolutionTest.kt‎

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import io.mockk.verify
66
import org.junit.jupiter.api.Assertions.assertArrayEquals
77
import org.junit.jupiter.api.Assertions.assertEquals
88
import org.junit.jupiter.api.Assertions.assertNull
9+
import org.junit.jupiter.api.Assertions.assertTrue
910
import org.junit.jupiter.api.Test
1011
import dev.typetype.server.sabr.SabrMediaHeader
1112
import dev.typetype.server.sabr.SabrMediaSegment
@@ -17,6 +18,20 @@ import dev.typetype.server.sabr.YoutubeSabrStreamState
1718
import java.time.Instant
1819

1920
class SabrSegmentCacheTest {
21+
@Test
22+
fun `segment demand refreshes session idle timestamp`() {
23+
val audio = format(140, isAudio = true)
24+
val video = format(137, isAudio = false)
25+
val holder = holder(audio, video)
26+
val stale = holder.lastRequestAt
27+
val request = SabrSegmentRequest.media(audio, 1)
28+
29+
holder.requestSegmentDemand(request)
30+
31+
assertTrue(holder.lastRequestAt.isAfter(stale))
32+
SabrSegmentDemandTracker.clearAll()
33+
}
34+
2035
@Test
2136
fun `vod cache observes media without copying segment bytes`() {
2237
val segmentCache = SabrSegmentCache()
@@ -57,6 +72,8 @@ class SabrSegmentCacheTest {
5772
val session = mockk<YoutubeSabrSession>()
5873
val state = mockk<YoutubeSabrStreamState>()
5974
every { session.streamState } returns state
75+
every { session.getCachedSegment(any()) } returns null
76+
every { session.isBeyondEnd(any()) } returns false
6077
every { state.setActiveTrackTypes(any(), any()) } returns Unit
6178
return SabrSessionHolder(
6279
session = session,

0 commit comments

Comments
 (0)