/*
* Copyright (c) 2008, 2009, 2010, 2011 Denis Tulskiy
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with this work. If not, see <http://www.gnu.org/licenses/>.
*/
package com.tulskiy.musique.audio.formats.ape;
import com.tulskiy.musique.playlist.Track;
import com.tulskiy.musique.playlist.TrackData;
import com.tulskiy.musique.util.Util;
import davaguine.jmac.info.APETag;
import davaguine.jmac.info.ID3Tag;
import davaguine.jmac.tools.RandomAccessFile;
import java.io.IOException;
import org.jaudiotagger.tag.FieldKey;
/**
* Author: Denis Tulskiy
* Date: 26.06.2009
*/
public class APETagProcessor {
public APETagProcessor() {
ID3Tag.setDefaultEncoding("windows-1251");
}
public boolean readAPEv2Tag(Track track) throws IOException {
TrackData trackData = track.getTrackData();
RandomAccessFile ras = null;
try {
ras = new RandomAccessFile(trackData.getFile(), "r");
APETag tag = new APETag(ras, true);
if (tag.GetHasAPETag() || tag.GetHasID3Tag()) {
setMusiqueTagFieldValue(tag, trackData, FieldKey.ARTIST, APETag.APE_TAG_FIELD_ARTIST);
setMusiqueTagFieldValue(tag, trackData, FieldKey.ALBUM, APETag.APE_TAG_FIELD_ALBUM);
setMusiqueTagFieldValue(tag, trackData, FieldKey.TITLE, APETag.APE_TAG_FIELD_TITLE);
setMusiqueTagFieldValue(tag, trackData, FieldKey.YEAR, APETag.APE_TAG_FIELD_YEAR);
setMusiqueTagFieldValue(tag, trackData, FieldKey.GENRE, APETag.APE_TAG_FIELD_GENRE);
setMusiqueTagFieldValue(tag, trackData, FieldKey.COMMENT, APETag.APE_TAG_FIELD_COMMENT);
setMusiqueTagFieldValue(tag, trackData, FieldKey.ALBUM_ARTIST, "album artist");
handleTrackDiscFields(tag, trackData);
setCustomMusiqueTagFieldValue(tag, trackData, FieldKey.RECORD_LABEL);
setCustomMusiqueTagFieldValue(tag, trackData, FieldKey.CATALOG_NO);
setCustomMusiqueTagFieldValue(tag, trackData, FieldKey.RATING);
trackData.setCueSheet(tag.GetFieldString("CUESHEET"));
if (tag.GetHasAPETag())
return tag.GetHasAPETag();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (ras != null)
ras.close();
}
return false;
}
public void writeAPEv2Tag(Track track) throws IOException {
TrackData trackData = track.getTrackData();
RandomAccessFile ras = null;
try {
ras = new RandomAccessFile(trackData.getFile(), "rw");
APETag tag = new APETag(ras, true);
setApeTagFieldValue(tag, trackData, FieldKey.ARTIST, APETag.APE_TAG_FIELD_ARTIST);
setApeTagFieldValue(tag, trackData, FieldKey.ALBUM, APETag.APE_TAG_FIELD_ALBUM);
setApeTagFieldValue(tag, trackData, FieldKey.TITLE, APETag.APE_TAG_FIELD_TITLE);
setApeTagFieldValue(tag, trackData, FieldKey.YEAR, APETag.APE_TAG_FIELD_YEAR);
setApeTagFieldValue(tag, trackData, FieldKey.GENRE, APETag.APE_TAG_FIELD_GENRE);
setApeTagFieldValue(tag, trackData, FieldKey.COMMENT, APETag.APE_TAG_FIELD_COMMENT);
setApeTagFieldValue(tag, trackData, FieldKey.TRACK, APETag.APE_TAG_FIELD_TRACK);
setApeTagFieldValue(tag, trackData, FieldKey.ALBUM_ARTIST, "Album Artist");
setCustomApeTagFieldValue(tag, trackData, FieldKey.DISC_NO);
setCustomApeTagFieldValue(tag, trackData, FieldKey.TRACK_TOTAL);
setCustomApeTagFieldValue(tag, trackData, FieldKey.DISC_TOTAL);
setCustomApeTagFieldValue(tag, trackData, FieldKey.RECORD_LABEL);
setCustomApeTagFieldValue(tag, trackData, FieldKey.CATALOG_NO);
setCustomApeTagFieldValue(tag, trackData, FieldKey.RATING);
// TODO review this hardcoded const
tag.SetFieldString("CUESHEET", trackData.getCueSheet());
tag.Save();
track.getTrackData().removeEmptyTagFields();
} finally {
if (ras != null)
ras.close();
}
}
private void setMusiqueTagFieldValue(APETag tag, TrackData trackData, FieldKey musiqueKey, String apeKey) throws IOException {
String value = tag.GetFieldString(apeKey);
if (value != null) {
trackData.setTagFieldValues(musiqueKey, value);
}
}
private void setApeTagFieldValue(APETag tag, TrackData trackData, FieldKey musiqueKey, String apeKey) throws IOException {
String value = trackData.getFirstTagFieldValue(musiqueKey);
if (!Util.isEmpty(value)) {
tag.SetFieldString(apeKey, value);
}
else if (tag.GetFieldString(apeKey) != null) {
tag.RemoveField(apeKey);
}
}
private void setCustomMusiqueTagFieldValue(APETag tag, TrackData trackData, FieldKey musiqueKey) throws IOException {
setMusiqueTagFieldValue(tag, trackData, musiqueKey, musiqueKey.toString());
}
private void setCustomApeTagFieldValue(APETag tag, TrackData trackData, FieldKey musiqueKey) throws IOException {
setApeTagFieldValue(tag, trackData, musiqueKey, musiqueKey.toString());
}
private void handleTrackDiscFields(APETag tag, TrackData trackData) throws IOException {
String value = tag.GetFieldString(APETag.APE_TAG_FIELD_TRACK);
if (!Util.isEmpty(value)) {
if (!value.contains("/")) {
setMusiqueTagFieldValue(tag, trackData, FieldKey.TRACK, APETag.APE_TAG_FIELD_TRACK);
setCustomMusiqueTagFieldValue(tag, trackData, FieldKey.TRACK_TOTAL);
}
else {
String[] parts = value.split("/");
trackData.setTagFieldValues(FieldKey.TRACK, parts[0]);
if (parts.length > 1) {
trackData.setTagFieldValues(FieldKey.TRACK_TOTAL, parts[1]);
}
}
}
setCustomMusiqueTagFieldValue(tag, trackData, FieldKey.DISC_NO);
setCustomMusiqueTagFieldValue(tag, trackData, FieldKey.DISC_TOTAL);
}
}