Update of /cvsroot/jigs/jigs/src/edu/whitman/halfway/jigs/cmdline In directory sc8-pr-cvs6.sourceforge.net:/tmp/cvs-serv14998/src/edu/whitman/halfway/jigs/cmdline Added Files: CopyOrig.java ExplicitAlbumCopy.java FindBadAlbums.java LowercaseCategories.java WriteCategoriesToExif.java Log Message: more good stuffcvs up -d --- NEW FILE: CopyOrig.java --- package edu.whitman.halfway.jigs.cmdline; import edu.whitman.halfway.jigs.*; import edu.whitman.halfway.util.*; // import gnu.getopt.Getopt; import java.util.Iterator; import org.apache.log4j.Logger; import java.io.File; public class CopyOrig extends AbstractCmdLine { protected static Logger log = Logger.getLogger(CategoryList.class); static int[] opts = { RECURSE_ALBUM, LOG4J_FILE, RECURSIVE, HELP }; public CopyOrig() { super(opts); } public String getAdditionalParseArgs() { return "O"; } protected int getDesiredNumArgs(){ return 1; } public static void main(String[] args) { (new CopyOrig()).mainDriver(args); } public void doMain() { CategorySet cats = new CategorySet(); Album album = getAlbum(); assert album.getAlbumHierarchy().getImageSource() == null; final File outputDir = new File(argsLeft[0]); if(!outputDir.exists()){ outputDir.mkdirs(); } System.out.println("Beginning to copy."); AlbumUtil.mediaItemWalk (album, new MediaItemFunction(){ public void process(MediaItem item){ if(item instanceof Picture){ Picture pic = (Picture)item; String path = pic.getMediaKey().getString(); File mediaFile = new File(path); if (! (mediaFile.exists() && mediaFile.isFile())){ log.error("Not copying invalid media key: " + mediaFile); }else{ String[] split = FileUtil.splitFileToArray(path); int n = split.length; String name = (n >= 2 ? StringUtil.stripLeadingNumsUnderscore(split[n-2]) + "_" + split[n-1] : split[n-1]); File target = new File(outputDir, name); //System.out.println("Copying " + mediaFile +"\n\t to " + target); if(!target.exists()){ FileUtil.copy(mediaFile, target); } //See if orig exists. if(hasOption('O')){ File origSource = new File(new File(mediaFile.getParentFile(), "orig"), mediaFile.getName()); if(origSource.isFile()){ // if(!hasOption("O")){ name = (n >= 2 ? StringUtil.stripLeadingNumsUnderscore(split[n-2]) + "_" + FileUtil.insertBeforeExtension(split[n-1], "_orig") : FileUtil.insertBeforeExtension(split[n-1], "_orig")); //}else{ // name = FileUtil.insertBeforeExtension(split[n-1], "_orig"); //} File target2 = new File(outputDir, name); //System.out.println("Copying " + origSource +"\n\t to " + target2); if(!target2.exists()){ FileUtil.copy(origSource, target2); } }else{ //System.out.println(origSource + " is not a file."); } } } } } }, recurse); } protected void specificUsage() { System.out.println( "Usage: CopyOrig -d [album_directory] [destination_directory]" +StringUtil.newline //"\tdefault is to copy \"flat\", all files into one directory" + //+StringUtil.newline+ //"\tdefault is to copy orig w/ \"_orig\" suffix" + //+ StringUtil.newline + "[destination_directory]: directory where originals are copied." + StringUtil.newline //+ "-T: copy directories (e.g., make tree structure)." + StringUtil.newline + "-O: copy originals as well" + StringUtil.newline); } } --- NEW FILE: ExplicitAlbumCopy.java --- package edu.whitman.halfway.jigs.cmdline; import edu.whitman.halfway.jigs.*; import edu.whitman.halfway.util.*; // import gnu.getopt.Getopt; import java.util.Iterator; import org.apache.log4j.Logger; import java.io.File; public class ExplicitAlbumCopy extends AbstractCmdLine { protected static Logger log = Logger.getLogger(CategoryList.class); static int[] opts = { RECURSE_ALBUM, LOG4J_FILE, RECURSIVE, HELP }; public ExplicitAlbumCopy() { super(opts); } protected int getDesiredNumArgs(){ return 1; } //public String getAdditionalParseArgs() { // return "A"; //} public static void main(String[] args) { (new ExplicitAlbumCopy()).mainDriver(args); } public void doMain() { CategorySet cats = new CategorySet(); Album album = getAlbum(); assert album.getAlbumHierarchy().getImageSource() == null; File outputDir = new File(argsLeft[0]); if(!outputDir.exists()){ outputDir.mkdirs(); } copyAlbum(album, outputDir); } File currentDir = null; protected void copyAlbum(Album album, File newDir){ //if(album.getDepth() <= 2){ // System.out.println("Copying " + album + " to " + newDir); //} // copy album.txt if applicable AlbumDescriptionInfo info = album.getAlbumDescriptionInfo(); File newAlbumInfo = new File(newDir, "album.txt"); info.saveFile(newAlbumInfo); //XXX to save memory, ditch info here // includes for pictures MediaItem[] pics = album.getMediaItems(); StringBuffer includeFileString = new StringBuffer(); for(int i=0; i<pics.length; i++){ includeFileString.append("PictureInclude "); String path = pics[i].getMediaKey().getString(); File mediaFile = new File(path); if (! (mediaFile.exists() && mediaFile.isFile())){ log.error("Not including invalid media key: " + mediaFile); }else{ includeFileString.append(path).append(StringUtil.newline); } } //XXX to save memory, ditch mediaItems here File includeFile = new File(newDir, "includes.txt"); if(!FileUtil.writeStringToFile(includeFile, includeFileString.toString())){ exitError("Failled to write to " + includeFile); } includeFileString = null; Album[] subalbums = album.getSubAlbums(); if((subalbums != null) && subalbums.length > 0){ for(int i=0; i< subalbums.length; i++){ String name = subalbums[i].getName(); name = StringUtil.simpleReplace(name, " ", "_"); name = StringUtil.simpleReplace(name, "'", ""); name = StringUtil.simpleReplace(name, "\"", ""); name = StringUtil.simpleReplace(name, "\\", ""); name = StringUtil.simpleReplace(name, "/", ""); File subDir = new File(newDir, name); subDir.mkdir(); copyAlbum(subalbums[i], subDir); } } //can clean all info from this album here. album.refresh();//frees memory } protected void specificUsage() { System.out.println( "Usage: ExplicitAlbumCopy -d [album_directory] [destination_directory]" + StringUtil.newline + "[destination_directory]: directory where copy is made" + StringUtil.newline); } } --- NEW FILE: FindBadAlbums.java --- package edu.whitman.halfway.jigs.cmdline; import edu.whitman.halfway.jigs.*; import java.io.*; import edu.whitman.halfway.util.*; import org.apache.log4j.Logger; import java.util.*; import gnu.getopt.Getopt; import java.util.Iterator; public class FindBadAlbums extends AbstractCmdLine { protected static Logger log = Logger.getLogger(FindBadAlbums.class); static int[] opts = {LOG4J_FILE, HELP, RECURSE_ALBUM}; public FindBadAlbums(){ super(opts); } public String getAdditionalParseArgs(){ return ""; } public static void main(String[] args){ (new FindBadAlbums()).mainDriver(args); } public void doMain(){ List badAlbums = getBadAlbums(); Iterator iter = badAlbums.iterator(); while(iter.hasNext()){ Album alb = (Album) iter.next(); System.out.println(alb); } } public List getBadAlbums(){ Album crnt = getAlbum(); AlbumFilter filt = new BadAlbumFilter(); return FilterUtil.findAlbums(crnt, filt, true); } static class BadAlbumFilter implements AlbumFilter{ public boolean accept(AlbumObject obj){ Album alb = (Album) obj; if(alb.getPictures().length > 0 && alb.getSubAlbums().length >0){ return true; } return false; } public boolean hasOpinion(AlbumObject obj){ return accept(obj); } } protected void specificUsage(){ System.out.println("Usage: FindBadAlbums " + StringUtil.newline ); System.out.println("\t Finds albums that contain both subalbums and pictures."); } } --- NEW FILE: LowercaseCategories.java --- package edu.whitman.halfway.jigs.cmdline; import edu.whitman.halfway.jigs.*; import edu.whitman.halfway.util.*; // import gnu.getopt.Getopt; import java.util.Iterator; import org.apache.log4j.Logger; public class LowercaseCategories extends AbstractCmdLine { protected static Logger log = Logger.getLogger(LowercaseCategories.class); static int[] opts = { RECURSE_ALBUM, LOG4J_FILE, RECURSIVE, HELP }; public LowercaseCategories() { super(opts); } public static void main(String[] args) { (new LowercaseCategories()).mainDriver(args); } public void doMain() { AlbumUtil.mediaItemWalk (getAlbum(), new MediaItemFunction(){ public void process(MediaItem item){ if(item instanceof Picture){ Picture pic = (Picture)item; AlbumObjectDescriptionInfo aoi = pic.getDescriptionInfo(); CategorySet cs = (CategorySet)aoi .getData(AlbumObjectDescriptionInfo.JIGS_CATEGORY); cs.lowercaseAll(); aoi.saveFile(); } } }, recurse); } protected void specificUsage() { System.out.println( "Usage: LowercaseCategories [-r] "); } } --- NEW FILE: WriteCategoriesToExif.java --- package edu.whitman.halfway.jigs.cmdline; import edu.whitman.halfway.jigs.*; import edu.whitman.halfway.util.ExifWriter; import org.apache.log4j.Logger; import java.io.File; import java.util.Calendar; /** Actually, does more than just write Categories. Tries to map all JIGS metainformation into EXIF metainformation, in particular those fields that can be read by ACDSee. Jigs doesn't have a fixed set of possible metadata fields. The one's I know I have used are: "location", "derived.date", "derived.time", "event", "location", "people", "description", "desc ", "photographer" and, of course, jigs.category and jigs.rating When we insert "all" jigs metadata, some fields will be modified for easier searching in ACDSee: The mapping will be: Jigs EXIF ACDSEE Database --------------------------------------------------------- [everything] ImageDescription Notes photographer Artist Author categories UserComment categories and keywords description Copyright caption */ public class WriteCategoriesToExif extends AbstractCmdLine { protected static final String USER_COMMENT = "UserComment"; protected static final String IMAGE_DESCRIPTION = "ImageDescription"; protected static final String COPYRIGHT = "Copyright"; protected static final String ARTIST = "Artist"; protected static Logger log = Logger.getLogger(WriteCategoriesToExif.class); static int[] opts = {RECURSE_ALBUM, LIST_ALBUM, LOG4J_FILE, HELP, RECURSIVE}; public WriteCategoriesToExif(){ super(opts); } public String getAdditionalParseArgs(){ return ""; } public void doMain(){ final Category[] ratingCats = new Category[10]; for(int i=0; i<10; i++){ ratingCats[i] = new Category("jigs_rating_is_" + (i+1)); } AlbumUtil.mediaItemWalk (getAlbum(), new MediaItemFunction(){ int processed = 0; public void process(MediaItem item){ if(item instanceof Picture){ Picture pic = (Picture)item; AlbumObjectDescriptionInfo aoi = pic.getDescriptionInfo(); File file = pic.getMediaKey().getFile(); long lastMod = file.lastModified(); Calendar yesterday = Calendar.getInstance(); yesterday.set(2006,5,27,20,0); //6/27/2006 , 8pm long lastRun = yesterday.getTimeInMillis(); processed ++; //System.out.println("lastRun = " + lastRun + " " + yesterday.getTime()); //yesterday.setTimeInMillis(lastMod); //System.out.println("lastMod = " + lastMod + " " + yesterday.getTime()); if(lastMod <= lastRun){ File descFile = aoi.getFile(); if(descFile != null && descFile.exists()){ System.out.println(processed + "\t processing " + file); //CATEGORIES => USER COMMENT CategorySet cs = (CategorySet)aoi .getData(AlbumObjectDescriptionInfo.JIGS_CATEGORY); Rating rating = (Rating)aoi.getData(aoi.JIGS_RATING); if(rating.isRated()){ //System.out.println("Raw rating is " + rating.getValue()); int sr = (int)(Math.round(9.0*(rating.getValue() - rating.MIN_VALUE)/rating.MAX_VALUE)); assert sr>= 0 && sr <= 9; Category rCat = ratingCats[sr]; cs.addCategory(rCat); } String tagValue = cs.toString(); boolean noError = true; noError &= ExifWriter.writeTag(USER_COMMENT, tagValue, file, false); //JIGS description file => IMAGE_DESCRIPTION noError &= ExifWriter.writeTagFromFile(IMAGE_DESCRIPTION, descFile, file); tagValue = (String)aoi.getData("photographer"); if(tagValue != null){ noError &= ExifWriter.writeTag(ARTIST, tagValue, file, false); } String title = (String)aoi.getData("title"); String desc = (String)aoi.getData("description"); String desc2 = (String)aoi.getData("desc"); if(title!= null || desc != null || desc2 != null){ tagValue = ((title != null) ? title : "") + ((desc != null) ? " " + desc : "") + ((desc2 != null) ? " " + desc2 : ""); noError &= ExifWriter.writeTag(COPYRIGHT, tagValue, file, false); } if(!noError){ log.error("Failed to write EXIF tag for " + file); //throw new JigsException("Exif Tag writing failed."); } }else{ System.out.println(processed + "\t skipping " + file); } }else{ System.out.println(processed + "\t already modified " + file); } } } }, recurse); } public static void main(String[] args){ (new WriteCategoriesToExif()).mainDriver(args); } protected void specificUsage(){ System.out.println(" usage: WriteCategoriesToExif [options] [file or album list]"); System.out.println("Writes categories to the UserComment EXIF field in the original image."); } } |