package org.jaudiotagger.tag.id3; import java.util.Comparator; import java.util.List; import java.util.ArrayList; /** * Orders frame Ids so that the most important frames are writtne first */ public class ID3v23PreferredFrameOrderComparator implements Comparator<String> { private static ID3v23PreferredFrameOrderComparator comparator; private static List frameIdsInPreferredOrder = new ArrayList<String>(); static { //these are the key ones we want at the top frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_UNIQUE_FILE_ID); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_TITLE); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_ARTIST); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_ALBUM); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_TORY); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_GENRE); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_COMPOSER); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_CONDUCTOR); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_CONTENT_GROUP_DESC); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_TRACK); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_TYER); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_TDAT); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_TIME); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_BPM); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_ISRC); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_TORY); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_ACCOMPANIMENT); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_TITLE_REFINEMENT); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_UNSYNC_LYRICS); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_USER_DEFINED_INFO); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_USER_DEFINED_URL); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_URL_ARTIST_WEB); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_URL_COMMERCIAL); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_URL_COPYRIGHT); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_URL_FILE_WEB); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_URL_OFFICIAL_RADIO); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_URL_PAYMENT); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_URL_PUBLISHERS); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_URL_COMMERCIAL); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_LYRICIST); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_MEDIA_TYPE); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_IPLS); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_LANGUAGE); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_TITLE_SORT_ORDER_ITUNES); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_PLAYLIST_DELAY); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_PLAY_COUNTER); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_POPULARIMETER); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_PUBLISHER); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_ALBUM_ARTIST_SORT_ORDER_ITUNES); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_COMPOSER_SORT_ORDER_ITUNES); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_IS_COMPILATION); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_TITLE_SORT_ORDER_ITUNES); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_ARTIST_SORT_ORDER_ITUNES); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_ALBUM_SORT_ORDER_ITUNES); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_TITLE_SORT_ORDER_MUSICBRAINZ); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_ARTIST_SORT_ORDER_MUSICBRAINZ); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_ALBUM_SORT_ORDER_MUSICBRAINZ); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_ALBUM_ARTIST_SORT_ORDER_ITUNES); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_COMPOSER_SORT_ORDER_ITUNES); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_COMMENT); //Not so bothered about these frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_TRDA); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_COMMERCIAL_FRAME); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_COPYRIGHTINFO); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_ENCODEDBY); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_ENCRYPTION); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_EQUALISATION); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_EVENT_TIMING_CODES); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_FILE_OWNER); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_FILE_TYPE); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_GROUP_ID_REG); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_HW_SW_SETTINGS); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_INITIAL_KEY); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_LENGTH); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_LINKED_INFO); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_TSIZ); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_MPEG_LOCATION_LOOKUP_TABLE); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_ORIGARTIST); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_ORIG_FILENAME); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_ORIG_LYRICIST); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_ORIG_TITLE); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_OWNERSHIP); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_POSITION_SYNC); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_RADIO_NAME); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_RADIO_OWNER); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_RECOMMENDED_BUFFER_SIZE); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_REMIXED); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_REVERB); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_SET); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_SYNC_LYRIC); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_SYNC_TEMPO); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_TERMS_OF_USE); //Want this near the end because can cause problems with unsyncing frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_ATTACHED_PICTURE); //Itunes doesnt seem to like these, and of little use so put right at end frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_PRIVATE); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_MUSIC_CD_ID); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_AUDIO_ENCRYPTION); frameIdsInPreferredOrder.add(ID3v23Frames.FRAME_ID_V3_GENERAL_ENCAPS_OBJECT); } private ID3v23PreferredFrameOrderComparator() { } public static ID3v23PreferredFrameOrderComparator getInstanceof() { if (comparator == null) { comparator = new ID3v23PreferredFrameOrderComparator(); } return comparator; } /** * @param frameId1 * @param frameId2 * @return */ public int compare(String frameId1, String frameId2) { int frameId1Index = frameIdsInPreferredOrder.indexOf(frameId1); int frameId2Index = frameIdsInPreferredOrder.indexOf(frameId2); return frameId1Index - frameId2Index; } public boolean equals(Object obj) { return obj instanceof ID3v23PreferredFrameOrderComparator; } }