From 3c554caf2e7e379adb65114d021972f4ea6783b4 Mon Sep 17 00:00:00 2001 From: tzugen Date: Tue, 8 Jun 2021 13:47:47 +0200 Subject: [PATCH] On disk we are only caching the full-size images. So when modify the key to query for the full size image, because scaling down a larger size image on the device is quicker than requesting the down-sized image from the network. --- .../org/moire/ultrasonic/util/FileUtil.java | 6 +++++- .../imageloader/CoverArtRequestHandler.kt | 17 +++++++++++++---- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/ultrasonic/src/main/java/org/moire/ultrasonic/util/FileUtil.java b/ultrasonic/src/main/java/org/moire/ultrasonic/util/FileUtil.java index 7c227bc8..6bf557db 100644 --- a/ultrasonic/src/main/java/org/moire/ultrasonic/util/FileUtil.java +++ b/ultrasonic/src/main/java/org/moire/ultrasonic/util/FileUtil.java @@ -57,6 +57,8 @@ public class FileUtil private static final List VIDEO_FILE_EXTENSIONS = Arrays.asList("flv", "mp4", "m4v", "wmv", "avi", "mov", "mpg", "mkv"); private static final List PLAYLIST_FILE_EXTENSIONS = Collections.singletonList("m3u"); private static final Pattern TITLE_WITH_TRACK = Pattern.compile("^\\d\\d-.*"); + public static final String SUFFIX_LARGE = ".jpeg"; + public static final String SUFFIX_SMALL = ".jpeg-small"; private static final Lazy permissionUtil = inject(PermissionUtil.class); @@ -141,7 +143,9 @@ public class FileUtil return null; } - return String.format(Locale.ROOT, "%s%b.jpeg", Util.md5Hex(albumDir.getPath()), large); + String suffix = (large) ? SUFFIX_LARGE : SUFFIX_SMALL; + + return String.format(Locale.ROOT, "%s%s", Util.md5Hex(albumDir.getPath()), suffix); } diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/imageloader/CoverArtRequestHandler.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/imageloader/CoverArtRequestHandler.kt index 3152e565..a6aeb048 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/imageloader/CoverArtRequestHandler.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/imageloader/CoverArtRequestHandler.kt @@ -7,6 +7,8 @@ import com.squareup.picasso.RequestHandler import java.io.IOException import okio.Okio import org.moire.ultrasonic.api.subsonic.SubsonicAPIClient +import org.moire.ultrasonic.util.FileUtil.SUFFIX_LARGE +import org.moire.ultrasonic.util.FileUtil.SUFFIX_SMALL /** * Loads cover arts from subsonic api. @@ -25,16 +27,23 @@ class CoverArtRequestHandler(private val apiClient: SubsonicAPIClient) : Request val size = request.uri.getQueryParameter(SIZE)?.toLong() // Check if we have a hit in the disk cache - val cache = BitmapUtils.getAlbumArtBitmapFromDisk(request.stableKey!!, size?.toInt()) + // Note: Currently we are only caching full size images on disk + // So we modify the key to query for the full size image, + // because scaling down a larger size image on the device is quicker than + // requesting the down-sized image from the network. + val key = request.stableKey!!.replace(SUFFIX_SMALL, SUFFIX_LARGE) + val cache = BitmapUtils.getAlbumArtBitmapFromDisk(key, size?.toInt()) if (cache != null) { return Result(cache, DISK) } + // Try to fetch the image from the API val response = apiClient.getCoverArt(id, size) - if (response.hasError() || response.stream == null) { - throw IOException("${response.apiError}") - } else { + if (!response.hasError() && response.stream != null) { return Result(Okio.source(response.stream!!), NETWORK) } + + // Throw an error if still not successful + throw IOException("${response.apiError}") } }