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/>. * 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.list.sort.Sort
import org.oxycblt.auxio.music.Song 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 dagger.hilt.android.AndroidEntryPoint
import javax.inject.Inject import javax.inject.Inject
import org.oxycblt.auxio.R import org.oxycblt.auxio.R
import org.oxycblt.auxio.image.extractor.Cover import org.oxycblt.auxio.image.coil.RoundedRectTransformation
import org.oxycblt.auxio.image.extractor.RoundedRectTransformation import org.oxycblt.auxio.image.coil.SquareCropTransformation
import org.oxycblt.auxio.image.extractor.SquareCropTransformation
import org.oxycblt.auxio.music.Album import org.oxycblt.auxio.music.Album
import org.oxycblt.auxio.music.Artist import org.oxycblt.auxio.music.Artist
import org.oxycblt.auxio.music.Genre import org.oxycblt.auxio.music.Genre

View file

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

View file

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

View file

@ -16,7 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * 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.decode.DataSource
import coil3.request.ImageResult import coil3.request.ImageResult

View file

@ -16,7 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * 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
import android.graphics.Bitmap.createBitmap import android.graphics.Bitmap.createBitmap

View file

@ -16,7 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * 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
import coil3.size.Size import coil3.size.Size

View file

@ -20,7 +20,7 @@ package org.oxycblt.auxio.image.stack
import java.io.InputStream import java.io.InputStream
import javax.inject.Inject 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.cache.CoverCache
import org.oxycblt.auxio.image.stack.extractor.CoverExtractor import org.oxycblt.auxio.image.stack.extractor.CoverExtractor

View file

@ -25,7 +25,7 @@ import javax.inject.Inject
import kotlin.math.min import kotlin.math.min
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import org.oxycblt.auxio.image.extractor.Cover import org.oxycblt.auxio.image.Cover
interface CoverCache { interface CoverCache {
suspend fun read(cover: Cover.Single): InputStream? 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 android.net.Uri
import java.io.InputStream import java.io.InputStream
import javax.inject.Inject import javax.inject.Inject
import org.oxycblt.auxio.image.extractor.Cover import org.oxycblt.auxio.image.Cover
interface CoverExtractor { interface CoverExtractor {
suspend fun extract(cover: Cover.Single): InputStream? suspend fun extract(cover: Cover.Single): InputStream?

View file

@ -27,7 +27,7 @@ import java.util.UUID
import kotlin.math.max import kotlin.math.max
import kotlinx.parcelize.IgnoredOnParcel import kotlinx.parcelize.IgnoredOnParcel
import kotlinx.parcelize.Parcelize 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.list.Item
import org.oxycblt.auxio.music.info.Date import org.oxycblt.auxio.music.info.Date
import org.oxycblt.auxio.music.info.Disc import org.oxycblt.auxio.music.info.Disc

View file

@ -19,7 +19,7 @@
package org.oxycblt.auxio.music.stack.interpret.model package org.oxycblt.auxio.music.stack.interpret.model
import kotlin.math.min 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.list.sort.Sort
import org.oxycblt.auxio.music.Album import org.oxycblt.auxio.music.Album
import org.oxycblt.auxio.music.Artist import org.oxycblt.auxio.music.Artist

View file

@ -18,7 +18,7 @@
package org.oxycblt.auxio.music.stack.interpret.model 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.Playlist
import org.oxycblt.auxio.music.info.Name import org.oxycblt.auxio.music.info.Name
import org.oxycblt.auxio.music.stack.interpret.linker.LinkedPlaylist 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.R
import org.oxycblt.auxio.image.BitmapProvider import org.oxycblt.auxio.image.BitmapProvider
import org.oxycblt.auxio.image.ImageSettings import org.oxycblt.auxio.image.ImageSettings
import org.oxycblt.auxio.image.extractor.RoundedRectTransformation import org.oxycblt.auxio.image.coil.RoundedRectTransformation
import org.oxycblt.auxio.image.extractor.SquareCropTransformation import org.oxycblt.auxio.image.coil.SquareCropTransformation
import org.oxycblt.auxio.music.MusicParent import org.oxycblt.auxio.music.MusicParent
import org.oxycblt.auxio.music.Song import org.oxycblt.auxio.music.Song
import org.oxycblt.auxio.playback.state.PlaybackStateManager import org.oxycblt.auxio.playback.state.PlaybackStateManager