/*
* Written By Charles M. Chen
*
* Created on Jan 22, 2006
*
*/
package org.cmc.music.metadata;
import java.text.NumberFormat;
import java.util.Collections;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;
import java.util.Vector;
import org.cmc.music.common.ID3v1Genre;
import org.cmc.music.util.Debug;
import org.cmc.music.util.SimpleMap;
/**
* A collection of metadata values, possibly read from a single tag (ie. ID3v1
* or ID3v2)
*
* @see org.cmc.music.myid3.metadata.MusicMetadataSet
*/
public class MusicMetadata extends SimpleMap implements MusicMetadataConstants,
IMusicMetadata
{
public final String name;
public MusicMetadata(String name)
{
this.name = name;
}
public MusicMetadata(MusicMetadata other)
{
this.name = other.name;
putAll(other);
}
public MusicMetadata(IMusicMetadata other)
{
this.name = other.getMetadataName();
putAll(other.getRawValues());
}
public MusicMetadata(String name, IMusicMetadata other)
{
this.name = name;
putAll(other.getRawValues());
}
public final String getMetadataName()
{
return name;
}
public static final MusicMetadata createEmptyMetadata()
{
return new MusicMetadata("New Metadata");
}
public boolean hasBasicInfo()
{
if (null == getArtist())
return false;
if (null == getSongTitle())
return false;
if (null == getAlbum())
return false;
if (null == getTrackNumberDescription())
return false;
return true;
}
private Number getNumber(Object key)
{
Object result = get(key);
if (result == null)
return null;
if (!(result instanceof Number))
Debug.debug("Unexpected type(" + key + ")", result + " ("
+ Debug.getType(result) + ")");
return (Number) result;
}
private Boolean getBoolean(Object key)
{
Object result = get(key);
if (result == null)
return null;
if (!(result instanceof Boolean))
Debug.debug("Unexpected type(" + key + ")", result + " ("
+ Debug.getType(result) + ")");
return (Boolean) result;
}
private String getString(Object key)
{
Object result = get(key);
if (result == null)
return null;
if (!(result instanceof String))
Debug.debug("Unexpected type(" + key + ")", result + " ("
+ Debug.getType(result) + ")");
return (String) result;
}
private Vector getVector(Object key)
{
Object result = get(key);
if (result == null)
return null;
if (!(result instanceof Vector))
Debug.debug("Unexpected type(" + key + ")", result + " ("
+ Debug.getType(result) + ")");
return (Vector) result;
}
/*
* (non-Javadoc)
*
* @see org.cmc.music.common.IMusicMetadata#getSongTitle()
*/
public String getSongTitle()
{
return getString(KEY_TITLE);
}
/*
* (non-Javadoc)
*
* @see org.cmc.music.common.IMusicMetadata#getArtist()
*/
public String getArtist()
{
return getString(KEY_ARTIST);
}
/*
* (non-Javadoc)
*
* @see org.cmc.music.common.IMusicMetadata#getAlbum()
*/
public String getAlbum()
{
return getString(KEY_ALBUM);
}
/*
* (non-Javadoc)
*
* @see org.cmc.music.common.IMusicMetadata#getYear()
*/
public Number getYear()
{
return getNumber(KEY_YEAR);
}
/*
* (non-Javadoc)
*
* @see org.cmc.music.common.IMusicMetadata#getTrackNumber()
*/
public Number getTrackNumberNumeric()
{
return getNumber(KEY_TRACK_NUMBER_NUMERIC);
}
public Number getTrackCount()
{
return getNumber(KEY_TRACK_COUNT);
}
/*
* (non-Javadoc)
*
* @see org.cmc.music.common.IMusicMetadata#getTrackNumber()
*/
public String getTrackNumberDescription()
{
return getString(KEY_TRACK_NUMBER_DESCRIPTION);
}
public String getTrackNumberFormatted()
{
Number trackNumber = getNumber(KEY_TRACK_NUMBER_NUMERIC);
if (null != trackNumber)
{
NumberFormat nf = NumberFormat.getIntegerInstance();
nf.setMinimumIntegerDigits(2);
nf.setGroupingUsed(false);
return nf.format(trackNumber);
}
if (this.containsKey(KEY_TRACK_NUMBER_DESCRIPTION))
return getString(KEY_TRACK_NUMBER_DESCRIPTION);
return null;
}
/*
* (non-Javadoc)
*
* @see org.cmc.music.common.IMusicMetadata#getGenre()
*/
public String getGenreName()
{
return getString(KEY_GENRE_NAME);
}
/*
* (non-Javadoc)
*
* @see org.cmc.music.common.IMusicMetadata#getGenreID()
*/
public Number getGenreID()
{
return getNumber(KEY_GENRE_ID);
}
/*
* (non-Javadoc)
*
* @see org.cmc.music.common.IMusicMetadata#getDurationSeconds()
*/
public Number getDurationSeconds()
{
return getNumber(KEY_DURATION_SECONDS);
}
/*
* (non-Javadoc)
*
* @see org.cmc.music.common.IMusicMetadata#getComposer()
*/
public String getComposer()
{
return getString(KEY_COMPOSER);
}
/*
* (non-Javadoc)
*
* @see org.cmc.music.common.IMusicMetadata#getProducerArtist()
*/
// public String getProducerArtist()
// {
// return getString(KEY_ALBUM_ARTIST);
// }
// /*
// * (non-Javadoc)
// *
// * @see org.cmc.music.common.IMusicMetadata#getComposer2()
// */
// public String getComposer2()
// {
// return getString(KEY_COMPOSER_2);
// }
/*
* (non-Javadoc)
*
* @see org.cmc.music.common.IMusicMetadata#clearSongTitle()
*/
public void clearSongTitle()
{
remove(KEY_TITLE);
}
/*
* (non-Javadoc)
*
* @see org.cmc.music.common.IMusicMetadata#clearArtist()
*/
public void clearArtist()
{
remove(KEY_ARTIST);
}
/*
* (non-Javadoc)
*
* @see org.cmc.music.common.IMusicMetadata#clearAlbum()
*/
public void clearAlbum()
{
remove(KEY_ALBUM);
}
/*
* (non-Javadoc)
*
* @see org.cmc.music.common.IMusicMetadata#clearYear()
*/
public void clearYear()
{
remove(KEY_YEAR);
}
/*
* (non-Javadoc)
*
* @see org.cmc.music.common.IMusicMetadata#clearTrackNumber()
*/
public void clearTrackNumber()
{
remove(KEY_TRACK_NUMBER_NUMERIC);
remove(KEY_TRACK_NUMBER_DESCRIPTION);
}
public void clearTrackCount()
{
remove(KEY_TRACK_COUNT);
}
/*
* (non-Javadoc)
*
* @see org.cmc.music.common.IMusicMetadata#clearGenre()
*/
public void clearGenre()
{
remove(KEY_GENRE_NAME);
remove(KEY_GENRE_ID);
}
/*
* (non-Javadoc)
*
* @see org.cmc.music.common.IMusicMetadata#clearDurationSeconds()
*/
public void clearDurationSeconds()
{
remove(KEY_DURATION_SECONDS);
}
/*
* (non-Javadoc)
*
* @see org.cmc.music.common.IMusicMetadata#clearComposer()
*/
public void clearComposer()
{
remove(KEY_COMPOSER);
}
/*
* (non-Javadoc)
*
* @see org.cmc.music.common.IMusicMetadata#clearProducerArtist()
*/
// public void clearProducerArtist()
// {
// remove(KEY_ALBUM_ARTIST);
// }
// /*
// * (non-Javadoc)
// *
// * @see org.cmc.music.common.IMusicMetadata#clearComposer2()
// */
// public void clearComposer2()
// {
// remove(KEY_COMPOSER_2);
// }
//
/*
* (non-Javadoc)
*
* @see org.cmc.music.common.IMusicMetadata#clearFeaturingList()
*/
public void clearFeaturingList()
{
remove(KEY_FEATURING_LIST);
}
/*
* (non-Javadoc)
*
* @see
* org.cmc.music.common.IMusicMetadata#setFeaturingList(java.util.Vector)
*/
public void setFeaturingList(Vector v)
{
put(KEY_FEATURING_LIST, v);
}
/*
* (non-Javadoc)
*
* @see org.cmc.music.common.IMusicMetadata#getFeaturingList()
*/
public Vector getFeaturingList()
{
return getVector(KEY_FEATURING_LIST);
}
//
/*
* (non-Javadoc)
*
* @see org.cmc.music.common.IMusicMetadata#clearFeaturingList()
*/
public void clearPictures()
{
remove(KEY_PICTURES);
}
/*
* (non-Javadoc)
*
* @see
* org.cmc.music.common.IMusicMetadata#setFeaturingList(java.util.Vector)
*/
public void setPictures(Vector v)
{
put(KEY_PICTURES, v);
}
/*
* (non-Javadoc)
*
* @see org.cmc.music.common.IMusicMetadata#getFeaturingList()
*/
public Vector getPictures()
{
Vector result = getVector(KEY_PICTURES);
if (result == null)
result = new Vector();
return result;
}
/*
* (non-Javadoc)
*
* @see org.cmc.music.common.IMusicMetadata#getFeaturingList()
*/
public void addPicture(ImageData image)
{
Vector v = getVector(KEY_PICTURES);
if (null == v)
v = new Vector();
v.add(image);
put(KEY_PICTURES, v);
}
//
/*
* (non-Javadoc)
*
* @see org.cmc.music.common.IMusicMetadata#setSongTitle(java.lang.String)
*/
public void setSongTitle(String s)
{
put(KEY_TITLE, s);
}
/*
* (non-Javadoc)
*
* @see org.cmc.music.common.IMusicMetadata#setArtist(java.lang.String)
*/
public void setArtist(String s)
{
put(KEY_ARTIST, s);
}
/*
* (non-Javadoc)
*
* @see org.cmc.music.common.IMusicMetadata#setAlbum(java.lang.String)
*/
public void setAlbum(String s)
{
put(KEY_ALBUM, s);
}
/*
* (non-Javadoc)
*
* @see org.cmc.music.common.IMusicMetadata#setYear(java.lang.String)
*/
public void setYear(Number s)
{
put(KEY_YEAR, s);
}
public void setTrackNumberNumeric(Number value)
{
put(KEY_TRACK_NUMBER_NUMERIC, value);
String description = value == null ? null : "" + value;
put(KEY_TRACK_NUMBER_DESCRIPTION, description);
}
public void setTrackNumberDescription(String description)
{
Number value = null;
try
{
value = Integer.valueOf(description);
description = "" + value;
} catch (NumberFormatException e)
{
// ignore;
}
put(KEY_TRACK_NUMBER_NUMERIC, value);
put(KEY_TRACK_NUMBER_DESCRIPTION, description);
}
public void setTrackNumber(Number value, String description)
{
put(KEY_TRACK_NUMBER_NUMERIC, value);
put(KEY_TRACK_NUMBER_DESCRIPTION, description);
}
public void setTrackCount(Number value)
{
put(KEY_TRACK_COUNT, value);
}
/*
* (non-Javadoc)
*
* @see org.cmc.music.common.IMusicMetadata#setGenre(java.lang.String)
*/
public void setGenreName(String name)
{
Number id = ID3v1Genre.getIDForName(name);
put(KEY_GENRE_NAME, name);
put(KEY_GENRE_ID, id);
}
/*
* (non-Javadoc)
*
* @see org.cmc.music.common.IMusicMetadata#setGenre(java.lang.String)
*/
public void setGenreID(Number id)
{
String name = ID3v1Genre.getNameForID(id);
put(KEY_GENRE_NAME, name);
put(KEY_GENRE_ID, id);
}
public void setGenre(String name, Number id)
{
put(KEY_GENRE_NAME, name);
put(KEY_GENRE_ID, id);
}
/*
* (non-Javadoc)
*
* @see
* org.cmc.music.common.IMusicMetadata#setDurationSeconds(java.lang.String)
*/
public void setDurationSeconds(Number s)
{
put(KEY_DURATION_SECONDS, s);
}
/*
* (non-Javadoc)
*
* @see org.cmc.music.common.IMusicMetadata#setComposer(java.lang.String)
*/
public void setComposer(String s)
{
put(KEY_COMPOSER, s);
}
/*
* (non-Javadoc)
*
* @see
* org.cmc.music.common.IMusicMetadata#setProducerArtist(java.lang.String)
*/
// public void setProducerArtist(String s)
// {
// put(KEY_ALBUM_ARTIST, s);
// }
// /*
// * (non-Javadoc)
// *
// * @see org.cmc.music.common.IMusicMetadata#setComposer2(java.lang.String)
// */
// public void setComposer2(String s)
// {
// put(KEY_COMPOSER_2, s);
// }
/*
* (non-Javadoc)
*
* @see org.cmc.music.common.IMusicMetadata#getProducer()
*/
public String getProducer()
{
return getString(KEY_PRODUCER);
}
/*
* (non-Javadoc)
*
* @see org.cmc.music.common.IMusicMetadata#setProducer(java.lang.String)
*/
public void setProducer(String s)
{
put(KEY_PRODUCER, s);
}
/*
* (non-Javadoc)
*
* @see org.cmc.music.common.IMusicMetadata#clearProducer()
*/
public void clearProducer()
{
remove(KEY_PRODUCER);
}
public String toString()
{
StringBuffer result = new StringBuffer();
result.append("{ ");
Vector keys = new Vector(keySet());
Collections.sort(keys);
for (int i = 0; i < keys.size(); i++)
{
Object key = keys.get(i);
Object value = get(key);
if (i > 0)
result.append(", ");
result.append(key + ": " + value);
}
result.append(" }");
return result.toString();
}
public final Map getRawValues()
{
return new Hashtable(this);
}
// public final String getDescription()
// {
// Vector keys = new Vector(keySet());
// Collections.sort(keys);
// for (int i = 0; i < keys.size(); i++)
// {
// Object key = keys.get(i);
// Object value = get(key);
// attr_panel.add(JFactory.newJLabel("<HTML><B>" + key
// + ": </b>", JLabel.RIGHT));
// attr_panel.add(JFactory.newJLabel(value.toString(),
// JLabel.LEFT));
// }
// }
public final void mergeValuesIfMissing(IMusicMetadata other)
{
Map rawValues = other.getRawValues();
Vector keys = new Vector(rawValues.keySet());
for (int i = 0; i < keys.size(); i++)
{
Object key = keys.get(i);
if (containsKey(key))
continue;
put(key, rawValues.get(key));
}
}
public void setIsSoundtrack(Boolean value)
{
put(KEY_SOUNDTRACK, value);
}
public Boolean getIsSoundtrack()
{
return getBoolean(KEY_SOUNDTRACK);
}
public void clearIsSoundtrack()
{
remove(KEY_SOUNDTRACK);
}
public void setIsAcapella(Boolean value)
{
put(KEY_ACAPELLA, value);
}
public Boolean getIsAcapella()
{
return getBoolean(KEY_ACAPELLA);
}
public void clearIsAcapella()
{
remove(KEY_ACAPELLA);
}
public void setIsCompilation(Boolean value)
{
put(KEY_COMPILATION, value);
}
public Boolean getIsCompilation()
{
return getBoolean(KEY_COMPILATION);
}
public void clearIsCompilation()
{
remove(KEY_COMPILATION);
}
public void setDiscNumber(Number value)
{
put(KEY_DISC_NUMBER, value);
}
public Number getDiscNumber()
{
return getNumber(KEY_DISC_NUMBER);
}
public void clearDiscNumber()
{
remove(KEY_DISC_NUMBER);
}
public void setEngineer(String value)
{
put(KEY_ENGINEER, value);
}
public String getEngineer()
{
return getString(KEY_ENGINEER);
}
public void clearEngineer()
{
remove(KEY_ENGINEER);
}
public void setPublisher(String value)
{
put(KEY_PUBLISHER, value);
}
public String getPublisher()
{
return getString(KEY_PUBLISHER);
}
public void clearPublisher()
{
remove(KEY_PUBLISHER);
}
public void setConductor(String value)
{
put(KEY_CONDUCTOR, value);
}
public String getConductor()
{
return getString(KEY_CONDUCTOR);
}
public void clearConductor()
{
remove(KEY_CONDUCTOR);
}
public void setBand(String value)
{
put(KEY_BAND, value);
}
public String getBand()
{
return getString(KEY_BAND);
}
public void clearBand()
{
remove(KEY_BAND);
}
public void setMixArtist(String value)
{
put(KEY_MIX_ARTIST, value);
}
public String getMixArtist()
{
return getString(KEY_MIX_ARTIST);
}
public void clearMixArtist()
{
remove(KEY_MIX_ARTIST);
}
public void setLyricist(String value)
{
put(KEY_LYRICIST, value);
}
public String getLyricist()
{
return getString(KEY_LYRICIST);
}
public void clearLyricist()
{
remove(KEY_LYRICIST);
}
public void setEncodedBy(String value)
{
put(KEY_ENCODED_BY, value);
}
public String getEncodedBy()
{
return getString(KEY_ENCODED_BY);
}
public void clearEncodedBy()
{
remove(KEY_ENCODED_BY);
}
public void setEncoderSettings(String value)
{
put(KEY_ENCODER_SETTINGS, value);
}
public String getEncoderSettings()
{
return getString(KEY_ENCODER_SETTINGS);
}
public void clearEncoderSettings()
{
remove(KEY_ENCODER_SETTINGS);
}
public void setMediaType(String value)
{
put(KEY_MEDIA_TYPE, value);
}
public String getMediaType()
{
return getString(KEY_MEDIA_TYPE);
}
public void clearMediaType()
{
remove(KEY_MEDIA_TYPE);
}
public void setFileType(String value)
{
put(KEY_FILE_TYPE, value);
}
public String getFileType()
{
return getString(KEY_FILE_TYPE);
}
public void clearFileType()
{
remove(KEY_FILE_TYPE);
}
public Number getPartOfSetIndex()
{
return getNumber(KEY_PART_OF_SET_INDEX);
}
public void clearPartOfSetIndex()
{
remove(KEY_PART_OF_SET_INDEX);
}
public void setPartOfSetIndex(Number s)
{
put(KEY_PART_OF_SET_INDEX, s);
}
public Number getPartOfSetCount()
{
return getNumber(KEY_PART_OF_SET_COUNT);
}
public void clearPartOfSetCount()
{
remove(KEY_PART_OF_SET_COUNT);
}
public void setPartOfSetCount(Number s)
{
put(KEY_PART_OF_SET_COUNT, s);
}
/*
* (non-Javadoc)
*
* @see org.cmc.music.common.IMusicMetadata#clearComment()
*/
public void clearComments()
{
remove(KEY_COMMENT_LIST);
}
/*
* (non-Javadoc)
*
* @see org.cmc.music.common.IMusicMetadata#getComment()
*/
public List getComments()
{
Vector result = getVector(KEY_COMMENT_LIST);
if (result == null)
result = new Vector();
return result;
}
public void addComment(String value)
{
Vector values = getVector(KEY_COMMENT_LIST);
if (values == null)
{
values = new Vector();
put(KEY_COMMENT_LIST, values);
}
values.add(value);
}
public void setComments(List values)
{
put(KEY_COMMENT_LIST, values);
}
public void clearUnknownUserTextValues()
{
remove(KEY_UNKNOWN_USER_TEXT_VALUES);
}
public List getUnknownUserTextValues()
{
Vector result = getVector(KEY_UNKNOWN_USER_TEXT_VALUES);
if (result == null)
result = new Vector();
return result;
}
public void addUnknownUserTextValue(UnknownUserTextValue value)
{
Vector values = getVector(KEY_UNKNOWN_USER_TEXT_VALUES);
if (values == null)
{
values = new Vector();
put(KEY_UNKNOWN_USER_TEXT_VALUES, values);
}
values.add(value);
}
public void setUnknownUserTextValues(List values)
{
put(KEY_UNKNOWN_USER_TEXT_VALUES, values);
}
}