2024-03-11 17:21:28 +08:00
|
|
|
package com.cappielloantonio.tempo.util
|
|
|
|
|
|
|
|
|
|
import android.net.Uri
|
|
|
|
|
import android.util.Log
|
|
|
|
|
import androidx.media3.common.C
|
|
|
|
|
import androidx.media3.common.util.UnstableApi
|
|
|
|
|
import androidx.media3.datasource.DataSource
|
|
|
|
|
import androidx.media3.datasource.DataSpec
|
|
|
|
|
import androidx.media3.datasource.TransferListener
|
|
|
|
|
import androidx.media3.datasource.cache.CacheDataSource
|
|
|
|
|
import androidx.media3.datasource.cache.ContentMetadata
|
|
|
|
|
|
|
|
|
|
@UnstableApi
|
|
|
|
|
class StreamingCacheDataSource private constructor(
|
|
|
|
|
private val cacheDataSource: CacheDataSource,
|
|
|
|
|
): DataSource {
|
|
|
|
|
private val TAG = "StreamingCacheDataSource"
|
|
|
|
|
|
|
|
|
|
private var currentDataSpec: DataSpec? = null
|
|
|
|
|
|
|
|
|
|
class Factory(private val cacheDatasourceFactory: CacheDataSource.Factory): DataSource.Factory {
|
|
|
|
|
override fun createDataSource(): DataSource {
|
|
|
|
|
return StreamingCacheDataSource(cacheDatasourceFactory.createDataSource())
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
override fun read(buffer: ByteArray, offset: Int, length: Int): Int {
|
|
|
|
|
return cacheDataSource.read(buffer, offset, length)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
override fun addTransferListener(transferListener: TransferListener) {
|
|
|
|
|
return cacheDataSource.addTransferListener(transferListener)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
override fun open(dataSpec: DataSpec): Long {
|
|
|
|
|
val ret = cacheDataSource.open(dataSpec)
|
|
|
|
|
currentDataSpec = dataSpec
|
|
|
|
|
return ret
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
override fun getUri(): Uri? {
|
|
|
|
|
return cacheDataSource.uri
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
override fun close() {
|
|
|
|
|
cacheDataSource.close()
|
2024-05-25 17:55:30 +02:00
|
|
|
|
2024-03-11 17:21:28 +08:00
|
|
|
val dataSpec = currentDataSpec
|
2024-05-25 17:55:30 +02:00
|
|
|
|
2024-03-11 17:21:28 +08:00
|
|
|
if (dataSpec != null) {
|
|
|
|
|
val cacheKey = cacheDataSource.cacheKeyFactory.buildCacheKey(dataSpec)
|
|
|
|
|
val contentLength = ContentMetadata.getContentLength(cacheDataSource.cache.getContentMetadata(cacheKey));
|
2024-05-25 17:55:30 +02:00
|
|
|
|
2024-03-11 17:21:28 +08:00
|
|
|
if (contentLength == C.LENGTH_UNSET.toLong()) {
|
|
|
|
|
Log.d(TAG, "Removing partial cache for $cacheKey")
|
|
|
|
|
cacheDataSource.cache.removeResource(cacheKey)
|
|
|
|
|
} else {
|
|
|
|
|
Log.d(TAG, "Key $cacheKey has been fully cached")
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|