1
1
package server
2
2
3
3
import (
4
+ "bytes"
4
5
"context"
5
6
"errors"
6
7
"fmt"
7
8
"net/http"
9
+ "path/filepath"
8
10
"strings"
9
11
"time"
10
12
@@ -57,6 +59,10 @@ func (s *Server) makeMicropub() http.Handler {
57
59
}))
58
60
}
59
61
62
+ if s .media != nil {
63
+ options = append (options , micropub .WithMediaEndpoint (s .c .AbsoluteURL (micropubMediaPath )))
64
+ }
65
+
60
66
return micropub .NewHandler (& micropubServer {s : s }, options ... )
61
67
}
62
68
@@ -380,6 +386,11 @@ func (m *micropubServer) updateEntryWithProps(e *core.Entry, newProps map[string
380
386
}
381
387
}
382
388
389
+ err := m .updateEntryWithPhotos (e , properties )
390
+ if err != nil {
391
+ return err
392
+ }
393
+
383
394
for _ , k := range m .s .c .Micropub .Properties {
384
395
if v , ok := properties [k ]; ok {
385
396
e .Other [k ] = v
@@ -394,3 +405,66 @@ func (m *micropubServer) updateEntryWithProps(e *core.Entry, newProps map[string
394
405
395
406
return nil
396
407
}
408
+
409
+ func (m * micropubServer ) updateEntryWithPhotos (e * core.Entry , properties typed.Typed ) error {
410
+ parts := strings .Split (strings .TrimSuffix (e .ID , "/" ), "/" )
411
+ slug := parts [len (parts )- 1 ]
412
+ prefix := fmt .Sprintf ("%04d-%02d-%s" , e .Date .Year (), e .Date .Month (), slug )
413
+
414
+ photoUrls := []string {}
415
+ photoData := map [string ][]byte {}
416
+
417
+ if url , ok := properties .StringIf ("photo" ); ok {
418
+ data , ok := m .s .mediaCache .Get (url )
419
+ if ! ok {
420
+ return fmt .Errorf ("photo %q not found in cache" , url )
421
+ }
422
+
423
+ photoUrls = append (photoUrls , url )
424
+ photoData [url ] = data
425
+ m .s .mediaCache .Delete (url )
426
+
427
+ delete (properties , "photo" )
428
+ } else if photos , ok := properties .StringsIf ("photo" ); ok {
429
+ for _ , url := range photos {
430
+ data , ok := m .s .mediaCache .Get (url )
431
+ if ! ok {
432
+ return fmt .Errorf ("photo %q not found in cache" , url )
433
+ }
434
+
435
+ photoUrls = append (photoUrls , url )
436
+ photoData [url ] = data
437
+ m .s .mediaCache .Delete (url )
438
+ }
439
+
440
+ delete (properties , "photo" )
441
+ }
442
+
443
+ if len (photoUrls ) == 0 {
444
+ return nil
445
+ }
446
+
447
+ photos := []any {}
448
+
449
+ for i , url := range photoUrls {
450
+ data := photoData [url ]
451
+ filename := prefix
452
+ if len (photoUrls ) > 1 {
453
+ filename += fmt .Sprintf ("-%02d" , i + 1 )
454
+ }
455
+
456
+ ext := filepath .Ext (url )
457
+ cdnUrl , err := m .s .media .UploadMedia (filename , ext , bytes .NewBuffer (data ))
458
+ if err != nil {
459
+ return fmt .Errorf ("failed to upload photo: %w" , err )
460
+ }
461
+
462
+ photos = append (photos , map [string ]string {
463
+ "url" : cdnUrl ,
464
+ })
465
+ }
466
+
467
+ e .Other ["photos" ] = photos
468
+
469
+ return nil
470
+ }
0 commit comments