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;
}
}
}
|