From 181af686c2911648ff30b79c703704acf5f9ee59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jaime=20Garc=C3=ADa?= <55400857+jaime-grj@users.noreply.github.com> Date: Wed, 6 Aug 2025 01:49:30 +0200 Subject: [PATCH] feat: show sampling rate and bit depth if available --- .../tempo/database/AppDatabase.java | 4 +- .../tempo/model/Chronology.kt | 2 + .../com/cappielloantonio/tempo/model/Queue.kt | 2 + .../tempo/subsonic/models/Child.kt | 6 +++ .../tempo/ui/dialog/TrackInfoDialog.java | 2 + .../ui/fragment/PlayerControllerFragment.java | 15 +++++- .../tempo/util/MappingUtil.java | 2 + .../tempo/util/MusicUtil.java | 7 +++ app/src/main/res/layout/dialog_track_info.xml | 52 +++++++++++++++++++ app/src/main/res/values-es-rES/strings.xml | 2 + app/src/main/res/values/strings.xml | 2 + 11 files changed, 93 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/cappielloantonio/tempo/database/AppDatabase.java b/app/src/main/java/com/cappielloantonio/tempo/database/AppDatabase.java index ed37106b..b19e934f 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/database/AppDatabase.java +++ b/app/src/main/java/com/cappielloantonio/tempo/database/AppDatabase.java @@ -28,9 +28,9 @@ import com.cappielloantonio.tempo.subsonic.models.Playlist; @UnstableApi @Database( - version = 10, + version = 11, entities = {Queue.class, Server.class, RecentSearch.class, Download.class, Chronology.class, Favorite.class, SessionMediaItem.class, Playlist.class}, - autoMigrations = {@AutoMigration(from = 9, to = 10)} + autoMigrations = {@AutoMigration(from = 10, to = 11)} ) @TypeConverters({DateConverters.class}) public abstract class AppDatabase extends RoomDatabase { diff --git a/app/src/main/java/com/cappielloantonio/tempo/model/Chronology.kt b/app/src/main/java/com/cappielloantonio/tempo/model/Chronology.kt index c84781a3..18a77bfa 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/model/Chronology.kt +++ b/app/src/main/java/com/cappielloantonio/tempo/model/Chronology.kt @@ -37,6 +37,8 @@ class Chronology(@PrimaryKey override val id: String) : Child(id) { transcodedSuffix = mediaItem.mediaMetadata.extras!!.getString("transcodedSuffix") duration = mediaItem.mediaMetadata.extras!!.getInt("duration") bitrate = mediaItem.mediaMetadata.extras!!.getInt("bitrate") + samplingRate = mediaItem.mediaMetadata.extras!!.getInt("samplingRate") + bitDepth = mediaItem.mediaMetadata.extras!!.getInt("bitDepth") path = mediaItem.mediaMetadata.extras!!.getString("path") isVideo = mediaItem.mediaMetadata.extras!!.getBoolean("isVideo") userRating = mediaItem.mediaMetadata.extras!!.getInt("userRating") diff --git a/app/src/main/java/com/cappielloantonio/tempo/model/Queue.kt b/app/src/main/java/com/cappielloantonio/tempo/model/Queue.kt index a5f66ada..ca2300c2 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/model/Queue.kt +++ b/app/src/main/java/com/cappielloantonio/tempo/model/Queue.kt @@ -41,6 +41,8 @@ class Queue(override val id: String) : Child(id) { transcodedSuffix = child.transcodedSuffix duration = child.duration bitrate = child.bitrate + samplingRate = child.samplingRate + bitDepth = child.bitDepth path = child.path isVideo = child.isVideo userRating = child.userRating diff --git a/app/src/main/java/com/cappielloantonio/tempo/subsonic/models/Child.kt b/app/src/main/java/com/cappielloantonio/tempo/subsonic/models/Child.kt index 6299dfe2..15057cf7 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/subsonic/models/Child.kt +++ b/app/src/main/java/com/cappielloantonio/tempo/subsonic/models/Child.kt @@ -50,6 +50,12 @@ open class Child( @ColumnInfo("bitrate") @SerializedName("bitRate") var bitrate: Int? = null, + @ColumnInfo("sampling_rate") + @SerializedName("samplingRate") + var samplingRate: Int? = null, + @ColumnInfo("bit_depth") + @SerializedName("bitDepth") + var bitDepth: Int? = null, @ColumnInfo var path: String? = null, @ColumnInfo(name = "is_video") diff --git a/app/src/main/java/com/cappielloantonio/tempo/ui/dialog/TrackInfoDialog.java b/app/src/main/java/com/cappielloantonio/tempo/ui/dialog/TrackInfoDialog.java index ca9b6d20..84afcb6a 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/ui/dialog/TrackInfoDialog.java +++ b/app/src/main/java/com/cappielloantonio/tempo/ui/dialog/TrackInfoDialog.java @@ -72,6 +72,8 @@ public class TrackInfoDialog extends DialogFragment { bind.transcodedSuffixValueSector.setText(mediaMetadata.extras.getString("transcodedSuffix", getString(R.string.label_placeholder))); bind.durationValueSector.setText(MusicUtil.getReadableDurationString(mediaMetadata.extras.getInt("duration", 0), false)); bind.bitrateValueSector.setText(mediaMetadata.extras.getInt("bitrate", 0) + " kbps"); + bind.samplingRateValueSector.setText(mediaMetadata.extras.getInt("samplingRate", 0) != 0 ? mediaMetadata.extras.getInt("samplingRate", 0) + " Hz" : getString(R.string.label_placeholder)); + bind.bitDepthValueSector.setText(mediaMetadata.extras.getInt("bitDepth", 0) != 0 ? mediaMetadata.extras.getInt("bitDepth", 0) + " bits" : getString(R.string.label_placeholder)); bind.pathValueSector.setText(mediaMetadata.extras.getString("path", getString(R.string.label_placeholder))); bind.discNumberValueSector.setText(String.valueOf(mediaMetadata.extras.getInt("discNumber", 0))); } diff --git a/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/PlayerControllerFragment.java b/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/PlayerControllerFragment.java index d1daae9b..37cd9f10 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/PlayerControllerFragment.java +++ b/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/PlayerControllerFragment.java @@ -2,6 +2,7 @@ package com.cappielloantonio.tempo.ui.fragment; import android.content.ComponentName; import android.os.Bundle; +import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -40,6 +41,9 @@ import com.google.android.material.elevation.SurfaceColors; import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.MoreExecutors; +import java.text.DecimalFormat; +import java.util.ArrayList; +import java.util.List; import java.util.Objects; @UnstableApi @@ -190,14 +194,23 @@ public class PlayerControllerFragment extends Fragment { if (mediaMetadata.extras != null) { String extension = mediaMetadata.extras.getString("suffix", "Unknown format"); String bitrate = mediaMetadata.extras.getInt("bitrate", 0) != 0 ? mediaMetadata.extras.getInt("bitrate", 0) + "kbps" : "Original"; + String samplingRate = mediaMetadata.extras.getInt("samplingRate", 0) != 0 ? new DecimalFormat("0.#").format(mediaMetadata.extras.getInt("samplingRate", 0) / 1000.0) + "kHz" : ""; + String bitDepth = mediaMetadata.extras.getInt("bitDepth", 0) != 0 ? mediaMetadata.extras.getInt("bitDepth", 0) + "b" : ""; playerMediaExtension.setText(extension); if (bitrate.equals("Original")) { playerMediaBitrate.setVisibility(View.GONE); } else { + List mediaQualityItems = new ArrayList<>(); + + if (!bitrate.trim().isEmpty()) mediaQualityItems.add(bitrate); + if (!bitDepth.trim().isEmpty()) mediaQualityItems.add(bitDepth); + if (!samplingRate.trim().isEmpty()) mediaQualityItems.add(samplingRate); + + String mediaQuality = TextUtils.join(" • ", mediaQualityItems); playerMediaBitrate.setVisibility(View.VISIBLE); - playerMediaBitrate.setText(bitrate); + playerMediaBitrate.setText(mediaQuality); } } diff --git a/app/src/main/java/com/cappielloantonio/tempo/util/MappingUtil.java b/app/src/main/java/com/cappielloantonio/tempo/util/MappingUtil.java index be531eda..1b88774d 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/util/MappingUtil.java +++ b/app/src/main/java/com/cappielloantonio/tempo/util/MappingUtil.java @@ -54,6 +54,8 @@ public class MappingUtil { bundle.putString("transcodedSuffix", media.getTranscodedSuffix()); bundle.putInt("duration", media.getDuration() != null ? media.getDuration() : 0); bundle.putInt("bitrate", media.getBitrate() != null ? media.getBitrate() : 0); + bundle.putInt("samplingRate", media.getSamplingRate() != null ? media.getSamplingRate() : 0); + bundle.putInt("bitDepth", media.getBitDepth() != null ? media.getBitDepth() : 0); bundle.putString("path", media.getPath()); bundle.putBoolean("isVideo", media.isVideo()); bundle.putInt("userRating", media.getUserRating() != null ? media.getUserRating() : 0); diff --git a/app/src/main/java/com/cappielloantonio/tempo/util/MusicUtil.java b/app/src/main/java/com/cappielloantonio/tempo/util/MusicUtil.java index fddb4cce..696b5b9d 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/util/MusicUtil.java +++ b/app/src/main/java/com/cappielloantonio/tempo/util/MusicUtil.java @@ -15,6 +15,7 @@ import com.cappielloantonio.tempo.repository.DownloadRepository; import com.cappielloantonio.tempo.subsonic.models.Child; import java.text.CharacterIterator; +import java.text.DecimalFormat; import java.text.StringCharacterIterator; import java.util.ArrayList; import java.util.List; @@ -163,6 +164,12 @@ public class MusicUtil { " " + child.getBitrate() + "kbps" + + " • " + + (child.getBitDepth() != null && child.getBitDepth() != 0 + ? child.getBitDepth() + "/" + (child.getSamplingRate() != null ? child.getSamplingRate() / 1000 : "") + : (child.getSamplingRate() != null + ? new DecimalFormat("0.#").format(child.getSamplingRate() / 1000.0) + "kHz" + : "")) + " " + child.getSuffix(); } diff --git a/app/src/main/res/layout/dialog_track_info.xml b/app/src/main/res/layout/dialog_track_info.xml index ee6eb8b8..ae72877f 100644 --- a/app/src/main/res/layout/dialog_track_info.xml +++ b/app/src/main/res/layout/dialog_track_info.xml @@ -391,6 +391,58 @@ android:text="@string/label_placeholder" /> + + + + + + + + + + + + + + + + + + Interno Álbum Artista + Profundidad de bits Tasa de bits + Tasa de muestreo Tipo de contenido Aceptar Tipo de contenido en la transcodificación diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8ecb78af..a05234fb 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -395,6 +395,7 @@ https://buymeacoffee.com/a.cappiello Album Artist + Bit depth Bitrate Content Type OK @@ -403,6 +404,7 @@ Duration Genre Path + Sampling rate Size Suffix The file has been downloaded using the Subsonic APIs. The codec and bitrate of the file remain unchanged from the source file.