Skip to content

Commit

Permalink
refactor: store more metadata
Browse files Browse the repository at this point in the history
  • Loading branch information
zyrouge committed Oct 28, 2024
1 parent a5e2ada commit 43b981c
Show file tree
Hide file tree
Showing 5 changed files with 110 additions and 9 deletions.
25 changes: 25 additions & 0 deletions .phrasey/schema.toml
Original file line number Diff line number Diff line change
Expand Up @@ -695,3 +695,28 @@ name = "Encoder"

[[keys]]
name = "HintAddMediaFolders"

[[keys]]
name = "XChannels"
parameters = ["x"]

[[keys]]
name = "VBR"

[[keys]]
name = "AudioChannels"

[[keys]]
name = "Variable"

[[keys]]
name = "MinimumBitrate"

[[keys]]
name = "MaximumBitrate"

[[keys]]
name = "Date"

[[keys]]
name = "TotalSamples"
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import io.github.zyrouge.symphony.utils.DocumentFileX
import io.github.zyrouge.symphony.utils.SimplePath
import java.io.FileOutputStream
import java.math.RoundingMode
import java.time.LocalDate

@Immutable
@Entity("songs")
Expand All @@ -31,11 +32,16 @@ data class Song(
val trackTotal: Int?,
val discNumber: Int?,
val discTotal: Int?,
val date: LocalDate?,
val year: Int?,
val duration: Long,
val bitrate: Long?,
val minBitrate: Long?,
val maxBitrate: Long?,
val bitsPerSample: Int?,
val samplingRate: Long?,
val samples: Long?,
val channels: Int?,
val codec: String?,
val encoder: String?,
val dateModified: Long,
Expand All @@ -44,7 +50,10 @@ data class Song(
val uri: Uri,
val path: String,
) {
val variableBitrate get() = minBitrate != null && minBitrate != maxBitrate
val bitrateK: Long? get() = bitrate?.let { it / 1000 }
val minBitrateK: Long? get() = minBitrate?.let { it / 1000 }
val maxBitrateK: Long? get() = maxBitrate?.let { it / 1000 }
val samplingRateK: Float?
get() = samplingRate?.let {
(it.toFloat() / 1000)
Expand All @@ -60,12 +69,22 @@ data class Song(

fun toSamplingInfoString(symphony: Symphony): String? {
val values = mutableListOf<String>()
codec?.let { values.add(it) }
codec?.let {
values.add(it)
}
channels?.let {
values.add(symphony.t.XChannels(it.toString()))
}
bitsPerSample?.let {
values.add(symphony.t.XBit(it.toString()))
}
bitrateK?.let {
values.add(symphony.t.XKbps(it.toString()))
values.add(buildString {
append(symphony.t.XKbps(it.toString()))
if (variableBitrate) {
append(" (${symphony.t.VBR})")
}
})
}
samplingRateK?.let {
values.add(symphony.t.XKHz(it.toString()))
Expand Down Expand Up @@ -119,11 +138,16 @@ data class Song(
trackTotal = metadata.trackTotal,
discNumber = metadata.discNumber,
discTotal = metadata.discTotal,
date = metadata.date,
year = metadata.year,
duration = stream.duration?.let { it * 1000 } ?: 0,
bitrate = stream.bitrate,
minBitrate = stream.minBitrate,
maxBitrate = stream.maxBitrate,
bitsPerSample = stream.bitsPerSample,
samplingRate = stream.samplingRate,
samples = stream.samples,
channels = stream.channels,
codec = stream.codec,
encoder = metadata.encoder,
dateModified = file.lastModified,
Expand Down Expand Up @@ -166,6 +190,7 @@ data class Song(
val discNumber = retriever
.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DISC_NUMBER)
?.toIntOrNull()
val date = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DATE)
val year = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_YEAR)
?.toIntOrNull()
val duration = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION)
Expand Down Expand Up @@ -198,11 +223,16 @@ data class Song(
trackTotal = trackTotal,
discNumber = discNumber,
discTotal = null,
date = runCatching { LocalDate.parse(date) }.getOrNull(),
year = year,
duration = duration ?: 0,
bitrate = bitrate,
minBitrate = null,
maxBitrate = null,
bitsPerSample = bitsPerSample,
samplingRate = samplingRate,
samples = null,
channels = null,
codec = codec,
encoder = null,
dateModified = file.lastModified,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,11 @@ fun SongInformationDialog(context: ViewContext, song: Song, onDismissRequest: ()
}
}
}
song.date?.let {
InformationKeyValue(context.symphony.t.Date) {
LongPressCopyableText(context, it.toString())
}
}
song.year?.let {
InformationKeyValue(context.symphony.t.Year) {
LongPressCopyableText(context, it.toString())
Expand Down Expand Up @@ -109,8 +114,29 @@ fun SongInformationDialog(context: ViewContext, song: Song, onDismissRequest: ()
LongPressCopyableText(context, it)
}
}
song.channels?.let {
InformationKeyValue(context.symphony.t.AudioChannels) {
LongPressCopyableText(context, it.toString())
}
}
song.bitrateK?.let {
InformationKeyValue(context.symphony.t.Bitrate) {
val text = buildString {
append(context.symphony.t.XKbps(it.toString()))
if (song.variableBitrate) {
append(" (${context.symphony.t.Variable})")
}
}
LongPressCopyableText(context, text)
}
}
song.minBitrateK?.let {
InformationKeyValue(context.symphony.t.MinimumBitrate) {
LongPressCopyableText(context, context.symphony.t.XKbps(it.toString()))
}
}
song.maxBitrateK?.let {
InformationKeyValue(context.symphony.t.MaximumBitrate) {
LongPressCopyableText(context, context.symphony.t.XKbps(it.toString()))
}
}
Expand All @@ -124,6 +150,11 @@ fun SongInformationDialog(context: ViewContext, song: Song, onDismissRequest: ()
LongPressCopyableText(context, context.symphony.t.XKHz(it.toString()))
}
}
song.samples?.let {
InformationKeyValue(context.symphony.t.TotalSamples) {
LongPressCopyableText(context, it.toString())
}
}
InformationKeyValue(context.symphony.t.Filename) {
LongPressCopyableText(context, song.filename)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,24 +4,31 @@ import android.net.Uri
import androidx.room.TypeConverter
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json
import java.time.LocalDate

@Suppress("unused")
class RoomConvertors {
@TypeConverter
fun serializeUri(value: String) = Uri.parse(value)
fun serializeUri(value: Uri) = value.toString()

@TypeConverter
fun deserializeUri(value: Uri) = value.toString()
fun deserializeUri(value: String) = Uri.parse(value)

@TypeConverter
fun serializeStringSet(value: String) = Json.decodeFromString<Set<String>>(value)
fun serializeStringSet(value: Set<String>) = Json.encodeToString(value)

@TypeConverter
fun deserializeStringSet(value: Set<String>) = Json.encodeToString(value)
fun deserializeStringSet(value: String) = Json.decodeFromString<Set<String>>(value)

@TypeConverter
fun serializeStringList(value: String) = Json.decodeFromString<List<String>>(value)
fun serializeStringList(value: List<String>) = Json.encodeToString(value)

@TypeConverter
fun deserializeStringList(value: List<String>) = Json.encodeToString(value)
fun deserializeStringList(value: String) = Json.decodeFromString<List<String>>(value)

@TypeConverter
fun serializeLocalDate(value: LocalDate) = value.toString()

@TypeConverter
fun deserializeLocalDate(value: String): LocalDate = LocalDate.parse(value)
}
10 changes: 9 additions & 1 deletion i18n/en.toml
Original file line number Diff line number Diff line change
Expand Up @@ -232,4 +232,12 @@ MediaFolders = "Media folders"
Id = "ID"
DiscTotal = "Disc total"
Encoder = "Encoder"
HintAddMediaFolders = "Hint: You can add media folders through settings!"
HintAddMediaFolders = "Hint: You can add media folders through settings!"
XChannels = "{x} channels"
VBR = "VBR"
AudioChannels = "Audio channels"
Variable = "Variable"
MinimumBitrate = "Minimum bitrate"
MaximumBitrate = "Maximum bitrate"
Date = "Date"
TotalSamples = "Total samples"

0 comments on commit 43b981c

Please sign in to comment.