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.

This commit is contained in:
Karim Abou Zeid 2015-08-15 14:48:49 +02:00
commit 3e8e34a95c
4 changed files with 106 additions and 14 deletions

View file

@ -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<Image> images = artistInfo.getArtist().getImage();
return super.getStream(images.get(images.size() - 1).getText(), extra);
return super.getStream(LastFMUtil.getLargestArtistImageUrl(artistInfo.getArtist().getImage()), extra);
}
@Nullable

View file

@ -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<Image> 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;

View file

@ -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);
}
}

View file

@ -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<Image> images) {
Map<ImageSize, String> 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<com.kabouzeid.gramophone.lastfm.rest.model.albuminfo.Image> images) {
Map<ImageSize, String> 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<ImageSize, String> 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;
}
}