Skip to content

Commit

Permalink
refactor: song artwork quality
Browse files Browse the repository at this point in the history
  • Loading branch information
zyrouge committed Nov 6, 2024
1 parent bd84a93 commit 3382d87
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 9 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import io.github.zyrouge.symphony.ui.view.HomePages
import io.github.zyrouge.symphony.ui.view.NowPlayingControlsLayout
import io.github.zyrouge.symphony.ui.view.NowPlayingLyricsLayout
import io.github.zyrouge.symphony.ui.view.home.ForYou
import io.github.zyrouge.symphony.utils.ImagePreserver
import io.github.zyrouge.symphony.utils.StringListUtils
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow
Expand Down Expand Up @@ -269,7 +270,11 @@ class Settings(private val symphony: Symphony) {
putStringSet(key, value.map { it.toString() }.toSet())
}
}
val artworkQuality = IntEntry("artwork_quality", 50)
val artworkQuality = EnumEntry(
"artwork_quality",
enumEntries<ImagePreserver.Quality>(),
ImagePreserver.Quality.Medium,
)

private fun getSharedPreferences() = symphony.applicationContext
.getSharedPreferences("settings", Context.MODE_PRIVATE)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import io.github.zyrouge.metaphony.AudioArtwork
import io.github.zyrouge.metaphony.AudioParser
import io.github.zyrouge.symphony.Symphony
import io.github.zyrouge.symphony.utils.DocumentFileX
import io.github.zyrouge.symphony.utils.ImagePreserver
import io.github.zyrouge.symphony.utils.Logger
import io.github.zyrouge.symphony.utils.SimplePath
import java.io.FileOutputStream
Expand Down Expand Up @@ -121,14 +122,23 @@ data class Song(
val stream = parser.getStreamInfo()
val id = symphony.groove.song.idGenerator.next()
val coverFile = metadata.artworks.firstOrNull()?.let {
when (it.format) {
AudioArtwork.Format.Unknown -> null
else -> {
val name = "$id.${it.format.extension}"
symphony.database.artworkCache.get(name).writeBytes(it.data)
name
}
if (it.format == AudioArtwork.Format.Unknown) {
return@let null
}
val quality = symphony.settings.artworkQuality.value
if (quality.maxSide == null) {
val name = "$id.${it.format.extension}"
symphony.database.artworkCache.get(name).writeBytes(it.data)
return@let name
}
val bitmap = BitmapFactory.decodeByteArray(it.data, 0, it.data.size)
val name = "$id.${AudioArtwork.Format.Jpeg.extension}"
FileOutputStream(symphony.database.artworkCache.get(name)).use { writer ->
ImagePreserver
.resize(bitmap, quality)
.compress(Bitmap.CompressFormat.JPEG, 100, writer)
}
name
}
metadata.lyrics?.let {
symphony.database.lyricsCache.put(id, it)
Expand Down Expand Up @@ -177,9 +187,12 @@ data class Song(
val id = symphony.groove.song.idGenerator.next() + ".mr"
val coverFile = retriever.embeddedPicture?.let {
val bitmap = BitmapFactory.decodeByteArray(it, 0, it.size)
val quality = symphony.settings.artworkQuality.value
val name = "$id.${AudioArtwork.Format.Jpeg.extension}"
FileOutputStream(symphony.database.artworkCache.get(name)).use { writer ->
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, writer)
ImagePreserver
.resize(bitmap, quality)
.compress(Bitmap.CompressFormat.JPEG, 100, writer)
}
name
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package io.github.zyrouge.symphony.utils

import android.graphics.Bitmap
import kotlin.math.max

object ImagePreserver {
enum class Quality(val maxSide: Int?) {
Low(256),
Medium(512),
High(1024),
Loseless(null),
}

fun resize(bitmap: Bitmap, quality: Quality): Bitmap {
if (quality.maxSide == null || max(bitmap.width, bitmap.height) < quality.maxSide) {
return bitmap
}
val (width, height) = calculateDimensions(bitmap.width, bitmap.height, quality.maxSide)
return Bitmap.createScaledBitmap(bitmap, width, height, true)
}

private fun calculateDimensions(width: Int, height: Int, maxSide: Int) = when {
width > height -> maxSide to (height * (maxSide.toFloat() / width)).toInt()
width < height -> (width * (maxSide.toFloat() / height)).toInt() to maxSide
else -> maxSide to maxSide
}
}

0 comments on commit 3382d87

Please sign in to comment.