package ch.retorte.intervalmusiccompositor.decoder;
import java.io.File;
import org.jaudiotagger.audio.AudioFileIO;
import org.jaudiotagger.audio.mp3.MP3File;
import org.jaudiotagger.tag.FieldKey;
import org.jaudiotagger.tag.id3.AbstractID3v2Tag;
import org.jaudiotagger.tag.id3.ID3v24FieldKey;
import org.jaudiotagger.tag.id3.ID3v24Frames;
import org.jaudiotagger.tag.id3.ID3v24Tag;
import ch.retorte.intervalmusiccompositor.spi.bpm.BPMReaderWriter;
/**
* @author nw
*/
public class Mp3BPMReaderWriter implements BPMReaderWriter {
Mp3FileProperties mp3File = new Mp3FileProperties();
@Override
public Integer readBPMFrom(File file) {
try {
MP3File f = (MP3File) AudioFileIO.read(file);
String bpmTag = "";
if (f.hasID3v2Tag()) {
ID3v24Tag tag = f.getID3v2TagAsv24();
bpmTag = tag.getFirst(ID3v24FieldKey.BPM);
if (!bpmTag.equals("")) {
return Integer.valueOf(bpmTag);
}
}
} catch (Exception e) {
// nop
}
return null;
}
@Override
public void writeBPMTo(Integer bpm, File file) {
try {
MP3File f = (MP3File) AudioFileIO.read(file);
AbstractID3v2Tag tag = null;
if (f.hasID3v2Tag()) {
tag = f.getID3v2Tag();
} else {
tag = new ID3v24Tag();
f.setID3v2Tag(tag);
}
if (tag.hasFrameOfType(ID3v24Frames.FRAME_ID_BPM)) {
tag.setField(FieldKey.BPM, String.valueOf(bpm));
} else {
tag.addField(FieldKey.BPM, String.valueOf(bpm));
tag.createField(FieldKey.BPM, String.valueOf(bpm));
tag.setField(FieldKey.BPM, String.valueOf(bpm));
}
f.commit();
} catch (Exception e) {
// nop
}
}
@Override
public boolean isAbleToReadWriteBPM(File file) {
return mp3File.isOfThisType(file);
}
}