package com.limegroup.gnutella.metadata;
import java.io.File;
import java.io.IOException;
import com.jcraft.jorbis.Comment;
import com.jcraft.jorbis.JOrbisException;
import com.jcraft.jorbis.VorbisFile;
/**
* this file parses comments from an ogg file
*
* for general packet specs see:
* <url>http://www.xiph.org/ogg/vorbis/doc/vorbis-spec-ref.html</url>
*
* for comment spec see:
* <url>http://www.xiph.org/ogg/vorbis/doc/v-comment.html</url>
* and
* <url>http://reactor-core.org/ogg-tag-recommendations.html</url>
*/
public class OGGMetaData extends AudioMetaData{
//a set of recommended headers by the spec:
//note we parse only those tags relevant to the Lime XML Audio schema
public static final String TITLE_TAG = "title";
public static final String TRACK_TAG = "tracknumber";
public static final String ALBUM_TAG = "album";
public static final String GENRE_TAG = "genre";
public static final String DATE_TAG = "date";
public static final String COMMENT_TAG = "comment";
public static final String ARTIST_TAG = "artist";
public static final String LICENSE_TAG = "license";
public OGGMetaData(File f) throws IOException{
super(f);
}
protected void parseFile(File file) throws IOException {
//throw new Error("not implemented");
//read the 0 byte header
VorbisFile vfile=null;
Comment [] comments;
try {
vfile = new VorbisFile(file.getAbsolutePath());
}catch (JOrbisException failed) {
throw new IOException (failed.getMessage());
}finally {
if (vfile!=null)
try{vfile.close();}catch(IOException ignored){}
}
setBitrate((int)(vfile.bitrate(-1)/1024));
setLength((int)vfile.time_total(-1));
comments = vfile.getComment();
if (comments.length > 0 && comments[0]!=null) {
//any given tag may or may not exist. If it doesn't, the
//query method returns null.
setTitle(safeQuery(TITLE_TAG,comments[0]));
setArtist(safeQuery(ARTIST_TAG,comments[0]));
setAlbum(safeQuery(ALBUM_TAG,comments[0]));
setComment(safeQuery(COMMENT_TAG,comments[0]));
setGenre(safeQuery(GENRE_TAG,comments[0]));
setLicense(safeQuery(LICENSE_TAG, comments[0]));
//oggs store the year in yyyy-mm-dd format
String year = safeQuery(DATE_TAG,comments[0]);
if (year.length()>4)
year = year.substring(0,4);
setYear(year);
try {
short track = Short.parseShort(safeQuery(TRACK_TAG,comments[0]));
setTrack(track);
}catch(NumberFormatException ignored) {}
}
}
/**
* oggs may contain a tag, or may not. If they don't, the provided
* query method returns null, and we don't want that.
*/
private String safeQuery(String tag, Comment comment) {
String res = comment.query(tag);
return res == null ? "" : res;
}
}