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