Author: jukka
Date: Sun Sep 14 02:45:48 2008
New Revision: 695165
URL: http://svn.apache.org/viewvc?rev=695165&view=rev
Log:
TIKA-120: Add support for retrieving ID3 tags from MP3 files
Use ISO-8859-1 as the tag character encoding.
Plus some minor simplifications.
Modified:
incubator/tika/trunk/src/main/java/org/apache/tika/parser/mp3/ID3v1Tag.java
Modified:
incubator/tika/trunk/src/main/java/org/apache/tika/parser/mp3/ID3v1Tag.java
URL:
http://svn.apache.org/viewvc/incubator/tika/trunk/src/main/java/org/apache/tika/parser/mp3/ID3v1Tag.java?rev=695165&r1=695164&r2=695165&view=diff
==============================================================================
--- incubator/tika/trunk/src/main/java/org/apache/tika/parser/mp3/ID3v1Tag.java
(original)
+++ incubator/tika/trunk/src/main/java/org/apache/tika/parser/mp3/ID3v1Tag.java
Sun Sep 14 02:45:48 2008
@@ -16,110 +16,105 @@
*/
package org.apache.tika.parser.mp3;
-import org.apache.commons.lang.StringUtils;
-
-import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.FileInputStream;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Arrays;
+
+import org.apache.commons.lang.StringUtils;
/**
- * <p>
- * This class parses and represents a ID3v1 Tag. Implemented based on
http://www.id3.org/ID3v1.
- * </p>
+ * This class parses and represents a ID3v1 Tag.
+ *
+ * @see http://www.id3.org/ID3v1
*/
public class ID3v1Tag {
+
/**
- * Static Map of genre codes.
+ * List of predefined genres.
+ *
+ * @see http://www.id3.org/id3v2-00
*/
- private static Map genres = new HashMap();
-
- static {
- genres.put(0, "Blues");
- genres.put(1, "Classic Rock");
- genres.put(2, "Country");
- genres.put(3, "Dance");
- genres.put(4, "Disco");
- genres.put(5, "Funk");
- genres.put(6, "Grunge");
- genres.put(7, "Hip-Hop");
- genres.put(8, "Jazz");
- genres.put(9, "Metal");
- genres.put(10, "New Age");
- genres.put(11, "Oldies");
- genres.put(12, "Other");
- genres.put(13, "Pop");
- genres.put(14, "R&B");
- genres.put(15, "Rap");
- genres.put(16, "Reggae");
- genres.put(17, "Rock");
- genres.put(18, "Techno");
- genres.put(19, "Industrial");
- genres.put(20, "Alternative");
- genres.put(21, "Ska");
- genres.put(22, "Death Metal");
- genres.put(23, "Pranks");
- genres.put(24, "Soundtrack");
- genres.put(25, "Euro-Techno");
- genres.put(26, "Ambient");
- genres.put(27, "Trip-Hop");
- genres.put(28, "Vocal");
- genres.put(29, "Jazz+Funk");
- genres.put(30, "Fusion");
- genres.put(31, "Trance");
- genres.put(32, "Classical");
- genres.put(33, "Instrumental");
- genres.put(34, "Acid");
- genres.put(35, "House");
- genres.put(36, "Game");
- genres.put(37, "Sound Clip");
- genres.put(38, "Gospel");
- genres.put(39, "Noise");
- genres.put(40, "AlternRock");
- genres.put(41, "Bass");
- genres.put(42, "Soul");
- genres.put(43, "Punk");
- genres.put(44, "Space");
- genres.put(45, "Meditative");
- genres.put(46, "Instrumental Pop");
- genres.put(47, "Instrumental Rock");
- genres.put(48, "Ethnic");
- genres.put(49, "Gothic");
- genres.put(50, "Darkwave");
- genres.put(51, "Techno-Industrial");
- genres.put(52, "Electronic");
- genres.put(53, "Pop-Folk");
- genres.put(54, "Eurodance");
- genres.put(55, "Dream");
- genres.put(56, "Southern Rock");
- genres.put(57, "Comedy");
- genres.put(58, "Cult");
- genres.put(59, "Gangsta");
- genres.put(60, "Top 40");
- genres.put(61, "Christian Rap");
- genres.put(62, "Pop/Funk");
- genres.put(63, "Jungle");
- genres.put(64, "Native American");
- genres.put(65, "Cabaret");
- genres.put(66, "New Wave");
- genres.put(67, "Psychadelic");
- genres.put(68, "Rave");
- genres.put(69, "Showtunes");
- genres.put(70, "Trailer");
- genres.put(71, "Lo-Fi");
- genres.put(72, "Tribal");
- genres.put(73, "Acid Punk");
- genres.put(74, "Acid Jazz");
- genres.put(75, "Polka");
- genres.put(76, "Retro");
- genres.put(77, "Musical");
- genres.put(78, "Rock & Roll");
- genres.put(79, "Hard Rock");
- }
+ private static final String[] GENRES = new String[] {
+ /* 0 */ "Blues",
+ /* 1 */ "Classic Rock",
+ /* 2 */ "Country",
+ /* 3 */ "Dance",
+ /* 4 */ "Disco",
+ /* 5 */ "Funk",
+ /* 6 */ "Grunge",
+ /* 7 */ "Hip-Hop",
+ /* 8 */ "Jazz",
+ /* 9 */ "Metal",
+ /* 10 */ "New Age",
+ /* 11 */ "Oldies",
+ /* 12 */ "Other",
+ /* 13 */ "Pop",
+ /* 14 */ "R&B",
+ /* 15 */ "Rap",
+ /* 16 */ "Reggae",
+ /* 17 */ "Rock",
+ /* 18 */ "Techno",
+ /* 19 */ "Industrial",
+ /* 20 */ "Alternative",
+ /* 21 */ "Ska",
+ /* 22 */ "Death Metal",
+ /* 23 */ "Pranks",
+ /* 24 */ "Soundtrack",
+ /* 25 */ "Euro-Techno",
+ /* 26 */ "Ambient",
+ /* 27 */ "Trip-Hop",
+ /* 28 */ "Vocal",
+ /* 29 */ "Jazz+Funk",
+ /* 30 */ "Fusion",
+ /* 31 */ "Trance",
+ /* 32 */ "Classical",
+ /* 33 */ "Instrumental",
+ /* 34 */ "Acid",
+ /* 35 */ "House",
+ /* 36 */ "Game",
+ /* 37 */ "Sound Clip",
+ /* 38 */ "Gospel",
+ /* 39 */ "Noise",
+ /* 40 */ "AlternRock",
+ /* 41 */ "Bass",
+ /* 42 */ "Soul",
+ /* 43 */ "Punk",
+ /* 44 */ "Space",
+ /* 45 */ "Meditative",
+ /* 46 */ "Instrumental Pop",
+ /* 47 */ "Instrumental Rock",
+ /* 48 */ "Ethnic",
+ /* 49 */ "Gothic",
+ /* 50 */ "Darkwave",
+ /* 51 */ "Techno-Industrial",
+ /* 52 */ "Electronic",
+ /* 53 */ "Pop-Folk",
+ /* 54 */ "Eurodance",
+ /* 55 */ "Dream",
+ /* 56 */ "Southern Rock",
+ /* 57 */ "Comedy",
+ /* 58 */ "Cult",
+ /* 59 */ "Gangsta",
+ /* 60 */ "Top 40",
+ /* 61 */ "Christian Rap",
+ /* 62 */ "Pop/Funk",
+ /* 63 */ "Jungle",
+ /* 64 */ "Native American",
+ /* 65 */ "Cabaret",
+ /* 66 */ "New Wave",
+ /* 67 */ "Psychadelic",
+ /* 68 */ "Rave",
+ /* 69 */ "Showtunes",
+ /* 70 */ "Trailer",
+ /* 71 */ "Lo-Fi",
+ /* 72 */ "Tribal",
+ /* 73 */ "Acid Punk",
+ /* 74 */ "Acid Jazz",
+ /* 75 */ "Polka",
+ /* 76 */ "Retro",
+ /* 77 */ "Musical",
+ /* 78 */ "Rock & Roll",
+ /* 79 */ "Hard Rock"
+ };
private String title;
private String artist;
@@ -129,7 +124,7 @@
private int genre;
/**
- * Default Private Contructor.
+ * Default private constructor.
*
* @param title the title.
* @param artist the artist.
@@ -173,7 +168,11 @@
}
public String getGenreAsString() {
- return (String) genres.get(genre);
+ if (0 <= genre && genre < GENRES.length) {
+ return GENRES[genre];
+ } else {
+ return null;
+ }
}
/**
@@ -181,20 +180,17 @@
*
* @param stream the <code>InputStream</code> to parse.
* @return a <code>ID3v1Tag</code> if ID3 v1 information is available,
null otherwise.
+ * @throws IOException if the stream can not be read
*/
- public static ID3v1Tag createID3v1Tag(InputStream stream) {
- byte[] buffer;
- try {
- buffer = getSuffix(stream, 128);
- } catch (IOException ex) {
+ public static ID3v1Tag createID3v1Tag(InputStream stream)
+ throws IOException {
+ byte[] buffer = getSuffix(stream, 128);
+ if (buffer.length != 128
+ || buffer[0] != 'T' || buffer[0] != 'A' || buffer[2] != 'G') {
return null;
}
- // We have read what we think is the tag, first check and if ok
extract values
- String tag = new String(buffer, 0, 128);
- if (!StringUtils.equals(StringUtils.substring(tag, 0, 3), "TAG")) {
- return null;
- }
+ String tag = new String(buffer, "ISO-8859-1");
String title = StringUtils.substring(tag, 3, 33).trim();
String artist = StringUtils.substring(tag, 33, 63).trim();
String album = StringUtils.substring(tag, 63, 93).trim();