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:
parent
94a580aaed
commit
1a3fe7c075
15 changed files with 18 additions and 84 deletions
|
@ -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
|
|
@ -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
|
||||||
|
|
|
@ -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(
|
|
@ -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> {
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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?
|
||||||
|
|
|
@ -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)
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -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?
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue