Parse ID3v2 tag from MP3 streams.
authorDavid ‘Bombe’ Roden <bombe@pterodactylus.net>
Sun, 17 Mar 2013 09:57:25 +0000 (10:57 +0100)
committerDavid ‘Bombe’ Roden <bombe@pterodactylus.net>
Sun, 17 Mar 2013 09:57:25 +0000 (10:57 +0100)
pom.xml
src/main/java/net/pterodactylus/sonitus/io/Mp3Identifier.java

diff --git a/pom.xml b/pom.xml
index b78f4ba..d4fff91 100644 (file)
--- a/pom.xml
+++ b/pom.xml
                        <artifactId>jlayer</artifactId>
                        <version>1.0.1</version>
                </dependency>
+               <dependency>
+                       <groupId>org.blinkenlights.jid3</groupId>
+                       <artifactId>JID3</artifactId>
+                       <version>0.46</version>
+               </dependency>
        </dependencies>
 
        <properties>
index e9a550b..62285c4 100644 (file)
@@ -26,6 +26,8 @@ import com.google.common.base.Optional;
 import javazoom.jl.decoder.Bitstream;
 import javazoom.jl.decoder.BitstreamException;
 import javazoom.jl.decoder.Header;
+import org.blinkenlights.jid3.ID3Exception;
+import org.blinkenlights.jid3.v2.ID3V2Tag;
 
 /**
  * Identifies MP3 files.
@@ -46,12 +48,25 @@ public class Mp3Identifier {
         */
        public static Optional<Metadata> identify(InputStream inputStream) throws IOException {
                Bitstream bitstream = new Bitstream(inputStream);
+               Optional<ID3V2Tag> id3v2Tag = Optional.absent();
+               try {
+                       InputStream id3v2Stream = bitstream.getRawID3v2();
+                       id3v2Stream.read(new byte[3]);
+                       id3v2Tag = Optional.fromNullable(ID3V2Tag.read(id3v2Stream));
+               } catch (ID3Exception id3e1) {
+                       /* ID3v2 tag could not be parsed, don’t cry about it. */
+               }
                try {
                        Header frame = bitstream.readFrame();
                        if (frame == null) {
                                return Optional.absent();
                        }
-                       return Optional.of(new Metadata(frame.mode() == Header.SINGLE_CHANNEL ? 1 : 2, frame.frequency(), "MP3"));
+                       Metadata metadata = new Metadata(frame.mode() == Header.SINGLE_CHANNEL ? 1 : 2, frame.frequency(), "MP3");
+                       if (id3v2Tag.isPresent()) {
+                               metadata = metadata.artist(id3v2Tag.get().getArtist());
+                               metadata = metadata.name(id3v2Tag.get().getTitle());
+                       }
+                       return Optional.of(metadata);
                } catch (BitstreamException be1) {
                        return Optional.absent();
                }