/*
* Copyright (c) 2008, 2009, 2010 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.cue;
import java.io.File;
import java.io.IOException;
import java.io.LineNumberReader;
import java.util.List;
import org.jaudiotagger.tag.FieldKey;
import jwbroek.cuelib.CueParser;
import jwbroek.cuelib.CueSheet;
import jwbroek.cuelib.FileData;
import jwbroek.cuelib.Index;
import jwbroek.cuelib.TrackData;
import com.tulskiy.musique.audio.AudioFileReader;
import com.tulskiy.musique.playlist.Track;
import com.tulskiy.musique.system.TrackIO;
/**
* @Author: Denis Tulskiy
* @Date: 29.06.2009
*/
public class CUEParser {
public void parse(List<Track> list, Track file, LineNumberReader cueStream, boolean embedded) {
try {
CueSheet cueSheet = CueParser.parse(cueStream);
List<FileData> datas = cueSheet.getFileData();
String cueLocation = file.getTrackData().getFile().getAbsolutePath();
if (datas.size() > 0) {
for (FileData fileData : datas) {
if (!embedded) {
String parent = file.getTrackData().getFile().getParent();
File referencedFile = new File(parent, fileData.getFile());
if (!referencedFile.exists())
continue;
AudioFileReader reader = TrackIO.getAudioFileReader(referencedFile.getName());
if (reader == null) break;
file = reader.read(referencedFile);
}
int size = fileData.getTrackData().size();
for (int i = 0; i < size; i++) {
TrackData trackData = fileData.getTrackData().get(i);
Track track = file.copy();
track.getTrackData().setCueEmbedded(embedded);
if (!embedded)
track.getTrackData().setCueLocation(cueLocation);
String album = trackData.getMetaData(CueSheet.MetaDataField.ALBUMTITLE);
if (album.length() > 0)
track.getTrackData().setTagFieldValues(FieldKey.ALBUM, album);
String artist = trackData.getPerformer();
track.getTrackData().setTagFieldValues(FieldKey.ARTIST, artist != null && artist.length() > 0 ? artist : cueSheet.getPerformer());
track.getTrackData().setTagFieldValues(FieldKey.ALBUM_ARTIST, cueSheet.getPerformer());
track.getTrackData().setTagFieldValues(FieldKey.COMMENT, cueSheet.getComment());
track.getTrackData().setTagFieldValues(FieldKey.TITLE, trackData.getTitle());
String year = trackData.getMetaData(CueSheet.MetaDataField.YEAR);
if (year.length() > 0)
track.getTrackData().setTagFieldValues(FieldKey.YEAR, year);
track.getTrackData().setTagFieldValues(FieldKey.TRACK, String.valueOf(trackData.getNumber()));
String genre = trackData.getMetaData(CueSheet.MetaDataField.GENRE);
if (genre.length() > 0)
track.getTrackData().setTagFieldValues(FieldKey.GENRE, genre);
int sampleRate = track.getTrackData().getSampleRate();
long startPosition = indexToSample(trackData.getIndex(1), sampleRate);
// System.out.println(song.getFile().getName() + " " + startPosition);
long endPosition;
if (i >= size - 1) {
endPosition = track.getTrackData().getTotalSamples();
} else {
TrackData nextTrack = fileData.getTrackData().get(i + 1);
endPosition = indexToSample(nextTrack.getIndex(1), sampleRate);
}
track.getTrackData().setTotalSamples(endPosition - startPosition);
track.getTrackData().setSubsongIndex(i + 1);
track.getTrackData().setStartPosition(startPosition);
list.add(track);
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
private long indexToSample(Index index, int sampleRate) {
// System.out.println(index.getPosition().getTotalFrames() / 75d * sampleRate);
return (long) (index.getPosition().getTotalFrames() / 75d * sampleRate);
}
}