"""Photo/video record types and ExifTool metadata decoding.""" from __future__ import annotations import re import xml.etree.ElementTree as ET from dataclasses import dataclass, field from datetime import datetime, timedelta, timezone from pathlib import Path from tools.filenames import naive_wall_time from tools.media_metadata import first_tag, parse_exif_datetime from tools.timezones import parse_timezone_offset IMAGE_EXTS = {".jpg", ".jpeg", ".heic", ".arw"} VIDEO_EXTS = {".mp4", ".mov", ".mts"} SUPPORTED_EXTS = IMAGE_EXTS | VIDEO_EXTS IMAGE_CAPTURE_TIME_TAGS = ( "Composite:SubSecDateTimeOriginal", "Composite:SubSecCreateDate", "EXIF:DateTimeOriginal", "XMP:DateTimeOriginal", "XMP:CreationDate", "XMP:CreateDate", "EXIF:CreateDate", ) IMAGE_MODIFY_TIME_TAGS = ("Composite:SubSecModifyDate", "EXIF:ModifyDate", "XMP:ModifyDate") IMAGE_OFFSET_TAGS = ( "EXIF:OffsetTimeOriginal", "EXIF:OffsetTimeDigitized", "EXIF:OffsetTime", ) VIDEO_TIME_TAGS = ( "QuickTime:MediaCreateDate", "QuickTime:TrackCreateDate", "QuickTime:CreateDate", "QuickTime:MediaModifyDate", "QuickTime:TrackModifyDate", "QuickTime:ModifyDate", "XMP:DateTimeOriginal", "XMP:CreateDate", ) VIDEO_BEGIN_TIME_TAGS = ("H264:DateTimeOriginal",) VIDEO_DURATION_TAGS = ( "QuickTime:Duration", "Composite:Duration", "File:Duration", "M2TS:Duration", ) VIDEO_TIMEZONE_TAGS = ("QuickTime:AndroidTimeZone", "QuickTime:Keys:AndroidTimeZone") SEQUENCE_TAGS = ( "MakerNotes:SequenceNumber", "MakerNotes:SequenceNumberOriginal", "MakerNotes:ImageNumber", "EXIF:ImageNumber", "SequenceNumber", ) FILENAME_TIMESTAMP_RE = re.compile(r"(?P\d{8})[-_](?P