49 lines
1.5 KiB
TypeScript
49 lines
1.5 KiB
TypeScript
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}`;
|
|
};
|