📄 id3v11tag.java
字号:
/**
* @author : Paul Taylor
* @author : Eric Farng
*
* Version @version:$Id: ID3v11Tag.java,v 1.20 2007/11/27 17:03:31 paultaylor Exp $
*
* 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
*
* Description:
* This class is for a ID3v1.1 Tag
*
*/
package com.hadeslee.audiotag.tag.id3;
import com.hadeslee.audiotag.audio.mp3.MP3File;
import com.hadeslee.audiotag.audio.generic.Utils;
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.TagOptionSingleton;
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 java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.util.*;
import java.util.logging.Level;
import java.util.regex.Matcher;
/**
* Represents an ID3v11 tag.
*
* @author : Eric Farng
* @author : Paul Taylor
*
*/
public class ID3v11Tag
extends ID3v1Tag
{
//For writing output
protected static final String TYPE_TRACK = "track";
protected static final int TRACK_UNDEFINED = 0;
protected static final int TRACK_MAX_VALUE = 255;
protected static final int TRACK_MIN_VALUE = 1;
protected static final int FIELD_COMMENT_LENGTH = 28;
protected static final int FIELD_COMMENT_POS = 97;
protected static final int FIELD_TRACK_INDICATOR_LENGTH = 1;
protected static final int FIELD_TRACK_INDICATOR_POS = 125;
protected static final int FIELD_TRACK_LENGTH = 1;
protected static final int FIELD_TRACK_POS = 126;
/**
* Track is held as a single byte in v1.1
*/
protected byte track = (byte) TRACK_UNDEFINED;
private static final byte RELEASE = 1;
private static final byte MAJOR_VERSION = 1;
private 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 ID3v11 datatype.
*/
public ID3v11Tag()
{
}
public ID3v11Tag(ID3v11Tag copyObject)
{
super(copyObject);
this.track = copyObject.track;
}
/**
* Creates a new ID3v11 datatype from a non v11 tag
*
* @param mp3tag
* @throws UnsupportedOperationException
*/
public ID3v11Tag(AbstractTag mp3tag)
{
if (mp3tag != null)
{
if (mp3tag instanceof ID3v1Tag)
{
if (mp3tag instanceof ID3v11Tag)
{
throw new UnsupportedOperationException("Copy Constructor not called. Please type cast the argument");
}
if (mp3tag instanceof ID3v1Tag)
{
// id3v1_1 objects are also id3v1 objects
ID3v1Tag id3old = (ID3v1Tag) mp3tag;
this.title = new String(id3old.title);
this.artist = new String(id3old.artist);
this.album = new String(id3old.album);
this.comment = new String(id3old.comment);
this.year = new String(id3old.year);
this.genre = id3old.genre;
}
}
else
{
ID3v24Tag id3tag;
// first change the tag to ID3v2_4 tag if not one already
if(!(mp3tag instanceof ID3v24Tag))
{
id3tag = new ID3v24Tag(mp3tag);
}
else
{
id3tag = (ID3v24Tag)mp3tag;
}
ID3v24Frame frame;
String text;
if (id3tag.hasFrame(ID3v24Frames.FRAME_ID_TITLE))
{
frame = (ID3v24Frame) id3tag.getFrame(ID3v24Frames.FRAME_ID_TITLE);
text = (String) ((FrameBodyTIT2) frame.getBody()).getText();
this.title = ID3Tags.truncate(text, FIELD_TITLE_LENGTH);
}
if (id3tag.hasFrame(ID3v24Frames.FRAME_ID_ARTIST))
{
frame = (ID3v24Frame) id3tag.getFrame(ID3v24Frames.FRAME_ID_ARTIST);
text = (String) ((FrameBodyTPE1) frame.getBody()).getText();
this.artist = ID3Tags.truncate(text, FIELD_ARTIST_LENGTH);
}
if (id3tag.hasFrame(ID3v24Frames.FRAME_ID_ALBUM))
{
frame = (ID3v24Frame) id3tag.getFrame(ID3v24Frames.FRAME_ID_ALBUM);
text = (String) ((FrameBodyTALB) frame.getBody()).getText();
this.album = ID3Tags.truncate(text, FIELD_ALBUM_LENGTH);
}
if (id3tag.hasFrame(ID3v24Frames.FRAME_ID_YEAR))
{
frame = (ID3v24Frame) id3tag.getFrame(ID3v24Frames.FRAME_ID_YEAR);
text = (String) ((FrameBodyTDRC) frame.getBody()).getText();
this.year = ID3Tags.truncate(text, FIELD_YEAR_LENGTH);
}
if (id3tag.hasFrame(ID3v24Frames.FRAME_ID_COMMENT))
{
Iterator iterator = id3tag.getFrameOfType(ID3v24Frames.FRAME_ID_COMMENT);
text = "";
while (iterator.hasNext())
{
frame = (ID3v24Frame) iterator.next();
text += (((FrameBodyCOMM) frame.getBody()).getText() + " ");
}
this.comment = ID3Tags.truncate(text, FIELD_COMMENT_LENGTH);
}
if (id3tag.hasFrame(ID3v24Frames.FRAME_ID_GENRE))
{
frame = (ID3v24Frame) id3tag.getFrame(ID3v24Frames.FRAME_ID_GENRE);
text = ((FrameBodyTCON) frame.getBody()).getText();
try
{
this.genre = (byte) ID3Tags.findNumber(text);
}
catch (TagException ex)
{
logger.log(Level.WARNING,getLoggingFilename()+":"+"Unable to convert TCON frame to format suitable for v11 tag",ex);
this.genre = (byte) ID3v1Tag.GENRE_UNDEFINED;
}
}
if (id3tag.hasFrame(ID3v24Frames.FRAME_ID_TRACK))
{
frame = (ID3v24Frame) id3tag.getFrame(ID3v24Frames.FRAME_ID_TRACK);
text = ((FrameBodyTRCK) frame.getBody()).getText();
try
{
this.track = (byte) ID3Tags.findNumber(text);
}
catch (TagException ex)
{
logger.log(Level.WARNING,getLoggingFilename()+":"+"Unable to convert TRCK frame to format suitable for v11 tag",ex);
this.track = (byte) TRACK_UNDEFINED;
}
}
}
}
}
/**
* Creates a new ID3v1_1 datatype.
*
* @param file
* @param loggingFilename
* @throws TagNotFoundException
* @throws IOException
*/
public ID3v11Tag(RandomAccessFile file,String loggingFilename)
throws TagNotFoundException, IOException
{
setLoggingFilename(loggingFilename);
FileChannel fc;
ByteBuffer byteBuffer = ByteBuffer.allocate(TAG_LENGTH);
fc = file.getChannel();
fc.position(file.length() - TAG_LENGTH);
byteBuffer = ByteBuffer.allocate(TAG_LENGTH);
fc.read(byteBuffer);
byteBuffer.flip();
read(byteBuffer);
}
/**
* Creates a new ID3v1_1 datatype.
*
* @param file
* @throws TagNotFoundException
* @throws IOException
*
* @deprecated use {@link #ID3v11Tag(RandomAccessFile,String)} instead
*/
public ID3v11Tag(RandomAccessFile file)
throws TagNotFoundException, IOException
{
this(file,"");
}
/**
* Set Comment
*
* @param comment
*/
public void setComment(String comment)
{
this.comment = ID3Tags.truncate(comment, this.FIELD_COMMENT_LENGTH);
}
/**
* Get Comment
*
* @return comment
*/
public String getFirstComment()
{
return comment;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -