mirror of
https://github.com/wisplite/raster.git
synced 2026-05-01 06:32:44 -05:00
add exif parsing
This commit is contained in:
@@ -41,6 +41,7 @@ func UploadMedia(file *multipart.FileHeader, albumID string, accessToken string)
|
||||
"originalFilename": file.Filename,
|
||||
"fileSize": file.Size,
|
||||
"contentType": file.Header.Get("Content-Type"),
|
||||
"exif": map[string]interface{}{},
|
||||
}
|
||||
|
||||
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 }) {
|
||||
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 (
|
||||
<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>
|
||||
@@ -22,26 +28,43 @@ export default function MetadataPanel({ mediaItem, open, onOpenChange }) {
|
||||
<span className="text-gray-500">Uploaded</span>
|
||||
<span className="text-white">{mediaItem.CreatedAt ? new Date(mediaItem.CreatedAt).toLocaleDateString() : '-'}</span>
|
||||
</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 className="space-y-2 red-hat-mono">
|
||||
<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>
|
||||
{/* Placeholder for EXIF data */}
|
||||
<div className="bg-[#222] rounded p-3 space-y-2 text-sm opacity-50">
|
||||
<div className="bg-[#222] rounded p-3 space-y-2 text-sm">
|
||||
<div className="flex justify-between">
|
||||
<span className="text-gray-500">Camera</span>
|
||||
<span className="text-white">-</span>
|
||||
<span className="text-white">{mediaItem.Metadata?.exif?.model.replaceAll('"', '') || '-'}</span>
|
||||
</div>
|
||||
<div className="flex justify-between">
|
||||
<span className="text-gray-500">ISO</span>
|
||||
<span className="text-white">-</span>
|
||||
<span className="text-white">{mediaItem.Metadata?.exif?.iso || '-'}</span>
|
||||
</div>
|
||||
<div className="flex justify-between">
|
||||
<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 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>
|
||||
|
||||
Reference in New Issue
Block a user