Remove excess zeroes from durations
Remove excess zeroes from the formatted durations.
This commit is contained in:
parent
531825465f
commit
fddf5e4472
6 changed files with 47 additions and 21 deletions
|
@ -38,6 +38,8 @@ private val ID3_GENRES = arrayOf(
|
||||||
|
|
||||||
const val PAREN_FILTER = "()"
|
const val PAREN_FILTER = "()"
|
||||||
|
|
||||||
|
// --- EXTENSION FUNCTIONS ---
|
||||||
|
|
||||||
// Convert legacy ID3 genres to a named genre
|
// Convert legacy ID3 genres to a named genre
|
||||||
fun String.toNamedGenre(): String? {
|
fun String.toNamedGenre(): String? {
|
||||||
// Strip the genres of any parentheses, and convert it to an int
|
// Strip the genres of any parentheses, and convert it to an int
|
||||||
|
@ -45,7 +47,7 @@ fun String.toNamedGenre(): String? {
|
||||||
PAREN_FILTER.indexOf(it) > -1
|
PAREN_FILTER.indexOf(it) > -1
|
||||||
}.toInt()
|
}.toInt()
|
||||||
|
|
||||||
// If the conversion fails [Due to the genre using an extension that isn't from winamp],
|
// If the conversion fails [Due to the genre using an extension that Auxio doesn't have],
|
||||||
// then return null.
|
// then return null.
|
||||||
return ID3_GENRES.getOrNull(intGenre)
|
return ID3_GENRES.getOrNull(intGenre)
|
||||||
}
|
}
|
||||||
|
@ -66,6 +68,27 @@ fun Long.toAlbumArtURI(): Uri {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Cut off excess zeros from a duration string
|
||||||
|
fun String.removeDurationZeroes(): String {
|
||||||
|
val split = this.chunked(1).toMutableList()
|
||||||
|
|
||||||
|
// Iterate through the string and remove the first zero found
|
||||||
|
// If anything else is found, exit the loop.
|
||||||
|
for (i in 0 until length) {
|
||||||
|
if (this[i] == '0') {
|
||||||
|
split.removeAt(i)
|
||||||
|
|
||||||
|
break
|
||||||
|
} else {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return split.joinToString("")
|
||||||
|
}
|
||||||
|
|
||||||
|
// --- BINDING ADAPTERS ---
|
||||||
|
|
||||||
// Format the amount of songs in an album
|
// Format the amount of songs in an album
|
||||||
@BindingAdapter("songCount")
|
@BindingAdapter("songCount")
|
||||||
fun TextView.getAlbumSongs(album: Album) {
|
fun TextView.getAlbumSongs(album: Album) {
|
||||||
|
@ -87,8 +110,16 @@ fun TextView.bindArtistCounts(artist: Artist) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get the artist genre.
|
// Get the artist genre.
|
||||||
// TODO: Stub, add option to list all genres instead of just the most prominent
|
// TODO: Add option to list all genres
|
||||||
@BindingAdapter("artistGenre")
|
@BindingAdapter("artistGenre")
|
||||||
fun TextView.getArtistGenre(artist: Artist) {
|
fun TextView.getArtistGenre(artist: Artist) {
|
||||||
text = artist.genre
|
// If there are multiple genres, then pick the most "Prominent" one,
|
||||||
|
// Otherwise just pick the first one
|
||||||
|
if (artist.genres.keys.size > 1) {
|
||||||
|
text = artist.genres.keys.sortedByDescending {
|
||||||
|
artist.genres[it]?.size
|
||||||
|
}[0]
|
||||||
|
} else {
|
||||||
|
text = artist.genres.keys.first()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,10 +4,10 @@ package org.oxycblt.auxio.music.models
|
||||||
data class Artist(
|
data class Artist(
|
||||||
val id: Long = -1,
|
val id: Long = -1,
|
||||||
var name: String,
|
var name: String,
|
||||||
val genres: MutableList<Genre> = mutableListOf()
|
val givenGenres: MutableList<Genre> = mutableListOf()
|
||||||
) {
|
) {
|
||||||
val albums = mutableListOf<Album>()
|
val albums = mutableListOf<Album>()
|
||||||
var genre = ""
|
lateinit var genres: Map<String, List<Genre>>
|
||||||
|
|
||||||
val numAlbums: Int get() = albums.size
|
val numAlbums: Int get() = albums.size
|
||||||
val numSongs: Int
|
val numSongs: Int
|
||||||
|
@ -19,14 +19,7 @@ data class Artist(
|
||||||
return num
|
return num
|
||||||
}
|
}
|
||||||
|
|
||||||
fun finalizeGenre() {
|
fun finalizeGenres() {
|
||||||
// If the artist has more than one genre, pick the most "Prominent" one.
|
genres = givenGenres.groupBy { it.name }
|
||||||
genre = if (genres.size > 1) {
|
|
||||||
val groupGenres = genres.groupBy { it.name }
|
|
||||||
|
|
||||||
groupGenres.keys.sortedByDescending { groupGenres[it]?.size }[0]
|
|
||||||
} else {
|
|
||||||
genres[0].name
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package org.oxycblt.auxio.music.models
|
package org.oxycblt.auxio.music.models
|
||||||
|
|
||||||
import android.text.format.DateUtils
|
import android.text.format.DateUtils
|
||||||
|
import org.oxycblt.auxio.music.removeDurationZeroes
|
||||||
|
|
||||||
// Class containing all relevant values for a song.
|
// Class containing all relevant values for a song.
|
||||||
data class Song(
|
data class Song(
|
||||||
|
@ -13,5 +14,5 @@ data class Song(
|
||||||
lateinit var album: Album
|
lateinit var album: Album
|
||||||
|
|
||||||
val seconds = duration / 1000
|
val seconds = duration / 1000
|
||||||
val formattedDuration: String = DateUtils.formatElapsedTime(seconds)
|
val formattedDuration: String = DateUtils.formatElapsedTime(seconds).removeDurationZeroes()
|
||||||
}
|
}
|
||||||
|
|
|
@ -138,7 +138,7 @@ class MusicLoader(
|
||||||
val existingArtist = artists.find { it.name == name }
|
val existingArtist = artists.find { it.name == name }
|
||||||
|
|
||||||
if (existingArtist != null) {
|
if (existingArtist != null) {
|
||||||
existingArtist.genres.add(genre)
|
existingArtist.givenGenres.add(genre)
|
||||||
} else {
|
} else {
|
||||||
artists.add(
|
artists.add(
|
||||||
Artist(
|
Artist(
|
||||||
|
@ -155,7 +155,7 @@ class MusicLoader(
|
||||||
|
|
||||||
// Remove dupes [Just in case]
|
// Remove dupes [Just in case]
|
||||||
artists = artists.distinctBy {
|
artists = artists.distinctBy {
|
||||||
it.name to it.genres
|
it.name to it.givenGenres
|
||||||
}.toMutableList()
|
}.toMutableList()
|
||||||
|
|
||||||
Log.d(
|
Log.d(
|
||||||
|
|
|
@ -114,7 +114,7 @@ class MusicSorter(
|
||||||
for (genre in genres) {
|
for (genre in genres) {
|
||||||
// Find all artists that match the current genre
|
// Find all artists that match the current genre
|
||||||
val genreArtists = artists.filter { artist ->
|
val genreArtists = artists.filter { artist ->
|
||||||
artist.genres.any {
|
artist.givenGenres.any {
|
||||||
it.name == genre.name
|
it.name == genre.name
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -132,7 +132,7 @@ class MusicSorter(
|
||||||
)
|
)
|
||||||
|
|
||||||
for (artist in unknownArtists) {
|
for (artist in unknownArtists) {
|
||||||
artist.genres.add(unknownGenre)
|
artist.givenGenres.add(unknownGenre)
|
||||||
unknownGenre.artists.add(artist)
|
unknownGenre.artists.add(artist)
|
||||||
}
|
}
|
||||||
genres.add(unknownGenre)
|
genres.add(unknownGenre)
|
||||||
|
@ -147,7 +147,7 @@ class MusicSorter(
|
||||||
// Finalize music
|
// Finalize music
|
||||||
private fun finalizeMusic() {
|
private fun finalizeMusic() {
|
||||||
// Finalize the genre for each artist
|
// Finalize the genre for each artist
|
||||||
artists.forEach { it.finalizeGenre() }
|
artists.forEach { it.finalizeGenres() }
|
||||||
|
|
||||||
// Then finally sort the music
|
// Then finally sort the music
|
||||||
genres.sortWith(
|
genres.sortWith(
|
||||||
|
|
|
@ -67,10 +67,11 @@
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/duration"
|
android:id="@+id/duration"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="0dp"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:gravity="center"
|
android:gravity="center"
|
||||||
android:text="@{song.formattedDuration}"
|
android:text="@{song.formattedDuration}"
|
||||||
|
android:textAlignment="center"
|
||||||
android:textAppearance="?android:attr/textAppearanceListItemSecondary"
|
android:textAppearance="?android:attr/textAppearanceListItemSecondary"
|
||||||
android:textColor="?android:attr/textColorTertiary"
|
android:textColor="?android:attr/textColorTertiary"
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
|
Loading…
Reference in a new issue