const std = @import("std"); const exif = @cImport(@cInclude("libexif/exif-data.h")); const cstd = @cImport(@cInclude("time.h")); const tags = [_]c_uint { exif.EXIF_TAG_DATE_TIME, exif.EXIF_TAG_DATE_TIME_ORIGINAL, exif.EXIF_TAG_DATE_TIME_DIGITIZED, }; pub fn get_date_time(path: [*:0]const u8) ?i64 { const exif_data = exif.exif_data_new_from_file(path); defer exif.exif_data_unref(exif_data); if (exif_data == 0) { return null; } var entry: ?[*c]exif.struct__ExifEntry = null; for (0..exif.EXIF_IFD_COUNT) |index| { for (tags) |tag| { entry = exif.exif_content_get_entry((exif_data.*).ifd[index], tag); if (entry) |_| { break; } } if (entry) |_| { break; } } if (entry == 0) { return null; } if (entry) |e| { const c_data = (e.*).data; return parse_date(c_data); } return null; } extern fn strptime( s: [*c]const u8, format: [*c]const u8, tm: *cstd.tm, ) ?*const u8; extern fn timegm(tm: *cstd.tm) i64; fn parse_date(date: [*:0]const u8) ?i64 { var tm: cstd.tm = std.mem.zeroes(cstd.tm); if (strptime(date, "%Y:%m:%d %H:%M:%S", &tm)) |_| { return timegm(&tm); } return null; }