From c6ef43bd7c10a05a96d1982c567fc71c1d345fea Mon Sep 17 00:00:00 2001 From: Peter Aldous Date: Mon, 20 Nov 2023 18:35:15 -0700 Subject: [PATCH] added disc number to track number sorting --- .../13.json | 12 +++++++++--- .../musicplayer/extensions/MediaItem.kt | 6 ++++++ .../musicplayer/helpers/Constants.kt | 1 + .../musicplayer/helpers/RoomHelper.kt | 4 ++-- .../musicplayer/helpers/SimpleMediaScanner.kt | 7 +++++-- .../simplemobiletools/musicplayer/models/Track.kt | 9 ++++++++- 6 files changed, 31 insertions(+), 8 deletions(-) diff --git a/app/schemas/com.simplemobiletools.musicplayer.databases.SongsDatabase/13.json b/app/schemas/com.simplemobiletools.musicplayer.databases.SongsDatabase/13.json index 165594456..71fab07e9 100644 --- a/app/schemas/com.simplemobiletools.musicplayer.databases.SongsDatabase/13.json +++ b/app/schemas/com.simplemobiletools.musicplayer.databases.SongsDatabase/13.json @@ -2,11 +2,11 @@ "formatVersion": 1, "database": { "version": 13, - "identityHash": "c7cc50ecee4eade523754a064beb4aae", + "identityHash": "efd2d560367617e6674c425f5a1792ed", "entities": [ { "tableName": "tracks", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `media_store_id` INTEGER NOT NULL, `title` TEXT NOT NULL, `artist` TEXT NOT NULL, `path` TEXT NOT NULL, `duration` INTEGER NOT NULL, `album` TEXT NOT NULL, `genre` TEXT NOT NULL, `cover_art` TEXT NOT NULL, `playlist_id` INTEGER NOT NULL, `track_id` INTEGER NOT NULL, `folder_name` TEXT NOT NULL, `album_id` INTEGER NOT NULL, `artist_id` INTEGER NOT NULL, `genre_id` INTEGER NOT NULL, `year` INTEGER NOT NULL, `date_added` INTEGER NOT NULL, `order_in_playlist` INTEGER NOT NULL, `flags` INTEGER NOT NULL)", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `media_store_id` INTEGER NOT NULL, `title` TEXT NOT NULL, `artist` TEXT NOT NULL, `path` TEXT NOT NULL, `duration` INTEGER NOT NULL, `album` TEXT NOT NULL, `genre` TEXT NOT NULL, `cover_art` TEXT NOT NULL, `playlist_id` INTEGER NOT NULL, `track_id` INTEGER NOT NULL, `disc_id` INTEGER NOT NULL, `folder_name` TEXT NOT NULL, `album_id` INTEGER NOT NULL, `artist_id` INTEGER NOT NULL, `genre_id` INTEGER NOT NULL, `year` INTEGER NOT NULL, `date_added` INTEGER NOT NULL, `order_in_playlist` INTEGER NOT NULL, `flags` INTEGER NOT NULL)", "fields": [ { "fieldPath": "id", @@ -74,6 +74,12 @@ "affinity": "INTEGER", "notNull": true }, + { + "fieldPath": "discId", + "columnName": "disc_id", + "affinity": "INTEGER", + "notNull": true + }, { "fieldPath": "folderName", "columnName": "folder_name", @@ -395,7 +401,7 @@ "views": [], "setupQueries": [ "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", - "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'c7cc50ecee4eade523754a064beb4aae')" + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'efd2d560367617e6674c425f5a1792ed')" ] } } \ No newline at end of file diff --git a/app/src/main/kotlin/com/simplemobiletools/musicplayer/extensions/MediaItem.kt b/app/src/main/kotlin/com/simplemobiletools/musicplayer/extensions/MediaItem.kt index 19afab1c4..132f3ce22 100644 --- a/app/src/main/kotlin/com/simplemobiletools/musicplayer/extensions/MediaItem.kt +++ b/app/src/main/kotlin/com/simplemobiletools/musicplayer/extensions/MediaItem.kt @@ -12,6 +12,7 @@ import com.simplemobiletools.musicplayer.helpers.EXTRA_ARTIST import com.simplemobiletools.musicplayer.helpers.EXTRA_ARTIST_ID import com.simplemobiletools.musicplayer.helpers.EXTRA_COVER_ART import com.simplemobiletools.musicplayer.helpers.EXTRA_DATE_ADDED +import com.simplemobiletools.musicplayer.helpers.EXTRA_DISC_ID import com.simplemobiletools.musicplayer.helpers.EXTRA_DURATION import com.simplemobiletools.musicplayer.helpers.EXTRA_FLAGS import com.simplemobiletools.musicplayer.helpers.EXTRA_FOLDER_NAME @@ -37,6 +38,7 @@ fun buildMediaItem( mediaType: @MediaMetadata.MediaType Int, trackCnt: Int? = null, trackNumber: Int? = null, + discNumber: Int? = null, year: Int? = null, sourceUri: Uri? = null, artworkUri: Uri? = null, @@ -51,6 +53,7 @@ fun buildMediaItem( .setIsPlayable(mediaType == MediaMetadata.MEDIA_TYPE_MUSIC) .setTotalTrackCount(trackCnt) .setTrackNumber(trackNumber) + .setDiscNumber(discNumber) .setReleaseYear(year) .setMediaType(MediaMetadata.MEDIA_TYPE_MUSIC) .setArtworkUri(artworkUri) @@ -77,6 +80,7 @@ fun Track.toMediaItem(): MediaItem { genre = genre, mediaType = MediaMetadata.MEDIA_TYPE_MUSIC, trackNumber = trackId, + discNumber = discId, sourceUri = getUri(), artworkUri = coverArt.toUri(), track = this @@ -155,6 +159,7 @@ private fun createBundleFromTrack(track: Track) = bundleOf( EXTRA_COVER_ART to track.coverArt, EXTRA_PLAYLIST_ID to track.playListId, EXTRA_TRACK_ID to track.trackId, + EXTRA_DISC_ID to track.discId, EXTRA_FOLDER_NAME to track.folderName, EXTRA_ALBUM_ID to track.albumId, EXTRA_ARTIST_ID to track.artistId, @@ -178,6 +183,7 @@ private fun createTrackFromBundle(bundle: Bundle): Track { coverArt = bundle.getString(EXTRA_COVER_ART) ?: "", playListId = bundle.getInt(EXTRA_PLAYLIST_ID), trackId = bundle.getInt(EXTRA_TRACK_ID), + discId = bundle.getInt(EXTRA_DISC_ID), folderName = bundle.getString(EXTRA_FOLDER_NAME) ?: "", albumId = bundle.getLong(EXTRA_ALBUM_ID), artistId = bundle.getLong(EXTRA_ARTIST_ID), diff --git a/app/src/main/kotlin/com/simplemobiletools/musicplayer/helpers/Constants.kt b/app/src/main/kotlin/com/simplemobiletools/musicplayer/helpers/Constants.kt index e9a904467..40b6ede3e 100644 --- a/app/src/main/kotlin/com/simplemobiletools/musicplayer/helpers/Constants.kt +++ b/app/src/main/kotlin/com/simplemobiletools/musicplayer/helpers/Constants.kt @@ -34,6 +34,7 @@ const val EXTRA_GENRE = "genre" const val EXTRA_COVER_ART = "cover_art" const val EXTRA_PLAYLIST_ID = "playlist_id" const val EXTRA_TRACK_ID = "track_id" +const val EXTRA_DISC_ID = "disc_id" const val EXTRA_FOLDER_NAME = "folder_name" const val EXTRA_ALBUM_ID = "album_id" const val EXTRA_ARTIST_ID = "artist_id" diff --git a/app/src/main/kotlin/com/simplemobiletools/musicplayer/helpers/RoomHelper.kt b/app/src/main/kotlin/com/simplemobiletools/musicplayer/helpers/RoomHelper.kt index 5f0a7c46f..3490ba0bd 100644 --- a/app/src/main/kotlin/com/simplemobiletools/musicplayer/helpers/RoomHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/musicplayer/helpers/RoomHelper.kt @@ -93,7 +93,7 @@ class RoomHelper(val context: Context) { val song = Track( id = 0, mediaStoreId = mediaStoreId, title = title, artist = artist, path = path, duration = duration, album = album, genre = genre, - coverArt = coverArt, playListId = playlistId, trackId = 0, folderName = folderName, albumId = albumId, artistId = artistId, + coverArt = coverArt, playListId = playlistId, trackId = 0, discId = 0, folderName = folderName, albumId = albumId, artistId = artistId, genreId = genreId, year = year, dateAdded = dateAdded, orderInPlaylist = 0 ) song.title = song.getProperTitle(showFilename) @@ -114,7 +114,7 @@ class RoomHelper(val context: Context) { val song = Track( id = 0, mediaStoreId = 0, title = title, artist = artist, path = it, duration = context.getDuration(it) ?: 0, album = "", - genre = "", coverArt = "", playListId = playlistId, trackId = 0, folderName = "", albumId = 0, artistId = 0, genreId = 0, + genre = "", coverArt = "", playListId = playlistId, trackId = 0, discId = 0, folderName = "", albumId = 0, artistId = 0, genreId = 0, year = 0, dateAdded = dateAdded, orderInPlaylist = 0 ) song.title = song.getProperTitle(showFilename) diff --git a/app/src/main/kotlin/com/simplemobiletools/musicplayer/helpers/SimpleMediaScanner.kt b/app/src/main/kotlin/com/simplemobiletools/musicplayer/helpers/SimpleMediaScanner.kt index 2c10426a4..6daa159c8 100644 --- a/app/src/main/kotlin/com/simplemobiletools/musicplayer/helpers/SimpleMediaScanner.kt +++ b/app/src/main/kotlin/com/simplemobiletools/musicplayer/helpers/SimpleMediaScanner.kt @@ -232,6 +232,7 @@ class SimpleMediaScanner(private val context: Application) { val title = cursor.getStringValue(Audio.Media.TITLE) val duration = cursor.getIntValue(Audio.Media.DURATION) / 1000 val trackId = cursor.getIntValue(Audio.Media.TRACK) % 1000 + val discId = cursor.getIntValue(Audio.Media.DISC_NUMBER) % 1000 val path = cursor.getStringValue(Audio.Media.DATA).orEmpty() val artist = cursor.getStringValue(Audio.Media.ARTIST) ?: MediaStore.UNKNOWN_STRING val folderName = if (isQPlus()) { @@ -261,7 +262,7 @@ class SimpleMediaScanner(private val context: Application) { if (!title.isNullOrEmpty()) { val track = Track( id = 0, mediaStoreId = id, title = title, artist = artist, path = path, duration = duration, album = album, genre = genre, - coverArt = coverArt, playListId = 0, trackId = trackId, folderName = folderName, albumId = albumId, artistId = artistId, genreId = genreId, + coverArt = coverArt, playListId = 0, trackId = trackId, discId = discId, folderName = folderName, albumId = albumId, artistId = artistId, genreId = genreId, year = year, dateAdded = dateAdded, orderInPlaylist = 0 ) tracks.add(track) @@ -442,6 +443,8 @@ class SimpleMediaScanner(private val context: Application) { val album = retriever.extractMetadata(METADATA_KEY_ALBUM) ?: folderName val trackNumber = retriever.extractMetadata(METADATA_KEY_CD_TRACK_NUMBER) val trackId = trackNumber?.split("/")?.first()?.toIntOrNull() ?: 0 + val discNumber = retriever.extractMetadata((METADATA_KEY_DISC_NUMBER)) + val discId = discNumber?.split("/")?.first()?.toIntOrNull() ?: 0 val year = retriever.extractMetadata(METADATA_KEY_YEAR)?.toIntOrNull() ?: 0 val dateAdded = try { (File(path).lastModified() / 1000L).toInt() @@ -454,7 +457,7 @@ class SimpleMediaScanner(private val context: Application) { if (title.isNotEmpty()) { val track = Track( id = 0, mediaStoreId = 0, title = title, artist = artist, path = path, duration = duration, album = album, genre = genre, - coverArt = "", playListId = 0, trackId = trackId, folderName = folderName, albumId = 0, artistId = 0, genreId = 0, + coverArt = "", playListId = 0, trackId = trackId, discId = discId, folderName = folderName, albumId = 0, artistId = 0, genreId = 0, year = year, dateAdded = dateAdded, orderInPlaylist = 0, flags = FLAG_MANUAL_CACHE ) // use hashCode() as id for tracking purposes, there's a very slim chance of collision diff --git a/app/src/main/kotlin/com/simplemobiletools/musicplayer/models/Track.kt b/app/src/main/kotlin/com/simplemobiletools/musicplayer/models/Track.kt index 8be6e02c6..f1831ab58 100644 --- a/app/src/main/kotlin/com/simplemobiletools/musicplayer/models/Track.kt +++ b/app/src/main/kotlin/com/simplemobiletools/musicplayer/models/Track.kt @@ -31,6 +31,7 @@ data class Track( @ColumnInfo(name = "cover_art") val coverArt: String, @ColumnInfo(name = "playlist_id") var playListId: Int, @ColumnInfo(name = "track_id") val trackId: Int, // order id within the tracks' album + @ColumnInfo(name = "disc_id") val discId: Int, // disc within album (for multi-disc albums) @ColumnInfo(name = "folder_name") var folderName: String, @ColumnInfo(name = "album_id") var albumId: Long, @ColumnInfo(name = "artist_id") var artistId: Long, @@ -62,7 +63,13 @@ data class Track( } } - sorting and PLAYER_SORT_BY_TRACK_ID != 0 -> first.trackId.compareTo(second.trackId) + sorting and PLAYER_SORT_BY_TRACK_ID != 0 -> { + when (first.discId) { + second.discId -> first.trackId.compareTo(second.trackId) + else -> first.discId.compareTo(second.discId) + } + } + sorting and PLAYER_SORT_BY_DATE_ADDED != 0 -> first.dateAdded.compareTo(second.dateAdded) sorting and PLAYER_SORT_BY_CUSTOM != 0 -> first.orderInPlaylist.compareTo(second.orderInPlaylist) else -> first.duration.compareTo(second.duration)