Coverage Report - org.jaudiotagger.tag.id3.ID3Frames
 
Classes in this File Line Coverage Branch Coverage Complexity
ID3Frames
98%
122/124
100%
2/2
1.125
 
 1  
 /*
 2  
  *  MusicTag Copyright (C)2003,2004
 3  
  *
 4  
  *  This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser
 5  
  *  General Public  License as published by the Free Software Foundation; either version 2.1 of the License,
 6  
  *  or (at your option) any later version.
 7  
  *
 8  
  *  This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
 9  
  *  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 10  
  *  See the GNU Lesser General Public License for more details.
 11  
  *
 12  
  *  You should have received a copy of the GNU Lesser General Public License along with this library; if not,
 13  
  *  you can get a copy from http://www.opensource.org/licenses/lgpl-license.php or write to the Free Software
 14  
  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 15  
  */
 16  
 package org.jaudiotagger.tag.id3;
 17  
 
 18  
 import org.jaudiotagger.tag.datatype.AbstractStringStringValuePair;
 19  
 
 20  
 import java.util.Iterator;
 21  
 import java.util.LinkedHashMap;
 22  
 import java.util.Map;
 23  
 import java.util.TreeSet;
 24  
 
 25  
 /**
 26  
  * Subclasses Defines ID3 frames for their Tag Version
 27  
  * <p/>
 28  
  * Here we specify how frames are mapped between different Tag Versions
 29  
  *
 30  
  * @author Paul Taylor
 31  
  * @version $Id: ID3Frames.java 836 2009-11-12 15:44:07Z paultaylor $
 32  
  */
 33  12
 public abstract class ID3Frames extends AbstractStringStringValuePair
 34  
 {
 35  
     /**
 36  
      * Holds frames whereby multiple occurences are allowed
 37  
      */
 38  12
     protected TreeSet<String> multipleFrames = new TreeSet<String>();
 39  
 
 40  
     /**
 41  
      * These frames should be lost if file changes
 42  
      */
 43  12
     protected TreeSet<String> discardIfFileAlteredFrames = new TreeSet<String>();
 44  
 
 45  
     /**
 46  
      * These frames are part of the Official Specification for that Tag Version
 47  
      */
 48  12
     protected TreeSet<String> supportedFrames = new TreeSet<String>();
 49  
 
 50  
     /**
 51  
      * These frames are extensions to the  Specification for that Tag Version
 52  
      */
 53  12
     protected TreeSet<String> extensionFrames = new TreeSet<String>();
 54  
 
 55  
     /**
 56  
      * These frames are Common , this is a loose term
 57  
      */
 58  12
     protected TreeSet<String> commonFrames = new TreeSet<String>();
 59  
 
 60  
     /**
 61  
      * These frames are Binary
 62  
      */
 63  12
     protected TreeSet<String> binaryFrames = new TreeSet<String>();
 64  
 
 65  
     /**
 66  
      * If file changes discard these frames
 67  
      * @param frameID
 68  
      * @return
 69  
      */
 70  
     public boolean isDiscardIfFileAltered(String frameID)
 71  
     {
 72  9361
         return discardIfFileAlteredFrames.contains(frameID);
 73  
     }
 74  
 
 75  
     /**
 76  
      * Are multiple ocurrences of frame allowed
 77  
      * @param frameID
 78  
      * @return
 79  
      */
 80  
     public boolean isMultipleAllowed(String frameID)
 81  
     {
 82  15376
         return multipleFrames.contains(frameID);
 83  
     }
 84  
 
 85  
     /**
 86  
      * @param frameID
 87  
      * @return true if frames with this id are part of the specification
 88  
      */
 89  
     public boolean isSupportedFrames(String frameID)
 90  
     {
 91  184
         return supportedFrames.contains(frameID);
 92  
     }
 93  
 
 94  
     /**
 95  
      * @param frameID
 96  
      * @return true if frames with this id are considered common
 97  
      */
 98  
     public boolean isCommon(String frameID)
 99  
     {
 100  0
         return commonFrames.contains(frameID);
 101  
     }
 102  
 
 103  
     /**
 104  
      * @param frameID
 105  
      * @return true if frames with this id are binary (non textual data)
 106  
      */
 107  
     public boolean isBinary(String frameID)
 108  
     {
 109  0
         return binaryFrames.contains(frameID);
 110  
     }
 111  
 
 112  
 
 113  
     /**
 114  
      * @param frameID
 115  
      * @return true if frame is a known extension
 116  
      */
 117  
     public boolean isExtensionFrames(String frameID)
 118  
     {
 119  184
         return extensionFrames.contains(frameID);
 120  
     }
 121  
 
 122  
 
 123  
     /**
 124  
      * Mapping from v22 to v23
 125  
      */
 126  4
     public static final Map<String, String> convertv22Tov23 = new LinkedHashMap<String, String>();
 127  4
     public static final Map<String, String> convertv23Tov22 = new LinkedHashMap<String, String>();
 128  4
     public static final Map<String, String> forcev22Tov23 = new LinkedHashMap<String, String>();
 129  4
     public static final Map<String, String> forcev23Tov22 = new LinkedHashMap<String, String>();
 130  
 
 131  4
     public static final Map<String, String> convertv23Tov24 = new LinkedHashMap<String, String>();
 132  4
     public static final Map<String, String> convertv24Tov23 = new LinkedHashMap<String, String>();
 133  4
     public static final Map<String, String> forcev23Tov24 = new LinkedHashMap<String, String>();
 134  4
     public static final Map<String, String> forcev24Tov23 = new LinkedHashMap<String, String>();
 135  
 
 136  
 
 137  
     private static void loadID3v23ID3v24Mapping()
 138  
     {
 139  
         // Define the mapping from v23 to v24 only maps values where
 140  
         // the v23 ID is not a v24 ID and where the translation from v23 to v24
 141  
         // ID does not affect the framebody.
 142  
         //This one way allows us to convert XSOT to TSOT,XSOP to TSOP and XSOA - TSOA but in the other direction gets converted to TSOT,TSOP,TSOA
 143  4
         convertv23Tov24.put(ID3v23Frames.FRAME_ID_V3_TITLE_SORT_ORDER_MUSICBRAINZ, ID3v24Frames.FRAME_ID_TITLE_SORT_ORDER);
 144  4
         convertv23Tov24.put(ID3v23Frames.FRAME_ID_V3_ARTIST_SORT_ORDER_MUSICBRAINZ, ID3v24Frames.FRAME_ID_ARTIST_SORT_ORDER);
 145  4
         convertv23Tov24.put(ID3v23Frames.FRAME_ID_V3_ALBUM_SORT_ORDER_MUSICBRAINZ, ID3v24Frames.FRAME_ID_ALBUM_SORT_ORDER);
 146  
 
 147  
         // No others exist because most v23 mappings are identical to v24 therefore no mapping required and the ones that
 148  
         // are different need to be forced.
 149  
 
 150  
         // Force v23 to v24 These are deprecated and need to do a forced mapping
 151  4
         forcev23Tov24.put(ID3v23Frames.FRAME_ID_V3_RELATIVE_VOLUME_ADJUSTMENT, ID3v24Frames.FRAME_ID_RELATIVE_VOLUME_ADJUSTMENT2);
 152  4
         forcev23Tov24.put(ID3v23Frames.FRAME_ID_V3_EQUALISATION, ID3v24Frames.FRAME_ID_EQUALISATION2);
 153  4
         forcev23Tov24.put(ID3v23Frames.FRAME_ID_V3_IPLS, ID3v24Frames.FRAME_ID_INVOLVED_PEOPLE);
 154  4
         forcev23Tov24.put(ID3v23Frames.FRAME_ID_V3_TDAT, ID3v24Frames.FRAME_ID_YEAR);
 155  4
         forcev23Tov24.put(ID3v23Frames.FRAME_ID_V3_TIME, ID3v24Frames.FRAME_ID_YEAR);
 156  4
         forcev23Tov24.put(ID3v23Frames.FRAME_ID_V3_TORY, ID3v24Frames.FRAME_ID_ORIGINAL_RELEASE_TIME);
 157  4
         forcev23Tov24.put(ID3v23Frames.FRAME_ID_V3_TRDA, ID3v24Frames.FRAME_ID_YEAR);
 158  4
         forcev23Tov24.put(ID3v23Frames.FRAME_ID_V3_TYER, ID3v24Frames.FRAME_ID_YEAR);
 159  
 
 160  4
         forcev23Tov24.put(ID3v23Frames.FRAME_ID_V3_TYER, ID3v24Frames.FRAME_ID_YEAR);
 161  
 
 162  
         //Note Force v24 to v23, TDRC is a 1M relationship handled specially.
 163  
         // @TODO EQUALISATION
 164  4
         forcev24Tov23.put(ID3v24Frames.FRAME_ID_RELATIVE_VOLUME_ADJUSTMENT2, ID3v23Frames.FRAME_ID_V3_RELATIVE_VOLUME_ADJUSTMENT);
 165  
         //Used to be a special frame now a text frame
 166  4
         forcev24Tov23.put(ID3v24Frames.FRAME_ID_INVOLVED_PEOPLE, ID3v23Frames.FRAME_ID_V3_IPLS);
 167  
         //No Mood frame in v23 so use a TXXX frame
 168  4
         forcev24Tov23.put(ID3v24Frames.FRAME_ID_MOOD, ID3v23Frames.FRAME_ID_V3_USER_DEFINED_INFO);
 169  
 
 170  4
     }
 171  
 
 172  
     private static void loadID3v22ID3v23Mapping()
 173  
     {
 174  
         Iterator<String> iterator;
 175  
         String key;
 176  
         String value;
 177  
 
 178  
         // All v22 ids were renamed in v23, but are essentially the same
 179  4
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_ACCOMPANIMENT, ID3v23Frames.FRAME_ID_V3_ACCOMPANIMENT);
 180  4
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_ALBUM, ID3v23Frames.FRAME_ID_V3_ALBUM);
 181  4
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_ARTIST, ID3v23Frames.FRAME_ID_V3_ARTIST);
 182  4
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_AUDIO_ENCRYPTION, ID3v23Frames.FRAME_ID_V3_AUDIO_ENCRYPTION);
 183  4
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_BPM, ID3v23Frames.FRAME_ID_V3_BPM);
 184  4
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_COMMENT, ID3v23Frames.FRAME_ID_V3_COMMENT);
 185  4
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_COMMENT, ID3v23Frames.FRAME_ID_V3_COMMENT);
 186  4
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_COMPOSER, ID3v23Frames.FRAME_ID_V3_COMPOSER);
 187  4
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_CONDUCTOR, ID3v23Frames.FRAME_ID_V3_CONDUCTOR);
 188  4
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_CONTENT_GROUP_DESC, ID3v23Frames.FRAME_ID_V3_CONTENT_GROUP_DESC);
 189  4
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_COPYRIGHTINFO, ID3v23Frames.FRAME_ID_V3_COPYRIGHTINFO);
 190  4
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_ENCODEDBY, ID3v23Frames.FRAME_ID_V3_ENCODEDBY);
 191  4
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_EQUALISATION, ID3v23Frames.FRAME_ID_V3_EQUALISATION);
 192  4
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_EVENT_TIMING_CODES, ID3v23Frames.FRAME_ID_V3_EVENT_TIMING_CODES);
 193  4
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_FILE_TYPE, ID3v23Frames.FRAME_ID_V3_FILE_TYPE);
 194  4
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_GENERAL_ENCAPS_OBJECT, ID3v23Frames.FRAME_ID_V3_GENERAL_ENCAPS_OBJECT);
 195  4
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_GENRE, ID3v23Frames.FRAME_ID_V3_GENRE);
 196  4
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_HW_SW_SETTINGS, ID3v23Frames.FRAME_ID_V3_HW_SW_SETTINGS);
 197  4
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_INITIAL_KEY, ID3v23Frames.FRAME_ID_V3_INITIAL_KEY);
 198  4
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_IPLS, ID3v23Frames.FRAME_ID_V3_IPLS);
 199  4
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_ISRC, ID3v23Frames.FRAME_ID_V3_ISRC);
 200  4
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_LANGUAGE, ID3v23Frames.FRAME_ID_V3_LANGUAGE);
 201  4
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_LENGTH, ID3v23Frames.FRAME_ID_V3_LENGTH);
 202  4
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_LINKED_INFO, ID3v23Frames.FRAME_ID_V3_LINKED_INFO);
 203  4
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_LYRICIST, ID3v23Frames.FRAME_ID_V3_LYRICIST);
 204  4
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_MEDIA_TYPE, ID3v23Frames.FRAME_ID_V3_MEDIA_TYPE);
 205  4
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_MPEG_LOCATION_LOOKUP_TABLE, ID3v23Frames.FRAME_ID_V3_MPEG_LOCATION_LOOKUP_TABLE);
 206  4
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_MUSIC_CD_ID, ID3v23Frames.FRAME_ID_V3_MUSIC_CD_ID);
 207  4
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_ORIGARTIST, ID3v23Frames.FRAME_ID_V3_ORIGARTIST);
 208  4
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_ORIG_FILENAME, ID3v23Frames.FRAME_ID_V3_ORIG_FILENAME);
 209  4
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_ORIG_LYRICIST, ID3v23Frames.FRAME_ID_V3_ORIG_LYRICIST);
 210  4
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_ORIG_TITLE, ID3v23Frames.FRAME_ID_V3_ORIG_TITLE);
 211  4
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_PLAYLIST_DELAY, ID3v23Frames.FRAME_ID_V3_PLAYLIST_DELAY);
 212  4
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_PLAY_COUNTER, ID3v23Frames.FRAME_ID_V3_PLAY_COUNTER);
 213  4
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_PLAY_COUNTER, ID3v23Frames.FRAME_ID_V3_PLAY_COUNTER);
 214  4
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_POPULARIMETER, ID3v23Frames.FRAME_ID_V3_POPULARIMETER);
 215  4
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_PUBLISHER, ID3v23Frames.FRAME_ID_V3_PUBLISHER);
 216  4
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_RECOMMENDED_BUFFER_SIZE, ID3v23Frames.FRAME_ID_V3_RECOMMENDED_BUFFER_SIZE);
 217  4
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_RECOMMENDED_BUFFER_SIZE, ID3v23Frames.FRAME_ID_V3_RECOMMENDED_BUFFER_SIZE);
 218  4
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_RELATIVE_VOLUME_ADJUSTMENT, ID3v23Frames.FRAME_ID_V3_RELATIVE_VOLUME_ADJUSTMENT);
 219  4
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_REMIXED, ID3v23Frames.FRAME_ID_V3_REMIXED);
 220  4
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_REVERB, ID3v23Frames.FRAME_ID_V3_REVERB);
 221  4
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_SET, ID3v23Frames.FRAME_ID_V3_SET);
 222  4
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_SYNC_LYRIC, ID3v23Frames.FRAME_ID_V3_SYNC_LYRIC);
 223  4
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_SYNC_TEMPO, ID3v23Frames.FRAME_ID_V3_SYNC_TEMPO);
 224  4
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_TDAT, ID3v23Frames.FRAME_ID_V3_TDAT);
 225  4
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_TIME, ID3v23Frames.FRAME_ID_V3_TIME);
 226  4
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_TITLE_REFINEMENT, ID3v23Frames.FRAME_ID_V3_TITLE_REFINEMENT);
 227  4
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_TORY, ID3v23Frames.FRAME_ID_V3_TORY);
 228  4
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_TRACK, ID3v23Frames.FRAME_ID_V3_TRACK);
 229  4
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_TRDA, ID3v23Frames.FRAME_ID_V3_TRDA);
 230  4
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_TSIZ, ID3v23Frames.FRAME_ID_V3_TSIZ);
 231  4
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_TYER, ID3v23Frames.FRAME_ID_V3_TYER);
 232  4
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_UNIQUE_FILE_ID, ID3v23Frames.FRAME_ID_V3_UNIQUE_FILE_ID);
 233  4
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_UNIQUE_FILE_ID, ID3v23Frames.FRAME_ID_V3_UNIQUE_FILE_ID);
 234  4
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_UNSYNC_LYRICS, ID3v23Frames.FRAME_ID_V3_UNSYNC_LYRICS);
 235  4
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_URL_ARTIST_WEB, ID3v23Frames.FRAME_ID_V3_URL_ARTIST_WEB);
 236  4
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_URL_COMMERCIAL, ID3v23Frames.FRAME_ID_V3_URL_COMMERCIAL);
 237  4
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_URL_COPYRIGHT, ID3v23Frames.FRAME_ID_V3_URL_COPYRIGHT);
 238  4
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_URL_FILE_WEB, ID3v23Frames.FRAME_ID_V3_URL_FILE_WEB);
 239  4
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_URL_OFFICIAL_RADIO, ID3v23Frames.FRAME_ID_V3_URL_OFFICIAL_RADIO);
 240  4
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_URL_PAYMENT, ID3v23Frames.FRAME_ID_V3_URL_PAYMENT);
 241  4
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_URL_PUBLISHERS, ID3v23Frames.FRAME_ID_V3_URL_PUBLISHERS);
 242  4
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_URL_SOURCE_WEB, ID3v23Frames.FRAME_ID_V3_URL_SOURCE_WEB);
 243  4
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_USER_DEFINED_INFO, ID3v23Frames.FRAME_ID_V3_USER_DEFINED_INFO);
 244  4
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_USER_DEFINED_URL, ID3v23Frames.FRAME_ID_V3_USER_DEFINED_URL);
 245  4
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_TITLE, ID3v23Frames.FRAME_ID_V3_TITLE);
 246  4
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_IS_COMPILATION, ID3v23Frames.FRAME_ID_V3_IS_COMPILATION);
 247  4
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_TITLE_SORT_ORDER_ITUNES, ID3v23Frames.FRAME_ID_V3_TITLE_SORT_ORDER_ITUNES);
 248  4
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_ARTIST_SORT_ORDER_ITUNES, ID3v23Frames.FRAME_ID_V3_ARTIST_SORT_ORDER_ITUNES);
 249  4
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_ALBUM_SORT_ORDER_ITUNES, ID3v23Frames.FRAME_ID_V3_ALBUM_SORT_ORDER_ITUNES);
 250  4
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_ALBUM_ARTIST_SORT_ORDER_ITUNES, ID3v23Frames.FRAME_ID_V3_ALBUM_ARTIST_SORT_ORDER_ITUNES);
 251  4
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_COMPOSER_SORT_ORDER_ITUNES, ID3v23Frames.FRAME_ID_V3_COMPOSER_SORT_ORDER_ITUNES);
 252  
 
 253  
         // v23 to v22 The translation is both way
 254  4
         iterator = convertv22Tov23.keySet().iterator();
 255  280
         while (iterator.hasNext())
 256  
         {
 257  276
             key = iterator.next();
 258  276
             value = convertv22Tov23.get(key);
 259  276
             convertv23Tov22.put(value, key);
 260  
         }
 261  
 
 262  
         //This one way translation allows us to convert XSOT to TST, but in the other direction gets converted to TSOT
 263  4
         convertv23Tov22.put(ID3v23Frames.FRAME_ID_V3_TITLE_SORT_ORDER_MUSICBRAINZ, ID3v22Frames.FRAME_ID_V2_TITLE_SORT_ORDER_ITUNES);
 264  4
         convertv23Tov22.put(ID3v23Frames.FRAME_ID_V3_ARTIST_SORT_ORDER_MUSICBRAINZ, ID3v22Frames.FRAME_ID_V2_ARTIST_SORT_ORDER_ITUNES);
 265  4
         convertv23Tov22.put(ID3v23Frames.FRAME_ID_V3_ALBUM_SORT_ORDER_MUSICBRAINZ, ID3v22Frames.FRAME_ID_V2_ALBUM_SORT_ORDER_ITUNES);
 266  
 
 267  
         //TODO What does CRM Map to ?
 268  
         // Force v22 to v23,  Extra fields in v23 version
 269  4
         forcev22Tov23.put(ID3v22Frames.FRAME_ID_V2_ATTACHED_PICTURE, ID3v23Frames.FRAME_ID_V3_ATTACHED_PICTURE);
 270  
 
 271  
         // Force v23 to v22
 272  4
         forcev23Tov22.put(ID3v23Frames.FRAME_ID_V3_ATTACHED_PICTURE, ID3v22Frames.FRAME_ID_V2_ATTACHED_PICTURE);
 273  4
     }
 274  
 
 275  
     static
 276  
     {
 277  4
         loadID3v22ID3v23Mapping();
 278  4
         loadID3v23ID3v24Mapping();
 279  4
     }
 280  
 
 281  
 
 282  
 }