package com.mpatric.mp3agic.app; import java.io.UnsupportedEncodingException; import com.mpatric.mp3agic.BaseException; import com.mpatric.mp3agic.BufferTools; import com.mpatric.mp3agic.ID3Wrapper; import com.mpatric.mp3agic.ID3v1; import com.mpatric.mp3agic.ID3v2; import com.mpatric.mp3agic.Mp3File; import com.mpatric.mp3agic.Version; public class Mp3Catalog extends BaseApp { private static final String CBR = "CBR"; private static final String VBR = "VBR"; private static final int MAX_CUSTOM_TAG_BYTES_TO_SHOW = 64; private Mp3File mp3file; protected Mp3Catalog() { } protected Mp3Catalog(String filename) { try { mp3file = new Mp3File(filename); catalog(); } catch (BaseException e) { printError("ERROR processing " + extractFilename(filename) + " - " + e.getDetailedMessage()); } catch (Exception e) { printError("ERROR processing " + extractFilename(filename) + " - " + formatExceptionMessage(e)); } } protected void catalog() { StringBuffer cat = new StringBuffer(); catalogMp3Fields(cat); catalogId3Fields(cat); catalogCustomTag(cat); printOut(cat.toString()); } private void catalogMp3Fields(StringBuffer cat) { catalogField(cat, extractFilename(mp3file.getFilename())); catalogField(cat, Long.toString(mp3file.getLength())); catalogField(cat, Long.toString(mp3file.getLengthInSeconds())); catalogField(cat, mp3file.getVersion()); catalogField(cat, mp3file.getLayer()); catalogField(cat, Integer.toString(mp3file.getSampleRate())); catalogField(cat, Integer.toString(mp3file.getBitrate())); catalogField(cat, vbrString(mp3file.isVbr())); catalogField(cat, mp3file.getChannelMode()); } private String vbrString(boolean vbr) { if (vbr) return VBR; return CBR; } private void catalogId3Fields(StringBuffer cat) { ID3v1 id3v1tag = mp3file.getId3v1Tag(); ID3v2 id3v2tag = mp3file.getId3v2Tag(); ID3Wrapper id3wrapper = new ID3Wrapper(id3v1tag, id3v2tag); if (id3v1tag != null) catalogField(cat, "1." + id3v1tag.getVersion()); else catalogField(cat, null); if (id3v2tag != null) catalogField(cat, "2." + id3v2tag.getVersion()); else catalogField(cat, null); catalogField(cat, id3wrapper.getTrack()); catalogField(cat, id3wrapper.getArtist()); catalogField(cat, id3wrapper.getAlbum()); catalogField(cat, id3wrapper.getTitle()); catalogField(cat, id3wrapper.getYear()); catalogField(cat, id3wrapper.getGenreDescription()); catalogField(cat, id3wrapper.getComment()); catalogField(cat, id3wrapper.getComposer()); catalogField(cat, id3wrapper.getOriginalArtist()); catalogField(cat, id3wrapper.getCopyright()); catalogField(cat, id3wrapper.getUrl()); catalogField(cat, id3wrapper.getEncoder()); catalogField(cat, id3wrapper.getAlbumImageMimeType()); } private void catalogCustomTag(StringBuffer cat) { byte[] bytes = mp3file.getCustomTag(); if (bytes == null) { catalogLastField(cat, ""); } else { int length = Math.min(bytes.length, MAX_CUSTOM_TAG_BYTES_TO_SHOW); try { String s = BufferTools.byteBufferToString(bytes, 0, length); catalogLastField(cat, BufferTools.asciiOnly(s)); } catch (UnsupportedEncodingException e) { catalogLastField(cat, ""); } } } private void catalogField(StringBuffer cat, String field) { catalogField(cat, field, false); } private void catalogLastField(StringBuffer cat, String field) { catalogField(cat, field, true); } private void catalogField(StringBuffer cat, String field, boolean last) { cat.append("\""); if (field != null) { cat.append(escapeQuotes(field)); } cat.append("\""); if (! last) { cat.append(","); } } protected String escapeQuotes(String s) { return BufferTools.substitute(s, "\"", "\"\""); } public static void main(String[] args) { if (args.length < 1) { usage(); } else { String filename = args[0]; new Mp3Catalog(filename); } } private static void usage() { System.out.println("mp3cat [mp3agic " + Version.asString() + "]"); } }