Skip to content

Commit 8ed7098

Browse files
committed
feat: add checksum header for asset uploads
1 parent 637e730 commit 8ed7098

File tree

2 files changed

+21
-5
lines changed

2 files changed

+21
-5
lines changed

immich/call.go

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"sync/atomic"
1313
"time"
1414

15+
"github.com/simulot/immich-go/internal/assets"
1516
"github.com/simulot/immich-go/internal/fshelper"
1617
)
1718

@@ -155,8 +156,10 @@ func (sc *serverCall) request(
155156
}
156157
opts = append(opts, setAPIKey())
157158
for _, opt := range opts {
158-
if sc.joinError(opt(sc, req)) != nil {
159-
return nil
159+
if opt != nil {
160+
if sc.joinError(opt(sc, req)) != nil {
161+
return nil
162+
}
160163
}
161164
}
162165
return req
@@ -276,7 +279,9 @@ func (sc *serverCall) do(fnRequest requestFunction, opts ...serverResponseOption
276279

277280
// We have a success
278281
for _, opt := range opts {
279-
_ = sc.joinError(opt(sc, resp))
282+
if opt != nil {
283+
_ = sc.joinError(opt(sc, resp))
284+
}
280285
}
281286
if sc.err != nil {
282287
return sc.Err(req, resp, nil)
@@ -293,6 +298,16 @@ func setBody(body io.ReadCloser) serverRequestOption {
293298
}
294299
}
295300

301+
func setImmichChecksum(a *assets.Asset) serverRequestOption {
302+
if a.Checksum == "" {
303+
return nil
304+
}
305+
return func(sc *serverCall, req *http.Request) error {
306+
req.Header.Set("x-immich-checksum", a.Checksum)
307+
return nil
308+
}
309+
}
310+
296311
func setAcceptJSON() serverRequestOption {
297312
return func(sc *serverCall, req *http.Request) error {
298313
req.Header.Add("Accept", "application/json")

immich/upload.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,17 +98,18 @@ func (ic *ImmichClient) uploadAsset(ctx context.Context, la *assets.Asset, endPo
9898
switch endPoint {
9999
case EndPointAssetUpload:
100100
errCall = ic.newServerCall(ctx, EndPointAssetUpload).
101-
do(postRequest("/assets", m.FormDataContentType(), setContextValue(callValues), setAcceptJSON(), setBody(body)), responseJSON(&ar))
101+
do(postRequest("/assets", m.FormDataContentType(), setContextValue(callValues), setAcceptJSON(), setImmichChecksum(la), setBody(body)), responseJSON(&ar))
102102
case EndPointAssetReplace:
103103
errCall = ic.newServerCall(ctx, EndPointAssetReplace).
104-
do(putRequest("/assets/"+replaceID+"/original", setContextValue(callValues), setAcceptJSON(), setContentType(m.FormDataContentType()), setBody(body)), responseJSON(&ar))
104+
do(putRequest("/assets/"+replaceID+"/original", setContextValue(callValues), setAcceptJSON(), setImmichChecksum(la), setContentType(m.FormDataContentType()), setBody(body)), responseJSON(&ar))
105105
}
106106
err = errors.Join(err, errCall)
107107
return ar, err
108108
}
109109

110110
func (ic *ImmichClient) prepareCallValues(la *assets.Asset, s fs.FileInfo, ext, mtype string) map[string]string {
111111
callValues := map[string]string{}
112+
112113
callValues["deviceAssetId"] = fmt.Sprintf("%s-%d", path.Base(la.OriginalFileName), s.Size())
113114
callValues["deviceId"] = ic.DeviceUUID
114115
callValues["assetType"] = mtype

0 commit comments

Comments
 (0)