package comeon.core.mediareaders; import com.drew.lang.GeoLocation; import com.drew.metadata.exif.ExifSubIFDDescriptor; import com.drew.metadata.exif.ExifSubIFDDirectory; import com.google.common.base.Charsets; import com.google.common.collect.Sets; import com.google.common.io.Files; import com.google.common.io.Resources; import comeon.core.MediaUploadBatch; import comeon.core.extmetadata.NullMetadataSource; import comeon.model.Media; import comeon.model.Template; import comeon.model.processors.GpsPreProcessor; import comeon.model.processors.IptcPreProcessor; import org.apache.commons.beanutils.PropertyUtils; import org.junit.Assert; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; import org.mockito.Mockito; import java.io.File; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.util.Map; import java.util.Set; /** * IPTC Keywords are limited to 64 bytes. Too bad ! * * @author Édouard Hue */ public class MediaTest { private static final String SHORT_CAT_NAME = "Category:Women facing right and looking right"; private static final String LONG_CAT_NAME_2 = "Category:Annual general meeting of Wikimédia France in October 2013"; private static final String LONG_CAT_NAME_1 = "Category:21st-century black and white portrait photographs of women at bust length"; @Rule public TemporaryFolder temp = new TemporaryFolder(); private Media longCategoryTitles, sample; @Before public void createReader() throws IOException, MediaReaderException { final Template mockTemplate = Mockito.mock(Template.class); Mockito.when(mockTemplate.getTemplateText()).thenReturn(""); final MediaUploadBatch batch = new MediaUploadBatch(new File[0], mockTemplate, Sets.newHashSet(new IptcPreProcessor(), new GpsPreProcessor()), new NullMetadataSource()); this.longCategoryTitles = read("long-category-titles.jpg", batch); this.sample = read("sample.jpg", batch); } private Media read(final String resource, final MediaUploadBatch batch) throws IOException, MediaReaderException { final File file = temp.newFile(); Resources.asByteSource(Resources.getResource(resource)).copyTo(Files.asByteSink(file)); final PictureReader reader = new PictureReader(file, null); return reader.buildMedia(batch); } @Test public void testReadLongCategoryTitles() { Assert.assertTrue(longCategoryTitles.getMetadata().containsKey(IptcPreProcessor.KEYWORDS)); final Set<String> keywords = Sets.newHashSet((String[]) longCategoryTitles.getMetadata().get(IptcPreProcessor.KEYWORDS)); Assert.assertFalse(keywords.contains(LONG_CAT_NAME_1)); Assert.assertTrue(keywords.contains(new String(LONG_CAT_NAME_1.getBytes(Charsets.UTF_8), 0, 64, Charsets.UTF_8))); Assert.assertFalse(keywords.contains(LONG_CAT_NAME_2)); Assert.assertTrue(keywords.contains(new String(LONG_CAT_NAME_2.getBytes(Charsets.UTF_8), 0, 64, Charsets.UTF_8))); Assert.assertTrue(keywords.contains(SHORT_CAT_NAME)); } @Test public void testSample() throws IllegalAccessException, NoSuchMethodException, InvocationTargetException { final Map<String, Object> metadata = sample.getMetadata(); Assert.assertNotNull(metadata.get(IptcPreProcessor.KEYWORDS)); Assert.assertEquals("2016-09-24 16:11:00", metadata.get(IptcPreProcessor.DATE)); Assert.assertEquals(new GeoLocation(48d, 2d), metadata.get(GpsPreProcessor.GEOLOCATION)); Assert.assertEquals("Commentaire utilisateur", PropertyUtils.getProperty(metadata.get("ExifSubIFD"), "UserComment")); Assert.assertEquals("20mm", PropertyUtils.getProperty(metadata.get("ExifSubIFD"), "LensModel")); Assert.assertEquals("0000000000", PropertyUtils.getProperty(metadata.get("ExifSubIFD"), "LensSerialNumber")); Assert.assertEquals("Description", PropertyUtils.getProperty(metadata.get("ExifIFD0"), "ImageDescription")); Assert.assertEquals("Canon", PropertyUtils.getProperty(metadata.get("ExifIFD0"), "Make")); Assert.assertEquals("Canon EOS 60D", PropertyUtils.getProperty(metadata.get("ExifIFD0"), "Model")); Assert.assertEquals("Édouard Hue", PropertyUtils.getProperty(metadata.get("ExifIFD0"), "Artist")); Assert.assertEquals("Édouard Hue", PropertyUtils.getProperty(metadata.get("ExifIFD0"), "Copyright")); Assert.assertEquals("Titre", PropertyUtils.getProperty(metadata.get("Iptc"), "ObjectName")); Assert.assertEquals("Édouard Hue", PropertyUtils.getProperty(metadata.get("Iptc"), "Byline")); Assert.assertEquals("Q1", PropertyUtils.getProperty(metadata.get("Iptc"), "Sublocation")); Assert.assertEquals("Édouard Hue", PropertyUtils.getProperty(metadata.get("Iptc"), "CopyrightNotice")); Assert.assertEquals("Description", PropertyUtils.getProperty(metadata.get("Iptc"), "CaptionAbstract")); Assert.assertEquals("20mm", PropertyUtils.getProperty(metadata.get("Xmp"), "Lens")); Assert.assertEquals("1280614195", PropertyUtils.getProperty(metadata.get("Xmp"), "SerialNumber")); Assert.assertEquals("https://creativecommons.org/licenses/by-sa/4.0/", PropertyUtils.getProperty(metadata.get("Photoshop"), "URL")); } }