You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tika.apache.org by ni...@apache.org on 2014/07/30 13:21:17 UTC
svn commit: r1614615 - in /tika/trunk/tika-parsers/src:
main/java/org/apache/tika/parser/mp3/ test/java/org/apache/tika/parser/mp3/
test/resources/test-documents/
Author: nick
Date: Wed Jul 30 11:21:17 2014
New Revision: 1614615
URL: http://svn.apache.org/r1614615
Log:
Partial TIKA-1377 patch from Dan Becker, with changes - ID3v2 support for more keys, MP3 Parser support to use that, and tests
Modified:
tika/trunk/tika-parsers/src/main/java/org/apache/tika/parser/mp3/CompositeTagHandler.java
tika/trunk/tika-parsers/src/main/java/org/apache/tika/parser/mp3/ID3Tags.java
tika/trunk/tika-parsers/src/main/java/org/apache/tika/parser/mp3/ID3v22Handler.java
tika/trunk/tika-parsers/src/main/java/org/apache/tika/parser/mp3/ID3v23Handler.java
tika/trunk/tika-parsers/src/main/java/org/apache/tika/parser/mp3/ID3v24Handler.java
tika/trunk/tika-parsers/src/main/java/org/apache/tika/parser/mp3/Mp3Parser.java
tika/trunk/tika-parsers/src/test/java/org/apache/tika/parser/mp3/Mp3ParserTest.java
tika/trunk/tika-parsers/src/test/resources/test-documents/testMP3id3v2.mp3
tika/trunk/tika-parsers/src/test/resources/test-documents/testMP3id3v24.mp3
Modified: tika/trunk/tika-parsers/src/main/java/org/apache/tika/parser/mp3/CompositeTagHandler.java
URL: http://svn.apache.org/viewvc/tika/trunk/tika-parsers/src/main/java/org/apache/tika/parser/mp3/CompositeTagHandler.java?rev=1614615&r1=1614614&r2=1614615&view=diff
==============================================================================
--- tika/trunk/tika-parsers/src/main/java/org/apache/tika/parser/mp3/CompositeTagHandler.java (original)
+++ tika/trunk/tika-parsers/src/main/java/org/apache/tika/parser/mp3/CompositeTagHandler.java Wed Jul 30 11:21:17 2014
@@ -113,4 +113,30 @@ public class CompositeTagHandler impleme
return null;
}
+ public String getAlbumArtist() {
+ for (ID3Tags tag : tags) {
+ if (tag.getAlbumArtist() != null) {
+ return tag.getAlbumArtist();
+ }
+ }
+ return null;
+ }
+
+ public String getDisc() {
+ for (ID3Tags tag : tags) {
+ if (tag.getDisc() != null) {
+ return tag.getDisc();
+ }
+ }
+ return null;
+ }
+
+ public String getCompilation() {
+ for (ID3Tags tag : tags) {
+ if (tag.getCompilation() != null) {
+ return tag.getCompilation();
+ }
+ }
+ return null;
+ }
}
Modified: tika/trunk/tika-parsers/src/main/java/org/apache/tika/parser/mp3/ID3Tags.java
URL: http://svn.apache.org/viewvc/tika/trunk/tika-parsers/src/main/java/org/apache/tika/parser/mp3/ID3Tags.java?rev=1614615&r1=1614614&r2=1614615&view=diff
==============================================================================
--- tika/trunk/tika-parsers/src/main/java/org/apache/tika/parser/mp3/ID3Tags.java (original)
+++ tika/trunk/tika-parsers/src/main/java/org/apache/tika/parser/mp3/ID3Tags.java Wed Jul 30 11:21:17 2014
@@ -18,7 +18,6 @@ package org.apache.tika.parser.mp3;
import java.util.List;
-
/**
* Interface that defines the common interface for ID3 tag parsers,
* such as ID3v1 and ID3v2.3.
@@ -172,12 +171,22 @@ public interface ID3Tags {
String getTitle();
+ /**
+ * The Artist for the track
+ */
String getArtist();
+ /**
+ * The Artist for the overall album / compilation of albums
+ */
+ String getAlbumArtist();
+
String getAlbum();
String getComposer();
+ String getCompilation();
+
/**
* Retrieves the comments, if any.
* Files may have more than one comment, but normally only
@@ -189,9 +198,17 @@ public interface ID3Tags {
String getYear();
+ /**
+ * The number of the track within the album / recording
+ */
String getTrackNumber();
/**
+ * The number of the disc this belongs to, within the set
+ */
+ String getDisc();
+
+ /**
* Represents a comments in ID3 (especially ID3 v2), where are
* made up of several parts
*/
Modified: tika/trunk/tika-parsers/src/main/java/org/apache/tika/parser/mp3/ID3v22Handler.java
URL: http://svn.apache.org/viewvc/tika/trunk/tika-parsers/src/main/java/org/apache/tika/parser/mp3/ID3v22Handler.java?rev=1614615&r1=1614614&r2=1614615&view=diff
==============================================================================
--- tika/trunk/tika-parsers/src/main/java/org/apache/tika/parser/mp3/ID3v22Handler.java (original)
+++ tika/trunk/tika-parsers/src/main/java/org/apache/tika/parser/mp3/ID3v22Handler.java Wed Jul 30 11:21:17 2014
@@ -39,6 +39,8 @@ public class ID3v22Handler implements ID
private String composer;
private String genre;
private String trackNumber;
+ private String albumArtist;
+ private String disc;
private List<ID3Comment> comments = new ArrayList<ID3Comment>();
public ID3v22Handler(ID3v2Frame frame)
@@ -50,6 +52,8 @@ public class ID3v22Handler implements ID
title = getTagString(tag.data, 0, tag.data.length);
} else if (tag.name.equals("TP1")) {
artist = getTagString(tag.data, 0, tag.data.length);
+ } else if (tag.name.equals("TP2")) {
+ albumArtist = getTagString(tag.data, 0, tag.data.length);
} else if (tag.name.equals("TAL")) {
album = getTagString(tag.data, 0, tag.data.length);
} else if (tag.name.equals("TYE")) {
@@ -60,6 +64,8 @@ public class ID3v22Handler implements ID
comments.add( getComment(tag.data, 0, tag.data.length) );
} else if (tag.name.equals("TRK")) {
trackNumber = getTagString(tag.data, 0, tag.data.length);
+ } else if (tag.name.equals("TPA")) {
+ disc = getTagString(tag.data, 0, tag.data.length);
} else if (tag.name.equals("TCO")) {
genre = extractGenre( getTagString(tag.data, 0, tag.data.length) );
}
@@ -129,10 +135,25 @@ public class ID3v22Handler implements ID
return trackNumber;
}
+ public String getAlbumArtist() {
+ return albumArtist;
+ }
+
+ public String getDisc() {
+ return disc;
+ }
+
+ /**
+ * ID3v22 doesn't have compilations,
+ * so returns null;
+ */
+ public String getCompilation() {
+ return null;
+ }
+
private class RawV22TagIterator extends RawTagIterator {
private RawV22TagIterator(ID3v2Frame frame) {
frame.super(3, 3, 1, 0);
}
}
-
}
Modified: tika/trunk/tika-parsers/src/main/java/org/apache/tika/parser/mp3/ID3v23Handler.java
URL: http://svn.apache.org/viewvc/tika/trunk/tika-parsers/src/main/java/org/apache/tika/parser/mp3/ID3v23Handler.java?rev=1614615&r1=1614614&r2=1614615&view=diff
==============================================================================
--- tika/trunk/tika-parsers/src/main/java/org/apache/tika/parser/mp3/ID3v23Handler.java (original)
+++ tika/trunk/tika-parsers/src/main/java/org/apache/tika/parser/mp3/ID3v23Handler.java Wed Jul 30 11:21:17 2014
@@ -39,6 +39,9 @@ public class ID3v23Handler implements ID
private String composer;
private String genre;
private String trackNumber;
+ private String albumArtist;
+ private String disc;
+ private String compilation;
private List<ID3Comment> comments = new ArrayList<ID3Comment>();
public ID3v23Handler(ID3v2Frame frame)
@@ -50,6 +53,8 @@ public class ID3v23Handler implements ID
title = getTagString(tag.data, 0, tag.data.length);
} else if (tag.name.equals("TPE1")) {
artist = getTagString(tag.data, 0, tag.data.length);
+ } else if (tag.name.equals("TPE2")) {
+ albumArtist = getTagString(tag.data, 0, tag.data.length);
} else if (tag.name.equals("TALB")) {
album = getTagString(tag.data, 0, tag.data.length);
} else if (tag.name.equals("TYER")) {
@@ -60,6 +65,10 @@ public class ID3v23Handler implements ID
comments.add( getComment(tag.data, 0, tag.data.length) );
} else if (tag.name.equals("TRCK")) {
trackNumber = getTagString(tag.data, 0, tag.data.length);
+ } else if (tag.name.equals("TPOS")) {
+ disc = getTagString(tag.data, 0, tag.data.length);
+ } else if (tag.name.equals("TCMP")) {
+ compilation = getTagString(tag.data, 0, tag.data.length);
} else if (tag.name.equals("TCON")) {
genre = ID3v22Handler.extractGenre( getTagString(tag.data, 0, tag.data.length) );
}
@@ -109,10 +118,21 @@ public class ID3v23Handler implements ID
return trackNumber;
}
+ public String getAlbumArtist() {
+ return albumArtist;
+ }
+
+ public String getDisc() {
+ return disc;
+ }
+
+ public String getCompilation() {
+ return compilation;
+ }
+
private class RawV23TagIterator extends RawTagIterator {
private RawV23TagIterator(ID3v2Frame frame) {
frame.super(4, 4, 1, 2);
}
}
-
}
Modified: tika/trunk/tika-parsers/src/main/java/org/apache/tika/parser/mp3/ID3v24Handler.java
URL: http://svn.apache.org/viewvc/tika/trunk/tika-parsers/src/main/java/org/apache/tika/parser/mp3/ID3v24Handler.java?rev=1614615&r1=1614614&r2=1614615&view=diff
==============================================================================
--- tika/trunk/tika-parsers/src/main/java/org/apache/tika/parser/mp3/ID3v24Handler.java (original)
+++ tika/trunk/tika-parsers/src/main/java/org/apache/tika/parser/mp3/ID3v24Handler.java Wed Jul 30 11:21:17 2014
@@ -40,6 +40,9 @@ public class ID3v24Handler implements ID
private String composer;
private String genre;
private String trackNumber;
+ private String albumArtist;
+ private String disc;
+ private String compilation;
private List<ID3Comment> comments = new ArrayList<ID3Comment>();
public ID3v24Handler(ID3v2Frame frame)
@@ -51,6 +54,8 @@ public class ID3v24Handler implements ID
title = getTagString(tag.data, 0, tag.data.length);
} else if (tag.name.equals("TPE1")) {
artist = getTagString(tag.data, 0, tag.data.length);
+ } else if (tag.name.equals("TPE2")) {
+ albumArtist = getTagString(tag.data, 0, tag.data.length);
} else if (tag.name.equals("TALB")) {
album = getTagString(tag.data, 0, tag.data.length);
} else if (tag.name.equals("TYER")) {
@@ -65,6 +70,10 @@ public class ID3v24Handler implements ID
comments.add( getComment(tag.data, 0, tag.data.length) );
} else if (tag.name.equals("TRCK")) {
trackNumber = getTagString(tag.data, 0, tag.data.length);
+ } else if (tag.name.equals("TPOS")) {
+ disc = getTagString(tag.data, 0, tag.data.length);
+ } else if (tag.name.equals("TCMP")) {
+ compilation = getTagString(tag.data, 0, tag.data.length);
} else if (tag.name.equals("TCON")) {
genre = ID3v22Handler.extractGenre( getTagString(tag.data, 0, tag.data.length) );
}
@@ -114,10 +123,21 @@ public class ID3v24Handler implements ID
return trackNumber;
}
+ public String getAlbumArtist() {
+ return albumArtist;
+ }
+
+ public String getDisc() {
+ return disc;
+ }
+
+ public String getCompilation() {
+ return compilation;
+ }
+
private class RawV24TagIterator extends RawTagIterator {
private RawV24TagIterator(ID3v2Frame frame) {
frame.super(4, 4, 1, 2);
}
}
-
}
Modified: tika/trunk/tika-parsers/src/main/java/org/apache/tika/parser/mp3/Mp3Parser.java
URL: http://svn.apache.org/viewvc/tika/trunk/tika-parsers/src/main/java/org/apache/tika/parser/mp3/Mp3Parser.java?rev=1614615&r1=1614614&r2=1614615&view=diff
==============================================================================
--- tika/trunk/tika-parsers/src/main/java/org/apache/tika/parser/mp3/Mp3Parser.java (original)
+++ tika/trunk/tika-parsers/src/main/java/org/apache/tika/parser/mp3/Mp3Parser.java Wed Jul 30 11:21:17 2014
@@ -76,8 +76,10 @@ public class Mp3Parser extends AbstractP
metadata.set(TikaCoreProperties.TITLE, tag.getTitle());
metadata.set(TikaCoreProperties.CREATOR, tag.getArtist());
metadata.set(XMPDM.ARTIST, tag.getArtist());
+ metadata.set(XMPDM.ALBUM_ARTIST, tag.getAlbumArtist());
metadata.set(XMPDM.COMPOSER, tag.getComposer());
metadata.set(XMPDM.ALBUM, tag.getAlbum());
+ metadata.set(XMPDM.COMPILATION, tag.getCompilation());
metadata.set(XMPDM.RELEASE_DATE, tag.getYear());
metadata.set(XMPDM.GENRE, tag.getGenre());
metadata.set(XMPDM.DURATION, audioAndTags.duration);
@@ -107,12 +109,18 @@ public class Mp3Parser extends AbstractP
xhtml.element("p", tag.getArtist());
// ID3v1.1 Track addition
+ StringBuilder sb = new StringBuilder();
+ sb.append(tag.getAlbum());
if (tag.getTrackNumber() != null) {
- xhtml.element("p", tag.getAlbum() + ", track " + tag.getTrackNumber());
+ sb.append(", track ").append(tag.getTrackNumber());
metadata.set(XMPDM.TRACK_NUMBER, tag.getTrackNumber());
- } else {
- xhtml.element("p", tag.getAlbum());
}
+ if (tag.getDisc() != null) {
+ sb.append(", disc ").append(tag.getDisc());
+ metadata.set(XMPDM.DISC_NUMBER, tag.getDisc());
+ }
+ xhtml.element("p", sb.toString());
+
xhtml.element("p", tag.getYear());
xhtml.element("p", tag.getGenre());
xhtml.element("p", String.valueOf(audioAndTags.duration));
Modified: tika/trunk/tika-parsers/src/test/java/org/apache/tika/parser/mp3/Mp3ParserTest.java
URL: http://svn.apache.org/viewvc/tika/trunk/tika-parsers/src/test/java/org/apache/tika/parser/mp3/Mp3ParserTest.java?rev=1614615&r1=1614614&r2=1614615&view=diff
==============================================================================
--- tika/trunk/tika-parsers/src/test/java/org/apache/tika/parser/mp3/Mp3ParserTest.java (original)
+++ tika/trunk/tika-parsers/src/test/java/org/apache/tika/parser/mp3/Mp3ParserTest.java Wed Jul 30 11:21:17 2014
@@ -115,6 +115,8 @@ public class Mp3ParserTest {
assertTrue(content.contains("2008"));
assertTrue(content.contains("Test Comment"));
assertTrue(content.contains("Rock"));
+ assertTrue(content.contains(", track 1"));
+ assertTrue(content.contains(", disc 1"));
// Check un-typed audio properties
assertEquals("MPEG 3 Layer III Version 1", metadata.get("version"));
@@ -124,11 +126,14 @@ public class Mp3ParserTest {
// Check XMPDM-typed audio properties
assertEquals("Test Album", metadata.get(XMPDM.ALBUM));
assertEquals("Test Artist", metadata.get(XMPDM.ARTIST));
+ assertEquals("Test Album Artist", metadata.get(XMPDM.ALBUM_ARTIST));
assertEquals(null, metadata.get(XMPDM.COMPOSER));
assertEquals("2008", metadata.get(XMPDM.RELEASE_DATE));
assertEquals("Rock", metadata.get(XMPDM.GENRE));
assertEquals("XXX - ID3v1 Comment\nTest Comment", metadata.get(XMPDM.LOG_COMMENT.getName()));
assertEquals("1", metadata.get(XMPDM.TRACK_NUMBER));
+ assertEquals("1/1", metadata.get(XMPDM.DISC_NUMBER));
+ assertEquals("1", metadata.get(XMPDM.COMPILATION));
assertEquals("44100", metadata.get(XMPDM.AUDIO_SAMPLE_RATE));
assertEquals("Mono", metadata.get(XMPDM.AUDIO_CHANNEL_TYPE));
@@ -203,11 +208,24 @@ public class Mp3ParserTest {
assertTrue(content.contains("2008"));
assertTrue(content.contains("Test Comment"));
assertTrue(content.contains("Rock"));
+ assertTrue(content.contains(", disc 1"));
assertEquals("MPEG 3 Layer III Version 1", metadata.get("version"));
assertEquals("44100", metadata.get("samplerate"));
assertEquals("1", metadata.get("channels"));
checkDuration(metadata, 2);
+
+ // Check XMPDM-typed audio properties
+ assertEquals("Test Album", metadata.get(XMPDM.ALBUM));
+ assertEquals("Test Artist", metadata.get(XMPDM.ARTIST));
+ assertEquals("Test Album Artist", metadata.get(XMPDM.ALBUM_ARTIST));
+ assertEquals(null, metadata.get(XMPDM.COMPOSER));
+ assertEquals("2008", metadata.get(XMPDM.RELEASE_DATE));
+ assertEquals("Rock", metadata.get(XMPDM.GENRE));
+ assertEquals("1", metadata.get(XMPDM.COMPILATION));
+
+ assertEquals(null, metadata.get(XMPDM.TRACK_NUMBER));
+ assertEquals("1", metadata.get(XMPDM.DISC_NUMBER));
}
/**
Modified: tika/trunk/tika-parsers/src/test/resources/test-documents/testMP3id3v2.mp3
URL: http://svn.apache.org/viewvc/tika/trunk/tika-parsers/src/test/resources/test-documents/testMP3id3v2.mp3?rev=1614615&r1=1614614&r2=1614615&view=diff
==============================================================================
Binary files - no diff available.
Modified: tika/trunk/tika-parsers/src/test/resources/test-documents/testMP3id3v24.mp3
URL: http://svn.apache.org/viewvc/tika/trunk/tika-parsers/src/test/resources/test-documents/testMP3id3v24.mp3?rev=1614615&r1=1614614&r2=1614615&view=diff
==============================================================================
Binary files - no diff available.