1
package org.jaudiotagger.tag.id3;
3
import junit.framework.Test;
4
import junit.framework.TestCase;
5
import junit.framework.TestSuite;
6
import org.jaudiotagger.AbstractTestCase;
7
import org.jaudiotagger.audio.AudioFile;
8
import org.jaudiotagger.audio.AudioFileIO;
9
import org.jaudiotagger.audio.mp3.MP3File;
10
import org.jaudiotagger.tag.FieldKey;
11
import org.jaudiotagger.tag.TagField;
12
import org.jaudiotagger.tag.TagOptionSingleton;
13
import org.jaudiotagger.tag.datatype.DataTypes;
14
import org.jaudiotagger.tag.id3.framebody.*;
15
import org.jaudiotagger.tag.id3.valuepair.TextEncoding;
17
import javax.imageio.ImageIO;
18
import java.awt.image.BufferedImage;
19
import java.io.ByteArrayInputStream;
21
import java.io.RandomAccessFile;
22
import java.util.ArrayList;
23
import java.util.Iterator;
24
import java.util.List;
25
import java.util.NoSuchElementException;
28
* Testing retrofitting of entagged interfaces
30
public class NewInterfaceTest extends TestCase
32
private static final String V1_ARTIST = "V1ARTIST";
34
public static final String ALBUM_TEST_STRING = "mellow gold";
35
public static final String ALBUM_TEST_STRING2 = "odelay";
42
protected void setUp()
44
TagOptionSingleton.getInstance().setToDefault();
50
protected void tearDown()
60
public NewInterfaceTest(String arg0)
66
* Command line entrance.
70
public static void main(String[] args)
72
junit.textui.TestRunner.run(suite());
76
* Builds the Test Suite.
78
* @return the Test Suite.
80
public static Test suite()
82
return new TestSuite(NewInterfaceTest.class);
85
public void testBasicWrite()
90
File testFile = AbstractTestCase.copyAudioToTmp("testV1.mp3", new File("testBasicWrite.mp3"));
91
org.jaudiotagger.audio.AudioFile audioFile = org.jaudiotagger.audio.AudioFileIO.read(testFile);
92
org.jaudiotagger.tag.Tag newTag = audioFile.getTag();
93
if (audioFile.getTag() == null)
95
audioFile.setTag(new ID3v23Tag());
96
newTag = audioFile.getTag();
99
newTag.setField(FieldKey.ALBUM,"album");
100
newTag.setField(FieldKey.ARTIST,"artist");
101
newTag.setField(FieldKey.COMMENT,"comment");
102
newTag.setField(FieldKey.GENRE,"Rock");
103
newTag.setField(FieldKey.TITLE,"title");
104
newTag.setField(FieldKey.YEAR,"year");
105
newTag.setField(FieldKey.TRACK,Integer.toString(1));
107
assertEquals("album", newTag.getFirst(FieldKey.ALBUM));
108
assertEquals("artist", newTag.getFirst(FieldKey.ARTIST));
109
assertEquals("comment", newTag.getFirst(FieldKey.COMMENT));
110
assertEquals("Rock", newTag.getFirst(FieldKey.GENRE));
111
assertEquals("title", newTag.getFirst(FieldKey.TITLE));
112
assertEquals("year", newTag.getFirst(FieldKey.YEAR));
113
assertEquals("1", newTag.getFirst(FieldKey.TRACK));
117
audioFile = org.jaudiotagger.audio.AudioFileIO.read(testFile);
118
newTag = audioFile.getTag();
119
assertEquals("album", newTag.getFirst(FieldKey.ALBUM));
120
assertEquals("artist", newTag.getFirst(FieldKey.ARTIST));
121
assertEquals("comment", newTag.getFirst(FieldKey.COMMENT));
122
assertEquals("Rock", newTag.getFirst(FieldKey.GENRE));
123
assertEquals("title", newTag.getFirst(FieldKey.TITLE));
124
assertEquals("year", newTag.getFirst(FieldKey.YEAR));
125
assertEquals("1", newTag.getFirst(FieldKey.TRACK));
126
AbstractTagFrameBody body = (((ID3v23Frame) newTag.getFirstField(ID3v23FieldKey.ALBUM.getFrameId())).getBody());
127
assertEquals(TextEncoding.ISO_8859_1, body.getTextEncoding());
129
TagOptionSingleton.getInstance().setId3v23DefaultTextEncoding(TextEncoding.UTF_16);
130
TagOptionSingleton.getInstance().setResetTextEncodingForExistingFrames(true);
132
audioFile = org.jaudiotagger.audio.AudioFileIO.read(testFile);
133
newTag = audioFile.getTag();
134
assertEquals("album", newTag.getFirst(FieldKey.ALBUM));
135
assertEquals("artist", newTag.getFirst(FieldKey.ARTIST));
136
assertEquals("comment", newTag.getFirst(FieldKey.COMMENT));
137
assertEquals("Rock", newTag.getFirst(FieldKey.GENRE));
138
assertEquals("title", newTag.getFirst(FieldKey.TITLE));
139
assertEquals("year", newTag.getFirst(FieldKey.YEAR));
140
assertEquals("1", newTag.getFirst(FieldKey.TRACK));
141
body = (((ID3v23Frame) newTag.getFirstField(ID3v23FieldKey.ALBUM.getFrameId())).getBody());
142
assertEquals(TextEncoding.UTF_16, body.getTextEncoding());
144
TagOptionSingleton.getInstance().setId3v23DefaultTextEncoding(TextEncoding.ISO_8859_1);
145
TagOptionSingleton.getInstance().setResetTextEncodingForExistingFrames(true);
147
audioFile = org.jaudiotagger.audio.AudioFileIO.read(testFile);
148
newTag = audioFile.getTag();
149
body = (((ID3v23Frame) newTag.getFirstField(ID3v23FieldKey.ALBUM.getFrameId())).getBody());
150
assertEquals(TextEncoding.ISO_8859_1, body.getTextEncoding());
151
TagOptionSingleton.getInstance().setResetTextEncodingForExistingFrames(false);
156
ex.printStackTrace();
161
public void testNewInterfaceBasicReadandWriteID3v1() throws Exception
164
File testFile = AbstractTestCase.copyAudioToTmp("testV1.mp3", new File("testnewIntId3v1.mp3"));
165
MP3File mp3File = new MP3File(testFile);
167
//Has no tag at this point
168
assertFalse(mp3File.hasID3v1Tag());
169
assertFalse(mp3File.hasID3v2Tag());
171
//Create v1 tag (old method)
172
ID3v11Tag v1tag = new ID3v11Tag();
173
v1tag.setField(FieldKey.ARTIST,V1_ARTIST);
174
v1tag.setField(FieldKey.ALBUM,"V1ALBUM" + "\u01ff"); //Note always convert to single byte so will be written as FF
175
v1tag.setField(v1tag.createField(FieldKey.TITLE, "title"));
176
v1tag.setField(FieldKey.GENRE,"Rock");
177
v1tag.setField(v1tag.createField(FieldKey.TRACK, "12"));
178
mp3File.setID3v1Tag(v1tag);
182
assertTrue(mp3File.hasID3v1Tag());
183
assertFalse(mp3File.hasID3v2Tag());
186
AudioFile af = AudioFileIO.read(testFile);
187
assertEquals(V1_ARTIST, af.getTag().getFirst(FieldKey.ARTIST));
188
assertEquals(V1_ARTIST, af.getTag().getFirst(FieldKey.ARTIST));
189
assertEquals(V1_ARTIST, af.getTag().getFirst(FieldKey.ARTIST));
190
assertEquals("V1ALBUM" + "\u00ff", af.getTag().getFirst(FieldKey.ALBUM)); //Lost the 00, is that what we want
191
assertEquals("title", af.getTag().getFirst(FieldKey.TITLE));
192
assertEquals("title", af.getTag().getFirst(FieldKey.TITLE));
193
assertEquals("Rock", af.getTag().getFirst(FieldKey.GENRE));
194
assertEquals("12", af.getTag().getFirst(FieldKey.TRACK));
195
assertEquals("12", af.getTag().getFirst(FieldKey.TRACK));
197
//Delete some fields (just sets string to empty String)
198
af.getTag().deleteField(FieldKey.TITLE);
199
assertEquals("", af.getTag().getFirst(FieldKey.TITLE));
202
af.getTag().setField(FieldKey.TITLE,"newtitle");
203
assertEquals("newtitle", af.getTag().getFirst(FieldKey.TITLE));
205
//Adding just replaces current value
206
af.getTag().addField(FieldKey.TITLE,"newtitle2");
207
assertEquals("newtitle2", af.getTag().getFirst(FieldKey.TITLE));
210
public void testNewInterfaceBasicReadandWriteID3v24() throws Exception
213
File testFile = AbstractTestCase.copyAudioToTmp("testV1.mp3", new File("testnewIntId3v24.mp3"));
214
MP3File mp3File = new MP3File(testFile);
216
//Has no tag at this point
217
assertFalse(mp3File.hasID3v1Tag());
218
assertFalse(mp3File.hasID3v2Tag());
220
//Create v1 tag (old method)
221
ID3v11Tag v1tag = new ID3v11Tag();
222
v1tag.setField(FieldKey.ARTIST,V1_ARTIST);
223
v1tag.setField(FieldKey.ALBUM,"V1ALBUM");
224
mp3File.setID3v1Tag(v1tag);
227
//Has only v1 tag at this point
228
assertTrue(mp3File.hasID3v1Tag());
229
assertFalse(mp3File.hasID3v2Tag());
231
//Read back artist (new method ,v1)
232
AudioFile af = AudioFileIO.read(testFile);
233
assertEquals(V1_ARTIST, af.getTag().getFirst(FieldKey.ARTIST));
234
assertEquals(V1_ARTIST, af.getTag().getFirst(FieldKey.ARTIST));
235
assertEquals(V1_ARTIST, af.getTag().getFirst(FieldKey.ARTIST));
237
//Add artist frame (old method)
238
ID3v24Tag tag = new ID3v24Tag();
239
ID3v24Frame frame = new ID3v24Frame(ID3v24Frames.FRAME_ID_ARTIST);
240
((FrameBodyTPE1) frame.getBody()).setText(FrameBodyTPE1Test.TPE1_TEST_STRING);
242
mp3File.setID3v2TagOnly(tag);
245
//Has v1 and v2 tag at this point
246
assertTrue(mp3File.hasID3v1Tag());
247
assertTrue(mp3File.hasID3v2Tag());
249
//Read back artist (new method ,v1 value overrriden by v2 method)
250
af = AudioFileIO.read(testFile);
251
assertEquals(FrameBodyTPE1Test.TPE1_TEST_STRING, af.getTag().getFirst(FieldKey.ARTIST));
252
assertEquals(FrameBodyTPE1Test.TPE1_TEST_STRING, af.getTag().getFirst(FieldKey.ARTIST));
253
assertEquals(FrameBodyTPE1Test.TPE1_TEST_STRING, ((ID3v24Tag) af.getTag()).getFirst(ID3v24FieldKey.ARTIST));
254
//.... but v1 value is still there
255
assertEquals(V1_ARTIST, ((MP3File) af).getID3v1Tag().getFirst(FieldKey.ARTIST));
256
//Write album ( new method)
257
af.getTag().setField(FieldKey.ALBUM,ALBUM_TEST_STRING);
260
//Read back album (new method)
261
af = AudioFileIO.read(testFile);
262
assertEquals(ALBUM_TEST_STRING, af.getTag().getFirst(FieldKey.ALBUM));
263
assertEquals(ALBUM_TEST_STRING, af.getTag().getFirst(FieldKey.ALBUM));
264
assertEquals(ALBUM_TEST_STRING, ((ID3v24Tag) af.getTag()).getFirst(ID3v24FieldKey.ALBUM));
265
assertEquals(1, af.getTag().getFields(FieldKey.ALBUM).size());
267
//Read back album (old method)
268
AbstractID3v2Frame checkframe = (AbstractID3v2Frame) ((MP3File) af).getID3v2Tag().getFrame(ID3v24Frames.FRAME_ID_ALBUM);
269
assertEquals(ALBUM_TEST_STRING, ((FrameBodyTALB) checkframe.getBody()).getText());
271
//Should only be allowed to addField one album, there is no multi value support for it
272
af.getTag().addField(FieldKey.ALBUM,ALBUM_TEST_STRING2);
274
af = AudioFileIO.read(testFile);
275
assertEquals(ALBUM_TEST_STRING, af.getTag().getFirst(FieldKey.ALBUM));
276
assertEquals(ALBUM_TEST_STRING, af.getTag().getFirst(FieldKey.ALBUM));
277
assertEquals(ALBUM_TEST_STRING, ((ID3v24Tag) af.getTag()).getFirst(ID3v24FieldKey.ALBUM));
278
assertEquals(1, af.getTag().getFields(FieldKey.ALBUM).size());
280
//But can replace existing value
281
af.getTag().setField(FieldKey.ALBUM,ALBUM_TEST_STRING2);
283
af = AudioFileIO.read(testFile);
284
assertEquals(ALBUM_TEST_STRING2, af.getTag().getFirst(FieldKey.ALBUM));
285
assertEquals(ALBUM_TEST_STRING2, af.getTag().getFirst(FieldKey.ALBUM));
286
assertEquals(ALBUM_TEST_STRING2, ((ID3v24Tag) af.getTag()).getFirst(ID3v24FieldKey.ALBUM));
287
assertEquals(1, af.getTag().getFields(FieldKey.ALBUM).size());
290
af.getTag().deleteField(FieldKey.ALBUM);
292
af = AudioFileIO.read(testFile);
293
assertEquals("", af.getTag().getFirst(FieldKey.ALBUM));
294
assertEquals("", af.getTag().getFirst(FieldKey.ALBUM));
295
assertEquals("", ((ID3v24Tag) af.getTag()).getFirst(ID3v24FieldKey.ALBUM));
296
assertEquals(0, af.getTag().getFields(FieldKey.ALBUM).size());
298
//Test out the other basic fields
300
af.getTag().setField(FieldKey.YEAR,"1991");
302
af = AudioFileIO.read(testFile);
303
assertEquals("1991", af.getTag().getFirst(FieldKey.YEAR));
304
assertEquals("1991", af.getTag().getFirst(FieldKey.YEAR));
305
assertEquals("1991", ((ID3v24Tag) af.getTag()).getFirst(ID3v24FieldKey.YEAR));
306
assertEquals(1, af.getTag().getFields(FieldKey.YEAR).size());
307
assertEquals(2, af.getTag().getFieldCount());
310
af.getTag().setField(FieldKey.TITLE,"Title");
312
af = AudioFileIO.read(testFile);
313
assertEquals("Title", af.getTag().getFirst(FieldKey.TITLE));
314
assertEquals("Title", af.getTag().getFirst(FieldKey.TITLE));
315
assertEquals("Title", ((ID3v24Tag) af.getTag()).getFirst(ID3v24FieldKey.TITLE));
316
assertEquals(1, af.getTag().getFields(FieldKey.TITLE).size());
317
assertEquals(3, af.getTag().getFieldCount());
319
//Comment, trickier because uses different framebody subclass to the ones above
320
af.getTag().setField(FieldKey.COMMENT,"Comment");
322
af = AudioFileIO.read(testFile);
323
assertEquals("Comment", af.getTag().getFirst(FieldKey.COMMENT));
324
assertEquals("Comment", ((ID3v24Tag) af.getTag()).getFirst(ID3v24FieldKey.COMMENT));
326
//By default comments are created with empty description because this is what expected
327
//by plyers such as iTunes.
328
ID3v24Frame commentFrame = (ID3v24Frame) ((ID3v24Tag) af.getTag()).getFrame("COMM");
329
FrameBodyCOMM fb = (FrameBodyCOMM) commentFrame.getBody();
330
assertEquals("", fb.getDescription());
331
assertEquals("Comment", fb.getText());
332
//Change description, cant do this with common interface
333
fb.setDescription("test");
334
//Because has different description the following setField will addField another comment rather than overwriting the first one
335
af.getTag().setField(FieldKey.COMMENT,"Comment2");
336
assertEquals(2, af.getTag().getFields(FieldKey.COMMENT).size());
338
List<TagField> comments = af.getTag().getFields(FieldKey.COMMENT);
339
((FrameBodyCOMM) ((ID3v24Frame) comments.get(1)).getBody()).setDescription("test2");
340
af.getTag().setField(FieldKey.COMMENT,"Comment3");
342
af = AudioFileIO.read(testFile);
343
assertEquals(3, af.getTag().getFields(FieldKey.COMMENT).size());
345
//Add fourth Comment (but duplicate key - so overwrites 3rd comment)
346
af.getTag().setField(FieldKey.COMMENT,"Comment4");
348
af = AudioFileIO.read(testFile);
349
assertEquals(3, af.getTag().getFields(FieldKey.COMMENT).size());
351
//Remove all Comment tags
352
af.getTag().deleteField(FieldKey.COMMENT);
353
assertEquals(0, af.getTag().getFields(FieldKey.COMMENT).size());
355
//Add first one back in
356
af.getTag().setField(FieldKey.COMMENT,"Comment");
358
af = AudioFileIO.read(testFile);
359
assertEquals(1, af.getTag().getFields(FieldKey.COMMENT).size());
360
assertEquals(4, af.getTag().getFieldCount());
363
//TODO only one genre frame allowed, but that can contain multiple GENRE values, currently
364
//must parse as one genre e.g 34 67
365
af.getTag().setField(FieldKey.GENRE,"CustomGenre");
367
af = AudioFileIO.read(testFile);
368
assertEquals("CustomGenre", af.getTag().getFirst(FieldKey.GENRE));
369
assertEquals("CustomGenre", af.getTag().getFirst(FieldKey.GENRE));
370
assertEquals("CustomGenre", ((ID3v24Tag) af.getTag()).getFirst(ID3v24FieldKey.GENRE));
371
assertEquals(1, af.getTag().getFields(FieldKey.GENRE).size());
372
assertEquals(5, af.getTag().getFieldCount());
375
af.getTag().setField(FieldKey.TRACK,"7");
376
af.getTag().setField(af.getTag().createField(FieldKey.TRACK_TOTAL, "11"));
377
assertEquals("7",af.getTag().getFirst(FieldKey.TRACK));
378
assertEquals("11",af.getTag().getFirst(FieldKey.TRACK_TOTAL));
380
af = AudioFileIO.read(testFile);
381
assertEquals("7", af.getTag().getFirst(FieldKey.TRACK));
382
assertEquals("7", af.getTag().getFirst(FieldKey.TRACK));
383
assertEquals("7", ((ID3v24Tag) af.getTag()).getFirst(ID3v24FieldKey.TRACK));
384
assertEquals("11",af.getTag().getFirst(FieldKey.TRACK_TOTAL));
385
assertEquals(1, af.getTag().getFields(FieldKey.TRACK).size());
386
assertEquals(6, af.getTag().getFieldCount());
389
//This is one of many fields that uses the TXXX frame, the logic is more complicated
390
af.getTag().setField(af.getTag().createField(FieldKey.AMAZON_ID, "asin123456" + "\u01ff"));
392
af = AudioFileIO.read(testFile);
395
af.getTag().setField(af.getTag().createField(FieldKey.MOOD, "mood"));
397
af = AudioFileIO.read(testFile);
399
assertEquals("asin123456" + "\u01ff", af.getTag().getFirst(FieldKey.AMAZON_ID));
400
assertEquals("asin123456" + "\u01ff", ((ID3v24Tag) af.getTag()).getFirst(ID3v24FieldKey.AMAZON_ID));
401
assertEquals(1, af.getTag().getFields(FieldKey.AMAZON_ID).size());
402
assertEquals(8, af.getTag().getFieldCount());
404
//Now addField another different field that also uses a TXXX frame
405
af.getTag().setField(af.getTag().createField(FieldKey.MUSICIP_ID, "musicip_id"));
407
af = AudioFileIO.read(testFile);
408
assertEquals(2, ((List) ((ID3v24Tag) af.getTag()).getFrame("TXXX")).size());
409
assertEquals("musicip_id", af.getTag().getFirst(FieldKey.MUSICIP_ID));
410
assertEquals("musicip_id", ((ID3v24Tag) af.getTag()).getFirst(ID3v24FieldKey.MUSICIP_ID));
411
assertEquals(1, af.getTag().getFields(FieldKey.MUSICIP_ID).size());
412
assertEquals("asin123456" + "\u01ff", af.getTag().getFirst(FieldKey.AMAZON_ID));
413
assertEquals(9, af.getTag().getFieldCount());
415
//Now addField yet another different field that also uses a TXXX frame
416
af.getTag().setField(af.getTag().createField(FieldKey.MUSICBRAINZ_RELEASEID, "releaseid"));
418
af = AudioFileIO.read(testFile);
419
assertEquals(3, ((List) ((ID3v24Tag) af.getTag()).getFrame("TXXX")).size());
420
assertEquals("musicip_id", af.getTag().getFirst(FieldKey.MUSICIP_ID));
421
assertEquals("releaseid", af.getTag().getFirst(FieldKey.MUSICBRAINZ_RELEASEID));
422
assertEquals("asin123456" + "\u01ff", af.getTag().getFirst(FieldKey.AMAZON_ID));
423
assertEquals(1, af.getTag().getFields(FieldKey.MUSICIP_ID).size());
424
assertEquals(1, af.getTag().getFields(FieldKey.AMAZON_ID).size());
425
assertEquals(1, af.getTag().getFields(FieldKey.MUSICBRAINZ_RELEASEID).size());
426
assertEquals(10, af.getTag().getFieldCount());
428
//Now deleteField field
429
af.getTag().deleteField(FieldKey.MUSICBRAINZ_RELEASEID);
431
af = AudioFileIO.read(testFile);
432
assertEquals(2, ((List) ((ID3v24Tag) af.getTag()).getFrame("TXXX")).size());
433
assertEquals(1, af.getTag().getFields(FieldKey.MUSICIP_ID).size());
434
assertEquals(1, af.getTag().getFields(FieldKey.AMAZON_ID).size());
435
assertEquals(9, af.getTag().getFieldCount());
437
//Cover Art:invalid way to do it
440
af.getTag().setField(af.getTag().createField(FieldKey.COVER_ART, "coverart"));
442
catch (java.lang.UnsupportedOperationException uoe)
446
assertTrue(e instanceof UnsupportedOperationException);
448
//Add new image correctly
449
RandomAccessFile imageFile = new RandomAccessFile(new File("testdata", "coverart.png"), "r");
450
byte[] imagedata = new byte[(int) imageFile.length()];
451
imageFile.read(imagedata);
452
af.getTag().addField(tag.createArtworkField(imagedata, "image/png"));
454
af = AudioFileIO.read(testFile);
455
assertEquals(1, ((ID3v24Tag) af.getTag()).getFields(FieldKey.COVER_ART).size());
456
assertEquals(1, ((ID3v24Tag) af.getTag()).get(ID3v24FieldKey.COVER_ART.getFieldName()).size());
457
//TODO This isnt very user friendly
458
TagField tagField = af.getTag().getFirstField(ID3v24FieldKey.COVER_ART.getFieldName());
460
assertTrue(tagField instanceof ID3v24Frame);
461
ID3v24Frame apicFrame = (ID3v24Frame) tagField;
462
assertTrue(apicFrame.getBody() instanceof FrameBodyAPIC);
463
FrameBodyAPIC apicframebody = (FrameBodyAPIC) apicFrame.getBody();
464
assertFalse(apicframebody.isImageUrl());
465
assertEquals(10, af.getTag().getFieldCount());
467
//Add another image correctly
468
imageFile = new RandomAccessFile(new File("testdata", "coverart_small.png"), "r");
469
imagedata = new byte[(int) imageFile.length()];
470
imageFile.read(imagedata);
471
af.getTag().addField(tag.createArtworkField(imagedata, "image/png"));
473
af = AudioFileIO.read(testFile);
474
assertEquals(2, af.getTag().getFields(FieldKey.COVER_ART).size());
475
assertEquals(11, af.getTag().getFieldCount());
477
//Actually createField the image from the read data
478
BufferedImage bi = null;
479
TagField imageField = af.getTag().getFields(FieldKey.COVER_ART).get(0);
480
if (imageField instanceof AbstractID3v2Frame)
482
FrameBodyAPIC imageFrameBody = (FrameBodyAPIC) ((AbstractID3v2Frame) imageField).getBody();
483
if (!imageFrameBody.isImageUrl())
485
byte[] imageRawData = (byte[]) imageFrameBody.getObjectValue(DataTypes.OBJ_PICTURE_DATA);
486
bi = ImageIO.read(new ByteArrayInputStream(imageRawData));
492
af.getTag().addField(tag.createLinkedArtworkField("../testdata/coverart.jpg"));
495
af = AudioFileIO.read(testFile);
496
assertEquals(3, af.getTag().getFields(FieldKey.COVER_ART).size());
497
assertEquals(12, af.getTag().getFieldCount());
498
List<TagField> imageFields = af.getTag().getFields(FieldKey.COVER_ART);
499
tagField = imageFields.get(2);
500
apicFrame = (ID3v24Frame) tagField;
501
assertTrue(apicFrame.getBody() instanceof FrameBodyAPIC);
502
apicframebody = (FrameBodyAPIC) apicFrame.getBody();
503
assertTrue(apicframebody.isImageUrl());
504
assertEquals("../testdata/coverart.jpg", apicframebody.getImageUrl());
509
/* public void testReadUrlImage() throws Exception
514
File testFile = AbstractTestCase.copyAudioToTmp("testV1withurlimage.mp3");
515
org.jaudiotagger.audio.AudioFile audioFile = org.jaudiotagger.audio.AudioFileIO.read(testFile);
516
ID3v23Tag newTag = (ID3v23Tag)audioFile.getTag();
517
assertEquals(1, newTag.getFields(FieldKey.COVER_ART).size());
518
TagField tagField = newTag.getFirstField(ID3v23FieldKey.COVER_ART.getFieldName());
519
assertTrue(tagField instanceof ID3v23Frame);
520
ID3v23Frame apicFrame = (ID3v23Frame)tagField;
521
assertTrue(apicFrame.getBody() instanceof FrameBodyAPIC);
522
FrameBodyAPIC apicframebody = (FrameBodyAPIC)apicFrame.getBody();
523
assertFalse(apicframebody.isImageUrl());
528
ex.printStackTrace();
533
public void testNewInterfaceBasicReadandWriteID3v23() throws Exception
536
File testFile = AbstractTestCase.copyAudioToTmp("testV1.mp3", new File("testnewIntId3v23.mp3"));
537
MP3File mp3File = new MP3File(testFile);
539
//Has no tag at this point
540
assertFalse(mp3File.hasID3v1Tag());
541
assertFalse(mp3File.hasID3v2Tag());
543
//Create v1 tag (old method)
544
ID3v11Tag v1tag = new ID3v11Tag();
545
v1tag.setField(FieldKey.ARTIST,V1_ARTIST);
546
v1tag.setField(FieldKey.ALBUM,"V1ALBUM");
547
mp3File.setID3v1Tag(v1tag);
550
//Has only v1 tag at this point
551
assertTrue(mp3File.hasID3v1Tag());
552
assertFalse(mp3File.hasID3v2Tag());
554
//Read back artist (new method ,v1)
555
AudioFile af = AudioFileIO.read(testFile);
556
assertEquals(V1_ARTIST, af.getTag().getFirst(FieldKey.ARTIST));
557
assertEquals(V1_ARTIST, af.getTag().getFirst(FieldKey.ARTIST));
558
assertEquals(V1_ARTIST, af.getTag().getFirst(FieldKey.ARTIST));
560
//Add artist frame (old method)
561
ID3v23Tag tag = new ID3v23Tag();
562
ID3v23Frame frame = new ID3v23Frame(ID3v23Frames.FRAME_ID_V3_ARTIST);
563
((FrameBodyTPE1) frame.getBody()).setText(FrameBodyTPE1Test.TPE1_TEST_STRING);
565
mp3File.setID3v2TagOnly(tag);
568
//Has v1 and v2 tag at this point
569
assertTrue(mp3File.hasID3v1Tag());
570
assertTrue(mp3File.hasID3v2Tag());
572
//Read back artist (new method ,v1 value overrriden by v2 method)
573
af = AudioFileIO.read(testFile);
574
assertEquals(FrameBodyTPE1Test.TPE1_TEST_STRING, af.getTag().getFirst(FieldKey.ARTIST));
575
assertEquals(FrameBodyTPE1Test.TPE1_TEST_STRING, af.getTag().getFirst(FieldKey.ARTIST));
576
assertEquals(FrameBodyTPE1Test.TPE1_TEST_STRING, ((ID3v23Tag) af.getTag()).getFirst(ID3v23FieldKey.ARTIST));
577
//.... but v1 value is still there
578
assertEquals(V1_ARTIST, ((MP3File) af).getID3v1Tag().getFirst(FieldKey.ARTIST));
579
//Write album ( new method)
580
af.getTag().setField(FieldKey.ALBUM,ALBUM_TEST_STRING);
583
//Read back album (new method)
584
af = AudioFileIO.read(testFile);
585
assertEquals(ALBUM_TEST_STRING, af.getTag().getFirst(FieldKey.ALBUM));
586
assertEquals(ALBUM_TEST_STRING, af.getTag().getFirst(FieldKey.ALBUM));
587
assertEquals(ALBUM_TEST_STRING, ((ID3v23Tag) af.getTag()).getFirst(ID3v23FieldKey.ALBUM));
588
assertEquals(1, af.getTag().getFields(FieldKey.ALBUM).size());
590
//Read back album (old method)
591
AbstractID3v2Frame checkframe = (AbstractID3v2Frame) ((MP3File) af).getID3v2Tag().getFrame(ID3v23Frames.FRAME_ID_V3_ALBUM);
592
assertEquals(ALBUM_TEST_STRING, ((FrameBodyTALB) checkframe.getBody()).getText());
594
//Should only be allowed to addField one album, there is no multi value support for it
595
af.getTag().addField(FieldKey.ALBUM,ALBUM_TEST_STRING2);
597
af = AudioFileIO.read(testFile);
598
assertEquals(ALBUM_TEST_STRING, af.getTag().getFirst(FieldKey.ALBUM));
599
assertEquals(ALBUM_TEST_STRING, af.getTag().getFirst(FieldKey.ALBUM));
600
assertEquals(ALBUM_TEST_STRING, ((ID3v23Tag) af.getTag()).getFirst(ID3v23FieldKey.ALBUM));
601
assertEquals(1, af.getTag().getFields(FieldKey.ALBUM).size());
603
//But can replace existing value
604
af.getTag().setField(FieldKey.ALBUM,ALBUM_TEST_STRING2);
606
af = AudioFileIO.read(testFile);
607
assertEquals(ALBUM_TEST_STRING2, af.getTag().getFirst(FieldKey.ALBUM));
608
assertEquals(ALBUM_TEST_STRING2, af.getTag().getFirst(FieldKey.ALBUM));
609
assertEquals(ALBUM_TEST_STRING2, ((ID3v23Tag) af.getTag()).getFirst(ID3v23FieldKey.ALBUM));
610
assertEquals(1, af.getTag().getFields(FieldKey.ALBUM).size());
613
af.getTag().deleteField(FieldKey.ALBUM);
615
af = AudioFileIO.read(testFile);
616
assertEquals("", af.getTag().getFirst(FieldKey.ALBUM));
617
assertEquals("", af.getTag().getFirst(FieldKey.ALBUM));
618
assertEquals("", ((ID3v23Tag) af.getTag()).getFirst(ID3v23FieldKey.ALBUM));
619
assertEquals(0, af.getTag().getFields(FieldKey.ALBUM).size());
621
//Test out the other basic fields
623
af.getTag().setField(FieldKey.YEAR,"1991");
625
af = AudioFileIO.read(testFile);
626
assertEquals("1991", af.getTag().getFirst(FieldKey.YEAR));
627
assertEquals("1991", af.getTag().getFirst(FieldKey.YEAR));
628
assertEquals("1991", ((ID3v23Tag) af.getTag()).getFirst(ID3v23FieldKey.YEAR));
629
assertEquals(1, af.getTag().getFields(FieldKey.YEAR).size());
630
assertEquals(2, af.getTag().getFieldCount());
633
af.getTag().setField(FieldKey.TITLE,"Title");
635
af = AudioFileIO.read(testFile);
636
assertEquals("Title", af.getTag().getFirst(FieldKey.TITLE));
637
assertEquals("Title", af.getTag().getFirst(FieldKey.TITLE));
638
assertEquals("Title", ((ID3v23Tag) af.getTag()).getFirst(ID3v23FieldKey.TITLE));
639
assertEquals(1, af.getTag().getFields(FieldKey.TITLE).size());
640
assertEquals(3, af.getTag().getFieldCount());
642
//Comment, trickier because uses different framebody subclass to the ones above
643
af.getTag().setField(FieldKey.COMMENT,"Comment");
645
af = AudioFileIO.read(testFile);
646
assertEquals("Comment", af.getTag().getFirst(FieldKey.COMMENT));
647
assertEquals("Comment", ((ID3v23Tag) af.getTag()).getFirst(ID3v23FieldKey.COMMENT));
648
assertEquals(1, af.getTag().getFields(FieldKey.COMMENT).size());
649
assertEquals(4, af.getTag().getFieldCount());
652
//TODO only one genre frame allowed, but that can contain multiple GENRE values, currently
653
//must parse as one genre e.g 34 67
654
af.getTag().setField(FieldKey.GENRE,"CustomGenre");
656
af = AudioFileIO.read(testFile);
657
assertEquals("CustomGenre", af.getTag().getFirst(FieldKey.GENRE));
658
assertEquals("CustomGenre", ((ID3v23Tag) af.getTag()).getFirst(ID3v23FieldKey.GENRE));
659
assertEquals(1, af.getTag().getFields(FieldKey.GENRE).size());
660
assertEquals(5, af.getTag().getFieldCount());
664
af.getTag().setField(FieldKey.TRACK,"7");
665
af.getTag().setField(af.getTag().createField(FieldKey.TRACK_TOTAL, "11"));
666
assertEquals("7",af.getTag().getFirst(FieldKey.TRACK));
667
assertEquals("11",af.getTag().getFirst(FieldKey.TRACK_TOTAL));
670
af = AudioFileIO.read(testFile);
671
assertEquals("7", af.getTag().getFirst(FieldKey.TRACK));
672
assertEquals("7", af.getTag().getFirst(FieldKey.TRACK));
673
assertEquals("7", ((ID3v23Tag) af.getTag()).getFirst(ID3v23FieldKey.TRACK));
674
assertEquals(1, af.getTag().getFields(FieldKey.TRACK).size());
675
assertEquals(6, af.getTag().getFieldCount());
677
assertEquals("7",af.getTag().getFirst(FieldKey.TRACK));
679
//AmazonId also testing utf encoding here
680
//This is one of many fields that uses the TXXX frame, the logic is more complicated
681
af.getTag().setField(af.getTag().createField(FieldKey.AMAZON_ID, "asin123456" + "\u01ff"));
683
af = AudioFileIO.read(testFile);
684
assertEquals("asin123456" + "\u01ff", af.getTag().getFirst(FieldKey.AMAZON_ID));
685
assertEquals("asin123456" + "\u01ff", ((ID3v23Tag) af.getTag()).getFirst(ID3v23FieldKey.AMAZON_ID));
686
assertEquals(1, af.getTag().getFields(FieldKey.AMAZON_ID).size());
687
assertEquals(7, af.getTag().getFieldCount());
690
af.getTag().setField(af.getTag().createField(FieldKey.MOOD, "mood"));
692
af = AudioFileIO.read(testFile);
693
assertEquals("mood", af.getTag().getFirst(FieldKey.MOOD));
694
//Now deleteField field
695
af.getTag().deleteField(FieldKey.MOOD);
697
af = AudioFileIO.read(testFile);
699
assertEquals("7",af.getTag().getFirst(FieldKey.TRACK));
702
af.getTag().setField(af.getTag().createField(FieldKey.TRACK_TOTAL, "11"));
703
assertEquals("11",af.getTag().getFirst(FieldKey.TRACK_TOTAL));
705
//Now addField another different field that also uses a TXXX frame
706
af.getTag().setField(af.getTag().createField(FieldKey.MUSICIP_ID, "musicip_id"));
708
af = AudioFileIO.read(testFile);
709
assertEquals(2, ((List) ((ID3v23Tag) af.getTag()).getFrame("TXXX")).size());
710
assertEquals("musicip_id", af.getTag().getFirst(FieldKey.MUSICIP_ID));
711
assertEquals("musicip_id", ((ID3v23Tag) af.getTag()).getFirst(ID3v23FieldKey.MUSICIP_ID));
712
assertEquals(1, af.getTag().getFields(FieldKey.MUSICIP_ID).size());
713
assertEquals("asin123456" + "\u01ff", af.getTag().getFirst(FieldKey.AMAZON_ID));
714
assertEquals("7",af.getTag().getFirst(FieldKey.TRACK));
715
assertEquals(8, af.getTag().getFieldCount());
716
assertEquals("11",af.getTag().getFirst(FieldKey.TRACK_TOTAL));
717
assertEquals("7",((ID3v23Tag)af.getTag()).getFirst(ID3v23FieldKey.TRACK));
718
assertEquals("11",((ID3v23Tag)af.getTag()).getFirst(ID3v23FieldKey.TRACK_TOTAL));
720
//Now addField yet another different field that also uses a TXXX frame
721
af.getTag().setField(af.getTag().createField(FieldKey.MUSICBRAINZ_RELEASEID, "releaseid"));
723
af = AudioFileIO.read(testFile);
724
assertEquals(3, ((List) ((ID3v23Tag) af.getTag()).getFrame("TXXX")).size());
725
assertEquals("musicip_id", af.getTag().getFirst(FieldKey.MUSICIP_ID));
726
assertEquals("releaseid", af.getTag().getFirst(FieldKey.MUSICBRAINZ_RELEASEID));
727
assertEquals("asin123456" + "\u01ff", af.getTag().getFirst(FieldKey.AMAZON_ID));
728
assertEquals(1, af.getTag().getFields(FieldKey.MUSICIP_ID).size());
729
assertEquals(1, af.getTag().getFields(FieldKey.AMAZON_ID).size());
730
assertEquals(1, af.getTag().getFields(FieldKey.MUSICBRAINZ_RELEASEID).size());
731
assertEquals(9, af.getTag().getFieldCount());
733
//Now deleteField field
734
af.getTag().deleteField(FieldKey.MUSICBRAINZ_RELEASEID);
736
af = AudioFileIO.read(testFile);
737
assertEquals(2, ((List) ((ID3v23Tag) af.getTag()).getFrame("TXXX")).size());
738
assertEquals(1, af.getTag().getFields(FieldKey.MUSICIP_ID).size());
739
assertEquals(1, af.getTag().getFields(FieldKey.AMAZON_ID).size());
740
assertEquals(8, af.getTag().getFieldCount());
742
//Cover Art:invalid way to do it
745
af.getTag().setField(af.getTag().createField(FieldKey.COVER_ART, "coverart"));
747
catch (java.lang.UnsupportedOperationException uoe)
751
assertTrue(e instanceof UnsupportedOperationException);
753
//Add new image correctly
754
RandomAccessFile imageFile = new RandomAccessFile(new File("testdata", "coverart.png"), "r");
755
byte[] imagedata = new byte[(int) imageFile.length()];
756
imageFile.read(imagedata);
757
af.getTag().addField(tag.createArtworkField(imagedata, "image/png"));
759
af = AudioFileIO.read(testFile);
760
assertEquals(1, af.getTag().getFields(FieldKey.COVER_ART).size());
761
assertEquals(9, af.getTag().getFieldCount());
763
//Add another image correctly
764
imageFile = new RandomAccessFile(new File("testdata", "coverart_small.png"), "r");
765
imagedata = new byte[(int) imageFile.length()];
766
imageFile.read(imagedata);
767
af.getTag().addField(tag.createArtworkField(imagedata, "image/png"));
769
af = AudioFileIO.read(testFile);
770
assertEquals(2, af.getTag().getFields(FieldKey.COVER_ART).size());
771
assertEquals(10, af.getTag().getFieldCount());
776
public void testNewInterfaceBasicReadandWriteID3v22() throws Exception
779
File testFile = AbstractTestCase.copyAudioToTmp("testV1.mp3", new File("testnewIntId3v22.mp3"));
780
MP3File mp3File = new MP3File(testFile);
782
//Has no tag at this point
783
assertFalse(mp3File.hasID3v1Tag());
784
assertFalse(mp3File.hasID3v2Tag());
786
//Create v1 tag (old method)
787
ID3v11Tag v1tag = new ID3v11Tag();
788
v1tag.setField(FieldKey.ARTIST,V1_ARTIST);
789
v1tag.setField(FieldKey.ALBUM,"V1ALBUM");
790
mp3File.setID3v1Tag(v1tag);
793
//Has only v1 tag at this point
794
assertTrue(mp3File.hasID3v1Tag());
795
assertFalse(mp3File.hasID3v2Tag());
797
//Read back artist (new method ,v1)
798
AudioFile af = AudioFileIO.read(testFile);
799
assertEquals(V1_ARTIST, af.getTag().getFirst(FieldKey.ARTIST));
800
assertEquals(V1_ARTIST, af.getTag().getFirst(FieldKey.ARTIST));
801
assertEquals(V1_ARTIST, af.getTag().getFirst(FieldKey.ARTIST));
803
//Add artist frame (old method)
804
ID3v22Tag tag = new ID3v22Tag();
805
ID3v22Frame frame = new ID3v22Frame(ID3v22Frames.FRAME_ID_V2_ARTIST);
806
((FrameBodyTPE1) frame.getBody()).setText(FrameBodyTPE1Test.TPE1_TEST_STRING);
808
mp3File.setID3v2TagOnly(tag);
811
//Has v1 and v2 tag at this point
812
assertTrue(mp3File.hasID3v1Tag());
813
assertTrue(mp3File.hasID3v2Tag());
815
//Read back artist (new method ,v1 value overrriden by v2 method)
816
af = AudioFileIO.read(testFile);
817
assertEquals(FrameBodyTPE1Test.TPE1_TEST_STRING, af.getTag().getFirst(FieldKey.ARTIST));
818
assertEquals(FrameBodyTPE1Test.TPE1_TEST_STRING, af.getTag().getFirst(FieldKey.ARTIST));
819
assertEquals(FrameBodyTPE1Test.TPE1_TEST_STRING, ((ID3v22Tag) af.getTag()).getFirst(ID3v22FieldKey.ARTIST));
820
//.... but v1 value is still there
821
assertEquals(V1_ARTIST, ((MP3File) af).getID3v1Tag().getFirst(FieldKey.ARTIST));
822
//Write album ( new method)
823
af.getTag().setField(FieldKey.ALBUM,ALBUM_TEST_STRING);
824
assertEquals(ALBUM_TEST_STRING, af.getTag().getFirst(FieldKey.ALBUM));
825
assertEquals(1, af.getTag().getFields(FieldKey.ALBUM).size());
829
//Read back album (new method)
830
af = AudioFileIO.read(testFile);
831
assertEquals(ALBUM_TEST_STRING, af.getTag().getFirst(FieldKey.ALBUM));
832
assertEquals(ALBUM_TEST_STRING, af.getTag().getFirst(FieldKey.ALBUM));
833
assertEquals(ALBUM_TEST_STRING, ((ID3v22Tag) af.getTag()).getFirst(ID3v22FieldKey.ALBUM));
834
assertEquals(1, af.getTag().getFields(FieldKey.ALBUM).size());
836
//Read back album (old method)
837
AbstractID3v2Frame checkframe = (AbstractID3v2Frame) ((MP3File) af).getID3v2Tag().getFrame(ID3v22Frames.FRAME_ID_V2_ALBUM);
838
assertEquals(ALBUM_TEST_STRING, ((FrameBodyTALB) checkframe.getBody()).getText());
840
//Should only be allowed to addField one album, there is no multi value support for it
841
af.getTag().addField(FieldKey.ALBUM,ALBUM_TEST_STRING2);
843
af = AudioFileIO.read(testFile);
844
assertEquals(ALBUM_TEST_STRING, af.getTag().getFirst(FieldKey.ALBUM));
845
assertEquals(ALBUM_TEST_STRING, af.getTag().getFirst(FieldKey.ALBUM));
846
assertEquals(ALBUM_TEST_STRING, ((ID3v22Tag) af.getTag()).getFirst(ID3v22FieldKey.ALBUM));
847
assertEquals(1, af.getTag().getFields(FieldKey.ALBUM).size());
849
//But can replace existing value
850
af.getTag().setField(FieldKey.ALBUM,ALBUM_TEST_STRING2);
852
af = AudioFileIO.read(testFile);
853
assertEquals(ALBUM_TEST_STRING2, af.getTag().getFirst(FieldKey.ALBUM));
854
assertEquals(ALBUM_TEST_STRING2, af.getTag().getFirst(FieldKey.ALBUM));
855
assertEquals(ALBUM_TEST_STRING2, ((ID3v22Tag) af.getTag()).getFirst(ID3v22FieldKey.ALBUM));
856
assertEquals(1,af.getTag().getFields(FieldKey.ALBUM).size());
859
af.getTag().deleteField(FieldKey.ALBUM);
861
af = AudioFileIO.read(testFile);
862
assertEquals("", af.getTag().getFirst(FieldKey.ALBUM));
863
assertEquals("", af.getTag().getFirst(FieldKey.ALBUM));
864
assertEquals("", ((ID3v22Tag) af.getTag()).getFirst(ID3v22FieldKey.ALBUM));
865
assertEquals(0, af.getTag().getFields(FieldKey.ALBUM).size());
867
//Test out the other basic fields
869
af.getTag().setField(FieldKey.YEAR,"1991");
871
af = AudioFileIO.read(testFile);
872
assertEquals("1991", af.getTag().getFirst(FieldKey.YEAR));
873
assertEquals("1991", af.getTag().getFirst(FieldKey.YEAR));
874
assertEquals("1991", ((ID3v22Tag) af.getTag()).getFirst(ID3v22FieldKey.YEAR));
875
assertEquals(1, af.getTag().getFields(FieldKey.YEAR).size());
876
assertEquals(2, af.getTag().getFieldCount());
879
af.getTag().setField(FieldKey.TITLE,"Title");
881
af = AudioFileIO.read(testFile);
882
assertEquals("Title", af.getTag().getFirst(FieldKey.TITLE));
883
assertEquals("Title", af.getTag().getFirst(FieldKey.TITLE));
884
assertEquals("Title", ((ID3v22Tag) af.getTag()).getFirst(ID3v22FieldKey.TITLE));
885
assertEquals(1, af.getTag().getFields(FieldKey.TITLE).size());
886
assertEquals(3, af.getTag().getFieldCount());
888
//Comment, trickier because uses different framebody subclass to the ones above
889
af.getTag().setField(FieldKey.COMMENT,"Comment");
891
af = AudioFileIO.read(testFile);
892
assertEquals("Comment", af.getTag().getFirst(FieldKey.COMMENT));
893
assertEquals("Comment", af.getTag().getFirst(FieldKey.COMMENT));
894
assertEquals("Comment", ((ID3v22Tag) af.getTag()).getFirst(ID3v22FieldKey.COMMENT));
895
assertEquals(1, af.getTag().getFields(FieldKey.COMMENT).size());
896
assertEquals(4, af.getTag().getFieldCount());
899
//TODO only one genre frame allowed, but that can contain multiple GENRE values, currently
900
//must parse as one genre e.g 34 67
901
af.getTag().setField(FieldKey.GENRE,"CustomGenre");
903
af = AudioFileIO.read(testFile);
904
assertEquals("CustomGenre", af.getTag().getFirst(FieldKey.GENRE));
905
assertEquals("CustomGenre", af.getTag().getFirst(FieldKey.GENRE));
906
assertEquals("CustomGenre", ((ID3v22Tag) af.getTag()).getFirst(ID3v22FieldKey.GENRE));
907
assertEquals(1, af.getTag().getFields(FieldKey.GENRE).size());
908
assertEquals(5, af.getTag().getFieldCount());
911
af.getTag().setField(FieldKey.TRACK,"7");
912
af.getTag().setField(af.getTag().createField(FieldKey.TRACK_TOTAL, "11"));
913
assertEquals("7",af.getTag().getFirst(FieldKey.TRACK));
914
assertEquals("11",af.getTag().getFirst(FieldKey.TRACK_TOTAL));
916
af = AudioFileIO.read(testFile);
917
assertEquals("7", af.getTag().getFirst(FieldKey.TRACK));
918
assertEquals("7", af.getTag().getFirst(FieldKey.TRACK));
919
assertEquals("7", ((ID3v22Tag) af.getTag()).getFirst(ID3v22FieldKey.TRACK));
920
assertEquals("11",af.getTag().getFirst(FieldKey.TRACK_TOTAL));
921
assertEquals(1, af.getTag().getFields(FieldKey.TRACK).size());
922
assertEquals(1, af.getTag().getFields(FieldKey.TRACK).size());
923
assertEquals(6, af.getTag().getFieldCount());
926
//This is one of many fields that uses the TXXX frame, the logic is more complicated
927
af.getTag().setField(af.getTag().createField(FieldKey.AMAZON_ID, "asin123456" + "\u01ff"));
929
af = AudioFileIO.read(testFile);
932
af.getTag().setField(af.getTag().createField(FieldKey.MOOD, "mood"));
934
af = AudioFileIO.read(testFile);
935
assertEquals("mood", af.getTag().getFirst(FieldKey.MOOD));
936
//Now deleteField field
937
af.getTag().deleteField(FieldKey.MOOD);
939
af = AudioFileIO.read(testFile);
941
assertEquals("asin123456" + "\u01ff", af.getTag().getFirst(FieldKey.AMAZON_ID));
942
assertEquals("asin123456" + "\u01ff", ((ID3v22Tag) af.getTag()).getFirst(ID3v22FieldKey.AMAZON_ID));
943
assertEquals(1, af.getTag().getFields(FieldKey.AMAZON_ID).size());
944
assertEquals(7, af.getTag().getFieldCount());
946
//Now addField another different field that also uses a TXX frame
947
af.getTag().setField(af.getTag().createField(FieldKey.MUSICIP_ID, "musicip_id"));
949
af = AudioFileIO.read(testFile);
950
assertEquals(2, ((List) ((ID3v22Tag) af.getTag()).getFrame("TXX")).size());
951
assertEquals("musicip_id", af.getTag().getFirst(FieldKey.MUSICIP_ID));
952
assertEquals("musicip_id", ((ID3v22Tag) af.getTag()).getFirst(ID3v22FieldKey.MUSICIP_ID));
953
assertEquals(1, af.getTag().getFields(FieldKey.MUSICIP_ID).size());
954
assertEquals("asin123456" + "\u01ff", af.getTag().getFirst(FieldKey.AMAZON_ID));
955
assertEquals(8, af.getTag().getFieldCount());
957
//Now addField yet another different field that also uses a TXX frame
958
af.getTag().setField(af.getTag().createField(FieldKey.MUSICBRAINZ_RELEASEID, "releaseid"));
960
af = AudioFileIO.read(testFile);
961
assertEquals(3, ((List) ((ID3v22Tag) af.getTag()).getFrame("TXX")).size());
962
assertEquals("musicip_id", af.getTag().getFirst(FieldKey.MUSICIP_ID));
963
assertEquals("releaseid", af.getTag().getFirst(FieldKey.MUSICBRAINZ_RELEASEID));
964
assertEquals("asin123456" + "\u01ff", af.getTag().getFirst(FieldKey.AMAZON_ID));
965
assertEquals(1, af.getTag().getFields(FieldKey.MUSICIP_ID).size());
966
assertEquals(1, af.getTag().getFields(FieldKey.AMAZON_ID).size());
967
assertEquals(1, af.getTag().getFields(FieldKey.MUSICBRAINZ_RELEASEID).size());
968
assertEquals(9, af.getTag().getFieldCount());
970
//Now deleteField field
971
af.getTag().deleteField(FieldKey.MUSICBRAINZ_RELEASEID);
973
af = AudioFileIO.read(testFile);
974
assertEquals(2, ((List) ((ID3v22Tag) af.getTag()).getFrame("TXX")).size());
975
assertEquals(1, af.getTag().getFields(FieldKey.MUSICIP_ID).size());
976
assertEquals(1, af.getTag().getFields(FieldKey.AMAZON_ID).size());
977
assertEquals(8, af.getTag().getFieldCount());
979
//Cover Art:invalid way to do it
982
af.getTag().setField(af.getTag().createField(FieldKey.COVER_ART, "coverart"));
984
catch (java.lang.UnsupportedOperationException uoe)
988
assertTrue(e instanceof UnsupportedOperationException);
990
//Add new image correctly
991
RandomAccessFile imageFile = new RandomAccessFile(new File("testdata", "coverart.png"), "r");
992
byte[] imagedata = new byte[(int) imageFile.length()];
993
imageFile.read(imagedata);
994
af.getTag().addField(tag.createArtworkField(imagedata, "image/png"));
996
af = AudioFileIO.read(testFile);
997
assertEquals(1, af.getTag().getFields(FieldKey.COVER_ART).size());
998
assertEquals(9, af.getTag().getFieldCount());
1000
//Add another image correctly
1001
imageFile = new RandomAccessFile(new File("testdata", "coverart_small.png"), "r");
1002
imagedata = new byte[(int) imageFile.length()];
1003
imageFile.read(imagedata);
1004
af.getTag().addField(tag.createArtworkField(imagedata, "image/png"));
1006
af = AudioFileIO.read(testFile);
1007
assertEquals(2, af.getTag().getFields(FieldKey.COVER_ART).size());
1008
assertEquals(10, af.getTag().getFieldCount());
1012
* Test how adding multiple frameswith new interface of same type is is handled
1016
public void testSettingMultipleFramesofSameType() throws Exception
1019
File testFile = AbstractTestCase.copyAudioToTmp("testV1.mp3", new File("testSetMultiple.mp3"));
1020
AudioFile af = AudioFileIO.read(testFile);
1021
MP3File mp3File = (MP3File) af;
1022
ID3v24Tag tag = new ID3v24Tag();
1023
ID3v24Frame frame = new ID3v24Frame(ID3v24Frames.FRAME_ID_COMMENT);
1024
((FrameBodyCOMM) frame.getBody()).setText("Comment");
1025
tag.setFrame(frame);
1026
mp3File.setID3v2TagOnly(tag);
1028
af = AudioFileIO.read(testFile);
1029
mp3File = (MP3File) af;
1033
ID3v24Frame commentFrame = (ID3v24Frame) ((ID3v24Tag) af.getTag()).getFrame("COMM");
1034
FrameBodyCOMM fb = (FrameBodyCOMM) commentFrame.getBody();
1035
assertEquals("", fb.getDescription());
1036
assertEquals("Comment", fb.getText());
1037
//Change description, cant do this with common interface
1038
fb.setDescription("test");
1039
//Because has different description the following setField will addField another comment rather than overwriting the first one
1040
af.getTag().setField(FieldKey.COMMENT,"Comment2");
1041
assertEquals(2, af.getTag().getFields(FieldKey.COMMENT).size());
1043
List<TagField> comments = af.getTag().getFields(FieldKey.COMMENT);
1044
((FrameBodyCOMM) ((ID3v24Frame) comments.get(1)).getBody()).setDescription("test2");
1045
af.getTag().setField(FieldKey.COMMENT,"Comment3");
1047
af = AudioFileIO.read(testFile);
1048
assertEquals(3, af.getTag().getFields(FieldKey.COMMENT).size());
1050
//Add fourth Comment (but duplicate key - so overwrites 3rd comment)
1051
af.getTag().setField(FieldKey.COMMENT,"Comment4");
1053
af = AudioFileIO.read(testFile);
1054
assertEquals(3, af.getTag().getFields(FieldKey.COMMENT).size());
1056
//Add comment using generic call
1057
af.getTag().setField(af.getTag().createField(FieldKey.COMMENT, "abcdef-ghijklmn"));
1059
//Remove all Comment tags
1060
af.getTag().deleteField(FieldKey.COMMENT);
1061
assertEquals(0, af.getTag().getFields(FieldKey.COMMENT).size());
1063
//Add first one back in
1064
af.getTag().setField(FieldKey.COMMENT,"Comment");
1066
af = AudioFileIO.read(testFile);
1067
assertEquals(1, af.getTag().getFields(FieldKey.COMMENT).size());
1068
assertEquals(1, af.getTag().getFieldCount());
1073
tag = (ID3v24Tag) af.getTag();
1074
frame = new ID3v24Frame(ID3v24Frames.FRAME_ID_USER_DEFINED_INFO);
1075
((FrameBodyTXXX) frame.getBody()).setText("UserDefined");
1076
tag.setFrame(frame);
1077
ID3v24Frame txxxFrame = (ID3v24Frame) tag.getFrame("TXXX");
1078
FrameBodyTXXX fb = (FrameBodyTXXX) txxxFrame.getBody();
1079
assertEquals("", fb.getDescription());
1080
assertEquals("UserDefined", fb.getText());
1081
//Change description, cant do this with common interface
1082
fb.setDescription("test");
1083
//Because has different description the following setField will addField another txxx rather than overwriting the first one
1084
af.getTag().setField(af.getTag().createField(FieldKey.MUSICBRAINZ_ARTISTID, "abcdef-ghijklmn"));
1085
assertEquals(2, ((List) tag.getFrame("TXXX")).size());
1086
//Now adding TXXX with same id so gets overwritten
1087
af.getTag().setField(af.getTag().createField(FieldKey.MUSICBRAINZ_ARTISTID, "abcfffff"));
1088
assertEquals(2, ((List) tag.getFrame("TXXX")).size());
1090
//Try deleting some of these
1091
tag.removeFrameOfType("TXXX");
1092
assertNull(tag.getFrame("TXXX"));
1098
tag = (ID3v24Tag) af.getTag();
1099
frame = new ID3v24Frame(ID3v24Frames.FRAME_ID_UNIQUE_FILE_ID);
1100
((FrameBodyUFID) frame.getBody()).setOwner("owner");
1101
tag.setFrame(frame);
1102
ID3v24Frame ufidFrame = (ID3v24Frame) tag.getFrame("UFID");
1103
FrameBodyUFID fb = (FrameBodyUFID) ufidFrame.getBody();
1104
assertEquals("owner", fb.getOwner());
1106
//Because has different owner the following setField will addField another ufid rather than overwriting the first one
1107
af.getTag().setField(af.getTag().createField(FieldKey.MUSICBRAINZ_TRACK_ID, "abcdef-ghijklmn"));
1108
assertEquals(2, ((List) tag.getFrame("UFID")).size());
1109
//Now adding UFID with same owner so gets overwritten
1110
af.getTag().setField(af.getTag().createField(FieldKey.MUSICBRAINZ_TRACK_ID, "abcfffff"));
1111
assertEquals(2, ((List) tag.getFrame("UFID")).size());
1113
//Try deleting some of these
1114
tag.removeFrame("UFID");
1115
assertNull(tag.getFrame("UFID"));
1120
tag = (ID3v24Tag) af.getTag();
1121
frame = new ID3v24Frame(ID3v24Frames.FRAME_ID_UNSYNC_LYRICS);
1122
((FrameBodyUSLT) frame.getBody()).setDescription("lyrics1");
1123
tag.setFrame(frame);
1124
ID3v24Frame usltFrame = (ID3v24Frame) tag.getFrame("USLT");
1125
FrameBodyUSLT fb = (FrameBodyUSLT) usltFrame.getBody();
1126
assertEquals("lyrics1", fb.getDescription());
1128
//Because has different desc the following setField will addField another uslt rather than overwriting the first one
1129
af.getTag().setField(af.getTag().createField(FieldKey.LYRICS, "abcdef-ghijklmn"));
1130
assertEquals(2, ((List) tag.getFrame("USLT")).size());
1131
assertEquals(2, af.getTag().getFields(FieldKey.LYRICS).size());
1132
frame = (ID3v24Frame) ((List) tag.getFrame("USLT")).get(1);
1133
assertEquals("", ((FrameBodyUSLT) frame.getBody()).getDescription());
1134
//Now adding USLT with same description so gets overwritten
1135
af.getTag().setField(af.getTag().createField(FieldKey.LYRICS, "abcfffff"));
1136
assertEquals(2, ((List) tag.getFrame("USLT")).size());
1137
assertEquals(2, af.getTag().getFields(FieldKey.LYRICS).size());
1141
//POPM TODO not a supported FieldKey yet
1143
tag = (ID3v24Tag) af.getTag();
1144
frame = new ID3v24Frame(ID3v24Frames.FRAME_ID_POPULARIMETER);
1145
((FrameBodyPOPM) frame.getBody()).setEmailToUser("paultaylor@jthink.net");
1146
tag.setFrame(frame);
1147
ID3v24Frame popmFrame = (ID3v24Frame) tag.getFrame("POPM");
1148
FrameBodyPOPM fb = (FrameBodyPOPM) popmFrame.getBody();
1149
assertEquals("paultaylor@jthink.net", fb.getEmailToUser());
1155
* Test code copes with reading dodgy ID3Tag , header appears ok but gap between header and tag data
1159
public void testNewInterfaceDodgyMp3() throws Exception
1161
File orig = new File("testdata", "test26.mp3");
1168
File testFile = AbstractTestCase.copyAudioToTmp("test26.mp3");
1169
MP3File mp3File = new MP3File(testFile);
1171
//Has no tag at this point
1172
assertTrue(mp3File.hasID3v1Tag());
1173
assertTrue(mp3File.hasID3v2Tag());
1174
assertEquals("Personality Goes A Long Way", mp3File.getID3v1Tag().getFirst(FieldKey.TITLE));
1175
assertEquals(0, mp3File.getID3v2Tag().getFieldCount());
1176
assertFalse(((ID3v23Tag) mp3File.getID3v2Tag()).compression);
1177
assertFalse(((ID3v23Tag) mp3File.getID3v2Tag()).experimental);
1178
assertFalse(((ID3v23Tag) mp3File.getID3v2Tag()).extended);
1179
//assertEquals("Personality Goes A Long Way",mp3File.getID3v2Tag().getFirst(FieldKey.TITLE));
1182
public void testIterator() throws Exception
1184
File orig = new File("testdata", "test26.mp3");
1191
File testFile = AbstractTestCase.copyAudioToTmp("test26.mp3");
1192
MP3File mp3File = new MP3File(testFile);
1195
assertEquals(0, mp3File.getID3v2Tag().getFieldCount());
1196
Iterator<TagField> i = mp3File.getID3v2Tag().getFields();
1197
assertFalse(i.hasNext());
1206
assertTrue(e instanceof NoSuchElementException);
1208
mp3File.getID3v2Tag().addField(FieldKey.ALBUM,"album");
1209
assertEquals(1, mp3File.getID3v2Tag().getFieldCount());
1210
i = mp3File.getID3v2Tag().getFields();
1212
//Should be able to iterate without actually having to call isNext() first
1215
//Should be able to call hasNext() without it having any effect
1216
i = mp3File.getID3v2Tag().getFields();
1217
assertTrue(i.hasNext());
1218
Object o = i.next();
1219
assertTrue( o instanceof ID3v23Frame);
1220
assertEquals("album",((AbstractFrameBodyTextInfo)(((ID3v23Frame)o).getBody())).getFirstTextValue());
1230
assertTrue(e instanceof NoSuchElementException);
1231
assertFalse(i.hasNext());
1233
//Empty frame map and force adding of empty list
1234
mp3File.getID3v2Tag().frameMap.clear();
1235
mp3File.getID3v2Tag().frameMap.put("TXXX",new ArrayList());
1236
assertEquals(0,mp3File.getID3v2Tag().getFieldCount());
1239
//i = mp3File.getID3v2Tag().getFields();
1240
//assertFalse(i.hasNext());
1244
* Currently genres are written to and from v2 tag as is, the decoding from genre number to string has to be done manually
1246
public void testGenres()
1248
Exception ex = null;
1251
File testFile = AbstractTestCase.copyAudioToTmp("testV1.mp3", new File("testBasicWrite.mp3"));
1252
org.jaudiotagger.audio.AudioFile audioFile = org.jaudiotagger.audio.AudioFileIO.read(testFile);
1253
org.jaudiotagger.tag.Tag newTag = audioFile.getTag();
1254
assertTrue(newTag == null);
1255
if (audioFile.getTag() == null)
1257
audioFile.setTag(new ID3v23Tag());
1258
newTag = audioFile.getTag();
1261
//Write literal String
1262
newTag.setField(FieldKey.GENRE,"Rock");
1264
audioFile = org.jaudiotagger.audio.AudioFileIO.read(testFile);
1265
newTag = audioFile.getTag();
1267
assertEquals("Rock", newTag.getFirst(FieldKey.GENRE));
1270
newTag.setField(FieldKey.GENRE,"(17)");
1272
audioFile = org.jaudiotagger.audio.AudioFileIO.read(testFile);
1273
newTag = audioFile.getTag();
1275
assertEquals("(17)", newTag.getFirst(FieldKey.GENRE));
1281
ex.printStackTrace();
1286
public void testRemoveFrameOfType()
1288
File orig = new File("testdata", "test30.mp3");
1294
Exception exceptionCaught = null;
1295
File testFile = AbstractTestCase.copyAudioToTmp("test30.mp3");
1296
MP3File mp3file = null;
1299
mp3file = new MP3File(testFile);
1300
//deleteField multiple frames starting make change to file
1301
((ID3v24Tag) mp3file.getID3v2Tag()).removeFrameOfType("PRIV");
1306
e.printStackTrace();
1307
exceptionCaught = e;
1309
assertNull(exceptionCaught);
1
package org.jaudiotagger.tag.id3;
3
import junit.framework.Test;
4
import junit.framework.TestCase;
5
import junit.framework.TestSuite;
6
import org.jaudiotagger.AbstractTestCase;
7
import org.jaudiotagger.audio.AudioFile;
8
import org.jaudiotagger.audio.AudioFileIO;
9
import org.jaudiotagger.audio.mp3.MP3File;
10
import org.jaudiotagger.tag.FieldKey;
11
import org.jaudiotagger.tag.TagField;
12
import org.jaudiotagger.tag.TagOptionSingleton;
13
import org.jaudiotagger.tag.TagTextField;
14
import org.jaudiotagger.tag.datatype.DataTypes;
15
import org.jaudiotagger.tag.id3.framebody.*;
16
import org.jaudiotagger.tag.id3.valuepair.TextEncoding;
18
import javax.imageio.ImageIO;
19
import java.awt.image.BufferedImage;
20
import java.io.ByteArrayInputStream;
22
import java.io.RandomAccessFile;
23
import java.util.ArrayList;
24
import java.util.Iterator;
25
import java.util.List;
26
import java.util.NoSuchElementException;
29
* Testing retrofitting of entagged interfaces
31
public class NewInterfaceTest extends TestCase
33
private static final String V1_ARTIST = "V1ARTIST";
35
public static final String ALBUM_TEST_STRING = "mellow gold";
36
public static final String ALBUM_TEST_STRING2 = "odelay";
43
protected void setUp()
45
TagOptionSingleton.getInstance().setToDefault();
51
protected void tearDown()
61
public NewInterfaceTest(String arg0)
67
* Command line entrance.
71
public static void main(String[] args)
73
junit.textui.TestRunner.run(suite());
77
* Builds the Test Suite.
79
* @return the Test Suite.
81
public static Test suite()
83
return new TestSuite(NewInterfaceTest.class);
86
public void testBasicWrite()
91
File testFile = AbstractTestCase.copyAudioToTmp("testV1.mp3", new File("testBasicWrite.mp3"));
92
org.jaudiotagger.audio.AudioFile audioFile = org.jaudiotagger.audio.AudioFileIO.read(testFile);
93
org.jaudiotagger.tag.Tag newTag = audioFile.getTag();
94
if (audioFile.getTag() == null)
96
audioFile.setTag(new ID3v23Tag());
97
newTag = audioFile.getTag();
100
newTag.setField(FieldKey.ALBUM,"album");
101
newTag.setField(FieldKey.ARTIST,"artist");
102
newTag.setField(FieldKey.COMMENT,"comment");
103
newTag.setField(FieldKey.GENRE,"Rock");
104
newTag.setField(FieldKey.TITLE,"title");
105
newTag.setField(FieldKey.YEAR,"year");
106
newTag.setField(FieldKey.TRACK,Integer.toString(1));
108
assertEquals("album", newTag.getFirst(FieldKey.ALBUM));
109
assertEquals("artist", newTag.getFirst(FieldKey.ARTIST));
110
assertEquals("comment", newTag.getFirst(FieldKey.COMMENT));
111
assertEquals("Rock", newTag.getFirst(FieldKey.GENRE));
112
assertEquals("title", newTag.getFirst(FieldKey.TITLE));
113
assertEquals("year", newTag.getFirst(FieldKey.YEAR));
114
assertEquals("1", newTag.getFirst(FieldKey.TRACK));
118
audioFile = org.jaudiotagger.audio.AudioFileIO.read(testFile);
119
newTag = audioFile.getTag();
120
assertEquals("album", newTag.getFirst(FieldKey.ALBUM));
121
assertEquals("artist", newTag.getFirst(FieldKey.ARTIST));
122
assertEquals("comment", newTag.getFirst(FieldKey.COMMENT));
123
assertEquals("Rock", newTag.getFirst(FieldKey.GENRE));
124
assertEquals("title", newTag.getFirst(FieldKey.TITLE));
125
assertEquals("year", newTag.getFirst(FieldKey.YEAR));
126
assertEquals("1", newTag.getFirst(FieldKey.TRACK));
127
AbstractTagFrameBody body = (((ID3v23Frame) newTag.getFirstField(ID3v23FieldKey.ALBUM.getFrameId())).getBody());
128
assertEquals(TextEncoding.ISO_8859_1, body.getTextEncoding());
130
TagOptionSingleton.getInstance().setId3v23DefaultTextEncoding(TextEncoding.UTF_16);
131
TagOptionSingleton.getInstance().setResetTextEncodingForExistingFrames(true);
133
audioFile = org.jaudiotagger.audio.AudioFileIO.read(testFile);
134
newTag = audioFile.getTag();
135
assertEquals("album", newTag.getFirst(FieldKey.ALBUM));
136
assertEquals("artist", newTag.getFirst(FieldKey.ARTIST));
137
assertEquals("comment", newTag.getFirst(FieldKey.COMMENT));
138
assertEquals("Rock", newTag.getFirst(FieldKey.GENRE));
139
assertEquals("title", newTag.getFirst(FieldKey.TITLE));
140
assertEquals("year", newTag.getFirst(FieldKey.YEAR));
141
assertEquals("1", newTag.getFirst(FieldKey.TRACK));
142
body = (((ID3v23Frame) newTag.getFirstField(ID3v23FieldKey.ALBUM.getFrameId())).getBody());
143
assertEquals(TextEncoding.UTF_16, body.getTextEncoding());
145
TagOptionSingleton.getInstance().setId3v23DefaultTextEncoding(TextEncoding.ISO_8859_1);
146
TagOptionSingleton.getInstance().setResetTextEncodingForExistingFrames(true);
148
audioFile = org.jaudiotagger.audio.AudioFileIO.read(testFile);
149
newTag = audioFile.getTag();
150
body = (((ID3v23Frame) newTag.getFirstField(ID3v23FieldKey.ALBUM.getFrameId())).getBody());
151
assertEquals(TextEncoding.ISO_8859_1, body.getTextEncoding());
152
TagOptionSingleton.getInstance().setResetTextEncodingForExistingFrames(false);
157
ex.printStackTrace();
162
public void testNewInterfaceBasicReadandWriteID3v1() throws Exception
165
File testFile = AbstractTestCase.copyAudioToTmp("testV1.mp3", new File("testnewIntId3v1.mp3"));
166
MP3File mp3File = new MP3File(testFile);
168
//Has no tag at this point
169
assertFalse(mp3File.hasID3v1Tag());
170
assertFalse(mp3File.hasID3v2Tag());
172
//Create v1 tag (old method)
173
ID3v11Tag v1tag = new ID3v11Tag();
174
v1tag.setField(FieldKey.ARTIST,V1_ARTIST);
175
v1tag.setField(FieldKey.ALBUM,"V1ALBUM" + "\u01ff"); //Note always convert to single byte so will be written as FF
176
v1tag.setField(v1tag.createField(FieldKey.TITLE, "title"));
177
v1tag.setField(FieldKey.GENRE,"Rock");
178
v1tag.setField(v1tag.createField(FieldKey.TRACK, "12"));
179
mp3File.setID3v1Tag(v1tag);
183
assertTrue(mp3File.hasID3v1Tag());
184
assertFalse(mp3File.hasID3v2Tag());
187
AudioFile af = AudioFileIO.read(testFile);
188
assertEquals(V1_ARTIST, af.getTag().getFirst(FieldKey.ARTIST));
189
assertEquals(V1_ARTIST, af.getTag().getFirst(FieldKey.ARTIST));
190
assertEquals(V1_ARTIST, af.getTag().getFirst(FieldKey.ARTIST));
191
assertEquals("V1ALBUM" + "\u00ff", af.getTag().getFirst(FieldKey.ALBUM)); //Lost the 00, is that what we want
192
assertEquals("title", af.getTag().getFirst(FieldKey.TITLE));
193
assertEquals("title", af.getTag().getFirst(FieldKey.TITLE));
194
assertEquals("Rock", af.getTag().getFirst(FieldKey.GENRE));
195
assertEquals("12", af.getTag().getFirst(FieldKey.TRACK));
196
assertEquals("12", af.getTag().getFirst(FieldKey.TRACK));
198
//Delete some fields (just sets string to empty String)
199
af.getTag().deleteField(FieldKey.TITLE);
200
assertEquals("", af.getTag().getFirst(FieldKey.TITLE));
203
af.getTag().setField(FieldKey.TITLE,"newtitle");
204
assertEquals("newtitle", af.getTag().getFirst(FieldKey.TITLE));
206
//Adding just replaces current value
207
af.getTag().addField(FieldKey.TITLE,"newtitle2");
208
assertEquals("newtitle2", af.getTag().getFirst(FieldKey.TITLE));
211
public void testNewInterfaceBasicReadandWriteID3v24() throws Exception
214
File testFile = AbstractTestCase.copyAudioToTmp("testV1.mp3", new File("testnewIntId3v24.mp3"));
215
MP3File mp3File = new MP3File(testFile);
217
//Has no tag at this point
218
assertFalse(mp3File.hasID3v1Tag());
219
assertFalse(mp3File.hasID3v2Tag());
221
//Create v1 tag (old method)
222
ID3v11Tag v1tag = new ID3v11Tag();
223
v1tag.setField(FieldKey.ARTIST,V1_ARTIST);
224
v1tag.setField(FieldKey.ALBUM,"V1ALBUM");
225
mp3File.setID3v1Tag(v1tag);
228
//Has only v1 tag at this point
229
assertTrue(mp3File.hasID3v1Tag());
230
assertFalse(mp3File.hasID3v2Tag());
232
//Read back artist (new method ,v1)
233
AudioFile af = AudioFileIO.read(testFile);
234
assertEquals(V1_ARTIST, af.getTag().getFirst(FieldKey.ARTIST));
235
assertEquals(V1_ARTIST, af.getTag().getFirst(FieldKey.ARTIST));
236
assertEquals(V1_ARTIST, af.getTag().getFirst(FieldKey.ARTIST));
238
//Add artist frame (old method)
239
ID3v24Tag tag = new ID3v24Tag();
240
ID3v24Frame frame = new ID3v24Frame(ID3v24Frames.FRAME_ID_ARTIST);
241
((FrameBodyTPE1) frame.getBody()).setText(FrameBodyTPE1Test.TPE1_TEST_STRING);
243
mp3File.setID3v2TagOnly(tag);
246
//Has v1 and v2 tag at this point
247
assertTrue(mp3File.hasID3v1Tag());
248
assertTrue(mp3File.hasID3v2Tag());
250
//Read back artist (new method ,v1 value overridden by v2 method)
251
af = AudioFileIO.read(testFile);
252
assertEquals(FrameBodyTPE1Test.TPE1_TEST_STRING, af.getTag().getFirst(FieldKey.ARTIST));
253
assertEquals(FrameBodyTPE1Test.TPE1_TEST_STRING, af.getTag().getFirst(FieldKey.ARTIST));
254
assertEquals(FrameBodyTPE1Test.TPE1_TEST_STRING, ((ID3v24Tag) af.getTag()).getFirst(ID3v24FieldKey.ARTIST));
255
assertEquals(FrameBodyTPE1Test.TPE1_TEST_STRING,((TagTextField)af.getTag().getFirstField(FieldKey.ARTIST)).getContent());
256
//.... but v1 value is still there
257
assertEquals(V1_ARTIST, ((MP3File) af).getID3v1Tag().getFirst(FieldKey.ARTIST));
258
//Write album ( new method)
259
af.getTag().setField(FieldKey.ALBUM,ALBUM_TEST_STRING);
262
//Read back album (new method)
263
af = AudioFileIO.read(testFile);
264
assertEquals(ALBUM_TEST_STRING, af.getTag().getFirst(FieldKey.ALBUM));
265
assertEquals(ALBUM_TEST_STRING, af.getTag().getFirst(FieldKey.ALBUM));
266
assertEquals(ALBUM_TEST_STRING, ((ID3v24Tag) af.getTag()).getFirst(ID3v24FieldKey.ALBUM));
267
assertEquals(ALBUM_TEST_STRING,((TagTextField)af.getTag().getFirstField(FieldKey.ALBUM)).getContent());
268
assertEquals(1, af.getTag().getFields(FieldKey.ALBUM).size());
270
//Read back album (old method)
271
AbstractID3v2Frame checkframe = (AbstractID3v2Frame) ((MP3File) af).getID3v2Tag().getFrame(ID3v24Frames.FRAME_ID_ALBUM);
272
assertEquals(ALBUM_TEST_STRING, ((FrameBodyTALB) checkframe.getBody()).getText());
274
//If addField again, the value gets appended using the null char sperator system
275
af.getTag().addField(FieldKey.ALBUM,ALBUM_TEST_STRING2);
277
af = AudioFileIO.read(testFile);
278
assertEquals(ALBUM_TEST_STRING + "\u0000" + ALBUM_TEST_STRING2, af.getTag().getFirst(FieldKey.ALBUM));
279
assertEquals(ALBUM_TEST_STRING + "\u0000" + ALBUM_TEST_STRING2, af.getTag().getValue(FieldKey.ALBUM,0));
280
assertEquals(ALBUM_TEST_STRING, af.getTag().getSubValue(FieldKey.ALBUM,0,0));
281
assertEquals(ALBUM_TEST_STRING2, af.getTag().getSubValue(FieldKey.ALBUM,0,1));
282
assertEquals(ALBUM_TEST_STRING + "\u0000" + ALBUM_TEST_STRING2, ((ID3v24Tag) af.getTag()).getFirst(ID3v24FieldKey.ALBUM));
283
assertEquals(ALBUM_TEST_STRING + "\u0000" + ALBUM_TEST_STRING2,((TagTextField)af.getTag().getFirstField(FieldKey.ALBUM)).getContent());
284
assertEquals(1, af.getTag().getFields(FieldKey.ALBUM).size());
286
//And can replace existing value
287
af.getTag().setField(FieldKey.ALBUM,ALBUM_TEST_STRING2);
289
af = AudioFileIO.read(testFile);
290
assertEquals(ALBUM_TEST_STRING2, af.getTag().getFirst(FieldKey.ALBUM));
291
assertEquals(ALBUM_TEST_STRING2, af.getTag().getFirst(FieldKey.ALBUM));
292
assertEquals(ALBUM_TEST_STRING2, ((ID3v24Tag) af.getTag()).getFirst(ID3v24FieldKey.ALBUM));
293
assertEquals(1, af.getTag().getFields(FieldKey.ALBUM).size());
296
af.getTag().deleteField(FieldKey.ALBUM);
298
af = AudioFileIO.read(testFile);
299
assertEquals("", af.getTag().getFirst(FieldKey.ALBUM));
300
assertEquals("", af.getTag().getFirst(FieldKey.ALBUM));
301
assertEquals("", ((ID3v24Tag) af.getTag()).getFirst(ID3v24FieldKey.ALBUM));
302
assertEquals(0, af.getTag().getFields(FieldKey.ALBUM).size());
304
//Test out the other basic fields
306
af.getTag().setField(FieldKey.YEAR,"1991");
308
af = AudioFileIO.read(testFile);
309
assertEquals("1991", af.getTag().getFirst(FieldKey.YEAR));
310
assertEquals("1991", af.getTag().getFirst(FieldKey.YEAR));
311
assertEquals("1991", ((ID3v24Tag) af.getTag()).getFirst(ID3v24FieldKey.YEAR));
312
assertEquals("1991",((TagTextField)af.getTag().getFirstField(FieldKey.YEAR)).getContent());
313
assertEquals(1, af.getTag().getFields(FieldKey.YEAR).size());
314
assertEquals(2, af.getTag().getFieldCount());
317
af.getTag().setField(FieldKey.TITLE,"Title");
319
af = AudioFileIO.read(testFile);
320
assertEquals("Title", af.getTag().getFirst(FieldKey.TITLE));
321
assertEquals("Title", af.getTag().getFirst(FieldKey.TITLE));
322
assertEquals("Title", ((ID3v24Tag) af.getTag()).getFirst(ID3v24FieldKey.TITLE));
323
assertEquals("Title",((TagTextField)af.getTag().getFirstField(FieldKey.TITLE)).getContent());
324
assertEquals(1, af.getTag().getFields(FieldKey.TITLE).size());
325
assertEquals(3, af.getTag().getFieldCount());
327
//Comment, trickier because uses different framebody subclass to the ones above
328
af.getTag().setField(FieldKey.COMMENT,"Comment");
330
af = AudioFileIO.read(testFile);
331
assertEquals("Comment", af.getTag().getFirst(FieldKey.COMMENT));
332
assertEquals("Comment", ((ID3v24Tag) af.getTag()).getFirst(ID3v24FieldKey.COMMENT));
334
//By default comments are created with empty description because this is what expected
335
//by plyers such as iTunes.
336
ID3v24Frame commentFrame = (ID3v24Frame) ((ID3v24Tag) af.getTag()).getFrame("COMM");
337
FrameBodyCOMM fb = (FrameBodyCOMM) commentFrame.getBody();
338
assertEquals("", fb.getDescription());
339
assertEquals("Comment", fb.getText());
340
//Change description, cant do this with common interface
341
fb.setDescription("test");
342
//Because has different description the following setField will addField another comment rather than overwriting the first one
343
af.getTag().setField(FieldKey.COMMENT,"Comment2");
344
assertEquals(2, af.getTag().getFields(FieldKey.COMMENT).size());
346
List<TagField> comments = af.getTag().getFields(FieldKey.COMMENT);
347
((FrameBodyCOMM) ((ID3v24Frame) comments.get(1)).getBody()).setDescription("test2");
348
af.getTag().setField(FieldKey.COMMENT,"Comment3");
350
af = AudioFileIO.read(testFile);
351
assertEquals(3, af.getTag().getFields(FieldKey.COMMENT).size());
353
//Add fourth Comment (but duplicate key - so overwrites 3rd comment)
354
af.getTag().setField(FieldKey.COMMENT,"Comment4");
356
af = AudioFileIO.read(testFile);
357
assertEquals(3, af.getTag().getFields(FieldKey.COMMENT).size());
359
//Remove all Comment tags
360
af.getTag().deleteField(FieldKey.COMMENT);
361
assertEquals(0, af.getTag().getFields(FieldKey.COMMENT).size());
363
//Add first one back in
364
af.getTag().setField(FieldKey.COMMENT,"Comment");
366
af = AudioFileIO.read(testFile);
367
assertEquals(1, af.getTag().getFields(FieldKey.COMMENT).size());
368
assertEquals(4, af.getTag().getFieldCount());
371
//TODO only one genre frame allowed, but that can contain multiple GENRE values, currently
372
//must parse as one genre e.g 34 67
373
af.getTag().setField(FieldKey.GENRE,"CustomGenre");
375
af = AudioFileIO.read(testFile);
376
assertEquals("CustomGenre", af.getTag().getFirst(FieldKey.GENRE));
377
assertEquals("CustomGenre", af.getTag().getFirst(FieldKey.GENRE));
378
assertEquals("CustomGenre", ((ID3v24Tag) af.getTag()).getFirst(ID3v24FieldKey.GENRE));
379
assertEquals(1, af.getTag().getFields(FieldKey.GENRE).size());
380
assertEquals(5, af.getTag().getFieldCount());
383
af.getTag().setField(FieldKey.TRACK,"7");
384
af.getTag().setField(af.getTag().createField(FieldKey.TRACK_TOTAL, "11"));
385
assertEquals("7",af.getTag().getFirst(FieldKey.TRACK));
386
assertEquals("11",af.getTag().getFirst(FieldKey.TRACK_TOTAL));
388
af = AudioFileIO.read(testFile);
389
assertEquals("7", af.getTag().getFirst(FieldKey.TRACK));
390
assertEquals("7", af.getTag().getFirst(FieldKey.TRACK));
391
assertEquals("7", ((ID3v24Tag) af.getTag()).getFirst(ID3v24FieldKey.TRACK));
392
assertEquals("11",af.getTag().getFirst(FieldKey.TRACK_TOTAL));
393
assertEquals(1, af.getTag().getFields(FieldKey.TRACK).size());
394
assertEquals(6, af.getTag().getFieldCount());
397
//This is one of many fields that uses the TXXX frame, the logic is more complicated
398
af.getTag().setField(af.getTag().createField(FieldKey.AMAZON_ID, "asin123456" + "\u01ff"));
400
af = AudioFileIO.read(testFile);
403
af.getTag().setField(af.getTag().createField(FieldKey.MOOD, "mood"));
405
af = AudioFileIO.read(testFile);
407
assertEquals("asin123456" + "\u01ff", af.getTag().getFirst(FieldKey.AMAZON_ID));
408
assertEquals("asin123456" + "\u01ff", ((ID3v24Tag) af.getTag()).getFirst(ID3v24FieldKey.AMAZON_ID));
409
assertEquals(1, af.getTag().getFields(FieldKey.AMAZON_ID).size());
410
assertEquals(8, af.getTag().getFieldCount());
412
//Now addField another different field that also uses a TXXX frame
413
af.getTag().setField(af.getTag().createField(FieldKey.MUSICIP_ID, "musicip_id"));
415
af = AudioFileIO.read(testFile);
416
assertEquals(2, ((List) ((ID3v24Tag) af.getTag()).getFrame("TXXX")).size());
417
assertEquals("musicip_id", af.getTag().getFirst(FieldKey.MUSICIP_ID));
418
assertEquals("musicip_id", ((ID3v24Tag) af.getTag()).getFirst(ID3v24FieldKey.MUSICIP_ID));
419
assertEquals(1, af.getTag().getFields(FieldKey.MUSICIP_ID).size());
420
assertEquals("asin123456" + "\u01ff", af.getTag().getFirst(FieldKey.AMAZON_ID));
421
assertEquals(9, af.getTag().getFieldCount());
423
//Now addField yet another different field that also uses a TXXX frame
424
af.getTag().setField(af.getTag().createField(FieldKey.MUSICBRAINZ_RELEASEID, "releaseid"));
426
af = AudioFileIO.read(testFile);
427
assertEquals(3, ((List) ((ID3v24Tag) af.getTag()).getFrame("TXXX")).size());
428
assertEquals("musicip_id", af.getTag().getFirst(FieldKey.MUSICIP_ID));
429
assertEquals("releaseid", af.getTag().getFirst(FieldKey.MUSICBRAINZ_RELEASEID));
430
assertEquals("releaseid",((TagTextField)af.getTag().getFirstField(FieldKey.MUSICBRAINZ_RELEASEID)).getContent());
431
assertEquals("asin123456" + "\u01ff", af.getTag().getFirst(FieldKey.AMAZON_ID));
432
assertEquals(1, af.getTag().getFields(FieldKey.MUSICIP_ID).size());
433
assertEquals(1, af.getTag().getFields(FieldKey.AMAZON_ID).size());
434
assertEquals(1, af.getTag().getFields(FieldKey.MUSICBRAINZ_RELEASEID).size());
435
assertEquals(10, af.getTag().getFieldCount());
437
//Now deleteField field
438
af.getTag().deleteField(FieldKey.MUSICBRAINZ_RELEASEID);
440
af = AudioFileIO.read(testFile);
441
assertEquals(2, ((List) ((ID3v24Tag) af.getTag()).getFrame("TXXX")).size());
442
assertEquals(1, af.getTag().getFields(FieldKey.MUSICIP_ID).size());
443
assertEquals(1, af.getTag().getFields(FieldKey.AMAZON_ID).size());
444
assertEquals(9, af.getTag().getFieldCount());
446
//Cover Art:invalid way to do it
449
af.getTag().setField(af.getTag().createField(FieldKey.COVER_ART, "coverart"));
451
catch (java.lang.UnsupportedOperationException uoe)
455
assertTrue(e instanceof UnsupportedOperationException);
457
//Add new image correctly
458
RandomAccessFile imageFile = new RandomAccessFile(new File("testdata", "coverart.png"), "r");
459
byte[] imagedata = new byte[(int) imageFile.length()];
460
imageFile.read(imagedata);
461
af.getTag().addField(tag.createArtworkField(imagedata, "image/png"));
463
af = AudioFileIO.read(testFile);
464
assertEquals(1, ((ID3v24Tag) af.getTag()).getFields(FieldKey.COVER_ART).size());
465
assertEquals(1, ((ID3v24Tag) af.getTag()).getFields(ID3v24FieldKey.COVER_ART.getFieldName()).size());
466
//TODO This isnt very user friendly
467
TagField tagField = af.getTag().getFirstField(ID3v24FieldKey.COVER_ART.getFieldName());
468
assertEquals("image/png::18545",((TagTextField)af.getTag().getFirstField(FieldKey.COVER_ART)).getContent());
470
assertTrue(tagField instanceof ID3v24Frame);
471
ID3v24Frame apicFrame = (ID3v24Frame) tagField;
472
assertTrue(apicFrame.getBody() instanceof FrameBodyAPIC);
473
FrameBodyAPIC apicframebody = (FrameBodyAPIC) apicFrame.getBody();
474
assertFalse(apicframebody.isImageUrl());
475
assertEquals(10, af.getTag().getFieldCount());
477
//Add another image correctly
478
imageFile = new RandomAccessFile(new File("testdata", "coverart_small.png"), "r");
479
imagedata = new byte[(int) imageFile.length()];
480
imageFile.read(imagedata);
481
af.getTag().addField(tag.createArtworkField(imagedata, "image/png"));
483
af = AudioFileIO.read(testFile);
484
assertEquals(2, af.getTag().getFields(FieldKey.COVER_ART).size());
485
assertEquals(11, af.getTag().getFieldCount());
487
//Actually createField the image from the read data
488
BufferedImage bi = null;
489
TagField imageField = af.getTag().getFields(FieldKey.COVER_ART).get(0);
490
if (imageField instanceof AbstractID3v2Frame)
492
FrameBodyAPIC imageFrameBody = (FrameBodyAPIC) ((AbstractID3v2Frame) imageField).getBody();
493
if (!imageFrameBody.isImageUrl())
495
byte[] imageRawData = (byte[]) imageFrameBody.getObjectValue(DataTypes.OBJ_PICTURE_DATA);
496
bi = ImageIO.read(new ByteArrayInputStream(imageRawData));
502
af.getTag().addField(tag.createLinkedArtworkField("../testdata/coverart.jpg"));
505
af = AudioFileIO.read(testFile);
506
assertEquals(3, af.getTag().getFields(FieldKey.COVER_ART).size());
507
assertEquals(12, af.getTag().getFieldCount());
508
List<TagField> imageFields = af.getTag().getFields(FieldKey.COVER_ART);
509
tagField = imageFields.get(2);
510
apicFrame = (ID3v24Frame) tagField;
511
assertTrue(apicFrame.getBody() instanceof FrameBodyAPIC);
512
apicframebody = (FrameBodyAPIC) apicFrame.getBody();
513
assertTrue(apicframebody.isImageUrl());
514
assertEquals("../testdata/coverart.jpg", apicframebody.getImageUrl());
519
/* public void testReadUrlImage() throws Exception
524
File testFile = AbstractTestCase.copyAudioToTmp("testV1withurlimage.mp3");
525
org.jaudiotagger.audio.AudioFile audioFile = org.jaudiotagger.audio.AudioFileIO.read(testFile);
526
ID3v23Tag newTag = (ID3v23Tag)audioFile.getTag();
527
assertEquals(1, newTag.getFields(FieldKey.COVER_ART).size());
528
TagField tagField = newTag.getFirstField(ID3v23FieldKey.COVER_ART.getFieldName());
529
assertTrue(tagField instanceof ID3v23Frame);
530
ID3v23Frame apicFrame = (ID3v23Frame)tagField;
531
assertTrue(apicFrame.getBody() instanceof FrameBodyAPIC);
532
FrameBodyAPIC apicframebody = (FrameBodyAPIC)apicFrame.getBody();
533
assertFalse(apicframebody.isImageUrl());
538
ex.printStackTrace();
543
public void testNewInterfaceBasicReadandWriteID3v23() throws Exception
546
File testFile = AbstractTestCase.copyAudioToTmp("testV1.mp3", new File("testnewIntId3v23.mp3"));
547
MP3File mp3File = new MP3File(testFile);
549
//Has no tag at this point
550
assertFalse(mp3File.hasID3v1Tag());
551
assertFalse(mp3File.hasID3v2Tag());
553
//Create v1 tag (old method)
554
ID3v11Tag v1tag = new ID3v11Tag();
555
v1tag.setField(FieldKey.ARTIST,V1_ARTIST);
556
v1tag.setField(FieldKey.ALBUM,"V1ALBUM");
557
mp3File.setID3v1Tag(v1tag);
560
//Has only v1 tag at this point
561
assertTrue(mp3File.hasID3v1Tag());
562
assertFalse(mp3File.hasID3v2Tag());
564
//Read back artist (new method ,v1)
565
AudioFile af = AudioFileIO.read(testFile);
566
assertEquals(V1_ARTIST, af.getTag().getFirst(FieldKey.ARTIST));
567
assertEquals(V1_ARTIST, af.getTag().getFirst(FieldKey.ARTIST));
568
assertEquals(V1_ARTIST, af.getTag().getFirst(FieldKey.ARTIST));
570
//Add artist frame (old method)
571
ID3v23Tag tag = new ID3v23Tag();
572
ID3v23Frame frame = new ID3v23Frame(ID3v23Frames.FRAME_ID_V3_ARTIST);
573
((FrameBodyTPE1) frame.getBody()).setText(FrameBodyTPE1Test.TPE1_TEST_STRING);
575
mp3File.setID3v2TagOnly(tag);
578
//Has v1 and v2 tag at this point
579
assertTrue(mp3File.hasID3v1Tag());
580
assertTrue(mp3File.hasID3v2Tag());
582
//Read back artist (new method ,v1 value overrriden by v2 method)
583
af = AudioFileIO.read(testFile);
584
assertEquals(FrameBodyTPE1Test.TPE1_TEST_STRING, af.getTag().getFirst(FieldKey.ARTIST));
585
assertEquals(FrameBodyTPE1Test.TPE1_TEST_STRING, af.getTag().getFirst(FieldKey.ARTIST));
586
assertEquals(FrameBodyTPE1Test.TPE1_TEST_STRING, ((ID3v23Tag) af.getTag()).getFirst(ID3v23FieldKey.ARTIST));
587
//.... but v1 value is still there
588
assertEquals(V1_ARTIST, ((MP3File) af).getID3v1Tag().getFirst(FieldKey.ARTIST));
589
//Write album ( new method)
590
af.getTag().setField(FieldKey.ALBUM,ALBUM_TEST_STRING);
593
//Read back album (new method)
594
af = AudioFileIO.read(testFile);
595
assertEquals(ALBUM_TEST_STRING, af.getTag().getFirst(FieldKey.ALBUM));
596
assertEquals(ALBUM_TEST_STRING, af.getTag().getFirst(FieldKey.ALBUM));
597
assertEquals(ALBUM_TEST_STRING, ((ID3v23Tag) af.getTag()).getFirst(ID3v23FieldKey.ALBUM));
598
assertEquals(1, af.getTag().getFields(FieldKey.ALBUM).size());
600
//Read back album (old method)
601
AbstractID3v2Frame checkframe = (AbstractID3v2Frame) ((MP3File) af).getID3v2Tag().getFrame(ID3v23Frames.FRAME_ID_V3_ALBUM);
602
assertEquals(ALBUM_TEST_STRING, ((FrameBodyTALB) checkframe.getBody()).getText());
604
//If add smae field again appended to existiong frame
605
af.getTag().addField(FieldKey.ALBUM,ALBUM_TEST_STRING2);
607
af = AudioFileIO.read(testFile);
608
assertEquals(ALBUM_TEST_STRING + "\u0000" + ALBUM_TEST_STRING2, af.getTag().getFirst(FieldKey.ALBUM));
609
assertEquals(ALBUM_TEST_STRING + "\u0000" + ALBUM_TEST_STRING2, af.getTag().getFirst(FieldKey.ALBUM));
610
assertEquals(ALBUM_TEST_STRING, af.getTag().getSubValue(FieldKey.ALBUM,0,0));
611
assertEquals(ALBUM_TEST_STRING2, af.getTag().getSubValue(FieldKey.ALBUM,0,1));
612
assertEquals(ALBUM_TEST_STRING + "\u0000" + ALBUM_TEST_STRING2, ((ID3v23Tag) af.getTag()).getFirst(ID3v23FieldKey.ALBUM));
613
assertEquals(1, af.getTag().getFields(FieldKey.ALBUM).size());
615
//But can replace existing value
616
af.getTag().setField(FieldKey.ALBUM,ALBUM_TEST_STRING2);
618
af = AudioFileIO.read(testFile);
619
assertEquals(ALBUM_TEST_STRING2, af.getTag().getFirst(FieldKey.ALBUM));
620
assertEquals(ALBUM_TEST_STRING2, af.getTag().getFirst(FieldKey.ALBUM));
621
assertEquals(ALBUM_TEST_STRING2, ((ID3v23Tag) af.getTag()).getFirst(ID3v23FieldKey.ALBUM));
622
assertEquals(1, af.getTag().getFields(FieldKey.ALBUM).size());
625
af.getTag().deleteField(FieldKey.ALBUM);
627
af = AudioFileIO.read(testFile);
628
assertEquals("", af.getTag().getFirst(FieldKey.ALBUM));
629
assertEquals("", af.getTag().getFirst(FieldKey.ALBUM));
630
assertEquals("", ((ID3v23Tag) af.getTag()).getFirst(ID3v23FieldKey.ALBUM));
631
assertEquals(0, af.getTag().getFields(FieldKey.ALBUM).size());
633
//Test out the other basic fields
635
af.getTag().setField(FieldKey.YEAR,"1991");
637
af = AudioFileIO.read(testFile);
638
assertEquals("1991", af.getTag().getFirst(FieldKey.YEAR));
639
assertEquals("1991", af.getTag().getFirst(FieldKey.YEAR));
640
assertEquals("1991", ((ID3v23Tag) af.getTag()).getFirst(ID3v23FieldKey.YEAR));
641
assertEquals(1, af.getTag().getFields(FieldKey.YEAR).size());
642
assertEquals(2, af.getTag().getFieldCount());
645
af.getTag().setField(FieldKey.TITLE,"Title");
647
af = AudioFileIO.read(testFile);
648
assertEquals("Title", af.getTag().getFirst(FieldKey.TITLE));
649
assertEquals("Title", af.getTag().getFirst(FieldKey.TITLE));
650
assertEquals("Title", ((ID3v23Tag) af.getTag()).getFirst(ID3v23FieldKey.TITLE));
651
assertEquals(1, af.getTag().getFields(FieldKey.TITLE).size());
652
assertEquals(3, af.getTag().getFieldCount());
654
//Comment, trickier because uses different framebody subclass to the ones above
655
af.getTag().setField(FieldKey.COMMENT,"Comment");
657
af = AudioFileIO.read(testFile);
658
assertEquals("Comment", af.getTag().getFirst(FieldKey.COMMENT));
659
assertEquals("Comment", ((ID3v23Tag) af.getTag()).getFirst(ID3v23FieldKey.COMMENT));
660
assertEquals(1, af.getTag().getFields(FieldKey.COMMENT).size());
661
assertEquals(4, af.getTag().getFieldCount());
664
//TODO only one genre frame allowed, but that can contain multiple GENRE values, currently
665
//must parse as one genre e.g 34 67
666
af.getTag().setField(FieldKey.GENRE,"CustomGenre");
668
af = AudioFileIO.read(testFile);
669
assertEquals("CustomGenre", af.getTag().getFirst(FieldKey.GENRE));
670
assertEquals("CustomGenre", ((ID3v23Tag) af.getTag()).getFirst(ID3v23FieldKey.GENRE));
671
assertEquals(1, af.getTag().getFields(FieldKey.GENRE).size());
672
assertEquals(5, af.getTag().getFieldCount());
676
af.getTag().setField(FieldKey.TRACK,"7");
677
af.getTag().setField(af.getTag().createField(FieldKey.TRACK_TOTAL, "11"));
678
assertEquals("7",af.getTag().getFirst(FieldKey.TRACK));
679
assertEquals("11",af.getTag().getFirst(FieldKey.TRACK_TOTAL));
682
af = AudioFileIO.read(testFile);
683
assertEquals("7", af.getTag().getFirst(FieldKey.TRACK));
684
assertEquals("7", af.getTag().getFirst(FieldKey.TRACK));
685
assertEquals("7", ((ID3v23Tag) af.getTag()).getFirst(ID3v23FieldKey.TRACK));
686
assertEquals(1, af.getTag().getFields(FieldKey.TRACK).size());
687
assertEquals(6, af.getTag().getFieldCount());
689
assertEquals("7",af.getTag().getFirst(FieldKey.TRACK));
691
//AmazonId also testing utf encoding here
692
//This is one of many fields that uses the TXXX frame, the logic is more complicated
693
af.getTag().setField(af.getTag().createField(FieldKey.AMAZON_ID, "asin123456" + "\u01ff"));
695
af = AudioFileIO.read(testFile);
696
assertEquals("asin123456" + "\u01ff", af.getTag().getFirst(FieldKey.AMAZON_ID));
697
assertEquals("asin123456" + "\u01ff", ((ID3v23Tag) af.getTag()).getFirst(ID3v23FieldKey.AMAZON_ID));
698
assertEquals(1, af.getTag().getFields(FieldKey.AMAZON_ID).size());
699
assertEquals(7, af.getTag().getFieldCount());
702
af.getTag().setField(af.getTag().createField(FieldKey.MOOD, "mood"));
704
af = AudioFileIO.read(testFile);
705
assertEquals("mood", af.getTag().getFirst(FieldKey.MOOD));
706
//Now deleteField field
707
af.getTag().deleteField(FieldKey.MOOD);
709
af = AudioFileIO.read(testFile);
711
assertEquals("7",af.getTag().getFirst(FieldKey.TRACK));
714
af.getTag().setField(af.getTag().createField(FieldKey.TRACK_TOTAL, "11"));
715
assertEquals("11",af.getTag().getFirst(FieldKey.TRACK_TOTAL));
717
//Now addField another different field that also uses a TXXX frame
718
af.getTag().setField(af.getTag().createField(FieldKey.MUSICIP_ID, "musicip_id"));
720
af = AudioFileIO.read(testFile);
721
assertEquals(2, ((List) ((ID3v23Tag) af.getTag()).getFrame("TXXX")).size());
722
assertEquals("musicip_id", af.getTag().getFirst(FieldKey.MUSICIP_ID));
723
assertEquals("musicip_id", ((ID3v23Tag) af.getTag()).getFirst(ID3v23FieldKey.MUSICIP_ID));
724
assertEquals(1, af.getTag().getFields(FieldKey.MUSICIP_ID).size());
725
assertEquals("asin123456" + "\u01ff", af.getTag().getFirst(FieldKey.AMAZON_ID));
726
assertEquals("7",af.getTag().getFirst(FieldKey.TRACK));
727
assertEquals(8, af.getTag().getFieldCount());
728
assertEquals("11",af.getTag().getFirst(FieldKey.TRACK_TOTAL));
729
assertEquals("7",((ID3v23Tag)af.getTag()).getFirst(ID3v23FieldKey.TRACK));
730
assertEquals("11",((ID3v23Tag)af.getTag()).getFirst(ID3v23FieldKey.TRACK_TOTAL));
732
//Now addField yet another different field that also uses a TXXX frame
733
af.getTag().setField(af.getTag().createField(FieldKey.MUSICBRAINZ_RELEASEID, "releaseid"));
735
af = AudioFileIO.read(testFile);
736
assertEquals(3, ((List) ((ID3v23Tag) af.getTag()).getFrame("TXXX")).size());
737
assertEquals("musicip_id", af.getTag().getFirst(FieldKey.MUSICIP_ID));
738
assertEquals("releaseid", af.getTag().getFirst(FieldKey.MUSICBRAINZ_RELEASEID));
739
assertEquals("asin123456" + "\u01ff", af.getTag().getFirst(FieldKey.AMAZON_ID));
740
assertEquals(1, af.getTag().getFields(FieldKey.MUSICIP_ID).size());
741
assertEquals(1, af.getTag().getFields(FieldKey.AMAZON_ID).size());
742
assertEquals(1, af.getTag().getFields(FieldKey.MUSICBRAINZ_RELEASEID).size());
743
assertEquals(9, af.getTag().getFieldCount());
745
//Now deleteField field
746
af.getTag().deleteField(FieldKey.MUSICBRAINZ_RELEASEID);
748
af = AudioFileIO.read(testFile);
749
assertEquals(2, ((List) ((ID3v23Tag) af.getTag()).getFrame("TXXX")).size());
750
assertEquals(1, af.getTag().getFields(FieldKey.MUSICIP_ID).size());
751
assertEquals(1, af.getTag().getFields(FieldKey.AMAZON_ID).size());
752
assertEquals(8, af.getTag().getFieldCount());
754
//Cover Art:invalid way to do it
757
af.getTag().setField(af.getTag().createField(FieldKey.COVER_ART, "coverart"));
759
catch (java.lang.UnsupportedOperationException uoe)
763
assertTrue(e instanceof UnsupportedOperationException);
765
//Add new image correctly
766
RandomAccessFile imageFile = new RandomAccessFile(new File("testdata", "coverart.png"), "r");
767
byte[] imagedata = new byte[(int) imageFile.length()];
768
imageFile.read(imagedata);
769
af.getTag().addField(tag.createArtworkField(imagedata, "image/png"));
771
af = AudioFileIO.read(testFile);
772
assertEquals(1, af.getTag().getFields(FieldKey.COVER_ART).size());
773
assertEquals(9, af.getTag().getFieldCount());
775
//Add another image correctly
776
imageFile = new RandomAccessFile(new File("testdata", "coverart_small.png"), "r");
777
imagedata = new byte[(int) imageFile.length()];
778
imageFile.read(imagedata);
779
af.getTag().addField(tag.createArtworkField(imagedata, "image/png"));
781
af = AudioFileIO.read(testFile);
782
assertEquals(2, af.getTag().getFields(FieldKey.COVER_ART).size());
783
assertEquals(10, af.getTag().getFieldCount());
788
public void testNewInterfaceBasicReadandWriteID3v22() throws Exception
791
File testFile = AbstractTestCase.copyAudioToTmp("testV1.mp3", new File("testnewIntId3v22.mp3"));
792
MP3File mp3File = new MP3File(testFile);
794
//Has no tag at this point
795
assertFalse(mp3File.hasID3v1Tag());
796
assertFalse(mp3File.hasID3v2Tag());
798
//Create v1 tag (old method)
799
ID3v11Tag v1tag = new ID3v11Tag();
800
v1tag.setField(FieldKey.ARTIST,V1_ARTIST);
801
v1tag.setField(FieldKey.ALBUM,"V1ALBUM");
802
mp3File.setID3v1Tag(v1tag);
805
//Has only v1 tag at this point
806
assertTrue(mp3File.hasID3v1Tag());
807
assertFalse(mp3File.hasID3v2Tag());
809
//Read back artist (new method ,v1)
810
AudioFile af = AudioFileIO.read(testFile);
811
assertEquals(V1_ARTIST, af.getTag().getFirst(FieldKey.ARTIST));
812
assertEquals(V1_ARTIST, af.getTag().getFirst(FieldKey.ARTIST));
813
assertEquals(V1_ARTIST, af.getTag().getFirst(FieldKey.ARTIST));
815
//Add artist frame (old method)
816
ID3v22Tag tag = new ID3v22Tag();
817
ID3v22Frame frame = new ID3v22Frame(ID3v22Frames.FRAME_ID_V2_ARTIST);
818
((FrameBodyTPE1) frame.getBody()).setText(FrameBodyTPE1Test.TPE1_TEST_STRING);
820
mp3File.setID3v2TagOnly(tag);
823
//Has v1 and v2 tag at this point
824
assertTrue(mp3File.hasID3v1Tag());
825
assertTrue(mp3File.hasID3v2Tag());
827
//Read back artist (new method ,v1 value overrriden by v2 method)
828
af = AudioFileIO.read(testFile);
829
assertEquals(FrameBodyTPE1Test.TPE1_TEST_STRING, af.getTag().getFirst(FieldKey.ARTIST));
830
assertEquals(FrameBodyTPE1Test.TPE1_TEST_STRING, af.getTag().getFirst(FieldKey.ARTIST));
832
assertEquals(FrameBodyTPE1Test.TPE1_TEST_STRING, ((ID3v22Tag) af.getTag()).getFirst(ID3v22FieldKey.ARTIST));
833
//.... but v1 value is still there
834
assertEquals(V1_ARTIST, ((MP3File) af).getID3v1Tag().getFirst(FieldKey.ARTIST));
835
//Write album ( new method)
836
af.getTag().setField(FieldKey.ALBUM,ALBUM_TEST_STRING);
837
assertEquals(ALBUM_TEST_STRING, af.getTag().getFirst(FieldKey.ALBUM));
838
assertEquals(1, af.getTag().getFields(FieldKey.ALBUM).size());
842
//Read back album (new method)
843
af = AudioFileIO.read(testFile);
844
assertEquals(ALBUM_TEST_STRING, af.getTag().getFirst(FieldKey.ALBUM));
845
assertEquals(ALBUM_TEST_STRING, af.getTag().getFirst(FieldKey.ALBUM));
846
assertEquals(ALBUM_TEST_STRING, ((ID3v22Tag) af.getTag()).getFirst(ID3v22FieldKey.ALBUM));
847
assertEquals(1, af.getTag().getFields(FieldKey.ALBUM).size());
849
//Read back album (old method)
850
AbstractID3v2Frame checkframe = (AbstractID3v2Frame) ((MP3File) af).getID3v2Tag().getFrame(ID3v22Frames.FRAME_ID_V2_ALBUM);
851
assertEquals(ALBUM_TEST_STRING, ((FrameBodyTALB) checkframe.getBody()).getText());
853
//If add extra text field its appended to existing frame
854
af.getTag().addField(FieldKey.ALBUM,ALBUM_TEST_STRING2);
856
af = AudioFileIO.read(testFile);
857
assertEquals(ALBUM_TEST_STRING + "\u0000" + ALBUM_TEST_STRING2, af.getTag().getFirst(FieldKey.ALBUM));
858
assertEquals(ALBUM_TEST_STRING + "\u0000" + ALBUM_TEST_STRING2, af.getTag().getFirst(FieldKey.ALBUM));
859
assertEquals(ALBUM_TEST_STRING, af.getTag().getSubValue(FieldKey.ALBUM,0,0));
860
assertEquals(ALBUM_TEST_STRING2, af.getTag().getSubValue(FieldKey.ALBUM,0,1));
861
assertEquals(ALBUM_TEST_STRING + "\u0000" + ALBUM_TEST_STRING2, ((ID3v22Tag) af.getTag()).getFirst(ID3v22FieldKey.ALBUM));
862
assertEquals(1, af.getTag().getFields(FieldKey.ALBUM).size());
864
//But can replace existing value
865
af.getTag().setField(FieldKey.ALBUM,ALBUM_TEST_STRING2);
867
af = AudioFileIO.read(testFile);
868
assertEquals(ALBUM_TEST_STRING2, af.getTag().getFirst(FieldKey.ALBUM));
869
assertEquals(ALBUM_TEST_STRING2, af.getTag().getFirst(FieldKey.ALBUM));
870
assertEquals(ALBUM_TEST_STRING2, ((ID3v22Tag) af.getTag()).getFirst(ID3v22FieldKey.ALBUM));
871
assertEquals(1,af.getTag().getFields(FieldKey.ALBUM).size());
874
af.getTag().deleteField(FieldKey.ALBUM);
876
af = AudioFileIO.read(testFile);
877
assertEquals("", af.getTag().getFirst(FieldKey.ALBUM));
878
assertEquals("", af.getTag().getFirst(FieldKey.ALBUM));
879
assertEquals("", ((ID3v22Tag) af.getTag()).getFirst(ID3v22FieldKey.ALBUM));
880
assertEquals(0, af.getTag().getFields(FieldKey.ALBUM).size());
882
//Test out the other basic fields
884
af.getTag().setField(FieldKey.YEAR,"1991");
886
af = AudioFileIO.read(testFile);
887
assertEquals("1991", af.getTag().getFirst(FieldKey.YEAR));
888
assertEquals("1991", af.getTag().getFirst(FieldKey.YEAR));
889
assertEquals("1991", ((ID3v22Tag) af.getTag()).getFirst(ID3v22FieldKey.YEAR));
890
assertEquals(1, af.getTag().getFields(FieldKey.YEAR).size());
891
assertEquals(2, af.getTag().getFieldCount());
894
af.getTag().setField(FieldKey.TITLE,"Title");
896
af = AudioFileIO.read(testFile);
897
assertEquals("Title", af.getTag().getFirst(FieldKey.TITLE));
898
assertEquals("Title", af.getTag().getFirst(FieldKey.TITLE));
899
assertEquals("Title", ((ID3v22Tag) af.getTag()).getFirst(ID3v22FieldKey.TITLE));
900
assertEquals(1, af.getTag().getFields(FieldKey.TITLE).size());
901
assertEquals(3, af.getTag().getFieldCount());
903
//Comment, trickier because uses different framebody subclass to the ones above
904
af.getTag().setField(FieldKey.COMMENT,"Comment");
906
af = AudioFileIO.read(testFile);
907
assertEquals("Comment", af.getTag().getFirst(FieldKey.COMMENT));
908
assertEquals("Comment", af.getTag().getFirst(FieldKey.COMMENT));
909
assertEquals("Comment", ((ID3v22Tag) af.getTag()).getFirst(ID3v22FieldKey.COMMENT));
910
assertEquals(1, af.getTag().getFields(FieldKey.COMMENT).size());
911
assertEquals(4, af.getTag().getFieldCount());
914
//TODO only one genre frame allowed, but that can contain multiple GENRE values, currently
915
//must parse as one genre e.g 34 67
916
af.getTag().setField(FieldKey.GENRE,"CustomGenre");
918
af = AudioFileIO.read(testFile);
919
assertEquals("CustomGenre", af.getTag().getFirst(FieldKey.GENRE));
920
assertEquals("CustomGenre", af.getTag().getFirst(FieldKey.GENRE));
921
assertEquals("CustomGenre", ((ID3v22Tag) af.getTag()).getFirst(ID3v22FieldKey.GENRE));
922
assertEquals(1, af.getTag().getFields(FieldKey.GENRE).size());
923
assertEquals(5, af.getTag().getFieldCount());
926
af.getTag().setField(FieldKey.TRACK,"7");
927
af.getTag().setField(af.getTag().createField(FieldKey.TRACK_TOTAL, "11"));
928
assertEquals("7",af.getTag().getFirst(FieldKey.TRACK));
929
assertEquals("11",af.getTag().getFirst(FieldKey.TRACK_TOTAL));
931
af = AudioFileIO.read(testFile);
932
assertEquals("7", af.getTag().getFirst(FieldKey.TRACK));
933
assertEquals("7", af.getTag().getFirst(FieldKey.TRACK));
934
assertEquals("7", ((ID3v22Tag) af.getTag()).getFirst(ID3v22FieldKey.TRACK));
935
assertEquals("11",af.getTag().getFirst(FieldKey.TRACK_TOTAL));
936
assertEquals(1, af.getTag().getFields(FieldKey.TRACK).size());
937
assertEquals(1, af.getTag().getFields(FieldKey.TRACK).size());
938
assertEquals(6, af.getTag().getFieldCount());
941
//This is one of many fields that uses the TXXX frame, the logic is more complicated
942
af.getTag().setField(af.getTag().createField(FieldKey.AMAZON_ID, "asin123456" + "\u01ff"));
944
af = AudioFileIO.read(testFile);
947
af.getTag().setField(af.getTag().createField(FieldKey.MOOD, "mood"));
949
af = AudioFileIO.read(testFile);
950
assertEquals("mood", af.getTag().getFirst(FieldKey.MOOD));
951
//Now deleteField field
952
af.getTag().deleteField(FieldKey.MOOD);
954
af = AudioFileIO.read(testFile);
956
assertEquals("asin123456" + "\u01ff", af.getTag().getFirst(FieldKey.AMAZON_ID));
957
assertEquals("asin123456" + "\u01ff", ((ID3v22Tag) af.getTag()).getFirst(ID3v22FieldKey.AMAZON_ID));
958
assertEquals(1, af.getTag().getFields(FieldKey.AMAZON_ID).size());
959
assertEquals(7, af.getTag().getFieldCount());
961
//Now addField another different field that also uses a TXX frame
962
af.getTag().setField(af.getTag().createField(FieldKey.MUSICIP_ID, "musicip_id"));
964
af = AudioFileIO.read(testFile);
965
assertEquals(2, ((List) ((ID3v22Tag) af.getTag()).getFrame("TXX")).size());
966
assertEquals("musicip_id", af.getTag().getFirst(FieldKey.MUSICIP_ID));
967
assertEquals("musicip_id", ((ID3v22Tag) af.getTag()).getFirst(ID3v22FieldKey.MUSICIP_ID));
968
assertEquals(1, af.getTag().getFields(FieldKey.MUSICIP_ID).size());
969
assertEquals("asin123456" + "\u01ff", af.getTag().getFirst(FieldKey.AMAZON_ID));
970
assertEquals(8, af.getTag().getFieldCount());
972
//Now addField yet another different field that also uses a TXX frame
973
af.getTag().setField(af.getTag().createField(FieldKey.MUSICBRAINZ_RELEASEID, "releaseid"));
975
af = AudioFileIO.read(testFile);
976
assertEquals(3, ((List) ((ID3v22Tag) af.getTag()).getFrame("TXX")).size());
977
assertEquals("musicip_id", af.getTag().getFirst(FieldKey.MUSICIP_ID));
978
assertEquals("releaseid", af.getTag().getFirst(FieldKey.MUSICBRAINZ_RELEASEID));
979
assertEquals("asin123456" + "\u01ff", af.getTag().getFirst(FieldKey.AMAZON_ID));
980
assertEquals(1, af.getTag().getFields(FieldKey.MUSICIP_ID).size());
981
assertEquals(1, af.getTag().getFields(FieldKey.AMAZON_ID).size());
982
assertEquals(1, af.getTag().getFields(FieldKey.MUSICBRAINZ_RELEASEID).size());
983
assertEquals(9, af.getTag().getFieldCount());
985
//Now deleteField field
986
af.getTag().deleteField(FieldKey.MUSICBRAINZ_RELEASEID);
988
af = AudioFileIO.read(testFile);
989
assertEquals(2, ((List) ((ID3v22Tag) af.getTag()).getFrame("TXX")).size());
990
assertEquals(1, af.getTag().getFields(FieldKey.MUSICIP_ID).size());
991
assertEquals(1, af.getTag().getFields(FieldKey.AMAZON_ID).size());
992
assertEquals(8, af.getTag().getFieldCount());
994
//Cover Art:invalid way to do it
997
af.getTag().setField(af.getTag().createField(FieldKey.COVER_ART, "coverart"));
999
catch (java.lang.UnsupportedOperationException uoe)
1003
assertTrue(e instanceof UnsupportedOperationException);
1005
//Add new image correctly
1006
RandomAccessFile imageFile = new RandomAccessFile(new File("testdata", "coverart.png"), "r");
1007
byte[] imagedata = new byte[(int) imageFile.length()];
1008
imageFile.read(imagedata);
1009
af.getTag().addField(tag.createArtworkField(imagedata, "image/png"));
1011
af = AudioFileIO.read(testFile);
1012
assertEquals(1, af.getTag().getFields(FieldKey.COVER_ART).size());
1013
assertEquals(9, af.getTag().getFieldCount());
1015
//Add another image correctly
1016
imageFile = new RandomAccessFile(new File("testdata", "coverart_small.png"), "r");
1017
imagedata = new byte[(int) imageFile.length()];
1018
imageFile.read(imagedata);
1019
af.getTag().addField(tag.createArtworkField(imagedata, "image/png"));
1021
af = AudioFileIO.read(testFile);
1022
assertEquals(2, af.getTag().getFields(FieldKey.COVER_ART).size());
1023
assertEquals(10, af.getTag().getFieldCount());
1027
* Test how adding multiple frameswith new interface of same type is is handled
1031
public void testSettingMultipleFramesofSameType() throws Exception
1034
File testFile = AbstractTestCase.copyAudioToTmp("testV1.mp3", new File("testSetMultiple.mp3"));
1035
AudioFile af = AudioFileIO.read(testFile);
1036
MP3File mp3File = (MP3File) af;
1037
ID3v24Tag tag = new ID3v24Tag();
1038
ID3v24Frame frame = new ID3v24Frame(ID3v24Frames.FRAME_ID_COMMENT);
1039
((FrameBodyCOMM) frame.getBody()).setText("Comment");
1040
tag.setFrame(frame);
1041
mp3File.setID3v2TagOnly(tag);
1043
af = AudioFileIO.read(testFile);
1044
mp3File = (MP3File) af;
1048
ID3v24Frame commentFrame = (ID3v24Frame) ((ID3v24Tag) af.getTag()).getFrame("COMM");
1049
FrameBodyCOMM fb = (FrameBodyCOMM) commentFrame.getBody();
1050
assertEquals("", fb.getDescription());
1051
assertEquals("Comment", fb.getText());
1052
//Change description, cant do this with common interface
1053
fb.setDescription("test");
1054
//Because has different description the following setField will addField another comment rather than overwriting the first one
1055
af.getTag().setField(FieldKey.COMMENT,"Comment2");
1056
assertEquals(2, af.getTag().getFields(FieldKey.COMMENT).size());
1058
List<TagField> comments = af.getTag().getFields(FieldKey.COMMENT);
1059
((FrameBodyCOMM) ((ID3v24Frame) comments.get(1)).getBody()).setDescription("test2");
1060
af.getTag().setField(FieldKey.COMMENT,"Comment3");
1062
af = AudioFileIO.read(testFile);
1063
assertEquals(3, af.getTag().getFields(FieldKey.COMMENT).size());
1065
//Add fourth Comment (but duplicate key - so overwrites 3rd comment)
1066
af.getTag().setField(FieldKey.COMMENT,"Comment4");
1068
af = AudioFileIO.read(testFile);
1069
assertEquals(3, af.getTag().getFields(FieldKey.COMMENT).size());
1071
//Add comment using generic call
1072
af.getTag().setField(af.getTag().createField(FieldKey.COMMENT, "abcdef-ghijklmn"));
1074
//Remove all Comment tags
1075
af.getTag().deleteField(FieldKey.COMMENT);
1076
assertEquals(0, af.getTag().getFields(FieldKey.COMMENT).size());
1078
//Add first one back in
1079
af.getTag().setField(FieldKey.COMMENT,"Comment");
1081
af = AudioFileIO.read(testFile);
1082
assertEquals(1, af.getTag().getFields(FieldKey.COMMENT).size());
1083
assertEquals(1, af.getTag().getFieldCount());
1088
tag = (ID3v24Tag) af.getTag();
1089
frame = new ID3v24Frame(ID3v24Frames.FRAME_ID_USER_DEFINED_INFO);
1090
((FrameBodyTXXX) frame.getBody()).setText("UserDefined");
1091
tag.setFrame(frame);
1092
ID3v24Frame txxxFrame = (ID3v24Frame) tag.getFrame("TXXX");
1093
FrameBodyTXXX fb = (FrameBodyTXXX) txxxFrame.getBody();
1094
assertEquals("", fb.getDescription());
1095
assertEquals("UserDefined", fb.getText());
1096
//Change description, cant do this with common interface
1097
fb.setDescription("test");
1098
//Because has different description the following setField will addField another txxx rather than overwriting the first one
1099
af.getTag().setField(af.getTag().createField(FieldKey.MUSICBRAINZ_ARTISTID, "abcdef-ghijklmn"));
1100
assertEquals(2, ((List) tag.getFrame("TXXX")).size());
1101
//Now adding TXXX with same id so gets overwritten
1102
af.getTag().setField(af.getTag().createField(FieldKey.MUSICBRAINZ_ARTISTID, "abcfffff"));
1103
assertEquals(2, ((List) tag.getFrame("TXXX")).size());
1105
//Try deleting some of these
1106
tag.removeFrameOfType("TXXX");
1107
assertNull(tag.getFrame("TXXX"));
1109
af.getTag().setField(af.getTag().createField(FieldKey.MUSICBRAINZ_ARTISTID, "abcdef-ghijklmn"));
1110
((ID3v24Tag) af.getTag()).deleteField(FieldKey.MUSICBRAINZ_ARTISTID);
1111
assertNull(tag.getFrame("TXXX"));
1117
tag = (ID3v24Tag) af.getTag();
1118
frame = new ID3v24Frame(ID3v24Frames.FRAME_ID_UNIQUE_FILE_ID);
1119
((FrameBodyUFID) frame.getBody()).setOwner("owner");
1120
tag.setFrame(frame);
1121
ID3v24Frame ufidFrame = (ID3v24Frame) tag.getFrame("UFID");
1122
FrameBodyUFID fb = (FrameBodyUFID) ufidFrame.getBody();
1123
assertEquals("owner", fb.getOwner());
1125
//Because has different owner the following setField will addField another ufid rather than overwriting the first one
1126
af.getTag().setField(af.getTag().createField(FieldKey.MUSICBRAINZ_TRACK_ID, "abcdef-ghijklmn"));
1127
assertEquals(2, ((List) tag.getFrame("UFID")).size());
1128
//Now adding UFID with same owner so gets overwritten
1129
af.getTag().setField(af.getTag().createField(FieldKey.MUSICBRAINZ_TRACK_ID, "abcfffff"));
1130
assertEquals(2, ((List) tag.getFrame("UFID")).size());
1132
//Try deleting some of these
1133
tag.removeFrame("UFID");
1134
assertNull(tag.getFrame("UFID"));
1139
tag = (ID3v24Tag) af.getTag();
1140
frame = new ID3v24Frame(ID3v24Frames.FRAME_ID_UNSYNC_LYRICS);
1141
((FrameBodyUSLT) frame.getBody()).setDescription("lyrics1");
1142
tag.setFrame(frame);
1143
ID3v24Frame usltFrame = (ID3v24Frame) tag.getFrame("USLT");
1144
FrameBodyUSLT fb = (FrameBodyUSLT) usltFrame.getBody();
1145
assertEquals("lyrics1", fb.getDescription());
1147
//Because has different desc the following setField will addField another uslt rather than overwriting the first one
1148
af.getTag().setField(af.getTag().createField(FieldKey.LYRICS, "abcdef-ghijklmn"));
1149
assertEquals(2, ((List) tag.getFrame("USLT")).size());
1150
assertEquals(2, af.getTag().getFields(FieldKey.LYRICS).size());
1151
frame = (ID3v24Frame) ((List) tag.getFrame("USLT")).get(1);
1152
assertEquals("", ((FrameBodyUSLT) frame.getBody()).getDescription());
1153
//Now adding USLT with same description so gets overwritten
1154
af.getTag().setField(af.getTag().createField(FieldKey.LYRICS, "abcfffff"));
1155
assertEquals(2, ((List) tag.getFrame("USLT")).size());
1156
assertEquals(2, af.getTag().getFields(FieldKey.LYRICS).size());
1160
//POPM TODO not a supported FieldKey yet
1162
tag = (ID3v24Tag) af.getTag();
1163
frame = new ID3v24Frame(ID3v24Frames.FRAME_ID_POPULARIMETER);
1164
((FrameBodyPOPM) frame.getBody()).setEmailToUser("paultaylor@jthink.net");
1165
tag.setFrame(frame);
1166
ID3v24Frame popmFrame = (ID3v24Frame) tag.getFrame("POPM");
1167
FrameBodyPOPM fb = (FrameBodyPOPM) popmFrame.getBody();
1168
assertEquals("paultaylor@jthink.net", fb.getEmailToUser());
1174
public void testIterator() throws Exception
1176
File orig = new File("testdata", "test26.mp3");
1183
File testFile = AbstractTestCase.copyAudioToTmp("test26.mp3");
1184
MP3File mp3File = new MP3File(testFile);
1187
assertEquals(0, mp3File.getID3v2Tag().getFieldCount());
1188
Iterator<TagField> i = mp3File.getID3v2Tag().getFields();
1189
assertFalse(i.hasNext());
1198
assertTrue(e instanceof NoSuchElementException);
1200
mp3File.getID3v2Tag().addField(FieldKey.ALBUM,"album");
1201
assertEquals(1, mp3File.getID3v2Tag().getFieldCount());
1202
i = mp3File.getID3v2Tag().getFields();
1204
//Should be able to iterate without actually having to call isNext() first
1207
//Should be able to call hasNext() without it having any effect
1208
i = mp3File.getID3v2Tag().getFields();
1209
assertTrue(i.hasNext());
1210
Object o = i.next();
1211
assertTrue( o instanceof ID3v23Frame);
1212
assertEquals("album",((AbstractFrameBodyTextInfo)(((ID3v23Frame)o).getBody())).getFirstTextValue());
1222
assertTrue(e instanceof NoSuchElementException);
1223
assertFalse(i.hasNext());
1225
//Empty frame map and force adding of empty list
1226
mp3File.getID3v2Tag().frameMap.clear();
1227
mp3File.getID3v2Tag().frameMap.put("TXXX",new ArrayList());
1228
assertEquals(0,mp3File.getID3v2Tag().getFieldCount());
1231
//i = mp3File.getID3v2Tag().getFields();
1232
//assertFalse(i.hasNext());
1236
* Currently genres are written to and from v2 tag as is, the decoding from genre number to string has to be done manually
1238
public void testGenres()
1240
Exception ex = null;
1243
File testFile = AbstractTestCase.copyAudioToTmp("testV1.mp3", new File("testBasicWrite.mp3"));
1244
org.jaudiotagger.audio.AudioFile audioFile = org.jaudiotagger.audio.AudioFileIO.read(testFile);
1245
org.jaudiotagger.tag.Tag newTag = audioFile.getTag();
1246
assertTrue(newTag == null);
1247
if (audioFile.getTag() == null)
1249
audioFile.setTag(new ID3v23Tag());
1250
newTag = audioFile.getTag();
1253
//Write literal String
1254
newTag.setField(FieldKey.GENRE,"Rock");
1256
audioFile = org.jaudiotagger.audio.AudioFileIO.read(testFile);
1257
newTag = audioFile.getTag();
1259
assertEquals("Rock", newTag.getFirst(FieldKey.GENRE));
1262
newTag.setField(FieldKey.GENRE,"(17)");
1264
audioFile = org.jaudiotagger.audio.AudioFileIO.read(testFile);
1265
newTag = audioFile.getTag();
1267
assertEquals("(17)", newTag.getFirst(FieldKey.GENRE));
1273
ex.printStackTrace();
1278
public void testRemoveFrameOfType()
1280
File orig = new File("testdata", "test30.mp3");
1286
Exception exceptionCaught = null;
1287
File testFile = AbstractTestCase.copyAudioToTmp("test30.mp3");
1288
MP3File mp3file = null;
1291
mp3file = new MP3File(testFile);
1292
//deleteField multiple frames starting make change to file
1293
((ID3v24Tag) mp3file.getID3v2Tag()).removeFrameOfType("PRIV");
1298
e.printStackTrace();
1299
exceptionCaught = e;
1301
assertNull(exceptionCaught);