music: disable perceptual cover art keying

Too slow, need to aggressively optimize the music loader before even
THINKING about this, and if anything likely defer it.
This commit is contained in:
Alexander Capehart 2024-06-20 21:25:32 -06:00
parent d27e714ce6
commit 296d9c3ca3
No known key found for this signature in database
GPG key ID: 37DBE3621FE9AD47
4 changed files with 23 additions and 9 deletions

View file

@ -26,6 +26,7 @@ import android.graphics.ColorMatrixColorFilter
import android.graphics.Paint import android.graphics.Paint
import java.math.BigInteger import java.math.BigInteger
@Suppress("UNUSED")
fun Bitmap.dHash(hashSize: Int = 16): String { fun Bitmap.dHash(hashSize: Int = 16): String {
// Step 1: Resize the bitmap to a fixed size // Step 1: Resize the bitmap to a fixed size
val resizedBitmap = Bitmap.createScaledBitmap(this, hashSize + 1, hashSize, true) val resizedBitmap = Bitmap.createScaledBitmap(this, hashSize + 1, hashSize, true)

View file

@ -32,7 +32,7 @@ import org.oxycblt.auxio.music.info.Date
import org.oxycblt.auxio.music.metadata.correctWhitespace import org.oxycblt.auxio.music.metadata.correctWhitespace
import org.oxycblt.auxio.music.metadata.splitEscaped import org.oxycblt.auxio.music.metadata.splitEscaped
@Database(entities = [CachedSong::class], version = 45, exportSchema = false) @Database(entities = [CachedSong::class], version = 46, exportSchema = false)
abstract class CacheDatabase : RoomDatabase() { abstract class CacheDatabase : RoomDatabase() {
abstract fun cachedSongsDao(): CachedSongsDao abstract fun cachedSongsDao(): CachedSongsDao
} }

View file

@ -18,7 +18,6 @@
package org.oxycblt.auxio.music.metadata package org.oxycblt.auxio.music.metadata
import android.graphics.BitmapFactory
import androidx.core.text.isDigitsOnly import androidx.core.text.isDigitsOnly
import androidx.media3.common.MediaItem import androidx.media3.common.MediaItem
import androidx.media3.exoplayer.MetadataRetriever import androidx.media3.exoplayer.MetadataRetriever
@ -26,8 +25,8 @@ import androidx.media3.exoplayer.source.MediaSource
import androidx.media3.exoplayer.source.TrackGroupArray import androidx.media3.exoplayer.source.TrackGroupArray
import java.util.concurrent.Future import java.util.concurrent.Future
import javax.inject.Inject import javax.inject.Inject
import kotlin.math.min
import org.oxycblt.auxio.image.extractor.CoverExtractor import org.oxycblt.auxio.image.extractor.CoverExtractor
import org.oxycblt.auxio.image.extractor.dHash
import org.oxycblt.auxio.music.device.RawSong import org.oxycblt.auxio.music.device.RawSong
import org.oxycblt.auxio.music.fs.toAudioUri import org.oxycblt.auxio.music.fs.toAudioUri
import org.oxycblt.auxio.music.info.Date import org.oxycblt.auxio.music.info.Date
@ -106,10 +105,24 @@ private class TagWorkerImpl(
populateWithId3v2(textTags.id3v2) populateWithId3v2(textTags.id3v2)
populateWithVorbis(textTags.vorbis) populateWithVorbis(textTags.vorbis)
val coverInputStream = coverExtractor.findCoverDataInMetadata(metadata) coverExtractor.findCoverDataInMetadata(metadata)?.use {
val bitmap = coverInputStream?.use { BitmapFactory.decodeStream(it) } val available = it.available()
rawSong.coverPerceptualHash = bitmap?.dHash() val skip = min(available / 2L, available - COVER_KEY_SAMPLE.toLong())
bitmap?.recycle() it.skip(skip)
val bytes = ByteArray(COVER_KEY_SAMPLE)
it.read(bytes)
@OptIn(ExperimentalStdlibApi::class) val byteString = bytes.toHexString()
rawSong.coverPerceptualHash = byteString
}
// OPTIONAL: Nicer cover art keying using an actual perceptual hash
// Really bad idea if you have big cover arts. Okay idea if you have different
// formats for the same cover art.
// val bitmap = coverInputStream?.use { BitmapFactory.decodeStream(it) }
// rawSong.coverPerceptualHash = bitmap?.dHash()
// bitmap?.recycle()
// OPUS base gain interpretation code: This is likely not needed, as the media player // OPUS base gain interpretation code: This is likely not needed, as the media player
// should be using the base gain already. Uncomment if that's not the case. // should be using the base gain already. Uncomment if that's not the case.
@ -376,6 +389,8 @@ private class TagWorkerImpl(
first().replace(REPLAYGAIN_ADJUSTMENT_FILTER_REGEX, "").toFloatOrNull()?.nonZeroOrNull() first().replace(REPLAYGAIN_ADJUSTMENT_FILTER_REGEX, "").toFloatOrNull()?.nonZeroOrNull()
private companion object { private companion object {
val COVER_KEY_SAMPLE = 32
val COMPILATION_ALBUM_ARTISTS = listOf("Various Artists") val COMPILATION_ALBUM_ARTISTS = listOf("Various Artists")
val COMPILATION_RELEASE_TYPES = listOf("compilation") val COMPILATION_RELEASE_TYPES = listOf("compilation")

View file

@ -61,8 +61,6 @@ constructor(
private var invalidator: Invalidator? = null private var invalidator: Invalidator? = null
interface Invalidator { interface Invalidator {
data class ParentId(val id: String, val itemCount: Int)
fun invalidate(ids: Map<String, Int>) fun invalidate(ids: Map<String, Int>)
fun invalidate(controller: ControllerInfo, query: String, itemCount: Int) fun invalidate(controller: ControllerInfo, query: String, itemCount: Int)