/* * 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.util.Iterator; import java.util.Map.Entry; import org.jaudiotagger.audio.generic.AbstractTag; import org.jaudiotagger.tag.FieldDataInvalidException; import org.jaudiotagger.tag.FieldKey; import org.jaudiotagger.tag.KeyNotFoundException; import org.jaudiotagger.tag.Tag; import com.tulskiy.musique.gui.model.FieldValues; import com.tulskiy.musique.playlist.Track; import com.tulskiy.musique.util.Util; /** * @Author: Denis Tulskiy * @Date: Oct 9, 2009 */ public abstract class AudioTagWriter { public abstract void write(Track track) throws TagWriteException; public abstract boolean isFileSupported(String ext); /** * Copies Musique track tag field values to destination format specific container. * * @param tag destination format specific container * @param abstractTag destination format specific container implementation (just to create specific TagFields) * @param track Musique track * @throws KeyNotFoundException * @throws FieldDataInvalidException */ // in case of logic change, review MP3TagWriter and APETagProcessor // TODO take a look if refactoring to AbstractTag only fits (in format specific writers) public void copyTagFields(Tag tag, AbstractTag abstractTag, Track track) throws TagWriteException { boolean firstValue; Iterator<Entry<FieldKey, FieldValues>> entries = track.getTrackData().getAllTagFieldValuesIterator(); try { while (entries.hasNext()) { Entry<FieldKey, FieldValues> entry = entries.next(); firstValue = true; for (int i = 0; i < entry.getValue().size(); i++) { String value = entry.getValue().get(i); if (firstValue) { tag.deleteField(entry.getKey()); firstValue = false; } if (!Util.isEmpty(value)) { tag.addField(abstractTag.createField(entry.getKey(), value)); } } } } catch (KeyNotFoundException knfe) { throw new TagWriteException(knfe); } catch (FieldDataInvalidException fdie) { throw new TagWriteException(fdie); } track.getTrackData().removeEmptyTagFields(); } }