Coverage Report - org.jaudiotagger.tag.mp4.Mp4FieldKey
 
Classes in this File Line Coverage Branch Coverage Complexity
Mp4FieldKey
97%
147/152
0%
0/2
0
 
 1  
 package org.jaudiotagger.tag.mp4;
 2  
 
 3  
 import org.jaudiotagger.tag.mp4.field.Mp4FieldType;
 4  
 import static org.jaudiotagger.tag.mp4.field.Mp4FieldType.*;
 5  
 import org.jaudiotagger.tag.mp4.field.Mp4TagReverseDnsField;
 6  
 import org.jaudiotagger.tag.reference.Tagger;
 7  
 
 8  
 /**
 9  
  * Starting list of known mp4 metadata fields that follow the Parent,Data or ---,issuer,name,data
 10  
  * convention. Atoms that contain metadata in other formats are not listed here because they need to be processed
 11  
  * specially.
 12  
  * <p/>
 13  
  * <p>Simple metaitems use the parent atom id as their identifier whereas reverse dns (----) atoms use
 14  
  * the reversedns,issuer and name fields as their identifier. When the atom is non-0standard but follws the rules
 15  
  * we list it here with an additional Tagger field to indicate where the field was originally designed.
 16  
  * <p/>
 17  
  * From:
 18  
  * http://www.hydrogenaudio.org/forums/index.php?showtopic=29120&st=0&p=251686&#entry251686
 19  
  * http://wiki.musicbrainz.org/PicardQt/TagMapping
 20  
  * http://atomicparsley.sourceforge.net/mpeg-4files.html
 21  
  * <p/>
 22  
  * <p/>
 23  
  */
 24  25
 public enum Mp4FieldKey
 25  
 {
 26  17
     ARTIST("�ART", TEXT),
 27  17
     ALBUM("�alb", TEXT),
 28  17
     ALBUM_ARTIST("aART", TEXT),
 29  17
     GENRE_CUSTOM("�gen", TEXT),
 30  17
     GENRE("gnre", NUMERIC),
 31  17
     TITLE("�nam", TEXT),
 32  17
     TRACK("trkn", NUMERIC),
 33  17
     BPM("tmpo", BYTE, 2),
 34  17
     DAY("�day", TEXT),
 35  17
     COMMENT("�cmt", TEXT),
 36  17
     COMPOSER("�wrt", TEXT),
 37  17
     GROUPING("�grp", TEXT),
 38  17
     DISCNUMBER("disk", NUMERIC),
 39  17
     LYRICS("�lyr", TEXT),
 40  17
     RATING("rtng", BYTE),   //AFAIK Cant be set in itunes, but if set to explicit itunes will show as explicit
 41  17
     ENCODER("�too", TEXT),
 42  17
     COMPILATION("cpil", BYTE, 1),
 43  17
     COPYRIGHT("cprt", TEXT),
 44  17
     CATEGORY("catg", TEXT),
 45  17
     KEYWORD("keyw", TEXT),
 46  17
     DESCRIPTION("desc", TEXT),
 47  17
     ARTIST_SORT("soar", TEXT),
 48  17
     ALBUM_ARTIST_SORT("soaa", TEXT),
 49  17
     ALBUM_SORT("soal", TEXT),
 50  17
     TITLE_SORT("sonm", TEXT),
 51  17
     COMPOSER_SORT("soco", TEXT),
 52  17
     SHOW_SORT("sosn", TEXT),
 53  17
     SHOW("tvsh", TEXT),      //tv show but also used just as show
 54  17
     ARTWORK("covr", COVERART_JPEG),
 55  17
     PURCHASE_DATE("purd", TEXT),
 56  17
     MUSICBRAINZ_ARTISTID("com.apple.iTunes", "MusicBrainz Artist Id", TEXT, Tagger.PICARD),
 57  17
     MUSICBRAINZ_ALBUMID("com.apple.iTunes", "MusicBrainz Album Id", TEXT, Tagger.PICARD),
 58  17
     MUSICBRAINZ_ALBUMARTISTID("com.apple.iTunes", "MusicBrainz Album Artist Id", TEXT, Tagger.PICARD),
 59  17
     MUSICBRAINZ_TRACKID("com.apple.iTunes", "MusicBrainz Track Id", TEXT, Tagger.PICARD),
 60  17
     MUSICBRAINZ_DISCID("com.apple.iTunes", "MusicBrainz Disc Id", TEXT, Tagger.PICARD),
 61  17
     MUSICIP_PUID("com.apple.iTunes", "MusicIP PUID", TEXT, Tagger.PICARD),
 62  17
     ASIN("com.apple.iTunes", "ASIN", TEXT, Tagger.PICARD),
 63  17
     MUSICBRAINZ_ALBUM_STATUS("com.apple.iTunes", "MusicBrainz Album Status", TEXT, Tagger.PICARD),
 64  17
     MUSICBRAINZ_ALBUM_TYPE("com.apple.iTunes", "MusicBrainz Album Type", TEXT, Tagger.PICARD),
 65  17
     RELEASECOUNTRY("com.apple.iTunes", "MusicBrainz Album Release Country", TEXT, Tagger.PICARD),
 66  17
     PART_OF_GAPLESS_ALBUM("pgap", BYTE),
 67  17
     ITUNES_SMPB("com.apple.iTunes", "iTunSMPB", TEXT),
 68  17
     ITUNES_NORM("com.apple.iTunes", "iTunNORM", TEXT),
 69  17
     CDDB_1("com.apple.iTunes", "iTunes_CDDB_1", TEXT),
 70  17
     CDDB_TRACKNUMBER("com.apple.iTunes", "iTunes_CDDB_TrackNumber", TEXT),
 71  17
     CDDB_IDS("com.apple.iTunes", "iTunes_CDDB_IDs", TEXT),
 72  17
     LANGUAGE("com.apple.iTunes", "Language", TEXT, Tagger.JAIKOZ),
 73  17
     KEY("com.apple.iTunes", "key", TEXT, Tagger.JAIKOZ),
 74  
 
 75  
     //AFAIK These arent actually used by Audio Only files, but there is nothing to prevent them being used
 76  17
     CONTENT_TYPE("stik", BYTE, 1),
 77  17
     PODCAST_KEYWORD("keyw", TEXT),
 78  17
     PODCAST_URL("purl", NUMERIC),   //TODO Actually seems to store text but is marked as numeric!
 79  17
     EPISODE_GLOBAL_ID("egid", NUMERIC),   //TODO Actually seems to store text but is marked as numeric!
 80  17
     TV_NETWORK("tvnn", TEXT),
 81  17
     TV_EPISODE_NUMBER("tven", TEXT),
 82  17
     TV_SEASON("tvsn", BYTE, 1),
 83  17
     TV_EPISODE("tves", BYTE, 1),
 84  
 
 85  
     //These seem to be used in DRM Files, of type byte , we need to know the byte length to allow them to be written
 86  
     //back correctly on saving them, we don't provides options to modify them as may break drm
 87  17
     AP_ID("apID", TEXT),
 88  17
     AT_ID("atID", BYTE, 4),
 89  17
     CN_ID("cnID", BYTE, 4),
 90  17
     PL_ID("plID", BYTE, 8),
 91  17
     GE_ID("geID", BYTE, 4),
 92  17
     SF_ID("sfID", BYTE, 4),
 93  17
     AK_ID("akID", BYTE, 1),
 94  
 
 95  
     //Media Monkey3 beta
 96  17
     LYRICIST_MM3BETA("lyrc", TEXT, Tagger.MEDIA_MONKEY),
 97  17
     CONDUCTOR_MM3BETA("cond", TEXT, Tagger.MEDIA_MONKEY),
 98  17
     ISRC_MMBETA("isrc", TEXT, Tagger.MEDIA_MONKEY),
 99  17
     MOOD_MM3BETA("mood", TEXT, Tagger.MEDIA_MONKEY),
 100  17
     SCORE("rate", TEXT, Tagger.MEDIA_MONKEY),    //As in mark out of 100
 101  17
     ORIGINAL_ARTIST("oart", TEXT, Tagger.MEDIA_MONKEY),
 102  17
     ORIGINAL_ALBUM_TITLE("otit", TEXT, Tagger.MEDIA_MONKEY),
 103  17
     ORIGINAL_LYRICIST("olyr", TEXT, Tagger.MEDIA_MONKEY),
 104  17
     INVOLVED_PEOPLE("peop", TEXT, Tagger.MEDIA_MONKEY),
 105  17
     TEMPO("empo", TEXT, Tagger.MEDIA_MONKEY),
 106  17
     OCCASION("occa", TEXT, Tagger.MEDIA_MONKEY),
 107  17
     QUALITY("qual", TEXT, Tagger.MEDIA_MONKEY),
 108  17
     CUSTOM_1("cus1", TEXT, Tagger.MEDIA_MONKEY),
 109  17
     CUSTOM_2("cus2", TEXT, Tagger.MEDIA_MONKEY),
 110  17
     CUSTOM_3("cus3", TEXT, Tagger.MEDIA_MONKEY),
 111  17
     CUSTOM_4("cus4", TEXT, Tagger.MEDIA_MONKEY),
 112  17
     CUSTOM_5("cus5", TEXT, Tagger.MEDIA_MONKEY),
 113  
 
 114  
     //Media Monkey 3.0.6 Onwards
 115  17
     MM_PUBLISHER("com.apple.iTunes", "ORGANIZATION", TEXT, Tagger.MEDIA_MONKEY),
 116  17
     MM_ORIGINAL_ARTIST("com.apple.iTunes", "ORIGINAL ARTIST", TEXT, Tagger.MEDIA_MONKEY),
 117  17
     MM_ORIGINAL_ALBUM_TITLE("com.apple.iTunes", "ORIGINAL ALBUM", TEXT, Tagger.MEDIA_MONKEY),
 118  17
     MM_ORIGINAL_LYRICIST("com.apple.iTunes", "ORIGINAL LYRICIST", TEXT, Tagger.MEDIA_MONKEY),
 119  17
     MM_INVOLVED_PEOPLE("com.apple.iTunes", "INVOLVED PEOPLE", TEXT, Tagger.MEDIA_MONKEY),
 120  17
     MM_ORIGINAL_YEAR("com.apple.iTunes", "ORIGINAL YEAR", TEXT, Tagger.MEDIA_MONKEY),
 121  17
     MM_TEMPO("com.apple.iTunes", "TEMPO", TEXT, Tagger.MEDIA_MONKEY),
 122  17
     MM_OCCASION("com.apple.iTunes", "OCCASION", TEXT, Tagger.MEDIA_MONKEY),
 123  17
     MM_QUALITY("com.apple.iTunes", "QUALITY", TEXT, Tagger.MEDIA_MONKEY),
 124  17
     MM_CUSTOM_1("com.apple.iTunes", "CUSTOM1", TEXT, Tagger.MEDIA_MONKEY),
 125  17
     MM_CUSTOM_2("com.apple.iTunes", "CUSTOM2", TEXT, Tagger.MEDIA_MONKEY),
 126  17
     MM_CUSTOM_3("com.apple.iTunes", "CUSTOM3", TEXT, Tagger.MEDIA_MONKEY),
 127  17
     MM_CUSTOM_4("com.apple.iTunes", "CUSTOM4", TEXT, Tagger.MEDIA_MONKEY),
 128  17
     MM_CUSTOM_5("com.apple.iTunes", "CUSTOM5", TEXT, Tagger.MEDIA_MONKEY),
 129  
 
 130  
     //Picard Qt
 131  17
     LYRICIST("com.apple.iTunes", "LYRICIST", TEXT, Tagger.PICARD),
 132  17
     CONDUCTOR("com.apple.iTunes", "CONDUCTOR", TEXT, Tagger.PICARD),
 133  17
     REMIXER("com.apple.iTunes", "REMIXER", TEXT, Tagger.PICARD),
 134  17
     ENGINEER("com.apple.iTunes", "ENGINEER", TEXT, Tagger.PICARD),
 135  17
     PRODUCER("com.apple.iTunes", "PRODUCER", TEXT, Tagger.PICARD),
 136  17
     DJMIXER("com.apple.iTunes", "DJMIXER", TEXT, Tagger.PICARD),
 137  17
     MIXER("com.apple.iTunes", "MIXER", TEXT, Tagger.PICARD),
 138  17
     MOOD("com.apple.iTunes", "MOOD", TEXT, Tagger.PICARD),
 139  17
     ISRC("com.apple.iTunes", "ISRC", TEXT, Tagger.PICARD),
 140  17
     MEDIA("com.apple.iTunes", "MEDIA", TEXT, Tagger.PICARD),
 141  17
     LABEL("com.apple.iTunes", "LABEL", TEXT, Tagger.PICARD),
 142  17
     CATALOGNO("com.apple.iTunes", "CATALOGNUMBER", TEXT, Tagger.PICARD),
 143  17
     BARCODE("com.apple.iTunes", "BARCODE", TEXT, Tagger.PICARD),
 144  
 
 145  
     //Jaikoz
 146  17
     URL_OFFICIAL_RELEASE_SITE("com.apple.iTunes", "URL_OFFICIAL_RELEASE_SITE", TEXT, Tagger.JAIKOZ),
 147  17
     URL_DISCOGS_RELEASE_SITE("com.apple.iTunes", "URL_DISCOGS_RELEASE_SITE", TEXT, Tagger.JAIKOZ),
 148  17
     URL_WIKIPEDIA_RELEASE_SITE("com.apple.iTunes", "URL_WIKIPEDIA_RELEASE_SITE", TEXT, Tagger.JAIKOZ),
 149  17
     URL_OFFICIAL_ARTIST_SITE("com.apple.iTunes", "URL_OFFICIAL_ARTIST_SITE", TEXT, Tagger.JAIKOZ),
 150  17
     URL_DISCOGS_ARTIST_SITE("com.apple.iTunes", "URL_DISCOGS_ARTIST_SITE", TEXT, Tagger.JAIKOZ),
 151  17
     URL_WIKIPEDIA_ARTIST_SITE("com.apple.iTunes", "URL_WIKIPEDIA_ARTIST_SITE", TEXT, Tagger.JAIKOZ),
 152  
 
 153  
     //Winamp
 154  17
     WINAMP_PUBLISHER("com.nullsoft.winamp", "publisher", TEXT, Tagger.WINAMP),
 155  
 
 156  
     //Unknown
 157  17
     KEYS("keys",TEXT),
 158  
     
 159  
     ;
 160  
     private Tagger tagger;
 161  
     private String fieldName;
 162  
     private String issuer;
 163  
     private String identifier;
 164  
     private Mp4FieldType fieldType;
 165  
     private int fieldLength;
 166  
 
 167  
     /**
 168  
      * For usual metadata fields that use a data field
 169  
      *
 170  
      * @param fieldName
 171  
      * @param fieldType of data atom
 172  
      */
 173  
     Mp4FieldKey(String fieldName, Mp4FieldType fieldType)
 174  612
     {
 175  612
         this.fieldName = fieldName;
 176  612
         this.fieldType = fieldType;
 177  612
     }
 178  
 
 179  
     /**
 180  
      * For usual metadata fields that use a data field, but not recognised as standard field
 181  
      *
 182  
      * @param fieldName
 183  
      * @param fieldType of data atom
 184  
      */
 185  
     Mp4FieldKey(String fieldName, Mp4FieldType fieldType, Tagger tagger)
 186  289
     {
 187  289
         this.fieldName = fieldName;
 188  289
         this.fieldType = fieldType;
 189  289
         this.tagger = tagger;
 190  289
     }
 191  
 
 192  
     /**
 193  
      * For usual metadata fields that use a data field where the field length is fixed
 194  
      * such as Byte fields
 195  
      *
 196  
      * @param fieldName
 197  
      * @param fieldType
 198  
      * @param fieldLength
 199  
      */
 200  
     Mp4FieldKey(String fieldName, Mp4FieldType fieldType, int fieldLength)
 201  187
     {
 202  187
         this.fieldName = fieldName;
 203  187
         this.fieldType = fieldType;
 204  187
         this.fieldLength = fieldLength;
 205  187
     }
 206  
 
 207  
     /**
 208  
      * For reverse dns fields that use an internal fieldname of '----' and have  additional issuer
 209  
      * and identifier fields, we use all three seperated by a ':' ) to give us a unique key
 210  
      *
 211  
      * @param identifier
 212  
      * @param fieldType  of data atom
 213  
      */
 214  
     Mp4FieldKey(String issuer, String identifier, Mp4FieldType fieldType)
 215  85
     {
 216  
 
 217  85
         this.issuer = issuer;
 218  85
         this.identifier = identifier;
 219  85
         this.fieldName = Mp4TagReverseDnsField.IDENTIFIER + ":" + issuer + ":" + identifier;
 220  85
         this.fieldType = fieldType;
 221  85
     }
 222  
 
 223  
     /**
 224  
      * For reverse dns fields that use an internal fieldname of '----' and have  additional issuer
 225  
      * and identifier fields, we use all three seperated by a ':' ) to give us a unique key
 226  
      * For non-standard fields
 227  
      *
 228  
      * @param identifier
 229  
      * @param fieldType  of data atom
 230  
      */
 231  
     Mp4FieldKey(String issuer, String identifier, Mp4FieldType fieldType, Tagger tagger)
 232  782
     {
 233  
 
 234  782
         this.issuer = issuer;
 235  782
         this.identifier = identifier;
 236  782
         this.fieldName = Mp4TagReverseDnsField.IDENTIFIER + ":" + issuer + ":" + identifier;
 237  782
         this.fieldType = fieldType;
 238  782
         this.tagger = tagger;
 239  782
     }
 240  
 
 241  
     /**
 242  
      * This is the value of the fieldname that is actually used to write mp4
 243  
      *
 244  
      * @return
 245  
      */
 246  
     public String getFieldName()
 247  
     {
 248  22149
         return fieldName;
 249  
     }
 250  
 
 251  
     /**
 252  
      * @return fieldtype
 253  
      */
 254  
     public Mp4FieldType getFieldType()
 255  
     {
 256  0
         return fieldType;
 257  
     }
 258  
 
 259  
     /**
 260  
      * @return true if this is a reverse dns key
 261  
      */
 262  
     public boolean isReverseDnsType()
 263  
     {
 264  0
         return identifier.startsWith(Mp4TagReverseDnsField.IDENTIFIER);
 265  
     }
 266  
 
 267  
     /**
 268  
      * @return issuer (Reverse Dns Fields Only)
 269  
      */
 270  
     public String getIssuer()
 271  
     {
 272  66
         return issuer;
 273  
     }
 274  
 
 275  
     /**
 276  
      * @return identifier (Reverse Dns Fields Only)
 277  
      */
 278  
     public String getIdentifier()
 279  
     {
 280  66
         return identifier;
 281  
     }
 282  
 
 283  
     /**
 284  
      * @return field length (currently only used by byte fields)
 285  
      */
 286  
     public int getFieldLength()
 287  
     {
 288  9
         return fieldLength;
 289  
     }
 290  
 
 291  
     public Tagger getTagger()
 292  
     {
 293  0
         if (tagger != null)
 294  
         {
 295  0
             return tagger;
 296  
         }
 297  0
         return Tagger.ITUNES;
 298  
     }
 299  
 }