|
|
@ -2,6 +2,7 @@ package com.github.apognu.otter.playback |
|
|
|
|
|
|
|
|
|
|
|
import android.content.Context |
|
|
|
import android.content.Context |
|
|
|
import android.net.Uri |
|
|
|
import android.net.Uri |
|
|
|
|
|
|
|
import com.github.apognu.otter.Otter |
|
|
|
import com.github.apognu.otter.R |
|
|
|
import com.github.apognu.otter.R |
|
|
|
import com.github.apognu.otter.utils.* |
|
|
|
import com.github.apognu.otter.utils.* |
|
|
|
import com.github.kittinunf.fuel.gson.gsonDeserializerOf |
|
|
|
import com.github.kittinunf.fuel.gson.gsonDeserializerOf |
|
|
@ -9,31 +10,34 @@ import com.google.android.exoplayer2.source.ConcatenatingMediaSource |
|
|
|
import com.google.android.exoplayer2.source.ProgressiveMediaSource |
|
|
|
import com.google.android.exoplayer2.source.ProgressiveMediaSource |
|
|
|
import com.google.android.exoplayer2.upstream.DefaultHttpDataSourceFactory |
|
|
|
import com.google.android.exoplayer2.upstream.DefaultHttpDataSourceFactory |
|
|
|
import com.google.android.exoplayer2.upstream.cache.CacheDataSourceFactory |
|
|
|
import com.google.android.exoplayer2.upstream.cache.CacheDataSourceFactory |
|
|
|
import com.google.android.exoplayer2.upstream.cache.LeastRecentlyUsedCacheEvictor |
|
|
|
|
|
|
|
import com.google.android.exoplayer2.upstream.cache.SimpleCache |
|
|
|
|
|
|
|
import com.google.android.exoplayer2.util.Util |
|
|
|
import com.google.android.exoplayer2.util.Util |
|
|
|
import com.google.gson.Gson |
|
|
|
import com.google.gson.Gson |
|
|
|
import com.preference.PowerPreference |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class QueueManager(val context: Context) { |
|
|
|
class QueueManager(val context: Context) { |
|
|
|
var cache: SimpleCache |
|
|
|
|
|
|
|
var metadata: MutableList<Track> = mutableListOf() |
|
|
|
var metadata: MutableList<Track> = mutableListOf() |
|
|
|
val datasources = ConcatenatingMediaSource() |
|
|
|
val datasources = ConcatenatingMediaSource() |
|
|
|
var current = -1 |
|
|
|
var current = -1 |
|
|
|
|
|
|
|
|
|
|
|
init { |
|
|
|
companion object { |
|
|
|
PowerPreference.getDefaultFile().getInt("media_cache_size", 1).toLong().also { |
|
|
|
fun factory(context: Context): CacheDataSourceFactory { |
|
|
|
cache = SimpleCache( |
|
|
|
val http = DefaultHttpDataSourceFactory(Util.getUserAgent(context, context.getString(R.string.app_name))).apply { |
|
|
|
context.cacheDir.resolve("media"), |
|
|
|
defaultRequestProperties.apply { |
|
|
|
LeastRecentlyUsedCacheEvictor(it * 1024 * 1024 * 1024) |
|
|
|
if (!Settings.isAnonymous()) { |
|
|
|
) |
|
|
|
set("Authorization", "Bearer ${Settings.getAccessToken()}") |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return CacheDataSourceFactory(Otter.get().exoCache, http) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
init { |
|
|
|
Cache.get(context, "queue")?.let { json -> |
|
|
|
Cache.get(context, "queue")?.let { json -> |
|
|
|
gsonDeserializerOf(QueueCache::class.java).deserialize(json)?.let { cache -> |
|
|
|
gsonDeserializerOf(QueueCache::class.java).deserialize(json)?.let { cache -> |
|
|
|
metadata = cache.data.toMutableList() |
|
|
|
metadata = cache.data.toMutableList() |
|
|
|
|
|
|
|
|
|
|
|
val factory = factory() |
|
|
|
val factory = factory(context) |
|
|
|
|
|
|
|
|
|
|
|
datasources.addMediaSources(metadata.map { track -> |
|
|
|
datasources.addMediaSources(metadata.map { track -> |
|
|
|
val url = mustNormalizeUrl(track.bestUpload()?.listen_url ?: "") |
|
|
|
val url = mustNormalizeUrl(track.bestUpload()?.listen_url ?: "") |
|
|
@ -56,20 +60,8 @@ class QueueManager(val context: Context) { |
|
|
|
) |
|
|
|
) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private fun factory(): CacheDataSourceFactory { |
|
|
|
|
|
|
|
val http = DefaultHttpDataSourceFactory(Util.getUserAgent(context, context.getString(R.string.app_name))).apply { |
|
|
|
|
|
|
|
defaultRequestProperties.apply { |
|
|
|
|
|
|
|
if (!Settings.isAnonymous()) { |
|
|
|
|
|
|
|
set("Authorization", "Bearer ${Settings.getAccessToken()}") |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return CacheDataSourceFactory(cache, http) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
fun replace(tracks: List<Track>) { |
|
|
|
fun replace(tracks: List<Track>) { |
|
|
|
val factory = factory() |
|
|
|
val factory = factory(context) |
|
|
|
|
|
|
|
|
|
|
|
val sources = tracks.map { track -> |
|
|
|
val sources = tracks.map { track -> |
|
|
|
val url = mustNormalizeUrl(track.bestUpload()?.listen_url ?: "") |
|
|
|
val url = mustNormalizeUrl(track.bestUpload()?.listen_url ?: "") |
|
|
@ -87,7 +79,7 @@ class QueueManager(val context: Context) { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
fun append(tracks: List<Track>) { |
|
|
|
fun append(tracks: List<Track>) { |
|
|
|
val factory = factory() |
|
|
|
val factory = factory(context) |
|
|
|
val missingTracks = tracks.filter { metadata.indexOf(it) == -1 } |
|
|
|
val missingTracks = tracks.filter { metadata.indexOf(it) == -1 } |
|
|
|
|
|
|
|
|
|
|
|
val sources = missingTracks.map { track -> |
|
|
|
val sources = missingTracks.map { track -> |
|
|
@ -105,7 +97,7 @@ class QueueManager(val context: Context) { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
fun insertNext(track: Track) { |
|
|
|
fun insertNext(track: Track) { |
|
|
|
val factory = factory() |
|
|
|
val factory = factory(context) |
|
|
|
val url = mustNormalizeUrl(track.bestUpload()?.listen_url ?: "") |
|
|
|
val url = mustNormalizeUrl(track.bestUpload()?.listen_url ?: "") |
|
|
|
|
|
|
|
|
|
|
|
if (metadata.indexOf(track) == -1) { |
|
|
|
if (metadata.indexOf(track) == -1) { |
|
|
|