FileDocCategorySizeDatePackage
ID3TextEncodingConversion.javaAPI DocJaudiotagger 2.0.43900Wed Mar 30 16:12:06 BST 2011org.jaudiotagger.tag.id3

ID3TextEncodingConversion.java

package org.jaudiotagger.tag.id3;

import org.jaudiotagger.tag.TagOptionSingleton;
import org.jaudiotagger.tag.id3.valuepair.TextEncoding;

import java.util.logging.Logger;

/**
 * Functions to encode text according to encodingoptions and ID3 version
 */
public class ID3TextEncodingConversion
{
    //Logger
    public static Logger logger = Logger.getLogger("org.jaudiotagger.tag.id3");


    /**
     * Check the text encoding is valid for this header type and is appropriate for
     * user text encoding options.                                             *
     * <p/>
     * This is called before writing any frames that use text encoding
     *
     * @param header       used to identify the ID3tagtype
     * @param textEncoding currently set
     * @return valid encoding according to version type and user options
     */
    public static byte  getTextEncoding(AbstractTagFrame header, byte textEncoding)
    {

        //Should not happen, assume v23 and provide a warning
        if (header == null)
        {
            logger.warning("Header has not yet been set for this framebody");

            if (TagOptionSingleton.getInstance().isResetTextEncodingForExistingFrames())
            {
                return TagOptionSingleton.getInstance().getId3v23DefaultTextEncoding();
            }
            else
            {
                return convertV24textEncodingToV23textEncoding(textEncoding);
            }
        }
        else if (header instanceof ID3v24Frame)
        {
            if (TagOptionSingleton.getInstance().isResetTextEncodingForExistingFrames())
            {
                //Replace with default
                return TagOptionSingleton.getInstance().getId3v24DefaultTextEncoding();
            }
            else
            {
                //All text encodings supported nothing to do
                return textEncoding;
            }
        }
        else
        {
            if (TagOptionSingleton.getInstance().isResetTextEncodingForExistingFrames())
            {
                //Replace with default
                return TagOptionSingleton.getInstance().getId3v23DefaultTextEncoding();
            }
            else
            {
                //If text encoding is an unsupported v24 one we use unicode v23 equivalent
                return convertV24textEncodingToV23textEncoding(textEncoding);
            }
        }
    }

    /**
     * Sets the text encoding to best Unicode type for the version
     *
     * @param header
     * @return
     */
    public static byte getUnicodeTextEncoding(AbstractTagFrame header)
    {
        if (header == null)
        {
            logger.warning("Header has not yet been set for this framebody");
            return TextEncoding.UTF_16;
        }
        else if (header instanceof ID3v24Frame)
        {
            return TagOptionSingleton.getInstance().getId3v24UnicodeTextEncoding();
        }
        else
        {
            return TextEncoding.UTF_16;
        }
    }

    /**
     * Convert v24 text encoding to a valid v23 encoding
     *
     * @param textEncoding
     * @return valid encoding
     */
    private static byte convertV24textEncodingToV23textEncoding(byte textEncoding)
    {
        //Convert to equivalent UTF16 format
        if (textEncoding == TextEncoding.UTF_16BE)
        {
            return TextEncoding.UTF_16;
        }
        //UTF-8 is not supported in ID3v23 and UTF-16 Format can be problematic on ID3v23 so change
        //to ISO-8859-1, a check before writing data will check the format is capable of writing the data 
        else if (textEncoding == TextEncoding.UTF_8)
        {
            return TextEncoding.ISO_8859_1;
        }
        else
        {
            return textEncoding;
        }
    }


}