summaryrefslogtreecommitdiff
path: root/internal/ap/extract.go
diff options
context:
space:
mode:
authorLibravatar nicole mikołajczyk <git@mkljczk.pl>2025-06-19 15:10:41 +0200
committerLibravatar tobi <kipvandenbos@noreply.codeberg.org>2025-06-19 15:10:41 +0200
commitbfc8c31e5f80bd7e405ad407d58597a92a1e85fd (patch)
tree53645d0ddfdd32469f36eaa649b31be14d8018c3 /internal/ap/extract.go
parent[bugfix] delete interaction requests when deleting account (#4278) (diff)
downloadgotosocial-bfc8c31e5f80bd7e405ad407d58597a92a1e85fd.tar.xz
[feature] Support incoming avatar/header descriptions (#4275)
Signed-off-by: nicole mikołajczyk <git@mkljczk.pl> # Description Follow-up to #4270 Closes https://codeberg.org/superseriousbusiness/gotosocial/issues/3450 ## Checklist - [x] I/we have read the [GoToSocial contribution guidelines](https://codeberg.org/superseriousbusiness/gotosocial/src/branch/main/CONTRIBUTING.md). - [ ] I/we have discussed the proposed changes already, either in an issue on the repository, or in the Matrix chat. - [x] I/we have not leveraged AI to create the proposed changes. - [x] I/we have performed a self-review of added code. - [x] I/we have written code that is legible and maintainable by others. - [x] I/we have commented the added code, particularly in hard-to-understand areas. - [ ] I/we have made any necessary changes to documentation. - [x] I/we have added tests that cover new code. - [x] I/we have run tests and they pass locally with the changes. - [x] I/we have run `go fmt ./...` and `golangci-lint run`. Reviewed-on: https://codeberg.org/superseriousbusiness/gotosocial/pulls/4275 Co-authored-by: nicole mikołajczyk <git@mkljczk.pl> Co-committed-by: nicole mikołajczyk <git@mkljczk.pl>
Diffstat (limited to 'internal/ap/extract.go')
-rw-r--r--internal/ap/extract.go96
1 files changed, 96 insertions, 0 deletions
diff --git a/internal/ap/extract.go b/internal/ap/extract.go
index 8dbb903a3..15d24cd1e 100644
--- a/internal/ap/extract.go
+++ b/internal/ap/extract.go
@@ -370,6 +370,54 @@ func ExtractIconURI(i WithIcon) (*url.URL, error) {
return nil, gtserror.New("could not extract valid image URI from icon")
}
+// ExtractIconDescription extracts the name property from
+// the given WithIcon which links to a supported image file,
+// or returns an empty string.
+// Input will look something like this:
+//
+// "icon": {
+// "mediaType": "image/jpeg",
+// "name": "some description",
+// "type": "Image",
+// "url": "http://example.org/path/to/some/file.jpeg"
+// },
+func ExtractIconDescription(i WithIcon) string {
+ iconProp := i.GetActivityStreamsIcon()
+ if iconProp == nil {
+ return ""
+ }
+
+ // Icon can potentially contain multiple entries,
+ // so we iterate through all of them here in order
+ // to find the first one that meets these criteria:
+ //
+ // 1. Is an image.
+ // 2. Has a URL that we can use to derefereince it.
+ for iter := iconProp.Begin(); iter != iconProp.End(); iter = iter.Next() {
+ if !iter.IsActivityStreamsImage() {
+ continue
+ }
+
+ image := iter.GetActivityStreamsImage()
+ if image == nil {
+ continue
+ }
+
+ imageURL := GetURL(image)
+ if len(imageURL) == 0 {
+ // Nothing here.
+ continue
+ }
+
+ imageDescription := ExtractName(image)
+
+ // Got a hit.
+ return imageDescription
+ }
+
+ return ""
+}
+
// ExtractImageURI extracts the first URI it can find from
// the given WithImage which links to a supported image file.
// Input will look something like this:
@@ -416,6 +464,54 @@ func ExtractImageURI(i WithImage) (*url.URL, error) {
return nil, gtserror.New("could not extract valid image URI from image")
}
+// ExtractImageDescription extracts the name property from
+// the given WithImage which links to a supported image file,
+// or returns an empty string.
+// Input will look something like this:
+//
+// "image": {
+// "mediaType": "image/jpeg",
+// "name": "some description",
+// "type": "Image",
+// "url": "http://example.org/path/to/some/file.jpeg"
+// },
+func ExtractImageDescription(i WithImage) string {
+ imageProp := i.GetActivityStreamsImage()
+ if imageProp == nil {
+ return ""
+ }
+
+ // Image can potentially contain multiple entries,
+ // so we iterate through all of them here in order
+ // to find the first one that meets these criteria:
+ //
+ // 1. Is an image.
+ // 2. Has a URL that we can use to derefereince it.
+ for iter := imageProp.Begin(); iter != imageProp.End(); iter = iter.Next() {
+ if !iter.IsActivityStreamsImage() {
+ continue
+ }
+
+ image := iter.GetActivityStreamsImage()
+ if image == nil {
+ continue
+ }
+
+ imageURL := GetURL(image)
+ if len(imageURL) == 0 {
+ // Nothing here.
+ continue
+ }
+
+ imageDescription := ExtractName(image)
+
+ // Got a hit.
+ return imageDescription
+ }
+
+ return ""
+}
+
// ExtractSummary extracts the summary/content warning of
// the given WithSummary interface. Will return an empty
// string if no summary/content warning was present.