Split metadata into format and content metadata.
[sonitus.git] / src / main / java / net / pterodactylus / sonitus / io / Mp3Identifier.java
index e9a550b..5d4f2ff 100644 (file)
 
 package net.pterodactylus.sonitus.io;
 
+import static com.google.common.io.Closeables.close;
+import static net.pterodactylus.sonitus.io.mp3.Frame.ChannelMode.SINGLE_CHANNEL;
+
+import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.util.Arrays;
 
+import net.pterodactylus.sonitus.data.ContentMetadata;
+import net.pterodactylus.sonitus.data.FormatMetadata;
 import net.pterodactylus.sonitus.data.Metadata;
+import net.pterodactylus.sonitus.io.mp3.Frame;
+import net.pterodactylus.sonitus.io.mp3.Parser;
 
 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.
@@ -45,16 +53,28 @@ public class Mp3Identifier {
         *              if an I/O error occurs
         */
        public static Optional<Metadata> identify(InputStream inputStream) throws IOException {
-               Bitstream bitstream = new Bitstream(inputStream);
-               try {
-                       Header frame = bitstream.readFrame();
-                       if (frame == null) {
-                               return Optional.absent();
+               Parser mp3Parser = new Parser(inputStream);
+               Frame frame = mp3Parser.nextFrame();
+               FormatMetadata formatMetadata = new FormatMetadata((frame.channelMode() == SINGLE_CHANNEL) ? 1 : 2, frame.samplingRate(), "MP3");
+               ContentMetadata contentMetadata = new ContentMetadata("");
+               /* check for ID3v2 tag. */
+               Optional<byte[]> id3v2TagBuffer = mp3Parser.getId3Tag();
+               if (id3v2TagBuffer.isPresent()) {
+                       byte[] buffer = id3v2TagBuffer.get();
+                       ByteArrayInputStream tagInputStream = new ByteArrayInputStream(Arrays.copyOfRange(buffer, 3, buffer.length));
+                       try {
+                               /* skip “ID3” header tag. */
+                               ID3V2Tag id3v2Tag = ID3V2Tag.read(tagInputStream);
+                               if (id3v2Tag != null) {
+                                       contentMetadata = contentMetadata.artist(id3v2Tag.getArtist()).name(id3v2Tag.getTitle());
+                               }
+                       } catch (ID3Exception id3e1) {
+                               id3e1.printStackTrace();
+                       } finally {
+                               close(tagInputStream, true);
                        }
-                       return Optional.of(new Metadata(frame.mode() == Header.SINGLE_CHANNEL ? 1 : 2, frame.frequency(), "MP3"));
-               } catch (BitstreamException be1) {
-                       return Optional.absent();
                }
+               return Optional.of(new Metadata(formatMetadata, contentMetadata));
        }
 
 }