media.go
author Mikael Berthe <mikael@lilotux.net>
Mon, 29 Jul 2019 21:57:47 +0200
changeset 253 0e8c8026cf40
parent 251 1aab69d32d74
permissions -rw-r--r--
Update dependencies
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
130
c450bb73f59a Update credits
Mikael Berthe <mikael@lilotux.net>
parents: 128
diff changeset
     1
/*
207
301d5b94be3f Update copyrights
Mikael Berthe <mikael@lilotux.net>
parents: 162
diff changeset
     2
Copyright 2017-2018 Mikael Berthe
130
c450bb73f59a Update credits
Mikael Berthe <mikael@lilotux.net>
parents: 128
diff changeset
     3
c450bb73f59a Update credits
Mikael Berthe <mikael@lilotux.net>
parents: 128
diff changeset
     4
Licensed under the MIT license.  Please see the LICENSE file is this directory.
c450bb73f59a Update credits
Mikael Berthe <mikael@lilotux.net>
parents: 128
diff changeset
     5
*/
c450bb73f59a Update credits
Mikael Berthe <mikael@lilotux.net>
parents: 128
diff changeset
     6
138
23d3a518d0ad Update package name in source files
Mikael Berthe <mikael@lilotux.net>
parents: 130
diff changeset
     7
package madon
126
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     8
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     9
import (
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    10
	"bytes"
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    11
	"encoding/json"
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    12
	"io"
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    13
	"mime/multipart"
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    14
	"os"
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    15
	"path/filepath"
216
403ce36a94ab Add UpdateMedia
Mikael Berthe <mikael@lilotux.net>
parents: 215
diff changeset
    16
	"strconv"
126
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    17
162
68df3a01e1a7 Use github.com/pkg/errors
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
    18
	"github.com/pkg/errors"
126
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    19
	"github.com/sendgrid/rest"
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    20
)
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    21
250
f2c8ab41725b Added UploadMediaReader, UploadMedia is now a wrapper around it
Roberto Santalla <roobre@roobre.es>
parents: 247
diff changeset
    22
const mediaUploadFieldName = "file"
f2c8ab41725b Added UploadMediaReader, UploadMedia is now a wrapper around it
Roberto Santalla <roobre@roobre.es>
parents: 247
diff changeset
    23
126
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    24
// UploadMedia uploads the given file and returns an attachment
215
40ed4e2db3b9 UploadMedia: Add description and focus parameters
Mikael Berthe <mikael@lilotux.net>
parents: 207
diff changeset
    25
// The description and focus arguments can be empty strings.
40ed4e2db3b9 UploadMedia: Add description and focus parameters
Mikael Berthe <mikael@lilotux.net>
parents: 207
diff changeset
    26
// 'focus' is the "focal point", written as two comma-delimited floating points.
40ed4e2db3b9 UploadMedia: Add description and focus parameters
Mikael Berthe <mikael@lilotux.net>
parents: 207
diff changeset
    27
func (mc *Client) UploadMedia(filePath, description, focus string) (*Attachment, error) {
126
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    28
	if filePath == "" {
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    29
		return nil, ErrInvalidParameter
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    30
	}
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    31
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    32
	f, err := os.Open(filePath)
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    33
	if err != nil {
162
68df3a01e1a7 Use github.com/pkg/errors
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
    34
		return nil, errors.Wrap(err, "cannot read file")
126
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    35
	}
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    36
	defer f.Close()
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    37
250
f2c8ab41725b Added UploadMediaReader, UploadMedia is now a wrapper around it
Roberto Santalla <roobre@roobre.es>
parents: 247
diff changeset
    38
	return mc.UploadMediaReader(f, filepath.Base(f.Name()), description, focus)
f2c8ab41725b Added UploadMediaReader, UploadMedia is now a wrapper around it
Roberto Santalla <roobre@roobre.es>
parents: 247
diff changeset
    39
}
f2c8ab41725b Added UploadMediaReader, UploadMedia is now a wrapper around it
Roberto Santalla <roobre@roobre.es>
parents: 247
diff changeset
    40
251
1aab69d32d74 Fixed typo in godoc
Roberto Santalla <roobre@users.noreply.github.com>
parents: 250
diff changeset
    41
// UploadMediaReader uploads data from the given reader and returns an attachment
250
f2c8ab41725b Added UploadMediaReader, UploadMedia is now a wrapper around it
Roberto Santalla <roobre@roobre.es>
parents: 247
diff changeset
    42
// name, description and focus arguments can be empty strings.
f2c8ab41725b Added UploadMediaReader, UploadMedia is now a wrapper around it
Roberto Santalla <roobre@roobre.es>
parents: 247
diff changeset
    43
// 'focus' is the "focal point", written as two comma-delimited floating points.
f2c8ab41725b Added UploadMediaReader, UploadMedia is now a wrapper around it
Roberto Santalla <roobre@roobre.es>
parents: 247
diff changeset
    44
func (mc *Client) UploadMediaReader(f io.Reader, name, description, focus string) (*Attachment, error) {
f2c8ab41725b Added UploadMediaReader, UploadMedia is now a wrapper around it
Roberto Santalla <roobre@roobre.es>
parents: 247
diff changeset
    45
	buf := bytes.Buffer{}
f2c8ab41725b Added UploadMediaReader, UploadMedia is now a wrapper around it
Roberto Santalla <roobre@roobre.es>
parents: 247
diff changeset
    46
f2c8ab41725b Added UploadMediaReader, UploadMedia is now a wrapper around it
Roberto Santalla <roobre@roobre.es>
parents: 247
diff changeset
    47
	w := multipart.NewWriter(&buf)
f2c8ab41725b Added UploadMediaReader, UploadMedia is now a wrapper around it
Roberto Santalla <roobre@roobre.es>
parents: 247
diff changeset
    48
	var formWriter io.Writer
f2c8ab41725b Added UploadMediaReader, UploadMedia is now a wrapper around it
Roberto Santalla <roobre@roobre.es>
parents: 247
diff changeset
    49
	var err error
f2c8ab41725b Added UploadMediaReader, UploadMedia is now a wrapper around it
Roberto Santalla <roobre@roobre.es>
parents: 247
diff changeset
    50
	if len(name) > 0 {
f2c8ab41725b Added UploadMediaReader, UploadMedia is now a wrapper around it
Roberto Santalla <roobre@roobre.es>
parents: 247
diff changeset
    51
		formWriter, err = w.CreateFormFile(mediaUploadFieldName, name)
f2c8ab41725b Added UploadMediaReader, UploadMedia is now a wrapper around it
Roberto Santalla <roobre@roobre.es>
parents: 247
diff changeset
    52
	} else {
f2c8ab41725b Added UploadMediaReader, UploadMedia is now a wrapper around it
Roberto Santalla <roobre@roobre.es>
parents: 247
diff changeset
    53
		formWriter, err = w.CreateFormField(mediaUploadFieldName)
f2c8ab41725b Added UploadMediaReader, UploadMedia is now a wrapper around it
Roberto Santalla <roobre@roobre.es>
parents: 247
diff changeset
    54
	}
126
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    55
	if err != nil {
162
68df3a01e1a7 Use github.com/pkg/errors
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
    56
		return nil, errors.Wrap(err, "media upload")
126
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    57
	}
250
f2c8ab41725b Added UploadMediaReader, UploadMedia is now a wrapper around it
Roberto Santalla <roobre@roobre.es>
parents: 247
diff changeset
    58
126
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    59
	if _, err = io.Copy(formWriter, f); err != nil {
162
68df3a01e1a7 Use github.com/pkg/errors
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
    60
		return nil, errors.Wrap(err, "media upload")
126
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    61
	}
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    62
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    63
	w.Close()
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    64
215
40ed4e2db3b9 UploadMedia: Add description and focus parameters
Mikael Berthe <mikael@lilotux.net>
parents: 207
diff changeset
    65
	var params apiCallParams
40ed4e2db3b9 UploadMedia: Add description and focus parameters
Mikael Berthe <mikael@lilotux.net>
parents: 207
diff changeset
    66
	if description != "" || focus != "" {
40ed4e2db3b9 UploadMedia: Add description and focus parameters
Mikael Berthe <mikael@lilotux.net>
parents: 207
diff changeset
    67
		params = make(apiCallParams)
40ed4e2db3b9 UploadMedia: Add description and focus parameters
Mikael Berthe <mikael@lilotux.net>
parents: 207
diff changeset
    68
		if description != "" {
40ed4e2db3b9 UploadMedia: Add description and focus parameters
Mikael Berthe <mikael@lilotux.net>
parents: 207
diff changeset
    69
			params["description"] = description
40ed4e2db3b9 UploadMedia: Add description and focus parameters
Mikael Berthe <mikael@lilotux.net>
parents: 207
diff changeset
    70
		}
40ed4e2db3b9 UploadMedia: Add description and focus parameters
Mikael Berthe <mikael@lilotux.net>
parents: 207
diff changeset
    71
		if focus != "" {
40ed4e2db3b9 UploadMedia: Add description and focus parameters
Mikael Berthe <mikael@lilotux.net>
parents: 207
diff changeset
    72
			params["focus"] = focus
40ed4e2db3b9 UploadMedia: Add description and focus parameters
Mikael Berthe <mikael@lilotux.net>
parents: 207
diff changeset
    73
		}
40ed4e2db3b9 UploadMedia: Add description and focus parameters
Mikael Berthe <mikael@lilotux.net>
parents: 207
diff changeset
    74
	}
40ed4e2db3b9 UploadMedia: Add description and focus parameters
Mikael Berthe <mikael@lilotux.net>
parents: 207
diff changeset
    75
247
17e32e951670 Fix missing media API endpoint version
Mikael Berthe <mikael@lilotux.net>
parents: 238
diff changeset
    76
	req, err := mc.prepareRequest("v1/media", rest.Post, params)
128
a5a00fad7a32 Add checks for client initialization
Mikael Berthe <mikael@lilotux.net>
parents: 126
diff changeset
    77
	if err != nil {
162
68df3a01e1a7 Use github.com/pkg/errors
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
    78
		return nil, errors.Wrap(err, "media prepareRequest failed")
128
a5a00fad7a32 Add checks for client initialization
Mikael Berthe <mikael@lilotux.net>
parents: 126
diff changeset
    79
	}
126
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    80
	req.Headers["Content-Type"] = w.FormDataContentType()
250
f2c8ab41725b Added UploadMediaReader, UploadMedia is now a wrapper around it
Roberto Santalla <roobre@roobre.es>
parents: 247
diff changeset
    81
	req.Body = buf.Bytes()
126
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    82
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    83
	// Make API call
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    84
	r, err := restAPI(req)
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    85
	if err != nil {
162
68df3a01e1a7 Use github.com/pkg/errors
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
    86
		return nil, errors.Wrap(err, "media upload failed")
126
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    87
	}
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    88
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    89
	// Check for error reply
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    90
	var errorResult Error
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    91
	if err := json.Unmarshal([]byte(r.Body), &errorResult); err == nil {
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    92
		// The empty object is not an error
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    93
		if errorResult.Text != "" {
162
68df3a01e1a7 Use github.com/pkg/errors
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
    94
			return nil, errors.New(errorResult.Text)
126
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    95
		}
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    96
	}
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    97
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    98
	// Not an error reply; let's unmarshal the data
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    99
	var attachment Attachment
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   100
	err = json.Unmarshal([]byte(r.Body), &attachment)
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   101
	if err != nil {
162
68df3a01e1a7 Use github.com/pkg/errors
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   102
		return nil, errors.Wrap(err, "cannot decode API response (media)")
126
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   103
	}
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   104
	return &attachment, nil
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   105
}
216
403ce36a94ab Add UpdateMedia
Mikael Berthe <mikael@lilotux.net>
parents: 215
diff changeset
   106
403ce36a94ab Add UpdateMedia
Mikael Berthe <mikael@lilotux.net>
parents: 215
diff changeset
   107
// UpdateMedia updates the description and focal point of a media
403ce36a94ab Add UpdateMedia
Mikael Berthe <mikael@lilotux.net>
parents: 215
diff changeset
   108
// One of the description and focus arguments can be nil to not be updated.
403ce36a94ab Add UpdateMedia
Mikael Berthe <mikael@lilotux.net>
parents: 215
diff changeset
   109
func (mc *Client) UpdateMedia(mediaID int64, description, focus *string) (*Attachment, error) {
403ce36a94ab Add UpdateMedia
Mikael Berthe <mikael@lilotux.net>
parents: 215
diff changeset
   110
	params := make(apiCallParams)
403ce36a94ab Add UpdateMedia
Mikael Berthe <mikael@lilotux.net>
parents: 215
diff changeset
   111
	if description != nil {
403ce36a94ab Add UpdateMedia
Mikael Berthe <mikael@lilotux.net>
parents: 215
diff changeset
   112
		params["description"] = *description
403ce36a94ab Add UpdateMedia
Mikael Berthe <mikael@lilotux.net>
parents: 215
diff changeset
   113
	}
403ce36a94ab Add UpdateMedia
Mikael Berthe <mikael@lilotux.net>
parents: 215
diff changeset
   114
	if focus != nil {
403ce36a94ab Add UpdateMedia
Mikael Berthe <mikael@lilotux.net>
parents: 215
diff changeset
   115
		params["focus"] = *focus
403ce36a94ab Add UpdateMedia
Mikael Berthe <mikael@lilotux.net>
parents: 215
diff changeset
   116
	}
403ce36a94ab Add UpdateMedia
Mikael Berthe <mikael@lilotux.net>
parents: 215
diff changeset
   117
403ce36a94ab Add UpdateMedia
Mikael Berthe <mikael@lilotux.net>
parents: 215
diff changeset
   118
	endPoint := "media/" + strconv.FormatInt(mediaID, 10)
403ce36a94ab Add UpdateMedia
Mikael Berthe <mikael@lilotux.net>
parents: 215
diff changeset
   119
	var attachment Attachment
238
1c0042e76902 Do not use a global API version
Mikael Berthe <mikael@lilotux.net>
parents: 216
diff changeset
   120
	if err := mc.apiCall("v1/"+endPoint, rest.Put, params, nil, nil, &attachment); err != nil {
216
403ce36a94ab Add UpdateMedia
Mikael Berthe <mikael@lilotux.net>
parents: 215
diff changeset
   121
		return nil, err
403ce36a94ab Add UpdateMedia
Mikael Berthe <mikael@lilotux.net>
parents: 215
diff changeset
   122
	}
403ce36a94ab Add UpdateMedia
Mikael Berthe <mikael@lilotux.net>
parents: 215
diff changeset
   123
	return &attachment, nil
403ce36a94ab Add UpdateMedia
Mikael Berthe <mikael@lilotux.net>
parents: 215
diff changeset
   124
}