/* * Entagged Audio Tag library * Copyright (c) 2004-2005 Christian Laireiter <liree@web.de> * * This library 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 2.1 of the License, or (at your option) any later version. * * This library 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 along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ package org.jaudiotagger.audio.asf.util; import org.jaudiotagger.audio.asf.data.*; import org.jaudiotagger.tag.FieldKey; import org.jaudiotagger.tag.Tag; import org.jaudiotagger.tag.asf.*; import org.jaudiotagger.tag.reference.GenreTypes; import java.util.Iterator; import java.util.List; /** * This class provides functionality to convert * {@link org.jaudiotagger.audio.asf.data.AsfHeader}objects into * {@link org.jaudiotagger.tag.Tag}objects.<br> * * @author Christian Laireiter (liree) */ public final class TagConverter { /** * This method assigns those tags of <code>tag</code> which are defined to * be common by jaudiotagger. <br> * * @param tag * The tag from which the values are gathered. <br> * Assigned values are: <br> * @param description * The extended content description which should receive the * values. <br> * <b>Warning: </b> the common values will be replaced. */ public static void assignCommonTagValues(Tag tag, MetadataContainer description) { assert description.getContainerType() == ContainerType.EXTENDED_CONTENT; MetadataDescriptor tmp; if (!Utils.isBlank(tag.getFirst(FieldKey.ALBUM))) { tmp = new MetadataDescriptor(description.getContainerType(), AsfFieldKey.ALBUM.getFieldName(), MetadataDescriptor.TYPE_STRING); tmp.setStringValue(tag.getFirst(FieldKey.ALBUM)); description.removeDescriptorsByName(tmp.getName()); description.addDescriptor(tmp); } else { description.removeDescriptorsByName(AsfFieldKey.ALBUM .getFieldName()); } if (!Utils.isBlank(tag.getFirst(FieldKey.TRACK))) { tmp = new MetadataDescriptor(description.getContainerType(), AsfFieldKey.TRACK.getFieldName(), MetadataDescriptor.TYPE_STRING); tmp.setStringValue(tag.getFirst(FieldKey.TRACK)); description.removeDescriptorsByName(tmp.getName()); description.addDescriptor(tmp); } else { description.removeDescriptorsByName(AsfFieldKey.TRACK .getFieldName()); } if (!Utils.isBlank(tag.getFirst(FieldKey.YEAR))) { tmp = new MetadataDescriptor(description.getContainerType(), AsfFieldKey.YEAR.getFieldName(), MetadataDescriptor.TYPE_STRING); tmp.setStringValue(tag.getFirst(FieldKey.YEAR)); description.removeDescriptorsByName(tmp.getName()); description.addDescriptor(tmp); } else { description .removeDescriptorsByName(AsfFieldKey.YEAR.getFieldName()); } if (!Utils.isBlank(tag.getFirst(FieldKey.GENRE))) { // Write Genre String value tmp = new MetadataDescriptor(description.getContainerType(), AsfFieldKey.GENRE.getFieldName(), MetadataDescriptor.TYPE_STRING); tmp.setStringValue(tag.getFirst(FieldKey.GENRE)); description.removeDescriptorsByName(tmp.getName()); description.addDescriptor(tmp); Integer genreNum = GenreTypes.getInstanceOf().getIdForName( tag.getFirst(FieldKey.GENRE)); // ..and if it is one of the standard genre types used the id as // well if (genreNum != null) { tmp = new MetadataDescriptor(description.getContainerType(), AsfFieldKey.GENRE_ID.getFieldName(), MetadataDescriptor.TYPE_STRING); tmp.setStringValue("(" + genreNum + ")"); description.removeDescriptorsByName(tmp.getName()); description.addDescriptor(tmp); } else { description.removeDescriptorsByName(AsfFieldKey.GENRE_ID .getFieldName()); } } else { description.removeDescriptorsByName(AsfFieldKey.GENRE .getFieldName()); description.removeDescriptorsByName(AsfFieldKey.GENRE_ID .getFieldName()); } } /** * This method creates a {@link Tag}and fills it with the contents of the * given {@link AsfHeader}.<br> * * @param source * The ASF header which contains the information. <br> * @return A Tag with all its values. */ public static AsfTag createTagOf(AsfHeader source) { // TODO do we need to copy here. AsfTag result = new AsfTag(true); for (int i = 0; i < ContainerType.values().length; i++) { MetadataContainer current = source .findMetadataContainer(ContainerType.values()[i]); if (current != null) { List<MetadataDescriptor> descriptors = current.getDescriptors(); for (MetadataDescriptor descriptor : descriptors) { AsfTagField toAdd; if (descriptor.getType() == MetadataDescriptor.TYPE_BINARY) { if (descriptor.getName().equals( AsfFieldKey.COVER_ART.getFieldName())) { toAdd = new AsfTagCoverField(descriptor); } else if (descriptor.getName().equals( AsfFieldKey.BANNER_IMAGE.getFieldName())) { toAdd = new AsfTagBannerField(descriptor); } else { toAdd = new AsfTagField(descriptor); } } else { toAdd = new AsfTagTextField(descriptor); } result.addField(toAdd); } } } return result; } /** * This method distributes the tags fields among the * {@linkplain ContainerType#getOrdered()} {@linkplain MetadataContainer * containers}. * * @param tag * the tag with the fields to distribute. * @return distribution */ public static MetadataContainer[] distributeMetadata(final AsfTag tag) { final Iterator<AsfTagField> asfFields = tag.getAsfFields(); final MetadataContainer[] createContainers = MetadataContainerFactory .getInstance().createContainers(ContainerType.getOrdered()); boolean assigned; AsfTagField current; while (asfFields.hasNext()) { current = asfFields.next(); assigned = false; for (int i = 0; !assigned && i < createContainers.length; i++) { if (ContainerType.areInCorrectOrder(createContainers[i] .getContainerType(), AsfFieldKey.getAsfFieldKey( current.getId()).getHighestContainer())) { if (createContainers[i].isAddSupported(current .getDescriptor())) { createContainers[i].addDescriptor(current .getDescriptor()); assigned = true; } } } assert assigned; } return createContainers; } /** * Hidden utility class constructor. */ private TagConverter() { // Nothing to do. } }