/* You may freely copy, distribute, modify and use this class as long as the original author attribution remains intact. See message below. Copyright (C) 2005 Christian Pesch. All Rights Reserved. */ package slash.metamusic.mp3.tools; import slash.metamusic.coverdb.CoverDBCache; import slash.metamusic.lyricsdb.LyricsDBCache; import slash.metamusic.mp3.*; import slash.metamusic.mp3.sections.DescriptionSection; import slash.metamusic.mp3.sections.LanguageSection; import slash.metamusic.mp3.sections.MimeTypeSection; import slash.metamusic.mp3.sections.PictureTypeSection; import slash.metamusic.test.AbstractFileTest; import slash.metamusic.trm.TRM; import slash.metamusic.util.URLLoader; import java.io.File; import java.io.IOException; import java.util.Arrays; /** * Tests for the MP3 Extender and Cleaner */ public class MP3ExtenderTest extends AbstractFileTest { public MP3ExtenderTest(String name) { super(name); } private void checkMP3Properties(MP3File mp3) { assertEquals(true, mp3.isMP3()); assertEquals(256000, mp3.getBitRate()); assertEquals(48000, mp3.getSampleFrequency()); assertEquals(1, mp3.getSeconds()); } private void setID3WithoutGenreAndCount(ID3MetaData mp3) { mp3.setArtist("Artist"); mp3.setComment("Comment"); mp3.setAlbum("Album"); mp3.setTrack("Track"); mp3.setIndex(42); mp3.setYear(2001); } private void setID3(MP3File mp3) { setID3WithoutGenreAndCount(mp3); mp3.setGenre(new ID3Genre("Freestyle")); mp3.setCount(84); } private void checkID3WithoutGenreAndCommentAndCount(MP3File mp3) { assertEquals(768, ((MP3Properties) mp3.getProperties()).getFrameSize()); assertEquals(21, ((MP3Properties) mp3.getProperties()).getFrames()); checkMP3Properties(mp3); assertEquals("Artist", mp3.getArtist()); assertEquals("Album", mp3.getAlbum()); assertEquals("Track", mp3.getTrack()); assertEquals(42, mp3.getIndex()); assertEquals(2001, mp3.getYear()); } public void testMP3CleanerBasics() throws IOException { File src = new File(AbstractFileTest.PATH_TO_TEST_MP3_FILES + "noid3.mp3"); copyToTempFile(src); MP3File mp3 = new MP3File(); mp3.setID3v1(false); mp3.setID3v2(true); setID3(mp3); ID3v2Frame txxx = mp3.getHead().addID3v2Frame("TXXX"); txxx.setText("\u0000musicbrainz Whatsoever"); ID3v2Frame priv = mp3.getHead().addID3v2Frame("PRIV"); priv.setBytes("WM/Whatsoever".getBytes()); mp3.write(tempFile); File dest = new File(tempFile.getParentFile(), "writeToBeCleaned.mp3"); tempFile.renameTo(dest); tempFile = dest; mp3 = new MP3File(); mp3.read(tempFile); MP3Cleaner cleaner = new MP3Cleaner(); cleaner.removeMusicBrainzTags(mp3); cleaner.removeWindowsMediaPlayerTags(mp3); cleaner.removeRedundantTags(mp3); mp3.write(); mp3 = new MP3File(); mp3.read(tempFile); checkID3WithoutGenreAndCommentAndCount(mp3); assertEquals(false, mp3.isID3v1()); assertEquals(false, mp3.isID3v1dot1()); assertEquals(true, mp3.isID3v2()); txxx = mp3.getHead().getFrame("TXXX"); assertNull(txxx); priv = mp3.getHead().getFrame("PRIV"); assertNull(priv); ID3v2Frame comm = mp3.getHead().getFrame("COMM"); assertNull(comm); } public void testMP3ExtenderBasics() throws Exception { File src = new File(AbstractFileTest.PATH_TO_TEST_MP3_FILES + "noid3.mp3"); copyToTempFile(src); MP3File mp3 = new MP3File(); mp3.setID3v1(false); mp3.setID3v2(true); setID3(mp3); mp3.write(tempFile); File dest = new File(tempFile.getParentFile(), "writeToBeExtended.mp3"); tempFile.renameTo(dest); tempFile = dest; mp3 = new MP3File(); mp3.read(tempFile); byte[] pictureData = URLLoader.getContents(new File(AbstractFileTest.PATH_TO_TEST_IMAGE_FILES + "dontpanic.gif")); CoverDBCache coverDBCache = new CoverDBCache(); coverDBCache.setCacheDirectoryName(tempFile.getParentFile().getAbsolutePath()); coverDBCache.storeCover("Artist", "Album", pictureData); assertTrue(Arrays.equals(pictureData, coverDBCache.peekCover("Artist", "Album"))); String textData = new String(URLLoader.getContents(new File(AbstractFileTest.PATH_TO_TEST_TEXT_FILES + "samplelyrics.txt"))); LyricsDBCache lyricsDBCache = new LyricsDBCache(); lyricsDBCache.setCacheDirectoryName(tempFile.getParentFile().getAbsolutePath()); lyricsDBCache.storeLyrics("Artist", "Track", textData); assertEquals(textData, lyricsDBCache.peekLyrics("Artist", "Track")); MP3Extender extender = new MP3Extender(); extender.setCoverDirectoryName(tempFile.getParentFile().getAbsolutePath()); extender.setLyricsDirectoryName(tempFile.getParentFile().getAbsolutePath()); extender.addCover(mp3); extender.addLyrics(mp3); extender.addMusicBrainzId(mp3); mp3.write(); mp3 = new MP3File(); mp3.read(tempFile); checkID3WithoutGenreAndCommentAndCount(mp3); assertEquals(false, mp3.isID3v1()); assertEquals(false, mp3.isID3v1dot1()); assertEquals(true, mp3.isID3v2()); ID3v2Frame apic = mp3.getHead().getFrame("APIC"); assertNotNull(apic); assertEquals("image/gif", apic.findSection(MimeTypeSection.class).getMimeType().toString()); assertEquals("cover", apic.findSection(DescriptionSection.class).getDescription()); assertEquals(0x03, apic.findSection(PictureTypeSection.class).getPictureType().getCode()); assertTrue(Arrays.equals(pictureData, apic.getByteContent())); ID3v2Frame uslt = mp3.getHead().getFrame("USLT"); assertNotNull(uslt); assertEquals("English", uslt.findSection(LanguageSection.class).getLanguage()); assertEquals("Lyrics from http://www.lyrc.com.ar", uslt.findSection(DescriptionSection.class).getDescription()); assertEquals(textData, uslt.getTextContent()); if (TRM.isSupported()) { ID3v2Frame ufid = mp3.getHead().getFrame("UFID"); assertNotNull(ufid); } coverDBCache.removeCover("Artist", "Album"); assertNull(coverDBCache.peekCover("Artist", "Album")); lyricsDBCache.removeLyrics("Artist", "Track"); assertNull(lyricsDBCache.peekLyrics("Artist", "Track")); } }