unify metadata extractor

This commit is contained in:
Adrian Ulrich 2016-11-26 19:15:10 +01:00
parent 432ce9d557
commit 0af0d35a66
3 changed files with 25 additions and 48 deletions

View File

@ -33,6 +33,7 @@ public class MediaMetadataExtractor extends HashMap<String, ArrayList<String>> {
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<String, ArrayList<String>> {
*
* @param path the path to scan
*/
MediaMetadataExtractor(String path) {
public MediaMetadataExtractor(String path) {
extractMetadata(path);
}
@ -93,6 +94,10 @@ public class MediaMetadataExtractor extends HashMap<String, ArrayList<String>> {
bitrate.add(mediaTags.extractMetadata(MediaMetadataRetriever.METADATA_KEY_BITRATE));
this.put(BITRATE, bitrate);
ArrayList<String> mime = new ArrayList<String>(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)

View File

@ -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);

View File

@ -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 };