add exif parsing

This commit is contained in:
2026-02-19 05:23:05 -06:00
parent e829f6b405
commit e588eb882b
2 changed files with 88 additions and 7 deletions
+58
View File
@@ -41,6 +41,7 @@ func UploadMedia(file *multipart.FileHeader, albumID string, accessToken string)
"originalFilename": file.Filename, "originalFilename": file.Filename,
"fileSize": file.Size, "fileSize": file.Size,
"contentType": file.Header.Get("Content-Type"), "contentType": file.Header.Get("Content-Type"),
"exif": map[string]interface{}{},
} }
src, err := file.Open() src, err := file.Open()
@@ -66,6 +67,63 @@ func UploadMedia(file *multipart.FileHeader, albumID string, accessToken string)
} }
} }
} }
model, err := x.Get(exif.Model)
if err == nil {
val := model.String()
metadataMap["exif"].(map[string]interface{})["model"] = val
}
iso, err := x.Get(exif.ISOSpeedRatings)
if err == nil {
val, err := iso.Int(0)
if err == nil {
metadataMap["exif"].(map[string]interface{})["iso"] = val
}
}
aperture, err := x.Get(exif.FNumber)
if err == nil {
val, err := aperture.Rat(0)
if err == nil {
metadataMap["exif"].(map[string]interface{})["aperture"] = val
}
}
shutterSpeed, err := x.Get(exif.ShutterSpeedValue)
if err == nil {
val, err := shutterSpeed.Rat(0)
if err == nil {
metadataMap["exif"].(map[string]interface{})["shutterSpeed"] = val
}
}
focalLength, err := x.Get(exif.FocalLength)
if err == nil {
val, err := focalLength.Rat(0)
if err == nil {
metadataMap["exif"].(map[string]interface{})["focalLength"] = val
}
}
lensModel, err := x.Get(exif.LensModel)
if err == nil {
val := lensModel.String()
metadataMap["exif"].(map[string]interface{})["lensModel"] = val
}
lensMake, err := x.Get(exif.LensMake)
if err == nil {
val := lensMake.String()
metadataMap["exif"].(map[string]interface{})["lensMake"] = val
}
exposureTime, err := x.Get(exif.ExposureTime)
if err == nil {
val, err := exposureTime.Rat(0)
if err == nil {
metadataMap["exif"].(map[string]interface{})["exposureTime"] = val
}
}
exposureBiasValue, err := x.Get(exif.ExposureBiasValue)
if err == nil {
val, err := exposureBiasValue.Rat(0)
if err == nil {
metadataMap["exif"].(map[string]interface{})["exposureBiasValue"] = val
}
}
} }
} }
} }
@@ -1,6 +1,12 @@
export default function MetadataPanel({ mediaItem, open, onOpenChange }) { export default function MetadataPanel({ mediaItem, open, onOpenChange }) {
if (!mediaItem) return <div className="w-80 bg-[#1A1A1A] h-full border-l border-[#2B2B2B] p-4 text-white">Loading...</div> if (!mediaItem) return <div className="w-80 bg-[#1A1A1A] h-full border-l border-[#2B2B2B] p-4 text-white">Loading...</div>
const formatAperture = (aperture) => {
const aperatureNumbers = aperture.toString().split('/')
const numerator = aperatureNumbers[0]
const denominator = aperatureNumbers[1]
const fStop = numerator / denominator
return fStop.toFixed(1)
}
return ( return (
<div className={`w-full md:w-80 bg-[#1A1A1A] h-72 md:h-full border-t md:border-t-0 md:border-l border-[#2B2B2B] p-6 text-white overflow-y-auto flex-shrink-0 ${open ? 'block' : 'hidden'}`}> <div className={`w-full md:w-80 bg-[#1A1A1A] h-72 md:h-full border-t md:border-t-0 md:border-l border-[#2B2B2B] p-6 text-white overflow-y-auto flex-shrink-0 ${open ? 'block' : 'hidden'}`}>
<h2 className="text-xl font-bold mb-6 red-hat-display break-words">{mediaItem.Title}</h2> <h2 className="text-xl font-bold mb-6 red-hat-display break-words">{mediaItem.Title}</h2>
@@ -22,26 +28,43 @@ export default function MetadataPanel({ mediaItem, open, onOpenChange }) {
<span className="text-gray-500">Uploaded</span> <span className="text-gray-500">Uploaded</span>
<span className="text-white">{mediaItem.CreatedAt ? new Date(mediaItem.CreatedAt).toLocaleDateString() : '-'}</span> <span className="text-white">{mediaItem.CreatedAt ? new Date(mediaItem.CreatedAt).toLocaleDateString() : '-'}</span>
</div> </div>
<div className="flex justify-between">
<span className="text-gray-500">Dimensions</span>
<span className="text-white">{mediaItem.Metadata?.width + 'x' + mediaItem.Metadata?.height || '-'}</span>
</div>
</div> </div>
</div> </div>
<div className="space-y-2 red-hat-mono"> <div className="space-y-2 red-hat-mono">
<h3 className="text-sm font-semibold text-gray-400 uppercase tracking-wider">EXIF Data</h3> <h3 className="text-sm font-semibold text-gray-400 uppercase tracking-wider">EXIF Data</h3>
<p className="text-xs text-gray-500 italic">Metadata editing not yet implemented.</p> <div className="bg-[#222] rounded p-3 space-y-2 text-sm">
{/* Placeholder for EXIF data */}
<div className="bg-[#222] rounded p-3 space-y-2 text-sm opacity-50">
<div className="flex justify-between"> <div className="flex justify-between">
<span className="text-gray-500">Camera</span> <span className="text-gray-500">Camera</span>
<span className="text-white">-</span> <span className="text-white">{mediaItem.Metadata?.exif?.model.replaceAll('"', '') || '-'}</span>
</div> </div>
<div className="flex justify-between"> <div className="flex justify-between">
<span className="text-gray-500">ISO</span> <span className="text-gray-500">ISO</span>
<span className="text-white">-</span> <span className="text-white">{mediaItem.Metadata?.exif?.iso || '-'}</span>
</div> </div>
<div className="flex justify-between"> <div className="flex justify-between">
<span className="text-gray-500">Aperture</span> <span className="text-gray-500">Aperture</span>
<span className="text-white">-</span> <span className="text-white">{"f/" + formatAperture(mediaItem.Metadata?.exif?.aperture) || '-'}</span>
</div> </div>
<div className="flex justify-between">
<span className="text-gray-500">Shutter Speed</span>
<span className="text-white">{mediaItem.Metadata?.exif?.exposureTime + 's' || '-'}</span>
</div>
<div className="flex justify-between">
<span className="text-gray-500">Focal Length</span>
<span className="text-white">{mediaItem.Metadata?.exif?.focalLength + 'mm' || '-'}</span>
</div>
</div>
</div>
<div className="space-y-2 red-hat-mono">
<h3 className="text-sm font-semibold text-gray-400 uppercase tracking-wider">Description</h3>
<div className="bg-[#222] rounded p-3 space-y-2 text-sm">
<p className="text-white">{mediaItem.Description || '-'}</p>
</div> </div>
</div> </div>
</div> </div>