Avoids using Video Cache for live streams.

This commit is contained in:
Vitor Pamplona
2024-06-03 17:18:38 -04:00
parent 62a6b7b7e0
commit 2b2ee5bbfc

View File

@@ -34,41 +34,38 @@ import androidx.media3.session.MediaSession
import androidx.media3.session.MediaSessionService import androidx.media3.session.MediaSessionService
import com.vitorpamplona.amethyst.Amethyst import com.vitorpamplona.amethyst.Amethyst
import com.vitorpamplona.amethyst.service.HttpClientManager import com.vitorpamplona.amethyst.service.HttpClientManager
import okhttp3.OkHttpClient
class WssOrHttpFactory(httpClient: OkHttpClient) : MediaSource.Factory { /**
@UnstableApi * HLS LiveStreams cannot use cache.
val http = DefaultMediaSourceFactory(OkHttpDataSource.Factory(httpClient)) */
@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 { override fun setDrmSessionManagerProvider(drmSessionManagerProvider: DrmSessionManagerProvider): MediaSource.Factory {
http.setDrmSessionManagerProvider(drmSessionManagerProvider) cachingFactory.setDrmSessionManagerProvider(drmSessionManagerProvider)
wss.setDrmSessionManagerProvider(drmSessionManagerProvider) nonCachingFactory.setDrmSessionManagerProvider(drmSessionManagerProvider)
return this return this
} }
@OptIn(UnstableApi::class)
override fun setLoadErrorHandlingPolicy(loadErrorHandlingPolicy: LoadErrorHandlingPolicy): MediaSource.Factory { override fun setLoadErrorHandlingPolicy(loadErrorHandlingPolicy: LoadErrorHandlingPolicy): MediaSource.Factory {
http.setLoadErrorHandlingPolicy(loadErrorHandlingPolicy) cachingFactory.setLoadErrorHandlingPolicy(loadErrorHandlingPolicy)
wss.setLoadErrorHandlingPolicy(loadErrorHandlingPolicy) nonCachingFactory.setLoadErrorHandlingPolicy(loadErrorHandlingPolicy)
return this return this
} }
@OptIn(UnstableApi::class)
override fun getSupportedTypes(): IntArray { override fun getSupportedTypes(): IntArray {
return http.supportedTypes return nonCachingFactory.supportedTypes
} }
@OptIn(UnstableApi::class)
override fun createMediaSource(mediaItem: MediaItem): MediaSource { override fun createMediaSource(mediaItem: MediaItem): MediaSource {
return if (mediaItem.mediaId.startsWith("wss")) { if (mediaItem.mediaId.contains(".m3u8", true)) {
wss.createMediaSource(mediaItem) return nonCachingFactory.createMediaSource(mediaItem)
} else {
http.createMediaSource(mediaItem)
} }
return cachingFactory.createMediaSource(mediaItem)
} }
} }
@@ -81,7 +78,7 @@ class PlaybackService : MediaSessionService() {
fun newAllInOneDataSource(): MediaSource.Factory { fun newAllInOneDataSource(): MediaSource.Factory {
// This might be needed for live kit. // This might be needed for live kit.
// return WssOrHttpFactory(HttpClientManager.getHttpClient()) // return WssOrHttpFactory(HttpClientManager.getHttpClient())
return DefaultMediaSourceFactory(Amethyst.instance.videoCache.get(HttpClientManager.getHttpClient())) return CustomMediaSourceFactory()
} }
fun lazyDS(): MultiPlayerPlaybackManager { fun lazyDS(): MultiPlayerPlaybackManager {