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.