package vazkii.minetunes.playlist; import java.io.File; import java.io.IOException; import net.minecraft.nbt.NBTTagCompound; import com.mpatric.mp3agic.ID3Wrapper; import com.mpatric.mp3agic.InvalidDataException; import com.mpatric.mp3agic.Mp3File; import com.mpatric.mp3agic.UnsupportedTagException; public class MP3Metadata implements Comparable<MP3Metadata> { private static final String TAG_ARTIST = "artist"; private static final String TAG_TITLE = "title"; private static final String TAG_ALBUM = "album"; private static final String TAG_GENRE = "genre"; private static final String TAG_FILENAME = "filename"; private static final String TAG_LENGTH = "length"; private static final String TAG_LENGTHMS = "lengthMs"; private static final String TAG_FRAME_COUNT = "frameCount"; private static final String TAG_FILE_PATH = "filepath"; public final int index; public final File file; public final String artist; public final String title; public final String album; public final String genre; public final String filename; public final String length; public final long lengthMs; public final int frameCount; public MP3Metadata(int index, File file, Mp3File mp3) { this.index = index; this.file = file; filename = file.getName(); ID3Wrapper id3 = new ID3Wrapper(mp3.getId3v1Tag(), mp3.getId3v2Tag()); String artist = id3.getArtist(); String title = id3.getTitle(); String album = id3.getAlbum(); String genre = id3.getGenreDescription(); if(artist == null || title == null || artist.isEmpty() || title.isEmpty()) { this.artist = ""; this.title = filename.replace(".mp3", ""); } else { this.artist = artist; this.title = title; } if(album == null || album.isEmpty()) this.album = "(No Album)"; else this.album = album; if(genre == null || genre.isEmpty()) this.genre = "(Genre not Defined)"; else this.genre = genre; lengthMs = mp3.getLengthInMilliseconds(); length = getLengthStr(lengthMs); frameCount = mp3.getFrameCount(); } public MP3Metadata(int index, File file) throws UnsupportedTagException, InvalidDataException, IOException { this(index, file, new Mp3File(file)); } public MP3Metadata(int index, NBTTagCompound cmp) { this.index = index; artist = cmp.getString(TAG_ARTIST); title = cmp.getString(TAG_TITLE); album = cmp.getString(TAG_ALBUM); genre = cmp.getString(TAG_GENRE); filename = cmp.getString(TAG_FILENAME); length = cmp.getString(TAG_LENGTH); lengthMs = cmp.getLong(TAG_LENGTHMS); frameCount = cmp.getInteger(TAG_FRAME_COUNT); file = new File(cmp.getString(TAG_FILE_PATH)); } public void writeToNBT(NBTTagCompound cmp) { cmp.setString(TAG_ARTIST, artist); cmp.setString(TAG_TITLE, title); cmp.setString(TAG_ALBUM, album); cmp.setString(TAG_GENRE, genre); cmp.setString(TAG_FILENAME, filename); cmp.setString(TAG_LENGTH, length); cmp.setLong(TAG_LENGTHMS, lengthMs); cmp.setInteger(TAG_FRAME_COUNT, frameCount); cmp.setString(TAG_FILE_PATH, file.getAbsolutePath()); } public static String getLengthStr(long ms) { int m = (int) (ms / (60 * 1000)); int s = (int) ((ms / 1000) % 60); return String.format("%d:%02d", m, s); } public boolean isEqualFile(MP3Metadata data) { return this == data || data.file == file || data.file.getAbsolutePath().equals(file.getAbsolutePath()); } public String getFullName() { return artist.trim() + " - " + title.trim(); } public String getSortingKey() { return (title.trim() + artist.trim() + album.trim()).toLowerCase(); } @Override public int compareTo(MP3Metadata o) { return getSortingKey().compareTo(o.getSortingKey()); } }