X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fsonitus%2Fio%2FMp3Identifier.java;h=5d4f2ffa5a354bdc6ccbe0fc595956501bef7233;hb=HEAD;hp=b4001bb41a71afcc3dc08458a0f84756f6427b28;hpb=c6e8341e830e6a8360a1d7279487f7ea497a3512;p=sonitus.git diff --git a/src/main/java/net/pterodactylus/sonitus/io/Mp3Identifier.java b/src/main/java/net/pterodactylus/sonitus/io/Mp3Identifier.java index b4001bb..5d4f2ff 100644 --- a/src/main/java/net/pterodactylus/sonitus/io/Mp3Identifier.java +++ b/src/main/java/net/pterodactylus/sonitus/io/Mp3Identifier.java @@ -17,15 +17,23 @@ 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.Format; +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. @@ -39,22 +47,34 @@ public class Mp3Identifier { * * @param inputStream * The input stream - * @return The identified format, or {@link com.google.common.base.Optional#absent()} - * if the format can not be identified + * @return The identified metadata, or {@link Optional#absent()} if the + * metadata can not be identified * @throws IOException * if an I/O error occurs */ - public static Optional identify(InputStream inputStream) throws IOException { - Bitstream bitstream = new Bitstream(inputStream); - try { - Header frame = bitstream.readFrame(); - if (frame == null) { - return Optional.absent(); + public static Optional identify(InputStream inputStream) throws IOException { + 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 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 Format(frame.mode() == Header.SINGLE_CHANNEL ? 1 : 2, frame.frequency(), "MP3")); - } catch (BitstreamException be1) { - return Optional.absent(); } + return Optional.of(new Metadata(formatMetadata, contentMetadata)); } }