diff --git a/app/src/main/java/org/oxycblt/auxio/image/extractor/Cover.kt b/app/src/main/java/org/oxycblt/auxio/image/Cover.kt
similarity index 97%
rename from app/src/main/java/org/oxycblt/auxio/image/extractor/Cover.kt
rename to app/src/main/java/org/oxycblt/auxio/image/Cover.kt
index 839e1b49f..7950e755b 100644
--- a/app/src/main/java/org/oxycblt/auxio/image/extractor/Cover.kt
+++ b/app/src/main/java/org/oxycblt/auxio/image/Cover.kt
@@ -16,7 +16,7 @@
* along with this program. If not, see .
*/
-package org.oxycblt.auxio.image.extractor
+package org.oxycblt.auxio.image
import org.oxycblt.auxio.list.sort.Sort
import org.oxycblt.auxio.music.Song
diff --git a/app/src/main/java/org/oxycblt/auxio/image/CoverView.kt b/app/src/main/java/org/oxycblt/auxio/image/CoverView.kt
index 39df3369c..24477eda0 100644
--- a/app/src/main/java/org/oxycblt/auxio/image/CoverView.kt
+++ b/app/src/main/java/org/oxycblt/auxio/image/CoverView.kt
@@ -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
diff --git a/app/src/main/java/org/oxycblt/auxio/image/extractor/ExtractorModule.kt b/app/src/main/java/org/oxycblt/auxio/image/coil/CoilModule.kt
similarity index 96%
rename from app/src/main/java/org/oxycblt/auxio/image/extractor/ExtractorModule.kt
rename to app/src/main/java/org/oxycblt/auxio/image/coil/CoilModule.kt
index a346fb4a9..7b1236d20 100644
--- a/app/src/main/java/org/oxycblt/auxio/image/extractor/ExtractorModule.kt
+++ b/app/src/main/java/org/oxycblt/auxio/image/coil/CoilModule.kt
@@ -16,7 +16,7 @@
* along with this program. If not, see .
*/
-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(
diff --git a/app/src/main/java/org/oxycblt/auxio/image/extractor/Components.kt b/app/src/main/java/org/oxycblt/auxio/image/coil/Components.kt
similarity index 98%
rename from app/src/main/java/org/oxycblt/auxio/image/extractor/Components.kt
rename to app/src/main/java/org/oxycblt/auxio/image/coil/Components.kt
index b5c1bb588..2c3fdd594 100644
--- a/app/src/main/java/org/oxycblt/auxio/image/extractor/Components.kt
+++ b/app/src/main/java/org/oxycblt/auxio/image/coil/Components.kt
@@ -16,7 +16,7 @@
* along with this program. If not, see .
*/
-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 {
diff --git a/app/src/main/java/org/oxycblt/auxio/image/extractor/ErrorCrossfadeTransitionFactory.kt b/app/src/main/java/org/oxycblt/auxio/image/coil/ErrorCrossfadeTransitionFactory.kt
similarity index 97%
rename from app/src/main/java/org/oxycblt/auxio/image/extractor/ErrorCrossfadeTransitionFactory.kt
rename to app/src/main/java/org/oxycblt/auxio/image/coil/ErrorCrossfadeTransitionFactory.kt
index f5e94e548..466947f67 100644
--- a/app/src/main/java/org/oxycblt/auxio/image/extractor/ErrorCrossfadeTransitionFactory.kt
+++ b/app/src/main/java/org/oxycblt/auxio/image/coil/ErrorCrossfadeTransitionFactory.kt
@@ -16,7 +16,7 @@
* along with this program. If not, see .
*/
-package org.oxycblt.auxio.image.extractor
+package org.oxycblt.auxio.image.coil
import coil3.decode.DataSource
import coil3.request.ImageResult
diff --git a/app/src/main/java/org/oxycblt/auxio/image/extractor/RoundedRectTransformation.kt b/app/src/main/java/org/oxycblt/auxio/image/coil/RoundedRectTransformation.kt
similarity index 99%
rename from app/src/main/java/org/oxycblt/auxio/image/extractor/RoundedRectTransformation.kt
rename to app/src/main/java/org/oxycblt/auxio/image/coil/RoundedRectTransformation.kt
index be645f7b5..214797ed3 100644
--- a/app/src/main/java/org/oxycblt/auxio/image/extractor/RoundedRectTransformation.kt
+++ b/app/src/main/java/org/oxycblt/auxio/image/coil/RoundedRectTransformation.kt
@@ -16,7 +16,7 @@
* along with this program. If not, see .
*/
-package org.oxycblt.auxio.image.extractor
+package org.oxycblt.auxio.image.coil
import android.graphics.Bitmap
import android.graphics.Bitmap.createBitmap
diff --git a/app/src/main/java/org/oxycblt/auxio/image/extractor/SquareCropTransformation.kt b/app/src/main/java/org/oxycblt/auxio/image/coil/SquareCropTransformation.kt
similarity index 98%
rename from app/src/main/java/org/oxycblt/auxio/image/extractor/SquareCropTransformation.kt
rename to app/src/main/java/org/oxycblt/auxio/image/coil/SquareCropTransformation.kt
index 4e73ec4e6..a7c780c92 100644
--- a/app/src/main/java/org/oxycblt/auxio/image/extractor/SquareCropTransformation.kt
+++ b/app/src/main/java/org/oxycblt/auxio/image/coil/SquareCropTransformation.kt
@@ -16,7 +16,7 @@
* along with this program. If not, see .
*/
-package org.oxycblt.auxio.image.extractor
+package org.oxycblt.auxio.image.coil
import android.graphics.Bitmap
import coil3.size.Size
diff --git a/app/src/main/java/org/oxycblt/auxio/image/stack/CoverRetriever.kt b/app/src/main/java/org/oxycblt/auxio/image/stack/CoverRetriever.kt
index 89de05d67..86d7560ad 100644
--- a/app/src/main/java/org/oxycblt/auxio/image/stack/CoverRetriever.kt
+++ b/app/src/main/java/org/oxycblt/auxio/image/stack/CoverRetriever.kt
@@ -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
diff --git a/app/src/main/java/org/oxycblt/auxio/image/stack/cache/CoverCache.kt b/app/src/main/java/org/oxycblt/auxio/image/stack/cache/CoverCache.kt
index b84145973..fca543c72 100644
--- a/app/src/main/java/org/oxycblt/auxio/image/stack/cache/CoverCache.kt
+++ b/app/src/main/java/org/oxycblt/auxio/image/stack/cache/CoverCache.kt
@@ -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?
diff --git a/app/src/main/java/org/oxycblt/auxio/image/stack/cache/PerceptualHash.kt b/app/src/main/java/org/oxycblt/auxio/image/stack/cache/PerceptualHash.kt
deleted file mode 100644
index 7651d7324..000000000
--- a/app/src/main/java/org/oxycblt/auxio/image/stack/cache/PerceptualHash.kt
+++ /dev/null
@@ -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 .
- */
-
-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)
- }
-}
diff --git a/app/src/main/java/org/oxycblt/auxio/image/stack/extractor/CoverExtractor.kt b/app/src/main/java/org/oxycblt/auxio/image/stack/extractor/CoverExtractor.kt
index 795092b86..885f1618e 100644
--- a/app/src/main/java/org/oxycblt/auxio/image/stack/extractor/CoverExtractor.kt
+++ b/app/src/main/java/org/oxycblt/auxio/image/stack/extractor/CoverExtractor.kt
@@ -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?
diff --git a/app/src/main/java/org/oxycblt/auxio/music/Music.kt b/app/src/main/java/org/oxycblt/auxio/music/Music.kt
index 3cf52cbfc..3e67706e3 100644
--- a/app/src/main/java/org/oxycblt/auxio/music/Music.kt
+++ b/app/src/main/java/org/oxycblt/auxio/music/Music.kt
@@ -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
diff --git a/app/src/main/java/org/oxycblt/auxio/music/stack/interpret/model/DeviceMusicImpl.kt b/app/src/main/java/org/oxycblt/auxio/music/stack/interpret/model/DeviceMusicImpl.kt
index 9d3ec79a3..e0af9e218 100644
--- a/app/src/main/java/org/oxycblt/auxio/music/stack/interpret/model/DeviceMusicImpl.kt
+++ b/app/src/main/java/org/oxycblt/auxio/music/stack/interpret/model/DeviceMusicImpl.kt
@@ -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
diff --git a/app/src/main/java/org/oxycblt/auxio/music/stack/interpret/model/PlaylistImpl.kt b/app/src/main/java/org/oxycblt/auxio/music/stack/interpret/model/PlaylistImpl.kt
index cd5de9c06..d48346eb3 100644
--- a/app/src/main/java/org/oxycblt/auxio/music/stack/interpret/model/PlaylistImpl.kt
+++ b/app/src/main/java/org/oxycblt/auxio/music/stack/interpret/model/PlaylistImpl.kt
@@ -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
diff --git a/app/src/main/java/org/oxycblt/auxio/widgets/WidgetComponent.kt b/app/src/main/java/org/oxycblt/auxio/widgets/WidgetComponent.kt
index 1fb39d156..6d19af745 100644
--- a/app/src/main/java/org/oxycblt/auxio/widgets/WidgetComponent.kt
+++ b/app/src/main/java/org/oxycblt/auxio/widgets/WidgetComponent.kt
@@ -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