Author: nick
Date: Mon Aug 2 16:34:30 2010
New Revision: 981590
URL: http://svn.apache.org/viewvc?rev=981590&view=rev
Log:
The id3v2.4 spec doc has a bug - the layout section says 4*size to bytes, but
the description is just size=bytes. Switch to the latter, which is what the
other programs use, and add a unit test based on a mid3v2 generated file.
(TIKA-424)
Added:
tika/trunk/tika-parsers/src/test/resources/test-documents/testMP3id3v24.mp3
(with props)
Modified:
tika/trunk/tika-parsers/src/main/java/org/apache/tika/parser/mp3/ID3v24Handler.java
tika/trunk/tika-parsers/src/test/java/org/apache/tika/parser/mp3/Mp3ParserTest.java
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=981590&r1=981589&r2=981590&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
Mon Aug 2 16:34:30 2010
@@ -53,6 +53,10 @@ public class ID3v24Handler implements ID
album = getTagString(tag.data, 0, tag.data.length);
} else if (tag.name.equals("TYER")) {
year = getTagString(tag.data, 0, tag.data.length);
+ } else if (tag.name.equals("TDRC")) {
+ if(year == null) {
+ year = getTagString(tag.data, 0, tag.data.length);
+ }
} else if (tag.name.equals("TCOM")) {
composer = getTagString(tag.data, 0, tag.data.length);
} else if (tag.name.equals("COMM")) {
@@ -63,7 +67,9 @@ public class ID3v24Handler implements ID
String rawGenre = getTagString(tag.data, 0, tag.data.length);
int open = rawGenre.indexOf("(");
int close = rawGenre.indexOf(")");
- if (open < close) {
+ if (open == -1 && close == -1) {
+ genre = rawGenre;
+ } else if (open < close) {
try {
int genreID =
Integer.parseInt(rawGenre.substring(open+1, close));
genre = ID3Tags.GENRES[genreID];
@@ -116,7 +122,7 @@ public class ID3v24Handler implements ID
private class RawV24TagIterator extends RawTagIterator {
private RawV24TagIterator(ID3v2Frame frame) {
- frame.super(4, 4, 4, 2);
+ frame.super(4, 4, 1, 2);
}
}
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=981590&r1=981589&r2=981590&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
Mon Aug 2 16:34:30 2010
@@ -135,6 +135,40 @@ public class Mp3ParserTest extends TestC
}
/**
+ * Test that with only ID3v2 tags, of version 2.4, we get the full
+ * set of information out.
+ */
+ public void testMp3ParsingID3v24() throws Exception {
+ Parser parser = new AutoDetectParser(); // Should auto-detect!
+ ContentHandler handler = new BodyContentHandler();
+ Metadata metadata = new Metadata();
+
+ InputStream stream = Mp3ParserTest.class.getResourceAsStream(
+ "/test-documents/testMP3id3v24.mp3");
+ try {
+ parser.parse(stream, handler, metadata, new ParseContext());
+ } finally {
+ stream.close();
+ }
+
+ assertEquals("audio/mpeg", metadata.get(Metadata.CONTENT_TYPE));
+ assertEquals("Test Title", metadata.get(Metadata.TITLE));
+ assertEquals("Test Artist", metadata.get(Metadata.AUTHOR));
+
+ String content = handler.toString();
+ assertTrue(content.contains("Test Title"));
+ assertTrue(content.contains("Test Artist"));
+ assertTrue(content.contains("Test Album"));
+ assertTrue(content.contains("2008"));
+ assertTrue(content.contains("Test Comment"));
+ assertTrue(content.contains("Rock"));
+
+ assertEquals("MPEG 3 Layer III Version 1", metadata.get("version"));
+ assertEquals("44100", metadata.get("samplerate"));
+ assertEquals("2", metadata.get("channels"));
+ }
+
+ /**
* Tests that a file with both lyrics and
* ID3v2 tags gets both extracted correctly
*/
@@ -198,10 +232,8 @@ public class Mp3ParserTest extends TestC
* This test will do nothing, unless you've downloaded the
* mp3 file from TIKA-424 - the file cannot be
* distributed with Tika.
- * This file has corrupt ID3v2.4 tags in it - the length
- * parameters are written in bytes, not bytes/4
- * Check that we can at least read the file without breaking,
- * even if the tags are going to be junk...
+ * This test will check for the complicated set of ID3v2.4
+ * tags.
*/
public void testTIKA424() throws Exception {
Parser parser = new AutoDetectParser(); // Should auto-detect!
@@ -223,8 +255,8 @@ public class Mp3ParserTest extends TestC
}
assertEquals("audio/mpeg", metadata.get(Metadata.CONTENT_TYPE));
- assertEquals("Plus loin vers l'ouestTPE1\u0000\u0000",
metadata.get(Metadata.TITLE).substring(0,28));
- assertEquals(null, metadata.get(Metadata.AUTHOR));
+ assertEquals("Plus loin vers l'ouest", metadata.get(Metadata.TITLE));
+ assertEquals("Merzhin", metadata.get(Metadata.AUTHOR));
String content = handler.toString();
assertTrue(content.contains("Plus loin vers l'ouest"));
Added:
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=981590&view=auto
==============================================================================
Binary file - no diff available.
Propchange:
tika/trunk/tika-parsers/src/test/resources/test-documents/testMP3id3v24.mp3
------------------------------------------------------------------------------
svn:executable = *
Propchange:
tika/trunk/tika-parsers/src/test/resources/test-documents/testMP3id3v24.mp3
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream