package com.limegroup.gnutella.metadata.audio.reader;
import java.io.File;
import java.io.IOException;
import org.jaudiotagger.audio.AudioFile;
import org.jaudiotagger.audio.AudioFileIO;
import org.jaudiotagger.audio.AudioHeader;
import org.jaudiotagger.audio.exceptions.CannotReadException;
import org.jaudiotagger.audio.exceptions.InvalidAudioFrameException;
import org.jaudiotagger.audio.exceptions.ReadOnlyFileException;
import org.jaudiotagger.tag.Tag;
import org.jaudiotagger.tag.TagException;
import org.jaudiotagger.tag.vorbiscomment.VorbisCommentTag;
import com.limegroup.gnutella.metadata.MetaReader;
import com.limegroup.gnutella.metadata.audio.AudioMetaData;
/**
* Handles the reading of most audio files. All file types supported by
* jAudioTagger can use this class to read their meta data.
*/
public class AudioDataReader implements MetaReader {
public static final String ISO_LATIN_1 = "8859_1";
public static final String UNICODE = "Unicode";
public static final String MAGIC_KEY = "NOT CLEARED";
public static final String SHAREABLE = "SHAREABLE";
/**
* Reads header information about the file. All audio formats contain
* some sort of header information to describe how the audio file is encoded.
* This typically includes sample rate, bit rate, length, encoding scheme, etc.
*/
private void readHeader(AudioMetaData audioData, AudioHeader header) {
audioData.setVBR(header.isVariableBitRate());
audioData.setSampleRate(header.getSampleRateAsNumber());
audioData.setBitrate((int)header.getBitRateAsNumber());
audioData.setLength(header.getTrackLength());
}
/**
* Reads any metadata the user may have added to this audio format. Each audio
* type has its own format for describing the audio file.
*/
protected void readTag(AudioMetaData audioData, AudioFile audioFile, Tag tag){
audioData.setTitle(tag.getFirstTitle());
audioData.setArtist(tag.getFirstArtist());
audioData.setAlbum(tag.getFirstAlbum());
audioData.setYear(tag.getFirstYear());
audioData.setComment(tag.getFirstComment());
audioData.setTrack(tag.getFirstTrack());
audioData.setGenre(tag.getFirstGenre());
//if an ogg or flac file, try reading the license
if(tag instanceof VorbisCommentTag) {
audioData.setLicense(tag.getFirst("LICENSE"));
}
}
/**
* Handles the reading and parsing of this file.
* @param file file to read
* @throws IOException - thrown if the file can't be read, is corrupted, etc.
*/
@Override
public AudioMetaData parse(File file) throws IOException {
try {
AudioMetaData audioData = new AudioMetaData();
AudioFile audioFile = AudioFileIO.read(file);
readHeader(audioData, audioFile.getAudioHeader());
readTag(audioData, audioFile, audioFile.getTag());
return audioData;
} catch (CannotReadException e) {
throw (IOException)new IOException().initCause(e);
} catch (TagException e) {
throw (IOException)new IOException().initCause(e);
} catch (ReadOnlyFileException e) {
throw (IOException)new IOException().initCause(e);
} catch (InvalidAudioFrameException e) {
throw (IOException)new IOException().initCause(e);
}
}
@Override
public String[] getSupportedExtensions() {
return new String[] { "fla", "flac", "m4a", "m4p", "ogg", "wav", "ra", "ram"};
}
}