From 78468167ca52cfe767d95be190b2957f9a82f941 Mon Sep 17 00:00:00 2001 From: Antoine POPINEAU Date: Tue, 22 Oct 2019 21:56:33 +0200 Subject: [PATCH] Fixed crash on coverless albums. --- .../apognu/otter/activities/MainActivity.kt | 4 +-- .../apognu/otter/adapters/AlbumsAdapter.kt | 6 ++--- .../otter/adapters/AlbumsGridAdapter.kt | 5 ++-- .../apognu/otter/adapters/ArtistsAdapter.kt | 6 ++--- .../apognu/otter/adapters/FavoritesAdapter.kt | 2 +- .../otter/adapters/PlaylistTracksAdapter.kt | 2 +- .../apognu/otter/adapters/TracksAdapter.kt | 3 +-- .../apognu/otter/fragments/AlbumsFragment.kt | 6 ++--- .../otter/fragments/PlaylistTracksFragment.kt | 2 +- .../apognu/otter/fragments/TracksFragment.kt | 2 +- .../otter/playback/MediaControlsManager.kt | 7 +++++- .../apognu/otter/playback/QueueManager.kt | 8 +++--- .../otter/repositories/FavoritesRepository.kt | 4 +-- .../apognu/otter/repositories/HttpUpstream.kt | 4 +-- .../com/github/apognu/otter/utils/Data.kt | 6 ++--- .../github/apognu/otter/utils/Extensions.kt | 9 +++++++ .../com/github/apognu/otter/utils/Util.kt | 13 +++++++++- publish.sh | 25 +++++++++++++++++++ 18 files changed, 81 insertions(+), 33 deletions(-) create mode 100755 publish.sh diff --git a/app/src/main/java/com/github/apognu/otter/activities/MainActivity.kt b/app/src/main/java/com/github/apognu/otter/activities/MainActivity.kt index 3c66ee4..e97d4f6 100644 --- a/app/src/main/java/com/github/apognu/otter/activities/MainActivity.kt +++ b/app/src/main/java/com/github/apognu/otter/activities/MainActivity.kt @@ -224,13 +224,13 @@ class MainActivity : AppCompatActivity() { now_playing_details_progress.progress = 0 Picasso.get() - .load(normalizeUrl(track.album.cover.original)) + .maybeLoad(maybeNormalizeUrl(track.album.cover.original)) .fit() .centerCrop() .into(now_playing_cover) Picasso.get() - .load(normalizeUrl(track.album.cover.original)) + .maybeLoad(maybeNormalizeUrl(track.album.cover.original)) .fit() .centerCrop() .into(now_playing_details_cover) diff --git a/app/src/main/java/com/github/apognu/otter/adapters/AlbumsAdapter.kt b/app/src/main/java/com/github/apognu/otter/adapters/AlbumsAdapter.kt index c852736..884f844 100644 --- a/app/src/main/java/com/github/apognu/otter/adapters/AlbumsAdapter.kt +++ b/app/src/main/java/com/github/apognu/otter/adapters/AlbumsAdapter.kt @@ -8,7 +8,8 @@ import androidx.recyclerview.widget.RecyclerView import com.github.apognu.otter.R import com.github.apognu.otter.fragments.FunkwhaleAdapter import com.github.apognu.otter.utils.Album -import com.github.apognu.otter.utils.normalizeUrl +import com.github.apognu.otter.utils.maybeLoad +import com.github.apognu.otter.utils.maybeNormalizeUrl import com.squareup.picasso.Picasso import jp.wasabeef.picasso.transformations.RoundedCornersTransformation import kotlinx.android.synthetic.main.row_album.view.* @@ -33,9 +34,8 @@ class AlbumsAdapter(val context: Context?, val listener: OnAlbumClickListener) : val album = data[position] Picasso.get() - .load(normalizeUrl(album.cover.original)) + .maybeLoad(maybeNormalizeUrl(album.cover.original)) .fit() - .placeholder(R.drawable.cover) .transform(RoundedCornersTransformation(16, 0)) .into(holder.art) diff --git a/app/src/main/java/com/github/apognu/otter/adapters/AlbumsGridAdapter.kt b/app/src/main/java/com/github/apognu/otter/adapters/AlbumsGridAdapter.kt index 3c5b08b..bea6da0 100644 --- a/app/src/main/java/com/github/apognu/otter/adapters/AlbumsGridAdapter.kt +++ b/app/src/main/java/com/github/apognu/otter/adapters/AlbumsGridAdapter.kt @@ -8,7 +8,8 @@ import androidx.recyclerview.widget.RecyclerView import com.github.apognu.otter.R import com.github.apognu.otter.fragments.FunkwhaleAdapter import com.github.apognu.otter.utils.Album -import com.github.apognu.otter.utils.normalizeUrl +import com.github.apognu.otter.utils.maybeLoad +import com.github.apognu.otter.utils.maybeNormalizeUrl import com.squareup.picasso.Picasso import jp.wasabeef.picasso.transformations.RoundedCornersTransformation import kotlinx.android.synthetic.main.row_album_grid.view.* @@ -32,7 +33,7 @@ class AlbumsGridAdapter(val context: Context?, private val listener: OnAlbumClic val album = data[position] Picasso.get() - .load(normalizeUrl(album.cover.original)) + .maybeLoad(maybeNormalizeUrl(album.cover.original)) .fit() .placeholder(R.drawable.cover) .transform(RoundedCornersTransformation(24, 0)) diff --git a/app/src/main/java/com/github/apognu/otter/adapters/ArtistsAdapter.kt b/app/src/main/java/com/github/apognu/otter/adapters/ArtistsAdapter.kt index b532c15..ee1e599 100644 --- a/app/src/main/java/com/github/apognu/otter/adapters/ArtistsAdapter.kt +++ b/app/src/main/java/com/github/apognu/otter/adapters/ArtistsAdapter.kt @@ -8,7 +8,8 @@ import androidx.recyclerview.widget.RecyclerView import com.github.apognu.otter.R import com.github.apognu.otter.fragments.FunkwhaleAdapter import com.github.apognu.otter.utils.Artist -import com.github.apognu.otter.utils.normalizeUrl +import com.github.apognu.otter.utils.maybeLoad +import com.github.apognu.otter.utils.maybeNormalizeUrl import com.squareup.picasso.Picasso import jp.wasabeef.picasso.transformations.RoundedCornersTransformation import kotlinx.android.synthetic.main.row_artist.view.* @@ -36,9 +37,8 @@ class ArtistsAdapter(val context: Context?, private val listener: OnArtistClickL artist.albums?.let { albums -> if (albums.isNotEmpty()) { Picasso.get() - .load(normalizeUrl(albums[0].cover.original)) + .maybeLoad(maybeNormalizeUrl(albums[0].cover.original)) .fit() - .placeholder(R.drawable.cover) .transform(RoundedCornersTransformation(16, 0)) .into(holder.art) } diff --git a/app/src/main/java/com/github/apognu/otter/adapters/FavoritesAdapter.kt b/app/src/main/java/com/github/apognu/otter/adapters/FavoritesAdapter.kt index a82b3b1..308e641 100644 --- a/app/src/main/java/com/github/apognu/otter/adapters/FavoritesAdapter.kt +++ b/app/src/main/java/com/github/apognu/otter/adapters/FavoritesAdapter.kt @@ -44,7 +44,7 @@ class FavoritesAdapter(private val context: Context?, private val favoriteListen val favorite = data[position] Picasso.get() - .load(normalizeUrl(favorite.track.album.cover.original)) + .maybeLoad(maybeNormalizeUrl(favorite.track.album.cover.original)) .fit() .placeholder(R.drawable.cover) .transform(RoundedCornersTransformation(16, 0)) diff --git a/app/src/main/java/com/github/apognu/otter/adapters/PlaylistTracksAdapter.kt b/app/src/main/java/com/github/apognu/otter/adapters/PlaylistTracksAdapter.kt index 58437a2..4837794 100644 --- a/app/src/main/java/com/github/apognu/otter/adapters/PlaylistTracksAdapter.kt +++ b/app/src/main/java/com/github/apognu/otter/adapters/PlaylistTracksAdapter.kt @@ -56,7 +56,7 @@ class PlaylistTracksAdapter(private val context: Context?, private val favoriteL val track = data[position] Picasso.get() - .load(normalizeUrl(track.track.album.cover.original)) + .maybeLoad(maybeNormalizeUrl(track.track.album.cover.original)) .fit() .placeholder(R.drawable.cover) .transform(RoundedCornersTransformation(16, 0)) diff --git a/app/src/main/java/com/github/apognu/otter/adapters/TracksAdapter.kt b/app/src/main/java/com/github/apognu/otter/adapters/TracksAdapter.kt index ef23f89..2d61c0d 100644 --- a/app/src/main/java/com/github/apognu/otter/adapters/TracksAdapter.kt +++ b/app/src/main/java/com/github/apognu/otter/adapters/TracksAdapter.kt @@ -56,9 +56,8 @@ class TracksAdapter(private val context: Context?, private val favoriteListener: val track = data[position] Picasso.get() - .load(normalizeUrl(track.album.cover.original)) + .maybeLoad(maybeNormalizeUrl(track.album.cover.original)) .fit() - .placeholder(R.drawable.cover) .transform(RoundedCornersTransformation(16, 0)) .into(holder.cover) diff --git a/app/src/main/java/com/github/apognu/otter/fragments/AlbumsFragment.kt b/app/src/main/java/com/github/apognu/otter/fragments/AlbumsFragment.kt index df8675f..b40511a 100644 --- a/app/src/main/java/com/github/apognu/otter/fragments/AlbumsFragment.kt +++ b/app/src/main/java/com/github/apognu/otter/fragments/AlbumsFragment.kt @@ -11,9 +11,7 @@ import com.github.apognu.otter.R import com.github.apognu.otter.activities.MainActivity import com.github.apognu.otter.adapters.AlbumsAdapter import com.github.apognu.otter.repositories.AlbumsRepository -import com.github.apognu.otter.utils.Album -import com.github.apognu.otter.utils.AppContext -import com.github.apognu.otter.utils.Artist +import com.github.apognu.otter.utils.* import com.squareup.picasso.Picasso import kotlinx.android.synthetic.main.fragment_albums.* @@ -54,7 +52,7 @@ class AlbumsFragment : FunkwhaleFragment() { super.onViewCreated(view, savedInstanceState) Picasso.get() - .load(artistArt) + .maybeLoad(maybeNormalizeUrl(artistArt)) .noFade() .fit() .centerCrop() diff --git a/app/src/main/java/com/github/apognu/otter/fragments/PlaylistTracksFragment.kt b/app/src/main/java/com/github/apognu/otter/fragments/PlaylistTracksFragment.kt index 4260f1a..df9d4ed 100644 --- a/app/src/main/java/com/github/apognu/otter/fragments/PlaylistTracksFragment.kt +++ b/app/src/main/java/com/github/apognu/otter/fragments/PlaylistTracksFragment.kt @@ -100,7 +100,7 @@ class PlaylistTracksFragment : FunkwhaleFragment() { super.onViewCreated(view, savedInstanceState) Picasso.get() - .load(albumCover) + .maybeLoad(maybeNormalizeUrl(albumCover)) .noFade() .fit() .centerCrop() diff --git a/app/src/main/java/com/github/apognu/otter/playback/MediaControlsManager.kt b/app/src/main/java/com/github/apognu/otter/playback/MediaControlsManager.kt index b840ba6..380cae5 100644 --- a/app/src/main/java/com/github/apognu/otter/playback/MediaControlsManager.kt +++ b/app/src/main/java/com/github/apognu/otter/playback/MediaControlsManager.kt @@ -60,7 +60,12 @@ class MediaControlsManager(val context: Service, private val mediaSession: Media .setShowActionsInCompactView(0, 1, 2) ) .setSmallIcon(R.drawable.ottericon) - .setLargeIcon(Picasso.get().load(normalizeUrl(track.album.cover.original)).get()) + .run { + val url = maybeNormalizeUrl(track.album.cover.original) + + if (url != null) setLargeIcon(Picasso.get().load(url).get()) + else this + } .setContentTitle(track.title) .setContentText(track.artist.name) .setContentIntent(openPendingIntent) diff --git a/app/src/main/java/com/github/apognu/otter/playback/QueueManager.kt b/app/src/main/java/com/github/apognu/otter/playback/QueueManager.kt index 0d9d59e..3d3e590 100644 --- a/app/src/main/java/com/github/apognu/otter/playback/QueueManager.kt +++ b/app/src/main/java/com/github/apognu/otter/playback/QueueManager.kt @@ -37,7 +37,7 @@ class QueueManager(val context: Context) { val factory = factory() datasources.addMediaSources(metadata.map { track -> - val url = normalizeUrl(track.bestUpload()?.listen_url ?: "") + val url = mustNormalizeUrl(track.bestUpload()?.listen_url ?: "") ProgressiveMediaSource.Factory(factory).setTag(track.title).createMediaSource(Uri.parse(url)) }) @@ -73,7 +73,7 @@ class QueueManager(val context: Context) { val factory = factory() val sources = tracks.map { track -> - val url = normalizeUrl(track.bestUpload()?.listen_url ?: "") + val url = mustNormalizeUrl(track.bestUpload()?.listen_url ?: "") ProgressiveMediaSource.Factory(factory).setTag(track.title).createMediaSource(Uri.parse(url)) } @@ -92,7 +92,7 @@ class QueueManager(val context: Context) { val tracks = tracks.filter { metadata.indexOf(it) == -1 } val sources = tracks.map { track -> - val url = normalizeUrl(track.bestUpload()?.listen_url ?: "") + val url = mustNormalizeUrl(track.bestUpload()?.listen_url ?: "") ProgressiveMediaSource.Factory(factory).createMediaSource(Uri.parse(url)) } @@ -107,7 +107,7 @@ class QueueManager(val context: Context) { fun insertNext(track: Track) { val factory = factory() - val url = normalizeUrl(track.bestUpload()?.listen_url ?: "") + val url = mustNormalizeUrl(track.bestUpload()?.listen_url ?: "") if (metadata.indexOf(track) == -1) { ProgressiveMediaSource.Factory(factory).createMediaSource(Uri.parse(url)).let { diff --git a/app/src/main/java/com/github/apognu/otter/repositories/FavoritesRepository.kt b/app/src/main/java/com/github/apognu/otter/repositories/FavoritesRepository.kt index 8cf7d29..b5ae2fd 100644 --- a/app/src/main/java/com/github/apognu/otter/repositories/FavoritesRepository.kt +++ b/app/src/main/java/com/github/apognu/otter/repositories/FavoritesRepository.kt @@ -31,7 +31,7 @@ class FavoritesRepository(override val context: Context?) : Repository>(private val behavior: Beha val token = PowerPreference.getFileByName(AppContext.PREFS_CREDENTIALS).getString("access_token") val (_, response, result) = Fuel - .get(normalizeUrl(url)) + .get(mustNormalizeUrl(url)) .header("Authorization", "Bearer $token") .awaitObjectResponseResult(GenericDeserializer(type)) @@ -94,7 +94,7 @@ class HttpUpstream>(private val behavior: Beha val token = PowerPreference.getFileByName(AppContext.PREFS_CREDENTIALS).getString("access_token") Fuel - .get(normalizeUrl(url)) + .get(mustNormalizeUrl(url)) .header("Authorization", "Bearer $token") .awaitObjectResult(GenericDeserializer(type)) } else { diff --git a/app/src/main/java/com/github/apognu/otter/utils/Data.kt b/app/src/main/java/com/github/apognu/otter/utils/Data.kt index 0082d82..08805b0 100644 --- a/app/src/main/java/com/github/apognu/otter/utils/Data.kt +++ b/app/src/main/java/com/github/apognu/otter/utils/Data.kt @@ -23,7 +23,7 @@ object HTTP { "password" to PowerPreference.getFileByName(AppContext.PREFS_CREDENTIALS).getString("password") ).toList() - val result = Fuel.post(normalizeUrl("/api/v1/token"), body).awaitObjectResult(gsonDeserializerOf(FwCredentials::class.java)) + val result = Fuel.post(mustNormalizeUrl("/api/v1/token"), body).awaitObjectResult(gsonDeserializerOf(FwCredentials::class.java)) return result.fold( { data -> @@ -39,7 +39,7 @@ object HTTP { val token = PowerPreference.getFileByName(AppContext.PREFS_CREDENTIALS).getString("access_token") val (_, response, result) = Fuel - .get(normalizeUrl(url)) + .get(mustNormalizeUrl(url)) .header("Authorization", "Bearer $token") .awaitObjectResponseResult(gsonDeserializerOf(T::class.java)) @@ -55,7 +55,7 @@ object HTTP { val token = PowerPreference.getFileByName(AppContext.PREFS_CREDENTIALS).getString("access_token") Fuel - .get(normalizeUrl(url)) + .get(mustNormalizeUrl(url)) .header("Authorization", "Bearer $token") .awaitObjectResult(gsonDeserializerOf(T::class.java)) } else { diff --git a/app/src/main/java/com/github/apognu/otter/utils/Extensions.kt b/app/src/main/java/com/github/apognu/otter/utils/Extensions.kt index 29ae82f..1ddb2ed 100644 --- a/app/src/main/java/com/github/apognu/otter/utils/Extensions.kt +++ b/app/src/main/java/com/github/apognu/otter/utils/Extensions.kt @@ -1,11 +1,15 @@ package com.github.apognu.otter.utils +import android.annotation.SuppressLint import android.content.Context import android.os.Build import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment +import com.github.apognu.otter.R import com.github.apognu.otter.fragments.BrowseFragment import com.github.apognu.otter.repositories.Repository +import com.squareup.picasso.Picasso +import com.squareup.picasso.RequestCreator import kotlinx.coroutines.Dispatchers.Main import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.channels.Channel @@ -73,4 +77,9 @@ fun T.applyOnApi(api: Int, block: T.() -> T): T { } else { this } +} + +fun Picasso.maybeLoad(url: String?): RequestCreator { + if (url == null) return load(R.drawable.cover) + else return load(url) } \ No newline at end of file diff --git a/app/src/main/java/com/github/apognu/otter/utils/Util.kt b/app/src/main/java/com/github/apognu/otter/utils/Util.kt index 57e12a8..2dca96c 100644 --- a/app/src/main/java/com/github/apognu/otter/utils/Util.kt +++ b/app/src/main/java/com/github/apognu/otter/utils/Util.kt @@ -16,7 +16,18 @@ fun Any.log(message: String) { Log.d("FUNKWHALE", "${this.javaClass.simpleName}: $message") } -fun normalizeUrl(url: String): String { +fun maybeNormalizeUrl(url: String?): String? { + if (url == null || url.isEmpty()) return null + + val fallbackHost = PowerPreference.getFileByName(AppContext.PREFS_CREDENTIALS).getString("hostname") + val uri = URI(url).takeIf { it.host != null } ?: URI("$fallbackHost$url") + + return uri.run { + URI("https", host, path, query, null) + }.toString() +} + +fun mustNormalizeUrl(url: String): String { val fallbackHost = PowerPreference.getFileByName(AppContext.PREFS_CREDENTIALS).getString("hostname") val uri = URI(url).takeIf { it.host != null } ?: URI("$fallbackHost$url") diff --git a/publish.sh b/publish.sh new file mode 100755 index 0000000..92d8f8b --- /dev/null +++ b/publish.sh @@ -0,0 +1,25 @@ +#!/bin/sh + +if [ $# -ne 2 ]; then + echo 'Usage: ./publish.sh ' >&2 + exit 1 +fi + +if [ "$(git diff --stat)" != '' ]; then + echo 'ERROR: repository is dirty.' >&2 + exit 1 +fi + +TAG="$1" +MESSAGE="$2" + +if [ "$(git tag -l | grep $TAG)" != '' ]; then + echo "ERROR: tag $TAG already exists." >&2 + exit 1 +fi + +git tag -a -m "$MESSAGE" "$TAG" +git push --tags + +./gradlew publish +