From 2b2ee5bbfca65de4519e0cce4cca9500350043ad Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Mon, 3 Jun 2024 17:18:38 -0400 Subject: [PATCH] Avoids using Video Cache for live streams. --- .../service/playback/PlaybackService.kt | 39 +++++++++---------- 1 file changed, 18 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/playback/PlaybackService.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/playback/PlaybackService.kt index fa1ce012a..82167f0ad 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/playback/PlaybackService.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/playback/PlaybackService.kt @@ -34,41 +34,38 @@ import androidx.media3.session.MediaSession import androidx.media3.session.MediaSessionService import com.vitorpamplona.amethyst.Amethyst import com.vitorpamplona.amethyst.service.HttpClientManager -import okhttp3.OkHttpClient -class WssOrHttpFactory(httpClient: OkHttpClient) : MediaSource.Factory { - @UnstableApi - val http = DefaultMediaSourceFactory(OkHttpDataSource.Factory(httpClient)) +/** + * HLS LiveStreams cannot use cache. + */ +@UnstableApi +class CustomMediaSourceFactory() : MediaSource.Factory { + private var cachingFactory: MediaSource.Factory = + DefaultMediaSourceFactory(Amethyst.instance.videoCache.get(HttpClientManager.getHttpClient())) + private var nonCachingFactory: MediaSource.Factory = + DefaultMediaSourceFactory(OkHttpDataSource.Factory(HttpClientManager.getHttpClient())) - @UnstableApi - val wss = DefaultMediaSourceFactory(WssStreamDataSource.Factory(httpClient)) - - @OptIn(UnstableApi::class) override fun setDrmSessionManagerProvider(drmSessionManagerProvider: DrmSessionManagerProvider): MediaSource.Factory { - http.setDrmSessionManagerProvider(drmSessionManagerProvider) - wss.setDrmSessionManagerProvider(drmSessionManagerProvider) + cachingFactory.setDrmSessionManagerProvider(drmSessionManagerProvider) + nonCachingFactory.setDrmSessionManagerProvider(drmSessionManagerProvider) return this } - @OptIn(UnstableApi::class) override fun setLoadErrorHandlingPolicy(loadErrorHandlingPolicy: LoadErrorHandlingPolicy): MediaSource.Factory { - http.setLoadErrorHandlingPolicy(loadErrorHandlingPolicy) - wss.setLoadErrorHandlingPolicy(loadErrorHandlingPolicy) + cachingFactory.setLoadErrorHandlingPolicy(loadErrorHandlingPolicy) + nonCachingFactory.setLoadErrorHandlingPolicy(loadErrorHandlingPolicy) return this } - @OptIn(UnstableApi::class) override fun getSupportedTypes(): IntArray { - return http.supportedTypes + return nonCachingFactory.supportedTypes } - @OptIn(UnstableApi::class) override fun createMediaSource(mediaItem: MediaItem): MediaSource { - return if (mediaItem.mediaId.startsWith("wss")) { - wss.createMediaSource(mediaItem) - } else { - http.createMediaSource(mediaItem) + if (mediaItem.mediaId.contains(".m3u8", true)) { + return nonCachingFactory.createMediaSource(mediaItem) } + return cachingFactory.createMediaSource(mediaItem) } } @@ -81,7 +78,7 @@ class PlaybackService : MediaSessionService() { fun newAllInOneDataSource(): MediaSource.Factory { // This might be needed for live kit. // return WssOrHttpFactory(HttpClientManager.getHttpClient()) - return DefaultMediaSourceFactory(Amethyst.instance.videoCache.get(HttpClientManager.getHttpClient())) + return CustomMediaSourceFactory() } fun lazyDS(): MultiPlayerPlaybackManager {