From 8b61396b0f03049289f6cc592dd1a161827fce11 Mon Sep 17 00:00:00 2001 From: Pascal Grittmann Date: Fri, 30 Jan 2026 05:22:09 +0100 Subject: [PATCH] Fix missing Replay Gain metadata from .m4a files (#396) fix missing replay gain metadata from .m4a files --- .../tempo/util/ReplayGainUtil.java | 25 ++++++++++++------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/com/cappielloantonio/tempo/util/ReplayGainUtil.java b/app/src/main/java/com/cappielloantonio/tempo/util/ReplayGainUtil.java index 48d727ee..b401b1c4 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/util/ReplayGainUtil.java +++ b/app/src/main/java/com/cappielloantonio/tempo/util/ReplayGainUtil.java @@ -7,6 +7,7 @@ import androidx.media3.common.Metadata; import androidx.media3.common.Tracks; import androidx.media3.common.util.UnstableApi; import androidx.media3.common.Player; +import androidx.media3.extractor.metadata.id3.InternalFrame; import com.cappielloantonio.tempo.model.ReplayGain; @@ -82,26 +83,32 @@ public class ReplayGainUtil { private static ReplayGain setReplayGains(Metadata.Entry entry) { ReplayGain replayGain = new ReplayGain(); - if (entry.toString().contains(tags[0])) { - replayGain.setTrackGain(parseReplayGainTag(entry)); + // The logic below assumes .toString() contains the dB value. That's not the case for InternalFrame + String str = entry.toString(); + if (entry instanceof InternalFrame) { + str = ((InternalFrame) entry).description + ((InternalFrame) entry).text; } - if (entry.toString().contains(tags[1])) { - replayGain.setAlbumGain(parseReplayGainTag(entry)); + if (str.contains(tags[0])) { + replayGain.setTrackGain(parseReplayGainTag(str)); } - if (entry.toString().contains(tags[2])) { - replayGain.setTrackGain(parseReplayGainTag(entry) / 256f); + if (str.contains(tags[1])) { + replayGain.setAlbumGain(parseReplayGainTag(str)); } - if (entry.toString().contains(tags[3])) { - replayGain.setAlbumGain(parseReplayGainTag(entry) / 256f); + if (str.contains(tags[2])) { + replayGain.setTrackGain(parseReplayGainTag(str) / 256f); + } + + if (str.contains(tags[3])) { + replayGain.setAlbumGain(parseReplayGainTag(str) / 256f); } return replayGain; } - private static Float parseReplayGainTag(Metadata.Entry entry) { + private static Float parseReplayGainTag(String entry) { try { return Float.parseFloat(entry.toString().replaceAll("[^\\d.-]", "")); } catch (NumberFormatException exception) {