📄 id3v24tag.java
字号:
/*
* MusicTag Copyright (C)2003,2004
*
* 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,
* you can get a copy from http://www.opensource.org/licenses/lgpl-license.php or write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package com.hadeslee.audiotag.tag.id3;
import com.hadeslee.audiotag.FileConstants;
import com.hadeslee.audiotag.audio.mp3.MP3File;
import com.hadeslee.audiotag.tag.EmptyFrameException;
import com.hadeslee.audiotag.tag.FieldDataInvalidException;
import com.hadeslee.audiotag.tag.InvalidFrameException;
import com.hadeslee.audiotag.tag.InvalidFrameIdentifierException;
import com.hadeslee.audiotag.tag.InvalidTagException;
import com.hadeslee.audiotag.tag.KeyNotFoundException;
import com.hadeslee.audiotag.tag.TagException;
import com.hadeslee.audiotag.tag.TagField;
import com.hadeslee.audiotag.tag.TagFieldKey;
import com.hadeslee.audiotag.tag.TagNotFoundException;
import com.hadeslee.audiotag.tag.id3.framebody.AbstractID3v2FrameBody;
import com.hadeslee.audiotag.tag.id3.framebody.FrameBodyCOMM;
import com.hadeslee.audiotag.tag.id3.framebody.FrameBodyTALB;
import com.hadeslee.audiotag.tag.id3.framebody.FrameBodyTCON;
import com.hadeslee.audiotag.tag.id3.framebody.FrameBodyTDRC;
import com.hadeslee.audiotag.tag.id3.framebody.FrameBodyTIT2;
import com.hadeslee.audiotag.tag.id3.framebody.FrameBodyTPE1;
import com.hadeslee.audiotag.tag.id3.framebody.FrameBodyTRCK;
import com.hadeslee.audiotag.tag.id3.valuepair.GenreTypes;
import com.hadeslee.audiotag.tag.lyrics3.AbstractLyrics3;
import com.hadeslee.audiotag.tag.lyrics3.Lyrics3v2;
import com.hadeslee.audiotag.tag.lyrics3.Lyrics3v2Field;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.WritableByteChannel;
import java.util.*;
import java.util.logging.Level;
/**
* Represents an ID3v2.4 tag.
*
* @author : Paul Taylor
* @author : Eric Farng
* @version $Id: ID3v24Tag.java,v 1.39 2007/12/03 13:28:04 paultaylor Exp $
*/
public class ID3v24Tag extends AbstractID3v2Tag
{
protected static final String TYPE_FOOTER = "footer";
protected static final String TYPE_IMAGEENCODINGRESTRICTION = "imageEncodingRestriction";
protected static final String TYPE_IMAGESIZERESTRICTION = "imageSizeRestriction";
protected static final String TYPE_TAGRESTRICTION = "tagRestriction";
protected static final String TYPE_TAGSIZERESTRICTION = "tagSizeRestriction";
protected static final String TYPE_TEXTENCODINGRESTRICTION = "textEncodingRestriction";
protected static final String TYPE_TEXTFIELDSIZERESTRICTION = "textFieldSizeRestriction";
protected static final String TYPE_UPDATETAG = "updateTag";
protected static final String TYPE_CRCDATA = "crcdata";
protected static final String TYPE_EXPERIMENTAL = "experimental";
protected static final String TYPE_EXTENDED = "extended";
protected static final String TYPE_PADDINGSIZE = "paddingsize";
protected static final String TYPE_UNSYNCHRONISATION = "unsyncronisation";
protected static int TAG_EXT_HEADER_LENGTH = 6;
protected static int TAG_EXT_HEADER_UPDATE_LENGTH = 1;
protected static int TAG_EXT_HEADER_CRC_LENGTH = 6;
protected static int TAG_EXT_HEADER_RESTRICTION_LENGTH = 2;
protected static int TAG_EXT_HEADER_CRC_DATA_LENGTH = 5;
protected static int TAG_EXT_HEADER_RESTRICTION_DATA_LENGTH = 1;
protected static int TAG_EXT_NUMBER_BYTES_DATA_LENGTH = 1;
/**
* ID3v2.4 Header bit mask
*/
public static final int MASK_V24_UNSYNCHRONIZATION = FileConstants.BIT7;
/**
* ID3v2.4 Header bit mask
*/
public static final int MASK_V24_EXTENDED_HEADER = FileConstants.BIT6;
/**
* ID3v2.4 Header bit mask
*/
public static final int MASK_V24_EXPERIMENTAL = FileConstants.BIT5;
/**
* ID3v2.4 Header bit mask
*/
public static final int MASK_V24_FOOTER_PRESENT = FileConstants.BIT4;
/**
* ID3v2.4 Extended header bit mask
*/
public static final int MASK_V24_TAG_UPDATE = FileConstants.BIT6;
/**
* ID3v2.4 Extended header bit mask
*/
public static final int MASK_V24_CRC_DATA_PRESENT = FileConstants.BIT5;
/**
* ID3v2.4 Extended header bit mask
*/
public static final int MASK_V24_TAG_RESTRICTIONS = FileConstants.BIT4;
/**
* ID3v2.4 Extended header bit mask
*/
public static final int MASK_V24_TAG_SIZE_RESTRICTIONS = (byte) FileConstants.BIT7 | FileConstants.BIT6;
/**
* ID3v2.4 Extended header bit mask
*/
public static final int MASK_V24_TEXT_ENCODING_RESTRICTIONS = FileConstants.BIT5;
/**
* ID3v2.4 Extended header bit mask
*/
public static final int MASK_V24_TEXT_FIELD_SIZE_RESTRICTIONS = FileConstants.BIT4 | FileConstants.BIT3;
/**
* ID3v2.4 Extended header bit mask
*/
public static final int MASK_V24_IMAGE_ENCODING = FileConstants.BIT2;
/**
* ID3v2.4 Extended header bit mask
*/
public static final int MASK_V24_IMAGE_SIZE_RESTRICTIONS = FileConstants.BIT2 | FileConstants.BIT1;
/**
* ID3v2.4 Header Footer are the same as the header flags. WHY?!?! move the
* flags from thier position in 2.3??????????
*/
/**
* ID3v2.4 Header Footer bit mask
*/
public static final int MASK_V24_TAG_ALTER_PRESERVATION = FileConstants.BIT6;
/**
* ID3v2.4 Header Footer bit mask
*/
public static final int MASK_V24_FILE_ALTER_PRESERVATION = FileConstants.BIT5;
/**
* ID3v2.4 Header Footer bit mask
*/
public static final int MASK_V24_READ_ONLY = FileConstants.BIT4;
/**
* ID3v2.4 Header Footer bit mask
*/
public static final int MASK_V24_GROUPING_IDENTITY = FileConstants.BIT6;
/**
* ID3v2.4 Header Footer bit mask
*/
public static final int MASK_V24_COMPRESSION = FileConstants.BIT4;
/**
* ID3v2.4 Header Footer bit mask
*/
public static final int MASK_V24_ENCRYPTION = FileConstants.BIT3;
/**
* ID3v2.4 Header Footer bit mask
*/
public static final int MASK_V24_FRAME_UNSYNCHRONIZATION = FileConstants.BIT2;
/**
* ID3v2.4 Header Footer bit mask
*/
public static final int MASK_V24_DATA_LENGTH_INDICATOR = FileConstants.BIT1;
/**
* CRC Checksum calculated
*/
protected boolean crcDataFlag = false;
/**
* Experiemntal tag
*/
protected boolean experimental = false;
/**
* Contains extended header
*/
protected boolean extended = false;
/**
* All frames in the tag uses unsynchronisation
*/
protected boolean unsynchronization = false;
/**
* CRC Checksum
*/
protected int crcData = 0;
/**
* Contains a footer
*/
protected boolean footer = false;
/**
* Tag is an update
*/
protected boolean updateTag = false;
/**
* Tag has restrictions
*/
protected boolean tagRestriction = false;
/**
*
*/
protected byte imageEncodingRestriction = 0;
/**
*
*/
protected byte imageSizeRestriction = 0;
/**
*
*/
protected byte tagSizeRestriction = 0;
/**
*
*/
protected byte textEncodingRestriction = 0;
/**
* Tag padding
*/
protected int paddingSize = 0;
/**
*
*/
protected byte textFieldSizeRestriction = 0;
public static final byte RELEASE = 2;
public static final byte MAJOR_VERSION = 4;
public static final byte REVISION = 0;
/**
* Retrieve the Release
*/
public byte getRelease()
{
return RELEASE;
}
/**
* Retrieve the Major Version
*/
public byte getMajorVersion()
{
return MAJOR_VERSION;
}
/**
* Retrieve the Revision
*/
public byte getRevision()
{
return REVISION;
}
/**
* Creates a new empty ID3v2_4 datatype.
*/
public ID3v24Tag()
{
frameMap = new LinkedHashMap();
}
/**
* Copy primitives applicable to v2.4, this is used when cloning a v2.4 datatype
* and other objects such as v2.3 so need to check instanceof
*/
protected void copyPrimitives(AbstractID3v2Tag copyObj)
{
logger.info("Copying primitives");
super.copyPrimitives(copyObj);
if (copyObj instanceof ID3v24Tag)
{
ID3v24Tag copyObject = (ID3v24Tag) copyObj;
this.footer = copyObject.footer;
this.tagRestriction = copyObject.tagRestriction;
this.updateTag = copyObject.updateTag;
this.imageEncodingRestriction = copyObject.imageEncodingRestriction;
this.imageSizeRestriction = copyObject.imageSizeRestriction;
this.tagSizeRestriction = copyObject.tagSizeRestriction;
this.textEncodingRestriction = copyObject.textEncodingRestriction;
this.textFieldSizeRestriction = copyObject.textFieldSizeRestriction;
}
}
/**
* Copy frames from one tag into a v2.4 tag
*/
protected void copyFrames(AbstractID3v2Tag copyObject)
{
logger.info("Copying Frames,there are:" + copyObject.frameMap.keySet().size() + " different types");
frameMap = new LinkedHashMap();
//Copy Frames that are a valid 2.4 type
Iterator iterator = copyObject.frameMap.keySet().iterator();
AbstractID3v2Frame frame;
ID3v24Frame newFrame = null;
while (iterator.hasNext())
{
String id = (String) iterator.next();
Object o = copyObject.frameMap.get(id);
//SingleFrames
if (o instanceof AbstractID3v2Frame)
{
frame = (AbstractID3v2Frame) o;
try
{
newFrame = new ID3v24Frame(frame);
logger.info("Adding Frame:" + newFrame.getIdentifier());
copyFrameIntoMap(newFrame.getIdentifier(), newFrame);
}
catch (InvalidFrameException ife)
{
logger.log(Level.SEVERE, "Unable to convert frame:" + frame.getIdentifier(), ife);
}
}
//MultiFrames
else if (o instanceof ArrayList)
{
ArrayList multiFrame = new ArrayList();
for (ListIterator li = ((ArrayList) o).listIterator(); li.hasNext();)
{
frame = (AbstractID3v2Frame) li.next();
try
{
newFrame = new ID3v24Frame(frame);
multiFrame.add(newFrame);
}
catch (InvalidFrameException ife)
{
logger.log(Level.SEVERE, "Unable to convert frame:" + frame.getIdentifier());
}
}
if (newFrame != null)
{
logger.finest("Adding multi frame list to map:" + newFrame.getIdentifier());
frameMap.put(newFrame.getIdentifier(), multiFrame);
}
}
}
}
/**
* Copy Constructor, creates a new ID3v2_4 Tag based on another ID3v2_4 Tag
*/
public ID3v24Tag(ID3v24Tag copyObject)
{
logger.info("Creating tag from another tag of same type");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -