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


Reply via email to