diff --git a/app/src/main/java/com/theveloper/pixelplay/data/media/AudioMetadataReader.kt b/app/src/main/java/com/theveloper/pixelplay/data/media/AudioMetadataReader.kt
index f2afa8c82..e15d2db83 100644
--- a/app/src/main/java/com/theveloper/pixelplay/data/media/AudioMetadataReader.kt
+++ b/app/src/main/java/com/theveloper/pixelplay/data/media/AudioMetadataReader.kt
@@ -16,6 +16,7 @@ data class AudioMetadata(
val albumArtist: String?,
val album: String?,
val genre: String?,
+ val composer: String?,
val lyrics: String?,
val durationMs: Long?,
val trackNumber: Int?,
@@ -77,6 +78,8 @@ object AudioMetadataReader {
?: propertyMap["BAND"]?.firstOrNull()?.takeIf { it.isNotBlank() }
val album = propertyMap["ALBUM"]?.firstOrNull()?.takeIf { it.isNotBlank() }
val genre = propertyMap["GENRE"]?.firstOrNull()?.takeIf { it.isNotBlank() }
+ val composer = propertyMap["COMPOSER"]?.firstOrNull()?.takeIf { it.isNotBlank() }
+ ?: propertyMap["TCOM"]?.firstOrNull()?.takeIf { it.isNotBlank() }
val lyrics = propertyMap["LYRICS"]?.firstOrNull()?.takeIf { it.isNotBlank() }
?: propertyMap["UNSYNCEDLYRICS"]?.firstOrNull()?.takeIf { it.isNotBlank() }
val trackString = propertyMap["TRACKNUMBER"]?.firstOrNull()?.takeIf { it.isNotBlank() }
@@ -127,6 +130,7 @@ object AudioMetadataReader {
albumArtist = albumArtist ?: fallback?.albumArtist,
album = album ?: fallback?.album,
genre = genre ?: fallback?.genre,
+ composer = composer ?: fallback?.composer,
lyrics = lyrics ?: fallback?.lyrics,
durationMs = durationMs ?: fallback?.durationMs,
trackNumber = trackNumber ?: fallback?.trackNumber,
@@ -166,6 +170,7 @@ object AudioMetadataReader {
val albumArtist = tag?.getFirst(FieldKey.ALBUM_ARTIST)?.takeIf { it.isNotBlank() }
val album = tag?.getFirst(FieldKey.ALBUM)?.takeIf { it.isNotBlank() }
val genre = tag?.getFirst(FieldKey.GENRE)?.takeIf { it.isNotBlank() }
+ val composer = tag?.getFirst(FieldKey.COMPOSER)?.takeIf { it.isNotBlank() }
val lyrics = tag?.getFirst(FieldKey.LYRICS)?.takeIf { it.isNotBlank() }
val trackNumber = tag?.getFirst(FieldKey.TRACK)?.takeIf { it.isNotBlank() }
?.substringBefore('/')?.toIntOrNull()
@@ -197,6 +202,7 @@ object AudioMetadataReader {
albumArtist = albumArtist,
album = album,
genre = genre,
+ composer = composer,
lyrics = lyrics,
durationMs = durationMs,
trackNumber = trackNumber,
diff --git a/app/src/main/java/com/theveloper/pixelplay/data/media/SongMetadataEditor.kt b/app/src/main/java/com/theveloper/pixelplay/data/media/SongMetadataEditor.kt
index c93e4aad5..545093c1b 100644
--- a/app/src/main/java/com/theveloper/pixelplay/data/media/SongMetadataEditor.kt
+++ b/app/src/main/java/com/theveloper/pixelplay/data/media/SongMetadataEditor.kt
@@ -96,6 +96,8 @@ class SongMetadataEditor(
const val MAX_TITLE_LENGTH = 500
const val MAX_ARTIST_LENGTH = 500
const val MAX_ALBUM_LENGTH = 500
+ const val MAX_ALBUM_ARTIST_LENGTH = 500
+ const val MAX_COMPOSER_LENGTH = 500
const val MAX_GENRE_LENGTH = 100
const val MAX_LYRICS_LENGTH = 50_000
}
@@ -107,6 +109,8 @@ class SongMetadataEditor(
title: String,
artist: String,
album: String,
+ albumArtist: String?,
+ composer: String?,
genre: String,
lyrics: String
): String? {
@@ -114,6 +118,8 @@ class SongMetadataEditor(
if (title.length > MetadataLimits.MAX_TITLE_LENGTH) return "Title too long"
if (artist.length > MetadataLimits.MAX_ARTIST_LENGTH) return "Artist name too long"
if (album.length > MetadataLimits.MAX_ALBUM_LENGTH) return "Album name too long"
+ if (!albumArtist.isNullOrBlank() && albumArtist.length > MetadataLimits.MAX_ALBUM_ARTIST_LENGTH) return "Album artist name too long"
+ if (!composer.isNullOrBlank() && composer.length > MetadataLimits.MAX_COMPOSER_LENGTH) return "Composer name too long"
if (genre.length > MetadataLimits.MAX_GENRE_LENGTH) return "Genre too long"
if (lyrics.length > MetadataLimits.MAX_LYRICS_LENGTH) return "Lyrics too long"
return null
@@ -229,6 +235,8 @@ class SongMetadataEditor(
newTitle: String,
newArtist: String,
newAlbum: String,
+ newAlbumArtist: String? = null,
+ newComposer: String? = null,
newGenre: String,
newLyrics: String,
newTrackNumber: Int,
@@ -237,7 +245,7 @@ class SongMetadataEditor(
newReplayGainAlbumGainDb: String? = null,
coverArtUpdate: CoverArtUpdate? = null,
): SongMetadataEditResult = withContext(Dispatchers.IO) {
- val validationError = validateMetadataInput(newTitle, newArtist, newAlbum, newGenre, newLyrics)
+ val validationError = validateMetadataInput(newTitle, newArtist, newAlbum, newAlbumArtist, newComposer, newGenre, newLyrics)
if (validationError != null) {
Timber.w("Metadata validation failed: $validationError")
return@withContext SongMetadataEditResult(
@@ -339,6 +347,8 @@ class SongMetadataEditor(
newTitle = newTitle,
newArtist = newArtist,
newAlbum = newAlbum,
+ newAlbumArtist = newAlbumArtist,
+ newComposer = newComposer,
newGenre = trimmedGenre,
newLyrics = trimmedLyrics,
newTrackNumber = newTrackNumber,
@@ -354,6 +364,8 @@ class SongMetadataEditor(
newTitle = newTitle,
newArtist = newArtist,
newAlbum = newAlbum,
+ newAlbumArtist = newAlbumArtist,
+ newComposer = newComposer,
newGenre = trimmedGenre,
newLyrics = trimmedLyrics,
newTrackNumber = newTrackNumber,
@@ -369,6 +381,8 @@ class SongMetadataEditor(
newTitle = newTitle,
newArtist = newArtist,
newAlbum = newAlbum,
+ newAlbumArtist = newAlbumArtist,
+ newComposer = newComposer,
newGenre = trimmedGenre,
newLyrics = trimmedLyrics,
newTrackNumber = newTrackNumber,
@@ -385,6 +399,8 @@ class SongMetadataEditor(
newTitle = newTitle,
newArtist = newArtist,
newAlbum = newAlbum,
+ newAlbumArtist = newAlbumArtist,
+ newComposer = newComposer,
newGenre = trimmedGenre,
newLyrics = trimmedLyrics,
newTrackNumber = newTrackNumber,
@@ -442,6 +458,7 @@ class SongMetadataEditor(
title = newTitle,
artist = newArtist,
album = newAlbum,
+ albumArtist = newAlbumArtist,
genre = trimmedGenre,
trackNumber = newTrackNumber,
discNumber = newDiscNumber
@@ -727,6 +744,8 @@ class SongMetadataEditor(
newTitle: String,
newArtist: String,
newAlbum: String,
+ newAlbumArtist: String?,
+ newComposer: String?,
newGenre: String,
newLyrics: String,
newTrackNumber: Int,
@@ -771,6 +790,10 @@ class SongMetadataEditor(
propertyMap["TITLE"] = arrayOf(newTitle)
propertyMap["ARTIST"] = arrayOf(newArtist)
propertyMap["ALBUM"] = arrayOf(newAlbum)
+ if (!newAlbumArtist.isNullOrBlank()) {
+ propertyMap["ALBUMARTIST"] = arrayOf(newAlbumArtist)
+ }
+ propertyMap.upsertOrRemove("COMPOSER", newComposer)
propertyMap.upsertOrRemove("GENRE", newGenre)
propertyMap.upsertOrRemove("LYRICS", newLyrics)
propertyMap["TRACKNUMBER"] = arrayOf(newTrackNumber.toString())
@@ -779,7 +802,6 @@ class SongMetadataEditor(
} else {
propertyMap.remove("DISCNUMBER")
}
- propertyMap["ALBUMARTIST"] = arrayOf(newArtist)
propertyMap.applyReplayGainUpdate(REPLAYGAIN_TRACK_GAIN_KEY, replayGainTrackUpdate)
propertyMap.applyReplayGainUpdate(REPLAYGAIN_ALBUM_GAIN_KEY, replayGainAlbumUpdate)
Timber.tag(TAG).e("TAGLIB: Updated property map, saving...")
@@ -848,6 +870,8 @@ class SongMetadataEditor(
newTitle: String,
newArtist: String,
newAlbum: String,
+ newAlbumArtist: String?,
+ newComposer: String?,
newGenre: String,
newLyrics: String,
newTrackNumber: Int,
@@ -869,7 +893,14 @@ class SongMetadataEditor(
tag.setField(FieldKey.TITLE, newTitle)
tag.setField(FieldKey.ARTIST, newArtist)
tag.setField(FieldKey.ALBUM, newAlbum)
- tag.setField(FieldKey.ALBUM_ARTIST, newArtist)
+ if (!newAlbumArtist.isNullOrBlank()) {
+ tag.setField(FieldKey.ALBUM_ARTIST, newAlbumArtist)
+ }
+ if (!newComposer.isNullOrBlank()) {
+ tag.setField(FieldKey.COMPOSER, newComposer)
+ } else {
+ tag.deleteField(FieldKey.COMPOSER)
+ }
if (newGenre.isNotBlank()) {
tag.setField(FieldKey.GENRE, newGenre)
@@ -937,6 +968,8 @@ class SongMetadataEditor(
newTitle: String,
newArtist: String,
newAlbum: String,
+ newAlbumArtist: String?,
+ newComposer: String?,
newGenre: String,
newLyrics: String,
newTrackNumber: Int,
@@ -967,7 +1000,8 @@ class SongMetadataEditor(
tags.replaceSingleComment("TITLE", newTitle)
tags.replaceSingleComment("ARTIST", newArtist)
- tags.replaceSingleComment("ALBUMARTIST", newArtist)
+ tags.replaceSingleComment("ALBUMARTIST", newAlbumArtist?.takeIf { it.isNotBlank() })
+ tags.replaceSingleComment("COMPOSER", newComposer)
tags.replaceSingleComment("ALBUM", newAlbum)
tags.replaceSingleComment("GENRE", newGenre)
tags.replaceSingleComment("LYRICS", newLyrics)
@@ -1039,6 +1073,7 @@ class SongMetadataEditor(
title: String,
artist: String,
album: String,
+ albumArtist: String?,
genre: String,
trackNumber: Int,
discNumber: Int?
@@ -1054,7 +1089,9 @@ class SongMetadataEditor(
val encodedTrack = ((discNumber ?: 0) * 1000) + trackNumber
put(MediaStore.Audio.Media.TRACK, encodedTrack)
put(MediaStore.Audio.Media.DATE_MODIFIED, System.currentTimeMillis() / 1000)
- put(MediaStore.Audio.Media.ALBUM_ARTIST, artist)
+ if (!albumArtist.isNullOrBlank()) {
+ put(MediaStore.Audio.Media.ALBUM_ARTIST, albumArtist)
+ }
}
val rowsUpdated = context.contentResolver.update(uri, values, null, null)
diff --git a/app/src/main/java/com/theveloper/pixelplay/presentation/components/DailyMixSection.kt b/app/src/main/java/com/theveloper/pixelplay/presentation/components/DailyMixSection.kt
index b4e02c367..4f64571cd 100644
--- a/app/src/main/java/com/theveloper/pixelplay/presentation/components/DailyMixSection.kt
+++ b/app/src/main/java/com/theveloper/pixelplay/presentation/components/DailyMixSection.kt
@@ -145,12 +145,14 @@ fun DailyMixSection(
onNavigateToGenre(song)
showSongInfoSheet = false
},
- onEditSong = { newTitle, newArtist, newAlbum, newGenre, newLyrics, newTrackNumber, newDiscNumber, replayGainTrackGainDb, replayGainAlbumGainDb, coverArtUpdate ->
+ onEditSong = { newTitle, newArtist, newAlbum, newAlbumArtist, newComposer, newGenre, newLyrics, newTrackNumber, newDiscNumber, replayGainTrackGainDb, replayGainAlbumGainDb, coverArtUpdate ->
playerViewModel.editSongMetadata(
song,
newTitle,
newArtist,
newAlbum,
+ newAlbumArtist,
+ newComposer,
newGenre,
newLyrics,
newTrackNumber,
diff --git a/app/src/main/java/com/theveloper/pixelplay/presentation/components/EditSongSheet.kt b/app/src/main/java/com/theveloper/pixelplay/presentation/components/EditSongSheet.kt
index 8dc780496..5f52efe43 100644
--- a/app/src/main/java/com/theveloper/pixelplay/presentation/components/EditSongSheet.kt
+++ b/app/src/main/java/com/theveloper/pixelplay/presentation/components/EditSongSheet.kt
@@ -104,6 +104,8 @@ fun EditSongSheet(
title: String,
artist: String,
album: String,
+ albumArtist: String,
+ composer: String,
genre: String,
lyrics: String,
trackNumber: Int,
@@ -148,6 +150,8 @@ private fun EditSongContent(
title: String,
artist: String,
album: String,
+ albumArtist: String,
+ composer: String,
genre: String,
lyrics: String,
trackNumber: Int,
@@ -160,6 +164,8 @@ private fun EditSongContent(
var title by remember { mutableStateOf(song.title) }
var artist by remember { mutableStateOf(song.displayArtist) }
var album by remember { mutableStateOf(song.album) }
+ var albumArtist by remember { mutableStateOf(song.albumArtist ?: "") }
+ var composer by remember { mutableStateOf("") }
var genre by remember { mutableStateOf(song.genre ?: "") }
var lyrics by remember { mutableStateOf(song.lyrics ?: "") }
var trackNumber by remember { mutableStateOf(song.trackNumber.toString()) }
@@ -185,6 +191,8 @@ private fun EditSongContent(
title = song.title
artist = song.displayArtist
album = song.album
+ albumArtist = song.albumArtist ?: ""
+ composer = ""
genre = song.genre ?: ""
lyrics = song.lyrics ?: ""
trackNumber = song.trackNumber.toString()
@@ -216,6 +224,7 @@ private fun EditSongContent(
}
}
+ embeddedMetadata?.composer?.takeIf { it.isNotBlank() }?.let { composer = it }
replayGainTrackGainDb = formatReplayGainForInput(embeddedMetadata?.replayGainTrackGainDb)
replayGainAlbumGainDb = formatReplayGainForInput(embeddedMetadata?.replayGainAlbumGainDb)
}
@@ -350,9 +359,7 @@ private fun EditSongContent(
// --- Campo de Título ---
item {
- Column(
- verticalArrangement = Arrangement.spacedBy(4.dp)
- ) {
+ Column(verticalArrangement = Arrangement.spacedBy(4.dp)) {
Text(
modifier = Modifier.padding(start = 4.dp),
text = stringResource(R.string.song_field_title),
@@ -365,17 +372,126 @@ private fun EditSongContent(
colors = textFieldColors,
onValueChange = { title = it },
placeholder = { Text(stringResource(R.string.song_field_title)) },
- leadingIcon = { Icon(Icons.Rounded.MusicNote, tint = MaterialTheme.colorScheme.tertiary,contentDescription = stringResource(R.string.cd_song_title_icon)) },
+ leadingIcon = { Icon(Icons.Rounded.MusicNote, tint = MaterialTheme.colorScheme.tertiary, contentDescription = stringResource(R.string.cd_song_title_icon)) },
modifier = Modifier.fillMaxWidth(),
singleLine = true
)
}
}
+ // --- Campo de Artista ---
item {
- Column(
- verticalArrangement = Arrangement.spacedBy(4.dp)
- ) {
+ Column(verticalArrangement = Arrangement.spacedBy(4.dp)) {
+ Text(
+ modifier = Modifier.padding(start = 4.dp),
+ text = stringResource(R.string.song_field_artist),
+ color = MaterialTheme.colorScheme.primary,
+ style = MaterialTheme.typography.labelLarge
+ )
+ OutlinedTextField(
+ value = artist,
+ colors = textFieldColors,
+ shape = textFieldShape,
+ onValueChange = { artist = it },
+ placeholder = { Text(stringResource(R.string.song_field_artist)) },
+ leadingIcon = { Icon(Icons.Rounded.Person, tint = MaterialTheme.colorScheme.primary, contentDescription = stringResource(R.string.song_field_artist)) },
+ modifier = Modifier.fillMaxWidth(),
+ singleLine = true
+ )
+ }
+ }
+
+ // --- Campo de Álbum ---
+ item {
+ Column(verticalArrangement = Arrangement.spacedBy(4.dp)) {
+ Text(
+ modifier = Modifier.padding(start = 4.dp),
+ text = stringResource(R.string.song_field_album),
+ color = MaterialTheme.colorScheme.tertiary,
+ style = MaterialTheme.typography.labelLarge
+ )
+ OutlinedTextField(
+ value = album,
+ colors = textFieldColors,
+ shape = textFieldShape,
+ onValueChange = { album = it },
+ placeholder = { Text(stringResource(R.string.song_field_album)) },
+ leadingIcon = { Icon(Icons.Rounded.Album, tint = MaterialTheme.colorScheme.tertiary, contentDescription = stringResource(R.string.song_field_album)) },
+ modifier = Modifier.fillMaxWidth(),
+ singleLine = true
+ )
+ }
+ }
+
+ // --- Campo de Album Artist ---
+ item {
+ Column(verticalArrangement = Arrangement.spacedBy(4.dp)) {
+ Text(
+ modifier = Modifier.padding(start = 4.dp),
+ text = stringResource(R.string.song_field_album_artist),
+ color = MaterialTheme.colorScheme.secondary,
+ style = MaterialTheme.typography.labelLarge
+ )
+ OutlinedTextField(
+ value = albumArtist,
+ colors = textFieldColors,
+ shape = textFieldShape,
+ onValueChange = { albumArtist = it },
+ placeholder = { Text(stringResource(R.string.song_field_album_artist)) },
+ leadingIcon = { Icon(Icons.Rounded.Person, tint = MaterialTheme.colorScheme.secondary, contentDescription = stringResource(R.string.song_field_album_artist)) },
+ modifier = Modifier.fillMaxWidth(),
+ singleLine = true
+ )
+ }
+ }
+
+ // --- Campo de Género ---
+ item {
+ Column(verticalArrangement = Arrangement.spacedBy(4.dp)) {
+ Text(
+ modifier = Modifier.padding(start = 4.dp),
+ text = stringResource(R.string.song_field_genre),
+ color = MaterialTheme.colorScheme.secondary,
+ style = MaterialTheme.typography.labelLarge
+ )
+ OutlinedTextField(
+ value = genre,
+ colors = textFieldColors,
+ shape = textFieldShape,
+ onValueChange = { genre = it },
+ placeholder = { Text(stringResource(R.string.song_field_genre)) },
+ leadingIcon = { Icon(Icons.Rounded.Category, tint = MaterialTheme.colorScheme.secondary, contentDescription = stringResource(R.string.song_field_genre)) },
+ modifier = Modifier.fillMaxWidth(),
+ singleLine = true
+ )
+ }
+ }
+
+ // --- Campo de Compositor ---
+ item {
+ Column(verticalArrangement = Arrangement.spacedBy(4.dp)) {
+ Text(
+ modifier = Modifier.padding(start = 4.dp),
+ text = stringResource(R.string.song_field_composer),
+ color = MaterialTheme.colorScheme.tertiary,
+ style = MaterialTheme.typography.labelLarge
+ )
+ OutlinedTextField(
+ value = composer,
+ colors = textFieldColors,
+ shape = textFieldShape,
+ onValueChange = { composer = it },
+ placeholder = { Text(stringResource(R.string.song_field_composer)) },
+ leadingIcon = { Icon(Icons.Rounded.MusicNote, tint = MaterialTheme.colorScheme.tertiary, contentDescription = stringResource(R.string.song_field_composer)) },
+ modifier = Modifier.fillMaxWidth(),
+ singleLine = true
+ )
+ }
+ }
+
+ // --- Campo de Track Number ---
+ item {
+ Column(verticalArrangement = Arrangement.spacedBy(4.dp)) {
Text(
modifier = Modifier.padding(start = 4.dp),
text = stringResource(R.string.song_field_track_number),
@@ -396,10 +512,9 @@ private fun EditSongContent(
}
}
+ // --- Campo de Disc Number ---
item {
- Column(
- verticalArrangement = Arrangement.spacedBy(4.dp)
- ) {
+ Column(verticalArrangement = Arrangement.spacedBy(4.dp)) {
Text(
modifier = Modifier.padding(start = 4.dp),
text = stringResource(R.string.song_field_disc_number),
@@ -420,10 +535,9 @@ private fun EditSongContent(
}
}
+ // --- Campo de ReplayGain Track ---
item {
- Column(
- verticalArrangement = Arrangement.spacedBy(4.dp)
- ) {
+ Column(verticalArrangement = Arrangement.spacedBy(4.dp)) {
Text(
modifier = Modifier.padding(start = 4.dp),
text = stringResource(R.string.song_field_replaygain_track_db),
@@ -450,10 +564,9 @@ private fun EditSongContent(
}
}
+ // --- Campo de ReplayGain Album ---
item {
- Column(
- verticalArrangement = Arrangement.spacedBy(4.dp)
- ) {
+ Column(verticalArrangement = Arrangement.spacedBy(4.dp)) {
Text(
modifier = Modifier.padding(start = 4.dp),
text = stringResource(R.string.song_field_replaygain_album_db),
@@ -480,83 +593,9 @@ private fun EditSongContent(
}
}
- // --- Campo de Artista ---
- item {
- Column(
- verticalArrangement = Arrangement.spacedBy(4.dp)
- ) {
- Text(
- modifier = Modifier.padding(start = 4.dp),
- text = stringResource(R.string.song_field_artist),
- color = MaterialTheme.colorScheme.primary,
- style = MaterialTheme.typography.labelLarge
- )
- OutlinedTextField(
- value = artist,
- colors = textFieldColors,
- shape = textFieldShape,
- onValueChange = { artist = it },
- placeholder = { Text(stringResource(R.string.song_field_artist)) },
- leadingIcon = { Icon(Icons.Rounded.Person, tint = MaterialTheme.colorScheme.primary, contentDescription = stringResource(R.string.song_field_artist)) },
- modifier = Modifier.fillMaxWidth(),
- singleLine = true
- )
- }
- }
-
- // --- Campo de Álbum ---
- item {
- Column(
- verticalArrangement = Arrangement.spacedBy(4.dp)
- ) {
- Text(
- modifier = Modifier.padding(start = 4.dp),
- text = stringResource(R.string.song_field_album),
- color = MaterialTheme.colorScheme.tertiary,
- style = MaterialTheme.typography.labelLarge
- )
- OutlinedTextField(
- value = album,
- colors = textFieldColors,
- shape = textFieldShape,
- onValueChange = { album = it },
- placeholder = { Text(stringResource(R.string.song_field_album)) },
- leadingIcon = { Icon(Icons.Rounded.Album, tint = MaterialTheme.colorScheme.tertiary, contentDescription = stringResource(R.string.song_field_album)) },
- modifier = Modifier.fillMaxWidth(),
- singleLine = true
- )
- }
- }
-
- // --- Campo de Género ---
- item {
- Column(
- verticalArrangement = Arrangement.spacedBy(4.dp)
- ) {
- Text(
- modifier = Modifier.padding(start = 4.dp),
- text = stringResource(R.string.song_field_genre),
- color = MaterialTheme.colorScheme.secondary,
- style = MaterialTheme.typography.labelLarge
- )
- OutlinedTextField(
- value = genre,
- colors = textFieldColors,
- shape = textFieldShape,
- onValueChange = { genre = it },
- placeholder = { Text(stringResource(R.string.song_field_genre)) },
- leadingIcon = { Icon(Icons.Rounded.Category, tint = MaterialTheme.colorScheme.secondary, contentDescription = stringResource(R.string.song_field_genre)) },
- modifier = Modifier.fillMaxWidth(),
- singleLine = true
- )
- }
- }
-
// --- Campo de Letra ---
item {
- Column(
- verticalArrangement = Arrangement.spacedBy(4.dp)
- ) {
+ Column(verticalArrangement = Arrangement.spacedBy(4.dp)) {
Text(
modifier = Modifier.padding(start = 4.dp),
text = stringResource(R.string.lyrics),
@@ -635,6 +674,8 @@ private fun EditSongContent(
title.trim(),
artist.trim(),
album.trim(),
+ albumArtist.trim(),
+ composer.trim(),
genre.trim(),
lyrics,
resolvedTrackNumber,
diff --git a/app/src/main/java/com/theveloper/pixelplay/presentation/components/SongInfoBottomSheet.kt b/app/src/main/java/com/theveloper/pixelplay/presentation/components/SongInfoBottomSheet.kt
index 6fcf9688d..d37ef46df 100644
--- a/app/src/main/java/com/theveloper/pixelplay/presentation/components/SongInfoBottomSheet.kt
+++ b/app/src/main/java/com/theveloper/pixelplay/presentation/components/SongInfoBottomSheet.kt
@@ -106,6 +106,8 @@ fun SongInfoBottomSheet(
title: String,
artist: String,
album: String,
+ albumArtist: String,
+ composer: String,
genre: String,
lyrics: String,
trackNumber: Int,
@@ -829,11 +831,13 @@ fun SongInfoBottomSheet(
visible = showEditSheet,
song = song,
onDismiss = { showEditSheet = false },
- onSave = { title, artist, album, genre, lyrics, trackNumber, discNumber, replayGainTrackGainDb, replayGainAlbumGainDb, coverArt ->
+ onSave = { title, artist, album, albumArtist, composer, genre, lyrics, trackNumber, discNumber, replayGainTrackGainDb, replayGainAlbumGainDb, coverArt ->
onEditSong(
title,
artist,
album,
+ albumArtist,
+ composer,
genre,
lyrics,
trackNumber,
diff --git a/app/src/main/java/com/theveloper/pixelplay/presentation/components/UnifiedPlayerOverlaysLayer.kt b/app/src/main/java/com/theveloper/pixelplay/presentation/components/UnifiedPlayerOverlaysLayer.kt
index e424146b7..8003bf378 100644
--- a/app/src/main/java/com/theveloper/pixelplay/presentation/components/UnifiedPlayerOverlaysLayer.kt
+++ b/app/src/main/java/com/theveloper/pixelplay/presentation/components/UnifiedPlayerOverlaysLayer.kt
@@ -219,12 +219,14 @@ internal fun UnifiedPlayerSongInfoLayer(
onNavigateToAlbum = { onNavigateToAlbum(liveSong) },
onNavigateToArtist = { onNavigateToArtist(liveSong) },
onNavigateToGenre = { onNavigateToGenre(liveSong) },
- onEditSong = { title, artist, album, genre, lyrics, trackNumber, discNumber, replayGainTrackGainDb, replayGainAlbumGainDb, coverArtUpdate ->
+ onEditSong = { title, artist, album, albumArtist, composer, genre, lyrics, trackNumber, discNumber, replayGainTrackGainDb, replayGainAlbumGainDb, coverArtUpdate ->
playerViewModel.editSongMetadata(
liveSong,
title,
artist,
album,
+ albumArtist,
+ composer,
genre,
lyrics,
trackNumber,
diff --git a/app/src/main/java/com/theveloper/pixelplay/presentation/screens/AlbumDetailScreen.kt b/app/src/main/java/com/theveloper/pixelplay/presentation/screens/AlbumDetailScreen.kt
index 1e0ad15a4..3fb80a1b8 100644
--- a/app/src/main/java/com/theveloper/pixelplay/presentation/screens/AlbumDetailScreen.kt
+++ b/app/src/main/java/com/theveloper/pixelplay/presentation/screens/AlbumDetailScreen.kt
@@ -463,12 +463,14 @@ fun AlbumDetailScreen(
}
showSongInfoBottomSheet = false
},
- onEditSong = { newTitle, newArtist, newAlbum, newGenre, newLyrics, newTrackNumber, newDiscNumber, replayGainTrackGainDb, replayGainAlbumGainDb, coverArtUpdate ->
+ onEditSong = { newTitle, newArtist, newAlbum, newAlbumArtist, newComposer, newGenre, newLyrics, newTrackNumber, newDiscNumber, replayGainTrackGainDb, replayGainAlbumGainDb, coverArtUpdate ->
playerViewModel.editSongMetadata(
currentSong,
newTitle,
newArtist,
newAlbum,
+ newAlbumArtist,
+ newComposer,
newGenre,
newLyrics,
newTrackNumber,
diff --git a/app/src/main/java/com/theveloper/pixelplay/presentation/screens/ArtistDetailScreen.kt b/app/src/main/java/com/theveloper/pixelplay/presentation/screens/ArtistDetailScreen.kt
index 5b7c18426..fea8bdf4f 100644
--- a/app/src/main/java/com/theveloper/pixelplay/presentation/screens/ArtistDetailScreen.kt
+++ b/app/src/main/java/com/theveloper/pixelplay/presentation/screens/ArtistDetailScreen.kt
@@ -518,12 +518,14 @@ fun ArtistDetailScreen(
}
showSongInfoBottomSheet = false
},
- onEditSong = { newTitle, newArtist, newAlbum, newGenre, newLyrics, newTrackNumber, newDiscNumber, replayGainTrackGainDb, replayGainAlbumGainDb, coverArtUpdate ->
+ onEditSong = { newTitle, newArtist, newAlbum, newAlbumArtist, newComposer, newGenre, newLyrics, newTrackNumber, newDiscNumber, replayGainTrackGainDb, replayGainAlbumGainDb, coverArtUpdate ->
playerViewModel.editSongMetadata(
currentSong,
newTitle,
newArtist,
newAlbum,
+ newAlbumArtist,
+ newComposer,
newGenre,
newLyrics,
newTrackNumber,
diff --git a/app/src/main/java/com/theveloper/pixelplay/presentation/screens/DailyMixScreen.kt b/app/src/main/java/com/theveloper/pixelplay/presentation/screens/DailyMixScreen.kt
index c90691d2d..5e03f655b 100644
--- a/app/src/main/java/com/theveloper/pixelplay/presentation/screens/DailyMixScreen.kt
+++ b/app/src/main/java/com/theveloper/pixelplay/presentation/screens/DailyMixScreen.kt
@@ -217,12 +217,14 @@ fun DailyMixScreen(
}
showSongInfoSheet = false
},
- onEditSong = { newTitle, newArtist, newAlbum, newGenre, newLyrics, newTrackNumber, newDiscNumber, replayGainTrackGainDb, replayGainAlbumGainDb, coverArtUpdate ->
+ onEditSong = { newTitle, newArtist, newAlbum, newAlbumArtist, newComposer, newGenre, newLyrics, newTrackNumber, newDiscNumber, replayGainTrackGainDb, replayGainAlbumGainDb, coverArtUpdate ->
playerViewModel.editSongMetadata(
song,
newTitle,
newArtist,
newAlbum,
+ newAlbumArtist,
+ newComposer,
newGenre,
newLyrics,
newTrackNumber,
diff --git a/app/src/main/java/com/theveloper/pixelplay/presentation/screens/GenreDetailScreen.kt b/app/src/main/java/com/theveloper/pixelplay/presentation/screens/GenreDetailScreen.kt
index a8a625055..94a18251a 100644
--- a/app/src/main/java/com/theveloper/pixelplay/presentation/screens/GenreDetailScreen.kt
+++ b/app/src/main/java/com/theveloper/pixelplay/presentation/screens/GenreDetailScreen.kt
@@ -528,12 +528,14 @@ fun GenreDetailScreen(
}
showSongOptionsSheet = null
},
- onEditSong = { newTitle, newArtist, newAlbum, newGenre, newLyrics, newTrackNumber, newDiscNumber, replayGainTrackGainDb, replayGainAlbumGainDb, coverArtUpdate ->
+ onEditSong = { newTitle, newArtist, newAlbum, newAlbumArtist, newComposer, newGenre, newLyrics, newTrackNumber, newDiscNumber, replayGainTrackGainDb, replayGainAlbumGainDb, coverArtUpdate ->
playerViewModel.editSongMetadata(
song,
newTitle,
newArtist,
newAlbum,
+ newAlbumArtist,
+ newComposer,
newGenre,
newLyrics,
newTrackNumber,
diff --git a/app/src/main/java/com/theveloper/pixelplay/presentation/screens/LibraryScreen.kt b/app/src/main/java/com/theveloper/pixelplay/presentation/screens/LibraryScreen.kt
index 00e308e81..425c81cd1 100644
--- a/app/src/main/java/com/theveloper/pixelplay/presentation/screens/LibraryScreen.kt
+++ b/app/src/main/java/com/theveloper/pixelplay/presentation/screens/LibraryScreen.kt
@@ -1906,12 +1906,14 @@ fun LibraryScreen(
}
showSongInfoBottomSheet = false
},
- onEditSong = { newTitle, newArtist, newAlbum, newGenre, newLyrics, newTrackNumber, newDiscNumber, replayGainTrackGainDb, replayGainAlbumGainDb, coverArtUpdate ->
+ onEditSong = { newTitle, newArtist, newAlbum, newAlbumArtist, newComposer, newGenre, newLyrics, newTrackNumber, newDiscNumber, replayGainTrackGainDb, replayGainAlbumGainDb, coverArtUpdate ->
playerViewModel.editSongMetadata(
currentSong,
newTitle,
newArtist,
newAlbum,
+ newAlbumArtist,
+ newComposer,
newGenre,
newLyrics,
newTrackNumber,
diff --git a/app/src/main/java/com/theveloper/pixelplay/presentation/screens/PlaylistDetailScreen.kt b/app/src/main/java/com/theveloper/pixelplay/presentation/screens/PlaylistDetailScreen.kt
index d90bd324f..778440c30 100644
--- a/app/src/main/java/com/theveloper/pixelplay/presentation/screens/PlaylistDetailScreen.kt
+++ b/app/src/main/java/com/theveloper/pixelplay/presentation/screens/PlaylistDetailScreen.kt
@@ -903,12 +903,14 @@ fun PlaylistDetailScreen(
}
showSongInfoBottomSheet = false
},
- onEditSong = { newTitle, newArtist, newAlbum, newGenre, newLyrics, newTrackNumber, newDiscNumber, replayGainTrackGainDb, replayGainAlbumGainDb, coverArtUpdate ->
+ onEditSong = { newTitle, newArtist, newAlbum, newAlbumArtist, newComposer, newGenre, newLyrics, newTrackNumber, newDiscNumber, replayGainTrackGainDb, replayGainAlbumGainDb, coverArtUpdate ->
playerViewModel.editSongMetadata(
currentSong,
newTitle,
newArtist,
newAlbum,
+ newAlbumArtist,
+ newComposer,
newGenre,
newLyrics,
newTrackNumber,
diff --git a/app/src/main/java/com/theveloper/pixelplay/presentation/screens/RecentlyPlayedScreen.kt b/app/src/main/java/com/theveloper/pixelplay/presentation/screens/RecentlyPlayedScreen.kt
index 2b9431db3..11cea315f 100644
--- a/app/src/main/java/com/theveloper/pixelplay/presentation/screens/RecentlyPlayedScreen.kt
+++ b/app/src/main/java/com/theveloper/pixelplay/presentation/screens/RecentlyPlayedScreen.kt
@@ -318,12 +318,14 @@ fun RecentlyPlayedScreen(
}
showSongInfoBottomSheet = false
},
- onEditSong = { newTitle, newArtist, newAlbum, newGenre, newLyrics, newTrackNumber, newDiscNumber, replayGainTrackGainDb, replayGainAlbumGainDb, coverArtUpdate ->
+ onEditSong = { newTitle, newArtist, newAlbum, newAlbumArtist, newComposer, newGenre, newLyrics, newTrackNumber, newDiscNumber, replayGainTrackGainDb, replayGainAlbumGainDb, coverArtUpdate ->
playerViewModel.editSongMetadata(
song,
newTitle,
newArtist,
newAlbum,
+ newAlbumArtist,
+ newComposer,
newGenre,
newLyrics,
newTrackNumber,
diff --git a/app/src/main/java/com/theveloper/pixelplay/presentation/screens/SearchScreen.kt b/app/src/main/java/com/theveloper/pixelplay/presentation/screens/SearchScreen.kt
index f83086007..13ca51f23 100644
--- a/app/src/main/java/com/theveloper/pixelplay/presentation/screens/SearchScreen.kt
+++ b/app/src/main/java/com/theveloper/pixelplay/presentation/screens/SearchScreen.kt
@@ -494,12 +494,14 @@ fun SearchScreen(
}
showSongInfoBottomSheet = false
},
- onEditSong = { newTitle, newArtist, newAlbum, newGenre, newLyrics, newTrackNumber, newDiscNumber, replayGainTrackGainDb, replayGainAlbumGainDb, coverArtUpdate ->
+ onEditSong = { newTitle, newArtist, newAlbum, newAlbumArtist, newComposer, newGenre, newLyrics, newTrackNumber, newDiscNumber, replayGainTrackGainDb, replayGainAlbumGainDb, coverArtUpdate ->
playerViewModel.editSongMetadata(
currentSong,
newTitle,
newArtist,
newAlbum,
+ newAlbumArtist,
+ newComposer,
newGenre,
newLyrics,
newTrackNumber,
diff --git a/app/src/main/java/com/theveloper/pixelplay/presentation/viewmodel/MetadataEditStateHolder.kt b/app/src/main/java/com/theveloper/pixelplay/presentation/viewmodel/MetadataEditStateHolder.kt
index c704a3eaf..dc46aad73 100644
--- a/app/src/main/java/com/theveloper/pixelplay/presentation/viewmodel/MetadataEditStateHolder.kt
+++ b/app/src/main/java/com/theveloper/pixelplay/presentation/viewmodel/MetadataEditStateHolder.kt
@@ -57,6 +57,8 @@ class MetadataEditStateHolder @Inject constructor(
newTitle: String,
newArtist: String,
newAlbum: String,
+ newAlbumArtist: String,
+ newComposer: String,
newGenre: String,
newLyrics: String,
newTrackNumber: Int,
@@ -110,6 +112,8 @@ class MetadataEditStateHolder @Inject constructor(
newTitle = newTitle,
newArtist = newArtist,
newAlbum = newAlbum,
+ newAlbumArtist = newAlbumArtist.trim().takeIf { it.isNotBlank() },
+ newComposer = newComposer.trim().takeIf { it.isNotBlank() },
newGenre = newGenre,
newLyrics = trimmedLyrics,
newTrackNumber = newTrackNumber,
@@ -140,6 +144,7 @@ class MetadataEditStateHolder @Inject constructor(
title = newTitle,
artist = newArtist,
album = newAlbum,
+ albumArtist = newAlbumArtist.trim().takeIf { it.isNotBlank() },
genre = newGenre,
lyrics = normalizedLyrics,
trackNumber = newTrackNumber,
diff --git a/app/src/main/java/com/theveloper/pixelplay/presentation/viewmodel/PlayerViewModel.kt b/app/src/main/java/com/theveloper/pixelplay/presentation/viewmodel/PlayerViewModel.kt
index 21c852174..516d37f17 100644
--- a/app/src/main/java/com/theveloper/pixelplay/presentation/viewmodel/PlayerViewModel.kt
+++ b/app/src/main/java/com/theveloper/pixelplay/presentation/viewmodel/PlayerViewModel.kt
@@ -189,6 +189,8 @@ private data class PendingMetadataEdit(
val title: String,
val artist: String,
val album: String,
+ val albumArtist: String,
+ val composer: String,
val genre: String,
val lyrics: String,
val trackNumber: Int,
@@ -4530,6 +4532,8 @@ class PlayerViewModel @Inject constructor(
newTitle: String,
newArtist: String,
newAlbum: String,
+ newAlbumArtist: String,
+ newComposer: String,
newGenre: String,
newLyrics: String,
newTrackNumber: Int,
@@ -4553,6 +4557,8 @@ class PlayerViewModel @Inject constructor(
title = newTitle,
artist = newArtist,
album = newAlbum,
+ albumArtist = newAlbumArtist,
+ composer = newComposer,
genre = newGenre,
lyrics = newLyrics,
trackNumber = newTrackNumber,
@@ -4566,7 +4572,7 @@ class PlayerViewModel @Inject constructor(
}
}
- performMetadataEdit(song, newTitle, newArtist, newAlbum, newGenre, newLyrics,
+ performMetadataEdit(song, newTitle, newArtist, newAlbum, newAlbumArtist, newComposer, newGenre, newLyrics,
newTrackNumber, newDiscNumber, newReplayGainTrackGainDb, newReplayGainAlbumGainDb, coverArtUpdate)
}
}
@@ -4613,7 +4619,8 @@ class PlayerViewModel @Inject constructor(
viewModelScope.launch {
performMetadataEdit(
pending.song, pending.title, pending.artist, pending.album,
- pending.genre, pending.lyrics, pending.trackNumber, pending.discNumber,
+ pending.albumArtist, pending.composer, pending.genre, pending.lyrics,
+ pending.trackNumber, pending.discNumber,
pending.replayGainTrackGainDb, pending.replayGainAlbumGainDb, pending.coverArtUpdate
)
}
@@ -4671,6 +4678,8 @@ class PlayerViewModel @Inject constructor(
newTitle: String,
newArtist: String,
newAlbum: String,
+ newAlbumArtist: String,
+ newComposer: String,
newGenre: String,
newLyrics: String,
newTrackNumber: Int,
@@ -4686,6 +4695,8 @@ class PlayerViewModel @Inject constructor(
newTitle = newTitle,
newArtist = newArtist,
newAlbum = newAlbum,
+ newAlbumArtist = newAlbumArtist,
+ newComposer = newComposer,
newGenre = newGenre,
newLyrics = newLyrics,
newTrackNumber = newTrackNumber,
@@ -4973,6 +4984,8 @@ class PlayerViewModel @Inject constructor(
newTitle = sourceSong.title,
newArtist = sourceSong.artist,
newAlbum = sourceSong.album,
+ newAlbumArtist = sourceSong.albumArtist ?: "",
+ newComposer = "",
newGenre = newGenre,
newLyrics = sourceSong.lyrics ?: "",
newTrackNumber = sourceSong.trackNumber,
diff --git a/app/src/main/res/values/strings_components.xml b/app/src/main/res/values/strings_components.xml
index 987a84433..898e50583 100644
--- a/app/src/main/res/values/strings_components.xml
+++ b/app/src/main/res/values/strings_components.xml
@@ -50,7 +50,9 @@
Title
Artist
Album
+ Album artist
Genre
+ Composer
Try again
Apply changes