package com.evanhoffman.fileorganizer; import java.io.File; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import com.drew.imaging.jpeg.JpegMetadataReader; import com.drew.imaging.jpeg.JpegProcessingException; import com.drew.metadata.Directory; import com.drew.metadata.Metadata; import com.drew.metadata.MetadataException; import com.drew.metadata.exif.ExifDirectory; /** * Moves JPEGs from their source directory to a directory based on their * EXIF creation dates. * @author Evan Hoffman * @since 2007-03-28 */ public class JpegFileOrganizer extends FileOrganizer { static String jpegExtensions[] = { ".jpg" , ".jpeg", ".jpe" }; static DateFormat df = new SimpleDateFormat("yyyy/MM/dd"); private File targetDir = null; public JpegFileOrganizer(File sourceDir, File targetDir, boolean recurse) { super(sourceDir, recurse); this.targetDir = targetDir; } /** * @see http://www.drewnoakes.com/code/exif/sampleUsage.html */ @Override protected File getTargetDirForFile(File f) { try { Metadata metadata = JpegMetadataReader.readMetadata(f); // Iterator directories = metadata.getDirectoryIterator(); // while (directories.hasNext()) { // Directory directory = (Directory)directories.next(); // // iterate through tags and print to System.out // Iterator tags = directory.getTagIterator(); // while (tags.hasNext()) { // Tag tag = (Tag)tags.next(); // // use Tag.toString() // System.out.println(tag); // } // } // JpegSegmentReader segmentReader = new JpegSegmentReader(f); // byte[] exifSegment = segmentReader.readSegment(JpegSegmentReader.SEGMENT_APP1); // byte[] iptcSegment = segmentReader.readSegment(JpegSegmentReader.SEGMENT_APPD); // Metadata metadata = new Metadata(); // new ExifReader(exifSegment).extract(metadata); // new IptcReader(iptcSegment).extract(metadata); Directory exifDirectory = metadata.getDirectory(ExifDirectory.class); // String cameraMake = exifDirectory.getString(ExifDirectory.TAG_MAKE); // String cameraModel = exifDirectory.getString(ExifDirectory.TAG_MODEL); Date date = null; if (exifDirectory.containsTag(ExifDirectory.TAG_DATETIME)) { date = exifDirectory.getDate(ExifDirectory.TAG_DATETIME); } Date dateDigitized = null; if (exifDirectory.containsTag(ExifDirectory.TAG_DATETIME_DIGITIZED)) { dateDigitized = exifDirectory.getDate(ExifDirectory.TAG_DATETIME_DIGITIZED); } Date dateOriginal = null; if (exifDirectory.containsTag(ExifDirectory.TAG_DATETIME_ORIGINAL)) { exifDirectory.getDate(ExifDirectory.TAG_DATETIME_ORIGINAL); } String path = getPathFromDate(date,dateDigitized,dateOriginal); if (path != null) { return new File(targetDir,path); } else { return null; } } catch (JpegProcessingException je) { // throw new RuntimeException(je); logger.severe(je.getMessage()); return null; } catch (MetadataException me) { logger.severe(me.getMessage()); return null; // throw new RuntimeException(me); } } static String getPathFromDate(Date d1, Date d2, Date d3) { if (d1 != null) { return df.format(d1); } if (d2 != null) { return df.format(d2); } if (d3 != null) { return df.format(d3); } return null; // throw new NullPointerException("All 3 dates were null"); } @Override protected boolean accept(File f) { for (String ext : jpegExtensions) { if (f.getName().toLowerCase().endsWith(ext)) { return true; } } return false; } public static void main(String args[]) { int sourceDir = 0, targetDir = 1; JpegFileOrganizer jo = new JpegFileOrganizer(new File(args[sourceDir]), new File(args[targetDir]),true); jo.run(); } }