|
1 | 1 | import exifr from "exifr"; |
2 | 2 | import { logger } from "@/lib/logger"; |
3 | 3 | export interface ExifData { |
| 4 | + [key: string]: unknown; |
4 | 5 | make?: string; |
5 | 6 | model?: string; |
6 | 7 | lensModel?: string; |
@@ -29,6 +30,38 @@ function toIsoDate(value: unknown) { |
29 | 30 | return undefined; |
30 | 31 | } |
31 | 32 |
|
| 33 | +function toJsonSafeExifValue(value: unknown): unknown { |
| 34 | + if (value instanceof Date) { |
| 35 | + return Number.isNaN(value.getTime()) ? undefined : value.toISOString(); |
| 36 | + } |
| 37 | + if (typeof value === "bigint") { |
| 38 | + return value.toString(); |
| 39 | + } |
| 40 | + if (Array.isArray(value)) { |
| 41 | + return value |
| 42 | + .map((item) => toJsonSafeExifValue(item)) |
| 43 | + .filter((item) => item !== undefined); |
| 44 | + } |
| 45 | + if (value && typeof value === "object") { |
| 46 | + const safeObject: Record<string, unknown> = {}; |
| 47 | + for (const [key, nestedValue] of Object.entries(value)) { |
| 48 | + const safeValue = toJsonSafeExifValue(nestedValue); |
| 49 | + if (safeValue !== undefined) safeObject[key] = safeValue; |
| 50 | + } |
| 51 | + return Object.keys(safeObject).length > 0 ? safeObject : undefined; |
| 52 | + } |
| 53 | + return value; |
| 54 | +} |
| 55 | + |
| 56 | +function toJsonSafeExif(exif: Record<string, unknown>) { |
| 57 | + const safeExif: Record<string, unknown> = {}; |
| 58 | + for (const [key, value] of Object.entries(exif)) { |
| 59 | + const safeValue = toJsonSafeExifValue(value); |
| 60 | + if (safeValue !== undefined) safeExif[key] = safeValue; |
| 61 | + } |
| 62 | + return safeExif; |
| 63 | +} |
| 64 | + |
32 | 65 | export async function extractExifData( |
33 | 66 | buffer: Buffer, |
34 | 67 | contextInfo?: string, |
@@ -96,6 +129,7 @@ export async function extractExifData( |
96 | 129 | gpsLongitude = lonValue; |
97 | 130 | } |
98 | 131 | return { |
| 132 | + ...toJsonSafeExif(exif as Record<string, unknown>), |
99 | 133 | make: exif.Make, |
100 | 134 | model: exif.Model, |
101 | 135 | lensModel: exif.LensModel, |
|
0 commit comments