-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathmedia.go
151 lines (132 loc) · 5.65 KB
/
media.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
package jwplatform
import (
"fmt"
"net/http"
"github.com/google/go-querystring/query"
)
// MediaResource is the resource that is returned for all Media resource requests,
// with the exception of the Create action, which extends this struct with upload-related data.
type MediaResource struct {
V2ResourceResponse
Duration float64 `json:"duration"`
ExternalID string `json:"external_id"`
TrimInPoint string `json:"trim_in_point"`
TrimOutPoint string `json:"trim_out_point"`
Status string `json:"status"`
ErrorMessage string `json:"error_message"`
MimeType string `json:"mime_type"`
MediaType string `json:"media_type"`
HostingType string `json:"hosting_type"`
SourceURL string `json:"source_url"`
Metadata MediaMetadata `json:"metadata"`
}
// CreateMediaResponse is the response structure for Media create calls.
// If "direct" or "multipart" were selected as the upload method, the response includes additional data required to complete your upload.
//
// For direct uploads, the UploadLink will return a pre-signed S3 Upload Link.
//
// For multipart uploads, the UploadToken and UploadID will be returned, to be used
// in subsequent requests to the V2 Upload API.
type CreateMediaResponse struct {
V2ResourceResponse
MediaResource
UploadLink string `json:"upload_link,omitempty"`
UploadToken string `json:"upload_token,omitempty"`
UploadID string `json:"upload_id,omitempty"`
}
// CreateMediaRequest is the request structure required for Media create calls.
// By default, the 'direct' upload method is used.
type CreateMediaRequest struct {
Metadata MediaMetadata `json:"metadata,omitempty"`
Upload Upload `json:"upload,omitempty"`
}
// ReuploadRequest is the request structure required for Media reupload calls.
type ReuploadRequest struct {
Upload Upload `json:"upload"`
}
// UpdateMediaRequest is the request structure required for Media update calls.
type UpdateMediaRequest struct {
Metadata MediaMetadata `json:"metadata"`
}
// Upload contains the data used to describe the upload.
// Available upload method's include "direct" (default), "multipart", "external", and "fetch".
//
// Direct uploads can be used for assets up to 5GB.
//
// MimeType and SourceURL are required only for "direct" and "fetch", respectively.
//
// TrimInPoint and TrimOutPoint cannot be specified for "external".
type Upload struct {
Method string `json:"method,omitempty"`
MimeType string `json:"mime_type,omitempty"`
SourceURL string `json:"source_url,omitempty"`
TrimInPoint string `json:"trim_in_point,omitempty"`
TrimOutPoint string `json:"trim_out_point,omitempty"`
}
// MediaMetadata describes a Media resource
type MediaMetadata struct {
Title string `json:"title,omitempty"`
Description string `json:"description,omitempty"`
Author string `json:"author,omitempty"`
Permalink string `json:"permalink,omitempty"`
Category string `json:"category,omitempty"`
PublishStartDate string `json:"publish_start_date,omitempty"`
PublishEndDate string `json:"publish_end_date,omitempty"`
Tags []string `json:"tags,omitempty"`
CustomParams map[string]string `json:"custom_params,omitempty"`
ExternalID string `json:"external_id,omitempty"`
}
// MediaResourcesResponse is the response structure for Media list calls.
type MediaResourcesResponse struct {
V2ResourcesResponse
Media []MediaResource `json:"media"`
}
// MediaClient for interacting with V2 Media API.
type MediaClient struct {
v2Client *V2Client
}
// Get a single Media resource by ID.
func (c *MediaClient) Get(siteID, mediaID string) (*MediaResource, error) {
media := &MediaResource{}
path := fmt.Sprintf("/v2/sites/%s/media/%s", siteID, mediaID)
err := c.v2Client.Request(http.MethodGet, path, media, nil, nil)
return media, err
}
// Create a Media resource.
func (c *MediaClient) Create(siteID string, mediaMetadata *MediaMetadata) (*CreateMediaResponse, error) {
createRequestData := &CreateMediaRequest{Metadata: *mediaMetadata}
media := &CreateMediaResponse{}
path := fmt.Sprintf("/v2/sites/%s/media", siteID)
err := c.v2Client.Request(http.MethodPost, path, media, createRequestData, nil)
return media, err
}
// List all Media resources associated with a given Site ID.
func (c *MediaClient) List(siteID string, queryParams *QueryParams) (*MediaResourcesResponse, error) {
media := &MediaResourcesResponse{}
path := fmt.Sprintf("/v2/sites/%s/media", siteID)
urlValues, _ := query.Values(queryParams)
err := c.v2Client.Request(http.MethodGet, path, media, nil, urlValues)
return media, err
}
// Update a Media resource by ID.
func (c *MediaClient) Update(siteID, mediaID string, mediaMetadata *MediaMetadata) (*MediaResource, error) {
updateRequestData := &UpdateMediaRequest{Metadata: *mediaMetadata}
media := &MediaResource{}
path := fmt.Sprintf("/v2/sites/%s/media/%s", siteID, mediaID)
err := c.v2Client.Request(http.MethodPatch, path, media, updateRequestData, nil)
return media, err
}
// Delete a Media resource by ID.
func (c *MediaClient) Delete(siteID, mediaID string) error {
path := fmt.Sprintf("/v2/sites/%s/media/%s", siteID, mediaID)
err := c.v2Client.Request(http.MethodDelete, path, nil, nil, nil)
return err
}
// Reupload a Media resource by ID.
func (c *MediaClient) Reupload(siteID, mediaID string, upload *Upload) (*CreateMediaResponse, error) {
reuploadRequest := &ReuploadRequest{Upload: *upload}
media := &CreateMediaResponse{}
path := fmt.Sprintf("/v2/sites/%s/media/%s/reupload", siteID, mediaID)
err := c.v2Client.Request(http.MethodPost, path, media, reuploadRequest, nil)
return media, err
}