diff --git a/pom.xml b/pom.xml
index bf53127..10ed6f8 100644
--- a/pom.xml
+++ b/pom.xml
@@ -38,8 +38,8 @@
maven-compiler-plugin
2.3.2
- 1.8
- 1.8
+ 8
+ 8
diff --git a/src/main/java/org/forkalsrud/album/exif/DirectoryEntry.java b/src/main/java/org/forkalsrud/album/exif/DirectoryEntry.java
index 47cd769..1a1ef9b 100644
--- a/src/main/java/org/forkalsrud/album/exif/DirectoryEntry.java
+++ b/src/main/java/org/forkalsrud/album/exif/DirectoryEntry.java
@@ -36,6 +36,7 @@ public class DirectoryEntry extends EntryWithChildren {
boolean childrenLoaded = false;
Comparator sort = null;
Date earliest = null;
+ boolean groupByYear;
public DirectoryEntry(ServiceApi api, File file) {
super(file);
@@ -197,6 +198,7 @@ public class DirectoryEntry extends EntryWithChildren {
}
}
this.earliest = oldest;
+ this.groupByYear = "year".equalsIgnoreCase(props.getProperty("group"));
if (thumbnail == null && !children.isEmpty()) {
setThumbnail(children.get(0).getThumbnail());
}
@@ -212,7 +214,7 @@ public class DirectoryEntry extends EntryWithChildren {
@Override
public boolean groupByYear() {
- return parent == null;
+ return this.groupByYear;
}
diff --git a/src/main/java/org/forkalsrud/album/exif/DirectoryEntryFactory.java b/src/main/java/org/forkalsrud/album/exif/DirectoryEntryFactory.java
index 3821d25..6c1e862 100644
--- a/src/main/java/org/forkalsrud/album/exif/DirectoryEntryFactory.java
+++ b/src/main/java/org/forkalsrud/album/exif/DirectoryEntryFactory.java
@@ -1,18 +1,20 @@
package org.forkalsrud.album.exif;
import java.io.File;
+import java.io.IOException;
import org.forkalsrud.album.db.DirectoryDatabase;
-import org.forkalsrud.album.video.MovieCoder;
+import org.forkalsrud.album.video.MovieMetadataGenerator;
public class DirectoryEntryFactory implements DirectoryEntry.ServiceApi {
private DirectoryDatabase dirDb;
private DirectoryMetadataGenerator generator;
+ private MovieMetadataGenerator movieGenerator;
- public DirectoryEntryFactory(DirectoryDatabase dirDb, MovieCoder movieCoder) {
+ public DirectoryEntryFactory(DirectoryDatabase dirDb) throws IOException, InterruptedException {
this.dirDb = dirDb;
- this.generator = new DirectoryMetadataGenerator(movieCoder);
+ this.generator = new DirectoryMetadataGenerator(new MovieMetadataGenerator());
}
diff --git a/src/main/java/org/forkalsrud/album/exif/DirectoryMetadataGenerator.java b/src/main/java/org/forkalsrud/album/exif/DirectoryMetadataGenerator.java
index 262fffd..13397ce 100644
--- a/src/main/java/org/forkalsrud/album/exif/DirectoryMetadataGenerator.java
+++ b/src/main/java/org/forkalsrud/album/exif/DirectoryMetadataGenerator.java
@@ -19,13 +19,11 @@ import javax.imageio.stream.ImageInputStream;
import com.drew.imaging.ImageMetadataReader;
import com.drew.imaging.ImageProcessingException;
-import com.drew.imaging.jpeg.JpegProcessingException;
import org.forkalsrud.album.db.DirectoryProps;
-import org.forkalsrud.album.video.MovieCoder;
+import org.forkalsrud.album.video.MovieMetadataGenerator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import com.drew.imaging.jpeg.JpegMetadataReader;
import com.drew.metadata.Directory;
import com.drew.metadata.Metadata;
import com.drew.metadata.MetadataException;
@@ -39,10 +37,10 @@ public class DirectoryMetadataGenerator {
final static String CACHE_FILE = "cache.properties";
final static String OVERRIDE_FILE = "album.properties";
- MovieCoder movieCoder;
+ MovieMetadataGenerator movieMetadataGenerator;
- public DirectoryMetadataGenerator(MovieCoder movieCoder) {
- this.movieCoder = movieCoder;
+ public DirectoryMetadataGenerator(MovieMetadataGenerator generator) {
+ this.movieMetadataGenerator = generator;
}
@@ -91,7 +89,7 @@ public class DirectoryMetadataGenerator {
addPropsForFile(props, f, p);
}
} else if (name.endsWith(".mov") || name.endsWith(".MOV") || name.endsWith(".mp4") || name.endsWith(".m4v") || name.endsWith(".avi")) {
- Map p = movieCoder.generateVideoProperties(f);
+ Map p = movieMetadataGenerator.generateVideoProperties(f);
addPropsForFile(props, f, p);
}
}
diff --git a/src/main/java/org/forkalsrud/album/exif/SearchEngine.java b/src/main/java/org/forkalsrud/album/exif/SearchEngine.java
index 93224c5..0c23144 100644
--- a/src/main/java/org/forkalsrud/album/exif/SearchEngine.java
+++ b/src/main/java/org/forkalsrud/album/exif/SearchEngine.java
@@ -1,7 +1,6 @@
package org.forkalsrud.album.exif;
import java.io.File;
-import java.nio.file.Path;
import java.util.LinkedList;
public class SearchEngine {
diff --git a/src/main/java/org/forkalsrud/album/exif/SearchResults.java b/src/main/java/org/forkalsrud/album/exif/SearchResults.java
index a9d910f..3f5219d 100644
--- a/src/main/java/org/forkalsrud/album/exif/SearchResults.java
+++ b/src/main/java/org/forkalsrud/album/exif/SearchResults.java
@@ -21,6 +21,9 @@ public class SearchResults extends EntryWithChildren {
protected SearchResults(DirectoryEntry root) {
super(root);
+ this.next = root.next;
+ this.prev = root.prev;
+ this.parent = root.parent;
}
public void addMatch(Entry entry) {
diff --git a/src/main/java/org/forkalsrud/album/video/MovieCoder.java b/src/main/java/org/forkalsrud/album/video/MovieCoder.java
index fe5d0df..890b1b5 100644
--- a/src/main/java/org/forkalsrud/album/video/MovieCoder.java
+++ b/src/main/java/org/forkalsrud/album/video/MovieCoder.java
@@ -6,15 +6,10 @@ import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.LineNumberReader;
import java.io.OutputStream;
-import java.text.SimpleDateFormat;
import java.util.ArrayList;
-import java.util.Date;
import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
import org.apache.commons.io.IOUtils;
-import com.fasterxml.jackson.databind.ObjectMapper;
import org.forkalsrud.album.db.Chunk;
import org.forkalsrud.album.db.MovieDatabase;
import org.forkalsrud.album.exif.Dimension;
@@ -28,14 +23,11 @@ public class MovieCoder {
private String ffmpegExecutable;
private String mplayerExecutable;
- private String exiftoolExecutable;
private PictureScaler pictureScaler;
- private MovieDatabase movieDb;
private HashMap currentEncodings = new HashMap();
- public MovieCoder(PictureScaler pictureScaler, MovieDatabase movieDb) {
+ public MovieCoder(PictureScaler pictureScaler) {
this.pictureScaler = pictureScaler;
- this.movieDb = movieDb;
}
public void init() throws Exception {
@@ -45,175 +37,6 @@ public class MovieCoder {
this.ffmpegExecutable = util.findExecutableInShellPath("ffmpeg");
}
this.mplayerExecutable = util.findExecutableInShellPath("mplayer");
- this.exiftoolExecutable = util.findExecutableInShellPath("exiftool");
- }
-
-
-
-
- /**
- *
- * @param f the movie file
- * @return a map with the following keys: orientation dimensions captureDate comment etag
- * @throws IOException
- * @throws InterruptedException
- */
- public Map generateVideoProperties(File f) throws IOException, InterruptedException {
-
- /*
- * [{
- "SourceFile": "/home/erik/local/IMG_0837.mov",
- "ExifToolVersion": 9.12,
- "FileName": "IMG_0837.mov",
- "Directory": "/home/erik/local",
- "FileSize": "1438 kB",
- "FileModifyDate": "2013:01:19 18:36:53-08:00",
- "FileAccessDate": "2013:01:19 18:36:57-08:00",
- "FileInodeChangeDate": "2013:01:19 18:36:53-08:00",
- "FilePermissions": "rw-rw-r--",
- "FileType": "MOV",
- "MIMEType": "video/quicktime",
- "MajorBrand": "Apple QuickTime (.MOV/QT)",
- "MinorVersion": "0.0.0",
- "CompatibleBrands": ["qt "],
- "MovieDataSize": 1467141,
- "MovieHeaderVersion": 0,
- "ModifyDate": "2012:12:30 06:44:31",
- "TimeScale": 600,
- "Duration": "9.07 s",
- "PreferredRate": 1,
- "PreferredVolume": "100.00%",
- "PreviewTime": "0 s",
- "PreviewDuration": "0 s",
- "PosterTime": "0 s",
- "SelectionTime": "0 s",
- "SelectionDuration": "0 s",
- "CurrentTime": "0 s",
- "NextTrackID": 3,
- "TrackHeaderVersion": 0,
- "TrackCreateDate": "2012:12:30 06:44:26",
- "TrackModifyDate": "2012:12:30 06:44:31",
- "TrackID": 1,
- "TrackDuration": "9.05 s",
- "TrackLayer": 0,
- "TrackVolume": "100.00%",
- "Balance": 0,
- "AudioChannels": 1,
- "AudioBitsPerSample": 16,
- "AudioSampleRate": 44100,
- "AudioFormat": "chan",
- "MatrixStructure": "0 1 0 -1 0 0 540 0 1",
- "ImageWidth": 960,
- "ImageHeight": 540,
- "CleanApertureDimensions": "960x540",
- "ProductionApertureDimensions": "960x540",
- "EncodedPixelsDimensions": "960x540",
- "MediaHeaderVersion": 0,
- "MediaCreateDate": "2012:12:30 06:44:26",
- "MediaModifyDate": "2012:12:30 06:44:31",
- "MediaTimeScale": 600,
- "MediaDuration": "9.10 s",
- "MediaLanguageCode": "und",
- "GraphicsMode": "ditherCopy",
- "OpColor": "32768 32768 32768",
- "HandlerClass": "Data Handler",
- "HandlerVendorID": "Apple",
- "HandlerDescription": "Core Media Data Handler",
- "CompressorID": "avc1",
- "SourceImageWidth": 960,
- "SourceImageHeight": 540,
- "XResolution": 72,
- "YResolution": 72,
- "CompressorName": "H.264",
- "BitDepth": 24,
- "VideoFrameRate": 30,
- "CameraIdentifier": "Back",
- "FrameReadoutTime": "28512 microseconds",
- "Make": "Apple",
- "SoftwareVersion": "6.0.1",
- "CreateDate": "2012:12:29 16:30:21-08:00",
- "Model": "iPhone 4S",
- "HandlerType": "Metadata Tags",
- "Make-und-US": "Apple",
- "CreationDate-und-US": "2012:12:29 16:30:21-08:00",
- "Software-und-US": "6.0.1",
- "Model-und-US": "iPhone 4S",
- "AvgBitrate": "1.29 Mbps",
- "ImageSize": "960x540",
- "Rotation": 90
-}]
- */
- Map props = new HashMap();
- ProcessBuilder pb = new ProcessBuilder().command(
- this.exiftoolExecutable, "-j", f.getAbsolutePath());
- pb.redirectErrorStream(false);
- Process p = pb.start();
- p.getOutputStream().close();
-
- ObjectMapper mapper = new ObjectMapper(); // can reuse, share globally
- @SuppressWarnings("unchecked")
- List