/*
* 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;
import java.io.File;
import java.io.IOException;
import java.io.LineNumberReader;
import java.io.StringReader;
import java.nio.charset.Charset;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.jaudiotagger.audio.generic.GenericAudioHeader;
import org.jaudiotagger.tag.FieldKey;
import org.jaudiotagger.tag.KeyNotFoundException;
import org.jaudiotagger.tag.Tag;
import org.jaudiotagger.tag.TagField;
import org.jaudiotagger.tag.mp4.field.Mp4DiscNoField;
import org.jaudiotagger.tag.mp4.field.Mp4TrackField;
import com.tulskiy.musique.audio.formats.cue.CUEParser;
import com.tulskiy.musique.playlist.Track;
import com.tulskiy.musique.playlist.TrackData;
/**
* Author: Denis Tulskiy
* Date: 25.06.2009
*/
public abstract class AudioFileReader {
private static CUEParser cueParser;
protected static Charset defaultCharset = Charset.forName("iso8859-1");
protected final Logger logger = Logger.getLogger(getClass().getName());
public void read(File file, List<Track> list) {
logger.log(Level.FINEST, "Reading file : {0}", file);
Track track = read(file);
String cueSheet = track.getTrackData().getCueSheet();
if (cueSheet != null && cueSheet.length() > 0) {
if (cueParser == null)
cueParser = new CUEParser();
LineNumberReader reader = new LineNumberReader(new StringReader(cueSheet));
cueParser.parse(list, track, reader, true);
} else {
list.add(track);
}
}
protected abstract Track readSingle(Track track);
public Track reload(Track track) {
Track res = readSingle(track);
if (res.getTrackData().isFile())
res.getTrackData().setLastModified(res.getTrackData().getFile().lastModified());
return res;
}
public Track read(File file) {
Track track = new Track();
track.getTrackData().setLocation(file.toURI().toString());
return reload(track);
}
public abstract boolean isFileSupported(String ext);
// in case of logic change, review MP3TagReader and APETagProcessor
protected void copyCommonTagFields(Tag tag, Track track) throws IOException {
TrackData trackData = track.getTrackData();
if (tag != null && track != null) {
for (FieldKey key : FieldKey.values()) {
List<TagField> fields;
try {
fields = tag.getFields(key);
}
catch (KeyNotFoundException knfe) {
// TODO review
continue;
}
catch (NullPointerException npe) {
// TODO review workaround for mp4tag (throws nullpointer if no mapping found for generic key)
continue;
}
for (TagField field : fields) {
// TODO think how to minimize custom check impact
if (field instanceof Mp4TrackField || field instanceof Mp4DiscNoField) {
break;
}
track.getTrackData().addTagFieldValues(key, field.toString());
}
}
// TODO think about the way
trackData.setCueSheet(tag.getFirst("CUESHEET"));
}
}
protected void copySpecificTagFields(Tag tag, Track track) {
// Empty implementation, to be overridden
}
protected void copyHeaderFields(GenericAudioHeader header, Track track) {
if (header != null && track != null) {
TrackData trackData = track.getTrackData();
trackData.setChannels(header.getChannelNumber());
trackData.setTotalSamples(header.getTotalSamples());
// trackData.setTotalSamples((long) (header.getPreciseLength() * header.getSampleRateAsNumber()));
trackData.setSampleRate(header.getSampleRateAsNumber());
trackData.setStartPosition(0);
trackData.setCodec(header.getFormat());
trackData.setBitrate((int) header.getBitRateAsNumber());
}
}
public static void setDefaultCharset(Charset charset) {
defaultCharset = charset;
}
public static Charset getDefaultCharset() {
return defaultCharset;
}
}