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