feat: Unify Driveのコピー処理を実装

This commit is contained in:
2026-10-12 16:12:17 +09:00
parent 375030c4e9
commit aa11347fa3
37 changed files with 6759 additions and 8 deletions
+57
View File
@@ -0,0 +1,57 @@
"""XMP related utilities.."""
from pyexpat import ExpatError
from typing import BinaryIO
from xml.dom.minidom import parseString
from exifread.exif_log import get_logger
logger = get_logger()
def find_xmp_data(fh: BinaryIO) -> bytes:
xmp_bytes = b""
logger.debug("XMP not in Exif, searching file for XMP info...")
xml_started = False
xml_finished = False
for line in fh:
open_tag = line.find(b"<x:xmpmeta")
close_tag = line.find(b"</x:xmpmeta>")
if open_tag != -1:
xml_started = True
line = line[open_tag:]
logger.debug("XMP found opening tag at line position %s", open_tag)
if close_tag != -1:
logger.debug("XMP found closing tag at line position %s", close_tag)
line_offset = 0
if open_tag != -1:
line_offset = open_tag
line = line[: (close_tag - line_offset) + 12]
xml_finished = True
if xml_started:
xmp_bytes += line
if xml_finished:
break
logger.debug("Found %s XMP bytes", len(xmp_bytes))
return xmp_bytes
def xmp_bytes_to_str(xmp_bytes: bytes) -> str:
"""Adobe's Extensible Metadata Platform, just dump the pretty XML."""
logger.debug("Cleaning XMP data ...")
# Pray that it's encoded in UTF-8
# TODO: allow user to specify encoding
xmp_string = xmp_bytes.decode("utf-8")
try:
pretty = parseString(xmp_string).toprettyxml()
except ExpatError:
logger.warning("XMP: XML is not well formed")
return xmp_string
cleaned = []
for line in pretty.splitlines():
if line.strip():
cleaned.append(line)
return "\n".join(cleaned)