diff --git a/internal/ap/extract.go b/internal/ap/extract.go index 41cc5dcbc..6d224e9a8 100644 --- a/internal/ap/extract.go +++ b/internal/ap/extract.go @@ -600,12 +600,23 @@ func ExtractAttachment(i Attachmentable) (*gtsmodel.MediaAttachment, error) { return >smodel.MediaAttachment{ RemoteURL: remoteURL.String(), - Description: ExtractName(i), + Description: ExtractDescription(i), Blurhash: ExtractBlurhash(i), Processing: gtsmodel.ProcessingStatusReceived, }, nil } +// ExtractDescription extracts the image description +// of an attachmentable, if present. Will try the +// 'summary' prop first, then fall back to 'name'. +func ExtractDescription(i Attachmentable) string { + if summary := ExtractSummary(i); summary != "" { + return summary + } + + return ExtractName(i) +} + // ExtractBlurhash extracts the blurhash string value // from the given WithBlurhash interface, or returns // an empty string if nothing is found. diff --git a/internal/ap/extractattachments_test.go b/internal/ap/extractattachments_test.go index 3d5fc7e89..1ec6e53c8 100644 --- a/internal/ap/extractattachments_test.go +++ b/internal/ap/extractattachments_test.go @@ -18,6 +18,8 @@ package ap_test import ( + "context" + "encoding/json" "testing" "github.com/stretchr/testify/suite" @@ -38,6 +40,43 @@ func (suite *ExtractAttachmentsTestSuite) TestExtractAttachmentMissingURL() { suite.Nil(attachment) } +func (suite *ExtractAttachmentsTestSuite) TestExtractDescription() { + // Note: normally a single attachment on a Note or + // similar wouldn't have the `@context` field set, + // but we set it here because we're parsing it as + // a discrete/standalone AP Object for this test. + attachmentableJSON := `{ + "@context": "https://www.w3.org/ns/activitystreams", + "mediaType": "image/jpeg", + "name": "z64KTcw2h2bZ8s67k2.jpg", + "summary": "A very large panel that is entirely twist switches", + "type": "Document", + "url": "https://example.org/d/XzKw4M2Sc1pBxj3hY4.jpg" +}` + + raw := make(map[string]interface{}) + if err := json.Unmarshal([]byte(attachmentableJSON), &raw); err != nil { + suite.FailNow(err.Error()) + } + + t, err := streams.ToType(context.Background(), raw) + if err != nil { + suite.FailNow(err.Error()) + } + + attachmentable, ok := t.(ap.Attachmentable) + if !ok { + suite.FailNow("type was not Attachmentable") + } + + attachment, err := ap.ExtractAttachment(attachmentable) + if err != nil { + suite.FailNow(err.Error()) + } + + suite.Equal("A very large panel that is entirely twist switches", attachment.Description) +} + func TestExtractAttachmentsTestSuite(t *testing.T) { suite.Run(t, &ExtractAttachmentsTestSuite{}) } diff --git a/internal/ap/interfaces.go b/internal/ap/interfaces.go index 9e606db62..6ba3c3735 100644 --- a/internal/ap/interfaces.go +++ b/internal/ap/interfaces.go @@ -164,6 +164,7 @@ type Attachmentable interface { WithMediaType WithURL WithName + WithSummary WithBlurhash }