Add darktable ghost publish plugin

Signed-off-by: Nikolaos Karaolidis <nick@karaolidis.com>
This commit is contained in:
2024-12-22 21:39:55 +02:00
parent 98ce774210
commit f44dac4158
17 changed files with 2624 additions and 19 deletions

View File

@@ -0,0 +1,48 @@
import { exiftool } from "exiftool-vendored";
import type { FileInfo } from "./files";
export interface ShootingConditions {
make: string;
model: string;
lensMake: string;
lensModel: string;
focalLength: string;
focalLength35: string;
shutterSpeed: string;
fStop: string;
iso: string;
timestamp: string;
}
export const extractShootingConditions = async (
fileInfo: FileInfo,
): Promise<ShootingConditions> => {
const path = fileInfo.rawPath ?? fileInfo.jpegPath;
try {
const exifData = await exiftool.read(path);
return {
make: exifData.Make ?? "Unknown",
model: exifData.Model ?? "Unknown",
lensMake: exifData.LensMake ?? "Unknown",
lensModel: exifData.LensModel ?? "Unknown",
focalLength: exifData.FocalLength ?? "Unknown",
focalLength35: exifData.FocalLengthIn35mmFormat ?? "Unknown",
shutterSpeed: exifData.ExposureTime ?? "Unknown",
fStop: exifData.FNumber?.toString() ?? "Unknown",
iso: exifData.ISO?.toString() ?? "Unknown",
timestamp: new Date(
(exifData.CreateDate?.toString() as string).replace(/\./g, ":"),
).toISOString(),
};
} catch (error: any) {
throw new Error(
`Failed to extract EXIF data from ${path}: ${error.message}`,
);
}
};
export const createImageCaption = (exif: ShootingConditions) => {
return `${exif.make} ${exif.model}, ${exif.lensMake} ${exif.lensModel} @ ${exif.focalLength} (${exif.focalLength35}), ${exif.shutterSpeed} s, f/${exif.fStop}, ISO ${exif.iso}`;
};