diff --git a/app/src/main/java/org/oxycblt/auxio/IntegerTable.kt b/app/src/main/java/org/oxycblt/auxio/IntegerTable.kt index 1da5824b9..55907bb0d 100644 --- a/app/src/main/java/org/oxycblt/auxio/IntegerTable.kt +++ b/app/src/main/java/org/oxycblt/auxio/IntegerTable.kt @@ -141,4 +141,6 @@ object IntegerTable { const val PLAY_SONG_BY_ITSELF = 0xA124 /** CoverMode.SaveSpace */ const val COVER_MODE_SAVE_SPACE = 0xA125 + /** CoverMode.AsIs */ + const val COVER_MODE_AS_IS = 0xA126 } diff --git a/app/src/main/java/org/oxycblt/auxio/image/CoverMode.kt b/app/src/main/java/org/oxycblt/auxio/image/CoverMode.kt index cad4a2ab2..a0cf8fe83 100644 --- a/app/src/main/java/org/oxycblt/auxio/image/CoverMode.kt +++ b/app/src/main/java/org/oxycblt/auxio/image/CoverMode.kt @@ -29,7 +29,8 @@ enum class CoverMode { OFF, SAVE_SPACE, BALANCED, - HIGH_QUALITY; + HIGH_QUALITY, + AS_IS; /** * The integer representation of this instance. @@ -43,6 +44,7 @@ enum class CoverMode { SAVE_SPACE -> IntegerTable.COVER_MODE_SAVE_SPACE BALANCED -> IntegerTable.COVER_MODE_BALANCED HIGH_QUALITY -> IntegerTable.COVER_MODE_HIGH_QUALITY + AS_IS -> IntegerTable.COVER_MODE_AS_IS } companion object { @@ -59,6 +61,7 @@ enum class CoverMode { IntegerTable.COVER_MODE_SAVE_SPACE -> SAVE_SPACE IntegerTable.COVER_MODE_BALANCED -> BALANCED IntegerTable.COVER_MODE_HIGH_QUALITY -> HIGH_QUALITY + IntegerTable.COVER_MODE_AS_IS -> AS_IS else -> null } } diff --git a/app/src/main/java/org/oxycblt/auxio/image/covers/SettingCovers.kt b/app/src/main/java/org/oxycblt/auxio/image/covers/SettingCovers.kt index ac0a4f7fa..de5a6fbac 100644 --- a/app/src/main/java/org/oxycblt/auxio/image/covers/SettingCovers.kt +++ b/app/src/main/java/org/oxycblt/auxio/image/covers/SettingCovers.kt @@ -24,13 +24,16 @@ import javax.inject.Inject import org.oxycblt.auxio.image.CoverMode import org.oxycblt.auxio.image.ImageSettings import org.oxycblt.musikr.cover.Cover +import org.oxycblt.musikr.cover.CoverFormat import org.oxycblt.musikr.cover.CoverIdentifier import org.oxycblt.musikr.cover.CoverParams import org.oxycblt.musikr.cover.Covers import org.oxycblt.musikr.cover.FileCover import org.oxycblt.musikr.cover.FolderCovers import org.oxycblt.musikr.cover.MutableCovers +import org.oxycblt.musikr.cover.MutableFileCovers import org.oxycblt.musikr.cover.MutableFolderCovers +import org.oxycblt.musikr.fs.app.AppFiles interface SettingCovers { suspend fun mutate(context: Context, revision: UUID): MutableCovers @@ -51,10 +54,19 @@ constructor(private val imageSettings: ImageSettings, private val identifier: Co CoverMode.SAVE_SPACE -> siloedCovers(context, revision, CoverParams.of(500, 70)) CoverMode.BALANCED -> siloedCovers(context, revision, CoverParams.of(750, 85)) CoverMode.HIGH_QUALITY -> siloedCovers(context, revision, CoverParams.of(1000, 100)) + CoverMode.AS_IS -> asIsCovers(context) } private suspend fun siloedCovers(context: Context, revision: UUID, with: CoverParams) = MutableCovers.chain( MutableSiloedCovers.from(context, CoverSilo(revision, with), identifier), MutableFolderCovers(context)) + + private suspend fun asIsCovers(context: Context) = + MutableCovers.chain( + MutableFileCovers( + AppFiles.at(context.coversDir().resolve("asis").also { it.mkdirs() }), + CoverFormat.asIs(), + identifier), + MutableFolderCovers(context)) } diff --git a/app/src/main/res/values/settings.xml b/app/src/main/res/values/settings.xml index 3ae8632dc..99438b0d6 100644 --- a/app/src/main/res/values/settings.xml +++ b/app/src/main/res/values/settings.xml @@ -79,6 +79,7 @@ @string/set_cover_mode_save_space @string/set_cover_mode_balanced @string/set_cover_mode_high_quality + @string/set_cover_mode_as_is @@ -86,6 +87,7 @@ @integer/cover_mode_save_space @integer/cover_mode_balanced @integer/cover_mode_high_quality + @integer/cover_mode_as_is @@ -182,4 +184,5 @@ 0xA125 0xA11D 0xA11E + 0xA126 \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ed98f9a97..64bbcfd36 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -287,6 +287,7 @@ Save space Balanced High quality + As is Force square album covers Crop all album covers to a 1:1 aspect ratio diff --git a/musikr/src/main/java/org/oxycblt/musikr/cover/CoverFormat.kt b/musikr/src/main/java/org/oxycblt/musikr/cover/CoverFormat.kt index 52f9e15e3..16af47506 100644 --- a/musikr/src/main/java/org/oxycblt/musikr/cover/CoverFormat.kt +++ b/musikr/src/main/java/org/oxycblt/musikr/cover/CoverFormat.kt @@ -29,11 +29,13 @@ abstract class CoverFormat { companion object { fun jpeg(params: CoverParams): CoverFormat = - CoverFormatImpl("jpg", params, Bitmap.CompressFormat.JPEG) + CompressingCoverFormat("jpg", params, Bitmap.CompressFormat.JPEG) + + fun asIs(): CoverFormat = AsIsCoverFormat() } } -private class CoverFormatImpl( +private class CompressingCoverFormat( override val extension: String, private val params: CoverParams, private val format: Bitmap.CompressFormat, @@ -63,3 +65,16 @@ private class CoverFormatImpl( return inSampleSize } } + +private class AsIsCoverFormat : CoverFormat() { + override val extension: String = "bin" + + override fun transcodeInto(data: ByteArray, output: OutputStream): Boolean { + return try { + output.write(data) + true + } catch (e: Exception) { + false + } + } +} diff --git a/musikr/src/main/java/org/oxycblt/musikr/pipeline/ExtractStep.kt b/musikr/src/main/java/org/oxycblt/musikr/pipeline/ExtractStep.kt index 1aab2c562..576980b3a 100644 --- a/musikr/src/main/java/org/oxycblt/musikr/pipeline/ExtractStep.kt +++ b/musikr/src/main/java/org/oxycblt/musikr/pipeline/ExtractStep.kt @@ -126,7 +126,7 @@ private class ExtractStepImpl( val cover = when (val result = covers.create(f, extractedMetadata)) { - is CoverResult.Hit -> result.cover + is CoverResult.Hit -> result.cover else -> null } val rawSong =