Получите все из ExoPlayer Cache
Используя https://google.github.io/ExoPlayer/doc/reference/com/google/android/exoplayer2/upstream/cache/CacheDataSourceFactory.html есть ли способ получить все кэшированные медиаресурсы?
2 ответа
Cache не предлагает удобного API для получения всех полностью кэшированных URI или аналогичных.
Если вы создаете свой собственный CacheEvictor (например, оборачивая LeastRecentlyUsedCacheEvictor), вы можете вести свою собственную бухгалтерию, когда диапазоны добавляются или удаляются, а затем делегировать LRUCacheEvictor. Таким образом, вы можете поддерживать список кэшированных URL-адресов.
Вы можете проверить, какие части для данного URI кэшируются:
// create the data spec of a given media file
Uri uri = Uri.parse("http://cool.stuff.com/song-123.mp3")
DataSpec dataSpec = new DataSpec(uri);
// get information about what is cached for the given data spec
CacheUtil.CachingCounters counters = new CacheUtil.CachingCounters();
CacheUtil.getCached(dataSpec, cache, counters);
if (counters.contentLength == counters.totalCachedBytes()) {
// all bytes cached
} else if (counters.totalCachedBytes() == 0){
// not cached at all
} else {
// partially cached
}
Если данные для данного URI кэшированы только частично, вы можете проверить, какие диапазоны доступны следующим образом:
NavigableSet<CacheSpan> cachedSpans =
cache.getCachedSpans(CacheUtil.generateKey(uri));
CacheUtil больше не существует, https://github.com/google/ExoPlayer/blob/2a88f0fb295ff5b56e6fbcbe7e91bdf922cbae13/RELEASENOTES.md#2120-2020-09-11
есть еще один способ проверить кешируемое содержимое:
import com.google.android.exoplayer2.upstream.DataSpec
import com.google.android.exoplayer2.upstream.cache.CacheDataSource
import com.google.android.exoplayer2.upstream.cache.ContentMetadata
import com.google.android.exoplayer2.upstream.cache.Cache
/* the same instance, used in player build pipeline */
lateinit var cacheDataSourceFactory: CacheDataSource.Factory
/* usually this is SimpleCache instance, also used in player build pipeline */
lateinit var cacheImpl: Cache
fun isCompletelyCached(urL :String) :Boolean {
val uri = Uri.parse(urL)
// factory which is used to generate "content key" for uri.
// content keys are not always equal to urL
// in complex cases the factory may be different from default implementation
val cacheKeyFactory = cacheDataSourceFactory.cacheKeyFactory
// content key used to retrieve metadata for cache entry
val contentKey = cacheKeyFactory.buildCacheKey(DataSpec(uri))
val contentMetadata = cache.getContentMetadata(contentKey)
val contentLength = ContentMetadata.getContentLength(contentMetadata)
if(contentLength < 0){
// this happens when player has never queried this urL over network
// or has no info about size of the source
return false
}
// this is summary for all cache spans, cached by exoplayer, which belongs to given urL.
// each span is a chunk of content, which may be randomly downloaded
val cachedLength = cache.getCachedBytes(contentKey, 0L, contentLength)
return contentLength == cachedLength
}