diff --git a/backend/internal/services/media.go b/backend/internal/services/media.go index 45abc82..0a89b34 100644 --- a/backend/internal/services/media.go +++ b/backend/internal/services/media.go @@ -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 + } + } } } } diff --git a/frontend/src/viewer/components/MetadataPanel.jsx b/frontend/src/viewer/components/MetadataPanel.jsx index 578e37f..e1ae529 100644 --- a/frontend/src/viewer/components/MetadataPanel.jsx +++ b/frontend/src/viewer/components/MetadataPanel.jsx @@ -1,6 +1,12 @@ export default function MetadataPanel({ mediaItem, open, onOpenChange }) { if (!mediaItem) return
Loading...
- + 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 (

{mediaItem.Title}

@@ -22,26 +28,43 @@ export default function MetadataPanel({ mediaItem, open, onOpenChange }) { Uploaded {mediaItem.CreatedAt ? new Date(mediaItem.CreatedAt).toLocaleDateString() : '-'}
+
+ Dimensions + {mediaItem.Metadata?.width + 'x' + mediaItem.Metadata?.height || '-'} +

EXIF Data

-

Metadata editing not yet implemented.

- {/* Placeholder for EXIF data */} -
+
Camera - - + {mediaItem.Metadata?.exif?.model.replaceAll('"', '') || '-'}
ISO - - + {mediaItem.Metadata?.exif?.iso || '-'}
Aperture - - + {"f/" + formatAperture(mediaItem.Metadata?.exif?.aperture) || '-'}
+
+ Shutter Speed + {mediaItem.Metadata?.exif?.exposureTime + 's' || '-'} +
+
+ Focal Length + {mediaItem.Metadata?.exif?.focalLength + 'mm' || '-'} +
+
+
+ +
+

Description

+
+

{mediaItem.Description || '-'}