Skip to content

Instantly share code, notes, and snippets.

@steinarb
Created October 25, 2023 17:46
Show Gist options
  • Save steinarb/251e02cda3de13c9cc2845a2c9020f4a to your computer and use it in GitHub Desktop.
Save steinarb/251e02cda3de13c9cc2845a2c9020f4a to your computer and use it in GitHub Desktop.
File downloadImageUrlToTempFile(AlbumEntry albumEntry, Path tempDir) {
var imageUrl = albumEntry.getImageUrl();
if (imageUrl == null || imageUrl.isEmpty()) {
throw new OldAlbumException(String.format("Unable to download album entry matching id=%d, imageUrl is missing", albumEntry.getId()));
}
var fileName = findFileNamePartOfUrl(imageUrl);
var tempfile = tempDir.resolve(fileName).toFile();
IIOImage image = null;
ImageWriter writer = null;
try {
HttpURLConnection connection = getConnectionFactory().connect(imageUrl);
connection.setRequestMethod("GET");
try(var inputStream = ImageIO.createImageInputStream(connection.getInputStream())) {
var readers = ImageIO.getImageReaders(inputStream);
if (readers.hasNext()) {
var reader = readers.next();
writer = ImageIO.getImageWriter(reader);
reader.setInput(inputStream);
image = reader.readAll(0, null);
}
}
} catch (IOException e) {
throw new OldAlbumException(String.format("Unable to download album entry matching id=%d from url=\"%s\"", albumEntry.getId(), albumEntry.getImageUrl()), e);
}
var metadata = image.getMetadata();
var metadataAsTree = (IIOMetadataNode) metadata.getAsTree("javax_imageio_jpeg_image_1.0");
findJfifCommentNode(metadataAsTree)
.ifPresent(node -> node.setAttribute("value", albumEntry.getDescription()));
Collection<Entry> entries = new ArrayList<>();
var exifDateTimeFormat = new SimpleDateFormat("yyyy:MM:dd hh:mm:ss");
exifDateTimeFormat.setTimeZone(TimeZone.getTimeZone("Europe/Oslo"));
var datetime = exifDateTimeFormat.format(albumEntry.getLastModified());
entries.add(new TIFFEntry(TIFF.TAG_DATE_TIME, datetime));
var markerSequence = (IIOMetadataNode) metadataAsTree.getElementsByTagName("markerSequence").item(0);
if (markerSequence == null) {
markerSequence = new IIOMetadataNode("markerSequence");
metadataAsTree.appendChild(markerSequence);
}
try (var bytes = new ByteArrayOutputStream()) {
bytes.write("Exif".getBytes(StandardCharsets.US_ASCII));
bytes.write(new byte[2]);
new TIFFWriter().write(entries, new MemoryCacheImageOutputStream(bytes));
IIOMetadataNode exif = new IIOMetadataNode("unknown");
exif.setAttribute("MarkerTag", String.valueOf(0xE1)); // APP1 or "225"
exif.setUserObject(bytes.toByteArray());
markerSequence.appendChild(exif);
} catch (IOException e) {
throw new OldAlbumException(String.format("Failed to create EXIF structure when saving local copy of album entry matching id=%d from url=\"%s\"", albumEntry.getId(), albumEntry.getImageUrl()), e);
}
try (var outputStream = ImageIO.createImageOutputStream(new FileOutputStream(tempfile))){
writer.setOutput(outputStream);
var param = writer.getDefaultWriteParam();
var modifiedMetadata = writer.getDefaultImageMetadata(ImageTypeSpecifiers.createFromRenderedImage(image.getRenderedImage()), param);
modifiedMetadata.setFromTree("javax_imageio_jpeg_image_1.0", metadataAsTree);
//modifiedMetadata.mergeTree("javax_imageio_jpeg_image_1.0", metadataAsTree);
image.setMetadata(modifiedMetadata);
writer.write(image);
Files.setLastModifiedTime(tempfile.toPath(), FileTime.from(albumEntry.getLastModified().toInstant()));
return tempfile;
} catch (IOException e) {
throw new OldAlbumException(String.format("Unable to save local copy of album entry matching id=%d from url=\"%s\"", albumEntry.getId(), albumEntry.getImageUrl()), e);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment