image: refactor module

- All old extractor stuff is now a module called coil
- Moved Cover out of the coil module
This commit is contained in:
Alexander Capehart 2024-11-29 09:58:45 -07:00
parent 94a580aaed
commit 1a3fe7c075
No known key found for this signature in database
GPG key ID: 37DBE3621FE9AD47
15 changed files with 18 additions and 84 deletions

View file

@ -16,7 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package org.oxycblt.auxio.image.extractor
package org.oxycblt.auxio.image
import org.oxycblt.auxio.list.sort.Sort
import org.oxycblt.auxio.music.Song

View file

@ -51,9 +51,8 @@ import com.google.android.material.shape.ShapeAppearanceModel
import dagger.hilt.android.AndroidEntryPoint
import javax.inject.Inject
import org.oxycblt.auxio.R
import org.oxycblt.auxio.image.extractor.Cover
import org.oxycblt.auxio.image.extractor.RoundedRectTransformation
import org.oxycblt.auxio.image.extractor.SquareCropTransformation
import org.oxycblt.auxio.image.coil.RoundedRectTransformation
import org.oxycblt.auxio.image.coil.SquareCropTransformation
import org.oxycblt.auxio.music.Album
import org.oxycblt.auxio.music.Artist
import org.oxycblt.auxio.music.Genre

View file

@ -16,7 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package org.oxycblt.auxio.image.extractor
package org.oxycblt.auxio.image.coil
import android.content.Context
import coil3.ImageLoader
@ -31,7 +31,7 @@ import javax.inject.Singleton
@Module
@InstallIn(SingletonComponent::class)
class ExtractorModule {
class CoilModule {
@Singleton
@Provides
fun imageLoader(

View file

@ -16,7 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package org.oxycblt.auxio.image.extractor
package org.oxycblt.auxio.image.coil
import android.content.Context
import android.graphics.Bitmap
@ -43,6 +43,7 @@ import kotlinx.coroutines.withContext
import okio.FileSystem
import okio.buffer
import okio.source
import org.oxycblt.auxio.image.Cover
import org.oxycblt.auxio.image.stack.CoverRetriever
class CoverKeyer @Inject constructor() : Keyer<Cover> {

View file

@ -16,7 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package org.oxycblt.auxio.image.extractor
package org.oxycblt.auxio.image.coil
import coil3.decode.DataSource
import coil3.request.ImageResult

View file

@ -16,7 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package org.oxycblt.auxio.image.extractor
package org.oxycblt.auxio.image.coil
import android.graphics.Bitmap
import android.graphics.Bitmap.createBitmap

View file

@ -16,7 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package org.oxycblt.auxio.image.extractor
package org.oxycblt.auxio.image.coil
import android.graphics.Bitmap
import coil3.size.Size

View file

@ -20,7 +20,7 @@ package org.oxycblt.auxio.image.stack
import java.io.InputStream
import javax.inject.Inject
import org.oxycblt.auxio.image.extractor.Cover
import org.oxycblt.auxio.image.Cover
import org.oxycblt.auxio.image.stack.cache.CoverCache
import org.oxycblt.auxio.image.stack.extractor.CoverExtractor

View file

@ -25,7 +25,7 @@ import javax.inject.Inject
import kotlin.math.min
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import org.oxycblt.auxio.image.extractor.Cover
import org.oxycblt.auxio.image.Cover
interface CoverCache {
suspend fun read(cover: Cover.Single): InputStream?

View file

@ -1,66 +0,0 @@
/*
* Copyright (c) 2024 Auxio Project
* PerceptualHash.kt is part of Auxio.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package org.oxycblt.auxio.image.stack.cache
import android.graphics.Bitmap
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.ColorMatrix
import android.graphics.ColorMatrixColorFilter
import android.graphics.Paint
import java.math.BigInteger
interface PerceptualHash {
fun hash(bitmap: Bitmap): String
}
class PerceptualHashImpl : PerceptualHash {
override fun hash(bitmap: Bitmap): String {
val hashSize = 16
// Step 1: Resize the bitmap to a fixed size
val resizedBitmap = Bitmap.createScaledBitmap(bitmap, hashSize + 1, hashSize, true)
// Step 2: Convert the bitmap to grayscale
val grayBitmap =
Bitmap.createBitmap(resizedBitmap.width, resizedBitmap.height, Bitmap.Config.ARGB_8888)
val canvas = Canvas(grayBitmap)
val paint = Paint()
val colorMatrix = ColorMatrix()
colorMatrix.setSaturation(0f)
val filter = ColorMatrixColorFilter(colorMatrix)
paint.colorFilter = filter
canvas.drawBitmap(resizedBitmap, 0f, 0f, paint)
// Step 3: Compute the difference between adjacent pixels
var hash = BigInteger.valueOf(0)
val one = BigInteger.valueOf(1)
for (y in 0 until hashSize) {
for (x in 0 until hashSize) {
val pixel1 = grayBitmap.getPixel(x, y)
val pixel2 = grayBitmap.getPixel(x + 1, y)
val diff = Color.red(pixel1) - Color.red(pixel2)
if (diff > 0) {
hash = hash.or(one.shl(y * hashSize + x))
}
}
}
return hash.toString(16)
}
}

View file

@ -21,7 +21,7 @@ package org.oxycblt.auxio.image.stack.extractor
import android.net.Uri
import java.io.InputStream
import javax.inject.Inject
import org.oxycblt.auxio.image.extractor.Cover
import org.oxycblt.auxio.image.Cover
interface CoverExtractor {
suspend fun extract(cover: Cover.Single): InputStream?

View file

@ -27,7 +27,7 @@ import java.util.UUID
import kotlin.math.max
import kotlinx.parcelize.IgnoredOnParcel
import kotlinx.parcelize.Parcelize
import org.oxycblt.auxio.image.extractor.Cover
import org.oxycblt.auxio.image.Cover
import org.oxycblt.auxio.list.Item
import org.oxycblt.auxio.music.info.Date
import org.oxycblt.auxio.music.info.Disc

View file

@ -19,7 +19,7 @@
package org.oxycblt.auxio.music.stack.interpret.model
import kotlin.math.min
import org.oxycblt.auxio.image.extractor.Cover
import org.oxycblt.auxio.image.Cover
import org.oxycblt.auxio.list.sort.Sort
import org.oxycblt.auxio.music.Album
import org.oxycblt.auxio.music.Artist

View file

@ -18,7 +18,7 @@
package org.oxycblt.auxio.music.stack.interpret.model
import org.oxycblt.auxio.image.extractor.Cover
import org.oxycblt.auxio.image.Cover
import org.oxycblt.auxio.music.Playlist
import org.oxycblt.auxio.music.info.Name
import org.oxycblt.auxio.music.stack.interpret.linker.LinkedPlaylist

View file

@ -28,8 +28,8 @@ import javax.inject.Inject
import org.oxycblt.auxio.R
import org.oxycblt.auxio.image.BitmapProvider
import org.oxycblt.auxio.image.ImageSettings
import org.oxycblt.auxio.image.extractor.RoundedRectTransformation
import org.oxycblt.auxio.image.extractor.SquareCropTransformation
import org.oxycblt.auxio.image.coil.RoundedRectTransformation
import org.oxycblt.auxio.image.coil.SquareCropTransformation
import org.oxycblt.auxio.music.MusicParent
import org.oxycblt.auxio.music.Song
import org.oxycblt.auxio.playback.state.PlaybackStateManager