[Android] [PATCH] AlbumArtist tag support
Geoffrey Métais
geoffrey.metais at gmail.com
Wed Dec 10 18:30:46 CET 2014
---
libvlc/jni/libvlcjni-track.c | 1 +
libvlc/src/org/videolan/libvlc/Media.java | 25 ++++++++-
libvlc/src/org/videolan/libvlc/TrackInfo.java | 1 +
.../src/org/videolan/vlc/MediaDatabase.java | 61 ++++++++++++----------
vlc-android/src/org/videolan/vlc/MediaGroup.java | 1 +
.../vlc/gui/audio/AudioAlbumsSongsFragment.java | 2 +-
.../vlc/gui/audio/AudioBrowserListAdapter.java | 4 +-
.../videolan/vlc/gui/audio/MediaComparators.java | 2 +-
8 files changed, 64 insertions(+), 33 deletions(-)
diff --git a/libvlc/jni/libvlcjni-track.c b/libvlc/jni/libvlcjni-track.c
index 3b68564..398242b 100644
--- a/libvlc/jni/libvlcjni-track.c
+++ b/libvlc/jni/libvlcjni-track.c
@@ -156,6 +156,7 @@ jobjectArray read_track_info_internal(JNIEnv *env, jobject thiz, libvlc_media_t*
setString(env, item, "ArtworkURL", libvlc_media_get_meta(p_m, libvlc_meta_ArtworkURL));
setString(env, item, "NowPlaying", libvlc_media_get_meta(p_m, libvlc_meta_NowPlaying));
setString(env, item, "TrackNumber", libvlc_media_get_meta(p_m, libvlc_meta_TrackNumber));
+ setString(env, item, "AlbumArtist", libvlc_media_get_meta(p_m, libvlc_meta_AlbumArtist));
continue;
}
diff --git a/libvlc/src/org/videolan/libvlc/Media.java b/libvlc/src/org/videolan/libvlc/Media.java
index 41c61e7..4e333be 100644
--- a/libvlc/src/org/videolan/libvlc/Media.java
+++ b/libvlc/src/org/videolan/libvlc/Media.java
@@ -102,6 +102,7 @@ public class Media implements Comparable<Media> {
private String mCopyright;
private String mAlbum;
private int mTrackNumber;
+ private String mAlbumArtist;
private String mDescription;
private String mRating;
private String mDate;
@@ -182,6 +183,7 @@ public class Media implements Comparable<Media> {
mArtist = getValueWrapper(track.Artist, UnknownStringType.Artist).trim();
mAlbum = getValueWrapper(track.Album, UnknownStringType.Album).trim();
mGenre = getValueWrapper(track.Genre, UnknownStringType.Genre).trim();
+ mAlbumArtist = getValueWrapper(track.AlbumArtist, UnknownStringType.AlbumArtist).trim();
mArtworkURL = track.ArtworkURL;
mNowPlaying = track.NowPlaying;
if (!TextUtils.isEmpty(track.TrackNumber)) {
@@ -212,7 +214,7 @@ public class Media implements Comparable<Media> {
}
public Media(String location, long time, long length, int type,
- Bitmap picture, String title, String artist, String genre, String album,
+ Bitmap picture, String title, String artist, String genre, String album, String albumArtist,
int width, int height, String artworkURL, int audio, int spu, int trackNumber) {
mLocation = location;
mFilename = null;
@@ -229,11 +231,12 @@ public class Media implements Comparable<Media> {
mArtist = getValueWrapper(artist, UnknownStringType.Artist);
mGenre = getValueWrapper(genre, UnknownStringType.Genre);
mAlbum = getValueWrapper(album, UnknownStringType.Album);
+ mAlbumArtist = getValueWrapper(albumArtist, UnknownStringType.AlbumArtist);
mArtworkURL = artworkURL;
mTrackNumber = trackNumber;
}
- private enum UnknownStringType { Artist , Genre, Album };
+ private enum UnknownStringType { Artist , Genre, Album, AlbumArtist };
/**
* Uses introspection to read VLC l10n databases, so that we can sever the
* hard-coded dependency gracefully for 3rd party libvlc apps while still
@@ -260,6 +263,9 @@ public class Media implements Comparable<Media> {
case Genre:
value = (Integer)stringClass.getField("unknown_genre").get(null);
break;
+ case AlbumArtist:
+ value = (Integer)stringClass.getField("unknown_artist").get(null);
+ break;
case Artist:
default:
value = (Integer)stringClass.getField("unknown_artist").get(null);
@@ -412,10 +418,21 @@ public class Media implements Comparable<Media> {
: "";
}
+ public String getReferenceArtist() {
+ if (isAlbumArtistUnknown())
+ return mArtist;
+ else
+ return mAlbumArtist;
+ }
+
public String getArtist() {
return mArtist;
}
+ public Boolean isAlbumArtistUnknown() {
+ return (mAlbumArtist.equals(getValueWrapper(null, UnknownStringType.AlbumArtist)));
+ }
+
public Boolean isArtistUnknown() {
return (mArtist.equals(getValueWrapper(null, UnknownStringType.Artist)));
}
@@ -437,6 +454,10 @@ public class Media implements Comparable<Media> {
return mAlbum;
}
+ public String getAlbumArtist() {
+ return mAlbumArtist;
+ }
+
public Boolean isAlbumUnknown() {
return (mAlbum.equals(getValueWrapper(null, UnknownStringType.Album)));
}
diff --git a/libvlc/src/org/videolan/libvlc/TrackInfo.java b/libvlc/src/org/videolan/libvlc/TrackInfo.java
index 49a4f06..0ef1ab9 100644
--- a/libvlc/src/org/videolan/libvlc/TrackInfo.java
+++ b/libvlc/src/org/videolan/libvlc/TrackInfo.java
@@ -52,4 +52,5 @@ public class TrackInfo {
public String ArtworkURL;
public String NowPlaying;
public String TrackNumber;
+ public String AlbumArtist;
}
diff --git a/vlc-android/src/org/videolan/vlc/MediaDatabase.java b/vlc-android/src/org/videolan/vlc/MediaDatabase.java
index 48231c4..9537c9f 100644
--- a/vlc-android/src/org/videolan/vlc/MediaDatabase.java
+++ b/vlc-android/src/org/videolan/vlc/MediaDatabase.java
@@ -51,7 +51,7 @@ public class MediaDatabase {
private SQLiteDatabase mDb;
private final String DB_NAME = "vlc_database";
- private final int DB_VERSION = 9;
+ private final int DB_VERSION = 10;
private final int CHUNK_SIZE = 50;
private final String DIR_TABLE_NAME = "directories_table";
@@ -67,6 +67,7 @@ public class MediaDatabase {
private final String MEDIA_ARTIST = "artist";
private final String MEDIA_GENRE = "genre";
private final String MEDIA_ALBUM = "album";
+ private final String MEDIA_ALBUMARTIST = "albumartist";
private final String MEDIA_WIDTH = "width";
private final String MEDIA_HEIGHT = "height";
private final String MEDIA_ARTWORKURL = "artwork_url";
@@ -90,8 +91,8 @@ public class MediaDatabase {
public enum mediaColumn {
MEDIA_TABLE_NAME, MEDIA_PATH, MEDIA_TIME, MEDIA_LENGTH,
MEDIA_TYPE, MEDIA_PICTURE, MEDIA_TITLE, MEDIA_ARTIST, MEDIA_GENRE, MEDIA_ALBUM,
- MEDIA_WIDTH, MEDIA_HEIGHT, MEDIA_ARTWORKURL, MEDIA_AUDIOTRACK, MEDIA_SPUTRACK,
- MEDIA_TRACKNUMBER
+ MEDIA_ALBUMARTIST, MEDIA_WIDTH, MEDIA_HEIGHT, MEDIA_ARTWORKURL, MEDIA_AUDIOTRACK,
+ MEDIA_SPUTRACK, MEDIA_TRACKNUMBER
}
/**
@@ -166,6 +167,7 @@ public class MediaDatabase {
+ MEDIA_ARTIST + " TEXT, "
+ MEDIA_GENRE + " TEXT, "
+ MEDIA_ALBUM + " TEXT, "
+ + MEDIA_ALBUMARTIST + " TEXT, "
+ MEDIA_WIDTH + " INTEGER, "
+ MEDIA_HEIGHT + " INTEGER, "
+ MEDIA_ARTWORKURL + " TEXT, "
@@ -452,6 +454,7 @@ public class MediaDatabase {
values.put(MEDIA_ARTIST, media.getArtist());
values.put(MEDIA_GENRE, media.getGenre());
values.put(MEDIA_ALBUM, media.getAlbum());
+ values.put(MEDIA_ALBUMARTIST, media.getAlbumArtist());
values.put(MEDIA_WIDTH, media.getWidth());
values.put(MEDIA_HEIGHT, media.getHeight());
values.put(MEDIA_ARTWORKURL, media.getArtworkURL());
@@ -544,7 +547,7 @@ public class MediaDatabase {
do {
count = 0;
cursor = mDb.rawQuery(String.format(Locale.US,
- "SELECT %s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s FROM %s LIMIT %d OFFSET %d",
+ "SELECT %s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s FROM %s LIMIT %d OFFSET %d",
MEDIA_TIME, //0 long
MEDIA_LENGTH, //1 long
MEDIA_TYPE, //2 int
@@ -552,13 +555,14 @@ public class MediaDatabase {
MEDIA_ARTIST, //4 string
MEDIA_GENRE, //5 string
MEDIA_ALBUM, //6 string
- MEDIA_WIDTH, //7 int
- MEDIA_HEIGHT, //8 int
- MEDIA_ARTWORKURL, //9 string
- MEDIA_AUDIOTRACK, //10 int
- MEDIA_SPUTRACK, //11 int
- MEDIA_TRACKNUMBER, // 12 int
- MEDIA_LOCATION, //13 string
+ MEDIA_ALBUMARTIST, //7 string
+ MEDIA_WIDTH, //8 int
+ MEDIA_HEIGHT, //9 int
+ MEDIA_ARTWORKURL, //10 string
+ MEDIA_AUDIOTRACK, //11 int
+ MEDIA_SPUTRACK, //12 int
+ MEDIA_TRACKNUMBER, // 13 int
+ MEDIA_LOCATION, //14 string
MEDIA_TABLE_NAME,
CHUNK_SIZE,
chunk_count * CHUNK_SIZE), null);
@@ -575,12 +579,13 @@ public class MediaDatabase {
cursor.getString(4), // MEDIA_ARTIST
cursor.getString(5), // MEDIA_GENRE
cursor.getString(6), // MEDIA_ALBUM
- cursor.getInt(7), // MEDIA_WIDTH
- cursor.getInt(8), // MEDIA_HEIGHT
- cursor.getString(9), // MEDIA_ARTWORKURL
- cursor.getInt(10), // MEDIA_AUDIOTRACK
- cursor.getInt(11), // MEDIA_SPUTRACK
- cursor.getInt(12)); // MEDIA_TRACKNUMBER
+ cursor.getString(7), // MEDIA_ALBUMARTIST
+ cursor.getInt(8), // MEDIA_WIDTH
+ cursor.getInt(9), // MEDIA_HEIGHT
+ cursor.getString(10), // MEDIA_ARTWORKURL
+ cursor.getInt(11), // MEDIA_AUDIOTRACK
+ cursor.getInt(12), // MEDIA_SPUTRACK
+ cursor.getInt(13)); // MEDIA_TRACKNUMBER
medias.put(media.getLocation(), media);
count++;
@@ -645,12 +650,13 @@ public class MediaDatabase {
MEDIA_ARTIST, //4 string
MEDIA_GENRE, //5 string
MEDIA_ALBUM, //6 string
- MEDIA_WIDTH, //7 int
- MEDIA_HEIGHT, //8 int
- MEDIA_ARTWORKURL, //9 string
- MEDIA_AUDIOTRACK, //10 int
- MEDIA_SPUTRACK, //11 int
- MEDIA_TRACKNUMBER, //12 int
+ MEDIA_ALBUMARTIST, //7 string
+ MEDIA_WIDTH, //8 int
+ MEDIA_HEIGHT, //9 int
+ MEDIA_ARTWORKURL, //10 string
+ MEDIA_AUDIOTRACK, //11 int
+ MEDIA_SPUTRACK, //12 int
+ MEDIA_TRACKNUMBER, //13 int
},
MEDIA_LOCATION + "=?",
new String[] { location },
@@ -669,12 +675,13 @@ public class MediaDatabase {
cursor.getString(4),
cursor.getString(5),
cursor.getString(6),
- cursor.getInt(7),
+ cursor.getString(7),
cursor.getInt(8),
- cursor.getString(9),
- cursor.getInt(10),
+ cursor.getInt(9),
+ cursor.getString(10),
cursor.getInt(11),
- cursor.getInt(12));
+ cursor.getInt(12),
+ cursor.getInt(13));
}
cursor.close();
return media;
diff --git a/vlc-android/src/org/videolan/vlc/MediaGroup.java b/vlc-android/src/org/videolan/vlc/MediaGroup.java
index 045e324..df5ef5d 100644
--- a/vlc-android/src/org/videolan/vlc/MediaGroup.java
+++ b/vlc-android/src/org/videolan/vlc/MediaGroup.java
@@ -46,6 +46,7 @@ public class MediaGroup extends Media {
media.getArtist(),
media.getGenre(),
media.getAlbum(),
+ media.getAlbumArtist(),
media.getWidth(),
media.getHeight(),
media.getArtworkURL(),
diff --git a/vlc-android/src/org/videolan/vlc/gui/audio/AudioAlbumsSongsFragment.java b/vlc-android/src/org/videolan/vlc/gui/audio/AudioAlbumsSongsFragment.java
index 37163c3..d4df1d5 100644
--- a/vlc-android/src/org/videolan/vlc/gui/audio/AudioAlbumsSongsFragment.java
+++ b/vlc-android/src/org/videolan/vlc/gui/audio/AudioAlbumsSongsFragment.java
@@ -355,7 +355,7 @@ public class AudioAlbumsSongsFragment extends Fragment implements SwipeRefreshLa
public void run() {
for (int i = 0; i < mediaList.size(); ++i) {
Media media = mediaList.get(i);
- mAlbumsAdapter.addSeparator(media.getArtist(), media);
+ mAlbumsAdapter.addSeparator(media.getReferenceArtist(), media);
mAlbumsAdapter.add(media.getAlbum(), null, media);
mSongsAdapter.addSeparator(media.getAlbum(), media);
}
diff --git a/vlc-android/src/org/videolan/vlc/gui/audio/AudioBrowserListAdapter.java b/vlc-android/src/org/videolan/vlc/gui/audio/AudioBrowserListAdapter.java
index bfd1818..16fdc2c 100644
--- a/vlc-android/src/org/videolan/vlc/gui/audio/AudioBrowserListAdapter.java
+++ b/vlc-android/src/org/videolan/vlc/gui/audio/AudioBrowserListAdapter.java
@@ -133,10 +133,10 @@ public class AudioBrowserListAdapter extends BaseAdapter implements SectionIndex
switch (type){
case TYPE_ALBUMS:
title = media.getAlbum();
- subTitle = media.getArtist();
+ subTitle = media.getReferenceArtist();
break;
case TYPE_ARTISTS:
- title = media.getArtist();
+ title = media.getReferenceArtist();
subTitle = null;
break;
case TYPE_GENRES:
diff --git a/vlc-android/src/org/videolan/vlc/gui/audio/MediaComparators.java b/vlc-android/src/org/videolan/vlc/gui/audio/MediaComparators.java
index 5d10dd0..d0da1ed 100644
--- a/vlc-android/src/org/videolan/vlc/gui/audio/MediaComparators.java
+++ b/vlc-android/src/org/videolan/vlc/gui/audio/MediaComparators.java
@@ -61,7 +61,7 @@ public class MediaComparators {
public static final Comparator<Media> byArtist = new Comparator<Media>() {
@Override
public int compare(Media m1, Media m2) {
- int res = String.CASE_INSENSITIVE_ORDER.compare(m1.getArtist(), m2.getArtist());
+ int res = String.CASE_INSENSITIVE_ORDER.compare(m1.getReferenceArtist(), m2.getReferenceArtist());
if (res == 0)
res = byAlbum.compare(m1, m2);
return res;
--
1.9.1
More information about the Android
mailing list