From c8382495eaeddacc797eea2b35d6449c6ef34f47 Mon Sep 17 00:00:00 2001 From: Ryan Harg Date: Fri, 13 Aug 2021 14:54:42 +0200 Subject: [PATCH] 74: Add logs for queue management --- .../CacheDataSourceFactoryProvider.kt | 46 +++++++++++++++++ .../funkwhale/ffa/playback/QueueManager.kt | 46 ++--------------- .../java/audio/funkwhale/ffa/utils/Models.kt | 50 ++++++++++++++++--- 3 files changed, 93 insertions(+), 49 deletions(-) create mode 100644 app/src/main/java/audio/funkwhale/ffa/playback/CacheDataSourceFactoryProvider.kt diff --git a/app/src/main/java/audio/funkwhale/ffa/playback/CacheDataSourceFactoryProvider.kt b/app/src/main/java/audio/funkwhale/ffa/playback/CacheDataSourceFactoryProvider.kt new file mode 100644 index 0000000..44478f6 --- /dev/null +++ b/app/src/main/java/audio/funkwhale/ffa/playback/CacheDataSourceFactoryProvider.kt @@ -0,0 +1,46 @@ +package audio.funkwhale.ffa.playback + +import android.content.Context +import audio.funkwhale.ffa.R +import audio.funkwhale.ffa.utils.OAuth +import audio.funkwhale.ffa.utils.Settings +import com.google.android.exoplayer2.upstream.DataSource +import com.google.android.exoplayer2.upstream.DefaultHttpDataSourceFactory +import com.google.android.exoplayer2.upstream.FileDataSource +import com.google.android.exoplayer2.upstream.cache.Cache +import com.google.android.exoplayer2.upstream.cache.CacheDataSource +import com.google.android.exoplayer2.upstream.cache.CacheDataSourceFactory +import com.google.android.exoplayer2.util.Util + +class CacheDataSourceFactoryProvider( + private val oAuth: OAuth, + private val exoCache: Cache, + private val exoDownloadCache: Cache +) { + + fun create(context: Context): CacheDataSourceFactory { + + val playbackCache = + CacheDataSourceFactory(exoCache, createDatasourceFactory(context, oAuth)) + + return CacheDataSourceFactory( + exoDownloadCache, + playbackCache, + FileDataSource.Factory(), + null, + CacheDataSource.FLAG_IGNORE_CACHE_ON_ERROR, + null + ) + } + + private fun createDatasourceFactory(context: Context, oAuth: OAuth): DataSource.Factory { + val http = DefaultHttpDataSourceFactory( + Util.getUserAgent(context, context.getString(R.string.app_name)) + ) + return if (!Settings.isAnonymous()) { + OAuth2DatasourceFactory(context, http, oAuth) + } else { + http + } + } +} \ No newline at end of file diff --git a/app/src/main/java/audio/funkwhale/ffa/playback/QueueManager.kt b/app/src/main/java/audio/funkwhale/ffa/playback/QueueManager.kt index 0707ab8..b48536a 100644 --- a/app/src/main/java/audio/funkwhale/ffa/playback/QueueManager.kt +++ b/app/src/main/java/audio/funkwhale/ffa/playback/QueueManager.kt @@ -2,54 +2,13 @@ package audio.funkwhale.ffa.playback import android.content.Context import android.net.Uri -import audio.funkwhale.ffa.R import audio.funkwhale.ffa.utils.* import com.github.kittinunf.fuel.gson.gsonDeserializerOf import com.google.android.exoplayer2.source.ConcatenatingMediaSource import com.google.android.exoplayer2.source.ProgressiveMediaSource -import com.google.android.exoplayer2.upstream.DataSource -import com.google.android.exoplayer2.upstream.DefaultHttpDataSourceFactory -import com.google.android.exoplayer2.upstream.FileDataSource -import com.google.android.exoplayer2.upstream.cache.CacheDataSource -import com.google.android.exoplayer2.upstream.cache.CacheDataSourceFactory -import com.google.android.exoplayer2.upstream.cache.Cache -import com.google.android.exoplayer2.util.Util import com.google.gson.Gson import org.koin.java.KoinJavaComponent.inject -class CacheDataSourceFactoryProvider( - private val oAuth: OAuth, - private val exoCache: Cache, - private val exoDownloadCache: Cache -) { - - fun create(context: Context): CacheDataSourceFactory { - - val playbackCache = - CacheDataSourceFactory(exoCache, createDatasourceFactory(context, oAuth)) - - return CacheDataSourceFactory( - exoDownloadCache, - playbackCache, - FileDataSource.Factory(), - null, - CacheDataSource.FLAG_IGNORE_CACHE_ON_ERROR, - null - ) - } - - private fun createDatasourceFactory(context: Context, oAuth: OAuth): DataSource.Factory { - val http = DefaultHttpDataSourceFactory( - Util.getUserAgent(context, context.getString(R.string.app_name)) - ) - return if (!Settings.isAnonymous()) { - OAuth2DatasourceFactory(context, http, oAuth) - } else { - http - } - } -} - class QueueManager(val context: Context) { private val cacheDataSourceFactoryProvider: CacheDataSourceFactoryProvider by inject( @@ -89,7 +48,9 @@ class QueueManager(val context: Context) { ) } + fun replace(tracks: List) { + tracks.map { it.formatted }.log("Replacing queue with ${tracks.size} tracks") val factory = cacheDataSourceFactoryProvider.create(context) val sources = tracks.map { track -> val url = mustNormalizeUrl(track.bestUpload()?.listen_url ?: "") @@ -107,6 +68,7 @@ class QueueManager(val context: Context) { } fun append(tracks: List) { + tracks.map { it.formatted }.log("Appending ${tracks.size} tracks") val factory = cacheDataSourceFactoryProvider.create(context) val missingTracks = tracks.filter { metadata.indexOf(it) == -1 } @@ -125,6 +87,7 @@ class QueueManager(val context: Context) { } fun insertNext(track: Track) { + track.let { it.formatted }.log("Next track") val factory = cacheDataSourceFactoryProvider.create(context) val url = mustNormalizeUrl(track.bestUpload()?.listen_url ?: "") @@ -143,6 +106,7 @@ class QueueManager(val context: Context) { } fun remove(track: Track) { + track.formatted.log("Removing track") metadata.indexOf(track).let { if (it < 0) { return diff --git a/app/src/main/java/audio/funkwhale/ffa/utils/Models.kt b/app/src/main/java/audio/funkwhale/ffa/utils/Models.kt index beb23f7..dc6bae9 100644 --- a/app/src/main/java/audio/funkwhale/ffa/utils/Models.kt +++ b/app/src/main/java/audio/funkwhale/ffa/utils/Models.kt @@ -24,35 +24,67 @@ abstract class OtterResponse { abstract fun getData(): List } -data class UserResponse(override val count: Int, override val next: String?, val results: List) : OtterResponse() { +data class UserResponse( + override val count: Int, + override val next: String?, + val results: List +) : OtterResponse() { override fun getData() = results } -data class ArtistsResponse(override val count: Int, override val next: String?, val results: List) : OtterResponse() { +data class ArtistsResponse( + override val count: Int, + override val next: String?, + val results: List +) : OtterResponse() { override fun getData() = results } -data class AlbumsResponse(override val count: Int, override val next: String?, val results: AlbumList) : OtterResponse() { +data class AlbumsResponse( + override val count: Int, + override val next: String?, + val results: AlbumList +) : OtterResponse() { override fun getData() = results } -data class TracksResponse(override val count: Int, override val next: String?, val results: List) : OtterResponse() { +data class TracksResponse( + override val count: Int, + override val next: String?, + val results: List +) : OtterResponse() { override fun getData() = results } -data class FavoritedResponse(override val count: Int, override val next: String?, val results: List) : OtterResponse() { +data class FavoritedResponse( + override val count: Int, + override val next: String?, + val results: List +) : OtterResponse() { override fun getData() = results.map { it.track } } -data class PlaylistsResponse(override val count: Int, override val next: String?, val results: List) : OtterResponse() { +data class PlaylistsResponse( + override val count: Int, + override val next: String?, + val results: List +) : OtterResponse() { override fun getData() = results } -data class PlaylistTracksResponse(override val count: Int, override val next: String?, val results: List) : OtterResponse() { +data class PlaylistTracksResponse( + override val count: Int, + override val next: String?, + val results: List +) : OtterResponse() { override fun getData() = results } -data class RadiosResponse(override val count: Int, override val next: String?, val results: List) : OtterResponse() { +data class RadiosResponse( + override val count: Int, + override val next: String?, + val results: List +) : OtterResponse() { override fun getData() = results } @@ -148,6 +180,8 @@ data class Track( override fun cover() = album?.cover?.urls?.original override fun title() = title override fun subtitle() = artist.name + + val formatted: String get() = "$id $artist ($album): $title" } data class Favorited(val track: Int)