FileDocCategorySizeDatePackage
TagConverter.javaAPI DocJaudiotagger 2.0.48583Wed Mar 30 16:11:52 BST 2011org.jaudiotagger.audio.asf.util

TagConverter.java

/*
 * 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.
    }

}