package photato.core.metadata.exif;
import com.google.gson.annotations.SerializedName;
import photato.helpers.SafeSimpleDateFormat;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import photato.helpers.ArrayHelper;
public class ExifMetadata {
private static final SafeSimpleDateFormat DATE_FORMAT = new SafeSimpleDateFormat("yyyy:MM:dd HH:mm:ss");
@SerializedName("MIMEType")
private String mimeType;
@SerializedName("SourceFile")
private String sourceFile;
@SerializedName("RegionPersonDisplayName")
private Object regionPersonDisplayName;
@SerializedName("PersonInImage")
private Object personInImage;
@SerializedName("Title")
private String title;
@SerializedName("Subject")
private Object subject;
@SerializedName("CreateDate")
private String createDate;
@SerializedName("ModifyDate")
private String modifyDate;
@SerializedName("FileCreateDate")
private String createDate2;
@SerializedName("FileModifyDate")
private String modifyDate2;
@SerializedName("ImageWidth")
private String imageWidth;
@SerializedName("ImageHeight")
private String imageHeight;
@SerializedName("LocationCreatedCity")
private String locationCreatedCity;
@SerializedName("LocationCreatedProvinceState")
private String locationCreatedProvinceState;
@SerializedName("LocationCreatedCountryName")
private String locationCreatedCountryName;
@SerializedName("GPSPosition")
private String GPSPosition;
@SerializedName("Orientation")
private String orientation;
@SerializedName("Rotation")
private String rotation;
public String getSourceFile() {
return sourceFile;
}
public String[] getPersons() {
String[] p1 = getStringArrayFromField(this.regionPersonDisplayName);
String[] p2 = getStringArrayFromField(this.personInImage);
return ArrayHelper.concatenate(p1, p2);
}
public String[] getTags() {
return getStringArrayFromField(this.subject);
}
public String getTitle() {
return this.title;
}
public int getImageWidth() {
int rotationId = this.getRotationId();
if (rotationId < 5) {
return Integer.parseInt(this.imageWidth);
} else {
return Integer.parseInt(this.imageHeight);
}
}
public int getImageHeight() {
int rotationId = this.getRotationId();
if (rotationId < 5) {
return Integer.parseInt(this.imageHeight);
} else {
return Integer.parseInt(this.imageWidth);
}
}
public String getGPSPositionString() {
return this.GPSPosition;
}
public String getHardcodedPosition() {
List<String> elmts = new ArrayList<>();
elmts.add(this.locationCreatedCity);
elmts.add(this.locationCreatedProvinceState);
elmts.add(this.locationCreatedCountryName);
String res = elmts.stream().filter(e -> e != null).map(e -> e.trim()).collect(Collectors.joining(", "));
if (res == null || res.trim().isEmpty()) {
return null;
} else {
return res;
}
}
public int getRotationId() {
int rotationId = 1;
int orientationId = 1;
if (this.rotation != null) {
switch (this.rotation) {
case "0":
case "Horizontal":
rotationId = 1;
break;
case "180":
case "-180":
rotationId = 3;
break;
case "90":
case "-90":
case "Vertical":
rotationId = 6;
break;
case "270":
case "-270":
rotationId = 8;
break;
default:
rotationId = 1;
break;
}
}
if (this.orientation != null) {
switch (this.orientation) {
case "Horizontal (normal)":
orientationId = 1;
break;
case "Mirror horizontal":
orientationId = 2;
break;
case "Rotate 180":
orientationId = 3;
break;
case "Mirror vertical":
orientationId = 4;
break;
case "Mirror horizontal and rotate 270 CW":
orientationId = 5;
break;
case "Rotate 90 CW":
orientationId = 6;
break;
case "Mirror horizontal and rotate 90 CW":
orientationId = 7;
break;
case "Rotate 270 CW":
orientationId = 8;
break;
default:
orientationId = 1;
break;
}
}
return this.isVideo() ? Math.max(rotationId, orientationId) : orientationId;
}
public long getPictureDate() {
if (this.createDate != null) {
try {
return DATE_FORMAT.parse(this.createDate).getTime();
} catch (ParseException ex) {
}
}
if (this.modifyDate != null) {
try {
return DATE_FORMAT.parse(this.modifyDate).getTime();
} catch (ParseException ex) {
}
}
if (this.createDate2 != null) {
try {
return DATE_FORMAT.parse(this.createDate2).getTime();
} catch (ParseException ex) {
}
}
if (this.modifyDate2 != null) {
try {
return DATE_FORMAT.parse(this.modifyDate2).getTime();
} catch (ParseException ex) {
}
}
return 0;
}
private static String[] getStringArrayFromField(Object field) {
if (field == null) {
return null;
} else if (field instanceof String[]) {
return (String[]) field;
} else if (field instanceof List) {
return (String[]) ((List) field).stream().map((o) -> o.toString()).toArray(String[]::new);
} else if (field instanceof String) {
return new String[]{(String) field};
} else {
throw new IllegalArgumentException();
}
}
private boolean isVideo() {
return this.mimeType != null && this.mimeType.toLowerCase().startsWith("video/");
}
}