From 3e8e34a95c708014e2c3a762abefa2242cae8676 Mon Sep 17 00:00:00 2001 From: Karim Abou Zeid Date: Sat, 15 Aug 2015 14:48:49 +0200 Subject: [PATCH] Fixed low res artist and album images from last.fm due to a slight api change from them. New implementation should be safe upon future api changes like this. --- .../PhonographImageDownloader.java | 6 +- .../tageditor/AlbumTagEditorActivity.java | 27 +++++-- .../kabouzeid/gramophone/util/ImageUtil.java | 6 +- .../kabouzeid/gramophone/util/LastFMUtil.java | 81 +++++++++++++++++++ 4 files changed, 106 insertions(+), 14 deletions(-) create mode 100644 app/src/main/java/com/kabouzeid/gramophone/util/LastFMUtil.java diff --git a/app/src/main/java/com/kabouzeid/gramophone/imageloader/PhonographImageDownloader.java b/app/src/main/java/com/kabouzeid/gramophone/imageloader/PhonographImageDownloader.java index f9c81864..ef616b74 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/imageloader/PhonographImageDownloader.java +++ b/app/src/main/java/com/kabouzeid/gramophone/imageloader/PhonographImageDownloader.java @@ -7,10 +7,10 @@ import android.support.annotation.Nullable; import com.kabouzeid.gramophone.lastfm.rest.LastFMRestClient; import com.kabouzeid.gramophone.lastfm.rest.model.artistinfo.ArtistInfo; -import com.kabouzeid.gramophone.lastfm.rest.model.artistinfo.Image; import com.kabouzeid.gramophone.loader.AlbumSongLoader; import com.kabouzeid.gramophone.model.Song; import com.kabouzeid.gramophone.util.ImageUtil; +import com.kabouzeid.gramophone.util.LastFMUtil; import com.kabouzeid.gramophone.util.MusicUtil; import com.kabouzeid.gramophone.util.PreferenceUtil; import com.nostra13.universalimageloader.core.download.BaseImageDownloader; @@ -22,7 +22,6 @@ import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; -import java.util.List; import java.util.Locale; /** @@ -64,8 +63,7 @@ public class PhonographImageDownloader extends BaseImageDownloader { } ArtistInfo artistInfo = lastFMRestClient.getApiService().getArtistInfo(artistName, data[0].equals("") ? null : data[0]); - List images = artistInfo.getArtist().getImage(); - return super.getStream(images.get(images.size() - 1).getText(), extra); + return super.getStream(LastFMUtil.getLargestArtistImageUrl(artistInfo.getArtist().getImage()), extra); } @Nullable diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/tageditor/AlbumTagEditorActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/tageditor/AlbumTagEditorActivity.java index 65c907b9..37d9eb16 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/tageditor/AlbumTagEditorActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/tageditor/AlbumTagEditorActivity.java @@ -1,6 +1,7 @@ package com.kabouzeid.gramophone.ui.activities.tageditor; import android.graphics.Bitmap; +import android.graphics.Point; import android.net.Uri; import android.os.Bundle; import android.support.annotation.NonNull; @@ -14,14 +15,18 @@ import android.widget.Toast; import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.lastfm.rest.LastFMRestClient; import com.kabouzeid.gramophone.lastfm.rest.model.albuminfo.AlbumInfo; -import com.kabouzeid.gramophone.lastfm.rest.model.albuminfo.Image; import com.kabouzeid.gramophone.loader.AlbumSongLoader; import com.kabouzeid.gramophone.model.Song; +import com.kabouzeid.gramophone.util.ImageUtil; +import com.kabouzeid.gramophone.util.LastFMUtil; import com.kabouzeid.gramophone.util.MusicUtil; +import com.kabouzeid.gramophone.util.Util; +import com.nostra13.universalimageloader.core.DisplayImageOptions; import com.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.assist.FailReason; import com.nostra13.universalimageloader.core.assist.ImageSize; import com.nostra13.universalimageloader.core.listener.SimpleImageLoadingListener; +import com.nostra13.universalimageloader.core.process.BitmapProcessor; import org.jaudiotagger.tag.FieldKey; import org.jaudiotagger.tag.images.Artwork; @@ -102,10 +107,18 @@ public class AlbumTagEditorActivity extends AbsTagEditorActivity implements Text @Override public void success(@NonNull AlbumInfo albumInfo, Response response) { if (albumInfo.getAlbum() != null) { - List images = albumInfo.getAlbum().getImage(); - int lastIndexOfImages = images.size() - 1; - ImageLoader.getInstance().loadImage(images.get(lastIndexOfImages).getText(), - new ImageSize(500, 500), + Point size = Util.getScreenSize(AlbumTagEditorActivity.this); + final int screenWidth = Math.min(size.x, size.y); + ImageLoader.getInstance().loadImage(LastFMUtil.getLargestAlbumImageUrl(albumInfo.getAlbum().getImage()), + new DisplayImageOptions.Builder() + .preProcessor(new BitmapProcessor() { + @Override + public Bitmap process(Bitmap bitmap) { + //noinspection SuspiciousNameCombination + return ImageUtil.getResizedBitmap(bitmap, screenWidth, screenWidth, true); + } + }) + .build(), new SimpleImageLoadingListener() { @Override public void onLoadingFailed(String imageUri, View view, FailReason failReason) { @@ -114,6 +127,10 @@ public class AlbumTagEditorActivity extends AbsTagEditorActivity implements Text @Override public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { + if (loadedImage == null) { + onLoadingFailed(imageUri, view, null); + return; + } albumArtBitmap = loadedImage; setImageBitmap(albumArtBitmap); deleteAlbumArt = false; diff --git a/app/src/main/java/com/kabouzeid/gramophone/util/ImageUtil.java b/app/src/main/java/com/kabouzeid/gramophone/util/ImageUtil.java index dc769e83..a35a1a74 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/util/ImageUtil.java +++ b/app/src/main/java/com/kabouzeid/gramophone/util/ImageUtil.java @@ -7,8 +7,6 @@ import android.graphics.Matrix; import android.graphics.Point; import android.support.annotation.NonNull; import android.support.annotation.Nullable; -import android.view.Display; -import android.view.WindowManager; import org.jaudiotagger.audio.AudioFile; import org.jaudiotagger.audio.AudioFileIO; @@ -93,9 +91,7 @@ public class ImageUtil { } private static int getSmallerScreenSize(@NonNull Context c) { - Display display = ((WindowManager) c.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); - Point size = new Point(); - display.getSize(size); + Point size = Util.getScreenSize(c); return Math.min(size.x, size.y); } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/util/LastFMUtil.java b/app/src/main/java/com/kabouzeid/gramophone/util/LastFMUtil.java new file mode 100644 index 00000000..9290324a --- /dev/null +++ b/app/src/main/java/com/kabouzeid/gramophone/util/LastFMUtil.java @@ -0,0 +1,81 @@ +package com.kabouzeid.gramophone.util; + +import com.kabouzeid.gramophone.lastfm.rest.model.artistinfo.Image; + +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; + +/** + * @author Karim Abou Zeid (kabouzeid) + */ +public class LastFMUtil { + public enum ImageSize { + SMALL, MEDIUM, LARGE, EXTRALARGE, MEGA, UNKNOWN + } + + public static String getLargestArtistImageUrl(List images) { + Map imageUrls = new HashMap<>(); + for (Image image : images) { + ImageSize size = null; + final String attribute = image.getSize(); + if (attribute == null) { + size = ImageSize.UNKNOWN; + } else { + try { + size = ImageSize.valueOf(attribute.toUpperCase(Locale.ENGLISH)); + } catch (final IllegalArgumentException e) { + // if they suddenly again introduce a new image size + } + } + if (size != null) { + imageUrls.put(size, image.getText()); + } + } + return getLargestImageUrl(imageUrls); + } + + public static String getLargestAlbumImageUrl(List images) { + Map imageUrls = new HashMap<>(); + for (com.kabouzeid.gramophone.lastfm.rest.model.albuminfo.Image image : images) { + ImageSize size = null; + final String attribute = image.getSize(); + if (attribute == null) { + size = ImageSize.UNKNOWN; + } else { + try { + size = ImageSize.valueOf(attribute.toUpperCase(Locale.ENGLISH)); + } catch (final IllegalArgumentException e) { + // if they suddenly again introduce a new image size + } + } + if (size != null) { + imageUrls.put(size, image.getText()); + } + } + return getLargestImageUrl(imageUrls); + } + + private static String getLargestImageUrl(Map imageUrls) { + if (imageUrls.containsKey(ImageSize.MEGA)) { + return imageUrls.get(ImageSize.MEGA); + } + if (imageUrls.containsKey(ImageSize.EXTRALARGE)) { + return imageUrls.get(ImageSize.EXTRALARGE); + } + if (imageUrls.containsKey(ImageSize.LARGE)) { + return imageUrls.get(ImageSize.LARGE); + } + if (imageUrls.containsKey(ImageSize.MEDIUM)) { + return imageUrls.get(ImageSize.MEDIUM); + } + if (imageUrls.containsKey(ImageSize.SMALL)) { + return imageUrls.get(ImageSize.SMALL); + } + if (imageUrls.containsKey(ImageSize.UNKNOWN)) { + return imageUrls.get(ImageSize.UNKNOWN); + } + return null; + } +}