checkpoint: updates to manual and code

- document creating and editing media
- update schema
- media-description and media-focus flags are now optional for editing
  media attachments.
This commit is contained in:
Dan Anglin 2024-08-15 17:00:53 +01:00
parent 5c50507bfc
commit 5df820fb29
Signed by: dananglin
GPG key ID: 0C1D44CFBEE68638
4 changed files with 80 additions and 28 deletions

View file

@ -54,8 +54,10 @@
- [Remove accounts from a list](#remove-accounts-from-a-list) - [Remove accounts from a list](#remove-accounts-from-a-list)
- [Timelines](#timelines) - [Timelines](#timelines)
- [View a timeline](#view-a-timeline) - [View a timeline](#view-a-timeline)
- [Media Attachment](#media-attachment) - [Media Attachments](#media-attachments)
- [View media attachment](#view-media-attachment) - [Create a media attachment](#create-a-media-attachment)
- [Edit a media attachment](#edit-a-media-attachment)
- [View a media attachment](#view-a-media-attachment)
- [Media](#media) - [Media](#media)
- [View media from a status](#view-media-from-a-status) - [View media from a status](#view-media-from-a-status)
- [Bookmarks](#bookmarks) - [Bookmarks](#bookmarks)
@ -683,9 +685,51 @@ Prints a list of statuses from a timeline.
| `tag` | string | false | The hashtag you want to view.<br>This is only required if `timeline-category` is set to `tag`. | | | `tag` | string | false | The hashtag you want to view.<br>This is only required if `timeline-category` is set to `tag`. | |
| `limit` | integer | false | The maximum number of statuses to print. | 20 | | `limit` | integer | false | The maximum number of statuses to print. | 20 |
## Media Attachment ## Media Attachments
### View media attachment ### Create a media attachment
Uploads media from a file to the instance and creates a media attachment.
You can write a description of the media to a text file and specify the its path with the `media-description` flag (see the examples below).
- Create a media attachment with a simple description and a focus of x=-0.1, y=0.5
```
enbas create --type media-attachment \
--media-file picture.png \
--media-description "A picture of a rotten wooden bench in front of the woods." \
--media-focus "-0.1,0.5"
```
- Create a media attachment using a description that has been written to the `description.txt` text file.
```
enbas create --type media-attachment \
--media-file picture.png \
--media-description file@description.txt
```
| flag | type | required | description | default |
|------|------|----------|-------------|---------|
| `type` | string | true | The resource you want to create.<br>Here this should be `media-attachment`. | |
| `media-file` | string | true | The path to the media file. | |
| `media-description` | string | false | The description of the media attachment which will be used as the media's alt-text.<br>To use a description from a text file, use the `flag@` prefix followed by the path to the file (e.g. `file@description.txt`)| |
| `media-focus` | string | false | The media's focus values. This should be in the form of two comma-separated numbers between -1 and 1 (e.g. 0.25,-0.34) | |
### Edit a media attachment
Edits the description and/or the focus of a media attachment that you own.
```
enbas edit --type media-attachment \
--attachment-id 01J5B9A8WFK59W11MS6AHPYWBR \
--media-description "An updated description of a picture."
```
| flag | type | required | description | default |
|------|------|----------|-------------|---------|
| `type` | string | true | The resource you want to edit.<br>Here this should be `media-attachment`. | |
| `media-description` | string | false | The description of the media attachment to edit.<br>To use a description from a text file, use the `flag@` prefix followed by the path to the file (e.g. `file@description.txt`)| |
| `media-focus` | string | false | The media's focus values. This should be in the form of two comma-separated numbers between -1 and 1 (e.g. 0.25,-0.34) | |
### View a media attachment
Prints information about a given media attachment that you own. Prints information about a given media attachment that you own.
You can only see information about the media attachment that you own. You can only see information about the media attachment that you own.

View file

@ -5,6 +5,7 @@ import (
"codeflow.dananglin.me.uk/apollo/enbas/internal/client" "codeflow.dananglin.me.uk/apollo/enbas/internal/client"
"codeflow.dananglin.me.uk/apollo/enbas/internal/model" "codeflow.dananglin.me.uk/apollo/enbas/internal/model"
"codeflow.dananglin.me.uk/apollo/enbas/internal/utilities"
) )
func (e *EditExecutor) Execute() error { func (e *EditExecutor) Execute() error {
@ -66,6 +67,7 @@ func (e *EditExecutor) editList(gtsClient *client.Client) error {
func (e *EditExecutor) editMediaAttachment(gtsClient *client.Client) error { func (e *EditExecutor) editMediaAttachment(gtsClient *client.Client) error {
expectedNumValues := 1 expectedNumValues := 1
if !e.attachmentIDs.ExpectedLength(expectedNumValues) { if !e.attachmentIDs.ExpectedLength(expectedNumValues) {
return fmt.Errorf( return fmt.Errorf(
"received an unexpected number of media attachment IDs: want %d", "received an unexpected number of media attachment IDs: want %d",
@ -73,36 +75,42 @@ func (e *EditExecutor) editMediaAttachment(gtsClient *client.Client) error {
) )
} }
if !e.mediaDescriptions.ExpectedLength(expectedNumValues) {
return fmt.Errorf(
"received an unexpected number of media descriptions: want %d",
expectedNumValues,
)
}
if !e.mediaFocusValues.ExpectedLength(expectedNumValues) {
return fmt.Errorf(
"received an unexpected number of media focus values: want %d",
expectedNumValues,
)
}
attachment, err := gtsClient.GetMediaAttachment(e.attachmentIDs[0]) attachment, err := gtsClient.GetMediaAttachment(e.attachmentIDs[0])
if err != nil { if err != nil {
return fmt.Errorf("unable to get the media attachment: %w", err) return fmt.Errorf("unable to get the media attachment: %w", err)
} }
description := e.mediaDescriptions[0] description := attachment.Description
if description == "" { if !e.mediaDescriptions.Empty() {
description = attachment.Description if !e.mediaDescriptions.ExpectedLength(expectedNumValues) {
return fmt.Errorf(
"received an unexpected number of media descriptions: want %d",
expectedNumValues,
)
} }
focus := e.mediaFocusValues[0] var err error
if focus == "" { description, err = utilities.ReadContents(e.mediaDescriptions[0])
focus = fmt.Sprintf("%f,%f", attachment.Meta.Focus.X, attachment.Meta.Focus.Y) if err != nil {
return fmt.Errorf(
"unable to read the contents from %s: %w",
e.mediaDescriptions[0],
)
}
} }
if _, err = gtsClient.UpdateMediaAttachment(e.attachmentIDs[0], description, focus); err != nil { focus := fmt.Sprintf("%f,%f", attachment.Meta.Focus.X, attachment.Meta.Focus.Y)
if !e.mediaFocusValues.Empty() {
if !e.mediaFocusValues.ExpectedLength(expectedNumValues) {
return fmt.Errorf(
"received an unexpected number of media focus values: want %d",
expectedNumValues,
)
}
focus = e.mediaFocusValues[0]
}
if _, err = gtsClient.UpdateMediaAttachment(attachment.ID, description, focus); err != nil {
return fmt.Errorf("unable to update the media attachment: %w", err) return fmt.Errorf("unable to update the media attachment: %w", err)
} }

View file

@ -178,7 +178,7 @@ func NewCreateExecutor(
exe.StringVar(&exe.language, "language", "", "The ISO 639 language code for this status") exe.StringVar(&exe.language, "language", "", "The ISO 639 language code for this status")
exe.StringVar(&exe.listRepliesPolicy, "list-replies-policy", "list", "The replies policy of the list") exe.StringVar(&exe.listRepliesPolicy, "list-replies-policy", "list", "The replies policy of the list")
exe.StringVar(&exe.listTitle, "list-title", "", "The title of the list") exe.StringVar(&exe.listTitle, "list-title", "", "The title of the list")
exe.Var(&exe.mediaDescriptions, "media-description", "The description of the media attachment that will be used as the alt-text") exe.Var(&exe.mediaDescriptions, "media-description", "The description of the media attachment which will be used as the alt-text")
exe.Var(&exe.mediaFocusValues, "media-focus", "The focus of the media file") exe.Var(&exe.mediaFocusValues, "media-focus", "The focus of the media file")
exe.Var(&exe.mediaFiles, "media-file", "The path to the media file") exe.Var(&exe.mediaFiles, "media-file", "The path to the media file")
exe.BoolVar(&exe.pollAllowsMultipleChoices, "poll-allows-multiple-choices", false, "Set to true to allow viewers to make multiple choices in the poll") exe.BoolVar(&exe.pollAllowsMultipleChoices, "poll-allows-multiple-choices", false, "Set to true to allow viewers to make multiple choices in the poll")
@ -253,7 +253,7 @@ func NewEditExecutor(
exe.StringVar(&exe.listID, "list-id", "", "The ID of the list in question") exe.StringVar(&exe.listID, "list-id", "", "The ID of the list in question")
exe.StringVar(&exe.listTitle, "list-title", "", "The title of the list") exe.StringVar(&exe.listTitle, "list-title", "", "The title of the list")
exe.StringVar(&exe.listRepliesPolicy, "list-replies-policy", "", "The replies policy of the list") exe.StringVar(&exe.listRepliesPolicy, "list-replies-policy", "", "The replies policy of the list")
exe.Var(&exe.mediaDescriptions, "media-description", "The description of the media attachment that will be used as the alt-text") exe.Var(&exe.mediaDescriptions, "media-description", "The description of the media attachment which will be used as the alt-text")
exe.Var(&exe.mediaFocusValues, "media-focus", "The focus of the media file") exe.Var(&exe.mediaFocusValues, "media-focus", "The focus of the media file")
exe.StringVar(&exe.resourceType, "type", "", "The type of resource you want to action on (e.g. account, status)") exe.StringVar(&exe.resourceType, "type", "", "The type of resource you want to action on (e.g. account, status)")

View file

@ -98,7 +98,7 @@
}, },
"media-description": { "media-description": {
"type": "StringSliceValue", "type": "StringSliceValue",
"description": "The description of the media attachment that will be used as the alt-text" "description": "The description of the media attachment which will be used as the alt-text"
}, },
"media-file": { "media-file": {
"type": "StringSliceValue", "type": "StringSliceValue",