From 0af0d35a66d6a5627847950e5355bd042433c7a7 Mon Sep 17 00:00:00 2001 From: Adrian Ulrich Date: Sat, 26 Nov 2016 19:15:10 +0100 Subject: [PATCH] unify metadata extractor --- .../medialibrary/MediaMetadataExtractor.java | 7 +++- .../android/vanilla/FullPlaybackActivity.java | 40 +++++-------------- .../android/vanilla/MediaUtils.java | 26 +++++------- 3 files changed, 25 insertions(+), 48 deletions(-) diff --git a/src/ch/blinkenlights/android/medialibrary/MediaMetadataExtractor.java b/src/ch/blinkenlights/android/medialibrary/MediaMetadataExtractor.java index 6ca3b477..6e95fd72 100644 --- a/src/ch/blinkenlights/android/medialibrary/MediaMetadataExtractor.java +++ b/src/ch/blinkenlights/android/medialibrary/MediaMetadataExtractor.java @@ -33,6 +33,7 @@ public class MediaMetadataExtractor extends HashMap> { public final static String DISC_NUMBER = "DISC_NUMBER"; public final static String DURATION = "DURATION"; public final static String GENRE = "GENRE"; + public final static String MIME_TYPE = "MIME"; public final static String TRACK_COUNT = "TRACK_COUNT"; public final static String TRACK_NUMBER = "TRACK_NUM"; public final static String TITLE = "TITLE"; @@ -43,7 +44,7 @@ public class MediaMetadataExtractor extends HashMap> { * * @param path the path to scan */ - MediaMetadataExtractor(String path) { + public MediaMetadataExtractor(String path) { extractMetadata(path); } @@ -93,6 +94,10 @@ public class MediaMetadataExtractor extends HashMap> { bitrate.add(mediaTags.extractMetadata(MediaMetadataRetriever.METADATA_KEY_BITRATE)); this.put(BITRATE, bitrate); + ArrayList mime = new ArrayList(1); + mime.add(mediaTags.extractMetadata(MediaMetadataRetriever.METADATA_KEY_MIMETYPE)); + this.put(MIME_TYPE, mime); + // ...but we are using bastp for FLAC, OGG and OPUS as it handles them well // Everything else goes to the framework (such as pcm, m4a and mp3) diff --git a/src/ch/blinkenlights/android/vanilla/FullPlaybackActivity.java b/src/ch/blinkenlights/android/vanilla/FullPlaybackActivity.java index 63a55f88..152098bd 100644 --- a/src/ch/blinkenlights/android/vanilla/FullPlaybackActivity.java +++ b/src/ch/blinkenlights/android/vanilla/FullPlaybackActivity.java @@ -23,12 +23,13 @@ package ch.blinkenlights.android.vanilla; +import ch.blinkenlights.android.medialibrary.MediaMetadataExtractor; + import java.util.ArrayList; import android.content.Intent; import android.content.SharedPreferences; import android.graphics.Color; -import android.media.MediaMetadataRetriever; import android.os.Build; import android.os.Bundle; import android.os.Message; @@ -495,36 +496,17 @@ public class FullPlaybackActivity extends SlidingPlaybackActivity mReplayGain = null; if(song != null) { + MediaMetadataExtractor data = new MediaMetadataExtractor(song.path); - MediaMetadataRetriever data = new MediaMetadataRetriever(); - - try { - data.setDataSource(song.path); - } catch (Exception e) { - Log.w("VanillaMusic", "Failed to extract metadata from " + song.path); - } - - mGenre = data.extractMetadata(MediaMetadataRetriever.METADATA_KEY_GENRE); - mTrack = data.extractMetadata(MediaMetadataRetriever.METADATA_KEY_CD_TRACK_NUMBER); - String composer = data.extractMetadata(MediaMetadataRetriever.METADATA_KEY_COMPOSER); - if (composer == null) - composer = data.extractMetadata(MediaMetadataRetriever.METADATA_KEY_WRITER); - mComposer = composer; - - String year = data.extractMetadata(MediaMetadataRetriever.METADATA_KEY_YEAR); - if (year == null || "0".equals(year)) { - year = null; - } else { - int dash = year.indexOf('-'); - if (dash != -1) - year = year.substring(0, dash); - } - mYear = year; - + mGenre = data.getFirst(MediaMetadataExtractor.GENRE); + mTrack = data.getFirst(MediaMetadataExtractor.TRACK_NUMBER); + mComposer = data.getFirst(MediaMetadataExtractor.COMPOSER); + mYear = data.getFirst(MediaMetadataExtractor.YEAR); mPath = song.path; + StringBuilder sb = new StringBuilder(12); - sb.append(decodeMimeType(data.extractMetadata(MediaMetadataRetriever.METADATA_KEY_MIMETYPE))); - String bitrate = data.extractMetadata(MediaMetadataRetriever.METADATA_KEY_BITRATE); + sb.append(decodeMimeType(data.getFirst(MediaMetadataExtractor.MIME_TYPE))); + String bitrate = data.getFirst(MediaMetadataExtractor.BITRATE); if (bitrate != null && bitrate.length() > 3) { sb.append(' '); sb.append(bitrate.substring(0, bitrate.length() - 3)); @@ -534,8 +516,6 @@ public class FullPlaybackActivity extends SlidingPlaybackActivity BastpUtil.GainValues rg = PlaybackService.get(this).getReplayGainValues(song.path); mReplayGain = String.format("base=%.2f, track=%.2f, album=%.2f", rg.base, rg.track, rg.album); - - data.release(); } mUiHandler.sendEmptyMessage(MSG_COMMIT_INFO); diff --git a/src/ch/blinkenlights/android/vanilla/MediaUtils.java b/src/ch/blinkenlights/android/vanilla/MediaUtils.java index d779484c..1795d53b 100644 --- a/src/ch/blinkenlights/android/vanilla/MediaUtils.java +++ b/src/ch/blinkenlights/android/vanilla/MediaUtils.java @@ -23,6 +23,7 @@ package ch.blinkenlights.android.vanilla; import ch.blinkenlights.android.medialibrary.MediaLibrary; +import ch.blinkenlights.android.medialibrary.MediaMetadataExtractor; import java.io.File; import java.util.ArrayList; @@ -31,7 +32,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Random; -import java.util.zip.CRC32; import android.util.Log; @@ -46,7 +46,6 @@ import android.os.Environment; import android.provider.MediaStore; import android.text.TextUtils; import android.database.MatrixCursor; -import android.media.MediaMetadataRetriever; import android.util.Log; import android.widget.Toast; @@ -537,18 +536,11 @@ public class MediaUtils { * */ public static Cursor getCursorForFileQuery(String path) { MatrixCursor matrixCursor = new MatrixCursor(Song.FILLED_PROJECTION); - MediaMetadataRetriever data = new MediaMetadataRetriever(); - - try { - data.setDataSource(path); - } catch (Exception e) { - Log.w("VanillaMusic", "Failed to extract metadata from " + path); - } - - String title = data.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE); - String album = data.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ALBUM); - String artist = data.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST); - String duration = data.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION); + MediaMetadataExtractor tags = new MediaMetadataExtractor(path); + String title = tags.getFirst(MediaMetadataExtractor.TITLE); + String album = tags.getFirst(MediaMetadataExtractor.ALBUM); + String artist = tags.getFirst(MediaMetadataExtractor.ARTIST); + String duration = tags.getFirst(MediaMetadataExtractor.DURATION); if (duration != null) { // looks like we will be able to play this file // Vanilla requires each file to be identified by its unique id in the media database. @@ -556,9 +548,9 @@ public class MediaUtils { // using the negative crc32 sum of the path value. While this is not perfect // (the same file may be accessed using various paths) it's the fastest method // and far good enough. - CRC32 crc = new CRC32(); - crc.update(path.getBytes()); - Long songId = (Long)(2+crc.getValue())*-1; // must at least be -2 (-1 defines Song-Object to be empty) + long songId = MediaLibrary.hash63(path) * -1; + if (songId > -2) + songId = -2; // must be less than -1 (-1 defines an empty song object) // Build minimal fake-database entry for this file Object[] objData = new Object[] { songId, path, "", "", "", 0, 0, 0, 0 };