package org.farng.mp3.filename;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.Iterator;
import org.farng.mp3.AbstractMP3Tag;
import org.farng.mp3.MP3File;
import org.farng.mp3.TagConstant;
import org.farng.mp3.TagException;
import org.farng.mp3.TagUtility;
import org.farng.mp3.id3.AbstractID3v2Frame;
import org.farng.mp3.id3.FrameBodyCOMM;
import org.farng.mp3.id3.FrameBodySYLT;
import org.farng.mp3.id3.FrameBodyTALB;
import org.farng.mp3.id3.FrameBodyTCOM;
import org.farng.mp3.id3.FrameBodyTCON;
import org.farng.mp3.id3.FrameBodyTDRC;
import org.farng.mp3.id3.FrameBodyTIT2;
import org.farng.mp3.id3.FrameBodyTPE1;
import org.farng.mp3.id3.FrameBodyTRCK;
import org.farng.mp3.id3.FrameBodyUSLT;
import org.farng.mp3.id3.ID3v2_3Frame;
import org.farng.mp3.id3.ID3v2_4;
/**
* This class represents the filename. To create it, invoke <code>FilenameTagBuilder.createFilenameTagFromMP3File</code>
* which returns a complete parsed, evaluated, and matched FilenameTag.
*
* @author Eric Farng
* @version $Revision: 2374 $
*/
public class FilenameTag extends AbstractMP3Tag {
/**
* parsed composite
*/
private AbstractFilenameComposite composite = null;
/**
* id3v2_4 tag created from composite
*/
private ID3v2_4 id3tag = null;
/**
* mp3file used to create this tag
*/
private MP3File mp3file = null;
/**
* file name extension used to create this tag
*/
private String extension = null;
/**
* Creates a new FilenameTag object.
*/
public FilenameTag(final FilenameTag copyObject) {
super(copyObject);
composite = (AbstractFilenameComposite) TagUtility.copyObject(copyObject.composite);
id3tag = new ID3v2_4(copyObject.id3tag);
mp3file = new MP3File(copyObject.mp3file);
extension = copyObject.extension;
}
/**
* Creates a new FilenameTag object.
*/
protected FilenameTag() {
super();
}
/**
* Sets the composite that this tag will use.
*
* @param composite the composite that this tag will use.
*/
public void setComposite(final AbstractFilenameComposite composite) {
this.composite = composite;
}
/**
* Returns the composite that this tag will use.
*
* @return the composite that this tag will use.
*/
public AbstractFilenameComposite getComposite() {
return composite;
}
public void setExtension(final String extension) {
this.extension = extension;
}
public String getExtension() {
return extension;
}
/**
* Sets the frame of this tag
*
* @param frame the frame to set
*/
public void setFrame(final AbstractID3v2Frame frame) {
if (frame != null) {
if (id3tag == null) {
id3tag = new ID3v2_4();
}
id3tag.setFrame(frame);
if (composite != null) {
composite.setFrame(frame);
}
}
}
/**
* Returns a frame of this tag
*
* @param identifier ID3v2_4 ID of frame to get
*
* @return a frame of this tag
*/
public AbstractID3v2Frame getFrame(final String identifier) {
AbstractID3v2Frame frame = null;
if (id3tag != null) {
frame = id3tag.getFrame(identifier);
}
return frame;
}
public Iterator getFrameOfType(final String identifier) {
return id3tag.getFrameOfType(identifier);
}
/**
* Sets the ID3v2_4 representation of this tag.
*
* @param id3tag the ID3v2_4 representation of this tag
*/
public void setId3tag(final ID3v2_4 id3tag) {
this.id3tag = id3tag;
if (id3tag != null) {
final Iterator iterator = id3tag.iterator();
while (iterator.hasNext()) {
composite.setFrame((AbstractID3v2Frame) iterator.next());
}
if (composite != null) {
composite.matchAgainstTag(id3tag);
}
}
}
/**
* Returns the ID3v2_4 representation of this tag
*
* @return the ID3v2_4 representation of this tag
*/
public ID3v2_4 getId3tag() {
return id3tag;
}
public String getIdentifier() {
return "FilenameTagv1.00";
}
public void setMp3file(final MP3File mp3file) {
this.mp3file = mp3file;
}
public MP3File getMp3file() {
return mp3file;
}
public int getSize() {
return composeFilename().length();
}
public void append(final AbstractMP3Tag abstractMP3Tag) {
//todo Implement this org.farng.mp3.AbstractMP3Tag abstract method
throw new UnsupportedOperationException("Method append() not yet implemented.");
}
public void append(final RandomAccessFile file) {
//todo Implement this org.farng.mp3.AbstractMP3Tag abstract method
throw new UnsupportedOperationException("Method append() not yet implemented.");
}
public String composeFilename() {
final StringBuffer filename = new StringBuffer(128);
if (composite != null) {
filename.append(composite.composeFilename().trim());
filename.append('.');
filename.append(extension);
}
return filename.toString();
}
public void delete(final RandomAccessFile file) {
//todo Implement this org.farng.mp3.AbstractMP3Tag abstract method
throw new UnsupportedOperationException("Method delete() not yet implemented.");
}
public boolean hasFrame(final String identifier) {
if (id3tag != null) {
return id3tag.hasFrame(identifier);
}
return false;
}
public boolean hasFrameOfType(final String identifier) {
if (id3tag != null) {
return id3tag.hasFrameOfType(identifier);
}
return false;
}
public Iterator iterator() {
Iterator iterator = null;
if (composite != null) {
iterator = composite.iterator();
}
return iterator;
}
public void overwrite(final AbstractMP3Tag abstractMP3Tag) {
//todo Implement this org.farng.mp3.AbstractMP3Tag abstract method
throw new UnsupportedOperationException("Method overwrite() not yet implemented.");
}
public void overwrite(final RandomAccessFile file) throws TagException, IOException {
write(file);
}
public void read(final RandomAccessFile file) {
//todo Implement this org.farng.mp3.AbstractMP3Tag abstract method
throw new UnsupportedOperationException("Method read() not yet implemented.");
}
public boolean seek(final RandomAccessFile file) {
//todo Implement this org.farng.mp3.AbstractMP3Tag abstract method
throw new UnsupportedOperationException("Method seek() not yet implemented.");
}
public String toString() {
final StringBuffer stringBuffer = new StringBuffer(128);
final Iterator iterator = iterator();
while (iterator.hasNext()) {
stringBuffer.append(iterator.next().toString());
stringBuffer.append(TagConstant.SEPERATOR_LINE);
}
return stringBuffer.toString();
}
public void write(final AbstractMP3Tag abstractMP3Tag) {
//todo Implement this org.farng.mp3.AbstractMP3Tag abstract method
throw new UnsupportedOperationException("Method write() not yet implemented.");
}
public void write(final RandomAccessFile file) throws IOException, TagException {
final File originalFile = getMp3file().getMp3file();
final File newFile = new File(originalFile.getParentFile(), composeFilename());
if (!newFile.getName().equals(originalFile.getName())) {
file.getFD().sync();
file.getChannel().close();
file.close();
// copy, then delete
TagUtility.copyFile(originalFile, newFile);
if (!originalFile.delete()) {
throw new TagException("Unable to delete original file: " + originalFile.getName());
}
}
}
public String getSongTitle() {
String text = null;
AbstractID3v2Frame frame = getFrame("TIT2");
if (frame != null) {
FrameBodyTIT2 body = (FrameBodyTIT2) frame.getBody();
text = body.getText();
}
return text.trim();
}
public String getLeadArtist() {
String text = null;
AbstractID3v2Frame frame = getFrame("TPE1");
if (frame != null) {
FrameBodyTPE1 body = (FrameBodyTPE1) frame.getBody();
text = body.getText();
}
return text.trim();
}
public String getAlbumTitle() {
String text = null;
AbstractID3v2Frame frame = getFrame("TALB");
if (frame != null) {
FrameBodyTALB body = (FrameBodyTALB) frame.getBody();
text = body.getText();
}
return text.trim();
}
public String getYearReleased() {
String text = null;
AbstractID3v2Frame frame = getFrame("TDRC");
if (frame != null) {
FrameBodyTDRC body = (FrameBodyTDRC) frame.getBody();
text = body.getText();
}
return text.trim();
}
public String getSongComment() {
String text = null;
AbstractID3v2Frame frame = getFrame("COMM");
if (frame != null) {
FrameBodyCOMM body = (FrameBodyCOMM) frame.getBody();
text = body.getText();
}
return text.trim();
}
public String getSongGenre() {
String text = null;
AbstractID3v2Frame frame = getFrame("TCON");
if (frame != null) {
FrameBodyTCON body = (FrameBodyTCON) frame.getBody();
text = body.getText();
}
return text.trim();
}
public String getTrackNumberOnAlbum() {
String text = null;
AbstractID3v2Frame frame = getFrame("TRCK");
if (frame != null) {
FrameBodyTRCK body = (FrameBodyTRCK) frame.getBody();
text = body.getText();
}
return text.trim();
}
public String getSongLyric() {
String text = null;
AbstractID3v2Frame frame = getFrame("SYLT");
if (frame != null) {
FrameBodySYLT body = (FrameBodySYLT) frame.getBody();
text = body.getLyric();
}
if (text == null) {
frame = getFrame("USLT");
if (frame != null) {
FrameBodyUSLT body = (FrameBodyUSLT) frame.getBody();
text = body.getLyric();
}
}
return text.trim();
}
public String getAuthorComposer() {
String text = null;
AbstractID3v2Frame frame = getFrame("TCOM");
if (frame != null) {
FrameBodyTCOM body = (FrameBodyTCOM) frame.getBody();
text = body.getText();
}
return text.trim();
}
public void setSongTitle(String songTitle) {
AbstractID3v2Frame field = getFrame("TIT2");
if (field == null) {
field = new ID3v2_3Frame(new FrameBodyTIT2((byte) 0, songTitle.trim()));
setFrame(field);
} else {
((FrameBodyTIT2) field.getBody()).setText(songTitle.trim());
}
}
public void setLeadArtist(String leadArtist) {
AbstractID3v2Frame field = getFrame("TPE1");
if (field == null) {
field = new ID3v2_3Frame(new FrameBodyTPE1((byte) 0, leadArtist.trim()));
setFrame(field);
} else {
((FrameBodyTPE1) field.getBody()).setText(leadArtist.trim());
}
}
public void setAlbumTitle(String albumTitle) {
AbstractID3v2Frame field = getFrame("TALB");
if (field == null) {
field = new ID3v2_3Frame(new FrameBodyTALB((byte) 0, albumTitle.trim()));
setFrame(field);
} else {
((FrameBodyTALB) field.getBody()).setText(albumTitle.trim());
}
}
public void setYearReleased(String yearReleased) {
AbstractID3v2Frame field = getFrame("TDRC");
if (field == null) {
field = new ID3v2_3Frame(new FrameBodyTDRC((byte) 0, yearReleased.trim()));
setFrame(field);
} else {
((FrameBodyTDRC) field.getBody()).setText(yearReleased.trim());
}
}
public void setSongComment(String songComment) {
AbstractID3v2Frame field = getFrame("COMM");
if (field == null) {
field = new ID3v2_3Frame(new FrameBodyCOMM((byte) 0, "ENG", "", songComment.trim()));
setFrame(field);
} else {
((FrameBodyCOMM) field.getBody()).setText(songComment.trim());
}
}
public void setSongGenre(String songGenre) {
AbstractID3v2Frame field = getFrame("TCON");
if (field == null) {
field = new ID3v2_3Frame(new FrameBodyTCON((byte) 0, songGenre.trim()));
setFrame(field);
} else {
((FrameBodyTCON) field.getBody()).setText(songGenre.trim());
}
}
public void setTrackNumberOnAlbum(String trackNumberOnAlbum) {
AbstractID3v2Frame field = getFrame("TRCK");
if (field == null) {
field = new ID3v2_3Frame(new FrameBodyTRCK((byte) 0, trackNumberOnAlbum.trim()));
setFrame(field);
} else {
((FrameBodyTRCK) field.getBody()).setText(trackNumberOnAlbum.trim());
}
}
public void setSongLyric(String songLyrics) {
AbstractID3v2Frame field = getFrame("SYLT");
if (field == null) {
field = new ID3v2_3Frame(new FrameBodyUSLT((byte) 0, "ENG", "", songLyrics.trim()));
setFrame(field);
} else {
((FrameBodyUSLT) field.getBody()).setLyric(songLyrics.trim());
}
}
public void setAuthorComposer(String authorComposer) {
AbstractID3v2Frame field = getFrame("TCOM");
if (field == null) {
field = new ID3v2_3Frame(new FrameBodyTCOM((byte) 0, authorComposer.trim()));
setFrame(field);
} else {
((FrameBodyTCOM) field.getBody()).setText(authorComposer.trim());
}
}
}